15 KiB
15 KiB
CodeX TODO
最后更新:2026-03-08
当前目标
按 docs/TODO.md 的 M1 目标推进最小可玩闭环,并以“能从开始游戏一路推进到 Boss 结算”为准检查当前实现。
和上一版相比,仓库已经把 Run 相关基础件进一步接到了 ProcedureMain,因此这份清单不再把重点放在“有没有 Run 模型”,而是聚焦下面这几个真实阻塞项:
- 已有
ProcedureMenu + MenuForm -> ProcedureMain + NodeMapForm的主入口链路,正式节点面板骨架已经接入流程。 - 固定 10 节点顺序已经开始驱动战斗 / 事件 / 商店入口,节点事件也已带上基础 Run 上下文字段。
- 出战入口已有“至少有参战塔”的最小校验,但还没收口成严格的最终合法性约束。
- 品质 / Tag / 耐久仍然停留在部分实现状态,尚未和 M1 范围完全对齐。
当前已完成
1. 战斗主链路已经能独立跑通一场
CombatNodeComponent能加载关卡、阶段、出怪表并启动CombatScheduler。CombatScheduler已具备加载地图、推进 phase、结算、失败返回等基础流程。- 战斗内已有基地血量、建塔消耗、敌人到家扣血、胜负结束等基础规则。
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatScheduler.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatStates/Assets/GameMain/Scripts/Entity/EntityLogic/MapEntity.cs
2. 战斗结算、掉落与奖励选择已有基础实现
- 敌人被击败后已能发放 coin / gold / 组件掉落。
CombatRunResourceStore维护局内资源与奖励背包快照。- 结算链已包含奖励计算、奖励选择 UI、FinishForm 返回等基础骨架。
关键文件:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatRunResourceStore.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDrop/EnemyDropResolver.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/CombatSettlementService.csAssets/GameMain/Scripts/UI/Combat/
3. 背包、参战区与组装基础能力已经存在
PlayerInventoryComponent已支持库存快照、金币读写、参战塔名单、组装塔入口。RepoForm已能展示组件、塔、参战区和组装区。CombineArea已有三槽约束,只有枪口 / 轴承 / 底座齐备时才会发起组合请求。PlayerInventoryTowerAssemblyService已能基于三组件生成TowerItemData和TowerStatsData。
关键文件:
Assets/GameMain/Scripts/CustomComponent/PlayerInventory/PlayerInventoryComponent.csAssets/GameMain/Scripts/CustomComponent/PlayerInventory/PlayerInventoryTowerAssemblyService.csAssets/GameMain/Scripts/UI/Game/View/RepoForm.csAssets/GameMain/Scripts/UI/Game/View/CombineArea.csAssets/GameMain/Scripts/UI/Game/Controller/RepoFormController.cs
4. 事件节点已有可进入、可结算的基础实现
EventNodeComponent能读取Event.txt,解析事件选项并随机打开事件。EventForm的打开 / 关闭现已统一走UIRouter,不再混用私有 controller。- 事件完成后会关闭 UI 并发出
NodeCompleteEventArgs。
关键文件:
Assets/GameMain/Scripts/CustomComponent/EventNodeComponent.csAssets/GameMain/Scripts/UI/Game/UseCase/EventFormUseCase.csAssets/GameMain/Scripts/UI/Game/Controller/EventFormController.cs
5. Run 模型和 10 节点固定序列已经落地到代码与测试
- 已有
RunNodeType / RunNodeStatus / RunState / RunNodeState等运行时模型。 - 已有
RunStateFactory和RunStateAdvanceService处理节点创建、推进、失败和完成。 - 已有
FixedRunNodeSequenceBuilder,Plain 主题下固定生成 10 节点,并且第 10 节点是BossCombat。 - 已有 Editor 测试覆盖
RunState创建、节点推进、Boss 节点和固定 10 节点序列。
关键文件:
Assets/GameMain/Scripts/Procedure/RunModel.csAssets/GameMain/Scripts/Procedure/RunStateFactory.csAssets/GameMain/Scripts/Procedure/RunStateAdvanceService.csAssets/GameMain/Scripts/Procedure/FixedRunNodeSequenceBuilder.csAssets/GameMain/Tests/Editor/RunStateTests.cs
6. 商店节点已经有最小可用实现
ShopNodeComponent.StartShop()已不再是空方法。- 新版
ShopFormUseCase已能随机生成 4 个组件商品。 - 已支持购买、扣金、把组件写回
PlayerInventory、退出商店。
关键文件:
Assets/GameMain/Scripts/CustomComponent/ShopNodeComponent.csAssets/GameMain/Scripts/UI/Shop/UseCase/ShopFormUseCase.csAssets/GameMain/Scripts/UI/Shop/Controller/ShopFormController.csAssets/GameMain/Scripts/UI/Shop/View/ShopForm.cs
7. NodeMapForm 五层 UI 已经接入主流程
- 已新增
NodeMapFormRawData / UseCase / Controller / Context / View和NodeItemContext / NodeItem。 ProcedureMain已不再打开TestMenuForm,而是打开NodeMapForm作为 Hub 节点入口。NodeMapFormController会把NodeItem点击转换为NodeMapNodeEnterRequestedEventArgs,再交给流程层决定是否进入节点。NodeItem的Icon已改成通过SpriteCacheComponent按资源名异步获取,Bg负责表示节点状态。
关键文件:
Assets/GameMain/Scripts/UI/Game/RawData/NodeMapFormRawData.csAssets/GameMain/Scripts/UI/Game/UseCase/NodeMapFormUseCase.csAssets/GameMain/Scripts/UI/Game/Controller/NodeMapFormController.csAssets/GameMain/Scripts/UI/Game/Context/NodeMapFormContext.csAssets/GameMain/Scripts/UI/Game/Context/NodeItemContext.csAssets/GameMain/Scripts/UI/Game/View/NodeMapForm.csAssets/GameMain/Scripts/UI/Game/View/NodeItem.csAssets/GameMain/Scripts/Event/Game/NodeMapNodeEnterRequestedEventArgs.cs
8. 菜单入口已切回独立 Menu 流程
ProcedureMenu当前只负责菜单入口,不再承载主流程 Hub 与节点推进逻辑。MenuForm已按五层结构补齐RawData / UseCase / Controller / Context / View。Start按钮现在会驱动ProcedureMenu切场景,并在主场景加载完成后进入ProcedureMain。Settings仍保留TODO占位,Exit会直接退出游戏。
关键文件:
Assets/GameMain/Scripts/Procedure/ProcedureMenu.csAssets/GameMain/Scripts/Procedure/Base/ProcedureChangeScene.csAssets/GameMain/Scripts/UI/Menu/Controller/MenuFormController.csAssets/GameMain/Scripts/UI/Menu/View/MenuForm.cs
当前未完成
1. Run 主流程已经形成基于 NodeMapForm 的临时闭环,但还没完全收口
ProcedureMain进入后会创建 Run,并打开MainForm + NodeMapForm。NodeMapForm已经有五层结构,NodeItem也能按当前RunState刷出 10 个节点。- 点击当前节点后,由
NodeMapFormController发出NodeMapNodeEnterRequestedEventArgs,再由ProcedureMain根据当前RunState.CurrentNode决定是否允许进入战斗 / 事件 / 商店。 - 节点完成或战斗失败后,
ProcedureMain会推进RunState,再重新打开 Hub UI。 - 因此当前已经不是“测试菜单三选一”,而是“节点地图单入口”的临时版本。
当前缺口:
NodeMapForm已接入,但当前仍偏 MVP 骨架,缺节点连线、节点说明、Boss 特效等正式表现。NodeMapFormContext当前只提供基础进度和当前节点信息,还没有更完整的地图展示上下文。- Run 完成后的正式结算 / 收尾表现仍未建立。
关键文件:
Assets/GameMain/Scripts/Procedure/ProcedureMain.csAssets/GameMain/Scripts/UI/Game/View/NodeMapForm.csAssets/GameMain/Scripts/UI/Game/Controller/NodeMapFormController.cs
2. 固定 10 节点序列已开始驱动真实流程,但正式上下文系统仍不完整
FixedRunNodeSequenceBuilder已定义固定顺序和 Boss 终点。ProcedureMain已开始用当前RunNodeState.LinkedLevelId驱动战斗入口。EventNodeComponent和ShopNodeComponent已能进入并完成当前节点。EventNodeComponent的 UI 生命周期也已统一走UIRouter。NodeEnter / NodeComplete已带runId / nodeId / nodeType / sequenceIndex等基础字段,NodeComplete也会回传成功状态与库存快照。- 当前缺的不是“有没有上下文字段”,而是更系统化的节点追踪、展示与统一收口能力。
关键文件:
Assets/GameMain/Scripts/Procedure/FixedRunNodeSequenceBuilder.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.csAssets/GameMain/Scripts/CustomComponent/EventNodeComponent.csAssets/GameMain/Scripts/CustomComponent/ShopNodeComponent.csAssets/GameMain/Scripts/Event/Game/NodeEnterEventArgs.csAssets/GameMain/Scripts/Event/Game/NodeCompleteEventArgs.cs
3. 商店节点已纳入临时 Run 推进闭环,但回流目标仍是 MVP Hub
- 现在可以单独打开商店、随机生成组件、购买并退出。
- 商店结束后已能通过
ProcedureMain推进当前RunState。 - 但退出后当前回流的是
MainForm + NodeMapForm的 MVP 节点面板,而不是完整表现版地图。
关键文件:
Assets/GameMain/Scripts/CustomComponent/ShopNodeComponent.csAssets/GameMain/Scripts/UI/Shop/UseCase/ShopFormUseCase.csAssets/GameMain/Scripts/Procedure/ProcedureMain.cs
4. 出战入口已有最小校验,但离最终验收还差一层
CombineArea已限制三槽必须齐备才能组塔。ProcedureMain已经补上“没有参战塔时禁止进入战斗节点”的最小校验。- 但这个校验目前仍是“有参战塔即可开战”,还不是“完整三组件合法塔”意义上的最终验收版本。
- 这意味着当前还不满足
P0-10里“未满足三组件时禁止出战”的验收要求。
关键文件:
Assets/GameMain/Scripts/UI/Game/View/CombineArea.csAssets/GameMain/Scripts/Procedure/ProcedureMain.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs
5. 品质 / 槽位 / Tag 规则仍只做了浅层版本
- 塔品质仍主要按三组件品质聚合得到。
TowerItemData中没有真正落地“配件槽位数量”之类的核心字段。- Tag 仍主要来自组件自身配置或简单并集,未看到完整概率、数量、等级规则落地。
DRTag已存在,但尚未形成明确的掉落 / 组装计算主链路。RarityType仍保留Red,与部分 M1 文档描述未完全对齐。
关键文件:
Assets/GameMain/Scripts/CustomComponent/PlayerInventory/PlayerInventoryTowerAssemblyService.csAssets/GameMain/Scripts/CustomComponent/CombatNode/CombatScheduler/EnemyDrop/EnemyDropResolver.csAssets/GameMain/Scripts/DataTable/DRTag.csAssets/GameMain/Scripts/Definition/DataStruct/TowerItemData.csAssets/GameMain/Scripts/Definition/Enum/RarityType.cs
6. 耐久仍停留在“展示 + 部分扣减”,没有形成真实生效闭环
- 当前组件耐久会显示在描述与 UI 上。
- 低血通关后已存在扣耐久逻辑。
- 但塔战斗属性是在组装时固化到
TowerStatsData,没有根据耐久实时衰减。 - 组件耐久归 0 后也没有稳定的销毁 / 拆塔 / 失效闭环。
- 因此
P0-12的完整验收还没有达成。
关键文件:
Assets/GameMain/Scripts/Utility/ItemDescUtility.csAssets/GameMain/Scripts/CustomComponent/PlayerInventory/PlayerInventoryTowerRosterService.csAssets/GameMain/Scripts/Definition/DataStruct/TowerItemData.csAssets/GameMain/Scripts/Definition/DataStruct/TowerCompItemData.cs
当前与 docs/TODO.md 的对照判断
结合静态代码检查,当前更接近下面这个状态:
P0-04:基础模型已完成,并已接入ProcedureMain + NodeMapForm的临时 Run 闭环。P0-05:固定 10 节点序列已由 builder +ProcedureMain + NodeMapForm驱动实际流程,基础事件上下文字段已接入,但缺更完整的地图表现层与正式上下文系统。P0-06:节点进入、完成、失败后回NodeMapForm的临时闭环已存在,但正式地图表现与正式结算仍未完成。P0-10:未完成。P0-11:未完成。P0-12:未完成。
换句话说,仓库已经不再是“还没有 Run 模型 / 10 节点 / 商店最小实现”的状态;真正的缺口是“这些能力已经接成 NodeMapForm 驱动的临时可跑版本,但还没收口成正式 M1 主流程表现层与上下文系统”。
推荐的后续执行顺序
-
先把临时 Hub 升级成正式节点面板
- 保留
ProcedureMain持有 Run 的做法 - 继续以
NodeMapForm为基础补正式节点地图表现 - 至少补上节点连线、Boss 视觉强调、当前节点说明和完成态反馈
- 保留
-
再补齐节点上下文的消费、追踪与统一推进
- 继续沿用
NodeEnterEventArgs和NodeCompleteEventArgs现有的runId / nodeId / nodeType / sequenceIndex - 节点完成后统一由流程层调用
RunStateAdvanceService - 节点失败时明确是否停局、重试或返回菜单
- 继续沿用
-
然后继续收口战斗关卡选择
- 普通战斗和 Boss 战斗继续统一由当前
RunNodeState.LinkedLevelId驱动 - 去掉遗留的随机选关兜底路径,避免偏离 Run 顺序
- 普通战斗和 Boss 战斗继续统一由当前
-
再补出战合法性校验
- 没有完整参战塔时禁止进入战斗节点
- 在 UI 和流程层都给出明确反馈
-
最后再处理品质 / Tag / 耐久与文档对齐
- 先确认 M1 是否真的保留红色品质和完整耐久
- 再决定是补全实现,还是先缩范围并同步文档
当前做变更时要记住的约束
- 不要再把 Hub 退回
TestMenuForm语义。 - 不要把菜单入口和主流程 Hub 混回同一个 Procedure;保持
ProcedureMenu -> ProcedureMain的职责边界。 - 优先补“临时闭环 -> 正式节点 UI / 正式上下文”的收口,不要继续只加单点功能。
- 商店已经接入 Run,下一步重点不是继续扩商店,而是把 Hub/UI 做正式。
- 若 M1 最终不做完整耐久 / 红色品质,要先同步文档再改代码目标。
PlayerInventory可以继续作为库存入口,但不要把整局 Run 状态直接混进库存对象里。
当前关键入口文件速查
- 流程入口:
Assets/GameMain/Scripts/Procedure/ProcedureMain.cs
- Run 模型:
Assets/GameMain/Scripts/Procedure/RunModel.csAssets/GameMain/Scripts/Procedure/RunStateFactory.csAssets/GameMain/Scripts/Procedure/RunStateAdvanceService.csAssets/GameMain/Scripts/Procedure/FixedRunNodeSequenceBuilder.cs
- 当前 Hub / 节点入口:
Assets/GameMain/Scripts/UI/Game/Controller/NodeMapFormController.csAssets/GameMain/Scripts/UI/Game/View/NodeMapForm.cs
- 战斗节点 facade:
Assets/GameMain/Scripts/CustomComponent/CombatNode/CombatNodeComponent.cs
- 事件节点:
Assets/GameMain/Scripts/CustomComponent/EventNodeComponent.cs
- 商店节点:
Assets/GameMain/Scripts/CustomComponent/ShopNodeComponent.cs
- 商店 UI:
Assets/GameMain/Scripts/UI/Shop/
- 背包与组装:
Assets/GameMain/Scripts/CustomComponent/PlayerInventory/Assets/GameMain/Scripts/UI/Game/
备注
- 这份清单基于 2026-03-08 的静态代码检查更新。
- 本次已修正上一版中“Run 模型不存在”“10 节点未实现”“商店节点基本未实现”等过期判断。
- 当前最值得优先推进的是:
NodeMapForm 继续收口表现层 -> 节点事件带上下文 -> 战斗按节点关卡进入 -> 出战校验。