拆件批v1.3-B1(主角账领域拆分): hero_ledger.gd 整件退役→三新件按领域各归各账——hero_stats.gd(生命/特性/类型轴/生效公式与回血封顶单点/续玩钳制收口 clamp_hp_to_resume_cap/断点片段 hero_hp+relics 两键,构造注入 GainJournal 只读引用消费加算汇总)、gp_wallet.gd(gp 单写原语+片段 gp 键)、gain_journal.gd(获得记录三层+三通道 gain_bonus 单写原语+购买档数/钥石/真视+reset_adventure_accounts+片段六键,record_gain 转私有,_record_gain 词表不变);断点拼盘改三片段并集(BREAKPOINT_FIELDS 28 键序不变,_resume_ledger 三还原各取各键,日记缺键汇总直载/在档推导比对拒载逐字承现);消费方改址——adventure_runner(建件三引用+件出口 hero()→stats()/wallet()/journal()/deck(),start/restart 三件先日记后钱包再置满同序,_resume_params 钳制改 clamp_hp_to_resume_cap,载荷_base 随附钱包读数——停点件零钱包依赖)、level_runner(ctx hero→stats/wallet/journal 三键,私有三件同源成对自建,gp/hero_hp 属性改指三件,effective_ap_bonus→journal,hero()→stats()+journal() 出口,_bind_shop refs 换代)、shop_session(refs wallet+journal,BONUS_AXES 归 GainJournal)、battle_orchestrator(encounter "hero"→"journal" 键+_hero 类型 GainJournal)、curio_stop(构造参 stats+journal,兑付落账 split 指针,头注换代清 HeroLedger 表述)、呈现/探针/模拟六文件 12 处读面改址、测试六文件改址(hero_ledger_test 重写为三件测试——文件名与 manifest 行不变,新增 hs1 零引用源码断言)。验收:全量套件除 round_flow EV 锚 goblin 已知预期红外全绿;bp 对拍 292dumps×28 键 mismatch=0;冒烟 17 项 0 失败〔领域拆分批 V1〕
This commit is contained in:
1 parent
e40aa6f8c1
commit
fde14f1c1c
28 files changed
+679
-532
No files matched your search
@@ -17,7 +17,9 @@ var _state: State = State.IDLE
|
||||
var state: String: # 外部契约面(只读——外部零写点实证;词表 "idle"/"running"/"settling")
|
||||
get:
|
||||
return State.keys()[_state].to_lower()
|
||||
var _hero: HeroLedger # 主角实体账(生命/钱包/加算区/类型轴/特性集/钥石/真视——拆件批 T1 建件)
|
||||
var _stats: HeroStats # 主角数值账(生命/类型轴/特性集——公式单点,拆件批 T1 建件、领域拆分批三件化)
|
||||
var _wallet: GpWallet # GP 钱包件(单写原语——LevelRunner 与 ShopSession 读写单点)
|
||||
var _journal: GainJournal # 加算日记件(获得记录三层/钥石/真视/已购档单写原语)
|
||||
var adventure_counters: Dictionary[Variant, Variant] = {} # 冒险桶(效果引擎 adv_ 计数器宿主字典——跨战持久)
|
||||
|
||||
var level_index := 0 # 当前关卡序号(1 起)
|
||||
@@ -45,16 +47,30 @@ var _shop_mode := "legacy" # 商店模式("legacy"=固定三件
|
||||
func _init(db_ref: ConfigDb, rng_ref: RngServiceCore) -> void:
|
||||
db = db_ref
|
||||
rng = rng_ref
|
||||
_hero = HeroLedger.new(db, {})
|
||||
_journal = GainJournal.new()
|
||||
_wallet = GpWallet.new()
|
||||
_stats = HeroStats.new(db, {}, _journal) # 数值账消费日记汇总(同源单件注入)
|
||||
_curio = CurioDeck.new(db, rng)
|
||||
_stop = CurioStop.new(db, _curio, _hero, _snapshot_breakpoint)
|
||||
_stop = CurioStop.new(db, _curio, _stats, _journal, _snapshot_breakpoint)
|
||||
_loadout = AttuneLoadout.new(db, _attunement)
|
||||
adventure_inventory = TreasureItems.new(db)
|
||||
|
||||
|
||||
# 件出口(组件交出非委托壳——呈现/测量面取主角账单点;拆件批接口块)
|
||||
func hero() -> HeroLedger:
|
||||
return _hero
|
||||
# 件出口(组件交出非委托壳——呈现/测量面取主角账三件与令牌池单点;领域拆分批接口块)
|
||||
func stats() -> HeroStats:
|
||||
return _stats
|
||||
|
||||
|
||||
func wallet() -> GpWallet:
|
||||
return _wallet
|
||||
|
||||
|
||||
func journal() -> GainJournal:
|
||||
return _journal
|
||||
|
||||
|
||||
func deck() -> CurioDeck:
|
||||
return _curio
|
||||
|
||||
|
||||
# 件出口(停点件——呈现/测量面取停点编排单点;拆件批接口块)
|
||||
@@ -74,10 +90,12 @@ func start_adventure(seed_val: int, params: Dictionary = {}) -> bool:
|
||||
return false
|
||||
master_seed = seed_val
|
||||
rng.new_adventure(seed_val)
|
||||
_hero.rebase_override(params.get("hero_override", {})) # 永久强化 flat 注入(规范化归主角账)
|
||||
_hero.reset_adventure_accounts() # 账面重置(钱包/加算区/已购档/钥石/日记/特性清零+生命置满基础上限)
|
||||
_hero.attack_type = String(params.get("attack_type", "")) # 两根类型轴快照(契约 8 锁死:开局后不随存档选中变化)
|
||||
_hero.armor_type = String(params.get("armor_type", ""))
|
||||
_stats.rebase_override(params.get("hero_override", {})) # 永久强化 flat 注入(规范化归数值账)
|
||||
_journal.reset_adventure_accounts() # 日记域账面清零(汇总/明细/已购档/钥石/真视——先于置满)
|
||||
_wallet.clear_wallet() # 钱包清零
|
||||
_stats.reset_adventure_accounts() # 生命置满基础上限+特性持有集清零(口径不含加算区——日记先清)
|
||||
_stats.attack_type = String(params.get("attack_type", "")) # 两根类型轴快照(契约 8 锁死:开局后不随存档选中变化)
|
||||
_stats.armor_type = String(params.get("armor_type", ""))
|
||||
summary = {}
|
||||
_reset_curio_state()
|
||||
levels_total = db.level_count() # 表访问收口(关数读 level 表行数)
|
||||
@@ -104,7 +122,7 @@ func start_adventure(seed_val: int, params: Dictionary = {}) -> bool:
|
||||
_tree_rules = params.get("tree_rules", []) if params.get("tree_rules", []) is Array else [] # A/B 面 rule 键集
|
||||
if not feat_seed.is_empty():
|
||||
for r in feat_seed:
|
||||
_hero.feats.append(String(r))
|
||||
_stats.feats.append(String(r))
|
||||
_state = State.RUNNING
|
||||
return _start_current_level()
|
||||
|
||||
@@ -153,10 +171,12 @@ func resume_adventure(bp: Dictionary, params: Dictionary = {}) -> bool:
|
||||
return _start_current_level()
|
||||
|
||||
|
||||
# 续玩账面回填(生命/钱包/加算区/已购档/钥石/逐杀明细/特性/真视——主角账片段单点;
|
||||
# 续玩账面回填(生命/特性/钱包/加算区/已购档/钥石/逐杀明细/真视——主角账三件片段各还原各键;
|
||||
# bonus 子键 clamp 类夹 ≥0;日记在档=推导比对载入、缺键=旧档汇总直载)
|
||||
func _resume_ledger(bp: Dictionary, params: Dictionary) -> void:
|
||||
_hero.restore_fragment(bp, params)
|
||||
_stats.restore_fragment(bp, params)
|
||||
_wallet.restore_fragment(bp, params)
|
||||
_journal.restore_fragment(bp, params)
|
||||
summary = {}
|
||||
levels_total = db.level_count() # 表访问收口(关数读 level 表行数)
|
||||
level_index = int(bp.get("level_index", 1))
|
||||
@@ -183,22 +203,21 @@ func _resume_curio_state(bp: Dictionary) -> void:
|
||||
rtok["feat_id"] = String(tok.get("feat_id", "")) # relic 令牌 feat_id 随还原
|
||||
restored.append(rtok)
|
||||
_curio.deck = restored
|
||||
# 特性持有集还原(缺键 = 旧版断点防御空集——主角账字段单点)
|
||||
_hero.feats = []
|
||||
# 特性持有集还原(缺键 = 旧版断点防御空集——主角数值账字段单点)
|
||||
_stats.feats = []
|
||||
for r in (bp.get("relics", []) as Array):
|
||||
_hero.feats.append(String(r))
|
||||
_stats.feats.append(String(r))
|
||||
|
||||
# 续玩参数面回填(同 start_adventure 参数面;生命账本越界钳制在此落——clamp 类)
|
||||
func _resume_params(bp: Dictionary, params: Dictionary) -> void:
|
||||
_hero.rebase_override(params.get("hero_override", {})) # 续玩参数面同 start_adventure(规范化归主角账)
|
||||
_hero.attack_type = String(params.get("attack_type", "")) # 续玩参数面同 start_adventure(账号层选中态随 resume 重注入)
|
||||
_hero.armor_type = String(params.get("armor_type", ""))
|
||||
_stats.rebase_override(params.get("hero_override", {})) # 续玩参数面同 start_adventure(规范化归数值账)
|
||||
_stats.attack_type = String(params.get("attack_type", "")) # 续玩参数面同 start_adventure(账号层选中态随 resume 重注入)
|
||||
_stats.armor_type = String(params.get("armor_type", ""))
|
||||
# 生命账本越界钳制(T17——spawn 守卫 EC16 免疫):断点可能带出高于生效上限的账本值
|
||||
# (如调试浮窗调高期写出的值,实例:hero_hp=28 > 基础 26)——恢复后钳到生效上限,
|
||||
# 否则首战 spawn「hero_hp 入参越界」拒收 → 「敌人系统 spawn 被拒」fatal。上限 = 表值+永久
|
||||
# 强化 flat 后乘调试浮窗 pct(保守口径不含加算区——与原钳制式逐字同,加算区恢复后其余战斗照常)。
|
||||
_hero.hero_hp = mini(_hero.hero_hp, maxi(1,
|
||||
int(round(float(int(db.hero.max_hp) + int(_hero.base_override_flat().get("max_hp", 0))) * (100.0 + float(_hero.debug_hp_pct())) / 100.0))))
|
||||
#(如调试浮窗调高期写出的值,实例:hero_hp=28 > 基础 26)——恢复后钳到生效上限,
|
||||
# 否则首战 spawn「hero_hp 入参越界」拒收 → 「敌人系统 spawn 被拒」fatal。钳制式单点归
|
||||
# 数值账 clamp_hp_to_resume_cap(保守口径不含加算区——与原钳制式逐字同)。
|
||||
_stats.clamp_hp_to_resume_cap(int(db.hero.max_hp))
|
||||
_shop_mode = "pool" if String(params.get("shop_mode", "legacy")) == "pool" else "legacy" # 续玩参数面同 start_adventure(缺省 legacy)
|
||||
_treasure_unlocked = params.get("treasure_unlocked", {}) if params.get("treasure_unlocked", {}) is Dictionary else {}
|
||||
_attunement = params.get("attunement", []) if params.get("attunement", []) is Array else [] # additive
|
||||
@@ -219,20 +238,20 @@ func _reset_curio_state() -> void:
|
||||
_curio.reset() # 池与件获取计数(池半归件;停点态归停点件下行清理)
|
||||
_stop.reset_adventure_state()
|
||||
_loadout_seeded = false
|
||||
_hero.feats = []
|
||||
_stats.feats = []
|
||||
adventure_counters = {}
|
||||
|
||||
|
||||
# 调试浮窗百分比通道(测试工具覆盖——每关新 runner 都要应用;正式侧归元进度。单点归主角账)
|
||||
# 调试浮窗百分比通道(测试工具覆盖——每关新 runner 都要应用;正式侧归元进度。单点归数值账)
|
||||
func set_hero_override(atk_pct: int, hp_pct: int) -> void:
|
||||
_hero.set_debug_override(atk_pct, hp_pct)
|
||||
_stats.set_debug_override(atk_pct, hp_pct)
|
||||
if _runner != null:
|
||||
_runner.set_hero_override(atk_pct, hp_pct)
|
||||
|
||||
|
||||
# 冒险账本侧生效上限(公式单点归主角账——置满/回血封顶与战斗内上限同式同源)
|
||||
# 冒险账本侧生效上限(公式单点归数值账——置满/回血封顶与战斗内上限同式同源)
|
||||
func effective_max_hp() -> int:
|
||||
return _hero.effective_max_hp()
|
||||
return _stats.effective_max_hp()
|
||||
|
||||
|
||||
# 断点承载注入(组合根冒险开始时调用;模拟/冒烟不注入 = 断点面整体静默)
|
||||
@@ -245,9 +264,9 @@ func runner() -> LevelRunner:
|
||||
return _runner
|
||||
|
||||
|
||||
# 接口③治疗封顶回报执行体(恢复点节点兑付——按比例回血并封顶)。算术宿主 = HeroLedger.rest_heal(公式单点)
|
||||
# 接口③治疗封顶回报执行体(恢复点节点兑付——按比例回血并封顶)。算术宿主 = HeroStats.rest_heal(公式单点)
|
||||
func apply_rest(pct: int, hp: int, max_hp: int) -> int:
|
||||
return HeroLedger.rest_heal(pct, hp, max_hp)
|
||||
return HeroStats.rest_heal(pct, hp, max_hp)
|
||||
|
||||
|
||||
# 大奖励确认 → 进下一关(仅兑付后受理——零自动推进的冒险级停点;三选一未兑付拒绝推进)
|
||||
@@ -275,7 +294,7 @@ func _find_token(candidates: Array, kind: String, tier: String, feat_id: String
|
||||
# 玩家点选兑付(state 守卫留应用层——编排归停点件;呈现层直调面 T5 改 stop())
|
||||
# 特性持有集读面(效果接线/求值/摘要唯一取数口——副本防外部改写)
|
||||
func feats_held() -> Array:
|
||||
return _hero.feats_held()
|
||||
return _stats.feats_held()
|
||||
|
||||
|
||||
# ---- 商店共享池消费面(纯池——库存=牌库剩余令牌)----
|
||||
@@ -346,7 +365,7 @@ func _boss_keystone_drop(li: int) -> void:
|
||||
first = not _save_manager.boss_first_kill_marked(li)
|
||||
var row: Dictionary[Variant, Variant] = db.meta_boss_keystone_row(li)
|
||||
var amount: int = int(row.get("first_kill", 0)) if first else int(row.get("repeat_kill", 0))
|
||||
_hero.record_keystone_drop({"level": li, "first": first, "amount": amount}) # 逐杀明细+累计单写原语
|
||||
_journal.record_keystone_drop({"level": li, "first": first, "amount": amount}) # 逐杀明细+累计单写原语
|
||||
|
||||
|
||||
# 主动放弃(仅非战斗期受理——战斗域单事务在飞;与失败同型结算,已获大奖励不追回。
|
||||
@@ -371,7 +390,9 @@ func _start_current_level() -> bool:
|
||||
var pool_wiring: Dictionary[Variant, Variant] = {"deck": _curio.deck, "consume": _stop.consume_pool_purchase,
|
||||
"ticket": _curio.feat_ticket_consider, "cap": _curio.cap_ok} if _shop_mode == "pool" else {}
|
||||
var ctx: Dictionary[Variant, Variant] = {
|
||||
"hero": _hero,
|
||||
"stats": _stats,
|
||||
"wallet": _wallet,
|
||||
"journal": _journal,
|
||||
"loadout": _loadout,
|
||||
"adv_bucket": adventure_counters,
|
||||
"treasure_inventory": adventure_inventory,
|
||||
@@ -379,8 +400,8 @@ func _start_current_level() -> bool:
|
||||
"tree_rules": _tree_rules,
|
||||
"shop_mode": _shop_mode,
|
||||
"treasure_unlocked": _treasure_unlocked,
|
||||
"hero_attack_type": _hero.attack_type,
|
||||
"hero_armor_type": _hero.armor_type,
|
||||
"hero_attack_type": _stats.attack_type,
|
||||
"hero_armor_type": _stats.armor_type,
|
||||
"voucher_rap": int(outbox.get("rap", 0)),
|
||||
"voucher_time_sand": int(outbox.get("time_sand", 0)),
|
||||
"pool_wiring": pool_wiring,
|
||||
@@ -395,7 +416,7 @@ func _start_current_level() -> bool:
|
||||
resume_state = {"node_id": int(_bp_read("node_id", _resume_bp, -1)),
|
||||
"visited_ids": _bp_read("visited_ids", _resume_bp, []) as Array}
|
||||
# 接口①开始关卡:生命经主角账共享交接(账面当前值即开局生命——冒险开始置满 / 大奖励回满已写好);
|
||||
# 主角账与冒险桶注入(set_hero——T1 过渡面,T3 收构造注入)。
|
||||
# 主角账三件与冒险桶注入(构造注入 ctx——拆件批 T3 收口形态)。
|
||||
# defer_entry=true 起每关(含首关)——先 emit level_started(呈现层在
|
||||
# 该回调重取 runner 实例),后入口候选呈现;顺序反了选路口会被呈现层的 runner 空防御静默丢弃。
|
||||
# 呈现零 RNG 消耗、pick 走同一 _enter_node——测量面逐位零漂移。
|
||||
@@ -439,7 +460,7 @@ func _on_level_finished(payload: Dictionary) -> void:
|
||||
_last_level_payload = payload.duplicate(true)
|
||||
var result := String(payload.get("result", ""))
|
||||
if result == "defeat":
|
||||
_hero.hero_hp = 0 # 倒下记 0(生命账本战后回写口径)
|
||||
_stats.hero_hp = 0 # 倒下记 0(生命账本战后回写口径)
|
||||
_settle("failed")
|
||||
return
|
||||
if result != "victory":
|
||||
@@ -452,9 +473,11 @@ func _on_level_finished(payload: Dictionary) -> void:
|
||||
# 关卡完成兑付(非末关恰一次;三层奖励框架):编排归停点件——推进位先于 emit 置位
|
||||
#(信号同步派发——处理器内立即确认时 _pending_next_level 必须已就位);
|
||||
# 停点件内部分回血先行 → 加权洗牌掷 3 → 三选一停点(顺序即契约——回血按当刻账本与上限结算,
|
||||
# 选择停点零自动推进)
|
||||
# 选择停点零自动推进)。载荷_base 随附钱包读数(停点件零钱包依赖——GP 件入账回调仍走 grant_curio_gp)
|
||||
_pending_next_level = true
|
||||
_stop.open_level_clear(payload)
|
||||
var stop_base: Dictionary[Variant, Variant] = payload.duplicate(true)
|
||||
stop_base["gp"] = _wallet.gp
|
||||
_stop.open_level_clear(stop_base)
|
||||
return
|
||||
# 末关的关卡完成:不发三选一与部分回血(没有下一战可受益)、Boss 钥石照常入账——冒险完成结算
|
||||
_settle("completed")
|
||||
@@ -467,13 +490,13 @@ func _settle(result: String) -> void:
|
||||
"cleared": result == "completed",
|
||||
"levels_cleared": levels_total if result == "completed" else level_index - 1,
|
||||
"stopped_at": 0 if result == "completed" else level_index,
|
||||
"keystone_total": _hero.keystone_gained(),
|
||||
"keystone_total": _journal.keystone_gained(),
|
||||
"master_seed": master_seed,
|
||||
"aux_cleared_last": _last_treasure_cleared, # additive 扩签(末关清空反馈;非末关走 bonus 载荷)
|
||||
"keystone_drops": _hero.keystone_drop_log(), # additive 扩签(逐杀掉落明细;settle 入账明细/复盘归因数据源)
|
||||
"vision_used_delta": _hero.vision_used(), # additive 扩签(真视使用本局计数;settle 聚合入档)
|
||||
"keystone_drops": _journal.keystone_drop_log(), # additive 扩签(逐杀掉落明细;settle 入账明细/复盘归因数据源)
|
||||
"vision_used_delta": _journal.vision_used(), # additive 扩签(真视使用本局计数;settle 聚合入档)
|
||||
"pool_stock": _pool_stock_snapshot(), # additive 扩签(终局池读数:清账前快照,商店买走 vs 奖励领走 vs 枯竭的终局面)
|
||||
"relics": _hero.feats_held(), # additive 扩签(特性终局持有集:清账前快照,成型判读取数面)
|
||||
"relics": _stats.feats_held(), # additive 扩签(特性终局持有集:清账前快照,成型判读取数面)
|
||||
}
|
||||
# 败退明细(数值验证工具取数面——tools/balance_verifier.py 止步节点分布数据源;
|
||||
# 仅失败局附加,键缺省 = 未败退,既有五件事消费方零感知)
|
||||
@@ -551,7 +574,9 @@ func _snapshot_breakpoint() -> void:
|
||||
|
||||
# 断点写侧取值(键集以 BREAKPOINT_FIELDS 为准——未登记键即取值越界,fail-fast)
|
||||
func _bp_parts() -> Dictionary[Variant, Variant]:
|
||||
var hero_frag: Dictionary[Variant, Variant] = _hero.breakpoint_fragment()
|
||||
var stats_frag: Dictionary[Variant, Variant] = _stats.breakpoint_fragment()
|
||||
var wallet_frag: Dictionary[Variant, Variant] = _wallet.breakpoint_fragment()
|
||||
var journal_frag: Dictionary[Variant, Variant] = _journal.breakpoint_fragment()
|
||||
var stop_frag: Dictionary[Variant, Variant] = _stop.breakpoint_fragment()
|
||||
var level_frag: Dictionary[Variant, Variant] = _runner.breakpoint_fragment() if _runner != null else {
|
||||
"node_id": -1, "visited_ids": [] as Array, "aux_items": [] as Array,
|
||||
@@ -560,32 +585,32 @@ func _bp_parts() -> Dictionary[Variant, Variant]:
|
||||
var parts: Dictionary[Variant, Variant] = {
|
||||
"level_index": level_index,
|
||||
"node_id": int(level_frag.get("node_id", -1)),
|
||||
"hero_hp": int(hero_frag.get("hero_hp", 0)),
|
||||
"bonus": hero_frag.get("bonus", {}),
|
||||
"gp": int(hero_frag.get("gp", 0)),
|
||||
"shop_purchased": hero_frag.get("shop_purchased", {}),
|
||||
"hero_hp": int(stats_frag.get("hero_hp", 0)),
|
||||
"bonus": journal_frag.get("bonus", {}),
|
||||
"gp": int(wallet_frag.get("gp", 0)),
|
||||
"shop_purchased": journal_frag.get("shop_purchased", {}),
|
||||
"shop_shelf": level_frag.get("shop_shelf", []), # 货架入断点(离开店/非店停点 = 空架合法态)
|
||||
"shop_visit_buys": int(level_frag.get("shop_visit_buys", 0)), # 本次进店已购次数(A 链定价输入)
|
||||
"attunement_charges": (_loadout.breakpoint_fragment(_runner.treasure_inventory) if _runner != null and _runner.treasure_inventory != null else {"attunement_charges": {}}).get("attunement_charges", {}), # 同调主动件充能余量随断点(行派生——save v4 域键名策略不变)
|
||||
"graph_gen_v2": 1, # 生成图换代代差标记(缺键 = 换代前旧断点 → resume 显式拒绝)
|
||||
"master_seed": master_seed,
|
||||
"rng_counter": rng.counter(),
|
||||
"keystone": int(hero_frag.get("keystone", 0)),
|
||||
"keystone": int(journal_frag.get("keystone", 0)),
|
||||
"visited_ids": level_frag.get("visited_ids", []),
|
||||
"aux_items": level_frag.get("aux_items", []),
|
||||
"bonus_taken": _curio.taken.duplicate(true), # 三选一件获取次数(kind 维度派生账本——断点附随件与读数承载)
|
||||
"bonus_deck": _curio.deck.duplicate(true), # 令牌池余库(TP0 v2.2——池消耗即上限,续玩余库逐枚还原)
|
||||
"relics": hero_frag.get("relics", []), # 特性持有集(局内随机渠道获得态续玩防丢失)
|
||||
"relics": stats_frag.get("relics", []), # 特性持有集(局内随机渠道获得态续玩防丢失)
|
||||
"bonus_pending": stop_frag.get("bonus_pending", {}), # 三选一停点态(空 = 无停点——选择停点可中断契约)
|
||||
"feat_ticket_pity": int(stop_frag.get("feat_ticket_pity", 0)), # T5 专长凭证保底计数(扩列向后兼容——旧档缺键缺省 0)
|
||||
"feat_ticket_sold": int(stop_frag.get("feat_ticket_sold", 0)), # T5 专长凭证限购计数(同上)
|
||||
"adventure_counters": adventure_counters.duplicate(true), # adventure 域计数器随断点(续玩跨战账不丢——桶归宿主字典)
|
||||
"vision_counter_used": int(hero_frag.get("vision_counter_used", 0)), # 真视使用计数随断点(续玩跨战账不丢)
|
||||
"vision_counter_used": int(journal_frag.get("vision_counter_used", 0)), # 真视使用计数随断点(续玩跨战账不丢)
|
||||
"refresh_stock": int(stop_frag.get("refresh_stock", 0)), # 刷新存量账随断点
|
||||
"attune_refresh_y": int(stop_frag.get("attune_refresh_y", 0)), # Y 冒险周期池余量随断点(扩列向后兼容——旧档缺键回退参数面)
|
||||
"bonus_result": stop_frag.get("bonus_result", {}), # 已兑付待推进态(空 = 无——中断续玩不重兑付)
|
||||
"keystone_drops": hero_frag.get("keystone_drops", []), # 逐杀掉落明细(摘要归因续接)
|
||||
"gain_journal": hero_frag.get("gain_journal", {}), # 获得日记(唯一声明的断点扩列——日记为正主)
|
||||
"keystone_drops": journal_frag.get("keystone_drops", []), # 逐杀掉落明细(摘要归因续接)
|
||||
"gain_journal": journal_frag.get("gain_journal", {}), # 获得日记(唯一声明的断点扩列——日记为现行事实源)
|
||||
}
|
||||
# 拼盘完整性自断言(fail-fast——片段并集与登记键集不符即中止落盘)
|
||||
var stray: Array[Variant] = []
|
||||
|
||||
Reference in new issue
Block a user