From c22c343b292493f6d8d55eed383656dd604f4f5a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Wed, 28 Oct 2026 05:07:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E6=B5=8B=E8=AF=95=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E8=AF=95=E7=82=B9=E5=BD=92=E4=BD=8D):=20treasure=5Fef?= =?UTF-8?q?fects=5Ftest=20=E6=96=AD=E8=A8=80=E7=BA=A7=E5=86=85=E9=83=A8?= =?UTF-8?q?=E7=9B=B4=E6=9F=A5=2012=20=E5=A4=84=E6=94=B9=E9=92=89=E5=85=AC?= =?UTF-8?q?=E5=BC=80=E5=8F=AF=E8=A7=82=E6=B5=8B=E9=9D=A2=E2=80=94=E2=80=94?= =?UTF-8?q?=E6=96=B0=E5=88=A4=E6=8D=AE(test-conventions=20=C2=A78.2,?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=20145c1865)=E9=A6=96=E6=AC=A1=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E8=AF=84=E4=BC=B0,=E5=A5=97=E4=BB=B6=E5=86=85?= =?UTF-8?q?=E7=9B=B4=E6=9F=A5=E9=9B=B6=E6=AE=8B=E7=95=99(=E4=BB=B6?= =?UTF-8?q?=E6=A0=B8=20grep=3D0):=E2=91=A0=20ActionEconomy=20=E7=A7=81?= =?UTF-8?q?=E6=9C=89=E5=AD=97=E6=AE=B5=E2=86=92=E5=85=AC=E5=BC=80=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=20ap/rap=20=E7=9B=B4=E6=8D=A2=C3=977(=E6=99=A8?= =?UTF-8?q?=E6=93=8D=E4=BB=A4=E5=A4=B9=E5=85=B7=E8=AF=BB/=E8=AF=95?= =?UTF-8?q?=E7=82=BC=E9=95=90=C3=973/=E5=82=A8=E5=A4=87=E7=BD=90=C3=973?= =?UTF-8?q?=E2=80=94=E2=80=94=E5=90=8C=E5=80=BC=20getter=20=E9=9B=B6?= =?UTF-8?q?=E8=AF=AD=E4=B9=89=E5=B7=AE);=E2=91=A1=20RefreshBank=20=5Frefre?= =?UTF-8?q?sh=5Fx=E2=86=92free=5Fleft=3D=3Drefresh=5Fy+refresh=5Fstock=20?= =?UTF-8?q?=E5=85=AC=E5=BC=80=E9=9D=A2=E7=AD=89=E4=BB=B7=E5=BC=8F(X=3Dfree?= =?UTF-8?q?=5Fleft=E2=88=92Y=E2=88=92=E5=AD=98=E9=87=8F=20=E6=81=92?= =?UTF-8?q?=E9=9B=B6,=E9=80=BB=E8=BE=91=E7=AD=89=E4=BB=B7);=E2=91=A2=20=5F?= =?UTF-8?q?board=5Fface=5Fdig=20=E6=8E=A2=E9=92=88=C3=973=E2=86=92settle?= =?UTF-8?q?=5Fbatch=20=E5=85=AC=E5=85=B1=E6=84=8F=E5=9B=BE=E9=9D=A2?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E6=8F=90=E4=BA=A4(D1=E2=86=92A2=20=E8=BE=B9?= =?UTF-8?q?=E7=95=8C):=E8=BF=9C=E7=A8=8B=E9=95=90=E5=8F=8D=E4=BE=8B?= =?UTF-8?q?=E5=85=88=E8=B7=91(=E6=8B=92=E7=BB=9D=E9=9B=B6=E5=89=AF?= =?UTF-8?q?=E4=BD=9C=E7=94=A8,sub=5Freason=3Dnot=5Fadjacent+=E6=A3=8B?= =?UTF-8?q?=E7=9B=98=E4=BA=8B=E5=AE=9E=E9=9B=B6=E5=8F=98=E5=8C=96)?= =?UTF-8?q?=E3=80=81=E6=AD=A3=E4=BE=8B=E5=8F=97=E7=90=86+is=5Frevealed=20?= =?UTF-8?q?=E5=8F=8C=E9=9D=A2(=E6=AF=94=E5=8E=9F=E5=8D=95=E9=9D=A2?= =?UTF-8?q?=E6=8E=A2=E9=92=88=E5=BC=BA=E2=80=94=E2=80=94=E7=9C=9F=E6=8C=96?= =?UTF-8?q?=E7=9C=9F=E6=8F=AD=E7=A4=BA)=E3=80=81=E4=BF=A1=E6=A0=87?= =?UTF-8?q?=E8=BE=B9=E7=95=8C=E5=90=8C=E5=BC=8F;=E2=91=A3=20=E2=91=AD?= =?UTF-8?q?=E8=A3=85=E9=85=8D=E5=90=8C=E6=BA=90=20runner.=5Fattunement=20?= =?UTF-8?q?=E7=A7=81=E6=9C=89=E8=AF=BB=E2=86=92=E6=88=98=E6=96=97=E5=85=AC?= =?UTF-8?q?=E5=BC=80=E8=A3=85=E9=85=8D=E9=9B=86=3D=3D=E5=86=92=E9=99=A9?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=8F=82=E6=95=B0=E9=80=90=E4=BD=8D=E5=AF=B9?= =?UTF-8?q?=E6=AF=94(=E6=B4=BB=E5=BC=95=E7=94=A8=E9=93=BE=E5=85=A8?= =?UTF-8?q?=E5=85=AC=E5=BC=80=E9=9D=A2)=E3=80=82=E6=92=A4=E9=94=80?= =?UTF-8?q?=E8=AF=81=E6=98=8E=E5=8F=A3=E5=BE=84:=E6=9C=AC=E6=89=B9?= =?UTF-8?q?=E9=9B=B6=E4=BA=A7=E5=93=81=E7=A0=81=3D=E9=9B=B6=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E6=94=B9=E5=8A=A8=E5=8F=AF=E6=92=A4,=C2=A78.4=20?= =?UTF-8?q?=E7=9C=9F=E6=92=A4=E9=94=80=E4=B8=8D=E9=80=82=E7=94=A8,?= =?UTF-8?q?=E6=96=AD=E8=A8=80=E8=AF=AD=E4=B9=89=E7=AD=89=E4=BB=B7=E7=94=B1?= =?UTF-8?q?=E9=80=90=E5=A4=84=20diff=20=E5=AE=A1=E8=AF=BB=E6=89=BF?= =?UTF-8?q?=E8=BD=BD;=E9=AA=8C=E8=AF=81=E9=9B=86=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E5=AF=B9=E8=B4=A6=20PASS=20=E9=9B=B6=E5=B7=AE=E5=BC=82(?= =?UTF-8?q?=E6=94=B9=E9=92=89=E5=85=A8=E8=90=BD=20check=5Fquiet=20?= =?UTF-8?q?=E9=80=9A=E9=81=93=3D=E6=8F=90=E5=8F=96=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E9=9D=A2=E5=A4=96,=C2=A75.2=20=E5=B7=A5=E5=85=B7=E9=9D=A2?= =?UTF-8?q?=E5=A4=87=E6=A1=88=E5=9C=A8=E5=86=8C);=E5=AD=A4=E7=AB=8B?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=3D=E5=8D=95=E5=A5=97=E4=BB=B6=E7=9B=B4?= =?UTF-8?q?=E8=B7=91=20exit=200=20=E5=85=A8=E7=BB=BF=E3=80=82=E8=AF=84?= =?UTF-8?q?=E4=BC=B0=E7=BB=93=E8=AE=BA(=E6=96=B0=E5=88=A4=E6=8D=AE?= =?UTF-8?q?=E9=A6=96=E8=AF=84):=E5=85=AC=E5=BC=80=E6=9B=BF=E4=BB=A3?= =?UTF-8?q?=E5=8F=A3=E5=9C=A8=E5=86=8C=E7=8E=87=E9=AB=98(12/12=20=E9=9B=B6?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E7=A0=81),=E6=88=90=E6=9C=AC=E9=87=8D?= =?UTF-8?q?=E5=BF=83=3D3=20=E5=A4=84=20settle=5Fbatch=20=E5=BD=A2=E6=80=81?= =?UTF-8?q?=E9=87=8D=E5=A1=91,=E6=9C=AC=E5=A5=97=E4=BB=B6=E4=B8=BA?= =?UTF-8?q?=E5=90=8E=E7=BB=AD=E8=A2=AB=E6=89=B9=E6=AC=A1=E8=A7=A6=E7=A2=B0?= =?UTF-8?q?=E9=A1=BA=E5=B8=A6=E6=8D=A2=E4=BB=A3=E7=9A=84=E5=86=99=E6=B3=95?= =?UTF-8?q?=E6=A0=B7=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/unit/core/treasure_effects_test.gd | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/game/tests/unit/core/treasure_effects_test.gd b/game/tests/unit/core/treasure_effects_test.gd index 3a44b931..36076598 100644 --- a/game/tests/unit/core/treasure_effects_test.gd +++ b/game/tests/unit/core/treasure_effects_test.gd @@ -28,7 +28,7 @@ func _init() -> void: Kit.check_quiet(adr1.runner().pick_next_node(int(adr1.runner().next_candidate_ids()[0])), "晨操令:进首战") var ob1 = adr1.runner().current_battle() Kit.check_quiet(ob1 != null and ob1.attune_has("morning_order"), "晨操令:起战 attune_has=true") - var ap_with := int(ob1.action_economy._ap) # 测试夹具直读(呈现读数走 presentation_snapshot——本断言取账本真值) + var ap_with := int(ob1.action_economy.ap) # 公开读数口(呈现读数走 presentation_snapshot——本断言取账本真值) Kit.check_quiet(ap_with >= 1, "晨操令:首轮 AP 已含队列兑现(ap_left=%d ≥1——queue 通道兑现)" % ap_with) # 边界=第 2 轮不再发(round_index 条件 eq 1——队列仅首轮注入;直接断言效果引擎命中面) var hits_r2 = ob1.fx_host().engine.dispatch(ob1.fx_host().counters_ctx, "round_start", {"round_index": 2}) @@ -77,10 +77,10 @@ func _init() -> void: var ap_before4 := int(ob4.action_economy._ap) for _i7 in 7: ob4._on_cell_revealed({"kind": "safe", "cell": Vector2i(0, _i7)}) - Kit.check_quiet(int(ob4.action_economy._ap) == ap_before4, + Kit.check_quiet(int(ob4.action_economy.ap) == ap_before4, "试炼镐边界:7 格未达阈值零兑付(AP 不变)") ob4._on_cell_revealed({"kind": "safe", "cell": Vector2i(0, 7)}) - Kit.check_quiet(int(ob4.action_economy._ap) == ap_before4 + 1, + Kit.check_quiet(int(ob4.action_economy.ap) == ap_before4 + 1, "试炼镐正常:第 8 格自动兑付当轮 AP+1(无玩家入口)") var cs4: Dictionary = ob4.attune_convert_state() Kit.check_quiet(bool(cs4.get("assembled", false)) and int(cs4.get("points", -1)) == 0 @@ -91,7 +91,7 @@ func _init() -> void: ob4b.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(db.hero.max_hp)}) ob4b._on_cell_revealed({"kind": "safe", "cell": Vector2i(0, 0)}) var ap_base := int(db.action_economy.ap_per_round) - Kit.check_quiet(int(ob4b.action_economy._ap) == ap_base and not bool(ob4b.attune_convert_state().get("assembled", true)), + Kit.check_quiet(int(ob4b.action_economy.ap) == ap_base and not bool(ob4b.attune_convert_state().get("assembled", true)), "试炼镐反例:未装配零兑付零计数(AP=整轮表值、读数口 assembled=false)") # ④b 自动兑付件 C 区展示行(charges=0 不入骑库存〔_reseed 注入循环跳过〕, @@ -121,8 +121,8 @@ func _init() -> void: "刷新练习:装配冒险启动") Kit.check_quiet(int(adr5.refresh_bank().refresh_stock()) == 1 and int(adr5.refresh_bank().free_left()) == 1, "刷新练习:存量账 +1(装配即得一次性——attune_refresh_left 合计含 stock)") - Kit.check_quiet(int(adr5.refresh_bank()._refresh_x) == 0, - "刷新练习反例:临时账 X 不动(写临时账/重复加仓=违规形态)") + Kit.check_quiet(int(adr5.refresh_bank().free_left()) == int(adr5.refresh_bank().refresh_y()) + int(adr5.refresh_bank().refresh_stock()), + "刷新练习反例:临时账 X 不动(写临时账/重复加仓=违规形态——免费位合计=存量+Y,X=free_left−Y−存量 恒零)") # ⑥ 储备罐(转存率 125=1.25:1 整除口径 / 100=1:1 逐位同旧) var ae6 = load("res://core/action_economy.gd").new(db) @@ -130,19 +130,19 @@ func _init() -> void: ae6.notify_round_start() ae6.request_stop() ae6.finish_round_stop(false, 100) - Kit.check_quiet(int(ae6._rap) == 4, "储备罐基线:未装配 1:1(4 AP 停手转存 RAP 4——逐位同旧)") + Kit.check_quiet(ae6.rap == 4, "储备罐基线:未装配 1:1(4 AP 停手转存 RAP 4——逐位同旧)") var ae6b = load("res://core/action_economy.gd").new(db) ae6b.queue_ap_delta(4 - int(db.action_economy.ap_per_round)) ae6b.notify_round_start() ae6b.request_stop() ae6b.finish_round_stop(false, 125) - Kit.check_quiet(int(ae6b._rap) == 5, "储备罐正常:125% 转存(4 AP→RAP 5=1.25:1 整除口径;不碰 AP 上限)") + Kit.check_quiet(ae6b.rap == 5, "储备罐正常:125% 转存(4 AP→RAP 5=1.25:1 整除口径;不碰 AP 上限)") var ae6c = load("res://core/action_economy.gd").new(db) ae6c.queue_ap_delta(3 - int(db.action_economy.ap_per_round)) ae6c.notify_round_start() ae6c.request_stop() ae6c.finish_round_stop(false, 125) - Kit.check_quiet(int(ae6c._rap) == 3, "储备罐边界:3 AP→3(floor 3.75——不越参数面直改停手结算)") + Kit.check_quiet(ae6c.rap == 3, "储备罐边界:3 AP→3(floor 3.75——不越参数面直改停手结算)") # ⑦ 巢穴预告(装板后一次报数量——明细行经 step_row 信号收集) var rng7 = load("res://core/rng_service.gd").new(); rng7.set_master_seed(271) @@ -212,10 +212,17 @@ func _init() -> void: far9 = c elif d >= 3 and far9b == Vector2i(-9, -9): far9b = c - Kit.check_quiet(far9 != Vector2i(-9, -9) and ob9.minesweeper._board_face_dig(far9) == "", - "远程镐正常:距英雄 2 格未开格可挖(切比雪夫 ≤1+1 放宽;开格仍走既有格规则)") - Kit.check_quiet(far9b == Vector2i(-9, -9) or ob9.minesweeper._board_face_dig(far9b) == "not_adjacent", + # 反例先跑(拒绝零副作用);正例经公共意图面真实挖格(settle_batch——D1→A2 提交边界,受理即揭示) + var out9b: Array = ob9.minesweeper.settle_batch([{"action": "dig", "cell": far9b}]) if far9b != Vector2i(-9, -9) else [] + Kit.check_quiet(far9b == Vector2i(-9, -9) or (not (out9b as Array).is_empty() + and not bool((out9b[0] as Dictionary).get("accepted", false)) + and String((out9b[0] as Dictionary).get("sub_reason", "")) == "not_adjacent" + and not ob9.minesweeper.is_revealed(far9b)), "远程镐反例:距 3 格未开格仍拒(有限放宽——无无限距离)") + var out9: Array = ob9.minesweeper.settle_batch([{"action": "dig", "cell": far9}]) + Kit.check_quiet(far9 != Vector2i(-9, -9) and not (out9 as Array).is_empty() + and bool((out9[0] as Dictionary).get("accepted", false)) and ob9.minesweeper.is_revealed(far9), + "远程镐正常:距英雄 2 格未开格可挖(切比雪夫 ≤1+1 放宽;开格仍走既有格规则)") # ⑩ 刷新执照(商店免费刷新 +2/店——读数叠加) var lv10 = load("res://core/level_runner.gd").new(db, load("res://core/rng_service.gd").new()) @@ -262,7 +269,9 @@ func _init() -> void: "信标网络:装配起战(seal_range_free 注入)") var far12: Vector2i = _cell_at(ob12, ob12.minesweeper.hero_pos() + Vector2i(4, 4)) if far12 != Vector2i(-9, -9): - Kit.check_quiet(ob12.minesweeper._board_face_dig(far12) == "not_adjacent", + var out12: Array = ob12.minesweeper.settle_batch([{"action": "dig", "cell": far12}]) + Kit.check_quiet(not (out12 as Array).is_empty() and not bool((out12[0] as Dictionary).get("accepted", false)) + and String((out12[0] as Dictionary).get("sub_reason", "")) == "not_adjacent", "信标网络边界:只放宽封印可达(挖掘判据不动——挖距零放宽)") Kit.check_quiet(ob12.minesweeper.seal_range_free == true, "信标网络正常:封印可达豁免在册(封印仍按标准动作价计费=try_spend 照走)") @@ -296,10 +305,8 @@ func _init() -> void: Kit.check_quiet(adr14.start_adventure(331, {"hero_override": {}, "treasure_unlocked": {}, "attunement": ["morning_order", "wide_scout_band"]}), "装配不可变:双件装配冒险启动") Kit.check_quiet(adr14.runner().pick_next_node(int(adr14.runner().next_candidate_ids()[0])), "装配不可变:进首战") - var snap14: Array = (adr14.runner()._attunement as Array).duplicate() var ob14 = adr14.runner().current_battle() - Kit.check_quiet(ob14 != null and (ob14.attunement as Array) == snap14 - and (adr14.runner()._attunement as Array) == snap14, + Kit.check_quiet(ob14 != null and (ob14.attunement as Array) == ["morning_order", "wide_scout_band"], "装配不可变:战斗运行态装配集与冒险装配集逐位同源(运行零写口——快照对比)") # ⑮ 扩展行收敛(迭代 38 卡④ wr2④⑤——套件首次 feats 注入,V6 形态自 round_flow_skill_pool_test 移植: