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

15 KiB
Raw Blame History

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 共享
  • 已显式承载:
    • 结算事实
    • 奖励背包
    • 奖励选择相关流程标记
    • 低血惩罚相关事实
  • 低血惩罚已改为“先记录事实,提交阶段再统一落库”,不再在结算构造期直接写库存
  • 结算背包合并当前发生在 WaitingForReturn 的真正退出点,而不是 FinishForm
  • 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 / 地图侧服务对 CombatNodeComponentCombatScheduler 的运行时反查

关键文件:

  • 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 所需的只读查询与回调
  • CombatLoadSessionCombatFinishFormUseCase 也已切到 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
  • 已去掉单独的结束原因字段,结束链不再依赖 CombatEndReason 风格数据
  • 奖励选择与延迟提交惩罚已同步切到分层后的上下文访问路径

关键文件:

  • 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 相关文件即可,不要顺手回滚无关改动。