From d7def000a362ea8125f593a82949e1ebd113fa64 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 23 Oct 2026 03:07:51 +0800 Subject: [PATCH] =?UTF-8?q?test(=E8=BF=81=E7=A7=BB):=20=E6=89=B9=20B=20?= =?UTF-8?q?=E6=B3=A2=201=20G4=20=E5=A5=973=20=E4=B9=98=E5=8C=BA=E6=8E=A5?= =?UTF-8?q?=E7=BA=BF=E5=9B=9B=E6=9D=A1=E8=BF=81=E5=85=A5=20roll=5Fmultipli?= =?UTF-8?q?er=5Ftest.gd=E2=80=94=E2=80=94=E5=89=AA=E5=88=87=E6=8C=82?= =?UTF-8?q?=E8=BD=BD=E7=BB=BF=EF=BC=88=E5=AE=BF=E4=B8=BB=2024=20=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=89=EF=BC=8B=E5=8F=98=E5=BC=82=204/4=20=E9=AA=8C?= =?UTF-8?q?=E7=BA=A2=E5=85=A8=E7=BA=A2=E5=94=AF=E4=B8=80=EF=BC=88=E5=88=86?= =?UTF-8?q?=E9=87=8F=E9=94=AE=E6=94=B9=E5=90=8D/attack=5Fup=2040/sapped=20?= =?UTF-8?q?-10/fortify=20-20=EF=BC=89=EF=BC=9B=E5=A5=97=E5=86=85=E7=8B=AC?= =?UTF-8?q?=E5=8D=A0=20=5Fhero=5Fattack=5Frow=5Fwith=20=E9=9A=8F=E8=BF=81?= =?UTF-8?q?=EF=BC=8Csmoke=5Fall.gd=20=E5=90=8C=E6=89=B9=E5=88=A0=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E8=8A=82=E5=A4=B4=E4=B8=8E=E8=B0=83=E7=94=A8=E8=A1=8C?= =?UTF-8?q?=EF=BC=9B=E9=97=B801=20=E5=89=A9=E4=BD=99=E9=9D=A2=20994=20?= =?UTF-8?q?=E7=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/smoke/smoke_all.gd | 42 ------------------ .../battle_settlement/roll_multiplier_test.gd | 43 +++++++++++++++++++ reports/批B-断言迁移账本-2026-10-22.md | 1 + 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index bf542458..ac83b56d 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -153,7 +153,6 @@ var _rng func _run_core_smoke(db, rng) -> void: _db = db _rng = rng - _smoke_pool_wiring() _smoke_type_glow() _smoke_variant_placement(1) _smoke_variant_placement(2) @@ -1398,47 +1397,6 @@ func _smoke_level() -> void: -# ---- 主角乘区接线 + 硬化折半方向 ---- -# 同种子停手轮恒同掷点(效果只改乘区、不动掷点流)→ 落地伤害精确关系: -# 增伤 = 基线 ×1.5、乏力 = ×0.75(hero_offense 池乘攻击合计 = 单分量,无直乘旁路); -# 硬化 = 基线 ×0.5 且 < 基线(enemy_defense 池负值折半)。 -# 基线构成:基线 100——hero 攻击类型=normal(锻造工坊配置默认值, -# hero.tres 无两轴字段)对轻甲中性 0 修正(目标 = L1 地精轻甲;AC 0 恒全额非暴击种子)。 -func _smoke_pool_wiring() -> void: - print("--- 主角乘区接线 + 硬化折半方向 ---") - var base_row := _hero_attack_row_with({}, 100, 20260918) - var up_row := _hero_attack_row_with({"effects": ["attack_up"]}, 100, 20260918) - var sapped_row := _hero_attack_row_with({"effects": ["sapped"]}, 100, 20260918) - var fortify_row := _hero_attack_row_with({"effects": ["fortify"]}, 100, 20260918) - var base_v := int(base_row.get("value", -1)) - check(int(base_row.get("normal", -1)) == base_v and base_v > 0, "单分量基线在位(normal 分量 = 落地值、基线 %d——充能退役批)" % base_v) - check(int(up_row.get("value", -1)) == int(floor(base_v * 1.5)), - "增伤经乘区加成合计(%d → %d = ×1.5——attack_up 直乘旁路退役,覆盖面=攻击合计)" % [base_v, int(up_row.get("value", -1))]) - check(int(sapped_row.get("value", -1)) == int(floor(base_v * 0.75)), - "乏力经乘区削减合计(%d → %d = ×0.75)" % [base_v, int(sapped_row.get("value", -1))]) - check(int(fortify_row.get("value", -1)) == int(floor(base_v * 0.5)) and int(fortify_row.get("value", -1)) < base_v, - "硬化折半方向(%d → %d = ×0.5 且 < 基线——敌方防御池负值减伤,翻倍 bug 退役)" % [base_v, int(fortify_row.get("value", -1))]) - - -# 构造停手轮首行主角攻击行:opts = {effects: Array};hero_atk 覆盖 100 拉开量级 -# (floor 关系可精确断言);效果直授沿 _weaken_refresh_probe 前例。 -func _hero_attack_row_with(opts: Dictionary, hero_atk_val: int, seed_val: int) -> Dictionary: - var rng = load("res://core/rng_service.gd").new() - rng.set_master_seed(seed_val) - var settlement = load("res://core/battle_orchestrator.gd").new(_db, rng) - var rows: Array = [] - settlement.step_row.connect(func(row): rows.append(row)) - if not settlement.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(_db.hero.max_hp), "hero_atk": hero_atk_val}): - return {} - for eff in opts.get("effects", []): - settlement._status_effects.apply_effect(String(eff), {"source_class": "mine_hit", "origin_cell": Vector2i(0, 0), "round_index": settlement.round_index}) - settlement.minesweeper.settle_batch([{"action": "stop"}]) - for row in rows: - if String(row.get("type", "")) == "damage" and String(row.get("source_class", "")) == "hero_attack": - return row - return {} - - func _mk_stream(stream_name: String, scope: int) -> RandomNumberGenerator: # stream_name = 调用点自述标签(不参与派生),保留参数零改调用方 var rg := RandomNumberGenerator.new() diff --git a/game/tests/unit/battle_settlement/roll_multiplier_test.gd b/game/tests/unit/battle_settlement/roll_multiplier_test.gd index 72de9055..cbe3e939 100644 --- a/game/tests/unit/battle_settlement/roll_multiplier_test.gd +++ b/game/tests/unit/battle_settlement/roll_multiplier_test.gd @@ -31,6 +31,7 @@ func _init() -> void: # 套执行序沿源编排序 _smoke_enemy_attack_type() _smoke_armor_roll() + _smoke_pool_wiring() quit(Kit.finish("roll_multiplier_test")) @@ -289,3 +290,45 @@ func _auto_play_round(settlement, out: Dictionary) -> void: minesweeper.settle_batch([{"action": "dig", "cell": plan.dig_cell}]) if action_economy.phase == "Active" and settlement.round_index == start_round and out.result == "": minesweeper.settle_batch([{"action": "stop"}]) + + +# ---- 主角乘区接线 + 硬化折半方向 ---- +# 同种子停手轮恒同掷点(效果只改乘区、不动掷点流)→ 落地伤害精确关系: +# 增伤 = 基线 ×1.5、乏力 = ×0.75(hero_offense 池乘攻击合计 = 单分量,无直乘旁路); +# 硬化 = 基线 ×0.5 且 < 基线(enemy_defense 池负值折半)。 +# 基线构成:基线 100——hero 攻击类型=normal(锻造工坊配置默认值, +# hero.tres 无两轴字段)对轻甲中性 0 修正(目标 = L1 地精轻甲;AC 0 恒全额非暴击种子)。 +func _smoke_pool_wiring() -> void: + print("--- 主角乘区接线 + 硬化折半方向 ---") + var base_row := _hero_attack_row_with({}, 100, 20260918) + var up_row := _hero_attack_row_with({"effects": ["attack_up"]}, 100, 20260918) + var sapped_row := _hero_attack_row_with({"effects": ["sapped"]}, 100, 20260918) + var fortify_row := _hero_attack_row_with({"effects": ["fortify"]}, 100, 20260918) + var base_v := int(base_row.get("value", -1)) + Kit.check("单分量基线在位(normal 分量 = 落地值、基线 %d——充能退役批)" % base_v, + int(base_row.get("normal", -1)) == base_v and base_v > 0) + Kit.check("增伤经乘区加成合计(%d → %d = ×1.5——attack_up 直乘旁路退役,覆盖面=攻击合计)" % [base_v, int(up_row.get("value", -1))], + int(up_row.get("value", -1)) == int(floor(base_v * 1.5))) + Kit.check("乏力经乘区削减合计(%d → %d = ×0.75)" % [base_v, int(sapped_row.get("value", -1))], + int(sapped_row.get("value", -1)) == int(floor(base_v * 0.75))) + Kit.check("硬化折半方向(%d → %d = ×0.5 且 < 基线——敌方防御池负值减伤,翻倍 bug 退役)" % [base_v, int(fortify_row.get("value", -1))], + int(fortify_row.get("value", -1)) == int(floor(base_v * 0.5)) and int(fortify_row.get("value", -1)) < base_v) + + +# 构造停手轮首行主角攻击行:opts = {effects: Array};hero_atk 覆盖 100 拉开量级 +# (floor 关系可精确断言);效果直授沿 _weaken_refresh_probe 前例。 +func _hero_attack_row_with(opts: Dictionary, hero_atk_val: int, seed_val: int) -> Dictionary: + var rng = load("res://core/rng_service.gd").new() + rng.set_master_seed(seed_val) + var settlement = load("res://core/battle_orchestrator.gd").new(_db, rng) + var rows: Array = [] + settlement.step_row.connect(func(row): rows.append(row)) + if not settlement.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(_db.hero.max_hp), "hero_atk": hero_atk_val}): + return {} + for eff in opts.get("effects", []): + settlement._status_effects.apply_effect(String(eff), {"source_class": "mine_hit", "origin_cell": Vector2i(0, 0), "round_index": settlement.round_index}) + settlement.minesweeper.settle_batch([{"action": "stop"}]) + for row in rows: + if String(row.get("type", "")) == "damage" and String(row.get("source_class", "")) == "hero_attack": + return row + return {} diff --git a/reports/批B-断言迁移账本-2026-10-22.md b/reports/批B-断言迁移账本-2026-10-22.md index 7313ba3d..56a10aa3 100644 --- a/reports/批B-断言迁移账本-2026-10-22.md +++ b/reports/批B-断言迁移账本-2026-10-22.md @@ -283,6 +283,7 @@ - `_smoke_enemy_attack_type`(4 条):4/4 验红。变异点——enemy.tres:26 goblin attack_type normal→pierce(红唯一 1/4,越轨行 goblin:pierce);unit_container.gd:110 快照注入硬编码空串(红 3/4——快照为载荷/矩阵共同源,条3 条4 连带属预期形态);damage_controller.gd:471 敌方技载荷 attack_type 置空串(红唯一 1/4);damage_controller.gd:577 `_counter_delta` 查表短路恒中性(红唯一 1/4)。 - `_smoke_armor_roll`(15 条):15/15 验红(条3 含一次无效首试换点,共 16 轮)。变异点——damage_math.gd:36 档位边界比较 `>`→`>=`(红「查档分布」双迭代+「EV 锚」连带——纯函数共面);settlement.tres roll_tier_discounts 75→74(红「EV 锚」1572≠1575,连带查档双迭代+AC11 落域);damage_controller.gd:540 暴击判定恒假(**首试无效变异**——「nat20 种子可达」只查掷点值==crit_roll 不查标记,判路面不被触及;该轮实际验红条4/条5 记为下两条的顺带证据)→换点 :539 roll 上界收窄 20 不可达(红「种子可达」seed=-1,连带条4/条5——种子扫描共同源);:375 hero 载荷 crit 标记写入恒假(红「crit 标记留档」红唯一 1/20);:369 暴击倍率传参 200→100(红「普通分量 ×2」红唯一);status_container.gd:52 续时刷新分支 pass 化(红「削弱续时」红唯一);:40 幅度快照 −1 偏移(红「削弱池读数=行值」红唯一);damage_math.gd:38 档值 +7 偏移出域(红「AC11 逐拍落域」,连带查档双迭代+EV 锚——纯函数共面;「折扣档流动」保持绿);damage_controller.gd:539 掷点折叠恒 nat 面(红「折扣档流动」——采样 distinct 恒 1 穷尽返空 ×0 拍连带「AC11 逐拍落域」);:515 board_blast 下限拆除恒 0(红「零 v=0 伤害行」红唯一——流中确有群伤行);:374 hero 载荷 tier 键 pass 化(红「掷点读数留档」红唯一);:504 board_typed 载荷塞 roll 键(红「棋盘行零掷点字段」红唯一);damage_math.gd counter_component 三点隔离变异:贴底特例 `sum==1→99`(红「贴底下限」红唯一)、负和特例 `sum<0→99`(红「触底穿透」红唯一)、空桶早退 `return 0→1`(红「空桶恒 0」红唯一)。 +- `_smoke_pool_wiring`(4 条):4/4 验红。变异点——damage_controller.gd:271 hero 侧 atk_type 加 "_x" 后缀(红「单分量基线在位」——payload 分量键改名 normal 键失位;armor_roll 套「普通分量 ×2」同键消费连带属预期形态);status_effects.tres attack_up magnitude 50→40(红「增伤 ×1.5」140≠150 红唯一);sapped magnitude −25→−10(红「乏力 ×0.75」90≠75 红唯一);fortify magnitude −50→−20(红「硬化折半方向」80≠50 红唯一)。 ## 十、支援线 9 项待裁闭合(2026-10-22 主会话裁)