refactor(迭代27 T3): 波三 账本收口——RunLedger 单类持四账+刷新双账删副本+gp_final 键删影子账——逐位一致对拍全同

P1-4 共享账本 Ledger 类化(裁点②甲 单类持四账):
- game/core/run_ledger.gd: attune_charges/vision_counter/adventure_counters/bonus 四账
  单类承载;战斗侧只拿 read/append 原语(attune_charge_has/set/consume、vision_count_add、
  counters_seed_snapshot/merge_export、bonus_add_axis)——战末 export/开局 seed 时点语义不变
- AdventureRunner 持账(run_ledger)→ LevelRunner set_run_ledger+sync_attune_inventory
  (原四散 setter 收口)→ enc 单键 ledger 下传;编排器三裸引用成员退役为 _ledger 原语调用
- 调试/单场缺省新账=零扰动面(vision_counter 缺省空=不计,原 enc 缺键守卫语义保留)

P1-2 刷新双账收口:
- main 刷新计数副本(run_scope.refresh_used_round)删除;单一事实源=编排器受理计数
- presentation_snapshot 成文面升键 refresh_used(can_refresh 邻位)——HUD 余量/遥测
  round_refresh_index 单源读快照;V5 快照一致性断言×3(smoke+ui_click HUD 文本比对)

P1-3 GP 影子账收口:
- adventure_runner summary 增 gp_final 键(close_wallet 清账前快照)
- gp_shadow_ledger.gd 全件退役删除;main 委托缝/会话账本成员删除;终局面板 GP 行
  取数=summary 键;ui_probe 影子账断言换代为 summary 键断言

验收: 逐位一致对拍三变体全同;冒烟 1079/0+run_all 26 套+probe click+render golden 0.00%
This commit is contained in:
DKChan committed 2026-10-14 23:25:45 +08:00
1 parent 26301baa9c
commit 6fd7d782cc
16 files changed
+174 -183

No files matched your search

+6 -6
View File
@@ -58,8 +58,8 @@ func _init() -> void:
Kit.check_quiet(not a.choose_battery_target("incense_stick"),
"电池反例:件不在装配集拒绝(禁自动替选——零副作用)〔专长批 V9·秘宝批换主语〕")
a._attunement = ["incense_stick"] # 注入装配集(incense_stick=新目录 active_charged)
a.attune_charges = {"incense_stick": 1}
Kit.check_quiet(a.choose_battery_target("incense_stick") and int(a.attune_charges["incense_stick"]) == 2,
a.run_ledger.attune_charges = {"incense_stick": 1} # 迭代 27 T3——四账住 RunLedger
Kit.check_quiet(a.choose_battery_target("incense_stick") and int(a.run_ledger.attune_charges["incense_stick"]) == 2,
"电池正例:玩家点选 incense_stick→充能账 +1(跨层写 attune_charges)〔专长批 V9·秘宝批换主语〕")
Kit.check_quiet(a.battery_pending() == 0, "电池:分配后待账清零〔专长批 V9〕")
@@ -82,14 +82,14 @@ func _init() -> void:
# V10-2 行动点上限归属性轴:ap kind 走加算区第四轴
a._curio_deck = [{"kind": "ap", "tier": "rare"}]
a._curio_pending = {"candidates": a._curio_deck.duplicate()}
var ap_bonus_before := int(a.bonus.get("ap", 0))
Kit.check_quiet(a.pick_curio("ap", "rare") and int(a.bonus.get("ap", 0)) == ap_bonus_before + int(db.adventure.curio_value("ap", "rare")),
var ap_bonus_before := int(a.run_ledger.bonus.get("ap", 0))
Kit.check_quiet(a.pick_curio("ap", "rare") and int(a.run_ledger.bonus.get("ap", 0)) == ap_bonus_before + int(db.adventure.curio_value("ap", "rare")),
"行动点上限归属性轴:ap 兑付写加算区第四轴(bonus.ap 承载)〔专长批 V10〕")
# V16——断点扩容往返:新账本随断点快照/续玩回填(breakpoint_resume_test P5 同构)
var sm = load("res://core/save_manager.gd").new("user://_feat_vouchers_bp.json")
sm.load_from_disk()
a.adventure_counters = {"pain_layers": 3, "twin_digs": 5}
a.run_ledger.adventure_counters = {"pain_layers": 3, "twin_digs": 5} # 迭代 27 T3——四账住 RunLedger
a._refresh_stock = 2
a._battery_pending = 1
a.set_save_manager(sm)
@@ -100,7 +100,7 @@ func _init() -> void:
"V16:新账本三件入断点快照(adventure_counters/refresh_stock/battery_pending)〔专长批 V16〕")
var b2 = load("res://core/adventure_runner.gd").new(db, load("res://core/rng_service.gd").new())
Kit.check_quiet(b2.resume_adventure(bp16.duplicate(), {}), "V16 前置:续玩受理")
Kit.check_quiet(int(b2.adventure_counters.get("pain_layers", -1)) == 3 and b2.refresh_stock() == 2 and b2.battery_pending() == 1,
Kit.check_quiet(int(b2.run_ledger.adventure_counters.get("pain_layers", -1)) == 3 and b2.refresh_stock() == 2 and b2.battery_pending() == 1,
"V16:续玩回填逐项一致(计数恢复——跨战账不丢)〔专长批 V16〕")
sm.clear_breakpoint()
@@ -269,12 +269,13 @@ func _init() -> void:
Kit.check_quiet(ob12b.minesweeper.flag_range_free == false,
"信标网络反例:未装配旗可达豁免=缺省 false(零装配零扰动)")
# ⑬ 真视使用计数链(受理成功恰计一次——vision_counter 共享 dict)
# ⑬ 真视使用计数链(受理成功恰计一次——RunLedger 单类持账;迭代 27 T3 换代)
var rng13 = load("res://core/rng_service.gd").new(); rng13.set_master_seed(321)
var ob13 = orch_s.new(db, rng13)
var vc13 := {"used": 0}
Kit.check_quiet(ob13.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(db.hero.max_hp), "attunement": ["incense_stick"], "vision_counter": vc13}),
"计数链:装配起战(vision_counter 共享 dict 携带)")
var lg13 = load("res://core/run_ledger.gd").new()
lg13.vision_counter = {"used": 0}
Kit.check_quiet(ob13.begin_battle({"level_index": 1, "node_depth": 0, "hero_hp": int(db.hero.max_hp), "attunement": ["incense_stick"], "ledger": lg13}),
"计数链:装配起战(RunLedger 携带)")
var inv13 = load("res://core/treasure_items.gd").new(db)
var rec13: Dictionary = inv13.add_item("incense_stick", "attunement", Vector2i(-1, -1), 0)
ob13.treasure_inventory = inv13
@@ -282,7 +283,7 @@ func _init() -> void:
var tgt13: Vector2i = _first_closed_safe(ob13)
if tgt13 != Vector2i(-9, -9):
ob13.use_treasure(h13, tgt13)
Kit.check_quiet(int(vc13.get("used", 0)) == 1,
Kit.check_quiet(int(lg13.vision_counter.get("used", 0)) == 1,
"计数链正常:受理成功恰 +1(信标网络解锁行为条件数据源)")
# ⑭ 装配不可变(迭代 22 秘宝批 T6——V6:冒险全程装配快照三面同源且零写口——