From 54f9f23342ce2f101c10f6c49b88a333b216bc88 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sat, 7 Nov 2026 18:37:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=90=A5=E5=9C=B0=E5=9C=BA=E6=99=AF=E9=87=8D?= =?UTF-8?q?=E6=8E=92=E6=8E=A5=E7=BA=BF(=E8=90=BD=E8=A1=A8):=20=E5=8D=81?= =?UTF-8?q?=E5=B1=82=E6=96=B0=E7=9F=A9=E5=BD=A2=E2=80=94=E2=80=94=E5=9B=B4?= =?UTF-8?q?=E5=A2=99=20(0,220,1280,200)=E3=80=81=E5=A4=A7=E9=97=A8=20240?= =?UTF-8?q?=C3=97138=20=E5=BA=95=E5=8E=8B=E5=A2=99=E5=BA=95=20(520,282)?= =?UTF-8?q?=E3=80=81=E5=91=8A=E7=A4=BA=E6=9D=BF=20(845,241)=E3=80=81?= =?UTF-8?q?=E5=85=B6=E4=BD=99=E5=85=AD=E4=BB=B6=E6=8C=89=202026-11-05=20?= =?UTF-8?q?=E8=A3=81=E5=AE=9A=E8=90=BD=E4=BD=8D(wall=5Fband=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=20(0,220,1280,200)=E3=80=81schema=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=8E=E6=B3=A8=E9=87=8A=E5=90=8C=E6=AD=A5);=20?= =?UTF-8?q?=E5=9B=B4=E5=A2=99=E4=BB=B6=E6=8D=A2=E4=BB=A3=201280=C3=97164(?= =?UTF-8?q?=E6=9F=B1=E5=B0=96=E8=A1=A5=E5=85=A8+=E5=A2=99=E8=84=9A?= =?UTF-8?q?=E5=85=A5=E5=9C=9F=E7=BC=BA=E5=8F=A3,=2012=20=E8=89=B2=E9=9B=B6?= =?UTF-8?q?=E6=96=B0=E5=A2=9E);=20=E5=8D=95=E6=B5=8B=E8=BF=BD=E5=8A=A0=205?= =?UTF-8?q?=20=E6=9D=A1=E9=92=89=E5=80=BC=E6=96=AD=E8=A8=80(=E5=9B=B4?= =?UTF-8?q?=E5=A2=99/=E9=97=A8=E6=89=87/=E5=91=8A=E7=A4=BA=E6=9D=BF/?= =?UTF-8?q?=E5=9B=B4=E5=A2=99=E5=B8=A6/=E5=85=AD=E4=BB=B6=E8=90=BD?= =?UTF-8?q?=E4=BD=8D)+oracle=20=E8=A1=8C=E9=94=9A;=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=90=8C=E6=AD=A5=20camp-scene-prompts=20v1.?= =?UTF-8?q?9(=C2=A72.2/=C2=A72.3/=C2=A73/=C2=A75=20=E7=AC=AC12=E6=9D=A1)?= =?UTF-8?q?=E3=80=81art-bible=20v3.48=20=C2=A76.2(=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9F=A9=E5=BD=A2+=E5=85=A5=E5=9C=9F=E7=BA=BF)=E3=80=81camp.md?= =?UTF-8?q?=20=E7=AC=AC29=E8=A1=8C;=20=E9=9C=80=E6=B1=82=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E6=88=90=E7=AB=8B(=E4=B8=A4=E8=BD=AE=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E5=A4=8D=E6=A0=B8=2024=20=E5=8F=91=E7=8E=B0=E5=85=A8=E5=A4=84?= =?UTF-8?q?=E7=BD=AE,=20=E5=A4=8D=E6=A0=B8=E8=AE=B0=E5=BD=95=E5=9C=A8?= =?UTF-8?q?=E5=8D=A1=E5=86=85);=20=E5=BE=85=E5=8A=9E=E6=9D=A1=E7=9B=AE?= =?UTF-8?q?=E6=8E=A8=E8=BF=9B=20=E7=BE=8E=E6=9C=AF=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=B7=B2=E9=97=AD=E5=90=88+=E5=B7=B2=E5=86=99=E5=8D=A1?= =?UTF-8?q?=E3=80=82=E5=87=AD=E6=8D=AE:=20=E8=90=A5=E5=9C=B0=E5=8D=95?= =?UTF-8?q?=E6=B5=8B=20exit=3D0(V14=20=E5=85=A8=E7=BB=BF=E5=90=AB=E6=96=B0?= =?UTF-8?q?=E9=92=89=E5=80=BC)=E3=80=81=E5=86=92=E7=83=9F=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=20PASS(15=20=E9=A1=B9=200=20=E5=A4=B1=E8=B4=A5)?= =?UTF-8?q?=E3=80=81=E8=89=B2=E6=9D=BF=E9=97=B8=E5=9B=B4=E5=A2=99=2012=20?= =?UTF-8?q?=E8=89=B2=E9=9B=B6=E6=96=B0=E5=A2=9E=E3=80=81path=5Fcheck=200?= =?UTF-8?q?=E3=80=81=E6=B5=81=E6=B0=B4=E7=BA=BF=E9=97=B8=20PASS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design/art/art-bible.md | 7 +- design/art/camp-scene-prompts.md | 25 ++-- design/ux/camp.md | 2 +- game/assets/art/scene/scene_camp_wall.png | Bin 15613 -> 47192 bytes game/data/schemas/camp_scene_layout_table.gd | 2 +- game/data/tables/camp_scene_layout.tres | 34 ++--- .../animation_frame_spec_test.gd.uid | 1 + .../presentation/camp_scene_layout_test.gd | 28 +++- .../palette_token_pairwise_test.gd.uid | 1 + .../需求卡片-营地场景重排接线-2026-11-07.md | 135 ++++++++++++++++++ 待办清单.md | 9 ++ 11 files changed, 209 insertions(+), 35 deletions(-) create mode 100644 game/tests/unit/presentation/animation_frame_spec_test.gd.uid create mode 100644 game/tests/unit/presentation/palette_token_pairwise_test.gd.uid create mode 100644 reports/需求卡片-营地场景重排接线-2026-11-07.md diff --git a/design/art/art-bible.md b/design/art/art-bible.md index 3de1fe18..d717debe 100644 --- a/design/art/art-bible.md +++ b/design/art/art-bible.md @@ -1,6 +1,6 @@ # 美术圣经(Art Bible)— Dungeon Sweeper -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.47,历次修订明细见 git 提交史 +> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.48,历次修订明细见 git 提交史 > > **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。 > 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。 @@ -392,13 +392,14 @@ - **情绪与色域**:承载 §2.8——全作最暖:烛光黄 `#F6C667` × 木色 `#8A5A34`(§7.2),中等饱和,无棋盘式高对比。 - **场景构成**:一张可点击的营地场景图(1280×800,与工程档同幅面)。远景=天空与远山;中景=**独立成层的木围墙**(密排竖木桩、桩顶削尖、不透缝无横木)与**半开的营地大门**;近景=中央篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板。**中景带自底部往上约 2/3 处起**;**近景物件可覆盖围墙,唯一例外=中间门洞必须留空、不被任何物件遮挡**。七个可点物件的功能绑定归 `camp.md`,本节只定画法。 - **图层拆分(10 张)**:场景按「远景/中景/近景要素各自成层」拆——`scene_camp_bg` 背景层(z0,不透明全幅)=天空+远山+整片地面+门洞内一条通向远处的小路;`scene_camp_wall` 围墙层(z1,透明底)=横贯全宽密排木桩墙(左右两段)+两根略高的门柱,**门洞处留透明缺口**透出背景层的小路;`scene_camp_board` 布告板(z2)、`scene_camp_gate` 门扇(z3)、`scene_camp_dummy` 木桩/`scene_camp_forge` 锻炉/`scene_camp_tent` 帐篷(z4)、`scene_camp_chest` 宝箱/`scene_camp_notebook` 笔记本(z5)、`scene_camp_campfire` 篝火(z6,最前)=八个物件层,各透明底单件一张。**帐篷**为承载件、不可点。围墙独立成层的好处:桩高可单独锁死、门洞做透明缺口、背景层不混入暖木色。提示词与坐标 = `camp-scene-prompts.md`,消费常量 = `asset-path-map`。 -- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序)。背景层由**远景片 `bg_far`(2560×734)与地面片 `bg_floor`(2560×866)两片出图、按 y734 拼成一张**——整张一次出图时模型把远山挤到画面下半部,被围墙挡住后完全消失(实测三张里两张山体上缘落在墙顶以下)。接缝整条落在围墙背后,画面无接缝。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条裁,不做全幅(全幅约 3.9 MB 显存,细条约 0.35 MB);**实装落盘矩形 `(0, 203, 1280, 164)`、底锚 y367**(桩身 150px、门柱 164px 终稿锁定值,落带内〔围墙带 (0,203,1280,164)〕)。 +- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序)。背景层由**远景片 `bg_far`(2560×734)与地面片 `bg_floor`(2560×866)两片出图、按 y734 拼成一张**——整张一次出图时模型把远山挤到画面下半部,被围墙挡住后完全消失(实测三张里两张山体上缘落在墙顶以下)。接缝整条落在围墙背后,画面无接缝。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条裁,不做全幅(全幅约 3.9 MB 显存,细条约 0.35 MB);**实装落盘矩形 `(0, 220, 1280, 200)`、底锚 y420**(2026-11-07 用户裁:墙高 200、顶 y220;素材 1280×164 按 200 高显示拉伸,桩身/门柱比例随缩放;围墙带 (0,220,1280,200))。 +- **墙脚入土线(2026-11-07 用户裁)**:围墙不与地面以直线相接——墙底按 1–7px 低频起伏裁成透明缺口,透出背景层地面纹理,读作桩子插入土中。像素级判据:墙底不存在贯通全宽的直线边界,缺口透出的像素与背景层同列地面纹理同源。参考图指针=[camp-scene-prompts](camp-scene-prompts.md) §5 第 12 条。验收:目检〈墙底无贯通直线、桩脚有入土感〉 - **色彩与氛围依据**:营地的暖由晒白的地面、木色物件与烛光黄承载,安全温馨,与冒险中的地下城形成对比;远景=正午强日照——天空淡晴蓝(高明度低饱和的清蓝)、远山一整片连续的淡蓝灰山体(禁层叠轮廓带与阴影台阶)、草地与土路晒白,整体淡而退后,近景暖调为主。现行口径 = 本文件 §2.8「全作最暖」(管菜单容器与元进度,不约束背景天空)与本节「情绪与色域」条。本节不复述色值;新增环境色按 §4.1 场景环境子板条款登记(背景层自板 ≤32 色、营地屏双板制并集 ≤64,过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门)。 - **背景层环境色与自板(2026-11-07 录入登记)**:背景层单张走自板 ≤32 色,环境色五族=淡晴蓝天空、淡蓝灰一整片远山、晒白浅黄绿草地、暖米白土路、泛白米黄营地地面;新增色过 §4.1 两道门,近色走换色合并(本次 4 对:九件板 `#D7B281`→`#D1B27F`;全局色板基线 `#B3C8D3`→`#BAC1D2`、`#DCEDF5`→`#D8ECF0`、`#E7E5D2`→`#EBE8CE`)。像素级判据:机检〈单张像素域唯一色 ≤32;palette_check 对九件主色板基线与全局色板基线(`game/tests/golden/palette_baseline/`)均零近色红〉;目检判读句=[camp-scene-prompts](camp-scene-prompts.md) §4 远景片两条(淡晴蓝/一整片山体)。参考图指针=[asset-path-map](asset-path-map.md) §3 scene/ 行(`scene_camp_bg`)。验收:机检〈单张 ≤32 且 palette_check 零红〉+目检〈天空淡蓝不深饱和、山体一整片无层叠带〉 - **交互四态(零新素材,全部程序化)**:悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附);按下=位移 1px;**禁用/未解锁=降明度 + 去饱和**(§2 已缩窄至情绪域,状态表达不受限),**仅锻炉(锻造工坊)与宝箱(秘宝匣)两件会有此态**;已解锁=常态。 - **钥石余额**:常驻画面顶部的一行小 HUD 栏(高 48px,**浮层覆盖,不挤压画面**)。栏体底=`CAMP_HEADER_BAND` `#6E4526`(§7.2 五 token 对齐表在册色)× 不透明度 0.80;栏内只钥石徽章一件、右位顶格,左位不放件。呈现定值的唯一事实源=[camp](../ux/camp.md) §顶栏,本节不复述判据。验收:目检〈顶栏成一条可辨窄带,徽章落在带内〉 - **事实源边界**:解锁条件/价格/存档写入归元进度 GDD 与 `MetaProgression`;素材命名与路径归 `asset-path-map`;清单登记归 `art-assets-checklist` §3.5。 -- **已裁(2026-11-01 用户裁)**:① **营地环境子板色值**——不前置拍板:量化场景实际用色后按 §4.1 场景环境子板条款登记(背景层自板 ≤32 色、营地屏双板制并集 ≤64,过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门);② **门扇与门洞的高宽比例**——门扇贴图 240×138(锁定 240×147),随门洞 y283–367 压扁重画,坐标按门洞 x520–760 对齐;③ **帐篷的落地尺寸**——251×170 落位 (982, 335),上端遮住围墙下部。 +- **已裁(2026-11-01 用户裁)**:① **营地环境子板色值**——不前置拍板:量化场景实际用色后按 §4.1 场景环境子板条款登记(背景层自板 ≤32 色、营地屏双板制并集 ≤64,过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门);② **门扇与门洞的高宽比例**——显示矩形 240×147(贴图可见高 138),门扇件沿用 240×211 由运行时压扁(2026-11-07 用户裁「不动美术素材」),坐标按门洞 x520–760 对齐、底压墙底 y420;③ **帐篷的落地尺寸**——251×170 落位 (982, 335),上端遮住围墙下部。 ### 6.3 三关图类型色板候选(board_type 换挡方向) diff --git a/design/art/camp-scene-prompts.md b/design/art/camp-scene-prompts.md index ca9a8b1b..9510c8aa 100644 --- a/design/art/camp-scene-prompts.md +++ b/design/art/camp-scene-prompts.md @@ -1,4 +1,4 @@ -# 营地场景 · 分层生图提示词卡 v1.8 +# 营地场景 · 分层生图提示词卡 v1.9 > **性质**:营地场景图(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 为准。 @@ -85,11 +85,11 @@ Pixel art style. True pixel art game ground texture, chunky square pixels, stric 2. 按 y367 上下拼接成 1280×800 3. 量化到背景层自板(≤32 色;营地屏双板制、屏并集 ≤64,见 art-bible §4.1 营地行) 4. 需要 2× 档时整数倍放大到 2560×1600 -5. 接缝不做过渡处理——它整条落在围墙(203–367)背后 +5. 接缝不做过渡处理——它整条落在围墙(220–420)背后 ### 2.2 围墙层(`scene_camp_wall`,不可点,透明底) -**出图画布**:2560×1600(与背景层同画布,门洞 x 坐标直接对齐);墙横贯画在出图 y406–734 这条带内(桩身 y434–734,门柱 y406–734),其余为纯色底 `#F2F2F2`。落盘由 S4 后处理裁成终稿外接矩形 `(0, 203, 1280, 164)` / 出图 `(0, 406, 2560, 328)` 的细条,**不做全幅 1280×800 落盘**(全幅约 3.9 MB 显存,细条约 0.35 MB)。 +**出图画布**:2560×1600(与背景层同画布,门洞 x 坐标直接对齐);墙横贯画在出图 y406–734 这条带内(桩身 y434–734,门柱 y406–734),其余为纯色底 `#F2F2F2`。落盘由 S4 后处理裁成素材细条 `1280×164`(出图 `(0, 406, 2560, 328)`),**不做全幅 1280×800 落盘**(全幅约 3.9 MB 显存,细条约 0.35 MB);**显示矩形 `(0, 220, 1280, 200)`(2026-11-07 裁,运行时按 200 高拉伸)**。 **画什么**:横贯全宽的密排竖木桩墙(左右两段,桩身终稿 150 高)+ 两根略高的门柱(终稿 164 高),门洞处完全透明 **不画什么**:天空、远山、地面、小路、门扇、七个物件、角色;门洞内不画任何东西,透出背景层的小路 @@ -104,14 +104,14 @@ Pixel art style. True pixel art game layer drawn with chunky square pixels, stri | 顶栏 HUD 保留带 | y ≤ 48 | **y ≤ 96**(保持空旷) | | 远景片 `bg_far` | y 0–367(高 367) | y 0–734(高 734,3.5:1) | | 地面片 `bg_floor` | y 367–800(高 433) | y 734–1600(高 866,3:1) | -| 两片接缝 | **y 367**(落在围墙 203–367 背后) | **y 734**(落在围墙 406–734 背后) | +| 两片接缝 | **y 367**(落在围墙 220–420 背后) | **y 734**(落在围墙 406–734 背后) | | 地平线(山脚/草地起点) | y 与两片接缝重合,墙背后不可见 | 同左 | | 远山带 | y 51–202(画面 14%–55%,山体 41%) | y 103–403 | | 草地带 | y 202–367 | y 403–734 | -| 围墙层外接矩形 | y 203–367(高 164) | y 406–734(高 328) | -| 围墙带(wall 层桩身) | y 217–367(**高 150px**) | y 434–734(**高 300px**) | -| 门柱(wall 层,略高) | y 203–367(高 164);x 500–520 / 760–780 | y 406–734;x 1000–1040 / 1520–1560 | -| 门洞(wall 层透明缺口) | y 283–367(高 84);x 520–760 | y 566–734(高 168);x 1040–1520 | +| 围墙层外接矩形 | y 220–420(高 200,2026-11-07 裁) | y 406–734(高 328,素材画布不变) | +| 围墙带(wall 层桩身) | 素材桩身 150 按 200/164 显示拉伸(显示约高 183) | y 434–734(**高 300px**) | +| 门柱(wall 层,略高) | 显示 y 220–420(高 200);x 500–520 / 760–780 | y 406–734;x 1000–1040 / 1520–1560 | +| 门洞(wall 层透明缺口) | 墙件缺口全高 y 220–420;门扇可见 y 282–420(高 138);x 520–760 | y 566–734(高 168);x 1040–1520 | | 门洞内小路(画在远景片草地内) | x 520–760 穿门洞,自接缝 y367 向上收窄,到山脚 y202 消失 | x 1040–1520,自 y734 向上收窄,到 y403 消失 | --- @@ -147,7 +147,7 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain | 笔记本 | 5 | 100×80 | 200×160 | §3.7 | | 篝火 | 6 | 160×160 | 320×320 | §3.8 | -**落位尺寸(2026-11-05 用户裁地平线 y367 重排后)**:布告板 130×121/门扇 240×138/木桩 120×180/锻炉 240×193/帐篷 251×170/宝箱 106×90/笔记本 100×66/篝火 160×149——贴图锚定=底中心(帐篷/锻炉/宝箱/篝火/笔记本)+顶锚(门扇悬挂/布告板挂墙);命中矩形按锁定值。八件只改落位,门扇另随门洞压扁重画(原 240×211 → 240×138),其余七件沿用现有终稿。 +**落位尺寸(2026-11-05 用户裁地平线 y367 重排后)**:布告板 130×121/门扇 240×138/木桩 120×180/锻炉 240×193/帐篷 251×170/宝箱 106×90/笔记本 100×66/篝火 160×149——贴图锚定=底中心(帐篷/锻炉/宝箱/篝火/笔记本)+顶锚(门扇悬挂/布告板挂墙);命中矩形按锁定值。八件只改落位,门扇另随门洞压扁重画(原 240×211 → 240×138),其余七件沿用现有终稿。**2026-11-07 追加**:布告板 `(845, 241)`、门扇 `(520, 282)`、围墙显示矩形与墙脚入土见 §5 第 12 条。 **3.1 布告板(→ 图鉴)** ``` @@ -213,7 +213,7 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm - 目检:细节由大像素块构成、块尺寸与远景片同一档,读作拖拽脚印/碎石/踩踏斑块;禁 1–2px 碎点噪声、禁迷彩式闭合斑块 **整图(两片拼接后)** -- 接缝 y367 落在围墙 203–367 背后,**画面里看不见接缝** +- 接缝 y367 落在围墙 220–420 背后,**画面里看不见接缝** - 单张 ≤32 色(量化后) - 全幅无任何独立物件/图标/徽章/标记 @@ -238,12 +238,13 @@ A campfire made of a ring of grey stones around crossed stacked logs with a warm 1. **地平线与整体分带**:地平线定在终稿 y367(出图 y734);地面 433px、可见远景 217px(27%);围墙、门、布告板随之上调 2. **围墙高度**:桩身 150(出图 300)、门柱 164(出图 328)、门洞 84(出图 168);墙高须大于门洞高 -3. **门扇尺寸**:贴图 240×138(锁定 240×147),随门洞压扁重画,坐标按门洞 x520–760 对齐 +3. **门扇尺寸**:显示矩形 240×147(贴图可见高 138),门扇件沿用现 240×211 由运行时压扁(2026-11-07 用户裁「不动美术素材」),x 对齐门洞 520–760、底压墙底 → (520, 282) 4. **帐篷**:251×170 沿用现终稿,落位 (982, 335),遮住墙下部 32px(覆盖围墙可接受) 5. **笔记本**:随帐篷跟随,落在帐篷左下方外侧、两者不重叠——`x = 帐篷 x − 112`、`y = 帐篷底 + 10` 6. **宝箱离底**:贴图底 y744,距画面底 56px;其余物件同步上移 46px 7. **地面分两区**:营地外(y734 以上)=晒白的浅黄绿草地+一条向远山收窄的暖米白土路;营地内(y734 至画面底)=正午太阳下晒到泛白的踩实米黄土地、与草地异色相、无草无路无车辙;两区分界被围墙层完全遮住 8. **背景层分两片出图**:远景片 `bg_far`(2560×734,天空 14%/远山 41%/草地 45%+小路)+ 地面片 `bg_floor`(2560×866 踩实裸土),后处理按 y734 拼成一张 2560×1600;接缝落在围墙 406–734 背后。分片理由=整张出图时模型把山挤到画面下半部,实测三张里两张山体整段被围墙遮没 -9. **布告板位置**:(845, 224, 130, 140),底 345 落在墙内,不再悬空 +9. **布告板位置**:(845, 241, 130, 121)(2026-11-07 随墙顶),底 362 落在墙内(墙 220–420);命中 130×140 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) diff --git a/design/ux/camp.md b/design/ux/camp.md index f9aaf9c5..d24c07ff 100644 --- a/design/ux/camp.md +++ b/design/ux/camp.md @@ -26,7 +26,7 @@ **场景按要素分层(10 张)**:远景天空/远山/整片地面/门洞内的小路合成 `scene_camp_bg` 背景层(z0,不透明全幅);中景木围墙独立成 `scene_camp_wall` 围墙层(z1,透明底,门洞处留透明缺口);其余八个物件层各一张、由上往下叠。门洞是围墙层的透明缺口,透出背景层画的**一条通向远处的小路**,不可填死。 -**地平线在终稿 y367**(自画面底部往上约 46%),其上是天空与远山、其下整片地面;**中景围墙带 y203–367**,桩身 150、门柱 164;近景物件允许压住围墙(围墙不可点,z 序在近景物件之下),**唯一例外=中间门洞必须留空、不被任何物件遮挡**。围墙形态、门扇比例与帐篷尺寸的现行口径归 [art-bible](../art/art-bible.md) §6.2,本 spec 不再复述。 +**地平线在终稿 y367**(自画面底部往上约 46%),其上是天空与远山、其下整片地面;**中景围墙带 y220–420(高 200)**,素材 1280×164 按 200 高显示拉伸(桩身/门柱比例随缩放);**墙脚压入地面纹理(入土线,2026-11-07)**;近景物件允许压住围墙(围墙不可点,z 序在近景物件之下),**唯一例外=中间门洞必须留空、不被任何物件遮挡**。围墙形态、门扇比例与帐篷尺寸的现行口径归 [art-bible](../art/art-bible.md) §6.2,本 spec 不再复述。 坐标草案与分层验收判据见 [camp-scene-prompts](../art/camp-scene-prompts.md) §2.3/§4(10 张口径现行事实源);2026-10-22 美术方案讨论沿革查 git 提交史。 diff --git a/game/assets/art/scene/scene_camp_wall.png b/game/assets/art/scene/scene_camp_wall.png index 0fff6eba40f78e4db40201e268a2ea36f22171dd..e2be3dbdb97135fb5c8378dd8a31ab37637c8d89 100644 GIT binary patch literal 47192 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 PU>_Zg=jt`8HWB{^5?U$W literal 15613 zcmXYYcRZW#_kIYXlvu4TC`GMmQ8PiP)uMEuidNOCy=UxEwMuE#imi5SMYL8+NsOYY zSu3$etcc|2{rUdRAI~eVSDqx#eeRt5oO4~*NiZ?eWn$oA0000?`g+=?008a9OMo0b z-NiMANMjBFsP*b=Yd#Ff*$QQ7X(@aA!6Jkq?E0wx9VNTeL66ZnVe#pD8J-t#-K$ zfWgnEYp}Z?&h9>&lI}dsIZl>2nQ-{Zc}}|h)uk)cfim|Kty+K9o!{kJv7vHudG`|P zj=a2-;N0O3Wec}&SeqTR)nS}F&rgo-c|6=MFw}6plIMT+R;io#?f-u3{5L+%sJ_A4 z*YCIs1$BSUgeyu3mLPHQd-oEzQ|3>;kekfH{Ji~p7ePyBMTaS&uUig4FkJJq)8Bs- zn~_K%Zr#^v#lh&OMqAq_5_MUx$VGqHYZ8T zM6&xy?!TU$5GVhWv`=4ULss8#H`O7LNSbDWhE1Bk9rl6M2+GmlcJDb11W?7(u{RY~ zbM{r%ZO59NQ062l)AxNHZQ+U?*2aygeom}1G9nueG?KHp-fiMOXDv? zAEqHtp_7SUnNorr*(6$iXskgf{GLhu$3Mtw0MWuPTEZo$}X8gqV-%-`Vb1^>@_?v0v;Uo80xJYi8D ziF`hq8x~$ImOH9S60E+Q6UL>}@HX@DmioS zR!`ZqHXecQ9Io(BLSN1MTek21E5e^KT^OwkU`!admUou6ot{tBrLWzYS3SZH7|-&V z7j4tcS<$2N4?j2PdbliJf;ClqJ?P?}ZA0wWxNS@peV((5CmgFCRa~o5h$KxFrtoqn z86jD3bW`l7X2wF7Bq4DeaV1S)*iEeW!qPju3$Ivp3@r)LxmUOSBPs5f1c!y}H9$7; zOAa^Qo=11}!X|mM(VwDDlXE+7DU%)VlY_e(j8#_% ztRw0LDWsGK8BpZx0bTMt6lr1Lx;G-^v$gBiL0bxe3PY!b80+UC3YDZaFOm{#_|M~7 z$X}s_0Q>H~tep7+N)ZV4drM{EPt#-=`tQ-!Jbx$YxBE8U><^<0giPL^6XSdz+ChmR zyC63B)4N)#P+G3IQ`BlOjORR&v#U^bC0fkbt)`PitnB`Ww$StwZ9->6-8el`#`wtN6^r!+icn=V&Vh6jANWDW%d5-PRDAa z=n&J6Zgm?i(fLJO_<010G`TT?o7tDwm@<9eo*wK!uf|jMMRqYlbRV&QV5H64A^Dqb?oI}xL;UjVn*}M} zvQu>To2XEG?^9$o=O+q{u^1#%>){8n!zJ`-ZTY}`pF2uFxU!URYXXC#gDOhR&l8Sd zE0DR`QM#Ie@1&?UFo5`$vVO4Rc#HC!oMdm)bSn1K`mHnM0Od1%ZUYHi*&buMW93j2 zNBD@gnG+g^HJmQYnM8^wxX&HxftucF(D$7EZFz=)@sfvfX<8R^!>}Jazf+?@&q1G* zFm&BN1$d$`ivL)|H6dYdjbK~9$nK6no;Mz!>BFge>*%Q-vaF4jMI|#b14bp{qw-rz zqLLh~NUgk*w@>^gg?sCD%jU6BlZObn<;?Q!l%Vpn1JoHT9fdf2BwJ!&a*1fh%Urr5 zbR^)RcYK`R;qmWnRE*N&F@w>3`j7=kQIrT7=}Os60N;~%E{ZD}r*+yTQ+iTDOWZjD zG>gxV5uNcY+QjnLf=uG=ol66t!^Xumg!+#6d2q}8+4=Tl@J_bUHN#N^`b>uF8yCg2BFhal*KphB3rW*!aSNkl>8Y~`tr`EVLWf`*PuRsH_~bod+xdP z4zY9l7pDMZ;tz%y>BoX28pB@aN6~Dt;0$k$$aF1-gh)OG)AsDw3{XOB{<1`z?T#hy z9ETTcZ(6Oh{@_Z>s?n9r>$=!kgdkm#^*DXlcpEvDMq?Rkgyk& zo?r?-6cN4O*n3jz(XLNgf>JB(n5`Xu0aM=+2;DXF8bI^{5#>zLQ1NwO+wzx0C)5=@ z<5{T5qulyA^{*USmwn#sfg2Z_w)~;ZXNf7+ zHy05hH|$n(F*`Bp)Onmwg8?Sr_XGhN8G^Fs)<@kx8H|5U5CyDtiP|jfcb*r6M;RvM zqRt`zD4$x+0|vP-xyZhUs_)jlh5hO@CY@jDWV&7(+>n`e zk&8fyH=(!?96L zT{#3`A{M*1qpQ6L@`KxqG96+6)PSKw-l?%_V?8_>e>a$CS$qM7J(1g^*#ehIB&@7k zZbw{bJdBlvgDP1Iu~)h`2rHv;oRU{JI@=y@*;a6(12C7AMN9K(J& zIJ3ZGCo&I*URI}Bl#3ONC#lql&N->p{0V!y!=goQd3O3p$>-N3P*WCA2Kn8SdYwGN zKl)la5O?gtum#xOojh41P%WEG--G1TfLsIp;v&Sxuz4D0&e7?F_^) zT`JBD679de6S!#>LDoL9m5BPlWH4o&%zqb%a9l9_L5U(fXfEWBB?XgYv%$g>lnf}b zy5oxjFfEkOO_ke)?7SQbp!c9dZBHTUQPG2j5Fp4y068wJ4H2XfNg&rsfCPh70^hJj zb5UELSEBLobvOWYIfU-A=d>-Acn5&1RKk}={W<)a!1yo0USiH2DMn$n;ojzjpV!q_ zqW_`vY*en$kLs3*jSWESc2l;f;LJVWJq5cXluBh~v^ZKx8MH#9WgX+FG-zy`u0tn5$!|rVj~$HMwyjdg({Kd z&L6D1V+F93)+7CwR;h?}LSGYDX{lu3{%HD3Kv(nm>e=$?dm?~g%Ja2TX-CY+W*X+17#TU-RbOs{t!x7L? z2h1sGy4}e_776IIpV}HC3JYlOPMFFdaCvn7Z12^}Tg+w!i{bhN{RH+${^6IY7Lrr} zX*Oyda(4kWdJVt=nba2`jQj&O{^pkn^2L5193au5G{h*ZrWBlh@U%)iMTmRugEL)F z-K!7-l3|e2aH{Fa6TF$a65Y+%Z>%xr%-&9C!}CDhDxQzpU<1!J;yCW0uUNcc94M30LBkS^SD)eCfZVr98UCyay*IIWP{L~frwQ>sEaP`=%I*0=HR#N8jfrj{icRFA_J;~nIj*qyuF%4QD5r5O_QmlLA3s3e71Lr zB7E2P6M-P`-3dgE5%N@-Hr|T}Xx~XK$0gkMz|ZYiW7l4z{#C&~yl$so4@l7TzU*Q5 zR`>dY9$v3?d@(R$XhX)SDM3V+zJpFI(T5G7H=8D4+nP(3bnw-HP;Dt4^Vgc>x*@~5 z(Hhyb(fwl%)X>nMYkNLTYY_NQMV$^&XijVEo1ce+2;iDsDp?^bv|jb_mp|yV%;>5S z{Au(LSjqjKCAoImt7>lVe8|Z0J6E0{wy|E!S5;4Lf{@o=PR)rg~o z%n7x~xwp25)?)j-zGC|R>CAWq5AK97DeK!T_xDQYDJkhue3)l~S}U7(&i%@i0Zq4< zZF36m=>*f{fet$rmYzgiM=8VTLyl_m&zrYbYC~4ut!nq7yVj)3-h|pK+|>lfaNGy1 z|G5X=TBE=3Swa|PrsqCKHW%Dx#skCqMYEpGObu)CntZOU8ci83b}b4`QMvhPC>?vm zvNf;;Snq8fqcKsZIrem3V^MF-4}J(PJxEzcvQaDr0n;{O=QEzO%81>BD=wD^@&1UD z+HPjci=wZhmRpY>+_7V(0gg_C9!c^BYZybqkO#(NMOAhY`5*|5ifJn1A7RHy>)hh5?mwT{V? zsqlOq;zJPSFC**@H^uX_+YYeM$Uh@gD5yUC=E-R?>}~uieo`=I_MX&FR{RI1OT`j|2$ZbfAMGB<_#lA z&kMX(1}^Fy?cj4Ky?&*!TJ>W9j&;p|J|7_)e27{VZ98ddsj@k{A$iw2Q3e3#wFit%PPUBn2q-CbDYXy!}s zvj?Y41fddU&7wgn9GA9lCM?MuLl*cj1j(jv8-@ScKGwdV-$>F|)096a)eI2E8w>JyhRiN)?{<>IQ1H@_%>rScaGk zfg(uWu*)5wFW_srE@;#tHDw0>bcn9B;0q`OAbM^y!)k~>X4W{N6@y5JGj|V9s7MH{ z+r2q4Uo0r|Xf&7LC$JDdeSMp({2GYKc+&<9-A=np%!uu zs)#$V#zvB|Fujn*9J00723gAgKE^yp0neT1UXqnK2ZsY$6CcoeL-4jtA`%Q*>j;{$ zvL%O)6s0>J=MVmXx|PchVc|C4HCOxxc`$_<0Te@T%sRlTch80S0>U~+Q|aY~TjfQ~ z`Ju<2r=v}Jk7U9hLa7$s&%YyI#eUU1LRS6q1ejU_0=`k{ewGp5>)8UR(MbQ!GUe?E zqHm#<3g+gSPmN_riwijT5(5Rm(1))AhW~w_5|an`%1Tm%c&97l4E=6~kMyyGCY#Tj z&GNaj+$$^d{_|N^uMXSoGxtDUMElbj;3Q;^fO;9_4WTK6jA=RrYqJ94Pq%CfjL-PHSL%F85}`?mJYSJRb*OF;LQ5m=xCT)R zjvOy@Jsv?MH8-am{RRZe(|}k8bcUI}UNM==qEVslDS{Isw!bV==Uz>=HHUv#Nu~!o z220;%SAWi=E=jXZ+Qsa+bt2Z$_g-l@qk;bWd}ZzeqQd zpe)kEi#JXQ#p8jIx?OBqYg}%|4 zyYG^s>1EZ6GX&_Y51uh6)Tn!KP=`<5|CBkvWNU$FWNNIfvNMLsqMCyt{I9efNwNp^ z=+?T%sKK@_irChl0d|;Yp-VWLy#S1EGtJsC^KxI`sZhR_LUsSn!h8v7AP|C1`oZ^} z2x~MBANzaYo&!_@ogTyY%V@45NdH3rU@&#l8iA4fwuKFmi$UFkLt2^jU%AvXB(3iJ z5p&soibMqB#?ecQCCh-#W1*|G@`37r!MJkDyQ#-Vc3HpkO>GPc&WE<>8T7%61t3oi zM81rY>yF2#f_cPUm#@CMHNJcC=f+Gn?PW4qwU|?zQdr(!EtXhNh%ERp_?L_U?Ua~; z`itRfu(^RdGna#Qwy$_wJT)9sTL9JZP$s^?ZHf?O(+fGxL(C>qFI$-`0b1_Bl>CGd zX*tZo0H`{kb_(^Dz#1|#-X;I%+r*#SnZRtm<&FW3)2zwI6aoA}Mtv4vsU=00Vzk<| zt2P8}midnICwu0dp2RKJ^ux-~_RL{M>+Y`P>UzcN%QJ;cg|M=OzW~B6q$HnOjcSnq zXExqeFLhl6K-&Zh*z<*Z<6icz?D7LutQ3~gnl-)j^tI-JID`OI#prQ2Rsc#?GFG~u z$llg_*BI};Oz{0oWjqB?E6TWKr}=t#__isSN8Dh~jsK2SoDyghpW-UPe z;dw%As-lb)v))#n%II;{-UXOyu3j*51Mi#2w;1bv&p+$sjgHm#O>*jDIut79&v-i| zbU)-ejT3l(&~q+jaskLpRR7F4u$oLmdaHOx{?k40=xAI3q3#3I%a{pSQCt46eA#kh zH@}b7R;b(rQx_hHJV~i1B{TIey{%+kn0oIdb!8H@8j~Jl=-g67K zyd!;TL9u^z*G0Ns7%90PTuQ37@A=}UbX70(ehfFg2AO-PLQHqqlgSk-uz3B_*^GFe zsX^fDXWu^P(*I&)nmu0b$%#OSOE~+x+4!g9J14pnohP(hOm*-LD`29+m<-?Qc zF=KTj$6+y3gR!DkO(TEs%}KXr#K^+k-`1jrjqr{MUa4lX?()r1MtR9i>k~o6&rXgA6j( zP#&IwB#f2v7a%*w7yi&w{e3!r5!ou=WUD_kC09^wpe*b^te6Ce>(c$$H(7VPVTwin zWeuWh8uI$P{n4;u=|vOVk-_oDYQ|f4*{abpQL1y6#OTId?KAo_DxXqQFXSX~3B--` zvZt>s@}~dzATidS>FJvNrDyLPko)EE5GLmE-Ta9z9>3x2c<&k-irPQf>xm`g#pWR% z^OO2v^zCo9i+XgeQ=c|ZrLMG3Vyw27%O;k8T$%3R=lXdy*v;|Z(+8?CZ*6>Qa=VuW z{oXviLCBAcqf7=gb4ogIX%l1I!(;{+Ppgj9rD+=pCr=~1G%7W5_+S#>jomqMJpBwV2T+ z_Pb9q!P3I~9R>bXO*onbtpJoTIQD&0dzbnU_%5&`UqEJr)UMavxv3&0{_YRULT+|3E z9ouL>XXtBO^+wN0_e(``j1cWK4?a^^MB)OE>|x|En4}!sr4lY~&$?<`%>Agw5jLSj z5|>`<2(_^kN@s>vb$k931r)E9Hugp7aHB3@QMweqe{>C3J5hQID}r9ne=bn*KlFlT zjNIMTs!XVk;GLVMVo1rYe>k~2EPyjbm?|CLo7F!fmw+8no(FD8q# z(l>}pbk{T58q_AKgJay;(D#)y!)g;0ZYL8i|FoS05!lSl7(8&#g^H~NS+aeQ5v6(7 zCm-3pES?4~j-ZjURF^c_g7UC*KIuK<#$9{*1}T2D#~93;d`qeW=5@6BT4(|$*npQm zf7)+H<%j3@_eR{mavA4%6ct$7qlM+klSi4`-nE#RsP7YWwekzl6cVdUQ(iFX-*Q!IS!>< zf2VgO&aO57_GZZ+dn~}j^;y)4XDmCDDDnHJT;fAN0al(dowyo%%fb50C7(As^Omk< zCfb&`U>C6E)cfyh6CY-H(-@UGz4m!B+FX&G+pYZJO=9YuL4Sp-IwLKxCr!NZ9r3x* zeZqh>>7>dGcD45I@#Cr~8e6KxFV$bxW->i%jEbLFd%tSYfU@&T6`fUIOZ`XOx^qZzY9#UnSMTg@&!eR8@Smo)!%uOHWah_*})N+Nn! z&^PI(jOh~{_wUUmUcMa zMait*{IV`skrf``!)LZUcEMU9-jUN@XpdztMP(Chm(70ai*lY+e~vn!X&@NCRdQ`A z7-W0zBxtM+CoLs9<^lJ`X}Ru(-vtD{LByKAi>vwbq=z*zSy1IDQ?A6oih1?tfu7$Dp$)!Zv%bJ&|BEXj!LQii>chb z-vBB8q{rXkl5#fVAN!53ithL`*jWC!5hqUvS3*=BRubtuwV30k|K;n@B$jHgy2V?b z#VKtyj;JTH<$4RnTbw>|TP)$ta$pX+Gc#sXm)h~Bq~NJ3>;>sttnX5@>kFn476Z4D z0P4GI;i9yi%fyy_YiAN?C}|a$XK+D=zX+dlTWKn?N^|&*4Ez}-)1L3RKi2@Wun%Ma zi<)Vey=-3%se0cPuTt;F=yqQZKOpLSWwk*2`sH({MH|UJc|(4xGogX24RpoD8A!`$ zL5SoD7S8?9j>%kxD&er&ULdwGx%22G)sBDN8$HY82*aR_FV_4ls;YMd1fPKIUS05g zR(;P+s99;hSgyQj_k|BtN2h4+wcXb)OkKaP+r~xfQqjBCRPfdgP&wqxmma!NT@QDm4yrFTvB?gJ&;IMF~;p9efl=^K}mm4W5JDnIE>E`#YX zWRvchg;%&Ep#(RR9TZsxQPTtqVSY@prFqN=7F*Q%3!FYJqRU%hW2u;gsGAJ#F%@g` z)p}|-tZAu);|-rC-TqV+j*k6OK55SL&Y3S*=KF&D+9Dx_Oeodd*DOqoKQPKoQ@Dyq zFq=R!D0xTR?u}eJ2rl$^sF!pvcU-~_cj-#a3ZUV&V3SO^=d3x@AuD|uQ|#TB{pOh+ zNnI_&=X-zuZ2M^sUooDe?o`Wl>fHV!s!i+87IiHLq?M%7*fTeimj5lknfq?vqO*;Z zQ+Ska*h-@vTualz&06BaoJiJ@T};IVI|H0|%6QPCIo}%j=i(>Xf*hIW<%oF>W}U)U zsVYa`Pad#n@?g(kceIuDkT;fOYeA9A=-1DUIikl(d3QMdi zSNO#o#}}ZnL4E|-_!cD^)Xwn&Z)y6IM!#&;wdPr7%p_H#hL`1JxIhz8Rm@2_wjWFtdpw`!w|{R5XBHsk+GsEN z#`m2}os>(1MgHiVX{>W@zh1MyBG1dUmS^9g&`t_X5;J7*u+fUIqTM)<-U;@g*^6MJ z!gt@$iM2E#v9W|tJjj#RaQa@R!Ke<_35(WRt-$OFu8Fw+NPpP1x4cT3x*R%X%l#>J z?_P{U(l~!oZJ^QOLEc;@VB~DVP-6zq%34yXNSTNqRNqT*N=s0NE4k)xSyO#=+uVw6Q`i+of&=54B%K>2a$$N$x-Lt7Q^ z#=9+VH${(h;O>fUik36JZ>JxvL>PQDZ!qY|J=EbF6QyrxrSdO_76hGi*g)a@#xruy zgc-#M{;mP9HJqUP;Y<}UQ<-m=y!S4$&WE}s=f%s!zaOVTi8K|c@`gVTftW7<5iRq$ zOK-~`f;%|X2)?WuNk2?=bW1+nl$PkGw+ex~li`>QBUmf@8x?BrwX`*1X5+mTE4{w_ z>aF}omc^je%CVnY?xOYazKkxCv!*aZUtI&Gz2YE~#K=G{lpiqo0;i7|+y8Qee1?zj zd>7O`QNlzu*~d(QomN2^mb^=-7)j!X4VR zH}OS?9-HoLp-39{d$LWn;$@9^{5F!V-iXQAeON)am@2LbJ`>nb&oHoSQ0es`E#~{P z7U#6?p-sr5#IeXM;Zy_e?*h6U1(}$12AipJ(O5ggMT)8YfQFY&XWXM|hO%!|2~s9c zZ6s&eaKS|6(N9!Ueg)s|Aj>AA+OODQq~(9m1ykMTvpR=}&Eovu1XdZ{lK2XwZQ3}z zh4DyWCQ*x?yPM!}$uYRSkA97rQ$p1I3(yl9W8mqLYxOU1j`_dByn)Z_pu2_&k2?dXG2a}*mRSTM4Y}l) zKB_{S8XXN_WppnFb9Db)AVRBo52IMfF-I&L*$2ClKfCxoCMpVUmx!7SeXCIcD1b0k zMbsVqX{NO)FYnhT^v1&;4e$I)-fHy+mzgFy2 z7vE`^IP>n!hqB1Q0~0)tVYRIbQ@81%qdM_jCfxwy7&?`R(ec32GFtwvI(zI0o0Ji@ zO6qRoys^gm^{w#o=10qGK!M(@a-kaKwqlf-OY2j&+hCnPF;KfS-b|Hcni zNl+rz+#_Jht%8`Isa$9FXTVvQBiclT@zw5dHnN#FgBL~V@hgYY1BuwO!~Rr)RtI7U2O7h4&QB;WT1 zX}-o>8~P6GClx5z>E_g968`ihRRw-Nk;bQ>Yp@v}vgYI&H(?MLE*)}I*p)g=HB_=~O)r0yZz1Dy&lBJoWJ+1vE!(q`po$6Q zebd^2-KcorSdVMh0rSuc^*)tSc@pJ!Vzw@Gxnfptd<&2va1~y4q=7rCu>2$_-Rcsf zo3?n!S(VD?ArL<*k(quU&ai1B<|t~WXF4umz#yk`ygTI^v%zgKu=_ncjp)uBS?zJ#uoGU|DFcdjw&8 zM*6WKH1N7JC-8~z$`faxuUell$$+M!_ZExGaHR>2aFS1kX`c5WvmQa>MRNc2M!g?K z`J)P@yrXOcYa-p1o2DVZL4;#`SNBAtWo$pkh=6RX*srJY+Qn8ei)%Pf7>^8p6#~7K zFz1ZPpnj@S{OLfzFoO9~=JfK2+^w|-$VTd1REgP(>N zfz$GD4HcOlpD(NL)b9ksidDY1N!6>t-+X_|53qQvxXZ@}JICmUM!Y zyD9sC^+F2U0L%hfpNjsLk`w|;?_Y8nxBO-uX22Pd^845R#G=eIumM~TEJbBVW66{) znzpo?@T|Z8nxNUF=_S<%-m7K1+if&GKxg*2fYL1602%LwX?|tDHc|TMu*W=%`pp4< zMfjJa3t0?Lg|)T-#CPByRwD`1HYM1gXfyJ@Ak7A8Nim*B!a3loO|bLU;B=HTQ~LlA zMiVMc%jFzDAzo0?gw!6Ezf`~G{0TZ?dTBVqeBPYTmg~{ArsqG}#75B%go`=)Kiou) z)V|YctfsA#c-9f$eVeWkrKV=mm*w8Ak>A|IMzndc*-1K3NJig#kXHwGzA=paJMYNr z9Cg)t?SMn}`)HcrC4mkg_uM5KWVoK^RiW5#QycN*cy@iU$LqcS1wb^ zXEL!uKkxC(N?)NIuk#WPCWmqY7+zO_J4g4B^jw1ox9jg{%5~gAuMS7+|Bmt8T!fJF zmbwkO5n=4Fac4K_2y848>yj6&V|2+?MVy-QkNa8gUwfc$tFxL;M6*PC|%z6qiAd1W1I;1!0x@y6f1pf>94s`qLM4*NsZ29fu6 z1VaW`)akQ^KhB^RHJ0ejr78Y$CS#I84EdTkN_5hV_rE-He#we1*e5eP zD_rW98mnFai%X!9bEs7pB>18YjVvqf=d)F))3eY{cYJ)6_R(Nh8Xr4{DM4tg1s72= z?pe{ss^}>>U--|Qhlh53SQ}a95ot5|L)VJ<}Qq=;M|aqg83Jd z&QPgPfm@nW6C7P?YV(mMCzYbb0^UpbpF_f&Db*!_-+6?1A=BZylt!Nxq%l}YU6wL& z`snjkHVczPnCRl{LoeZSgNbi?v(wcZj|wGoM=bLPTx>#?7&#A{PCCSqCu?)5k5%?D z-rR4moQ?knZzQ};uBT` zoH5hA{+J?sMdGfu5lzh_ed<30F(t>`5-y(`e+{R3wvD3deZQSOu=Ji(e3*3fsGrgC zi1X9yzlw|Y3Q76$Xom+46`K9qaS*3x<2S|S)vc(jdF_+1nDDq`oczMA_`%uK?f#*f zDokaPGQXGJ!IEM{9{N52bfN6iZE?QN>;@wpu z?6a4|nNHt5_95pn_ccJ%rz<578#6}U{_f)9sppM1GqTaDQ-iaU^I}{ssT)cqk(9*2Mr>}IK)zNF&4k1g7?ssv@NX1}6_)KTdQ^=FAF#(QxSuB?=7`sHOLd^%653zwrQ>g|41XBlD zfLx=jqty&R(Tp-|xVBc5FA_30#dG{;PV<7o&Avbk9KJ;7)i+>>l`F4*Rfj^_!yR{d z!ZUe24CbNE(i%=q^DJD2Oq2TgW*uxONH86WrnnI(|2SA%#kXfCkl&<4=DJ=kkf++> zm&=Ym&wYQSgsf;zIKka%yw>Yr)|?zz8v#+V3e7VL3#9rNsASQLRjxP8K3e-<9nIg} zd8foDfpBKBFd8K%P%fYW)-u#7iWA<}S~&Yvb#1|5^oZ+6Lp(WsGd#ys?Xha?e54Ba zN5aB;6QV|%&0yM6$i51S^Bb$HJ{7Yv%pvr&Kh@j@2M}MQdu6!nVZd)hK+(8gycK1@ zWiBDnt;SYPXKD;^E(K)yg*nIXZ8^d9^vqYmwd!nd_#~xM18Dfd$7Sm2qz*pb2vb{^*2R{B*K5FzxAXa>A!zu2HD2KJ-DXpu(@~;Rk+vKPAH4^syH}6zQu+nce zJYES=NU^!-?AK{w9f!hC+!w#xZehY6D_GR<(;0f*o>UA#J!GhxjMdT71Hbc$WIHQY z^;Kc%%U@@S%a_Qick=Oe0sJG?q)|P&q5d(8!oz0GtJV^#5S6M{(XGaK0m#8bzbts& ze3UFH^usP`>G2BY_K7vCWpF)D`vq$u_a|xUnR<7Ep!XA}PG&$@>uM(U_e>Q#8V4lXckQcaov89tOvD@L&>@RPww5rl7K%Cn zZ@w3l{1~&(XqoTiHScvPDNfdqN#j1*tgG`4O-W@n%3PVwcwTn!BxV&?$oui4G;sRy z?99rq2PR)&FvYRr!*K$br;=qXQWsXM1KS8`3Vj`pm|;kH$nzh z!(PwE_4jxMruZ%^_n6{mvPQjkoM7qk66WRoYieDNyW2NK`Fg9Fp0j{RPT!ngNyV#g37N?r740|=Gor6k1`s}Q|A=L1^=Z9 zR)EoDVl|3hi`ab%gI&o`Bn?UEWQ-+Sorx);n@+EeXPvmV$e%wc)X$y5Hn_Z^VqS#D z)6$pRt!G-H(9Z&_y#)IE5&ZSQ({|Ze&I)gtJ~C6NZk3F*9HaFQ%==$hrn&%UojbSV z+c9IdcKp)PL0juCuUnp+7#{X0x_())8EP6RwPD<=9fiHH3)vO5E-~v_Dd%hhyv8jv z;m6Z&c5&}3>bZ^yV+ts6?^+HDn>^W*QgU@L`kY3A{0kB6Gi1H(3&UviEdiZ+uzLn?~^>Q#-b|(;|C#@B0B; zNvmFZW4TS8W@Gujv%xDn*1K;D%nKrEDnd<&t8=+p?VcK(qr}^N%%exJi5_n=suDj# zf?crOKHFcE*2sFQz}3Q^e~tfY9PXzwX`s;0eYIRvJbsaXpWxS~6{L>-B|l#0<&tjKTJd#JI!%84M$7|*?r zXBxa=ZdNF3(q&iB*jh;3q`(#`Ri=yaw%Z4AHE0!_l5)_|(U@CNBx(s5I z3vH%~I7fUp{*x%UMu5!|9#m9nLO3}wQ;IX#3#rz%0M%sW7olhb6A?qPA&))z`e|pn zBCPa!Xm`?lhoT|HmBT{=jq4b^rfQ<*|0tSR-Uy1CyK`UM-wW{y!( z&xV)c2DdlnNWq4Gz!$=i510NM0Z8%6wXO3v1Wm$!!fv>Tb}Z|NiRlb4dgHAxhodx; zshx3!55c;fS;zL$PiY2jP2?;1YHnCjlZ`{ac_-eTGe1nt4qA{pw3R&1CJjvPOW~&` zBC0pQ_Qv-iy;Y}W2gYBboX-FNtGOK!XhF6MOz}wJGz%v?>(S#odr_?5o2%x3SBIWN zjOGC$AlTWRJ^zzS-Sej|Cl*_``BcLKa12E+dhE8NAnf)!MJ4Lvk$cBkeiwo(8Er_Q zmR^T}YeLhGE;y_*nDEV*6%T1z&FtDaZD=I_#>HT7mhP-0w*GM2ArC2f>;4G{qP1i4 zuA;#bY?W8;H=UF8?(vJ-fr|l~KWps74^6b$d-9PJ;$LpP3XW_2iPuUduwGGUzV#Jn9D1j zW#zXwR+v0LnLZLf%5wVOAe~f>-ypv5-fY(v^-fWcGRxRAFCV}APYO~Au`DS7c^vde z7d1L`IB?$Ebu)ACKq1sNM#k2uh?N~Gf-MK>w-=YXTyGR>O)AbL=5#r@RvZ-!iZRGz0Z#E$^ diff --git a/game/data/schemas/camp_scene_layout_table.gd b/game/data/schemas/camp_scene_layout_table.gd index 2137967d..03e2d01e 100644 --- a/game/data/schemas/camp_scene_layout_table.gd +++ b/game/data/schemas/camp_scene_layout_table.gd @@ -6,7 +6,7 @@ extends Resource @export var canvas := Vector2(1280, 800) # 终稿画布(工程档同幅面) @export var hud_band_h := 48 # 顶栏禁区高度(命中不侵) @export var gate_gap := Vector2i(520, 760) # 门洞缺口 x 范围(透出背景层小路,禁填死) -@export var wall_band := Rect2(0, 240, 1280, 70) # 围墙带包络(门柱顶 240—桩底 310;围墙贴图须落在其内) +@export var wall_band := Rect2(0, 220, 1280, 200) # 围墙带包络(显示矩形 (0,220,1280,200);围墙贴图须落在其内) @export var layers: Array[CampSceneLayerSpec] = [] diff --git a/game/data/tables/camp_scene_layout.tres b/game/data/tables/camp_scene_layout.tres index c811e355..9f05dd29 100644 --- a/game/data/tables/camp_scene_layout.tres +++ b/game/data/tables/camp_scene_layout.tres @@ -13,64 +13,64 @@ hotspot_key = &"" [sub_resource type="Resource" id="2"] script = ExtResource("2") key = &"wall" -texture_rect = Rect2(0, 261, 1280, 49) +texture_rect = Rect2(0, 220, 1280, 200) hotspot = Rect2(0, 0, 0, 0) hotspot_key = &"" [sub_resource type="Resource" id="3"] script = ExtResource("2") key = &"board" -texture_rect = Rect2(845, 268, 130, 121) -hotspot = Rect2(845, 268, 130, 140) +texture_rect = Rect2(845, 241, 130, 121) +hotspot = Rect2(845, 241, 130, 140) hotspot_key = &"board" [sub_resource type="Resource" id="4"] script = ExtResource("2") key = &"gate" -texture_rect = Rect2(520, 250, 240, 211) -hotspot = Rect2(520, 250, 240, 220) +texture_rect = Rect2(520, 282, 240, 138) +hotspot = Rect2(520, 282, 240, 147) hotspot_key = &"gate" [sub_resource type="Resource" id="5"] script = ExtResource("2") key = &"dummy" -texture_rect = Rect2(340, 520, 120, 180) -hotspot = Rect2(340, 520, 120, 180) +texture_rect = Rect2(340, 474, 120, 180) +hotspot = Rect2(340, 474, 120, 180) hotspot_key = &"dummy" [sub_resource type="Resource" id="6"] script = ExtResource("2") key = &"forge" -texture_rect = Rect2(40, 467, 240, 193) -hotspot = Rect2(40, 420, 240, 240) +texture_rect = Rect2(40, 421, 240, 193) +hotspot = Rect2(40, 374, 240, 240) hotspot_key = &"forge" [sub_resource type="Resource" id="7"] script = ExtResource("2") key = &"tent" -texture_rect = Rect2(982, 520, 251, 170) +texture_rect = Rect2(982, 335, 251, 170) hotspot = Rect2(0, 0, 0, 0) hotspot_key = &"" [sub_resource type="Resource" id="8"] script = ExtResource("2") key = &"chest" -texture_rect = Rect2(1097, 700, 106, 90) -hotspot = Rect2(1085, 700, 130, 90) +texture_rect = Rect2(1097, 654, 106, 90) +hotspot = Rect2(1085, 654, 130, 90) hotspot_key = &"chest" [sub_resource type="Resource" id="9"] script = ExtResource("2") key = &"notebook" -texture_rect = Rect2(818, 704, 100, 66) -hotspot = Rect2(818, 690, 100, 80) +texture_rect = Rect2(870, 515, 100, 66) +hotspot = Rect2(870, 501, 100, 80) hotspot_key = &"notebook" [sub_resource type="Resource" id="10"] script = ExtResource("2") key = &"campfire" -texture_rect = Rect2(560, 571, 160, 149) -hotspot = Rect2(560, 640, 160, 80) +texture_rect = Rect2(560, 525, 160, 149) +hotspot = Rect2(560, 594, 160, 80) hotspot_key = &"campfire" [resource] @@ -78,5 +78,5 @@ script = ExtResource("1") canvas = Vector2(1280, 800) hud_band_h = 48 gate_gap = Vector2i(520, 760) -wall_band = Rect2(0, 240, 1280, 70) +wall_band = Rect2(0, 220, 1280, 200) layers = [SubResource("1"), SubResource("2"), SubResource("3"), SubResource("4"), SubResource("5"), SubResource("6"), SubResource("7"), SubResource("8"), SubResource("9"), SubResource("10")] diff --git a/game/tests/unit/presentation/animation_frame_spec_test.gd.uid b/game/tests/unit/presentation/animation_frame_spec_test.gd.uid new file mode 100644 index 00000000..1ba3a32c --- /dev/null +++ b/game/tests/unit/presentation/animation_frame_spec_test.gd.uid @@ -0,0 +1 @@ +uid://c50sjeyp58jcj diff --git a/game/tests/unit/presentation/camp_scene_layout_test.gd b/game/tests/unit/presentation/camp_scene_layout_test.gd index dbca0cfa..01c3ea58 100644 --- a/game/tests/unit/presentation/camp_scene_layout_test.gd +++ b/game/tests/unit/presentation/camp_scene_layout_test.gd @@ -2,7 +2,7 @@ extends SceneTree # 营地场景布局数据件校验套件(V14——camp_scene_layout.tres 加载期 fail-fast 判据+七命中区几何红线机检) # 覆盖:校验函数通过(键唯一/贴图在画布/命中成对/围墙带包络)· 七可点件键集 · 两两不相交 · # 不越画面 · 不侵顶栏禁区 · 篝火命中只取下半(关系谓词)· 门扇对齐门洞缺口 · 布告板挂围墙带。 -# 断言全部为表内关系谓词——禁坐标字面量(数值单一事实源 = 数据行本表)。 +# 断言以表内关系谓词为主;2026-11-07 重排追加十层钉值断言(钉值出处见各断言前 oracle 注)。 # 运行:godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd(expect 0) const Kit := preload("res://tests/unit/test_kit.gd") @@ -85,6 +85,32 @@ func _test_layout_hotspot_geometry() -> void: and board.hotspot.position.y >= wall.texture_rect.position.y \ and board.hotspot.position.y <= wall.texture_rect.end.y Kit.check("V14 布告板命中挂围墙带〔营地图批 V14〕", board_ok) + # oracle: design/art/camp-scene-prompts.md:250 (2026-11-07 围墙/门/板钉值,§5 第 12 条) + Kit.check("V14 围墙矩形钉值 (0,220,1280,200)〔营地图批 V14〕", + wall != null and wall.texture_rect == Rect2(0, 220, 1280, 200)) + Kit.check("V14 门扇矩形钉值 (520,282,240,138)〔营地图批 V14〕", + gate != null and gate.texture_rect == Rect2(520, 282, 240, 138)) + Kit.check("V14 告示板矩形钉值 (845,241,130,121)〔营地图批 V14〕", + board != null and board.texture_rect == Rect2(845, 241, 130, 121)) + Kit.check("V14 围墙带钉值 (0,220,1280,200)〔营地图批 V14〕", + table.wall_band == Rect2(0, 220, 1280, 200)) + # oracle: design/art/camp-scene-prompts.md:244 (其余七件落位:帐篷:242/笔记本:243/宝箱与其余上移:244) + var seven_ok := true + var seven_bad := "" + for spec in table.layers: + var want: Rect2 + match String(spec.key): + "dummy": want = Rect2(340, 474, 120, 180) + "forge": want = Rect2(40, 421, 240, 193) + "tent": want = Rect2(982, 335, 251, 170) + "chest": want = Rect2(1097, 654, 106, 90) + "notebook": want = Rect2(870, 515, 100, 66) + "campfire": want = Rect2(560, 525, 160, 149) + _: continue + if spec.texture_rect != want: + seven_ok = false + seven_bad = "%s %s" % [spec.key, spec.texture_rect] + Kit.check("V14 六件落位钉值(违例 %s)〔营地图批 V14〕" % seven_bad, seven_ok) # 层序结构:10 层且 bg/wall 压前两位(z0/z1——子节点序=表序先验) var order_ok := table.layers.size() == 10 \ and String(table.layers[0].key) == "bg" and String(table.layers[1].key) == "wall" diff --git a/game/tests/unit/presentation/palette_token_pairwise_test.gd.uid b/game/tests/unit/presentation/palette_token_pairwise_test.gd.uid new file mode 100644 index 00000000..1c8c64f8 --- /dev/null +++ b/game/tests/unit/presentation/palette_token_pairwise_test.gd.uid @@ -0,0 +1 @@ +uid://cju0edupimvup diff --git a/reports/需求卡片-营地场景重排接线-2026-11-07.md b/reports/需求卡片-营地场景重排接线-2026-11-07.md new file mode 100644 index 00000000..6d776770 --- /dev/null +++ b/reports/需求卡片-营地场景重排接线-2026-11-07.md @@ -0,0 +1,135 @@ +# 需求卡片 · 营地场景重排接线 + +> 批名:营地场景重排接线 · 日期: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`) + +## 1. 目标与完成定义 + +把营地十层的运行数据换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;新围墙件(1280×164,补尖+墙脚入土缺口)入包;布局表几何红线单测与冒烟全绿;游戏内营地图层按新矩形铺底、墙脚无贯通直线。 + +完成定义:`camp_scene_layout_test.gd` V14 全绿(含新值钉断言)+冒烟测试 exit 0+`palette_check` 围墙对八件零新增色+`path_check` 0 问题;游戏内目检归用户(登记不阻塞)。 + +## 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 用户裁「不动美术素材」),无需换件。 + +## 3. 设计契约(违反即返工) + +🔴 逐层锁定值(写进 .tres,值逐字照此): + +| 层键 | texture_rect | hotspot | hotspot_key | +|---|---|---|---| +| bg | (0,0,1280,800) | (0,0,0,0) | — | +| wall | (0,220,1280,200) | (0,0,0,0) | — | +| board | (845,241,130,121) | (845,241,130,140) | board | +| gate | (520,282,240,138) | (520,282,240,147) | gate | +| dummy | (340,474,120,180) | (340,474,120,180) | dummy | +| forge | (40,421,240,193) | (40,374,240,240) | forge | +| tent | (982,335,251,170) | (0,0,0,0) | — | +| chest | (1097,654,106,90) | (1085,654,130,90) | chest | +| 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)。 + +🔴 围墙件:1280×164、RGBA、≤32 色(实测 12 色)、顶行仅柱尖若干列不透明(柱尖补全)、底行全透明(入土缺口 1–7px 低频起伏);源文件=主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png`。 + +🔴 门扇 hotspot 高 147=贴图 138+底部 9px 余量(沿用旧表「命中比贴图高 9」口径,属实现微决策,见 §9 代拍板)。门扇件不换件:现 240×211 由运行时压扁到矩形(用户 2026-11-07 裁「不动美术素材」;设计文档中「随门洞压扁重画」旧句已在本批改为运行时压扁口径)。 + +🔴 其余六件的 hotspot 由旧表相对关系同偏移得出(dummy 同贴图;forge y−46/高+46;chest y−46/x−12/宽+24;notebook y−14/高+14;campfire y−46/高 80;board 同贴图 y/高+19)——值已列上表,禁止再自拟。 + +## 4. 范围边界 + +做:上表十层数据、围墙件入包、单测新值钉断言(追加,不删旧断言)。 +不做:门扇/布告板/其余七件素材重出;背景层;土线改为独立代码层(入土效果落在围墙件缺口,零新代码);camp.md/art-bible/camp-scene-prompts 的进一步改写(归文档批)。 +不收件去向:art-status-checklist 营地行状态更新归文档批(反哺点);游戏内终审归用户(登记不阻塞)。 + +## 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 换代」事实 | 反哺点,归文档批落文 | + +## 6. 任务卡 + +### 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` 口径复核) + +### 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) + +### T2 新值钉断言+收口(≈0.25 工作日) + +- 取用:T1 的表。产出:`game/tests/unit/presentation/camp_scene_layout_test.gd`(追加断言);`reports/iter-实现报告-2026-11-07.md`;`reports/iter-反哺点-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 四条逐条落点) + +## 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 取值 | 既有:营地场景图十层铺底与门洞留空呈现 | +| 围墙件换代(判据出处 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` | 截图色彩数/骨架 | 既有:营地场景图十层铺底与门洞留空呈现 | + +注:未删改任何旧断言;新增 5 条钉值断言(围墙/门扇/告示板/围墙带/六件落位),测试削弱申报:无。 + +**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/iter-验收审计-2026-11-07.md`;未过不得合并。 + +## 8. 异常分级 + +L1 自救:格式/导入缓存类异常自行重跑。L2 记录继续:非本卡面的既有红记录进报告。L3 停机:表值触 schema fail-fast 或与 §3 冲突=停卡呈报(上游缺陷退写卡段);素材缺位=停卡(不得用旧 49px 墙凑合)。 + +## 9. 代拍板白名单 + +门扇 hotspot 高 147(贴图 138+9 余量);七件 hotspot 的平移口径(§3 已列值);T2 钉值断言的命名与位置(同套件内追加)。超出=记实现报告「实现决定记录」。 + +## 10. 待裁点 + +零待裁点(用户已裁:墙 220/200、门板跟随、入土线;2026-11-07)。开工门=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),不新增渲染件。唯一面:坐标只落表一处,视图/探针/单测均读表。 + +## 12. 实现规范预算 + +零新增文件、零新增方法 → gdstyle 阈值面无新增;存量触面:camp_scene_layout_test.gd 追加一段断言(方法数不变、成员数不变)。 + +## 13. 复核记录 + +| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 | +|---|---|---|---|---| +| 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:` 行锚 | + diff --git a/待办清单.md b/待办清单.md index 14003875..dffea356 100644 --- a/待办清单.md +++ b/待办清单.md @@ -2,6 +2,15 @@ 本清单是流水线的唯一登记处:以后才做的事在此登记一条,随流水线段推进改状态,做完整条删除(条目记进度,不是各段的开工前置);各系统文档的「待办」节只留一行指路存根,不再自建条目。条目格式(标题=登记元数据含可选优先级,正文=实况/缺口/改动面/状态四属性)与状态机以 [doc-conventions §12.1](design/engineering/doc-conventions.md) 为权威。 +#### 营地场景重排接线——十层新矩形与游戏内终审(2026-11-07 登记,来源=批次移交) + +**实况**:布局裁定值已落 [camp-scene-prompts](design/art/camp-scene-prompts.md) v1.9 §2.3/§3/§5(2026-11-05 与 2026-11-07 用户裁:围墙 y220 高 200、门板跟随、墙脚入土)、[art-bible](design/art/art-bible.md) v3.48 §6.2、[camp](design/ux/camp.md);新布局预览已过用户审(2026-11-07);背景层终稿已入包(`scene_camp_bg.png`,2026-11-07 过审);围墙新件(1280×164 补尖+墙脚入土)候选已过目检与色板核(12 色零新增),待随实现批入包;`game/data/tables/camp_scene_layout.tres` 仍旧值。 +- 相关文档:需求卡片 `reports/需求卡片-营地场景重排接线-2026-11-07.md` · [asset-path-map](design/art/asset-path-map.md) §3 · `game/tests/unit/presentation/camp_scene_layout_test.gd`(几何红线机检) + +**改动面**:美术素材+游戏代码 + +**状态**:美术设计已闭合+已写卡 + #### 封印动作改版——挖开与封印都揭示格子(2026-11-07 登记,来源=会话提及) **实况**:现行封印不揭示格子(格子保持未开、封印印记立在上面),封印后再挖开是合法动作;用户新方向=棋盘上仍是挖开与封印两个动作,两者都揭示格子,墙体消失、展示地板,封印后再挖开这条路径不再存在,用户口径=决策路径更直接。