test(迁移): 批 B 波 1 G4 套5 fresh 池攻击链三条迁入 roll_multiplier_test.gd——剪切挂载绿(宿主 37 检查)+变异 3/3 验红(受理守卫恒拒/敌技行改名/乘区池注值);首轮剪切边界差一行致游离 check 残留 Parse Error,闸01 抓到补删(发现⑦同源教训记账);smoke_all.gd 同批删函数节头与调用行;闸01 剩余面 981 绿
This commit is contained in:
1 parent
855bce4534
commit
f674132c04
3 files changed
+35
-32
No files matched your search
@@ -171,7 +171,6 @@ func _run_core_smoke(db, rng) -> void:
|
||||
_smoke_element_details()
|
||||
_smoke_diag_button_retired()
|
||||
_smoke_encounter_roll()
|
||||
_smoke_attack_chain_fresh_pool()
|
||||
_smoke_clear_reward_chain()
|
||||
_smoke_refresh_provenance_guard()
|
||||
_smoke_polarity_routing()
|
||||
@@ -2170,37 +2169,6 @@ func _level_battle_nodes(level_index: int) -> Array:
|
||||
return out
|
||||
|
||||
|
||||
# ---- 战斗段 fresh 池攻击链回归(playtest-2026-09-12 报告 Bug#2 沉淀——
|
||||
# 「Boss 攻击拍零兑现」= 叠满触底 ×0;本断言钉死:
|
||||
# 池为空时攻击链必须按掷点档位足额兑现,口径:
|
||||
# d_tick = max(damage_floor, pool_damage(floor(基线×档位%), 0, 0)),档位读数随行重建可归因)----
|
||||
|
||||
func _smoke_attack_chain_fresh_pool() -> void:
|
||||
print("--- 战斗结算·fresh 池攻击链回归(Bug#2·掷点口径)---")
|
||||
var rng = load("res://core/rng_service.gd").new()
|
||||
rng.set_master_seed(20260913)
|
||||
var settlement = load("res://core/battle_orchestrator.gd").new(_db, rng)
|
||||
var ticks: Array = [] # {baseline, attach, roll, tier, crit, tick}——敌行动伤害行重建
|
||||
settlement.step_row.connect(func(row):
|
||||
if row.type == "damage" and row.source_class == "enemy_action":
|
||||
ticks.append({"baseline": int(row.baseline), "attach": int(row.get("attach", 0)), "roll": int(row.roll),
|
||||
"tier": int(row.tier), "crit": bool(row.get("crit", false)), "tick": int(row.value)}))
|
||||
check(settlement.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "node_type": "boss"}), "fresh 池回归战斗启动(Boss 行)")
|
||||
# 停手轮:零挖掘零封印 → 零授予 → 池恒空;Boss 拍 = 开轮摇号结果(伤害技/普攻兑付伤害行、硬化施放行不计)
|
||||
for i in range(6):
|
||||
if settlement.battle_result != "":
|
||||
break
|
||||
settlement.minesweeper.settle_batch([{"action": "stop"}])
|
||||
check(ticks.size() >= 2, "非施放攻击拍采样充足(%d 拍——增益施放行零兑付为设计语义不计)" % ticks.size())
|
||||
var all_full := true
|
||||
for t in ticks:
|
||||
var base_factor: float = float(t.tier) * (float(_db.settlement.crit_multiplier) / 100.0 if t.crit else 1.0)
|
||||
var rolled_base := int(floor(float(t.baseline) * base_factor / 100.0))
|
||||
var expected: int = maxi(int(_db.settlement.damage_floor), rolled_base + int(t.get("attach", 0)))
|
||||
if int(t.tick) != expected or int(t.tick) <= 0:
|
||||
all_full = false
|
||||
check(all_full, "fresh 池非蓄力拍 d_tick = max(1, 掷点档位基线)(Boss 攻击链健康——Bug#2 回归断言)")
|
||||
|
||||
func _encounter_replay(seed_val: int) -> Array:
|
||||
var out: Array = []
|
||||
var rng = load("res://core/rng_service.gd").new()
|
||||
|
||||
@@ -33,6 +33,7 @@ func _init() -> void:
|
||||
_smoke_armor_roll()
|
||||
_smoke_pool_wiring()
|
||||
_smoke_damage_types()
|
||||
_smoke_attack_chain_fresh_pool()
|
||||
quit(Kit.finish("roll_multiplier_test"))
|
||||
|
||||
|
||||
@@ -424,3 +425,36 @@ func _find_seal_target(minesweeper, want_mine: bool) -> Dictionary:
|
||||
if revealed_set.has(n) and (minesweeper.compute_move_path(n).size() > 0 or n == minesweeper.hero_pos()):
|
||||
return {"seal_cell": c, "hero_cell": n}
|
||||
return {}
|
||||
|
||||
|
||||
# ---- 战斗段 fresh 池攻击链回归(playtest-2026-09-12 报告 Bug#2 沉淀——
|
||||
# 「Boss 攻击拍零兑现」= 叠满触底 ×0;本断言钉死:
|
||||
# 池为空时攻击链必须按掷点档位足额兑现,口径:
|
||||
# d_tick = max(damage_floor, pool_damage(floor(基线×档位%), 0, 0)),档位读数随行重建可归因)----
|
||||
|
||||
func _smoke_attack_chain_fresh_pool() -> void:
|
||||
print("--- 战斗结算·fresh 池攻击链回归(Bug#2·掷点口径)---")
|
||||
var rng = load("res://core/rng_service.gd").new()
|
||||
rng.set_master_seed(20260913)
|
||||
var settlement = load("res://core/battle_orchestrator.gd").new(_db, rng)
|
||||
var ticks: Array = [] # {baseline, attach, roll, tier, crit, tick}——敌行动伤害行重建
|
||||
settlement.step_row.connect(func(row):
|
||||
if row.type == "damage" and row.source_class == "enemy_action":
|
||||
ticks.append({"baseline": int(row.baseline), "attach": int(row.get("attach", 0)), "roll": int(row.roll),
|
||||
"tier": int(row.tier), "crit": bool(row.get("crit", false)), "tick": int(row.value)}))
|
||||
Kit.check("fresh 池回归战斗启动(Boss 行)",
|
||||
settlement.begin_battle({"level_index": 1, "node_depth": 4, "hero_hp": int(_db.hero.max_hp), "node_type": "boss"}))
|
||||
# 停手轮:零挖掘零封印 → 零授予 → 池恒空;Boss 拍 = 开轮摇号结果(伤害技/普攻兑付伤害行、硬化施放行不计)
|
||||
for i in range(6):
|
||||
if settlement.battle_result != "":
|
||||
break
|
||||
settlement.minesweeper.settle_batch([{"action": "stop"}])
|
||||
Kit.check("非施放攻击拍采样充足(%d 拍——增益施放行零兑付为设计语义不计)" % ticks.size(), ticks.size() >= 2)
|
||||
var all_full := true
|
||||
for t in ticks:
|
||||
var base_factor: float = float(t.tier) * (float(_db.settlement.crit_multiplier) / 100.0 if t.crit else 1.0)
|
||||
var rolled_base := int(floor(float(t.baseline) * base_factor / 100.0))
|
||||
var expected: int = maxi(int(_db.settlement.damage_floor), rolled_base + int(t.get("attach", 0)))
|
||||
if int(t.tick) != expected or int(t.tick) <= 0:
|
||||
all_full = false
|
||||
Kit.check("fresh 池非蓄力拍 d_tick = max(1, 掷点档位基线)(Boss 攻击链健康——Bug#2 回归断言)", all_full)
|
||||
Reference in new issue
Block a user