合并(营地场景重排接线-写卡): 卡片定稿+复核17条闭合+设计文档六件逐值补录+待办条目已写卡
ci / gates (push) Successful in 49s

This commit is contained in:
DKChan committed 2026-11-08 00:34:45 +08:00
commit b83dc5fd55
3 files changed
+217 -66

No files matched your search

+2 -1
View File
@@ -1,4 +1,4 @@
# 营地场景 · 分层生图提示词卡 v1.9
# 营地场景 · 分层生图提示词卡 v1.10
> **性质**:营地场景图(1280×800,一张可点击场景图 + 十张分层:背景层 1 + 围墙层 1 + 八个物件层)的出图执行侧文件。**场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖**。
> **依据**:色彩与氛围 = [art-bible](art-bible.md) §2.8 与 §6.2(营地的暖由晒白的地面、木色与烛光件承载;远景走正午强日照、天空淡晴蓝,与冒险中的地下城形成对比;本卡不复述色值);坐标与层序 = 本卡 §2.3(运行期单一事实源 = `game/data/tables/camp_scene_layout.tres`);物件命名与消费链 = [asset-path-map](asset-path-map.md);画法与交付形态 = [art-bible](art-bible.md) §6.2。画法与用色冲突时以 art-bible 为准。
@@ -248,3 +248,4 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm
10. **描边颜色**:奶油色追认——去底脚本「奶油描边膨胀 3px 当屏障」的技术前提随现值锁定(§1 注记同源);改深灰褐须换去底方案全量重出,不裁
11. **营地环境子板色值**:不前置拍板——量化场景实际用色后按 art-bible §4.1 两道门登记(语义检查+RGB 三通道差 ≥8/255),本卡仍不复述色值
12. **围墙显示几何与墙脚入土(2026-11-07 用户裁)**:围墙显示矩形 `(0, 220, 1280, 200)`(顶 y220、高 200、底锚 y420);大门 240×138 尺寸不变、底压墙底 → `(520, 282)`;告示板 130×121 尺寸不变、随墙顶下移 17px → `(845, 241)`;墙脚按 1–7px 低频起伏裁透明缺口透出地面纹理(入土线,判据归 art-bible §6.2)
13. **其余六件落位(2026-11-05 用户裁;2026-11-08 复核补录)**:dummy `(340, 474, 120, 180)`/命中同矩形;forge `(40, 421, 240, 193)`/命中 `(40, 374, 240, 240)`;tent `(982, 335, 251, 170)`;chest `(1097, 654, 106, 90)`/命中 `(1085, 654, 130, 90)`;notebook `(870, 515, 100, 66)`/命中 `(870, 501, 100, 80)`;campfire `(560, 525, 160, 149)`/命中 `(560, 594, 160, 80)`。行内四元组=texture_rect `(x, y, w, h)`,「命中」=hotspot;运行期唯一事实源仍是 `game/data/tables/camp_scene_layout.tres`。
@@ -1,26 +1,77 @@
# 需求卡片 · 营地场景重排接线
> 批名:营地场景重排接线 · 日期:2026-11-07 · 验收档:中(布局呈现数据面,无存档/结算传播)
> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交)
> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.9 §2.3/§3/§5 第 12 条(2026-11-05 与 2026-11-07 用户裁)+[art-bible](../design/art/art-bible.md) v3.48 §6.2(围墙显示矩形与墙脚入土线)+[camp](../design/ux/camp.md) 第 29 行(围墙带 y220–420)+2026-11-07 用户裁原话(墙高 200、顶 y220、门/板跟随、墙脚入土;预览过审 `artwork/2026-11-07-营地接线预览/camp_new_layout_preview_c.png`)
> **接管必读**:本卡对应工作已有部分实现落库且未做完。已完成项/未完成项见 §2「写卡时实查基线」;接管人必须先按 §1.3 做 T0 扫描,逐项复核当前 commit 的真实状态,禁按「未做」整批重写,也禁按「已有」跳过核对。
> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交;**已补回**,状态「已写卡」,见 `待办清单.md`)。
> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.10 §2.3/§3/§5 第 12 条+第 13 条+[art-bible](../design/art/art-bible.md) v3.48 §6.2+[camp](../design/ux/camp.md) 第 29 行+2026-11-07 用户讨论定稿(土线覆盖围墙底与门扇底;最终墙件预览过目;渲染闸与独立审计入场)+2026-11-05 用户裁定的六件落位值。**设计已补录**:六件逐值矩形(dummy/forge/tent/chest/notebook/campfire)已补入 `camp-scene-prompts.md` v1.10 §5 第 13 条(2026-11-08);art-bible §6.2 门扇底同口径仍列反哺点(不阻塞本卡成立)。
> 本版任务边界:**只出需求卡片与两条上游缺口补录**(设计文档六件逐值、待办条目);不实现游戏代码、不提交、不合并。实现与提交须用户另行发令。
## 1. 目标与完成定义
把营地十层的运行数据换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;新围墙件(1280×164,补尖+墙脚入土缺口)入包;布局表几何红线单测与冒烟全绿;游戏内营地图层按新矩形铺底、墙脚无贯通直线。
### 1.1 目标
完成定义:`camp_scene_layout_test.gd` V14 全绿(含新值钉断言)+冒烟测试 exit 0+`palette_check` 围墙对八件零新增色+`path_check` 0 问题;游戏内目检归用户(登记不阻塞)。
把营地十层换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;围墙最终件(1280×164,补尖+底边入土缺口)入包;**土线同时覆盖围墙底与门扇底**,实机读作插在土里;十层结构不变(不新增图层);最终墙件重新出预览并经用户过目;布局/土线/渲染/独立审计全部有读数;营地屏按 `test-conventions.md:100` 纳入渲染闸 golden 机器面。
## 2. 现状事实(开工自行复核)
### 1.2 完成定义
- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):wall `texture_rect=(0,261,1280,49)`、gate `(520,250,240,211)`、board `(845,268,130,121)`、tent `(982,520,251,170)`、forge `(40,467,240,193)`、dummy `(340,520,120,180)`、chest `(1097,700,106,90)`、notebook `(818,704,100,66)`、campfire `(560,571,160,149)`;`wall_band=(0,240,1280,70)`;`gate_gap=(520,760)`。
- 视图按表建层、`TextureRect.STRETCH_SCALE` 拉伸到矩形尺寸:[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136);子节点序=表序=z 序(同文件头注)。
- schema 加载期 fail-fast:validate 入口 [camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);贴图矩形不出画布、命中区不出画布/不侵 y<48/两两不相交、`wall_band` 必须包含 wall 贴图矩形([camp_scene_layout_table.gd:67](../game/data/schemas/camp_scene_layout_table.gd#L67))。
- 单测读表动态取值、以关系谓词为主:[camp_scene_layout_test.gd:82](../game/tests/unit/presentation/camp_scene_layout_test.gd#L82)(门扇命中对齐 gate_gap)、`:87`(布告板命中顶落围墙带)、`:77`(篝火命中贴贴图底)。
- 包内围墙件仍是旧 1280×49(`game/assets/art/scene/scene_camp_wall.png`);门扇件 240×211 由运行时压扁到矩形高(STRETCH_SCALE,2026-11-07 用户裁「不动美术素材」),无需换件。
本批算完成,必须同时满足:
1. 最终墙件预览已用 `scene_camp_wall_final.png` 重新生成,并经用户过目(U0)。
2. 十层 `.tres` 值与 §3 逐字一致;schema 默认值、视图层构建一致;层数仍为 10,bg/wall 仍占 z0/z1。
3. 土线(围墙底+门扇底)与过审预览读感一致;底边界不是贯通全宽的直线;门扇底不再单独露直边,也不出现独立灰影;门扇 NORMAL/HOVER/DISABLED 切换后土线仍在。
4. 营地单测 V14+新钉值+门扇状态土线保留单测全绿;结构探针 PASS;营地截图的土线机检 PASS;营地屏 camp golden 已冻结并经用户确认;渲染闸全绿。
5. 独立验收审计(未参与实现的会话或子代理)通过,报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`(日期取审计当日)。
6. 游戏内终审已登记(用户自排,登记不阻塞);art-status-checklist 的营地行补录事实已列反哺点。
7. 代码域闸全绿,远端 CI 对合并提交为绿(跑闸步真跑过);静态扫描零新增红(S11「雷格」已在当前基线修复)。
8. 实现报告与反哺点清单写齐;实现报告内含**完成进度扫描记录**(见 1.3)。
9. 上游缺口已闭合:设计文档六件逐值已补录(`camp-scene-prompts.md` v1.10 §5 第 13 条);待办清单条目已在册(状态「已写卡」)。编入迭代/开工/提交/合并仍须用户发令。
### 1.3 完成需求时的完成进度扫描(收口前置,必做)
**任何卡或批次在宣称完成、写实现报告、请求合并之前,必须先扫描当前仓库的完成进度。未扫描不得宣称完成。**
- 扫描时以实查为准:已存在的实现也要逐项对照本卡,不因“看起来已有”而跳过;不假设“应该没做”或“应该已经做了”。
- 发现缺失、值不一致、素材与卡不符、测试缺读数、文档未同步,一律记为未完成;逐条列缺口,不得用一句“已完成”带过。
- 扫描记录写进实现报告,至少含:检查时间、当前 commit、每一项的实查值/实际状态、与卡的差异、结论。
- 扫描时点:**T0 开工扫描一次(基线)**;**T4 收口再扫描一次(最终)**。两次都留读数。
扫描面(逐项勾):
| 面 | 要读什么 | 完成判据 |
|---|---|---|
| 布局表 | `game/data/tables/camp_scene_layout.tres` 十层 texture_rect/hotspot、wall_band、gate_gap | 与 §3 表逐字一致;层序不变 |
| schema | `game/data/schemas/camp_scene_layout_table.gd` 默认值/注释 | wall_band=(0,220,1280,200);validate 通过 |
| 视图 | `game/presentation/views/camp_scene_view.gd` 层构建、`expand_mode`、土线材质、门扇状态材质 | 门扇 138 高生效;土线覆盖墙+门扇底;NORMAL/HOVER/DISABLED 不丢土线;10 层 |
| 素材 | `scene_camp_wall.png` 尺寸/色数/柱尖/底边;`scene_camp_gate.png`;`scene_camp_bg.png`;源/包 md5 | 墙 1280×164、不透明 12 色、柱尖完整、底边有缺口、源包 md5 一致;门扇 240×211;背景 1280×800 |
| 导入缓存 | `game/.godot/imported/*.ctex` 的 mtime 与 `source_md5` | 与盘上源文件 md5 一致;改素材后已强制重导入 |
| 单测 | `camp_scene_layout_test.gd` V14+钉值+门扇状态土线保留 | 全 PASS,exit 0 |
| 结构探针 | `ui_struct_probe` camp 段 | PASS |
| 渲染/土线/golden | `shot_probe` 营地截图+`check_soil_line`+camp golden+`render_gate.sh` | 土线断言 PASS;camp golden 在位且经用户确认;渲染闸全绿 |
| 设计文档 | `design/art/camp-scene-prompts.md` §5 第 6 条/第 13 条、`design/art/art-bible.md` §6.2 | 六件逐值在册(本卡前置);门扇底同口径/240×147 与 138 口径统一属文档批反哺点,不阻塞本卡 |
| 审计 | 独立验收审计报告 | 报告在位、发现已闭合 |
| 文档/记录 | art-status-checklist、实现报告、反哺点清单、终审登记 | 各自落位;反哺点有去向 |
| 仓库红账 | 当前 master 静态扫描/CI | 本卡改动面零新增红;静态扫描 S11 零命中;外部红有处置结论 |
## 2. 现状事实(开工复核基线,本卡不预写完成结论)
- 当前分支**已经包含**本卡的部分实现(历史合并所致),且**未做完**。开工先按 §1.3 扫描,按实查值决定“已对/需改/缺件”,禁按“未做”整批重写,也禁按“已有”跳过核对。
- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):以 §3 为目标值逐层核对;当前值以实查为准。
- 视图 [camp_scene_view.gd:130](../game/presentation/views/camp_scene_view.gd#L130) 按表建层,[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136) 有 `EXPAND_IGNORE_SIZE`;土线材质是本案新增面。
- schema 加载期 fail-fast:[camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);`wall_band` 包络校验在 [:59–:62](../game/data/schemas/camp_scene_layout_table.gd#L59-L62)。
- 单测 [camp_scene_layout_test.gd:26](../game/tests/unit/presentation/camp_scene_layout_test.gd#L26) 读表动态取值;[:88](../game/tests/unit/presentation/camp_scene_layout_test.gd#L88) 起为 2026-11-07 钉值断言。
- 素材:包内 [scene_camp_wall.png](../game/assets/art/scene/scene_camp_wall.png)、[scene_camp_bg.png](../game/assets/art/scene/scene_camp_bg.png)、[scene_camp_gate.png](../game/assets/art/scene/scene_camp_gate.png);尺寸与色数以 T0 实查为准。
- **素材源路径**:最终墙件 `scene_camp_wall_final.png` 在主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/`(artwork 不入 git,worktree 无副本);T0 从主区取源,核 md5 与包内一致。
- **写卡时实查基线(2026-11-08,worktree 基线 89f4fc78,供 T0 对照,不作完成结论)**:
- **已完成(实查)**:`.tres` 十层与 §3 逐字一致;schema 默认 `wall_band=(0,220,1280,200)`;view 有 `EXPAND_IGNORE_SIZE`/`STRETCH_SCALE`;V14 钉值断言在位;包内墙件 1280×164、全色 16(含透明/边缘 alpha)、不透明 12 色,与主区源件 md5 一致;门扇 240×211;背景 1280×800;`bash tests/static_scan.sh` S11 ok。
- **未完成(实查)**:土线裁切材质(wall/gate);门扇 NORMAL/HOVER/DISABLED 保土线;土线机检 `check_soil_line`;门扇状态单测 `_test_gate_state_keeps_soil_cut`;camp golden+`render_gate.sh` camp 段+`golden_baseline_refresh.sh --camp`;最终墙件预览 U0;游戏内终审登记;实现报告/反哺点。
- **接手动作**:上述均为写卡时点读数,接管人必须按 §1.3 做 T0 扫描复核当前 commit 的真实状态;已存在项逐项对照,不因「看起来已有」跳过;未完成项逐条补,不以一句「已完成」带过。
- **导入缓存坑(本会话实证)**:主区曾出现 `.ctex` 停在 11-06、源文件已是 11-07 的旧缓存;旧缓存会让渲染闸拿到旧背景/旧围墙,绿读数无效。改素材后必须 `--editor --quit` 强制重导入,并核对 `source_md5`。
- **S11 现状**:worktree 基线 89f4fc78 的 `game/probe/board_shot_probe.gd:34,35` 已是「危险格」;`bash tests/static_scan.sh` 实跑 S11 ok(扫描面 317 个文件)。历史日志里的「雷格」为旧读数,不构成本卡开工门;T3 复跑静态扫描,零新增红。
- 待办清单条目已补回(状态「已写卡」);设计文档六件逐值已补录 `camp-scene-prompts.md` v1.10 §5 第 13 条;见头部。
## 3. 设计契约(违反即返工)
🔴 逐层锁定值(写进 .tres,值逐字照此):
🔴 逐层锁定值(写进 `.tres`,值逐字照此):
| 层键 | texture_rect | hotspot | hotspot_key |
|---|---|---|---|
@@ -35,103 +86,193 @@
| notebook | (870,515,100,66) | (870,501,100,80) | notebook |
| campfire | (560,525,160,149) | (560,594,160,80) | campfire |
表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire)。
表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire),**总层数仍为 10**。
🔴 围墙件:1280×164、RGBA、≤32 色(实测 12 色)、顶行仅柱尖若干列不透明(柱尖补全)、底行全透明(入土缺口 1–7px 低频起伏);源文件=主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png`。
🔴 围墙最终件:1280×164、RGBA、≤32 色(全色 16 含透明/边缘 alpha;**不透明色实测 12**)、柱尖完整、奶油描边(与既有物件同色)、底边 1–7px 低频起伏透明缺口(按 200 高拉伸后约 1.2–8.5px);显示矩形 (0,220,1280,200),运行时按 200 高拉伸;源文件主区 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 与包内文件 md5 必须一致(写卡时实查 md5 `328b83fa3a79a97ae3d0c02f5abf4604`)。
🔴 门扇 hotspot 高 147=贴图 138+底部 9px 余量(沿用旧表「命中比贴图高 9」口径,属实现微决策,见 §9 代拍板)。门扇件不换件:现 240×211 由运行时压扁到矩形(用户 2026-11-07 裁「不动美术素材」;设计文档中「随门洞压扁重画」旧句已在本批改为运行时压扁口径)。
🔴 门扇:沿用 240×211,不换件;运行时压扁到矩形 240×138,底压 y420;hotspot 240×147(贴图 138+9px 余量);门扇件底行中心区不透明(写卡时实查:底行局部 x99–143、全局 619–663 不透明,两侧为透明拱边),土线作用于底边中心可见区,两侧透明像素本就透出背景。
🔴 其余六件的 hotspot 由旧表相对关系同偏移得出(dummy 同贴图;forge y−46/高+46;chest y−46/x−12/宽+24;notebook y−14/高+14;campfire y−46/高 80;board 同贴图 y/高+19)——值已列上表,禁止再自拟。
🔴 **土线/入土线(围墙底+门扇底,2026-11-07 用户讨论定稿)**:
- 目标读感:围墙底与门扇底都不与地面形成直边,边界按低频起伏裁切,裁切处透出背景层同列地面像素;门扇底不能单独露直边加灰影。
- 实现形态:在 `CampSceneView` 内新增一个**土线裁切材质**(shader 字符串常量+一个私有应用函数),同时挂到 wall 层与 gate 层;不改 10 层结构、不新增图层、不新增运行时图片素材、不重画门扇件。
- 裁切参数:底边基线 y420;起伏带**名义 9px**(基准顶线 411,即基线往上 9px);逐列顶线 `top = 411 + round(2 + 1.5*sin(gx/11.0) + 1.0*sin(gx/29.0+1.3))`,公式摆动后**实际顶线 410–416(裁切深度 4–10px)**;`round` 半值方向按引擎实现,机检容差 ±1;`y ≥ top` 的像素裁掉(透出背景);紧邻裁切口的**最后可见行 `y = top−1` 压暗 0.85**(1px 暗边;`top` 行已被裁掉,压暗它无意义)。
- 全局坐标:`gx = UV.x * u_width + u_x_offset`(wall:offset 0、width 1280;gate:offset 520、width 240);`gy = u_y_offset + UV.y * u_height`(wall:220/200;gate:282/138)。不用 `FRAGCOORD`,避免视口缩放/黑边影响。gate 局部 x 经 offset 520 还原成画布全局 x,保证墙与门扇接缝处同一条边界。
- 材质与状态:土线材质直接挂 wall/gate 节点的 `material`。gate 的 NORMAL/HOVER **不得把 `material` 置 null**;DISABLED **不得替换成 `_desat_mat`**——土线 shader 内含 `desat` 强度 uniform(默认 0),gate DISABLED 时置 1、NORMAL/HOVER 时置 0;forge/chest 仍走既有 `_desat_mat`。`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void` 以区分 gate;`_apply_state`/`_apply_hover` 的 `node.material = null` 对 gate 改为保留土线材质。wall 无状态切换,材质常驻。
- 层序:视图子节点序=表序(bg 0、wall 1、board 2、gate 3、dummy 4、forge 5、tent 6、chest 7、notebook 8、campfire 9);设计 z 层为 wall z1、gate z3、其余物件 z4–z6(同 z 内按表序)。土线是 wall/gate 自身的材质,不新增节点/图层,**10 层不变**;其余物件绘制在 wall/gate 之后,土线不遮物件。
- 悬停浮动:gate 既有 1–4px 整像素浮动沿用;土线裁切按节点基准矩形的 UV 计算,浮动时随节点整体移动(读作门扇抬起离土),验收截图取 NORMAL 态;浮动期 1–4px 离土读感不在本卡土线判据内。
- 验收:营地截图在墙底与门扇底都能看到同一条起伏边界;边界不是贯通全宽的直线;裁切边界以下首行像素与背景层同列地面像素颜色距离 ≤ 容差,且与墙件不透明色集合的最小距离 > 容差(排除灰影/墙色);接缝 x519/521 的顶线差 ≤1px;门扇底无单独直边/灰影。
- 素材与材质关系:围墙件底边 1–7px 缺口保留为素材属性(拉伸后约 1.2–8.5px);运行时土线材质按 4–10px 裁切;最终可见边界取两者**较深者(并集)**,两者都是低频起伏、方向一致,不冲突。
🔴 **最终墙件预览**:过审预览 `camp_new_layout_preview_c.png` 用的是候选墙 `wall_tipped_preview.png`;实现前必须用最终墙件(主区 artwork `scene_camp_wall_final.png`)重新生成预览(含土线裁切效果,裁切参数与 §3 同源),用户过目后才可开工。预览未过目=U0 未过,停。
🔴 背景:`scene_camp_bg.png` 1280×800(远景片+地面片拼接),接缝在围墙后;改素材后强制重导入。
## 4. 范围边界
做:上表十层数据、围墙件入包、单测新值钉断言(追加,不删旧断言)。
不做:门扇/布告板/其余七件素材重出;背景层;土线改为独立代码层(入土效果落在围墙件缺口,零新代码);camp.md/art-bible/camp-scene-prompts 的进一步改写(归文档批)。
不收件去向:art-status-checklist 营地行状态更新归文档批(反哺点);游戏内终审归用户(登记不阻塞)。
做:§3 十层数据与视图、土线裁切材质与门扇状态材质保留、最终墙件预览、单测/结构探针/土线机检/camp golden/渲染闸、独立审计、实现报告与反哺点。
不做:重画背景;重画门扇/布告板/其余七件素材;新增第 11 层;新增运行时图片素材(golden 测试基线除外);把土线做成独立图层;直接改 `design/`、根规则文件、`待办清单.md`、`体验验证清单.md`、`game/tests/README.md`(实现批禁写;一律列反哺点);不改 `board_shot_probe.gd`(S11 已在当前基线修复,非本卡面)。
不收件去向:art-status-checklist 营地行 → 文档批反哺点;门扇底口径/240×147 与 138 口径 → doc-design(六件逐值已补录);待办条目状态 → 登记段(已补回);编入迭代 → 编排段;游戏内终审 → 用户(登记不阻塞);README 能力行代表用例 → 反哺点。
## 5. 关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| design/art/art-bible.md §6.2 | 围墙显示矩形与墙脚入土线(已随设计批改到 v3.48) | 实现批不直改;若实现取此卡值时偏差则列反哺点 |
| design/art/camp-scene-prompts.md §2.3/§3/§5 | 坐标表(已随设计批改到 v1.9) | 同上 |
| design/ux/camp.md 第 29 行 | 围墙带 y220–420(已随设计批改) | 同上 |
| design/art/art-status-checklist.md 营地行 | 需补「围墙件 2026-11-07 换代」事实 | 反哺点,归文档批落文 |
| design/art/art-bible.md §6.2 :405 | 入土线条款只写围墙底;§3 要求门扇底同口径 | 实现批不直改;反哺点,文档批补一句“门扇底同口径” |
| design/art/camp-scene-prompts.md §5 第 12 条 :250 | 现写墙脚 1–7px;门扇底与最终墙件口径需补 | 反哺点,归文档批 |
| design/art/camp-scene-prompts.md §5 第 3 条 :241 vs §2.3 :114 | :241 写“显示矩形 240×147”,:114 写“门扇可见 y282–420(高 138)”;本卡口径=显示矩形 240×138、命中 240×147 | 反哺点,文档批统一口径 |
| design/art/camp-scene-prompts.md §5 第 6 条 :244+第 13 条 | 第 6 条只载“宝箱离底、其余上移 46px”关系句;六件逐值已由第 13 条补录 | 已闭合(2026-11-08 补录);实现批不直改设计文档 |
| design/ux/camp.md 第 29 行 | 现写围墙带/墙脚入土;门扇底土线需补 | 反哺点,归文档批 |
| design/art/art-status-checklist.md 营地行 | 需补“围墙件最终件 2026-11-07 换代+土线”事实 | 反哺点,归文档批 |
| game/tests/README.md:165 能力表 | 营地能力行代表用例需补 `check_soil_line`、`_test_gate_state_keeps_soil_cut`、camp golden | 实现批禁写;反哺点 |
| roadmap.md / 待办清单.md | 本卡编入迭代与状态推进 | 待办条目已补回(状态「已写卡」);编入迭代归编排段 |
| 体验验证清单.md | 游戏内终审登记项 | 归文档批/实现报告登记,实现批不直改 |
## 5.5 文件结构图(T 卡分解依据)
| 文件 | 职责 | 改动性质 | 验收对照表行 | 复用/新增 |
|---|---|---|---|---|
| `game/data/tables/camp_scene_layout.tres` | 十层 texture_rect/hotspot/表级值唯一数据源 | 行为改动(数据);T0/T1 核对,若已一致则零改动 | 1–3 | 复用既有 |
| `game/data/schemas/camp_scene_layout_table.gd` | 默认值/加载期校验 | 非行为(仅核对;默认值已一致) | 1(schema 前置) | 复用既有 |
| `game/presentation/views/camp_scene_view.gd` | 十层建层、`EXPAND_IGNORE_SIZE`、土线裁切材质、门扇状态材质保留 | 行为改动 | 4、6、7 | 复用既有(新增 1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整;不新增类变量) |
| `game/tests/unit/presentation/camp_scene_layout_test.gd` | V14 钉值+门扇状态土线保留单测 | 非行为(测试) | 1–3、7 | 复用既有(新增 1 个测试函数) |
| `tools/shot_checker.py` | 土线机检 `check_soil_line` | 非行为(闸机检) | 6 | 复用既有(新增 1 个函数) |
| `tools/render_gate.sh` | camp 全屏 golden 段 | 非行为(闸机检) | 8 | 复用既有(新增 1 段) |
| `tools/golden_baseline_refresh.sh` | `--camp` 冻结模式 | 非行为(闸机检) | 8 | 复用既有(新增 1 模式) |
| `game/tests/golden/<platform>/camp.png` | camp 全屏逐像素基线 | 非行为(测试资产) | 8 | **新增**(测试基线;test-conventions:100 在册例外;运行时零新增图片) |
| `game/assets/art/scene/scene_camp_wall.png` | 围墙最终件 | 资产改动(运行时) | 5 | 复用既有(覆盖同名件) |
| `reports/实现报告-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 |
| `reports/反哺点-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 |
| `reports/验收审计-营地场景重排接线-<实现日期>.md` | 独立审计报告 | 非行为(报告) | — | 新增产出物 |
| `artwork/2026-11-07-营地接线预览/compose_preview.py` | 最终预览生成 | 非行为(工作区,不入 git) | —(U0 人审) | 复用既有(改墙源/土线) |
## 6. 任务卡
### T0 围墙件入包(≈0.25 工作日)
### T0 最终墙件预览+导入基线+开工扫描(≈0.25 天)
- 取用:无。产出:`game/assets/art/scene/scene_camp_wall.png`(覆盖)。
- [ ] 从主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 拷入 → 核对尺寸 1280×164、模式 RGBA
- [ ] 建隔离基线目录并跑色板闸:`mkdir -p /tmp/wall_base /tmp/wall_only && cp game/assets/art/scene/scene_camp_{board,gate,dummy,forge,tent,chest,notebook,campfire}.png /tmp/wall_base/ && cp game/assets/art/scene/scene_camp_wall.png /tmp/wall_only/ && python tools/palette_check.py /tmp/wall_only --baseline /tmp/wall_base` → 围墙零新增色(八件基线)
- [ ] 跑 `python tools/path_check.py` → 0 问题(worktree 缺 `artwork/mockups` 时该项 SKIP/FAIL 属环境坑:以主检出 `--repo` 口径复核)
- 取用:无。产出:用户过目的最终预览、导入缓存基线、开工扫描记录。
- [ ] 从主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/` 取 `scene_camp_wall_final.png`;把 `compose_preview.py` 的墙源改为该件;把“土线贴条”改为与 §3 同参数的裁切(wall+gate、`gx` 全局坐标、顶线公式、`top−1` 暗边),生成 `camp_new_layout_preview_final.png`。
- [ ] 用户过目最终预览(U0);未过目停。
- [ ] 跑 `Godot_console.exe --headless --path game --editor --quit` 强制重导入;核对 `scene_camp_bg/wall/gate` 的 `.ctex` mtime 与 `source_md5` 和源文件一致,记录读数。
- [ ] 按 §1.3 做 T0 扫描:读 `.tres`、schema、view、素材、单测、设计文档、golden、静态扫描,逐项记录实查值与差异;扫描记录进实现报告草稿。
- [ ] 跑 `python tools/palette_check.py game/assets/art --baseline game/tests/golden/palette_baseline` 与 `python tools/path_check.py --repo D:/code/g-plan2`(artwork 在主区,worktree 无副本),核源/包 md5 一致;记录读数;预览文件不入 git(artwork 工作区)。
### T1 布局表换代(≈0.25 工作日)
### T1 十层布局与视图(≈0.25 天)
- 取用:T0 的素材。产出:`game/data/tables/camp_scene_layout.tres`(十层+表级值)。
- [ ] 按 §3 表逐字改十层 texture_rect/hotspot 与 wall_band → 跑 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd`(加载期 validate+钉值+关系谓词全绿,exit 0)
- [ ] `_build_layer_node` 的 TextureRect 加 `expand_mode = EXPAND_IGNORE_SIZE`(否则门扇节点被贴图最小高 211 夹住、矩形 138 不生效)→ 场景探针 ui_struct_probe camp V1 转绿
- 取用:T0 的扫描基线。产出:与 §3 逐字一致的 `.tres`/schema/视图。
- [ ] 按 §3 表逐层核对 `camp_scene_layout.tres` 的 texture_rect/hotspot/hotspot_key、`wall_band`、`gate_gap`;不一致的按表改,已一致的保留并记录“已对”。
- [ ] 核对 `camp_scene_layout_table.gd:9` 默认 `wall_band=(0,220,1280,200)` 与注释。
- [ ] 核对 `camp_scene_view.gd:136` 的 `TextureRect.EXPAND_IGNORE_SIZE`+`STRETCH_SCALE`;确认门扇节点高 138。
- [ ] 跑 `Godot_console.exe --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑 `Godot_console.exe --headless --path game res://probe/ui_struct_probe.tscn` → PASS。
- 产出:布局/视图一致;两条读数。
### T2 新值钉断言+收口(≈0.25 工作日)
### T2 土线(围墙底+门扇底)+机检+camp golden(≈0.5 天)
- 取用:T1 的表。产出:`game/tests/unit/presentation/camp_scene_layout_test.gd`(追加断言);`reports/iter<N>-实现报告-2026-11-07.md`;`reports/iter<N>-反哺点-2026-11-07.md`。
- [ ] 在 `_test_layout_hotspot_geometry` 追加:wall/gate/board/wall_band 四条钉值(已在本批落笔);六件落位钉值一条(逐层 Rect2 比对)
- [ ] 跑 `python tools/run_smoke.py` → exit 0;跑营地套件 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑场景探针 `…console.exe --headless --path . res://probe/shot_probe.tscn` + `python tools/shot_checker.py <截图目录>` → A 段 PASS
- [ ] 写实现报告(各卡状态+目检清单+决定记录)与反哺点清单(§5 四条逐条落点)
- 取用:T1 的 view。产出:土线材质+土线机检+camp golden+营地截图读数。
- [ ] 在 `camp_scene_view.gd` 新增 `_SOIL_CUT_SHADER_SRC`(字符串常量)与 `_apply_soil_cut(node: TextureRect, x_offset: float, rect_w: float, y_offset: float, rect_h: float) -> void`;按 §3 的参数裁 wall/gate 底边;`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void`,gate 走 `desat` uniform、NORMAL/HOVER 保留土线材质;不新增文件、不新增图层、不新增运行时素材、不新增类变量。
- [ ] 在 `camp_scene_layout_test.gd` 新增 `_test_gate_state_keeps_soil_cut` 并接入 `_run_all`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化;跑单测 → exit 0。
- [ ] 在 `tools/shot_checker.py` 新增 `check_soil_line(img: Image.Image, failures: list) -> None`,在 `main()` 处理 `shot_camp.png` 时调用;对墙底与门扇底取样:按截图宽高与设计基准 1280×800 的比例换算坐标(禁写死 1280/420);墙底取可见段(避开帐篷/门扇覆盖),门扇底取底行不透明中心区(写卡时实查全局 x619–663);断言顶线 410–416、≥3 个不同顶线值、接缝 x519/521 差 ≤1px、边界下首行对 `scene_camp_bg.png` 同列颜色距离 ≤ 容差且非墙色、`top−1` 暗边、gate 底无直边/灰影;失败写入 failures。
- [ ] 窗口化跑 `Godot_console.exe --path game --quit-after 3000 res://probe/shot_probe.tscn -- <截图目录>` 产出营地截图;跑 `python tools/shot_checker.py <截图目录> shot_camp.png` → PASS。
- [ ] 在 `tools/golden_baseline_refresh.sh` 增 `--camp` 模式(`shot_probe` 截图 → `game/tests/golden/<platform>/camp.png`);用户对照最终预览确认 `shot_camp.png` 后跑 `bash tools/golden_baseline_refresh.sh --camp` 冻结;未确认不得冻结。
- [ ] 在 `tools/render_gate.sh` 菜单 golden 段后增加 camp 全屏 golden 段(比对 `camp.png`,容差沿用脚本头注释口径);跑 `bash tools/render_gate.sh game` → 全绿。
- [ ] 记录营地截图的 std/colors/eff 与土线断言读数。
### T3 全量验证与独立审计(≈0.5 天)
- 取用:T2 的土线+机检+camp golden。产出:代码域全绿、独立审计报告、CI 读数。
- [ ] 改素材后再次强制重导入;跑 `bash tools/run_all_gates.sh --code` → 冒烟/系统/单元 4 分片/探针/渲染/色板/静态扫描全绿;静态扫描零新增红(S11 已在基线修复)。
- [ ] 独立验收审计:未参与实现的会话或子代理按本卡 §7 逐行核;发现按四类分流处置;报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。
- [ ] 游戏内终审登记到实现报告实机目检总清单(用户自排,不阻塞)。
- [ ] 合并后按需 `tools/ci_check.sh <合并提交>` 现查;绿必须坐实“跑闸”步真跑过;clone 失败不算绿。
### T4 收口产出物+最终完成进度扫描(≈0.25 天)
- 取用:T0–T3 全部读数。产出:实现报告、反哺点清单、最终扫描记录。
- [ ] 写 `reports/实现报告-营地场景重排接线-<实现日期>.md`:各卡状态、实机目检总清单、遗留读数义务、实现决定记录;**内含 §1.3 的 T4 完成进度扫描记录**。
- [ ] 写 `reports/反哺点-营地场景重排接线-<实现日期>.md`:§5 每条同步面都有落点;art-status-checklist、README 能力行、体验验证清单按实况列。
- [ ] 按 §1.3 做 T4 扫描:逐项实查;缺项/偏差列清单;未闭合不得宣称完成。
- [ ] 提交与合并前向用户请示;未获指令不得 commit/merge。
## 7. 验证闸(改动—验收对照表)
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | camp_scene_layout.tres wall | V14 围墙矩形钉值(camp_scene_layout_test.gd `_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | .tres gate/board | V14 门板矩形钉值 | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244) | .tres 六件 | V14 六件落位钉值+七命中区几何红线(validate+不相交+不越界) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | camp_scene_view.gd `_build_layer_node` 加 `EXPAND_IGNORE_SIZE` | 场景探针 ui_struct_probe camp V1「层贴图矩形≠layout 表」 | 探针 | `res://probe/ui_struct_probe.tscn`(camp 段) | 节点 position/size 逐值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 围墙件换代(判据出处 design/art/art-bible.md:212) | scene_camp_wall.png | T0 `palette_check`/`path_check` | 资产 | 文件读数 | 色数 12、零新增色 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 墙脚入土(判据出处 design/art/art-bible.md:396) | 围墙件底行 | 目检(游戏内终审,登记式) | 目检 | 营地屏 | 墙底无贯通直线 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 营地屏铺底不回归(判据出处 design/ux/camp.md:29) | 十层矩形整体 | 场景探针 `shot_probe` camp 截图+`shot_checker` A 段(角色/面板骨架不回归) | 探针 | `--headless --path . res://probe/shot_probe.tscn` | 截图色彩数/骨架 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | `camp_scene_layout.tres` wall | V14 围墙矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | `.tres` gate/board | V14 门扇/告示板矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244+§5 第 13 条) | `.tres` 六件 | V14 六件落位钉值+几何红线(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | `camp_scene_view.gd` `EXPAND_IGNORE_SIZE` | `ui_struct_probe` camp V1 层贴图矩形(`ui_struct_probe.gd:_ready` camp 段) | 探针 | `res://probe/ui_struct_probe.tscn` | 节点 position/size | 既有:营地场景图十层铺底与门洞留空呈现 |
| 围墙最终件(判据出处 design/art/art-bible.md:404) | `scene_camp_wall.png` | T0 `palette_check`/`path_check`+最终墙预览过目 | 资产 | 文件读数+用户过目 | 尺寸 1280×164、不透明 12 色、柱尖/奶油描边/底缺口、源包 md5 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 土线覆盖围墙底+门扇底(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` 土线裁切材质挂 wall/gate | `shot_checker.py:check_soil_line(img, failures)`+`shot_camp.png`:顶线 410–416、≥3 个不同顶线值、接缝差≤1px、边界下首行对背景同列颜色距离≤容差且非墙色、`top−1` 暗边、gate 底无直边/灰影 | 探针 | `shot_probe` 营地窗口化截图 | 截图像素:边界行/颜色距离/暗边亮度 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 门扇状态切换保留土线(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` `_apply_state`/`_apply_hover`/`_apply_disabled` | `camp_scene_layout_test.gd:_test_gate_state_keeps_soil_cut`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化 | 单元 | `camp_scene_view.gd` 真实类+`camp_scene_layout.tres` | `gate.material` 引用+shader uniform 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
| 营地屏渲染不回归+golden(判据出处 design/engineering/test-conventions.md:100) | 十层+土线整体;`tools/render_gate.sh` camp 段;`game/tests/golden/<platform>/camp.png` | `render_gate.sh` 七屏+A-D+土线机检+camp golden 逐像素 | 探针 | `bash tools/render_gate.sh game` | 截图色彩/骨架/土线/camp.png 逐像素 | 既有:营地场景图十层铺底与门洞留空呈现 |
注:未删改任何旧断言;新增 5 条钉值断言(围墙/门扇/告示板/围墙带/六件落位),测试削弱申报:无。
注:未删改 V14 旧断言;新增钉值、门扇状态土线保留单测、土线机检与 camp golden 属追加。测试削弱申报:无。
**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/iter<N>-验收审计-2026-11-07.md`;未过不得合并。
**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。
## 8. 异常分级
L1 自救:格式/导入缓存类异常自行重跑。L2 记录继续:非本卡面的既有红记录进报告。L3 停机:表值触 schema fail-fast 或与 §3 冲突=停卡呈报(上游缺陷退写卡段);素材缺位=停卡(不得用旧 49px 墙凑合)。
- L1 自救:导入缓存/格式类异常自行重跑重导入。
- L2 记录继续:非本卡面的存量红记录归属;若挡住代码域全绿,停在该红上,不修别批文件。当前基线 S11 已清零;若 T3 复跑出现新红,按红账不清不开新批处置。
- L3 停机呈报:表值与 §3 冲突、schema fail-fast、最终墙预览未过目、土线机检失败、camp golden 未获用户确认即冻结、独立审计未过、CI 红、gdstyle/预算互斥——停卡写报告等用户;机检预算互斥=上游缺陷,退回写卡段。
## 9. 代拍板白名单
门扇 hotspot 高 147(贴图 138+9 余量);七件 hotspot 的平移口径(§3 已列值);T2 钉值断言的命名与位置(同套件内追加)。超出=记实现报告「实现决定记录」。
- 门扇 hotspot 高 147、六件 hotspot 平移口径(§3 已定值)。
- 土线 shader 的内部结构、uniform/material 命名;土线机检的取样窗口、颜色距离容差、暗边阈值;camp golden 的比对容差沿用 `render_gate.sh` 现行口径(但起伏带名义 9px/顶线 410–416、`top−1` 0.85 暗边、顶部函数为锁定值)。
- 新测试函数命名与所在行:`check_soil_line(img: Image.Image, failures: list) -> None`、`_test_gate_state_keeps_soil_cut`(以本卡 §7 为准,实现照单落名)。
- 超出=记实现报告“实现决定记录”。
## 10. 待裁点
零待裁点(用户已裁:墙 220/200、门板跟随、入土线;2026-11-07)。开工门=U0。
零待裁点。上游缺口已闭合(设计文档六件逐值补录于 `camp-scene-prompts.md` v1.10 §5 第 13 条;待办清单条目已补回,状态「已写卡」)。开工门=U0:最终墙件预览用户过目;提交/合并须用户发令。
## 11. 落位与可复用性预检
本批零新增代码文件、零新增函数:改既有 `camp_scene_layout.tres`(数据行唯一落点)、既有单测追加断言、覆盖既有 `scene_camp_wall.png`(消费名不变,`UiKit.TEX_CAMP_WALL`);另产出两份 `reports/` 过程件(实现报告、反哺点清单)。复用面:视图/装载/校验链现成(camp_scene_view.gd、schema.validate、camp_scene_layout_test.gd),不新增渲染件。唯一面:坐标只落表一处,视图/探针/单测均读表。
- 土线裁切:新增 1 个 shader 字符串常量+1 个私有应用函数+`_apply_disabled` 签名调整;落 `camp_scene_view.gd`;盘上无同类土线 shader(`_DESAT_SHADER_SRC` 是禁用态去饱和,职责不同,不能复用);wall/gate 共用同一 wave 函数,唯一落点在该文件;不新增文件、不新增图层、不新增运行时素材;土线材质挂节点 `material`,不新增类变量。
- 土线机检:在 `tools/shot_checker.py` 新增 1 个函数,复用现有 PIL 读图与 `main()` 循环;不新增脚本文件;对 `shot_camp.png` 调用。
- camp golden:新增 1 张测试基线 `game/tests/golden/<platform>/camp.png`(test-conventions:100 在册例外);`tools/golden_baseline_refresh.sh` 增 `--camp` 模式、`tools/render_gate.sh` 增 camp 段,均不新增脚本。
- 预览:只改 `artwork/` 工作区 `compose_preview.py`(不入 git),不改游戏素材;最终预览是用户过目件,不是运行时资产。
- 数据/素材:无新增运行时数据件、无新增运行时图片;十层结构不变;墙件覆盖同名件。
## 12. 实现规范预算
零新增文件、零新增方法 → gdstyle 阈值面无新增;存量触面:camp_scene_layout_test.gd 追加一段断言(方法数不变、成员数不变)。
- `camp_scene_view.gd` 存量触面:`tools/gdstyle_baseline.txt` 无本文件登记键(实查零命中);按默认阈值 20/15 自查:公开方法 4/20、类变量 13/15;新增面=1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整,**不新增类变量**;改后 4/20、13/15;超预算=停卡。
- `tools/shot_checker.py` 新增 1 个函数,不新增文件;无 gdstyle 约束。
- `tools/render_gate.sh`/`tools/golden_baseline_refresh.sh` 各增 1 段/1 模式,不新增文件;无 gdstyle 约束。
- 零新增 `.gd` 文件、零新增 `.tscn`、零新增运行时资源;shader 以字符串常量存在,不新增 `.gdshader`;唯一新增入库件=`game/tests/golden/<platform>/camp.png`(测试基线,test-conventions:100 在册例外)。
## 13. 复核记录
> 第 1 轮=写卡人自审(非独立);第 2 轮=独立只读子代理复核(未参与本卡撰写,2026-11-08,17 条发现、零待裁);第 3 轮=复核处置中自审。17 条已全部处置:15 条就地改卡,2 条退回上游后经用户 2026-11-08 授权闭合(设计文档六件逐值补录、待办条目补回)。复核证据(文件/行锚/实跑命令)已并入 §2、§5、§7 与本节各条;复核报告文件按用户 2026-11-08 裁清理,不提交、不合回。**卡片达到成立判据;编入迭代/开工/提交/合并仍须用户发令。**
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|---|---|---|---|---|
| 1 | 前台只读复核子代理(未参与撰写) | 七件/六件计数不一(§1/§3/§7) | 补写 | 统一为六件(dummy/forge/tent/chest/notebook/campfire) |
| 1 | 同上 | 六件新值未钉,V14 只证互斥/边界 | 补写 | T2 增六件落位钉值断言,本批已落(PASS 实测) |
| 1 | 同上 | T2 单元套件无真实入口命令 | 补写 | 改为 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` |
| 1 | 同上 | T1 `python -c` 不能读 .tres;`db.load_tables` 无命令入口 | 补写 | T1 改为直跑该单测(加载期 validate+钉值) |
| 1 | 同上 | T0 基线写占位目录;扫全 scene 会带 stage 件红 | 补写 | 写入临时隔离基线命令(八件拷贝)与限定扫描面;path_check 环境坑注明 |
| 1 | 同上 | prompts §5 第 9 条布告板旧值 (845,224) | 退回上游 | 文档区已修:(845,241,130,121),底 362 落在墙内 |
| 1 | 同上 | art-bible §6.2 门扇旧句「贴图 240×138 随门洞压扁重画、y283–367」 | 退回上游 | 文档区已修:运行时压扁、底压 y420 |
| 1 | 同上 | prompts §2.3 门洞 y282–420 与在包墙件全高缺口不相符 | 退回上游 | 文档区已修:墙件缺口全高 220–420、门扇可见 282–420 |
| 1 | 同上 | art-bible:395 不含色数判据 | 补写 | 锚改 art-bible.md:212(营地子板色数行) |
| 1 | 同上 | §13 复核报告文件行违反 2026-11-06 裁(凭据=本节) | 自判 | 删除该行 |
| 1 | 同上 | 门扇「重画 138」vs 运行时压扁,§10 零待裁是否成立 | 自判 | 用户 2026-11-07 明裁「不需要动任何美术素材」,运行时压扁即终稿;§10 零待裁成立 |
| 2 | 后台只读复核子代理(未参与撰写) | schema 默认 `wall_band=(0,240,1280,70)` 与注释仍旧值 | 补写 | schema 默认改 (0,220,1280,200)+注释同步 |
| 2 | 同上 | §7「未新增/删除任何断言」措辞与 +5 条钉值矛盾 | 补写 | 改为「未删改旧断言,新增 5 条钉值断言」 |
| 2 | 同上 | test.gd 头注「禁坐标字面量」与新钉值冲突 | 补写 | 头注改为「关系谓词为主+重排钉值」,钉值前加 `# oracle:` 行锚 |
| 1 | 写卡人自审(非独立) | 旧方案把土线限定为“围墙件缺口、零新代码”,会丢掉门扇底土线 | 补写 | 本卡 §3 改为 wall+gate 共用土线裁切材质;10 层不变;不新增素材 |
| 1 | 同上 | 过审预览用候选墙,最终墙件未单独过目 | 补写 | 本卡 §3/T0 增加最终墙预览用户过目(U0) |
| 1 | 同上 | 渲染闸 A-D 不覆盖土线像素,旧完成定义只写单测/冒烟 | 补写 | 本卡 §1.2/§7/T2 增加土线机检与渲染闸 |
| 1 | 同上 | 旧导入缓存会让渲染闸拿旧素材,绿读数无效 | 补写 | 本卡 §2/§6 T0/T3 增加强制重导入与 source_md5 核对 |
| 1 | 同上 | 独立审计、游戏内终审、art-status-checklist 未进完成定义 | 补写 | 本卡 §1.2/§5/§6 T3/T4 补齐 |
| 1 | 同上 | 待办清单已无本条目,卡片来源悬空 | 退回上游 | 头部记登记缺口;§10 开工门;编入迭代前由登记段补回 |
| 1 | 同上 | 写卡时曾见外部 S11 红(board_shot_probe「雷格」),会挡住代码域全绿 | 自判 | 实查当前基线 89f4fc78 已修复为「危险格」,`static_scan.sh` S11 ok;本卡去除该开工门,T3 复跑确认零新增红 |
| 1 | 同上 | 10 层结构不能新增图层,土线必须挂在既有 wall/gate 层 | 自判 | 本卡 §3/§11 采用裁切材质挂 wall/gate,不新增第 11 层 |
| 2 | 独立只读子代理(未参与本卡撰写) | §7 art-bible 锚 `:395/:396` 实为 `:404/:405` | 自判 | 已改 §7 行 5/6 锚为 `:404/:405` |
| 2 | 同上 | 六件逐值未载于设计文档(`prompts:244` 仅关系句;`grep design/` 零命中) | 退回上游(已闭合) | 用户 2026-11-08 授权补录:`camp-scene-prompts.md` v1.10 §5 第 13 条载六件逐值;头部/§5/§7/§10 同步 |
| 2 | 同上 | 顶部公式实际 410–416(裁 4–10px),与“9px 带”表述矛盾 | 自判 | §3 改为“名义 9px(基准顶线 411)+实际 410–416”;§9 同步 |
| 2 | 同上 | “y≥top 裁掉”与“top 行压暗”互斥(被裁行不可见) | 自判 | §3 改为“最后可见行 `top−1` 压暗 0.85” |
| 2 | 同上 | “其余物件 z4–z6”与视图子节点 0–9 混淆 | 自判 | §3 写明视图子节点序 0–9+设计 z 层 wall1/gate3/其余 z4–z6 |
| 2 | 同上 | 单一材质无法处理 gate 局部 x 的 +520 偏移 | 补写 | §3 钉 `gx=UV.x*u_width+u_x_offset`(wall 0/1280;gate 520/240) |
| 2 | 同上 | gate NORMAL 置 null、DISABLED 换 `_desat_mat` 会抹掉土线 | 补写 | §3 钉土线材质常驻+`desat` uniform;§7 增行 7;新增单测 `_test_gate_state_keeps_soil_cut` |
| 2 | 同上 | 缺 camp golden(`test-conventions.md:100`) | 补写 | §1.2/§6 T2/T3/§7 行 8/§11/§12 增 camp golden;`render_gate.sh`+`golden_baseline_refresh.sh --camp` |
| 2 | 同上 | 土线机检写死 1280 且“同源”判据循环 | 补写 | §6 T2 改为按截图宽高比例取样;对 `scene_camp_bg.png` 同列颜色距离+非墙色;容差归白名单 |
| 2 | 同上 | 缺文件结构图 | 补写 | 增 §5.5 文件结构图 |
| 2 | 同上 | 测试函数名未钉(“或等价函数”、§9 循环) | 补写 | 钉 `check_soil_line(img: Image.Image, failures: list) -> None`+`_test_gate_state_keeps_soil_cut`;§7/§9 同步 |
| 2 | 同上 | §2 行锚错:schema `:67`→`:59–:62`、view `:133`→`:130`、test `:82`→`:26` | 自判 | 已改 |
| 2 | 同上 | §12 写 S13 键,但 `camp_scene_view.gd` 无登记键 | 自判 | §12 改为“无登记键;默认 20/15;现状公开方法 4、类变量 13;不新增类变量” |
| 2 | 同上 | 外部 S11 已不成立(`board_shot_probe` 现为「危险格」) | 自判 | §1.2/§2/§4/§8/§10/§13 去除 S11 红;T3 静态扫描零新增红 |
| 2 | 同上 | `prompts` §5 第 3 条 `:241` 240×147 与 §2.3 `:114` 138 矛盾未列同步面 | 补写 | §5 增行;本卡口径=显示 240×138、命中 240×147 |
| 2 | 同上 | §13 无独立复核记录 | 补写 | 本节增 17 行+复核报告路径 |
| 2 | 同上 | 待办清单无本条目 | 退回上游(已闭合) | 用户 2026-11-08 授权补回:`待办清单.md` 条目状态「已写卡」;头部/§5/§10 同步 |
| 3 | 写卡人自审(复核处置中,非独立) | 原文写“门扇件底行 alpha 全 255”,实查底行仅局部 x99–143 不透明、两侧 195px 透明,表述失真 | 自判 | §3 改为“底行中心区不透明+两侧透明拱边”;T2 门扇取样窗口钉全局 x619–663 |
+9
View File
@@ -271,6 +271,15 @@
**状态**:已写卡
#### 营地场景重排接线——十层新矩形与游戏内终审(2026-11-07 登记,来源=批次移交)
**实况**:用户 2026-11-05/2026-11-07 裁定营地十层重排——围墙显示矩形 `(0,220,1280,200)`、大门/告示板跟随、其余六件按裁定落位;围墙最终件 1280×164 入包;土线同时覆盖围墙底与门扇底(门扇运行时压扁 240×138);最终墙件预览过目(U0)与游戏内终审归实现批。设计已闭合(`camp-scene-prompts.md` v1.10 §5 第 13 条六件逐值;`art-bible.md` v3.48 §6.2 :404–405;`camp.md:29`)。需求卡片:[需求卡片-营地场景重排接线-2026-11-07.md](reports/需求卡片-营地场景重排接线-2026-11-07.md)(独立复核 17 条已处置,复核记录在卡内 §13);实现待编排。
- 相关文档:[营地场景提示词卡](design/art/camp-scene-prompts.md) §5 第 6/12/13 条+[美术圣经](design/art/art-bible.md) §6.2+[营地 UX](design/ux/camp.md) 第 29 行;复核记录见[需求卡片](reports/需求卡片-营地场景重排接线-2026-11-07.md) §13
**改动面**:美术素材+游戏代码
**状态**:文档设计已闭合+美术设计已闭合+已写卡
#### 站桩帧动画——Alpha 定版闸前完成(2026-10-06 登记,来源=审计发现)
**实况**:定稿立绘零帧动画;现行动画全部程序化(死亡碎裂/受击闪白/意图徽标弹入=程序 tween,非帧资产)。用户裁定改排 Beta:Alpha 定版不再以本条为闸,路线三案与前置管线依赖原样留到 Beta 立项再裁(标题「Alpha 定版闸前完成」系登记元数据原文,禁改)。三路线备选:①**拆件驱动**(推荐:定稿立绘切部件〔头/躯干/臂/腿/武器〕+ 节点层级 tween 驱动——零身份漂移、帧数无限、内存小;项目已有先例=shovel_swing 三帧 + 程序化死亡碎裂)②AI 关键姿势 + 人工修 + 程序补帧 ③全 AI 逐帧(不推荐:身份漂移/像素抖动)。前置依赖=「立绘→派生形态」管线(原稿像素化后入包、禁再降采样 + 降色 ≤32 + 脚底基线对齐 + 命名合规;显示缩放走 art-bible §8.2 乙类口径=档高÷源高、NEAREST、允许非整数倍)。