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

7.9 KiB
Raw Blame History

CodeX TODO

最后更新2026-03-07

当前目标

docs/CombatNodeArchitecture.md 收敛 CombatNode 域职责,重点是:

  • CombatScheduler 收敛为“状态机管理器”,不再继续堆业务细节。
  • 局内 Coin / Gold / BaseHp / Loot Backpack / BuildTowerSnapshotsCombatInRunResourceManager 作为唯一真值来源。
  • 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

目标状态:

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