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

248 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 刷怪心流改造 · 实施步骤与执行方案
> 基于对 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→60`resumeMonsterCount` 45→40 | MissionComp L86-88 |
| 3 | `changePhase(PrepareEnd)` 分支补 `smc.mission.stop_spawn_mon = false;`(防开局冻结 4 秒) | MissionComp L492-495 |
**验证**:临时 `maxMonsterCount=20` 进放松回合,确认到 20 只停刷、降 15 后续刷wave 1 开局节奏无延迟。
**Commit**`fix(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 新增字段 `skipRemainScoreOnBattleEnd``data_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 前不结束。
**Commit**`feat(mission): add wave battle timeout fallback`
---
### Step 1.3 — P0-1 Wave 1 错位修正
**改动文件**RogueConfig.ts单文件
| # | 操作 | 位置 |
|---|---|---|
| 1 | `getWaveType``wave % 5 === 1``wave % 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 只低强度。
**Commit**`fix(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_guard`weight: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-1``remaining` 改为 `-= 4` | RogueConfig L509-554 |
| 4 | `makeBoss``spawnIndex: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 护卫进场、总怪数=21`BossWarning` 仅在 5/10/15/20 派发。
**Commit**`feat(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 / totalBasePower``apScale = targetPower × ap_mul / totalBasePower` |
| 2 | 更新文件头公式注释L12-16`hp_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 总强度阶梯断言。
**Commit**`refactor(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 = 2``SPAWN_INTERVAL_BY_TYPE`Normal 0.18 / Pressure 0.25 / Relax 0.12 |
| 2 | 批次分配从 `i % 3` 改为 `assignBatches()`:配额切分 + 第三批补 2 个最强小队(`pickStrongestSquad``calcHeroPower(样本)×count` 评分);放松回合跳过收尾加压;`totalCount` 预留收尾小队名额防 `slice` 截掉 |
| 3 | MissionMonComp`MON_SPAWN_INTERVAL` 静态常量改为实例字段 `spawnInterval``onPhasePrepareEnd``getWaveType(currentWave)` 查表;`releaseCurrentBatch` 末尾的 spawnTimer 初始化同步改 |
**与 P0-2 的合并点**`assignBatches` 需保留"Boss+护卫强制最后一批"逻辑。
**验证**debugMode 日志打印每批只数与最强小队 id放松回合 54 只应 ~6.5s 倾泻完。
**Commit**`feat(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 | 新增状态:`batchReleasedCount``batchFastForwarded``aliveCheckTimer``waveEarlySkipTotal`public 只读) |
| 2 | `releaseCurrentBatch` 记录当批数量update 中 0.2s 节流调 `checkBatchEarlyAdvance()` |
| 3 | `checkBatchEarlyAdvance`:存活比例 ≤25% 且本批已放完 → `batchTimer += 2s``waveEarlySkipTotal += 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 BattleEnd`effectiveClearTime = 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。
**Commit**`feat(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。
**Commit**`feat(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` / `BossWarning`Step 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 |
**Commit**`feat(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_hud`wave_lab/remain_lab/progress/flags`fly_layer`(最高 sibling挂组件并拖绑定 |
**Commit**`feat(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 |
**Commit**`feat(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 |