写卡(营地交互修复批·一张卡三需求点): reports/需求卡片-营地交互修复批-2026-11-05.md 成文——件1 开局被开始层盖住(契约1 限开局/续玩两路径的隐藏点收一处+摘 main.gd:194 冗余句)、件2 弹窗钮序镜像(推进→次→维持,四处共用件同一序,成员与连接零动)、件3 顶栏加可见栏体(色值做成 UiKit 带 α 派生常量 CAMP_HUD_BAND=Color(CAMP_HEADER_BAND,0.80),矩形由顶栏件自建); 对照表 R1-R8 七格齐+判据出处行锚+能力行(两枚新增能力同批入 game/tests/README.md:162-163); 卡片头部申报 验收档=中、设计事实源三处定稿(camp.md v2.8/HUD框架 §提示与弹层/art-bible v3.43)+色值落点定稿与两项 Godot 4.7.2 实测(const 派生 const 编译通过 to_html=true 得 6e4526cc;色道单精度使 a==0.80 为 false → 断言禁浮点分量直等,改 to_html 比对); 三轮内改的四处架构违规=①R3 撤"升成员供测试直取"(抵触 architecture.md:168 视图单元接口/:323 禁直引实现内部,改公开子节点序)②顶栏 α 从视图内挪进公共件(依 ui_kit.gd:2 全站取色唯一出口)③契约4 措辞纠正(禁新增语义色而非禁派生常量,依 HP_BAR_TRACK:200 收口先例)④同步面补 architecture.md:175 CampHudBand 行; 两轮独立复核全落=轮次1(22 条:19 采信落卡/2 转用户裁 Q1 Q2/2 条经写卡段回读推翻)+轮次2(5 条:R3 双钮断言必红硬伤改 child(2)+子节点数非空前置、R5 补开营地前置(camp_scene_view.gd:51 初始隐)、T3.0 补入树后读数时机、行号八处与尺寸链确认、Q1 裁决解释面按自判落并向用户报备); 同批登记两条工程改动待办(认锚式不含中文段 pipeline_gate.py:68;层序落位单口扫描面不含子目录 source_guard_test.gd:85-99,均工具代码/待执行); 待办清单本条状态 文档设计已闭合+已写卡; 本步凭据: 流水线闸直跑 PASS(待办条目 27/卡片口径 2 张全过)+tools/run_all_gates.sh --docs exit=0「验收通过,闸况与基线一致无新增红」(回执 domain=docs 基线 00d7bbfb); 过程附记: 用语闸 doc_term 曾把待办条目里文件名 ui_registry.gd 的子串 registry 判为退役词疑似现行(基线绿→现红),已改以函数名 apply_layer_contract() 作锚避开误报、可检索性不丢,该误报属闸件面另议
This commit is contained in:
1 parent
00d7bbfba1
commit
4a650d0ed3
4 files changed
+474
-5
No files matched your search
@@ -159,6 +159,8 @@ tests/
|
||||
| 营地大门两分支确认与断点续玩接线 | 营地交互流 | 大门命中区 → 合成鼠标事件经 `push_input` 真点(`ProbeUiUtil.push_click_at`)→ ConfirmDialog 真钮(三出口)→ `main._on_confirm_accepted()`(新冒险确认)/`main._resume_from_menu()`(断点续玩) | `ui_click_probe.gd:_ready`(大门两分支段/断点确认段——真输入 push_click 驱动,2026-11-05 真输入化);`presentation_encapsulation_sweep_test.gd:_init`(迭代52卡③组合根交接面结构性主证——pres封装 V1–V4 四组私取零命中+新公开面正锚,2026-11-05 补链锚) |
|
||||
| 四柜台拆解后五界面入口改挂与写口零回归 | 营地五界面 | 五界面意图信号 → `CampShopPresenter` → `MetaProgression.tree_buy()` 写口 | `forge_workbench_test.gd:_run`(承载类同迁断言十二项);`ui_click_probe.gd:_ready`(写口链段) |
|
||||
| 营地篝火回主菜单与笔记本改挂动线 | 营地交互流 | 笔记本命中区 → `CareerOverlay.open()`;篝火命中区 → ConfirmDialog 二次确认 → 主菜单 | `ui_struct_probe.gd:_ready`(career 段);`screen_flow_probe.gd:_ready`(篝火/开合段) |
|
||||
| 确认弹窗按钮位次与语义同钉 | HUD框架 | `ConfirmDialog.open()`/`ConfirmDialog.open_three()` 开态读按钮行子节点序(定值=推进钮在左/次推进居中/维持钮在右,四处共用件同一序);探针在弹窗开态按左位钮中心坐标 `ProbeUiUtil.push_click_at` 真点 | `confirm_dialog_test.gd:_test_two_button_row_order`;`confirm_dialog_test.gd:_test_three_button_row_order`;`ui_click_probe.gd:_ready`(大门无断点段左位坐标真点) |
|
||||
| 营地顶栏栏体定值与落座 | 营地场景视图 | 真实工程 boot 后经装配链 `MainUiBuild`→`CampSceneView.set_hud_band()` 读 `ui.modals.camp.scene.hud_band`(定值=`CAMP_HEADER_BAND`×α0.80、48px 全宽浮层、徽章右位顶格);单元经 `camp_scene_layout_table.gd` 的 `hud_band_h` 出口读背景贴图落位带像素算对比 ≥3:1 | `system_test.gd:_smoke_camp_hud_band`;`camp_scene_layout_test.gd:_test_hud_band_contrast_over_bg` |
|
||||
| 营地图鉴占位挂起态与反参照结构纪律 | 营地场景视图 | 布告板命中区 → `CampSceneView._gui_input()`(object_pressed 信号) → 图鉴占位视图;营地根态场景树审计 | `ui_struct_probe.gd:_ready`(占位禁词/禁行段);`ui_struct_probe.gd:_ready`(结构禁词段) |
|
||||
| 营地刷新单口与场景根 HUD 同步 | 营地刷新总线 | 写口尾 → `CampRefreshBus.refresh()` → 现开界面刷新+场景根 HUD 刷新 | `ui_struct_probe.gd:_ready`(顶栏位段);`ui_click_probe.gd:_ready`(写口尾刷新段) |
|
||||
| Esc 浮窗唤起与三出口动线 | 营地 Esc 流 | 营地场景根态合成 Esc 键事件→ `main_esc_flow.on_esc_input()` → `ui.flow.open/close`;浮窗三钮 `pressed` → 三出口 | `screen_flow_probe.gd:_ready`(Esc 唤起/子界面开态不唤起/再按关窗/非营地不唤起段);`screen_flow_probe.gd:_ready`(返回动线/设置双路径段) |
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
# 复核报告 · 营地交互修复批需求卡片(2026-11-05)
|
||||
|
||||
> 被复核对象:`reports/需求卡片-营地交互修复批-2026-11-05.md`(v1.0 成文态)
|
||||
> 复核者:未参与撰写的只读子代理(独立会话,禁写文件、禁跑闸、禁运行游戏测试),任务=对卡内每一处行号、契约、判据逐条开火
|
||||
> 复核轮次:1(第 16 节逐条登记去向与处置;本报告留发现原文与依据索引)
|
||||
> 复核对象工作副本:`D:/code/g-plan2-camp-interact`(分支 camp-interact-20261105)
|
||||
|
||||
## 复核者总判原文(摘录)
|
||||
|
||||
> 按现状不能进实现段。缺四块闭合:①契约1 收窄措辞(否则实现首帧即自触 L3);②R3/R4 的按钮行句柄定义+§12 受控例外改判(否则判据落不了码);③T3.1 的 `UiAssembler` 引用形态+T3.2 内缩实现与 R5 的 x 向判据(否则 12px 无机制、断言可假绿);④R6 呈色输入来源改绑视图实件(否则撞 §8.7 第 5 条判红)。另有 6 处纯事实订正可自判直改。T 卡估时合计 0.25+0.5+0.75+0.5=2.0 与「≈1.75–2.0」自洽;四处消费方与 HUD框架:90 语义映射核过无冲突。
|
||||
|
||||
## 发现与依据索引(22 条)
|
||||
|
||||
| # | 卡内位置 | 发现 | 复核者给的依据 | 去向 | 写卡段处置 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | §4 契约1 | 「隐藏点只许两处」按字面过宽,仓库另有 5 处以上 | `camp_shop_presenter.gd:43`、`main_overlay_flow.gd:8/41/95`、`main_debug_flow.gd:88` | 退回上游(复核者判) | 改自判:契约1 收窄为「限开局/续玩路径」,12 处显隐点逐条列名。定名不采纳——卡内措辞问题,非规范冲突 |
|
||||
| 2 | §3.1 | `_start_adventure()` 行号段错(写 311) | `main.gd:308`=`return`,`:311`=下一函数声明 | 自判 | 改 292-308 |
|
||||
| 3 | §9 T1.1 | 失败分支的开始层终态变化未申报 | `main.gd:306-307` `fatal_screen` | 补写 | §3.1 补终态申报 |
|
||||
| 4 | §8 R2/§9 T1.4 | 段内 await 1 帧不足以让选路停点成形 | `ui_click_probe.gd:703`;先例 `screen_flow_probe.gd:186-192` 用 `_frames(3)` | 补写 | T1.4 补帧口径+实测最小帧数入实现报告 |
|
||||
| 5 | §8 R3 | `btn_row` 是局部变量,判据无法写 | `confirm_dialog.gd:27`(成员仅 `:13-16`) | 补写(阻塞) | T2.1 升成员 `_btn_row`;R3 按 test-conventions §8.2 受控例外申报 |
|
||||
| 6 | §12 | 自称不直取私有,实际 R3/R4 直取 | `confirm_dialog.gd` 成员表;`main._confirm_consumer` | 自判 | 改为受控例外口径,不再谎称 |
|
||||
| 7 | §9 T2.3 | `:702` 真点已消耗 `gate_new`,R4 无左位可点 | 段结构 `ui_click_probe.gd:684-705`;`main.gd:215` 置空 | 补写 | T2.3 补前置重开步与坐标取法 |
|
||||
| 8 | §10 L1 | `:679` 引用定性错;直发面在 `:697`;归属应系 §8.3 而非契约7 | 复核者回读 | 自判 | **部分不采信**:`:679` 经写卡段回读确为段头注「大门两分支断言段」,断点注入起 `:706`;直发行号实为 `:696`(复核者写 697 亦偏);§8.3 归属采纳。附带自查纠正 R8 的次钮断言行 `:696`→`:694` |
|
||||
| 9 | §9 T3.1/§12 | `UiAssembler` 无 `class_name`,`views/` 零引用先例,卡内调用写法不成立 | `ui_assembler.gd:1-5`(`extends RefCounted`+头注「供组合根接线」)、引用方 `main_ui_build.gd:7`/`scenes/adventure_screen.gd:21`/`scenes/menu_screen.gd:15`、`views/` 内联先例 `battle_end_overlay.gd:261/289/314` | 待裁 | 第 15 节 Q1 两案并列;T3.1 改「待 Q1 后落」 |
|
||||
| 10 | §3.3/§8 R5 | 徽章自高 48 系推导,`panel_flat` `border_w=1` 若计入则 50 | `ui_kit.gd:640`+`panel_flat` `ui_kit.gd:455-464`(复核者自标「这是推测,未跑批」) | 补写 | T3.0 新增前置读数;≠48 走 L3 第 5 条 |
|
||||
| 11 | §9 T3.2/§11.3 | 12px 内缩无可达机制(宽度随位数变);R5 缺 x 向判据=改了仍绿 | `camp_hud_band.gd:16`(现值写死 x)+`:22`(文案「钥石 %d」) | 待裁+补写 | Q2 三案并列;R5 已补 `end.x == 栏 end.x − 12` |
|
||||
| 12 | §8 R6 | 呈色若取自实现表达式=oracle 镜像 | test-conventions §8.7 第 5 条 | 自判 | R6 改规格侧写死值,禁喂视图件 color |
|
||||
| 13 | §11.4 | 「4×8 步长沿该件口径」错,该件全像素扫描 | `terrain_tile_sets_test.gd:105-107` | 自判 | 白名单第 4 条改全扫描并声明旧口径作废 |
|
||||
| 14 | 数学校核 | 全扫与抽样均色皆 RGB(223,235,232)(卡 `#DEEAE7` 差 ≤1/255);叠后 4.29:1、徽章对天空 1.30:1;落位带 0–48 只含背景成立 | `camp_scene_layout.tres:9`(背景 `Rect2(0,0,1280,800)`)、围墙 y=261、大门 y=250;`project.godot:30` 视口宽 1280 | 自判(确认+读数微差) | 差值落 L2 容差,阈值不放宽;卡内读数保留 |
|
||||
| 15 | §1/§5 | 「七行」与对照表实数 R1–R8 不符 | 卡内自相 | 自判 | 改八行 |
|
||||
| 16 | §5 | 引「第 1 节行为表」——卡内无该表(悬空引用) | 卡内自相 | 自判 | 改自足表述 |
|
||||
| 17 | §7 | 结构图验收行缺 R7/R8 | 卡内自相 | 补写 | 两行补齐 |
|
||||
| 18 | §13/§10 L3 第4条 | gdstyle 不扫 tests,新件三查与互斥条对新件无触发路径;套件入口是 `_initialize()` 非 `_init` | `tools/gdstyle_gate.py:45`(SCAN_DIRS 三目录)+头注 `:8`(probe/sim/tests 排除);`camp_scene_layout_test.gd:12` | 自判 | §13 改「对本件不适用」;L3 第 4 条限定 presentation 面;T2.2 入口名与先例行号订正 |
|
||||
| 19 | §13 存量一查 | 核过无误:基线 `:11`=32、`:12`=23;`main.gd` 公开方法 31+1 静态=32 持平 | `tools/gdstyle_baseline.txt` | 自判(确认类) | 无改动,留档已核 |
|
||||
| 20 | §4 契约4 依据 | 称五 token 对齐机检「查无该件」(`palette_check.py` 无 CAMP_HEADER 逻辑,全仓只命中视图用法) | 复核者 grep | 退回上游(复核者判) | **不采信其结论**:写卡段回读 `tools/palette_check.py:22` 有 `ui_tokens.png`=ui_kit 全量 Color8 token 快照基线,机制存在但不逐名比对表内五行;契约4 依据改成该准确口径 |
|
||||
| 21 | §9 T2.2 | 册为硬编码清单,「接进套件册」不够具体 | `game/tests/run_all.gd:166` 起条目形态 `{"path":…, "expect":0}`+行尾注 | 补写 | T2.2 写死条目全文 |
|
||||
| 22 | 横面 | `ANCHOR_RE` 字符类不含中文段→中文名现行文档无法被机检认锚 | `tools/pipeline_gate.py:68` | 退回上游 | 列 §6 末行;本批不动闸件,是否登记归用户发令 |
|
||||
|
||||
## 采信统计与残余
|
||||
|
||||
- 采信并落卡:19 条(自判 11/补写 8)。
|
||||
- 转待裁(不代用户选):2 条(#9、#11 的机制案),落第 15 节 Q1/Q2。
|
||||
- 不采信结论:2 条(#8 的 `:679` 定性、#20 的「机检不存在」),均经写卡段逐行回读推翻,依据记在表内。
|
||||
- 残余(本卡范围外):#22 机检件缺口;以及本批既有的「art-bible §4.5 #7 破坏性确认异位是否追认」——早于本卡在册,见第 5 节不做表。
|
||||
|
||||
**卡片状态**:轮次 1 后为「待裁未清零」;轮次 2 后见下节。
|
||||
|
||||
---
|
||||
|
||||
## 轮次 2(Q1/Q2 裁决落卡之后,另起一个未参与撰写的只读子代理)
|
||||
|
||||
任务书限定只查五处,且每处须给 `文件:行号` 依据。发现五条:
|
||||
|
||||
| # | 卡内位置 | 发现 | 依据 | 去向 | 处置 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | §8 R3/§9 T2.2 | 双钮形态断言「child(1)=维持」必红——次钮只 `visible=false`、不移除 | `confirm_dialog.gd:47` | 补写 | 改 child(2) + 子节点数=3 非空前置(已落卡) |
|
||||
| 2 | §8 R5 | 未写「须先开营地」前置,boot 态营地屏为隐读不到尺寸 | `camp_scene_view.gd:51` | 补写 | 真实入口补 `open_camp()`+await 排版帧(已落卡) |
|
||||
| 3 | §9 T3.0 | PanelContainer 最小尺寸入树排版后才可信,刚 `new()` 读数不可信,时机未写 | `ui_kit.gd:634-656` | 补写 | 改为经公开句柄读在树的现成实例、await 后再读(已落卡) |
|
||||
| 4 | §3/§8 确认类 | 八处行号全对;`to_html(true)` 追加 α 两位、`6e4526cc` 串对;1280×48 尺寸链可达;「按类型找第一个 HBoxContainer」在本弹窗树内唯一 | `main.gd:211-212`/`:223-224`/`:292-308`、`ui_kit.gd:640`、`ui_assembler.gd:100/214/224-230`、`ui_kit.gd:189/190/200`、`standee_present_values_test.gd:36`、`scenes/camp_screen.tscn:7-11`、`project.godot:30-31` | 自判(留档) | 无改动 |
|
||||
| 5 | §15 Q1 | 裁决句字面只覆盖「色值放公共层」这条轴,「矩形谁建」是写卡段的展开 | 对话原话序列:写卡段推荐句为「色值进公共件、矩形留在顶栏件自建」,用户回话「那没有问题,就按放在公共区域的这一层的方案来实现」 | 待裁(复核者判)→ 按自判落并报备 | 卡内第 15 节与第 16 节各写入解释面一句;用户不认该读法即重开,重开范围仅止于矩形建造方 |
|
||||
|
||||
轮次 2 总判:三条补写已落卡,一条确认留档,一条按自判落并向用户报备。落卡后本卡零待裁点,可提交(合回仍等用户发令)。
|
||||
@@ -0,0 +1,381 @@
|
||||
# 需求卡片 · 营地交互修复批(2026-11-05)
|
||||
|
||||
> **来源**:待办清单条目「营地交互修复批——大门无断点开局被开始层盖住/确认框钮序/营地顶栏无栏体」(2026-11-05 登记,来源=会话提及)
|
||||
> **唯一事实源**:`design/gdd/ux/camp.md` v2.8 §顶栏 · §点选反馈 + `design/gdd/systems/表现与支撑/HUD框架.md` §提示与弹层(三条纪律·其三) + `design/gdd/systems/冒险循环/关卡节点地图.md` §核心循环位置 + `design/art/art-bible.md` v3.43 §6.2
|
||||
> 验收档:中(三件做错的后果都是玩家可见但不损持久状态——呈现与交互逻辑;不触存档写读、不触结算公式、不触 RNG 流。判据=本技能第 16 节单维失败代价)
|
||||
> **改动面**:游戏代码(`game/` 表现层+测试面)。文档面已由文档批落定为现行规格,本卡不携任何 `design/` 改动。
|
||||
> **编排状态**:未编迭代(roadmap 现行最高编号=迭代 52,已完成;本卡待 iter-plan 段编排)
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
三件互不相干的营地屏交互缺陷,一批修完:
|
||||
|
||||
1. **大门无断点开局被开始层盖住**——玩家点大门、按「是」之后,冒险其实已经开局,但主菜单层(开始层)重新显出来并把冒险画面盖住,玩家看到的是主菜单,误以为没开始。修完=从大门真实点击进入后,开始层不可见、关卡画面(节点图选路停点)可见。
|
||||
2. **确认弹窗按钮位次反直觉**——同一个共用弹窗件把「维持现状」那颗放在左、「推进」那颗放在右,四处消费方(删档/大门三出口/大门两出口/篝火)皆然。修完=整体镜像为「推进在左、次推进居中、维持在右」,且位次与语义的绑定有真点验收。
|
||||
3. **营地顶栏看不出是一行 HUD 栏**——顶栏件已装配、已落座、预留位 48px 全宽都在,缺的是那层看得见的底:现在是透明 Control 只挂一枚徽章,而徽章的烛光黄底对背后天空均色只有 1.29:1。修完=按 camp.md v2.8 §顶栏 定值画出栏体(`CAMP_HEADER_BAND` × 不透明度 0.80),徽章顶格右位落进栏内,并有尺寸与对比的机检。
|
||||
|
||||
**完成定义**:四条全落即算这批做完——
|
||||
|
||||
- 对照表(第 8 节)八行断言(R1–R8)在当轮真实跑批中执行且通过,无红项遗留;
|
||||
- 第 8 节标注的两行新增能力已随写卡段落进 `game/tests/README.md`,实现批末核对名实相符;
|
||||
- 回归面(第 5 节列的七条未改动动线)在跑批中仍绿,未因位次改动或栏体新增而失守;
|
||||
- 末卡产出物(实现报告+反哺点清单)写齐,`reports/` 两份落位。
|
||||
|
||||
真人目检项(营地顶栏观感)登记进实现报告实机目检总清单即算义务了结,**不作合回前置**(AGENTS.md 红线:真人检测只登记不阻塞)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
本节为卡片设计依据的唯一出处声明,与待办清单条目实况的闭合凭据同批一致:
|
||||
|
||||
| 需求点 | 现行规格句 | 出处 |
|
||||
|---|---|---|
|
||||
| 件1 | 点大门永远先出确认,无未完冒险=是否开始新冒险 | `design/gdd/ux/camp.md:16` |
|
||||
| 件1 | 关卡开始 → 呈现节点图选路停点(关卡画面;入口不自动进入) | `design/gdd/systems/冒险循环/关卡节点地图.md:78` |
|
||||
| 件2 | 确认弹窗的按钮位次定值:推进钮在左、维持现状钮在右,三钮形态次推进居中,四处共用同一件同一序 | `design/gdd/systems/表现与支撑/HUD框架.md:90` |
|
||||
| 件3 | 栏体底=`#6E4526`×不透明度 0.80、高 48px 全宽浮层、栏内只钥石徽章一件右位顶格、验收=目检窄带可辨+机检对落位带底色 ≥3:1 | `design/gdd/ux/camp.md:41` |
|
||||
| 件3 | 色板五件对齐表在册色 `CAMP_HEADER_BAND #6E4526`(机检〈ui_kit 五 token 与本表一致〉) | `design/art/art-bible.md:452` |
|
||||
| 件3 | 命中区不侵入顶栏禁区(y ≤ 48) | `design/gdd/ux/camp.md:37` |
|
||||
|
||||
预览人审在案:2026-11-05 会话内实尺 HTML 预览(十张已过审场景层按 `camp_scene_layout.tres` 现值叠放+1:1 顶栏放大条+页内 WCAG 即时算式),用户审语「我看了预览的效果是OK的」,选定项=甲 深棕带 × 不透明度 0.80;快照文件 `chat-session-visualizations/…/visualizations/snapshot-444250310dc22234ac755b11fb31ce6885adb634b271c7083d53cc5d72b98640.html`(会话侧不可变快照,非仓库件)。像素级判据句已随附进 `camp.md` v2.8 §顶栏。
|
||||
|
||||
色值落点定稿(用户 2026-11-05 裁「按放在公共区域的这一层」):`ui_kit.gd` 新增一枚带透明度的派生常量 `const CAMP_HUD_BAND := Color(CAMP_HEADER_BAND, 0.80)`——红绿蓝三分量继承既有 token、α 只此一处,顶栏件引用它。两件事已实测(引擎 4.7.2,工程外临时工程跑通后即删):①这种「const 作构造参数派生 const」的写法编译通过,`to_html(true)` 读数为 `6e4526cc`、三分量与母 token 逐一相等;②**色道存单精度浮点,`.a == 0.80` 判为 false**(实测 `a=0.80000001192093`)——所以断言一律写成 `to_html(true) == "6e4526cc"` 或与同构造值整体等值比较,禁写 `.a == 0.80`,否则实现正确而断言红,最容易的自救就成了放宽阈值(触 test-conventions §8.5 禁止削弱测试)。
|
||||
|
||||
---
|
||||
|
||||
## 3. 现状事实(2026-11-05 实查;开工日自行复核行号)
|
||||
|
||||
### 3.1 件1——开始层可见性无单点
|
||||
|
||||
- `game/presentation/camp_shop_presenter.gd:85`:`on_camp_closed()` 体内无条件 `start_overlay.visible = true`。该函数的本职是「回主菜单」,篝火离场(`game/presentation/main.gd:214`)与 Esc 返回主菜单(`game/presentation/main_esc_flow.gd:46`)都靠这句显出菜单——**语义正确,不是缺陷本体**。
|
||||
- `game/presentation/main.gd:211-212`(`_on_confirm_accepted()` 的 `"gate_new"` 分支)与 `game/presentation/main.gd:223-224`(`_on_confirm_secondary()` 的 `"gate"` 分支):两处都是先调 `camp_pres().on_camp_closed()`(把开始层显出来),紧接着调 `_start_adventure()`。
|
||||
- `game/presentation/main.gd:292-308`:`_start_adventure()` 全函数体(体止于 `:308` 的 `return`,`:311` 已是下一函数声明行)零处触碰 `start_overlay`——于是上面那句「显出来」没有对手句把它收回去。失败分支(`main.gd:306-307` `fatal_screen`)在 T1.1 落笔后开始层终态由「可见」变「隐藏」,该终态差在本卡第 5 节明示为可接受(致命屏自会接管,无菜单可用)。
|
||||
- 既有先例=每条启动路径在自己函数内部自管开始层:`game/presentation/main.gd:194`(`_start_adventure_from_menu()` 内先隐藏再转调)、`game/presentation/main.gd:246`(`_resume_from_menu()` 内隐藏)。所以现状的隐藏点是散在入口层的两处,缺的是开局那一条。
|
||||
- `_start_adventure()` 全库调用点仅三处(`main.gd:195`/`212`/`224`),无一需要开局后保留开始层。
|
||||
- 层序事实:`game/tests/system_test.gd:87-89` 断言「start_overlay 在冒险屏壳之上(盖住战斗内容)」——被盖住的正是冒险画面,故真机观感=「画面回主菜单」。
|
||||
- 覆盖缺口事实:`game/presentation/main.gd:210` 的 `"gate_new"` 与 `main.gd:223` 的次确认分支,现有断言只核 `run_scope.is_adventure` 与营地场景屏隐藏(`game/probe/ui_click_probe.gd:703-705`),**没有一条核开始层可见性**,故缺陷在绿批里静默存活。
|
||||
|
||||
### 3.2 件2——弹窗件位次写死
|
||||
|
||||
- `game/presentation/views/confirm_dialog.gd:31-39`:`_init()` 内三颗钮的 `btn_row.add_child()` 次序=取消 → 次 → 确认。
|
||||
- 信号按按钮对象路由、不按位次:`confirm_dialog.gd:32/35/38` 各自 `.pressed.connect(_emit_cancelled/_emit_secondary/_emit_confirmed)`——换序不改路由,文案也不用来认钮。
|
||||
- 四处消费方(全部经同一件):删档确认 `game/presentation/main_overlay_flow.gd:129`(钮标「删除」/「取消」)、大门有断点三出口 `main_overlay_flow.gd:76-78`(「继续上一段冒险」/「开始新冒险」/「取消」)、大门无断点 `main_overlay_flow.gd:82`(「是」/「否」)、篝火离场 `main_overlay_flow.gd:72`(「离开」/「留下」)。
|
||||
- 现有断言只核「次钮在两出口形态下隐藏」(`ui_click_probe.gd:696`),**无一条核位次**。
|
||||
|
||||
### 3.3 件3——顶栏件有装配无栏体
|
||||
|
||||
- `game/presentation/views/camp_hud_band.gd:10-17`:`_init()` 设 `PRESET_TOP_WIDE` + `custom_minimum_size=(0,48)` + `mouse_filter=MOUSE_FILTER_IGNORE`,体内只挂一枚徽章,**无任何底色件**——即整条顶栏是透明的。
|
||||
- 徽章现状:`camp_hud_band.gd:15-16` 设 `PRESET_CENTER_RIGHT` 后 `position=Vector2(-160, 8)`(注释自标「代拍板 3」)。
|
||||
- 徽章自高=48px:`game/presentation/views/ui_kit.gd:640` 的 `panel_flat(..., Vector4(14, 8, 14, 8))` 给图标 32px 上下各加 8px 内边距=48px,正等于栏高——**顶距 8px 在栏内放不下**,落座只能顶格。
|
||||
- 装配链在位:`game/presentation/main_ui_build.gd:120-121` 造件并调 `set_hud_band()` → `game/presentation/views/camp_scene_view.gd:88-91` 把件塞进 `_hud_slot` → `camp_scene_view.gd:188` 预留位 `custom_minimum_size=(0, layout.hud_band_h)`,取数自 `game/data/tables/camp_scene_layout.tres` 的 `hud_band_h=48`(schema 见 `game/data/schemas/camp_scene_layout_table.gd:7`)。
|
||||
- 铺满矩形的既有实现盘上已有两份、形态不同:`game/presentation/ui_assembler.gd:224-230` `overlay_bg(host, color) -> ColorRect`(**外部调用者零**,仅被该文件自身 `:100`、`:214` 用)与 `game/presentation/views/ui_kit.gd:486-491` `_modal_dim()`(私有,仅 `:511` 一处用)。四处同形的用途实为三种意图——亮底面板(`BG_BRIGHT`)/模态压暗遮罩(黑 0.6)/tooltip 遮罩底,本批顶栏带是第四种意图(常驻 HUD 条且不吃点击)。**本批不复用那一份、也不抽新工厂**(依据与留痕见第 12 节与第 15 节);顶栏件按 `views/` 现行形态自己新建矩形——该目录直接 `ColorRect.new()` 的现存先例共 8 个文件 15 处(`battle_end_overlay.gd` 4 处、`board_fx_view.gd` 3 处、`camp_scene_view.gd` 1 处等)。
|
||||
- 落位带实际背景:营地背景层 `game/assets/art/scene/scene_camp_bg.png` 的 y0–48 带均色实测 `#DEEAE7`(逐像素取样,画面最上的可点物件是大门,顶缘 y=250,故 48px 带整条落在远景天空上)。徽章烛光黄底 `#F6C667` 对该天空 1.29:1;定值 `#6E4526`×0.80 叠后呈色 `#84664D`,对天空 4.27:1、对徽章底 3.31:1。
|
||||
- 像素取样先例:`game/tests/unit/presentation/terrain_tile_sets_test.gd:107` 已用 `img.get_pixel()` 在单元套内取样贴图。
|
||||
- 无 golden 锚:`game/tests/golden/README.md`「未建锚面备案」明写营地屏无改前 golden 锚,该面等价证据=探针/单元断言+实机目检。
|
||||
|
||||
---
|
||||
|
||||
## 4. 设计契约(红线,违反=L3 停机呈报)
|
||||
|
||||
- 🔴 **契约1|冒险启动路径的隐藏点收一处**:**限「开局」与「续玩」两条路径**——隐藏责任只许落在 `_start_adventure()`(开局)与 `_resume_from_menu()`(续玩)两个函数内部。第 3.1 条的先例形态即本契约依据。**本契约不管其余开层自管点**:全库开始层显隐共 12 处(`camp_shop_presenter.gd:43`/`:85`、`main.gd:137`/`:194`/`:246`、`main_adventure_flow.gd:145`、`main_debug_flow.gd:88`、`main_overlay_flow.gd:8`/`:17`/`:41`/`:48`/`:95`),那些是选档层/生涯页/终局回菜单等各自开合面的自管句,本批一律不动、也不受本契约约束。禁再新增**开局或续玩路径**上的第三处隐藏点,禁把隐藏写回 gate 出口(调用方)。
|
||||
- 🔴 **契约2|`on_camp_closed()` 语义不动**:`camp_shop_presenter.gd:85` 那句显示开始层是本批禁改项——篝火离场与 Esc 返回主菜单两条动线靠它。改动=回退主菜单功能。
|
||||
- 🔴 **契约3|位次改动只动 `add_child` 次序**:`confirm_dialog.gd:31-39` 的三句连接(`.pressed.connect(...)`)、三个钮对象的创建与文案参数一律不动;四处消费方的 `open()`/`open_three()` 传参零改动。位次与语义的绑定由第 8 节 R4 行的坐标真点断言钉。
|
||||
- 🔴 **契约4|取色单点在 UiKit,禁视图内裸写色值**:栏体色=`ui_kit.gd` 新增的派生常量 `CAMP_HUD_BAND`(`Color(CAMP_HEADER_BAND, 0.80)`,三分量继承在册 token),顶栏件与断言都只引用它;**禁在视图件写 `Color8(110, 69, 38)` 类裸值、禁把 α 写在视图里**。禁的是新增**语义色**,不是禁止派生常量——同文件在册先例:`HP_BAR_TRACK`(`ui_kit.gd:200`,注「视图原裸值收口单点——非色板新增」)、`TOAST_BG`(`:189`)与 `TIP_BG`(`:190`)都是带 α 的派生常量。依据=`ui_kit.gd:2` 文件头「呈现层共享小部件工厂+全站取色/描边唯一出口——各视图禁内联 Color8/StyleBoxFlat 字面量,换皮只改本文件」。色板基线不受本枚常量影响:`tools/gen_palette_baseline.py:42` 只正则 `Color8(数字,数字,数字)`,带 α 的 `Color(...)` 形态从不进快照。
|
||||
- 🔴 **契约5|栏体不挡命中**:栏体 ColorRect 必须 `mouse_filter = Control.MOUSE_FILTER_IGNORE`,顶栏件自身 `camp_hud_band.gd:13` 的同款设置是既有锚。漏设=48px 带内的点击被栏体吃掉,与 `camp.md:37` 禁区纪律叠加成「顶排物件点不动」。
|
||||
- 🔴 **契约6|本批禁写文档面**:`design/` 整个目录、`待办清单.md`/`体验验证清单.md` 两份根流程清单、`game/tests/README.md` 一律禁改(能力两行已由写卡段落表,实现批只改名实相符);产出物只准落 `reports/`。
|
||||
- 🔴 **契约7|禁变异类测试与撤销类取证**(test-conventions §8.4,全项目红线):本批所有断言从真实入口进入、绑被测改动特有的可观测提交面,禁人为制造红、禁回退 hunk 取证。
|
||||
|
||||
---
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
**做**:
|
||||
1. `_start_adventure()` 入口收一个隐藏点,摘掉 `main.gd:194` 的冗余句;
|
||||
2. `ConfirmDialog` 三颗钮的 `add_child` 次序整体镜像;
|
||||
3. `ui_kit` 加一枚带 α 的派生色值常量 + `CampHudBand` 用它新建可见栏体、徽章改右对齐容器顶格落座;
|
||||
4. 上述三件各自的测试(对照表 8 行 R1–R8)+能力清单两行(写卡段已落)+回归面确认。
|
||||
|
||||
**不做(含去向)**:
|
||||
|
||||
| 不做的东西 | 为什么 | 去向 |
|
||||
|---|---|---|
|
||||
| 「破坏性确认与常规确认禁止同位」(art-bible §4.5 清单 #7 后半句/interaction-patterns §7)在弹窗层的闭合 | 该句系 2026-09-14 文档骨架初版提交随件进入,全库查无用户裁决记录,且 battle.md:335 指定的无障碍基线权威(HUD框架 §可访问性基线)不含它——它是不是用户定的规则,本身待裁 | 本卡不动它;现状四处同位属既有状态,不随本批产生或消失。要不要闭合,归用户另发令,另立待办条目 |
|
||||
| 顶栏栏内加第二件(存档位号/关卡语境等) | 用户 2026-11-05 裁「栏内只放钥石徽章一件」,左位不放件 | 无 |
|
||||
| 营地场景层坐标、素材、七物件摆放的重排 | 属场景重排批,不与本卡混装(用户 2026-11-05 口径:代码批与素材批分两张卡) | 归那一批自己的卡 |
|
||||
| 营地屏 golden 建锚 | 无改前基线可留底,新建锚不属缺陷修 | 不登记(顶栏观感走目检) |
|
||||
| `main.gd:137` 的 boot 期 `start_overlay.visible = true` | 启动默认态,与三件无关 | 无 |
|
||||
|
||||
**回归面(本批不改、但跑批必须仍绿)**:七条未改动动线——大门有断点按「继续上一段冒险」/大门按「取消」「否」/篝火「离开」「留下」/Esc 浮窗三项/五功能窗开合/进入存档与生涯页返回的开始层显隐/终局回菜单。其中前三条已被 `ui_click_probe.gd:679-723` 段覆盖(段止于「开场行三路径段」头注之前),本批在该段内追加断言,不新建平行段。
|
||||
|
||||
---
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
实现批禁写 `design/` 与根规则文件;下表逐条给出「要改哪一节、改成什么、依据是什么」,实现批把命中项列进 `reports/iter<53>-反哺点-<日期>.md`,由用户在会话中裁决后归文档批落文。
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/gdd/ux/camp.md` v2.8 §顶栏 | 本批把「栏体定值」变成实装;若实现期样张/目检意见要求改 α、改右位内缩或改栏高,现行句即落后 | 反哺点:只在**实际改值**时列,附实测读数;未改值不列 |
|
||||
| `design/art/art-bible.md` v3.43 §6.2 钥石余额行 | 同上(该行已把事实源指回 camp §顶栏,改值须两处同改) | 反哺点:与上一行同批列,禁单改一处 |
|
||||
| `design/gdd/systems/表现与支撑/HUD框架.md` §提示与弹层·其三 | 「四处共用同一件同一序」实装后须与代码一致;若实现发现某消费方不遵此序(例如自拼按钮行的弹窗件),句与码冲突 | 反哺点:发现即列,附 `文件:行` |
|
||||
| `design/engineering/architecture/architecture.md` 呈现层模块表 | 两处随本批失真:`:175` CampHudBand 行现写「顶栏 48px 全宽窄条:**钥石余额 badge 唯一呈现**」——加可见栏体后badge 不再是唯一呈现物;`:168` D1 HUD 行的视图单元接口若因本批改动而与「信号外发、setter 只读注入」不符亦须同步 | 反哺点:实现批禁写该文档;本批落地后把该行的实际形态(栏体色面+badge 右位)列进反哺点清单,附 `文件:行` 与实装读数 |
|
||||
| `体验验证清单.md` | 顶栏观感属「需真人试玩才能下结论」项,需一行观测项 | 反哺点:实现批禁写该清单,由文档批落;卡内先在实现报告目检总清单登记 |
|
||||
| `game/tests/README.md` 能力表 | 两行新增能力已由写卡段落表(第 8 节能力行列名即清单名) | 实现批禁写;批末只核「清单名=实际落地函数名」,名实不符=停卡退回写卡段 |
|
||||
| `roadmap.md` 迭代总表 | 本卡尚未编入迭代 | 非实现批义务,归 iter-plan 段 |
|
||||
| (非文档面·写卡期发现一)`tools/pipeline_gate.py:68` 判据出处行锚的机检式 `ANCHOR_RE` 字符类=`[A-Za-z0-9_-.\\/]`,不含中文段 | 本库现行设计文档多为中文名(`HUD框架.md`/`关卡节点地图.md`/`待办清单.md`),凡判据句落在这类文档即无法被机检认锚——本卡 R2/R3/R4/R8 因此同时挂一个 ASCII 路径锚(`camp.md`/`level-map.md`),中文出处改以「第 N 行」散文形写明 | **已登记**:待办清单「流水线闸认锚式不含中文名文档」条(工具代码/待执行),本批不动闸件 |
|
||||
| (非文档面·写卡期发现二)`game/tests/unit/contracts/source_guard_test.gd:85-99` 列目录不递归 | 「V1d 层序落位单口」的扫描面漏掉 `views/` 与 `scenes/` 两个子目录(注释仍写「presentation 无子目录」,实为两个);视图层的插位不在该闸视野内。当前无漏网真违规(`views/ui_kit.gd:841` 属卡片内部重排) | **已登记**:待办清单「层序落位单口检查的扫描面不含子目录」条(工具代码/待执行);两目录是否纳入扫描面本条不预裁,启动时再裁 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 文件结构图
|
||||
|
||||
| 文件 | 职责 | 新增/改动 | 行为改动 | 验收行 |
|
||||
|---|---|---|---|---|
|
||||
| `game/presentation/main.gd` | 组合根:冒险启动与确认分派编排 | 改动(`_start_adventure()` 加一句;`_start_adventure_from_menu()` 删一句) | 行为改动 | R1、R2 |
|
||||
| `game/presentation/views/confirm_dialog.gd` | 通用确认弹窗视图件 | 改动(三句 `add_child` 次序,**不动成员面**) | 行为改动 | R3、R4 |
|
||||
| `game/presentation/views/ui_kit.gd` | 呈现层共享工厂与全站取色单点 | 改动(新增一枚带 α 派生常量 `CAMP_HUD_BAND`;**不新增方法**) | 行为改动(顶栏呈现的数据源) | R5、R6 |
|
||||
| `game/presentation/views/camp_hud_band.gd` | 营地顶栏 HUD 件 | 改动(新建栏体矩形引用该常量+徽章落座改右对齐容器) | 行为改动 | R5、R6 |
|
||||
| `game/probe/ui_click_probe.gd` | 真点探针:大门两分支段所在宿主 | 改动(同段追加断言) | 非行为改动(测试面) | R1、R2、R4、R7、R8 |
|
||||
| `game/tests/system_test.gd` | 系统测试宿主 | 改动(新增 `_smoke_camp_hud_band()`,接进 `_initialize()`) | 非行为改动(测试面) | R5、R8 |
|
||||
| `game/tests/unit/presentation/camp_scene_layout_test.gd` | 营地屏布局与顶栏禁区单元套 | 改动(新增 `_test_hud_band_contrast_over_bg()`) | 非行为改动(测试面) | R6 |
|
||||
| `game/tests/unit/presentation/confirm_dialog_test.gd` | 确认弹窗按钮位次与语义单元套 | **新增** | 非行为改动(测试面) | R3 |
|
||||
| `game/tests/README.md` | 能力清单 | 改动(两行,写卡段落) | 非行为改动 | — |
|
||||
|
||||
结构图与第 12 节「落位与可复用性预检」互指:改动件四个、新增件仅一枚单元套;顶栏矩形为何不复用盘上现成那两份、也不抽新工厂,理由见第 12 节与第 15 节的留痕句。
|
||||
|
||||
---
|
||||
|
||||
## 8. 验证闸(改动—验收对照表)
|
||||
|
||||
| 行 | 需求点(判据出处行锚) | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| R1 | 件1 大门无断点按「是」后开始层不可见(`design/gdd/ux/camp.md:16`+`design/gdd/systems/冒险循环/关卡节点地图.md:78`) | `main.gd:211-212` 分支经 `main.gd:292` 新入口隐藏 | `ui_click_probe.gd:_ready`(大门无断点段追加「确认后开始层不可见」) | 探针 | 营地场景根大门命中区 → `ProbeUiUtil.push_click_at` 真点 → 弹窗「是」钮 `ProbeUiUtil.push_click(_confirm_btn)` 真点 | `main.ui.screens.start_overlay.visible` 取值(被测改动特有的可见性提交面) | 既有:营地大门两分支确认与断点续玩接线 |
|
||||
| R2 | 件1 开局落在节点图选路停点(`design/gdd/ux/level-map.md:69`;停点句唯一出处=`design/gdd/systems/冒险循环/关卡节点地图.md` 第 78 行「关卡开始 → 呈现节点图选路停点」) | 同 R1 | `ui_click_probe.gd:_ready`(同段追加「关卡画面在位」) | 探针 | 同 R1 真点链(大门命中区真点 →「是」钮真点) | `run_scope.is_adventure` + `main.ui.modals.run.level_screen.visible`(停点呈现面,非终态推断) | 既有:营地大门两分支确认与断点续玩接线 |
|
||||
| R3 | 件2 两出口与三出口形态的按钮位次=推进→次→维持(`design/gdd/ux/camp.md:16`;位次定值唯一出处=`design/gdd/systems/表现与支撑/HUD框架.md` 第 90 行「三条纪律·其三」) | `confirm_dialog.gd:31-39` 三句 `add_child` 次序镜像;**成员面与连接一律不动** | `confirm_dialog_test.gd:_test_two_button_row_order`;`confirm_dialog_test.gd:_test_three_button_row_order` | 单元 | 视图件对外入口 `ConfirmDialog.open(text, confirm_label, cancel_label)`/`open_three(text, confirm_label, secondary_label, cancel_label)`——即四消费方实际用的那两个公开方法(`main_overlay_flow.gd:72/76/82/129`) | 测试自己传入三档互异文案(如「推进」「次推」「维持」),从弹窗节点向下按类型定位那个横排容器(HBoxContainer),断言其 `get_children()` 的**子节点顺序**:双钮形态 child(0) 文案=「推进」且 **child(2)** 文案=「维持」——次钮在 `open()` 里只是 `visible=false`、不从子节点表移除(`confirm_dialog.gd:47`),双钮形态下子节点仍为 3 个,按下标断必须取 child(2)(写 child(1) 必红);三钮形态 child(0)/child(1)/child(2)=「推进」「次推」「维持」。另配非空前置:按钮行子节点数=3(防扫描面缩水静默绿)。按类型定位可成立已核:该弹窗树内只有这一个 `HBoxContainer`(`UiKit.modal_shell()` 产 VBox+HSeparator,`ui_kit.gd:509-525`;`UiKit.button()` 无子节点)。判据面=树的公开子节点序(同 `system_test.gd:81-89` 断言层序的先例形态),**不读任何私有成员**,避开 `architecture.md:168` 视图单元接口与 `:323` 禁直引实现内部 | 新增:确认弹窗按钮位次与语义同钉 |
|
||||
| R4 | 件2 左位那颗真点下去就是推进(`design/gdd/ux/camp.md:16`;位次定值出处同 R3) | 同 R3 | `ui_click_probe.gd:_ready`(大门无断点段内,`push_click_at` 打按钮行左位中心坐标) | 探针 | 弹窗开态下按按钮行实际矩形算左位坐标真点 | `_confirm_consumer` 在真点前为 `"gate_new"`、真点后走开局分支(`run_scope.is_adventure` 翻转+`_confirm_consumer` 清零)——位次改动若错接,坐标命中的将是「否」,该面即红 | 新增:确认弹窗按钮位次与语义同钉 |
|
||||
| R5 | 件3 顶栏栏体几何与徽章落座(`design/gdd/ux/camp.md:41`) | `camp_hud_band.gd:10-17` 新建栏体矩形引用新常量+徽章落座改右对齐容器;`ui_kit.gd` 加 `CAMP_HUD_BAND` | `system_test.gd:_smoke_camp_hud_band` | 集成 | 真实工程 boot 后经装配链 `main_ui_build.gd:120-121` → `camp_scene_view.gd:88-91` 落座;**须先开营地**(营地屏 boot 态为隐,`camp_scene_view.gd:51`),走 `main._camp_pres.open_camp()` 探针既有用法并 await 排版帧,再读 `main.ui.modals.camp.scene.hud_band`(`camp_scene_view.gd:49` 的公开句柄) | ①栏体色 `color.to_html(true) == "6e4526cc"`——即规格「`#6E4526` × α0.80」的字面编码;**禁写 `.a == 0.80`**(实测色道单精度使该比较为 false,见第 2 节实测句);②栏体矩形铺满:`size == Vector2(1280, 48)`;③`mouse_filter == MOUSE_FILTER_IGNORE`;④栏体是顶栏件的**第一个子节点**(子节点序=绘制序,色面必须先入才不盖徽章);⑤徽章全局矩形 `position.y == 0` 且 `end.x == 顶栏全局矩形 end.x − 12`(x 向缺判据则位次改错仍绿,故与顶格同批配齐)。前置量测=T3.0 读 `get_combined_minimum_size().y` 须为 48(描边若计入得 50 → 触第 10 节 L3 第 5 条) | 新增:营地顶栏栏体定值与落座 |
|
||||
| R6 | 件3 栏体对落位带底色对比 ≥3:1(`design/gdd/ux/camp.md:41`+`design/art/art-bible.md:452`) | 同 R5 | `camp_scene_layout_test.gd:_test_hud_band_contrast_over_bg` | 单元 | 单元从 `camp_scene_layout_table.gd` 的 `hud_band_h` 出口取带高,读现行背景贴图 `res://assets/art/scene/scene_camp_bg.png` 该带像素(`load(...)` 取纹理再 `get_image()`+`get_pixel`,先例=`terrain_tile_sets_test.gd:105-107` 的全像素扫描) | 规格侧算式核验(与 R5 分工:R5 核实装等值,本行核规格值本身达标)=测试内按 `camp.md:41` 写死 `#6E4526` 与 α0.80,与该带实测均色 alpha 合成后算 WCAG 对比,断言 ≥3.0;扫描面非空前置照 §8.4 正面效力自检配齐。**禁把视图件的 color 直接当预期值喂进算式**(那是 oracle 镜像,test-conventions §8.7 判红) | 新增:营地顶栏栏体定值与落座 |
|
||||
| R7 | 回归·件1 未动的三条动线(`design/gdd/ux/camp.md:16`/`:22`) | 无改动(`main.gd:208`/`214`、`main_esc_flow.gd:46`) | `ui_click_probe.gd:_ready`(既有大门两分支段+篝火离场段现有断言,本批零改写) | 探针 | 既有真点链 | 既有绑定面原样:`is_adventure` 不翻转、营地场景根 `visible`、`_camp_data()["balance"]` 不变 | 既有:营地大门两分支确认与断点续玩接线 |
|
||||
| R8 | 回归·件2 未触的路由与件数断言(`design/gdd/ux/camp.md:16`;位次与件数定值出处同 R3) | 无改动 | `ui_click_probe.gd:_ready`(次钮隐藏断言 `:694`)+ `system_test.gd:_smoke_boot_chain`(开始层三钮计数 `:195`) | 探针/集成 | 既有真点与 boot 链 | 既有绑定面:`_secondary_btn.visible` 为假(两出口形态)、开始层可见钮数 == 3 | 既有:营地大门两分支确认与断点续玩接线 |
|
||||
|
||||
闸口径:本批改动含 `game/` 下非 `.md` 的行为载体,合回后远端 CI 走代码域全档;开发期按改完即测铁规以 `tools/run_all_gates.sh --code` 为选档入口(域划分唯一出处在脚本内,卡内不列闸件名单)。里程碑步出口跑一次所选档全套;波内修复只做出红件的最小单元最窄确认;新增测试先行孤立验证再并入全套。
|
||||
|
||||
**测试削弱申报**:允许改动 0 条既有断言。`ui_click_probe.gd:694`(次钮隐藏)与 `system_test.gd:195`(三钮计数)必须原样通过;本批位次改动若使二者失守=契约3 被违,停卡呈报,禁改判据求绿。**唯一允许的判据形态约束**:涉及色值与透明度的断言一律走 `to_html(true)` 或整体等值比较,禁浮点分量直等(第 2 节实测依据)。
|
||||
|
||||
**独立验收审计**:入口=`reports/iter<53>-验收审计-<日期>.md`;由未参与实现的只读会话或子代理执行,未过不得合回(test-conventions §8.7+iter 技能第 5 步)。验收档=中 ⇒ 审计深度按 §8.7 中档梯度。
|
||||
|
||||
---
|
||||
|
||||
## 9. 任务卡
|
||||
|
||||
### T1|开局路径的隐藏点收一处(≈0.25 工作日)
|
||||
|
||||
取用:`main.gd:292 func _start_adventure() -> void`(既有签名,零参数零返回)。
|
||||
|
||||
- [ ] T1.1 实装:`game/presentation/main.gd:292` `_start_adventure()` 函数体首行加 `ui.screens.start_overlay.visible = false`(位置在该函数现有第一句 `ui.flow.close(...)` 之前)。
|
||||
- [ ] T1.2 实装:删除 `game/presentation/main.gd:194` 那句 `ui.screens.start_overlay.visible = false`(转调 T1.1 后它已无职责)。
|
||||
- [ ] T1.3 验证:`python tools/run_system_test.py` 全绿——核 `_smoke_boot_chain` 与 `_smoke_run_lifecycle` 的既有开始层断言(`system_test.gd:170-171`/`:253`/`:261`)未失守。
|
||||
- [ ] T1.4 验收:`ui_click_probe.gd` 大门无断点段(`:684-705` 区间内)追加两条断言并实跑——R1(确认后 `main.ui.screens.start_overlay.visible` 为假)、R2(`main.ui.modals.run.level_screen.visible` 为真,与既有 `is_adventure` 断言同批)。**帧口径**:段内既有 await 只 1 帧(`:703-704`),选路停点成形的先例是 3 帧(`screen_flow_probe.gd:185-193`,该段在 `await _frames(3)` 后断言「入口停点未落在关卡地图屏(level_screen 不可见)」——但它走 `_start_adventure_from_menu()` 函数直调,那条路径自带隐藏,所以从未抓到本缺陷)——追加断言前 await 到 3 帧,并把「停点成形所需最小帧数」实测值记进实现报告。落点=既有段内,不新建段。
|
||||
- [ ] T1.5 验证:`python tools/run_all_gates.sh --quick` 对该件做最窄确认(探针闸段),先红后绿记进实现报告。
|
||||
|
||||
产出(T2/T3 无关,供回归引用):`_start_adventure()` 成为开始层隐藏的唯一开局出口。
|
||||
|
||||
### T2|确认弹窗按钮位次镜像(≈0.5 工作日)
|
||||
|
||||
取用:`confirm_dialog.gd:43 func open(text: String, confirm_label: String, cancel_label: String = "取消") -> void`;`confirm_dialog.gd:55 func open_three(text: String, confirm_label: String, secondary_label: String, cancel_label: String) -> void`。三颗钮的成员声明(`:14-16`)与连接属本卡禁动面,不取用。
|
||||
|
||||
- [ ] T2.1 实装:`game/presentation/views/confirm_dialog.gd:31-39` 三颗钮的 `add_child()` 次序整体镜像为 确认 → 次 → 取消。对象创建、`.pressed.connect(...)` 三句连接、成员声明(`:14-16`)、`open()`/`open_three()` 签名与文案参数一律不动(契约3)——**本卡不给测试开任何新成员或新公开出口**,位次判据走公开子节点序(依 `architecture.md:168` 视图单元接口与 `:323` 禁直引呈现层实现内部)。
|
||||
- [ ] T2.2 验收(新增件):新建 `game/tests/unit/presentation/confirm_dialog_test.gd`,套件入口=`func _initialize() -> void`(视图件套形态先例=`camp_scene_layout_test.gd:12-13` 的 `call_deferred` 串法,**不是** `_init`),体内 `call_deferred` 两个私有函数——`_test_two_button_row_order()`:自造实例后调 `open("t", "推进", "维持")`,从该实例向下按类型定位那个 `HBoxContainer`,断言其 `get_children()` 的 child(0).text 为「推进」、**child(2).text** 为「维持」,且子节点数=3(次钮只置 `visible=false` 不移除——`confirm_dialog.gd:47`,双钮形态下维持钮在 child(2) 不是 child(1));`_test_three_button_row_order()`:调 `open_three("t", "推进", "次推", "维持")`,断言 child(0)/child(1)/child(2) 文案依次=「推进」「次推」「维持」。全程只读公开树面与 Button 的公开 `text`,不触任何私有成员。入册=在 `game/tests/run_all.gd:166` 起的硬编码清单里追加一行 `{"path": "res://tests/unit/presentation/confirm_dialog_test.gd", "expect": 0}` 并行尾注一句本套件职责(清单条目形态照同目录既有行)。
|
||||
- [ ] T2.3 验收:`ui_click_probe.gd` 大门无断点段内追加 R4。**前置重开**:`:702` 那一次真点已把 `gate_new` 消费掉(`main.gd:215` 置空),故本步须先 `main._camp_pres.open_camp()` → `ProbeUiUtil.push_click_at(gate 命中区中心)` 重出弹窗,再取按钮行左位——坐标=自弹窗节点向下按类型定位到的 `HBoxContainer` 的 child(0) 全局矩形中心,经 `ProbeUiUtil.push_click_at` 真点;断言真点前 `_confirm_consumer == "gate_new"`、真点后 `run_scope.is_adventure` 为真且 `_confirm_consumer` 清零。
|
||||
- [ ] T2.4 验证:孤立先跑 T2.2 新套(`… --script res://tests/run_all.gd` 单套件口径),绿后并入全套;四处消费方动线由 `ui_click_probe.gd` 既有段与 `run_all` 单元套确认未失守(R8)。
|
||||
|
||||
产出:位次成为规格钉死的呈现定值,推进钮恒为该按钮行的 child(0)。
|
||||
|
||||
### T3|营地顶栏可见栏体(≈0.75 工作日)
|
||||
|
||||
取用:`UiKit.CAMP_HEADER_BAND`(`ui_kit.gd:195`,色值单点);`UiKit.keystone_badge(text: String) -> KeystoneBadge`(`ui_kit.gd:655`);`CampHudBand._init()`(`camp_hud_band.gd:10`);`Control.PRESET_FULL_RECT`/`Control.MOUSE_FILTER_IGNORE`(引擎枚举,栏体铺满与不吃命中的既有形态见 `camp_hud_band.gd:11-13`)。
|
||||
|
||||
- [ ] T3.0 前置读数:**入树之后**再量——`KeystoneBadge` 是 PanelContainer(`ui_kit.gd:634-656`),最小尺寸由容器排版产出,刚 `new()` 未入树时读数不可信。落点=在系统测试宿主里经 `main.ui.modals.camp.scene.hud_band` 链取**已在树的现成徽章实例**,先开营地并 `await` 排版帧(帧数口径同 T1.4),再读 `get_combined_minimum_size().y`(`ui_kit.gd:640` 的 `panel_flat(...Vector4(14,8,14,8))` 推得 32+8+8=48,但 `border_w=1` 是否计入最小尺寸未证实——**这是推导,不是实测量**)。读数=48 → 按 T3.2 顶格落座;读数≠48(如 50)→ 停步走第 10 节 L3 第 5 条呈报,禁自行改栏高或改徽章内边距。读数与取数时机一并写进实现报告。
|
||||
- [ ] T3.1 实装(**Q1 已裁·2026-11-05 用户裁「按放在公共区域的这一层」**):先在 `game/presentation/views/ui_kit.gd` 的色板段(`CAMP_HEADER_BAND` 定义在 `:195`,同文件带 α 先例见 `:189`/`:190`)新增 `const CAMP_HUD_BAND := Color(CAMP_HEADER_BAND, 0.80)`,注记沿 `HP_BAR_TRACK`(`:200`)的「视图原裸值收口单点——非色板新增」说法。再在 `game/presentation/views/camp_hud_band.gd` 的 `_init()` 内、挂徽章**之前**新建栏体矩形:`ColorRect.new()` + `color = UiKit.CAMP_HUD_BAND` + `set_anchors_preset(Control.PRESET_FULL_RECT)` + `mouse_filter = Control.MOUSE_FILTER_IGNORE`(契约5)+ `add_child`——顶栏件自建是该目录现行形态(8 个文件 15 处先例,含本件自己的徽章),**不复用 `ui_assembler.gd:224` 的 `overlay_bg()`**(它的头注 `:2-3` 把服务对象写成「供组合根接线」,且外部调用者零;视图引它会新开一条 `views → ui_assembler` 路径),**也不抽新工厂**(意图三分,见第 12 节留痕句)。子节点序即绘制序,故栏体必须先入、徽章后入。
|
||||
- [ ] T3.2 实装(**Q2 已裁乙·2026-11-05 用户裁**):徽章落座改为「栏体内加一层右对齐容器」——新增 `HBoxContainer` 铺满栏体(`set_anchors_preset(Control.PRESET_FULL_RECT)` 之后置 `offset_right = -12.0`)、`alignment = BoxContainer.ALIGNMENT_END`、`mouse_filter = Control.MOUSE_FILTER_IGNORE`,徽章作该容器子件、由容器摆位,余额位数增宽时自然向左展;替换 `camp_hud_band.gd:15-16` 现值(`PRESET_CENTER_RIGHT` + `position=(-160, 8)`,系无栏体时代把 x 写死的代拍板)。容器右对齐先例=`confirm_dialog.gd:27-29`(HBoxContainer+alignment 摆位,非手算偏移)。内缩定值 12px 不变(白名单第 3 条)。
|
||||
- [ ] T3.3 验收:`game/tests/system_test.gd` 新增 `_smoke_camp_hud_band()` 并接进 `_initialize()`,实现 R5 的五项判据(色值走 `to_html(true) == "6e4526cc"` 或整体等值比较,**禁浮点分量直等**;`size == Vector2(1280, 48)`;`mouse_filter == MOUSE_FILTER_IGNORE`;栏体是顶栏件的第一个子节点;徽章 `position.y == 0` 且 `end.x == 顶栏 end.x − 12`)。
|
||||
- [ ] T3.4 验收:`game/tests/unit/presentation/camp_scene_layout_test.gd` 新增 `_test_hud_band_contrast_over_bg()` 实现 R6:读 `hud_band_h` 与背景贴图该带**全像素**均色(取样法照 `terrain_tile_sets_test.gd:105-107` 的双层全扫,非步长抽样),规格值 `#6E4526`/α0.80 按 `camp.md:41` 在测试内写死后合成算 WCAG 对比,断言 ≥3.0;扫描面非空前置照 §8.4 配齐。
|
||||
- [ ] T3.5 验证:新增两测先行孤立跑绿,再并入 `--code` 全套;营地屏截图面由 `render_gate` 的七屏段随批产出,作 R5/R6 的对照取证。
|
||||
- [ ] T3.6 目检登记:营地顶栏观感(「成一条可辨窄带、徽章落在带内」)写进实现报告实机目检总清单,登记即完成义务。
|
||||
|
||||
产出:`CampHudBand` 成为顶栏唯一呈现件(栏体色面+右对齐容器+徽章),顶栏色值单点=新增的 `UiKit.CAMP_HUD_BAND`(其三分量继承 `CAMP_HEADER_BAND`,α 只此一处)。
|
||||
|
||||
### T4|产出物落位卡(≈0.5 工作日,末卡)
|
||||
|
||||
- [ ] T4.1 代码域全档全绿后、合并前写 `reports/iter<53>-实现报告-<日期>.md`:各卡状态+实机目检总清单(含 T3.6)+遗留读数义务+实现决定记录(超白名单的微决策逐条登记)。
|
||||
- [ ] T4.2 写 `reports/iter<53>-反哺点-<日期>.md`:第 6 节每条命中项都要有落点(哪一节、改成什么、依据什么);无命中也要写「本批零反哺点」并附核过哪几处。
|
||||
- [ ] T4.3 核对 `game/tests/README.md` 两行新增能力名与实际落地函数名逐字一致(名实不符=停卡退回写卡段)。
|
||||
- [ ] T4.4 呈报合回清单,等用户发令再走收口(冻结→件核→并 master→重塑→删区)。
|
||||
|
||||
**估时合计 ≈1.75–2.0 个工作日**。切分预案:T3 若因取样件超 0.25 日未完,先合 T1+T2(两件互不依赖),T3 另起一批——第 1 节三件本无耦合。
|
||||
|
||||
---
|
||||
|
||||
## 10. 异常分级
|
||||
|
||||
- **L1 自救**:探针坐标算错导致 R4 打空——重算按钮行全局矩形中心,禁改为信号直发(段内既有 `ui_click_probe.gd:696` 的 `cancelled.emit()` 是取消路径的信号注入先例,注释自陈「真实信号——cancelled 钮同源」;本批 R4 要钉的正是**位次**,直发不经位次,等于没测——依据=test-conventions §8.3 真实入口收窄条,契约7 同源)。
|
||||
- **L2 记录继续**:R6 均色取样读数与卡内实测 `#DEEAE7` 有 ≤3/255 的取样步长差——按实测值断言、卡内读数差写进实现报告,不改阈值。
|
||||
- **L3 停机呈报(写报告等用户)**:
|
||||
1. boot 后 `main.ui.modals.camp.scene.hud_band` 取不到实例(装配链与第 3.3 条现状不符)=卡片现状事实失效,停卡退写卡段;
|
||||
2. R4 坐标真点无法区分左位钮与相邻钮(按钮行 `alignment=CENTER` 下实际矩形与规格不符)=位次与语义绑不上观测面,触 test-conventions §8.4「判据绑不上=停卡呈报」出口;
|
||||
3. 位次改动使 `system_test.gd:195` 或 `ui_click_probe.gd:694`(次钮隐藏断言)失守=契约3 被违,禁改判据求绿;
|
||||
4. 机检预算互斥限**本批触碰的 presentation 面文件**:`tools/gdstyle_gate.py:45` 的扫描面=`game/core`/`game/data`/`game/presentation`,脚本头注(`:8`)明写排除 probe/sim/tests——故新增单元套**不在** S13 射程,该条只对 `main.gd`/`confirm_dialog.gd`/`camp_hud_band.gd` 生效。若这三个件的 S13 键与第 13 节预算数字冲突且无豁免通道=上游缺陷,停卡退回写卡段,禁自造第三条路(本技能第 13/14 节)。
|
||||
5. T3.0 量得徽章 `get_combined_minimum_size().y` ≠ 48(描边宽 1px 若计入最小尺寸则推得 50)=「顶格落座」在 48px 栏内放不下,第 2 节与 `camp.md:41` 的推导句失效,停步呈报,禁自行改栏高、改徽章内边距或放宽 R5 判据。
|
||||
|
||||
---
|
||||
|
||||
## 11. 代拍板白名单(超清单必进实现报告「实现决定记录」并呈报)
|
||||
|
||||
1. 断言消息尾缀文案(照 `〔营地图批 V3〕` 形态自拟)。
|
||||
2. 新单元套件的套件注册名与 `run_all.gd` 册内落点序。
|
||||
3. **徽章水平内缩 12px**:`camp.md` v2.8 只钉「右位顶格」未钉内缩值,取 UiKit 钮间距同档 12(先例=`confirm_dialog.gd:28` `separation=12`)。
|
||||
4. R6 取样密度——照 `terrain_tile_sets_test.gd:105-107` 的**双层全像素扫描**(该件不是步长抽样,卡内早先写的「每 4 行×每 8 列」口径作废)。
|
||||
5. `_smoke_camp_hud_band()` 在 `_initialize()` 内的插入位(不改变既有段序)。
|
||||
6. 新色值常量的命名(卡内暂定 `CAMP_HUD_BAND`)——只要它是「一枚带 α 的派生常量、不加方法、不进色板五件表」这个形态已定,名字可由实现定;若实现改成加方法或加语义色,触契约4 与第 13 节,属 L3 呈报。
|
||||
|
||||
不在白名单:α 值、栏底色、栏高、位次序、隐藏点数量与位置——这些是规格钉死项,改动一律 L3 呈报。
|
||||
|
||||
---
|
||||
|
||||
## 12. 落位与可复用性预检(与第 7 节结构图互指)
|
||||
|
||||
| 新增/改动件 | 复用面(盘上已有什么) | 唯一面 | 分层与交互面 |
|
||||
|---|---|---|---|
|
||||
| 栏体矩形(T3.1,Q1 已裁) | 盘上已有两份同形实现:`ui_assembler.gd:224-230` `overlay_bg()`(**外部调用者零**,仅该文件自身 `:100`/`:214` 用)与 `ui_kit.gd:486-491` `_modal_dim()`(私有,仅 `:511` 一处用)。本批两份都不复用、也不抽新工厂,按 `views/` 现行形态自建(该目录直接 `ColorRect.new()` 有 8 个文件 15 处先例,含本件自己的徽章)。不引装配器的依据:它头注 `:2-3` 把服务对象写成「返回句柄供组合根接线」「接线拓扑唯一归组合根」,现网引用方全在组合根与屏壳侧(`main_ui_build.gd:7`、`scenes/adventure_screen.gd:21`、`scenes/menu_screen.gd:15`),视图引它等于新开一条 `views → ui_assembler` 路径。**不抽工厂的留痕句见本节末** | 顶栏呈现件唯一 = `CampHudBand`;色值单点 = 新增的 `UiKit.CAMP_HUD_BAND`(`Color(CAMP_HEADER_BAND, 0.80)`,三分量继承在册 token、α 只此一处),视图与断言都引用它,禁在别处出现第二组「同一色+同一 α」 | 呈现层内;读数仍经 `camp_data()` 投影单口不变(`camp_hud_band.gd:26-27`),本批零新增跨层引用路径 |
|
||||
| 开始层隐藏(T1.1) | **复用** 既有语义句本身——`main.gd:194`/`:246` 就是同一条责任,本卡把它收进被调方 | 开局路径隐藏点唯一(`_start_adventure()`),续玩路径唯一(`_resume_from_menu()`);其余 10 处开层自管点不在本契约射程(契约1 已收窄) | 组合根内;不触 Core,不新增信号 |
|
||||
| 按钮位次(T2.1) | 无新增件——只镜像既有三句的次序。**本卡不新增成员、不新增公开出口**:位次判据走公开子节点序(R3),语义判据走坐标真点(R4) | 位次定值只写在视图件 `_init()` 一处,四处消费方零副本 | 呈现层;信号对象路由不动;依 `architecture.md:168`「视图单元接口=信号外发+setter 只读注入」与 `:323`「禁直引呈现层实现内部」,不为测试开成员面(该写法曾在本卡出现过,已撤回,登记在第 16 节轮次 2) |
|
||||
| 徽章落座(T3.2) | 已有做同样事的东西:`HBoxContainer` + `alignment` 摆位(`confirm_dialog.gd:27-29`)——**Q2 已裁乙(2026-11-05 用户裁)**,采容器右对齐形态;另两案(锚点生长、`size_updated` 回调)作淘汰留档见第 15 节 | 内缩值 12px 只在落座一处出现一次,禁在断言里另写第二套推导 | 呈现层内 |
|
||||
| `confirm_dialog_test.gd`(T2.2 新增) | 盘上无 ConfirmDialog 专属单元套(grep 命中面=`system_test.gd`/探针的宿主级引用与 `README.md:159` 能力行);同目录 `camp_scene_layout_test.gd:12-13` 是可参照的套件形态(入口 `_initialize()`+`call_deferred`),不是可复用的承载 | 位次判据只此一处;R4 探针判据与之互补(一个核序、一个核语义) | 测试层;经 `ConfirmDialog.open()/open_three()` 公开入口进出,断言只读公开子节点序与 Button 的公开 `text`——「读私有成员」的写法曾在 R3 出现,已按 `architecture.md:323` 撤回 |
|
||||
| `system_test.gd:_smoke_camp_hud_band`/`camp_scene_layout_test.gd:_test_hud_band_contrast_over_bg`(T3.3/T3.4) | **扩展**既有套件,不新建宿主;取样法复用 `terrain_tile_sets_test.gd:105-107` 的双层全扫+`get_pixel` 路径 | 几何判据落系统测试、对比判据落布局单元套——两处职责已由套件名界定,禁第三处重复断言 | 测试层 |
|
||||
|
||||
**同形不同意图的留痕句(本卡有意接受这份重复)**:铺满一个控件的纯色矩形这件事,盘上已有两份实现、四种用途——亮底面板(`ui_assembler.gd:100` 用 `BG_BRIGHT`)、模态压暗遮罩(`:214` 用黑 0.6)、tooltip 遮罩底(`ui_kit.gd:486`),与本批的常驻 HUD 条带。三次法则的触发条件是「同一功能第三次出现」,此处是同一**形状**第四次出现、同一**意图**第一次出现,故不抽公共工厂;把它抽成一个件得到的只会是"随便铺个矩形",属形状公因数而非概念。若日后出现第二个**同意图**件(又一个常驻 HUD 条带),再行提取。该取舍按 Fowler 技术债四象限属「有意且审慎」一格,凭据即本句+实现报告的实现决定记录。(本句由用户 2026-11-05 的架构取舍口径定:体量未变、矛盾未现,不为未到来的问题预先设计。)
|
||||
|
||||
---
|
||||
|
||||
## 13. 实现规范预算(与第 7 节结构图互指)
|
||||
|
||||
**新件三查**——本批新增文件仅 `game/tests/unit/presentation/confirm_dialog_test.gd`:
|
||||
|
||||
- **三查对本件不适用**:`tools/gdstyle_gate.py:45` 扫描面=`game/core`/`game/data`/`game/presentation`,脚本头注 `:8` 明写「probe/sim/tests 测量面」排除——测试面文件不进 S13 读数,无键可对账。
|
||||
- 尺寸预期(照套件形态先例自持,不作机检项):套件入口 1 个(`func _initialize() -> void`,**非** `_init`——先例=`camp_scene_layout_test.gd:12-13`)+私有 `_test_*` 2 个+类变量 0–1。
|
||||
- 迁移函数对账:无迁入(该件全新增,`tools/gdstyle_baseline.txt` 无历史键,跑批后若出超默认新键须申报)
|
||||
|
||||
**存量触面一查**——S13 键较登记值只降不升:
|
||||
|
||||
| 文件 | 基线登记(`tools/gdstyle_baseline.txt`) | 本批预期 |
|
||||
|---|---|---|
|
||||
| `game/presentation/main.gd` | 第 11 行 `quality/max-public-methods = 32` | 不动公开方法面(函数体内加一句+另一函数删一句)→ 读数 32 持平 ✓ |
|
||||
| `game/presentation/views/ui_kit.gd` | 第 12 行 `quality/max-public-methods = 23` | 本批**只加一枚 `const`、不加方法** → 读数 23 持平 ✓。色板快照面也不动:`tools/gen_palette_baseline.py:42` 只正则 `Color8(数字,数字,数字)`,带 α 的 `Color(...)` 常量从不进快照(同文件 `TOAST_BG`/`TIP_BG` 即此形态) |
|
||||
| `game/presentation/views/confirm_dialog.gd` | 无登记键(在默认阈值内) | 仅语句重排,分支与返回数不变 ✓ |
|
||||
| `game/presentation/views/camp_hud_band.gd` | 无登记键 | `_init()` 加栏体与容器两处构造、无分支 → 分支数不变 ✓ |
|
||||
| `game/probe/ui_click_probe.gd` | 无登记键(探针大文件另有基线口径) | 同段追加断言,函数不拆;若单函数分支数超默认,按 L3 第 4 条呈报而非自拆 |
|
||||
| `game/tests/system_test.gd` | 无登记键 | 新增一个私有函数,公开方法面不变 ✓ |
|
||||
|
||||
**指标例外申报**:无。本批不申请任何超默认项。
|
||||
|
||||
---
|
||||
|
||||
## 14. 拆分边界纪律
|
||||
|
||||
本卡非拆分/收敛/重构类:**不适用**——零拆出单元(无新私有函数族、无新件从存量文件迁出、无段件/状态件),唯一新增是一个视图单元套件,其职责语句=「钉确认弹窗的按钮位次与语义绑定」,单一变化原因=位次定值变更(第 12 节复用面同载)。code-conventions §1.1 拆分判据与本节互指,实现期若发现需要拆 `camp_hud_band.gd` 或 `main.gd` 才落得下,属卡片未预见的结构动作=L3 呈报,禁为凑绿硬拆。
|
||||
|
||||
---
|
||||
|
||||
## 15. 待裁点(复核产生,两条都合规、代价不同——设计权归用户)
|
||||
|
||||
独立复核(未参与撰写的只读子代理)把本卡打回一次,四条闭合里三条由写卡段按权威文档自决落卡,第 4 条拆成两案呈用户裁决。**两案现已裁尽,本卡零待裁点,开工门=U0(用户批卡)。** 以下留档=各案备选、代价与裁决,供复核与编排段比对,不再重开。
|
||||
|
||||
### Q1|栏体这一面从哪来——**已裁(2026-11-05 用户裁「按放在公共区域的这一层」)**
|
||||
|
||||
事实底座:`UiAssembler.overlay_bg(host, color)`(`game/presentation/ui_assembler.gd:224-230`)确实做了「ColorRect + PRESET_FULL_RECT + add_child + 返回句柄」这四步,语义就是「铺满宿主的色面」。但该文件 `extends RefCounted`、**无 `class_name`**,现网一律 `const UiAssembler := preload("res://presentation/ui_assembler.gd")` 引用(`main_ui_build.gd:7`、`scenes/adventure_screen.gd:21`、`scenes/menu_screen.gd:15`),**引用方全在组合根与屏壳侧,`views/` 目录零先例**;而 `views/` 内直接 `ColorRect.new()` 有先例(`views/battle_end_overlay.gd:261`/`:289`/`:314`)。
|
||||
|
||||
| 案 | 做法 | 代价 |
|
||||
|---|---|---|
|
||||
| 甲 | `camp_hud_band.gd` 加 `const UiAssembler := preload(...)`,调 `overlay_bg(self, Color(...))` | 复用现成件、零重复实现;但给 `views/` 开一条此前零先例的装配器引用路径(该文件头注自陈「接线拓扑唯一归组合根——本类零信号连接」,被视图件引用属越界用法) |
|
||||
| 乙 | 视图内 `var band := ColorRect.new()` 四行自铺 | 与 `views/` 既有形态同构、零新路径;代价是重复装配器已有的四行(第 12 节要申报「为什么不能复用那一个」) |
|
||||
|
||||
呈裁时并列三案(甲=视图引装配器、乙=视图内自建矩形、丙=提到公共件层);裁决过程中又查实一条规范原文——`ui_kit.gd:2` 文件头「全站取色/描边唯一出口——各视图禁内联 Color8/StyleBoxFlat 字面量,换皮只改本文件」,它把"色值放哪"与"矩形谁建"这两件事分开了。
|
||||
|
||||
> **裁决(2026-11-05 用户裁「按放在公共区域的这一层」)**:取**丙的取值面+乙的动作面**——色值与 α 做成公共件里的一枚派生常量 `UiKit.CAMP_HUD_BAND`(已实测:`Color(CAMP_HEADER_BAND, 0.80)` 编译通过,`to_html(true)`=`6e4526cc`,三分量与母 token 逐一相等),矩形由顶栏件自建。**甲淘汰**(引入一条零先例且无机器检查拦截的跨文件引用);**丙的"抽公共工厂"那一半不做**,理由与留痕句见第 12 节末。已落 T3.1、第 7 节结构图、第 12 节、契约4、第 13 节。**解释面报备**:轮次 2 复核指出裁决句字面只写「放在公共区域的这一层」,未逐字覆盖「矩形谁建」这条轴。写卡段按"该回话针对的是当轮给出的整条推荐(色值进公共件+矩形留在视图自建)"处置,故两半同批落卡;用户若不认这一读法,只需回一句,重开范围仅止于顶栏矩形的建造方,不动色值落点与其他结论。
|
||||
|
||||
### Q2|徽章「右位顶格+内缩 12px」用什么机制随位数自适应——**已裁(2026-11-05 用户裁乙·容器右对齐)**
|
||||
|
||||
事实底座:徽章文案是 `"钥石 %d" % v`(`camp_hud_band.gd:22`,格式串单点在 `UiKit` badge 工厂),**宽度随余额位数变**;现值 `position = Vector2(-160, 8)`(`camp_hud_band.gd:16`)把 x 写死——R5 要断言「徽章右缘 == 栏右缘 − 12」,写死偏移在位数变化时必然失位(现值 -160 只对当时那个位数读数成立)。
|
||||
|
||||
| 案 | 做法 | 代价 |
|
||||
|---|---|---|
|
||||
| 甲 | 锚点右钉 + `grow_horizontal = GROW_DIRECTION_BEGIN` + `offset_right = -12`、`offset_top = 0` | 纯声明式、无回调;依赖 Control 生长语义(须开工首步实测读数确认,Godot 4.7 锚点+offset 与 custom_minimum_size 的相互作用我不凭记忆断言) |
|
||||
| 乙 | 栏体内套一个右对齐 `HBoxContainer`(`alignment = END`),徽章作子件由容器摆位 | 与 `UiKit` 既有容器用法同构(弹窗钮行 `confirm_dialog.gd:27-29` 就是 `HBoxContainer` + `alignment`);代价是多一层容器节点,栏体色面与容器的父子关系要重排 |
|
||||
| 丙 | 保持现锚点,接徽章 `size_updated` 信号在回调里重算 x | 改动面最小;代价是多一条运行期回调路径(与「显式触发才变」的顶栏刷新纪律并存,需在卡内申报新观测路径) |
|
||||
|
||||
写卡推荐=**乙**,理由=仓内已有同类摆位先例(容器 `alignment` 摆位,非手算偏移),且 R5 的 x 向判据在容器形态下读数最直白。甲依赖我不肯凭记忆断言的引擎语义(AGENTS.md:不确定的 API 一律核实后再用,核实前不作推荐)、丙新增运行期路径。
|
||||
|
||||
> **裁决(2026-11-05 用户裁·乙 容器右对齐)**:已落 T3.2 与第 12 节,Q2 清零。
|
||||
|
||||
**Q1/Q2 与第三条(闸件缺口是否登记)都已裁完并落卡,本卡零待裁点,开工门=U0。**
|
||||
|
||||
### 其余复核发现的处置(已落卡,非待裁)
|
||||
|
||||
自判与补写两类共 15 条已按复核者自己落卡的规矩改进行内:契约1 收窄措辞、`_start_adventure()` 函数体行号订正、失败分支终态申报、帧口径、R6 输入来源改读实件、R8 行号与能力行拆正、结构图验收行补 R7/R8、悬空「行为表」引用、L1 引用行号、白名单第 4 条取样口径、`_initialize()` 入口名、新件三查对 tests 不适用、完成定义行八行、`main.gd:137` 与其余开层点不受契约1 约束的明示。(轮次 1 对 R3 给的「升成员供测试直取」处置已在轮次 2 撤回——它抵触 `architecture.md:168` 视图单元接口与 `:323` 禁直引呈现层实现内部,改判为公开子节点序判据。)
|
||||
|
||||
两条闸件面发现**均已登记为工程改动待办**(用户 2026-11-05 口径:登记后本批不管):认锚式字符类不含中文段(`tools/pipeline_gate.py:68`)、层序落位单口的扫描面不含子目录(`game/tests/unit/contracts/source_guard_test.gd:85-99`)。两条都在待办清单在册(改动面=工具代码/状态=待执行),本批不动闸件。
|
||||
|
||||
复核未采信两条:复核者称 `ui_click_probe.gd:679` 是断点写盘句(实为段头注,断点注入在 `:706` 起);称 art-bible:452 宣称的五 token 机检「查无该件」(`tools/palette_check.py:22` 的 `ui_tokens.png` 就是 ui_kit 全量 Color8 token 快照基线,机制存在,只是不逐名比对该表五行——已写进契约4 依据,未采纳其结论)。
|
||||
|
||||
---
|
||||
|
||||
## 16. 复核记录
|
||||
|
||||
复核者身份=未参与本卡撰写的只读子代理(Agent 工具起的独立会话,禁写文件、禁跑闸),形态=只读子代理。轮次 1,发现 22 条,四类去向逐条登记:
|
||||
|
||||
| 轮次 | 复核者身份 | 发现(一句话) | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理·未参与撰写 | 契约1「隐藏点只许两处」按字面过宽——全库开始层显隐共 12 处 | 退回上游(复核者判)→ 落卡改自判 | 契约1 收窄为「限开局/续玩两条路径」,12 处逐条列名(`camp_shop_presenter.gd:43`/`:85`、`main.gd:137`/`:194`/`:246`、`main_adventure_flow.gd:145`、`main_debug_flow.gd:88`、`main_overlay_flow.gd:8`/`:17`/`:41`/`:48`/`:95`)。复核者的「退回上游」定名不采纳:这是卡内条款措辞过宽,非规范冲突,写卡段可自改 |
|
||||
| 1 | 同上 | `_start_adventure()` 函数体行号错(写 311,实止 308) | 自判 | §3.1 改 `292-308` 并注明 `:311` 是下一函数声明行 |
|
||||
| 1 | 同上 | T1.1 落笔后启动失败分支的开始层终态由可见变隐藏,卡未申报 | 补写 | §3.1 该行补终态申报(致命屏自接管,无菜单可用) |
|
||||
| 1 | 同上 | 大门段 await 只 1 帧,选路停点成形先例是 3 帧 | 补写 | T1.4 补帧口径+最小帧数实测记进实现报告;引 `screen_flow_probe.gd:185-193` |
|
||||
| 1 | 同上 | `btn_row` 是 `_init()` 局部变量,R3「逐位相等」写不出来 | 补写(阻塞) | T2.1 同批把 `btn_row` 升为成员 `_btn_row`;R3 绑定面按 test-conventions §8.2 受控例外申报理由 |
|
||||
| 1 | 同上 | §12 自称「不直取私有」,R3/R4 实际直取私有成员 | 自判 | §12 该格与 R3 改为受控例外口径(位次无公开可观测面可钉),不再谎称未直取 |
|
||||
| 1 | 同上 | `:702` 真点已消耗 `gate_new`,R4 需重开营地+大门才有左位可点 | 补写 | T2.3 补「前置重开」步与坐标取法 |
|
||||
| 1 | 同上 | L1 引用的 `ui_click_probe.gd:679` 不是旧口径注释;段内直发面在 `:696`;「emit 不算真实入口」属 §8.3 而非契约7 | 自判+**部分不采信** | L1 改引 `:696` 的 `cancelled.emit()` 并注依据=test-conventions §8.3。**但复核者称 `:679` 是断点写盘句,经我回读不成立**——`:679` 确为段头注「大门两分支断言段」,断点注入起 `:706`;另 R8 原引 `:696` 亦错,次钮隐藏断言实为 `:694` |
|
||||
| 1 | 同上 | `ui_assembler.gd` 无 `class_name`,现网一律 preload,`views/` 零先例;卡内 `UiAssembler.overlay_bg(...)` 写法不成立 | 待裁 | 第 15 节 Q1 全案并列(复用装配器/视图内自建),含两案代价与写卡推荐(乙);T3.1 改为「待 Q1 裁决后落」 |
|
||||
| 1 | 同上 | 徽章自高 48 系推导,`panel_flat` 带 `border_w=1`,描边若计入则 50、R5 顶格判据即红 | 补写(复核者自标「这是推测,未跑批」) | T3.0 新增前置读数步(量 `get_combined_minimum_size().y`);≠48 走 L3 第 5 条;§3.3 与 R5 的推导句标为未实测 |
|
||||
| 1 | 同上 | 12px 内缩无可达机制(徽章宽随位数变,现值写死 x 偏移);R5 只断 y 向,x 写错仍绿 | 待裁+补写 | 第 15 节 Q2 三案并列(锚点生长/容器右对齐/size_updated 回调);T3.2 改「待 Q2 裁决后落」;R5 已补 x 向判据(`end.x == 栏 end.x − 12`) |
|
||||
| 1 | 同上 | R6 若把实现的 `Color(UiKit.CAMP_HEADER_BAND, 0.80)` 当输入=oracle 镜像 | 自判 | R6 改为规格侧算式核验(测试内按 `camp.md:41` 写死 `#6E4526`/α0.80),并明写「禁把视图件 color 喂进算式」,依据=test-conventions §8.7 |
|
||||
| 1 | 同上 | §11.4 称 4×8 步长「沿 `terrain_tile_sets_test` 口径」错,该件是全像素扫描 | 自判 | 白名单第 4 条改全像素双层扫描,并声明卡内早先步长口径作废 |
|
||||
| 1 | 同上 | 数学校核:全扫与抽样均色=RGB(223,235,232),与卡内 `#DEEAE7` 差 ≤1/255;叠后对比 4.29:1(卡 4.27)、徽章对天空 1.30:1(卡 1.29) | 自判(读数采纳,容差不改) | 落位带前提经其独立核对(背景层 `Rect2(0,0,1280,800)`、围墙 y=261、大门 y=250 → 0–48 带只含背景);差值落 L2 容差内,不放宽阈值 |
|
||||
| 1 | 同上 | §1 完成定义与 §5 写「七行」,对照表实为 R1–R8 | 自判 | 完成定义改「八行(R1–R8)」 |
|
||||
| 1 | 同上 | §5 引「第 1 节行为表」,本卡无该表(悬空引用) | 自判 | 改为「七条未改动动线」自足表述 |
|
||||
| 1 | 同上 | §7 结构图 `ui_click_probe`/`system_test` 的验收行列缺 R7/R8 | 补写 | 结构图两行补齐 R1、R2、R4、R7、R8 / R5、R8 |
|
||||
| 1 | 同上 | gdstyle 只扫 core/data/presentation,tests 不在面 → §13 新件三查与 L3 第 4 条对新件无触发路径;套件入口是 `_initialize()` 非 `_init` | 自判 | §13 三查改「对本件不适用」并给依据(`tools/gdstyle_gate.py:45`+头注 `:8`);L3 第 4 条限定为 presentation 面三件;T2.2 入口名改 `_initialize()` 并附先例行号 |
|
||||
| 1 | 同上 | §13 存量一查核过无误(基线 32/23,`main.gd` 公开方法 31+1 静态=32 持平成立) | 自判(确认类) | 无需改动,留档为已核项 |
|
||||
| 1 | 同上 | 契约4 依据「加枚即触五 token 机检表」查无该件 | 自判+**不采信其结论** | 复核者称机检不存在,经我回读:`tools/palette_check.py:22` 的 `ui_tokens.png`=ui_kit 全量 Color8 token 快照基线,机制在——只是不逐名比对该表五行。契约4 依据改写成这个准确口径,仍禁新增 token |
|
||||
| 1 | 同上 | `run_all.gd` 册是硬编码清单,T2.2「接进套件册」不够具体 | 补写 | T2.2 写死条目形态 `{"path": "res://tests/unit/presentation/confirm_dialog_test.gd", "expect": 0}` +行尾注,并指 `run_all.gd:166` 起的清单 |
|
||||
| 1 | 同上 | 总判:按现状不能进实现段,缺四块闭合 | 退回上游(部分) | 四块里①②④已自决落卡;③的 `UiAssembler` 形态与 12px 机制转 Q1/Q2 待裁——**本卡现为「待裁未清零」状态,不进实现段、不落 commit、状态不推「已写卡」**。另其归入的机检缺口(`pipeline_gate.py:68` `ANCHOR_RE` 不含中文段)已列 §6 末行,去向=用户发令登记 |
|
||||
|
||||
**写卡段对复核结论的两处不采信**(复核者也是读代码,不是跑批):`:679` 段头注的定性、五 token 机检「查无该件」——两处均经我逐行回读推翻,依据写在对应处置格。
|
||||
|
||||
**复核报告落盘**:`reports/复核-营地交互修复批-2026-11-05.md`(轮次 1=22 条,轮次 2=5 条,同一文件续段登记)。
|
||||
|
||||
## 轮次 2(Q1/Q2 裁决落卡后的独立复核)
|
||||
|
||||
复核者身份=第二个未参与撰写的只读子代理(与轮次 1 不同一会话),任务书限定只查五处并须给 `文件:行号` 依据。
|
||||
|
||||
| 轮次 | 复核者身份 | 发现(一句话) | 主去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 2 | 只读子代理·未参与撰写 | **硬伤**:双钮形态下断言「child(1)=维持」必红——次钮在 `open()` 里只置 `visible=false`、不从子节点表移除 | 补写 | R3 与 T2.2 改判 child(2),并配「按钮行子节点数=3」非空前置;依据 `confirm_dialog.gd:47` |
|
||||
| 2 | 同上 | R5 缺前置:营地屏 boot 态为隐,未开营地读不到尺寸 | 补写 | R5 真实入口补「先 `open_camp()` + await 排版帧」;依据 `camp_scene_view.gd:51` |
|
||||
| 2 | 同上 | T3.0 未写取数时机:PanelContainer 的最小尺寸在入树排版后才可信,刚 `new()` 读数不可信 | 补写 | T3.0 改为「入树后经公开句柄读在树的现成徽章实例,await 排版帧再读」;依据 `ui_kit.gd:634-656` |
|
||||
| 2 | 同上 | 确认类(无发现):八处行号全对(`main.gd:211-212`/`:223-224`/`:292-308`/`:194`/`:246`、`ui_kit.gd:640` 带 `border_w=1`、`ui_assembler.gd:100`/`:214`/`:224-230`、`ui_kit.gd:189/190/200`);`to_html(true)` 追加 α 两位、期望串 `6e4526cc` 对;尺寸链 1280×48 可达(CampScreen 满铺+`_hud_slot` 全宽,父链无容器改写);「按类型找第一个 HBoxContainer」不会找错(该树只有一个) | 自判(确认留档) | 无需改卡,核法记档:逐行打开比对+仓内既有用法 `standee_present_values_test.gd:36`(`to_html(false)` 六无 #) |
|
||||
| 2 | 同上 | Q1 的裁决句「按放在公共区域的这一层」字面只覆盖色值落点;「矩形由顶栏件自建、不抽公共工厂」是写卡段对裁决的展开,该轴轮次 1 原属甲/乙案内容 | 待裁(复核者判)→ **按自判落并报备** | 依据对话原话序列:写卡段呈案时那句推荐是「色值进公共件、矩形留在顶栏件自建」(两半同批给出),用户回话为「那没有问题,就按放在公共区域的这一层的方案来实现」——回话指向的是该推荐整体而非仅色值半轴,故按已裁处置。该解释已写入第 15 节 Q1 裁决格供比对;**用户若不认这个解释,本条重开为待裁**,且重开只影响顶栏矩形的建造方,不动其余结论 |
|
||||
|
||||
**轮次 2 总判**:三处补写已全部落卡;一处确认留档;一处按自判落并向用户报备(可重开)。落卡后本卡零待裁点。
|
||||
|
||||
@@ -2,16 +2,40 @@
|
||||
|
||||
本清单是流水线的唯一登记处:以后才做的事在此登记一条,随流水线段推进改状态,做完整条删除(条目记进度,不是各段的开工前置);各系统文档的「待办」节只留一行指路存根,不再自建条目。条目格式(标题=登记元数据含可选优先级,正文=实况/缺口/改动面/状态四属性)与状态机以 [doc-conventions §12.1](design/engineering/doc-conventions.md) 为权威。
|
||||
|
||||
#### 流水线闸认锚式不含中文名文档——判据出处行锚对半数现行文档失效(2026-11-05 登记,来源=批次移交)
|
||||
|
||||
**实况**:判据出处行锚的机检式 `ANCHOR_RE`(`tools/pipeline_gate.py:68`)字符类=`[A-Za-z0-9_\-.\\/]`,不含中文段——凡验收判据句落在中文名现行文档(本库 GDD 多为此形态:`HUD框架.md`/`关卡节点地图.md`/`待办清单.md`),机检一律认不到锚、判「判据出处行锚缺失」红。
|
||||
- 批次实证 reports/需求卡片-营地交互修复批-2026-11-05.md:R2/R3/R4/R8 四行的真出处是中文名文档,只能另挂一个 ASCII 路径文档当替身锚才过闸
|
||||
- 发现与依据 reports/复核-营地交互修复批-2026-11-05.md 第 22 条(`tools/pipeline_gate.py:68`)
|
||||
|
||||
**改动面**:工具代码
|
||||
|
||||
**状态**:待执行
|
||||
|
||||
#### 层序落位单口检查的扫描面不含子目录——视图层插位不在该闸视野(2026-11-05 登记,来源=会话提及)
|
||||
|
||||
**实况**:契约件 `game/tests/unit/contracts/source_guard_test.gd` 的「V1d 层序落位单口」用平铺列目录(`:86-99`,只收 `.gd` 文件名、不递归),注释 `:85` 仍写「presentation 无子目录」;而 `game/presentation/` 现实有 `views/` 与 `scenes/` 两目录,视图层全部文件不在该闸视野内。
|
||||
- 现状读数:全 presentation 的 `move_child` 共三处——合同函数 `apply_layer_contract()`(定义在该函数的落位件内)体内两处属唯一合法口;`game/presentation/views/ui_kit.gd:841` 在漏网区,是卡片内部布局重排、非模态层序,故当前无漏网真违规
|
||||
- 规则文本出处:`main_ui_build.gd:122`/`:156`/`:272`「插位由 LAYER_CONTRACT 槽统一落位——禁散落 move_child」
|
||||
- 启动待裁点(本条不预裁):是否真要把两目录纳入扫描面尚未确定;若纳入,判据须先收窄到「禁对根容器插位」,否则组件内重排会误红
|
||||
|
||||
**改动面**:工具代码
|
||||
|
||||
**状态**:待执行
|
||||
|
||||
#### 营地交互修复批——大门无断点开局被开始层盖住/确认框钮序/营地顶栏无栏体(2026-11-05 登记,来源=会话提及)
|
||||
|
||||
**实况**:三件同批一张需求卡片,改动—验收对照表内一件一行。设计定稿=design/gdd/ux/camp.md v2.8 §顶栏、design/gdd/systems/表现与支撑/HUD框架.md §提示与弹层、design/art/art-bible.md v3.43 §6.2。
|
||||
- bug 证据①无断点开局被开始层盖住:`game/presentation/camp_shop_presenter.gd:85` 显开始层 → `game/presentation/main.gd:211-212`/`223-224` 先关营地再开局 → `main.gd:292` `_start_adventure()` 不隐藏;该动线测试与探针零覆盖
|
||||
- bug 证据②确认框否左是右:`game/presentation/views/confirm_dialog.gd:31-39` 加入序=取消→次→确认
|
||||
- bug 证据③营地顶栏无可见栏体:`game/presentation/views/camp_hud_band.gd:10-17`(件已装配落座,缺栏体底与落座定值)
|
||||
**实况**:三件同批一张需求卡片,对照表内一件一行。
|
||||
- 需求卡片 reports/需求卡片-营地交互修复批-2026-11-05.md
|
||||
- 两轮独立复核报告 reports/复核-营地交互修复批-2026-11-05.md
|
||||
- 设计定稿 design/gdd/ux/camp.md v2.8 §顶栏、design/gdd/systems/表现与支撑/HUD框架.md §提示与弹层、design/art/art-bible.md v3.43 §6.2
|
||||
- bug 证据①被开始层盖住:`camp_shop_presenter.gd:85` 显层 → `main.gd:211-212`/`223-224` 先关营地再开局 → `main.gd:292` 不隐藏;该动线测试与探针零覆盖
|
||||
- bug 证据②否左是右:`views/confirm_dialog.gd:31-39` 加入序=取消→次→确认
|
||||
- bug 证据③无可见栏体:`views/camp_hud_band.gd:10-17`(件已装配落座,缺栏体底与落座定值)
|
||||
|
||||
**改动面**:文档+游戏代码
|
||||
|
||||
**状态**:文档设计已闭合+待写卡
|
||||
**状态**:文档设计已闭合+已写卡
|
||||
|
||||
#### 三关色相 × 五组微光互辨抽测——三关图类型色板终值冻结的前置抽测(2026-10-28 登记,来源=会话提及)
|
||||
|
||||
|
||||
Reference in new issue
Block a user