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

202 lines
7.9 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` 收敛为“状态机管理器”,不再继续堆业务细节。
- 局内 `Coin / Gold / BaseHp / Loot Backpack / BuildTowerSnapshots``CombatInRunResourceManager` 作为唯一真值来源。
- `EnemyManager` 只上报敌人事件,不直接决定资源入账或状态切换。
- `PhaseEndType` 退出条件从 `PhaseLoopRuntime` 中抽离到 `IPhaseEndCondition` 实现类。
- 结束链、加载链、奖励选择链逐步从 `CombatScheduler.cs` 本体挪到状态类或专用服务。
## 已完成
### 1. 状态类拆分完成
- `CombatScheduler.cs` 内部的嵌套状态类已经迁移到 `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatStates/`
- 保留了 `partial class CombatScheduler + 嵌套类` 的结构。
-`CombatState` 已统一替换为 `CombatStateBase`
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatStates/CombatStateBase.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatStates/*.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(...)`
- 不再通过 `CombatNodeComponent` 读写 baseHp/coin 真值
#### CombatNodeComponent
- 不再持有这些字段:
- `_currentCoin`
- `_currentGold`
- `_currentBaseHp`
- `_currentBuildTowerStats`
- 当前只保留:
- 关卡数据缓存
- `CurrentLevel / CurrentThemeType`
- 战斗启动/结束协调
- 最终结算摘要字段(`LastDefeatedEnemyCount / LastGainedCoin / LastGainedGold`
-`CombatScheduler` 的只读/操作转发
关键文件:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs`
## 还没完成
### 1. EnemyManager 事件边界还没改干净
当前仍然存在的问题:
- `EnemyManager` 还在自己计算 `droppedCoin / droppedGold / baseDamage`
- 然后把这些原始数值直接传给 `CombatScheduler`
目标状态:
- `EnemyManager` 只上报:
- `OnEnemyDefeated(DREnemy enemy)`
- `OnEnemyReachedBase(DREnemy enemy)`
- `CombatScheduler` 统一调用:
- `EnemyDropResolver`
- `CombatInRunResourceManager`
下一步建议:
- 先改 `EnemyManager` 上报签名
- 再把 coin/gold/baseDamage 的公共副作用挪到 `CombatScheduler`
### 2. PhaseEndCondition 骨架已建,但还没接入
当前仍然是旧逻辑:
- `PhaseLoopRuntime.ShouldEndCurrentPhase(...)` 还在使用
- `CombatWaitingForPhaseEndState` 还没有改成通过 `IPhaseEndCondition` 判定
目标状态:
- `PhaseLoopRuntime` 只保留 phase runtime 数据
- `CombatWaitingForPhaseEndState` 通过 `PhaseEndConditionFactory.Create(...)` 获取当前判定器
- `PhaseEndType` 的规则不再写在 `PhaseLoopRuntime`
### 3. CombatScheduler 本体仍然过重
当前仍然还在 `CombatScheduler.cs` 里的业务:
- 结算上下文构建
- 基地血量结算修正
- 奖励选择 UI 准备
- FinishForm 打开逻辑
- 一部分加载和清理编排
目标状态:
- `Loading` 负责加载和 `MapData` 组装
- `Settlement` 负责结算上下文和奖励准入判断
- `RewardSelection` 只处理选择流程
- `FinishForm` 只处理展示
- `WaitingForReturn` 只处理回退和最终清理
### 4. MapData + Event 解耦还没开始
当前:
- `MapData` 只有 `LevelId`
- `MapEntity` 仍通过 `GameEntry.CombatNode` 反查 coin / build stats
目标状态:
- `CombatLoadingState``CombatInRunResourceManager` 读取快照
- `CombatLoadingState` 组装更完整的 `MapData`
- `MapEntity` 后续通过 `MapData + Event` 获取上下文,而不是反查 `CombatNode`
## 推荐的后续执行顺序
1.`EnemyManager` 上报边界,接入 `EnemyDropResolver`
2. 接入 `IPhaseEndCondition`,移除 `PhaseLoopRuntime.ShouldEndCurrentPhase(...)`
3. 把结算链逻辑从 `CombatScheduler.cs` 继续剥离到状态类
4. 开始做 `MapData + Event` 解耦
## 当前做变更时要记住的约束
- 状态切换只能通过 `CombatScheduler.ChangeState(...)`
- 不要把新业务继续堆回 `CombatScheduler.cs`
- `CombatNodeComponent` 现在应该保持轻量 facade不要再把 coin/baseHp/build snapshot 回流到它
- coin/baseHp 变化事件应继续由 `CombatInRunResourceManager` 发布
- `Failed` 只处理异常失败,不处理“基地血量归零”的正常失败路径
## 当前关键入口文件速查
- 状态机宿主:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs`
- 局内资源真值:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatInRunResourceManager.cs`
- 状态类:
- `Assets/GameMain/Scripts/CustomComponent/CombatNode/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`
## 备注
- 当前环境没有可用的本地 C# 编译器(`dotnet / mcs / csc / msbuild / xbuild` 都不可用),所以本轮改动主要依赖文本级检查。
- 仓库目前有一些与本任务无关的脏文件,继续改动时只聚焦 `CombatNode` 相关文件即可,不要顺手回滚无关改动。