From bde3a7468d0adc038a05ab639a29af9ef8efb714 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Thu, 6 Aug 2026 03:11:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E7=A7=8D=E6=94=BB=E5=87=BB=E8=A7=A3?= =?UTF-8?q?=E5=8D=95=E8=B0=83=EF=BC=9A=E6=96=B0=E5=A2=9EwingRain=E6=8A=96?= =?UTF-8?q?=E7=BF=85=E7=BA=A2=E9=9B=A8=EF=BC=88=E5=8F=8C=E7=BF=BC=E9=AB=98?= =?UTF-8?q?=E9=A2=91=E6=8A=96=E5=8A=A8=E5=89=8D=E6=91=87+=E7=BF=BC?= =?UTF-8?q?=E5=B1=95=E7=BA=A2=E5=85=89=E7=82=B9=E9=9A=8F=E6=9C=BA=E6=B4=92?= =?UTF-8?q?=E8=90=BD=EF=BC=8Crender=E5=90=8C=E6=BA=90=E6=8A=96=E5=8A=A8?= =?UTF-8?q?=EF=BC=89=EF=BC=9BtentBeam=E9=87=8D=E5=81=9A=E8=A7=A6=E6=89=8B?= =?UTF-8?q?=E9=9E=AD=E5=87=BB=E5=85=89=E6=9D=9F=EF=BC=88combat.js=20sweep?= =?UTF-8?q?=E5=8A=A0swPh=E7=9B=B8=E4=BD=8D=E6=94=AF=E6=8C=81=EF=BC=8C?= =?UTF-8?q?=E9=94=9A=E5=AE=9A=E7=9B=B8=E4=BD=8D=E4=BB=8E=E5=9E=82=E7=9B=B4?= =?UTF-8?q?=E5=90=91=E4=B8=8B=E9=80=90=E5=B8=A7=E5=A4=96=E9=9E=AD=E5=B1=95?= =?UTF-8?q?=EF=BC=89=EF=BC=9BflowerSnipe=E6=94=B9spikeSnipe=E9=AA=A8?= =?UTF-8?q?=E9=92=89=E4=B8=89=E8=BF=9E=E7=8B=99=EF=BC=88=E7=99=BD=E8=89=B2?= =?UTF-8?q?spikeB=E9=AB=98=E9=80=9F=E7=9B=B4=E7=BA=BF=EF=BC=8C=E5=BC=83?= =?UTF-8?q?=E7=94=A8=E8=8A=B1=E5=BC=B9=EF=BC=89=E3=80=82=E4=BB=85=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E6=A3=80=E6=9F=A5=E9=80=9A=E8=BF=87=EF=BC=8C=E6=9C=AA?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star-raid/js/combat.js | 2 +- star-raid/js/enemies.js | 15 +++++++++++---- star-raid/js/render.js | 3 ++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/star-raid/js/combat.js b/star-raid/js/combat.js index e05f36d..6a6d627 100644 --- a/star-raid/js/combat.js +++ b/star-raid/js/combat.js @@ -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--; diff --git a/star-raid/js/enemies.js b/star-raid/js/enemies.js index 8cf4bce..6b0d716 100644 --- a/star-raid/js/enemies.js +++ b/star-raid/js/enemies.js @@ -189,7 +189,7 @@ function updateSpawner(){ /* 8大Boss:1种主攻击模式 + 同时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]; diff --git a/star-raid/js/render.js b/star-raid/js/render.js index 658a4d9..8579de8 100644 --- a/star-raid/js/render.js +++ b/star-raid/js/render.js @@ -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"); // 下缘暗面