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%
52 lines
2.6 KiB
GDScript
52 lines
2.6 KiB
GDScript
class_name RunLedger
|
||
extends RefCounted
|
||
# 共享四本账显式承载(迭代 27 T3——审计 P1-4「共享可变字典跨三层:所有权名义单点、实际三处
|
||
# 可写」收口;裁点②甲 = 单类持四账)。
|
||
# 所有权:AdventureRunner 持有(开局构造、冒险全程唯一宿主);LevelRunner 经 set_run_ledger
|
||
# 下传并装配 encounter;战斗侧(BattleOrchestrator)经 encounter["ledger"] 拿本类引用,
|
||
# 只走下方 read/append 原语——战末 export/开局 seed 时点语义不变(确定性设计原样保留,
|
||
# 只把「函数签名上不可见的共享可变引用」换成签名可见的显式类)。
|
||
var attune_charges: Dictionary = {} # 同调主动件充能账(迭代 11 第①批 T6——use_treasure 扣减;断点随局回档)
|
||
var vision_counter: Dictionary = {} # 真视类使用计数(迭代 22 秘宝批 T3——冒险开始置 {"used":0};
|
||
# 缺省空 = 调试/单场战斗不计——原 enc 缺键守卫语义)
|
||
var adventure_counters: Dictionary = {} # adventure 域效果计数器(迭代 20 T6——rebuild 回灌/战末导出回写目标)
|
||
var bonus: Dictionary = {} # 统一冒险加算区(冒险开始置四轴零账——商店购买/三选一属性件/战末 bonus_delta 汇入)
|
||
|
||
|
||
# ---- 战斗侧原语(裁点②甲:战斗侧只拿 read/append 两族;宿主侧冒险/关卡域直读字段域) ----
|
||
|
||
func attune_charge_has(item_id: String) -> bool:
|
||
return attune_charges.has(item_id)
|
||
|
||
|
||
func attune_charge_set(item_id: String, value: int) -> void:
|
||
attune_charges[item_id] = value
|
||
|
||
|
||
func attune_charge_consume(item_id: String) -> void:
|
||
# 原编排器 use_treasure 扣减语义逐字(has 闸 + maxi(0,·) 下限)
|
||
if attune_charges.has(item_id):
|
||
attune_charges[item_id] = maxi(0, int(attune_charges[item_id]) - 1)
|
||
|
||
|
||
func vision_count_add(n: int) -> void:
|
||
vision_counter["used"] = int(vision_counter.get("used", 0)) + n
|
||
|
||
|
||
func counters_seed_snapshot() -> Dictionary:
|
||
return adventure_counters # 回灌读面(时点 = begin_battle rebuild 后——语义不变)
|
||
|
||
|
||
func counters_merge_export(exported: Dictionary) -> void:
|
||
# 战末回写(原编排器逐字语义:仅非空账参与、逐键覆写)
|
||
if adventure_counters.is_empty():
|
||
return
|
||
for cid in exported.keys():
|
||
adventure_counters[cid] = int(exported[cid])
|
||
|
||
|
||
func bonus_add_axis(axis: String, delta: int) -> void:
|
||
# 原编排器战末汇入逐字语义(has 闸——账外轴丢弃)
|
||
if bonus.has(axis):
|
||
bonus[axis] = int(bonus.get(axis, 0)) + delta
|