Jianghu · 关卡敌人图鉴与生态设计 v1
🔴 数值与实现状态核对(2026-10-10)
本文是 v1 设计稿,代码落地后以下条目已过时或未实现。**数值一律以 src/idle/idleWorld.js 的 MOBS 与 server/.mjs 为准。【未实现 —— 怪物侧技能效果全部不生效】*
- 敌人技能(残血狂暴 / 召唤随从 / 剧毒叠层 / 连击多段 / 受击反伤 / 集火后排 / 远程 / 斩杀 / 吸血等)在战斗里只结算伤害倍率,所有附加效果(
idleBattle.js的_applyEffects)只对我方生效,怪物侧不调用。
- 「远程」「召唤」「血量阈值触发」连代码骨架都没有,是待实现项。
【口径修正】
- 精英怪遭遇:不是「区域第 3 关固定」,而是每个非关底普通关打满 15 只后出现。
- 关底掉落:必掉 4 件(不是 3 件),且必出金以上。
- 敌人表:
MOBS实为 48 条(24 杂兵 / 12 精英 / 12 关底),不是 25 条。
- 黑风寨主 key 是
banditChief(banditLord已下线);山贼bandit已降为杂兵数值。
- 四维差异里
atkInterval不影响战斗节奏:回合制下出手顺序只看agi,怪物固定每回合出手一次。
- 各卡的「×倍数」标注(如 def ×1.8、hp ×2.4)与代码实值普遍不符(多处偏低),以
MOBS原始数值为准。
- §1 现状表是 2026-10-07 的历史快照,勿当现状读。
关卡敌人图鉴与生态设计
Jianghu · Jianghu游历(挂机战斗)· 12 区域敌群 / NPC 与 BOSS 完整方案 · v2(含精英怪层)
2026-10-08 · 依据 src/idle/idleWorld.js(71 关 / 12 区域)· 立绘 tools/gen_enemy_sprites.py · 动作 tools/gen_action_sheet.py
本版依老大 2026-10-08 拍板的 5 项决策调整
| # | 问题 | 决定 | 对本方案的影响 |
|---|---|---|---|
| 1 | 「NPC」口径 | A · 场景杂兵 | 口径不变;可对话 NPC 系统不在本方案内 |
| 2 | 山贼头目去留 | A · 降为黑风岭专属 | 保留 banditLord,但改为独立立绘「黑风寨主·独眼雕」,不再复用 bandit 素材 |
| 3 | 关底随从 | A · 换成本区杂兵 | _spawn() 关底分支的 makeMob('boar') 改读本区杂兵。⚠️ 必须重跑难度矩阵 |
| 4 | 精英怪本期做不做 | B · 本期做 | 🔴 本版最大变更:每区新增 1 只精英(每个非关底普通关打满 15 只后遭遇),角色位 26 → 48,新增立绘 24 → 46 张 |
| 5 | 推进方式 | 先调方案 → 出设定图 → HTML 总检查 → 动作等通知 | 本版 = 调整后的方案;设定图与检查页见 docs/敌人设定图检查.html;H3 动作暂不启动 |
1 · 现状诊断:3 个模板撑 71 关 2 · 设计目标与六条硬约束 3 · 敌人分层与命名规范 4 · 12 区域敌群总表 5 · 逐区设计卡(含配色 / 剪影 / 机制) 6 · 数值设计:换皮不换曲线 7 · 首领机制库(映射现有 effect) 8 · 素材生产方案与成本量化 9 · 技术落地改动点清单 10 · 分期计划与验收标准 11 · 未决问题(需老大拍板)
1 · 现状诊断:3 个模板撑 71 关
当前 MOBS 表里只有 3 个模板,却要覆盖 12 个区域、71 个关卡:
| 模板 | 角色 | 生命 | 攻击 | 防御 | 敏捷 | 真气占比 | 出现位置 |
|---|---|---|---|---|---|---|---|
| boar | 野猪 | 40 | 5 | 1 | 11 | 0 | 全部 12 区域的普通小怪 |
| bandit | 山贼 | 240 | 12 | 3 | 17 | 0.5 | 全部 12 区域的「打满 15 只后」普通 Boss |
| banditLord | 山贼头目 | 700 | 21 | 6 | 20 | 0.6 | 12 个区域关底(+2 只野猪随从) |
四个具体问题
- 区域叙事断裂。背景已经做了 12 套主题(青石村的土路菜畦 → 黄泉道的鬼道彼岸花,
tools/gen_idle_bg.py的区域表),但怪永远是野猪和山贼。画面里「苍梧山的云海」上站着一头野猪、「铁佛寺的朱红院墙」前站着山贼。
- 关底只是"更大只"。
banditLord复用idle_mob_bandit整套素材,靠hRatio 0.42→0.50和数值撑强度。12 个卡点长得一模一样,玩家对"这是第 11 个区域了"没有任何感知。
- 怪没有技能动作。
actions.json里mob_boar[move/attack/hurt/idle]、mob_bandit[walk/attack/hurt/idle]—— 两个都没有skill。头目的「横扫千军 / 暴怒」只能借攻击动作播,技能与平砍在画面上没有区别。
- 已有的差异化维度被浪费。引擎已支持
agi(回合出手顺序)、atkInterval、elemDmg(真气伤害,用来让玩家的elemRes生效)、skills[].effects(14 种效果),但三个模板只用了其中很小一部分,且几乎不随区域变化。
好消息:素材成本不是瓶颈(有实测锚点)
本项目已经批跑过 180 套角色动作(18 职业 × 2 性别 × 5 动作):
_gen_actions/rebuild.log:全流程完成,用时 198.8 分钟
_gen_actions/actions.log:完成 180/180,用时 126.8 分钟 ⇒ ≈ 0.70 分钟 / 套动作
_gen_actions/batch.log:完成 84/84,用时 71.6 分钟(≈ 0.85 分钟/套,含首帧生成)
也就是说:一台机器挂两小时就能出 180 套。本方案新增约 148 套动作 ⇒ 约 104 分钟无人值守。真正需要人做的是立绘挑图和观感验收,不是产能。
2 · 设计目标与六条硬约束
目标
- 一眼认出区域:玩家只看一眼战斗条带,就能说出"这是玄冰崖"而不是"又是野猪"。
- 12 个卡点各不相同:每个关底首领有一个能被玩家感知的招牌机制,不是数值放大。
- 不破坏已调好的平衡:
stageScale()曲线、verify_difficulty.mjs(27 项)与胜率矩阵必须继续通过。
- 可分批交付:每批产出都能独立上线、独立验收,不必等 12 个区域全做完。
六条硬约束(来自已踩过的坑)
| # | 约束 | 来源 / 理由 |
|---|---|---|
| 1 | 换皮不换曲线:新怪的 baseHp/baseAtk/baseDef 只能落在既有档位区间内,区域差异靠 agi / atkInterval / elemDmg / skills 表达 | 曲线由装备 ilvl 指数缩放反推,动 base 值 = 重跑胜率矩阵(见 §6) |
| 2 | 底色先于图案承担区分:小尺寸下细节必丢,色块是最后一道线索 | 挂机条带里怪只有 hRatio 0.26~0.50(约 30~60px 高) |
| 3 | 配色对着"它压在什么背景上"选,不是对着界面主色选 ⇒ 每个区域的敌色必须与该区背景基调有明度差 | 游历入口按钮踩过:竹青按钮融进绿色条带 |
| 4 | 素材一律模型生图,程序只做拼装 + mask 裁形(不绘制内容) | 项目铁律 |
| 5 | 技能的力量感交给独立特效精灵,不烘进角色帧 | H3 对快速挥砍必然烘入拖尾;特效单独出 gen_fx_sheet.py |
| 6 | 关底必须凑够"次数对等":我方最多 3 人 ⇒ 关底 = 首领 + 2 随从(LORD_ESCORTS) | 回合制下 1v3 玩家天生 3 倍出手权 |
3 · 敌人分层与命名规范
| 层 | kind | 出现位置 | 定位 | 素材要求 | 命名规范 |
|---|---|---|---|---|---|
| 杂兵 | normal | 每关常驻,随机 1~3 只(rollPackSize) | 垫脚石。展示区域风貌、练级、掉材料 | 立绘 + 4 套动作(idle/run/attack/hurt) | 「身份 + 特征」2~3 字:泼皮、醉拳汉、匪弩手 |
| 精英 | boss(非 lord) | 所有普通关打满 15 只后的 Boss 位 | 全区的"熟面孔"。占掉原来通用山贼留下的空位 | 立绘 + 5 套动作(含 skill) | 「特征 + 身份」:寨二当家、百夫长、白猿长老 |
| 关底首领 | boss + lord:true | 区域最后一关,1 只 + 2 只本区杂兵 | 卡点。全区的机制展示与数值门槛 | 立绘 + 5 套动作(含 skill)+ 1 条专属特效 | 「势力头衔·本名」:黑风寨主·独眼雕 |
🔴 精英层怎么落(本版转正 · 决策 4 = B)
v1 里"每关打满 15 只后的可选 Boss"这一层用的是通用的山贼。本版把这一层交给区域精英 —— 于是每一层敌人都有区域归属,不再需要一套"通用 Boss":
- 普通关:杂兵 × 1~3 → 打满 15 只 → 本区精英
- 关底关:杂兵 × 1~3 → 打满 15 只 → 本区关底首领 + 2 只本区杂兵(决策 3 = A)
- 掉落沿用现有档位:精英走
DROP_TABLE.boss、关底走DROP_TABLE.lord—— 都不改
- 精英的机制是关底机制的轻量预告(例:赤沙泽「泥俑高防 → 沼骨傀儡毒雾 → 瘴母剧毒叠层」),玩家到关底时已经见过一次
4 · 12 区域敌群总表
每区 = 2 种杂兵 + 1 只精英 + 1 只关底首领(青石村 / 黑风岭的杂兵复用现有素材)。共 48 个角色位,其中复用 2 个(野猪、山贼),新出立绘 46 张。
| # | 区域 | 背景基调 | 势力 | 杂兵 A | 杂兵 B | 关底首领 | 招牌机制 | 批次 |
|---|---|---|---|---|---|---|---|---|
| 1 | 青石村 cun | 青绿暖褐 / 白昼 | 山野兽群 | 野猪 复用 | 田犬 新 | 獠牙猪王 | 冲锋 · 残血狂暴 | P0 |
| 2 | 落霞镇 zhen | 暖褐朱红 / 黄昏 | 市井恶党 | 泼皮 新 | 醉拳汉 新 | 铁面屠户·张屠 | 厚防 · 受击反击 | P0 |
| 3 | 黑风岭 ling | 暗褐墨绿 / 阴沉 | 山贼寨 | 山贼 复用 | 匪弩手 新 | 黑风寨主·独眼雕 | 召唤随从 · 吸血 | P0 |
| 4 | 雁回关 guan | 土黄赭红 / 日暮沙尘 | 叛军溃兵 | 逃卒 新 | 弩兵 新 | 叛将·韩骁 | 破甲突刺 | P1 |
| 5 | 苍梧山 wu | 青灰云白 / 清冷 | 山中精怪 | 灵猿 新 | 山魈 新 | 千年药魈 | 中毒叠层 · 自愈 | P1 |
| 6 | 碧云涧 bi | 青绿水蓝 / 湿润 | 水寨 | 水贼 新 | 蛟奴 新 | 蛟首·碧鳞 | 减速缠斗 · 群攻 | P1 |
| 7 | 赤沙泽 chi | 灰绿土黄 / 阴湿 | 瘴毒 | 毒蛭 新 | 泥俑 新 | 瘴母·赤砂 | 剧毒叠加 · 召虫 | P1 |
| 8 | 铁佛寺 fo | 朱红石青 / 肃穆 | 伪僧 | 恶僧 新 | 铜人 新 | 破戒金刚·无相 | 铁壁 · 定身 | P2 |
| 9 | 落星谷 xing | 深青荧蓝 / 幽暗 | 星陨异种 | 萤妖 新 | 陨石兽 新 | 星陨妖·荧惑 | 高闪避 · 远程真伤 | P2 |
| 10 | 孤云城 yun | 暖褐靛青 / 厚重 | 官军 | 铁甲兵 新 | 弓弩手 新 | 镇将·卫孤云 | 铁壁 · 集火 | P2 |
| 11 | 玄冰崖 bing | 冷白淡蓝 / 寒冽 | 冰雪 | 雪狼 新 | 冰魄 新 | 冰魔·玄霜 | 冰缓 · 冻结 | P2 |
| 12 | 黄泉道 huang | 墨黑幽绿 / 阴森 | 幽冥 | 鬼差 新 | 亡魂 新 | 判官·崔珏 | 斩杀 · 吸魂 | P2 |
关于"NPC"的一处口径说明:现有代码里没有非战斗 NPC 实体(MOBS_PER_STAGE 之外的角色只出现在界面)。本方案把"NPC"落为场景杂兵(normal 层)——它们是玩家在条带上唯一会看到并与之交互的"场景角色"。若老大要的是可对话/接任务的 NPC(商人、掌门、镖师),那是另一套系统(会话数据、任务状态机、UI),本方案不含,可在 §11 单独立项。
4.1 · 精英怪一览(12 只 · 普通关的"熟面孔")
| # | 区域 | 精英 | key | 机制 | 数值档(相对同区杂兵) |
|---|---|---|---|---|---|
| 1 | 青石村 | 独眼獠猪 | boarElite | 冲锋倍率更高 | hp ×2.4 · agi 13 |
| 2 | 落霞镇 | 打行掌事 | enforcer | 受击反击(armorPen 反打) | def ×1.3 · agi 12 |
| 3 | 黑风岭 | 寨二当家 | banditSecond | 双短刀快攻 | atk ×1.2 · atkInterval 1.2 |
| 4 | 雁回关 | 百夫长 | centurion | 破甲(armorPen 25%) | def ×1.4 · hp ×2.2 |
| 5 | 苍梧山 | 白猿长老 | whiteApeElder | 连击(hits 2) | agi 22 · atkInterval 1.0 |
| 6 | 碧云涧 | 水寨头领 | riverBoss | 减速(slow 3s) | def ×1.3 · elemDmg 0.5 |
| 7 | 赤沙泽 | 沼骨傀儡 | bogBone | 毒雾(dot 2 层) | def ×1.4 · hp ×2.0 |
| 8 | 铁佛寺 | 持戒武僧 | vowMonk | 定身(stun 1.2s) | def ×1.4 · elemDmg 0.5 |
| 9 | 落星谷 | 陨铁巨兽 | meteorTitan | 受击反伤 | def ×1.7 · hp ×2.6 |
| 10 | 孤云城 | 城防校尉 | cityOfficer | 号令(提升同队攻击) | def ×1.5 · atkUp ×1.2 |
| 11 | 玄冰崖 | 冰晶巨像 | iceColossus | 冰缓(slow) | def ×1.8 · hp ×2.8 |
| 12 | 黄泉道 | 无常使者 | impermanence | 斩杀(execute) | agi 21 · elemDmg 0.8 |
精英的数值档位统一取「杂兵的 2.0~2.8 倍生命 / 1.2~1.8 倍防御」,落在关底(620~760 血)与杂兵(40~80 血)之间,不影响 stageScale() 曲线形状。
5 · 逐区设计意图(角色清单见设定图检查页)
🔴 角色的完整清单(名称 / 层 / 三色卡 / 数值 / 真实背景预览)在 docs/敌人设定图检查.html —— 那份页面是设定图的唯一真源,一张图对应一个角色,改图不用改两份文档。
本节只放设计意图:为什么这么配色、这个区域的机制想教玩家什么。
| # | 区域 | 配色理由(对着该区背景基调定) | 机制意图 |
|---|---|---|---|
| 1 | 青石村 cun | 背景是青绿 + 暖褐(浅赭土路)⇒ 敌人走暖赭 / 棕,靠深浅分层 | 第一个卡点用野猪王:玩家第 6 关第一次遇到"残血变强"的敌人,是全局第一个机制教学;且此时还不需要内功抗性 |
| 2 | 落霞镇 zhen | 背景是暖褐 + 朱红(黄昏街市)⇒ 敌人走冷青灰,全作最强的冷暖对比 | 教"防御与减伤":张屠的铁壁让"无脑堆输出"第一次失效 |
| 3 | 黑风岭 ling | 背景是暗褐 + 墨绿(阴沉)⇒ 敌人走赭红 / 脏白,同暗但偏暖 | 锚点区:老素材(山贼 / 山贼头目)就地归位,改造幅度最小。机制教"打断"——召唤与吸血都要求玩家不能让战斗拖下去 |
| 4 | 雁回关 guan | 背景是土黄 + 赭红(日暮沙尘)⇒ 敌人走铁灰 / 靛青,冷铁对暖沙 | 全局第一个"必须堆防 / 回血"的关卡。前三个区域靠输出就能过,此处开始要求玩家第一次认真看装备属性 |
| 5 | 苍梧山 wu | 背景是青灰 + 云白(全作最亮的一组)⇒ 敌人必须有饱和的绿才立得住 | 教"节奏":药魈的中毒叠层 + 自愈,逼玩家不能磨 —— 要抢在毒叠满前打完 |
| 6 | 碧云涧 bi | 🔴 背景本身就是青绿 / 水蓝 ⇒ 敌人不能再用同类绿,改暖赭(水贼)+ 深青(蛟奴)做明度分离 | 教"属性抗性":蛟奴起出现稳定的真气伤害,内功那一路开始有意义 |
| 7 | 赤沙泽 chi | 背景是灰绿 + 土黄(阴湿)⇒ 敌人走紫黑 / 病白,全作唯一一组"脏色" | 从这里开始「净化 / 回血」从可选项变必需项:没带 cleanse 的门派会明显感受到难度 |
| 8 | 铁佛寺 fo | 🔴 背景是朱红 + 石青 ⇒ 敌人走金铜色系。全作唯一跟背景同色系的区域,靠明度差 + 金属高光分离 | 教"破甲与集火":铜人 def ×2.0 是全作最高的墙,破甲技能在这里必须有位置 |
| 9 | 落星谷 xing | 背景是深青 + 荧蓝(幽暗)⇒ 敌人走荧紫 / 亮白,靠发光点破暗 | elemDmg 0.9 是本作最高档:内功抗性不堆就基本打不动 —— 功法系统的价值在这里兑现 |
| 10 | 孤云城 yun | 背景是暖褐 + 靛青(厚重)⇒ 敌人走铁灰蓝 / 黑,与靛青同系但更冷更沉 | 🔴 唯一改动战斗逻辑的区:集火后排——玩家必须调阵型,把肉盾放到后排才不会被射崩 |
| 11 | 玄冰崖 bing | 🔴 背景是全作最亮最冷的一组(冷白 / 淡蓝)⇒ 主色压到中蓝,用暖橙做唯一高对比锚点 | 教"出手权":冰缓 + 冻结会拉长我方出手间隔,等同于削弱玩家最核心的回合优势 |
| 12 | 黄泉道 huang | 背景是墨黑 + 幽绿(最暗)⇒ 敌人走惨白 / 血红,靠"白"从黑里浮出来 | 终局:execute 是"惩罚拖时间"的机制 —— 打到黄泉道,玩家不能靠磨。建议同时作为结局演出的舞台 |
6 · 数值设计:换皮不换曲线
核心原则
几乎不动 base 值。现有 stageScale(level) 的曲线是拿 tools/verify_difficulty.mjs 的胜率矩阵反推出来的(目标:该关水平的阵容打关底要 60~150 作品秒、偶尔翻车)。任何大幅调整 baseHp/baseAtk 都会让那 27 项断言和胜率矩阵失效。
所以新怪只在四个自由维度上做差异:agi、atkInterval、elemDmg、skills;同时在 base 上做±20% 以内的档位微调(体现"脆快 / 厚慢"的体型差)。
基准档位表(等级 1 基准,实际值由 stageScale() 放大)
| 层 | baseHp | baseAtk | baseDef | atkInterval | agi | elemDmg | 说明 |
|---|---|---|---|---|---|---|---|
| 杂兵 · 脆快 | 32~40 | 4~5 | 1 | 1.1~1.3 | 16~20 | 0~0.4 | 田犬 / 灵猿 / 萤妖 / 雪狼 |
| 杂兵 · 标准 | 40~55 | 5~7 | 1~2 | 1.4~1.6 | 11~15 | 0~0.5 | 泼皮 / 逃卒 / 水贼 / 恶僧 / 鬼差 |
| 杂兵 · 厚慢 | 60~80 | 7~9 | 3~4 | 1.8~2.0 | 5~10 | 0~0.5 | 山魈 / 泥俑 / 铜人 / 陨石兽 / 铁甲兵 |
| 精英(普通关的 Boss 位) | 150~200 | 13~16 | 4~6 | 1.3~1.7 | 12~22 | 0.3~0.6 | 落在杂兵与关底之间;取代原来通用的 bandit(240/12/3)那一档 |
| 关底首领 | 620~760 | 19~23 | 5~7 | 1.4~1.6 | 18~22 | 0.5~0.9 | 沿用现有 banditLord 档(700/21/6)为中枢 |
三个"允许突破档位"的例外(都有明确理由)
def ×2.0(铜人)与def ×1.6(铁甲兵 / 金刚):它们的定位就是"打不动的墙",且我方的破甲技能(armorPen)必须有用武之地。
hp ×0.6~0.7(萤妖 / 毒蛭):靠数量和 dot 制造压力,单体血高反而破坏节奏。
elemDmg 0.85~0.9(星陨妖 / 判官):这是本作最高的真气占比,用来给"内功抗性"这条成长线一个必然的兑现点。
区域难度轴:elemDmg 随区域单调上升
| 区域 | 1-2 | 3-4 | 5-6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|
| 杂兵 elemDmg | 0 | 0.3 | 0.4 | 0.5 | 0.3 | 0.6 | 0.5 | 0.6 | 0.6 |
| 首领 elemDmg | 0 | 0.4 | 0.6 | 0.8 | 0.7 | 0.9 | 0.5 | 0.8 | 0.85 |
设计意图:前 12 关是"纯物理",玩家不需要管抗性;从黑风岭开始出现真气伤害,到落星谷达到峰值。这条轴让"内功"这条成长线有了明确的推进节奏,而不是一开始就逼玩家懂属性。
7 · 首领机制库(映射现有 effect)
现有战斗层已支持 14 种 effect(idleBattle.js),并且有"减益/增益"白名单(DEBUFF_TYPES)。本方案的 12 个首领机制全部落在已支持的类型里,不需要新增 effect —— 唯一例外见文末。(⚠️ 怪物侧未实现,见顶部核对块)
| effect | 语义 | 用它的首领 | 已支持 |
|---|---|---|---|
| armorPen | 破甲(无视部分防御) | 张屠·反击、韩骁·突刺 | ✅ |
| stun | 定身 | 无相·伏魔印、玄霜·冰封 | ✅ |
| slow | 减速(拉长出手间隔) | 碧鳞·缠斗、玄霜·冰缓 | ✅ |
| dot | 持续伤害(可叠层) | 药魈·瘴雾、赤砂·剧毒 | ✅ |
| atkDown | 削弱攻击 | 备用 | ✅ |
| lifesteal | 吸血 | 独眼雕、判官·吸魂 | ✅ |
| heal / regenHp / regenMp | 回血 / 回复 | 药魈、赤砂(变体) | ✅ |
| damageReduce | 减伤(铁壁) | 张屠、无相、卫孤云 | ✅ |
| dodgeUp / atkSpeedUp / atkUp | 闪避 / 攻速 / 攻击增益 | 荧惑·闪避、猪王·狂暴 | ✅ |
| execute | 斩杀(低血处决) | 判官·勾魂 | ✅ |
| cleanse | 净化(清减益) | —— 供玩家用(赤砂/药魈关的反制手段) | ✅ |
(⚠️ 怪物侧未实现,见顶部核对块)
两个需要新增的战斗层能力(工作量很小,但必须做)
- 召唤(
summon):独眼雕与赤砂要在战斗中途补随从。需要一个 "mid-battle spawn" 路径。注意:现在_spawn()是"整波替换"(this.mobs = list),必须新增一个"追加到现有数组并补uid/slot"的分支,不能复用_spawn()(会把场上其他怪整波清掉)。
- 血量阈值触发:猪王的"残血狂暴"需要一个
hpRatio < 0.35的一次性触发钩子(与技能"上升沿"同思路:判上升沿,不判电平,否则会每帧重挂 buff)。
8 · 素材生产方案与成本量化
管线(已有,不改)
立绘 → 动作 → 装表 → 前端
tools/gen_idle_sprites.py Seedream 1024×1024 → 抠白底 → public/assets/idle/idle_mob_<key>.webp tools/gen_action_sheet.py H3 出片 → 抽帧 → 抠绿 → 逐帧对齐 → 拼表 → _gen_actions/ tools/gen_fx_sheet.py 黑底出片 → 亮度当 alpha → 首领专属特效 tools/install_action_sheets.py 装表 → public/assets/idle/actions.json src/idle/anim.js + idleBand.js 渲染消费
动作集要求
| 层 | idle | run / walk | attack | skill | hurt | 合计 |
|---|---|---|---|---|---|---|
| 杂兵 | ✅ | ✅ | ✅ | — | ✅ | 4 套 |
| 关底首领 | ✅ | ✅ | ✅ | ✅ 新增 | ✅ | 5 套 |
成本估算(用实测值 0.70 分钟/套)
| 批次 | 区域 | 新增角色 | 动作套数 | 机器时间 | 立绘(API + 挑图) |
|---|---|---|---|---|---|
| P0 | 青石村 / 落霞镇 / 黑风岭 | 5 | 21 | ≈ 15 分钟 | ≈ 10 分钟 |
| P1 | 雁回关 / 苍梧山 / 碧云涧 / 赤沙泽 | 8 | 33 | ≈ 23 分钟 | ≈ 15 分钟 |
| P2 | 铁佛寺 / 落星谷 / 孤云城 / 玄冰崖 / 黄泉道 | 11 | 44 | ≈ 31 分钟 | ≈ 20 分钟 |
| 合计 | 24 | 98 + 1(补 banditLord 的 skill) | ≈ 70 分钟 | ≈ 45 分钟 |
另有 11 条首领专属特效(gen_fx_sheet.py,每条 1~2 秒、8 步采样)+ 12 条 buff/减益飘字色板。总计机器占用约 1.5 小时,人的时间主要是挑立绘与观感验收。
为什么不做"同骨架换色变体"(省 60% 成本)
可行,但不建议:1 项目铁律是"素材一律模型生图",程序调色只用于图标类小素材(有 compose_journey_icons.py 的先例),用在战斗角色上会显得廉价;2 观感上"同一个人换了件衣服"比"重复使用"好得有限;3 成本锚点显示 98 套只要 70 分钟 —— 省不下多少,但会牺牲这个方案的全部价值。
9 · 技术落地改动点清单
| # | 文件 | 改动 | 风险 |
|---|---|---|---|
| 1 | src/idle/idleWorld.js | MOBS 扩表(3 → 48 条)。每条沿用现有字段:key/name/kind/sprite/hRatio/baseHp/baseAtk/baseDef/atkInterval/agi/elemDmg/skills/expBase/goldBase,新增两个可选字段 lord、animKey。REGIONS 数组补一个 mobs: {normal:[...], lord:'...'} 字段,把"区域 → 敌人"的映射写进数据,而不是散落在代码里 | 中 |
| 2 | src/idle/idleBattle.js · _spawn()(L400~427) | 把三处硬编码 makeMob('boar'/'bandit'/'banditLord') 换成读 stage 的敌群配置。关底随从从固定 boar 改为该区的杂兵(青石村的关底带田犬,玄冰崖的关底带雪狼)—— 这样"随从"也参与区域标识 | 高 |
| 3 | src/idle/idleBattle.js | 新增 summon(战中追加怪物,不要复用 _spawn())与 hpRatio 阈值钩子(判上升沿) | 中 |
| 4 | public/assets/idle/actions.json | 由 install_action_sheets.py 自动装表(勿手改) | 低 |
| 5 | tools/gen_action_sheet.py 的 CHARACTERS | 追加 24 条角色(art 指向新立绘、side:'L'、style 沿用折纸风) | 低 |
| 6 | server/equipDefs.mjs · DROP_TABLE | 可选:首领掉落按区域分档。现有 lord 档(必掉 4 件、保底 gold)已够用,建议首批不改 | 低 |
| 7 | tools/verify_mobs.mjs(新增) | 校验:1 每个区域都有敌人配置 2 MOBS 里每个 key 都在 actions.json 有对应 char 3 关底 lord:true 与 animKey 齐备 4 每个区域的 elemDmg 落在设计区间 | 低 |
两个必须避开的坑
- 头目复用素材时必须给
animKey:makeMob()默认用t.key去找actions.json的 char。若新首领的key与素材不同名,不写animKey的表现是首领站着不动(退回单帧立绘),且不报错。
- 关底随从换成本区杂兵后,要重跑
verify_difficulty.mjs:随从的血/防不同(如泥俑def ×1.5)会改变关底的实际长度。
10 · 分期计划与验收标准
批次(已按 46 张立绘重算)
| 批 | 范围 | 新立绘 | 动作套数 | 机器时间 | 交付物 |
|---|---|---|---|---|---|
| P0 | 青石村 / 落霞镇 / 黑风岭 1~18 关 | 10 | 46 | ≈ 32 分钟 | MOBS 扩表 + _spawn() 改造 + verify_mobs.mjs + 1 条特效 |
| P1 | 雁回关 / 苍梧山 / 碧云涧 / 赤沙泽 19~42 关 | 16 | 72 | ≈ 50 分钟 | + summon / 阈值钩子(精英与关底共用)+ 4 条特效 |
| P2 | 铁佛寺 ~ 黄泉道 43~71 关 | 20 | 90 | ≈ 63 分钟 | + 集火后排机制 + 6 条特效 + 通关演出立项 |
| 合计 | 46 | 208 | ≈ 145 分钟 | 立绘另有 Seedream 生成时间 ≈ 46 × 16s ≈ 12 分钟 |
动作套数怎么来的:杂兵 22 个(去掉复用的野猪 / 山贼)× 4 套 = 88;精英 12 × 5 套 = 60;关底 12 × 5 套 = 60。合计 208 套,按实测 0.70 分钟/套 ≈ 145 分钟无人值守。
每批必做的四项验收
- 数值:
node tools/balance_matrix.mjs胜率矩阵无异常塌陷;verify_difficulty.mjs(27 项)全绿。⚠️ 决策 3(关底随从换成本区杂兵)与精英层都会改变战斗长度,这一项必须重跑,不能跳过。
- 表现:无头截图对比 —— 同一关改动前后各截一张,人眼确认"换的是谁"。
- 数据完整性:
verify_mobs.mjs—— 每个key都能在actions.json找到动作,缺一个就报错(别让"站着不动的首领"跑到线上)。
- 区域可辨性(人眼项):把 12 个区域的战斗截图并排看,能一眼说出区域名才算过。不通过 ⇒ 回炉的是配色,不是数值。
11 · 决策记录与待定项
已拍板(老大 2026-10-08)
| # | 问题 | 决定 | 落地状态 |
|---|---|---|---|
| 1 | 「NPC」口径 | A · 场景杂兵 | ✅ 已按此设计;可对话 NPC 单独立项 |
| 2 | 山贼头目去留 | A · 降为黑风岭专属 | ✅ 保留 key banditChief,改独立立绘「黑风寨主·独眼雕」 |
| 3 | 关底随从 | A · 换成本区杂兵 | ⏳ 待动作与代码落地(_spawn() + 重跑难度) |
| 4 | 精英怪 | B · 本期做 | ✅ 已转正:12 只精英,占用"普通关 15 只后"的 Boss 位 |
| 5 | 推进方式 | 先调方案 → 出设定图 → HTML 总检查 → 动作等通知 | ✅ 方案已调(本版)、46 张设定图已出、检查页已交付;H3 动作待通知 |
本次新产生的待定项
| # | 问题 | 选项 | 说明 |
|---|---|---|---|
| 6 | 精英的出场位置:是"每个普通关打满 15 只后"(本方案),还是只在区域第 3 关出一次? | A. 每个普通关都出(熟面孔、无需额外层) B. 只在第 3 关出,其余普通关沿用通用 Boss | A 让每区只需 4 个角色;B 会让区域节奏更有层次,但要再补 12 只"通用 Boss",素材量 +12 |
| 7 | 首领专属特效的规模:12 条全做,还是只做关底 | A. 只做 12 条关底特效(本方案) B. 精英也各配 1 条(+12 条 ≈ +20 分钟) | A 够用:精英复用通用特效(slash / burst / lash)即可 |
| 8 | 是否需要"区域首通演出"(每区关底胜利时给一次特殊表现) | A. 不做(本期) B. 做一个轻量的横幅 + 区域名 | B 成本很低(纯前端),但会动到战斗结算链路 —— 建议验收完 P0 再定 |
| 9 | BOSS 出场演出(镜头拉近 + 名号浮层 + 台词) | A. 不做 B. 单独立项 | 与"关底是卡点"的定位很配,但属于独立系统,不阻塞本次 |
本方案不含:可对话 NPC 系统、BOSS 出场演出(镜头/台词)、区域专属掉落表、结局演出。这四项都需要单独立项,且互不阻塞。
数据来源:src/idle/idleWorld.js(MOBS / REGIONS / stageScale)、src/idle/idleBattle.js(_spawn / effects)、tools/gen_idle_bg.py(12 区域背景主题)、public/assets/idle/actions.json、_gen_actions/*.log(成本实测)、server/equipDefs.mjs(DROP_TABLE)。