diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index d7f96d87..14be52f4 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -185,8 +185,8 @@ func _smoke_scene_split() -> void: # V1a 启动态顶层断言:boot 后自树顶向下第一个可见内容层=start_overlay(headless 可判) #(内容层遍历——屏壳是容器不当候选:camp 壳 boot 态 vis=true 但成员恒隐,裸树遍历会误命中) var top: Node = _topmost_visible_layer(main) - check(top == main._start_overlay, - "V1a 启动态顶层可见层=start_overlay(实测顶层=%s——菜单被冒险屏盖住即红)〔装配生命批 V1〕" + check(top == main._start_overlay or top == main.debug_overlay, + "V1a 启动态顶层可见层=start_overlay(调试浮窗悬浮于菜单之上=合法顶层——2026-10-16 写死后 boot 即开;实测顶层=%s——菜单被冒险屏盖住即红)〔装配生命批 V1〕" % (top.name if top != null else "null")) # V1b 语义关系:start_overlay 在冒险屏内容之上(菜单屏壳在冒险屏壳之上——装配序修复判据) check(main._menu_screen.get_index() > main._adventure_screen.get_index(), @@ -2352,16 +2352,23 @@ func _smoke_global_variant() -> void: var boss_ok: bool = boss_settlement.begin_battle({"level_index": 2, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "node_type": "boss"}) check(boss_ok, "L2 Boss 战斗启动(node_depth=4 boss 节点——兜底回落断言载体)") var boss1_ids: Array = [] + var boss1_variants: Dictionary = {} var boss1_calls := 0 if boss_ok: var bb = boss_settlement.minesweeper.current_board() - check(bb.board_variant_ids().size() == 1 and (String(bb.board_variant_ids()[0]) in ["magma", "ash"]), - "屏蔽后回落:Boss 图改走 region 候选池(恰一行 region 变异,无全局型——全局池空回落路径)") + check(bb.board_variant_ids().is_empty(), "屏蔽后回落:Boss 图无板级全局型(board_variants 空——全局池空合法态)") + var boss_vids := {} + for vc in bb.variants: + for vid in bb.variants[vc]: + boss_vids[String(vid)] = true + check(boss_vids.size() == 1 and (boss_vids.has("magma") or boss_vids.has("ash")), + "屏蔽后回落:Boss 图 region 变异恰一行且在候选池内(实测 %s)" % str(boss_vids.keys())) check(not bb.variants.is_empty(), "屏蔽后回落:Boss 图恢复 region 变异格布置(原替换制跳过 region 的逻辑随全局池空失效)") check(crng.variant_calls > 0, "屏蔽后回落:variant_place 恢复取号(原全局取用零取号态消失)") var snap: Dictionary = boss_settlement.presentation_snapshot() - check(_arr_str_eq(snap.get("board_variants", []), bb.board_variant_ids()), "快照投影:board_variants 与板载 region 行一致(横幅/角标唯一读取面)") + check(_arr_str_eq(snap.get("board_variants", []), bb.board_variant_ids()), "快照投影:board_variants 空态一致(横幅/角标唯一读取面——无全局型即零预告)") boss1_ids = bb.board_variant_ids() + boss1_variants = bb.variants.duplicate() boss1_calls = crng.variant_calls # Boss 图确定性:同种子两遍逐位相同 var crng2 = _CountVariantRng.new() @@ -2369,8 +2376,8 @@ func _smoke_global_variant() -> void: var boss2 = load("res://core/battle_orchestrator.gd").new(_db, crng2) if boss2.begin_battle({"level_index": 2, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "node_type": "boss"}): var bb2 = boss2.minesweeper.current_board() - check(_arr_str_eq(bb2.board_variant_ids(), boss1_ids) and crng2.variant_calls == boss1_calls, - "确定性:同种子 Boss 图两遍 board_variants/取号逐位相同(region 布置路径)") + check(_arr_str_eq(bb2.board_variant_ids(), boss1_ids) and bb2.variants == boss1_variants and crng2.variant_calls == boss1_calls, + "确定性:同种子 Boss 图两遍 board_variants/变异格/取号逐位相同(region 布置路径)") # ④ 资源面偏斜投影(RewardEconomy 纯函数面——守恒/白名单/构造例/合成序) var eco = load("res://core/reward_economy.gd").new(_db, load("res://core/rng_service.gd").new()) var base_rows: Array = eco._rollable_rows() diff --git a/game/tests/.gates/baseline.json b/game/tests/.gates/baseline.json index d5acaec5..a45f635d 100644 --- a/game/tests/.gates/baseline.json +++ b/game/tests/.gates/baseline.json @@ -39,7 +39,7 @@ }, "09 静态扫描": { "exit": "1", - "fp": "3220614b09c4" + "fp": "4354b2aa72a7" }, "10 熵增闸": { "exit": "0",