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

9.9 KiB
Raw Blame History

CodeX TODO

最后更新2026-03-13

目标:把当前“随机组件产出 / 掉落 / 商店 / 3 选 1 奖励候选 / Tag 初始化入口”从分散实现收口成清晰模块。 原则:先收运行时入口,再收重复领域逻辑,最后收 UI 编排;不把纯规则层误做成 GameFrameworkComponent

这次重构要解决的问题

  • 商店、敌人掉落、满血 3 选 1 候选都在各自生成组件实例,逻辑分散,后续改规则要改多处。
  • ShopFormUseCase、旧 EnemyDropResolverCombatSettlementService 都曾同时承担“流程 + 规则 + 数据组装”的混合职责。
  • runSeed 目前只稳定了 Tag 生成,没有稳定整个组件产出流程。
  • Tag 模块本身已经分成 Generation / Aggregation / Combat / Metadata / Presentation,但初始化入口还散在流程代码里。

重构边界

适合抽成 GameFrameworkComponent 的模块

  1. InventoryGenerationComponent

    • 统一作为运行时“组件产出入口”。
    • 对外提供:
    • BuildShopGoods(...)
    • ResolveEnemyDrop(...)
    • BuildRewardCandidates(...)
    • 统一持有并传递 runSeedsequenceIndex、随机上下文。
  2. TagRegistryComponent

    • 统一作为 Tag 规则注册与重载入口。
    • 负责刷新:
    • TagDefinitionRegistry
    • TagGenerationRuleRegistry
    • RarityTagBudgetRuleRegistry
    • 替代当前散在 ProcedurePreload 里的 Tag 注册表装载逻辑。

不适合抽成 GameFrameworkComponent 的模块

  • ComponentTagGenerationService
  • TowerTagAggregationService
  • TagEffectResolver
  • NumericTagEffectHandler
  • AttackShapeTagEffectHandler
  • EnemyStatusTagRegistry

这些都保留为普通领域模块,因为它们本质上是规则计算、数据聚合或战斗解析,不需要全局生命周期。

目标模块结构

组件层

  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/InventoryGenerationComponent.cs
  • Assets/GameMain/Scripts/CustomComponent/TagRegistry/TagRegistryComponent.cs

领域模块层

  • Assets/GameMain/Scripts/Factory/ComponentItemFactory.cs
    • 唯一负责“从配置行构造 TowerCompItemData”。
  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/ShopGoodsBuilder.cs
    • 只负责商店货物生成。
  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/DropPoolRoller.cs
    • 只负责掉落池筛选、权重抽样、稀有度曲线。
  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/RewardCandidateBuilder.cs
    • 只负责 3 选 1 奖励候选生成。
  • Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatSettlementCalculator.cs
    • 只负责结算计算。
  • Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatSettlementCommitter.cs
    • 只负责把结算结果提交到玩家库存。

现有职责迁移目标

商店链路

  • ShopNodeComponent
    • 保留“节点进入 / 退出 / 发事件 / 打开 UI”职责。
  • ShopFormUseCase
    • 删除组件随机生成职责。
    • 保留“当前货物模型、购买行为、UI RawData 组装”职责。
  • 商店货物来源统一改为 GameEntry.InventoryGeneration.BuildShopGoods(...)

战斗掉落链路

  • CombatScheduler
    • 不再直接持有复杂掉落生成细节。
    • 只在敌人死亡时调用 GameEntry.InventoryGeneration.ResolveEnemyDrop(...)
  • EnemyDropResolver
    • 已从主链路移除,并已删除旧实现文件。
    • 其职责已拆给:
    • DropPoolRoller
    • ComponentItemFactory
    • RewardCandidateBuilder

战斗结算链路

  • CombatSettlementService
    • 从混合类拆成薄流程壳。
    • 保留最少流程编排。
    • 计算逻辑迁到 CombatSettlementCalculator
    • 库存提交逻辑迁到 CombatSettlementCommitter
    • 奖励候选生成改为调用 GameEntry.InventoryGeneration.BuildRewardCandidates(...)

Tag 初始化链路

  • ProcedurePreload
    • 移除 Tag 注册表刷新细节。
    • 只保留“数据表加载完成后通知组件刷新”。
  • TagRegistryComponent
    • 成为 Tag 相关表与注册表的唯一运行时入口。

分阶段执行

阶段 G1 - 收口组件产出入口

状态 ID 任务 目标
[x] G1-01 新增 InventoryGenerationComponent 建立统一组件产出入口
[x] G1-02 新增 ComponentItemFactory 收口组件实例构造
[x] G1-03 新增 ShopGoodsBuilder 收口商店货物生成
[x] G1-04 ShopFormUseCase 改用组件入口 商店不再自己生成组件

G1 验收标准

  • 商店仍可正常打开、购买、加背包。
  • 商店不再直接读取组件表并构造 Muzzle/Bearing/Base 实例。
  • 商店所有组件实例都通过同一工厂生成。

阶段 G2 - 收口战斗掉落与奖励候选

状态 ID 任务 目标
[x] G2-01 新增 DropPoolRoller 收口掉落池与稀有度抽样
[x] G2-02 新增 RewardCandidateBuilder 收口 3 选 1 候选生成
[x] G2-03 让战斗掉落改走 InventoryGenerationComponent 战斗不再自己构造组件
[x] G2-04 让满血奖励候选改走统一入口 掉落与奖励候选共用产出体系

G2 验收标准

  • 敌人死亡后仍能正常掉 coin、gold、组件。
  • 满血奖励 3 选 1 仍能正常打开并选择。
  • 掉落与奖励候选不再重复维护组件实例构造逻辑。
  • CombatSchedulerCombatSettlementService 已改为统一调用 GameEntry.InventoryGeneration

阶段 G3 - 收口结算模块边界

状态 ID 任务 目标
[x] G3-01 新增 CombatSettlementCalculator 只保留结算计算
[x] G3-02 新增 CombatSettlementCommitter 只保留库存提交
[x] G3-03 精简 CombatSettlementService 只剩流程编排
[x] G3-04 清理奖励 RawData 重复映射 候选生成与 UI 组装边界清晰

G3 验收标准

  • 战斗结算金币、奖励库存、耐久扣减结果保持不变。
  • 满血奖励选择后仍能正确并包。
  • CombatSettlementService 不再同时承担计算、提交、候选生成三类职责。

阶段 G4 - 收口 Tag 初始化入口

状态 ID 任务 目标
[ ] G4-01 新增 TagRegistryComponent 建立 Tag 运行时入口
[ ] G4-02 挪出 ProcedurePreload 中 Tag 注册逻辑 流程代码不再直接维护 Tag 注册表
[ ] G4-03 对齐 Tag 加载时机与重载入口 初始化路径明确

G4 验收标准

  • Tag.txtTagConfig.txtRarityTagBudget.txt 加载后仍能正确刷新运行时。
  • Tag 展示、Tag 生成、Tag 战斗效果不受影响。
  • Tag 相关运行时入口不再散落在预加载流程里。

阶段 G5 - 收口随机合同

状态 ID 任务 目标
[ ] G5-01 统一商店 / 掉落 / 奖励候选的随机上下文 全部产出链路使用一致合同
[ ] G5-02 补齐整体产出的 runSeed 稳定性 不只稳定 Tag也稳定物品产出
[ ] G5-03 增加对应 EditMode 测试 同 Run 可复现,跨 Run 可区分

G5 验收标准

  • 同一 runSeed + sequenceIndex 下,商店货物、掉落候选、奖励候选可复现。
  • 不同 runSeed 下,产出结果可区分。
  • 不再出现“Tag 稳定但物品本体不稳定”的混合口径。

具体迁移清单

第一批直接改动文件

  • Assets/GameMain/Scripts/UI/Shop/UseCase/ShopFormUseCase.cs
  • Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementService.cs
  • Assets/GameMain/Scripts/Procedure/Base/ProcedurePreload.cs
  • Assets/GameMain/Scripts/Base/GameEntry.Custom.cs
  • Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.cs

第二批新增文件

  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/InventoryGenerationComponent.cs
  • Assets/GameMain/Scripts/CustomComponent/TagRegistry/TagRegistryComponent.cs
  • Assets/GameMain/Scripts/Factory/ComponentItemFactory.cs
  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/ShopGoodsBuilder.cs
  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/DropPoolRoller.cs
  • Assets/GameMain/Scripts/CustomComponent/InventoryGeneration/RewardCandidateBuilder.cs
  • Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatSettlementCalculator.cs
  • Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatSettlementCommitter.cs

本次重构的限制

  • 不在这一轮扩展新的 Tag 功能。
  • 不在这一轮扩展新的商店玩法或新的奖励 UI 形态。
  • 不为了“统一”而把所有领域逻辑都塞进 GameFrameworkComponent
  • 不改动现有 UI 五层结构以外的职责边界。

当前推荐执行顺序

  1. 先做 InventoryGenerationComponent + ComponentItemFactory
  2. 先替换商店货物生成。
  3. 再替换战斗掉落与奖励候选生成。
  4. 再拆战斗结算计算与提交。
  5. 最后收 TagRegistryComponentProcedurePreload 的 Tag 初始化入口。

通过标准

  • 组件实例生成入口只保留一套。
  • 掉落、商店、奖励候选不再各自维护相似逻辑。
  • Tag 模块保留现有分层,不再继续和流程代码缠在一起。
  • GameFrameworkComponent 只承接运行时入口,不承接纯规则实现。