@@ -1,10 +1,10 @@
# 需求卡片:棋盘瓦片与立体表现重做批
> 来源:`待办清单.md`「棋盘瓦片与立体表现重做」(2026-11-07 登记)。
> **设计事实源(唯一事实源)**: `design/art/art-bible.md` v3.51 §1.4/§3.2/§4.1「三关棋盘环境八色」/§6.3/§7/§8.2 + `design/ux/battle.md`( Last Updated 2026-11-07 )「Layout Zones」D 区行/「D 区布局与棋盘画法预览」/「封印格呈现预览」+`design/gdd/systems/表现与支撑/HUD框架.md`( 2026-11-07) D 区行与字号下限+`game/tests/golden/README.md`「越格口径」。
> **设计事实源(唯一事实源)**: `design/art/art-bible.md` v3.53 §1.4/§3.2/§4.1「三关棋盘环境八色」/§6.3/§7/§8.1「格边长与材质分工」/§8.2/§8.5「生产分工」 + `design/ux/battle.md`( Last Updated 2026-11-09 )「Layout Zones」D 区行/「D 区布局与棋盘画法预览」/「封印格呈现预览」+`design/gdd/systems/表现与支撑/HUD框架.md`( 2026-11-07) D 区行与字号下限+`game/tests/golden/README.md`「越格口径」。
> **验收档:中**(呈现与交互几何改动,后果玩家可见但不损持久状态;用户 U0 可改判)。
> **预计**: 9.5 个工作日(区间 9 – 10 ; T0 0.5/ T1 1.5/ T2 0.5/ T3 2.0 / T4 1.5/ T5 1.5/ T6 0.5/ T7 1.0 / T8 0.5)。
> **卡片状态**:复核记录见 §16;第一轮 19 条、第二轮 23 条、第三轮 4 条、第四轮 5 条、第五轮 1 条、第六轮(合并整合)6 条均已处置,第六 轮定向复核通过。
> **预计**: 11.0 个工作日(区间 10 – 12 ; T0 0.5/ T1 1.5/ T2 0.5/ T-A 0.5/ T3 2.5 / T4 1.5/ T5 1.5/ T6 0.5/ T7 1.5 / T8 0.5)。
> **卡片状态**:复核记录见 §16;第一轮 19 条、第二轮 23 条、第三轮 4 条、第四轮 5 条、第五轮 1 条、第六轮(合并整合)6 条、第七轮(材质实现回退)1 条、第八轮(浮空数字几何)1 条、第九轮(512 材质与过审同步)14 条 均已处置,第七/八/九 轮定向复核通过。
---
@@ -16,13 +16,13 @@
1. 1280× 800 基座档:12× 12 格边 38px、14× 14 格边 32px; D 区 1036× 548;左/右栏各 200px;棋盘 12× 12 外框 478× 478、**屏幕坐标**原点 (523,296)、board_area 局部原点 (279,44); 14× 14 外框 474× 474、屏幕原点 (525,296)、局部原点 (281,44)。
2. 顶行浮空数字视觉顶 y=258(含 2px 描边+1px 浮空投影),距 D 区上缘 6px;数字、引导线、阴影圆全部在 D 区内,无裁切。
3. 岩体投影:LIFT=round(格边×0.435)、ESHIFT=round(格边×0.109);四邻连通合并;相邻岩顶搭接 2px;南崖高 LIFT、宽 格边+ESHIFT、顶缘 2 px 口沿高光取本关受光棱(§4.1) ;东崖宽 ESHIFT、高 格边+LIFT;北/西 2 px 主亮棱+2 px 次亮棱+外 2px 深墨边;南/东 2px 深墨内缘+ 3× 2 px 内阴影(自缘内 0.217×格边起, α 0.27 /0.16/0.08);四段投影 4× 4px( α 0.44 /0.30 /0.16 /0.07) ;整板悬崖 8px。
3. 岩体投影:LIFT=round(格边×0.435)、ESHIFT=round(格边×0.109);四邻连通合并;相邻岩顶搭接 2px;南崖高 LIFT、宽 格边+ESHIFT、顶缘 1 px 受光口沿+1px 深墨线 ;东崖宽 ESHIFT、高 格边+LIFT;北/西 1 px 主亮棱+1 px 次亮棱+外 2px 深墨边;南/东 3×1 px 内阴影;崖面用低对比、断续且错开的岩块面,任何岩层线不得贯通整条崖面;南向投影 4×4px( α 0.25 /0.16/0.09/0.04)、东向 α 0.22 /0.14 /0.07 /0.04 ;整板悬崖 8px。
4. 深度排序:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体画在小人之后并遮住小人脚底;小人所在格数字仍完整可见。格件顶面贴花/交互反馈随所属格件参与同一深度排序——北侧(脚底≤小人)低于小人(`z=0` ),南侧(脚底>小人)随岩体在前(`z=3` );浮空数字仍最顶。
5. 浮空数字:字高 21px、2px 深墨描边+1px 浮空投影、暖白字芯、字底距格顶 15px、2px 双色引导线、10×6 阴影圆(圆心格顶+7,画在开启格地面、位于小人之下);数字与引导线 z 最高,任何地形/小人/特效不遮数字与引导线;小人可遮阴影圆。
6. D 区:左栏 AP 点阵+停手,右栏 RAP 点阵+数字+图例+弃图刷新;`side_rail_w=200` 入布局表;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张渲染工具,删除归工具批);棋盘底常驻操作提示条退役;toast 槽在左栏顶部且不覆盖棋盘与浮空数字。
7. 旧 `terrain_*` 63 件与 `tile_palette.gd` / `cell_base_layer.gd` 删除;`seal_mark.png` 保留;**普通数字**棋盘绘制路径零 `DIGIT_PLATE` / `plate` 调用;封印格身份字形色牌保留(迭代56封印改版,唯一例外)。
8. 封印呈现按迭代56「受理即揭示」口径:印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、印记与色牌固定低于小人、该格不生成浮空 entries;封印格地面铺本关受光棱色封印石(零新增色,对封印黑对比 6.45–9.94:1),普通已开格地面仍为连续新地面。
9. 三关(dungeon/ underdark/ deep_underdark)都走新材质与同一画法;三关八色按 art-bible §4.1 冻结(underdark 冷蓝灰、deep 灰黑);三关 golden 基线重制并在渲染闸 通过。
9. 三关(dungeon/ underdark/ deep_underdark)都走 512× 512 新材质与同一画法;三关八色按 art-bible §4.1 冻结(underdark 冷蓝灰、deep 灰黑);三关 12×8 材质过审预览锚已按 2026-11-09 用户过审图重制,引擎侧 `board_L*` 三关 golden 基线仍待实现后按渲染闸口径换代并 通过。
10. 命中仍按逻辑格矩形:点在抬升岩顶/崖面/浮空数字上不改变格坐标映射;16×16 等非当前板型由同一公式求值。
**不做 ** :真 3D、HD-2D、A/B 方案对照、旧瓦片回退、逐格新 PNG 瓦片、B/C 区改版、核心规则/数值/RNG 改动。
@@ -31,12 +31,12 @@
## 2. 设计事实源
- **画法与配色**: `design/art/art-bible.md` v3.51 §3.2「棋盘地形体系」八条(术语与定义/投影与搭接/受光与崖面/材质与装饰/投影与整板悬崖/绘制序与遮挡/浮空数字/旧资产处理)+封印印记条、§4.1「棋盘环境子板/三关棋盘环境八色/封印黑/数字色牌」、§6.3「三关 tile_closed/tile_open 终值」、§8.2「封印印记参数表 」、§1.4 第一验收项。
- **画法与配色**: `design/art/art-bible.md` v3.53 §3.2「棋盘地形体系」八条(术语与定义/投影与搭接/受光与崖面/材质与装饰/投影与整板悬崖/绘制序与遮挡/浮空数字/旧资产处理)+封印印记条、§4.1「棋盘环境子板/三关棋盘环境八色/封印黑/数字色牌」、§6.3「三关 tile_closed/tile_open 终值」、§8.1「格边长与材质分工」、§8.5「生产分工 」、§1.4 第一验收项。
- **封印呈现前置**:迭代56「封印动作改版批」已闭合 `design/gdd/systems/排雷循环/排雷玩法.md` v2.0「封印受理即揭示」与 `design/ux/battle.md` 「封印格呈现预览」——封印格 = 已揭示地面+法阵+身份字形色牌;本卡承接其地形换代(承载面改受光棱封印石、圆心仍格心、色牌与法阵层序不变),不重写揭牌逻辑。
- **布局与像素判据**: `design/ux/battle.md` ( 2026-11-07 )D 区行、棋盘格尺寸公式、「D 区布局与棋盘画法预览」像素判据表(含顶面/视觉 rect、悬停/路径 rect、层序)、Component Inventory 三行(行动资源侧栏/棋盘地形层/棋盘浮空数字层)。
- **布局与像素判据**: `design/ux/battle.md` ( 2026-11-09 )D 区行、棋盘格尺寸公式、「D 区布局与棋盘画法预览」像素判据表(含顶面/视觉 rect、悬停/路径 rect、层序)、「棋盘材质过审实图」节(12×8/46/≤32 色/无贯通岩层线)、 Component Inventory 三行(行动资源侧栏/棋盘地形层/棋盘浮空数字层)。
- **HUD 契约**: `design/gdd/systems/表现与支撑/HUD框架.md` D 区行(侧栏/全高棋盘/提示条退役)、布局表高度口径、字号下限(浮空数字 21px 固定)。
- **验收面**: `game/tests/golden/README.md` 「加严口径(棋盘三图)」「越格口径(2026-11-07 棋盘地形换代)」。
- **上游已裁**:C 方向(合并岩体+越格画法+新大岩板材质)2026-11-07 用户看样张通过; 顶栏搬两侧(D)2026-11-07 用户看三方案预览后选定;北/西受光、按样张调深、脚底行排序三项同会话裁定;underdark/deep 两关色板 2026-11-07 用户看方向样张后选定「按目标八色冻结」;棋盘底操作提示条退役同会话选定。
- **上游已裁**:C 方向(合并岩体+越格画法+连续岩顶图/连续地面贴图材质+浮空数字)2026-11-07 用户看样张通过——用户裁的是画面外观,**不含「程序化材质」**;材质=无缝贴图、结构=程序化,分工按 art-bible §8.5。 顶栏搬两侧(D)2026-11-07 用户看三方案预览后选定;北/西受光、按样张调深、脚底行排序三项同会话裁定;underdark/deep 两关色板 2026-11-07 用户看方向样张后选定「按目标八色冻结」;棋盘底操作提示条退役同会话选定。写卡段曾把材质误写成程序化,本卡按 2026-11-09 用户裁回退,见 §16 第七轮。**512×512 三关材质、断续岩块与薄边缘**于 2026-11-09 用户目检 `reports/2026-11-09-棋盘材质预览-v2.html` 后确认「没有问题,可以按这样」,本卡按该预览冻结。
---
@@ -64,14 +64,14 @@
| 普通已开危险格「危」当前垫色牌;落牌断言在玩家复制回归件(本卡后普通「危」改浮空、plate=false;封印格「危」仍垫牌) | `game/tests/unit/presentation/player_copy_sweep_test.gd:142-147` ( `u.plate == true` ) |
| 单元测试入口登记 terrain 套件 | `game/tests/run_all.gd:225` |
| 布局表字段被样张渲染工具读取(本批不改工具) | `tools/layout_config.py:12` ; `tools/render_sample_sheet.py:51,956` ; `tools/render_sample_sheet_v3.py:862,936` |
| 档期现状:待办清单已 「已写卡」、roadmap 待编池「棋盘瓦片与立体表现重做(已写卡,待编排)」、 08 已写卡 | `待办清单.md:265-268 ` ; `roadmap.md:9 ` ; `design/gdd/08-Alpha版本标准.md:149 ` |
| 档期现状:待办清单为 「已写卡+已编迭代 57」,roadmap 迭代 57 已登记本卡、状态待开工; 08 已写卡 | `待办清单.md` 本条目状态段 ; `roadmap.md` 迭代 57 行 ; `design/gdd/08-Alpha版本标准.md` 本卡行 |
---
## 4. 设计契约(🔴 触碰=L3 停机呈报)
1. 🔴 **只改呈现层与必要接线 ** :禁止改 `game/core/` 的排雷规则、棋盘数据、AP/RAP、战斗结算、RNG;棋盘数据只读。新增/修改只落 `game/presentation/` (含 `main.gd` / `main_debug_flow.gd` 的重建接线)、`game/probe/` 、`game/tests/` 、`game/data/schemas/` 、`game/data/tables/` 与 `reports/` 。
2. 🔴 **不做逐格瓦片 ** :禁止保留或新增 16+5 逐格瓦片路径、`terrain_*` 回退、`TilePalette` 装图链;岩体 /地面/崖面必须按整板矩形与格边 程序化绘制, 连通按四邻。
2. 🔴 **不做逐格瓦片 ** :禁止保留或新增 16+5 逐格瓦片路径、`terrain_*` 回退、`TilePalette` 装图链;岩顶 /地面材质用无缝贴图(按合并岩体与整板一次铺图,UV 用棋盘全局坐标、禁逐格重置;贴图来源与命名见 T-A),崖面/临空边缘/投影/层序等结构件 程序化绘制; 连通按四邻。
3. 🔴 **普通数字零底牌 ** :普通数字(含普通已开格的「危」/「?」)只走浮空描边字;禁止 `_digit_ink_mode` 三态、`plate_digit` 在普通数字路径复活。**封印格身份字形色牌为唯一例外**(迭代56封印改版:`plate=true` 、`_draw_digit_plate` 保留、字形叠于法阵之上),禁把例外扩回普通数字。
4. 🔴 **浮空分层 ** :数字+引导线必须比地形/小人/封印/微光/交互反馈都高,任何元素不得遮数字与引导线;**阴影圆相反——画在开启格地面、位于小人之下**,小人站该格时遮住圆;顶行数字必须在 D 区内完整可见。**顶面贴花/交互反馈不得一律置顶**——随所属格件脚底行分档:北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;禁恢复“格件一律 z=3”。**封印格例外**:该格不生成浮空 entries/阴影圆,印记与身份色牌固定低于小人(整格 z=0,不参与南侧前推)。
5. 🔴 **命中按逻辑格 ** : `_cell_at` 仍用逻辑格矩形与 `SEP` 步长;抬升岩顶、崖面、浮空数字不是命中区;顶面左上角点按逻辑公式归属北/西邻格,不做“归本格”特判。
@@ -82,7 +82,7 @@
10. 🔴 **文档不直改 ** :实现批禁写 `design/` 、`game/tests/README.md` (能力清单由写卡段本批入表)、`roadmap.md` 、`08-Alpha版本标准.md` 、`待办清单.md` ;发现条款偏差一律列 `reports/iter<N>-反哺点-<日期>.md` 。
11. 🔴 **不删断言换绿 ** :不得删除或放宽 `board_shot_probe` 的加严口径、渲染闸 2% 判据、`ui_contrast_probe` 对比断言;只允许按本卡 §12「测试削弱申报」列出的旧断言删除/替换。
12. 🔴 **拆分边界 ** :判据权威=`design/engineering/code-conventions.md` §1.1;每个拆出单元必须有职责语句与单一变化原因(§10);禁止为过阈值凑数拆件;拆不出内聚单元=停卡呈报。
13. 🔴 **RNG 单点 ** :程序化材质 /装饰噪声禁止 `randomize()` 、自建 `RandomNumberGenerator` 、消耗 `RngService` 共享流;一律用格坐标确定性哈希(同板同参逐位复现)。
13. 🔴 **RNG 单点 ** :程序化结构 /装饰噪声禁止 `randomize()` 、自建 `RandomNumberGenerator` 、消耗 `RngService` 共享流;一律用格坐标确定性哈希(同板同参逐位复现)。
14. 🔴 **色字面量落点 ** :三关八色只落 `board_terrain_palette.gd` ;用 `Color("#RRGGBB")` 常量,禁 `Color8` 散落;其它绘制点只读 palette,禁第二份色值表。
15. 🔴 **BoardView 公开面不增 ** : `board_view.gd` 公开方法保持 27、类成员 ≤31(S13 基线;删 `_palette` 后 30);新增地形/浮空/阴影圆层一律落为**固定名字子节点**(`_world` 下 `TerrainBack` / `TerrainFront` / `LabelShadow` ,壳层下 `FloatLayer` ),三层在 `_init` 创建一次常驻、`rebuild` 只重跑 `setup` 不重建节点,经 `get_node_or_null` 取用,不新增类成员;只允许 `set_cell_area` /`rebuild` 增加可选参数与私有 `_visual_rect_for` /`_top_face_rect` /`_resort_cell_decals` ,禁新增公开方法或成员。
16. 🔴 **封印呈现对齐迭代56 ** :封印印记居已揭示地面格心(不随岩顶 −ESHIFT/−LIFT 偏移);身份字形垫色牌叠于法阵之上(`seal_mark_layer` 子件 `show_behind_parent=true` 或等价实装)、不参与浮空层、不生成阴影圆;印记与色牌固定低于小人(封印格整格 z=0);封印格地面铺本关受光棱色封印石(零新增色,`palette.light_edge` );法阵参数(环径/环壁/十字/光圈)与揭牌逻辑沿迭代56,禁在本卡重写。
@@ -106,13 +106,13 @@
**不收件 ** :
- B 区舞台/站桩、C 区数据框、AP/RAP 数值与规则、战斗结算、RNG、存档——一律不动。
- 新增地形 PNG 素材:本批按已过审样张做程序化材质;若后续要换成 PNG 材质,另立登记条目走 asset-ingest 。
- 已过审 6 张地形贴图之外的再创作、换图或重新量化:T-A 只承接 2026-11-09 已过审的 512×512 六张;本批不再出程序化材质替身,也不以平色回退充当终稿 。
- 真 3D/HD-2D、A/B 方案对照、用户试玩结论——试玩只登记不阻塞。
- 三关之外的板型专属美术(16×16 等)——同一公式与材质覆盖,不另出资产。
- 样张渲染工具(`tools/layout_config.py` 、`render_sample_sheet*` )的 `ap_bar_h` 字段清理——布局表字段本批保留,工具换代登记待办清单后续直改。
- 三关互辨抽测工具 `tools/glow_discrimination_sheet.py` 的换代(读已删旧 `terrain_*` )——本批不跑;三关互辨由用户过审样张+`board_terrain_test._test_palette_three_boards` 逐值承担,工具换代登记待办清单后续工具批。
**不收件去向 ** : B/C 区改版→待办清单新条目;PNG 材质替换→asset-ingest 登记 ;样张/互辨工具换代→待办清单(tools 批);条款偏差→反哺点清单。
**不收件去向 ** : B/C 区改版→待办清单新条目;已过审六张之外的贴图再创作/换图→另立美术批 ;样张/互辨工具换代→待办清单(tools 批);条款偏差→反哺点清单。
---
@@ -120,15 +120,15 @@
| 文档 | 关联点(实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/art/art-bible.md` §1.2/§3.2/§4.1/§6.3/§6.5/§7/§8.2 | 三关八色、四邻合并、顶面/视觉 rect、阴影视小、浮空字 1px 投影、贴花按脚底行分档、记忆态合成底、提示条 caption 退役;封印印记改已揭示地面格心+受光棱封印石+身份色牌层序(v3.51 ) | 设计段已按本卡写入 v3.51 ;实现读数若与条款不符→列反哺点,文档批裁决,实现批禁直改 |
| `design/ux/battle.md` §Layout/§Component/预览判据 | D 区全高、侧栏 200、棋盘 38/32、原点、顶预留 44、层序(贴花/交互按脚底行分档)、悬停/路径 rect、提示条退役;封印格承载面改受光棱封印石、圆心格心、色牌叠法阵 | 设计段已同步(2026-11-07 );实现偏差→反哺点 |
| `design/art/art-bible.md` §1.2/§3.2/§4.1/§6.3/§6.5/§7/§8.1/§8.2/§8.5 | 三关八色、四邻合并、顶面/视觉 rect、阴影视小、浮空字 1px 投影、贴花按脚底行分档、记忆态合成底、提示条 caption 退役;封印印记改已揭示地面格心+受光棱封印石+身份色牌层序;岩顶/地面材质=无缝贴图、结构件=程序化 ( v3.53 ) | 设计段已按本卡写入 v3.53 ;实现读数若与条款不符→列反哺点,文档批裁决,实现批禁直改 |
| `design/ux/battle.md` §Layout/§Component/预览判据 | D 区全高、侧栏 200、棋盘 38/32、原点、顶预留 44、层序(贴花/交互按脚底行分档)、悬停/路径 rect、提示条退役;封印格承载面改受光棱封印石、圆心格心、色牌叠法阵;材质过审实图与 12×8/46/≤32 色/无贯通岩层线判据 | 设计段已同步(2026-11-09 );实现偏差→反哺点 |
| `design/gdd/systems/表现与支撑/HUD框架.md` D 区/字号 | D 区侧栏、全高棋盘、`ap_bar_h` 不再参与、浮空数字 21px、提示条退役 | 设计段已同步(2026-11-07);实现偏差→反哺点 |
| `game/tests/golden/README.md` | 棋盘裁剪 1036×548、越格口径、类型微光禁越圈范围 | 设计段已同步;实现批禁直改,基线重制按该文件口径执行(重制前用户确认) |
| `design/gdd/术语表.md` 掩尘/裸土/浮空数字/色牌 | 基色值、浮空数字定义、普通数字色牌退役+封印格色牌例外 | 设计段已同步;实现批禁直改 |
| `design/art/asset-path-map.md` / `art-assets-checklist.md` | 旧 terrain_* 退役、seal_mark 保留、普通数字色牌退役+封印格色牌例外、程序化材质无入包 PNG | 设计段已同步;实现删除资产后按反哺点核对 |
| `design/art/asset-path-map.md` / `art-assets-checklist.md` | 旧 terrain_* 退役、seal_mark 保留、普通数字色牌退役+封印格色牌例外、岩顶/地面 6 张无缝贴图入包( `board_rock_*` / `board_ground_*` ) | 设计段已同步;实现删除资产后按反哺点核对 |
| `design/engineering/architecture/architecture.md:178` | 单格两绘制域件行把 `cell_base_layer` 记为在役组件;本批删除该件、新增地形/浮空/阴影层 | 架构文档写权限=用户专属(2026-11-07 裁):实现批禁直改,T8 反哺点列「架构表该行待用户发令修订」 |
| `game/tests/README.md` 能力表 | 新增 6 条能力;旧「地形瓦片套与格面数字可读」保留(删除归写卡段后续;实现批禁写);「战斗屏三区几何」代表用例改名 | 写卡段本批入表(本卡同 commit);实现批只核对名字与实际落地一致 |
| `roadmap.md` / `design/gdd/08-Alpha版本标准.md` / `待办清单.md` | 本卡已写/待编排状态 | 编排段与收尾段推进;实现批禁直改 |
| `roadmap.md` / `design/gdd/08-Alpha版本标准.md` / `待办清单.md` | 本卡已写卡/已编迭代 57、待开工 | 编排段与收尾段推进;实现批禁直改 |
---
@@ -136,7 +136,7 @@
| 文件 | 行为改动/非行为 | 职责 | 验收行 |
|---|---|---|---|
| `game/presentation/views/board_terrain_palette.gd` (新增) | 非行为(数据) | 三关八色表:`palette_for(board_type)` ; dungeon/underdark/deep 取 art-bible v3.51 §4.1 冻结值;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge` ;封印石读 `light_edge` (零新增色);只读 | §12-14 |
| `game/presentation/views/board_terrain_palette.gd` (新增) | 非行为(数据) | 三关八色表:`palette_for(board_type)` + `tex_paths_for(board_type)` ; dungeon/underdark/deep 取 art-bible v3.53 §4.1 冻结值;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge` ;封印石读 `light_edge` (零新增色);只读 | §12-14 |
| `game/presentation/views/board_terrain_layer.gd` (新增) | 行为 | 地面、合并岩顶、南/东崖面、内阴影、四段投影、封印格受光棱封印石贴片;`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)` /`set_hero_foot_y()` /`set_pass()` /`mass_rects()` /`terrain_metrics()` ;静态 `lift_for()` /`eshift_for()` ; back/front 两实例(`_world` 下固定名字 `TerrainBack` /`TerrainFront` ,不占 BoardView 成员) | §12-3/4/5/8 |
| `game/presentation/views/board_float_layer.gd` (新增,Control) | 行为 | 外壳层浮空字:2px 描边、1px 浮空投影、双色引导线;`setup()` /`set_entries()` /`set_font()` /`label_rects()` /`label_metrics()` ;不画阴影圆;**封印格不生成 entries**;壳层固定名字子节点 `FloatLayer` ,不占 BoardView 成员 | §12-6/7 |
| `game/presentation/views/board_label_shadow_layer.gd` (新增,Node2D) | 行为 | 开启格地面 10×6 四层阴影圆;`setup(cell, cells)` /`circle_rects()` (世界局部/格坐标);**封印格不生成圆**;`_world` 下固定名字 `LabelShadow` ,不占 BoardView 成员;z=0,位于小人之下 | §12-6/7 |
@@ -189,14 +189,14 @@
| 新文件 | 公开方法预算 | 成员变量预算 | 说明 |
|---|---|---|---|
| `board_terrain_palette.gd` | 1 ( `palette_for` ) | 8 个 常量 | 纯数据;不新增类状态 |
| `board_terrain_layer.gd` | ≤7( `setup` / `set_hero_foot_y` / `set_pass` / `mass_rects` / `terrain_metrics` / `lift_for` / `eshift_for` ) | ≤13 (新增 `_sealed_at` 一个成员——封印石贴片输入 ;其余同前) | 两个实例共享一个类;`pass_mode` 区分 back/front |
| `board_terrain_palette.gd` | 2 ( `palette_for` / `tex_paths_for` ) | 8 个色常量+2 个路径格式 常量 | 纯数据;不新增类状态;贴图路径单点 |
| `board_terrain_layer.gd` | ≤7( `setup` / `set_hero_foot_y` / `set_pass` / `mass_rects` / `terrain_metrics` / `lift_for` / `eshift_for` ) | ≤15 (新增 `_sealed_at` 、 `_tex_rock` 、 `_tex_ground` 三个成员 ;其余同前) | 两个实例共享一个类;`pass_mode` 区分 back/front;贴图经 `UiKit.load_tex` 装载 |
| `board_float_layer.gd` | ≤5( `setup` / `set_entries` / `set_font` / `label_rects` / `label_metrics` ) | ≤8 | 一个 Control;所有数字在一个 `_draw` |
| `board_label_shadow_layer.gd` | ≤2( `setup` / `circle_rects` ) | ≤6 | 一个 Node2D;所有圆在一个 `_draw` ;坐标=世界局部/格坐标 |
| `ap_bar_view.gd` (改造) | 既有 10 个公开函数不减 | 既有 14 个成员不增(左右栏容器为 `_init` 局部变量) | 不新增公开面/成员;只改 `_init` /`_build_*` |
| 三个测试件 | 每件 ≤20 个 `func _test_*` | 夹具变量 ≤15 | 不计生产接口;测试件无消费面 |
**存量触面 ** : `board_view.gd` 852 行、公开方法 27、类变量 31→30(删 `_palette` );本批只扩展 `set_cell_area(avail, side_rail_w := 0.0)` 与 `rebuild(board, minesweeper, side_rail_w := 0.0)` 的可选参数,新增 `_visual_rect_for` /`_top_face_rect` /`_resort_cell_decals` 私有方法,**不新增公开方法/成员**;地形/浮空/阴影圆层经固定名字子节点取用(`TerrainBack` /`TerrainFront` /`LabelShadow` /`FloatLayer` );S13 键只降不升。`board_zone_view.gd` 6→7 成员(新增 `_side_rail_w` ,默认阈值内)。`board_cell_unit.gd` 12→13 成员(删 `base` 与 `_BASE_LAYER` 预载,新增 `top_face_offset` /`visual_rect` ,保留 `plate` 封印色牌;净 +1; `ContactGlow` /`MemoryGround` 用固定名字子节点、不新增成员,默认阈值内)。`ap_bar_view.gd` 14 成员不增。`cell_mark_overlay.gd` 普通数字路径只减面,封印格色牌/字形面保留。迁移函数对账:`cell_base_layer.gd` 的 `draw_base` /`_draw_south_facade` /`_draw_north_projection` /`_draw_e_facade` 不迁入新件同名函数,新件按职责重写并保留像素判据;`tile_palette.gd` 的 `load_board_tiles` /`digit_ink_mode` /`normalize_floor_luma` 不迁移(职责退役)。
**存量触面 ** : `board_terrain_layer.gd` 新增的贴图成员只服务材质面,不进 `board_view.gd` ; `board_ view.gd` 852 行、公开方法 27、类变量 31→30(删 `_palette` );本批只扩展 `set_cell_area(avail, side_rail_w := 0.0)` 与 `rebuild(board, minesweeper, side_rail_w := 0.0)` 的可选参数,新增 `_visual_rect_for` /`_top_face_rect` /`_resort_cell_decals` 私有方法,**不新增公开方法/成员**;地形/浮空/阴影圆层经固定名字子节点取用(`TerrainBack` /`TerrainFront` /`LabelShadow` /`FloatLayer` );S13 键只降不升。`board_zone_view.gd` 6→7 成员(新增 `_side_rail_w` ,默认阈值内)。`board_cell_unit.gd` 12→13 成员(删 `base` 与 `_BASE_LAYER` 预载,新增 `top_face_offset` /`visual_rect` ,保留 `plate` 封印色牌;净 +1; `ContactGlow` /`MemoryGround` 用固定名字子节点、不新增成员,默认阈值内)。`ap_bar_view.gd` 14 成员不增。`cell_mark_overlay.gd` 普通数字路径只减面,封印格色牌/字形面保留。迁移函数对账:`cell_base_layer.gd` 的 `draw_base` /`_draw_south_facade` /`_draw_north_projection` /`_draw_e_facade` 不迁入新件同名函数,新件按职责重写并保留像素判据;`tile_palette.gd` 的 `load_board_tiles` /`digit_ink_mode` /`normalize_floor_luma` 不迁移(职责退役)。
**指标例外申报 ** :无。若实现期发现 `board_terrain_layer.gd` 超过 7/13,按职责拆 `board_terrain_face_layer.gd` (崖面/投影)——先停卡呈报,不在实现段自行扩面。
@@ -227,7 +227,7 @@
- [ ] 跑 `board_shot_probe` 存三关当前帧与 `board_meta.json` ,记下 hash;不重制基线(T7 才换代)。
- [ ] 确认 `game/assets/art/board/` 63 PNG+ 63 `.import` + `seal_mark.png` 在库;报告列清单。
- [ ] 跑 `python tools/gdstyle_gate.py` 记录 `board_view.gd` 当前 27/31 基线读数;跑 `python tools/capability_audit.py` 记录当前红项(T8 复跑)。
- [ ] 录三关 `board_type` 字符串与 art-bible v3.51 §4.1 三关八色;不采样旧瓦片均值。
- [ ] 录三关 `board_type` 字符串与 art-bible v3.53 §4.1 三关八色;不采样旧瓦片均值。
### T1 布局表与 D 区侧栏(1.5 日)
@@ -258,21 +258,34 @@
- [ ] `ui_input_probe.gd:360-366` 的 `set_cell_area` 恢复调用带 `main.db.presentation.battle_layout.side_rail_w` ; `board_gen_reward_test` 的 2 参调用保持(测试独立口径)。
- [ ] 跑 `board_terrain_test` 与 `layout_probe` ;报告写读数。
### T3 地形深度层(2.0 日 )
### T-A 地形贴图接入(0.5 日,asset-ingest 段,2026-11-09 已完成 )
**取用 ** : T2 的格边/原点; art-bible v3.51 §4 .1 三关八色 。
**取用 ** : 用户 2026-11-09 目检通过的 `reports/2026-11-09-棋盘材质预览-v2.html` + art-bible v3.53 §8 .1/§8.5 。
**产出 ** :三关岩顶/地面 6 张 512×512 无缝贴图入 `game/assets/art/board/` ; `asset-path-map` / `art-assets-checklist` / `art-status-checklist` 登记;`.import` 边车;像素域 ≤32 色。
- [x] 资产契约:`board_rock_<board_type>.png` / `board_ground_<board_type>.png` , board_type=dungeon/underdark/deep_underdark;无缝、无边框/无亮边/均匀光照、方形;源尺寸 **512× 512 ** ;同一母图换色;单张像素域 ≤32 色。
- [x] 素材已按 asset-ingest 段接入:用户 2026-11-09 对三关整板、崖面/数字细部与 6 张母图确认「没有问题,可以按这样」;预览图作 `board_material_shot_probe` 目标图(非引擎基线),旧 C 方向原稿不再作为新材质基线。
- [x] 落位与边车:6 张全部在 `game/assets/art/board/` ,命名合规;Godot 4.7.2 `--import` 已生成 6 个 `.import` 。已按 `asset-path-map` §1 把 6 PNG+ 6 `.import` 同步到主区与 `board-material-fix` 工作区,两区各 12 项一致。
- [x] `asset-path-map.md` 的 `board/` 行改为「512×512 岩顶/地面 6 张无缝贴图+seal_mark」;`art-assets-checklist.md` 记录贴图材质;`art-status-checklist.md` 新增「棋盘岩顶/地面材质 6 张」✅ 行。
- [x] 缺位容错:`UiKit.load_tex` exists 守卫;缺图只在开发态回落 palette 平色,正式包必须 6 张齐;`board_terrain_test._test_material_assets_present` 断言 6 张在库。
- [x] 已删旧候选口径:不再引用 `artwork/2026-11-09-棋盘材质候选/` 的 128× 128 稿与 `board_preview_three_levels.png` 。
### T3 地形深度层(2.5 日)
**取用 ** :T2 的格边/原点;T-A 的 6 张贴图;art-bible v3.53 §4.1 三关八色。
**产出 ** : `board_terrain_palette.gd` 、`board_terrain_layer.gd` 两个实例(back/front);`BoardView` 装配;`cell_base_layer.gd` 删除;接触带迁入 CellUnit。
- [ ] `board_terrain_palette.gd` :八色常量(`Color("#...")` )按 art-bible v3.51 §4.1 三关表;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge` ; `palette_for(board_type)` 返回 Dictionary;未知 board_type 回退 dungeon 并记录(fail-fast 只在核心,呈现回退不刷错)。
- [ ] `board_terrain_palette.gd` :八色常量(`Color("#...")` )按 art-bible v3.53 §4.1 三关表;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge` ; `palette_for(board_type)` 返回 Dictionary; `tex_paths_for(board_type)` 返回岩顶/地面两条 `res://assets/art/board/...` 路径(路径单点); 未知 board_type 回退 dungeon 并记录(fail-fast 只在核心,呈现回退不刷错)。
- [ ] `board_terrain_layer.gd` 材质面:`setup` 末尾经 `UiKit.load_tex` 装载 `_tex_rock` /`_tex_ground` ( exists 守卫,禁 preload);地面整板一次铺图(`draw_texture_rect` 或等价,UV 用棋盘全局坐标);岩顶按合并岩体一次铺图(同块岩体内相邻格 UV 连续、禁逐格重置、无拼缝);崖面用低对比、断续且错开的岩块面,临空边缘收薄,内阴影与投影按 §1 完成定义 3;缺图时退回 palette 平色(仅开发容错,正式包必须 T-A 6 张齐)。
- [ ] `board_terrain_layer.gd` : `setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)` ( `sealed_at` = 封印格查询 Callable);`set_pass("back"/"front")` ; `set_hero_foot_y(y)` ; `_draw()` 中**地面/投影/封印石/背岩体只在 back 画**(整板悬崖仍由 `BoardWorld._draw` 承担,不重复绘制),岩体按 pass 过滤(back=脚底≤hero, front=>hero),每个 setter 调 `queue_redraw()` ;静态 `lift_for(cell)` /`eshift_for(cell)` 。
- [ ] 封印石贴片(back):`sealed_at(c)` 为真的格,在连续地面之上铺本格逻辑 rect 的 `palette.light_edge` 实色(可带 1px `palette.seam` 收边),不越格、不加新色;封印黑对受光棱对比 6.45– 9.94:1( art-bible v3.51 §3.2/§4.1)。
- [ ] 岩顶公式:`LIFT=round(cell*0.435)` 、`ESHIFT=round(cell*0.109)` ;四邻连通合并;相邻墙顶搭接 2;板边外延 ESHIFT;南崖高 LIFT、宽 cell+ESHIFT;东崖宽 ESHIFT、高 cell+LIFT; 禁 竖条纹。
- [ ] 封印石贴片(back):`sealed_at(c)` 为真的格,在连续地面之上铺本格逻辑 rect 的 `palette.light_edge` 实色(可带 1px `palette.seam` 收边),不越格、不加新色;封印黑对受光棱对比 6.45– 9.94:1( art-bible v3.53 §3.2/§4.1)。
- [ ] 岩顶公式:`LIFT=round(cell*0.435)` 、`ESHIFT=round(cell*0.109)` ;四邻连通合并;相邻墙顶搭接 2;板边外延 ESHIFT;南崖高 LIFT、宽 cell+ESHIFT;东崖宽 ESHIFT、高 cell+LIFT; 崖面分段由格坐标确定性哈希驱动,任何岩层线不得贯通整条崖面,禁规则三角装饰带与 竖条纹。
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `_world/TerrainBack` ( z=-1)与 `_world/TerrainFront` ( z=2),不新增类成员;两层设 `use_parent_material = true` (随 `_world.material` 去饱和);back 画地面/投影/封印石/背岩体;front 画南侧岩体;`hero z=1` 不变;格件 z 按脚底行分档(北侧 0、南侧 3;**封印格恒 0**),由 `_resort_cell_decals` 重算(顶面贴花/交互/迷雾同格件 z);`board_world` 悬崖保留 z=0、`mat` 取新 palette 岩顶色(`_refresh_slab` 不再写 `COL_BRICK` );`rebuild` 清 `_world` 子件时跳过 `TerrainBack` /`TerrainFront` /`LabelShadow` (只清格件与英雄),再对各层重跑 `setup` (不重建节点);`setup` 传入 `_minesweeper.has_seal` 作 `sealed_at` 。
- [ ] `BoardView._resort_cell_decals()` (私有):遍历 `_cells` , `u.z_index = 0 if u.seal_on else (3 if c.y > hero.y else 0)` ; `ContactGlow` /`MemoryGround` 子件 `z_as_relative=false` 、`z_index=-1` (全局 -1:地面之上、阴影圆 0 之下);`refresh` 与 `_update_hero` 末尾调用;hero 缺位时全部按 0 档。
- [ ] `board_view.gd` 删 `_paint_cell_base` /`_paint_cell_facade` (及 `_paint_cell` /`refresh` 调用)、`_floor_tile_for` /`_wall_tile_for` 、`_build_cell_unit` 的 `u.base.bevel` ; `_paint_cell_ink` 删 `bg` 计算/返回(`COL_FLOOR` /`COL_BRICK` 随之删)但保留 glyph 计算:**封印格写 `u.glyph` /`u.glyph_color` /`u.plate=true` (色牌字形),普通已开格只把 glyph 交给浮空 entries、`u.glyph` 留空**; `_apply_contact_bands` /`_process` /`_reset_breath` 的 `u.base.contact_*` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)` (不再经 `u.base` );`COL_DIGIT` 无引用即删;英雄贴图缺位字形「人」回退随基座退役(T4 登记)。
- [ ] 删除 `cell_base_layer.gd` ; `board_cell_unit.gd` 去 `_BASE_LAYER` 预载、`base` 成员与 `base.draw_base` ,文件头注删 `cell_base_layer` 引用;英雄蓝框随基座退役;接触带绘制迁入固定名字低层子件 `ContactGlow` ( `z_as_relative=false` 、全局 z=-1:地面之上、阴影圆 0 之下;只画英雄格地面侧,正交整边/斜向角点+两半边,逻辑格边,不进岩体);记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround` (同全局 -1);BoardView 计算 `ground_visible_rect` (本格逻辑 rect 扣除南/东邻未开格岩顶越入,南邻约 LIFT−SEP、东邻约 ESHIFT− SEP)并下发 `MemoryGround.setup(...)` /`ContactGlow.set_bands(..., ground_visible_rect)` ,子件不读棋盘、CellUnit 不增成员;两个低层子件只绘地面可见区,禁整矩形覆盖 back 岩顶/崖面;设 `use_parent_material = true` (随世界去饱和);`draw_removed_dim` 墙格改顶面 rect。
- [ ] `standee_present_values_test.gd:79-86` : `cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd` (北/西主亮棱绘制点),删 `FACADE_HIGHLIGHT_PX), UiKit.BRICK, true` 断言;`body_src` 段保留;跑该件至 0。
- [ ] `board_terrain_test.gd:_test_merged_mass_geometry` :四邻合并、相邻墙顶 rect 相交/搭接 2、无墙顶内框、地面无缝;`_test_projection_ratios` : 38 格 LIFT=17、ESHIFT=4、南崖 17× 42、南崖顶缘高光=本关受光棱 、东崖 4× 55、北/西 2+2 +外 2 墨边、南/东内阴影 3× 2 。
- [ ] `board_terrain_test.gd:_test_merged_mass_geometry` :四邻合并、相邻墙顶 rect 相交/搭接 2、无墙顶内框、地面无缝;`_test_projection_ratios` : 38 格 LIFT=17、ESHIFT=4、南崖 17× 42、南崖顶缘 1px 受光口沿+1px 深墨线 、东崖 4× 55、北/西 1+1 +外 2 墨边、南/东内阴影 3× 1、崖面无贯通岩层线; `_test_material_assets_present` : 6 张 512× 512 贴图在库且 `tex_paths_for` 三关路径非空; `_test_material_vs_structure` :岩顶/地面采样来自贴图(相邻格 UV 连续、无平色断带),崖面/边缘仍为 palette 结构色 。
- [ ] `board_terrain_test.gd:_test_depth_order` :三行夹具,断言 back 含北岩体、front 含南岩体、hero 在两者之间;北侧格件 `z_index=0` 、南侧格件 `z_index=3` 、**封印格(含南侧)`z_index=0` **、`ContactGlow` /`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素(探针)。
- [ ] `run_all.gd` 注册 `board_terrain_test.gd` 。
- [ ] 跑三关 golden 采集(先不重制基线)看差异落点;报告写地形层 draw calls。
@@ -282,12 +295,12 @@
**取用 ** :T2 的原点/格边;T3 的深度分层。
**产出 ** : `board_float_layer.gd` ( Control 外壳)、`board_label_shadow_layer.gd` ( Node2D 世界层);`BoardView` 装配;`cell_mark_overlay` 删数字路径。
- [ ] `board_float_layer.gd` : `setup(cell, origin, entries, font)` ( origin = 壳层棋盘原点);`_draw()` 画双色引导线(左深右浅、2px、格顶−12..格顶+4)→数字(字高 21、2px 八向描边、1px 浮空投影、暖白芯);`危/?` 同规则;`label_rects()` /`label_metrics()` (壳层局部坐标);全幅 Control(`mouse_filter=IGNORE` )、z 最高;每个 setter 调 `queue_redraw()` ;**不画阴影圆;封印格不进 entries**。
- [ ] `board_label_shadow_layer.gd` : `setup(cell, cells)` (世界局部/格坐标系,不传 shell 原点;`cells` = 浮空 entries 的格集,**不含封印格**);`_draw()` 画 10×6 四层同心椭圆(外→内 α4 0/70/105/140 ,尺寸 100%/80%/60%/40%;用 `draw_set_transform` 缩放后 `draw_circle` 或 16 点椭圆多边形,禁单用 `draw_circle` );圆心 = 逻辑格心、格顶+7;z=0(小人之下);`circle_rects()` (世界局部);setter 调 `queue_redraw()` 。
- [ ] `board_float_layer.gd` : `setup(cell, origin, entries, font)` ( origin = 壳层棋盘原点);`_draw()` 画双色引导线(左深右浅、2px、格顶−12..格顶+4,线底接阴影圆上缘 )→数字(字高 21、2px 八向描边、1px 浮空投影、暖白芯);`危/?` 同规则;`label_rects()` /`label_metrics()` (壳层局部坐标);全幅 Control(`mouse_filter=IGNORE` )、z 最高;每个 setter 调 `queue_redraw()` ;**不画阴影圆;封印格不进 entries**。**几何硬口径**:字高 21 = 字形墨高(不含描边),渲染字号取使墨高=21 的值(现行融合像素字体 27; `FONT_H` 仍记 21 作墨高/矩形高); `draw_string` / `draw_string_outline` 的 pos 是**基线**,一律传 `rect.position + Vector2(0, FONT_H)` (矩形底边),禁把矩形顶当绘制原点; `_label_rect` 行 y 用步距 `(格边 + 2)` (与格件/引导线/阴影圆同式),字底 = `origin.y + c.y × 步距 − 15` 、矩形高 21;多行不得按 `c.y × 格边` 落位(逐行漂移 2px)。
- [ ] `board_label_shadow_layer.gd` : `setup(cell, cells)` (世界局部/格坐标系,不传 shell 原点;`cells` = 浮空 entries 的格集,**不含封印格**);`_draw()` 画 10×6 四层同心椭圆(外→内 α3 0/52/78/108 ,尺寸 100%/80%/60%/40%;用 `draw_set_transform` 缩放后 `draw_circle` 或 16 点椭圆多边形,禁单用 `draw_circle` );圆心 = 逻辑格心、格顶+7;z=0(小人之下);`circle_rects()` (世界局部);setter 调 `queue_redraw()` 。
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `FloatLayer` ( BoardView 子 Control,全幅,z 最高)与 `_world/LabelShadow` (Node2D,z=0),不新增类成员;`LabelShadow` 设 `use_parent_material = true` , `FloatLayer` 不在 `_world` 材质链,`set_desaturated` 同拍给 `FloatLayer.material = _desat_mat` /`null` (结算期浮空数字同样灰化,禁成彩色例外);`rebuild` 清 `_world` 子件时跳过 `LabelShadow` (T3 同款跳过表);entries 由 `refresh` 的已开记录生成(`1– 8` /`危` /`?` ),**封印格跳过**(其字形走色牌),记忆态不生成 entries。
- [ ] `BoardView.set_world_font(f)` 同时 `FloatLayer.set_font(f)` ; `cell_mark_overlay.gd` 删普通数字字形/色牌路径,**保留封印格字形+`_draw_digit_plate` 色牌**; `BoardCellUnit.plate` 保留(封印格 `true` 、普通格 `false` );`board_view.gd` 删 `_digit_ink` /`_palette.digit_*` ; `refresh` 字形段删 `_digit_ink` 三档与 `plate_digit` 普通路径(:586-591),封印格写 `u.glyph` /`u.glyph_color` /`u.plate=true` ,普通已开格只交 entries(记忆墨仍用 `FOG_MEMORY_INK` ;浮空字固定暖白芯);英雄贴图缺位字形「人」回退随基座退役(资产在包,正常路径不可达),实现报告「实现决定记录」登记。
- [ ] `run_all.gd` 注册 `board_float_label_test.gd` 。
- [ ] `board_float_label_test.gd:_test_label_geometry` :字高 21、字底距格顶 15、视觉顶距格顶 38、线 2px、1px 投影;`_test_topmost_layer` : `FloatLayer` 为 BoardView 子 Control、z 最高、顶行 rect 在 D 区内(顶行 top=6 local);`_test_shadow_circle` :圆 10× 6、圆心格顶+7、`_world/LabelShadow.z==0` 低于 hero、开启格才有圆、封印格无圆;`_test_desaturation` : `set_desaturated(true)` 后 `FloatLayer.material` 与 `TerrainBack/TerrainFront/LabelShadow` 的 `use_parent_material` 同拍生效;`_test_contrast` :四类底复合对比 ≥4.5。
- [ ] `board_float_label_test.gd:_test_label_geometry` :字高 21(墨高;矩形高 21) 、字底距格顶 15、视觉顶距格顶 38、线 2px、1px 投影;**行 y 按步距 `(格边+2)` 落位**(至少两行断言,第 2 行起零漂移);三关截图目检数字墨底与引导线相接、线底接住阴影圆上缘、无长线悬空; `_test_topmost_layer` : `FloatLayer` 为 BoardView 子 Control、z 最高、顶行 rect 在 D 区内(顶行 top=6 local);`_test_shadow_circle` :圆 10× 6、圆心格顶+7、`_world/LabelShadow.z==0` 低于 hero、开启格才有圆、封印格无圆;`_test_desaturation` : `set_desaturated(true)` 后 `FloatLayer.material` 与 `TerrainBack/TerrainFront/LabelShadow` 的 `use_parent_material` 同拍生效;`_test_contrast` :四类底复合对比 ≥4.5。
- [ ] `board_float_label_test.gd:_test_no_ordinary_plate_path` 与 `board_terrain_test.gd:_test_seal_substrate` 扫描/断言:普通数字路径(`board_view.gd` /`board_float_layer.gd` 与 `cell_mark_overlay` 的非封印分支)零 `plate_digit` /`_digit_ink_mode` ; `DIGIT_PLATE` /`_draw_digit_plate` 只在封印格分支命中。
- [ ] 跑 `board_float_label_test` ;三关截图看顶行数字越界与小人遮圆;报告写读数。
@@ -298,7 +311,7 @@
- [ ] `BoardView._top_face_rect(c)` (私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell, cell)` 、地面格逻辑 rect; `BoardView._visual_rect_for(c)` (私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell+ESHIFT, cell+LIFT)` 、地面格逻辑 rect;两者不新增公开方法。
- [ ] `CellUnit` 增 `top_face_offset` (墙格 `(-ESHIFT,-LIFT)` 、地面 `(0,0)` )与 `visual_rect` ; `_draw` 用 `Rect2(top_face_offset, edge, edge)` 传给 face; `_sync_seal_layer` 调 `setup(edge, visible)` ( **不传 top_face_offset**——封印居逻辑格心,见下条);`cell_type_glow_layer.setup(edge, group, top_face_offset)` ; `cell_mark_overlay` 的变异/徽章/悬停/退色/路径按该 rect(墙格顶面、地面逻辑;路径点迹只地面逻辑)。
- [ ] 封印圆心:`seal_mark_layer.setup(edge, visible)` 不变(子件本地全幅 draw_rect,圆心 = CellUnit 本地 `(edge/2, edge/2)` = 逻辑格心);**不随岩顶 − ESHIFT/− LIFT 偏移**( art-bible v3.51 §3.2/§8.2);环径/环壁/十字/光圈比例不变;验收 `ring_px` 仍 82%±1。封印子件设 `show_behind_parent = true` ,保证身份色牌叠于法阵之上;封印格地面受光棱石由 `board_terrain_layer` back 画(T3)。
- [ ] 封印圆心:`seal_mark_layer.setup(edge, visible)` 不变(子件本地全幅 draw_rect,圆心 = CellUnit 本地 `(edge/2, edge/2)` = 逻辑格心);**不随岩顶 − ESHIFT/− LIFT 偏移**( art-bible v3.53 §3.2/§8.2);环径/环壁/十字/光圈比例不变;验收 `ring_px` 仍 82%±1。封印子件设 `show_behind_parent = true` ,保证身份色牌叠于法阵之上;封印格地面受光棱石由 `board_terrain_layer` back 画(T3)。
- [ ] 类型微光:绘制 rect 改顶面 rect;`board_shot_probe` /`type_glow_shot_probe` 的「禁越圈」允许区改顶面 rect;微光不越出本格岩顶。
- [ ] 迷雾:`CellUnit._draw_fog_layer` 墙格画三块黑罩(顶面 rect+南面 `Rect2(x-ESHIFT,y-LIFT+cell,cell+ESHIFT,LIFT)` +东面 `Rect2(x-ESHIFT+cell,y-LIFT,ESHIFT,cell+LIFT)` ;只在未开格);记忆态由固定名字低层子件 `MemoryGround` 画新地面色(palette floor)+灰罩+记忆墨数字,不读 `base.tex_base` ,不生成浮空 entries;只绘地面可见区(扣南/东邻岩顶越入),不覆盖北/西邻格地面;封印格在记忆态同样随格隐没(印记与色牌不显)。
- [ ] 接触带:绘制迁入固定名字低层子件 `ContactGlow` (全局 z=-1:地面之上、阴影圆 0 之下);`board_view._apply_contact_bands` /`_process` /`_reset_breath` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)` ,不再经 `u.base.contact_*` ;只画英雄格地面侧,正交整边/斜向角点+两半边;只绘地面可见区(扣南/东邻岩顶越入);`_contact_unit` rect 不改;光不进岩体。
@@ -310,21 +323,22 @@
**取用 ** : T3/T4/T5 绿。
**产出 ** : 63 PNG+ 63 `.import` 删除;`tile_palette.gd` /`terrain_tile_sets_test.gd` 删除;`player_copy_sweep_test` 落牌断言替换;`ui_contrast_probe` 迷雾派生段替换。
- [ ] 删除 `game/assets/art/board/terrain_*` 63 PNG 与同名 `.import` ;保留 `seal_mark.png` + `.import` 。
- [ ] 删除 `game/assets/art/board/terrain_*` 63 PNG 与同名 `.import` ;保留 `seal_mark.png` + `.import` 与 T-A 的 6 张 `board_rock_*` / `board_ground_*` 贴图 。
- [ ] 删除 `tile_palette.gd` 、`terrain_tile_sets_test.gd` ; `run_all.gd` 移除该套件;`board_view.gd` /`board_world.gd` /`ui_contrast_probe.gd` 的 `TilePalette` 引用全清。
- [ ] `player_copy_sweep_test.gd:142-147` :普通已开危险格 `u.plate==true` 改 `u.plate==false` ,并断言浮空 entries 含该格(或 `label_metrics()` 有该格);封印格色牌断言归 `board_terrain_test._test_seal_substrate` ; `ui_contrast_probe._fog_derived_check` 改读 `board_terrain_palette` 的新地面/岩顶色或渲染帧取样,三行行值按新地面色重算(±2/255),删除旧瓦片均值段。
- [ ] `board_terrain_test.gd:_test_legacy_assets_absent` :目录无 `terrain_*` 、`seal_mark.png` 在库;源码 grep 零 `terrain_` /`TilePalette` /`CellBaseLayer` /`u.base` 。
- [ ] `board_terrain_test.gd:_test_legacy_assets_absent` :目录无 `terrain_*` 、`seal_mark.png` 在库、6 张 `board_rock_*` / `board_ground_*` 在库 ;源码 grep 零 `terrain_` /`TilePalette` /`CellBaseLayer` /`u.base` 。
- [ ] 跑 `repo_structure_audit.py` 、`capability_audit.py` 与 `board_terrain_test` ;报告写清单;旧地形行**保留**(实现批禁写 `game/tests/README.md` ;删除归写卡段后续,T8 audit 经卡内豁免通道绿)。
### T7 验收面换代与三关 golden( 1.0 日)
### T7 验收面换代与三关 golden( 1.5 日)
**取用 ** : T3– T6 全绿。
**产出 ** : `board_shot_probe` 视图 1036× 548、侧栏 200、顶面 rect 微光圈/封印 rect;三关 golden 重制;渲染闸绿;`type_glow_shot_probe` /`layout_probe` /`ui_input_probe` /`ui_contrast_probe` 换代;三关色板逐值/互辨。
- [ ] `board_shot_probe.gd` : `view.size=Vector2(1036,548)` 、`view.position=Vector2.ZERO` ; `view.rebuild(..., 200)` ; `_meta` 写全幅 rect; `_crop_cell` 用 `_visual_rect_for` 的屏幕换算;`_check_dual_frames` 的允许区改顶面 rect(用 `lift_for/eshift_for` 换算);**`_seal_evidence` 保持逻辑格 rect(封印居格心),选择器按迭代56后的 `has_seal` 口径**;注释与 `game/tests/golden/README.md` 口径一致。
- [ ] `type_glow_shot_probe.gd:64-78` 视图改 1036× 548、`rebuild(..., 200)` (与生产同格边 38),允许区/取样改顶面 rect;`layout_probe.gd` 的 `_cell_for` 带侧栏;`ui_input_probe.gd` 的恢复调用带侧栏;`ui_contrast_probe` 浮空四类底段与迷雾段换代。
- [ ] 跑一次渲染闸看差异(预判棋盘三图全幅 changed>0,属换代);**显式呈报用户,按 `game/tests/golden/README.md` 现行口径获用户确认后**再按 `tools/golden_baseline_refresh.sh` 重制三关基线;复闸绿 。
- [ ] 三关色板逐值核对: `board_terrain_test.gd:_test_palette_three_boards` 与 art-bible v3.51 §4.1 三关八色同值(用户 2026-11-07 已看样张冻结); `glow_discrimination_sheet.py` 读已删旧 `terrain_*` ,本批不跑,工具换代登记待办(tools 批);不过即停卡呈报,不调色绕过 。
- [ ] 材质过审预览锚(非引擎帧): `game/tests/golden/board_material_L1.png` / `_L2` / `_L3` (三关整板,12× 8、格边 46)+ `board_material_L1_zoom2.png` / `_digit6` / `_hero4` / `_top4` (第一关机械裁切)已按 2026-11-09 用户目检通过的预览重制,并在 `golden/README.md` 登记为预览锚、明确不替代 `board_L*` ;新增/扩展 `board_material_shot_probe` 以同一 12×8、46px 构图复刻,与 512×512 新材质、断续岩块和薄边缘对齐比对(材质/构图差异判据沿用渲染闸容差) 。
- [ ] 引擎侧 `board_L1_dungeon` / `board_L2_underdark` / `board_L3_deep_underdark` 仍待实现后换代:先跑一次渲染闸看差异(预判全幅 changed>0,属换代);**显式呈报用户,按 `game/tests/golden/README.md` 现行口径获用户确认后**再按 `tools/golden_baseline_refresh.sh` 重制三关引擎基线;复闸绿。材质过审预览锚不替代本步 。
- [ ] 三关色板逐值核对:`board_terrain_test.gd:_test_palette_three_boards` 与 art-bible v3.53 §4.1 三关八色同值(用户 2026-11-07 已看样张冻结);`_test_material_assets_present` 核对 6 张 512×512 与像素域 ≤32(实测岩顶 9 色、地面 6 色);`glow_discrimination_sheet.py` 读已删旧 `terrain_*` ,本批不跑,工具换代登记待办(tools 批);不过即停卡呈报,不调色绕过。
- [ ] 跑 `bash tools/run_all_gates.sh --code` ;报告写 smoke/unit/probe/render 读数。
### T8 产出物落位(0.5 日)
@@ -346,23 +360,23 @@
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+通过判据) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| 1. D 区侧栏+提示条退役(判据:`design/ux/battle.md:124 ` 、`design/gdd/systems/表现与支撑/HUD框架.md:62 ` ) | `battle_layout_table.gd` 、`battle_layout.tres` 、`ap_bar_view.gd` 、`board_zone_view.gd:23-37,74-79,91-92` | `board_side_rail_test.gd:_test_side_rail_layout` + `_test_signals` ; `stage_background_test.gd:_test_side_rail_width_from_table` ; `layout_probe.gd:_ready` | 单元+探针 | `BoardZoneView.new(layout)` →`ap_bar` /`_board_area` (测试读私有) | 左/右栏各宽 200、board_area 高 548、`side_rail_w==200` 、hint 节点不存在、toast 不压棋盘 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) |
| 2. 格边/原点/顶预留/重建接线(判据:`design/ux/battle.md:140,144 ` ) | `board_view.gd:205-232,403-404,428-439` 、`main.gd:470` 、`main_debug_flow.gd:104` | `board_terrain_test.gd:_test_cell_formula_base` + `_test_hit_test_logical_rect` ; `layout_probe.gd:_ready` ; `ui_input_probe.gd` | 单元+探针 | `BoardView.set_cell_area(Vector2(1036,548), 200)` / `rebuild(..., 200)` | `_cell_for(12, Vector2(1036,548), 200)==38` 、`_cell_for(14, Vector2(1036,548), 200)==32` 、局部原点 (279,44)/(281,44)、屏幕 (523,296)、全格命中 | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md:170,173 ` ) | `board_terrain_layer.gd` (新增)、`board_view.gd` 、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry` ; `standee_present_values_test.gd:_init` ( V11 源码锚改指 `board_terrain_layer.gd` );三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()` →`_world/TerrainBack` 、`_world/TerrainFront` 的 `mass_rects()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 4. 投影/崖面/受光(判据:`design/art/art-bible.md:171,172,174 ` ) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios` ;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17× 42、南崖顶缘高光=本关受光棱 、东崖 4× 55、北/西 2+2 +外2、南/东内阴影 3× 2 自 0.217 起、投影 4× 4 α 0.44/0.30 /0.16 /0.07 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 5. 脚底排序遮挡(判据:`design/art/art-bible.md:175 ` ) | `board_terrain_layer.gd` 、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order` ;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]` / `CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow` /`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md:176 ` 、`design/ux/battle.md:307 ` ) | `board_float_layer.gd` (新增)、`board_label_shadow_layer.gd` (新增) | `board_float_label_test.gd:_test_label_geometry` + `_test_shadow_circle` + `_test_contrast` ; `ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()` →`FloatLayer.set_entries()` / `_world/LabelShadow.setup()` | 字高 21、间距 15、视觉顶 38、线 2、1px 投影 ;圆 10×6、圆心格顶+7、z=0 低于 hero; **封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
| 7. 浮空层最顶/顶行不裁切(判据:`design/ux/battle.md:165,307,313 ` ) | `board_view.gd` 层装配、`board_float_layer.gd` | `board_float_label_test.gd:_test_topmost_layer` + `_test_desaturation` ;三关截图 | 单元+探针 | `BoardView` 固定名字子件 z 序与 entries/`set_desaturated()` | `FloatLayer` 为 BoardView 子 Control、z 最高;`TerrainBack` /`TerrainFront` /`LabelShadow` 固定名字在树;顶行 rect top=6 local;无元素遮数字/线;结算期浮空层与地形层同拍灰化 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
| 8. 顶面锚点/封印/交互(判据:`design/art/art-bible.md:167,175 ` 、`design/ux/battle.md:311-312 ` ) | `board_view.gd` 、`cell_mark_overlay.gd` 、`seal_mark_layer` 、`cell_type_glow_layer` 、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor` + `_test_seal_substrate` ; `seal_mark_params_test.gd` ; `type_glow_test.gd` | 单元+探针 | `BoardView.refresh()` →`CellUnit.visual_rect` / `CellUnit.z_index` /封印格 `plate` | **封印圆心=逻辑格心(不偏移) ** 、变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;封印格 `plate=true` 、`glyph` 为危/数字、无浮空/无圆、色牌叠法阵上;封印格 z=0 低于小人,其余格件北 0/南 3 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
| 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md:427-429 ` ) | `board_cell_unit.gd:_draw_fog_layer` / `MemoryGround` 、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect` + `_test_memory_cover` ; `ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()` →`CellUnit.fog_state` / `MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);封印格记忆态随格隐没;封印格地面=palette.light_edge;记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
| 10. 命中逻辑格(判据:`design/ux/battle.md:140 ` ) | `board_view.gd:428-439` | `board_terrain_test.gd:_test_hit_test_logical_rect` | 单元 | `BoardView.cell_center_local()` /`_cell_at()` | 全格 `_cell_at(cell_center_local(c))==c` ;顶面左上角点按逻辑归北/西邻格;板外 (-9,-9) | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md:177,215 ` ) | `game/assets/art/board/` 、`tile_palette.gd` 、`cell_base_layer.gd` 、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent` ; `board_float_label_test.gd:_test_no_ordinary_plate_path` ; `repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*` 、零 `TilePalette` /`CellBaseLayer` /`u.base` 、`seal_mark.png` 在库、普通数字零 `plate_digit` /`_digit_ink_mode` (封印格 `plate` /`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 |
| 12. 侧栏信号/setter(判据:`design/ux/battle.md:163 ` ) | `ap_bar_view.gd` | `board_side_rail_test.gd:_test_signals` | 单元 | 真实按钮 `pressed` /setter | `stop_pressed` /`refresh_confirmed` /`legend_toggled` 逐信号;`set_ap` /`set_rap` /`set_refresh_state` 读数 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) |
| 13. 接触带延续(判据:`design/art/art-bible.md:168 ` ) | `board_cell_unit.gd` 、`board_view.gd:740,764-765` | `board_terrain_test.gd:_test_contact_glow` ; `type_glow_test.gd` | 单元 | `BoardView.refresh()` →`ContactGlow.set_bands(..., ground_visible_rect)` | 英雄格地面侧接触带在位,正交整边/斜向角点+两半边,只绘地面可见区、不进岩体;全局 z=-1 | 既有:未开格类型微光(8 邻作用集、五组色相、零玩法写入) |
| 14. 三关色板/互辨(判据:`design/art/art-bible.md:202,415 ` ) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")` | 三关八色与 art-bible v3.51 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定;封印石读 `light_edge` | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 15. 取证面换代(判据:`game/tests/golden/README.md:28,31 ` ) | `board_shot_probe.gd` 、`type_glow_shot_probe.gd` 、`layout_probe.gd` 、`ui_input_probe.gd` 、`ui_contrast_probe.gd` | 三关 `board_shot_probe` +渲染闸;`type_glow_shot_probe` ; `layout_probe.gd:_ready` ; `ui_input_probe.gd` ; `ui_contrast_probe.gd` | 探针+渲染闸 | `res://probe/board_shot_probe.tscn` ; `tools/render_gate.sh` | 视图 1036×548、侧栏 200、裁剪全幅、顶面 rect 微光圈、**封印取证保持逻辑格 rect(圆心格心)**、三关 golden 重制后 0 差异 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
| 16. 测试入口/能力审计(判据:`design/engineering/test-conventions.md:196 ` ) | `run_all.gd:225` 、新增测试件、`game/tests/README.md` | `bash tools/run_all_gates.sh --code` ; `capability_audit.py` | 集成 | 单元测试全套件 | 三新套件在册、terrain 套件移除、能力审计红项 0、全绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 17. 产出物/独立审计(判据:`design/engineering/test-conventions.md:147 ` ) | `reports/` | 末卡产出物落位;`reports/iter<N>-验收审计-<日期>.md` | 集成 | 实现报告/反哺点清单/审计报告 | 三件齐、逐行勾选、审计未过不合并 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
| 1. D 区侧栏+提示条退役(判据:`design/ux/battle.md「Layout Zones」side_rail_w ` 、`design/gdd/systems/表现与支撑/HUD框架.md「战斗屏三区双舞台:挖掘与结算同屏不切场景」D 区全高归棋盘 ` ) | `battle_layout_table.gd` 、`battle_layout.tres` 、`ap_bar_view.gd` 、`board_zone_view.gd:23-37,74-79,91-92` | `board_side_rail_test.gd:_test_side_rail_layout` + `_test_signals` ; `stage_background_test.gd:_test_side_rail_width_from_table` ; `layout_probe.gd:_ready` | 单元+探针 | `BoardZoneView.new(layout)` →`ap_bar` /`_board_area` (测试读私有) | 左/右栏各宽 200、board_area 高 548、`side_rail_w==200` 、hint 节点不存在、toast 不压棋盘 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) |
| 2. 格边/原点/顶预留/重建接线(判据:`design/ux/battle.md「Layout Zones」棋盘格尺寸公式 ` ) | `board_view.gd:205-232,403-404,428-439` 、`main.gd:470` 、`main_debug_flow.gd:104` | `board_terrain_test.gd:_test_cell_formula_base` + `_test_hit_test_logical_rect` ; `layout_probe.gd:_ready` ; `ui_input_probe.gd` | 单元+探针 | `BoardView.set_cell_area(Vector2(1036,548), 200)` / `rebuild(..., 200)` | `_cell_for(12, Vector2(1036,548), 200)==38` 、`_cell_for(14, Vector2(1036,548), 200)==32` 、局部原点 (279,44)/(281,44)、屏幕 (523,296)、全格命中 | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|材质与装饰 ` ) | `board_terrain_layer.gd` (新增)、`board_view.gd` 、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry` + `_test_material_assets_present` + `_test_material_vs_structure` ; `standee_present_values_test.gd:_init` ( V11 源码锚改指 `board_terrain_layer.gd` );三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()` →`_world/TerrainBack` 、`_world/TerrainFront` 的 `mass_rects()` / `tex_paths_for()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;6 张 512×512 贴图在库且被消费、相邻格 UV 连续; V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 4. 投影/崖面/受光(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|受光与崖面 ` ) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios` ;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17× 42、南崖顶缘 1px 受光口沿+1px 深墨线 、东崖 4× 55、北/西 1+1 +外2、南/东内阴影 3× 1、崖面无贯通岩层线、南向投影 4× 4 α 0.25/0.16/0.09/0.04、东向 α 0.22 /0.14 /0.07/0.04 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 5. 脚底排序遮挡(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|绘制序与遮挡 ` ) | `board_terrain_layer.gd` 、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order` ;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]` / `CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow` /`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|浮空数字 ` 、`design/ux/battle.md「D 区布局与棋盘画法预览」浮空字 ` ) | `board_float_layer.gd` (新增)、`board_label_shadow_layer.gd` (新增) | `board_float_label_test.gd:_test_label_geometry` + `_test_shadow_circle` + `_test_contrast` ; `ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()` →`FloatLayer.set_entries()` / `_world/LabelShadow.setup()` | 字高 21(墨高) 、间距 15、视觉顶 38、线 2(格顶−12..+4,接圆上缘)、1px 投影;**绘制基线 = 矩形底边、行 y 按步距(格边+2)** ;圆 10×6、圆心格顶+7、z=0 低于 hero; **封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
| 7. 浮空层最顶/顶行不裁切(判据:`design/ux/battle.md「D 区布局与棋盘画法预览」禁裁切 ` ) | `board_view.gd` 层装配、`board_float_layer.gd` | `board_float_label_test.gd:_test_topmost_layer` + `_test_desaturation` ;三关截图 | 单元+探针 | `BoardView` 固定名字子件 z 序与 entries/`set_desaturated()` | `FloatLayer` 为 BoardView 子 Control、z 最高;`TerrainBack` /`TerrainFront` /`LabelShadow` 固定名字在树;顶行 rect top=6 local;无元素遮数字/线;结算期浮空层与地形层同拍灰化 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
| 8. 顶面锚点/封印/交互(判据:`design/art/art-bible.md「3.2 环境几何」封印印记 ` 、`design/ux/battle.md「封印格呈现预览」色牌 ` ) | `board_view.gd` 、`cell_mark_overlay.gd` 、`seal_mark_layer` 、`cell_type_glow_layer` 、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor` + `_test_seal_substrate` ; `seal_mark_params_test.gd` ; `type_glow_test.gd` | 单元+探针 | `BoardView.refresh()` →`CellUnit.visual_rect` / `CellUnit.z_index` /封印格 `plate` | **封印圆心=逻辑格心(不偏移) ** 、变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;封印格 `plate=true` 、`glyph` 为危/数字、无浮空/无圆、色牌叠法阵上;封印格 z=0 低于小人,其余格件北 0/南 3 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
| 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md「6.5 视野迷雾与黑暗区域渲染」记忆态 ` ) | `board_cell_unit.gd:_draw_fog_layer` / `MemoryGround` 、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect` + `_test_memory_cover` ; `ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()` →`CellUnit.fog_state` / `MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);封印格记忆态随格隐没;封印格地面=palette.light_edge;记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
| 10. 命中逻辑格(判据:`design/ux/battle.md「Layout Zones」格边按公式现算 ` ) | `board_view.gd:428-439` | `board_terrain_test.gd:_test_hit_test_logical_rect` | 单元 | `BoardView.cell_center_local()` /`_cell_at()` | 全格 `_cell_at(cell_center_local(c))==c` ;顶面左上角点按逻辑归北/西邻格;板外 (-9,-9) | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md「3.2 环境几何」棋盘地形体系|旧资产处理 ` ) | `game/assets/art/board/` 、`tile_palette.gd` 、`cell_base_layer.gd` 、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent` ; `board_float_label_test.gd:_test_no_ordinary_plate_path` ; `repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*` 、零 `TilePalette` /`CellBaseLayer` /`u.base` 、`seal_mark.png` 与 6 张 `board_rock_*` / `board_ground_*` 在库、普通数字零 `plate_digit` /`_digit_ink_mode` (封印格 `plate` /`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 |
| 12. 侧栏信号/setter(判据:`design/ux/battle.md「Component Inventory」行动资源侧栏 ` ) | `ap_bar_view.gd` | `board_side_rail_test.gd:_test_signals` | 单元 | 真实按钮 `pressed` /setter | `stop_pressed` /`refresh_confirmed` /`legend_toggled` 逐信号;`set_ap` /`set_rap` /`set_refresh_state` 读数 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) |
| 13. 接触带延续(判据:`design/art/art-bible.md「3.2 环境几何」可挖域接触带微光 ` ) | `board_cell_unit.gd` 、`board_view.gd:740,764-765` | `board_terrain_test.gd:_test_contact_glow` ; `type_glow_test.gd` | 单元 | `BoardView.refresh()` →`ContactGlow.set_bands(..., ground_visible_rect)` | 英雄格地面侧接触带在位,正交整边/斜向角点+两半边,只绘地面可见区、不进岩体;全局 z=-1 | 既有:未开格类型微光(8 邻作用集、五组色相、零玩法写入) |
| 14. 三关色板/互辨(判据:`design/art/art-bible.md「4.1 主色板」三关棋盘环境八色 ` ) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards` + `_test_material_assets_present` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")` / `tex_paths_for(...)` | 三关八色与 art-bible v3.53 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定;封印石读 `light_edge` ;6 张 512×512 贴图路径在库、单张像素域 ≤32(实测岩顶 9 色、地面 6 色) | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 15. 取证面换代(判据:`game/tests/golden/README.md「基线冻结与审核」才允许出候选图 ` ) | `board_shot_probe.gd` 、`board_material_shot_probe` (新增/扩展)、 ` type_glow_shot_probe.gd` 、`layout_probe.gd` 、`ui_input_probe.gd` 、`ui_contrast_probe.gd` | 三关 `board_shot_probe` +渲染闸;`board_material_shot_probe` 对过审预览图; ` type_glow_shot_probe`; `layout_probe.gd:_ready` ; `ui_input_probe.gd` ; `ui_contrast_probe.gd` | 探针+渲染闸 | `res://probe/board_shot_probe.tscn` ; `tools/render_gate.sh` ; `game/tests/golden/board_material_L1.png` (过审预览锚) | 视图 1036×548、侧栏 200、裁剪全幅、顶面 rect 微光圈、**封印取证保持逻辑格 rect(圆心格心)**、三关 golden 重制后 0 差异; 12× 8/46px 材质探针与 512×512 新材质、断续岩块、薄边缘预览对齐,差异在容差内 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
| 16. 测试入口/能力审计(判据:`design/engineering/test-conventions.md「8.9 三层模型」能力清单 ` ) | `run_all.gd:225` 、新增测试件、`game/tests/README.md` | `bash tools/run_all_gates.sh --code` ; `capability_audit.py` | 集成 | 单元测试全套件 | 三新套件在册、terrain 套件移除、能力审计红项 0、全绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
| 17. 产出物/独立审计(判据:`design/engineering/test-conventions.md「8.6 测试时机」不要求先红后绿 ` ) | `reports/` | 末卡产出物落位;`reports/iter<N>-验收审计-<日期>.md` | 集成 | 实现报告/反哺点清单/审计报告 | 三件齐、逐行勾选、审计未过不合并 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
**测试削弱申报 ** (允许删除/替换的旧断言):
@@ -384,7 +398,7 @@
- **L2 记录继续**:三关色板派生读数偏差在 ±1 通道内、draw calls 波动 <10%——记入实现报告继续。
- **L3 停机呈报**:
- 新路径与 art-bible 条款冲突(比例/顶预留/圆心/层序/三关色板/封印承载任一不符)——停卡,列反哺点,禁自行改条款。
- 封印呈现与迭代56「受理即揭示」或 art-bible v3.51 封印条冲突(印记落未开格、圆心随岩顶偏移、身份字形进浮空层、色牌层序颠倒、封印石对比 <4.5)——停卡呈报,禁把封印改回旧假设。
- 封印呈现与迭代56「受理即揭示」或 art-bible v3.53 封印条冲突(印记落未开格、圆心随岩顶偏移、身份字形进浮空层、色牌层序颠倒、封印石对比 <4.5)——停卡呈报,禁把封印改回旧假设。
- `board_terrain_layer` 超 7 公开方法/12 成员且按职责拆不出内聚单元——停卡走豁免/还债通道,禁凑数拆绿。
- 机检键与卡片契约互斥(如测试要求保留 `plate` 字段)——停卡呈报,禁为机检保留无效成员。
- 三关色板逐值/互辨不过——停卡呈报,禁调色绕过或改判据。
@@ -399,8 +413,8 @@
允许实现期自行拍板(超清单记入实现报告「实现决定记录」):
1. `board_terrain_layer` 内 back/front 两实例的精确 z 值(只要满足 back<hero<front、float 最高、阴影圆 0)。
2. 程序化材质 噪声的确定性哈希种子与采样频率(同板同参逐位复现;禁 RngService/自建 RNG;三关可辨、不出现逐格拼缝)。
3. 阴影圆四层 α 在 ±10% 内的微调与同心椭圆收缩比例(只要落样张轮廓、圆在格面、小人之下)。
2. 程序化结构/装饰 噪声的确定性哈希种子与采样频率(同板同参逐位复现;禁 RngService/自建 RNG;三关可辨、不出现逐格拼缝)。
3. 阴影圆四层 α 在 ±10% 内的微调与同心椭圆收缩比例(基准取 2026-11-09 过审预览的 30/52/78/108; 只要落样张轮廓、圆在格面、小人之下)。
4. 侧栏按钮的纵向间距与面板内边距(只要左右栏各 200、不压棋盘、不换位)。
5. 记忆态灰罩的绘制方式(只要不出现浮空层、对比 ≥4.5、地面色取 palette)。
6. 测试夹具的构造方式(直接 `new()` 或场景实例化,只要走真实入口)。
@@ -411,7 +425,7 @@
## 15. 待裁点
零待裁点。已裁记录:①underdark/deep 两关色板 2026-11-07 用户看方向样张后选「按目标八色冻结」;②棋盘底操作提示条退役 2026-11-07 用户选定;③合并 master 时与迭代56已闭合的封印改版对齐(用户 2026-11-07 已裁「封印受理即揭示」)——本卡承接其呈现面:已揭示地面格心+身份色牌+受光棱封印石承载(新地面 `#695038` 对封印黑仅 2.35– 2.98:1,受光棱 6.45– 9.94:1,保 art-bible ≥4.5 判据,零新增色);法阵参数/揭牌逻辑沿迭代56。开工门=U0(用户批卡);U0 前不写实现代码。
零待裁点。已裁记录:①underdark/deep 两关色板 2026-11-07 用户看方向样张后选「按目标八色冻结」;②棋盘底操作提示条退役 2026-11-07 用户选定;③合并 master 时与迭代56已闭合的封印改版对齐(用户 2026-11-07 已裁「封印受理即揭示」)——本卡承接其呈现面:已揭示地面格心+身份色牌+受光棱封印石承载(新地面 `#695038` 对封印黑仅 2.35– 2.98:1,受光棱 6.45– 9.94:1,保 art-bible ≥4.5 判据,零新增色);法阵参数/揭牌逻辑沿迭代56;④三关 512×512 材质、断续岩块与薄边缘 2026-11-09 用户目检 `reports/2026-11-09-棋盘材质预览-v2.html` 后确认「没有问题,可以按这样」 。开工门=U0(用户批卡);U0 前不写实现代码。
---
@@ -480,5 +494,26 @@
| 6 | 同上 | `roadmap.md` 冲突:master 迭代55/56行 vs 本卡旧版(无55/56、旧「二三关棋盘观感」) | 补写 | 保留 master 迭代位/下一步原文,仅把待编池「二三关棋盘观感(待设计+待美术)」替换为「棋盘瓦片与立体表现重做(已写卡,待编排)」 |
| 6 | 同上 | 保留 `plate` 后成员预算变化:`board_cell_unit` 12→13;封印石输入给 `board_terrain_layer` 增 `_sealed_at` 成员 | 补写 | §9 改 `board_cell_unit` 12→13(删 base、加两成员、保留 plate);`board_terrain_layer` 成员预算 ≤13;§7/T3/T4 同步 |
| 6 | 同上 | 测试面需区分普通数字与封印色牌:`player_copy_sweep_test:142-147` 、`_test_no_plate_path` 、`_test_top_face_anchor` 原断言把封印色牌一并判零 | 补写 | 普通已开危险格 `plate==false` +浮空 entries; `_test_no_ordinary_plate_path` ;新增 `_test_seal_substrate` (封印石/色牌/无浮空/无圆/z=0);§7/T4/T5/§12 同步 |
| 7 | 用户(2026-11-09 纠正)+ 写卡会话回填 | 本卡原写「岩体/地面/崖面必须程序化绘制」,与用户过审样张「整块岩石是一张连续的岩顶图」及 art-bible §8.5「材质归模型、结构归程序」冲突;用户未裁过程序化材质 | 退回上游/补写 | 回退为用户原裁:岩顶/地面=无缝贴图(T-A 6 张),崖面/边缘/投影/层序=程序化;§2/§4-2/§5/§6/§8(T-A,T3,T6,T7)/§9/§12 同步;art-bible v3.53 §8.1 改口径;asset-path-map/checklist 同步;估时 9.5→11.0 |
| 8 | 用户(2026-11-09 预览目检)+ 写卡会话回填 | 预览浮空数字的引导线与阴影圆断开(线止于格顶−3、圆画在格心且 20×10);实现侧同源两处硬口径缺失——`draw_string` /`draw_string_outline` 的 pos 被当矩形顶用(实为基线,数字整体上浮 21px、线与字分离)、`_label_rect` 行 y 用格边而非步距(逐行漂移 2px) | 补写 | 预览按条款重画(线格顶−12..+4、圆 10×6 圆心格顶+7、数字墨底−15/墨高 21)并重生成 `board_preview2_*` ;T4 增绘制基线/字号/步距硬口径与两行落位断言;§12 行 6 同步 |
第六轮定向复核:通过(第六轮 6 条已处置;合并冲突全部闭合)。
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|---|---|---|---|---|
| 9 | 独立只读子代理(2026-11-10 材质过审后对抗复核) | T-A 勾六张已入库,但 `board-material-fix` 工作区没有这 12 项,T3/T7 在该区必红 | 补写 | 按 asset-path-map §1 同步 6 PNG+ 6 `.import` 到工作区;T-A 增跨区同步记录 |
| 9 | 同上 | §5 把 6 张地形贴图列为“不收件”,与 T-A/估时/完成定义冲突 | 补写 | §5 改为“已过审六张之外的再创作/换图不收件”,去向改另立美术批 |
| 9 | 同上 | 7 张预览图放入 golden 目录但未登记,易被当成引擎基线 | 补写 | `golden/README.md` 增“材质过审预览锚(非引擎帧)”类别,明确不参与逐像素比对、不替代 `board_L*` |
| 9 | 同上 | 4 张细部锚无可复现来源 | 补写 | 生成器增 `golden/` 输出与四条裁切参数;README 同步记录参数 |
| 9 | 同上 | 12×8/46 材质样张被称为“三关 golden 基线”,与 12×12/38 引擎基线混同 | 补写 | §1-9 与 T7 拆成“材质过审预览锚”和“引擎侧 `board_L*` 基线”两条 |
| 9 | 同上 | 完成定义“已重制”与 T7“待确认后重制”并存 | 补写 | T7 明确预览锚已重制、`board_L*` 待实现后按审核关卡换代 |
| 9 | 同上 | §12 多行仍是失效行号锚 | 补写 | 第 1/2/5/6/7/8/9/10/11/12/13/16/17 行全部改内容锚;全表判据行零行号锚 |
| 9 | 同上 | 阴影圆 α 卡写 40/70/105/140,过审预览实为 30/52/78/108 | 补写 | T4 与 §14-3 改为过审值 30/52/78/108,白名单基准同步 |
| 9 | 同上 | art-bible §8.5 两条互斥:结构只能素材本体 vs 地形结构程序化 | 退回上游 | §8.5 首条限定“角色、单位与非地形 UI 格件”,显式列棋盘地形例外;§8.1/§3.2 保持材质归模型、结构归程序 |
| 9 | 同上 | 封印格预览仍用退役裸土 `#B39A78` | 补写 | 未开对照改 `#9C8462` 、封印两格改 `#C9AF83` 、已开对照改 `#695038` ;判据旧承载面对比句同步 |
| 9 | 同上 | battle.md 同步日期仍写 2026-11-07,§6 未列材质实图 | 补写 | 卡头与 §2/§6 改 2026-11-09,§6 增材质过审实图与实图判据 |
| 9 | 同上 | §3 档期仍写“待编排” | 补写 | 改为“已写卡+已编迭代 57、待开工” |
| 9 | 同上 | 待办证据引用已不存在的旧 art-bible 条款 | 补写 | 改为历史陈述“旧条款已随 v3.53 解冻” |
| 9 | 同上 | art-assets checklist §3.3 要什么/前置仍按逐格砖面 | 补写 | 改为只出雷格/数字格面语义纹样,六张材质已录入,不再出逐格瓦片 |
第七轮定向复核:通过(1 条已处置;材质口径与样张、§8.5 一致)。
第八轮定向复核:通过(1 条已处置;预览几何与 art-bible §3.2 浮空数字条逐值一致)。
第九轮定向复核:通过(14 条均闭合;§12 全表 20 组内容锚零 MISS,判据列零行号锚)。