Files
pixelheros/.trae/documents/plan_spawn_flow_improvement.md
pan d57f4c14e0 chore: 清理过期设计文档并新增刷怪心流改造方案
删除了英雄UI重构和技能模板重构的旧设计文档,新增刷怪节奏优化的完整实施计划文档,包含三个阶段的具体改造步骤、验证方案和执行约束。
2026-08-11 17:19:08 +08:00

12 KiB
Raw Blame History

刷怪心流改造 · 实施步骤与执行方案

基于对 RogueConfig.ts / MissionMonComp.ts / MissionComp.ts 的多 agent 调研与方案讨论产出。 目标:让刷怪节奏产生"爽感"与心流Flow核心公式爽感 = 密度 × 可清性心流 = 铺垫 → 峰值 → 释放循环 + 即时正反馈


阶段划分总览

阶段一P0 修复4 项)          → 安全网与曲线修正,不动体验结构
阶段二P1 节奏与 DDA5 项)     → 核心体验重塑,依赖链严格
阶段三P2-P3 反馈层5 项)      → 情绪反馈补全,可并行开发

阶段一P0 修复

Step 1.1 — P0-3 刷怪暂停死链路(先做:泄压阀)

改动文件MissionMonComp.ts、MissionComp.ts

# 操作 位置
1 update() 在 pending 统计之后、批次推进之前插入 if (smc.mission.stop_spawn_mon) return; MissionMonComp L106 后
2 阈值对齐:maxMonsterCount 80→60resumeMonsterCount 45→40 MissionComp L86-88
3 changePhase(PrepareEnd) 分支补 smc.mission.stop_spawn_mon = false;(防开局冻结 4 秒) MissionComp L492-495

验证:临时 maxMonsterCount=20 进放松回合,确认到 20 只停刷、降 15 后续刷wave 1 开局节奏无延迟。

Commitfix(mission): consume stop_spawn_mon in MissionMonComp update


Step 1.2 — P0-4 回合僵局超时(安全网)

改动文件RogueConfig.ts、MissionComp.ts

# 操作 位置
1 新增常量 WAVE_TIMEOUT = 75(含 JSDoc RogueConfig 节奏常量区
2 MissionComp 新增字段 skipRemainScoreOnBattleEnddata_init 复位 MissionComp 运行时状态区 + L774
3 Battle 阶段 update 追加超时检测 if (this.clearTime >= timeout) this.onBattleTimeout();timeout 取 isBossWave ? 90 : WAVE_TIMEOUT MissionComp L245-251
4 新增 onBattleTimeout():先扣 wave_remain_monsters → 销毁全部 MON 实体 → mon_num=0 → 走 TimeUpAdvanceWave / open_Victory MissionComp 回合管理区
5 BattleEnd 的 wave_remain_monsters += mon_num 加防重判断 MissionComp L522-523

验证:临时 WAVE_TIMEOUT=8,确认 8 秒准点收束、评分已扣、factor 放水TestModeConfig 高血怪模拟僵局验证 75s 前不结束。

Commitfeat(mission): add wave battle timeout fallback


Step 1.3 — P0-1 Wave 1 错位修正

改动文件RogueConfig.ts单文件

# 操作 位置
1 getWaveTypewave % 5 === 1wave % 5 === 4 L80
2 同步 4 处注释WaveType 枚举注释L37、文件头节奏注释L21-23、WaveConfigs 表头注释L329-332、表内"放松回合"行内注释从 wave 6/11/16 搬到 4/9/14 见左

验证getWaveType(1..20) 断言输出 N N N R P × 4 循环;实机确认 wave 1 = 18 只、wave 4 ≈ 40 只低强度。

Commitfix(rogue): move relax wave to pre-boss slot (wave%5==4)


Step 1.4 — P0-2 Boss 压轴 + 预警

改动文件RogueConfig.ts、MissionComp.ts、GameEvent.ts

# 操作 位置
1 SquadLibrary 新增 boss_guardweight:01 重甲+2 近战) RogueConfig L191-198
2 GeneratedMonster 增加可选字段 isBossGuard?: boolean RogueConfig L426-450
3 generateWave 重构第 3/4/8 步Boss 不 push 首位 → 小队拼装 → 护卫队 makeBossGuards() → Boss 压队尾 → 批次统一分配后强制 Boss+护卫 batch = BATCH_COUNT-1remaining 改为 -= 4 RogueConfig L509-554
4 makeBossspawnIndex:0, batch:0 改为占位默认值+注释 RogueConfig L660-687
5 GameEvent 新增 BossWarning = "BossWarning" GameEvent.ts
6 changePhase(BattleStart)if (this.isBossWave) 派发 BossWarning { wave, eta: 20 } MissionComp L497-500
7 MissionComp 从 RogueConfig 补导入 BATCH_INTERVAL, BATCH_COUNT MissionComp L51

