原种攻击解单调:新增wingRain抖翅红雨(双翼高频抖动前摇+翼展红光点随机洒落,render同源抖动);tentBeam重做触手鞭击光束(combat.js sweep加swPh相位支持,锚定相位从垂直向下逐帧外鞭展);flowerSnipe改spikeSnipe骨钉三连狙(白色spikeB高速直线,弃用花弹)。仅语法检查通过,未运行验证

This commit is contained in:
JOJO 2026-08-06 03:11:54 +08:00
parent 9bf88a83d3
commit bde3a7468d
3 changed files with 14 additions and 6 deletions

View File

@ -261,7 +261,7 @@ function collide(){
for(const bm of G.bbeams){
if(bm.src&&G.boss&&bm.src.b===G.boss){let ox=bm.src.ox||0,oy=bm.src.oy||0;
bm.x1=G.boss.x+ox;bm.y1=G.boss.y+oy;if(bm.src.followX2)bm.x2=bm.x1;
if(bm.src.sweep)bm.x2=bm.x1+Math.sin(G.time*0.014)*(bm.src.amp||55);} // 黑石要塞:亚空间主炮缓慢扫动
if(bm.src.sweep)bm.x2=bm.x1+Math.sin(G.time*0.014+(bm.src.swPh||0))*(bm.src.amp||55);} // 黑石要塞:亚空间主炮缓慢扫动
if(bm.tele>0){bm.tele--;continue;}
bm.life--;
if(bm.cd>0)bm.cd--;

View File

@ -189,7 +189,7 @@ function updateSpawner(){
/* 8大Boss1种主攻击模式 + 同时1~2种随机小攻击血量阈值触发二/三阶段变形 */
const BOSSES=[
{name:"巡逻巡洋舰",sub:"PATROL CRUISER",hp:950,col:"#e0393e",r:22,main:"cruiser",minors:["snipe","ring"],phases:2},
{name:"太空原种",sub:"SPACE SPAWN",hp:1350,col:"#ff8fc8",r:20,rr:[20,34],ryy:[26,18],wide:1,main:"spawn",minors:["wiggle","flowerSnipe","sporeArc","tentBeam","mawSnipe"],phases:2},
{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},
{name:"歼灭者",sub:"ANNIHILATOR",hp:1700,col:"#b05ce8",r:22,main:"annihilate",minors:["aimSpread","spawnMine"],phases:3},
{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},
{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},
@ -302,7 +302,10 @@ function updateBoss(){
else{b.x=W/2+Math.sin(b.mt*0.013)*(def.wide?44:70);b.y=b.ty+Math.sin(b.mt*0.011)*(def.wide?8:12);} // 通用游走提速+上下浮动(钢琴站桩除外)
b.mt++;
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.eyeGlow>0)b.eyeGlow--; // 帧级技能计时器
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.eyeGlow>0)b.eyeGlow--;if(b.rainT>0)b.rainT--; // 帧级技能计时器
if(b.idx===1&&b.rainT>0&&b.rainT<94&&b.rainT%3===0){ // 原种红雨前摇16帧双翼高频抖动后翼展范围内红光点随机洒落
const span=46*(0.22+0.78*(b.phase>=1?1:0.62));
ebul(b.x+rnd(-span,span),b.y+rnd(-10,2),Math.PI/2+rnd(-0.08,0.08),rnd(2.2,3.4),"orbR",12);}
if(b.idx===8){ // 黑石要塞亚空间主炮序列纹路充能52帧→巨柱扫动80帧
if(!b.plT||b.plT<=0)b.plT=Math.round((b.phase>=1?380:460)/fm);
else{
@ -456,7 +459,8 @@ function bossMinor(b,mk,fm){
case "snipe": for(let k=0;k<3;k++)ebul(b.x,b.y+10,a0+(k-1)*0.06,3.2,"orbR",14);b.minorT=Math.round(150/fm);break;
case "ring": for(let i=0;i<12;i++)ebul(b.x,b.y,i/12*TAU+b.t*0.02,1.6,"orbG",14);b.minorT=Math.round(190/fm);break;
case "wiggle": for(const sd of[-1,1])for(let i=0;i<4;i++){const bb=ebul(b.x+sd*10,b.y+6,Math.PI/2+sd*0.55-i*sd*0.14,1.5,"flowr",13);bb.grow=0.008;bb.maxS=2.6;bb.scale=0.85;}b.minorT=Math.round(150/fm);break;
case "flowerSnipe": for(let k=0;k<3;k++){const bb=ebul(b.x,b.y+10,a0+(k-1)*0.12,2.6,"flowr",15);bb.grow=0.006;bb.maxS=2.4;bb.scale=0.9;}b.minorT=Math.round(170/fm);break;
case "spikeSnipe": for(let k=0;k<3;k++)ebul(b.x,b.y-16,a0+(k-1)*0.12,3.4,"spikeB",15);b.minorT=Math.round(170/fm);break; // 原种:大颚骨钉三连狙(白色骨钉高速直线,非花弹)
case "wingRain": b.rainT=110;b.minorT=Math.round(300/fm);break; // 原种:抖翅红雨——双翼高频抖动前摇后,翼展范围内红色光点如雨随机洒落
case "spawnMini": for(let i=0;i<2;i++)spawnEnemy(pick(["scout","mini"]),b.x+rnd(-26,26),b.y+10,false);b.minorT=Math.round(250/fm);break;
case "spawnMine": spawnEnemy("mine",b.x,b.y+10,false);b.minorT=Math.round(280/fm);break;
case "aimSpread": for(let i=-2;i<=2;i++)ebul(b.x,b.y+12,a0+i*0.19,2.5,"orbO",15);b.minorT=Math.round(140/fm);break;
@ -467,7 +471,10 @@ function bossMinor(b,mk,fm){
case "eyeBeam": bossBeam(b.x,b.y+6,ap2.x,H+8,4,"#ff3355",22,24,20);b.minorT=Math.round(180/fm);break;
case "ringBig": for(let i=0;i<18;i++)ebul(b.x,b.y,i/18*TAU-b.t*0.03,1.8,"orbP",15);b.minorT=Math.round(230/fm);break;
case "sporeArc": for(let i=0;i<7;i++)ebul(b.x,b.y+14,Math.PI/2+(i-3)*0.26,1.2,"orbG",13);b.minorT=Math.round(210/fm);break; // 原种:慢速孢子幕(绿,与花弹差异化)
case "tentBeam": for(const sd of[-1,1])bossBeam(b.x+sd*14,b.y+6,b.x+sd*76,H+8,3,"#ff8fc8",24,26,16,{b,ox:sd*14,oy:6});b.minorT=Math.round(240/fm);break; // 原种:双触手光束外扫
case "tentBeam": { // 原种双触手鞭击光束——从头侧管囊伸出锚定相位从垂直向下逐帧向外鞭展sweep连续判定扫到哪判定到哪
const ph0=-G.time*0.014;
for(const sd of[-1,1])bossBeam(b.x+sd*15,b.y-16,b.x+sd*15,H+8,3,"#ff5c8a",26,74,16,{b,ox:sd*15,oy:-16,sweep:1,amp:sd*42,swPh:ph0});
b.minorT=Math.round(280/fm);break;}
case "mawSnipe": { // 原种:颚部四联狙击——双大颚+头侧管囊齐射快速红点弹发射点与drawProgenitor同源击发后大颚+感器缝闪白余辉)
const MP=[[-5,-22],[5,-22],[-15,-16],[15,-16]];
for(let e=0;e<4;e++){const ex2=b.x+MP[e][0],ey2=b.y+MP[e][1];

View File

@ -268,7 +268,8 @@ function drawProgenitor(b,t,fl,tf){ // 太空原种·装甲虫兽tf 0=装甲
const wS=0.22+0.78*tf; // 翼展P1小翅芽→P2全展同一对翼连续缩放
// —— 骨膜翼一对3根骨刺撑起膜面P1灰甲小翼→P2血红膜+暗红骨,同一几何体罩色) ——
for(const sd of[-1,1]){ctx.save();
ctx.translate(sd*7,-8);ctx.scale(sd*wS,1+Math.sin(t*0.07)*0.03); // 呼吸+镜像
const flut=b.rainT>0?Math.sin(t*0.62)*0.13:Math.sin(t*0.07)*0.03; // 红雨前摇/洒落期双翼高频抖动
ctx.translate(sd*7,-8);ctx.scale(sd*wS,1+flut); // 呼吸/抖动+镜像
poly([0,-4,14,-16,34,-16,54,-10,48,0,34,6,16,4,0,2],"#c9d6e2"); // 膜面主甲
poly([0,-4,14,-16,34,-16,54,-10,40,-8,18,-8,0,-1],"#e8f0f6"); // 上缘受光
poly([0,2,16,4,34,6,48,0,36,0,14,2],"#8498ac"); // 下缘暗面