diff --git a/game/core/level_runner.gd b/game/core/level_runner.gd index 05d110d5..1616a6c6 100644 --- a/game/core/level_runner.gd +++ b/game/core/level_runner.gd @@ -9,7 +9,7 @@ class_name LevelRunner extends RefCounted -signal node_entered(node: Dictionary, info: Dictionary) ## info 按 type:battle/boss={} · reward={}(三选一停点空载荷——内容经 present_node_curio 拉取) · rest={healed,hp,max_hp} · shop={gp} +signal node_entered(node: Dictionary, info: Dictionary) ## info 按 type:battle/boss={} · reward={}(三选一停点空载荷——内容经 present_node_curio 拉取) · rest={healed,hp,max_hp} · shop={gp}(pool 态加 shelf:true) signal choices_presented(candidates: Array) ## 选路口(兑付确认后——候选节点引用数组,零自动推进) signal step_row(row: Dictionary) ## 转发当前 战斗结算 结算行 signal round_started(round_index: int) diff --git a/game/tests/.gates/baseline.json b/game/tests/.gates/baseline.json index 95e64f41..bbac70c8 100644 --- a/game/tests/.gates/baseline.json +++ b/game/tests/.gates/baseline.json @@ -1,61 +1,61 @@ { - "note": "存量基线·闸况变化时本脚本会判红,需人工确认后重生成;2026-10-29 二次记账=03/04/05 三闸按 80b49c0f 先例经用户裁决记入现行红项指纹(03=8a3cae0d0446/04=591b27250b36/05=de89589e49ed)——master 同值复现非迭代42新增(stash 对照法取证,承「迭代 41 测试债修复」条目扩展);原 2026-10-17 06 条目人工重生成记录见 git 提交史", - "gates": { - "00 冒烟测试": { - "exit": "0", - "fp": "green" - }, - "01 系统测试": { - "exit": "0", - "fp": "green" - }, - "02 单元与集成测试": { - "exit": "1", - "fp": "f9865f1a5a44" - }, - "03 场景探针": { - "exit": "0", - "fp": "green" - }, - "05 渲染闸": { - "exit": "1", - "fp": "de89589e49ed" - }, - "06 gdd_lint": { - "exit": "0", - "fp": "green" - }, - "06b 变更记录节": { - "exit": "0", - "fp": "green" - }, - "07 doc_link": { - "exit": "0", - "fp": "green" - }, - "08 doc_term": { - "exit": "0", - "fp": "green" - }, - "08c 流水线闸": { - "exit": "0", - "fp": "green" - }, - "09 静态扫描": { - "exit": "1", - "fp": "1a9ad773489f" - }, - "10 熵增闸": { - "exit": "0", - "fp": "green" - }, - "08d 引用可核": { - "exit": "0", - "fp": "green" - }, - "08e 能力审计": { - "exit": "0", - "fp": "green" + "note": "\u5b58\u91cf\u57fa\u7ebf\u00b7\u95f8\u51b5\u53d8\u5316\u65f6\u672c\u811a\u672c\u4f1a\u5224\u7ea2\uff0c\u9700\u4eba\u5de5\u786e\u8ba4\u540e\u91cd\u751f\u6210\uff1b2026-10-29 \u4e8c\u6b21\u8bb0\u8d26\uff1d03/04/05 \u4e09\u95f8\u6309 80b49c0f \u5148\u4f8b\u7ecf\u7528\u6237\u88c1\u51b3\u8bb0\u5165\u73b0\u884c\u7ea2\u9879\u6307\u7eb9\uff0803=8a3cae0d0446/04=591b27250b36/05=de89589e49ed\uff09\u2014\u2014master \u540c\u503c\u590d\u73b0\u975e\u8fed\u4ee342\u65b0\u589e\uff08stash \u5bf9\u7167\u6cd5\u53d6\u8bc1\uff0c\u627f\u300c\u8fed\u4ee3 41 \u6d4b\u8bd5\u503a\u4fee\u590d\u300d\u6761\u76ee\u6269\u5c55\uff09\uff1b\u539f 2026-10-17 06 \u6761\u76ee\u4eba\u5de5\u91cd\u751f\u6210\u8bb0\u5f55\u89c1 git \u63d0\u4ea4\u53f2\uff1b2026-10-30 \u4e09\u952e\u6362\u4ee3\uff1d02/05/09 \u6309\u5de5\u7a0b\u5c0f\u4ef6\u6279\u56de\u6267 6a3203a8 \u5b9e\u6d4b\u7eff\u91cd\u951a\uff0802 \u5173\u8054\u6863\u5206\u72474/4\u5168\u7eff\uff0f05 \u6e32\u67d3\u95f8\u771f\u8dd1\u7eff\uff0f09 \u9759\u6001\u626b\u63cf\u7eff\u2014\u2014run_all \u9017\u53f7\u89e3\u6790\u4fee\u590d\uff0b\u6052\u771f\u4e94\u6761\u5224\u636e\u4fee\u6b63\u6279\uff0c\u4e09\u952e\u65e7\u7ea2\u6307\u7eb9\u5168\u90e8\u5f52\u7eff\u6d88\u9664\uff09", + "gates": { + "00 \u5192\u70df\u6d4b\u8bd5": { + "exit": "0", + "fp": "green" + }, + "01 \u7cfb\u7edf\u6d4b\u8bd5": { + "exit": "0", + "fp": "green" + }, + "02 \u5355\u5143\u4e0e\u96c6\u6210\u6d4b\u8bd5": { + "exit": "0", + "fp": "green" + }, + "03 \u573a\u666f\u63a2\u9488": { + "exit": "0", + "fp": "green" + }, + "05 \u6e32\u67d3\u95f8": { + "exit": "0", + "fp": "green" + }, + "06 gdd_lint": { + "exit": "0", + "fp": "green" + }, + "06b \u53d8\u66f4\u8bb0\u5f55\u8282": { + "exit": "0", + "fp": "green" + }, + "07 doc_link": { + "exit": "0", + "fp": "green" + }, + "08 doc_term": { + "exit": "0", + "fp": "green" + }, + "08c \u6d41\u6c34\u7ebf\u95f8": { + "exit": "0", + "fp": "green" + }, + "09 \u9759\u6001\u626b\u63cf": { + "exit": "0", + "fp": "green" + }, + "10 \u71b5\u589e\u95f8": { + "exit": "0", + "fp": "green" + }, + "08d \u5f15\u7528\u53ef\u6838": { + "exit": "0", + "fp": "green" + }, + "08e \u80fd\u529b\u5ba1\u8ba1": { + "exit": "0", + "fp": "green" + } } - } } \ No newline at end of file diff --git a/game/tests/run_all.gd b/game/tests/run_all.gd index 93e05bd1..84c5a93f 100644 --- a/game/tests/run_all.gd +++ b/game/tests/run_all.gd @@ -66,9 +66,10 @@ func _init() -> void: for a in OS.get_cmdline_user_args(): if a.begins_with("--only="): has_only = true - var term := a.trim_prefix("--only=").strip_edges() - if term != "": - only_terms.append(term) + for part in a.trim_prefix("--only=").split(","): + var term := part.strip_edges() + if term != "": + only_terms.append(term) elif a == "--only-source=gates": only_from_gates = true elif a.begins_with("--shard="): diff --git a/game/tests/static_scan.sh b/game/tests/static_scan.sh index df9951d6..91ca784c 100644 --- a/game/tests/static_scan.sh +++ b/game/tests/static_scan.sh @@ -334,7 +334,7 @@ else grep -rnE '\bawait\b' $S8_FILES 2>/dev/null | grep -vE '^[^:]+:[0-9]+:[[:space:]]*#' | grep -vE '"[^"]*\bawait\b[^"]*"' fail=1 else - echo "[static_scan] S8 ok(扫描面 B1 文件集 9 个 .gd,await 零命中)" + echo "[static_scan] S8 ok(扫描面 B1 文件集 10 个 .gd,await 零命中)" fi fi diff --git a/game/tests/unit/contracts/system_contracts_test.gd b/game/tests/unit/contracts/system_contracts_test.gd index 11b0a352..2d172f7c 100644 --- a/game/tests/unit/contracts/system_contracts_test.gd +++ b/game/tests/unit/contracts/system_contracts_test.gd @@ -63,8 +63,11 @@ func _test_rng_tag_closure(db) -> void: var stream_label: String = String(db.combat.settlement.damage_roll.armor_roll_stream) Kit.check("settlement.armor_roll_stream ∈ RngService 封闭标签词表(EC12)", RngServiceScript.PURPOSE_TAGS.has(stream_label)) + var unique_tags: Dictionary = {} + for t in RngServiceScript.PURPOSE_TAGS: + unique_tags[String(t)] = true Kit.check("RngService 用途标签词表非空且互异(封闭语义由流改标签)", - RngServiceScript.PURPOSE_TAGS.size() > 0) + RngServiceScript.PURPOSE_TAGS.size() > 0 and unique_tags.size() == RngServiceScript.PURPOSE_TAGS.size()) # ---- B1→D1 行协议:单据九栏缺省齐备 + 协议公共键形态 ---- diff --git a/game/tests/unit/core/feat_vouchers_test.gd b/game/tests/unit/core/feat_vouchers_test.gd index ee376c43..31072369 100644 --- a/game/tests/unit/core/feat_vouchers_test.gd +++ b/game/tests/unit/core/feat_vouchers_test.gd @@ -48,7 +48,11 @@ func _init() -> void: a.stop()._node_pending = {} # 摘牌:选中即消尽(禁早退路径零摘牌) var deck_refresh_before: int = a.deck().pool_stock("refresh") - Kit.check_quiet(deck_refresh_before == 0 or true, "牌库 refresh 令牌读数在域(投放 %d)" % deck_refresh_before) + var deck_refresh_quota := 0 + for tier in db.run.adventure.TIERS: + deck_refresh_quota += int(db.run.adventure.curio_quota("refresh", String(tier))) + Kit.check_quiet(deck_refresh_before == deck_refresh_quota - 1, + "牌库 refresh 令牌读数=表配额−本会话已兑付一张(读数 %d/配额 %d)" % [deck_refresh_before, deck_refresh_quota]) # V9-2 储备金袋:待注入账 + 战首注入(节点级) a.stop()._pending = {"candidates": [{"kind": "rap", "tier": "rare"}]} # 停点候选直写(构造面——pick_curio 真实入口前置) diff --git a/game/tests/unit/core/level_shop_economy_test.gd b/game/tests/unit/core/level_shop_economy_test.gd index aace162a..350f31bd 100644 --- a/game/tests/unit/core/level_shop_economy_test.gd +++ b/game/tests/unit/core/level_shop_economy_test.gd @@ -570,6 +570,7 @@ func _smoke_level_graph() -> void: var green_ok := true var green_min_hp := 99999 var green_wins := 0 + var green_hp_floor_ok := true # 胜局 HP>0 旗(绿档记录义务——败局样本不入账,胜局 0 血即红) for i in range(12): var g_runner = load("res://core/level_runner.gd").new(_db, _fresh_rng(9100 + i)) g_runner.start_level(2, 9100 + i) @@ -589,9 +590,11 @@ func _smoke_level_graph() -> void: green_wins += 1 if int(g_box.get("hero_hp", 0)) > 0: green_min_hp = mini(green_min_hp, int(g_box.hero_hp)) + else: + green_hp_floor_ok = false Kit.check("首遇位零踩雷:完美档 12 种子(节点 0 熊地精)恒零踩雷", green_ok) Kit.check("首遇战胜局 ≥7/12(实际 %d——阶段拔高后锚行退出绿档,多数胜口径)" % green_wins, green_wins >= 7) - Kit.check("首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green_min_hp, green_min_hp > 0) + Kit.check("首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green_min_hp, green_hp_floor_ok and green_min_hp < 99999) # ⑦ 跨表覆盖义务:L2 现行起关图每战斗/Boss 节点深度的敌侧落带 ≥ 请求深度(顶 clamp 消解即红) # +每深度 board_gen 精确命中(判据实现与〔v11〕种子扫描段同源——_enemy_band_covers/_board_row_exact 单点) var cov2 := _coverage_scan(2, nodes2) @@ -675,6 +678,7 @@ func _smoke_level_graph() -> void: # (零加成基线红档属预期——断言口径 = 成长代理档,非基线;跑法同 ⑥) var green3_ok := true var green3_min_hp := 99999 + var green3_hp_floor_ok := true # 胜局 HP>0 旗(绿档记录义务——胜局 0 血即红) for i in range(12): var g3_runner = load("res://core/level_runner.gd").new(_db, _fresh_rng(9100 + i)) g3_runner.set_hero_override(200, 100) @@ -693,8 +697,10 @@ func _smoke_level_graph() -> void: green3_ok = false elif int(g3_box.get("hero_hp", 0)) > 0: green3_min_hp = mini(green3_min_hp, int(g3_box.hero_hp)) + else: + green3_hp_floor_ok = false Kit.check("L3 首遇位绿档:成长代理档口径(atk_pct=200/hp_pct=100)完美档 12 种子首遇战(节点 0 灰矮人)全胜且零踩雷", green3_ok) - Kit.check("L3 首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green3_min_hp, green3_min_hp > 0) + Kit.check("L3 首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green3_min_hp, green3_hp_floor_ok and green3_min_hp < 99999) # ⑫ 混编行集运行面正反断言:注入带键 (1,battle,5)/(1,battle,6) = # L1 节点图与全部既有扫描面之外的新带键(带命中精确取注入行集——新 L 会被 ceil 封顶到 L3 不可用), diff --git a/game/tests/unit/core/treasure_effects_test.gd b/game/tests/unit/core/treasure_effects_test.gd index 4f232f6a..ce7eb59b 100644 --- a/game/tests/unit/core/treasure_effects_test.gd +++ b/game/tests/unit/core/treasure_effects_test.gd @@ -260,7 +260,7 @@ func _init() -> void: if not overlay11.has(c_v): overlay_ok = false Kit.check_quiet(overlay_ok, "天眼正常:窗口全格入真视叠加层(危险格显示=C5 有差别开格)") - Kit.check_quiet(not ob11.minesweeper.clear_map_cleared() or true, "天眼开格走普通挖格链(连锁/资源兑付=fx_reveal 通道——免 AP 即效果本身)") + Kit.check_quiet(not ob11.minesweeper.clear_map_cleared(), "天眼开格走普通挖格链(连锁/资源兑付=fx_reveal 通道——免 AP 即效果本身)") # ⑫ 信标网络(封印不限相邻/封印价照付) var rng12 = load("res://core/rng_service.gd").new(); rng12.set_master_seed(311)