验证wave 5 确认 0s/10s 两批纯杂兵、20s Boss 带 3 护卫进场、总怪数=21BossWarning 仅在 5/10/15/20 派发。

Commitfeat(rogue): spawn boss in final batch with guards and warning event


阶段二P1 节奏与 DDA依赖链严格

依赖链:P1-5 → P1-1 → P1-2 + P1-3同批→ P1-4

Step 2.1 — P1-5 数值语义澄清(等价变换先行)

改动文件RogueConfig.ts单文件

# 操作
1 删除第 5 步(乘 hp_mul/ap_mul第 6 步改为拆分 hpScale = targetPower × hp_mul / totalBasePowerapScale = targetPower × ap_mul / totalBasePower
2 更新文件头公式注释L12-16hp_mul/ap_mul 字段注释
3 17/18/19 启用 power_adjust: 1.05 / 1.10 / 1.20
4 validateRogueConfig 增加 power_adjust ∈ [0.8, 1.3] 校验

验证:改造前后固定 heroPower 打桩,逐怪 hp/ap 断言相等等价回归17/18/19 总强度阶梯断言。

Commitrefactor(rogue): unify hp/ap mul into power scaling formula


Step 2.2 — P1-1 批次递增 + 间隔参数化

改动文件RogueConfig.ts、MissionMonComp.ts

# 操作
1 新增 BATCH_RATIO = [0.25, 0.35, 0.40]FINALE_SQUAD_COUNT = 2SPAWN_INTERVAL_BY_TYPENormal 0.18 / Pressure 0.25 / Relax 0.12
2 批次分配从 i % 3 改为 assignBatches():配额切分 + 第三批补 2 个最强小队(pickStrongestSquadcalcHeroPower(样本)×count 评分);放松回合跳过收尾加压;totalCount 预留收尾小队名额防 slice 截掉
3 MissionMonCompMON_SPAWN_INTERVAL 静态常量改为实例字段 spawnIntervalonPhasePrepareEndgetWaveType(currentWave) 查表;releaseCurrentBatch 末尾的 spawnTimer 初始化同步改

与 P0-2 的合并点assignBatches 需保留"Boss+护卫强制最后一批"逻辑。

验证debugMode 日志打印每批只数与最强小队 id放松回合 54 只应 ~6.5s 倾泻完。

Commitfeat(rogue): progressive batch ratio and per-type spawn interval


Step 2.3 — P1-2 + P1-3 清场加速与 DDA 重做(必须同 commit

改动文件RogueConfig.ts、MissionMonComp.ts、MissionComp.ts、GameSet.ts

P1-2 部分MissionMonComp

# 操作
1 新增状态:batchReleasedCountbatchFastForwardedaliveCheckTimerwaveEarlySkipTotalpublic 只读)
2 releaseCurrentBatch 记录当批数量update 中 0.2s 节流调 checkBatchEarlyAdvance()
3 checkBatchEarlyAdvance:存活比例 ≤25% 且本批已放完 → batchTimer += 2swaveEarlySkipTotal += 2(每批一次)

P1-3 部分RogueConfig + MissionComp + GameSet

# 操作
1 DynamicTuner 重写:连续映射 desired = 1 + (0.8 - clearTime/30) × 0.5(死亡锚定 0.8)、滞回 2 回合、指数靠拢 50%、区间 [0.7, 1.3]、新增 streak 字段
2 MissionComp BattleEndeffectiveClearTime = clearTime + MonComp.waveEarlySkipTotal 后传入 adjust顺手写入 lastWaveDeathCount/lastWaveClearTime 快照(供 Step 2.4
3 FightSet.WAVE_HEAL_RATE 0.5→0.4;修正 MissionComp L676"恢复70%"幽灵注释

验证:脚本模拟三种 clearTime 曲线(恒 12s / 恒 25s / 交替)打印 20 回合 factor 轨迹;强 build 单回合时长应从 ~30s 压到 ~24-26s。

Commitfeat(rogue): early batch advance and continuous DDA with hysteresis


Step 2.4 — P1-4 动态回合倒计时

改动文件MissionComp.ts单文件

# 操作
1 新增档位常量 COUNTDOWN_FAST=2.5 / NORMAL=4.0 / FULL=5.0,删除/降级 WAVE_COUNTDOWN_DURATION
2 startWaveCountdown 改调 computeCountdown()有死亡→5sclearTime<65%→2.5s,否则 4s读 Step 2.3 写入的快照字段)

验证:快清场回合倒计时显示 3→2→1有死亡回合给满 5s。

Commitfeat(mission): adaptive wave countdown based on last wave performance


阶段三P2-P3 反馈层

Step 3.1 — 事件与工具基建 + P2-2 清屏庆祝 + P2-3 Boss 演出

改动文件GameEvent.ts、MissionComp.ts、MissionMonComp.ts、新增 ScreenShake.ts、新增 BattleBannerComp.ts、mission.prefab编辑器

# 操作
1 GameEvent 新增:WaveClear / BossWarningStep 1.4 已加则跳过)/ BossSpawn / CoinFly / ComboReach,启用 MonDead
2 新增 ScreenShake 静态工具(抖 smc.map.MapView.node,强度/时长参数,收敛回原位)
3 新增 BattleBannerComp:统一横幅通道(右进 backOut → 停留 → 左出 backIn监听 WaveClear/BossWarning/ComboReach0.3s 去抖
4 MissionComp 清屏分支 dispatch WaveClear { wave, clearTime, allAlive, fastClear }(通关分支不派发)
5 MissionMonComp addMonsterAtGrid isBoss 分支 dispatch BossSpawn { pos }
6 奖励规则fastClear=1 → +2 金,=2 → +5 金allAlive → +1 刷新石(走 MissionEconomy
7 编辑器操作mission.prefab 新增 banner 节点Label+背景),挂 BattleBannerComp

Commitfeat(battle): wave clear banner, boss warning and screen shake


Step 3.2 — P2-1 波次 HUD + P2-4 金币飞行

改动文件新增 WaveHudComp.ts、新增 CoinFlyComp.ts、HeroAtkSystem.ts、mission.prefab编辑器

# 操作
1 WaveHudComp:监听 NewWave 缓存 total0.2s 轮询 mon_num + pending_mon_num 刷新进度条;静态生成 20 格旗帜(getWaveType(i)===Pressure 置 Boss 帧),当前回合脉动
2 HeroAtkSystem scheduleDrop 后 dispatch CoinFly { worldPos, gold, isBoss }onDeath MON 分支 dispatch MonDead
3 CoinFlyComp:独立 NodePool上限 303-5 枚Boss 8 枚)金币抛物线散开→加速飞向钱包;金币帧运行时取编辑器绑定的 coinIconSrc.spriteFrame账务立即结算、飞行纯表现
4 编辑器操作prefab 新增 wave_hudwave_lab/remain_lab/progress/flagsfly_layer(最高 sibling挂组件并拖绑定

Commitfeat(battle): wave progress HUD and coin fly animation


Step 3.3 — P3-1 连杀 Combo

改动文件新增 ComboComp.ts、mission.prefab编辑器

# 操作
1 ComboComp:监听 MonDead2s 滑动窗口计数5/10/20 阈值派发 ComboReach { count, tier }MissionEnd 清零
2 BattleBannerComp 消费 ComboReach分级文案/颜色/震屏tier2 shake(8,0.3)+ 金币爆发 2/5/10
3 编辑器操作prefab 挂 ComboComp

Commitfeat(battle): kill combo system with tiered rewards


执行约束

每次 commit 前必做

  1. validateRogueConfig() 返回空数组
  2. GetDiagnostics 检查改动文件无 TS 错误
  3. 手动验证项按各 Step 的验证清单执行

Commit message 遵循项目规范Conventional Commits、英文、祈使句、≤50 字符)。

