Files
gplan-2/design/qa/battle-stage-node2d-等价证明-2026-09-26.md
T

3.8 KiB
Raw Blame History

战斗舞台 Node2D 迁移 · 信号与演出等价证明(循环 1 T4,2026-09-26)

计划书 T4 验收件:时序常量逐字对照旧实现 + 写路径逐行同构(Phase A 先例成文化)+ 调用点 grep 对比零 diff。 对比基线 = T0 提交 3db7e87(迁移前现行态);迁移后 = worktree battle-stage-node2d-20260926 T3 提交。

1. 调用点 grep 对比(零 diff 实证)

面 命令 结果
main.gd → stage 调用点(9 处:set_effects_cleared_feedback ×2 / gray_all_enemies ×2 / on_step_row_fx / enemy_standee_center / hero_standee_center / set_settle_focus / set_round_text) grep -E "stage\.(hero_standee|enemy_standee_center|on_step_row_fx|gray_all_enemies|set_round_text|set_settle_focus|clear_enemies)" 老新对拍 逐字节一致(行号 309/310/439/441/475/495/503/768/770 全同)
hud_presenter.gd → hero_standee 投喂(4 处:set_hero ×2 / set_effects ×2) 同法对拍 逐字节一致(行号 53/54/79/80 全同——单投喂结构零变)
hud_presenter.gd / main.gd / core/** 文件级 git diff 3db7e87..HEAD --stat 零行变更(投喂链零改动实证;核心层零接触)

2. 时序常量逐字对照(旧 StandeeView → 新 StandeeBody)

演出 旧(Control + tween) 新(Node2D + tween) 判定
血条递减 motion(0.15) tween bar value motion(0.15) tween hp_value 属性 同
意图弹入 scale 1.6→ONE,motion(0.10)/motion(0.16) _intent_scale 1.6→1.0 同时长 同
立绘前倾 rotation 4.0→0.0,motion(0.10)/motion(0.14) _glyph_rot 同值同时长(旧仅转字形 Label——贴图态无动画,新等价保持) 同
死亡摇摆 modulate (0.62,0.62,0.62,0.9);rotation 2.5→−1.5→0.0,motion(0.12)/(0.1)/(0.08) 逐字同 同
受击闪白 modulate (1.6,1.4,1.2) motion(0.08) → 白/死灰 motion(0.2) 逐字同(终色按 _dead 分支同构) 同
复活复位 modulate 白、rotation 0 同 同
清空反馈微文案 1.2s 停留 + motion(0.8) 淡出 同(载体挂壳层伴随件父层——T3 代拍板③) 同

3. 写路径逐行同构(旧 battle_stage_view.gd → 新)

  • on_step_row_fx(row):type!=""damage" 早退 / target=="hero"|""早退 / _card_by_name(target) 空退 / flash_hit() + killed→mark_dead()——逐行同构;_card_by_name 内部实现由「子件 _name_label.text contains」改「本体 display_name() contains」(语义等价,函数内部实现细节=§9 白名单)。
  • set_enemies(cards_data):数量分叉(重建 vs 就地 set_data)结构逐行同构;重建侧由 StandeeView.new 改 StandeeBody.new+伴随件挂接(T3 代拍板①④)。
  • clear_enemies() / gray_all_enemies() / set_round_text() / set_settle_focus():逐行同构(遍历对象 Control→本体)。
  • 弹道落点:hero_standee_center()/enemy_standee_center() 签名不变,实现 = 旧「本体 get_global_rect 中心」改 world_to_shell(本体.position + box*0.5)——壳层口径保持(C4:结算演出 SettlementFxView 在 SubViewport 之外),返回值语义=站桩盒几何中心不变。
  • set_effects/set_effects_cleared_feedback/set_hero(投喂面):本体转发伴随件(slot_row),调用方零改造。

4. 已登记的结构性差异(非漂移,改判记录见台账 170/171)

  1. 站桩本体载体 Control→Node2D(本批目标本身);2. slot_row 伴随件挂壳层;3. enemy_box HBoxContainer→Control 伴随件容器;4. 血条呈现由引擎默认 ProgressBar 改世界直角矩形(色值近似平移——目检清单列「血条观感」项);5. ui_probe 敌站桩断言改本体探针出口(呈现口径逐字保持)。