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

300 lines
13 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 TODO
最后更新2026-03-07
## 当前目标
`docs/CombatNodeArchitecture.md` 继续收敛 `CombatNode` 域职责。当前骨架已经基本到位,后续重点是:
- 继续保持 `CombatScheduler` 作为唯一状态机边界,避免把新业务重新堆回本体。
- 继续完成 `MapData + Event` 解耦收尾,确认 `MapEntity` 不再反查 `CombatNode` 域运行时。
- 稳定 `CombatSettlementContext` 的模型边界,避免流程控制字段和展示摘要继续混杂增长。
- 补 Unity 编译、PlayMode 和失败路径回归验证,把这轮结构调整真正跑通。
## 已完成
### 1. 状态类已收口到 CombatScheduler/CombatStates
- 状态类当前位于 `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/`
- `CombatStateBase` 已统一改为 `Context + Flow` 双引用模式。
- 各状态不再直接访问 `CombatScheduler._xxx` 私有字段,而是通过:
- `CombatSchedulerRuntimeContext`
- `CombatSchedulerFlowCoordinator`
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatStateBase.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/*.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.cs`
### 2. 第一轮目标命名、骨架与接线已建立
- `CombatResourceManager` 已重命名为 `CombatInRunResourceManager`
- 已新增掉落解析骨架:
- `EnemyDropResolveContext`
- `EnemyDropResolveResult`
- `EnemyDropResolver`
- 已新增 phase end 骨架并接入等待退出状态:
- `IPhaseEndCondition`
- `PhaseEndConditionContext`
- `PhaseEndConditionFactory`
- `NonePhaseEndCondition`
- `TimeElapsedPhaseEndCondition`
- `EnemiesClearedPhaseEndCondition`
- `BossDeadPhaseEndCondition`
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDropResolver.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseEndConditions/`
### 3. 局内资源真值已迁到 CombatInRunResourceManager
目前 `CombatInRunResourceManager` 已经接管:
- `CurrentCoin`
- `CurrentBaseHp`
- `MaxBaseHp`
- `GainedCoin`
- `GainedGold`
- 本局 `BuildTowerStats` 快照
- 奖励背包快照
已实现的资源接口:
- `InitializeForCombat(DRLevel level)`
- `MarkCombatEnded()`
- `Reset()`
- `TryConsumeCoin(int coin)`
- `AddCoin(int coin)`
- `ApplyBaseDamage(int damage)`
- `TryGetBuildTowerStats(int buildIndex, out TowerStatsData stats)`
- `AddEnemyDefeatedReward(int gainedCoin, int gainedGold)`
- `AddSettlementGold(int gainedGold)`
- `GetRewardInventorySnapshot()`
附带完成:
- `CombatCoinChangedEventArgs` 增加了 `DeltaCoin`
- `CombatBaseHpChangedEventArgs` 增加了 `DeltaBaseHp`
- coin/baseHp 变化事件现在由 `CombatInRunResourceManager` 发布,而不是 `CombatNodeComponent`
- `Reset()` 现在会清理 `ParticipantTowerInstanceIds`
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.cs`
- `Assets/GameMain/Scripts/Event/Combat/CombatCoinChangedEventArgs.cs`
- `Assets/GameMain/Scripts/Event/Combat/CombatBaseHpChangedEventArgs.cs`
### 4. CombatScheduler / CombatNodeComponent 已做一轮收口
#### CombatScheduler
- 启动时会先初始化 `CombatInRunResourceManager`
- 提供资源转发属性:
- `CurrentCoin`
- `CurrentGold`
- `CurrentBaseHp`
- `CurrentBuildTowerCount`
- 提供资源转发方法:
- `TryConsumeCoin(...)`
- `AddCoin(...)`
- `TryGetBuildTowerStats(...)`
- 失败调试入口:
- `TryDebugFail(...)`
- 不再通过 `CombatNodeComponent` 读写 baseHp/coin 真值
- 当前主职责已收紧为:
- 生命周期入口
- 状态切换入口
- 对外公开查询/操作接口
- 敌人事件公共入口
- 事件桥回调入口
#### CombatScheduler 内部实现细化
- 已新增 `CombatSchedulerRuntimeContext`
- 承载共享运行时字段与共享服务引用
- 已新增 `CombatSchedulerFlowCoordinator`
- 承载多个状态共用的流程辅助方法
- 当前 `CombatScheduler` 本体不再直接堆所有共享字段和公用流程辅助
#### CombatNodeComponent
- 不再持有这些字段:
- `_currentCoin`
- `_currentGold`
- `_currentBaseHp`
- `_currentBuildTowerStats`
- 当前只保留:
- 关卡数据缓存
- `CurrentLevel / CurrentThemeType`
- 战斗启动/结束协调
- 最终结算摘要字段(`LastDefeatedEnemyCount / LastGainedCoin / LastGainedGold`
-`CombatScheduler` 的只读/操作转发
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs`
### 5. EnemyManager 事件边界已改为只上报敌人事实
- `EnemyManager` 现在只向 `CombatScheduler` 上报:
- `OnEnemyDefeated(DREnemy enemy)`
- `OnEnemyReachedBase(DREnemy enemy)`
- coin/gold/baseDamage 的公共副作用已统一收口到 `CombatScheduler`
- `EnemyDropResolver + CombatInRunResourceManager` 已接到公共敌人事件入口上
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDropResolver.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
### 6. PhaseEndCondition 已正式接入 WaitingForPhaseEnd
- `CombatWaitingForPhaseEndState` 已改为通过:
- `PhaseEndConditionFactory.Create(...)`
- `IPhaseEndCondition.ShouldExit(...)`
判定 phase 结束
- `PhaseLoopRuntime` 当前只保留 phase runtime 数据与 phase 进入逻辑,不再负责 `PhaseEndType` 判定
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatWaitingForPhaseEndState.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseEndConditions/`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseLoopRuntime.cs`
### 7. 结束链与异常失败链已做协议收口
- 正常结束:
- `NodeCompleteEventArgs` 只在 `WaitingForReturn` 完成后发布
- 异常失败:
- 使用 `CombatFailedState`
- 弹出单按钮 `DialogForm`
- 点击 `Return Menu` 后发布 `CombatFailureReturnEventArgs`
- `ProcedureMenu` 已区分正常结束与异常失败两条返回协议
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatWaitingForReturnState.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatFailedState.cs`
- `Assets/GameMain/Scripts/Event/Combat/CombatFailureReturnEventArgs.cs`
- `Assets/GameMain/Scripts/Procedure/ProcedureMenu.cs`
### 8. CombatSettlementContext 已收紧为结束链共享上下文
- 当前由 `Settlement -> RewardSelection -> FinishForm -> WaitingForReturn` 共享
- 已显式承载:
- 结算事实
- 奖励背包
- 奖励选择相关流程标记
- 低血惩罚相关事实
- 低血惩罚已改为“先记录事实,提交阶段再统一落库”,不再在结算构造期直接写库存
- `CombatFinishForm` 当前只消费它真正展示需要的摘要,不再把额外结算事实继续灌进 UI Context
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementContext.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementFlowService.cs`
- `Assets/GameMain/Scripts/UI/Combat/UseCase/CombatFinishFormUseCase.cs`
### 9. CombatInfoForm 已补手动失败测试入口
- `CombatInfoForm.OnFailButtonClick()` 可手动触发异常失败链
- 新增 `CombatDebugFailEventArgs`
- 当前可直接用于测试:
- `CombatFailedState`
- 失败 Dialog
- `CombatFailureReturnEventArgs`
关键文件:
- `Assets/GameMain/Scripts/UI/Combat/View/CombatInfoForm.cs`
- `Assets/GameMain/Scripts/UI/Combat/Controller/CombatInfoFormController.cs`
- `Assets/GameMain/Scripts/UI/Combat/UseCase/CombatInfoFormUseCase.cs`
- `Assets/GameMain/Scripts/Event/Combat/CombatDebugFailEventArgs.cs`
## 还没完成
### 1. MapData + Event 解耦还没完全收口
当前:
- `CombatLoadingState` 已经会组装更完整的 `MapData`
- `MapEntity` 已经主要从 `MapData` 取初始上下文
- 但还需要继续确认地图侧事件和运行时依赖是否已经完全摆脱对 `CombatNode` 域的反查
目标状态:
- `CombatLoadingState``CombatInRunResourceManager` 读取快照
- `CombatLoadingState` 组装更完整的 `MapData`
- `MapEntity` 后续通过 `MapData + Event` 获取上下文,而不是反查 `CombatNode`
### 2. CombatScheduler 本体仍然还有收紧空间
当前:
- 生命周期入口、状态切换入口、对外公开接口、事件桥回调入口仍在 `CombatScheduler.cs`
- 共享字段和共享流程已经拆到了 `RuntimeContext + FlowCoordinator`
-`FlowCoordinator` 目前仍直接依赖 `CombatScheduler` 宿主对象
目标状态:
- 对外公开接口与内部宿主职责进一步分离
- 若继续收紧,可评估是否引入极小宿主接口,只暴露:
- `ChangeState(...)`
- 必要的回调/转发入口
- 继续避免把新业务重新塞回 `CombatScheduler.cs`
### 3. CombatSettlementContext 还可以继续整理字段分层
当前:
- `CombatSettlementContext` 已能支撑结束链
- 但字段仍是平铺增长
目标状态:
- 更明确地区分:
- 流程控制字段
- 结算事实字段
- 展示摘要字段
- 避免后续继续把 UI 需求和流程控制混在一起
### 4. 需要补实际运行验证
当前改动已覆盖:
- 状态机结构
- 结束链/失败链协议
- 手动失败测试入口
- `CombatSchedulerRuntimeContext + CombatSchedulerFlowCoordinator`
- `CombatSettlementContext` 与延迟提交惩罚
但仍缺:
- Unity 编译验证
- PlayMode/手点验证
- 失败路径回收验证
- 新开局后无残留状态验证
## 推荐的后续执行顺序
1.`MapData + Event` 解耦收尾,排查 `MapEntity` 和地图侧事件是否还反查 `CombatNode`
2. 评估是否给 `FlowCoordinator` 引入极小宿主接口,继续收紧 `CombatScheduler` 本体
3. 继续整理 `CombatSettlementContext` 的字段分层
4. 补 Unity 编译与手动回归验证
## 当前做变更时要记住的约束
- 状态切换只能通过 `CombatScheduler.ChangeState(...)`
- 不要把新业务继续堆回 `CombatScheduler.cs`,优先考虑:
- 状态私有逻辑
- `CombatSchedulerFlowCoordinator`
- 现有独立服务
- `CombatNodeComponent` 现在应该保持轻量 facade不要再把 coin/baseHp/build snapshot 回流到它
- coin/baseHp 变化事件应继续由 `CombatInRunResourceManager` 发布
- `Failed` 只处理异常失败,不处理“基地血量归零”的正常失败路径
- 状态类应继续只通过 `CombatSchedulerRuntimeContext + CombatSchedulerFlowCoordinator` 访问共享状态与共享流程
## 当前关键入口文件速查
- 状态机宿主:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
- 共享运行时承载:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.cs`
- 共享流程协调:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.cs`
- 局内资源真值:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.cs`
- 状态类:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/`
- 加载服务:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatLoadSession.cs`
- phase runtime
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseLoopRuntime.cs`
- phase end 条件骨架:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseEndConditions/`
- 敌人域 facade
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/EnemyManager/EnemyManager.cs`
- CombatNode 入口 facade
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs`
- 结束链共享上下文:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementContext.cs`
- 异常失败返回事件:
- `Assets/GameMain/Scripts/Event/Combat/CombatFailureReturnEventArgs.cs`
## 备注
- 当前环境没有可用的本地 C# 编译器(`dotnet / mcs / csc / msbuild / xbuild` 都不可用),所以本轮改动主要依赖文本级检查。
- 仓库目前有一些与本任务无关的脏文件,继续改动时只聚焦 `CombatNode` 相关文件即可,不要顺手回滚无关改动。