资源依赖不阻塞开发可后期补Boss 旗帜帧 ×1、清屏/Boss 预警/连杀音效 ×5、金币入袋音效 ×1——占位方案flash/dun/Hit/Critical/Fire/button 复用。

风险最高的两步Step 1.1PrepareEnd 时序坑)和 Step 2.3P1-2/P1-3 必须同批)。实施时优先单独验证这两点。


附录:关键数值速查

参数 现值 目标值 所属 Step
getWaveType Relax 位 wave%5==1 wave%5==4 1.3
Boss 批次 batch 0 batch 2 + 3 护卫 1.4
maxMonsterCount / resume 80 / 45 60 / 40 1.1
WAVE_TIMEOUT 75sBoss 90s 1.2
BATCH_RATIO 33/33/33 25/35/40 + 收尾小队×2 2.2
刷怪间隔 0.3s 统一 Normal 0.18 / Pressure 0.25 / Relax 0.12 2.2
清场加速 存活≤25% 时 batchTimer += 2s 2.3
DynamicTuner ±0.05 步进 [0.5, 2.0] 连续映射+滞回 [0.7, 1.3] 2.3
WAVE_HEAL_RATE 0.5 0.4 2.3
回合间倒计时 固定 5s 2.5 / 4 / 5 三档 2.4
power_adjust 17/18/19 未使用 1.05 / 1.10 / 1.20 2.1