geometry-tower-defense/docs/CodeX-TODO.md

252 lines
14 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.

# CodeX M2 执行计划
> 依据:`docs/TODO.md` 当前口径,默认 `M1` 已完成并已收口。
> 目标:把 `M2P1- 核心深度` 拆成可直接开工的执行顺序、具体工作包与验收边界。
## 当前代码现状判断
- `EventNodeComponent`、`DREvent`、`EventForm` 已有最小骨架,`Event.txt` 已有 3 个样例事件,但 `EventFormUseCase.SelectOption()` 仍停留在 `TODO`,尚未真正执行条件校验、概率结算、消耗/奖励效果。
- `ShopNodeComponent``ShopFormUseCase` 已支持“生成 4 个商品并购买组件”的最小链路,但还没有出售、复杂定价、耐久折价、卖塔加成,也没有把商店能力沉到统一规则入口。
- `RunState` 已完成 A1 扩展,当前已承载 `runId / runSeed / current theme / theme stage / current theme pool / theme history / current node continue challenge layer / run items / node sequence / inventory snapshot`,并且事件、商店、战斗都已经改为通过统一节点完成快照回写这些状态。
- `LevelThemeType` 已有 `Volcano / Mountain`,战斗侧已有按主题取关卡、掉落按主题偏置的基础入口,因此主题玩法更适合在现有战斗调度器上继续补钩子,而不是重做主流程。
## 当前进度更新
- `A1` 已完成:`RunState` 长期状态字段、`RunNodeExecutionContext`、`RunNodeCompletionSnapshot`、`ProcedureMain` 统一推进写回链路都已落地。
- `A2` 已完成:已经补上三组最小 `EditMode` 测试入口,分别覆盖事件定义工厂、商店价格规则入口、当前可见的继续挑战倍率公式。
- 当前下一步应直接进入 `P1-01`,收口事件执行链路,不再继续停留在基础设施阶段。
## M2 总体推进顺序
1. 先收口事件系统 `P1-01 ~ P1-02`,因为代码骨架已经在,投入最小,能最快形成第二类节点的真实玩法。
2. 再收口商店系统 `P1-03 ~ P1-04`,把“买/卖/定价”统一到同一套库存与价格规则中。
3. 之后补运行中长期状态承载:道具系统 `P1-05` 与继续挑战 `P1-06`
4. 再做主题玩法底座与两个主题规则 `P1-07 ~ P1-09`,避免火山、山地各自临时写一套。
5. 最后做大关后主题选择 `P1-10`,因为它依赖新的 run 分段结构与主题状态流转。
## 开工前置
### A1. 先补 M2 状态承载
- 当前状态:已完成。
- 目标:在不破坏 M1 固定 10 节点闭环的前提下,为 M2 新功能预留明确状态字段。
- 交付物:
- `Assets/GameMain/Scripts/Procedure/ProcedureMain/RunModel.cs`
- `Assets/GameMain/Scripts/Procedure/ProcedureMain/` 下相关推进服务
- 具体工作:
-`RunState` 增加继续挑战层数、主题阶段索引、当前主题池、运行中道具列表或等价结构。
- 明确哪些状态属于 `RunState`,哪些属于 `PlayerInventory`,避免“金币在 run、道具在 inventory、主题选择在 UI 临时变量”这种分散写法。
- 为节点完成事件补足 M2 需要的快照字段,保证事件/商店/战斗都能通过统一推进入口回写状态。
- 验收补充:
- 不影响现有 M1 测试。
- 新字段默认值明确,未启用 M2 功能时不会改变 M1 行为。
### A2. 为 M2 先补最小测试底座
- 当前状态:已完成。
- 目标:先把容易回归的规则放进 `EditMode`,避免事件和定价后面越改越散。
- 交付物:
- `Assets/Tests/EditMode/`
- 具体工作:
- 先建三组测试入口:事件需求/效果执行、商店定价、继续挑战倍率。
- 对主题玩法先补纯规则测试,场景表现与路径交互后续再补 PlayMode。
- 验收补充:
- 至少保证新增核心公式与随机种子行为可回归。
## P1 详细计划
### P1-01 事件节点系统(选项、概率、奖励/惩罚执行器)
- 核心目标:把现有“能打开事件 UI”补完成“能稳定结算并推进节点”的正式系统。
- 交付物:
- `Assets/GameMain/Scripts/CustomComponent/EventNodeComponent.cs`
- `Assets/GameMain/Scripts/UI/Game/UseCase/EventFormUseCase.cs`
- `Assets/GameMain/Scripts/Definition/Event/`
- 必要时新增 `Assets/GameMain/Scripts/Procedure/` 下的事件结算服务
- 具体拆分:
- 增加统一事件执行入口:`检查 Requirements -> 执行 CostEffects -> 掷概率 -> 执行 RewardEffects -> 生成结算结果 -> EndEvent`。
- 概率结算改为基于 `runSeed + sequenceIndex + eventId + optionIndex` 的稳定随机,避免同局回放不一致。
- Requirements 不满足时UI 侧需要明确禁止点击或提示原因,不能点了再静默失败。
- Effects 不要散落在 UI 控制器里,统一走一个事件执行服务或等价显式流程函数。
- 明确失败语义:要求不足属于“不可选”,概率失败属于“已执行但收益为空或惩罚生效”。
- 验收补充:
- 可稳定配置并执行至少 10 个事件。
- 事件结束后金币、库存、耐久等变化能正确写回节点完成快照。
- 同一种子重复运行时,事件随机结果一致。
### P1-02 落地 3 个示例事件(赌马 / 组件交换 / 耐久换金币)
- 核心目标:用 3 个真实事件验证 `P1-01` 的执行器不是一次性硬编码。
- 交付物:
- `Assets/GameMain/DataTables/Event.txt`
- 若现有效果不足,补 `Assets/GameMain/Scripts/Definition/Event/EventEffect/`
- 若现有条件不足,补 `Assets/GameMain/Scripts/Definition/Event/EventRequirement/`
- 具体拆分:
- 保留并收口“赌马”事件,验证 `GoldAtLeast + AddGold + Probability`
- 把“组件交换”改成真正符合设计的链路:支付指定品质组件,返回不低于原品质的新组件;现有“换金币”样例不足以覆盖该目标。
- 新增“耐久换金币”事件,复用当前耐久体系,明确扣减对象、扣减数量、损坏后的处理与节点结束后的清理。
- 事件表扩充到 10 个可用事件时,先按低风险/中风险/功能型三类分层,避免全是纯金币事件。
- 验收补充:
- 三个示例事件在局内都能完整触发、结算、回写状态。
- 不会出现组件被扣掉但奖励未发、或耐久扣成负值这种半成功状态。
### P1-03 商店节点:购买 / 出售组件
- 核心目标:把当前“仅购买组件”的商店补成完整交易节点。
- 交付物:
- `Assets/GameMain/Scripts/UI/Shop/`
- `Assets/GameMain/Scripts/CustomComponent/ShopNodeComponent.cs`
- 必要时新增 `Assets/GameMain/Scripts/Utility/` 下的交易规则工具
- 具体拆分:
- Shop UI 增加玩家库存展示与出售入口,至少支持出售三类组件。
- 交易结算统一走一个买卖接口,不要在 UI 层分别修改金币和库存。
- 商品购买后状态、库存变化、金币变化要同时刷新,不允许 UI 还显示可买但实际已买。
- 明确商店节点退出条件与节点完成时机,避免出现开店即完成或出售后不回流的问题。
- 验收补充:
- 买卖后库存与金币实时正确更新。
- 关闭商店后重新打开同一节点时,商品状态与本节点交易结果一致。
### P1-04 商店定价规则:买价、半价回收、卖塔 +10%、耐久折价
- 核心目标:把价格从“按品质随机区间”升级为可解释、可测试的公式。
- 交付物:
- `Assets/GameMain/Scripts/Utility/`
- `Assets/GameMain/Scripts/Entity/` 或库存相关域对象
- 视需要调整 `Assets/GameMain/DataTables/ShopPrice.txt`
- 具体拆分:
- 抽出统一价格解析入口:基础买价、出售价、塔出售加成、耐久折价都走同一公式服务。
- 明确“组件价格”和“整塔价格”关系,不能在 UI 里临时把三组件价格相加后再乘一个魔法数。
- 明确耐久折价规则:按当前耐久比例折价,还是按损坏阈值分段折价;先写死规则文档,再落代码。
- 如果 `ShopPrice.txt` 只够表达品质区间,新增字段或新表承载倍率,不要继续在代码里硬编码。
- 验收补充:
- 买价、回收半价、卖塔 +10%、耐久折价都可通过测试直接验证。
- 同类物品在同一规则下价格可解释,不出现随机漂移。
### P1-05 道具系统(影响初始金币、掉金倍率等)
- 核心目标:引入 run 内长期生效的被动效果,支撑中期构筑深度。
- 交付物:
- `Assets/GameMain/Scripts/Entity/`
- `Assets/GameMain/DataTables/*.txt`
- `Assets/GameMain/Scripts/Procedure/ProcedureMain/`
- 具体拆分:
- 先定义“道具”最小模型:唯一 Id、名称、描述、叠加规则、效果列表。
- 道具效果统一挂在 run 状态,不要把“初始金币加成”写进开局逻辑、“掉金倍率”写进敌人掉落逻辑、“商店折扣”又写进商店 UI。
- 第一批只做能复用现有链路的效果:初始金币、掉金倍率、商店折扣、额外奖励候选、事件收益倍率。
- 明确获取来源:先只接战斗奖励或事件奖励,暂不同时开启商店售卖与局外解锁。
- 验收补充:
- 至少 5 个道具可叠加生效。
- 多个道具同时存在时,叠加顺序和公式固定且可测试。
### P1-06 战斗后“继续挑战”机制(高强度高爆率)
- 核心目标:把当前战斗结算从单向结束改成“收手 / 继续”的风险收益选择。
- 交付物:
- `Assets/GameMain/Scripts/Procedure/`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/`
- 需要时补 `Assets/GameMain/Scripts/UI/Combat/` 或现有结算 UI
- 具体拆分:
- 战斗胜利后新增继续挑战分支,不改变失败结算语义。
- 给 run 增加当前节点继续挑战层数,并把它传入敌人强度和掉落倍率计算。
- 强度提升与爆率提升必须都走显式公式,且支持按层数递增。
- 继续挑战退出时,节点奖励如何结算、是否覆盖原奖励、是否保底,需要在实现前先写清楚。
- 验收补充:
- 选择继续后敌人强度明显提升且爆率提升。
- 连续多次继续时,奖励和风险曲线都可感知,不出现“白打”。
### P1-07 火山主题规则(高温、岩浆格、抗火敌人)
- 核心目标:做出第一个真实改变战斗结果的主题规则,而不是只换关卡皮肤。
- 交付物:
- `Assets/GameMain/Scripts/Scene/`
- `Assets/GameMain/Scripts/Entity/`
- 必要时新增主题规则配置表
- 具体拆分:
- 先抽主题战斗规则入口,统一在战斗调度或关卡运行时挂载主题效果。
- 高温规则先定义为全局环境修正;岩浆格是地图局部修正;敌人抗火是单位侧修正,三者不要混成一个大脚本。
- 岩浆格必须有清晰表现和可命中逻辑,不能只有视觉特效。
- 与现有 Tag / 属性体系冲突处优先显式列出,不在第一版做复杂联动。
- 验收补充:
- 岩浆效果可视,且确实会改变塔或敌人的战斗结果。
### P1-08 山地主题规则(高度、悬崖、位移致死)
- 核心目标:做出第二个与火山玩法差异明显的主题。
- 交付物:
- `Assets/GameMain/Scripts/Scene/`
- `Assets/GameMain/Scripts/Entity/`
- 必要时新增高度或地形标记配置
- 具体拆分:
- 为地图格子补高度/悬崖属性,而不是把高度写死在某一张图脚本里。
- 塔攻击高打低、低打高的距离或命中修正单独实现,避免和基础攻击范围直接耦死。
- 敌人上下坡移速修正与悬崖击退致死分开结算,便于后续加其他位移效果。
- 先支持对现有敌人和击退能力最小接入,不追求一次做完整地形系统。
- 验收补充:
- 高低地形会影响攻防与移速。
- 悬崖击退击杀能真实生效并参与结算。
### P1-09 主题地图掉落偏好(按主题偏置组件)
- 核心目标:让主题不只影响战斗规则,也影响构筑倾向。
- 交付物:
- `Assets/GameMain/DataTables/*.txt`
- `Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/`
- 具体拆分:
- 在现有 `OutGameDropPool` 或新增偏置表中表达主题掉落权重,不要把火山/山地偏置硬编码在掉落代码里。
- 主题偏置只影响权重,不直接写死掉落结果,保留随机性。
- 明确偏置作用对象组件槽位、品质、Tag、或其组合第一版建议先偏置组件/Tag。
- 验收补充:
- 不同主题统计掉落分布显著不同。
- 偏置结果与 `P1-07 / P1-08` 的主题反制方向一致。
### P1-10 大关完成后可选下一主题地图
- 核心目标:把当前“固定单主题 10 节点 run”扩成“按大关推进并选择下个主题”。
- 交付物:
- `Assets/GameMain/Scripts/Procedure/`
- `Assets/GameMain/Scripts/UI/Templates/GameScene/` 或现有节点地图相关 UI
- 具体拆分:
- 先定义“大关”与“节点序列”的关系:是每个大关 10 节点,还是一个 run 内包含多个主题段。
- Run 流程需要新增“主题选择阶段”,不能继续只靠 `CurrentNodeIndex++` 线性推进。
- 主题选择 UI 至少展示 2 个候选主题、主题效果摘要、预期掉落倾向。
- 选择后要能重建后续节点池、关卡池和掉落偏置,而不是只改一个 `ThemeType` 字段。
- 验收补充:
- 通关后至少可在 2 个主题间选择。
- 主题选择会真实影响后续关卡、掉落和规则。
## 推荐分批提交
### 批次 1事件系统收口
- `A1` 中与事件相关的状态补充
- `P1-01`
- `P1-02`
### 批次 2商店系统收口
- `P1-03`
- `P1-04`
### 批次 3run 深度状态
- `P1-05`
- `P1-06`
### 批次 4主题玩法底座与内容
- 主题规则统一入口
- `P1-07`
- `P1-08`
- `P1-09`
### 批次 5多主题推进
- `P1-10`
## 当前建议的第一开工项
1. 立刻收口 `P1-01`,把 `EventFormUseCase.SelectOption()` 从占位实现改成正式结算。
2. 基于 A2 里已经补好的事件定义测试入口,新增事件执行链路测试,覆盖 requirement、cost、probability、reward 和完成快照回写。
3.`P1-02` 的三个示例事件验证执行器能力,再扩表到 10 个事件。
4. 之后再进入商店买卖与定价,不建议现在同时并行推进主题地图。