merge: 营地交互重做五卡入库+06 条目新格式(doc-06todoformat-20261018 追加 8313aab6)——文档域闸全绿,流水线闸 06 条目 52 全过

This commit is contained in:
DKChan committed 2026-10-18 05:48:59 +08:00
commit 89fb640586
7 files changed
+1214

No files matched your search

+12
View File
@@ -558,3 +558,15 @@
**归属**:设计讨论批(不阻塞,不排期;设计权威产出归 GDD/美术文档,走设计流程非迭代实现)
**状态**:待文档设计+待美术设计
---
#### 营地交互重做·五张需求卡片(2026-10-18 登记,来源=会话提及,设计面=文档轨)
**现状**:2026-10-17~18 需求讨论澄清会话产出结论文档 `design/research/需求澄清-营地交互重做-2026-10-18.md` v1.0(目标体验原话/目标结构树+纵深稿/10 条交互裁决/验收口径/切批原则/遗留待裁),用户令按工作内容维度拆卡、卡片不预占迭代号。五卡已写(顺序=执行顺序,估时附后):①存档制数据层改造批(隐式单档→3 存档位,≈4.5–5.5d)②主菜单三入口化批(6 钮→3 钮,≈2.5–4d)③选档界面新建批(≈4.5–5.5d)④营地场景图新建批(最大件,≈9–12d)⑤Esc 浮窗与营地顶栏批(≈3–4.5d)。三道复核:grilling 子 Agent 对抗审查(五卡各一)→v1.1;用户裁定「事项按推荐的来」→v1.2;用户两次订正(**卡④留在批内不踢出**;前置由谁解决/何时解决由用户定,美术/设计线=用户自立批〔铁律 2〕,Agent 不代跑不代产——曾越权起草的点选反馈设计稿 v0.1 已撤回删除)→卡④ v2.2。①②③⑤ 零待裁点可编工程波次:②③ 硬耦合同波(「进入存档」钮落点=选档界面),① 是 ③ 前置;⑤ 随 ④ 代码波同行。
**缺口**:卡④(营地场景图)美术轨未闭合,五项前置批内登记待销号——P1 美术渠道 A/B(**待用户裁**,推荐 A);P2 像素规格(Q6 甲过渡口径已裁,执行归用户线);P3 点选反馈设计稿(用户线,未受命开工;Agent 曾越权起草 v0.1,已按用户令撤回删除);P4 参照物(用户后续找);P5 GDD/art-bible 落文(定稿后用户发令)。销号完毕且美术定稿(样张过审+art-bible 条款版本)后卡④方可进代码实现波次。
**归属**:营地交互重做(数据层+呈现层+美术线;五卡路径见状态行,批次归属与波次由用户按工作量另裁)
**状态**:文档设计已闭合(design/research/需求澄清-营地交互重做-2026-10-18.md v1.0)+待美术设计+已写卡(design/research/需求卡片-存档制数据层改造批-2026-10-18.md)+已写卡(design/research/需求卡片-主菜单三入口化批-2026-10-18.md)+已写卡(design/research/需求卡片-选档界面新建批-2026-10-18.md)+已写卡(design/research/需求卡片-营地场景图新建批-2026-10-18.md)+已写卡(design/research/需求卡片-ESC浮窗与营地顶栏批-2026-10-18.md)
@@ -0,0 +1,210 @@
# 需求卡片:Esc 浮窗与营地顶栏批(营地顶部小 HUD 栏 · Esc 三钮浮窗)· 营地交互重做卡⑤
- 版本:**v1.2**(2026-10-18 grilling 轮次裁定回写——Q1 裁定甲(只营地根态响应,代拍板留痕)、Q2 裁定甲(再按 Esc 关浮窗,推荐案)、Q3 裁定甲(确认 Esc 只在营地语境,推荐案,用户的从严收窄升格为已确认);契约 2 随 Q3 升格;卡④回设计段→本卡排期随④重新立卡后,卡片保留有效)
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:⑤裁决 9/10、④结构树语境、⑦切批原则⑤)
- 归属:呈现层/组合根(`game/presentation/`)——营地交互重做五卡之五
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
- 开工门:U0(用户 `/iter` 发令)+ 待裁点已裁(Q1/Q2/Q3 均裁定,见 §10)+ grilling 复核门过+ **卡④重新立卡并落地后**(本卡浮窗与 HUD 落在卡④新建的场景屏上——卡④ 2026-10-18 回设计段,本卡排期随④之后,卡片本身有效)
## 0. 前置依赖与并行性
- 前置卡④(营地场景图):Esc 浮窗的「返回主菜单」与顶栏 HUD 都落在营地场景屏上;**卡④ 2026-10-18 已回设计段**(美术设计定稿未过设计前置闸)——本卡不可先于卡④重新立卡落地,排期随④之后;本卡自身零美术依赖(零新素材、裁决 9/10 已给全),设计前置检查通过,卡片有效。
- **跨卡接口(v1.1 补全)**:①场景屏顶栏位(卡④ T2 预留);②**营地刷新单口**(卡④ T3 定义:各写口尾→现开界面刷新+场景根 HUD 刷新一闸完成)——本卡 HUD 刷新挂该单口,**非已退役的 `refresh_camp`**;③子界面返回钮承诺(卡④ T3——Q1 甲案前提);④卡④终局落点不变量(T0 互证)。
- 卡②的退出游戏钮、现役设置面——本批只复用不重做(契约 3)。
- 与卡④同批或随后(两卡触碰同一新屏)。**探针入口路径还依赖卡②③链**(v1.1 补明): restructuring 后营地只能经「菜单三钮→进入存档→选档→进档」到达——本卡 V1/V3 探针段隐含依赖该全链在位;若本卡先于卡②③合入,探针段挂起或走中间态断言(仿卡② §9 第 4 条先例)。
- **camp 截图/golden 联动(v1.1 补)**:HUD 栏落营地场景屏会改 camp 截图内容——若本批晚于卡④单跑,卡④ 刚重制的 camp 断言基线必再漂移;若同批,卡④ T5 迁移时点须晚于本卡 T2 HUD 落位(排序约束)。本卡 T2 含「HUD 落位后核漂移热区→限 HUD 区显式更新+呈报」条。
## 1. 目标与完成定义
**目标(澄清⑤裁决 9/10 照录)**:
- 裁决 9「**Esc 键**唤起浮窗:返回主菜单 / 设置 / 退出游戏 三项」(用户原话「ESC键可以唤起一个浮窗,里面有返回主菜单,设置,退出游戏三项」);
- 裁决 10「钥石余额:场景**顶部小 HUD 栏**」(用户原话「先按顶部小HUD栏设计」——provisional 措辞留痕)。
**相对现状,新增了什么**:
1. Esc 浮窗(全仓现无任何键盘快捷键处理——从零新建);
2. 营地场景顶部小 HUD 栏(钥石余额常驻——现营地钥石徽在 CampOverlay 顶栏,随卡④拆解后由新 HUD 栏承接)。
**完成定义**:
1. 营地语境按 Esc 唤起浮窗,浮窗有且仅有返回主菜单/设置/退出游戏三项;浮窗的关闭/取消路径按 Q2 裁定落地;
2. 「返回主菜单」回主菜单(营地场景屏隐藏+选档层同收+主菜单可见);「设置」开现役设置面(语境分支见契约 3);「退出游戏」接现役退出路径;
3. 营地场景顶部小 HUD 栏在位,钥石余额读数=存档单口现值,刷新时机=购买后(挂卡④营地刷新单口)/进档或回营地进入时重读/夹具直写后探针显式触发(v1.1 清单化);
4. 浮窗零动效直开直关(生涯页同款契约);新层入 `LAYER_CONTRACT`;
5. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T4)。
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | **全仓零键盘快捷键处理**:`KEY_ESCAPE`/`ui_cancel`/`ui_accept` 在 `game/` 全目录 grep 零命中(2026-10-18 实查)——Esc 浮窗是从零新建,无旧路径可迁;现成输入合成先例只有鼠标 `Viewport.push_input`(ui_input_probe.gd:51-63/:657-680,headless 实证),键盘合成须 T0 spike | 全仓 grep 实证;`game/smoke/ui_input_probe.gd:51-63` |
| F2 | 设置面在役:`settings_overlay` 构建+`closed` 接线;开=`_open_settings`(:1055-1057),关=`_on_settings_closed`(:1060-1063,关后**带 `_start_overlay.visible = true` 硬副作用**——营地语境照抄会在关设置后弹主菜单,须语境分支,见契约 3);`_open_settings`/`_quit_game` 现唯二调用点都是菜单钮 | `main.gd:277-279`/:1055-1057/:1060-1063/:333-334(v1.1 行号订正) |
| F3 | 退出游戏在役:`_quit_game`(设置即时落盘后 `get_tree().quit()`;无语义副作用,可原样复用) | `main.gd:500-503` |
| F4 | 钥石徽工厂件在役:`UiKit.keystone_badge`(三处消费先例——营地顶栏/生涯页/状态面板;迭代 17 卡③ Q10 甲工厂化)——HUD 栏复用该件,零新素材 | `camp_overlay_view.gd:82`;`career_overlay.gd:54` |
| F5 | art-bible §6.2 现载「钥石余额常驻顶栏」——与裁决 10 同向,本批是把该呈现位从 CampOverlay 顶栏迁场景屏 HUD | `design/art/art-bible.md:369` |
| F6 | 层序唯一事实源=`main.gd` `LAYER_CONTRACT`;`_apply_layer_contract` 全仓唯一落位口;冒烟 V1d 源码断言判红散落 `move_child` | `main.gd:34-53`/:430-455 |
| F7 | 零动效契约先例:生涯页/状态面板「直开直关」——ui_struct_probe 载 `_career_zero_motion_contract`(子树 AnimationPlayer 零命中+视图源码禁动效令牌扫描) | `game/smoke/ui_struct_probe.gd:313-328` |
| F8 | 08「六 · Alpha 不含」载「键盘 / 手柄输入(排 Beta)」行(**:192**——:191 是反雪球机制行)——Esc 属用户明示裁决(澄清⑤裁决 9),与该行的关系须同步注记(反哺点),本批不自扩其余键盘面 | `design/gdd/08-Alpha版本标准.md:192`(v1.1 行号订正) |
| F9 | **刷新链路实况(v1.1 订正,原结论失实)**:营地侧刷新腿=`camp_overlay.refresh_camp(camp_data())`(CampShopPresenter 各购买口尾与 `_refresh_presentations` 成对调用)——`refresh_camp` 是 CampOverlay 方法,**随卡④拆解退役**;`_refresh_presentations`(main.gd:1293-1298)刷的是战斗侧 HudPresenter+秘宝槽+结算视觉,**营地语境零营地视图触碰**;钥石入账发生在冒险收束、不在营地(存档序列化.md:116)——营地语境无现行入账触发源 | `camp_shop_presenter.gd:85-86`/:93-94 等;`main.gd:1293-1298`;`存档序列化.md:116` |
| F10 | 调试入口全局浮层角标在役(LAYER_CONTRACT 末位 float 类,不注册 ModalStack,任何 UI 不遮挡);ModalStack.open 只隐藏登记层 | `main.gd:51-53`/:312-314;`modal_stack.gd:21-30` |
## 3. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 浮窗三项且仅三项**:返回主菜单/设置/退出游戏(裁决 9)。禁加项(禁「继续冒险」类——营地无冒险可继续)、禁减项。浮窗的关闭路径=Q2 裁定项(再按 Esc 关/关闭钮/无关闭三选一),不属「加项」争议。
🔴 **契约 2 · Esc 范围=营地语境(Q3 已确认,2026-10-18)**:浮窗只在营地场景图语境唤起(含其子界面开态——行为按 Q1 裁定的甲案:只根态响应)。**禁扩展到战斗/地图/其他屏**(用户 2026-10-18 确认「只在营地语境」;08:192 键盘面仍排 Beta,本批只落 Esc 一项)。
🔴 **契约 3 · 设置与退出本体零重做、接线允许语境分支(v1.1 放宽)**:设置面本体与退出行为零改(F2/F3);**开合接线允许按语境分支**——现役 `_on_settings_closed` 带「回开始层」硬副作用,营地语境须分支为「关设置回浮窗不回主菜单」;正解=浮窗登记于设置层之下,`_open_modal(settings_overlay)` 自动隐藏浮窗、关闭自动恢复(既有栈语义);`_quit_game` 无语义副作用,原样复用。
🔴 **契约 4 · 返回主菜单动线**:营地场景屏隐藏+**选档层同收**(卡④ T3 口径)+开始层恢复;营地语境⇔闲时会话(无冒险会话——卡④ 契约 6「冒险进行中不开营地」+现役终局回菜单并 `_begin_session(false)` 收束推得,v1.1 前提成文),故动线本身不含会话收束;**回主菜单后菜单=卡②三钮、断点在档不在菜单露面**(禁实现者自作主张加「继续冒险」钮——那正是契约 1 在浮窗侧禁的);营地每笔消费即时写盘(存档序列化.md:121),回主菜单不写档也无损。
🔴 **契约 5 · 顶栏 HUD 单口读数+刷新挂卡④单口(v1.1 订正)**:钥石余额只经 MetaProgression/SaveManager 访问器单口读(禁第二账本、禁视图自算);**刷新挂卡④定义的营地刷新单口**(非已退役 `refresh_camp`——F9);刷新时机清单=购买后/进档或回营地进入时重读/夹具直写后探针显式触发(T2 落定)。
🔴 **契约 6 · 零动效**:浮窗直开直关,子树零 AnimationPlayer、源码禁动效令牌(生涯页同款契约,F7);减动效设置项不新增(在役项沿用)。
🔴 **契约 7 · 层序纪律+遮挡结论(v1.1 落结论)**:浮窗入 `LAYER_CONTRACT`(改层序只改合同表);禁散落 `move_child`。**与调试角标遮挡的结论(v1.1 补,既有纪律已定论、无需用户裁)**:debug_badge 是末位 float 类不注册 ModalStack,ModalStack.open 只隐藏登记层⇒角标**恒压浮窗且保持可点**(树序末位=最顶绘制序,全仓无 `debug_badge.disabled` 赋值)——合同内照此表达。另写明一条栈语义防误触 L3:浮窗开会隐藏登记序在其上的已开层(如调试浮窗体 debug_overlay),关闭恢复——属既有栈语义非新决策。
🔴 **契约 8 · provisional 口径留痕**:裁决 10「先按顶部小HUD栏设计」的「先」字留痕——HUD 栏形态按最小集落地(只承载钥石余额),扩项=新裁点。
## 4. 范围边界
**做**:Esc 输入接线+浮窗视图(三项钮+Q2 关闭路径)+层序登记;营地场景屏顶栏小 HUD 栏(钥石余额);断言批(探针合成键盘事件+零动效契约+HUD 读数一致性);反哺点清单。
**不做**(明示去向):
- 营地场景图本体 → 卡④(本批只在其顶栏位落 HUD+挂刷新单口);
- 选档界面/主菜单/数据层 → 卡③/卡②/卡①;
- 其余键盘快捷键(任意键关闭浮窗/手柄/战斗内 Esc) → 用户未裁,禁自扩(契约 2);
- 设置面/退出路径本体改动 → 无(契约 3);
- HUD 栏扩项(冒险天数/种子等) → 契约 8,扩项另裁。
## 5. 关联文档同步面
> **v1.3 口径**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`(`active.md` 唯一例外);下表一律执行为列进反哺点清单。
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/gdd/08-Alpha版本标准.md` | :192「键盘 / 手柄输入(排 Beta)」行——Esc 营地浮窗已落地(用户明示裁决,澄清⑤裁决 9),须加注防「Beta 行=本批违例」误读 | 反哺点 · 行内加注(v1.1 行号订正 :192) |
| `design/art/art-bible.md` | §6.2「钥石余额常驻顶栏」呈现位从 CampOverlay 顶栏迁场景屏 HUD(:369 述) | 反哺点 · 随卡④ §6.2 改版一并落 |
| `design/gdd/ux/camp.md` | 顶栏铭牌/钥石徽记述(:14-20)随 HUD 栏改挂 | 反哺点 · 随 camp.md 改版落 |
| `design/gdd/06-待办清单.md` | 本卡登记条 | 反哺点 · 列清单 |
| `design/gdd/07-体验验证清单.md` | 新增目检条(Esc 浮窗三动线/HUD 余额观感)——登记不阻塞 | 反哺点 · 列清单 |
| `roadmap.md` | 迭代行编入/状态刷新 | 反哺点 · 列清单 |
| `active.md` | 状态快照与本批条目 | **本批更新(唯一例外)** |
| `game/presentation/*`(浮窗视图+接线)、`game/smoke/*` | 实现与断言本体 | 实施本体(可写) |
## 6. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。
### T0 事实坐实与跨卡对齐(≈0.5–1d)
- 复核 §2 行号;确认卡④场景屏顶栏预留位接口+营地刷新单口签名(跨卡);
- **Esc 输入合成 spike**(v1.1 补):headless 下键盘事件合成机制验证(现成先例只有鼠标 `Viewport.push_input`——F1);与 §9 第 1 条接线方式选型联动(InputMap action+轮询路线与合成探针不兼容,选型时一并定);
- Q1 子界面行为、Q2 关闭路径、Q3 范围确认裁定执行;
- 与卡④ T0 互证终局落点不变量(契约 4 前提);探针入口路径依赖卡②③链的时点确认(§0)。
### T1 Esc 浮窗(≈1–1.5d)
- 浮窗视图:模态壳(`UiKit.modal_shell` 先例——该工厂只产 dim+center+panel+VBox、无内置关闭件,关闭件按 Q2 裁定)+三钮(返回主菜单/设置/退出游戏);危险钮形制用于退出(`UiKit.danger_button` 先例);零新素材零新色值;
- 接线:返回主菜单→营地场景屏隐藏+选档层同收+开始层恢复(卡④动线同口);设置→`_open_settings`(**语境分支**:浮窗登记于设置层之下,关设置回浮窗——契约 3);退出→`_quit_game`;
- **营地语境判据(v1.1 补)**:判据=营地场景屏 visible(根态与子界面开态下皆真——子界面是模态叠加非熄屏;screen_flow_probe 营地旗标先例 :53 可迁移复用);Q1 裁甲则判据加「无营地子模态开态」;调试浮窗开态不影响判据(全局浮层、营地屏仍可见);Q1 裁后回写契约 2 消歧;
- 层序入 `LAYER_CONTRACT`(与调试角标遮挡按契约 7 结论表达);零动效(契约 6);
- Q2 关闭路径接线(再按 Esc 关/关闭钮/无关闭,按裁定)。
### T2 营地顶栏小 HUD 栏(≈0.5–1d)
- 顶栏位落 `UiKit.keystone_badge` 工厂件(余额单口读数,契约 5);
- **刷新挂卡④营地刷新单口**(契约 5);**刷新时机清单落定(v1.1 补)**:①购买后(挂单口)②进档/回营地进入时重读③夹具直写后由探针显式触发——断言前须显式触发,禁依赖「自动重读」假设;
- HUD 栏形态按最小集(契约 8):只承载钥石余额;
- **camp 截图/golden 联动条(v1.1 补)**:HUD 落位后核 camp 截图漂移热区→限 HUD 区显式更新+呈报(仿卡④ T5/卡② 契约 6 口径;现无 camp 逐像素 golden——卡④ 契约 10)。
### T3 断言批(≈0.5–1d)
- 探针(**宿主选 screen_flow_probe——v1.1 定:轻闸默认段且「菜单⇄营地屏壳切换」正是其职域,零闸登记成本;若另起新文件须改 tools/probe_gate.sh 登记=§5 可写面外,禁**):合成 Esc 键事件→浮窗可见+三项在位;非营地语境(boot 菜单)不唤起;返回主菜单动线(营地隐+选档层收+菜单显);设置项开合(**含营地浮窗→设置→关闭回浮窗高危路径+「关闭设置后禁弹主菜单」反向断言——v1.1 补**);退出项接线断言(headless 不可真退);
- HUD:余额读数=存档单口(夹具经**隔离存档实例直写** `add_keystone` 或等效写口——smoke 既有先例 smoke_all.gd:5440;**不经 DebugOverlay 界面——其钥石项是只读投影,debug_overlay.gd:173-189,v1.1 订正**);直写后显式触发刷新断言;
- 契约断言:浮窗零动效(career 同款段复用/仿写);层序登记(冒烟 V1d);**浮窗开态 `debug_badge.visible==true`**(仿 ui_click_probe.gd:174-177 设置面开中角标可见先例——v1.1 补);
- **变异验证伴生**:Esc 接线漏营地隐(预期动线断言红)、HUD 读缓存旧值(预期刷新断言红)、浮窗加第四钮(预期三项断言红)、**设置关闭后误回主菜单**(预期语境断言红——v1.1 补)、**Esc 再按不关窗**(预期关窗断言红,若 Q2 裁甲——v1.1 补);注入→最窄闸见红→精确还原→记录。
### T4 产出物落位卡(≈0.5d,末卡)
三份 `reports/` 写齐;`active.md` 照常。
**估时合计 ≈3–4.5d**(v1.1 订正:分项和=3.0–4.5d,原「2.5–3.5d」算术少算)。切分预案:T1/T2 后可切(浮窗先落、HUD 后落)——切分价值低,建议与卡④同批单跑。
## 7. 验证闸(逐需求点验收清单)
| # | 需求点 | 测什么 | 落点/判定手段 |
|---|---|---|---|
| V1 | Esc 唤起(按 Q1 分拆) | **根态**合成 Esc→浮窗可见;**子界面开态按 Q1 案**(甲=不现/乙=先关子界面再现);boot 菜单语境不唤起(其余非营地语境由契约 2 红线+源码断言兜底——可达性单一,登记原因) | screen_flow_probe 合成键盘事件段(T0 spike 机制) |
| V2 | 浮窗三项 | 返回主菜单/设置/退出游戏三钮在位且仅三 | ui_struct_probe 结构断言 |
| V3 | 返回主菜单 | 营地场景屏隐藏+选档层同收+主菜单可见 | screen_flow_probe 型断言 |
| V4 | 设置项(双路径) | 菜单路径(冒烟 V3g settings 段复跑)+**营地浮窗→设置→关闭回浮窗**(含禁弹主菜单反向断言) | 冒烟复跑+探针新路径段 |
| V5 | 退出项 | 接线到 `_quit_game`(headless 不可真退——接线断言代偿) | 源码/结构断言 |
| V6 | HUD 余额 | 读数=存档单口(隔离实例直写);直写后显式触发刷新;购买后刷新(挂卡④单口——跨卡联验) | 探针数据断言(smoke_all.gd:5440 同型先例) |
| V7 | 零动效 | 浮窗子树零 AnimationPlayer+源码禁动效令牌 | ui_struct_probe 零动效契约段(career 同款) |
| V8 | 层序与遮挡 | 浮窗入 LAYER_CONTRACT(冒烟 V1d);浮窗开态 debug_badge 可见 | 冒烟 V1d+探针 badge 断言 |
| V9 | 目检项登记 | Esc 三动线+HUD 观感+浮窗视觉面(文字 WCAG 若入 shot_checker 取样,否则显式登记归目检并写明理由)入 07 | 件核(登记不阻塞) |
| V10 | 反哺点清单 | §5 每条有落点 | 件核对表 |
**测试方式两分法**:V1–V8 机检自动化(能力验证经隔离存档实例直写钥石/开态——v1.1 订正:不经 DebugOverlay 界面);V9 归用户目检(生命周期末步统一进行,不阻塞迭代,澄清⑥口径)。
**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码与断言面 → `--code`)全绿才合并;MC 零跑(零数值零行为)。
## 8. 异常分级
- **L1(自救)**:断言写法、探针合成键事件写法、命名。
- **L2(记录继续)**:Esc 接线方式选型(§9 域内)、浮窗壳尺寸/位次(UiKit 现行件域内)、HUD 栏位微调。
- **L3(停机呈报)**:卡④ 场景屏未到位又需合并;Q1/Q2/Q3 未裁即开工;发现需扩展到非营地语境才能成立(触契约 2=用户裁面);Esc 键盘合成 spike 失败且无替代验收手段(真实路径纪律不让直呼处理函数代偿);浮窗开会隐藏其上登记层的栈语义被误判为缺陷(契约 7 已写明,勿误停机)。
## 9. 代拍板白名单(超清单必呈报)
1. Esc 输入接线方式(`_unhandled_input` vs InputMap 新 action vs 专用控制器)——约束:不吞他处输入、探针可合成(与 T0 spike 结论兼容;InputMap action+轮Polling 路线禁——与合成探针不兼容)。
2. 浮窗模态壳尺寸与位次(UiKit `modal_shell` 现行件域内)。
3. HUD 栏在顶栏的左右位次与间距(卡④场景屏顶栏域内)。
4. 「返回主菜单」复用卡④篝火同一处理函数(建议复用——动线同口;实现期定)。
5. 浮窗视觉面是否入 shot_checker 取样(T3 定:入=补截图段;不入=显式登记归目检并写明理由)。
6. 提交切分与 worktree 分支命名。
## 10. 待裁点
### Q1 · Esc 在子界面开态下的行为(必裁,未裁不开 T1)
**背景**:营地语境含「场景根态」与「子界面开态」(锻造/秘宝/生涯/天赋树/图鉴开着时)。澄清⑤裁决 9 未覆盖此分支。两案并列,**无推荐(用户令:不代裁)**:
| 案 | 内容 | 代价 |
|---|---|---|
| 甲 | 只营地根态响应 Esc;子界面开着时 Esc 不唤浮窗(**前提=各子界面自带返回钮闭环——待卡④ T3 承诺,v1.1 括注**) | 语义最简;子界面里按 Esc 无反馈 |
| 乙 | 营地语境任意态响应 Esc:子界面开着时先关子界面回根态,再按才唤浮窗(单义化) | 多一层输入编排;与既有「子界面返回钮」形成双关闭路径 |
连带:判据形态随案(T1 已列);V1 按案分拆断言;契约 2 措辞裁后回写。裁决方式:随卡片评审定案;裁定落 T0 执行+实现报告留痕。
**裁定(2026-10-18)**:**甲**——只营地根态响应 Esc;子界面开着时 Esc 不唤浮窗。代拍板留痕(用户令「事项按推荐的来」,本项无推荐案,取默认甲=语义最简;前提=卡④ T3 承诺各子界面自带返回钮闭环,卡④重新立卡时该承诺已在内;追认单可 veto)。T1 判据=营地场景屏 visible 且无营地子模态开态。
### Q2 · 浮窗的关闭/取消路径(必裁,未裁 T1 视图定不了稿——v1.1 新增)
**背景**:`UiKit.modal_shell`(ui_kit.gd:456-475)只产 dim+center+panel+VBox、**无内置关闭件**;契约 1 禁加项⇒浮窗只有三钮,无一「关闭」。而 §4 不做清单把「任意键关闭浮窗」划为用户未裁禁自扩——**Esc 自身再按的行为恰好落在被 punt 的缝隙里**:Q1 两案都不覆盖「浮窗已开时按 Esc」。若不裁且无关闭钮,玩家误开浮窗后离开营地只有「回主菜单/开设置/退游戏」三条路——体感陷阱,且与卡④子界面(生涯有返回钮)的可用性水准倒挂。
| 案 | 内容 | 代价 |
|---|---|---|
| 甲(推荐) | 再按 Esc 关浮窗(同键唤起/关闭单义切换) | 与 Q1 裁甲并存时 Esc 语义三态分枝(关浮窗/唤浮窗/子界面无反馈),探针断言须分拆(V1 已按案分拆) |
| 乙 | 浮窗加关闭钮 | 触契约 1「禁加项」——须重新解释「三项」仅指功能项 |
| 丙 | 维持无关闭(三钮即全部出口,「返回主菜单」充当默认离开) | 误开浮窗后成本高;与子界面可用性水准倒挂 |
裁决方式:随卡片评审定案;裁定落 T1 视图与接线+V 表。
**裁定(2026-10-18)**:**甲**——再按 Esc 关浮窗(同键唤起/关闭单义切换)。推荐案,用户令按推荐执行。T1 接线含「浮窗已开时再按 Esc=关浮窗」;V1 断言按「根态唤起/再按关闭」两态分拆。
### Q3 · Esc 范围确认(顺带确认项,低成本高保险——v1.1 新增)
**背景**:契约 2「Esc 只在营地语境」是卡的从严收窄(澄清文档只裁「Esc 唤浮窗三项」、未裁范围——S1)。收窄方向保守且已自标「用户未裁」,但若用户本意是全局 Esc 菜单,范围锁死即返工。
| 案 | 内容 | 代价 |
|---|---|---|
| 甲(推荐) | 确认「Esc 浮窗只在营地语境」——契约 2 现文成立 | 无(一句话确认) |
| 乙 | 用户本意为全局(或更宽范围) | 本卡范围重开=契约 2/T1/V1 大改,且触 08:192 Beta 行口径 |
裁决方式:随卡片评审顺带确认。
**裁定(2026-10-18)**:**甲**——确认「Esc 浮窗只在营地语境」(推荐案,用户令按推荐执行)。契约 2 从「卡的从严收窄」升格为已确认口径;S1 保留意见关闭。
---
**修订记录**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正 5 处:F9 刷新链路失实(营地刷新腿随 CampOverlay 退役、`_refresh_presentations` 是战斗侧腿)→契约 5 改挂卡④营地刷新单口+T2 刷新时机清单;E2「调试接口直改钥石」能力不存在(DebugOverlay 钥石只读)→改隔离存档实例直写(smoke 先例);F2 行号拆分(_open_settings :1055-1057);F8 :191→:192;估时算术 2.5–3.5d→3–4.5d。自扩订正:契约 2 标卡的从严收窄+Q3 请用户确认。卡内可收 8 项:契约 3 放宽语境分支、契约 7 遮挡结论+栈语义、契约 4 前提成文、T1 语境判据、T2 刷新时机+golden 联动、T3 探针宿主定 screen_flow_probe+badge 断言+变异补二条、V1 按 Q1 分拆、V4/V6/V8/V9 订补。跨卡对齐:HUD 刷新单口(§0 接口+卡④ T3 定义)、子界面返回钮承诺(Q1 甲案前提=卡④ T3)、终局落点不变量(T0 互证)、探针路径依赖卡②③链(§0)。新增待裁点 Q2 浮窗关闭路径、Q3 Esc 范围确认。用户面裁决(裁决 9/10)零改动。
@@ -0,0 +1,190 @@
# 需求卡片:主菜单三入口化批(6 钮 → 3 钮)· 营地交互重做卡②
- 版本:**v1.2**(2026-10-18 grilling 轮次回写——§0 补卡④回设计段注记(契约 5 中间态延长为工程批交付后稳态);本卡零待裁点不变,无其他裁定事项)
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:④结构树「主菜单(需改动:6 钮 → 3 钮)」、⑤裁决 1、②反参照、⑦切批原则②)
- 归属:呈现层/组合根(`game/presentation/`)——营地交互重做五卡之二
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
- 开工门:U0(用户 `/iter` 发令);**零待裁点**;硬依赖卡③、中间态依赖卡④(见 §0/契约 5)
## 0. 前置依赖与并行性
- **硬依赖卡③(选档界面)**:「进入存档」钮的落点=选档界面。**本卡与卡③必须同批交付或卡③在先**(卡内推导,防死钮——澄清⑦只定切批原则,「同批或在先」是本卡的防死钮推导,非用户裁决)——禁以死钮/占位钮形态合并(违契)。
- **卡④(营地场景图)依赖(v1.1 补明;v1.2 注:卡④已回设计段)**:冒险入口探针段的新路径是「进入存档→选档→进档→营地→大门两分支→开局」——卡③同批到位也解决不了这批探针(卡④未到位时无路可走)。中间态处置见契约 5。**卡④ 2026-10-18 回设计段(美术设计定稿未过前置闸)**——契约 5 的中间态将从「批内临时」延长为「工程批交付后的稳态」,直至卡④重新立卡落地;实现报告「已知中间态」节按此登记。
- 卡④(营地场景图)承接本卡撤出的「开始冒险/继续上局/营地/生涯」四功能入口;本卡只负责主菜单侧撤出与接线,不负责落点实现。
- 卡①(存档制数据层)是卡③的前置,间接构成本批链的数据面底。
## 1. 目标与完成定义
**目标(澄清④照录)**:主菜单 6 钮 → 3 钮——**进入存档 / 设置 / 退出游戏**(裁决 1:用户原话「主菜单界面应该只有 3 个入口:①进入一个存档 ②游戏的设置 ③退出游戏。开始冒险,和营地相关的都应该是一个存档内的东西」)。
**相对现状,新增了什么**:
1. 主菜单按钮组从 6 钮(继续上局/开始冒险/营地/生涯/设置/退出游戏)砍到 3 钮;
2. 「进入存档」新钮接线到卡③选档界面;
3. 撤出钮的功能去向显式化:开始冒险/继续上局 → 营地大门(卡④,裁决 5 两分支);营地 → 存档内场景图(卡④);生涯 → 营地床铺旁笔记本(卡④);
4. 主菜单侧断点互斥确认路径(现居开始冒险)整体移交卡④大门,主菜单禁残留。
**完成定义**:
1. 主菜单有且仅有三钮:进入存档/设置/退出游戏;四旧钮与两组组帽的处理按 §9 落定;
2. 「进入存档」可点到选档界面(卡③交付物);
3. 设置/退出游戏两钮行为零变化(澄清④:「设置(已实现 · 不动)」「退出游戏(已实现 · 不动)」);
4. 冒烟/探针/golden 随批迁移完毕(§2 F10 全量位点表逐点过),批末重闸按改动域选档全绿;
5. 三份 `reports/` 产出物写齐(T3)。
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | 开始覆盖层构建=六钮+两组组帽:「── 冒 险 ──」组(继续上局/开始冒险)、「── 营地与系统 ──」组(营地/生涯/设置/退出游戏);续玩钮初始 `visible=false`(有断点才亮,可见性与文案归组合根刷新) | `game/presentation/ui_assembler.gd:128`/:130-138/:141-153 |
| F2 | 菜单屏壳持有六句柄(`lvbtn/resumebtn/campbtn/careerbtn/settingsbtn/quitbtn`),取值在 `_ready` | `game/presentation/scenes/menu_screen.gd:9-16`/:27-31 |
| F3 | 组合根接线:lvbtn→`_start_adventure_from_menu`;resumebtn→`_resume_from_menu`;campbtn→`_camp_pres.open_camp`;careerbtn→`_open_career`;settingsbtn→`_open_settings`;quitbtn→`_quit_game` | `game/presentation/main.gd:307-309`/:331-334 |
| F4 | 开始冒险的断点互斥确认:有断点先出 ConfirmDialog(「已有未完冒险(第 N 关)——开新冒险将覆盖旧断点」),确认才弃旧断点写盘开局——该路径整体移交卡④大门(澄清④:「断点弹窗保留移位」) | `main.gd:475-497` |
| F5 | 续玩钮可见性刷新=断点在档态(`_refresh_resume_button`)。**消费面(v1.1 补全)**:main.gd:194(boot)/:319(注入 CampShopPresenter ctx)/:704/:1063/:1101;camp_shop_presenter.gd:19/36/55(ctx 字段+on_camp_closed 调用);probe_ui_util.gd:117-120(isolate_save 的 refresh_resume 参数,多探针传 true);pacing_queue_test.gd:30 及 F10 表全部探针位点 | `main.gd:507-514` 及上列各处 |
| F6 | 冒烟 V2 断言六钮非空(`menu.start_overlay != null and menu.lvbtn != null and …`) | `game/smoke/smoke_all.gd:163` |
| F7 | 生涯.md 信息架构记载现行六钮组(「冒险」组+「营地与系统」组)与生涯入口=开始层生涯钮 | `design/gdd/systems/跨局循环/生涯.md:9`/:11-23 |
| F8 | camp.md 定位句载「主菜单营地独立入口进入」 | `design/gdd/ux/camp.md:10` |
| F9 | 08「三 · 界面」表载主菜单/开始覆盖层/营地/生涯页四行(均在役);08 头注纪律=增删条目须用户裁,状态列可改 | `design/gdd/08-Alpha版本标准.md:102-105`/:5 |
| F10 | **探针/单测/闸机影响面全量清单(v1.1 重列——初查「五探针」严重不全)**:见下表 | 全仓 grep 实证 |
| F11 | menu golden 基线在役:`game/tests/golden/menu_boot.png`(迭代 28 新增);对比段=render_gate.sh「菜单 golden 逐像素」节;重制入口=`tools/golden_baseline_refresh.sh --menu`(该脚本守卫素材齐盘,缺位拒跑) | `game/tests/golden/` 实查;`tools/render_gate.sh`(菜单 golden 节);`tools/golden_baseline_refresh.sh` 头注 |
| F12 | art-bible §7.4 小字号豁免为**一条合并条款**(条带内读数+装饰 caption 两类,:433),主菜单分组 overline×2(「── 冒 险 ──」「── 营地与系统 ──」)只是枚举中两个片段——禁整行删,只能 excision 片段;注销以 §9 第 1 条裁定为条件。另有两处代码注释引述组帽名(main.gd:287、career_overlay.gd:3,实施本体内可自理) | `design/art/art-bible.md:433`;`main.gd:287`;`career_overlay.gd:3` |
| F13 | 07-体验验证清单有两处引述主菜单形态(:170「左操作列(冒险/营地与系统两组)」、:192「营地与系统组出现生涯钮」)——随本批入口拓扑改 | `design/gdd/07-体验验证清单.md:170`/:192 |
### F10 全量影响位点表(20+ 位点,按闸归类)
| 位点 | 依赖内容 | 所属闸 | 本批处置 |
|---|---|---|---|
| `ui_probe.gd:28-55` | 营地钮驱动+余额+秘宝匣 12 行断言 | probe_gate | 改走「进入存档→选档→进档→营地」新路径 |
| `ui_click_probe.gd:59-127` | 营地购买合成点击全链(campbtn 驱动) | probe_gate --click | 同上 |
| `ui_click_probe.gd:224-228`、:462-518 | resumebtn 断言+整条「断点段」(中断→续玩全链+互斥确认两分支,约 80 行) | probe_gate --click | **断点确认段随弹窗移交卡④**(契约 4);卡② T1 只摘钮后保留函数直调中间态(契约 5) |
| `ui_struct_probe.gd:41-45` | camp 结构审计(营地钮驱动) | probe_gate 默认 | 改新路径 |
| `ui_struct_probe.gd:54-56/:69` | careerbtn 生涯入口链 | probe_gate 默认 | 改走卡④笔记本路径 |
| `ui_struct_probe.gd:86`、:163-183 | `_start_adventure_from_menu`+resume 专项(:168 刷钮、:170 续玩) | probe_gate 默认 | resume 专项随钮退役改写;冒险段见契约 5 |
| `screen_flow_probe.gd:53`、:109-123 | 营地可见态+营地开合段 | probe_gate 默认 | 入口段归卡②;营地键语义/开合/篝火段归卡④(分界写入两卡 T 卡) |
| `screen_flow_probe.gd:130-136` | ④菜单→冒险 lvbtn 步 | probe_gate 默认 | 契约 5 中间态;终态归卡④ |
| `shot_probe.gd:103-119`、:138-145、:193 | careerbtn 生涯截图段+lvbtn 关卡截图段(render_gate 七屏链三段的入口在本批被拆) | render_gate | 生涯段归卡④;关卡段契约 5 中间态、终态归卡④ |
| `shot_probe.gd:126-133` | camp 截图+关闭钮查找 | render_gate | 归卡④(营地键/收闭改缆) |
| `fx_shot_probe.gd:36-40`、:47 | lvbtn 查找+点击,零命中即 `_fail` | render_gate | 契约 5 中间态 |
| `t17_defer_probe.gd:29-33` | lvbtn 查找+点击 | probe_gate --full | 契约 5 中间态 |
| `ui_tune_probe.gd:96` | `main._start_adventure_from_menu()` 直调 | probe_gate --full | 契约 5 中间态 |
| `ui_input_probe.gd:35` | 同上 | probe_gate **默认必跑** | 契约 5 中间态 |
| `layout_probe.gd:27` | 同上 | probe_gate **默认必跑** | 契约 5 中间态 |
| `smoke_all.gd:163` | V2 六钮非空断言 | smoke_all | 改三钮断言 |
| `smoke_all.gd:266-290` | V2d 续玩钮六断言(boot/回菜单态) | smoke_all | 随钮退役改写/注销 |
| `smoke_all.gd:322/:326`、:411-415 | V3g campbtn 直呼驱动营地模态开合 | smoke_all | 改新路径 |
| `smoke_all.gd:470-478`、:565-567 | V3i 生命周期阶段⑨(`_resume_from_menu` 全链)+`_stage_faces` 的 `resume_vis` 键 | smoke_all | 随续玩入口迁卡④改写 |
| `smoke_all.gd:328/:439/:598/:628` | `_start_adventure_from_menu` 直调 ×4 | smoke_all | 契约 5 中间态 |
| `pacing_queue_test.gd:30/:33` | `_refresh_resume_button`+`_start_adventure_from_menu` | 单测(33 套之一) | 函数去留按 §9 第 2 条 |
| `probe_ui_util.gd:117-120` | `isolate_save` 的 `refresh_resume` 参数→`main._refresh_resume_button()`,多探针传 true | 全部探针共用 | 函数去留按 §9 第 2 条连带 |
**T0 清点口径(v1.1 定死)**:全仓 grep `lvbtn|campbtn|careerbtn|resumebtn|_start_adventure_from_menu|_resume_from_menu|_refresh_resume_button|start_overlay`,零意外命中才收口;清点结果写成文(T0 产物),作为 T2 迁移清单的基线。
## 3. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 三钮且仅三钮**:进入存档/设置/退出游戏(裁决 1)。主菜单禁留任何存档内功能入口——开始冒险/继续上局/营地/生涯四钮彻底撤出(禁隐藏态残留、禁置灰态残留)。
🔴 **契约 2 · 设置与退出零行为变化**:两钮已实现不动(澄清④结构树原文);本批只保留其接线,禁借机改设置面或退出路径。
🔴 **契约 3 · 「进入存档」落点唯一**:只接卡③选档界面;禁直连营地/冒险(存档语境选择先行——澄清④结构树层级)。
🔴 **契约 4 · 断点确认路径整体移交**:主菜单侧禁残留「开新冒险覆盖旧断点」确认逻辑(main.gd:475-497 段随迁卡④大门,裁决 5 两分支);移交后主菜单无任何写档路径。断点确认探针段(ui_click_probe:462-518 等)随弹窗移交卡④ T5 接收,本卡 T2 明列移交项。
🔴 **契约 5 · 硬依赖卡③+卡④中间态条款(v1.1 补)**:本卡与卡③同批或卡③在先,禁死钮合并。**卡④未到位批内**:`_start_adventure_from_menu`/`_resume_from_menu` 两函数保留在 main.gd、仅摘菜单接线(T1 现文「只摘除主菜单侧调用」即此路),冒险段探针暂维直调旧函数、卡④到位再迁——该中间态是合法交付态,须在实现报告「已知中间态」节登记;禁为凑绿而把探针断言弱化成假路径。
🔴 **契约 6 · 探针/golden 契约**(属仓库既有测试纪律的卡内成文,非用户裁决):入口路径迁徒的探针段随批显式改写并留痕;menu golden 漂移按「核热区限预期面→显式重制+呈报→复闸」流程执行,超预期=L3。
🔴 **契约 7 · 不做形态重设计**:本卡只砍钮不重排菜单形态(双列布局/立绘看台不动——砍钮后的布局适配属 §9 代拍板微调圈)。反参照纪律(澄清②:拒「各种框框」)的兑现归卡④营地场景图,本卡不借尸还魂。
## 4. 范围边界
**做**:`build_start_overlay` 钮集砍到 3(含组帽与左列布局适配);`menu_screen` 句柄面;组合根接线(撤 4 接 1,含 camp_shop_presenter.gd 的 `_refresh_resume_button` ctx 摘除——v1.1 补列实施本体);冒烟 V2 断言改写;F10 全量位点表逐点迁移;menu golden 重制+呈报;反哺点清单。
**不做**(明示去向):
- 选档界面本体 → 卡③;
- 营地场景图/大门动线/生涯改挂 → 卡④;
- ESC 浮窗与营地顶栏 → 卡⑤;
- 设置面/退出路径的行为改动 → 无(契约 2);
- 主菜单视觉形态重设计(换底/新素材/布局重构)→ 不在本批;如用户要形态级重做,另立裁点。
## 5. 关联文档同步面
> **v1.3 口径**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`(`active.md` 唯一例外);下表一律执行为列进反哺点清单。08 写入权限三卡统一口径(v1.1 对齐):**状态列可改;注记改写列反哺点随清单呈报;增删行须用户裁**。
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/gdd/systems/跨局循环/生涯.md` | :9 信息架构「现行主菜单按钮组……『冒险』组……『营地与系统』组」+:11-23 结构树——六钮组记述整体失义;生涯入口从开始层迁营地笔记本 | 反哺点 · 信息架构节改三钮组+生涯入口位改挂 |
| `design/gdd/ux/camp.md` | :10「主菜单营地独立入口进入」——营地入口改挂存档内场景图 | 反哺点 · 定位句改挂 |
| `design/gdd/08-Alpha版本标准.md` | :102-105 三·界面表四行——状态列可改;入口拓扑注记列反哺点 | 反哺点 · 列清单(统一口径见上) |
| `design/gdd/07-体验验证清单.md` | :170/:192 两处引述主菜单形态(左操作列两组/营地与系统组生涯钮) | 反哺点 · 列清单(v1.1 补列) |
| `design/art/art-bible.md` | :433 小字号豁免合并条款中「主菜单分组 overline×2」枚举片段——组帽撤后 excision(禁整行删),以 §9 第 1 条裁定为条件 | 反哺点 · 列清单 |
| `design/gdd/06-待办清单.md` | 本卡登记条 | 反哺点 · 列清单 |
| `roadmap.md` | 迭代行编入/状态刷新 | 反哺点 · 列清单 |
| `active.md` | 状态快照与本批条目 | **本批更新(唯一例外)** |
| `game/presentation/ui_assembler.gd`、`scenes/menu_screen.gd`、`main.gd`、`camp_shop_presenter.gd`(v1.1 补)、`game/smoke/*`、`game/tests/golden/*`、`tools/golden_baseline_refresh.sh`(重制入口,只跑不改) | 实现与断言/基线本体 | 实施本体(可写) |
## 6. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。
### T0 事实坐实(≈0.5–1d)
- 复核 §2 全部行号;按 F10 表尾清点口径全仓 grep,清点结果写成文(T0 产物);
- 与卡③对齐:「进入存档」钮的目标句柄与选档界面开层函数名先定(跨卡接口);与卡④对齐断点确认探针段的移交/接收分界(契约 4)。
### T1 钮集砍伐与接线(≈0.5–1d)
- `build_start_overlay`:六钮→三钮;组帽去留与左列布局适配按 §9 拍板(冒险组帽必撤——组内零钮;见 §9 第 1 条);
- `menu_screen` 句柄面随裁(撤 4 留 3+新增进入存档钮句柄);
- 组合根:撤 lvbtn/resumebtn/campbtn/careerbtn 四线,接「进入存档」→选档界面;`_start_adventure_from_menu`/`_resume_from_menu` 按契约 5 保留(摘接线不删函数);
- `_refresh_resume_button` 去留按 §9 第 2 条:**卡④大门不复用该函数**(卡④ T4 已明示——两分支直读 `has_breakpoint`,无钮可刷),故只剩删除一路;删函数同批清全部消费点(main.gd 五处+camp_shop_presenter.gd ctx 字段与 on_camp_closed 调用+probe_ui_util 参数+pacing_queue_test+各探针传 true 位点);
- 断点确认段(main.gd:475-497)的移交:本批只摘除主菜单侧调用,弹窗本体与两分支逻辑落卡④大门。
### T2 断言、探针与 golden 迁移批(≈1.5–2d)
- smoke V2 六钮断言→三钮断言(进入存档/设置/退出游戏非空;四旧钮句柄零命中);
- F10 全量位点表逐点迁移:入口路径段本卡改;断点确认段/生涯截图段按契约 4 移交卡④(本卡 T2 明列移交项,卡④ T5 接收);冒险段探针按契约 5 中间态处理(卡④到位再迁);
- menu golden:核漂移热区限钮集区→显式重制 `menu_boot.png`+呈报→复闸;
- **变异验证伴生**:新断言段定注入实验——例:把四旧钮之一接回(预期三钮断言红)、进入存档钮接错层(预期探针路径红);注入→最窄闸见红→精确还原→记录。
### T3 产出物落位卡(≈0.5d,末卡)
三份 `reports/` 写齐(实现报告含 golden 重制呈报记录、变异记录表、「已知中间态」节〔契约 5〕/代拍板追认单/反哺点清单);`active.md` 照常。
**估时合计 ≈2.5–4d**(v1.1 上调:探针面从「五探针」扩到 20+ 位点,T2 清点后重估)。切分预案:T1 出口可切(砍钮先落、断言迁移后落)——但契约 5 硬依赖卡③,实际切分价值低,建议与卡③同批单跑。
## 7. 验证闸(逐需求点验收清单)
| # | 需求点 | 测什么 | 落点/判定手段 |
|---|---|---|---|
| V1 | 三钮在位+既有断言族改写 | 进入存档/设置/退出游戏三钮非空且可点;四旧钮(开始冒险/继续上局/营地/生涯)在主菜单零命中;被本批废止/改写的既有断言族(smoke V2d 续玩钮态、V3g campbtn 驱动、V3i 阶段⑨续玩全链、`_stage_faces` 的 `resume_vis` 键)逐族有改写后断言承接 | 冒烟 V2 改写段+V2d/V3g/V3i 改写段+ui_struct_probe 结构断言 |
| V2 | 设置零行为变化 | 设置钮开合路径与既有断言一致 | 冒烟 V3g settings 模态段复跑 |
| V3 | 退出接线正确 | quitbtn → `_quit_game` 连接存在(headless 不可真退——接线断言代偿) | 源码/结构断言 |
| V4 | 进入存档可达选档 | 点击链路通到卡③选档界面(层可见+菜单隐藏) | ui_click_probe/screen_flow_probe 新路径段(依赖卡③) |
| V5 | 断点确认零残留 | 「开新冒险覆盖断点」确认路径仅存于卡④大门;ConfirmDialog 允许多消费方(卡③删档确认在役——切换机制见卡③ 契约 3) | 源码断言+ui_struct_probe 既有采样复跑 |
| V6 | golden 与七屏链 | menu golden 漂移限钮集区、重制有呈报、复闸绿;shot_probe 七屏截图链存在性自检全绿(career/camp/level 三入口迁移后仍七件非空) | render_gate golden 段+shot_probe 自检段复跑 |
| V7 | 左列布局几何不破 | 砍钮后双列不相交合同与按钮几何族(互压/等宽/出屏/零尺寸)复跑 | ui_struct_probe `_start_columns_contract`+`_audit("start")` 段复跑(v1.1 补机检项) |
| V8 | 反哺点清单 | §5 每条有落点 | 件核对表 |
**测试方式两分法**:V1–V7 机检自动化;**用户目检项=主菜单三钮观感(钮集砍伐后左列布局是否失衡)**——登记 07(实机目检=生命周期最后一步统一进行,不阻塞迭代,澄清⑥口径)。
**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码/断言/golden → `--code`)全绿才合并;MC 零跑(零数值零行为)。
## 8. 异常分级
- **L1(自救)**:断言写法、探针路径选择、布局微调。
- **L2(记录继续)**:组帽去留与左列布局适配(§9 域内)、`_refresh_resume_button` 删除的消费点清理顺序、探针迁移中的中间态处理(契约 5 登记)、T2 估时随清点重估。
- **L3(停机呈报)**:卡③ 未同批到位导致「进入存档」无落点(停线等批,禁死钮合并);menu golden 漂移越出钮集区(形态面被波及=超出本批契约 7);发现设置/退出路径被意外触碰;F10 清点出现表外新位点且无法随批迁移。
## 9. 代拍板白名单(超清单必呈报)
1. 组帽与左列布局适配:**「── 冒 险 ──」帽必撤(组内零钮——退化态不留);「营地与系统」帽去留/改文案属代拍板,改名须追认单留痕**(v1.1 明写——保留原样=留一句指称不可达地点的文案,禁)。
2. `_refresh_resume_button` 去留:卡④不复用(卡④ T4 已证),默认删;删时同批清全部消费点(T1 列明)。
3. 「进入存档」钮的动词化命名与 tooltip 文案(对齐现役动词钮先例)。
4. 探针迁移中的中间态写法(路径分段断言 vs 端到端)+卡④未到位批内冒险段探针维直调(契约 5)。
5. 提交切分与 worktree 分支命名。
## 10. 待裁点
**零待裁点**(裁决 1 三钮结构、四功能去向均由澄清④结构树锁定;布局适配与组帽文案归 §9 代拍板+追认单留痕)。开工门 = U0(用户 `/iter` 发令)+ 卡③同批到位+ 契约 5 中间态条款随卡④排期一并确认。
---
**修订记录**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正:F10 探针影响面从「五探针」重列为 20+ 位点全量表(漏列 fx_shot/t17_defer/ui_tune/ui_input/layout/ui_click 断点段/ui_struct resume 专项/shot_probe career+level 段/smoke V2d/V3g/V3i 等);F5 `_refresh_resume_button` 消费面补全并补列 camp_shop_presenter.gd 实施本体;F12 art-bible :433 合并条款 excision 表述订正;F11 补 render_gate 菜单 golden 段与 golden_baseline_refresh.sh --menu;新增 F13(07 两处引述)。自扩标注:契约 5「同批或在先」标卡内推导、契约 6 标仓库纪律成文。卡内可收:契约 5 补卡④中间态条款、§9 第 1 条组帽必撤明写、§9 第 2 条删除面订正(卡④不复用)、V5 ConfirmDialog 多消费方表述、V 表补既有断言族/左列几何/七屏链三项。用户面裁决(裁决 1)零改动。
@@ -0,0 +1,196 @@
# 需求卡片:存档制数据层改造批(隐式单档 → 3 存档位)· 营地交互重做卡①
- 版本:**v1.2**(2026-10-18 grilling 轮次裁定回写——Q1 旧档归属裁定甲〔迁 1 号位,代拍板留痕〕、Q2 交付序列裁定甲〔推荐案,用户令按推荐执行〕;卡④回设计段不影响本卡链路——卡③在工程批内;v1.1 审查回写内容见文末修订记录)
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:④结构树「选档界面:3 存档位,新档/进档/删档」、⑤裁决 2/3/4、⑦切批原则①)+ [存档序列化](../gdd/systems/表现与支撑/存档序列化.md) P2 后置条
- 归属:数据层承载面(`game/core/save_manager.gd`)——营地交互重做五卡之一;用户可见面由卡③(选档界面)承载
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
- 开工门:U0(用户 `/iter` 发令)+ 待裁点已裁(Q1/Q2 均裁定,见 §10)+ grilling 复核门过
## 0. 前置依赖与并行性
- 卡③(选档界面)依赖本卡数据层;卡②(主菜单三入口化)的「进入存档」钮经卡③落到本卡的激活态。
- **交付序列待裁(Q2)**:卡③未到位前,全游戏无任何生产激活路径(卡③ 契约 8「进档即激活」是唯一激活入口)——旧入口在无激活态下写盘全被拒,且 `settle_adventure`(meta_progression.gd:284)忽略写盘返回值→进度静默丢失。冒烟探针走 attach_path 隔离不会红,机检放控不住。本卡「可先行」以 Q2 裁甲(与卡③同批或卡③在先)为前提;裁乙/丙须按 Q2 表执行过渡态。
- 与在役结构的关系:SaveManager/MetaProgression 已是 autoload(迭代 27 T1 裁点①),本批只改承载面(文件组织与激活态),不改升格结构、不改 autoload 链。
## 1. 目标与完成定义
**目标(澄清④照录)**:存档制数据层改造——隐式单档 → 3 存档位(save_manager + 存档格式)。裁决 2「多存档制,**3 个存档位**」;裁决 3「删档:**要**,且必须**二次确认**」;裁决 4「档槽摘要=**钥石余额、通关次数、冒险次数(总局数)**三项,不含未完冒险进度」。
**相对现状,新增了什么**:
1. 三存档位承载与当前激活位(现=单路径单实例,`user://save.json` 一档到底);
2. 新档/进档/删档三个数据层原语(删档=档案文件删除+盘面即时生效〔卡内工程规定,非澄清裁决语〕;二次确认弹窗归卡③承载);
3. 档槽摘要窥视读器(三项——只读、不激活、不写盘、零副作用);
4. 旧档 `user://save.json` 的显式处置(待裁 Q1)。
**完成定义**(全部满足才算本批完成):
1. SaveManagerCore 承载 3 存档位;位间互隔离(读写/删除/坏档兜底均按位);
2. 新档/进档/删档原语齐备且断言全绿;摘要三项读器按位正确;
3. 启动态钉死:`_ready` 不读任何槽(内存=默认合法空态)、无激活态一切写盘路径拒绝并返回 false、`_path` 不留 `user://save.json` 为隐式写目标;
4. 存档格式版本迁移链零破坏(v1→v7 照旧);本批不升 schema 版本——执行中确需新键时按「v6 域后扩列不升版」先例(vision_used,存档序列化.md:108)处理并登记;
5. 探针/冒烟隔离面(`attach_path` 与 smoke 注入路径)保留且行为零变化;
6. Q1 旧档归属按裁定执行并留痕;
7. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T4)。
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | 存档唯一实现=JSON 单档:`_path` 默认 `user://save.json`;`_init(path)` 可注入路径(冒烟隔离用);类头注自述「Core 层零 UI 零玩法依赖……禁 preload/import 任何玩法脚本」 | `game/core/save_manager.gd:15`/:21/:1-5 |
| F2 | 读写原语齐备:`load_from_disk`(新档/损坏兜底/迁移链/高版本拒读四路)、`write_to_disk`(tmp+rename 原子写;拒读禁写态拒绝)、`_corrupt_fallback`(坏档改名 `.corrupt.bak`)、`attach_path`(换路径+回默认数据+重读盘——迭代 27 T1 探针隔离面;注释明载「对象引用恒定,MetaProgression 持有的 save 引用零失效」) | `save_manager.gd:150-183`/:188-202/:443-450/:42-46/:40-41 |
| F3 | 版本与迁移:`SAVE_FORMAT_VERSION := 7`(v7=锻造工坊域 forge_routes);生产迁移链 v1→v7 六件自注册;`_normalize` 缺键补齐+退役域清退 | `save_manager.gd:9`/:25-30/:458-471 |
| F4 | 摘要三项的读取源已在役(单档):`keystone_balance()`、`adventure_cleared()`(三关全通才计 1)、`adventure_total()`(开局即计含放弃与失败)——按槽窥视读器=本批 T2 交付物 | `save_manager.gd:214`/:264/:258 |
| F5 | SaveManager 为 autoload(工程序 ConfigDB→RngService→SaveManager→MetaProgression);MetaProgression 持有 `var save: SaveManagerCore`,`_ready` 取 `/root/SaveManager` 一次——消费面对存档的引用是单实例单引用;全部访问器为 `save.xxx()` 动态分发、无缓存 | `game/project.godot:21`;`game/core/meta_progression.gd:9`/:21-25/:54 |
| F6 | 探针/冒烟隔离机制在役且面比初查大:`_META_SMOKE_PATHS` 注入清单 **18 条**(smoke_all.gd:5701-5708);另有 `user://smoke_save_*` 15 条(:6499-6511)、boot/lifecycle/lifecycle_resume/run_lifecycle 段(:277/:321/:463/:594)、`test_pacing_queue_save`(pacing_queue_test.gd:28)、`smoke_tune_probe_*`(ui_tune_probe.gd:167/:171)、probe tag 族(probe_ui_util.gd:98-121,10 探针 15 处调用);`attach_path` 直接消费 8 处+isolate_save 间接 15 处 | `game/smoke/smoke_all.gd:5701-5708`/:6499-6511 等;`game/smoke/probe_ui_util.gd:98-121` |
| F7 | 文档侧早已预写多档去向:存档序列化.md P2 后置表载「多存档槽位|单档 MVP(2026-09-21 裁决);多档等有真实需求再立项」——本批即该条预写的「真实需求」落地;同文 :61 现行口径=「存档是单文件 JSON(user://save.json)」;:20 系统范围负责表载「单档 JSON 存档的域划分与读写约定」 | `design/gdd/systems/表现与支撑/存档序列化.md:165`/:61/:20/:16 |
| F8 | 近期闸基线:冒烟 1151/0、单测 51/51(34 套件),载于 iter30 实现报告——开工日 T0 重测取当期值 | `reports/iter30-实现报告-2026-10-17.md:23`/:46-47 |
## 3. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 三存档位且仅三位**:用户原话「多存档可以让它有三个存档位」——位数写死 3;批内禁以「将来扩位」名义参数化,扩位=新裁点另立。
🔴 **契约 2 · 位间互隔离**:任一槽位的新建/进入/删除/损坏兜底不得波及其他槽位文件字节;删档只删该槽文件;坏档 `.corrupt.bak` 按槽生成。
🔴 **契约 3 · 迁移链与版本号零破坏**:`SAVE_FORMAT_VERSION=7` 与 v1→v7 链不动。槽位改造是承载面(文件组织+激活态)改造,不是 schema 改造;每槽档案结构与现行 v7 逐键同构。
🔴 **契约 4 · 旧档不静默丢失**:现行 `user://save.json` 必须按 Q1 裁定显式处置(迁 1 号位/保留不载/废弃三选一,用户裁);禁无声忽略、禁默认行为。
🔴 **契约 5 · 摘要三项且仅三项**:钥石余额/通关次数/冒险总局数;禁在摘要面露出未完冒险进度(裁决 4 明示「不需要显示有无未完成的冒险;只要我提到的那三个就够了」)。
🔴 **契约 6 · 消费面纪律不破**:其他系统只经 SaveManager 类型化访问器操作存档(存档序列化.md 消费面纪律);切槽=**同一 autoload 实例内 `_data` 与路径整体替换**(attach_path 先例:对象引用恒定,`save_manager.gd:40-41`)——禁每槽实例化+换 `MetaProgression.save` 引用(`_ready` 一次捕获会静默过期),禁 SaveManager 回写 MetaProgression.save;写盘目标=当前激活槽文件,无激活态时一切写盘路径拒绝并返回 false;「凡钥石发生变动的时刻都要落盘」纪律按位保持(存档序列化.md:121)。
🔴 **契约 7 · 测试隔离面保留**:`attach_path` 与 smoke 注入路径机制原样保留——槽位化后探针仍能隔离到单槽;单路径语义定义为「注入路径=激活槽文件(无激活态时注入即激活并重读)」,既有调用面零改;测试执行两入口铁规不破。若 §9 第 1 条选定单文件三键致该语义不可守,本契约显式降格为「最小改+探针修改清单留痕」并呈报(L3)。
🔴 **契约 8 · 删档原语正确性**:删除后该槽回合法空态(新档合法态=全零可玩,`_default_data` 纪律)、文件不在盘、无 `.tmp` 残留;删档的玩家侧必经二次确认(裁决 3,弹窗归卡③),本卡只保证原语正确;删激活槽时激活指针连清除(该槽不再可写)。
🔴 **契约 9 · 窥视读器三态**:可读槽=摘要三项零副作用;**不可读槽(损坏/高版本/缺版本字段)=显式损坏标记返回,禁触发 `_corrupt_fallback` 改名副作用**(窥视只读零副作用——.corrupt.bak 改名只发生在正式进档路径);`.tmp` 残留按空槽处理。坏档/高版本槽在选档面的呈现与操作集=卡③ Q2(第三态),两卡接口在各自 T0 对齐。
## 4. 范围边界
**做**:三槽承载(路径派生/当前激活位/激活与切位 API);新档/进档/删档原语;摘要三项窥视读器;旧档按 Q1 处置;断言批(冒烟+单测);反哺点清单。
**不做**(明示去向):
- 选档界面 UI、删档二次确认弹窗 → 卡③;
- 主菜单砍钮 → 卡②;营地场景图 → 卡④;ESC 浮窗与营地顶栏 → 卡⑤;
- 存档内容域口径(钥石怎么得、摘要记什么)→ 各 owner 文档(元进度/冒险结构/生涯),本批只承载不定义(存档序列化.md 系统范围纪律);
- schema 升版(确需新键时按先例登记,不主动升);
- 重裁多档策略本身(裁决 2 已裁三位)。
## 5. 关联文档同步面
> **v1.3 口径(2026-10-17 文档同步闸 v3)**:本批是代码实现批,禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`(`active.md` 是唯一例外)。下表「同步义务」一律执行为「列进 `reports/iter<N>-反哺点-<完成日>.md`:哪个文件哪一节、改成什么、依据,用户会话裁决后归文档批落文」。
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/gdd/systems/表现与支撑/存档序列化.md` | :61「存档是单文件 JSON(user://save.json)」→ 三槽承载;:20/:16 系统范围「单档 JSON 存档」;:165 P2 后置「多存档槽位|单档 MVP……多档等有真实需求再立项」——本批即该真实需求 | 反哺点 · 单文件→三槽口径改写+P2 条注销(去向=本批) |
| `design/gdd/06-待办清单.md` | 本卡登记条(卡片名/文件指针/状态) | 反哺点 · 列清单 |
| `roadmap.md` | 迭代行编入笔与批内状态刷新 | 反哺点 · 列清单 |
| `active.md` | 状态快照与本批条目 | **本批更新(唯一例外)** |
| `game/core/save_manager.gd`、`game/core/meta_progression.gd` | 承载面改造本体 | 实施本体(可写) |
| `game/smoke/*`、`game/tests/*` | 断言与隔离面 | 实施本体(可写) |
## 6. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核本卡全部行号。
### T0 事实坐实与裁点执行(≈0.5–1d)
- 复核 §2 全部行号与读数,漂移即订正本卡;
- Q1 旧档归属裁定执行(迁/留/废弃的动作落地,实现报告留痕);执行前置检查逐项过(见 §10 Q1 表「执行前置」行);
- 槽位存储机制与启动激活态按 §9 代拍板拍板(启动激活态的玩家侧行为以卡③ Q1 裁定为约束);
- **隔离面全清单清点**(v1.1 补):`_META_SMOKE_PATHS` 18 条+`smoke_save_*` 15 条+boot/lifecycle 四段+pacing_queue/tune_probe 两条+probe tag 族 15 处+`attach_path` 8 处直接消费+presenter lambda 注入面(main.gd:317)——逐点确认三槽化后仍可隔离到单槽,判定准则=契约 7 单路径语义;清点结果写成文(T0 产物),漏口恰是卡④要迁的探针面;
- 与卡③ T0 互列对齐:窥视读器签名/命名/返回结构/空槽与坏槽表示法(契约 9 三态)。
### T1 三槽位承载(≈1–1.5d)
- 槽位路径派生与三槽枚举(存储机制按 §9:三文件 vs 单文件三键——硬约束=每槽档案结构与现行 v7 同构、迁移链按槽独立成立、坏档兜底按槽;**槽 1 文件名禁复用 `user://save.json`**(Q1 乙案前提,防旧档被新流程误读));
- 当前激活位:设置/读取/清除;激活切换=同一实例内 `_data` 与路径整体替换(契约 6,attach_path 先例);
- **启动态钉死**(v1.1 补):`_ready` 不读任何槽(`_data`=默认合法空态);无激活态一切写盘路径拒绝并返回 false;`_path` 不留 `user://save.json` 为隐式写目标。启动行为「不隐式激活」的条件表述=卡③ Q1 裁甲/乙-预选时的默认实现;**裁乙-一键直入则本段随裁定改写**(卡③ Q1 连带,本卡不自定);
- 无激活态时访问器 fail-safe(返回合法空态/拒绝写,禁崩禁误写——同未知计数键先例,meta_progression.gd:54)。
### T2 档操作原语(≈1d)
- 新档:空槽创建=合法白板态(`_default_data` 全零可玩纪律);
- 进档:激活+读盘(复用 `load_from_disk` 迁移/兜底链,按槽成立);
- 删档:文件删除+该槽回合法空态+无 `.tmp` 残留+激活指针连清除(契约 8);「盘面即时生效」为卡内工程规定(挪用现役断点覆盖流注释语义,非澄清裁决语);
- 摘要三项窥视读器:钥石余额/通关次数/冒险总局数——只读、不激活、不写盘;空槽摘要=零值合法态;坏槽按契约 9 返回显式损坏标记;
- 写盘目标=当前激活槽文件(契约 6);激活标记自身落盘时机与 §9 第 2 条同一拍板(切槽即时写 or 进档时写)。
### T3 断言批(≈1.5–2d)
- 冒烟:三槽各自写入非默认值→写盘→新实例按位读回逐域相等(往返一致×3);删档后文件不在盘+该槽空态+激活指针清除;坏档按槽兜底;高版本拒读禁写按槽;迁移链 v1→v7 **各槽**成立(三槽各喂旧版本档→各读回相等——既有段只证单实例,本批补各槽断言);窥视三态(可读/坏/高版本)零副作用(窥视前后坏槽文件字节与 mtime 不变);
- 单测(`game/tests/`):摘要三读器跨槽读数正确;位间隔离(改 A 槽、B 槽字节不动);`attach_path` 隔离到单槽的行为保持;
- **启动态断言**(v1.1 补,原缺):boot 后无激活态(无激活访问器返回合法空态、写盘被拒);既有 boot 链 V2d-1(续玩钮恒隐)在新启动态下的处置显式化(改写为「boot 态续玩钮恒隐」或注明由卡② V2 改写时注销——禁判据空转);
- **旧档处置机检**(v1.1 补,原仅件核):按 Q1 裁定案补——甲=迁移前后逐域相等+槽 2/3 空+旧档处置字节留痕;乙=旧文件字节不动;丙=旧文件按定处置;
- **变异验证伴生**(新断言段逐条定注入实验):切槽写成只换路径不换数据(预期位间串味断言红)、删档漏删文件(预期在盘断言红)、摘要读激活位代替窥视位(预期跨槽摘要红)、`_ready` 偷复激活(预期 boot 断言红)、切槽后写盘落错槽(预期位间隔离断言红);实现期逐条执行「注入→最窄闸见红→`git checkout` 精确还原→记录」,记录表进实现报告。
### T4 产出物落位卡(≈0.5d,末卡——三份 `reports/` 文件写齐才算收口)
轻闸全绿后、合并前:`reports/iter<N>-实现报告-<完成日>.md`(各卡状态+变异验证记录表)/`reports/iter<N>-代拍板追认单-<完成日>.md`(§9 白名单内代拍项留痕)/`reports/iter<N>-反哺点-<完成日>.md`(§5 每条一落点)。`active.md` 状态记录照常更新。
**估时合计 ≈4.5–5.5d**(v1.1 上调:隔离面全清单+启动态/窥视三态断言增量)。切分预案:T1/T2 后可切(承载层先落、操作原语后落)——但本卡零用户可见面,切分价值低,建议单批跑完。
## 7. 验证闸(逐需求点验收清单)
| # | 需求点 | 测什么 | 落点/判定手段 |
|---|---|---|---|
| V1 | 三存档位+启动态 | 三槽独立承载、位间零串扰;boot 后无激活态、无激活写盘被拒 | 冒烟往返一致×3+启动态断言+单测位间隔离 |
| V2 | 新档 | 空槽创建=全零可玩合法态 | 冒烟(`_default_data` 纪律同款) |
| V3 | 进档 | 激活+读回=该槽内容 | 冒烟 |
| V4 | 删档 | 删后文件不在盘+槽回空态+激活指针清除+他槽零影响 | 冒烟+文件系统断言 |
| V5 | 摘要三项 | 钥石余额/通关次数/冒险总局数按位正确;空槽零值;坏槽损坏标记;窥视前后文件字节/mtime 不变 | 单测+冒烟(判定手段写死:字节+mtime 双比对) |
| V6 | 迁移链零破坏 | v1→v7 链在各槽成立(三槽各喂旧版本档);既有断言不破 | 冒烟既有迁移段复跑+各槽新断言 |
| V7 | 隔离面保留 | `attach_path`/注入路径机制行为不变(18+15+族清单逐点) | 既有冒烟/探针复跑+T0 清点件核 |
| V8 | 旧档处置 | Q1 裁定执行+机检(甲=逐域相等留痕/乙=字节不动/丙=按定处置) | 冒烟/单测按裁定案+件核 |
| V9 | 反哺点清单 | §5 每条有落点 | 件核对表 |
**测试方式两分法(2026-10-11 用户定)**:V1–V8 机检自动化;能力验证可经调试接口直改槽位/钥石状态(沿用现役 DebugOverlay/DS_DEBUG 门控,不走正常资源积累流程)。**本卡零用户目检项**(无用户可见面)——选档界面目检归卡③ V 表。
**闸口径**:轻闸每任务卡出口自跑;批末重闸 = `tools/run_all_gates.sh` 按改动域选档(本批只碰 `game/` 代码与断言面 → `--code`)全绿才合并;MC 零跑(零数值零行为——纯承载改造,同板同序列结算逐位一致由既有 parity 面承接)。
## 8. 异常分级
- **L1(自救)**:断言写法、命名、文件落点。
- **L2(记录继续)**:存储机制细节(三文件 vs 单文件三键,§9 域内)、激活态内存换栈写法、摘要窥视读器的缓存细节、激活标记落盘时机。
- **L3(停机呈报)**:槽位化与现行 autoload 生命周期不可兼容且修复超出承载面;Q1 执行中发现旧档结构意外(损坏+高版本叠加等)需用户裁;任何触碰 `SAVE_FORMAT_VERSION`/迁移链的诉求;§9 第 1 条选单文件三键致契约 7 不可守(隔离面须改)。
## 9. 代拍板白名单(超清单必呈报)
1. 槽位存储机制与文件命名(三文件 `user://save_slot_N.json` vs 单文件三键+激活索引)——约束:每槽结构与现行 v7 同构、迁移链按槽成立、坏档兜底按槽、**槽 1 文件名禁复用 `user://save.json`**。
2. 启动激活态的数据层机制(激活位持久化位置)——约束:玩家侧行为以卡③ Q1 裁定为准;**仅卡③ Q1 裁乙才需持久化,裁甲则作废**(连同卡③ 契约 8 父注一并按裁定回写)。
3. 类 API 命名(槽位/激活/窥视词族)与文件落点。
4. 删档边界(激活态槽可删性)——约束:禁崩禁误写,删后回合法空态+激活指针连清除;激活态生命周期终点=持续至显式清除/进程结束/该槽被删,**回主菜单不清除**(卡③ Q1 乙案「记忆上次激活槽」读持久化点而非内存态)。
5. 提交切分与 worktree 分支命名。
## 10. 待裁点
### Q1 · 旧档 `user://save.json` 的归属(必裁,未裁不开工)
**背景**:现行单档在开发机可能已有进度(钥石/天赋树/锻造/断点等)。槽位化后旧档必须有明确去向。三案并列,**无推荐**(用户令:不代裁):
| 案 | 内容 | 代价 | 执行前置检查 |
|---|---|---|---|
| 甲 | 迁为 1 号存档位:首次启动一次性迁移,v7 结构原样落入槽 1,槽 2/3 空 | 一次性迁移代码+迁移失败兜底面 | 旧档不存在=无操作(陈明);旧档损坏/高版本=「原样落入槽 1」承诺失效,路由 §8 L3 呈报;迁移后 `user://save.json` 处置(删/改名留痕)+幂等判据(槽 1 已存在不重迁)须在实现报告写明 |
| 乙 | 原样保留、不自动加载:旧文件留盘但新流程不读,自行处置 | 旧档成孤儿文件——盘面出现「看得见拿不到」的档 | 槽 1 文件名禁复用 `user://save.json`(否则「不自动加载」落空);.tmp 残留清理或陈明 |
| 丙 | 开发阶段破坏性废弃:按迭代 21 T5 树域废弃先例(禁迁移禁折算)弃旧档,从空三槽开始 | 开发机现有进度全清 | 旧文件按定处置(删/归档)写明 |
裁决方式:随卡片评审一并定案;裁定落 T0 执行+实现报告留痕。
**裁定(2026-10-18)**:**甲**——迁 1 号存档位。代拍板留痕(用户令「事项按推荐的来」,本项无推荐案,取默认甲=不丢开发机进度;追认单可 veto)。执行按「执行前置检查」列逐项过,迁移后旧档处置与幂等判据写实现报告。
### Q2 · 交付序列:本卡可否先于卡③落地(必裁,未裁不定排期)
**背景**:见 §0。卡③未到位前无生产激活入口;旧入口在无激活态下写盘全被拒且 `settle_adventure` 忽略写盘返回值(meta_progression.gd:284)→进度静默丢失;冒烟探针走隔离路径不会红,机检放控不住。
| 案 | 内容 | 代价 |
|---|---|---|
| 甲(推荐) | 与卡③同批交付或卡③在先(改 §0「可先行」表述,仿卡② 契约 5 硬依赖先例) | 排期自由度下降 |
| 乙 | 批内留临时隐式激活:旧入口首次触达存档时激活槽 1,卡③到位后摘除留痕 | 临时代码+摘除时的二次验证面 |
| 丙 | 接受中间态:登记 L2 已知缺口(激活入口真空),合入前呈报用户知晓 | 中间态进度丢失风险靠用户知情兜底 |
裁决方式:随卡片评审定案;裁甲则 §0 改写,裁乙/丙则按表执行并在实现报告「已知缺口」节登记。
**裁定(2026-10-18)**:**甲**——与卡③同批交付或卡③在先(推荐案,用户令按推荐执行)。§0「可先行」表述按裁甲维持;卡④(2026-10-18 回设计段)不影响本链路——卡③在工程批内,激活入口不真空。
---
**修订记录**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正:F6 注入路径 6→18 条并补全清单面、F8 出处改引 iter30 实现报告、F7 行号 :16→:20;启动激活态闭环:_ready 初态钉死(T1/完成定义 3)、切槽实例同一性(契约 6)、写盘目标与无激活拒绝(契约 6/T2);新增契约 9 窥视三态;S-1「启动不隐式激活」降格条件化、S-2「盘面即时生效」标卡内工程规定;隔离面清点扩为全清单(T0);Q1 补执行前置检查列;验收补启动态/各槽迁移/旧档机检三类断言与两类变异注入;新增待裁点 Q2 交付序列。用户面裁决(裁决 2/3/4)零改动。
@@ -0,0 +1,309 @@
# 需求卡片:营地场景图新建批(交互式营地 · 七物件绑定 · 四柜台拆解)· 营地交互重做卡④
- 版本:**v2.2**(2026-10-18 用户令再订正——**本卡留在营地交互重做批次内,不踢出**;前置条件转为批内登记事项逐项销号;🔴 归属纪律:卡只登记缺口与已有裁断,前置由谁解决/何时解决/设计稿与素材由谁产出**由用户定**(美术/设计线=用户自立批,铁律 2),Agent 不代跑不代产——v2.1 曾越权起草点选反馈设计稿,已撤回删除;设计前置闸纪律不变:设计定稿前不进代码实现)
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:①目标体验原话、②参照与反参照、③非目标、④目标结构树+纵深稿、⑤裁决 5/6/7/8/10、⑥验收方式、⑦切批原则④、⑧遗留)+ [camp.md](../gdd/ux/camp.md) v1.5 + [art-bible](../art/art-bible.md) §6.2/§7.5
- 归属:呈现层+美术线(`game/presentation/` + 场景素材)——营地交互重做五卡之四,**最大件**
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
- 开工门:**前置条件销号后进代码实现**(设计前置闸纪律不变:设计定稿前禁 `/iter` 开本卡代码段——美术素材线按铁律 2 走自立批并行推进,不占迭代位);前置解决清单见下方
## 🔧 状态:在批内 · 前置条件登记待解(2026-10-18 用户令:留在批次里,不踢出)
**背景**:本卡是新内容+新美术件需求,按 2026-10-10 用户立规(req-card 设计前置检查),设计定稿前不进代码实现。v1.x 曾用「待裁点」覆盖设计缺项(渠道/规格/设计稿/参照物),违立规;v2.0 一度按「回设计段」移出序列;v2.1 一度把「批内解决」执行成「Agent 代跑设计稿」——**v2.2 用户令终订:本卡是批内成员,前置条件在批内登记、逐项销号;但由谁解决、何时解决由用户定,美术/设计线是用户自立批(铁律 2),Agent 不代跑不代产**。设计前置闸纪律不变(设计定稿前禁 `/iter` 开本卡代码段),执行方式是「批内销号」而非剔除,也非 Agent 代劳。
**前置条件销号清单**(五项重启条件转为批内登记项):
| # | 前置条件 | 归属 | 状态(2026-10-18) | 解决路径 |
| -- | ------------------------- | -------------------------- | -------------- | ----------------------------------------------------------------------------------- |
| P1 | Q1 美术渠道裁定(A/B) | **用户**(一句话裁) | ⬜ 待裁 | 阻塞场景方向稿与规格路径分支;裁后由用户定推进方式 |
| P2 | 像素规格有着落 | 用户线(裁断已在卡:Q6 甲) | 🟨 半消 | Q6 甲已裁:Q1 裁 A 时用过渡规格(1280 工程档+烛光黄 #F6C667/木色 #8A5A34);终档归样张批冻结清单后置换(反哺点登记)——执行由用户线定 |
| P3 | 点选反馈设计稿(悬停高亮/提示文案/可点区域判定) | **用户线**(美术/设计归用户自立批——铁律 2) | ⬜ 未启动 | 澄清⑧3 已登记缺口;产出方式有备(Q8 甲=出稿呈裁)但**未受命开工**——2026-10-18 曾越权起草 v0.1,已按用户令撤回;待用户方向 |
| P4 | 参照物 | **用户**后续找 | ⬜ 待补 | 找到后与纵深稿对表;结构性冲突=呈报订正构图,禁批内私改 |
| P5 | GDD/art-bible 营地条款落文 | 文档批(P1–P4 定稿后,用户发令) | ⬜ 未启动 | camp.md 整体改版+art-bible §6.2/§7.5/§2.8 改版 |
**批内批次次序(铁律 2:美术素材走自立批、不占迭代位;先产图后改代码)**:P1–P4 销号(设计定稿)→ 场景图美术产出(自立批,素材线并行推进,产物归档 artwork/→game/assets/art/)→ P5 文档落文 → 本卡代码段 `/iter`(与 ⑤ 同波)。工程面 ①②③ 代码在美术线推进期间并行开发、先行交付(③ 进档落点按 Q3 裁定乙暂行接现役 CampOverlay,本卡落地时改挂)——**四卡同在批内,分波收口,不是剔除**。
**归属纪律(2026-10-18 用户令订正,v2.2)**:本卡只负责**登记前置缺口与已有裁断**;前置条件由谁来解决、何时解决、设计稿/素材由谁产出,**由用户定**——美术/设计线是用户自立批(铁律 2),Agent 不代跑、不代产、不自行开工设计稿。本卡曾越权起草点选反馈设计稿 v0.1(2026-10-18),已按用户令撤回删除;Q8(出稿呈裁)仅是「若用户发令出稿时的产出方式」预裁,非开工授权。
**已裁事项(2026-10-18 grilling 轮次)**:
- Q4=甲:最近冒险条带随四柜台拆解撤下,生涯.md P6 同批注销(代拍板留痕);
- Q5=甲:ConfirmDialog 扩第三钮(继续上一段冒险/开始新冒险/取消,cancelled 恒=无变更退回营地);
- Q6=甲:Q1 裁 A 时过渡尺寸档=现役 1280 工程档+烛光黄 #F6C667/木色 #8A5A34 既有规格,终档归样张批冻结后置换(反哺点登记);
- Q8=甲:设计稿产出方式=批内出稿呈裁(方向稿先行纪律照旧——2~3 张低成本方向稿供选划,判完方向才精制);
- Q3 设计稿只覆盖根态点选反馈;进界面后的叠层规则随承载形态裁定派生(独立全屏页=场景根隐藏/单一内页切换=场景根留底)。
**仍待用户裁**:Q1 美术渠道 A/B(我的推荐:**A · CC0 改色**——06:23 已有配色规格、成本低、方向稿不受「从零构图」拖累;B 依赖规格清单输入且周期长。你说过不替你选,但我把推荐摊开了,等你一句 A 或 B,方向稿当天就能出);Q2 参照物(你后续找)。
## 0. 前置依赖与并行性(批内视角,v2.1)
> 本卡在批内,前置条件解决中(见卡头销号清单)——本节描述批内并行关系,非排期承诺。
- 卡③(选档界面)Q3 已裁乙:随①②③工程波先行时进档/新档暂行接现役 CampOverlay——**本卡代码波落地后,营地入口从现役 CampOverlay 改挂场景图,现役 CampOverlay 随之拆解退役**(卡③暂行接线与本次改挂的二次验证面在卡③ T2/实现报告登记)。
- 卡⑤(ESC 浮窗与营地顶栏)落在本批新建的场景屏顶栏位——两卡触碰同一新屏,建议同批或卡⑤随后。**跨卡接口(v1.1 补全)**:①场景屏顶栏位(T2 预留);②**营地刷新单口**(T3 定义:各写口尾→现开界面刷新+场景根 HUD 刷新一闸完成)——卡⑤ HUD 刷新挂该单口,非已退役的 `refresh_camp`;③ConfirmDialog 三钮化与消费方编排(T4,卡③ 契约 3 同款互指);④子界面返回钮承诺(T3)。
- 美术线与代码线的批次关系:T1(素材产出)与 T2–T4(代码)可分批——素材先归档齐、代码后挂(用户批次归属裁,本卡不预占)。
- 样张线关系:**营地屏的整屏样张是 art-bible §1.4 四屏之一,现列 06「待设计」排队行**(样张批 Q2 甲案:本批只判战斗屏,余三屏排队)——本卡**不跑整屏样张闸、不替代样张批**,只按既有约束(§3 契约 7/9)生产与自检;营地屏样张义务留原排队行(反哺点注记)。文档既定序列(排队行措辞「终稿后再出样」)本就终稿先于营地样张,故 T1 终稿落盘不构成违背 art-bible §7.5「前置」条(§5 反哺点已注)。
## 1. 目标与完成定义
**目标(澄清①一句提炼照录)**:营地首页从「文字按钮菜单 + 列表式覆盖层」改为「**一张可点击的营地场景图**」——点场景中的具体物件进入对应功能界面。用户原话照录:「我是希望有一个营地地图的游戏画面;或者是一张营地的图片,跟 UI 的交互是点击图片中的某一处地方,然后再进入界面。不是完全普通的那种 UI 设计,不是各种框框的……我点击某些具体的东西之后,就可以进入对应的操作界面。」(称呼订正:「它就是一个营地的画面;并不是一张地图。」)
**七物件绑定(澄清④结构树照录,逐一落地)**:
| 物件 | 绑定目标 | 现状定性 |
| ------- | -------------------------- | ------------ |
| 营地大门 | 冒险(选路屏/战斗屏已实现,不动;断点弹窗保留移位) | 入口新建+动线迁徒 |
| 锻炉·铁砧 | 锻造工坊 | 界面已实现 · 入口改挂 |
| 宝箱 | 秘宝匣 | 界面已实现 · 入口改挂 |
| 床铺旁笔记本 | 生涯记录 | 界面已实现 · 入口改挂 |
| 木桩 | 树淬炼天赋树 | 界面已实现 · 入口改挂 |
| 布告板/悬赏板 | 奖励格图鉴 | 界面已实现 · 入口改挂 |
| 篝火 | 离开营地/回主菜单 | 新建小动线 |
**纵深稿(用户原话照录)**:「远景是天空;中景是一个围栏,还有营地大门;近景中间是一个篝火;左边是锻炉铁砧;右边是我们的床铺,宝箱等。」
**大门两分支(裁决 5 照录)**:有未完冒险 → 弹「继续上一段冒险 / 开始新冒险」;无未完冒险 → 弹「是否开始新冒险:是/否」。**点大门永远先出确认,不直接进冒险**(「断点续玩也是开始冒险的两个分支之一……它算是开始冒险的一个子节点」)。**「有断点」分支的三出口弹窗形态待裁(Q5)**——现役 ConfirmDialog 双钮表达不了两个肯定性动作。
**钥石余额(裁决 10 照录)**:场景**顶部小 HUD 栏**(用户原话「先按顶部小HUD栏设计」——provisional 措辞留痕;承载落卡⑤)。
**相对现状,新增了什么**:
1. 交互式营地场景图(场景素材+场景屏+七物件命中区与点选交互)——从零新建;
2. 现四柜台覆盖层(CampOverlay)拆解:锻造工坊/秘宝匣/天赋树/奖励格图鉴四界面抽为独立可开界面,入口改挂场景物件;生涯页入口自主菜单改挂笔记本;
3. 大门动线(开始冒险/继续上局两分支+断点确认弹窗从主菜单移位);
4. 篝火回主菜单小动线;场景屏顶栏预留位(卡⑤ HUD);
5. camp 截图断言段与六探针营地段的迁移(**现无 camp 逐像素 golden 基线**——v1.1 订正,见契约 10)。
**完成定义**:
1. 营地首页=可点击场景图;七物件绑定逐一在役,点各物件进对应界面;
2. 四柜台拆解完毕:CampOverlay 覆盖层形态退役,五界面(锻造/秘宝/生涯/天赋树/图鉴)经新入口可达且**功能与写口链路零回归**(presenter 改造=承载面迁移的一部分——见契约 4);
3. 大门两分支确认弹窗在役;点大门不直接进冒险;
4. 篝火可回主菜单;场景屏顶栏预留位就绪(卡⑤联验);
5. camp 截图=场景图形态(迭代内验收=截图对比,澄清⑥);探针断言迁移完毕;
6. 美术约束(48 色板/禁入带/语义色/WCAG)入闸或登记缺口;**用户目检项登记 07**(生命周期末步,不阻塞);
7. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T6)。
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
| # | 事实 | 出处 |
| --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| F1 | 营地场景图完全不存在(澄清④判定「完全没有 · 新建」);现营地=CampOverlay 四柜台覆盖层(树淬炼/锻造工坊/秘宝匣/奖励格图鉴并排,迭代 21 T6 程序占位重排——代码注释原文「视觉终稿归 HUD 营地视觉批」) | `需求澄清-营地交互重做-2026-10-18.md` §④;`game/presentation/views/camp_overlay_view.gd:86-87` |
| F2 | 营地屏壳(CampScreen)持 CampOverlay 成员;组合根 `main.camp_overlay` 句柄指向屏壳成员(探针挂载假设) | `game/presentation/scenes/camp_screen.gd:8-14`;`main.gd:112` |
| F3 | CampOverlay 结构:顶栏铭牌+钥石徽(:64-84);四柜台并排横滚(树淬炼 :99-109/锻造工坊 :111-137/秘宝匣 :139-159/奖励格图鉴 :161-172);底栏关闭钮+最近冒险条带(:174-189);钥匙门判据读树投影(:287-296);图鉴柜台=结构位预留(:168「内容排 Alpha」) | `camp_overlay_view.gd` 各处 |
| F4 | 五目标界面现状:锻造工坊=CampOverlay 内工作间(`_forge_workbench` 两区六路线);秘宝匣=`_ws_scroll`/`_workshop_holder`(12 件+同调装配段+Y 升级行);天赋树=`_tree_holder`(脉分组行板+Fork 双态钮);图鉴=占位;生涯=**已独立全屏页**(CareerOverlay,入口现居主菜单生涯钮,自带返回钮) | `camp_overlay_view.gd:116-137`/:144-159/:99-109/:161-172;`views/career_overlay.gd`;`main.gd:332` |
| F5 | 营地购买写口链路:视图只发意图信号(`buy_requested`/`tree_buy_requested`/`forge_*` 等),组合根经 CampShopPresenter 转 MetaProgression 写口;投影数据=`camp_shop_presenter.gd:62-72` `camp_data()` 单点 | `camp_overlay_view.gd:8-15`;`camp_shop_presenter.gd:62-72` |
| F6 | 断点确认弹窗现居主菜单开始冒险路径(有断点先出 ConfirmDialog 再开局)——随卡②撤钮整体移交本卡大门 | `main.gd:475-497` |
| F7 | 冒险屏已实现不动:选路屏(LevelMapScreen,`route_chosen` 前进唯一通道)与战斗屏宿住 AdventureScreen;组合根侧:`_start_adventure_from_menu`(:475-484)/`_on_confirm_new_adventure`(:487-492)/`_resume_from_menu`(:518-536)/`_start_adventure`(:579-597)/`build_adventure_params`(:564-574) | `views/level_map_screen.gd:7`;`scenes/adventure_screen.gd:36-37`;`main.gd` 各处(v1.1 行号订正) |
| F8 | 探针面营地段(全部随本批迁移,v1.1 补列):ui_probe(营地入口+余额+秘宝匣 12 行断言 :28-55,深员 `_balance_label`/`_tree_buy_btns`/`_workshop_rows` :39-52)、ui_click_probe(营地购买全链 :53-127;**断点确认段 :500-528**〔经 lvbtn 驱动 ConfirmDialog 取消/开新冒险——被卡②撤钮+本批弹窗移位双杀,v1.1 补列〕)、screen_flow_probe(营地可见态键 :53 直读 `main.camp_overlay.visible`;营地开合 :109-125 回退段直呼 `main.camp_overlay.closed.emit()`;菜单→冒险 lvbtn 步 :130-136)、shot_probe(camp 截图+「关闭营地」钮收闭 :126-133)、ui_struct_probe(camp 结构审计 :41-49;同槽特例断言 :331/:373)、smoke_all(V2 营地屏壳实例化 :170-171;V3g 营地模态开合 :405-435;**camp_overlay_view.gd 源码断言段 :6469-6475**〔三条锁四柜台等高形态本身——`Vector2(0,336)`×3/`SIZE_FILL`×4/`SIZE_SHRINK_CENTER`≥3,随形态退役〕)、ui_contrast_probe(营地令牌段 :48-55〔UiKit 令牌恒等式,不随拆解红;新界面若不再消费 `CAMP_HEADER_BAND`/`CAMP_ROW_PLATE` 则段标签虚挂,须核签〕)、**forge_workbench_test.gd 单测**(:33 直载 camp_overlay_view.gd 并消费 `_forge_rows`/`_forge_workbench`/`open_camp`/`refresh_camp`/三 forge 信号——CampOverlay 一删即红) | `game/smoke/` 各处+`game/tests/unit/presentation/forge_workbench_test.gd:33` |
| F9 | camp UX spec 形态记述将整体退役:三柜台列/顶栏铭牌钥石徽/底栏关闭钮+最近冒险条带(v1.5,事实源声明= camp_overlay_view.gd 实态;条带实述于 :19-20) | `design/gdd/ux/camp.md:14-20` |
| F10 | art-bible 营地条款将失义:§6.2 营地场景「三柜台在烛光下一字排开,钥石余额常驻顶栏」;§7.5 营地界面「三柜台界面画法……视觉终稿以表现层样张过审为前置」;§2.8 承载元素同述 | `design/art/art-bible.md:366-369`/:436-438`/:136-140` |
| F11 | 图鉴内容在册挂起:奖励格图鉴柜台已随配比预设批整体挂起冻结(2026-10-05 用户令,06 在册),重启须用户另行发令——本批只改入口不激活内容 | `design/gdd/systems/跨局循环/生涯.md:63` |
| F12 | 贴图重构批搁置未废:营地与元进度件终稿置换(06:21-27)等交互重做定形后再议(澄清③1/§⑧5)——本批不清偿该债;四柜台拆解后原「柜台场景贴图」债对象变化,随该批重新评估 | `design/gdd/06-待办清单.md:21-27`;`需求澄清-营地交互重做-2026-10-18.md` §③1/§⑧5 |
| F13 | 营地底栏「最近冒险」条带与生涯历史回看同源(同一份 `recent_summaries`),其去留=生涯.md P6 待裁点(期二必答)——CampOverlay 拆解后该条带无处挂,P6 被迫提前面对(本卡 Q4) | `camp_overlay_view.gd:186-189`/:536-549;`生涯.md:69`/:91-101\` |
| F14 | 素材线纪律:`artwork/` 不入 git(`.gitignore:51` 忽略行)——批次 worktree 内无该目录、主工作区 D:/code/g-plan2 实体存在(在途工作区);涉素材脚本须传主区绝对路径否则静默 0 张;素材替换前先归档旧档;终稿归 `game/assets/art/` | `CLAUDE.md:32`;`.gitignore:51`;art-bible §8.3 归档纪律(v1.1 行号与表述订正) |
| F15 | 美术硬约束继续有效(澄清③4):明亮轻快像素风、**48 色板、HSV 300°–345° 禁入带、语义色纪律、WCAG ≥4.5:1**——全局约束,不在本讨论范围翻案 | `需求澄清-营地交互重做-2026-10-18.md` §③4 |
| F16 | 像素级规格不在本卡硬定(澄清③5):尺寸档/色板/明度档归「战斗一屏样张批」冻结的规格清单——该批现列 06「待设计」未排期(2026-10-17 用户令自迭代 30 剔除),本卡只写指针并登记依赖(缺口连带裁=Q6) | `需求澄清-营地交互重做-2026-10-18.md` §③5;`design/gdd/06-待办清单.md`(迭代 30 剔除卡②③ 条) |
| F17 | 机检工具面(v1.1 订正):**截屏级 48 色计数不在役**;在役=`tools/palette_check.py`(art-bible §8.3①挂点——48 设计色板令牌+新增色双门)+`tools/standee_asset_check.py`(像素画单张 32 色冻结执法);`tools/render_gate.sh`(shot_probe 七屏→shot_checker 语义断言;golden 段=棋盘三张+menu_boot 四张,**无 camp golden**——shot_checker.py:143 明载「camp/level 走骨架+目检清单」);shot_checker 段=屏级骨架/文字 WCAG/明度三档带/文字禁压纹理/文字在判据 | `tools/palette_check.py`;`tools/standee_asset_check.py`;`tools/render_gate.sh`;`tools/shot_checker.py:143` |
## 3. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 交互式场景图形态**:营地首页=一张可点击的营地场景图,点物件进界面(澄清①)。**禁退回文字按钮列表+面板覆盖层形态**(澄清②反参照:「完全普通的那种 UI 设计」「各种框框」——用户判现状「交互流程完全错误」)。
🔴 **契约 2 · 七物件绑定逐一落地**:大门/锻炉铁砧/宝箱/笔记本/木桩/布告板/篝火七个绑定(§1 表)缺一不可;禁合并、禁以「其他入口」替代(如顶栏文字钮)。
🔴 **契约 3 · 大门两分支**(裁决 5):有未完冒险→「继续上一段冒险/开始新冒险」二选一弹窗(**三出口形态=Q5 待裁**);无→「是否开始新冒险:是/否」弹窗。**点大门永远先出确认,不直接进冒险**;弹窗类=ConfirmDialog(三钮化+消费方编排=T4,卡③ 契约 3 同款互指)。
🔴 **契约 4 · 已实现界面只改挂不重做+presenter 承接面(v1.1 精确化)**:锻造工坊/秘宝匣/天赋树/图鉴/生涯五界面「界面已实现 · 入口改挂」——功能、行板、写口链路零重设计(拆解=承载面迁移)。**presenter 改造=承载面迁移的一部分**:`camp_shop_presenter.gd` 持 `camp_overlay` 句柄(:10)、七条写口尾全部 `camp_overlay.refresh_camp(camp_data())`(:85/93/105/117/129/142/154/168)、`CampFlowContext` 持类型化字段(camp_flow_context.gd:10/22/29)、open/close 编排(:41-56)——**写口语义零改≠presenter 文件零改**:投影目标改线(五界面/场景根)、写口尾刷新改路由、open/close 编排随入口从 campbtn 迁位到卡③进档动作、ctx 字段语义订正、探针缝保缝(main.gd:1163-1171)。改造纪律:`on_camp_attune_toggle`(:98-106)尾只 refresh_camp、不调 `_refresh_presentations`(与其余六口不一致)——**保持原样,禁「顺手统一」防行为漂移**。
🔴 **契约 5 · 图鉴内容保持挂起**:只改入口(布告板),不激活图鉴内容(F11:2026-10-05 用户令冻结,重启须用户发令);布告板点开的图鉴=现行占位态(T3 定义占位壳)。
🔴 **契约 6 · 冒险进行中不开营地**(澄清③6):营地是存档语境(局外)枢纽,现状口径延续;局内只读面=状态面板(在役,本批零改动——其「营地三柜台进度」文案若因拆解失义,列反哺点归文档批订正)。
🔴 **契约 7 · 美术硬约束**:48 色板、HSV 300°–345° 禁入带、语义色纪律、WCAG ≥4.5:1(F15);场景素材全局纹理过滤=Nearest(project.godot 现行默认,像素纪律)。
🔴 **契约 8 · 像素规格不硬定**:尺寸档/色板/明度档只写指针(战斗一屏样张批冻结的规格清单,F16);卡内禁自定像素规格数值;规格清单未产出时的输入缺口=Q6 裁定(禁批内自补、禁 T0 现场发挥)。
🔴 **契约 9 · 迭代内验收=截图对比+终稿落盘口径(v1.1 补)**(澄清⑥):camp 截图须为场景图形态;用户实机目检=生命周期最后一步、统一进行、**不阻塞迭代**——目检项登记 07 清单即完成义务。**T1 终稿落 `game/assets/art/` 的「验收」口径=迭代内验收**(截图对比+shot_checker 机检+方向稿用户选划)——营地屏整屏样张按既定排队行延后(§0),不构成对 art-bible §7.5「前置」条的违背(§5 反哺点注)。
🔴 **契约 10 · 探针断言迁移契约(v1.1 订正,属仓库既有测试纪律的卡内成文,非用户裁决)**:F8 全量位点逐点显式迁移并留痕;**现无 camp 逐像素 golden 基线**(F17:golden 现役仅棋盘三张+menu_boot)——本批不建 camp golden(「把不存在的东西列进迁移清单」禁),camp 截图验收=shot_probe 出图+shot_checker 语义断言段;若要新建 camp golden 须另裁登记(L3)。
## 4. 范围边界
**做**:场景素材产出(渠道按 Q1 裁定);场景屏+七物件命中区与点选交互(反馈细节按 Q3 设计稿);四柜台拆解与五界面入口改挂(含 presenter 承接面改造);大门动线两分支+断点弹窗移位;篝火回主菜单;场景屏顶栏预留位;断言/探针迁移;反哺点清单。
**不做**(明示去向):
- **不做贴图重构批**(澄清③1):柜台场景贴图/钥石顶栏图标/永久强化条目图标的达标化置换——搁置未废,待交互重做完形后重新评估立项(F12);
- 不激活图鉴内容(契约 5);
- 不改五界面功能与写口链路(契约 4);
- 不改冒险屏/选路屏/战斗屏本体(F7 已实现不动);
- 不做整屏样张闸、不替代样张批、不新建 camp golden(§0/契约 10);
- 局内状态面板零改动(契约 6);
- ESC 浮窗与顶栏 HUD 实现 → 卡⑤(本卡只留顶栏位+定义刷新单口);
- 选档界面/主菜单/数据层 → 卡③/卡②/卡①。
## 5. 关联文档同步面
> **v1.3 口径**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`(`active.md` 唯一例外);下表一律执行为列进反哺点清单。美术素材产物按素材线纪律落 `artwork/`(在途)→ `game/assets/art/`(终稿),不随 git 合并(F14)。
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/gdd/ux/camp.md` | :14-20 布局与交互节(三柜台列/顶栏/底栏)+:10 定位句(主菜单入口)+头注事实源声明(=camp_overlay_view.gd 实态)——四柜台形态整体退役、入口改挂场景物件 | 反哺点 · spec 整体改版重写(形态节退役+新形态成文) |
| `design/art/art-bible.md` | §6.2 营地场景(三柜台一字排开→交互式场景纵深稿);§7.5 营地界面(三柜台画法→五界面画法+场景图画法);§2.8 承载元素;营地屏整屏样张排队行注记(本批不跑闸);**§7.5「视觉终稿以表现层样张过审为前置」条与本批的关系=样张排队行既定延后(终稿后再出样),防文档批误判违例**(v1.1 补注) | 反哺点 · 列清单(权威面零直改,过用户裁决后归文档批) |
| `design/gdd/systems/跨局循环/生涯.md` | :69 与营地边界表(条带 `_rebuild_recent` 随 CampOverlay 拆解去向=Q4);:63 图鉴挂起条(入口改挂注记) | 反哺点 · 列清单(P6 去留随 Q4 裁定) |
| `design/gdd/08-Alpha版本标准.md` | 「三 · 界面」营地行(:104)形态注记改写——状态列可改;注记改写列反哺点;增删行须用户裁(三卡统一口径) | 反哺点 · 列清单 |
| `design/gdd/06-待办清单.md` | 本卡登记条;UI 贴图重构批条(:21-27)注记「四柜台对象变化、重评待交互重做完形」;图鉴挂起条注记 | 反哺点 · 列清单 |
| `design/gdd/07-体验验证清单.md` | 新增实机目检条(场景观感/七物件辨识与点选反馈/大门两分支/篝火动线)——登记不阻塞 | 反哺点 · 列清单 |
| `roadmap.md` | 迭代行编入/状态刷新 | 反哺点 · 列清单 |
| `active.md` | 状态快照与本批条目 | **本批更新(唯一例外)** |
| `game/presentation/*`、`game/smoke/*`、`game/tests/**`(v1.1 补——forge_workbench_test 迁移面)、`game/tests/golden/*`(仅棋盘/menu 既有基线复跑)、`game/assets/art/*` | 实现/断言/终稿素材本体 | 实施本体(可写) |
## 6. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。**估时主变量=美术渠道(Q1 待裁)、点选反馈设计稿往返(Q3)与规格输入(Q6)**。
### T0 事实坐实与设计输入齐备检查(≈0.5d)
- 复核 §2 全部行号;四柜台界面清单与探针面清单(F8)逐点过;
- 设计输入齐备检查:Q1(美术渠道)/Q2(参照物)/Q3(点选反馈细节)/Q4(条带去留)/Q5(三出口弹窗)/Q6(规格缺口)状态逐项核——**未裁项对应的任务段禁开工**(缺输入=呈报,禁批内自补);
- 规格清单依赖核检:战斗一屏样张批(06 待设计)产出时点 vs 本批排期——按 Q6 裁定执行(禁 T0 现场发挥);
- 与卡③对齐 ConfirmDialog 消费方编排机制(T4 互指)、与卡⑤对齐顶栏位与刷新单口(§0 跨卡接口)。
### T1 场景美术产出(≈2–4d,渠道 A/B 待裁 Q1)
- 按纵深稿构图(远景天空/中景围栏+大门/近景篝火居中/左锻炉铁砧/右床铺+宝箱)出场景图;七物件可辨性=第一合格线(玩家一眼找到点哪);
- 美术硬约束入产线(契约 7):48 色板/禁入带/语义色/WCAG/Nearest;**色板机检二器复用**(palette_check.py 48 令牌+新增色双门/standee_asset_check.py 像素 32 色冻结——v1.1 订正:非「全仓无工具」);
- 尺寸档=样张批规格清单指针(契约 8);按 Q6 裁定执行过渡口径或挂起;
- 产物按素材线纪律落盘(F14):在途 `artwork/`(主区绝对路径)→ 验收后终稿 `game/assets/art/`;替换先归档旧档;**命名纪律**:art-bible §8.3:503(`<域>_<对象键>_<状态|变体>.png`)+doc-conventions §12 三段式「终稿文件名=代码消费名——先定资源路径常量,素材名跟它走,防断链」(v1.1 补指针);
- 终稿落盘「验收」口径=契约 9(迭代内验收三件套);
- **防不满意工序**:场景图先出 2–3 张低成本方向稿供用户选划,判完方向才精制(样张卡「方向稿先行」同型纪律;选划记录三段表进开工单)。⚠ 本条为**本卡自我从严的执行纪律**,非用户新裁决——用户若要以单路线直接精制,从其裁。
### T2 场景视图与点选交互(≈1.5–2d)
- 场景屏承载(camp_screen 屏壳改造 vs 新屏壳——§9 拍板):场景图铺底+七物件命中区;
- 点选交互:命中区判定+反馈形态按 Q3 设计稿(悬停高亮/提示文案/可点区域判定三项);
- **场景屏顶栏预留位(v1.1 注明)**:卡⑤ HUD 落位;**刷新入口=本卡 T3 定义的营地刷新单口**(卡⑤同口挂接);
- **叠层规则显式派生(v1.1 补)**:随 §9 第 2 条承载形态裁定派生并写入 V2 断言——独立全屏页=场景根隐藏(生涯先例);单一内页切换=场景根留底;「缩放虚化」是两选项之外的第三形态(涉新演出面+素材),禁批内自选(若设计稿/用户想要,升格裁点);
- 键盘焦点/手柄不涉(08:191-192 排 Beta;ESC 属卡⑤用户明示裁决面)。
### T3 四柜台拆解与入口改挂(≈2–2.5d)
- 锻造工坊/秘宝匣/天赋树/图鉴四界面自 CampOverlay 抽出为独立可开界面(承载形态=§9 拍板:各自独立全屏页〔生涯先例〕vs 单一营地内页切换——约束=写口链路零改、零新素材);**五界面各带返回/关闭钮**(v1.1 补承诺——现四者共用 CampOverlay 底栏关闭钮随拆解消失,卡⑤ Q1 甲案前提即此);
- 生涯页入口自主菜单生涯钮改挂床铺旁笔记本(CareerOverlay 本体零改);**生涯页返回钮文案禁含「营地」字样**(ui_struct_probe.gd:382 nojump 禁词表含「营地」——career_overlay.gd:27 现「返回」安全,改文案时避坑,v1.1 补坑注);
- 入口改挂后各界面开合走模态栈单口;层序入 `LAYER_CONTRACT`;
- **CampShopPresenter 承接面改造(v1.1 补条,契约 4)**:投影目标改线(五界面/场景根)、七写口尾刷新改路由(经营地刷新单口——**各写口尾→现开界面刷新+场景根 HUD 刷新一闸完成**)、open/close 编排从 campbtn 迁位到卡③进档动作、CampFlowContext 字段语义订正、探针缝保缝(main.gd:1163-1171);改造纪律见契约 4(attune 尾不一致口保持原样);
- **图鉴占位态(v1.1 补条)**:独立界面壳=§9 第 2 条承载形态;文案照录 camp_overlay_view.gd:168 现行锁文,「柜台结构位预留」中『柜台』称谓随形态订正(L2 记录,零新文案);V6 断言锚定新视图占位标签;
- **开层互斥与关层收闭(v1.1 补条)**:营地开层时选档层被模态栈遮挡隐藏(卡③ T2 同口径);篝火/ESC 回主菜单=营地层与选档层同收+开始层恢复(现役 on_camp_closed 模式只视野开始层,选档层不在其视野——须显式);
- CampOverlay 类退役处理(拆解后无消费面即删——吸收即死纪律);`main.camp_overlay` 探针句柄迁移留痕;
- 最近冒险条带去向按 Q4 裁定执行。
### T4 大门动线(≈1–1.5d)
- 大门点击→两分支确认弹窗(裁决 5):有断点=「继续上一段冒险/开始新冒险」二选一;无断点=「是否开始新冒险:是/否」;
- **三出口弹窗形态(Q5 已裁=甲)**:ConfirmDialog 三钮化+**消费方编排**(组合根单实例+待确认消费方状态量:open 前设、confirmed/cancelled 后分派;禁每次 connect/disconnect 漂移、禁双常驻静态接线——卡③ 契约 3 同款互指);
- 断点弹窗自主菜单移位(main.gd:475-497 逻辑整体迁来,卡②已摘除原调用);
- 「继续上一段冒险」接现役续玩编排(`_resume_from_menu` 同源);「开始新冒险」接现役开局编排(`_start_adventure` 同源)——冒险屏/选路屏/战斗屏零改(F7);
- 冒险发起后营地场景屏隐藏;**终局落点不变量(v1.1 补)**:现役口径=终局 continue 回主菜单(main.gd:703)——若后续改落点为营地,营地语境可能出现未收束会话,卡⑤「返回主菜单」动线须补 `_begin_session(false)`,两卡 T0 互证;
- `_refresh_resume_button` **不复用**(大门两分支直读 `has_breakpoint`,无钮可刷——v1.1 明示,函数随卡②删,防两卡互以为对方在处理)。
### T5 断言、探针与 golden 迁移批(≈2–2.5d)
- shot_probe:camp 截图路径改(进入存档→选档→进档→营地场景图);截图自检存在且非空;**camp 段收闭改缆(v1.1 补)**:现经「关闭营地」钮收闭(:133)——营地根态无关闭钮(出口=篝火/ESC),改篝火动线或调试直改 visible;
- **无 camp golden**(契约 10):camp 验收=shot_probe 出图+shot_checker 语义断言段(文字 WCAG/明度三档带/文字禁压纹理/文字在判据扩 camp 取样面);棋盘/menu 既有 golden 复跑;
- F8 全量位点逐点迁移(v1.1 补列项):
- **探针深员改指表**:ui_probe `_balance_label`/`_tree_buy_btns`/`_workshop_rows`(:39-52)、ui_click_probe `_tree_buy_btns`/`_tree_fork_btns`+三处 `main.camp_overlay.refresh_camp(main._camp_data())` 直呼(:72/99/110)、ui_struct_probe audit 根(:45)——「改挂新入口」不够,这些是成员级耦合;七命中区与笔记本命中区的探针寻址名随 T2 命名稳定化一并定;
- **smoke_all:6469-6475 源码断言段**:三条锁四柜台等高形态本身——按新形态重写或注销(四栏等高纪律是否迁入新界面=§9 第 2 条裁后定);
- **ui_click_probe:500-528 断点确认段**:改走大门路径断言(与 V3 合并或互指;卡② T2 明列移交、本卡 T5 接收);
- **ui_contrast_probe:48-55 营地令牌段**:核签(新界面仍消费 `CAMP_HEADER_BAND`/`CAMP_ROW_PLATE`=段留;不再消费=段随注销);
- **forge_workbench_test.gd 单测**:随锻造视图抽出同迁(断言零改、只换承载类);V4 复跑清单补该单测;
- **生涯段驱动改缆**:ui_struct_probe:54-69 与 shot_probe:103-124 现经 `_start_overlay`「生涯」钮驱动——改挂后须合成点击场景笔记本命中区;命中区若为 TextureRect/Area2D 而非 Button,`ProbeUiUtil.find_button` 失效,寻址面随 T2 扩展;
- **screen_flow_probe 营地键新语义**::53 改指新场景根句柄;子界面开态时键真值按 T2 叠层规则派生;:119-125 回退段改新场景根 closed 信号或篝火动线;
- **多卡共改文件分界**:screen_flow_probe(入口路径段归卡②、键语义/开合/篝火段归本卡)、ui_click_probe(入口路径归卡②、槽操作路径归卡③、营地段+断点确认段归本卡)——每条探针注分界;
- 新增断言段:七物件逐一可达对应界面;大门两分支;点大门不直接进冒险;**点大门→开局后营地场景屏隐藏(v1.1 补)**;图鉴=占位挂起态;场景根态无文字按钮列表/无四柜台面板(反参照纪律断言);
- 美术约束机检:shot_checker 现役段扩 camp 取样;截屏级 48 色计数是否新建=§9 第 5 条拍板(依赖样张批规格清单,随 Q6 一并裁);
- **变异验证伴生**:某物件命中区漏绑(预期可达性断言红)、大门直连开局绕过确认(预期分支断言红)、图鉴内容激活(预期挂起态断言红)、**presenter 某写口尾漏挂新界面刷新**(预期余额/HUD 不同步红——v1.1 补)、**三钮弹窗取消被接成写档动作**(预期无变更退回红——v1.1 补);注入→最窄闸见红→精确还原→记录。
### T6 产出物落位卡(≈0.5d,末卡)
三份 `reports/` 写齐(实现报告含方向稿选划记录三段表、探针迁移留痕表、变异记录表、目检总清单/代拍板追认单/反哺点清单);`active.md` 照常。
**估时合计 ≈9–12d**(v1.1 上调:presenter 承接面+三钮弹窗+坏槽态联动+探针深员面增量)。**天然切分点=T1 出口**(场景素材归档齐)——美术线与代码线可分批交付(用户批次归属裁);若单批跑超迭代盒,T3 末(四柜台拆解完)为次切分点。
## 7. 验证闸(逐需求点验收清单)
| # | 需求点 | 测什么 | 落点/判定手段 |
|---|---|---|---|
| V1 | 场景图形态(机检半) | camp 截图=场景图形态(非四柜台覆盖层) | shot_probe camp 截图+shot_checker 结构禁词(与 V9 同)——**「七要素可辨(构图)」归 V11 目检**(v1.1 拆半:shot_checker 不判构图) |
| V2 | 七物件可达性 | 点每物件→对应界面可见+营地场景按 T2 叠层规则退避 | ui_click_probe 七段合成点击(新断言;命中区寻址面随 T2) |
| V3 | 大门两分支+开局收闭 | 有断点=弹二选一;无断点=弹是否开始;点大门不直接进冒险;点确认开局后营地场景屏隐藏 | 探针合成点击+状态断言(夹具经调试接口直写/清断点) |
| V4 | 五界面功能+写口链零回归 | 树购买/Fork 切换/锻造三意图/秘宝购买/同调装配/图鉴占位——既有断言全链复跑绿;presenter 各写口尾的 MetaProgression 原语调用序列不变(v1.1 扩) | ui_click_probe 迁移段+smoke `_face_snapshot` 段+forge_workbench_test 迁移复跑 |
| V5 | 生涯只读契约保持 | 生涯页经笔记本可达;页内零跳转零动效契约不破(三契约只约束页子树、不依赖入口位置——v1.1 证实原样成立) | ui_struct_probe career 段迁移复跑 |
| V6 | 图鉴挂起态 | 布告板→图鉴=占位态;内容零激活 | 探针禁词/禁行断言(锚定新视图占位标签) |
| V7 | 篝火动线 | 点篝火→营地隐藏+选档层同收+主菜单可见 | screen_flow_probe 型断言 |
| V8 | 顶栏预留位 | 场景屏顶栏 HUD 位存在(卡⑤联验填值+刷新单口挂接) | 结构断言+跨卡联验 |
| V9 | 反参照纪律 | 营地根态无文字按钮列表、无四柜台面板 | ui_struct_probe 结构禁词断言 |
| V10 | 美术约束 | 文字 WCAG/明度三档带/文字禁压纹理底;素材色板(palette_check/standee 二器或截屏计数若建) | shot_checker 段扩 camp 取样+§9 第 5 条拍板面 |
| V11 | 目检项登记 | 场景观感/七物件辨识(纵深稿构图可辨)/点选反馈/大门两分支/篝火动线入 07 | 件核(登记不阻塞,澄清⑥) |
| V12 | 探针迁移留痕核验 | F8 全量位点逐点有「改前→改后」记录(契约 10 留痕义务) | 件核对表(T6 追认单) |
| V13 | 反哺点清单 | §5 每条有落点 | 件核对表 |
**测试方式两分法**:V1–V10、V12 机检自动化(能力验证经调试接口直改断点/钥石/解锁状态,沿用 DebugOverlay/DS_DEBUG 门控);V11 归用户目检(生命周期末步统一进行,不阻塞迭代)。
**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码/断言/终稿素材 → `--code`)全绿才合并;MC 零跑(零数值零行为——纯呈现+承载迁移)。
## 8. 异常分级
- **L1(自救)**:断言写法、探针路径、命中区微调、命名。
- **L2(记录继续)**:场景屏承载形态选择(§9 域内)、点选反馈参数(Q3 设计稿域内)、四界面承载形态(§9 域内)、方向稿张数在 2–3 内自选、图鉴占位文案称谓订正。
- **L3(停机呈报)**:Q1–Q6 未裁即需开工对应任务段;规格清单(样张批)晚于本批且 Q6 未裁;golden 漂移越出预期面(若涉及既有棋盘/menu 基线);发现五界面任一功能/写口链路被意外触碰(契约 4 破);参照物到手后与纵深稿结构性冲突(呈报,禁批内自行改构图);美术渠道 A/B 执行中撞墙(如 CC0 改色达不到七物件可辨性);提议新建 camp golden(契约 10——须另裁)。
## 9. 代拍板白名单(超清单必呈报)
1. 场景屏承载形态(camp_screen 屏壳改造 vs 新屏壳)——约束:`LAYER_CONTRACT` 更新+探针挂载面迁移留痕。
2. 五界面拆出后的承载形态(独立全屏页 vs 单一内页切换)+**叠层规则派生**(v1.1:独立全屏页=场景根隐藏/单一内页切换=场景根留底;写入 V2 断言;「缩放虚化」禁自选)。
3. 七物件命中区实现(TextureRect 分区 vs 其他)与点选反馈参数(Q3 裁定域内)。
4. 篝火是否需二次确认——默认直回(营地每笔消费即时写盘,无未保存风险——存档序列化.md:121);如判需确认,走 ConfirmDialog 先例。
5. 截屏级 48 色计数工具是否新建及落点(现役=素材级二器,F17;截屏级依赖样张批规格清单,随 Q6 一并裁)。
6. CampOverlay 类退役范围(整类删 vs 留片段)——约束:吸收即死,禁留死代码。
7. 提交切分与 worktree 分支命名。
## 10. 裁点与设计议程(v2.1:本卡在批内,以下为前置解决议程)
> Q4/Q5/Q6/Q8 已裁(裁定见卡头);Q1/Q2 仍待用户。本节约等于批内设计段的工作清单。
### Q1 · 营地场景图的美术渠道(**仍待用户裁——批内第一议程,阻塞 P2 规格分支与方向稿**)
**背景**:澄清⑧2——「美术渠道 A/B 未裁:CC0 改色 vs 插画级新产——原贴图批的渠道问题对营地场景图同样成立,本讨论未裁决」。
**我的推荐:A · CC0 改色**(理由:06:23 已有配色规格〔烛光黄 #F6C667 配木色 #8A5A34〕与渠道合法性记载、零新绘成本、方向稿不受「从零构图」拖累;B 依赖尚未冻结的规格清单且周期长)。用户此前令不代裁——推荐已摊开,等你一句 A 或 B,方向稿(T1 防不满意工序)当天可出。
| 案 | 内容 | 代价 |
|---|---|---|
| A · CC0 改色 | 通用场景素材改色复用(06:23 载明该渠道对营地件合法:烛光黄 #F6C667 配木色 #8A5A34 已有规格) | 快、零新绘成本;上限=改色件构图不完全贴合七物件+纵深稿,可能要容忍「近似构图」 |
| B · 插画级新产 | 按纵深稿全新绘制(像素级) | 七物件与构图完全受控;成本高、周期长,且依赖规格清单输入(F16)——须走「等样张批规格清单」或用户另裁过渡规格 |
连带:渠道裁定影响 T1 估时(A 趋下限、B 趋上限)与切分点位置;「归建卡时或样张批规格语境下裁」(澄清⑧2 原文)。
### Q2 · 参照物(**待补输入**)
澄清②/§⑧1:用户原话「目前还没有一个参照,我可以后续找一下」——参照物找到后补充进本卡(与纵深稿对表,结构性冲突=呈报,禁批内自行改构图)。
### Q3 · 物件点选反馈细节(设计稿产出方式已裁=批内出稿呈裁)
澄清⑧3:「悬停高亮/提示文案/可点区域判定」未谈。三项形态归设计稿阶段——**产出方式已裁(Q8=批内出稿呈裁,方向稿先行纪律照旧)**;设计稿只覆盖根态点选反馈,不覆盖进界面后的叠层规则(叠层=随承载形态裁定派生:独立全屏页=场景根隐藏/单一内页切换=场景根留底;「缩放虚化」是第三形态,涉新演出面+素材,禁批内自选)。
### Q4 · 营地底栏「最近冒险」条带去留(**已裁=甲**)
**裁定(2026-10-18)**:甲——随四柜台拆解一并撤下,逐局历史回看整体归生涯(期二承接);生涯.md P6 同批注销(反哺点)。代拍板留痕(用户令「事项按推荐的来」,本项无推荐案,取默认甲=分工矩阵干净、逐局历史只剩一个权威呈现面;追认单可 veto)。
### Q5 · 大门「有断点」分支的三出口弹窗形态(**已裁=甲**)
**裁定(2026-10-18)**:甲——ConfirmDialog 扩第三钮(继续上一段冒险/开始新冒险/取消,cancelled 恒=无变更退回营地)。推荐案,用户令按推荐执行。连带:卡③ 契约 3 已按三钮化落定(删档确认只用取消/确认);类签名变更随本卡重新立卡时的实现落地,卡③ T0 对齐。
### Q6 · Q1 与规格清单缺口的连带裁(**已裁=甲**)
**裁定(2026-10-18)**:甲——Q1 裁 A 同时订过渡口径:「过渡尺寸档=现役 1280 工程档+烛光黄 #F6C667/木色 #8A5A34 既有规格;终档归样张批冻结后置换(反哺点登记)」。推荐案,用户令按推荐执行。若 Q1 裁 B(插画级新产),过渡口径不成立——B 依赖规格清单,须走乙案「T1 等样张批规格清单产出才开」或用户另行裁定过渡规格。
---
**修订记录**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正 6 处:E1「48 色工具全仓不在役」→截屏级不在役/素材级二器在役(F17/§9-5/V10/T5 连带);E2「camp golden」五处不存在→删并立契约 10 不建;E3 F7 行号(_start_adventure :579-597 等);E4 F14 .gitignore:51+「恒无」表述订正;E5 存档序列化 :122→:121(卡⑤同订);E6 行号微漂(ui_struct_probe :41-49、smoke_all :170-171、camp.md :19-20)。自扩订正:契约 10 标仓库纪律成文。卡内可收 15 项:presenter 承接面(T3/契约 4)、叠层规则派生(T2/§9-2)、ConfirmDialog 消费方编排(T4)、生涯探针驱动改缆+返回钮文案坑(T3/T5)、图鉴占位态(T3)、screen_flow 键新语义(T5)、HUD 刷新单口(T2/T3)、深员改指表(T5)、源码断言段重写(T5)、shot_probe 收闭改缆(T5)、forge_workbench_test 迁移+§5 补 tests 可写面(T5/§5)、断点确认段补列(F8/T5)、contrast 段核签(T5)、素材命名指针(T1)、终稿落盘口径(T1/契约 9/§5)。跨卡对齐:HUD 刷新挂点(§0 接口+卡⑤订正)、ConfirmDialog 类事实双向失效(Q5)、开层互斥/关层收闭(T3+卡③ T2)、探针文件分界(T5)、`_refresh_resume_button` 不复用(T4)。验收补:V1 拆半、V3 扩、V4 扩、V12 留痕行、变异补二条。新增待裁点 Q5 三出口弹窗、Q6 规格缺口连带;估时 8.5–11.5d→9–12d。用户面裁决(①④⑤裁决 5/10)零改动。
@@ -0,0 +1,203 @@
# 需求卡片:选档界面新建批(3 存档位 · 新档/进档/删档)· 营地交互重做卡③
- 版本:**v1.2**(2026-10-18 grilling 轮次裁定回写——Q1 裁定甲(每轮回选档,代拍板留痕)、Q2 裁定甲(坏槽按空槽,推荐案)、Q3 裁定乙(进档暂行接现役 CampOverlay——卡④同日回设计段迫使);契约 3 落 ConfirmDialog 三钮化定局(卡④ Q5 裁定甲);用户面裁决照录澄清文档不变)
- 来源:[需求澄清-营地交互重做-2026-10-18.md](需求澄清-营地交互重做-2026-10-18.md)(唯一事实源:④结构树「选档界面(完全没有 · 新建):3 存档位,新档/进档/删档」、⑤裁决 2/3/4、⑦切批原则③)
- 归属:呈现层/组合根(`game/presentation/`)——营地交互重做五卡之三
- 排期:未编入(2026-10-18 用户令:需求卡片不预占迭代号,批次归属按工作量另裁)
- 开工门:U0(用户 `/iter` 发令)+ 待裁点已裁(Q1/Q2/Q3 均裁定,见 §10)+ grilling 复核门过
## 0. 前置依赖与并行性
- 前置卡①(存档制数据层改造批):三槽承载、新档/进档/删档原语、摘要三项窥视读器——本卡只做界面与接线,不碰数据层实现。
- 后接卡④(营地场景图):进档/新档的落点。**卡④已于 2026-10-18 回设计段(美术设计定稿未过 2026-10-10 设计前置闸——见卡④ 卡头回退声明)**,故 Q3 裁定乙:本卡随①②③工程批先行时,进档/新档**暂行接现役 CampOverlay**(现役在役面,复用合法,非「发明占位」),卡④设计定稿重新立卡后改挂场景图(卡④ T3 承载)。
- 卡②(主菜单三入口化)的「进入存档」钮以本卡为落点,两卡硬耦合(卡② 契约 5:同批或卡③在先)。
- 卡⑤(ESC 浮窗)在本卡语境不响应(卡⑤ 契约 2:ESC 范围=营地语境)——选档语境的键盘行为零裁定、零实现。
## 1. 目标与完成定义
**目标(澄清④照录)**:新建选档界面——3 存档位,新档/进档/删档。裁决 2「多存档制,3 个存档位」;裁决 3「删档:要,且必须二次确认」;裁决 4「档槽摘要=钥石余额、通关次数、冒险次数(总局数)三项,不含未完冒险进度」。
**相对现状,新增了什么**:选档界面整体(澄清④判定「完全没有 · 新建」)——三槽呈现+摘要三项+空/有档操作集+删档二次确认链+进档激活接线。
**完成定义**:
1. 选档界面经「进入存档」钮可达,呈现 3 个存档位;
2. 每槽摘要=钥石余额/通关次数/冒险总局数三项;空槽=合法零值态;坏槽/高版本槽按 Q2 裁定呈现;**摘要面无未完冒险进度**(裁决 4);
3. 空槽可新档(创建=激活=**暂行接现役 CampOverlay**——卡④回设计段,Q3 裁定乙);有档槽可进档(激活该档=暂行接现役 CampOverlay);
4. 删档必经二次确认(裁决 3):第一次点击只出确认窗,确认才删、取消不删;删后该槽回空态;
5. 新屏/新层入 `LAYER_CONTRACT`(层序纪律),冒烟合同断言绿;
6. 批末重闸按改动域选档全绿;三份 `reports/` 产出物写齐(T4)。
## 2. 现状事实(2026-10-18 实查;开工日 T0 复核行号)
| # | 事实 | 出处 |
|---|---|---|
| F1 | 选档界面完全不存在(澄清④判定);现主菜单直接进营地/生涯/冒险,无存档语境选择面 | `需求澄清-营地交互重做-2026-10-18.md` §④ |
| F2 | 通用确认弹窗在役:`ConfirmDialog.open(text, confirm_label, cancel_label)` 双钮外发 `confirmed/cancelled`(**信号零 payload、无调用方标识**),零业务触碰;现役唯一生产消费=组合根静态常驻接线;打开走 `confirm_dialog.open()` **直开,不经 `_open_modal`**(全仓唯一绕栈模态) | `game/presentation/views/confirm_dialog.gd:36-38`/:7-8/:55-60;`main.gd:347-348`/:480 |
| F3 | 全屏页壳先例在役:`UiKit.page_shell`(暖亮底+石纹+暗角+56px 通栏顶条+内容列),生涯页即此形制(直开直关零动效;页壳自带「返回」钮) | `game/presentation/views/career_overlay.gd:18-31`/:62-72 |
| F4 | 钥石徽工厂件在役:`UiKit.keystone_badge`(状态面板/生涯页/营地三处消费先例;迭代 17 卡③ Q10 甲工厂化) | `career_overlay.gd:54`;`camp_overlay_view.gd:82`;`status_panel` 同族 |
| F5 | 层序唯一事实源=`main.gd` `LAYER_CONTRACT`(16 层+float 类),`_apply_layer_contract` 为全仓唯一落位口;冒烟 V1d 源码断言判红散落 `move_child` | `main.gd:34-53`/:430-455;`smoke_all.gd:146-154` |
| F6 | 模态栈单口在役:`_open_modal`/`_close_modal`(登记层开合一律走栈;T3 收口批纪律) | `main.gd:458-462` |
| F7 | 摘要三项读源:现役单档访问器(`keystone_balance`/`adventure_total`/`adventure_cleared`,save_manager.gd:214/258/264)+**按槽窥视读器=卡① T2 交付物(未实现)**;「通关次数」口径=**通关局数 `adventure_cleared`**(同生涯页行,卡① F4 已锁——禁与「各关通关次数 clear_count」混义) | `save_manager.gd:214`/:258/:264;卡① §6 T2 |
| F8 | UI 公共件纪律先例(迭代 17 卡③):「复用现行公共件与色板,零新素材零新色值」——本卡同类批,照此执行 | `roadmap.md` 迭代 17 ③行 |
## 3. 设计契约(红线,违反 = L3 停机呈报)
🔴 **契约 1 · 三存档位且仅三位**:界面呈现 3 槽(裁决 2);禁参数化槽位列表、禁滚动长列表形态。
🔴 **契约 2 · 摘要三项且仅三项**:钥石余额/通关次数(=通关局数 `adventure_cleared`)/冒险总局数(裁决 4)。**禁显示有无未完冒险**(用户原话「不需要显示有无未完成的冒险;只要我提到的那三个就够了」)——断点相关读数(关数/种子/停点)零露出。
🔴 **契约 3 · 删档必经二次确认+ConfirmDialog 消费方机制(v1.2 落定:类将三钮化)**:第一次点击只出确认窗(复用 ConfirmDialog 类),确认才删、取消不删;禁长按删、禁一次点击即删、禁撤销式软删。**该类现为双钮零 payload 单实例,将有三个消费方**(现役新冒险确认〔随卡②退役〕、卡③删档确认、卡④大门两分支确认)——组合根须实现「打开时指定消费方」机制(待确认消费方状态量:open 前设、confirmed/cancelled 后分派;或信号带用途载荷),**禁双常驻静态接线**(现役 main.gd:347 形态禁复制——双线必致删档确认误触发开局)。**三钮化已定局(2026-10-18 卡④ Q5 裁定甲)**:类将扩为「确认/取消/第三钮」形态(第三钮语义随卡④大门裁后落),本卡删档确认只用取消/确认两钮;类签名随卡④重新立卡时的实现落地,本卡 T0 对齐。
🔴 **契约 4 · 空/有档操作集二分**:空槽只有「新档」;有档槽有「进档」+「删档」(澄清④语义)。**禁给空槽配删档**(含置灰残留——置灰=配删档);「想在这个位开新局」的玩家路径=先删档(二次确认)→槽回空→新档,两步即达,卡内记载备查(实现期禁自发加「覆盖」钮——覆盖式新档用户未裁);坏槽/高版本槽的操作集=Q2 裁定,不属本二分。
🔴 **契约 5 · 选档面零存档内功能**:选档界面只做存档语境选择——禁从此面进营地/冒险/生涯(结构树层级:选档 → 进档 → 营地);禁在选档面放任何购买/查看入口。
🔴 **契约 6 · 层序与模态纪律**:新层入 `LAYER_CONTRACT`(改层序只改合同表);开合走模态栈单口。**豁免(v1.1 补)**:ConfirmDialog 沿用现役直开先例(main.gd:480——登记在册:输入锁与树序顶位已由 LAYER_CONTRACT 表达),不强制改走 `_open_modal`。
🔴 **契约 7 · 公共件复用**:UiKit 工厂件+现行色板,零新素材零新色值(迭代 17 卡③ 先例同款);场景图归卡④,本卡不碰美术产出。
🔴 **契约 8 · 进档即激活**:进档/新档动作=卡①激活位设置+落点卡④营地;激活态是否持久化以 Q1 裁定为准(裁乙才需,裁甲无「当前档选择」可持久——v1.1 条件化,原「拔电源不丢当前档选择」父注删除);写盘时机由卡①在 T0 对齐时定义。
## 4. 范围边界
**做**:选档界面视图(三槽卡+摘要+操作钮+空/有档/坏槽态);组合根接线(进入存档→选档;新档/进档→激活+营地;删档→确认→卡①删除原语→刷新);层序登记;断言批;反哺点清单。
**不做**(明示去向):
- 三槽承载/删档原语/摘要读器实现 → 卡①;
- 「进入存档」钮与主菜单砍钮 → 卡②;
- 营地场景图(进档落点) → 卡④;
- 档位自定义命名/备注/排序 → 用户未裁,批内禁加(澄清④只给三槽+三项摘要);
- 存档导入/导出/云同步 → 不在澄清范围,禁自扩。
## 5. 关联文档同步面
> **v1.3 口径**:本批禁写 `design/` 整目录与根规则文件,唯一可写目录 = `reports/`(`active.md` 唯一例外);下表一律执行为列进反哺点清单。08 写入权限统一口径:**状态列可改;注记改写列反哺点随清单呈报;增删行须用户裁**。
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| `design/gdd/06-待办清单.md` | 本卡登记条;存档序列化 P2 多档条(卡①反哺)与本条的交叉注记 | 反哺点 · 列清单 |
| `design/gdd/systems/跨局循环/生涯.md` | :11-23 信息架构结构树——新增「进入存档→选档界面」一级层级(生涯入口随卡④改挂笔记本) | 反哺点 · 结构树补层 |
| `design/gdd/08-Alpha版本标准.md` | 「三 · 界面」表新增「选档界面」行(在役)——增行须用户裁(08 头注纪律) | 反哺点 · 增行请求随清单呈报 |
| `roadmap.md` | 迭代行编入/状态刷新 | 反哺点 · 列清单 |
| `active.md` | 状态快照与本批条目 | **本批更新(唯一例外)** |
| `game/presentation/views/*`(新建选档视图)、`main.gd`、`game/smoke/*` | 实现与断言本体 | 实施本体(可写) |
## 6. 任务卡
> 估时按 Claude 工作日口径;每卡出口自跑轻闸;开工日 T0 复核全部行号。
### T0 事实坐实与接口对齐(≈0.5–1d)
- 复核 §2 行号;与卡①对齐窥视读器签名/命名/返回结构/空槽与坏槽表示法(卡① 契约 9 三态——对齐结论写成文附 §2,消 L3 落空项);
- 与卡②对齐「进入存档」钮句柄;与卡④对齐进档落点开层函数+**ConfirmDialog 消费方编排机制**(契约 3——卡④同款契约互指);
- 清点既有 confirm_dialog 断言面(ui_struct_probe.gd:71 结构采样、smoke_all.gd:226 最顶层候选、ui_click_probe:508-527、ui_tune_probe.gd:52 树序断言)——机制或实例数若变,这些点受影响;
- Q1 重启初始态与 Q2 坏档第三态裁定执行。
### T1 选档界面视图(≈1.5–2d)
- 全屏页壳(`UiKit.page_shell` 先例):标题+三槽卡横列+**页壳返回钮(生涯先例)→ `_close_modal`+开始层恢复**(v1.1 补——原只写「标题+三槽卡」漏了可退路径);
- 槽卡内容:槽位编号+摘要三项(钥石余额/通关局数/冒险总局数)+操作钮;空槽=「空存档位·新档」态;有档槽=摘要+「进档」+「删档」;坏槽/高版本槽按 Q2 裁定态;
- 钥石徽用工厂件;零新素材零新色值(契约 7);
- 删除钮形态:危险钮先例;**空槽禁渲染删档钮、禁置灰残留**(v1.1 订正原「禁用态纪律」——与契约 4 字面冲突);
- Q1 裁乙时补「预选」高亮态(选中槽卡视觉态——v1.1 补,原 T1 未含)。
### T2 组合根接线(≈1d)
- 「进入存档」→开选档界面(模态栈单口;与开始层互斥仿设置面先例);
- 新档:卡①空槽创建→激活→**暂行接现役 CampOverlay 开层**(Q3 裁定乙;卡④重新立卡后改挂场景图);
- 进档:卡①激活→**暂行接现役 CampOverlay 开层**(同上);
- 删档:ConfirmDialog 消费方编排(契约 3:open 前设消费方=删档、confirmed 后删、cancelled 后只关窗)→卡①删除原语→选档界面就地刷新(该槽回空态);
- 开层时摘要三读器按槽窥视(不激活不写盘);
- **动线序(v1.1 补)**:进档/新档时「先落点开层/开始层保持隐藏,再关选档」——禁先关后开(`_close_modal` 会恢复被遮挡的开始层=回闪一帧);营地开层后选档层被模态栈遮挡隐藏、不关闭(卡④ T3 同口径)。
### T3 断言批(≈1–1.5d)
- 探针:三槽呈现+摘要三项读数(**夹具按槽直写**——经卡①槽位 API/隔离面实现同会话三槽异值注入,v1.1 补任务落点);空/有档操作集断言(空槽零删档钮/有档槽零新档钮);坏槽按 Q2 态断言;删档确认链(第一次点击只开窗、取消后文件仍在、确认后槽回空);
- 冒烟:层序登记(`LAYER_CONTRACT` 合同断言);选档面零存档内功能入口(结构禁词断言);选档面返回钮开合(screen_flow_probe 型);
- **变异验证伴生**:删档钮直连删除(预期确认链断言红)、摘要读激活位(预期跨槽摘要红)、空槽渲染删档钮(预期操作集断言红)、**ConfirmDialog 双常驻接线**(注入后预期「删档确认误触发开局」断言红——新契约伴生,v1.1 补);注入→最窄闸见红→精确还原→记录。
### T4 产出物落位卡(≈0.5d,末卡)
三份 `reports/` 写齐;`active.md` 照常。
**估时合计 ≈4.5–5.5d**(v1.1 上调:ConfirmDialog 机制+坏槽态+返回路径+夹具注入增量)。切分预案:T1/T2 后可切(视图先落、接线后落)——切分价值低,建议与卡②同批单跑。
## 7. 验证闸(逐需求点验收清单)
| # | 需求点 | 测什么 | 落点/判定手段 |
|---|---|---|---|
| V1 | 三槽呈现 | 3 槽卡在位且编号稳定;无滚动长列表 | ui_struct_probe 结构断言 |
| V2 | 摘要三项 | 钥石余额/通关局数/冒险总局数逐槽读数正确(夹具按槽直写三槽不同值);空槽零值;坏槽按 Q2 态 | ui_probe 型探针段(夹具经卡①槽位 API 直写,能力验证口径) |
| V3 | 摘要禁项 | 摘要区无断点/未完冒险相关读数(关数/种子/「继续」字样零命中) | 探针禁词断言 |
| V4 | 操作集二分 | 空槽零删档钮(含置灰);有档槽零新档钮 | 探针结构断言 |
| V5 | 空槽新档 | 空槽点新档→创建+激活+落点营地 | ui_click_probe 合成点击路径 |
| V6 | 有档槽进档 | 点进档→激活该槽(摘要=该槽值)→落点营地 | 同上 |
| V7 | 删档二次确认 | 一击只开确认窗;取消=文件仍在;确认=删+槽回空 | ui_click_probe 双路径段 |
| V8 | Q1 重启初始态 | 甲=重启回主菜单不预选;乙=预选/直入均可机检 | 探针重启链段(按 Q1 裁定案) |
| V9 | 返回路径 | 页壳返回钮→选档隐藏+开始层恢复;选档语境 ESC 不响应 | screen_flow_probe 型断言 |
| V10 | 层序纪律 | 新层入 LAYER_CONTRACT;登记序=树序=z 序 | 冒烟 V1d 合同断言 |
| V11 | 反哺点清单 | §5 每条有落点 | 件核对表 |
**测试方式两分法**:V1–V10 机检自动化(能力验证经夹具直写槽位/钥石/计数状态——经卡①槽位 API 或隔离存档实例,不走正常资源积累流程);**用户目检项=三槽观感与删档确认文案**——登记 07(生命周期末步统一目检,不阻塞迭代,澄清⑥口径)。
**闸口径**:轻闸每卡出口自跑;批末重闸按改动域选档(本批碰 `game/` 代码与断言面 → `--code`)全绿才合并;MC 零跑。
## 8. 异常分级
- **L1(自救)**:断言写法、槽卡布局微调、命名。
- **L2(记录继续)**:槽卡横列/纵列布局取舍(契约 1 内)、确认文案措辞、空态呈现细节。
- **L3(停机呈报)**:进档落点在卡④重新立卡前被要求改挂场景图(Q3 裁定乙=暂行现役 CampOverlay,提前改挂=越批);卡① 交付签名与 T0 对齐结论不符(v1.1 订正原「与本节假设不符」——本节无签名假设);删档确认链被要求简化(触裁决 3);ConfirmDialog 消费方机制与卡④无法对齐。
## 9. 代拍板白名单(超清单必呈报)
1. 槽卡布局(横列三卡 vs 纵列三行)与尺寸档取值(UiKit 现行件域内)。
2. 槽位编号呈现(「存档位 1/2/3」vs 其他措辞)。
3. 新档/进档/删档三钮的文案与动词化命名(对齐现役动词钮先例)。
4. 选档界面与开始层的互斥方式(仿设置面先例内的参数选择)。
5. 提交切分与 worktree 分支命名。
## 10. 待裁点
### Q1 · 重启后选档界面的初始态(必裁,未裁不开工)
**背景**:澄清④结构树只到「选档界面 → 营地场景图」,未覆盖退出游戏再启动后的行为。两案并列,**无推荐**(用户令:不代裁):
| 案 | 内容 | 代价 |
|---|---|---|
| 甲 | 每次启动都回主菜单→进入存档→选档界面,不自动进档、不预选 | 每轮开局多两次点击;语义最简(无「上次档」隐含状态) |
| 乙 | 记忆上次激活槽:重启后选档界面预选该槽(或一键直入) | 多一个激活位持久化状态(卡①承载);「默认进哪档」成为隐含决策;**「一键直入」变体绕选档层,与澄清④「选档=必经层」存在张力,若裁须一并确认层级关系**(v1.1 补注);「预选」需槽卡高亮态(T1 已列);持久化指针指向已删槽的重启语义须注明 |
连带:卡① §9 第 2 条激活位持久化仅裁乙才需;卡① T1 启动行为条件化同源。裁决方式:随卡片评审定案;裁定落 T0 执行+实现报告留痕。
**裁定(2026-10-18)**:**甲**——每次启动回主菜单→进入存档→选档界面,不自动进档、不预选。代拍板留痕(用户令「事项按推荐的来」,本项无推荐案,取默认甲=语义最简、无「上次档」隐含状态;追认单可 veto)。连带:卡① §9 第 2 条激活位持久化**作废**(无「当前档选择」需持久);T1 预选高亮态条目不做。
### Q2 · 坏档/高版本槽在选档面的呈现与操作集(必裁,未裁不开 T1 坏槽态)
**背景**:盘上任一槽文件可损坏或高版本;卡①窥视读器对不可读槽返回显式损坏标记(契约 9,peek 禁触发 `.corrupt.bak` 改名)——坏槽既非空亦非正常有档,契约 4 二分无第三态。两案并列:
| 案 | 内容 | 代价 |
|---|---|---|
| 甲(推荐) | 窥视对坏档/高版本槽返回零值,UI 按空槽呈现(新档/进档均经卡①兜底链接管——进档时走正式 load 触发兜底/拒读) | 坏档在选档面「看不见」,用户可能不知哪槽坏 |
| 乙 | 显式第三态(坏档标记+仅允许删档/进档) | 多一套 UI 态与断言 |
裁决方式:随卡片评审定案;裁定落 T0+T1 坏槽态实现。
**裁定(2026-10-18)**:**甲**——窥视对坏档/高版本槽返回零值,UI 按空槽呈现(推荐案,用户令按推荐执行);新档/进档均经卡①兜底链接管(进档时走正式 load 触发兜底/拒读)。T1 坏槽态=空槽态,无独立第三态 UI。
### Q3 · 卡③先行交付时,进档/新档的过渡落点(必裁,未裁不定排期)
**背景**:v1.0「建议本卡与卡②同批、卡④随后」与完成定义 3(进档落点=卡④)+§8 L3(落点未到位停线呈报)三句互斥——按 L3,「②③先合批、④随后」这条建议路径不可合并。三案并列:
| 案 | 内容 | 代价 |
|---|---|---|
| 甲(推荐) | 卡③与卡④同批(完成定义原样成立) | 两卡合并工作量大,单批周期长 |
| 乙 | 卡③先行,进档/新档暂行接**现役 CampOverlay**(卡④到位改挂——复用现役面,非「发明占位」) | 临时代码+卡④改挂时的二次验证面;CampOverlay 在卡④前仍是在役面,复用合法 |
| 丙 | 进档/新档暂行置灰,完成定义 3 拆两阶段 | 交付面砍残,选档界面半成品 |
裁决方式:随卡片评审定案;裁定落 §0/完成定义/§8 三处同步改写。
**裁定(2026-10-18)**:**乙**——本卡随①②③工程批先行,进档/新档暂行接现役 CampOverlay,卡④设计定稿重新立卡后改挂。**迫使原因**:卡④于同日回设计段(美术设计定稿未过设计前置闸),甲案(③④同批)失去对象;丙案(置灰)砍残交付面不取。暂行接线与后续改挂的二次验证面在 T2 明列、实现报告「已知中间态」节登记。
---
**修订记录**:v1.0→v1.1(2026-10-18 grilling 子 Agent 对抗审查回写)——事实订正:F6 行号 :458-461→:458-462;F2 补 ConfirmDialog 形态实证(零 payload/直开绕栈/静态常驻接线);F7 窥视读器标卡①未实现交付物+「通关次数」口径锁定;自扩订正:契约 8「拔电源不丢」父注按 Q1 条件化、Q1 乙案「一键直入」补层级张力注。卡内可收:契约 3 立 ConfirmDialog 消费方机制(禁双常驻接线)、契约 6 补直开豁免、契约 4 补两步路径记载、T1 补返回钮/禁置灰残留/预选高亮态、T2 补动线序与开层互斥、T3 补夹具注入与 ConfirmDialog 变异注入、T0 补既有断言面清点、V 表补三行、§8 L3 落空项订正。跨卡对齐:ConfirmDialog 机制卡③立卡④守、营地开层互斥与卡④ T3 同口径、断点确认探针段归卡④ T5 接收(卡② T2 明列移交)。新增待裁点 Q2 坏档第三态、Q3 先行落点过渡态。用户面裁决(裁决 2/3/4)零改动。
@@ -0,0 +1,94 @@
# 营地交互重做 · 需求澄清结论
> 2026-10-17~18 需求讨论澄清会话产出。讨论性质:**只澄清「我要什么」,不出设计稿、不钉像素规格**。
> 本文供主项目会话建需求卡片使用;讨论会话不直接写卡。
> 缘起:原议题「UI 贴图重构批」讨论中发现病根在交互层——用户裁「贴图重构批搁置,先重做交互方式」,故本文替代原《贴图重构批·需求澄清结论》。
> 版本:**v1.0**(2026-10-18 澄清会话定稿;2026-10-18 文档批入库时补标版本行,供 06 条目「文档设计已闭合」凭据引用)
---
## ① 目标体验(用户原话 + 一句提炼)
**用户原话(2026-10-17,照录不美化)**:
> 「我是希望有一个营地地图的游戏画面;或者是一张营地的图片,跟 UI 的交互是点击图片中的某一处地方,然后再进入界面。不是完全普通的那种 UI 设计,不是各种框框的;比如一张图片里面有篝火,有锻造的工坊,还有一些床铺之类的东西。我点击某些具体的东西之后,就可以进入对应的操作界面。」
**称呼订正(用户原话)**:「营地地图,这个称呼不太对,它就是一个营地的画面;并不是一张地图。」
**性质注记(用户原话)**:「可以备注好原话,写到文档里面去,但它不算是一个最终的设计。」方向确认:「没错的,就是要把它改成一个交互式的场景图。」
**一句提炼**:营地首页从「文字按钮菜单 + 列表式覆盖层」改为「一张可点击的营地场景图」——点场景中的具体物件进入对应功能界面。
## ② 参照与反参照
- **参照物**:目前没有。用户原话「目前还没有一个参照,我可以后续找一下」——**遗留待补**。
- **反参照(用户明示拒绝的方向)**:「完全普通的那种 UI 设计」「各种框框」——即文字按钮列表 + 面板覆盖层的传统菜单形态。现状主菜单/营地覆盖层正是此形态,被判「交互流程完全错误」(用户原话)。
## ③ 非目标清单
1. **不做贴图重构批**(本讨论前已搁置):柜台场景贴图、钥石顶栏图标、永久强化条目图标的达标化置换,等交互重做定形后再议。
2. **篝火不绑休息/恢复**:用户原话「我们是在一段冒险前,不存在休息恢复之类的概念」。
3. **档槽不显示「有无未完冒险」**:摘要只要三项(见⑤)。
4. **美术定档不翻案**:明亮轻快像素风、48 色板、HSV 300°–345° 禁入带、语义色纪律、WCAG ≥4.5:1——全局硬约束继续有效,不在本讨论范围。
5. **像素级规格不在本讨论硬定**:尺寸档/色板/明度档归「战斗一屏样张批」冻结的规格清单(排期关系已定)。
6. **冒险进行中不开营地**:营地是存档语境(局外)枢纽,现状口径延续。
## ④ 目标结构(节点树 + 现状差距三分类)
```
主菜单(需改动:6 钮 → 3 钮)
├─ 进入存档(完全没有 · 新建)
│ └─ 选档界面(完全没有 · 新建):3 存档位,新档/进档/删档
│ └─ 营地场景图 · 交互式(完全没有 · 新建;现四柜台覆盖层拆解)
│ ├─ 营地大门 → 冒险〔选路屏/战斗屏已实现,不动;断点弹窗保留移位〕
│ ├─ 锻炉·铁砧 → 锻造工坊(界面已实现 · 入口改挂)
│ ├─ 宝箱 → 秘宝匣(界面已实现 · 入口改挂)
│ ├─ 床铺旁笔记本 → 生涯记录(界面已实现 · 入口改挂)
│ ├─ 木桩 → 树淬炼天赋树(界面已实现 · 入口改挂)
│ ├─ 布告板/悬赏板 → 奖励格图鉴(界面已实现 · 入口改挂)
│ └─ 篝火 → 离开营地/回主菜单(新建小动线)
├─ 设置(已实现 · 不动)
└─ 退出游戏(已实现 · 不动)
```
**场景纵深稿(用户原话)**:「远景是天空;中景是一个围栏,还有营地大门;近景中间是一个篝火;左边是锻炉铁砧;右边是我们的床铺,宝箱等。」
**现状文档依据核查**:入口拓扑有 spec(`design/gdd/ux/camp.md`、`跨局循环/生涯.md`),但形态无设计——`生涯.md` 明示「不画布局稿」,现四柜台并排为迭代 21 T6 程序占位(代码注释原文「视觉终稿归 HUD 营地视觉批」)。**「从哪进」有文档,「进去后什么形态」从未被设计过。**
**病根诊断(用户原话)**:「主菜单界面应该只有 3 个入口:①进入一个存档 ②游戏的设置 ③退出游戏。开始冒险,和营地相关的都应该是一个存档内的东西;现在似乎没有存档这个概念;我感觉是之前做垂直切片的时候,进行扩充时没有做好这方面的考虑。」
事实补钉:存档在数据层存在(`save_manager.gd`,已到存档 v7),但是**隐式单档**——交互层无存档概念、无档槽、无选档界面。
## ⑤ 关键交互裁决(全部为用户拍板,照录)
| # | 裁决 | 用户原话/依据 |
|---|---|---|
| 1 | 主菜单只留 3 入口:进入存档 / 设置 / 退出游戏 | 见④病根诊断引文 |
| 2 | 多存档制,**3 个存档位** | 「多存档可以让它有三个存档位」 |
| 3 | 删档:**要**,且必须**二次确认** | 「需要有删档,也确实是需要有二次确认的」 |
| 4 | 档槽摘要=**钥石余额、通关次数、冒险次数(总局数)**三项,不含未完冒险进度 | 「摘要信息直接是钥匙余额和通关次数,冒险次数……」「不需要显示有无未完成的冒险;只要我提到的那三个就够了」 |
| 5 | 大门点击:**有未完冒险** → 弹「继续上一段冒险 / 开始新冒险」;**无未完冒险** → 弹「是否开始新冒险:是/否」。点大门永远先出确认,不直接进冒险 | 「断点续玩也是开始冒险的两个分支之一……它算是开始冒险的一个子节点」+ 两分支原文 |
| 6 | 天赋树 → **木桩** | 「天赋树是自身的加强,可以搞一个木桩这样的东西」 |
| 7 | 图鉴 → **布告板/悬赏板** | 「布告板/悬赏板;就这个吧,挺不错的」 |
| 8 | 篝火 → **离开营地/回主菜单** | 用户明示选② |
| 9 | **ESC 键**唤起浮窗:返回主菜单 / 设置 / 退出游戏 三项 | 「ESC键可以唤起一个浮窗,里面有返回主菜单,设置,退出游戏三项」 |
| 10 | 钥石余额:场景**顶部小 HUD 栏** | 「先按顶部小HUD栏设计」 |
## ⑥ 验收方式(用户原话 + 提炼)
> 「迭代过程中,只要有截图对比;后续我目检是统一来进行的;我目检是作为我们整个开发生命周期中最后一个步骤……这是不会阻塞迭代过程的。」
- **迭代内验收=截图对比**(不阻塞合入);
- **用户实机目检=整个开发生命周期最后一步,统一进行,不阻塞迭代**;目检后用户开启新一轮需求循环。
## ⑦ 切批原则(用户原话)
> 「可以拆成多个需求卡片,但不一定需要放到多个迭代批次中;迭代批次是根据工作量大小来的,而需求卡片是根据它的工作内容来进行划分的。」
**工作内容维度的天然分卡线索**(供建卡参考,不预占):①存档制数据层改造(隐式单档 → 3 档槽,save_manager + 存档格式);②主菜单三入口化;③选档界面;④营地场景图(含美术产出 + 物件点选 + 入口改挂);⑤ESC 浮窗 + 顶部 HUD 栏。
## ⑧ 遗留与待裁
1. **参照物**:用户后续找(②),找到后补充进卡。
2. **美术渠道 A/B 未裁**:CC0 改色 vs 插画级新产——原贴图批的渠道问题对营地场景图同样成立,本讨论未裁决,归建卡时或样张批规格语境下裁。
3. **物件点选反馈细节**(悬停高亮/提示文案/可点区域判定)未谈,归设计稿阶段。
4. **现营地覆盖层四柜台的拆解方式**(各界面保留、入口改挂)是方向级结论,具体拆解归实现卡。
5. **贴图重构批**:搁置状态,未废——待交互重做完形后重新评估立项。