324 lines
15 KiB
Markdown
324 lines
15 KiB
Markdown
# 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`
|
||
|
||
### 10. MapData + Event 解耦已完成一轮收口
|
||
- `MapData` 已收口为纯初始化快照,不再承载 coin 写接口委托
|
||
- 已新增 `MapEntityLoadContext`
|
||
- 用于把 `MapData` 快照与 coin 命令通道拆开传给地图加载
|
||
- `CombatLoadingState` 现在会组装:
|
||
- `MapData`
|
||
- `MapEntityLoadContext`
|
||
- `CombatLoadSession` / `EntityExtension.ShowMap(...)` 已切到 `MapEntityLoadContext`
|
||
- `MapEntity` 当前通过:
|
||
- `MapEntityLoadContext` 获取初始快照与 coin 命令通道
|
||
- `CombatCoinChangedEventArgs` 同步后续 coin 变化
|
||
- 已新增 `MapCombatRuntimeBridge`
|
||
- 收口地图侧 coin 当前值、命令调用与事件订阅
|
||
- `MapEntity` 不再自己维护 `_currentCoin` 和 coin 事件订阅样板
|
||
|
||
当前结论:
|
||
- 地图侧已经完成“`MapData` 初始快照 + Event 同步 + 独立命令桥接”的接线
|
||
- 当前未发现 `MapEntity` / 地图侧服务对 `CombatNodeComponent` 或 `CombatScheduler` 的运行时反查
|
||
|
||
关键文件:
|
||
- `Assets/GameMain/Scripts/Entity/EntityData/MapData.cs`
|
||
- `Assets/GameMain/Scripts/Entity/EntityData/MapEntityLoadContext.cs`
|
||
- `Assets/GameMain/Scripts/Scene/Map/MapCombatRuntimeBridge.cs`
|
||
- `Assets/GameMain/Scripts/Entity/EntityLogic/MapEntity.cs`
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatLoadingState.cs`
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatLoadSession.cs`
|
||
- `Assets/GameMain/Scripts/Entity/EntityExtension.cs`
|
||
|
||
### 11. FlowCoordinator 已切到极小宿主接口
|
||
- 已新增 `ICombatSchedulerHost`
|
||
- `CombatSchedulerFlowCoordinator` 不再直接依赖 `CombatScheduler` 具体类,而是只依赖:
|
||
- 状态切换入口
|
||
- coin 命令转发
|
||
- CombatInfo / FinishForm 所需的只读查询与回调
|
||
- `CombatLoadSession` 与 `CombatFinishFormUseCase` 也已切到 `ICombatSchedulerHost`
|
||
- 状态类当前通过 `Flow.ChangeState(...)` 和 `Flow` 上的轻量转发访问宿主,不再持有 `CombatScheduler` 具体类型引用
|
||
|
||
关键文件:
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/ICombatSchedulerHost.cs`
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.cs`
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatLoadSession.cs`
|
||
- `Assets/GameMain/Scripts/UI/Combat/UseCase/CombatFinishFormUseCase.cs`
|
||
|
||
### 12. CombatSettlementContext 已拆成 Flow / Result / Summary 分层
|
||
- `CombatSettlementContext` 当前明确区分:
|
||
- `Flow`
|
||
- `Result`
|
||
- `Summary`
|
||
- 流程控制字段现在集中在 `Flow`
|
||
- 结算事实与惩罚事实现在集中在 `Result`
|
||
- `CombatFinishFormUseCase` 当前只消费 `Summary`
|
||
- 奖励选择与延迟提交惩罚已同步切到分层后的上下文访问路径
|
||
|
||
关键文件:
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementContext.cs`
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementFlowService.cs`
|
||
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatSettlementState.cs`
|
||
- `Assets/GameMain/Scripts/UI/Combat/UseCase/CombatFinishFormUseCase.cs`
|
||
|
||
## 还没完成
|
||
|
||
### 1. 需要补实际运行验证
|
||
当前改动已覆盖:
|
||
- 状态机结构
|
||
- 结束链/失败链协议
|
||
- 手动失败测试入口
|
||
- `CombatSchedulerRuntimeContext + CombatSchedulerFlowCoordinator + ICombatSchedulerHost`
|
||
- `CombatSettlementContext` 分层与延迟提交惩罚
|
||
- `MapData + Event + MapCombatRuntimeBridge`
|
||
|
||
但仍缺:
|
||
- Unity 编译验证
|
||
- PlayMode/手点验证
|
||
- 失败路径回收验证
|
||
- 新开局后无残留状态验证
|
||
|
||
## 推荐的后续执行顺序
|
||
|
||
1. 补 Unity 编译与手动回归验证
|
||
2. 重点验证正常结束链、异常失败链、新开局无残留状态
|
||
3. 若验证中暴露边界问题,再继续做小步收口
|
||
|
||
## 当前做变更时要记住的约束
|
||
|
||
- 状态切换只能通过 `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` 相关文件即可,不要顺手回滚无关改动。
|