merge: 卡⓪主菜单开局缺陷修复批落籍(2026-10-08 goal 卡⓪先行——两入口补传同调三键+开场行改传生效值+冒烟+6断言=840/0+删三行重复赋值;重闸三件全绿;resume 侧 tree_rules 受理缺口在册披露归用户裁)
This commit is contained in:
commit
9160942a71
5 files changed
+155
-7
No files matched your search
@@ -903,3 +903,5 @@
|
||||
396. **天赋树货币甲案修复批+卡③提案 S2 纠偏重写落籍(2026-10-07,裁决依据=用户 2026-10-07「按甲方案修复完」——树全钥石单币落定,T8「GP 余额域缺位」双币骨架披露销账;worktree g-plan2-iter18-treefix 分支 iter18-treefix 基点 3e9360d 三提交 d7a6406 修复/30154e5 提案 v1.1/129c21c 出口报告,主区 merge --no-ff 3b86c9b 零冲突)**:①修复六文件——meta_tree.tres 脊柱 16 行(sp_hp/atk/hit/ac × r1..r4)currency gp→keystone(价格 10/20/30/40 不动 provisional 归 M4)+表尾 T8 注释改钥石口径+裁甲销账行注;meta_progression.gd tree_buy 删 currency 分叉直走 spend_keystone(tree_buy_fork 原本同口零改动);meta_tree_table.gd CURRENCIES {gp,keystone,free}→{keystone,free}(缺省容忍语义不变)+头注单币口径;camp_overlay_view.gd 树购买钮「购买 N」→「购买 N 钥石」;smoke_all.gd 4670/4677 断言消息文字随批换代(逻辑零改);meta.tres 表尾陈旧注释顺带订正(「与 GP 商店同族…base 10」→同族指数值档位非货币+base_price 现值 20 系 2026-09-22 对齿批投值)。②卡③提案 v1.1 盘问轮 S2 纠偏——货币前提全案订正(现役营地一切消费货币=钥石非金币:buy_forge/tree/刷新升级全走 spend_keystone 消费口;GP=局内一次性货币开局清零不入存档两币永不互兑 元进度.md:55;错误根源=meta_tree.tres 脊柱行 gp 声明+meta.tres 陈旧注释「与 GP 商店同族」误导成文):〇节原案一/F1 事实行/4b 乙引文/5a 丙论据/第九节定价行/汇总表 5b-1、5c 行逐处换代;裁点 5b 整节重组(甲=纯钥石推荐/乙=局外金币余额域淘汰/丙=第三货币锻造币淘汰);裁点 5c 前提换钥石(甲=纯钥石零材料推荐,原「不要材料」结论存活);文末新增修订记录 v1.1;全文「金币」扫尾残余 9 处均系订正说明与备选案描述对象合法。③文档随批 F 三文档 grep 全零命中零改动(元进度.md 实际在 systems/跨局循环/〔任务书误写冒险循环目录,偏差披露〕无树双币表述/entities.yaml 无树货币登记/06-待办清单无 T8 树货币追认挂单项)。闸=worktree 基线冒烟 834/0+改后冒烟 834/0+probe_gate --click 全绿批末残留 0+ui_layout exit0 零脚本错误+ui_tune PASS+run_all 17 套件全绿+doc 三闸/熵增闸既有命中零新增(死链 4/gdd_lint 2 文件/退役术语 3/design-diagrams 越界均基点在案,本批触碰文件不在扫描域);MC 零跑(静态论证:tree_buy 改动前后同走 spend_keystone+free 行 price=0 零额消费无副作用+currency 字段全仓无残余消费方;经验背书=改后 834/0 全绿);主区落籍闸=冒烟 834/0+probe_gate --click 全绿(残留 Godot=0)。出口报告=design/qa/iter18-treefix-exit-report-2026-10-07.md(提交清单/闸数字/改动对照/文档命中清单/偏差披露六节);主区并行遗留脏文件全程只标旗不碰。;编排全程零停机点触发、零用户中断(③⑤⑦④ 各卡 §8 停机点全未触发,过程红灯八笔全部卡内自救闭环并留痕各出口报告);主区终态=冒烟 834/0(本迭代 811→834,+3 混编+20 生涯)+probe_gate --click 全绿+ui_layout/ui_tune exit0;四卡产物=提案 311 行 17 裁点待盘问/混编行 (2,5) 落表+07⑱ 读数义务/种子三分+浮窗四件+生涯页+存档 v6;**编排坑三笔在册**=①roadmap 相邻行换代合并冲突→「分支内并入 master」union 解(先例台账 386)②worktree 守卫豁免判据=命令文本须显式指向兄弟 worktree 路径且不含主区路径,主区内临时分支 git commit 放行不可靠(钩子按当前分支读值瞬时态)→台账统一走专用 ledger worktree 路线③合并后全局类名缓存陈旧致 click 探针挂死(--import 重刷即愈);主区并行遗留脏文件全程只标旗不碰(10→12 件系并行美术会话所为)。**人闸与裁决移交**=①卡③ 提案 17 裁点盘问裁决(异步不阻塞)②实机目检总清单 design/qa/迭代18-实机目检总清单-2026-10-07.md(⑤四项/⑦八项/④六项)③卡⑦ 代拍板追认六项+卡④ 追认十一项④卡⑤ 难度带 MC 取证顺延 Alpha 收官 M4 数值批届时另令;M4 数值批保持 Alpha 收官位未排期待用户发令。
|
||||
|
||||
397. **迭代 19 五卡 goal T0 开工(2026-10-08,用户令五卡打包一次跑完——卡⓪主菜单开局缺陷修复批先行+卡①②③并发≤3+卡④收尾,全绿前禁停;本 goal 即 U0)**:定义面落籍单独一笔提交(roadmap 迭代19/20 行+06-待办清单+四任务书〔卡①自动化验收 v1.1/卡②旧界面断言回补 v1.1/卡③CI预接线 v1.2/卡④提灯载体 v1.2〕六文件入库;主区其余脏文件全属在飞遗产禁碰零触碰);基线复读三闸全绿=冒烟 834/0 三闸过+run_all 17 套件全绿+probe_gate 含 click 全绿(残留 Godot=0);台账预配号分配=卡⓪398/卡①399-400/卡②401/卡③402/卡④403/总收口404起(各卡记账前逐笔查撞,撞号顺延+出口报告披露)。
|
||||
398. **迭代 19 卡⓪主菜单开局缺陷修复批(2026-10-08,裁决依据=roadmap 卡⓪任务面+06-待办清单两缺陷条〔2026-10-07 用户确认成立〕;worktree g-plan2-iter19-card0 分支 iter19-card0-20261008 基点 b0a73df)**:四件全落——①主菜单开新/续玩两入口补传同调三键(main.gd 新增 static build_adventure_params :496-513 两入口共用构造,:471/:530 接线;取值与营地投影同源零新读取逻辑=装配集 save.attunement_equipped/Y 刷新池 meta.attune_refresh_charges/树 rule 键集 meta.tree_rule_keys;runner 侧受理零改动);②关卡开场行改传当前生效值(main.gd:539-549——int(db.hero.atk/max_hp) 表值→runner.effective_atk/effective_max_hp 与战斗面板同源,「含面板加成」后缀判断追加认 meta.hero_override atk/max_hp 局外 flat,白板局不带);③冒烟补两入口传参断言 +6 项(smoke_all.gd:4661-4687 直呼 build_adventure_params 单测统一构造面,开新/续玩×三键与来源一致+extra 并入,夹具 smoke_meta_tree 档 luck_coin+Y2 档+fg_posture a 侧,834→840);④删 adventure_runner.gd 三行重复赋值(原 :132-134 与 :129-131 逐字重复+中间零语句+_seed_attune_charges 纯重置幂等=零行为变化,删后 run_all 直呼参数面套件零漂移佐证)。重闸三件全绿=冒烟 840 项 0 失败三闸过(+6 全系新增断言)+probe_gate 含 click 全绿(click 走查真跑主菜单开局一场冒险问题=0)+run_all 17 套件全绿+残留 Godot=0;MC 零跑静态论证在案(MC 取数面直呼 runner 不经主菜单入口零触及);范围外三件(X/Y 双源倒置/被动同调呈现/Fork 归因行)零触碰。**披露/移交**——runner 侧 resume_adventure 受理面无 tree_rules 键(:215-217 仅两键,任务书「接收面现成」对 tree_rules 不成立):两入口三键均已传出、续玩局 tree_rules 暂不被消费与修复前同态无回归,补一行受理即可闭环归用户裁定随后续批落。出口报告=design/qa/iter19-card0-exit-report-2026-10-08.md;提交四笔 1d2894b(①②)/fb845b7(③)/8a654cc(④+出口报告)/本笔(台账记账)。
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
# 迭代 19 卡⓪「主菜单开局缺陷修复批」出口报告(2026-10-08)
|
||||
|
||||
- worktree:`D:\code\g-plan2-iter19-card0`(分支 `iter19-card0-20261008`,基点 b0a73df = master 顶部)
|
||||
- 台账号:**398**(记账前以 `git -C D:/code/g-plan2 show master:active.md` 查撞——master 无 398;397 条预配「卡⓪398」与本卡一致,未撞未顺延)
|
||||
- MC/verifier:零跑(本卡 MC=静态论证,见 §5)
|
||||
|
||||
---
|
||||
|
||||
## 1. 四件逐件改动对照(file:line 改前 → 改后)
|
||||
|
||||
### ① 主菜单两入口补传同调三键
|
||||
|
||||
T0 实查:行号与任务书一致(新冒险入口 main.gd:510、继续上局入口 main.gd:470);接收面确认 start_adventure :129-130+138 三键齐、resume_adventure :215-216 仅两键(见 §7 披露项)。三键来源复用既有营地投影口径,零新读取逻辑:
|
||||
|
||||
| 键 | 来源(既有访问器) | 与营地投影同源依据 |
|
||||
|---|---|---|
|
||||
| attunement | `save_manager.attunement_equipped()`(save_manager.gd:314-316) | `meta.attune_camp_status()["equipped"]` 同一读数源(meta_progression.gd:368) |
|
||||
| attune_refresh_y | `meta.attune_refresh_charges()`(meta_progression.gd:394-395,当前等级行表值) | `attune_camp_status()["refresh"]["charges"]` 同一读数源(:386) |
|
||||
| tree_rules | `meta.tree_rule_keys()`(meta_progression.gd:241-253,Fork 激活侧 effects) | 树 rule 键集唯一既有取值口 |
|
||||
|
||||
改动(均 `game/presentation/main.gd`):
|
||||
|
||||
- **新增 static 构造函数 `build_adventure_params`**(改前 :493 空、改后 :496-513)——两入口共用参数面构造;hero_override 沿用既有 `meta.hero_override() if meta != null else {}` 口径原样搬入;static 形态=冒烟直呼单测(③),免实例化整菜单场景。
|
||||
- **继续上局入口**(`_resume_from_menu`,改前 :470 内联 2 键 dict `{"hero_override", "treasure_unlocked"}` → 改后 :470-471 `build_adventure_params(save_manager, meta, {"treasure_unlocked": ...})`,产出 5 键)。
|
||||
- **开新冒险入口**(`_start_adventure`,改前 :510 内联 4 键 dict → 改后 :528-530 `build_adventure_params(save_manager, meta, {"first_script", "treasure_unlocked", "shop_mode"})`,产出 7 键)。
|
||||
|
||||
runner 侧受理零改动(任务书明令「无需改 runner 侧受理」)。
|
||||
|
||||
### ② 关卡开场行攻血改传当前生效值 + 后缀认局外加成
|
||||
|
||||
改动(`game/presentation/main.gd` `_on_adventure_level_started`,改前 :517-521 → 改后 :539-549):
|
||||
|
||||
- 攻/血:改前传初始表值 `int(db.hero.atk)` / `int(db.hero.max_hp)` → 改后传 `runner.effective_atk()` / `runner.effective_max_hp()`——与战斗面板同源(battle_orchestrator begin_battle enc 的 `hero_atk`/`hero_max_hp` 即 LevelRunner.effective_*,level_runner.gd:479-480)。回调时点 runner 已带全部加成:`level_started` 在 `_runner.start_level_external(...)` 之后 emit(adventure_runner.gd:946,改后 :943),base_override/加算区/调试 pct 均已注入。
|
||||
- 「含面板加成」后缀判断:改前只认 `debug_overlay.atk_pct() > 0 or debug_overlay.hp_pct() > 0` → 改后追加认局外加成 `meta.hero_override()` 的 atk/max_hp 两轴 flat 任一 >0(调试 pct 条件保留)。白板局(无局外 flat、无面板 pct)不带后缀。后缀文案本身零改。
|
||||
- 依据:06-待办清单「关卡开场行攻血显示初始表值」条——「战斗面板用 level_runner.gd:480 生效值……两处数字对不上;后缀只认调试浮窗 pct,局外加成不触发注记」,用户 2026-10-07 确认缺陷成立。
|
||||
|
||||
`battle_narrator.gd:38-40`(level_open_line)零改——签名与拼装能力本就够用。
|
||||
|
||||
### ③ 冒烟补主菜单入口传参断言
|
||||
|
||||
改动(`game/smoke/smoke_all.gd`,新增 :4661-4687,⑫同调段之后、`_meta_smoke_cleanup()` 之前):
|
||||
|
||||
- 形态:直呼 `load("res://presentation/main.gd").build_adventure_params(...)` 单测统一构造面(static 免实例化整菜单场景,对既有冒烟夹具零侵入——level_autoplay 直呼 runner 的旧口径原样不动)。
|
||||
- 夹具(隔离档 `_META_SMOKE_PATHS[8]`=smoke_meta_tree.json,随段尾既有 cleanup 清理):装配 `["luck_coin"]` + Y 升 2 档 + Fork `fg_posture` 取 a 侧;前置断言防空转(rule 键非空 + Y=Lv2 行表值 2)。
|
||||
- 断言 6 项(大白话文案):
|
||||
1. 前置:Fork 侧 a 激活 rule 键非空 + Y=Lv2 行表值 2;
|
||||
2. 开新冒险:同调装配 = 存档装配集(营地装了什么开局就带什么);
|
||||
3. 开新冒险:Y 刷新池 = 当前等级行表值(营地升几档开局就给几次);
|
||||
4. 开新冒险:树 rule 键集 = Fork 激活侧 effects(点哪侧带哪侧);
|
||||
5. 开新冒险:入口特有键(first_script/shop_mode)随 extra 原样并入;
|
||||
6. 继续上局:三键与开新冒险同源同值(续玩不吃白板开局)。
|
||||
- 两入口覆盖说明:真实两入口共用 `build_adventure_params`(①的落法),开新/续玩两组断言即两路径的传参面;构造函数被两入口弃用回归时第 2-6 项即转红。
|
||||
|
||||
### ④ 删 adventure_runner.gd 三行重复赋值
|
||||
|
||||
改动(`game/core/adventure_runner.gd`,改前 :132-134 三行 → 删;现 :129-131 单组赋值收尾):
|
||||
|
||||
零行为变化证据:
|
||||
|
||||
1. **逐字重复**:被删 :132-134 与保留 :129-131 三行逐 token 相同(`_attunement = params.get(...)`、`_attune_refresh_y = maxi(0, int(params.get(...)))`、`_seed_attune_charges()`),同一 params 实参下二次赋值结果逐位相等。
|
||||
2. **中间无扰动**::131 与被删 :132 之间零语句——两次 `_seed_attune_charges()` 连续背靠背调用。
|
||||
3. **`_seed_attune_charges` 幂等**(:635-640,改后 :632-637):函数体 = `attune_charges = {}` 整体重置后按 `_attunement`+表行重灌——纯函数(读 params 已落地的 `_attunement` 与 db 表行,零 RNG、零信号、零 db 写),连续两次调用终态与一次相同。
|
||||
4. **闸实证**:删后 run_smoke 840/0、run_all 17 套件全绿(含 breakpoint_resume/curio_refresh_paid 等直呼 start_adventure 参数面的套件)——充能账本/刷新双源行为断言零漂移。
|
||||
|
||||
## 2. 闸数字(改前基线 / 改后)
|
||||
|
||||
| 闸 | 改前(主区 b0a73df 实测基线) | 改后(本 worktree 批末) |
|
||||
|---|---|---|
|
||||
| run_smoke | 834 项 0 失败,三闸过 | **840 项 0 失败,三闸过**(+6=③新增断言,失败数持平 0) |
|
||||
| probe_gate 默认段 | input/struct/contrast 三探针全绿 | 三探针全绿 |
|
||||
| probe_gate --click | 全绿 | 全绿(click 走查真跑主菜单开局一场冒险,问题=0) |
|
||||
| run_all | 17 套件全绿 | 17 套件全绿 |
|
||||
| 残留 Godot | 0 | **0**(probe_gate 批末闸「本闸残留 Godot=0 · 全局 Godot=0」) |
|
||||
|
||||
中间轮次:改动落齐后即跑轻闸(probe_gate 默认段全绿 + run_smoke 840/0),批末重闸三件全跑如上。
|
||||
|
||||
## 3. MC 零跑静态论证(一句话)
|
||||
|
||||
本卡 MC=静态论证:MC 取数面不经主菜单入口(adventure_monte_carlo/level_autoplay 直呼 AdventureRunner 参数面,在册夹具口径不动),故 ①② 的呈现层改动对 MC 路径零触及,MC 零跑零风险。
|
||||
|
||||
## 4. 范围外三件未触碰声明
|
||||
|
||||
- X/Y 刷新双源语义倒置(adventure_runner.gd 原 :658-659/:706-709,删重后 :655-656/:703-706):**零触碰**(④删除的三行在其上方,纯行号平移,内容未动——待用户裁定甲/乙)。
|
||||
- 被动同调件呈现:**零触碰**。
|
||||
- Fork 规则归因行(呈现层):**零触碰**。
|
||||
- 主区其余脏文件:**零触碰**(全程只在本 worktree 改动三文件+出口报告+active.md;主区仅 `git -C` 只读查询)。
|
||||
|
||||
## 5. 遗留与移交项
|
||||
|
||||
1. **runner 侧 resume_adventure 受理面无 tree_rules 键**(:215-217 仅收 attunement/attune_refresh_y;任务书「接收面 :215-217 现成」对 tree_rules 不成立)。本卡按「无需改 runner 侧受理」执行:两入口三键均已传出,续玩局 tree_rules 暂不被消费(=续玩局 Fork 规则键暂不生效,与修复前同态、无回归)。移交:runner 侧补一行受理(`_tree_rules = params.get("tree_rules", ...)` 同 :138 款)即可闭环,归用户裁定后随任一后续批落。
|
||||
2. X/Y 双源语义倒置仍待用户裁定(范围外,登记 06)。
|
||||
3. 开场行后缀在「局内有加算区 flat 但无局外加成」时无注记(数字含加算区但 suffix 不带)——按任务书「局外加成存在才带」字面口径执行,如需扩展认加算区归设计批裁定。
|
||||
|
||||
## 6. 提交清单
|
||||
|
||||
(本节随提交落定,见 git log——分四笔:修复①② / 断言③ / 清理④+出口报告 / 台账 398 记账。)
|
||||
@@ -128,9 +128,6 @@ func start_adventure(seed_val: int, params: Dictionary = {}) -> bool:
|
||||
_treasure_unlocked = params.get("treasure_unlocked", {}) if params.get("treasure_unlocked", {}) is Dictionary else {}
|
||||
_attunement = params.get("attunement", []) if params.get("attunement", []) is Array else [] # additive(迭代 11 第①批 T5)
|
||||
_attune_refresh_y = maxi(0, int(params.get("attune_refresh_y", 0))) # additive(迭代 11 第①批 T5b——Y 冒险周期池)
|
||||
_seed_attune_charges() # 迭代 11 第①批 T6——冒险开始充能账本按装备主动件重置(每冒险充能语义) # additive(迭代 7 T5)
|
||||
_attunement = params.get("attunement", []) if params.get("attunement", []) is Array else [] # additive(迭代 11 第①批 T5)
|
||||
_attune_refresh_y = maxi(0, int(params.get("attune_refresh_y", 0))) # additive(迭代 11 第①批 T5b——Y 冒险周期池)
|
||||
_seed_attune_charges() # 迭代 11 第①批 T6——冒险开始充能账本按装备主动件重置(每冒险充能语义)
|
||||
# 特性开局注入(迭代 12 T7——MC 成型画像载体:params.relics_seed 非空=开局持有集〔七流派
|
||||
# 各 2 件档一成型——测量面专用;真实局规则改写型特性只走局内随机渠道,红线②层级纪律不破〕)
|
||||
|
||||
@@ -467,7 +467,9 @@ func _resume_from_menu() -> void:
|
||||
log_view.clear()
|
||||
logger.start_session(int(bp.get("master_seed", 0)))
|
||||
adventure.set_hero_override(debug_overlay.atk_pct(), debug_overlay.hp_pct())
|
||||
if not adventure.resume_adventure(bp, {"hero_override": meta.hero_override() if meta != null else {}, "treasure_unlocked": _treasure_ui.unlocked_set()}):
|
||||
# 迭代 19 卡⓪①——同调三键随续玩下传(build_adventure_params 统一构造,与开新局同源同口径)
|
||||
if not adventure.resume_adventure(bp, build_adventure_params(save_manager, meta,
|
||||
{"treasure_unlocked": _treasure_ui.unlocked_set()})):
|
||||
_fatal_screen("续玩恢复失败——见输出日志")
|
||||
return
|
||||
|
||||
@@ -491,6 +493,23 @@ func _wire_adventure() -> void:
|
||||
adventure.set_save_manager(save_manager) # 断点承载注入(迭代 8 卡①——停点快照写盘;调试/模拟不经过此路径)
|
||||
|
||||
|
||||
# 冒险开局参数面构造(主菜单开新/续玩两入口共用——迭代 19 卡⓪①:同调三键随开局下传,真实局此前恒空。
|
||||
# 取值口径与营地投影完全同源:装配集=save.attunement_equipped(save_manager.gd 访问器)、Y 刷新池=
|
||||
# meta.attune_refresh_charges(当前等级行表值)、树 rule 键集=meta.tree_rule_keys(Fork 激活侧 effects);
|
||||
# hero_override 沿用既有 meta 现算口径。static 形态=冒烟直呼单测本函数,免实例化整菜单场景)。
|
||||
# 注:runner 侧 resume_adventure 受理面现收 attunement/attune_refresh_y 两键(tree_rules 暂不消费——
|
||||
# 传参先行,受理缺口在册披露)。
|
||||
static func build_adventure_params(save_manager_ref, meta_ref, extra: Dictionary = {}) -> Dictionary:
|
||||
var params: Dictionary = {
|
||||
"hero_override": meta_ref.hero_override() if meta_ref != null else {},
|
||||
"attunement": save_manager_ref.attunement_equipped() if save_manager_ref != null else [],
|
||||
"attune_refresh_y": meta_ref.attune_refresh_charges() if meta_ref != null else 0,
|
||||
"tree_rules": meta_ref.tree_rule_keys() if meta_ref != null else [],
|
||||
}
|
||||
params.merge(extra, true)
|
||||
return params
|
||||
|
||||
|
||||
# 冒险模式(三关连探——AdventureRunner 编排;转发信号签名与 runner 一致,接线照原样对接;
|
||||
# 信号连接只在组合根——ADR-0001)
|
||||
func _start_adventure() -> void:
|
||||
@@ -506,8 +525,10 @@ func _start_adventure() -> void:
|
||||
adventure.set_hero_override(debug_overlay.atk_pct(), debug_overlay.hp_pct())
|
||||
# 永久强化注入(元进度实现批):冒险开始参数面——meta 现算 override 显式传参(全零 = 白板)
|
||||
# 首次冒险脚本(关卡节点图生成 v0.4):存档布尔位 false = 全关固定模板 0(教学重放);置位后逐关抽签
|
||||
# 迭代 19 卡⓪①——同调三键随开局下传(build_adventure_params 统一构造,与营地投影同源)
|
||||
var first_script: bool = not save_manager.is_first_adventure_done()
|
||||
if not adventure.start_adventure(seed_val, {"hero_override": meta.hero_override() if meta != null else {}, "first_script": first_script, "treasure_unlocked": _treasure_ui.unlocked_set(), "shop_mode": "pool"}):
|
||||
if not adventure.start_adventure(seed_val, build_adventure_params(save_manager, meta,
|
||||
{"first_script": first_script, "treasure_unlocked": _treasure_ui.unlocked_set(), "shop_mode": "pool"})):
|
||||
_fatal_screen("冒险启动失败——见输出日志")
|
||||
return
|
||||
|
||||
@@ -516,9 +537,14 @@ func _start_adventure() -> void:
|
||||
# 停点前移批 2026-09-23:本回调返回后才有 choices_presented 到达——入口选路层随即弹出)
|
||||
func _on_adventure_level_started(level_index: int, display_name: String) -> void:
|
||||
runner = adventure.runner()
|
||||
# 迭代 19 卡⓪②——开场行改传当前生效值(runner.effective_atk/effective_max_hp 与战斗面板同源:
|
||||
# 表值+永久强化 flat+加算区 flat 后乘调试浮窗 pct,本回调时点 runner 已带全部加成);「含面板加成」
|
||||
# 后缀判断同步改认局外加成——永久强化 atk/max_hp flat 或调试浮窗 pct 任一存在才带,白板局不带
|
||||
var ov: Dictionary = meta.hero_override() if meta != null else {}
|
||||
log_view.append_bb(Narrator.level_open_line(display_name, int(adventure.master_seed),
|
||||
int(db.hero.atk), int(db.hero.max_hp),
|
||||
debug_overlay.atk_pct() > 0 or debug_overlay.hp_pct() > 0))
|
||||
runner.effective_atk(), runner.effective_max_hp(),
|
||||
int(ov.get("atk", 0)) > 0 or int(ov.get("max_hp", 0)) > 0
|
||||
or debug_overlay.atk_pct() > 0 or debug_overlay.hp_pct() > 0))
|
||||
|
||||
|
||||
func _reset_run_scope() -> void:
|
||||
|
||||
@@ -4658,6 +4658,33 @@ func _meta_settle_and_workshop() -> void:
|
||||
a12._reset_refresh_x()
|
||||
check(a12.attune_refresh_left() == 1,
|
||||
"刷新 X 每碰三选一重置(不结转——重碰面 x 回表值 1)")
|
||||
# ⑬ 主菜单开局传参面(迭代 19 卡⓪①③——开新/续玩两入口同调三键随开局下传防回归:真实入口此前
|
||||
# 三键恒空(缺陷①),冒烟夹具直呼 runner 参数面拦不住——此处直呼 main.build_adventure_params
|
||||
# 单测统一构造面(static 免实例化整菜单场景;真实两入口共用本构造),取值与营地投影同源)
|
||||
var sv_e = _meta_new_save(_META_SMOKE_PATHS[8])
|
||||
sv_e.set_attunement_equipped(["luck_coin"])
|
||||
sv_e.set_attune_refresh_level(2)
|
||||
sv_e.set_fork_side("fg_posture", "a")
|
||||
var mp_e = load("res://core/meta_progression.gd").new(_db, sv_e)
|
||||
var rules_e: Array = mp_e.tree_rule_keys()
|
||||
check(rules_e.has("posture_first_strike") and mp_e.attune_refresh_charges() == 2,
|
||||
"开局传参夹具前置:Fork 侧 a 激活 rule 键非空 + Y=Lv2 行表值 2(防断言空转)")
|
||||
var p_new: Dictionary = load("res://presentation/main.gd").build_adventure_params(sv_e, mp_e,
|
||||
{"first_script": true, "treasure_unlocked": {}, "shop_mode": "pool"})
|
||||
check((p_new.get("attunement", []) as Array) == (sv_e.attunement_equipped() as Array),
|
||||
"主菜单开新冒险参数面:同调装配 = 存档装配集(营地装了什么开局就带什么)")
|
||||
check(int(p_new.get("attune_refresh_y", -1)) == mp_e.attune_refresh_charges(),
|
||||
"主菜单开新冒险参数面:Y 刷新池 = 当前等级行表值(营地升几档开局就给几次)")
|
||||
check((p_new.get("tree_rules", []) as Array) == rules_e,
|
||||
"主菜单开新冒险参数面:树 rule 键集 = Fork 激活侧 effects(点哪侧带哪侧)")
|
||||
check(bool(p_new.get("first_script", false)) and String(p_new.get("shop_mode", "")) == "pool",
|
||||
"主菜单开新冒险参数面:入口特有键(first_script/shop_mode)随 extra 原样并入")
|
||||
var p_resume: Dictionary = load("res://presentation/main.gd").build_adventure_params(sv_e, mp_e,
|
||||
{"treasure_unlocked": {}})
|
||||
check((p_resume.get("attunement", []) as Array) == (sv_e.attunement_equipped() as Array)
|
||||
and int(p_resume.get("attune_refresh_y", -1)) == mp_e.attune_refresh_charges()
|
||||
and (p_resume.get("tree_rules", []) as Array) == rules_e,
|
||||
"主菜单继续上局参数面:三键与开新冒险同源同值(续玩不吃白板开局)")
|
||||
_meta_smoke_cleanup()
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user