From 3ffb51098bf4d1f61c8282e95509ddff5f36439f Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Thu, 6 Aug 2026 21:20:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B5=B7=E7=9B=97=E3=80=81?= =?UTF-8?q?=E6=A4=8D=E7=89=A9=E4=B8=A4=E5=A4=A7=E7=A7=8D=E6=97=8F=E6=95=8C?= =?UTF-8?q?=E4=BA=BA=E5=90=8415=E7=A7=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 海盗族15种:5杂兵+6小兵+4精英,锈红/金/骨白配色 - 植物族15种:5杂兵+6小兵+4精英,叶绿/深绿/花粉粉配色 - 各族子弹配色严格≤3色:海盗锈钉/炮弹/燃烧瓶,植物荆棘/种子/孢子 - 敌表新增 race/tier 标签,波次生成按层级池抽取 - 更新 CODEX_KEYS 与客户端图鉴总数 --- star-raid/js/combat.js | 4 ++ star-raid/js/core.js | 5 ++ star-raid/js/enemies.js | 107 +++++++++++++++++++++++++++++++--------- star-raid/js/net.js | 4 +- star-raid/js/sprites.js | 43 ++++++++++++++++ star-raid/server/api.js | 8 ++- 6 files changed, 145 insertions(+), 26 deletions(-) diff --git a/star-raid/js/combat.js b/star-raid/js/combat.js index 7be2c19..3b48620 100644 --- a/star-raid/js/combat.js +++ b/star-raid/js/combat.js @@ -136,6 +136,10 @@ function updateBullets(){ if(tg){b.dead=true;explodeOnce(b);} else{b.fuse=(b.fuse||0)-1;if(b.fuse<=0){b.dead=true;explodeOnce(b);}} } + if(b.t==="pmol"&&!b.dead){ // 海盗燃烧瓶:抛物线,落地/触敌爆炸并留火场 + b.vy+=b.grav||0.08; + if(b.y>=H-10||b.fuse<=0){b.dead=true;explodeOnce(b);} + } if(!b.back&&b.bt!==undefined){b.bt--;if(b.bt<=0&&!b.dead){b.dead=true;explodeOnce(b);}} if(b.t==="mt"&&b.ty2!==undefined&&b.y<=b.ty2&&!b.dead){b.dead=true;explodeOnce(b);} if(b.t==="s"&&!b.dead){ // 分裂弹:飞行一段距离后自动分裂 diff --git a/star-raid/js/core.js b/star-raid/js/core.js index c94dbc7..660d671 100644 --- a/star-raid/js/core.js +++ b/star-raid/js/core.js @@ -333,6 +333,11 @@ function explodeBullet(b){ for(let i=0;i(G.stage>=3?4:3); if(isBoss){startBoss();return;} - // 预算制生成:不开火的杂兵为主(~70%),射手为少数(~30%且有同屏上限) + // 预算制生成:按种族/层级池抽取,杂兵为主,射手为辅,精英少量 let budget=(6+n*2.2)*(G.mode==="stage"?1+G.stage*0.12:1)*budgetScale(); - const fodder=["scout","weaver","kami"].filter(k=>ENEMIES[k].min<=n); - const shooters=["splitter","mine","gunship","sniper"].filter(k=>ENEMIES[k].min<=n); + const all=Object.keys(ENEMIES).filter(k=>ENEMIES[k].min<=n); + const fodder=all.filter(k=>ENEMIES[k].tier==="grunt"); + const shooters=all.filter(k=>ENEMIES[k].tier==="soldier"); + const elites=all.filter(k=>ENEMIES[k].tier==="elite"); const eC=BAL.eliteC(n)*(G.mutator==="ELITE"?4:1); const shooterCap=2+Math.floor(n/3); - let shooterN=0,delay=30; + const eliteCap=1+Math.floor(n/8); + let shooterN=0,eliteN=0,delay=30; while(budget>0){ - let type; - if(shooters.length&&shooterN