修复暗黑突击左右闪现:入场判定加landed一次性锁(正弦浮沉跌破ty重复触发入场重置x=120);冲撞锚点改为出发位置+移动时钟mt冲撞/变身期冻结

This commit is contained in:
JOJO 2026-08-05 20:32:22 +08:00
parent ca36daaee0
commit 5d4ce6b969

View File

@ -195,15 +195,15 @@ function startBoss(){
const hpM=(G.diff===1?BAL.hard.hp:1)*(1+0.35*cyc)*(G.mode==="endless"?1+0.55*G.bossN+0.1*G.wave:1+0.12*(G.stage-1))*(G.mode==="rush"?1:1); // Boss挑战模式血量倍数调平衡改这里 const hpM=(G.diff===1?BAL.hard.hp:1)*(1+0.35*cyc)*(G.mode==="endless"?1+0.55*G.bossN+0.1*G.wave:1+0.12*(G.stage-1))*(G.mode==="rush"?1:1); // Boss挑战模式血量倍数调平衡改这里
G.boss={idx,x:W/2,y:-60,ty:64,hp:b.hp*hpM,maxhp:b.hp*hpM,r:(b.rr?b.rr[0]:b.r),ry:(b.ryy?b.ryy[0]:undefined),t:0,phase:0,transT:0, G.boss={idx,x:W/2,y:-60,ty:64,hp:b.hp*hpM,maxhp:b.hp*hpM,r:(b.rr?b.rr[0]:b.r),ry:(b.ryy?b.ryy[0]:undefined),t:0,phase:0,transT:0,
col:b.col,name:b.name,sub:b.sub,fireM:BAL.fireMul(n)*(G.diff===1?BAL.hard.fire:1),dead:false, col:b.col,name:b.name,sub:b.sub,fireM:BAL.fireMul(n)*(G.diff===1?BAL.hard.fire:1),dead:false,
mainT:100,minorT:9999,minorSet:[],rerollT:340,ax:W/2,ay:64}; mainT:100,minorT:9999,minorSet:[],rerollT:340,ax:W/2,ay:64,mt:0,landed:false};
G.bossN++;SFX.warn();MUS.start(true); G.bossN++;SFX.warn();MUS.start(true);
banner("WARNING — "+b.name,"#ff5566",150); banner("WARNING — "+b.name,"#ff5566",150);
} }
function updateBoss(){ function updateBoss(){
const b=G.boss;if(!b)return; const b=G.boss;if(!b)return;
b.t++; b.t++;
if(b.y<b.ty){b.y+=1.2;b.x=W/2;return;} if(!b.landed){if(b.y<b.ty){b.y+=1.2;b.x=W/2;return;}b.landed=true;} // 入场只跑一次:到位后锁定,防正弦浮沉跌回触发重置
if(b.arr===undefined)b.arr=b.t; // 降落结束时刻正弦从0起振杜绝瞬移 // b.mt移动时钟只在常规移动时推进——冲撞/变身期间冻结,恢复时位置连续不瞬移
const def=BOSSES[b.idx]; const def=BOSSES[b.idx];
// —— 阶段检测与变形(锁血转场:清弹+停火+播动画) —— // —— 阶段检测与变形(锁血转场:清弹+停火+播动画) ——
const ratio=b.hp/b.maxhp,thr=def.phases===2?[0.5]:[0.66,0.33]; const ratio=b.hp/b.maxhp,thr=def.phases===2?[0.5]:[0.66,0.33];
@ -231,8 +231,9 @@ function updateBoss(){
} }
// —— 常规移动 —— // —— 常规移动 ——
if(def.static){b.x+=(W/2-b.x)*0.05;b.y+=(52-b.y)*0.02;} if(def.static){b.x+=(W/2-b.x)*0.05;b.y+=(52-b.y)*0.02;}
else if(b.idx===3){b.x=W/2+Math.sin((b.t-b.arr)*0.021)*62;b.y=b.ty+Math.sin((b.t-b.arr)*0.013)*15;} // 暗黑突击:小体型高机动 else if(b.idx===3){b.x=W/2+Math.sin(b.mt*0.021)*62;b.y=b.ty+Math.sin(b.mt*0.013)*15;} // 暗黑突击:小体型高机动
else b.x=W/2+Math.sin((b.t-b.arr)*0.008)*(def.wide?44:70); // 宽体Boss减小游走幅度防止巨翼出屏 else b.x=W/2+Math.sin(b.mt*0.008)*(def.wide?44:70); // 宽体Boss减小游走幅度防止巨翼出屏
b.mt++;
const fm=b.fireM*(1+0.22*b.phase); const fm=b.fireM*(1+0.22*b.phase);
if(b.fnT>0)b.fnT--;if(b.plT>0)b.plT--;if(b.eyeT>0)b.eyeT--;if(b.hornT>0)b.hornT--;if(b.laserT>0)b.laserT--; // 帧级技能计时器 if(b.fnT>0)b.fnT--;if(b.plT>0)b.plT--;if(b.eyeT>0)b.eyeT--;if(b.hornT>0)b.hornT--;if(b.laserT>0)b.laserT--; // 帧级技能计时器
const lck=(b.laserT||0)>0; // 巨宽核心激光期间压制其他攻击 const lck=(b.laserT||0)>0; // 巨宽核心激光期间压制其他攻击
@ -271,8 +272,8 @@ function bossMain(b,def,fm){
const arms=2+ph; const arms=2+ph;
for(let arm=0;arm<arms;arm++)for(let i=0;i<2;i++)ebul(b.x,b.y,b.t*0.06+arm*(TAU/arms)+i*0.14,2+0.2*ph,"orbP"); for(let arm=0;arm<arms;arm++)for(let i=0;i<2;i++)ebul(b.x,b.y,b.t*0.06+arm*(TAU/arms)+i*0.14,2+0.2*ph,"orbP");
b.mainT=Math.round(10/fm);break;} b.mainT=Math.round(10/fm);break;}
case "assault": // 暗黑突击:启动冲撞 case "assault": // 暗黑突击:启动冲撞(锚点记当前位置,冲撞归来后正弦从此继续)
b.dashSt={ph:"tele",t:52};b.mainT=9999;break; b.dashSt={ph:"tele",t:52};b.ax=b.x;b.ay=b.y;b.mainT=9999;break;
case "piano": { // 激光钢琴21键四种模式轮换——顺扫(逼走位)/反扫/乱序/齐射 case "piano": { // 激光钢琴21键四种模式轮换——顺扫(逼走位)/反扫/乱序/齐射
if(!b.keys)b.keys={n:21,seq:[],i:0,t:40,hot:-1,hotT:0,hotList:null,mode:3}; if(!b.keys)b.keys={n:21,seq:[],i:0,t:40,hot:-1,hotT:0,hotList:null,mode:3};
const ks=b.keys,n=ks.n; const ks=b.keys,n=ks.n;