拆件批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:
DKChan committed 2026-10-27 08:10:08 +08:00
1 parent e40aa6f8c1
commit fde14f1c1c
28 files changed
+679 -532

No files matched your search

@@ -1,6 +1,6 @@
# 需求卡片:冒险域拆件与账本实体化批(AdventureRunner 真拆分·主卡)
- 版本:**v1.2**(v1.0→grilling 一轮「回炉」13 阻断全折入→v1.1→二轮「通过附残留 8 条」全折入→v1.2 定稿,复核记录见 §12)
- 版本:**v1.3**(v1.0→grilling 一轮「回炉」13 阻断全折入→v1.1→二轮「通过附残留 8 条」全折入→v1.2 定稿→v1.3 领域拆分修订,复核记录见 §12。v1.3=2026-10-27 领域拆分修订——用户裁结构指标=缺陷,闸 09「标准是尺」口径下的还债实现,用户令本会话讨论后修订)
- 来源:[待办清单](../待办清单.md)「AdventureRunner 职责真拆分」条目(2026-10-25 登记,P0,状态=文档设计已闭合+待写卡)(唯一事实源:[architecture](../design/engineering/architecture/architecture.md) v1.16 核心层 HeroLedger/CurioStop 新件行+「冒险域拆分定稿」节)
- 归属:`game/core/` 新二件+adventure_runner/level_runner/curio_deck/shop_session/run_ledger/battle_orchestrator 改造+呈现接线面+测量面改址
- 排期:未编入(迭代批卡片;估时 ≈5–5.5 个工作日;姊妹副卡另 ≈1.5–2)
@@ -32,7 +32,7 @@
| u9 | RunLedger 瘦身 | bonus 账/vision 账/adventure_counters 桶全部退役迁出(桶归宿主+encounter `"adv_bucket"` 键);attune_charges 账保留(副卡退役) |
**完成定义**:
1. u1–u9 落地;全套闸按本批改动域选档全绿;S13 计数读数改善(adventure_runner 类变量 42→约 20、level_runner 38→约 30、board_view 45→32——读数记录进实现报告,基线禁改)。
1. u1–u9 落地;全套闸按本批改动域选档全绿;S13 计数读数改善(adventure_runner 类变量 42→约 20、level_runner 38→约 30、board_view 45→32——读数记录进实现报告,基线禁改)。**v1.3 增**:拆分后新件逐件落 gdstyle 默认线内——HeroStats 公开方法 12/GpWallet 5/GainJournal 13/RefreshBank 13(类变量各 ≤7)、CurioStop 收口公开方法恰 20、adventure_runner 公开方法 ≤23 基线内;battle_orchestrator 指标精确回位=类变量 50/begin_battle 函数长 ≤141/文件长恰 1314(闸 09 存量 FAIL 行「1314>1302」文本逐字保持,指纹 91d45583cf6d 不变);hero_ledger.gd 删除、grep `HeroLedger|hero_ledger|\.hero()` 代码引用零残留(manifest 文件名与历史性注释除外)。
2. 同种子改前改后:断点快照 27 键逐键逐位一致(含日记键前形态);冒烟/系统/单测/探针全绿。
3. 撤销证明逐 wr 行落地;三份产出物写齐(T6);独立验收审计过。
@@ -109,14 +109,18 @@
| 文件 | 职责 | 行为改动 |
|---|---|---|
| `game/core/hero_ledger.gd`(**新增**) | 主角实体账:数值面+获得日记三层+gp 单写原语+公式单点+断点片段 | 新件(承载迁移态,行为不变)→ wr1/wr6 |
| `game/core/curio_stop.gd`(**新增**) | 三选一停点件:停点三态/刷新三源账/兑付族/凭证出箱/信号面/断点片段 | 新件(承载迁移态)→ wr2/wr3/wr6 |
| `game/core/adventure_runner.gd`(修改) | 薄应用层:删数值面/停点族/六转发信号族;建件接线;断点拼盘口;件出口 hero()/stop() | 结构改动,行为不变 → wr4/wr6 |
| `game/core/level_runner.gd`(修改) | 构造注入收参;8 白盒属性删;重绑机制删;战斗→关卡信号族保留;断点关卡域片段方法 | 结构改动 → wr5/wr6 |
| `game/core/hero_stats.gd`(**新增**,v1.3 拆分) | 主角数值账:生命与特性持有集+永久强化快照+类型轴+生效公式单点+回血封顶+续玩生命钳制+断点片段(hero_hp/relics 两键) | 新件(hero_ledger 领域拆分——行为不变)→ wr1/wr6 |
| `game/core/gp_wallet.gd`(**新增**,v1.3 拆分) | GP 钱包:gain/spend/clear 单写原语+断点片段(gp 一键) | 新件(同上)→ wr1/wr6 |
| `game/core/gain_journal.gd`(**新增**,v1.3 拆分) | 加算日记:获得记录三层+统一加算区三通道+购买档数+钥石+真视+断点片段(六键) | 新件(同上)→ wr1/wr6 |
| `game/core/hero_ledger.gd`(**删除**,v1.3 拆分) | 原主角实体账整件退役——按领域拆入上三件(grep 零残留) | 结构改动(行为不变)→ wr1/wr6 |
| `game/core/refresh_bank.gd`(**新增**,v1.3 拆分) | 刷新账件:X 基数与余量/Y 池/刷新券存量账/付费刷计数与报价公式/免费位消耗序+断点片段(refresh_stock/attune_refresh_y 两键) | 新件(curio_stop 领域拆分——行为不变)→ wr2/wr6 |
| `game/core/curio_stop.gd`(**新增**) | 三选一停点件:停点三态/兑付族/谓词/凭证出箱/信号面/断点片段;刷新编排留件(查停点态→bank 支出→重抽重发);deck 纯委托删除(调用方直连 CurioDeck) | 新件(承载迁移态)→ wr2/wr3/wr6 |
| `game/core/adventure_runner.gd`(修改) | 薄应用层:删数值面/停点族/六转发信号族;建件接线(stats/wallet/journal/bank 四引用);断点拼盘口(三片段并集);件出口 stats()/wallet()/journal()/deck()/refresh_bank()/stop() | 结构改动,行为不变 → wr4/wr6 |
| `game/core/level_runner.gd`(修改) | 构造注入收参(ctx 三键 stats/wallet/journal);8 白盒属性删;重绑机制删;战斗→关卡信号族保留;断点关卡域片段方法 | 结构改动 → wr5/wr6 |
| `game/core/curio_deck.gd`(修改) | 纯池化:bind_handlers 删;consume_pool_purchase 改经注入 Callable | 结构改动 → wr3 |
| `game/core/shop_session.gd`(修改) | 账本引用换代(run_ledger→hero);商店属性加算改经 hero 单写原语 | 结构改动,写通道语义不变 → wr1 |
| `game/core/shop_session.gd`(修改) | 账本引用换代(run_ledger→wallet+journal);商店属性加算改经 journal 单写原语 | 结构改动,写通道语义不变 → wr1 |
| `game/core/run_ledger.gd`(修改) | 瘦身:bonus 账/vision 账/adventure_counters 桶全部退役迁出(桶归宿主字典+encounter `"adv_bucket"` 键);attune_charges 账+其三原语保留 | 结构改动 → wr1 |
| `game/core/battle_orchestrator.gd`(修改) | encounter 注入面:+`"hero"` 键;bonus_add_axis/vision_count_add 调用改指 hero;attune_charge_* 仍走 ledger 瘦壳 | 结构改动 → wr1 |
| `game/core/battle_orchestrator.gd`(修改) | encounter 注入面:+`"journal"` 键(v1.3——原 `"hero"` 键随拆分换代);bonus_add_axis/vision_count_add 调用改指 journal;attune_charge_* 仍走 ledger 瘦壳;结构指标回位(类变量 50/函数长/文件长——闸 09 口径) | 结构改动 → wr1 |
| `game/presentation/main_adventure_flow.gd`(修改) | 信号重连(level_started 重取点 is_connected 守卫);控制器件注入换代;bonus 读面改指 hero(:37-38) | 结构改动 → wr4/wr1 |
| `game/presentation/views/level_map_screen.gd`(修改) | bonus 读面改指 hero(:334/335/343) | 结构改动 → wr1 |
| `game/presentation/hud_presenter.gd`(修改) | bonus 读面改指 hero(:20/313) | 结构改动 → wr1 |
@@ -134,73 +138,107 @@
### 接口块
**HeroLedger(`game/core/hero_ledger.gd`)**
**HeroStats(`game/core/hero_stats.gd`,v1.3 拆分——数值域)**
```gdscript
class_name HeroLedger extends RefCounted
func _init(db_ref: ConfigDb, base_override_ref: Dictionary) -> void # 锻造强化快照构造注入(原 _base_override 迁入)
class_name HeroStats extends RefCounted
func _init(db_ref: ConfigDb, base_override_ref: Dictionary) -> void # 锻造强化快照构造注入
func set_debug_override(atk_pct: int, hp_pct: int) -> void # 调试百分比通道(adventure.set_hero_override 转发件内)
# ---- 数值面(自 adventure_runner 迁入,语义逐字不变)----
var hero_hp: int # 生命账(原 ledger["hero_hp"] 单值化——共享字典退役)
var gp: int # GP 钱包(原 ledger["gp"]——LevelRunner.gp 属性与 ShopSession 钱包读写全改指此单点)
func gain_gp(amount: int) -> void # gp 单写原语(clamp ≥0)
func spend_gp(amount: int) -> bool # gp 单写原语(不足 false 零副作用)
func clear_wallet() -> void # 收束清零
func reset_for_single_level() -> void # 单关模式重开重置(值重置非实例重建——shop 绑 hero 对象引用不换代,重绑因此消失;语义=现 start_level :151-164 重置面)
func effective_max_hp() -> int # 公式单点(与现 :305-307 逐字同式:表值+base_override+汇总,后乘本件 pct)
func effective_atk() -> int # 公式单点(与现 level :101-103 同式,迁入)
func effective_ac() -> int # 同上(level :114-115)
static func rest_heal(pct: int, hp: int, max_hp: int) -> int # 回血公式单点(自 LevelRunner.rest_heal 迁入)
# ---- 获得日记三层 ----
func record_gain(source_class: String, kind: String, detail: Dictionary) -> int # 获得记录列表追加,返回记录 id
func gain_bonus(axis: String, value: int, source_class: String, kind: String) -> void # 明细+汇总同步维护(三通道统一入口;战末通道 source_class="battle_export"、kind=轴名——battle :1125-1127 按轴逐条调)
func bonus_total(axis: String) -> int # 汇总读面
func record_purchase(product_id: String) -> void # 购买条目(定价读数走 purchase_tier)
func purchase_tier(product_id: String) -> int
func record_keystone_drop(drop: Dictionary) -> void # 本局增量(keystone 更名 keystone_gained 语义)+逐杀明细
func keystone_gained() -> int
func record_vision_use() -> void; func vision_used() -> int
var feats: Array[String] # 特性持有集(活引用注入——G12 语义)
func clamp_hp_to_resume_cap(db_max_hp: int) -> void # 续玩生命钳制(原 _resume_params mini 式逐字收进——上限=表值+永久强化 flat 后乘调试 pct)
func rebase_override(raw: Dictionary) -> void
func reset_for_single_level() -> void # 单关重开:override 清零+本域账面重置(钱包/日记清零各归各件)
func reset_adventure_accounts() -> void # 生命置满生效上限+特性持有集清零
func effective_max_hp() -> int; func effective_atk() -> int; func effective_ac() -> int # 公式单点
static func rest_heal(pct: int, hp: int, max_hp: int) -> int # 回血公式单点
var hero_hp: int # 生命账
var feats: Array[String] # 特性持有集(活引用注入)
func feats_held() -> Array
# ---- 断点片段 ----
func breakpoint_fragment() -> Dictionary # hero_hp/bonus(汇总快照)/获得日记键/purchased/keystone 相关/relics/vision_counter_used
func restore_fragment(frag: Dictionary, params: Dictionary) -> void # 日记缺键→汇总直载跳过比对;在档→推导比对不符 push_error+拒载
var attack_type := ""; var armor_type := "" # 两根类型轴快照
func breakpoint_fragment() -> Dictionary # hero_hp/relics 两键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void
```
**CurioStop(`game/core/curio_stop.gd`)**
**GpWallet(`game/core/gp_wallet.gd`,v1.3 拆分——钱包域)**
```gdscript
class_name GpWallet extends RefCounted
var gp: int
func gain_gp(amount: int) -> void; func spend_gp(amount: int) -> bool; func clear_wallet() -> void
func breakpoint_fragment() -> Dictionary # gp 一键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void
```
**GainJournal(`game/core/gain_journal.gd`,v1.3 拆分——加算日记域)**
```gdscript
class_name GainJournal extends RefCounted
const BONUS_AXES: Array[String] = ["atk", "max_hp", "armor_class", "ap"]
func gain_bonus(axis: String, value: int, source_class: String, kind: String) -> void # 三通道统一入口(明细+汇总同拍)
func bonus_total(axis: String) -> int; func bonus_snapshot() -> Dictionary
func record_purchase(product_id: String) -> void; func purchase_tier(product_id: String) -> int
func record_keystone_drop(drop: Dictionary) -> void; func keystone_gained() -> int; func keystone_drop_log() -> Array
func record_vision_use() -> void; func vision_used() -> int
func reset_adventure_accounts() -> void # 日记域账面清零(汇总/明细/记录/已购档/钥石/真视)
func breakpoint_fragment() -> Dictionary # bonus/shop_purchased/keystone/keystone_drops/vision_counter_used/gain_journal 六键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void # 缺日记→汇总直载 clamp;在档→明细推导比对不符 push_error 拒载
```
**RefreshBank(`game/core/refresh_bank.gd`,v1.3 拆分——刷新账域,零停点态依赖)**
```gdscript
class_name RefreshBank extends RefCounted
func _init(db_ref: ConfigDb) -> void
func set_refresh_x_cap(total: int) -> void # X 基数注入(装配集 bonus_refresh magnitude 合计——宿主 start/resume 时点)
func set_refresh_y(v: int) -> void; func refresh_y() -> int # Y 冒险周期池
func add_refresh_stock(n: int) -> void; func refresh_stock() -> int # 刷新券存量账(冒险级)
func free_left() -> int # 合计读面(X+Y+存量——原 attune_refresh_left 迁入)
func spend_free() -> bool # 免费位消耗(X→Y→存量序逐字;全空 false 零副作用)
func charge_paid() -> void; func gp_cost() -> int # 付费刷计数递增/报价公式(ceil 基价×曲线^已付费刷——原式迁入)
func reset_x() -> void # X 每碰三选一重置回基数(不结转)
func reset_paid() -> void # 付费刷计数随停点清零(对齐商店进店清零)
func breakpoint_fragment() -> Dictionary # refresh_stock/attune_refresh_y 两键
func restore_fragment(frag: Dictionary, params: Dictionary) -> void # Y 缺键回退参数面(params_fallback 逐字)
```
**CurioStop(`game/core/curio_stop.gd`,v1.3 收口后保留面)**
```gdscript
class_name CurioStop extends RefCounted # 生命周期=每冒险一次(AdventureRunner 冒险开始建;关卡换实例不换件)
signal curio_choice_presented(payload: Dictionary) # 自 adventure_runner 迁入,载荷逐字不变
signal curio_choice_presented(payload: Dictionary) # 载荷逐字不变
signal curio_resolved(result: Dictionary)
func _init(db_ref: ConfigDb, deck_ref: CurioDeck, hero_ref: HeroLedger, snapshot_call: Callable) -> void
func rebind_level_runner(runner: LevelRunner) -> void # 每关注入时点=AdventureRunner._start_current_level 建件接线处:存当前关卡对象的 grant_curio_gp 方法 Callable(GP 件入账维持现路径与 wallet_changed 发射序——第二关起绑新 runner,防调死对象)
# ---- 五组入口 ----
func open_level_clear(payload_base: Dictionary) -> void # 收编 _on_level_finished 停点段:抽签(level_clear)/置在途态/发信号/触发落盘回调
func present_node_curio(candidates: Array) -> void
func _init(db_ref: ConfigDb, deps: Dictionary, snapshot_call: Callable) -> void
# deps = {deck:CurioDeck, stats:HeroStats, journal:GainJournal, bank:RefreshBank}——构造注入一次给齐
func rebind_level_runner(runner: LevelRunner, level_index: int) -> void # 每关注入时点(GP 件入账回调换代)
# ---- 停点编排保留面(公开方法恰 20——gdstyle 默认线)----
func open_level_clear(payload_base: Dictionary) -> void
func present_node_curio(candidates: Array) -> void; func node_curio_candidates() -> Dictionary
func pick_curio(kind: String, tier: String = "", feat_id: String = "") -> bool
func apply_node_curio(kind: String, tier: String = "", feat_id: String = "") -> bool
func skip_empty_curio() -> bool
func refresh_curio() -> bool; func refresh_curio_paid() -> bool
func curio_refresh_gp_cost() -> int; func attune_refresh_left() -> int; func refresh_stock() -> int
func curio_stop_pending() -> bool # 名继承现役 :584 谓词
func stop_resolved() -> bool # 放行谓词(已兑付待推进且无在途停点)
func node_curio_pending_state() -> Dictionary
func skip_empty_curio() -> bool; func node_curio_pending_state() -> Dictionary
func refresh_curio() -> bool; func refresh_curio_paid() -> bool # 编排=查停点态→bank 支出→重抽重发
func curio_stop_pending() -> bool; func stop_resolved() -> bool
func consume_pool_purchase(kind: String, tier: String) -> bool
func reset_adventure_state() -> void
func restore_pending(bp_pending: Dictionary) -> void
func restore_resolved(payload: Dictionary) -> void # v1.3 合并 reemit——置态后重发(resume 只重发不重兑付)
func clear_resolved() -> void
func voucher_outbox() -> Dictionary # 凭证出箱 {rap:int, time_sand:int}——战首取走清零
func draw_candidates(channel: String) -> Array # 经 deck(reward_pick 流不变)
# ---- 断点片段 ----
func breakpoint_fragment() -> Dictionary # bonus_pending/bonus_result/feat_ticket_*/refresh_stock/attune_refresh_y(读侧 params 回退经参传入)
func breakpoint_fragment() -> Dictionary # bonus_pending/bonus_result/feat_ticket_*
func restore_fragment(frag: Dictionary, params: Dictionary) -> void
# v1.3 删除:feat_ticket_consider/curio_cap_ok/pool_stock(deck 纯委托——调用方直连 CurioDeck)、
# pool_stock_snapshot/draw_candidates(同上)、resolved_payload(零消费死面)、reemit_resolved(并入 restore_resolved)、
# 刷新族七方法(set_refresh_x_cap/set_refresh_y/refresh_y/add_refresh_stock/refresh_stock/attune_refresh_left/curio_refresh_gp_cost→RefreshBank)
```
**adventure_runner 应用层(保留/新增面)**
```gdscript
func _init(db_ref: ConfigDb, rng_ref: RngServiceCore, save_manager_ref = null) -> void # 存档承载改构造注入(缺省 null=断点静默,原语义)
func hero() -> HeroLedger # 件出口(组件交出,非委托壳)
func stats() -> HeroStats; func wallet() -> GpWallet; func journal() -> GainJournal # 件出口(v1.3——hero() 随三件拆分换代)
func deck() -> CurioDeck; func refresh_bank() -> RefreshBank # 件出口(v1.3——停点件 deck 纯委托删除后调用方直连面)
func stop() -> CurioStop
# 保留:start_adventure/resume_adventure/continue_to_next_level/abandon/state/summary/runner()/set_hero_override
# 删除:数值面方法族/停点族方法/六转发信号与 _forward_*/_bp_parts 五连挖(改收片段)
# 删除:数值面方法族/停点族方法/六转发信号与 _forward_*/_bp_parts 五连挖(改收片段)/hero()
# BREAKPOINT_FIELDS 常量保留本件=键序契约(拼盘口按此断言完整性)
```
@@ -208,13 +246,15 @@ func stop() -> CurioStop
```gdscript
func _init(db_ref: ConfigDb, rng_ref: RngServiceCore, ctx: Dictionary) -> void
# ctx 键(一次给齐,后置 setter 群删除——grilling 一轮补全 12 键):
# hero:HeroLedger/ledger:RunLedger(瘦壳——本卡仅传,副卡删)/
# attunement:Array/tree_rules:Array/shop_mode:String/treasure_unlocked:Dictionary/
# ctx 键(一次给齐,后置 setter 群删除——grilling 一轮补全 12 键;v1.3 hero 键换代三键):
# stats:HeroStats/wallet:GpWallet/journal:GainJournal(共享主角账三件——活引用)/loadout:AttuneLoadout(同调配装件)/
# adv_bucket:Dictionary(冒险桶宿主字典)/attunement:Array/tree_rules:Array/shop_mode:String/treasure_unlocked:Dictionary/
# hero_attack_type:String/hero_armor_type:String/voucher_rap:int/voucher_time_sand:int/
# pool_wiring:Dictionary(池模式装配 4 参收编:{deck:Array, consume:Callable, ticket:Callable, cap:Callable}——缺省空字典=legacy 零注入)
# start_level(单关测试模式)件内自建私有 HeroLedger(_init 即建、空 override 注入——shop 绑定因此仍仅构造一次;start_level 收 base_override_in 经 hero 重注+reset_for_single_level() 值重置,实例不重建)
# 新增:func hero() -> HeroLedger # 只读出口(bonus 生产读面 5 文件经现 run_ledger 访问链改此承接)
# start_level(单关测试模式)件内自建私有三件(_init 即建、空 override 注入——shop 绑定因此仍仅构造一次;
# start_level 收 base_override_in 经 stats 重注+三件各归各件清零,实例不重建)
# 新增:func stats() -> HeroStats # 只读出口(v1.3——hero() 换代;bonus 生产读面经 journal() 承接)
# func journal() -> GainJournal
# start_level_external 收参收窄为 (level_index:int, defer_entry:bool, resume_state:Dictionary)
# 新增:func breakpoint_fragment() -> Dictionary # 关卡域五键(node_id/visited_ids/aux_items/shop_shelf/shop_visit_buys)
# func restore_fragment(resume_state: Dictionary) -> void # 断点重建参数面收口(原 _resume_bp 直读面收编)
@@ -327,6 +367,8 @@ func _init(db_ref: ConfigDb, rng_ref: RngServiceCore, ctx: Dictionary) -> void
**二轮闭合复检(2026-10-26,同一独立子代理)**:判「通过(附残留 8 条,无新阻断)」——13 阻断逐条核闭合(含三处点名矛盾检查:桶迁移与契约 8 一致、rebind 时点先于该关全部信号发射无冲突、副卡键值校验与零行为变化自洽)。残留 8 条已折入 v1.2:R1 数字统一(u8/契约 9/wr7/§6 四处 47→49+B 类 68→78);R2 B 类补 run_ledger 账本断言族(约 10 处/3 文件改指);R3 bonus 读面经 LevelRunner `hero()` 只读出口承接写明;R4 单关模式 `_init` 即建私有 hero(空 override)+start_level 经 reset 重注——绑定仍仅构造一次;R5 结构图 run_ledger 行同步桶退役+battle 直构空字典兜底;R6/R7/R8 归副卡折入。估时分项和 5.35d 对齐。
**领域拆分修订动因(2026-10-27,v1.3——用户令本会话讨论后修订)**:实现批收口呈报的结构指标超标(hero_ledger 公开方法 29、curio_stop 公开方法 34/类变量 18/_apply_curio_pick 分支 10 返回 9——五条 NEW;宿主 battle_orchestrator 类变量/函数长/文件长三条恶化)经用户裁「结构指标=缺陷、按领域切分」定案为还债实现,随本卡迭代收口批执行:①hero_ledger 按领域拆三件(HeroStats 数值与公式/GpWallet 钱包/GainJournal 加算日记——断点片段三件各交各账、应用层并集拼装,28 键对拍基线逐位一致为硬验收);②curio_stop 拆出 RefreshBank 刷新账件(停点态零依赖)+删五条 deck 纯委托(调用方经 adventure.deck() 直连)+resolved_payload 死面删除+reemit_resolved 并入 restore_resolved;③battle_orchestrator 指标精确回位(类变量 50、begin_battle ≤141、文件长恰 1314——闸 09「标准是尺」存量红两行的行文本与指纹逐字保持,多一行少一行都改指纹)。行为零变化契约不变;机检口径仍按 §13——禁为计数保留无效成员,本修订的全部公开面收敛都来自真实调用面。
## 13. 禁为机检文本保留无效成员(重构类必填条款)
禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;本批撤除的 25 条转发属性即该债务的清偿——不得以「基线计数」「探针便利」等理由保留任何一条或新增同种转发;机检键与卡片契约互斥时实现段一律停卡呈报,不得自造第三条路(code-conventions §1.1 同款)。
@@ -1,6 +1,6 @@
# 需求卡片:同调配装充能域封装批(AdventureRunner 真拆分·副卡)
- 版本:**v1.2**(v1.0→grilling 一轮「回炉」5 阻断全折入→v1.1→二轮「通过附残留」R6/R7/R8 折入→v1.2 定稿,复核记录见 §12)
- 版本:**v1.3**(v1.0→grilling 一轮「回炉」5 阻断全折入→v1.1→二轮「通过附残留」R6/R7/R8 折入→v1.2 定稿→v1.3 领域拆分修订,复核记录见 §12。v1.3=2026-10-27 领域拆分修订——用户裁结构指标=缺陷,闸 09「标准是尺」口径下的还债实现,用户令本会话讨论后修订)
- 来源:[待办清单](../待办清单.md)「AdventureRunner 职责真拆分」条目(2026-10-25 登记,P0,状态=文档设计已闭合+待写卡)(唯一事实源:[architecture](../design/engineering/architecture/architecture.md) v1.16 AttuneLoadout 新件行+「冒险域拆分定稿」节充能单源化句)
- 归属:`game/core/` 新一件(attune_loadout)+run_ledger 整类退役+battle_orchestrator 使用/重置路径+断点旧档迁移
- 排期:未编入(迭代批卡片;估时 ≈1.5–2 个工作日)
@@ -10,7 +10,7 @@
## 0. 前置依赖与并行性
- **第〇步核对(2026-10-26 写卡会话)**:来源条目=设计线条目(同主卡),闭合凭据=architecture v1.16,放行。
- **前置卡接口取用**:主卡 T1 产出的 HeroLedger 与 encounter `"hero"` 键、T3 产出的 ctx 注入面与「关卡开始信号前零发射」头注契约、T4 产出的片段三接口形态——本卡在同形接口上扩展充能域。
- **前置卡接口取用**:主卡 T1 产出的主角账件(v1.3 拆分后=HeroStats/GpWallet/GainJournal 三件)与 encounter `"journal"` 键、T3 产出的 ctx 注入面与「关卡开始信号前零发射」头注契约、T4 产出的片段三接口形态——本卡在同形接口上扩展充能域。
- 并行冲突:与主卡串行(硬前置);与「通关口径换代批」(在册 v1.1)真实交叠=**adventure_runner+level_runner 两文件**(该批 C 注释面 adventure_runner 14 处/level_runner 3 处——本卡改其建件接线与 ctx;该批六件清单无 battle_orchestrator)——先后做者 T0 行号复核吸收;其余在册卡零交叠。
## 1. 目标与完成定义
@@ -122,9 +122,9 @@ func restore_fragment(frag: Dictionary, inventory: TreasureItems) -> void # 旧
**battle_orchestrator 改指**:`begin_battle` encounter 删 `"ledger"` 键——桶挂链走主卡已建的 `"adv_bucket"` 键(:382 改指已完成于主卡 T1,本卡零动作)、`"hero"` 键沿用;encounter 增 `"loadout": AttuneLoadout` 键;`_reseed_attune_charges(reset)` 改调 `loadout.reset_cycle(reset, treasure_inventory)`(:228-246 语义逐字承);使用点 `:757` 改 `loadout.consume_charge(...)`;`:239` 充能设定改种行路径;`:381` ledger 类型检查与 `RunLedger.new()` 兜底删除。
**测试直构面改址(grilling 一轮补查)**:treasure_effects_test:275、round_flow_skill_pool_test:969/994(`load("res://core/run_ledger.gd").new()` 直构+encounter "ledger" 注入)→ 改直构 HeroLedger+"hero"/"adv_bucket" 键注入;meta_progression_forge_test:290-291 同款;effect_engine.gd:94/effect_context.gd:3 注释中 RunLedger 表述随批清(注释面,非行为)。
**测试直构面改址(grilling 一轮补查)**:treasure_effects_test:275、round_flow_skill_pool_test:969/994(`load("res://core/run_ledger.gd").new()` 直构+encounter "ledger" 注入)→ 改直构主角账件+`"journal"`/`"adv_bucket"` 键注入(v1.3——原 `"hero"` 键随主角账三件拆分换代);meta_progression_forge_test:290-291 同款;effect_engine.gd:94/effect_context.gd:3 注释中 RunLedger 表述随批清(注释面,非行为)。
**主卡接口取用**:HeroLedger(无充能交互)、ctx 注入面(本卡扩两键)、片段三接口形态(本卡同形扩展)。
**主卡接口取用**:主角账件(v1.3 拆分后=HeroStats/GpWallet/GainJournal 三件——充能交互零涉及)、ctx 注入面(本卡扩两键)、片段三接口形态(本卡同形扩展)。
### 落位与可复用性预检
@@ -202,6 +202,8 @@ func restore_fragment(frag: Dictionary, inventory: TreasureItems) -> void # 旧
**二轮闭合复检(2026-10-26,同一独立子代理)**:判「通过(附残留,无新阻断)」——5 阻断全核闭合、「键值仅校验读数与零行为变化」边界判自洽。残留 R6/R7/R8 已折入 v1.2:R6 契约 2 旧句(两读法兜底)删、wr1 列改单源对拍、§1 目标句旧措辞(同调行迁移)改「旧档读侧以行集为源」;R7 结构图补 feat_vouchers_test 充能直写 8 处改指行;R8 并行注记事实订正(通关批 C 面六件无 battle_orchestrator,真实交叠=adventure_runner+level_runner)。
**领域拆分修订动因(2026-10-27,v1.3——用户令本会话讨论后修订)**:主卡 v1.3 领域拆分(用户裁「结构指标=缺陷」还债实现)把主角账 HeroLedger 拆为 HeroStats/GpWallet/GainJournal 三件、battle encounter `"hero"` 键换代 `"journal"`——本卡对主卡产物的取用面(前置卡接口取用句、测试直构改址行、接口取用行)随换代同步改写;本卡自身范围(AttuneLoadout 建件、RunLedger 退役、使用管线逐位不变)零改动。
## 13. 禁为机检文本保留无效成员(重构类必填条款)
同主卡:禁止为迎合机检消息文本保留或新增无效成员/别名;RunLedger 的删除不得以任何「基线便利」理由拖延或保留空壳;机检键与契约互斥时停卡呈报(code-conventions §1.1 同款)。