副卡(配装批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
+14
-24
@@ -30,6 +30,7 @@ var _external := false # 冒险模式标记(钱
|
||||
# 主角账引用(拆件批 T1 过渡面:冒险模式经 set_hero 注入共享实体账、单关模式 _init 自建私有账;
|
||||
# 构造注入收口归 T3 ctx 面——后置 setter 随构造注入一并退役)
|
||||
var _hero: HeroLedger = HeroLedger.new(null, {}) # 直构缺省私有账(db 随 _init 补)
|
||||
var loadout = null # 同调配装件(构造注入;直构=单关零件)
|
||||
var _adv_bucket: Dictionary[Variant, Variant] = {} # 冒险桶(效果引擎 adv_ 计数器宿主字典——冒险模式随 hero 注入;单关=本实例自有)
|
||||
# hero_hp / gp 属性化(既有读写点零改动——值类型经属性落主角账)
|
||||
var hero_hp: int:
|
||||
@@ -62,7 +63,7 @@ var _generator # 参数化长图生成器(惰性建——NodeMapGenerator
|
||||
# 构造注入一次给齐(拆件批 T3——后置 setter 群与商店重绑机制退役;_bind_shop 全仓仅本处构造调用)。
|
||||
# ctx 键(冒险模式由 AdventureRunner._start_current_level 组包;缺省空字典 = 单关测试模式:
|
||||
# 私有主角账自建〔空 override〕、充能账瘦壳自建、冒险桶本实例自有、pool 模式零注入):
|
||||
# hero:HeroLedger(共享主角账——活引用)/ledger:RunLedger(充能账瘦壳)/adv_bucket:Dictionary(冒险桶宿主字典)
|
||||
# hero:HeroLedger(共享主角账——活引用)/loadout:AttuneLoadout(同调配装件)/adv_bucket:Dictionary(冒险桶宿主字典)
|
||||
# attunement:Array(同调装配集——活引用)/tree_rules:Array(树 rule 键集——活引用)/shop_mode:String("pool" 才注入池面)
|
||||
# treasure_unlocked:Dictionary/hero_attack_type:String/hero_armor_type:String
|
||||
# voucher_rap:int/voucher_time_sand:int(凭证出箱注入面)
|
||||
@@ -75,10 +76,12 @@ func _init(db_ref: ConfigDb, rng_ref: RngServiceCore, ctx: Dictionary = {}) -> v
|
||||
_feats = _hero.feats # 特性集活引用注入(关内兑付 relic 当关生效——契约 6)
|
||||
else:
|
||||
_hero.db = db # 直构私有账补表引用(单关模式——实例不重建,值重置走 start_level)
|
||||
if ctx.get("ledger", null) is RunLedger:
|
||||
run_ledger = ctx["ledger"]
|
||||
var loadout_ref: Variant = ctx.get("loadout", null)
|
||||
loadout = loadout_ref if loadout_ref is AttuneLoadout else null # 直构=单关零 loadout(充能面跳过)
|
||||
if ctx.get("adv_bucket", null) is Dictionary:
|
||||
_adv_bucket = ctx["adv_bucket"]
|
||||
if ctx.get("treasure_inventory", null) is TreasureItems:
|
||||
treasure_inventory = ctx["treasure_inventory"] # 冒险级库存共享(同调未用行跨关存活——单源化承载面)
|
||||
_treasure_unlocked = ctx.get("treasure_unlocked", {}) if ctx.get("treasure_unlocked", {}) is Dictionary else {}
|
||||
_attunement = ctx.get("attunement", []) if ctx.get("attunement", []) is Array else [] # 活引用注入(契约 6——禁快照)
|
||||
_tree_rules = ctx.get("tree_rules", []) if ctx.get("tree_rules", []) is Array else [] # 活引用注入
|
||||
@@ -522,7 +525,7 @@ func _start_battle(node: Dictionary) -> bool:
|
||||
"hero_armor_class": effective_ac(), "hero_ap_bonus": effective_ap_bonus(),
|
||||
"attack_type": _hero_attack_type, "armor_type": _hero_armor_type, # 两根类型轴(spawn 英雄快照;空串=锻造配置默认值回退)
|
||||
"attunement": _attunement,
|
||||
"ledger": run_ledger, # 充能账瘦壳下传(单引用键——bonus/真视/桶已迁主角账与冒险桶)
|
||||
"loadout": loadout, # 同调配装件下传(充能单源化——reset_cycle/consume_charge 消费面;直构 null=零装配)
|
||||
"hero": _hero, # 主角实体账下传(战末 bonus 汇入/真视计数单写原语消费面)
|
||||
"adv_bucket": _adv_bucket, # 冒险桶下传(效果引擎 adv_ 计数器宿主字典——跨战持久同一引用)
|
||||
"level_counters": level_counters, # 关卡桶下传(同关跨战共享引用、随本类 new 天然空)
|
||||
@@ -580,7 +583,13 @@ func _on_battle_finished(payload: Dictionary) -> void:
|
||||
var treasure_cleared := 0
|
||||
if treasure_inventory != null:
|
||||
treasure_cleared = treasure_inventory.inventory_count() # 快照计数(清空前——「剩余道具随关卡结束清空」可见反馈取数)
|
||||
treasure_inventory.reset() # 关卡末库存清空(无论输赢,幂等)
|
||||
# 关卡末库存清空(无论输赢,幂等)——单源化承载面:同调未用行跨关存活(充能唯一事实源,
|
||||
# 原字典轨跨关记忆的行化等价——已耗行作废不保留=C 区投影与剩余读数同构)
|
||||
var keep: Array[Variant] = []
|
||||
for r in treasure_inventory.snapshot_inventory():
|
||||
if String(r.get("source_class", "")) == "attunement" and not bool(r.get("used", false)):
|
||||
keep.append(r)
|
||||
treasure_inventory.restore_inventory(keep)
|
||||
level_finished.emit({"result": level_result, "hp": hp_left, "node_index": node_index,
|
||||
"node_id": _node_id(node), "node_type": String(node.get("type", "")),
|
||||
"aux_cleared": treasure_cleared}) # additive 扩签(不参与派生——node_map 扩签先例)
|
||||
@@ -641,10 +650,6 @@ func pick_next_node(node_id: int) -> bool:
|
||||
func current_battle() -> Variant:
|
||||
return _settlement
|
||||
|
||||
# 共享充能账瘦壳(RunLedger 瘦身后只承载 attune_charges;构造注入)
|
||||
var run_ledger: RunLedger = RunLedger.new()
|
||||
|
||||
|
||||
# 特性持有集(begin_battle enc.feats 求值面;**共享引用不复制**——关内奖励节点兑付的 relic 须当关生效)
|
||||
var _feats: Array[Variant] = []
|
||||
# 树 rule 键集(begin_battle enc.tree_rules 携带;Fork 激活侧 effects——构造注入活引用)
|
||||
@@ -666,21 +671,6 @@ var _voucher_rap := 0
|
||||
var _voucher_time_sand := 0
|
||||
|
||||
|
||||
# 同调主动件充能账骑库存面注入(账本住
|
||||
# RunLedger;差额注入防续玩双份——resume 路径 restore_inventory
|
||||
# 已含断点内 attune 记录)
|
||||
func sync_attune_inventory() -> void:
|
||||
var charges: Dictionary[Variant, Variant] = run_ledger.attune_charges
|
||||
if treasure_inventory == null:
|
||||
treasure_inventory = TreasureItems.new(db)
|
||||
for iid in charges:
|
||||
var existing := 0
|
||||
for r in treasure_inventory.snapshot_inventory():
|
||||
if String(r.item_id) == String(iid) and String(r.source_class) == "attunement" and not bool(r.used):
|
||||
existing += 1
|
||||
for i in range(maxi(0, int(charges[iid]) - existing)):
|
||||
treasure_inventory.add_item(String(iid), "attunement", Vector2i(-1, -1), 0)
|
||||
|
||||
# 三选一 GP 袋件入账(钱包收口的「奖励入账」入口;复用战斗完成同一入账原语,
|
||||
# wallet_changed 载荷带 source 供呈现归因)
|
||||
func grant_curio_gp(amount: int) -> void:
|
||||
|
||||
Reference in new issue
Block a user