新增3个战锤40k Boss:兽人战斗月亮/黑石要塞/泰伦虫族母舰(共11个)
- 兽人战斗月亮(idx8):锯齿岩月+发光兽人图腾(怒目+獠牙巨口);主攻击=碎石扇(rockb新精灵)+每3轮巨口主炮(2.4倍重弹);小攻击=碎石雨/跳帮舱/狙击;P2=岩缝熔光生长+舷炮连续伸出 - 黑石要塞(idx9):X形四臂黑石星堡+绿晶核心;主攻击=四臂光矛对角成对轮换(臂尖跟随)+P2亚空间主炮(宽16绿柱,laserT压制);小攻击=重型鱼雷/大弹环/战机出击;P2=四臂自X连续旋为十字+核心充能放大 - 泰伦虫族母舰(idx10):生物质长舰+三条摆动触手;主攻击=酸液扇+孢子雷散布+周期孵化虫群;小攻击=生物电浆/孵化/弹环;P2=背甲两瓣滑开露出常存的荧光器官+触手伸长 - 无尽轮换8->11;rush卡片自动包含
This commit is contained in:
parent
9cb99fb050
commit
ceb2b82799
@ -153,7 +153,10 @@ const BOSSES=[
|
||||
{name:"激光钢琴",sub:"LASER PIANO",hp:2500,col:"#43e8ff",r:26,rr:[100,100],ryy:[30,30],main:"piano",minors:["topRain","ring"],phases:2,static:1},
|
||||
{name:"母巢核心",sub:"HIVE CORE",hp:2800,col:"#ff9a3d",r:22,main:"hive",minors:["spawnMini","aimSpread","ring"],phases:3},
|
||||
{name:"夺权者X",sub:"USURPER X",hp:3700,col:"#e8f4ff",r:24,rr:[52,26],ryy:[34,40],wide:1,main:"usurper",minors:["chain","pillar","aimSpread"],phases:2},
|
||||
{name:"暗黑魔碟",sub:"DARK SAUCER",hp:4500,col:"#8a5cff",r:24,rr:[30,32,34],main:"saucer",minors:["ringBig","coneFan","crossEye","dartSpiral"],phases:3}
|
||||
{name:"暗黑魔碟",sub:"DARK SAUCER",hp:4500,col:"#8a5cff",r:24,rr:[30,32,34],main:"saucer",minors:["ringBig","coneFan","crossEye","dartSpiral"],phases:3},
|
||||
{name:"兽人战斗月亮",sub:"ORK ROK",hp:2000,col:"#c8752a",r:26,rr:[26,29],ryy:[24,26],main:"rok",minors:["rockRain","spawnMini","snipe"],phases:2},
|
||||
{name:"黑石要塞",sub:"BLACKSTONE",hp:3400,col:"#5cff9d",r:30,rr:[30,33],ryy:[22,24],wide:1,main:"blackstone",minors:["torpedo","ringBig","spawnMini"],phases:2},
|
||||
{name:"泰伦虫族母舰",sub:"TYRANID HIVESHIP",hp:2800,col:"#7dff8a",r:24,rr:[24,28],ryy:[17,19],main:"hiveship",minors:["bioPlasma","spawnMini","ringBig"],phases:2}
|
||||
];
|
||||
/* Boss命中判定:支持椭圆(宽扁机型),rr=x半径,ry=y半径 */
|
||||
function bossHit(x,y,r){
|
||||
@ -211,7 +214,7 @@ function updateFunnels(){
|
||||
}
|
||||
function startBoss(){
|
||||
const seq=[0,1,2,3,4,6]; // 闯关顺序:stage6=夺权者X压轴;母巢/魔碟在无尽轮换
|
||||
const idx=G.mode==="rush"?G.rushIdx:(G.mode==="stage"?seq[Math.min(5,G.stage-1)]:(G.bossN%8));
|
||||
const idx=G.mode==="rush"?G.rushIdx:(G.mode==="stage"?seq[Math.min(5,G.stage-1)]:(G.bossN%11));
|
||||
const cyc=G.mode==="stage"?0:Math.floor(G.bossN/8);
|
||||
const b=BOSSES[idx],n=tierN();
|
||||
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"?3:1); // Boss挑战模式血量倍数(调平衡改这里)
|
||||
@ -322,6 +325,27 @@ function bossMain(b,def,fm){
|
||||
}
|
||||
}
|
||||
b.mainT=4;break;}
|
||||
case "rok": // 兽人战斗月亮:獠牙碎石扇 + 每三轮巨口主炮(重型缓速弹)
|
||||
for(let i=-3;i<=3;i++)ebul(b.x+i*7,b.y+18,a0+i*0.14,1.9+0.15*ph,"rockb",15);
|
||||
b.rokC=(b.rokC||0)+1;
|
||||
if(b.rokC%(ph?2:3)===0){const mb=ebul(b.x,b.y+26,a0,1.05,"orbO",26);mb.scale=2.4;mb.r=6;SFX.warn();}
|
||||
b.mainT=Math.round((ph?80:95)/fm);break;
|
||||
case "blackstone": { // 黑石要塞:四臂光矛成对轮换(臂尖跟随);P2周期性亚空间主炮(压制其他攻击)
|
||||
b.armC=(b.armC||0)+1;
|
||||
const opA=ph>=1?1:0,arms=[];
|
||||
for(let k=0;k<4;k++){const a=k*Math.PI/2+(1-opA)*Math.PI/4;arms.push([Math.sin(a)*30,-Math.cos(a)*30]);}
|
||||
for(const ai of(b.armC%2?[1,3]:[0,2]))bossBeam(b.x+arms[ai][0],b.y+arms[ai][1],b.x+arms[ai][0]*1.5,H+8,3.5,"#5cff9d",20,22,18,{b,ox:arms[ai][0],oy:arms[ai][1]});
|
||||
b.mainT=Math.round(66/fm);
|
||||
if(ph>=1&&(!b.plT||b.plT<=0)){bossBeam(b.x,b.y+8,b.x,H+8,16,"#5cff9d",46,70,28,{b,ox:0,oy:8,followX2:true});
|
||||
b.laserT=120;b.plT=Math.round(380/fm);SFX.warn();}
|
||||
break;}
|
||||
case "hiveship": // 泰伦母舰:酸液扇 + 孢子雷散布 + 周期孵化虫群
|
||||
for(let i=-2;i<=2;i++)ebul(b.x,b.y+14,a0+i*0.17,2.5,"orbG",14);
|
||||
b.spC=(b.spC||0)-1;
|
||||
if(b.spC<=0){for(let i=0;i<2+ph;i++)spawnEnemy("mini",b.x+rnd(-24,24),b.y+12,false);b.spC=Math.round(300/fm);}
|
||||
b.mnC=(b.mnC||0)-1;
|
||||
if(b.mnC<=0){for(let i=0;i<2;i++){const s=ebul(b.x+rnd(-18,18),b.y+18,Math.PI/2+rnd(-0.25,0.25),0.8,"orbG",16);s.scale=1.7;s.r=4;}b.mnC=Math.round(150/fm);}
|
||||
b.mainT=Math.round((ph?72:88)/fm);break;
|
||||
case "hive": // 母巢核心:环弹+孵化
|
||||
for(let i=0;i<10+ph*4;i++)ebul(b.x,b.y,i/(10+ph*4)*TAU+b.t*0.03,1.6+0.2*ph,"orbO");
|
||||
if(b.t%240<3)for(let i=0;i<1+ph;i++)spawnEnemy(ph>=2?"kami":"mini",b.x+rnd(-30,30),b.y+8,false);
|
||||
@ -377,6 +401,9 @@ function bossMinor(b,mk,fm){
|
||||
case "coneFan": for(let i=-2;i<=2;i++)ebul(b.x,b.y+8,a0+i*0.15,2.9,"dartP",14);b.minorT=Math.round(150/fm);break; // 魔碟:瞄准锥扇
|
||||
case "crossEye": for(const sd of[-1,1])bossBeam(b.x+sd*9,b.y-3,ap2.x-sd*26,H+8,3.5,"#ff3355",22,24,18,{b,ox:sd*9,oy:-3});b.minorT=Math.round(230/fm);break; // 魔碟:交叉赤瞳(斜线X)
|
||||
case "dartSpiral": for(let arm=0;arm<3;arm++)ebul(b.x,b.y,b.t*0.11+arm*TAU/3,2.0,"dartP",13);b.minorT=Math.round(46/fm);break; // 魔碟:三臂锥弹螺旋
|
||||
case "rockRain": for(let i=0;i<4;i++)ebul(rnd(25,W-25),-6,Math.PI/2+rnd(-0.08,0.08),1.7,"rockb",15);b.minorT=Math.round(150/fm);break; // 兽人月:碎石雨
|
||||
case "torpedo": for(let i=-1;i<=1;i++){const tb=ebul(b.x+i*18,b.y+12,Math.PI/2+i*0.1,1.25,"orbO",18);tb.scale=1.8;tb.r=4.5;}b.minorT=Math.round(240/fm);break; // 黑石:重型鱼雷三连
|
||||
case "bioPlasma": for(let k=0;k<3;k++)ebul(b.x,b.y+12,a0+(k-1)*0.1,3.4,"orbG",14);b.minorT=Math.round(150/fm);break; // 泰伦:生物电浆三连
|
||||
}
|
||||
}
|
||||
function hurtBoss(dmg){
|
||||
|
||||
48
js/render.js
48
js/render.js
@ -40,7 +40,7 @@ function drawBoss(){
|
||||
let ph2=b.phase,sc=1,ox=0,oy=0,flashA=0,mp=null;
|
||||
if(b.transT>0){const prog=1-b.transT/70;
|
||||
ox=rnd(-1.6,1.6);oy=rnd(-1.2,1.2);
|
||||
if(b.idx===1||b.idx===3||b.idx===4||b.idx===6||b.idx===7){mp=prog;if(prog>0.75)flashA=(1-prog)*1.6;}
|
||||
if(b.idx===1||b.idx===3||b.idx===4||b.idx===6||b.idx===7||b.idx===8||b.idx===9||b.idx===10){mp=prog;if(prog>0.75)flashA=(1-prog)*1.6;}
|
||||
else{sc=prog<0.5?1-0.16*(prog*2):0.84+0.16*((prog-0.5)*2);
|
||||
if(prog<0.5)ph2=b.phase-1;
|
||||
flashA=prog<0.5?prog*0.8:(1-prog)*0.8;}}
|
||||
@ -109,6 +109,52 @@ function drawBoss(){
|
||||
circ(0,-14,8,fl||"#43b8ff");circ(0,-14,4,"#bfefff");
|
||||
px(-2,-36,4,18,"#43b8ff");px(-2,0,4,34,"#43b8ff");
|
||||
ctx.restore();ctx.globalAlpha=1;}
|
||||
}else if(b.idx===8){ // 兽人战斗月亮:锯齿岩月+发光兽人图腾;二阶段岩缝熔光、舷炮伸出(连续生长)
|
||||
const op=mp!==null?mp:(ph2>=1?1:0);
|
||||
poly([0,-34,20,-28,32,-12,34,8,24,26,8,34,-12,32,-28,22,-34,2,-30,-18,-14,-30],"#6a5a48"); // 岩体
|
||||
poly([0,-34,20,-28,32,-12,34,8,24,26,8,34,0,32],"#52452f"); // 背光面
|
||||
for(let i=0;i<5;i++){const px8=-27+i*11,py8=-24+(i%2)*11;px(px8,py8,9,7,"#8a8578");px(px8+3,py8+2,2,2,"#3a3430");} // 铆接铁板
|
||||
px(-31,-8,6,10,"#3a3430");px(25,-8,6,10,"#3a3430"); // 侧舷炮座(常存)
|
||||
const bl8=4+op*9; // 炮管自炮座连续伸出
|
||||
px(-30,-4,4,bl8,"#241f1a");px(26,-4,4,bl8,"#241f1a");
|
||||
px(-30,-4+bl8,4,2,fl||"#ff7a2a");px(26,-4+bl8,4,2,fl||"#ff7a2a"); // 炮口
|
||||
ctx.globalAlpha=0.55+0.45*op; // 兽人图腾脸:发光随阶段增强
|
||||
px(-15,-8,9,8,fl||"#ff7a2a");px(6,-8,9,8,fl||"#ff7a2a"); // 怒目
|
||||
poly([-16,10,-11,16,-6,10,-1,16,4,10,9,16,14,10,16,14,10,20,0,23,-10,20,-16,14],fl||"#ffb02a"); // 獠牙巨口
|
||||
ctx.globalAlpha=1;
|
||||
if(op>0){const cl=3+op*9; // 岩缝开裂生长(缝内透熔光)
|
||||
ctx.globalAlpha=0.35+0.45*op;
|
||||
px(-22,-26,3,cl,fl||"#ff5a2a");px(8,-16,3,cl*0.8,fl||"#ff5a2a");px(-6,0,3,cl*0.6,fl||"#ff5a2a");
|
||||
ctx.globalAlpha=1;}
|
||||
}else if(b.idx===9){ // 黑石要塞:四臂石构星堡;二阶段臂自X连续旋为十字、核心充能
|
||||
const op=mp!==null?mp:(ph2>=1?1:0);
|
||||
for(let k=0;k<4;k++){const a=k*Math.PI/2+(1-op)*Math.PI/4;
|
||||
ctx.save();ctx.rotate(a);
|
||||
poly([-6,2,6,2,3,-30,-3,-30],"#1c2230"); // 黑石臂
|
||||
px(-4,-24,8,3,"#2e3a4e");px(-4,-14,8,3,"#2e3a4e"); // 石纹
|
||||
px(-2,-33,4,5,fl||"#5cff9d"); // 臂尖绿晶
|
||||
ctx.restore();}
|
||||
poly([0,-17,12,-12,17,0,12,12,0,17,-12,12,-17,0,-12,-12],"#141a26"); // 八角石核
|
||||
poly([0,-17,12,-12,17,0,12,12,0,17,0,17],"#0d1119"); // 背光面
|
||||
const cw=4+op*3; // 核心绿瞳充能放大
|
||||
circ(0,0,cw+3,"#1f6a44");circ(0,0,cw,fl||"#5cff9d");circ(0,0,Math.max(1,cw*0.45),"#d6ffe8");
|
||||
}else if(b.idx===10){ // 泰伦母舰:生物质长舰+前触手;二阶段背甲滑开露荧光器官、触手伸长
|
||||
const op=mp!==null?mp:(ph2>=1?1:0);
|
||||
const tl=13+op*11; // 触手连续伸长
|
||||
for(const sd of[-1,0,1]){const sw=Math.sin(t*0.06+sd*2)*3; // 触手缓摆(常存)
|
||||
poly([sd*10-3,12,sd*10+3,12,sd*13+sw+1.5,12+tl,sd*13+sw-1.5,12+tl],"#8a4a6a");}
|
||||
poly([0,-30,16,-22,22,-4,18,16,8,24,-8,24,-18,16,-22,-4,-16,-22],"#c8b49a"); // 生物质舰体
|
||||
poly([0,-30,16,-22,22,-4,18,16,8,24,0,24],"#a8947a"); // 受光面
|
||||
for(let i=0;i<4;i++){const ry2=0+i*5,ww=16-i*2.5;px(-ww,ry2,ww*2,2,"#9a8a72");} // 腹肋节理
|
||||
circ(0,-8,5,"#7dff8a");circ(0,-18,3.5,"#7dff8a"); // 荧光生物器官(甲壳之下常存,裂开才露出)
|
||||
circ(0,-8,2,"#e8ffd0");circ(0,-18,1.5,"#e8ffd0");
|
||||
for(const sd of[-1,1]){ctx.save();ctx.translate(sd*op*7,0); // 背甲两瓣滑开(同一几何体平移)
|
||||
poly([0,-30,sd*16,-22,sd*20,-6,sd*14,4,0,-2],"#5a3a6a");
|
||||
poly([0,-30,sd*16,-22,sd*12,-16,0,-22],"#7a5a8a");
|
||||
ctx.restore();}
|
||||
px(-22,-8,4,7,"#3a2a1a");px(18,-8,4,7,"#3a2a1a"); // 孢子囊
|
||||
px(-21,-9,2,2,t%20<10?"#c8ff5c":"#7dff8a");px(19,-9,2,2,t%20<10?"#c8ff5c":"#7dff8a"); // 囊口荧光
|
||||
px(-4,-27,3,4,fl||"#c8ff5c"); // 艏部感知器
|
||||
}else{ // 暗黑魔碟:核心+圆环;变形=圆环前后裂开、两半各自收缩成犄角(同一几何体连续演化);爆甲=壳板飞离、铆钉伸长成刺
|
||||
let open,fo,eyeG;
|
||||
if(b.phase===0){open=0;fo=0;eyeG=0;}
|
||||
|
||||
@ -99,7 +99,7 @@ function orb(c1,c2){
|
||||
".HHCCCHH.",
|
||||
"...HHH..."],{H:halo,W:"#ffffff",C:c2});
|
||||
}
|
||||
const BHALO={orbR:"#ff5566",orbP:"#b05ce8",orbG:"#5cff9d",orbO:"#ff9a3d",dartB:"#3a8cd8",flowr:"#ff8fc8",dartS:"#5ec4ff",dartP:"#b98cff"};
|
||||
const BHALO={orbR:"#ff5566",orbP:"#b05ce8",orbG:"#5cff9d",orbO:"#ff9a3d",dartB:"#3a8cd8",flowr:"#ff8fc8",dartS:"#5ec4ff",dartP:"#b98cff",rockb:"#8a7a62"};
|
||||
SPR.dartB=bake(["KCCCK",".CCC.",".CWC.","..C.."],{K:"#0d2433",C:"#3a8cd8",W:"#cfeaff"}); // 蓝色锥形敌弹(Boss弹幕)
|
||||
SPR.flowr=bake([
|
||||
"....P....",".P..P..P.","..PPPPP..",".PPWWWPP.","PPPWWWPPP",
|
||||
@ -108,6 +108,7 @@ SPR.flowr=bake([
|
||||
SPR.dartS=bake(["CC","CC","CC","CC","CC","CC","CC","CC","CC","CC","WW","WW"],
|
||||
{W:"#f2fbff",C:"#5ec4ff"}); // 夺权者X:蓝白细长钉(2×12,白尖朝运动方向)
|
||||
SPR.dartP=bake(["KPPPK",".PPP.",".PWP.","..P.."],{K:"#2a1040",P:"#b98cff",W:"#ead9ff"}); // 暗黑魔碟:紫锥弹
|
||||
SPR.rockb=bake([".KKK.","KSSSK","KSWSK","KSSSK",".KKK."],{K:"#3a2f26",S:"#8a7a62",W:"#c8bca8"}); // 兽人战斗月亮:碎石弹
|
||||
SPR.orbR=orb("#ffe9e9","#ff5566");SPR.orbP=orb("#f4e9ff","#b05ce8");
|
||||
SPR.orbG=orb("#e9ffe9","#5cff9d");SPR.orbO=orb("#fff4d9","#ff9a3d");
|
||||
SPR.plasma=orb("#e9f8ff","#43b8ff");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user