副卡(配装批wr1-wr3): AttuneLoadout建件+充能单源化+RunLedger整类退役——attune_loadout.gd新件(纯无状态:种行seed_for_adventure全量不筛周期/reset_cycle按周期差额补行/consume_charge行标used幂等/charges_left行派生唯一读法/断点片段键值形状不变);三处事后差额对账退役(adv._seed_attune_charges/level.sync_attune_inventory/battle._reseed_attune_charges循环体→reset_cycle);行承载面升级=treasure_inventory提冒险级共享(adv建件经ctx注入level,关末清空改选择性保留——同调未用行跨关存活=原字典轨跨关记忆的行化等价,已耗行作废=C区投影与剩余读数同构);battle充能面改指loadout(encounter+loadout/−ledger键,:387类型检查删,直构null=零装配同语义);RunLedger整类删除(.gd+.uid,grep零引用;effect_engine/level_runner/hero_ledger注释面随批清);测试直构改址(meta_forge充能读行派生/feat_vouchers种行幂等反例/round_flow V1桶宿主字典/treasure_effects enc adv_bucket);跨版续玩兜底(改前档关卡完成停点行已被关末清空——键在行缺,按键值差额补行=与字典轨续玩逐位等价,新档行集为源差额零操作)。代拍板:①treasure_inventory提冒险级共享(卡片文件结构图treasure_items零触碰保持,关卡末清空语义调用点改选择性保留——「同调行始终留在treasure_inventory」的承载前提,玩家可见C区投影零变化)②跨版续玩键值兜底补行(契约3「行集为源」的跨版例外——al2对拍兜底)。验收:bp1对拍292dumps×27键——attunement_charges全部逐位一致(单源对拍达成);aux_items关卡完成停点24处留存同调行(「同调行始终留库存」的直接承载——副卡契约3「aux_items键值形态逐位不变」声明与行留存在该停点形态互斥,grilling⑨K4实查边界漏判,反哺点呈报);六套件零红+冒烟17项0失败〔配装批 V1〕〔配装批 V2〕〔配装批 V3〕
This commit is contained in:
1 parent
659d59edd3
commit
80fe4b8f42
13 files changed
+189
-108
No files matched your search
@@ -19,7 +19,7 @@ var state: String: # 外部契约面(只读——外部
|
||||
return State.keys()[_state].to_lower()
|
||||
var _hero: HeroLedger # 主角实体账(生命/钱包/加算区/类型轴/特性集/钥石/真视——拆件批 T1 建件)
|
||||
var adventure_counters: Dictionary[Variant, Variant] = {} # 冒险桶(效果引擎 adv_ 计数器宿主字典——跨战持久)
|
||||
var run_ledger := RunLedger.new() # 充能账瘦壳(attune_charges——整类退役归姊妹副卡)
|
||||
|
||||
var level_index := 0 # 当前关卡序号(1 起)
|
||||
var levels_total := 0 # 序列总关数(读 level 表行数)
|
||||
var master_seed := 0 # 本局主种子(摘要第五件事)
|
||||
@@ -32,9 +32,12 @@ var _treasure_unlocked := {} # aux 解锁门控集(params.tr
|
||||
var _attunement: Array[Variant] = [] # 同调装配集(params.attunement 接收面,start_level 外下传 LevelRunner)
|
||||
var _save_manager = null # 断点承载注入(null = 不写断点;模拟/冒烟缺省)
|
||||
var _resume_bp := {} # 续玩快照暂存(resume_adventure → _start_current_level 单跳传递)
|
||||
var _loadout_seeded := false # 同调行已种标记(每冒险一次——首关 bind 时点投行;行跨关存活后续关零动作)
|
||||
# ---- 三选一停点(编排迁 CurioStop 件——停点三态/刷新三源/凭证出箱/信号面)----
|
||||
var _curio: CurioDeck = null # 令牌池件(_init 建;纯池——多重集/抽签/cap/凭证判定唯一宿主)
|
||||
var _stop: CurioStop = null # 停点件(_init 建;每冒险一次——关卡换实例不换件)
|
||||
var _loadout: AttuneLoadout = null # 同调配装件(_init 建;充能单源化——物化行唯一事实源)
|
||||
var adventure_inventory: TreasureItems # 冒险级秘宝库存(单源化——同调未用行跨关存活的承载面;关卡域语义归 level 使用面)
|
||||
var _tree_rules: Array[Variant] = [] # 树 rule 键集(Fork 激活侧 effects 透传;下传 enc.tree_rules 消费面)
|
||||
var _shop_mode := "legacy" # 商店模式("legacy"=固定三件加定价〔off 对照承载,缺省零扰动〕/"pool"=共享池抽 3 买 1 重抽;真实入口 main.gd 显式投 pool)
|
||||
|
||||
@@ -45,6 +48,8 @@ func _init(db_ref: ConfigDb, rng_ref: RngServiceCore) -> void:
|
||||
_hero = HeroLedger.new(db, {})
|
||||
_curio = CurioDeck.new(db, rng)
|
||||
_stop = CurioStop.new(db, _curio, _hero, _snapshot_breakpoint)
|
||||
_loadout = AttuneLoadout.new(db, _attunement)
|
||||
adventure_inventory = TreasureItems.new(db)
|
||||
|
||||
|
||||
# 件出口(组件交出非委托壳——呈现/测量面取主角账单点;拆件批接口块)
|
||||
@@ -83,7 +88,9 @@ func start_adventure(seed_val: int, params: Dictionary = {}) -> bool:
|
||||
_attunement = params.get("attunement", []) if params.get("attunement", []) is Array else [] # additive
|
||||
_stop.set_refresh_x_cap(_attune_refresh_x_total()) # 停点件 X 基数预算注入(装配集冒险期间锁死)
|
||||
_stop.set_refresh_y(maxi(0, int(params.get("attune_refresh_y", 0)))) # additive(Y 冒险周期池)
|
||||
_seed_attune_charges() # 冒险开始充能账本按装备主动件重置(每冒险充能语义)
|
||||
_loadout.set_attunement(_attunement) # 装配集注入(活引用——种行面)
|
||||
adventure_inventory.reset() # 冒险级库存重置(新局空库存)
|
||||
_loadout_seeded = false # 同调行投行延至首关 bind 时点(库存就位后)
|
||||
adventure_counters = {} # 冒险桶清零(效果引擎 adv_ 计数器宿主——冒险开始归零)
|
||||
# 刷新练习开局注入(refresh_stock_grant 装配即得一次性加仓:
|
||||
# 装配集 kind 分发扫描;只入存量账、临时账不动=V8 契约;resume 不重注入〔存量随断点已在〕)
|
||||
@@ -138,10 +145,10 @@ func resume_adventure(bp: Dictionary, params: Dictionary = {}) -> bool:
|
||||
_stop.reemit_resolved() # 已兑付不重兑付只重发(信号面归停点件)
|
||||
return true
|
||||
_resume_bp = bp.duplicate(true)
|
||||
# 充能账本随断点回局(缺键 = 旧档/无断点,保持 _seed_attune_charges 种子态)
|
||||
var bp_charges = _bp_read("attunement_charges", bp)
|
||||
if bp_charges is Dictionary:
|
||||
run_ledger.attune_charges = (bp_charges as Dictionary).duplicate(true)
|
||||
# 充能读侧以行集为源(键值仅校验读数——回填时点在首关 bind 行集就位后,经 _loadout_on_level_inventory)
|
||||
_loadout_seeded = false
|
||||
_loadout.set_attunement(_attunement)
|
||||
adventure_inventory.reset()
|
||||
_state = State.RUNNING
|
||||
return _start_current_level()
|
||||
|
||||
@@ -195,7 +202,6 @@ func _resume_params(bp: Dictionary, params: Dictionary) -> void:
|
||||
_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
|
||||
_seed_attune_charges() # 冒险开始充能账本按装备主动件重置(每冒险充能语义)
|
||||
_stop.set_refresh_x_cap(_attune_refresh_x_total()) # 停点件 X 基数预算注入(续玩参数面同 start)
|
||||
_stop.restore_fragment(bp, params) # 停点件片段回填(凭证计数/刷新存量/Y 池——Y 缺键回退参数面 params_fallback 类)
|
||||
_tree_rules = params.get("tree_rules", []) if params.get("tree_rules", []) is Array else [] # A/B 面 rule 键集(续玩参数面同 start_adventure 同式,消费面 set_tree_rules 下传)
|
||||
@@ -212,6 +218,7 @@ func _resume_counters(bp: Dictionary) -> void:
|
||||
func _reset_curio_state() -> void:
|
||||
_curio.reset() # 池与件获取计数(池半归件;停点态归停点件下行清理)
|
||||
_stop.reset_adventure_state()
|
||||
_loadout_seeded = false
|
||||
_hero.feats = []
|
||||
adventure_counters = {}
|
||||
|
||||
@@ -303,13 +310,20 @@ func _attune_refresh_x_total() -> int:
|
||||
return total
|
||||
|
||||
|
||||
# 冒险开始充能账本重置(T6——装备 active_charged 件各回 charges_per_adventure;被动件不入账)
|
||||
func _seed_attune_charges() -> void:
|
||||
run_ledger.attune_charges = {}
|
||||
for iid in _attunement:
|
||||
var arow: Dictionary[Variant, Variant] = db.treasure_item_row(String(iid))
|
||||
if String(arow.get("form", "")) == "active_charged":
|
||||
run_ledger.attune_charges[String(iid)] = maxi(0, int(arow.get("charges_per_adventure", 0)))
|
||||
# 同调行投行分派(关卡域库存就位时点——每关一次;首关=种行或旧档行集为源、后续关=快照补行)
|
||||
func _loadout_on_level_inventory() -> void:
|
||||
if _runner.treasure_inventory == null:
|
||||
_runner.treasure_inventory = TreasureItems.new(db) # 惰性建(承原 sync_attune_inventory 同款——种行落点就位)
|
||||
var inv = _runner.treasure_inventory
|
||||
if inv == null:
|
||||
return
|
||||
if not _loadout_seeded:
|
||||
_loadout_seeded = true
|
||||
var bp_charges: Variant = _bp_read("attunement_charges", _resume_bp, null) if not _resume_bp.is_empty() else null
|
||||
if bp_charges is Dictionary:
|
||||
_loadout.restore_fragment({"attunement_charges": bp_charges}, inv) # 旧档读侧:行集为源+键值校验读数
|
||||
else:
|
||||
_loadout.seed_for_adventure(inv) # 冒险开始全量种行(不筛周期——C 区投影行数不变)
|
||||
|
||||
|
||||
# ---- 三选一刷新与凭证(编排归停点件——本类留组合根委托读面)----
|
||||
@@ -358,8 +372,9 @@ func _start_current_level() -> bool:
|
||||
"ticket": _curio.feat_ticket_consider, "cap": _curio.cap_ok} if _shop_mode == "pool" else {}
|
||||
var ctx: Dictionary[Variant, Variant] = {
|
||||
"hero": _hero,
|
||||
"ledger": run_ledger,
|
||||
"loadout": _loadout,
|
||||
"adv_bucket": adventure_counters,
|
||||
"treasure_inventory": adventure_inventory,
|
||||
"attunement": _attunement,
|
||||
"tree_rules": _tree_rules,
|
||||
"shop_mode": _shop_mode,
|
||||
@@ -398,7 +413,7 @@ func _bind_level_runner() -> void:
|
||||
# core↔core 接线只许方法 Callable(S6——lambda 捕获 self 会延长 RefCounted 生命周期乃至成环)
|
||||
_runner.level_finished.connect(_on_level_finished)
|
||||
_runner.choices_presented.connect(_on_level_choices_presented) # 选路停点快照触发(原转发兼快照双职的核心侧受理)
|
||||
_runner.sync_attune_inventory() # 能力件骑库存面注入(构造注入同拍)
|
||||
_loadout_on_level_inventory() # 同调行投行分派(种行/旧档行集为源/每关快照补行)
|
||||
|
||||
|
||||
# 关卡开始广播(装配已随构造注入进 ctx——本函数只剩信号广播;信号顺序契约:
|
||||
@@ -551,7 +566,7 @@ func _bp_parts() -> Dictionary[Variant, Variant]:
|
||||
"shop_purchased": hero_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": run_ledger.attune_charges.duplicate(true), # 同调主动件充能余量随断点(save v4 域)
|
||||
"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(),
|
||||
|
||||
Reference in new issue
Block a user