docs: 记录 3 个 bug 修复的 Godot 运行时验收结果
经 godot-mcp-pro(Godot 4.6.2,0 编译错误)实测: - D1 CoreFeatureTag:tags=1 持久 [0,0,1,0],tags=3 碰撞 [0,0,0,0](旧 & bug 会误得 [0,0,1,0]) - D2 pierce:[pierce+2, spark_bolt] 子弹 pierce_remaining=2,对照组无误加 - D5 Deck 防呆:has_castable_action 四例正确,SHOP_NEED_ACTION 键解析正常 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -95,7 +95,12 @@
|
|||||||
|
|
||||||
## D. ⚠️ 潜在 Bug / 风险(审计附带发现,建议单独修)
|
## D. ⚠️ 潜在 Bug / 风险(审计附带发现,建议单独修)
|
||||||
|
|
||||||
> ✅ **修复状态 (2026-07-20)**:**D1 / D2 / D5 已在分支 `fix/audit-latent-bugs`(commit `dc05eea`)实现修复**,静态审查 + grep 校验通过,**待 Godot 运行时验收**。D3(SpatialGridCs 参数分叉)与 D4(LOD `_visible_flags` 从不置 1)暂未处理——二者分别依赖尚未接线的 C# 与尚未启用的 LOD,风险潜伏、非当前活跃路径。
|
> ✅ **修复状态 (2026-07-20)**:**D1 / D2 / D5 已在分支 `fix/audit-latent-bugs`(commit `dc05eea`)实现修复,并经 Godot 运行时验收通过**(godot-mcp-pro,Godot 4.6.2,0 编译错误):
|
||||||
|
> - **D1**:`feature_tags=1` 持久内存 `every_n_shots` 四连发 = `[0,0,1,0]`(正常);碰撞值 `feature_tags=3` = `[0,0,0,0]`(正确判为非持久;旧 `&` bug 会误得 `[0,0,1,0]`)。
|
||||||
|
> - **D2**:`[pierce+2, spark_bolt]` 发射的子弹冷数据 = `{ pierce_remaining: 2 }`;无修正器的对照组为空(无误加)。
|
||||||
|
> - **D5**:`has_castable_action()` 对 纯 Modifier / 空槽 / 空 Deck 均返回 `false`,含 ACTION 返回 `true`;`SHOP_NEED_ACTION` 四语键正常解析。
|
||||||
|
>
|
||||||
|
> D3(SpatialGridCs 参数分叉)与 D4(LOD `_visible_flags` 从不置 1)暂未处理——二者分别依赖尚未接线的 C# 与尚未启用的 LOD,风险潜伏、非当前活跃路径。
|
||||||
|
|
||||||
1. **`CoreFeatureTag` 位运算冲突(真实 latent bug)**:常量是 `1,2,3,4,5`(非 2 的幂),却用位与 `&` 判断持久内存。`ALWAYS_CAST_LAST(3) & PERSISTENT_MEMORY(1) = 1` → 若某 Core 设 `feature_tags=3` 会被误判为持久内存。当前仅 `wand_memory=1` 未触发。类型上也与文档 ADR-R5-N2(`architecture_design.md:2929` 示例为 `String` 常量 + `in core.feature_tags` 判定)相反——注:`core_feature_tag.gd:2` 自身头注把 ADR-R5-N2 解读为"禁止裸字符串",与文档正文的 String 方案存在张力。✅ **已修复** (`dc05eea`):复核发现 `feature_tags` 实为**单选枚举**——游戏设计器 `core_tab.gd` 以 OptionButton 下标 0..5 写入,下标即等于常量值。故修法是把判定从 `&` 改为 **`==`**、常量保持 1..5(未改 2 的幂位标志,以免与设计器下标 desync);串扰消除。若将来要一个 Core 同时带多个特性,再改为位标志 + 设计器多选。待运行时验收。`core_feature_tag.gd:5-9`, `spell_evaluator.gd:41,324`
|
1. **`CoreFeatureTag` 位运算冲突(真实 latent bug)**:常量是 `1,2,3,4,5`(非 2 的幂),却用位与 `&` 判断持久内存。`ALWAYS_CAST_LAST(3) & PERSISTENT_MEMORY(1) = 1` → 若某 Core 设 `feature_tags=3` 会被误判为持久内存。当前仅 `wand_memory=1` 未触发。类型上也与文档 ADR-R5-N2(`architecture_design.md:2929` 示例为 `String` 常量 + `in core.feature_tags` 判定)相反——注:`core_feature_tag.gd:2` 自身头注把 ADR-R5-N2 解读为"禁止裸字符串",与文档正文的 String 方案存在张力。✅ **已修复** (`dc05eea`):复核发现 `feature_tags` 实为**单选枚举**——游戏设计器 `core_tab.gd` 以 OptionButton 下标 0..5 写入,下标即等于常量值。故修法是把判定从 `&` 改为 **`==`**、常量保持 1..5(未改 2 的幂位标志,以免与设计器下标 desync);串扰消除。若将来要一个 Core 同时带多个特性,再改为位标志 + 设计器多选。待运行时验收。`core_feature_tag.gd:5-9`, `spell_evaluator.gd:41,324`
|
||||||
2. **`modifier_pierce_plus` 是空操作**:玩家能在商店买到,但 `_apply_modifier` 不识别 `pierce`,`CastStats` 无该字段 → **买了没效果**。`spell_evaluator.gd:488-501`, `cast_stats.gd:6-13` ✅ **已修复** (`dc05eea`):新增 `CastStats.pierce_add`,`_apply_modifier` 累加、`_push_projectile` 叠加到 ACTION 自带 pierce。
|
2. **`modifier_pierce_plus` 是空操作**:玩家能在商店买到,但 `_apply_modifier` 不识别 `pierce`,`CastStats` 无该字段 → **买了没效果**。`spell_evaluator.gd:488-501`, `cast_stats.gd:6-13` ✅ **已修复** (`dc05eea`):新增 `CastStats.pierce_add`,`_apply_modifier` 累加、`_push_projectile` 叠加到 ACTION 自带 pierce。
|
||||||
|
|||||||
Reference in New Issue
Block a user