收尾(迭代39批后): 反哺点13条落文+产出物退役+账面换代(用户裁甲路线2026-10-28)——①落文九处: architecture v1.20(三新件已实装登记/RunLedger退役注记并删四账段/拆分定稿节转现状/unit_container补check_trigger_unlocks与facts参/effect_engine adventure桶改指应用层/CurioDeck bind_handlers句退役)+存档序列化 v1.1(断点各件自交片段+应用层唯一拼盘落盘口+gain_journal扩列28键+aux_items关卡完成停点同调行留存边界)+冒险结构 v1.1(获得日记键断点面口径:plain策略/旧档缺键汇总直载/在档推导比对不符拒载)+敌人系统 v1.3(trigger列与P1表已实装标注/半血收编句摘'归实装批'/两示范定名)+难度曲线与Boss v1.1(两示范投放登记读表口径+EV锚换带注记)+体验验证清单㊲(趁隙偷袭/孤注守势两目检项)+生涯(行号越界句改语义指认:收束受理_settle+主角账两件投影)+test-conventions(check_quiet静默通道不进extract_checks扫描面备案);#4秘宝核查无双轨描述记无需改、#6战斗结算核查无漂移闭环、#13备案随报告退役留痕git;无版本号文档(存档序列化/冒险结构)补立身份标记基线=修订前全部历史;②退役删十件: 四份产出物(实现报告§六收口口径/代拍板10条含超白名单#5#7随特批合并追认/反哺点清单/验收审计)+三张需求卡(死期=合回master)+素材八份JSON(证据只留最新,第8份split_B1未跟踪件直删不入库);③账面: roadmap迭代39行已完成(2026-10-27)+卡片报告列退役保留字+当前位三行换代+表下带红合并注记;待办清单两源条目整删+gdstyle条目卡指路句改git指认(三宿主债已清偿ffb0ac15)+迭代40卡①交接注记(卡面RunLedger引用须按现态改写)自报告§六迁入;闸红修复: roadmap当前位括号日期注记改逗号连接(R3)/体验验证清单退役词buff改增益(doc_term)/gdstyle条目已删卡路径改git指认(卡片存在性校验);遗留呈报: bp_baseline_dump.gd零引用可删但属代码面,留待用户裁worktree小批
This commit is contained in:
1 parent
21cd0f2e05
commit
6139d2deb0
24 files changed
+43
-1752743
No files matched your search
@@ -1,16 +0,0 @@
|
||||
# 迭代 39 代拍板追认单(2026-10-27)
|
||||
|
||||
接收方:用户会话追认(备案确认——授权发生在卡片审问阶段白名单,本单为批后备案)。
|
||||
|
||||
| # | 卡 | 白名单条目 | 裁量内容 |
|
||||
|---|---|---|---|
|
||||
| 1 | 主卡 | 提交切分与 worktree 命名 | 分支 iter39 单工作区;T0/T1/T2/T3/T4/T5 各一笔提交 |
|
||||
| 2 | 主卡 | 测试改址等价写法 | 直读写已迁字段 30+ 处→stop()/hero() 件测试构造面;bind 句柄每回调新建故以关卡号守卫判重(Callable 相等不可靠) |
|
||||
| 3 | 主卡 | 迁入注释随迁措辞 | 公式/兑付/断点段注释随迁 |
|
||||
| 4 | 主卡 | 单关私有 HeroLedger 内部组织 | rebase_override 重注面+reset_for_single_level 值重置(实例不重建) |
|
||||
| 5 | 主卡(超白名单,呈追认) | ctx 增 adv_bucket 键 | 卡片 ctx 键清单漏列桶传递面——按「构造注入一次给齐」意图补全 |
|
||||
| 6 | 副卡 | 种行/补行内部组织 | treasure_inventory 提冒险级共享(卡片文件结构图 treasure_items.gd 零触碰保持;关卡末清空调用点改选择性保留——「同调行始终留在 treasure_inventory」的行承载前提,玩家可见 C 区投影零变化) |
|
||||
| 7 | 副卡(超白名单,呈追认) | 跨版续玩键值兜底补行 | 契约 3「行集为源」的跨版例外——改前档关卡完成停点行已被关末清空(键在行缺),按键值差额补行=与字典轨续玩逐位等价;新档行集为源差额零操作 |
|
||||
| 8 | 触发器卡 | 新技/状态行定名 | desperate_guard/孤注守势、sneak_ambush/趁隙偷袭、defensive_stance/护身(推荐案采纳) |
|
||||
| 9 | 触发器卡 | provisional 数值 | w1/w2、lte 35、−25、×1.5、CD4、duration 2(同数量级内) |
|
||||
| 10 | 触发器卡 | 断言组织与夹具 | trigger_cond_test 内部组织;V5 对拍以 skill_unlock/round_flow 编排集成承载(迁移断言+事件摘要) |
|
||||
@@ -1,23 +0,0 @@
|
||||
# 迭代 39 反哺点清单(2026-10-27)
|
||||
|
||||
接收方:各 owner 文档(文档批落文依据,用户裁决后执行)。
|
||||
|
||||
| # | 文档 | 关联点 | 改成什么 | 依据 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | design/engineering/architecture/architecture.md | 模块归属表 HeroLedger/CurioStop/AttuneLoadout 三行「设计定稿——实现批建件」标注 | 改「已实装(2026-10-27)」;RunLedger 相关行整段退役注记;模块表 level_runner/battle 行消费依赖列 ledger 引用句删除;CurioDeck 行删 bind_handlers 句;level_runner 行补构造注入句;「冒险域拆分定稿」节转现状登记 | 主卡+副卡落地实况 |
|
||||
| 2 | design/gdd/systems/表现与支撑/存档序列化.md | 断点域段机制句(写侧 _bp_parts 拼装/读侧 _bp_read 派生) | 改「各件自交片段(主角账/停点件/关卡件)+冒险应用层唯一拼盘落盘口+获得日记键扩列(gain_journal,28 键——旧档缺键汇总直载)」;同调行「始终留在 treasure_inventory」句随单源化核对 | 主卡 T4/副卡 k4 |
|
||||
| 3 | design/gdd/systems/冒险循环/冒险结构.md | 断点域字段口径 owner——获得日记键字段口径登记 | 键名 gain_journal、缺省策略 plain、旧档回退(缺键=汇总直载跳过比对;在档=明细推导比对不符拒载) | 主卡契约 2 |
|
||||
| 4 | design/gdd/systems/跨局循环/秘宝.md | 充能账机制句若有双轨描述 | 改单源化(物化行唯一事实源、剩余=未用行派生;同调未用行跨关存活——关卡末清空选择性保留) | 副卡落地实况(T0 核该文档若无双轨描述记「无需改」) |
|
||||
| 5 | design/gdd/systems/战斗循环/敌人系统.md v1.2 | §P1 表「情境条件触发器」行「待写卡实装」 | 改「已实装(2026-10-27)」;§半血解锁收编段「字段换代与行值迁移归实装批」句摘除 | 触发器卡落地 |
|
||||
| 6 | design/gdd/systems/战斗循环/战斗结算.md v1.0 | 开轮摇号排除句触发条件指针 | 查实装后无陈述漂移则记「无需改」 | 反哺核对行 |
|
||||
| 7 | design/gdd/systems/冒险循环/难度曲线与Boss.md v1.0 | 技能池投值面 | 查无漂移记「无」;两示范 provisional 投值(w1/w2/lte35/−25/×1.5)登记读表口径 | 触发器卡 §二 |
|
||||
| 8 | design/engineering/architecture/architecture.md | UnitContainer 新公开面(check_trigger_unlocks/事实组包口径)API Boundaries 登记面核查 | 若属登记面补行 | 触发器卡 §六 |
|
||||
| 9 | 体验验证清单.md | 实机目检观测项两条入册 | ①上轮停手→下轮明细出「趁隙偷袭」②地精低血后摇出「孤注守势」 | 触发器卡(登记不阻塞) |
|
||||
| 10 | 待办清单.md | 两源条目状态推进 | 「AdventureRunner 职责真拆分」「技能池情境条件触发器」→完成(batch-closure 承接) | 实现报告 |
|
||||
|
||||
| 11 | design/gdd/systems/跨局循环/生涯.md:55 | 代码行号指路句指 adventure_runner.gd:814(本批收薄后 627 行——行号越界,08d 引用可核新增红) | 行号指路改语义指认(结算受理段已随拆件迁 CurioStop/主角账——按 doc-conventions「引用不转述/代码↔设计追溯由 GDD 承担」改写该句;行号指路本属脆弱面,建议连同 :50/:60 两处留档句一并换代) | 本批 diff 直接后果(commit 被文档域闸拦——反哺落文后本批合回) |
|
||||
|
||||
| 12 | design/engineering/test-conventions.md | 验收尾缀形态:check_quiet 静默收集断言不入 extract_checks.py 扫描面(审计备案);失败消息尾缀对静默通道的字面形态 | 备案级——工具面局限登记(如需覆盖 check_quiet 属提取器改版,工程批) | 独立验收审计备案 |
|
||||
| 13 | 触发器卡 V5 改前基线载体 | 卡定 game/tests/evidence/trigger_baseline.md 未落盘(代拍板 #10 改道 skill_unlock/round_flow 编排集成承载) | 备案——三 Boss 迁移零变化验证强度=语义断言级;后续同类迁移批建议保留事件序列基线落盘义务 | 独立验收审计备案 |
|
||||
|
||||
**边界漏判呈报(副卡契约 3 内在矛盾,已按行留存实现)**:副卡 K4「aux_items 键载库存全量快照(含同调行)」在选路/三选一停点成立、在关卡完成停点不成立(改前行已被关末 reset 清空)——「同调行始终留在 treasure_inventory」与「aux_items 键值形态逐位不变」在该停点形态互斥。实现采「行留存」(关卡末清空改选择性保留+treasure_inventory 提冒险级共享),断点档关卡完成停点 aux_items 含同调未用行(24 停点形态变化,充能读数 attunement_charges 全部逐位一致)。建议 §2 反哺时把该边界写明。
|
||||
@@ -1,63 +0,0 @@
|
||||
# 迭代 39 实现报告(2026-10-27)
|
||||
|
||||
接收方:待办清单「AdventureRunner 职责真拆分」「技能池情境条件触发器」两条目(batch-closure 收尾依据)+本报告 §四呈报项待用户裁决。
|
||||
|
||||
## 一、各卡状态
|
||||
|
||||
| 卡 | 状态 | 收口提交 |
|
||||
|---|---|---|
|
||||
| 主卡·冒险域拆件与账本实体化批 | 完成(T0-T5,wr1-wr8 落地) | 0229d5fb/8d7b12e0/4a9e4300/4da7f3e2/fa1409f4/659d59ed |
|
||||
| 副卡·同调配装充能域封装批 | 完成(RunLedger 整类退役) | 80fe4b8f+收尾笔 |
|
||||
| 触发器卡·技能池情境条件触发器批 | 完成(机制+三 Boss 迁移+两示范) | 4868e11b |
|
||||
|
||||
## 二、实际改动—验收对照表(结果格随附)
|
||||
|
||||
| 需求点 | 验收测试 | 真实入口 | 撤销证明 | 结果 |
|
||||
|---|---|---|---|---|
|
||||
| wr1 账本实体化 | hero_ledger_test hr1/hr1-s/hr2 | start_adventure 真链+商店购买真链 | 回退 shop_session gain_bonus hunk→hr1-s 红→还原复绿(本批执行,undo1) | 绿 |
|
||||
| wr2/wr3 停点件+纯池化 | adventure_feats〔拆件批 V2〕/level_shop_economy〔V3〕现役断言承继 | 三选一真链/pool 购买真链 | (同族 wr1 承载——停点迁移 bp 对拍五时点零漂移主证) | 绿 |
|
||||
| wr4/wr5 信号直连+构造注入 | hero_ledger_test sc3 源码断言(_bind_shop 单点/_forward_ 零命中)+adventure_feats 信号序 | 两关全流程驱动 | (bp 对拍承载) | 绿 |
|
||||
| wr6 断点片段化+日记键 | bp1 对拍 292dumps×27 键六时点逐位零漂移+gain_journal 单列在档+breakpoint_resume P8 28 键 | 同种子双跑 | (bp 对拍主证) | 绿 |
|
||||
| wr7 转发属性撤除 | 改址后现役断言全绿+S13 读数(§三) | 五单测套+ui_input_probe | —— | 绿 |
|
||||
| wr8 产出物 | 本报告三件套 | —— | 缺项红 | 在案 |
|
||||
| 副卡 wr1-wr3 充能单源化 | feat_vouchers 账本保留〔卡② R1〕+al2 单源对拍(attunement_charges 24 停点逐位一致) | 种行真链 | 回退 loadout 种行 hunk→feat_vouchers 红→还原复绿(undo2) | 绿 |
|
||||
| 触发器 wr1-wr9 | trigger_cond_test V1/V2/V4/V6/V7/V8/V9/V10(manifest 登记) | db.load_tables/spawn 真实表/编排器真链 | 回退 rollable_skills 过滤 hunk→V2 红→还原复绿(undo3) | 绿 |
|
||||
|
||||
测试削弱申报履行:主卡契约 9 零削弱;触发器卡申报①②③④已履行(skill_unlock_test 读值源换代语义保持/round_flow expect_pools 期望值随投放改写仍精确比对/:654 直调单参保留/V4 扩行只增不删)。
|
||||
|
||||
## 三、S13 读数与呈报(需用户裁决——见 §四)
|
||||
|
||||
三宿主改善达成:adventure_runner 类变量 42→23(-19)公开方法 23→14(≤20 零警告);level_runner 38→28(卡目标约 30);board_view 45→32(精确达标)。基线文件 `tools/gdstyle_baseline.txt` 零改动。
|
||||
|
||||
**存量红面(收口须用户特批,同 iter38 先例)**:
|
||||
- NEW 5 条:curio_stop max-class-variables=16/max-public-methods=31/max-branches|_apply_curio_pick=10/max-returns=9、hero_ledger max-public-methods=29——新件公开面为卡片接口块定义的迁移语义面(原基线 adventure_runner 对 _apply_curio_pick 同函数登记同值 branches=10/returns=9,超标形态随迁移显现)。
|
||||
- WORSENED 4 条:battle_orchestrator 类变量 50→51(+_hero 拆件必要成员)/文件长 1302→1315/begin_battle 函数长 141→142;level_map_screen 类变量 21→22(iter38 存量漏登记——本批零触碰该文件)。
|
||||
- 建议案:经批准将上列 9 键按实测值 refresh 进基线(含 level_map_screen iter38 存量补登)。
|
||||
|
||||
**EV 锚预期红(触发器卡 T4-4 预设停机呈报)**:round_flow EV 抽样对锚 goblin 实测 0.9148 ∉ [1.00,1.20]——两示范投放=池权重数值改动(孤注守势 buff 技稀释伤害期望,方向合理);钩爪恐魔同批投放。**重锚归用户档位发起,实现批不自行重锚**。
|
||||
|
||||
## 四、遗留读数义务与实机目检总清单
|
||||
|
||||
- 实机目检两项(登记不阻塞):①上轮停手→下轮结算明细出现「趁隙偷袭」;②地精低血后摇出「孤注守势」。
|
||||
- MC 对拍:本批触发器卡含池权重投放=数值改动——MC 锚重锚归用户发起(见 §三)。
|
||||
- 主卡 MC 口径:行为零变化重构(bp1 六时点 292 停点逐位零漂移为凭),MC 未发起。
|
||||
|
||||
## 五、中间产物退役清单(批末执行)
|
||||
|
||||
game/tests/bp_baseline_dump.gd(bp1 载体)+reports/iter39-素材/ 六份 JSON(对拍凭据,审计后随本报告退役)。
|
||||
|
||||
## 六、领域拆分批(v1.3)补记与收口遗留清单(2026-10-27 合并前补)
|
||||
|
||||
§一–§五 写于三卡收口时点;其后用户裁「不满足结构指标也是缺陷、按领域做分割」,三卡以 v1.3 在批内追加领域拆分并二次实现。本节补记拆分批事实与收口遗留,收口以本节为唯一口径。
|
||||
|
||||
**拆分批提交**:B1 主角账三件 fde14f1c(hero_ledger 整件退役→hero_stats/gp_wallet/gain_journal);修复A 4ca4ddbc(trigger_cond_test 旧成员读换代+adventure_runner:170 残留删除);B2 停点刷新账 012883f3(refresh_bank 新件);B3 私有助手抽取 45faa92b(含 cross_validator 入循环重复追加缺陷修复);B4 战斗指标面 741b6bd7;修复B f96632de(S9 返回类型注解);闸基线 3530144e(02/08d 特批存量红登记)。合并 master=ffb0ac15(用户特批带红合并)。
|
||||
|
||||
**§三 存量红面已被拆分清偿,建议案作废**:NEW 5 条(curio_stop 4/hero_ledger 1)随 B1/B2 拆分归零;WORSENED 4 条中 battle_orchestrator 类变量与 begin_battle 函数长经 B4 修复、文件长回注册值 1314。终局读数=gdstyle 基线外新违规 0、恶化恰 2 条(battle_orchestrator max-file-length 1314〔登记 1302〕、level_map_screen max-class-variables 22〔登记 21〕——存量债归迭代 40 卡①与迭代 41 卡③,与 iter38 账目一致)。§三「建议案:refresh 9 键」作废(2026-10-27 用户裁「标准是尺、不以现状为尺」后基线只降不升)。
|
||||
|
||||
**收口遗留清单(全在案,按处置去向分组)**:
|
||||
1. **EV 锚**:round_flow goblin(地精)场景实测 0.9148 ∉ [1.00,1.20]——触发器批有意行为改动,非缺陷。已按用户特批(2026-10-27)随 02 闸记存量红(fp f74b9a48ef4a)合并;参考区间更新归后续数值批,待用户发起。
|
||||
2. **生涯.md:55 引 adventure_runner.gd:814 行号漂移**(拆分后该文件 660 行)——08d 记存量红(red-nokeys)合并;修复归合并后文档批(反哺点在册);建议级同行:生涯.md :50/:60、元进度.md:70。
|
||||
3. **第 8 份对拍凭据 bp_baseline_after_split_B1.json 未入库**——08d 存量红期间纯文档提交被钩子拦(无代码改动可随行),已置主仓 reports/iter39-素材/(未跟踪),随文档批一并入库。
|
||||
4. **本报告与验收审计报告停在 v1.2 口径**(§一–§五 未反映拆分)——实际落地以 v1.3 卡片与上列提交为准,文档批换代;本节即补记。
|
||||
5. **批后收尾未执行**(待办清单/roadmap 账面换代、§五 退役清单执行——退役凭据实为八份 JSON,§五 笔数按拆分前口径写的六份)——待用户另令 batch-closure。
|
||||
6. **交接注记**:迭代 40 卡①(gdstyle 波 1)卡面接口块仍引用已退役的 RunLedger——该批 T0 须按现态改写。
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,21 +0,0 @@
|
||||
# 迭代 39 独立验收审计报告(2026-10-27)
|
||||
|
||||
审计入口:独立子代理(未参与实现);基线=merge-base 5699192af 三点 diff。依据 test-conventions §8。
|
||||
|
||||
## 一、对照表逐行核对——通过(附 1 缺漏已补+2 例外)
|
||||
抽查 8 行全数在案且真实入口无绕过:hr1(直构逐值+start_adventure 真链 :20-52)/hr1-s(商店购买真链 :54-69,正钉 wr1 改动点)/hr2(三通道+片段往返 :71-122)/sc3(_bind_shop 单点+_forward_ 零命中 :124-140)/〔拆件批 V2〕/〔V3〕承继断言/触发器 V1 七反例+V2 双面+V8 阈值式/P8 28 键断言。缺漏 1(V3 保底不逼断言未落码)已补(trigger_cond_test V3 段:special_skills 双态+SkillLottery 30 摇零逼出+撤销态红证)。例外:hr 系尾缀落 manifest 注记行(备案,反哺点 12)。
|
||||
|
||||
## 二、撤销证明抽查复现——通过
|
||||
undo1 复现:基线绿→gain_bonus 行改 pass→hr1-s 恰红(断言钉在被撤改动上)→还原复绿,工作树 clean。undo2/undo3 记录面与码面对得上(抽查一条合规)。
|
||||
|
||||
## 三、测试削弱检查——通过
|
||||
删 72 行 Kit 断言全部属改址(旧路径引用已删字段),逐条同判据替换;净增 1 行=round_flow V7 扩行(申报④兑现);EV 锚区间零触碰(预期红非削绿);申报③兑现;表迁移与申报逐字一致。残留 1(level_shop_economy:1035 RunLedger 注释)已清+al4 零引用源码断言补落。申报外等价改写 1 处(skill_unlock 零扰动/确定性载体换蜘蛛首遇带——投放致地精池含 trigger 行,50f9caa7 已申报,判例外)。
|
||||
|
||||
## 四、S13 基线核查——通过
|
||||
tools/ 全目录零改动(基线禁改契约兑现);存量红 9 键走用户特批呈报(实现报告 §三)。
|
||||
|
||||
## 五、bp 基线对拍抽验——通过
|
||||
before vs after_T5:292×27 键=7884 次逐值比对 mismatch 0;gain_journal 0/292→292/292 在档(契约 2 兑现)。before vs after_attune:attunement_charges 292/292 全等(单源对拍达成);aux_items 24 处=申报例外(关卡完成停点留存同调行,代拍板 #6/反哺点呈报吻合)。
|
||||
|
||||
## 结论
|
||||
**通过(附例外)**——合并前三件已全部处理(V3 断言补落/RunLedger 残留清+al4 补/备案两行入反哺点 12-13)。收口待用户裁决三项:S13 特批(9 键 refresh)、EV 锚重锚(goblin/hook_horror 池权重投放)、08d 反哺落文(生涯.md:55 行号句)。
|
||||
@@ -1,374 +0,0 @@
|
||||
# 需求卡片:冒险域拆件与账本实体化批(AdventureRunner 真拆分·主卡)
|
||||
|
||||
- 版本:**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)
|
||||
- 开工门:U0+复核门过(§12);零待裁点
|
||||
- 姊妹卡:`reports/需求卡片-同调配装充能域封装批-2026-10-26.md`(副卡,依赖本卡——本卡完成后方可开工)
|
||||
|
||||
## 0. 前置依赖与并行性
|
||||
|
||||
- **第〇步核对(2026-10-26 写卡会话)**:来源条目=设计线条目,闭合凭据=architecture v1.16(「冒险域拆分定稿」节),放行。
|
||||
- **卡间依赖**:本卡为姊妹副卡(充能域封装)的前置——本卡末态 RunLedger 为「仅剩同调充能账+其战斗原语」的瘦身壳,副卡将其整体退役。本卡禁越界做充能单源化(§5)。
|
||||
- **并行冲突注记(呈编排段裁先后)**:①「通关口径换代批」(已写卡在册)C 注释面含 core 六件 29 处「通关」注释——与本卡同触 adventure_runner/level_runner;两批无论先后,后做者行号基线漂移(各自 T0 事实坐实吸收);同迭代排波须错文件或串行。②「调试入口写死行删除批」(已写卡在册)触 main.gd:199 与三探针断言——本卡触 main 系装配面与探针连接面,不同行域,排波无冲突但建议串行波。③与「结构小件定点修批」「levelmap装配越界与BFS缓存批」(已写卡在册)零文件交叠。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
**目标**:adventure_runner 从 989 行/42 类变量/23 公开方法的上帝对象转为**薄应用层**(DDD 应用层形态:状态机+关序推进+结算受理+建件接线+断点拼盘落盘口+效果引擎冒险桶持有,零领域决策);新件 HeroLedger(主角实体账)与 CurioStop(三选一停点件)落码;RunLedger 三账迁移瘦身;CurioDeck 纯池化;六转发信号族删除(呈现直连);关卡对象构造注入;断点片段化+获得日记键;25 条转发属性撤除+消费方改址。**游戏行为零变化**(契约 1)。
|
||||
|
||||
**改动单元清单**(与文件结构图同源):
|
||||
|
||||
| # | 单元 | 内容 |
|
||||
|---|---|---|
|
||||
| u1 | HeroLedger 建件+账本迁移 | 数值面(生命/钱包/锻造快照/类型轴/特性集/钥石/真视记录)迁入;获得日记三层结构;gp 单写原语;公式单点 |
|
||||
| u2 | CurioStop 建件 | 停点三态/刷新三源账/兑付方法族/凭证出箱;三选一信号面自带 |
|
||||
| u3 | CurioDeck 纯池化 | bind_handlers 反向回调退役;商店消费经 Callable 链至 CurioStop 兑付单点 |
|
||||
| u4 | 应用层收薄 | adventure_runner 留状态机/关序/结算受理/建件接线/桶字典持有/断点拼盘口;件出口 hero()/stop() |
|
||||
| u5 | level_runner 构造注入 | 后置 setter 群与商店重绑机制删除;8 条白盒转发属性撤除;断点关卡域片段方法 |
|
||||
| u6 | 信号直连 | 六转发信号族删除;呈现/模拟器在 level_started 重取点重订阅;恰好一次断言 |
|
||||
| u7 | 断点片段化+日记键 | 各件自交片段;应用层唯一落盘口;既有 27 键逐键冻结;获得日记键扩列(唯一声明的写入面扩展) |
|
||||
| u8 | 转发属性撤除+改址 | adventure 4 条/level 8 条/board_view 13 条撤除;A 类属性直读 49 处+B 类内部直写约 78 处(68 处迁移态+10 处 run_ledger 账本断言族)+ui_input_probe 5 处+C 类方法面约 25 文件改指件 |
|
||||
| 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——读数记录进实现报告,基线禁改)。**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);独立验收审计过。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
| # | 出处 | 取用条款 |
|
||||
|---|---|---|
|
||||
| D1 | [architecture](../design/engineering/architecture/architecture.md) **v1.16** | 核心层 HeroLedger 行、CurioStop 行;「冒险域拆分定稿」节全文(应用层形态/纯池化/RunLedger 退役与瘦身边界/构造注入/断点片段化/信号直连/调用直连/验收红线) |
|
||||
| D2 | 待办清单条目实况「验收面预案要点」 | 真实入口断言/撤销证明/27 键冻结/RNG 零漂移/基线禁改/MC 发起权归用户 |
|
||||
| D3 | [存档序列化](../design/gdd/systems/表现与支撑/存档序列化.md) 断点域节 | 27 键登记与豁免条款(本卡不改其正文——同步义务见 §6) |
|
||||
|
||||
## 3. 现状事实(2026-10-26 写卡会话实查于 master daa8860b;开工日 T0 复核行号)
|
||||
|
||||
| # | 事实 | 出处 |
|
||||
|---|---|---|
|
||||
| G1 | adventure_runner 989 行/42 类变量/23 公开方法/65 函数;七件变化原因混装(生命周期状态机/英雄账本/三选一停点/刷新双源/断点 schema/信号转发/商店装配) | `game/core/adventure_runner.gd` 全读;条目实况 |
|
||||
| G2 | 转发属性 25 条:adv `:60-77` 4 条(_curio_taken/_curio_deck/_feat_ticket_pity/_feat_ticket_sold 直指 CurioDeck 件内);level `:50-66` 8 条(直指 ShopSession 件内);board `:82-122` 13 条(直指 TilePalette/HeroSprite 件内)。生产消费零;属性直读消费=5 单测 **49 处**+ui_input_probe **5 处** | grep 全库实测+复核订正 |
|
||||
| G2b | **内部状态直写面(本批迁移态的测试直改,grilling 一轮补查)**:`_curio_pending/_curio_result/_node_curio_pending/_attune_refresh_x/_attune_refresh_y/_refresh_stock/_feats/ledger["hero_hp"]` 等直写约 **68 处/11 文件**——adventure_feats_test 15、feat_vouchers_test 14、curio_refresh_paid_test 10、meta_progression_forge_test 9(:293-303 直写停点态、:368 直读 ledger)、pool_case_d 5、cross_system_flow_test(集成)4、save_manager_domain_test 3、level_shop_economy 3、breakpoint_resume 3、treasure_effects 1。全部属 u1/u2 迁入件的承载态,随 T5 三类改址 | grilling 一轮实测 |
|
||||
| G3 | 商店重绑 `_bind_shop` 全 6 调用(`_init:84`/`start_level:165`〔单关模式账本重建重绑——G3 原漏计〕/`start_level_external:205`/`set_run_ledger:688`/`set_attunement:646`/`set_tree_rules:670`);后置 setter 群:set_run_ledger/set_attunement/set_feats/set_tree_rules/set_hero_axes/set_shop_pool/set_voucher_grants/set_treasure_unlocked | `game/core/level_runner.gd:50-66/80-84/151-165/194-205/644-709/757-768`;grilling 复核订正 |
|
||||
| G4 | 断点:`BREAKPOINT_FIELDS` 27 键 `:864-892`;`_snapshot_breakpoint` 5 调用点(`:483/:611/:665/:806/:855`);`_bp_parts` 对关卡对象五连挖(`:907-946`:node_id/shop_shelf/shop_visit_buys/visited_ids/aux_items);`_resume_*` 回填族 `:188-279` | `game/core/adventure_runner.gd` |
|
||||
| G5 | 六转发信号 `:14-19`+`_forward_*` 六方法(`:849-855/:976-989`);`_bind_level_runner` 每关 6 连接 `:724-729`;`_forward_choices_presented` 转发兼快照双职 `:853-855` | `game/core/adventure_runner.gd`;呈现订阅面=`main_adventure_flow.gd:10-15` 全六+`sim/level_autoplay.gd:143-145` 三 |
|
||||
| G6 | 加算区三写通道:三选一属性件 `adventure_runner.gd:425`(run_ledger.bonus[sink]);商店属性商品 `shop_session.gd:87-88`(bonus[attr]+=flat);战末导出 `battle_orchestrator.gd:1125-1127`(bonus_add_axis——按轴合计,无明细来源)。RunLedger 类壳触点:battle `:381` 类型检查、`:239/:757/:761-762/:1125-1127` 四族原语、`shop_session.gd:322-323` 硬转型;全仓 **18 文件**引用 RunLedger。**bonus 生产消费面 5 文件 8 处**(grilling 一轮补查):main_adventure_flow:37-38、level_map_screen:334/335/343、hud_presenter:20/313、ui_click_probe:689、level_autoplay:262 | 实读+grilling 复核核验 |
|
||||
| G7 | `effective_max_hp` 双写逐字一致靠注释维持(adv `:305-307`/level `:106-108`);`apply_rest` 委托 `:322-323`;回血公式 `LevelRunner.rest_heal` 静态 `:588-589` | 实读 |
|
||||
| G8 | encounter 注入:level `:519` `"ledger": run_ledger` 单键;begin_battle enc 装配 `:514-526` | `game/core/level_runner.gd` |
|
||||
| G9 | CurioDeck `bind_handlers` `:25-27`(adv `_init` 注入 `:85`);`consume_pool_purchase` 经回调反调宿主 `:107-113` | `game/core/curio_deck.gd` |
|
||||
| G10 | 呈现方法面消费:curio_interact_controller 16 处 `adventure.pick_curio/apply_node_curio/skip_empty_curio/refresh_*` 等;方法面总量≈25 文件(呈现 5+autoplay+约 20 测试) | grep 实测 |
|
||||
| G11 | 停点零自动推进守卫:`continue_to_next_level` `:327-333`(无待确认/停点未兑付双拒);关卡对象每关新建 `:698`;信号顺序契约(level_started→重取→入口候选呈现)`:_inject_level_params:752`+`_present_level_entry:756-761` | `game/core/adventure_runner.gd`;`game/core/level_runner.gd:226-241` |
|
||||
| G12 | 特性集活引用语义:`set_feats` 不复制(level `:655-657` 注释——关内兑付 relic 须当关生效) | `game/core/level_runner.gd` |
|
||||
|
||||
## 4. 设计契约(红线,违反 = L3 停机呈报)
|
||||
|
||||
🔴 **契约 1 · 行为零变化**:RNG 流名 reward_pick 与消费序零漂移;信号顺序契约冻结(关卡开始→重取→入口候选呈现);同种子逐位一致;玩家可见呈现零变化。MC 与基线数据逐项比对**是否发起由用户裁**(触及存档/RNG 面)。
|
||||
|
||||
🔴 **契约 2 · 断点冻结与唯一扩展**:既有 27 键键名/键序/缺省回退策略逐键冻结;唯一声明的扩展=新增获得日记键(扩列不升版;旧档缺日记→汇总键直载并跳过比对;日记在档→由日记推导汇总、与留存汇总不符即报错中止)。
|
||||
|
||||
🔴 **契约 3 · 机检纪律**:`tools/gdstyle_baseline.txt` 禁改禁 refresh,类变量计数下降属改善自然绿;**禁为迎合机检消息文本保留或新增无效成员/别名(§13)**;机检键与卡片契约互斥时停卡呈报。
|
||||
|
||||
🔴 **契约 4 · 新件红线**:Core 零 UI(headless 可跑完整冒险);全类型标注(S9);core↔core 接线只许方法 Callable 禁 lambda(S6);随机只经注入 RngServiceCore 的 reward_pick 封闭流;数值零字面量只读 db;文件头注=模块介绍(禁变更叙事/文档反链)。
|
||||
|
||||
🔴 **契约 5 · 调用直连不留壳**:不留任何纯转传委托方法(Middle Man 裁定,2026-10-26);呈现控制器经**取值回调**持件——回调只许捕获长活根对象(root),**禁件方法 Callable**(防悬挂);件出口=adventure 对象上 `hero()`/`stop()` 两个取件方法(组件出口非委托壳)。
|
||||
|
||||
🔴 **契约 6 · 注入纪律**:构造注入一次给齐(关卡对象后置 setter 群与商店重绑机制删除,`_bind_shop` 全仓仅构造一处——含单关模式重开:HeroLedger 实例不重建、走 `reset_for_single_level()` 值重置,shop 绑 hero 对象引用不换代,G3 第 6 处重绑因此消失);注入**活引用禁快照**(特性集/装配集语义——G12)。
|
||||
|
||||
🔴 **契约 7 · 重连恰好一次**:呈现/模拟器重订阅用 `is_connected` 守卫+未连即 `push_error`(release 模板剥 assert,禁裸 assert);「关卡开始信号前零发射」契约写入 level_runner 头注并配断言。
|
||||
|
||||
🔴 **契约 8 · RunLedger 瘦身不退役(本卡)**:瘦壳余面**只有** attune_charges 账+`attune_charge_has/set/consume` 三原语——bonus 账、vision_counter 账、adventure_counters 桶字典**全部退役迁出**(桶归宿主字典+encounter `"adv_bucket"` 键,battle :382 挂链改指);encounter `"ledger"` 键保留传瘦壳;整类文件删除归副卡。
|
||||
|
||||
🔴 **契约 9 · 测试改址非削弱**:A 类 49 处+B 类约 78 处与方法面改址=访问路径改写,断言语义与判据逐条保持;实现期不得借改址删断言/放宽判据(削弱申报=零)。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
**做**:u1–u9;§8 全部验收;撤销证明;产出物。
|
||||
|
||||
**不做**(去向明示):
|
||||
- **充能域封装**(AttuneLoadout 建件/物化行单源化/战斗使用管线改写/旧档同调行迁移/RunLedger 整类退役)→ 姊妹副卡 `reports/需求卡片-同调配装充能域封装批-2026-10-26.md`;
|
||||
- **level_runner 商店方法委托层拆除**(buy_product 等同签名委托)→ 在册条目「level_runner 商店委托层拆除」(待写卡);
|
||||
- 关卡主题数据缝扩展、获取即入账(用户裁维持现状)→ 不立项;
|
||||
- design/ 与根规则文件任何编辑 → 反哺点清单(§6);
|
||||
- MC/对拍锚重跑 → 用户发起。
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/engineering/architecture/architecture.md` | 模块归属表 HeroLedger/CurioStop 行「设计定稿——实现批建件」标注换代为现状;CurioDeck 行删 bind_handlers 句;level_runner 行补构造注入句;「冒险域拆分定稿」节转现状登记(RunLedger 行注记瘦身半程) | 反哺点 · 列清单 |
|
||||
| `design/gdd/systems/表现与支撑/存档序列化.md` | :59 断点域段机制句(写侧 _bp_parts 拼装/读侧 _bp_read 派生)改写为「各件自交片段+冒险应用层唯一拼盘落盘口+获得日记键扩列」 | 反哺点 · 列清单 |
|
||||
| `design/gdd/systems/冒险循环/冒险结构.md` | 断点域字段口径 owner——新增获得日记键的字段口径登记(键名/缺省策略/旧档回退) | 反哺点 · 列清单 |
|
||||
| `game/tests/验证集清单.md` | A 类 49 处+B 类约 78 处+方法面改址的清单同步(机器提取重生成) | 批内机械同步(game 内 .md,非禁写面) |
|
||||
| `待办清单.md` | 来源条目状态推进(实现批收尾由 batch-closure 承接) | 反哺点 · 列清单 |
|
||||
|
||||
## 7. 任务卡
|
||||
|
||||
### 卡前 · 文件结构图
|
||||
|
||||
| 文件 | 职责 | 行为改动 |
|
||||
|---|---|---|
|
||||
| `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→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 注入面:+`"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 |
|
||||
| `game/presentation/curio_interact_controller.gd`(修改) | 16 处调用改指 `stop()`(取值回调经 root) | 结构改动 → wr2 |
|
||||
| `game/presentation/main.gd`(修改) | 装配面:冒险对象创建传参(存档承载构造注入)与件出口接线 | 结构改动(非行为) |
|
||||
| `game/presentation/views/board_view.gd`(修改) | 13 条件成员同名转发属性删除 | 非行为改动(生产零消费) |
|
||||
| `probe/ui_click_probe.gd`(修改) | bonus 读面改指 hero(:689) | 测量面改址 → wr1 |
|
||||
| `probe/ui_input_probe.gd`(修改) | 5 处改指件(`_palette`/`_hero_sprite`) | 测量面改址 → wr7 |
|
||||
| `game/tests/unit/core/` 5 文件(修改) | 49 处属性直读改指件(A 类) | 测量面改址 → wr7 |
|
||||
| `game/tests/` 直写面 11 文件(修改) | 约 68 处内部状态直写改件公开构造面(B 类,G2b 清单) | 测量面改址 → wr7/wr2 |
|
||||
| `sim/level_autoplay.gd`(修改) | 3 处转发信号订阅改关卡对象(level_started 重连);bonus 读面改指(:262) | 测量面改址 → wr4/wr1 |
|
||||
| 其余方法面调用文件(约 20 测试文件,修改) | `adventure.pick_curio` 族改指 `adventure.stop().pick_curio`(C 类) | 测量面改址 → wr2 |
|
||||
|
||||
(新增二件与新增函数的复用/唯一性核查见「落位与可复用性预检」节;新增数据件=获得日记键〔断点扩列〕。)
|
||||
|
||||
### 接口块
|
||||
|
||||
**HeroStats(`game/core/hero_stats.gd`,v1.3 拆分——数值域)**
|
||||
|
||||
```gdscript
|
||||
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 转发件内)
|
||||
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
|
||||
var attack_type := ""; var armor_type := "" # 两根类型轴快照
|
||||
func breakpoint_fragment() -> Dictionary # hero_hp/relics 两键
|
||||
func restore_fragment(frag: Dictionary, params: Dictionary) -> void
|
||||
```
|
||||
|
||||
**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) # 载荷逐字不变
|
||||
signal curio_resolved(result: Dictionary)
|
||||
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 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 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 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 五连挖(改收片段)/hero()
|
||||
# BREAKPOINT_FIELDS 常量保留本件=键序契约(拼盘口按此断言完整性)
|
||||
```
|
||||
|
||||
**level_runner 构造注入**
|
||||
|
||||
```gdscript
|
||||
func _init(db_ref: ConfigDb, rng_ref: RngServiceCore, ctx: Dictionary) -> void
|
||||
# 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(单关测试模式)件内自建私有三件(_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 直读面收编)
|
||||
# 删除:_shop_pool_mode/_pool_deck/_pool_consume/_pool_ticket/_shop_shelf/_shop_visit_buys/_shop_paid_refreshes/_shop_purchased 八条白盒属性(内部访问改直指 _shop)
|
||||
```
|
||||
|
||||
**T 卡间接口**:T1 产出 HeroLedger 全 API(T2/T3/T4 取用);T2 产出 CurioStop API 与 stop_resolved/voucher_outbox(T3 关序受理取用);T3 产出重连点与 ctx 签名(T4/T5 取用);T4 产出片段三接口(wr6 取用);各卡验收断言随卡落地。
|
||||
|
||||
### 落位与可复用性预检
|
||||
|
||||
| 新增件 | 复用面(为何不能复用既有) | 唯一面 | 分层与交互 |
|
||||
|---|---|---|---|
|
||||
| hero_ledger.gd | 既有 run_ledger.gd 职责=跨层共享账壳(本批瘦身退役中),非主角数值实体——主语不同不可复用;grep `hero_ledger`/`HeroLedger` 零命中 | 主角数值与获得记录唯一所有者;gp/生命/加算单写原语唯一落点(三写通道收口于此) | Core 纯逻辑;由 adventure_runner 建、注入 curio_stop/level_runner/shop_session/battle encounter;零 UI、随机零消费 |
|
||||
| curio_stop.gd | 停点编排现散在 adventure_runner(本批迁出);grep 零同名类;名源=现役 `curio_stop_pending()` 谓词(:584)——件名继承在库概念 | 停点三态/刷新三源/兑付族唯一所有者 | Core 纯逻辑;随机只经注入 deck 的 reward_pick;兑付落账经注入 hero;落盘经注入方法 Callable(S6 合规) |
|
||||
| 获得日记键(数据件) | 断点键族现无日记类键(BREAKPOINT_FIELDS 实查 27 键无之) | 获得记录持久化唯一载体;与汇总键并存但日记为正主(比对规则见契约 2) | 断点域扩列,owner 口径归冒险结构.md(反哺点) |
|
||||
| ctx 注入字典 | 后置 setter 群(本批退役)的替代收口;CurioFlowContext 先例(curio_interact_controller.gd:31)同法 | 关卡依赖装配唯一入口 | 组合根→adventure→level 构造链 |
|
||||
|
||||
### T0 事实坐实+改前基线采集(≈0.35d)
|
||||
|
||||
- [ ] 复核 G1–G12 行号(吸收并行批漂移);记录改前读数:S13 三件计数(42/38/45)、`gdstyle_baseline.txt` 键数、五单测属性直读 49 处+直写面 68 处逐条清单(G2/G2b)。可核查结果:改前读数表进实现报告素材。
|
||||
- [ ] **改前断点基线采集(bp1 载体)**:新增临时对拍脚本 `game/tests/bp_baseline_dump.gd`(`--script` 直跑:固定种子集驱动 autoplay 冒险至各停点〔选路/三选一/兑付后/入口〕,逐停点 dump 断点 Dictionary 全键值)→ JSON 落 `reports/` 实现报告素材目录;批末随中间产物退役。改后复跑同脚本对比:**比对集=原 27 键**(新日记键不在改前档,排除出比对集单列核对)。可核查结果:基线 JSON 与复跑对比表在案。
|
||||
|
||||
### T1 HeroLedger 建件+账本迁移(≈1.0d)
|
||||
|
||||
- [ ] 实装 hero_ledger.gd(接口块全签名;数值面自 adventure_runner :28-77 迁入、公式自两处 :305-307/level:101-115 迁入单点;获得日记三层与三通道入口)。可核查结果:件可 `new()` 直构单测。
|
||||
- [ ] 接线换代:adventure_runner 建件;shop_session 账本引用换 hero(:322-323 硬转型退役,属性商品走 `hero.gain_bonus`〔wr1-s 断言:购买后 bonus_total 与旧径同值〕);battle encounter +`"hero"` 键、bonus_add_axis/vision_count_add 改指 hero(:1125-1127/:761-762);**bonus 生产读面 5 文件 8 处改指 `hero().bonus_total()`**(main_adventure_flow:37-38/level_map_screen:334-343/hud_presenter:20/313/ui_click_probe:689/level_autoplay:262——现经 `runner.run_ledger` 访问链,LevelRunner 侧补 `func hero() -> HeroLedger` 只读出口承接);RunLedger 删 bonus/vision 账。
|
||||
- [ ] **冒险桶迁移**:adventure_runner 持 `adventure_counters` 字典(开局清/收束清/`_resume_counters` :256-258 回填改直写本字典);battle encounter 增 `"adv_bucket"` 键、:382 挂链 `counters_ctx.adventure_bucket` 改指该键(效果引擎就地直写路径不变——引用束同字典;battle 直构无注入路径以自有空字典兜底,承现 :381 `RunLedger.new()` 兜底语义)。
|
||||
- [ ] 验收步骤:〔hr1〕单测——effective_max_hp/rest_heal 与改前逐值一致(真实入口:start_adventure→恢复点节点 rest 真链,封顶口径断言继承现役);〔hr2〕三通道日记断言——三选一件/商店商品/战末导出各走真链后 `bonus_total` 与改前读数相等、日记条目来源指回正确。撤销证明见 wr1。
|
||||
|
||||
### T2 CurioStop 建件+CurioDeck 纯池化(≈1.0d)
|
||||
|
||||
- [ ] 实装 curio_stop.gd(停点三态/刷新三源/兑付族/凭证出箱/信号面——全部自 adventure_runner :353-666 迁入,语义逐字);adventure_runner 停点段改调 `stop.open_level_clear`(关序受理读 `stop_resolved`/`voucher_outbox`)。
|
||||
- [ ] CurioDeck 纯池化:bind_handlers 删(:25-27/:85);商店消费链 ShopSession→(注入 Callable)→`curio_stop` 兑付单点(现 `_apply_curio_pick` 同口语义)。
|
||||
- [ ] 验收步骤:〔cs1〕三选一真链断言(继承条目预案:start_adventure→关卡完成→pick→断言加算区/池余量/停点态清零);〔cs2〕商店 pool 购买真链断言(buy_pool_item→兑付→摘牌/加算);〔cs3〕凭证拿到即开断言(现役断言继承改址)。撤销证明见 wr2/wr3。
|
||||
|
||||
### T3 应用层收薄+构造注入+信号直连(≈1.0d)
|
||||
|
||||
- [ ] adventure_runner 收薄:删数值面/停点族残留/六转发信号族与 `_forward_*`;`_bind_level_runner` 六连接删;`_forward_choices_presented` 的快照触发改核心侧自有受理(choices_presented 订阅归应用层,落盘口直调)。
|
||||
- [ ] level_runner 构造注入:ctx 收参、setter 群删、`_bind_shop` 收敛为构造一次;八白盒属性删(内部改直指 `_shop`);头注补「关卡开始信号前零发射」契约。
|
||||
- [ ] 呈现/模拟器直连:main_adventure_flow 在 level_started 重取点 `is_connected` 守卫重连六信号(守卫未连即 push_error);curio_interact_controller 16 处改 `stop()`(取值回调经 root,禁件方法 Callable——契约 5);autoplay 3 处同法改(autoplay 增订 level_started:在该回调重取 runner 并重连——现经冒险转发的 node_entered 内重取机制随转发族消亡,重取点前移)。
|
||||
- [ ] 验收步骤:〔sc1〕恰好一次断言(重连后同信号处理器仅一次——探针真链驱动两关全流程);〔sc2〕信号顺序契约断言(关卡开始→重取→入口候选——现役探针断言继承);〔sc3〕源码断言——`_bind_shop` 全仓仅构造一处、`_forward_` 族零命中(static_scan/冒烟源码断言形态)。撤销证明见 wr4/wr5。
|
||||
|
||||
### T4 断点片段化+日记键(≈0.75d)
|
||||
|
||||
- [ ] 三件片段接口落地(接口块签名);adventure_runner 拼盘口(BREAKPOINT_FIELDS 键序断言完整性→收片段→拼→落盘);level_runner 五键片段替代五连挖;`_resume_*` 族改分发片段。
|
||||
- [ ] 日记键写入与旧档回退(契约 2 规则)。
|
||||
- [ ] 验收步骤:〔bp1〕同种子改前改后断点逐位一致——**比对集=原 27 键**(日记新键排除出比对集、单列核对在档性)——T0 基线脚本改后复跑逐键相等(集成测试载体);〔bp2〕日记在档推导比对断言+旧档(无日记键构造档)回退直载断言;〔bp3〕续玩真链(ui_click_probe wc2 继承+wr 载荷断言)。撤销证明见 wr6。
|
||||
|
||||
### T5 转发属性撤除+测量面三类改址(≈1.0d,grilling 一轮扩容)
|
||||
|
||||
- [ ] **A 类·转发属性直读改指件(49 处/5 文件)**:`a._curio_deck`→`a._curio.deck` 等 4 属性直读改指件成员(G2 清单逐条)。
|
||||
- [ ] **B 类·内部状态直写改件面(约 78 处/12 文件,G2b 清单+账本断言族)**:停点态/账本态直写改走件公开构造面——`a._curio_pending={...}`→经 `stop()` 测试构造面(件补测试用写入口:`_test_set_pending` 形态或公开装配参数,语义=原直写);`adr.ledger["hero_hp"]` 直读→`hero().hero_hp`;**run_ledger 账本断言族改指**(约 10 处/3 文件:adventure_feats :351/362、feat_vouchers :30/110-111/117/141、level_shop_economy :1037/1322/1325 的 bonus/adventure_counters 读断言→`hero().bonus_total()`/宿主桶读面)。
|
||||
- [ ] **C 类·方法面调用改指件(约 25 文件)**:`adventure.pick_curio` 族→`adventure.stop().pick_curio`;公式调用→`hero()`。
|
||||
- [ ] 撤 25 条转发属性(adv 4/level 8/board 13——board 13 条删除即净);ui_input_probe 5 处改指件;验证集清单重生成同步(§6)。
|
||||
- [ ] 验收步骤:全套闸按域选档跑一次全绿(改址后现役断言语义不变=绿);S13 计数读数记录(读数留档)。撤销证明见 wr7。
|
||||
|
||||
### T6 撤销证明+产出物落位卡(≈0.25d,末卡)
|
||||
|
||||
- [ ] 逐 wr 行撤销证明(§8.1 末列——回退对应 hunk→最窄闸红→还原复绿,记录进实现报告)。
|
||||
- [ ] 写齐三份产出物(实现报告〔S13 读数对照+实机目检总清单+并行批交叠注记〕/代拍板追认单/反哺点清单〔§6 逐条落点〕)。
|
||||
- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。
|
||||
|
||||
**估时合计 ≈5.35d**(区间 5–5.5;T0 扩基线采集、T5 扩三类改址系 grilling 一轮订正——单卡破 5d 无碍:工作量限制属迭代层非卡片层,2026-10-25 两层口径)。
|
||||
|
||||
## 8. 验证闸
|
||||
|
||||
### 8.1 改动—验收对照表
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| wr1 账本实体化(数值面/公式单点/三通道日记) | hero_ledger 新件+shop/battle/adv 接线换代 | 〔hr1〕公式逐值断言+〔hr2〕三通道日记断言+〔hr1-s〕商店加算同值断言〔拆件批 V1〕 | 单元+接口 | start_adventure→恢复点真链;商店/三选一/战末真链 | 回退 hero 接线 hunk→hr2 红(日记断言失源) |
|
||||
| wr2 停点件迁移 | curio_stop 新件+关序受理改调 | 〔cs1〕三选一真链断言〔拆件批 V2〕 | 接口+集成 | start_adventure→关卡完成→pick 真链 | 回退停点段 hunk→cs1 红 |
|
||||
| wr3 牌库纯池化 | curio_deck bind_handlers 删+商店链改接 | 〔cs2〕pool 购买真链断言〔拆件批 V3〕 | 集成 | buy_pool_item 真链(关内商店节点) | 回退商店链 hunk→cs2 红 |
|
||||
| wr4 信号直连+恰好一次 | 六转发族删+重连点 | 〔sc1〕恰好一次+〔sc2〕顺序契约断言〔拆件批 V4〕 | 探针+系统 | 两关全流程真实驱动(探针) | 回退重连 hunk→sc1 红(双连或零连) |
|
||||
| wr5 构造注入+重绑退役 | level_runner ctx 收参 | 〔sc3〕源码断言(_bind_shop 单点/_forward_ 零命中)+特性活引用现役断言〔拆件批 V5〕 | 冒烟源码断言+单元 | 现役冒烟段+关内 relic 兑付当关生效现役断言 | 回退 ctx hunk→sc3 源码断言红 |
|
||||
| wr6 断点片段化+日记键 | 三件片段+拼盘口+日记键 | 〔bp1〕同种子 27 键逐位一致+〔bp2〕日记比对/旧档回退+〔bp3〕续玩真链〔拆件批 V6〕 | 集成+探针 | 同种子双跑+ui_click_probe 续玩 | 回退片段 hunk→bp1/bp2 红 |
|
||||
| wr7 转发属性撤除+改址 | 25 条删+A 类 49 处+B 类约 78 处+C 类方法面改指件 | 改址后现役断言全绿+S13 计数读数记录+〔pr1〕ui_input_probe 直跑绿〔拆件批 V7〕 | 单元+探针 | 五单测套+ui_input_probe | 回退改址 hunk→对应套件红(路径不存在) |
|
||||
| wr8 产出物 | T6 三份 | 件核〔wr8〕 | — | — | 缺项红 |
|
||||
|
||||
### 8.2 测试削弱申报
|
||||
|
||||
零(改址=访问路径改写,断言语义与判据逐条保持——契约 9;无任何断言删除/阈值放宽/扫描面缩小)。
|
||||
|
||||
### 8.3 独立验收审计
|
||||
|
||||
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;抽查重点=27 键逐键比对执行记录、恰好一次断言、改址断言语义等价抽检(5 文件各 ≥3 处)、S13 基线未改(git diff 查 `tools/gdstyle_baseline.txt` 零变化)、撤销证明复现。未过不得合并。
|
||||
|
||||
## 9. 异常分级
|
||||
|
||||
- **L1(自救)**:行号漂移(T0 基线对照自核);测试改址的等价写法微调。
|
||||
- **L2(记录继续)**:非断言面注释措辞;呈现装配面等价调整(不动信号契约)。
|
||||
- **L3(停机呈报)**:机检键与契约互斥(契约 3);断点键序/逐位一致断言红且非测试问题;信号顺序断言红;发现第七件变化原因需扩拆件范围;RunLedger 瘦身后仍有非副卡范围的依赖残留。
|
||||
|
||||
## 10. 代拍板白名单(超清单必呈报)
|
||||
|
||||
1. 提交切分与 worktree 分支命名。
|
||||
2. 测试改址的等价访问写法(语义不变前提下)。
|
||||
3. 迁入代码的注释随迁措辞(语义不变前提下)。
|
||||
4. 单关测试模式自建私有 HeroLedger 的内部组织。
|
||||
|
||||
## 11. 待裁点
|
||||
|
||||
**零待裁点,开工门=U0。**(全部设计裁点已在设计段闭合,凭据 architecture v1.16;本卡无新增裁量面。)
|
||||
|
||||
## 12. 自审六查与复核记录
|
||||
|
||||
**自审六查(2026-10-26 写卡会话)**:①规格覆盖——u1→T1/wr1、u2→T2/wr2、u3→T2/wr3、u4/u6→T3/wr4、u5→T3/wr5、u7→T4/wr6、u8→T5/wr7、产出物→T6/wr8,完成定义三条各有落点;②步骤扫描——每步一动作一可核查结果,无「TBD/酌情」行;③类型一致性——接口块签名与 T 卡引用逐字一致(hero()/stop()/curio_stop_pending 名源);④审查焦点——断点逐位一致(bp1)与信号恰好一次(sc1)为最可能坑点,已挂 T4/T3;文件结构图行为改动行全部指到 wr 行;⑤篇幅比例——接口块为签名非实现体,无函数体抄写;⑥落位预检——新增二件+日记键+ctx 四件各有不能复用理由与唯一落点,与结构图「新增」标记对上。
|
||||
|
||||
**grilling 一轮复核记录(2026-10-26,独立子代理对抗复核,判「回炉」——13 阻断+7 建议,v1.1 全数折入)**:①改址面系统性漏列(测试直写约 68 处/11 文件+生产 bonus 消费 5 文件 8 处)→ G2b 新增+G6 订正+T5 三类改址重列+结构图补五行;②HeroLedger 接口不完整(gp 读面/pct 与 base_override 注入/战末日记形态)→ 接口块补 `var gp`/`set_debug_override`/构造参 base_override/战末通道 source_class="battle_export" 定死;③契约互斥(sc3 单关模式重绑)→ 契约 6 裁「实例不重建、值重置、shop 绑对象不换代」;④set_shop_pool 四参无落点 → ctx 补 pool_wiring 键;⑤adventure_counters 桶迁移漏步 → T1 增桶迁移步骤+契约 8/u9 与副卡 K5 口径对齐(瘦壳余面=attune 仅存);⑥gp_grant_call 跨关调死对象 → CurioStop 生命周期定每冒险一次+`rebind_level_runner` 每关注入时点写死;⑦bp1 基线采集不可执行 → T0 补采集步骤(载体/落盘/28 键对 27 键排除法);⑧数字订正(49 处/5 处探针/_bind_shop 6 处/:50-66);⑨autoplay 重取机制 → T3 补 level_started 重连;⑩wallet_mutated 无消费方信号删除(§13 同款);估时 4.75→5.25。复核确认属实的关键事实(989 行、转发属性与信号行号、_bind_shop 六处、attune_charge_has 零调用、system_test/smoke 无方法面调用、通关批交叠面)已随订正吸收。
|
||||
|
||||
**二轮闭合复检(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,209 +0,0 @@
|
||||
# 需求卡片:同调配装充能域封装批(AdventureRunner 真拆分·副卡)
|
||||
|
||||
- 版本:**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 个工作日)
|
||||
- 开工门:U0+复核门过(§12);零待裁点
|
||||
- **前置卡**:`reports/需求卡片-冒险域拆件与账本实体化批-2026-10-26.md`(主卡)完成合回后方可开工——本卡消费其 RunLedger 瘦身壳与 encounter 多路注入面
|
||||
|
||||
## 0. 前置依赖与并行性
|
||||
|
||||
- **第〇步核对(2026-10-26 写卡会话)**:来源条目=设计线条目(同主卡),闭合凭据=architecture v1.16,放行。
|
||||
- **前置卡接口取用**:主卡 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. 目标与完成定义
|
||||
|
||||
**目标**:同调主动件充能从「字典轨+物化行轨双存、三处差额对账」改为**单源化**——物化行为唯一事实源,新建装备件 AttuneLoadout 拥有同调行并改「事后对账」为「写时种行/补行」;战斗使用与重置路径改指件;旧档读侧以行集为源;RunLedger 整类退役。**游戏行为零变化**(使用管线句柄语义逐位不变)。
|
||||
|
||||
**改动单元清单**:
|
||||
|
||||
| # | 单元 | 内容 |
|
||||
|---|---|---|
|
||||
| k1 | AttuneLoadout 建件 | 装备中的秘宝件对象集(每件内含充能单位/重置周期);种行/补行写时同步 |
|
||||
| k2 | 双轨退役 | RunLedger.attune_charges 字典轨删除;三差额对账函数退役(adv `_seed_attune_charges` :521-526/level `sync_attune_inventory` :705-715/battle `_reseed_attune_charges` :228-246 改归件方法) |
|
||||
| k3 | 战斗路径改指 | battle 使用/重置走 loadout 原语(使用管线 validate/相位/fx/overlay/consume 逐位不变) |
|
||||
| k4 | 断点与旧档迁移 | attunement_charges 键写读归件(键名策略不变);**同调行始终留在 treasure_inventory**(不剥离——使用管线与 C 区投影载体不动);旧档读侧以行集为源 |
|
||||
| k5 | RunLedger 整类退役 | 全仓零引用+文件删除;encounter `"ledger"` 键移除 |
|
||||
|
||||
**完成定义**:
|
||||
1. k1–k5 落地;全套闸按本批改动域选档全绿;`grep -rn "RunLedger\|run_ledger" game/` 零命中(含注释面随批清与测试直构改指后;.uid 随删)。
|
||||
2. 同种子改前改后:充能使用全程逐位一致(使用次数/剩余/C 区投影);旧档续玩迁移正确。
|
||||
3. 撤销证明逐 wr 行;三份产出物;独立验收审计过。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
| # | 出处 | 取用条款 |
|
||||
|---|---|---|
|
||||
| D1 | [architecture](../design/engineering/architecture/architecture.md) **v1.16** | AttuneLoadout 行(物化行为唯一事实源/种行补行写时同步/旧档迁移归件/attunement_charges 键不变);「冒险域拆分定稿」节充能单源化句与 RunLedger 退役句 |
|
||||
| D2 | 待办清单条目实况 2026-10-26 闭合注记 | 「充能改单源化:物化行为唯一事实源」(审查高危一修正的落定形态) |
|
||||
| D3 | 主卡契约 1/2/3/4 | 行为零变化/断点冻结/机检纪律/新件红线(同款适用) |
|
||||
|
||||
## 3. 现状事实(2026-10-26 写卡会话实查;行号以主卡合回后 T0 复核为准)
|
||||
|
||||
| # | 事实 | 出处 |
|
||||
|---|---|---|
|
||||
| K1 | 双轨并存:字典轨=RunLedger.attune_charges(item_id→剩余次数);物化轨=treasure_inventory 内 source_class="attunement" 行(每格充能一行,used 标记消耗);两轨靠三处差额对账维持(种子满额→数未用行→差额补行防双份) | `game/core/run_ledger.gd:9`;`adventure_runner.gd:521-526`;`level_runner.gd:705-715`;`battle_orchestrator.gd:228-246` |
|
||||
| K2 | 战斗使用管线(句柄驱动,全链骑在物化行上):validate_use(:703-717 目标窗口/板界/预读判定)→相位守卫→treasure_used fx 发射(:718-724,掘进蓄能 counter_spend 订阅依赖)→overlay 应用→consume 句柄(:754 消耗标 used)→attune_charge_consume 扣字典(:757 同点双写;行号以 T0 复核为准) | `game/core/battle_orchestrator.gd:703-763` |
|
||||
| K3 | 重置周期三态:表列 charge_reset ∈ {adventure, battle, level};「已耗 handle 作废+差额补新=回满」语义(:225-227 注释);charges_per_adventure=0=自动兑付件不入使用面(:238) | `battle_orchestrator.gd:225-246`;`data/schemas/treasure_item_table.gd:39/153-154` |
|
||||
| K4 | 断点:attunement_charges 键(keep_on_null 策略)载字典轨;aux_items 键载库存全量快照(含同调行——两键各存半边) | `adventure_runner.gd:873/927`(主卡合回后为片段面) |
|
||||
| K5 | RunLedger 瘦身后余面(主卡末态):attune_charges 账+attune_charge_has/set/consume 三原语;battle :381 类型检查、:239/:757 调用点;encounter `"ledger"` 键 | 主卡 u9;`battle_orchestrator.gd:381` |
|
||||
| K6 | C 区秘宝槽投影=treasure_inventory.query_inventory(含同调行,usable 预判) | `game/core/treasure_items.gd:42-48` |
|
||||
|
||||
## 4. 设计契约(红线,违反 = L3 停机呈报)
|
||||
|
||||
🔴 **契约 1 · 使用管线句柄语义逐位不变**:validate_use 判据/相位守卫/treasure_used fx 发射时点与载荷/overlay 应用序/consume 的 used 不可逆/重置「已耗作废+差额补新」——全部逐位保留;本卡只改「行归谁种、账归谁记」,不改任何一步的判定与顺序。
|
||||
|
||||
🔴 **契约 2 · 物化行为唯一事实源**:物化行保留(禁删行——审查 H1 裁定);删除的是字典轨与事后差额对账;剩余次数=由行的未用数派生(**唯一读法,无影子账**——al2 单源对拍兜底:行派生值=T0 基线字典轨值)。
|
||||
|
||||
🔴 **契约 3 · 断点与旧档**:attunement_charges 键名与 keep_on_null 策略不变(写读方换件);**同调行始终留在 treasure_inventory**(aux_items 键值形态逐位不变——逐位一致断言因此成立);旧档读侧以 aux_items 行集为唯一事实源恢复使用面,attunement_charges 键读值仅作一致性校验读数(不符不 fatal、记日志——键值本就派生自行);旧档缺 attunement_charges 键行为不变。
|
||||
|
||||
🔴 **契约 4 · 行为零变化与机检纪律**:同种子逐位一致;RNG 零漂移(充能域零随机——实查无 RNG 消费,保持);gdstyle 基线禁改;禁为机检文本保留无效成员(同主卡 §13)。
|
||||
|
||||
🔴 **契约 5 · 新件红线**:同主卡契约 4(Core 零 UI/S9/S6/数值零字面量/头注规范)。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
**做**:k1–k5;§8 验收;撤销证明;产出物。
|
||||
|
||||
**不做**:
|
||||
- 同调位槽位判定(attunement.gd 谓词面)——零触碰;
|
||||
- 秘宝道具(非同调)库存语义、C 区投影形状——零触碰(投影数据源不变,行集不变);
|
||||
- level_runner 商店委托层、关卡主题——在册条目/不立项(同主卡 §5);
|
||||
- design/ 与根规则文件 → 反哺点清单。
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/engineering/architecture/architecture.md` | AttuneLoadout 行标注转现状;RunLedger 相关行/句整段退役注记(「战斗域装配现状」节 RunLedger 条改写);模块表 level_runner/battle 行消费依赖列 ledger 引用句删除 | 反哺点 · 列清单 |
|
||||
| `design/gdd/systems/跨局循环/秘宝.md` | 若有充能账机制句(T0 核)——双轨描述改单源化 | 反哺点 · 列清单 |
|
||||
| `game/tests/验证集清单.md` | 充能断言改址同步 | 批内机械同步 |
|
||||
| `待办清单.md` | 条目状态推进(batch-closure 承接) | 反哺点 · 列清单 |
|
||||
|
||||
## 7. 任务卡
|
||||
|
||||
### 卡前 · 文件结构图
|
||||
|
||||
| 文件 | 职责 | 行为改动 |
|
||||
|---|---|---|
|
||||
| `game/core/attune_loadout.gd`(**新增**) | 同调配装件:装备件对象集+充能单位+种行/补行写时同步+断点片段 | 新件(承载迁移态)→ wr1/wr3 |
|
||||
| `game/core/run_ledger.gd`(**删除**,含 .uid) | 整类退役(瘦壳余面归 loadout/battle 直改后无引用) | 结构改动 → wr4 |
|
||||
| `game/core/battle_orchestrator.gd`(修改) | 充能原语调用改指 loadout(经 encounter `"loadout"` 键);重置改调件方法;`"ledger"` 键移除;:381 类型检查删 | 结构改动,管线语义不变 → wr1 |
|
||||
| `game/core/adventure_runner.gd`(修改) | 建件接线(装配集注入 loadout);`_seed_attune_charges` 段退役(改调件种子方法);断点片段装配(attunement_charges 键改收件片段) | 结构改动 → wr3 |
|
||||
| `game/core/level_runner.gd`(修改) | `sync_attune_inventory` 退役(改调件同步);ctx 增 loadout 键、删 ledger 键 | 结构改动 |
|
||||
| `game/core/treasure_items.gd`(零改动) | 物化行载体不动(投放/查询接口由件调用) | 非行为改动(零触碰——同调行始终在此) |
|
||||
| `game/tests/unit/core/feat_vouchers_test.gd`(修改) | `run_ledger.attune_charges` 直写 8 处(:73-75 等)改指件测试构造面 | 测量面改址 → wr1/wr4 |
|
||||
| `game/tests/unit/core/treasure_effects_test.gd`(修改) | :275 RunLedger 直构改指 | 测量面改址 → wr2 |
|
||||
| `game/tests/unit/battle/round_flow_skill_pool_test.gd`(修改) | :969/994 直构与 encounter 注入改指 | 测量面改址 → wr2 |
|
||||
| `game/tests/unit/core/meta_progression_forge_test.gd`(修改) | :290-291 直构改指 | 测量面改址 → wr2 |
|
||||
| `game/core/effect_engine.gd`/`effect_context.gd`(修改) | 注释中 RunLedger 表述随批清(零行为) | 非行为改动 |
|
||||
|
||||
### 接口块
|
||||
|
||||
**AttuneLoadout(`game/core/attune_loadout.gd`)**
|
||||
|
||||
```gdscript
|
||||
class_name AttuneLoadout extends RefCounted
|
||||
func _init(db_ref: ConfigDb, attunement_ids: Array) -> void # 装配集注入(活引用语义同主卡契约 6)
|
||||
# ---- 种行/补行(写时同步,替代三处事后差额对账)----
|
||||
func seed_for_adventure(inventory: TreasureItems) -> void # 冒险开始:全部 active_charged 件种行(**不筛周期**——承现 _seed_attune_charges 全量种账+sync 全量投行语义;battle/level 周期件开局即有行,C 区投影行数不变)
|
||||
func reset_cycle(cycle: String, inventory: TreasureItems) -> void # battle/level 周期回满(**按周期筛**;已耗行作废、差额补新——语义逐字承 :228-246)
|
||||
# ---- 使用面(战斗路径改指)----
|
||||
func consume_charge(item_id: String, inventory: TreasureItems) -> bool # 承 attune_charge_consume(一行标 used)
|
||||
# ---- 读面 ----
|
||||
func charges_left(item_id: String, inventory: TreasureItems) -> int # 剩余(未用行派生——唯一读法,无影子账)
|
||||
func item_ids() -> Array
|
||||
# ---- 断点片段 ----
|
||||
func breakpoint_fragment(inventory: TreasureItems) -> Dictionary # attunement_charges 键(值形状=现字典轨 {item_id:剩余}——由行派生,键名/策略不变)
|
||||
func restore_fragment(frag: Dictionary, inventory: TreasureItems) -> void # 旧档:以行集为源恢复使用面;frag 键值仅校验读数(不符记日志不 fatal);缺键保持种子态(原语义)
|
||||
```
|
||||
|
||||
**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" 注入)→ 改直构主角账件+`"journal"`/`"adv_bucket"` 键注入(v1.3——原 `"hero"` 键随主角账三件拆分换代);meta_progression_forge_test:290-291 同款;effect_engine.gd:94/effect_context.gd:3 注释中 RunLedger 表述随批清(注释面,非行为)。
|
||||
|
||||
**主卡接口取用**:主角账件(v1.3 拆分后=HeroStats/GpWallet/GainJournal 三件——充能交互零涉及)、ctx 注入面(本卡扩两键)、片段三接口形态(本卡同形扩展)。
|
||||
|
||||
### 落位与可复用性预检
|
||||
|
||||
| 新增件 | 复用面 | 唯一面 | 分层与交互 |
|
||||
|---|---|---|---|
|
||||
| attune_loadout.gd | 既有 attunement.gd=槽位判定谓词(职责不同不可复用);treasure_items.gd=库存载体(行归它管、不归件管——件持投放与判定,行数据仍单点在库存);grep `attune_loadout/AttuneLoadout` 零命中 | 同调行投放/充能判定/周期回满唯一所有者;与 attunement.gd 词形区分明确 | Core 纯逻辑;由 adventure_runner 建件注入 encounter 与 level ctx;零随机(K4 承)、零 UI |
|
||||
|
||||
### T0 事实坐实(≈0.15d)
|
||||
|
||||
- [ ] 复核 K1–K6 行号(主卡合回后坐标);记录改前读数:同种子三关冒险的充能使用全程记录(种子/使用次数/各停点剩余/C 区投影行数)——wr1 对拍基线。可核查结果:基线表进实现报告素材。
|
||||
|
||||
### T1 AttuneLoadout 建件+双轨退役(≈0.6d)
|
||||
|
||||
- [ ] 实装 attune_loadout.gd(接口块全签名;种行/补行/使用面——语义逐字承三处对账函数与原语)。
|
||||
- [ ] 三处对账退役:adv `_seed_attune_charges` 改调 `seed_for_adventure`;level `sync_attune_inventory` 改调件同步(或并入 reset_cycle 调用点);battle `_reseed_attune_charges` 改调 `reset_cycle`;RunLedger attune 三原语调用清零。
|
||||
- [ ] 验收步骤:〔al1〕单测——三周期回满语义(adventure 全量种行+battle/level 按周期回满各态:已耗行作废、差额补新、charges=0 件不入使用面——判据值承现役断言)+**开局投影行数断言**(seed 后 C 区行集与改前同构——周期件开局即有行);〔al2〕**单源对拍断言**——`charges_left`(行派生)=T0 基线字典轨终值(改前采集),逐件逐停点相等。撤销证明见 wr1。
|
||||
|
||||
### T2 战斗路径改指+RunLedger 退役(≈0.5d)
|
||||
|
||||
- [ ] encounter 键换代(+loadout/−ledger);battle 三点改指(:239/:757/:381 承址);使用管线其余步骤零触碰(契约 1)。
|
||||
- [ ] RunLedger 文件删除(全仓 grep 零引用为前置;.uid 同删)。
|
||||
- [ ] 验收步骤:〔al3〕使用真链断言——真实冒险驱动同调件使用,**六步各一条**(validate 拒绝/validate 受理/**相位守卫拒绝(非 Active 拒用)**/fx 发射/overlay 应用/used 不可逆),现役断言继承改指;〔al4〕源码断言 `RunLedger|run_ledger` 全仓零命中〔配装批 V4〕。撤销证明见 wr2。
|
||||
|
||||
### T3 断点片段+旧档迁移(≈0.4d)
|
||||
|
||||
- [ ] attunement_charges 键写读归件(值由行派生——键值形态不变);旧档读侧以行集为源(键值仅校验读数——契约 3)。
|
||||
- [ ] 验收步骤:〔al5〕同种子改前改后断点逐位一致(27 键全量——同调行留库存故 aux_items 值不变;承主卡 bp1 载体复跑);〔al6〕旧档读侧断言——构造含同调行的旧断点档,续玩后使用面充能=行集派生值、行集与改前一致(键值校验读数落日志)。撤销证明见 wr3。
|
||||
|
||||
### T4 撤销证明+产出物落位卡(≈0.15d,末卡)
|
||||
|
||||
- [ ] 逐 wr 行撤销证明;三份产出物(实现报告〔对拍基线表+读数〕/代拍板追认单/反哺点清单)。
|
||||
- [ ] 合并前置:独立验收审计(§8.3)逐行「通过」。
|
||||
|
||||
**估时合计 ≈1.8d**(区间 1.5–2)。
|
||||
|
||||
## 8. 验证闸
|
||||
|
||||
### 8.1 改动—验收对照表
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 撤销证明 |
|
||||
|---|---|---|---|---|---|
|
||||
| wr1 充能单源化(种行/补行/使用面) | attune_loadout 新件+三对账退役 | 〔al1〕周期回满单测+〔al2〕单源对拍断言(行派生=基线字典轨值)〔配装批 V1〕 | 单元 | 件直构单测+冒险真链驱动 | 回退种行 hunk→al1 红 |
|
||||
| wr2 战斗路径改指+RunLedger 退役 | battle 三点改指+文件删除 | 〔al3〕使用真链断言+〔al4〕零引用源码断言〔配装批 V2〕 | 接口+集成+冒烟源码断言 | 真实冒险驱动同调件使用 | 回退 encounter 键 hunk→al3 红;al4 随文件复现红 |
|
||||
| wr3 断点片段+旧档读侧 | attunement_charges 键归件+行集为源读侧 | 〔al5〕27 键逐位一致+〔al6〕旧档行集为源断言〔配装批 V3〕 | 集成 | 同种子双跑+构造旧档续玩 | 回退片段 hunk→al5 红 |
|
||||
| wr4 产出物 | T4 三份 | 件核〔wr4〕 | — | — | 缺项红 |
|
||||
|
||||
### 8.2 测试削弱申报
|
||||
|
||||
零(改址与退役文件的断言迁移,语义逐条保持;RunLedger 相关既有断言随 al1/al3 承接改写路径,判据值不变)。
|
||||
|
||||
### 8.3 独立验收审计
|
||||
|
||||
入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;抽查重点=使用管线六步逐位核(validate/fx/overlay/consume 时点)、旧档迁移映射逐行、RunLedger 零引用复核、对拍基线表在案。未过不得合并。
|
||||
|
||||
## 9. 异常分级
|
||||
|
||||
- **L1(自救)**:行号漂移;迁移映射的等价写法。
|
||||
- **L2(记录继续)**:注释措辞。
|
||||
- **L3(停机呈报)**:使用管线任一步判定/顺序变化(契约 1 破);断点逐位一致红;发现非充能域的 RunLedger 残留依赖(越主卡范围)。
|
||||
|
||||
## 10. 代拍板白名单(超清单必呈报)
|
||||
|
||||
1. 提交切分与 worktree 分支命名。
|
||||
2. 种行/补行的内部组织(语义不变前提下)。
|
||||
|
||||
## 11. 待裁点
|
||||
|
||||
**零待裁点,开工门=U0。**(设计裁点已闭合于 architecture v1.16;本卡无新增裁量面。)
|
||||
|
||||
## 12. 自审六查与复核记录
|
||||
|
||||
**自审六查(2026-10-26 写卡会话)**:①规格覆盖——k1→T1/wr1、k2→T1/wr1、k3→T2/wr2、k4→T3/wr3、k5→T2/wr2、产出物→T4/wr4;②步骤扫描——无「TBD/酌情」行;③类型一致性——接口块与 T 卡引用逐字一致,主卡取用面(ctx/片段形态)与主卡接口块对齐;④审查焦点——使用管线逐位不变(契约 1+al3 六步含相位钉)与旧档读侧(al6)为最可能坑点;treasure_items 零触碰行已在结构图标「非行为改动」;⑤篇幅比例——签名与断言,无实现体;⑥落位预检——新增一件有不能复用理由(attunement 槽位谓词职责不同、treasure_items 是载体非所有者),唯一落点已答。
|
||||
|
||||
**grilling 一轮复核记录(2026-10-26,独立子代理对抗复核,判「回炉」——阻断 5 条(编号9–13)+关联建议,v1.1 全数折入)**:⑨aux_items「剥离迁移」与逐位一致/禁删行三方互斥 → 口径裁死「同调行始终留库存」,迁移重定义为键写读归件+旧档读侧行集为源(键值仅校验读数),契约 3/k4/接口块/al5/al6 同步改写;⑩seed 筛周期与现状矛盾(battle/level 周期件开局即有行)→ seed_for_adventure 改全量种行不筛周期+开局投影行数断言;⑪RunLedger 退役后桶链无源 → encounter "adv_bucket" 键沿用主卡(:382 已改指)写明零动作;⑫grep 零命中不可达+「零交叠」不实 → 结构图补 treasure_effects/round_flow_skill_pool/meta_progression_forge 三测试与 effect_engine/effect_context 注释清,并行注记补通关批交叠;⑬charge_available 承接零调用点原语+两读法未定义 → 删该接口、al2 改「行派生值=T0 基线字典轨值」单源对拍断言。建议级折入:al3 补相位守卫钉、K2 行号小漂注(consume :754/attune :757)。
|
||||
|
||||
**二轮闭合复检(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 同款)。
|
||||
@@ -1,213 +0,0 @@
|
||||
# 需求卡片:技能池情境条件触发器批
|
||||
|
||||
> 来源:待办清单「技能池情境条件触发器」条目(2026-10-18 登记)
|
||||
> 唯一事实源:design/gdd/systems/战斗循环/敌人系统.md v1.2 §核心规则「触发条件」节(2026-10-26 文档设计已闭合;v1.0 立节·v1.1 单体寻址批随动·v1.2 百分比事实读数定阈值式——本卡依 v1.2)+ §技能行字段词汇表 trigger 行+ §池构成纪律+ §意图线索(半血解锁弹出规格)
|
||||
> 估时:≈3 个工作日(T0 0.4/T1 0.7/T2 0.8/T3 0.4/T4 0.7)
|
||||
> 状态:v1.2 定稿——grilling 两轮复核(一轮回炉:2 阻断+8 应修+5 建议全折入,含设计文档 v1.2 阈值式联动修订;二轮通过,附残留 R1-R5+S1-S3 已全部折入),零待裁点
|
||||
|
||||
## 一、目标与完成定义
|
||||
|
||||
**做什么**:把敌人系统 v1.2 定稿的触发条件机制实装——技能行加 `trigger` 字段({fact, op, value, latch} 封闭词表),开轮摇号前对每敌求值,条件不满足的技能不进可摇集合与保底集合(门槛过滤);三 Boss 半血解锁技 `unlock_hp_pct` 收编为闩型首用例(行为零变化);两个示范投放(地精池低血防御增益、钩爪恐魔池停手偷袭伤害技);事实面供给埋点(轮次/上轮结束方式/踩雷计数)。
|
||||
|
||||
**完成定义**:
|
||||
1. 六事实词+六算子求值器全实装,fact/op 出域与 latch 语义加载期校验,缺省无 trigger 字段=旧行为零变化。
|
||||
2. 三 Boss 解锁技(quake_smash/venom_curb/rockslide)迁移后同种子战斗行为逐位复现(解锁时点/归因行/enemy_hp_threshold 事件全部保持)。
|
||||
3. 新池构成纪律「每池至少一行无条件特殊技」入跨表校验。
|
||||
4. 两示范投放真实入口可验(低血时防御技可摇出、上轮停手后偷袭技可摇出)。
|
||||
5. 验证闸对照表全行绿,独立验收审计通过。
|
||||
|
||||
## 二、设计事实源
|
||||
|
||||
- `design/gdd/systems/战斗循环/敌人系统.md` v1.2(2026-10-26 文档设计闭合凭据,与待办清单条目实况所记一致):
|
||||
- §核心规则「触发条件:情境技与闩型解锁共用一套门槛」——机制(门槛过滤/求值时点/字段四键/闩语义/事实词表六词/算子六词与百分比阈值式求值/互作用表/半血解锁收编/首批落地);
|
||||
- §技能行字段词汇表 trigger 行(字段域);§池构成纪律(每池至少一行无条件特殊技);§调参表技能表 trigger 行(投值归难度曲线与Boss);§验收标准触发条件条。
|
||||
- 数值投值(权重/阈值终值)所有权:`design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.0「技能池投值」节——本批只投 provisional 示范值。
|
||||
|
||||
## 三、现状事实(开工自行复核)
|
||||
|
||||
| # | 事实 | 位置 |
|
||||
|---|---|---|
|
||||
| 1 | 实例池快照:skill_id/weight/cooldown_left 三键+unlock_hp_pct 快照与 unlocked 闩标记 | game/core/unit_container.gd:84-96 |
|
||||
| 2 | 锁定判定 `_entry_locked`(unlock_hp_pct 且未过闩=锁定) | game/core/unit_container.gd:137-138 |
|
||||
| 3 | 可摇集合 `rollable_skills`(排除锁定+冷却中) | game/core/unit_container.gd:143-153 |
|
||||
| 4 | 保底特殊技集合 `special_skills`(排除锁定;type≠basic) | game/core/unit_container.gd:158-169 |
|
||||
| 5 | 半血解锁闩检查 `check_skill_unlocks`:threshold=round(max_hp×pct/100),hp≤threshold 过门、单向闩、返回新解锁 skill_id 列表 | game/core/unit_container.gd:172-186 |
|
||||
| 6 | 开轮摇号 `_roll_round_actions`:保底判定→roll→behavior_roll 统一流逐敌摇定→tick_cooldowns | game/core/battle_orchestrator.gd:952-991 |
|
||||
| 7 | 解锁归因明细行(skill_unlock 高光键)+enemy_hp_threshold 事件发射+target_attack_bonus 施加(pct 从池条目读) | game/core/battle_orchestrator.gd:962-983 |
|
||||
| 8 | round_index 编排器自有(1 基,开战置 1,轮末递增) | game/core/battle_orchestrator.gd:44,435,1083 |
|
||||
| 9 | 上轮结束方式记录 `_last_round_end={path_tag, continuation_hint}`,path_tag∈{cleared,stopped,ap_exhausted};`last_round_end` 只读属性已有 | game/core/action_economy.gd:32-34,274 |
|
||||
| 10 | 技能表 schema:行字段校验+pity_threshold;无池视野(池构成纪律在跨表通道) | game/data/schemas/skill_table.gd:3,19-97 |
|
||||
| 11 | 敌人表 schema:池条目 weight 校验+unlock_hp_pct 域校验 [1,99] | game/data/schemas/enemy_table.gd:108-116 |
|
||||
| 12 | 跨表池构成纪律校验(每池恰一普攻/增益≤1/妨害≤1/skill_id 悬空) | game/core/config_db_cross_validator.gd:117-156 |
|
||||
| 13 | 现行 8 处 unlock_hp_pct:50 池条目:quake_smash(:148,:176)/venom_curb(:416,:447)/rockslide(:659,:687,:715,:743) | game/data/tables/enemy.tres |
|
||||
| 14 | 三解锁技技能行(quake_smash ×2.5/CD4 · venom_curb ×2.0/CD3 · rockslide ×2.5/CD4) | game/data/tables/skills.tres:67,73,79 |
|
||||
| 15 | 地精池现状:attack w9+lunge w1(无增益行——加增益技不违 ≤1);钩爪恐魔池现状:attack w6+bite w2+charge w1(charge 是增益——加伤害技合规) | game/data/tables/enemy.tres:19-25,490-501 |
|
||||
| 16 | blast 分支统一受理点——**不只过雷**:负向 enemy_alert(雷,reward.tres:90)与正向 spark_aoe(:28)、清图奖励 clear_blast(:110)同走此分支;mines 计数埋点必须加「负向 blast(雷)」守卫,否则正向爆裂格误计入踩雷数 | game/core/battle_orchestrator.gd:861+game/data/tables/reward.tres:28,90,110 |
|
||||
| 17 | 既有测试锚:skill_unlock_test.gd(门谓词/闩不可逆/双面过滤/保底不逼/零扰动/确定性,期望值由表读值推导);round_flow_skill_pool_test.gd V4 池构成纪律复查 | game/tests/unit/battle_settlement/ |
|
||||
| 18 | 单测 manifest 显式注册制(新单测须登记行) | game/tests/run_all.gd:40-49 |
|
||||
| 19 | 减伤状态行先例:fortify(target_side enemy / magnitude −50 / percent / duration 2 / refresh / max_stack 1) | game/data/tables/status_effects.tres:71-79 |
|
||||
| 20 | 编排器经 action_economy 只读属性取上轮读数先例(ap_exhausted_last) | game/core/battle_orchestrator.gd:104 |
|
||||
|
||||
## 四、设计契约(🔴=违反即 L3 停机呈报)
|
||||
|
||||
1. 🔴 **门槛过滤唯一语义**:trigger 只作可摇集合排除项(rollable 与 special 双面);禁权重改写、禁强制触发、禁保底逼出条件不满足的技。摇号公式(权重份额归一)与 `behavior_roll` 流消费序零漂移。
|
||||
2. 🔴 **三 Boss 迁移零变化**:迁移后同种子战斗事件序列(解锁时点/归因行文本/enemy_hp_threshold 载荷)与迁移前逐位一致(target_attack_bonus 施加值不经本批改动面,由 V4 载荷 pct 键+V5 对拍承载)。百分比事实求值=阈值式(v1.2):先把 value 折算为绝对阈值 `round(对应 max_hp × value/100)`、再与当前 hp 作算子比较——六算子都在该阈值上定义,lte 与原解锁式逐位同;禁改为百分比读数取整后比较(取整读数与零变化在非整除血量上互斥)。
|
||||
3. 🔴 **求值时点**=每轮开轮摇号前、读当时快照;逐敌事实各自求值、全局事实全场一份;本系统零随机纪律不变。
|
||||
4. 🔴 **缺省零扰动**:无 trigger 字段的技能行与无 trigger 池条目行为逐位不变;旧表(除三 Boss 迁移行与两示范行外)零改动。
|
||||
5. 🔴 **fail-fast**:fact/op 出域、value 越域、latch 非布尔、键白名单外的 trigger 键——加载期报错并止动;新池构成纪律违规(每池无条件特殊技行数=0)同。
|
||||
6. 🔴 **数值单点**:trigger 行值与示范投放值只落 `game/data/tables/*.tres`;禁代码内数值字面量(表读值推导断言先例=skill_unlock_test)。
|
||||
7. 🔴 **每池增益≤1 纪律不动**:desperate_guard 计入地精池增益预算(现状 0→1 合规);sneak_ambush 为伤害技不计入。
|
||||
8. **闩型保留解锁弹出规格**;非闩型(瞬态)条件技零弹出、零新增呈现(明细行具名即因果承载——敌人系统「意图线索」节)。
|
||||
9. latch=true:首次求值真后整场保持为真(治疗抬血不回锁);latch 缺省=false(每轮重求值)。
|
||||
|
||||
## 五、范围边界
|
||||
|
||||
**做**:trigger 字段全套(schema/校验/求值/过滤/闩);三 Boss unlock_hp_pct 迁移;两示范投放+一个新减伤状态行;四项事实面供给(round_index/last_round_end/mines_hit_last/mines_hit_total)+self_hp_pct/hero_hp_pct 容器内直读;跨表新纪律;测试面与验证集清单重生成。
|
||||
|
||||
**不做**(去向):
|
||||
- hero_hp_pct/round_index/mines_hit_* 四词的投放数据行——机制承载即可,首批无投放内容(后续内容批)。
|
||||
- 权重改写/强制触发形态——设计已淘汰(2026-10-26 设计段裁决记录)。
|
||||
- 呈现新增(toast/归因标注)——非闩型零弹出;玩家反馈「感知不到因果」时另立批。
|
||||
- 全局特殊间隔旋钮、个体化变体池——待办清单独立条目,本批不触。
|
||||
- 数值终值投值——难度曲线调参批;本批示范值全标 provisional。
|
||||
|
||||
## 六、关联文档同步面(实现批禁写 design/ 与根规则文件,全部列反哺点)
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| design/gdd/systems/战斗循环/敌人系统.md v1.2 | §P1 表「情境条件触发器」行标注「设计已闭合待实装」→ 实装后应改「已实装(日期)」;§半血解锁收编段「字段换代与行值迁移归实装批」句随迁移完成摘除 | 反哺点:iterN-反哺点清单,文档批落文 |
|
||||
| design/gdd/systems/战斗循环/战斗结算.md v1.0 | 开轮摇号排除句已含触发条件指针——查实装后无新陈述漂移则记「无需改」 | 反哺点清单记行(结论「无需改」亦成行) |
|
||||
| design/engineering/architecture/architecture.md | UnitContainer 新公开方法(check_trigger_unlocks/事实组包口径)若属 API Boundaries 登记面 | 反哺点:架构登记行,文档批落文 |
|
||||
| design/gdd/systems/冒险曲线域(难度曲线与Boss.md v1.0) | 触发条件行值随实装登记读表口径——正文已写机制指针,无陈述变更 | 无需改(查无漂移则记「无」) |
|
||||
| 待办清单.md | 条目「技能池情境条件触发器」实现完成后的退役 | 收尾段义务(batch-closure),非实现批面 |
|
||||
| 体验验证清单.md | 停手被偷袭/低血防御的实机目检观测项入册 | 反哺点:入册观测项一条,文档批落文 |
|
||||
| game/tests/验证集清单.md | 新增断言全体入册 | 随批重生成(tools/extract_checks.py,机械产物) |
|
||||
|
||||
## 七、落位与可复用性预检
|
||||
|
||||
| 新增件 | 复用面判定 | 唯一面与分层 |
|
||||
|---|---|---|
|
||||
| 求值器(UnitContainer 内) | 不复用 effect_engine 的 FACTS/OPS:那边求值面=事件现场 payload,本面=开轮快照,语义不同;**复用的是校验范式**(封闭枚举 const+validate 出域 errs+键白名单——effect_words 同款) | 求值谓词归敌人系统语义层(unit_container,check_skill_unlocks 先例同构:谓词在容器、调用时点在编排器);词表常量落 skill_table.gd(表 schema 是字段域权威——敌人系统「调参表」) |
|
||||
| trigger schema 校验 | 复用 skill_table.validate() 既有 errs 模式(domain/enum/cross_field 类别) | 技能行字段校验在 SkillTable;池构成新纪律在 config_db_cross_validator.gd(池视野唯一处)——两处职责既有分界不动 |
|
||||
| mines 计数(本场累计+上轮值+当轮累计) | grep 全仓无现成战斗域踩雷计数(effect_engine fx_counters 是秘宝效果账,职责不同不复用);blast 受理点 :861 经**负向 blast(雷)守卫后**即每雷恰一次必经点 | battle 域编排事实,落 battle_orchestrator 私有状态(begin_battle 清零/负向 blast 受理累加/轮末转存 last——round_index 同款生命周期) |
|
||||
| round_index/last_round_end 事实 | 直接复用编排器 :44 与 action_economy.last_round_end :33(零新增状态) | facts 组包在编排器开轮摇号前一次成型(:104 ap_exhausted_last 组包先例同构) |
|
||||
| desperate_guard/sneak_ambush 技能行+defensive_stance 状态行 | 状态行复用 fortify 的消费路径(enemy_defense 池乘区——零新消费面);不复用 fortify 行本身(设计段裁「不复用硬化」) | 行落 tres 表本体;display_name 中文白话(「孤注守势」「趁隙偷袭」) |
|
||||
| trigger_cond_test.gd 新单测 | 复用 test_kit(Kit.check/finish)与 skill_unlock_test 的表读值推导范式 | 落 tests/unit/battle_settlement/,manifest 登记(run_all.gd 注册制) |
|
||||
|
||||
## 八、验证闸(改动—验收对照表)
|
||||
|
||||
尾缀〔触发器批 Vn〕;撤销证明=回退该 hunk→跑最窄套件→断言红→还原复绿。
|
||||
|
||||
| # | 需求点 | 改动 | 验收测试 | 层级 | 真实入口 | 撤销证明 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | trigger 立列+出域拒绝 | skill_table.gd 加 TRIGGER_FACTS/TRIGGER_OPS/TRIGGER_KEYS 常量+validate 校验段 | V1 正反六反例(fact 出域/op 出域/键白名单外/latch 非布尔/last_round_end 配非 eq·neq 算子/枚举事实 value 非法串均报错;合法行零 error)——trigger_cond_test.gd | 单元 | db.load_tables 真实加载含构造行夹具表 | 删校验段→V1 红 |
|
||||
| 2 | 门槛过滤双面 | unit_container rollable_skills/special_skills 增条件排除 | V2 断言:条件假时 rollable 与 special 均不含该技;条件真时含——trigger_cond_test.gd | 单元 | spawn 真实表→直调 rollable/special | 回退过滤→V2 红 |
|
||||
| 3 | 保底不逼条件不满足技 | _roll_round_actions 保底集合取 special_skills(已含排除) | V3 断言:合法构造池(无条件特殊技 A w1+条件假技 B w9999+普攻)basic_streak≥M 时,保底命中摇出的是 A——夹具经加载后内存改行(round_flow:637 白盒先例)注入;固定种子下确定性断言 | 接口 | special_skills 真实入口+SkillLottery.draw 真实摇号 | 回退 special 排除→选定经试跑验证使撤销态摇出 B 的固定种子(w9999 份额 99.99%,种子验证后钉死)→同种子必中 B→红 |
|
||||
| 4 | 闩型语义+归因保持 | check_skill_unlocks 改 check_trigger_unlocks(u, facts):self_hp_pct lte 闩型,返回新过闩列表 | V4 断言:过门恰一次、治疗抬血不回锁、enemy_hp_threshold 载荷三键(unit/pct/is_boss)保持——trigger_cond_test.gd+skill_unlock_test.gd 换代断言(迁移后跑原语义);阈值式判别由 V8 同数据两态承载(hp=3 触发/hp=4 不触发),本行不重复构造 | 单元+接口 | spawn 三 Boss 坐标真实表→直调→编排器事件断言(载荷观测带处刑台订阅夹具——adventure_feats_test 先例) | 回退闩标记→V4 红 |
|
||||
| 5 | 三 Boss 迁移零变化 | enemy.tres 删 8 处 unlock_hp_pct+skills.tres 三行加 trigger{self_hp_pct,lte,50,latch:true} | V5 同种子对拍:固定种子 Boss 战事件序列摘要(解锁时点/归因行文本/载荷)迁移前后逐位一致——trigger_cond_test.gd 存基线比对 | 集成 | begin_battle→逐轮 settle 真实战斗驱动 | 删 skills.tres 三行 trigger 键(表迁移半边)→check_trigger_unlocks 读不到条件→闩永不置→V4/V5 红 |
|
||||
| 6 | 事实面供给 | 编排器 facts 组包(round_index/last_round_end/mines_hit_last/mines_hit_total)+计数埋点(负向 blast 守卫累加/轮末转存/开战清零) | V6 断言:真实踩雷(负向 blast)递增、**正向 blast 格(spark_aoe)与清图奖励(clear_blast)不递增**、轮末转存、开战清零;facts 组包四键在位——trigger_cond_test.gd | 集成 | 真实 request_dig→settle 驱动踩雷与正向爆裂格 | 回退累加行→V6 红;漏守卫→反例断言红 |
|
||||
| 7 | 每池至少一行无条件特殊技 | config_db_cross_validator 加校验 | V7 正反:现行全表零违例;构造全条件池夹具→报 pool_composition 错——trigger_cond_test.gd | 接口 | 跨表校验真实入口 | 删校验段→V7 反例不红 |
|
||||
| 8 | 示范投放:低血防御 | skills.tres desperate_guard 行(buff/defensive_stance/duration 2)+status_effects.tres defensive_stance 行+地精两行池条目 w1+trigger{self_hp_pct,lte,35} | V8 断言:地精(hp 基线 8)按阈值式 T=round(8×35/100)=3——hp>3 时该技不入可摇集合、hp≤3 后入池可摇中——trigger_cond_test.gd | 集成 | spawn 地精行→压 hp→开轮摇号真实路径 | 删池条目→V8 红 |
|
||||
| 9 | 示范投放:停手偷袭 | skills.tres sneak_ambush 行(damage ×1.5/CD4)+钩爪恐魔三行池条目 w2+trigger{last_round_end,eq,"stopped"} | V9 断言:首轮(last=无)与 cleared/ap_exhausted 轮后该技不入集合;stopped 轮后入集合——trigger_cond_test.gd | 集成 | 真实 finish_round_stop→次轮摇号 | 删池条目→V9 红 |
|
||||
| 10 | 缺省零扰动 | trigger 全套对无字段行为零影响 | V10 断言:无 trigger 行的池快照逐键无新增(快照键策略钉死:无 trigger 行快照零新键)、摇号结果同种子不变——skill_unlock_test.gd 既有 _test_plain_rows_zero_drift 扩展 | 单元 | goblin 池真实快照 | 回归钉(防未来给普行塞键),撤销语义由 V2/V5 联合覆盖——如实申报,不单独配撤销 |
|
||||
|
||||
**测试方式两分法**:V1-V10 全部走调试接口直改数据面(构造夹具表/直改 hp/直发 finish_round_stop),归自动化;实机目检项=「上轮停手→下轮结算明细出现『趁隙偷袭』」「地精低血后摇出『孤注守势』」两项,登记实现报告实机目检总清单+体验验证清单反哺点,**登记不阻塞**。
|
||||
|
||||
**闸口径**:本批改动含 game/ 行为载体→按改动域跑 `tools/run_all_gates.sh` 对应域档全绿才合并;里程碑步(T 段)出口跑一次全套,波内修复只做出红最小单元最窄确认,新增测试先行孤立验证再并入。
|
||||
|
||||
**测试削弱申报**:①skill_unlock_test.gd 既有断言因 unlock_hp_pct 字段退役需改写读值来源(表读值路径从池条目改技能行 trigger)——断言语义全部保持,仅数据源换代;②round_flow_skill_pool_test.gd :604 expect_pools 逐行精确比对——地精两行与钩爪恐魔三行的期望值随 T3 投放改写(9/1→9/1/1、6/2/1→6/2/1/2),断言语义不变仍精确比对,消息串中「unlock_hp_pct 50」措辞随字段退役同步清理;③round_flow:654/:660 直调 rollable_skills(u) 原样保留(缺省参下单参调用合法,实现若取改仅限直调面补参);④round_flow V4 池纪律复查段随新纪律扩行(只增不删)。除此之外零删除断言。
|
||||
|
||||
**独立验收审计**:入口=没参与实现的子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;审计三查(对照表逐行/撤销证明抽查复现/削弱检查)未过禁合并。
|
||||
|
||||
## 九、任务卡
|
||||
|
||||
### 卡前·文件结构图
|
||||
|
||||
| 文件 | 职责 | 行为改动 | 验收行 |
|
||||
|---|---|---|---|
|
||||
| game/data/schemas/skill_table.gd(改) | trigger 词表常量+行校验 | 行为改动 | V1 |
|
||||
| game/core/config_db_cross_validator.gd(改) | 每池至少一行无条件特殊技 | 行为改动 | V7 |
|
||||
| game/core/unit_container.gd(改) | 快照 trigger/闩标记、双面过滤、check_trigger_unlocks 求值 | 行为改动 | V2/V4/V10 |
|
||||
| game/core/battle_orchestrator.gd(改) | facts 组包、mines 计数埋点、解锁调用迁移 | 行为改动 | V4/V5/V6 |
|
||||
| game/data/tables/skills.tres(改) | 三 Boss 行加 trigger+两新技能行 | 行为改动 | V5/V8/V9 |
|
||||
| game/data/tables/enemy.tres(改) | 删 8 处 unlock_hp_pct+五处示范池条目 | 行为改动 | V5/V8/V9 |
|
||||
| game/data/tables/status_effects.tres(改) | defensive_stance 新行 | 行为改动 | V8 |
|
||||
| game/tests/unit/battle_settlement/trigger_cond_test.gd(新增) | V1-V10 主体 | 新增测试 | 全行 |
|
||||
| game/tests/unit/battle_settlement/skill_unlock_test.gd(改) | T1 段随改名/签名/读值源换代(语义零变化)+零扰动扩展 | 测试维护 | V4/V10 |
|
||||
| game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd(改) | V4 池纪律复查扩行+expect_pools 期望值随投放改写+直调面 facts 适配 | 测试维护(含申报②③) | V7 |
|
||||
| game/tests/run_all.gd(改) | manifest 登记新套件 | 非行为改动(注册表) | — |
|
||||
|
||||
### T0 · 基线录制与表/ schema 迁移(≈0.4d)
|
||||
|
||||
取用:无(首卡)。
|
||||
产出:`TRIGGER_FACTS := ["self_hp_pct","hero_hp_pct","round_index","last_round_end","mines_hit_last","mines_hit_total"]`、`TRIGGER_OPS := ["eq","neq","gt","gte","lt","lte"]`、`TRIGGER_KEYS := ["fact","op","value","latch"]` 三常量(skill_table.gd);skills.tres 三 Boss 行 trigger 落位;enemy.tres 8 处键删除;V5 基线文件。
|
||||
|
||||
- [ ] 步骤 1(基线录制):迁移前用固定种子驱动三 Boss 各一场真实战斗(begin_battle→循环 settle 至战斗结束),把事件序列中 skill_unlock 归因行文本、enemy_hp_threshold 载荷、每轮各敌 pending_skill 序列摘要落 `game/tests/evidence/trigger_baseline.md`(批内凭据,非长期基线)——这是 V5 的「改前」半边。
|
||||
- [ ] 步骤 2(schema 校验段):skill_table.validate() 加 trigger 校验——四键白名单、fact∈TRIGGER_FACTS、op∈TRIGGER_OPS、**last_round_end 行 op 只许 eq/neq(枚举算子限域)、value 类型随 fact(数值事实必整数、百分比事实域 [1,99]、枚举事实必枚举串 {none,cleared,stopped,ap_exhausted})**、latch 必须 bool;普攻行禁配 trigger(普攻恒可摇的结构前提,与倍率/冷却禁配同款 cross_field)。V1 正反断言随本步骤落地(trigger_cond_test.gd 于本卡立件——V1 是本批首组断言,含算子限域与类型分派反例,先行孤立验证后并入 manifest)。
|
||||
- [ ] 步骤 3(表迁移):skills.tres quake_smash/venom_curb/rockslide 三行加 `"trigger": {"fact":"self_hp_pct","op":"lte","value":50,"latch":true}`;enemy.tres 删 8 处 `"unlock_hp_pct": 50` 行;enemy_table.gd:111-116 unlock_hp_pct 域校验段删除(字段退役);**enemy.tres:780 池注与 skills.tres:134-135 头注提及 unlock_hp_pct/解锁语义的措辞随字段退役同步清理**(J 面:注释不残留退役字段名)。
|
||||
- [ ] 步骤 4(加载验证):`python tools/run_smoke.py` 绿(表加载零 error——若红,红点即迁移漏项)。
|
||||
|
||||
### T1 · 求值器与实例池快照(≈0.7d)
|
||||
|
||||
取用:T0 的 TRIGGER_* 常量与已迁移表。
|
||||
产出:`UnitContainer.check_trigger_unlocks(u: Dictionary, facts: Dictionary) -> Array`(闩型条目求值,返回新过闩 skill_id 列表)、快照键 `trigger_latched: bool`(迁移原 unlocked);`rollable_skills(u, facts := {}) / special_skills(u, facts := {})` 增可选参(**缺省空字典——既有单参调用零破坏,skill_unlock_test/round_flow 直调面在 T2 前不红**)。
|
||||
|
||||
- [ ] 步骤 1(快照扩展):池快照循环节(unit_container.gd:85-96)——从 db.skill_row 读 trigger 存快照(技能行是字段权威);带 latch=true 行写 `trigger_latched:false` 初始;unlock_hp_pct/unlocked 双键退役。**百分比事实求值契约(v1.2 阈值式)在此钉死:六算子统一为「先折算绝对阈值 T=round(对应 max_hp × value/100),再以 hp op T 比较」——self_hp_pct/hero_hp_pct 两 fact 同式。**
|
||||
- [ ] 步骤 2(求值谓词):`_entry_blocked(e: Dictionary, u: Dictionary, facts: Dictionary) -> bool`——无 trigger 恒 false;latch 已闩恒 false(过闩即不再拦);否则按 fact 分派求值(self 类读 u 自身、hero 类读主角行、其余读 facts 键,枚举事实按字符串比较);**facts 缺键=条件假(拦)——fail-safe,缺省 {} 调用遇上非 self/hero 事实时不放行**;`_entry_locked` 退役由本谓词收编。
|
||||
- [ ] 步骤 3(双面过滤):rollable_skills/special_skills 接入 `_entry_blocked`(与冷却排除并列;facts 缺省 {} 对无 trigger 行为零差)。
|
||||
- [ ] 步骤 4(闩检查换代):check_skill_unlocks 改名 check_trigger_unlocks(u, facts)——只处理 latch=true 且未闩条目,求值真即置 trigger_latched 并收集返回;**本方法只读 facts 原值,last_round_end 的 none 映射不在本层(唯一落点=T2 facts 组包)**。同步改 skill_unlock_test.gd 全部直调面(改名+facts 签名)与读值源(unlock_hp_pct 池键→技能行 trigger.value),断言语义零变化——**本卡出口全套必须绿**(签名缺省值保证 round_flow:654/:660 单参调用不破)。
|
||||
- [ ] 步骤 5(V2/V4 并入):trigger_cond_test.gd 承接 T0 立件——V2 双面过滤、V4 闩语义(过门恰一次/抬血不回锁/阈值式判别例 max_hp=8/value=35:hp=3 触发 hp=4 不触发)断言落地,直跑本套件绿。
|
||||
|
||||
### T2 · 编排器接线与事实面供给(≈0.8d)
|
||||
|
||||
取用:T1 的 check_trigger_unlocks 与 facts 签名。
|
||||
产出:`_roll_round_actions` 内 facts 组包(`{round_index, last_round_end, mines_hit_last, mines_hit_total}`);编排器私有 `_mines_hit_total/_mines_hit_last/_mines_hit_round: int`(定名与步骤 1 一致);解锁调用点迁移完成。
|
||||
|
||||
- [ ] 步骤 1(计数埋点):battle_orchestrator 加三变量——`_mines_hit_total`(本场累计)/`_mines_hit_last`(上轮值)/`_mines_hit_round`(当轮累计);三条公式:负向 blast(雷)受理时 `_mines_hit_round` 与 `_mines_hit_total` 各 +1(**守卫:只计负向 blast 行——正向 spark_aoe 与清图奖励 clear_blast 同走 blast 分支不得计入,reward.tres 极性判读**);轮次真正结束后 `_mines_hit_last=_mines_hit_round`、`_mines_hit_round=0`(轮内部分结算不更新);begin_battle 三者清零。
|
||||
- [ ] 步骤 2(facts 组包):_roll_round_actions 开头组包 facts 字典(round_index 直读、last_round_end 经 action_economy.last_round_end——**空字典(首轮)映射 "none",否则 path_tag 原值;none 映射唯一落点在本组包处**、双 mines 键);hero 事实不进 facts(容器内直读主角行——T1 已定)。
|
||||
- [ ] 步骤 3(解锁调用迁移)::965 check_skill_unlocks(u) 改 check_trigger_unlocks(u, facts);:972-975 pct_v 读值源从池条目 unlock_hp_pct 改技能行 trigger.value;归因行文本/enemy_hp_threshold 载荷格式零改动。
|
||||
- [ ] 步骤 4(摇号接线)::984/:986 rollable_skills(u)/special_skills(u) 调用补 facts 实参。
|
||||
- [ ] 步骤 5(V5/V6 落地):V5 同种子对拍断言(与 T0 步骤 1 基线逐位比对——解锁时点/归因文本/载荷/pending 序列);V6 计数埋点断言(真实 request_dig 踩雷→settle→读数递增/转存/清零)。直跑本套件绿。
|
||||
|
||||
### T3 · 跨表纪律与示范投放(≈0.4d)
|
||||
|
||||
取用:T0-T2 全套机制。
|
||||
产出:config_db_cross_validator 新校验;desperate_guard/sneak_ambush/defensive_stance 三新行与五处池条目。
|
||||
|
||||
- [ ] 步骤 1(新纪律):config_db_cross_validator.gd 池构成段加「无条件特殊技行数 ≥1」校验(普攻不计;trigger 缺省行计数)——V7 正反断言(现行全表零违例+构造全条件池夹具报错)。
|
||||
- [ ] 步骤 2(状态行):status_effects.tres 加 defensive_stance 行(display_name「护身」/target_side enemy/magnitude −25 provisional/percent/duration_settlements 2/refresh/max_stack 1——fortify 同构消费路径)。
|
||||
- [ ] 步骤 3(技能行+池条目):skills.tres 加 desperate_guard(buff/「孤注守势」/buff_ref defensive_stance/duration 2/trigger{self_hp_pct,lte,35})与 sneak_ambush(damage/「趁隙偷袭」/damage_mult 1.5/cooldown 4/trigger{last_round_end,eq,"stopped"}——两行全部 provisional);enemy.tres 地精两行池加 desperate_guard w1、钩爪恐魔三行池加 sneak_ambush w2。
|
||||
- [ ] 步骤 4(V8/V9 落地):低血防御两态断言(hp 高于阈值不入集合/打低后入)、停手偷袭三态断言(首轮无/stopped 后有/cleared 后无)——真实 finish_round_stop 驱动。直跑本套件绿。
|
||||
|
||||
### T4 · 测试收口与产出物落位(≈0.7d)
|
||||
|
||||
取用:T0-T3 全部断言。
|
||||
产出:验证集清单重生成;实现报告/代拍板追认单/反哺点清单三件。
|
||||
|
||||
- [ ] 步骤 1(换代收尾):round_flow_skill_pool_test.gd V4 段扩「无条件特殊技 ≥1」行+expect_pools 期望值改写(申报②③);skill_unlock_test.gd 复核 T1 段换代后全套绿。
|
||||
- [ ] 步骤 2(清单):`python tools/extract_checks.py` 重生成 game/tests/验证集清单.md,diff 核对新增断言全数入册、零意外删改。
|
||||
- [ ] 步骤 3(撤销证明记录):按对照表逐行执行回退→红→还原→复绿,记录落实现报告(V5/V8/V9 三条必含)。
|
||||
- [ ] 步骤 4(全套闸):run_all_gates.sh 本批域档全绿。**MC 口径:本批含 provisional 池权重投放=数值改动——出口闸锚内子集(地精/钩爪恐魔行为面)同种子复放预期判红,按锚流程呈报用户、重锚归用户档位发起,实现批不自行重锚。**
|
||||
- [ ] 步骤 5(三产出物):实现报告(各卡状态+实机目检总清单两项+遗留读数义务)/代拍板追认单(见白名单)/反哺点清单(§六同步面各行逐条落点)。
|
||||
|
||||
## 十、异常分级
|
||||
|
||||
- **L1 自救**:测试夹具构造错误、断言消息措辞、注释与命名微调、tres 格式缩进。
|
||||
- **L2 记录继续**:示范 provisional 数值在同数量级内调整(记代拍板追认单);既有断言因读值源换代的等价改写(已申报范围)。
|
||||
- **L3 停机呈报**:契约任一条触红(尤其 V5 对拍不一致=迁移引入行为漂移);V5 基线无法录制;MC 对拍锚判红;schema 校验与文档词表冲突;行为_roll 消费序漂移嫌疑。
|
||||
|
||||
## 十一、代拍板白名单
|
||||
|
||||
1. 新技/状态行英文 id 与中文 display_name 定名(desperate_guard/sneak_ambush/defensive_stance 为推荐案)。
|
||||
2. 示范 provisional 数值(w1/w2、lte 35、−25、×1.5、CD4、duration 2)同数量级内取值。
|
||||
3. trigger_cond_test.gd 内部断言组织与夹具表构造方式。
|
||||
4. V5 基线摘要的哈希/序列化具体格式。
|
||||
5. 注释与措辞(符合 code-conventions §1.4.1 黑名单)。
|
||||
|
||||
## 十二、待裁点
|
||||
|
||||
零待裁点——机制/词表/收编/纪律/投放位全部经 2026-10-26 文档设计段裁定(敌人系统.md v1.0),本卡为其实现展开。开工门=U0 用户发令。
|
||||
|
||||
## 十三、禁为机检文本保留无效成员
|
||||
|
||||
本卡属机制新增批(兼含 unlock_hp_pct 退役迁移):unlock_hp_pct/unlocked/_entry_locked 等旧成员随迁移**删净**,禁为兼容既有测试文本保留别名或死键;机检/测试期望值与新契约冲突时停卡呈报(V5 对拍基线除外——它锚的就是旧行为的退役前快照,属本卡申报面)。
|
||||
Reference in new issue
Block a user