From 6a3203a8db3e3b183eec6290e5a0d4364c62d91f Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 30 Oct 2026 07:54:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E5=B7=A5=E7=A8=8B=E5=B0=8F?= =?UTF-8?q?=E4=BB=B6=E6=89=B9=C2=B7=E4=BB=B64):=20=E6=81=92=E7=9C=9F?= =?UTF-8?q?=E4=B8=8E=E5=90=8D=E5=AE=9E=E4=B8=8D=E7=AC=A6=E6=96=AD=E8=A8=80?= =?UTF-8?q?=E4=BA=94=E6=9D=A1=E5=88=A4=E6=8D=AE=E4=BF=AE=E6=AD=A3(?= =?UTF-8?q?=E5=AD=98=E9=87=8F=E6=96=AD=E8=A8=80=E7=B2=BE=E7=AE=80A+B?= =?UTF-8?q?=E6=89=B9=E4=BD=99=E8=B4=A6=E2=91=A3=E8=BD=AC=E6=AD=A3,?= =?UTF-8?q?=E6=8C=89test-conventions=20=C2=A78.4=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E5=8F=A3=E5=BE=84=E6=94=B9=E7=BB=91=E5=8F=AF?= =?UTF-8?q?=E8=A7=82=E6=B5=8B=E9=9D=A2)=E2=80=94=E2=80=94=E2=91=A0feat=5Fv?= =?UTF-8?q?ouchers:51=20=E6=81=92=E7=9C=9Fcond=E6=94=B9=E7=BB=91=E6=8A=95?= =?UTF-8?q?=E6=94=BE=E8=A3=85=E9=85=8D=E9=9D=A2:=E8=AF=BB=E6=95=B0=3D=3D?= =?UTF-8?q?=CE=A3=E8=A1=A8=E9=85=8D=E9=A2=9D=E2=88=92=E6=9C=AC=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=B7=B2=E5=85=91=E4=BB=98=E4=B8=80=E5=BC=A0(curio=5F?= =?UTF-8?q?quota=E8=A1=A8=E9=A9=B1=E5=8A=A8+=E5=85=91=E4=BB=98=E6=91=98?= =?UTF-8?q?=E7=89=8C=E4=B9=89=E5=8A=A1=E5=8F=8C=E7=BB=91);=E2=91=A1treasur?= =?UTF-8?q?e=5Feffects:263=20=E5=8E=BB=E6=81=92=E7=9C=9F=E5=B0=BE=E7=BC=80?= =?UTF-8?q?=E7=BB=91=E6=B8=85=E5=9B=BE=E5=88=A4=E5=AE=9A=E6=9C=AA=E8=A7=A6?= =?UTF-8?q?=E5=8F=91(=E5=A4=A9=E7=9C=BC=E7=AA=97=E5=8F=A3=E2=89=A0?= =?UTF-8?q?=E5=85=A8=E6=9D=BF=E6=9E=84=E9=80=A0=E9=9D=A2=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?);=E2=91=A2=E2=91=A3level=5Fshop=5Feconomy:594/:697=20=E6=81=92?= =?UTF-8?q?=E7=9C=9Fmin=E6=94=B9=E7=BB=91=E8=83=9C=E5=B1=80HP>0=E6=97=97+?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E9=9D=A2=E9=9D=9E=E7=A9=BA(=E2=89=A51?= =?UTF-8?q?=E8=83=9C=E5=B1=80)=E5=8F=8C=E6=9D=A1=E4=BB=B6,HP=E2=89=A40?= =?UTF-8?q?=E8=83=9C=E5=B1=80=E5=8D=B3=E7=BA=A2;=E2=91=A4system=5Fcontract?= =?UTF-8?q?s:66=20=E6=A0=87=E7=AD=BE=E4=BA=92=E5=BC=82=E5=8D=8A=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E8=A1=A5=E5=80=BC=E9=9B=86=E5=8E=BB=E9=87=8D=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=3D=3D=E5=8E=9F=E8=AE=A1=E6=95=B0(=E5=90=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6:44-55=E5=AD=97=E5=85=B8=E6=B3=95=E5=90=8C=E6=AC=BE);?= =?UTF-8?q?=E5=AD=A4=E7=AB=8B=E9=AA=8C=E8=AF=81=3D=E5=9B=9B=E5=A5=97?= =?UTF-8?q?=E4=BB=B6=E5=AE=9E=E8=B7=91=E5=85=A8=E7=BB=BF(level=5Fshop=5Fec?= =?UTF-8?q?onomy=20192=20checks)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/unit/contracts/system_contracts_test.gd | 5 ++++- game/tests/unit/core/feat_vouchers_test.gd | 6 +++++- game/tests/unit/core/level_shop_economy_test.gd | 10 ++++++++-- game/tests/unit/core/treasure_effects_test.gd | 2 +- 4 files changed, 18 insertions(+), 5 deletions(-) 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)