15 KiB
15 KiB
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私有字段,而是通过:CombatSchedulerRuntimeContextCombatSchedulerFlowCoordinator
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatStateBase.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/*.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.cs
2. 第一轮目标命名、骨架与接线已建立
CombatResourceManager已重命名为CombatInRunResourceManager。- 已新增掉落解析骨架:
EnemyDropResolveContextEnemyDropResolveResultEnemyDropResolver
- 已新增 phase end 骨架并接入等待退出状态:
IPhaseEndConditionPhaseEndConditionContextPhaseEndConditionFactoryNonePhaseEndConditionTimeElapsedPhaseEndConditionEnemiesClearedPhaseEndConditionBossDeadPhaseEndCondition
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDropResolver.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/PhaseEndConditions/
3. 局内资源真值已迁到 CombatInRunResourceManager
目前 CombatInRunResourceManager 已经接管:
CurrentCoinCurrentBaseHpMaxBaseHpGainedCoinGainedGold- 本局
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增加了DeltaCoinCombatBaseHpChangedEventArgs增加了DeltaBaseHp- coin/baseHp 变化事件现在由
CombatInRunResourceManager发布,而不是CombatNodeComponent Reset()现在会清理ParticipantTowerInstanceIds
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.csAssets/GameMain/Scripts/Event/Combat/CombatCoinChangedEventArgs.csAssets/GameMain/Scripts/Event/Combat/CombatBaseHpChangedEventArgs.cs
4. CombatScheduler / CombatNodeComponent 已做一轮收口
CombatScheduler
- 启动时会先初始化
CombatInRunResourceManager - 提供资源转发属性:
CurrentCoinCurrentGoldCurrentBaseHpCurrentBuildTowerCount
- 提供资源转发方法:
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.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerRuntimeContext.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.csAssets/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.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDropResolver.csAssets/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.csAssets/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.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatFailedState.csAssets/GameMain/Scripts/Event/Combat/CombatFailureReturnEventArgs.csAssets/GameMain/Scripts/Procedure/ProcedureMenu.cs
8. CombatSettlementContext 已收紧为结束链共享上下文
- 当前由
Settlement -> RewardSelection -> FinishForm -> WaitingForReturn共享 - 已显式承载:
- 结算事实
- 奖励背包
- 奖励选择相关流程标记
- 低血惩罚相关事实
- 低血惩罚已改为“先记录事实,提交阶段再统一落库”,不再在结算构造期直接写库存
CombatFinishForm当前只消费它真正展示需要的摘要,不再把额外结算事实继续灌进 UI Context
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementContext.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementFlowService.csAssets/GameMain/Scripts/UI/Combat/UseCase/CombatFinishFormUseCase.cs
9. CombatInfoForm 已补手动失败测试入口
CombatInfoForm.OnFailButtonClick()可手动触发异常失败链- 新增
CombatDebugFailEventArgs - 当前可直接用于测试:
CombatFailedState- 失败 Dialog
CombatFailureReturnEventArgs
关键文件:
Assets/GameMain/Scripts/UI/Combat/View/CombatInfoForm.csAssets/GameMain/Scripts/UI/Combat/Controller/CombatInfoFormController.csAssets/GameMain/Scripts/UI/Combat/UseCase/CombatInfoFormUseCase.csAssets/GameMain/Scripts/Event/Combat/CombatDebugFailEventArgs.cs
10. MapData + Event 解耦已完成一轮收口
MapData已收口为纯初始化快照,不再承载 coin 写接口委托- 已新增
MapEntityLoadContext- 用于把
MapData快照与 coin 命令通道拆开传给地图加载
- 用于把
CombatLoadingState现在会组装:MapDataMapEntityLoadContext
CombatLoadSession/EntityExtension.ShowMap(...)已切到MapEntityLoadContextMapEntity当前通过:MapEntityLoadContext获取初始快照与 coin 命令通道CombatCoinChangedEventArgs同步后续 coin 变化
- 已新增
MapCombatRuntimeBridge- 收口地图侧 coin 当前值、命令调用与事件订阅
MapEntity不再自己维护_currentCoin和 coin 事件订阅样板
当前结论:
- 地图侧已经完成“
MapData初始快照 + Event 同步 + 独立命令桥接”的接线 - 当前未发现
MapEntity/ 地图侧服务对CombatNodeComponent或CombatScheduler的运行时反查
关键文件:
Assets/GameMain/Scripts/Entity/EntityData/MapData.csAssets/GameMain/Scripts/Entity/EntityData/MapEntityLoadContext.csAssets/GameMain/Scripts/Scene/Map/MapCombatRuntimeBridge.csAssets/GameMain/Scripts/Entity/EntityLogic/MapEntity.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatLoadingState.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatLoadSession.csAssets/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.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSchedulerFlowCoordinator.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatLoadSession.csAssets/GameMain/Scripts/UI/Combat/UseCase/CombatFinishFormUseCase.cs
12. CombatSettlementContext 已拆成 Flow / Result / Summary 分层
CombatSettlementContext当前明确区分:FlowResultSummary
- 流程控制字段现在集中在
Flow - 结算事实与惩罚事实现在集中在
Result CombatFinishFormUseCase当前只消费Summary- 奖励选择与延迟提交惩罚已同步切到分层后的上下文访问路径
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementContext.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementFlowService.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/CombatSettlementState.csAssets/GameMain/Scripts/UI/Combat/UseCase/CombatFinishFormUseCase.cs
还没完成
1. 需要补实际运行验证
当前改动已覆盖:
- 状态机结构
- 结束链/失败链协议
- 手动失败测试入口
CombatSchedulerRuntimeContext + CombatSchedulerFlowCoordinator + ICombatSchedulerHostCombatSettlementContext分层与延迟提交惩罚MapData + Event + MapCombatRuntimeBridge
但仍缺:
- Unity 编译验证
- PlayMode/手点验证
- 失败路径回收验证
- 新开局后无残留状态验证
推荐的后续执行顺序
- 补 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相关文件即可,不要顺手回滚无关改动。