diff --git a/docs_dev/doc_code_audit_2026-07-20.md b/docs_dev/doc_code_audit_2026-07-20.md index bb9c6cc..385bbc9 100644 --- a/docs_dev/doc_code_audit_2026-07-20.md +++ b/docs_dev/doc_code_audit_2026-07-20.md @@ -95,7 +95,12 @@ ## 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` 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。