diff --git a/game/presentation/modal_stack.gd b/game/presentation/modal_stack.gd index a02ea728..bb0d1d2c 100644 --- a/game/presentation/modal_stack.gd +++ b/game/presentation/modal_stack.gd @@ -31,7 +31,10 @@ func open(m: Control) -> void: hidden.append(higher) # 遮挡账合并非覆盖:同层重复 open 时上方已隐、hidden 为空,旧账须保留 # (空表覆盖会让先前被隐层在本层 close 后永不恢复) - var merged: Array = _occluded.get(m, []).duplicate() + var merged: Array[Control] = [] + for h in _occluded.get(m, []): + if not merged.has(h): + merged.append(h) for h in hidden: if not merged.has(h): merged.append(h) diff --git a/game/tests/golden/README.md b/game/tests/golden/README.md index a0f3b8d4..ebbb813c 100644 --- a/game/tests/golden/README.md +++ b/game/tests/golden/README.md @@ -21,3 +21,9 @@ - 2026-10-16(迭代 29 T7):**判有效**。三代换代面(棋盘三图 + 启动态菜单)实测 changed = 0.00% / 0.00% / 0.00% / 0.15%,均远低于 2% 阈值 ⇒ 基线留在位,不重制。 (本批零视觉改动,判定属常规复核。) +- 2026-10-25(迭代 37 卡① T3):**判失效 → 显式重制 + 复闸**。实测棋盘三图 + changed = 0.13% / 0.11% / 0.10%,差异像素全落 900×760 棋盘裁剪区内、裁剪区外 0, + 按加严口径不判有效;成因定位为 `2f3a87e9`(魔法道具 HUD)注入 `REWARD_BADGE` 预读格 + 字形——晚于 2026-10-08 建基提交,与本批零因果。呈报后用户裁「重制三张基线」, + 经 `tools/golden_baseline_refresh.sh` 换代;复闸 changed = 0.00% / 0.00% / 0.00%, + 启动态菜单 0.00%(未重制)。 diff --git a/game/tests/golden/board_L1_dungeon.png b/game/tests/golden/board_L1_dungeon.png index 795e7b93..834352fd 100644 Binary files a/game/tests/golden/board_L1_dungeon.png and b/game/tests/golden/board_L1_dungeon.png differ diff --git a/game/tests/golden/board_L2_underdark.png b/game/tests/golden/board_L2_underdark.png index 93e1ea64..2f87adc6 100644 Binary files a/game/tests/golden/board_L2_underdark.png and b/game/tests/golden/board_L2_underdark.png differ diff --git a/game/tests/golden/board_L3_deep_underdark.png b/game/tests/golden/board_L3_deep_underdark.png index f4b25ace..ab50d9bf 100644 Binary files a/game/tests/golden/board_L3_deep_underdark.png and b/game/tests/golden/board_L3_deep_underdark.png differ diff --git a/game/tests/unit/battle_settlement/damage_controller_test.gd b/game/tests/unit/battle_settlement/damage_controller_test.gd index e03ea8cf..168ca0fb 100644 --- a/game/tests/unit/battle_settlement/damage_controller_test.gd +++ b/game/tests/unit/battle_settlement/damage_controller_test.gd @@ -227,7 +227,7 @@ func _unit_fixture() -> Dictionary: } -func _test_identical_content_dual_enemy(db) -> void: +func _test_identical_content_dual_enemy(db: ConfigDb) -> void: var a := _unit_fixture() var b := _unit_fixture() Kit.check("前置:双敌字典内容全同且非同一实例", a == b and not is_same(a, b)) @@ -256,7 +256,7 @@ func _test_identical_content_dual_enemy(db) -> void: # ---- requires 前置门:前置单未实际有效兑付 → 后继单静默作废;无存活敌 blast = 合法零兑付 ---- # d12 产发端增键:目标身份随行/随载荷下发(同名敌按 id 精确解析的产发半) -func _test_target_id_payload(db) -> void: +func _test_target_id_payload(db: ConfigDb) -> void: _rows = [] var h = _harness(db) if not h.spawn_ok: diff --git a/game/tests/unit/presentation/pacing_queue_test.gd b/game/tests/unit/presentation/pacing_queue_test.gd index d5ee24a0..aa1a3dfa 100644 --- a/game/tests/unit/presentation/pacing_queue_test.gd +++ b/game/tests/unit/presentation/pacing_queue_test.gd @@ -14,7 +14,7 @@ var _problems: Array = [] # 记参假站桩(d12 排播半):继承真类以过类型面,只记解析入参 class FakeStage extends BattleStageView: - var calls: Array = [] + var calls: Array[Array] = [] func enemy_standee_center(target_id: String, display_name: String) -> Variant: calls.append([target_id, display_name]) @@ -23,7 +23,7 @@ class FakeStage extends BattleStageView: # 记参假演出层(同上——play_* 全部只记不演) class FakeFx extends SettlementFxView: - var calls: Array = [] + var calls: Array[Array] = [] func play_projectile(_from: Vector2, _to: Vector2, _glyph: String, _col: Color, _crit: bool = false) -> void: calls.append(["projectile", _to]) @@ -133,11 +133,11 @@ func _init() -> void: rp.settlement_fx = ffx rp._play_settlement_mark({"type": "damage", "target": "哥布林", "target_id": "goblin_b", "value": 3}) check(fstage.calls.size() == 1 and fstage.calls[0] == ["goblin_b", "哥布林"], - "结算标出按行 target_id 解析站桩(id 与名同传——d12)") + "结算标出按行 target_id 解析站桩(id 与名同传——d12)〔wd12〕") rp._play_cross_zone_fx({"type": "damage", "target": "哥布林", "target_id": "goblin_b", "value": 3}) check(fstage.calls.size() == 2 and fstage.calls[1] == ["goblin_b", "哥布林"], - "跨区弹道按行 target_id 解析站桩(id 与名同传——d12)") - check(ffx.calls.size() == 2, "两路解析成功后演出层各接一拍(记参面非空)") + "跨区弹道按行 target_id 解析站桩(id 与名同传——d12)〔wd12〕") + check(ffx.calls.size() == 2, "两路解析成功后演出层各接一拍(记参面非空)〔wd12〕") rp.free() _finish() diff --git a/game/tests/unit/presentation/standee_fx_sweep_test.gd b/game/tests/unit/presentation/standee_fx_sweep_test.gd index 892f6d3c..bc38985a 100644 --- a/game/tests/unit/presentation/standee_fx_sweep_test.gd +++ b/game/tests/unit/presentation/standee_fx_sweep_test.gd @@ -43,10 +43,10 @@ class FakePanel extends Node: # 假自动策略(run_level 签名同 level_autoplay——回调内读控制器运行态) class FakeDriver extends RefCounted: var ctrl - var seen: Array = [] + var seen: Array[bool] = [] var calls := 0 - func run_level(_db, _seed: int, _level: int, _atk: int, _hp: int, _other: bool, _logger): + func run_level(_db: Variant, _seed: int, _level: int, _atk: int, _hp: int, _other: bool, _logger: Variant) -> Dictionary: calls += 1 seen.append(ctrl.is_running()) if calls == 1: