feat(迭代38卡④ 明细收敛批): 扩展行型收敛——四个专长实名行型(fx_reveal/mine_neutralized/insurance_used/fx_preview_area)收敛为单一 extended 行型+effect_id 载荷(六发射点:orchestrator 三处+grant_segment 三处,display_name/value/highlight 逐字不动);a2 _emit_row 扩展行必载 effect_id 校验(emit 之前,违约 assert 炸零发射);a3 fx_preview_area 来源类别空串违约修复(→fx_warning_beacon,对齐 fx_seal_smith 先例);a4 头注换代两层词表(基础 9 类+扩展行 1 类+四效果身份发射点指引);a5 呈现零改动核验(_format_row fallback 承载、AGG_TYPES 不含扩展行);a6 裁点甲重锚(parity_anchor freeze 改后行为立新锚+复闸三变体双面全同;改前对拍绿基线在案——stash 干净跑批实测);验收=wr2 断言五条(insurance_used〔V6 扩展〕+fx_reveal 兑付/落空〔真实揭示管线〕+mine_neutralized/fx_preview_area〔treasure 套件首次 feats 注入〕)+wr2-np 负面小套件(extended_row_violation_test,expect=1 negative,manifest 登记行)+wr3 并⑤断言;撤销证明三条实测红绿复现;JSONL 读数对拍 PASS(type 迁移计数与 T0 基线对账 264/304/0/0,字段口径外零差异——type/effect_id/source_class/source 四字段,source=logger:133 同值改名副本);改动面封闭(基础 9 类零触碰、豁免集合零变化、数值随机零变化)

This commit is contained in:
DKChan committed 2026-10-26 08:52:14 +08:00
1 parent ce49a8eec2
commit d5a03db1a8
7 files changed
+174 -12

No files matched your search

@@ -300,6 +300,60 @@ func _init() -> void:
and (adr14.runner()._attunement as Array) == snap14,
"装配不可变:战斗运行态装配集与冒险装配集逐位同源(运行零写口——快照对比)")
# ⑮ 扩展行收敛(迭代 38 卡④ wr2④⑤——套件首次 feats 注入,V6 形态自 round_flow_skill_pool_test 移植:
# enc 带 feats 键+ledger,专长触发经 _judge_seal 真实封印判定管线)
var enc_feats = {"level_index": 1, "node_depth": 0, "hero_hp": 40, "hero_atk": 8, "hero_max_hp": 40,
"hero_armor_class": 10, "hero_ap_bonus": 0, "attunement": [], "attune_charges": {},
"feats": ["seal_smith"], "tree_rules": [], "battle_index": 1,
"bonus_ref": {"atk": 0, "max_hp": 0, "armor_class": 0}, "voucher_rap": 0, "voucher_time_sand": 0,
"node_type": "battle", "ledger": load("res://core/run_ledger.gd").new()}
var rng15 = load("res://core/rng_service.gd").new(); rng15.set_master_seed(341)
var ob15 = orch_s.new(db, rng15)
ob15.begin_battle(enc_feats)
var rows15: Array = []
ob15.step_row.connect(func(row): rows15.append(row))
# ④ 封印匠(每第 3 次封印命中→危险格中立移除):三枚不同雷格各封一次
#(_judge_seal 每格去重——_seal_consumed 以危险格实例为键,同格重复命中不计数)
var mines15: Array = []
for cv in ob15.minesweeper.current_board().all_cells():
if ob15.minesweeper.current_board().is_mine(cv):
mines15.append(cv)
if mines15.size() >= 3:
break
Kit.check_quiet(mines15.size() == 3, "封印匠:板上存在三枚危险格(断言前提)")
if mines15.size() == 3:
for mv in mines15:
ob15._grant_seg._judge_seal({"cell": mv, "hit": true}, 1)
var smith_row := {}
for r in rows15:
if String(r.get("effect_id", "")) == "mine_neutralized":
smith_row = r
Kit.check_quiet(not smith_row.is_empty() and String(smith_row.get("type", "")) == "extended"
and String(smith_row.get("source_class", "")) == "fx_seal_smith",
"封印匠第三次命中:危险格中立移除行=扩展行型(type=extended+effect_id=mine_neutralized)〔明细收敛 V2〕")
# ⑤ 示警烟火(封印命中→周围资源类型预告):fx_preview_area 扩展行+来源类别修复断言(wr3)
var enc_beacon = enc_feats.duplicate(true)
enc_beacon["feats"] = ["warning_beacon"]
var rng15b = load("res://core/rng_service.gd").new(); rng15b.set_master_seed(342)
var ob15b = orch_s.new(db, rng15b)
ob15b.begin_battle(enc_beacon)
var rows15b: Array = []
ob15b.step_row.connect(func(row): rows15b.append(row))
var cell15b: Variant = null
for cv in ob15b.minesweeper.current_board().all_cells():
if not ob15b.minesweeper.current_board().is_mine(cv):
cell15b = cv
break
if cell15b != null:
ob15b._grant_seg._judge_seal({"cell": cell15b, "hit": true}, 1)
var beacon_row := {}
for r in rows15b:
if String(r.get("effect_id", "")) == "fx_preview_area":
beacon_row = r
Kit.check_quiet(not beacon_row.is_empty() and String(beacon_row.get("type", "")) == "extended"
and String(beacon_row.get("source_class", "")) == "fx_warning_beacon",
"示警烟火命中行:type=extended+effect_id=fx_preview_area+来源类别=fx_warning_beacon(空串违约修复)〔明细收敛 V2〕")
quit(Kit.finish("treasure_effects_test", "PASS — 新目录 12 件逐件行为断言全绿〔秘宝批 V7 附属表〕"))