钢琴Boss:大激光加半圆+大炮塔改红+停掉pedal小子弹

- 大激光矩形上边加向上凸起的半圆(arc Math.PI→0),直径=激光宽度,像枪口扩口
- 左右大炮塔外观全改红色(装甲#5a1a1a/#8a2a2a,指示灯#ff3355)
- 从钢琴minors去掉pedal,大炮塔不再发射小攻击子弹,只保留大激光惩罚+topRain
This commit is contained in:
JOJO 2026-08-06 14:52:23 +08:00
parent bedc2089be
commit fc33de3879
3 changed files with 8 additions and 8 deletions

View File

@ -42,9 +42,9 @@ function drawPiano(b,t,fl,split){
// —— 左右大炮塔踏板重音炮位左紫右蓝P2随最外环带滑开16 —— // —— 左右大炮塔踏板重音炮位左紫右蓝P2随最外环带滑开16 ——
{const off0=split*16; {const off0=split*16;
for(const sd of[-1,1]){const px2=sd*(112+off0); for(const sd of[-1,1]){const px2=sd*(112+off0);
circ(px2,2,5.5,"#33436a");circ(px2-1.5,0,2.5,"#55648a"); circ(px2,2,5.5,"#5a1a1a");circ(px2-1.5,0,2.5,"#8a2a2a");
px(px2-1.5,4,3,8,"#1b2434"); px(px2-1.5,4,3,8,"#1b2434");
px(px2-1,10,2,3,b.pedT>0?"#ffffff":(sd<0?"#b98cff":"#43e8ff")); px(px2-1,10,2,3,"#ff3355");
// 大激光蓄力前摇:画在炮塔口下方的蓄力圆(与小激光琴键蓄力圆同源,换色赤红) // 大激光蓄力前摇:画在炮塔口下方的蓄力圆(与小激光琴键蓄力圆同源,换色赤红)
const prog=sd<0?((b.pedLasL||0)/60):((b.pedLasR||0)/60); const prog=sd<0?((b.pedLasL||0)/60):((b.pedLasR||0)/60);
if(prog>0){const a=Math.min(prog,1); if(prog>0){const a=Math.min(prog,1);

View File

@ -194,7 +194,7 @@ const BOSSES=[
{name:"太空原种",sub:"SPACE SPAWN",hp:1350,col:"#ff8fc8",r:20,rr:[20,34],ryy:[26,18],wide:1,main:"spawn",minors:["wiggle","spikeSnipe","sporeArc","tentBeam","mawSnipe","wingRain"],phases:2,tier:1}, {name:"太空原种",sub:"SPACE SPAWN",hp:1350,col:"#ff8fc8",r:20,rr:[20,34],ryy:[26,18],wide:1,main:"spawn",minors:["wiggle","spikeSnipe","sporeArc","tentBeam","mawSnipe","wingRain"],phases:2,tier:1},
{name:"歼灭者",sub:"ANNIHILATOR",hp:1700,col:"#b05ce8",r:22,main:"annihilate",minors:["aimSpread","spawnMine"],phases:3,tier:0}, {name:"歼灭者",sub:"ANNIHILATOR",hp:1700,col:"#b05ce8",r:22,main:"annihilate",minors:["aimSpread","spawnMine"],phases:3,tier:0},
{name:"暗黑突击",sub:"DARK ASSAULT",hp:2100,col:"#ff3355",r:9,rr:[9,10,11],ryy:[5,6,7],main:"assault",minors:["rain","aimSpread"],phases:3,tier:2}, {name:"暗黑突击",sub:"DARK ASSAULT",hp:2100,col:"#ff3355",r:9,rr:[9,10,11],ryy:[5,6,7],main:"assault",minors:["rain","aimSpread"],phases:3,tier:2},
{name:"激光钢琴",sub:"LASER PIANO",hp:5000,col:"#43e8ff",r:26,rr:[100,100],ryy:[30,30],main:"piano",minors:["topRain","pedal"],phases:2,static:1,tier:1}, {name:"激光钢琴",sub:"LASER PIANO",hp:5000,col:"#43e8ff",r:26,rr:[100,100],ryy:[30,30],main:"piano",minors:["topRain"],phases:2,static:1,tier:1},
{name:"母巢核心",sub:"HIVE CORE",hp:2800,col:"#ff9a3d",r:22,main:"hive",minors:["spawnMini","aimSpread","ring"],phases:3,tier:0}, {name:"母巢核心",sub:"HIVE CORE",hp:2800,col:"#ff9a3d",r:22,main:"hive",minors:["spawnMini","aimSpread","ring"],phases:3,tier:0},
{name:"夺权者X",sub:"USURPER X",hp:3700,col:"#e8f4ff",r:24,rr:[58,26],ryy:[34,40],wide:1,main:"usurper",minors:["deckVolley","pillar","aimSpread"],phases:2,tier:2}, {name:"夺权者X",sub:"USURPER X",hp:3700,col:"#e8f4ff",r:24,rr:[58,26],ryy:[34,40],wide:1,main:"usurper",minors:["deckVolley","pillar","aimSpread"],phases:2,tier:2},
{name:"暗黑魔碟",sub:"DARK SAUCER",hp:4500,col:"#8a5cff",r:24,rr:[30,32,34],main:"saucer",minors:["coneFan","crossEye","dartSpiral"],phases:3,tier:3}, // 间歇期无圆圈弹幕去ringBigP3主攻击仍两层 {name:"暗黑魔碟",sub:"DARK SAUCER",hp:4500,col:"#8a5cff",r:24,rr:[30,32,34],main:"saucer",minors:["coneFan","crossEye","dartSpiral"],phases:3,tier:3}, // 间歇期无圆圈弹幕去ringBigP3主攻击仍两层

View File

@ -224,12 +224,12 @@ function drawBossFx(){
ctx.beginPath();ctx.moveTo(bm.x1,bm.y1);ctx.lineTo(bm.x2,bm.y2);ctx.stroke();ctx.globalAlpha=1;}} ctx.beginPath();ctx.moveTo(bm.x1,bm.y1);ctx.lineTo(bm.x2,bm.y2);ctx.stroke();ctx.globalAlpha=1;}}
else{ctx.globalCompositeOperation="lighter"; else{ctx.globalCompositeOperation="lighter";
ctx.globalAlpha=clamp(bm.life/10,0,1)*0.85; ctx.globalAlpha=clamp(bm.life/10,0,1)*0.85;
// 大激光起点扩口半圆(发射时较小然后扩大 // 大激光起点扩口半圆(直径=激光宽度,半圆顶部向上凸起覆盖矩形上边
if(bm.dmg>=90000){const pR=Math.min(bm.w*0.7,bm.w*0.6*(1-bm.life/(bm.dur0||1))); if(bm.dmg>=90000){const pR=Math.min(bm.w*0.5,bm.w*0.5*(1-bm.life/(bm.dur0||1))+1);
if(pR>0.5){ctx.fillStyle=bm.col; if(pR>1){ctx.fillStyle=bm.col;
ctx.beginPath();ctx.arc(bm.x1,bm.y1,pR,0,Math.PI);ctx.fill(); ctx.beginPath();ctx.arc(bm.x1,bm.y1,pR,Math.PI,0);ctx.fill();
ctx.strokeStyle="#fff";ctx.lineWidth=Math.max(1,pR/3); ctx.strokeStyle="#fff";ctx.lineWidth=Math.max(1,pR/3);
ctx.beginPath();ctx.arc(bm.x1,bm.y1,pR,0,Math.PI);ctx.stroke();}} ctx.beginPath();ctx.arc(bm.x1,bm.y1,pR,Math.PI,0);ctx.stroke();}}
ctx.strokeStyle=bm.col;ctx.lineWidth=bm.w; ctx.strokeStyle=bm.col;ctx.lineWidth=bm.w;
ctx.beginPath();ctx.moveTo(bm.x1,bm.y1);ctx.lineTo(bm.x2,bm.y2);ctx.stroke(); ctx.beginPath();ctx.moveTo(bm.x1,bm.y1);ctx.lineTo(bm.x2,bm.y2);ctx.stroke();
ctx.strokeStyle="#fff";ctx.lineWidth=Math.max(1,bm.w/3); ctx.strokeStyle="#fff";ctx.lineWidth=Math.max(1,bm.w/3);