Start Tag System

This commit is contained in:
2026-03-10 13:11:30 +08:00
parent 34ef001ef3
commit 52f9e212b9
107 changed files with 1850 additions and 50 deletions
+42 -5
View File
@@ -1,6 +1,6 @@
# CodeX TODO
最后更新:2026-03-09
最后更新:2026-03-10
> 目标:基于当前仓库现状,为 `docs/TODO.md` 的 M1 收口补一份更可执行的补充顺序。
> 原则:先收主流程,再补硬规则,最后统一文档与验收口径。
@@ -130,7 +130,7 @@
| [x] | S4-03 | 先固化 Tag 系统设计与首发范围 | `docs/TagSystemDesign.md`<br>`docs/CodeX-TODO.md` | Tag 的来源、汇总、生效与首发集合口径固定 |
| [x] | S4-04 | 实现组件实例 Tag 的统一生成入口 | `Assets/GameMain/Scripts/Definition/`<br>`Assets/GameMain/Scripts/CustomComponent/PlayerInventory/` | 掉落、商店、初始种子、事件奖励共用同一生成结果 |
| [x] | S4-05 | 实现组塔后的 Tag 汇总与展示入口 | `Assets/GameMain/Scripts/Definition/`<br>`Assets/GameMain/Scripts/CustomComponent/PlayerInventory/`<br>`Assets/GameMain/Scripts/UI/` | 组件 Tag 可汇总为塔级结果,且 UI 展示口径一致 |
| [ ] | S4-06 | 实现首批基础 Tag 的战斗生效 | `Assets/GameMain/Scripts/Entity/`<br>`Assets/GameMain/Scripts/Components/`<br>`Assets/GameMain/Scripts/Definition/` | 首发 6~8 个基础 Tag 至少完成一批可验证效果 |
| [ ] | S4-06 | 实现首批基础 Tag 的战斗生效 | `Assets/GameMain/Scripts/Entity/`<br>`Assets/GameMain/Scripts/Components/`<br>`Assets/GameMain/Scripts/Definition/` | 首发 6~8 个基础 Tag 至少完成一批可验证效果,且战斗入口与状态运行时结构可继续扩展 |
| [ ] | S4-07 | 补齐 Tag 规则与数据表的映射关系 | `Assets/GameMain/Scripts/DataTable/`<br>`Assets/GameMain/Scripts/Definition/` | 表字段不是只存在而未被消费,Tag 参数可配置可解释 |
> 2026-03-09 更新:`InventoryRarityRuleService` 已落地;塔品质计算与组件品质归一化已统一收口,`PlayerInventoryTowerAssemblyService`、`ShopFormUseCase`、`EnemyDropResolver`、`InventorySeedUtility` 已接入同一规则入口。你已确认 Unity Test Runner 中 `Assets/Tests/EditMode` 全部通过,其中包含新增的 `InventoryRarityRuleServiceTests`。
@@ -140,6 +140,12 @@
> 2026-03-09 更新:`S4-04` 已落地 `InventoryTagRuleService` 与 `InventoryTagSourceType`;组件实例 Tag 现在统一按 `PossibleTag + Tag.txt.MinRarity + 品质预算` 生成,并只保留当前正式首发 7 个 Tag。`ShopFormUseCase`、`EnemyDropResolver`、`InventorySeedUtility` 已接入该入口,样例库存的组件与塔展示 Tag 已同步为统一结果;同时新增 `InventoryTagRuleServiceTests`。当前 CLI 下 `dotnet build GeometryTD.sln` 仍因本机缺少 Unity 引用和 `Unity.SourceGenerators*.dll` 失败,未能替代 Unity Test Runner 完成最终验证。
>
> 2026-03-09 更新:`S4-05` 已新增 `TagRuntimeData` 与 `TowerTagAggregationService`;组塔与样例塔现在统一生成塔级 `TagRuntimes`,并保留兼容 `Tags` 投影。`RepoForm`、`CombatFinishForm`、`ItemDescForm` 的塔展示已切到聚合结果,重复 Tag 以 `xN` 文本显示;组件展示仍沿用组件实例 `Tags`。同时新增 `TowerTagAggregationServiceTests`;本轮改动后的最终验证仍以 Unity Test Runner 实跑结果为准。
>
> 2026-03-10 更新:`S4-06` 已完成第一段落地。战斗链现在已从旧的 `damage + AttackPropertyType` 入口提升为携带 `TagRuntimeData[]` 的命中载荷;`AttackPayload`、`HitContext`、`TagEffectResolver`、`EnemyTagStatusRuntime` 已接入主命中链。当前已实际生效的基础 Tag 为 `Fire`、`Ice`、`Crit`、`Execution`:其中 `Fire` 已改为独立 DOT 公式,并按 `EnemyEntity` 每帧提供的 `deltaTime` 连续结算;`Ice` 已有独立减速状态;`Crit` 与 `Execution` 已进入命中前数值修正。状态类 Tag 已按“每个 Tag 各自配置文件、状态文件、效果文件”的方式拆开,`EnemyTagStatusRuntime` 只负责按激活 Tag 动态 Tick,不再持有具体 Tag 字段。
>
> 2026-03-10 更新:当前 `S4-06` 仍未整体完成。`Shatter`、`Inferno`、`AbsoluteZero` 仍处于“已注册但 no-op 占位”的状态;`BurnSpread`、`IgniteBurst`、`FreezeMask`、`Pierce`、`Overpenetrate` 仍只有分类与占位路由,没有实际战斗效果。因此当前仓库状态应视为“首批 4 个基础 Tag 已进入战斗,首发 7 个 Tag 尚未收满”,而不是 `S4-06` 全量完成。
>
> 2026-03-10 更新:`S4-07` 仍未开始正式收口。当前 Tag 参数仍主要承载在代码侧 `TagConfigRegistry` 与各 Tag 配置类中,`Tag.txt` / DataTable 仍只提供基础字典与 `MinRarity` 输入;文档中约定的 `TagRule` 表、触发阶段、权重、效果参数等尚未形成 DataRow 与运行时消费闭环。因此 `S4-07` 继续保持未完成状态。
### S4-01 边界结论
@@ -168,6 +174,36 @@
- 当前正式首发基础集合为:`Fire`、`Ice`、`Crit`、`Execution`、`Shatter`、`Inferno`、`AbsoluteZero`。
- `BurnSpread`、`Pierce`、`Overpenetrate`、`FreezeMask`、`IgniteBurst` 默认放到后续扩展阶段,不作为 `S4` 当前完成标准。
### S4 当前进度结论(2026-03-10)
- `S4-02 ~ S4-05` 已完成,品质、组件实例 Tag 生成、塔级 `TagRuntimeData` 汇总、以及 UI 展示口径都已收口。
- `S4-06` 已完成第一阶段:战斗链已支持 Tag 透传与统一结算,`Fire`、`Ice`、`Crit`、`Execution` 已有可验证效果,状态类 Tag 的内部结构也已从集中字段改为注册式运行时。
- 当前 `S4-06` 的未完成部分集中在首发剩余 3 个 Tag:`Shatter`、`Inferno`、`AbsoluteZero`。它们虽然已进入 `TagType`、配置类、注册表和占位效果类,但还没有实际战斗语义。
- `BurnSpread`、`IgniteBurst`、`FreezeMask`、`Pierce`、`Overpenetrate` 已进入分类与配置骨架,但仍属于后续扩展,不计入当前 `S4` 的完成标准。
- `S4-07` 仍未开始正式实现。当前仓库只有“代码内注册表配置”,还没有把 `TagRule` 设计回写成 DataTable / DataRow / 运行时消费链。
### S4-06 当前代码状态
- 命中链路已统一为 `AttackPayload -> HitContext -> TagEffectResolver`,子弹命中时不再只传裸 `damage`。
- `Tower` 侧的 `TagRuntimes` 已能透传到战斗,且保留了旧 `Tags -> TagRuntimes` 的兼容入口,避免旧塔或旧展示数据在战斗中完全失效。
- 状态类 Tag 现在按单 Tag 文件拆分:
- 配置:每个 Tag 一个 `TagConfig`
- 运行时状态:每个状态类 Tag 一个 `TagState`
- 效果:每个状态类 Tag 一个 `TagEffect`
- `EnemyTagStatusRuntime` 已不再硬编码 `burn/slow` 字段,而是按激活的状态类 Tag 动态调度 Tick。
- `Fire` 已改为独立 DOT 公式:当前使用独立 `BurnDamagePerSecondPerStack`,并按敌人实体每帧提供的 `deltaTime` 连续结算,不再依赖命中伤害或内部 `TickInterval`。
- `Ice` 仍是独立减速状态,移速倍率通过状态运行时聚合得到。
- `Crit`、`Execution` 已通过数值修正链路生效;`Shatter` 仍仅有占位配置与入口,没有实际增伤逻辑。
### S4 后续执行计划
1. 先补完 `S4-06` 的首发缺口,只做正式首发集合剩余的 `Shatter`、`Inferno`、`AbsoluteZero`,不提前展开传播、爆炸、穿透、多命中体系。
2. `Shatter` 优先接入现有命中前数值修正链,直接消费“目标已减速”这一当前已存在的状态查询能力。
3. `Inferno` 与 `AbsoluteZero` 优先作为对已有 `Fire` / `Ice` 的强化 Tag 落地,不额外引入第二套状态系统;要求仍沿用当前“单 Tag 配置 + 单 Tag 效果 + 注册式状态运行时”的结构。
4. 首发 7 个 Tag 全部进入战斗并补齐对应 EditMode 测试后,再将 `S4-06` 标记为完成。
5. 之后进入 `S4-07`:新增并消费 `TagRule` 表或等价 DataTable 映射,把当前代码内的 Tag 参数逐步迁移为可配置数据,而不是继续堆在 `TagConfigRegistry` 默认值里。
6. `S4-07` 完成标准仍以“表字段被实际消费、参数可解释、运行时与文档口径一致”为准,不要求一步到位把全部 12 个 Tag 都配置化。
## 阶段 S5 - 收口耐久规则
| 状态 | ID | 任务 | 交付物路径 | 验收标准 |
@@ -191,7 +227,7 @@
1. 先做 `S1`,把主流程真正收成一条稳定可验收的链。
2. `S2` 已完成口径对齐,`NodeMapForm` 不再作为 M1 阻塞项。
3. 接下来优先做 `S3`,补齐出战合法性,解决 `P0-10`。
4. 再做 `S4`,统一品质 / Tag 的规则口径,解决 `P0-11`。
4. 再做 `S4`,统一品质 / Tag 的规则口径,解决 `P0-11`。其中当前优先级已经收口为:先补完 `S4-06` 的首发 7 Tag,再做 `S4-07` 的数据表映射。
5. 最后做 `S5`,决定耐久是完整收口还是同步缩范围,解决 `P0-12`。
6. 全部完成后做 `S6`,补测试并同步文档状态。
@@ -199,8 +235,9 @@
1. `S1` 与 `S2` 已完成口径收口,可直接进入规则侧收尾
2. `S3-01 ~ S3-04` 已完成,当前可转入 `S4`
3. 接下来决定 `S4` 和 `S5` 是完整实现还是同步缩范围
4. 最后补 `S6-01 ~ S6-04`
3. 当前先继续完成 `S4-06`,补齐 `Shatter`、`Inferno`、`AbsoluteZero`
4. 然后进入 `S4-07`,把 `TagRule` / DataTable 映射真正接进运行时
5. 最后补 `S6-01 ~ S6-04`
## 备注
+202
View File
@@ -465,3 +465,205 @@ Tag 触发阶段固定拆成四段:
- 第一批战斗效果优先做状态类与数值修正类,不优先做穿透 / 爆炸 / 传播
- MVP 正式首发集合固定为 `Fire`、`Ice`、`Crit`、`Execution`、`Shatter`、`Inferno`、`AbsoluteZero`
- `BurnSpread` 明确后移,不作为当前首发集合成员
# 总体结构
我们设计 3 个流派方向:
1. 🔥 元素爆发流(AOE清场)
2. ❄ 控制叠层流(减速控制)
3. 🎯 穿透暴击流(单体爆发)
每个流派 4 个 Tag,其中:
- 2 个基础属性 Tag
- 1 个机制 Tag
- 1 个高阶(稀有)Tag
总 Tag 数 = 12
## 一、🔥 元素爆发流
核心定位:
> 中等频率攻击 + 元素叠层 + 击杀爆炸清场
## 4 个 Tag
### 1️⃣ Fire(基础)
效果:
- 攻击附带灼烧(持续伤害)
- 可叠加 3 层
### 2️⃣ BurnSpread(机制)
触发:
- 目标死亡时将灼烧传播给周围 2 个敌人
### 3️⃣ IgniteBurst(组合触发)
触发条件:
- 同一塔 ≥2 Fire Tag
效果:
- 满层灼烧爆炸(小范围AOE)
4️⃣ Inferno(稀有)
品质限定:紫及以上
效果:
爆炸伤害 ×2
灼烧叠层上限 +2
流派触发逻辑
条件 效果
1 Fire 基础DOT
2 Fire IgniteBurst 激活
Fire + BurnSpread 爆炸后传播
Inferno + 2 Fire 大范围爆炸
二、❄ 控制叠层流
核心定位:
降速 + 冻结 + 稳定推进
4 个 Tag
1️⃣ Ice(基础)
效果:
攻击附带减速
可叠加 5 层
2️⃣ FreezeMark(机制)
触发:
目标叠满 5 层冻结 1 秒
3️⃣ Shatter(组合触发)
触发:
冻结目标受到暴击时额外伤害
4️⃣ AbsoluteZero(稀有)
品质限定:紫及以上
效果:
冻结时间 +50%
冻结爆裂产生小范围伤害
流派触发逻辑
条件 效果
1 Ice 减速
Ice + FreezeMark 满层冻结
冻结 + Shatter 爆裂伤害
AbsoluteZero 群控升级
三、🎯 穿透暴击流
核心定位:
低频高伤 + 直线穿透 + 单体爆发
4 个 Tag
1️⃣ Pierce(基础)
效果:
子弹穿透 2 个敌人
2️⃣ Crit(基础)
效果:
+15% 暴击率
3️⃣ Overpenetrate(机制)
触发:
穿透第一个敌人后伤害提升 30%
4️⃣ Execution(稀有)
品质限定:紫及以上
效果:
暴击对生命低于30%目标伤害 ×2
流派触发逻辑
条件 效果
Pierce 直线清场
Crit 随机爆发
Pierce + Crit Overpenetrate 激活
Execution 斩杀强化
四、品质与 Tag 关系设计
建议规则:
品质 Tag 数量
白 1
绿 1
蓝 2
紫 2 + 稀有概率
红 3(含稀有)
这样:
低品质仍有存在价值
高品质增加构筑复杂度
稀有 Tag 不会泛滥
五、组合系统可视化建议
在组装界面显示:
🔥 元素爆发(已激活)
灼烧爆炸
传播效果
❄ 冰霜控制(未激活)
需要 FreezeMark
这样玩家会有“完成拼图”的感觉。
六、数值安全机制(防止爆炸)
每个机制必须有:
触发冷却(0.5~1秒)
最大叠层限制
爆炸不触发爆炸(防无限连锁)
群体上限目标数
例如:
BurnSpread 最多传播 3 次。
否则后期怪物多时会帧率爆炸。