钢琴Boss修复:恢复3键安全区+修复大激光TDZ与判断逻辑

- 顺扫/反扫/顺滑奏/反滑奏恢复3键安全区(顺/滑最右3键安全,反/反滑最左3键安全)
- 大激光惩罚:将lck声明移到判断之前,修复暂时性死区(TDZ)bug
- 大激光判断改为纯相对位置表达式,消除中间变量
This commit is contained in:
JOJO 2026-08-06 14:36:38 +08:00
parent f830edd0c6
commit e2e1baf35d

View File

@ -349,20 +349,19 @@ function updateBoss(){
else if(tn.rec>0){tn.rec--;if(tn.rec<=0)b.tent=null;} else if(tn.rec>0){tn.rec--;if(tn.rec<=0)b.tent=null;}
} }
} }
const lck=(b.laserT||0)>0; // 巨宽核心激光期间压制其他攻击
// 钢琴大炮塔惩罚激光——玩家站在炮塔正下方蓄力1秒后发射99999伤害大激光 // 钢琴大炮塔惩罚激光——玩家站在炮塔正下方蓄力1秒后发射99999伤害大激光
if(b.idx===2&&!lck){ if(b.idx===2&&!lck){
const off0=b.phase>=1?16:0,p=G.p,warnW=14; const off0=b.phase>=1?16:0,p=G.p,warnW=14;
const leftX=b.x-(112+off0),rightX=b.x+(112+off0); if(p.dead<=0&&Math.abs(p.x-b.x+(112+off0))<warnW&&p.y>b.y){
if(p.dead<=0&&Math.abs(p.x-leftX)<warnW&&p.y>b.y){
b.pedLasL=(b.pedLasL||0)+1; b.pedLasL=(b.pedLasL||0)+1;
if(b.pedLasL>=60){bossBeam(leftX,b.y+10,leftX,H+8,6,"#ff3355",10,40,99999,{b,ox:-(112+off0),oy:10,followX2:true});b.pedLasL=0;SFX.warn();} if(b.pedLasL>=60){bossBeam(b.x-(112+off0),b.y+10,b.x-(112+off0),H+8,6,"#ff3355",10,40,99999,{b,ox:-(112+off0),oy:10,followX2:true});b.pedLasL=0;SFX.warn();}
}else b.pedLasL=0; }else b.pedLasL=0;
if(p.dead<=0&&Math.abs(p.x-rightX)<warnW&&p.y>b.y){ if(p.dead<=0&&Math.abs(p.x-b.x-(112+off0))<warnW&&p.y>b.y){
b.pedLasR=(b.pedLasR||0)+1; b.pedLasR=(b.pedLasR||0)+1;
if(b.pedLasR>=60){bossBeam(rightX,b.y+10,rightX,H+8,6,"#ff3355",10,40,99999,{b,ox:(112+off0),oy:10,followX2:true});b.pedLasR=0;SFX.warn();} if(b.pedLasR>=60){bossBeam(b.x+(112+off0),b.y+10,b.x+(112+off0),H+8,6,"#ff3355",10,40,99999,{b,ox:(112+off0),oy:10,followX2:true});b.pedLasR=0;SFX.warn();}
}else b.pedLasR=0; }else b.pedLasR=0;
} }
const lck=(b.laserT||0)>0; // 巨宽核心激光期间压制其他攻击
// —— 主攻击 —— // —— 主攻击 ——
b.mainT--; b.mainT--;
if(b.mainT<=0&&!lck)bossMain(b,def,fm); if(b.mainT<=0&&!lck)bossMain(b,def,fm);
@ -415,10 +414,10 @@ function bossMain(b,def,fm){
if(ks.t<=0&&ks.hotT<=0){ if(ks.t<=0&&ks.hotT<=0){
if(ks.i>=ks.seq.length){ // 布下一局完全随机选模式6种局间无间隔 if(ks.i>=ks.seq.length){ // 布下一局完全随机选模式6种局间无间隔
ks.mode=rndi(0,6); ks.mode=rndi(0,6);
if(ks.mode===0){ks.seq=[];for(let i=0;i<n;i++)ks.seq.push(i);} // 顺扫:全21键 if(ks.mode===0){ks.seq=[];for(let i=0;i<n-3;i++)ks.seq.push(i);} // 顺扫:0→17最右3键安全
else if(ks.mode===1){ks.seq=[];for(let i=n-1;i>=0;i--)ks.seq.push(i);} // 反扫:全21键 else if(ks.mode===1){ks.seq=[];for(let i=n-1;i>=3;i--)ks.seq.push(i);} // 反扫:20→3最左3键安全
else if(ks.mode===2){ks.seq=[];for(let i=0;i<n;i++)ks.seq.push(i);for(let i=n-2;i>=0;i--)ks.seq.push(i);} // 顺滑奏0→20→041键 else if(ks.mode===2){ks.seq=[];for(let i=0;i<n-3;i++)ks.seq.push(i);for(let i=n-4;i>=0;i--)ks.seq.push(i);} // 顺滑奏0→17→0最右3键安全
else if(ks.mode===3){ks.seq=[];for(let i=n-1;i>=0;i--)ks.seq.push(i);for(let i=1;i<n;i++)ks.seq.push(i);} // 反滑奏20→0→2041键 else if(ks.mode===3){ks.seq=[];for(let i=n-1;i>=3;i--)ks.seq.push(i);for(let i=3;i<n;i++)ks.seq.push(i);} // 反滑奏20→3→20最左3键安全
else if(ks.mode===4){ks.seq=[];for(let i=0;i<5+ph*2;i++)ks.seq.push(-2);} // 乱序每次同时随机4/8键发射5+ph*2次 else if(ks.mode===4){ks.seq=[];for(let i=0;i<5+ph*2;i++)ks.seq.push(-2);} // 乱序每次同时随机4/8键发射5+ph*2次
else if(ph>=1){ks.seq=[];for(let i=0;i<6+ph*2;i++)ks.seq.push(-1);} // 齐射P2保持原逻辑随机6键多次 else if(ph>=1){ks.seq=[];for(let i=0;i<6+ph*2;i++)ks.seq.push(-1);} // 齐射P2保持原逻辑随机6键多次
else{ks.seq=[-3];} // 齐射P14连不射其余全射只发射一次 else{ks.seq=[-3];} // 齐射P14连不射其余全射只发射一次