收尾(迭代48批后收尾): 反哺点十六条处置闭合——①落文: art-bible v3.36(§6.1背景实装化三句+§4.1换色合并登记③STAGE_BG退役改指SLOT_BACKDROP)+art-prompts v2.14(组四按档派生已落位+组一已实装消费)+battle-stage-prompts v1.9(ground_h已回填100+四柱已退役)+battle.md(布局字段补ground_h+光柱氛围层退役句)+HUD框架(B区行补三关背景与连续地面层+布局几何清单补地面层高)+数据配置v1.2(布局表用途句补地面层高)+增益状态v1.4(stack_policy词表换代accumulate+现行九行→十行补护身defensive_stance行〔迭代39存量漏登补录〕+累加行六→七行)+08-Alpha v1.24(立绘显示清晰度行换在役〔用户裁〕)+术语表立「显示档」条〔用户裁〕+美术两清单站桩行已交付换代; architecture v1.30(ConfigDB行SCHEMA_VERSION失真句订正——迭代41测试债批遗留义务,现役=save_manager SAVE_FORMAT_VERSION); ②目检十项登记体验验证清单㊻+迭代41测试债批三项补登记㊼(原报告漏登补齐); ③产出物退役九件(吸收即死+证据只留最新): iter48反哺点/实现报告/验收审计/停机呈报/代拍板追认单+三需求卡片(合回4c94eee3)+迭代41测试债批实现报告(遗留义务已清:闸基线换代随工程小件批落地/SCHEMA_VERSION本批落文/目检㊼); ④账面: 待办清单三卡条目整条删除(状态机出口)+status_effects.tres陈旧批注处置(待文档设计)与ui_kit.gd注释顺带换代(待执行)两条新登记(未决先迁)+roadmap迭代48行已完成(2026-11-02)与两列退役保留字+当前位换代(迭代1-48全完成,下一步=三写卡批待编排)

This commit is contained in:
DKChan committed 2026-11-02 04:35:56 +08:00
1 parent 5999cc7ba4
commit 64c675f96f
24 files changed
+85 -1289

No files matched your search

+2 -2
View File
@@ -59,14 +59,14 @@
## 2. P1 —— 角色级(样张通过后开工,ComfyUI) ## 2. P1 —— 角色级(样张通过后开工,ComfyUI)
> 提示词规格卡 art-prompts.md 现行为 **v2.13**(主角三态+八敌种逐卡提示词仍在册;站桩立绘走 §5.4 按档派生、不重画)。 > 提示词规格卡 art-prompts.md 现行为 **v2.14**(主角三态+八敌种逐卡提示词仍在册;站桩立绘走 §5.4 按档派生、不重画)。
### 2.1 主角战斗小人 ### 2.1 主角战斗小人
- **要什么**:待机 / 攻击 / 受击 三态起步(移动态样张后定);透明底 PNG。 - **要什么**:待机 / 攻击 / 受击 三态起步(移动态样张后定);透明底 PNG。
- **风格/规格**:小人原型——**窄、直立、对称,轮廓凹凸 ≤2**;2~3 头身两档下剪影均成立;主色小人蓝 `#2E86DE`(候选值,样张冻结终稿);格内占位最窄、不吞数字位。 - **风格/规格**:小人原型——**窄、直立、对称,轮廓凹凸 ≤2**;2~3 头身两档下剪影均成立;主色小人蓝 `#2E86DE`(候选值,样张冻结终稿);格内占位最窄、不吞数字位。
- **来源**:✦ ComfyUI(prompt 卡 v2.0 §2);剪影原型是设计载荷(宽≥高/凹凸计数/甲档/紫赤独占),素材站无对的,不复用。 - **来源**:✦ ComfyUI(prompt 卡 v2.0 §2);剪影原型是设计载荷(宽≥高/凹凸计数/甲档/紫赤独占),素材站无对的,不复用。
- **现状**:战斗三态在役(迭代 6 T3 落位);2026-11-01 显示档改中档 144,按档派生落位归立绘显示档实装批。 - **现状**:战斗三态在役(迭代 6 T3 落位);2026-11-01 显示档改中档 144;2026-11-02 迭代 48 落位:三态原稿分辨率入包、显示按档缩放。
### 2.2 八敌种形象(键集事实源 = `data/tables/enemy.tres` 行键) ### 2.2 八敌种形象(键集事实源 = `data/tables/enemy.tres` 行键)
+4 -4
View File
@@ -1,6 +1,6 @@
# 美术圣经(Art Bible)— Dungeon Sweeper # 美术圣经(Art Bible)— Dungeon Sweeper
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.35,历次修订明细见 git 提交史 > 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.36,历次修订明细见 git 提交史
> >
> **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。 > **Art Director Sign-Off(AD-ART-BIBLE)**:历次批均未签核——此为 Lean/Solo 模式(非 PHASE-GATE)下的现行治理状态;full 门禁签核时机待用户表态。
> 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。 > 风格基调:地牢题材但**非暗黑风**——轻快明亮的幻想冒险风,全年龄;像素风;角色 2~3 头身。
@@ -213,7 +213,7 @@
- **重甲冷灰金属材质色 `#868C9A`(ARMOR_PLATE_COLD,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 2→1**;用户裁):重甲档甲材质色;character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王岩石板甲**同引本枚、不另计额度**;材质色跨屏恒定,落分层①不落分层②(环境色才随场景走)。过门情况:第二道门按宽松口径(禁止三通道全 <8)与在册色逐一比对,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 222°,不占红/金/蓝/紫赤/绿语义段、不在 300°–345° 禁入带;材质色不进信息层与语义物件岗)。对比实测:对深素底 `#282220` 4.65:1、对舞台底 `#3E362C` 3.52:1(图形 ≥3:1 门槛);相对亮度 L≈0.261 落 §2 世界中层 0.22–0.45 带。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉 - **重甲冷灰金属材质色 `#868C9A`(ARMOR_PLATE_COLD,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 2→1**;用户裁):重甲档甲材质色;character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王岩石板甲**同引本枚、不另计额度**;材质色跨屏恒定,落分层①不落分层②(环境色才随场景走)。过门情况:第二道门按宽松口径(禁止三通道全 <8)与在册色逐一比对,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 222°,不占红/金/蓝/紫赤/绿语义段、不在 300°–345° 禁入带;材质色不进信息层与语义物件岗)。对比实测:对深素底 `#282220` 4.65:1、对舞台底 `#3E362C` 3.52:1(图形 ≥3:1 门槛);相对亮度 L≈0.261 落 §2 世界中层 0.22–0.45 带。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉
- **卓尔浅紫灰皮 `#A79CB8`(DRIDER_SKIN,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 1→0,额度用尽**;用户裁):蛛化卓尔精灵上体皮色(体块主色,L≈0.355 落 §2 世界中层带)。过门情况:第二道门同上行口径,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 264°,避开 300°–345° 禁入带,紫赤独占仍归 `#8F2F6A`;不占本节五语义段)。对比实测:对深素底 `#282220` **6.04:1**、对舞台底 `#3E362C` **4.57:1**——**两处均过图形 ≥3:1 门槛**(本轮新算)。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉 - **卓尔浅紫灰皮 `#A79CB8`(DRIDER_SKIN,token 名暂拟、随实装批登记)**|语义/UI token 板(**分层①**,占 1 枚额度,**余量 1→0,额度用尽**;用户裁):蛛化卓尔精灵上体皮色(体块主色,L≈0.355 落 §2 世界中层带)。过门情况:第二道门同上行口径,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 264°,避开 300°–345° 禁入带,紫赤独占仍归 `#8F2F6A`;不占本节五语义段)。对比实测:对深素底 `#282220` **6.04:1**、对舞台底 `#3E362C` **4.57:1**——**两处均过图形 ≥3:1 门槛**(本轮新算)。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉
- **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#A8AEB8`)→ 并入 `FOG_MEMORY_INK #C4C4C4`,**部件取值 = `#C4C4C4`**;② 主角提灯铜色(原拟 `#C08A3A`)→ 并入 `GOLD_DEEP #B07A14`,**部件取值 = `#B07A14`**;③ 食人魔酋长暖褐皮(原拟 `#B08050` / `#A97C4E`)→ 并入 `暖石 #B8A582`,**部件取值 = `#B8A582`**;④ 石君王灰皮(原拟 `#9A968C` / `#949089`,按**次级皮**口径——板甲视同体块主色、灰皮属次级皮故不受 L 0.22–0.45 约束)→ 并入 `STONE #786E62`,**部件取值 = `#786E62`**;⑤ 轻甲护甲图标木色 `#8A5A34`(深素底下 2.72:1 不过门;原拟新增木色亮档 `#C49A5E`)→ 并入 `WARM_FAINT #CDB88C`,**部件取值 = `#CDB88C`**(8.08:1)。**一色两岗代价已随裁定接受**:① 的 `#C4C4C4` 语义岗 = 迷雾记忆墨(§6.5)、② 的 `#B07A14` 属金族(§4.2 金只说收益与兑现)——两者均作角色随身件材质色用,不进信息层与语义物件岗;③④⑤ 无语义岗冲突。验收:机检〈五处部件取值点全部改指合并目标色,四枚原拟新增候选值零入板〉 - **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#A8AEB8`)→ 并入 `FOG_MEMORY_INK #C4C4C4`,**部件取值 = `#C4C4C4`**;② 主角提灯铜色(原拟 `#C08A3A`)→ 并入 `GOLD_DEEP #B07A14`,**部件取值 = `#B07A14`**;③ 食人魔酋长暖褐皮(原拟 `#B08050` / `#A97C4E`)→ 并入 `暖石 #B8A582`,**部件取值 = `#B8A582`**;④ 石君王灰皮(原拟 `#9A968C` / `#949089`,按**次级皮**口径——板甲视同体块主色、灰皮属次级皮故不受 L 0.22–0.45 约束)→ 并入 `STONE #786E62`,**部件取值 = `#786E62`**;⑤ 轻甲护甲图标木色 `#8A5A34`(深素底下 2.72:1 不过门;原拟新增木色亮档 `#C49A5E`)→ 并入 `WARM_FAINT #CDB88C`,**部件取值 = `#CDB88C`**(8.08:1)。**一色两岗代价已随裁定接受**:① 的 `#C4C4C4` 语义岗 = 迷雾记忆墨(§6.5)、② 的 `#B07A14` 属金族(§4.2 金只说收益与兑现)——两者均作角色随身件材质色用,不进信息层与语义物件岗;③④⑤ 无语义岗冲突。验收:机检〈五处部件取值点全部改指合并目标色,四枚原拟新增候选值零入板〉
- **换色合并登记三处**|按本表「不过门即触发换色合并、禁加色绕行」执行,三处零新增额度:①地台顶缘受光线 `#C4AC84` 已并入 `#C9AF83`(掩尘枚 `BRICK`,与 §8.2 高墙口沿高光同枚)——源常量已删除(全仓零引用,退役断言测试串为预期例外),绘制点全部改指 `#C9AF83`;②地台描边 `#5A4C3A` 已并入 `#4C4038`(代码 `PLAZA_EDGE`,ui_kit 唯一落点)——源常量已删除,绘制点全部改指;③舞台底 `#3E342A`(代码 `STAGE_BG`)→ 并入 `#3E362C`(状态槽底)——随 §6.1 舞台背景插画批一并处置:背景资产接管该绘制面时本常量随绘制点退役或改指,禁单独为改值出批。程序化回退绘制与已落合并值的贴图保持一致。验收:机检〈①②两枚源常量全仓零引用,绘制点全部改指合并目标色〉 - **换色合并登记三处**|按本表「不过门即触发换色合并、禁加色绕行」执行,三处零新增额度:①地台顶缘受光线 `#C4AC84` 已并入 `#C9AF83`(掩尘枚 `BRICK`,与 §8.2 高墙口沿高光同枚)——源常量已删除(全仓零引用,退役断言测试串为预期例外),绘制点全部改指 `#C9AF83`;②地台描边 `#5A4C3A` 已并入 `#4C4038`(代码 `PLAZA_EDGE`,ui_kit 唯一落点)——源常量已删除,绘制点全部改指;③舞台底 `#3E342A`(代码 `STAGE_BG`)→ 并入 `#3E362C`(状态槽底)——已随 §6.1 舞台背景插画批处置完毕(2026-11-02 迭代 48):源常量已删除(常量表零键),背景资产接管该绘制面,程序化平色缺图回退改指 `SLOT_BACKDROP`(`#3E362C`)。程序化回退绘制与已落合并值的贴图保持一致。验收:机检〈①②两枚源常量全仓零引用,绘制点全部改指合并目标色〉
**对比硬指标(可测)**:数字可读性由**格底明度分档**承载——棋盘数字亮墨 **L≥0.75** 对**已开格底 L 0.08–0.14** ⇒ 直画对比 **≥4.5:1 恒成立**(WCAG AA,样张逐组合抽测冻结);**色牌后备**:色牌素色恒定 **L≥0.70**、牌上数字深墨 **L≤0.027** ⇒ 任意牌墨组合 ≥4.5:1(实测样例:#33261B/#F5EAD3 = 12.3:1)。未开格底槽(含全部图类型)相对亮度 **L≥0.30**(墙顶面受光档)、HSV 饱和 **≤0.55**、避 Boss 禁入色相带;已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),旗面、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底 L≥0.30、饱和 ≤0.55;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9 **对比硬指标(可测)**:数字可读性由**格底明度分档**承载——棋盘数字亮墨 **L≥0.75** 对**已开格底 L 0.08–0.14** ⇒ 直画对比 **≥4.5:1 恒成立**(WCAG AA,样张逐组合抽测冻结);**色牌后备**:色牌素色恒定 **L≥0.70**、牌上数字深墨 **L≤0.027** ⇒ 任意牌墨组合 ≥4.5:1(实测样例:#33261B/#F5EAD3 = 12.3:1)。未开格底槽(含全部图类型)相对亮度 **L≥0.30**(墙顶面受光档)、HSV 饱和 **≤0.55**、避 Boss 禁入色相带;已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),旗面、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底 L≥0.30、饱和 ≤0.55;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9
@@ -381,8 +381,8 @@
- **明度分层适用**:空间纵深与洞穴感走明度分层——世界底层档、光照氛围、色相饱和与形体承载(§3.2 同款逻辑)。验收:方向性 - **明度分层适用**:空间纵深与洞穴感走明度分层——世界底层档、光照氛围、色相饱和与形体承载(§3.2 同款逻辑)。验收:方向性
- **图类型联动**:背景层按 `board_type` 选三张变体(`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`,方向取 §6.3 三关色板候选);**背景不再走 §4.3 `wall_ambient` tint**(该槽保留给棋盘/世界的墙雾氛围,避免对三张背景二次染色)。紫赤仅 Boss 战允许短暂进入背景氛围纹样(§2.6 色相独占的舞台侧延伸,高饱和独占不变),非 Boss 战高饱和紫赤禁入。验收:机检〈背景吸色无非 Boss 高饱和紫赤;背景素材不引用 `wall_ambient` 槽〉 - **图类型联动**:背景层按 `board_type` 选三张变体(`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`,方向取 §6.3 三关色板候选);**背景不再走 §4.3 `wall_ambient` tint**(该槽保留给棋盘/世界的墙雾氛围,避免对三张背景二次染色)。紫赤仅 Boss 战允许短暂进入背景氛围纹样(§2.6 色相独占的舞台侧延伸,高饱和独占不变),非 Boss 战高饱和紫赤禁入。验收:机检〈背景吸色无非 Boss 高饱和紫赤;背景素材不引用 `wall_ambient` 槽〉
- **场景构成(2026-10-31 用户裁)**:B 区舞台从远到近分三段——**顶部空区**:洞顶以上的昏暗空间,只留深色空区,**不画钟乳石、吊锥、悬挂物或任何可辨形状**;**远景(纵深洞厅)**:不是贴墙的后壁,按远/中/近三层组织——远层暗剪影(远处洞口/通道、层叠岩体、洞底轮廓)、中层主要细节层(岩台、岩柱、凹壁、裂缝)、近层左右暗色岩框;剪影被中层部分遮挡、不贴顶、不孤立,**禁贴墙感、禁单件圆柱贴顶、禁砖石墙/规则砌缝/方整石块**;三关母题(地精=支洞/木栈道/木桩围栏;卓尔=巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;灰矮人=石笋城郭/棱角石厅/石桥/矿道口/烟囱塔)见 `battle-stage-prompts.md` §3.2;**分隔带**:远壁根部与近景地面之间一条不规则碎石带/阴影缝,边界清楚但不笔直,**禁瓷砖缝、踢脚线、规则台阶**;**近景地面**:干净压实泥土为主,全幅只零星几颗小石、散点分布,中央平缓留空给角色站位,**禁成排/成堆碎石、满铺砂砾、泥点噪声、瓷砖、规则铺装、草、木地板**。纵深与三段构图归 §1.4 样张;逐条要素、分层提示词与否定后缀 = `battle-stage-prompts.md`(本文件不重复维护)。验收:目检〈顶部无钟乳石/吊锥;远景有纵深、非贴墙;无孤立圆柱贴顶;近景为泥土碎石;分隔带不规则;中央无大障碍〉 - **场景构成(2026-10-31 用户裁)**:B 区舞台从远到近分三段——**顶部空区**:洞顶以上的昏暗空间,只留深色空区,**不画钟乳石、吊锥、悬挂物或任何可辨形状**;**远景(纵深洞厅)**:不是贴墙的后壁,按远/中/近三层组织——远层暗剪影(远处洞口/通道、层叠岩体、洞底轮廓)、中层主要细节层(岩台、岩柱、凹壁、裂缝)、近层左右暗色岩框;剪影被中层部分遮挡、不贴顶、不孤立,**禁贴墙感、禁单件圆柱贴顶、禁砖石墙/规则砌缝/方整石块**;三关母题(地精=支洞/木栈道/木桩围栏;卓尔=巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;灰矮人=石笋城郭/棱角石厅/石桥/矿道口/烟囱塔)见 `battle-stage-prompts.md` §3.2;**分隔带**:远壁根部与近景地面之间一条不规则碎石带/阴影缝,边界清楚但不笔直,**禁瓷砖缝、踢脚线、规则台阶**;**近景地面**:干净压实泥土为主,全幅只零星几颗小石、散点分布,中央平缓留空给角色站位,**禁成排/成堆碎石、满铺砂砾、泥点噪声、瓷砖、规则铺装、草、木地板**。纵深与三段构图归 §1.4 样张;逐条要素、分层提示词与否定后缀 = `battle-stage-prompts.md`(本文件不重复维护)。验收:目检〈顶部无钟乳石/吊锥;远景有纵深、非贴墙;无孤立圆柱贴顶;近景为泥土碎石;分隔带不规则;中央无大障碍〉
- **图层归属(2026-10-31 用户裁)**:背景层 = 三关变体 `scene_stage_bg_dungeon/_underdark/_deep_underdark.png`(顶部空区+纵深洞厅远景,不画近景地面;按 `board_type` 选一张);近景地面 = **独立连续地面层** `scene_stage_ground.png`(泥土/砂砾/碎石地面,全宽、底边贴 B 区底、顶缘即分隔带;高度读布局表 `ground_h`,字段由地面层实装批新增并回填,本批终稿高 100、代码批落表);现有每角色小石台 `scene_stage_plaza.png` 保留,叠在连续地面之上。连续地面层与小石台**三关共用**、跨关恒定、**不吃 `wall_ambient` tint**(世界中层承载面随关卡换明度会破 §2 层间关系);背景三张变体各自带关卡色族,不再叠 tint。验收:机检〈三张背景文件名带 board_type 后缀;地面层/小石台文件名无 board_type 后缀;背景与地面层均不引用 `wall_ambient` 槽〉 - **图层归属(2026-10-31 用户裁)**:背景层 = 三关变体 `scene_stage_bg_dungeon/_underdark/_deep_underdark.png`(顶部空区+纵深洞厅远景,不画近景地面;按 `board_type` 选一张);近景地面 = **独立连续地面层** `scene_stage_ground.png`(泥土/砂砾/碎石地面,全宽、底边贴 B 区底、顶缘即分隔带;高度读布局表 `ground_h`,字段已由实装批回填 100〔2026-11-02 迭代 48〕);现有每角色小石台 `scene_stage_plaza.png` 保留,叠在连续地面之上。连续地面层与小石台**三关共用**、跨关恒定、**不吃 `wall_ambient` tint**(世界中层承载面随关卡换明度会破 §2 层间关系);背景三张变体各自带关卡色族,不再叠 tint。验收:机检〈三张背景文件名带 board_type 后缀;地面层/小石台文件名无 board_type 后缀;背景与地面层均不引用 `wall_ambient` 槽〉
- **资产渠道与契约**:✦ 插画级(演出类场景贴图,清单 §4 联动登记);战斗一屏样张(§1.4 清单 1.2)含背景出样。**背景层 = 三张按关卡变体** `scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`(源 = 基准屏宽 × `stage_h`,读布局表 `game/data/tables/battle_layout.tres`;显示 1×;按 `board_type` 选图;**不走 `wall_ambient` tint**);三张共用本节构图规则,仅岩体形态与色族按 §6.3 三关方向不同。**背景只画顶部空区+纵深洞厅远景,不画近景地面**:结算期明细带整条压住 B 区底带(带高 = `log_band_h_settle`,读布局表),近景地面在独立层;画进背景等于画一件永远看不见、且会随背景变体重复的东西。**连续地面层** = `scene_stage_ground.png`(源 = 基准屏宽 × `ground_h`,读布局表;显示 1×;三关共用、跨关恒定、不吃 tint);地面层是极宽薄条,出图与后处理按 `battle-stage-prompts.md` §2.2 的工艺(可平铺纹理条/最宽档裁切,禁横向拉伸)。**光柱不迁入背景**:三张背景均不画光柱/光带/光束/光晕与任何光源实体,明暗只由岩体层理与暗部承载;现行四柱程序层是临时占位,资产到位后直接退役(代码批)。资产已入包(2026-10-31),四柱程序层与平色底由代码批退役/改指;出图工单 = `battle-stage-prompts.md`,交付记录见本节「B 区舞台背景与共用地面的交付绑定」。验收:目检〈三关背景可辨为不同洞窟,非同一图换色;远景有纵深、非贴墙;无孤立圆柱贴顶;背景无地台/地面结构件、无砖石墙、无瓷砖地面、无光柱/光带;地面层为泥土/砂砾/碎石〉 - **资产渠道与契约**:✦ 插画级(演出类场景贴图,清单 §4 联动登记);战斗一屏样张(§1.4 清单 1.2)含背景出样。**背景层 = 三张按关卡变体** `scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png`(源 = 基准屏宽 × `stage_h`,读布局表 `game/data/tables/battle_layout.tres`;显示 1×;按 `board_type` 选图;**不走 `wall_ambient` tint**);三张共用本节构图规则,仅岩体形态与色族按 §6.3 三关方向不同。**背景只画顶部空区+纵深洞厅远景,不画近景地面**:结算期明细带整条压住 B 区底带(带高 = `log_band_h_settle`,读布局表),近景地面在独立层;画进背景等于画一件永远看不见、且会随背景变体重复的东西。**连续地面层** = `scene_stage_ground.png`(源 = 基准屏宽 × `ground_h`,读布局表;显示 1×;三关共用、跨关恒定、不吃 tint);地面层是极宽薄条,出图与后处理按 `battle-stage-prompts.md` §2.2 的工艺(可平铺纹理条/最宽档裁切,禁横向拉伸)。**光柱不迁入背景**:三张背景均不画光柱/光带/光束/光晕与任何光源实体,明暗只由岩体层理与暗部承载;原四柱程序层与平色底已退役(2026-11-02 迭代 48:背景资产接管该绘制面,平色缺图回退改指状态槽底色)。资产已入包(2026-10-31);出图工单 = `battle-stage-prompts.md`,交付记录见本节「B 区舞台背景与共用地面的交付绑定」。验收:目检〈三关背景可辨为不同洞窟,非同一图换色;远景有纵深、非贴墙;无孤立圆柱贴顶;背景无地台/地面结构件、无砖石墙、无瓷砖地面、无光柱/光带;地面层为泥土/砂砾/碎石〉
- **B 区舞台背景与共用地面的交付绑定(2026-10-31 入包)**:三张背景与一张地面已按本节契约入包 `game/assets/art/scene/`——`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png` 均 1280×252、不透明全幅、单张 ≤32 色、按 `board_type` 选图;`scene_stage_ground.png` 1280×100、顶缘以上透明、单张 ≤32 色、三关共用。地面按作者 2026-10-31 裁保留候选 v12b 原亮度(实测不透明域 L≈0.132,低于 §2 世界中层 0.22–0.45,登记为作者例外;后续调亮归调参/替换,不重开设计);背景实测 L:dungeon 0.0148、underdark 0.0132、deep_underdark 0.0111(后两者低于世界底层下沿带下限 0.014 不超过 0.003,登记读数)。验收:机检〈四件文件名与尺寸逐位相符;地面顶缘以上 alpha=0、不透明域 ≤32 色;背景不透明全幅 ≤32 色〉+目检〈三关可辨、无光柱、地面读作泥土〉。参考指针:`asset-path-map.md` `scene/` 行、`battle-stage-prompts.md` §2/§4。 - **B 区舞台背景与共用地面的交付绑定(2026-10-31 入包)**:三张背景与一张地面已按本节契约入包 `game/assets/art/scene/`——`scene_stage_bg_dungeon.png` / `scene_stage_bg_underdark.png` / `scene_stage_bg_deep_underdark.png` 均 1280×252、不透明全幅、单张 ≤32 色、按 `board_type` 选图;`scene_stage_ground.png` 1280×100、顶缘以上透明、单张 ≤32 色、三关共用。地面按作者 2026-10-31 裁保留候选 v12b 原亮度(实测不透明域 L≈0.132,低于 §2 世界中层 0.22–0.45,登记为作者例外;后续调亮归调参/替换,不重开设计);背景实测 L:dungeon 0.0148、underdark 0.0132、deep_underdark 0.0111(后两者低于世界底层下沿带下限 0.014 不超过 0.003,登记读数)。验收:机检〈四件文件名与尺寸逐位相符;地面顶缘以上 alpha=0、不透明域 ≤32 色;背景不透明全幅 ≤32 色〉+目检〈三关可辨、无光柱、地面读作泥土〉。参考指针:`asset-path-map.md` `scene/` 行、`battle-stage-prompts.md` §2/§4。
- **近景地面与地台走独立件**:连续地面层 `scene_stage_ground.png` 与角色脚下小石台 `scene_stage_plaza.png` 均为独立层,三关共用、跨关恒定。小石台源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形(规格见 §8.2);连续地面层的顶缘即分隔带(不规则碎石/阴影缝,不是直线亮边)。独立的两条理由——① 三张背景按关卡变体,地面若画进任一背景就得三张各画一遍、且三关站位面会漂移;② 结算期明细带整条压住底带(带高读 `log_band_h_settle`),地面在独立层才能跨关恒定并保持世界中层承载面不变。小石台先保留,是否退役归实装批/后续裁决。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉+目检〈连续地面为泥土碎石、顶缘不规则〉 - **近景地面与地台走独立件**:连续地面层 `scene_stage_ground.png` 与角色脚下小石台 `scene_stage_plaza.png` 均为独立层,三关共用、跨关恒定。小石台源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形(规格见 §8.2);连续地面层的顶缘即分隔带(不规则碎石/阴影缝,不是直线亮边)。独立的两条理由——① 三张背景按关卡变体,地面若画进任一背景就得三张各画一遍、且三关站位面会漂移;② 结算期明细带整条压住底带(带高读 `log_band_h_settle`),地面在独立层才能跨关恒定并保持世界中层承载面不变。小石台先保留,是否退役归实装批/后续裁决。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉+目检〈连续地面为泥土碎石、顶缘不规则〉
+2 -2
View File
@@ -1,4 +1,4 @@
# 生图提示词卡(角色级资产)v2.13 # 生图提示词卡(角色级资产)v2.14
> **性质**:美术清单生图通道(✦ 用户自跑,现走线上 API)的执行侧文件——每资产一段**自包含完整提示词**:正向 = 通用底座+主体+动作已拼妥、负向 = 通用底座+增补已并妥,整段复制直接贴进工作流即可,**不需要读其他文件、不需要拼装**。人物规格转写自 [character-design.md](character-design.md)(人物设计 v1.0,自 art-bible §5 迁出,圣经 §5 为存根),风格/色彩条款转写自 [art-bible](art-bible.md)(§4.1 主色板 / §4.2 语义色规则);冲突时人物规格以 character-design 为准、色彩以 art-bible 为准。 > **性质**:美术清单生图通道(✦ 用户自跑,现走线上 API)的执行侧文件——每资产一段**自包含完整提示词**:正向 = 通用底座+主体+动作已拼妥、负向 = 通用底座+增补已并妥,整段复制直接贴进工作流即可,**不需要读其他文件、不需要拼装**。人物规格转写自 [character-design.md](character-design.md)(人物设计 v1.0,自 art-bible §5 迁出,圣经 §5 为存根),风格/色彩条款转写自 [art-bible](art-bible.md)(§4.1 主色板 / §4.2 语义色规则);冲突时人物规格以 character-design 为准、色彩以 art-bible 为准。
> **边界**:本文件只管**角色级**资产的生图通道。图标/格面/样张走脚本管线(⚙ 代理出),规格在 art-bible §4.6 与 [art-assets-checklist](art-assets-checklist.md),不需要提示词。**场景级资产(营地场景图的背景层与八个物件层)另立 [camp-scene-prompts](camp-scene-prompts.md);战斗舞台背景层与连续地面层另立 [battle-stage-prompts](battle-stage-prompts.md),本文件不覆盖**;两卡的角色/场景分工以「谁的资产谁出卡」为界,同一段提示词不两处维护。战斗舞台的小石台件与护甲类型图标三枚的**出图工单**登记在本文件 §5;§5 只把各权威节的定值收进逐件工单,不立新值。意图动画三档是动画资产,等一屏样张锁方案后另立规格卡,本文件不覆盖。 > **边界**:本文件只管**角色级**资产的生图通道。图标/格面/样张走脚本管线(⚙ 代理出),规格在 art-bible §4.6 与 [art-assets-checklist](art-assets-checklist.md),不需要提示词。**场景级资产(营地场景图的背景层与八个物件层)另立 [camp-scene-prompts](camp-scene-prompts.md);战斗舞台背景层与连续地面层另立 [battle-stage-prompts](battle-stage-prompts.md),本文件不覆盖**;两卡的角色/场景分工以「谁的资产谁出卡」为界,同一段提示词不两处维护。战斗舞台的小石台件与护甲类型图标三枚的**出图工单**登记在本文件 §5;§5 只把各权威节的定值收进逐件工单,不立新值。意图动画三档是动画资产,等一屏样张锁方案后另立规格卡,本文件不覆盖。
@@ -290,7 +290,7 @@ Seamless tileable pixel art texture of dry dirt ground, top-down, for a dungeon
> **定值纪律(§8 头注 定值单点纪律)**:本节**指路不立值**——色值 = 圣经 §4.1(含场景环境子板)、尺寸与缩放 = §8.2、明度带 = §2、甲档 = character-design §5.3、命名 = §8.3 + asset-path-map。本节新增零定值;凡圣经未定的值,一律进本节 §5.5 缺口,不在本节填空。 > **定值纪律(§8 头注 定值单点纪律)**:本节**指路不立值**——色值 = 圣经 §4.1(含场景环境子板)、尺寸与缩放 = §8.2、明度带 = §2、甲档 = character-design §5.3、命名 = §8.3 + asset-path-map。本节新增零定值;凡圣经未定的值,一律进本节 §5.5 缺口,不在本节填空。
> **验收标注纪律**:逐条按三档标 `←机检: <断言>` / `←目检: <判据>` / `←方向性`,照圣经头注 2026-10-06 用户拍板的写法。 > **验收标注纪律**:逐条按三档标 `←机检: <断言>` / `←目检: <判据>` / `←方向性`,照圣经头注 2026-10-06 用户拍板的写法。
> **流程**:出图前后一律走 §0 五步;出图登记义务照 remote-gen-prompts 头注轻量口径(用途+生成时间必注,其余参数有则记),随候选图存 `artwork/candidates/<资产名>/`;登记不作正稿遴选前置。 > **流程**:出图前后一律走 §0 五步;出图登记义务照 remote-gen-prompts 头注轻量口径(用途+生成时间必注,其余参数有则记),随候选图存 `artwork/candidates/<资产名>/`;登记不作正稿遴选前置。
> **产出状态**:组二地台件与组三护甲三枚已按各节 ⑤「程序化产出即终稿」产出入包(`scene_stage_plaza.png` 48×12、`ui_armor_light/ward/heavy.png` 24×24,路径见各组 ① 字段;登记=战斗一屏样张批,合并提交 3b66d1a6);组一背景插画见 [battle-stage-prompts](battle-stage-prompts.md)(三张背景+共用地面已入包,四柱/平色底退役归代码批),组四改按档派生(不重画,待实装批落位)。 > **产出状态**:组二地台件与组三护甲三枚已按各节 ⑤「程序化产出即终稿」产出入包(`scene_stage_plaza.png` 48×12、`ui_armor_light/ward/heavy.png` 24×24,路径见各组 ① 字段;登记=战斗一屏样张批,合并提交 3b66d1a6);组一背景插画见 [battle-stage-prompts](battle-stage-prompts.md)(三张背景+共用地面已入包并已实装消费——按关选图+连续地面层落码,四柱光柱层与平色底已退役),组四改按档派生(不重画)已落位:九件按原稿分辨率入包、显示按三档绝对高缩放(定值单点=art-bible §8.2,派生管线见 §5.4 工单)。
### 5.1 组一 · B 区舞台背景插画(1 件) ### 5.1 组一 · B 区舞台背景插画(1 件)
+2 -2
View File
@@ -17,8 +17,8 @@
| 素材 | 状态 | 需求文档 | | 素材 | 状态 | 需求文档 |
|---|---|---| |---|---|---|
| 主角战斗小人(待机/攻击/受击三态) | ✅ B区站桩三态全接(2026-09-29 迭代 6 T3:normal/attack/hit 48px 档入包+挂事件切换+结算回 idle,短驻自回;棋盘 1.5×/脚锚25%/椭圆影在役不变;hit 态源=new-hit.pxo 已程序导出;2026-11-01 显示档改中档 144(源=手修 2× 三态稿,art-bible §8.2 v3.32),按档派生落位归本条实装批) | [character-design](character-design.md) + [art-prompts](art-prompts.md) §2 | | 主角战斗小人(待机/攻击/受击三态) | ✅ B区站桩三态全接(2026-09-29 迭代 6 T3:normal/attack/hit 48px 档入包+挂事件切换+结算回 idle,短驻自回;棋盘 1.5×/脚锚25%/椭圆影在役不变;hit 态源=new-hit.pxo 已程序导出;2026-11-01 显示档改中档 144(源=手修 2× 三态稿,art-bible §8.2 v3.32))✅ 已交付(2026-11-02 迭代 48:三态按原稿分辨率入包、显示按档缩放落位,机检全绿) | [character-design](character-design.md) + [art-prompts](art-prompts.md) §2 |
| 八敌种形象(L2 熊地精=bugbear 复用,不单列) | ✅ B区站桩八敌真图服役(2026-09-29 迭代 6 T1/T2:pixel-1 源→48px 档统一比例/底中锚/众数投票降采样,character_enemy_<键>.png 按常量入位,字形回退退役为缺位兜底;素材不入 git 本地在盘)。2026-11-01 显示档换代=三档绝对高 96/144/188(art-bible §8.2 v3.32),源 = 原稿不降采样,按档派生落位归本条实装批 | [art-bible](art-bible.md) §5 + [art-prompts](art-prompts.md) §3 | | 八敌种形象(L2 熊地精=bugbear 复用,不单列) | ✅ B区站桩八敌真图服役(2026-09-29 迭代 6 T1/T2:pixel-1 源→48px 档统一比例/底中锚/众数投票降采样,character_enemy_<键>.png 按常量入位,字形回退退役为缺位兜底;素材不入 git 本地在盘)。2026-11-01 显示档换代=三档绝对高 96/144/188(art-bible §8.2 v3.32)✅ 已交付(2026-11-02 迭代 48:八件源 = 原稿不降采样入包、显示按档缩放落位,闸件新口径全绿) | [art-bible](art-bible.md) §5 + [art-prompts](art-prompts.md) §3 |
| 意图准备动画三档 | ◐ | [art-bible](art-bible.md) §4.6.4 | | 意图准备动画三档 | ◐ | [art-bible](art-bible.md) §4.6.4 |
## P2 图标与格面(可与样张并行) ## P2 图标与格面(可与样张并行)
+6 -6
View File
@@ -1,7 +1,7 @@
# 战斗舞台背景 · 分层生图提示词卡 v1.8 # 战斗舞台背景 · 分层生图提示词卡 v1.9
> **性质**:B 区战斗舞台背景(顶部空区+远景天然洞壁+近景连续泥土地面+分隔带)的出图执行侧文件。背景按三关出三张变体,地面三关共用一张;场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖。 > **性质**:B 区战斗舞台背景(顶部空区+远景天然洞壁+近景连续泥土地面+分隔带)的出图执行侧文件。背景按三关出三张变体,地面三关共用一张;场景级资产,与角色级 [art-prompts](art-prompts.md) 并列,两文件互不覆盖。
> **依据**:场景构成与图层归属 = [art-bible](art-bible.md) §6.1;三关方向 = art-bible §6.3;色板 = art-bible §4.1(战斗屏场景环境子板);尺寸 = `game/data/tables/battle_layout.tres`(背景读 `stage_h`;地面读 `ground_h`,该字段由地面层实装批新增并回填);命名与路径 = [asset-path-map](asset-path-map.md);后处理 = [art-pipeline-tools](art-pipeline-tools.md)。 > **依据**:场景构成与图层归属 = [art-bible](art-bible.md) §6.1;三关方向 = art-bible §6.3;色板 = art-bible §4.1(战斗屏场景环境子板);尺寸 = `game/data/tables/battle_layout.tres`(背景读 `stage_h`;地面读 `ground_h`,字段已回填 100〔2026-11-02 迭代 48 落表〕);命名与路径 = [asset-path-map](asset-path-map.md);后处理 = [art-pipeline-tools](art-pipeline-tools.md)。
> **边界**:只管三张背景变体与一张共用地面的提示词与验收;角色、格面、图标、小石台 `scene_stage_plaza.png` 与样张走 art-prompts 与脚本管线,不在本卡。 > **边界**:只管三张背景变体与一张共用地面的提示词与验收;角色、格面、图标、小石台 `scene_stage_plaza.png` 与样张走 art-prompts 与脚本管线,不在本卡。
> **建立**:2026-10-31 · 状态:三关背景变体与共用地面已按本工单出图并入包(选定=dungeon v10c/underdark v10c/deep_underdark v10c/ground v12b,落点与读数见 art-bible §6.1「B 区舞台背景与共用地面的交付绑定」);出图通道由作者自定(参考候选可用内置 ImageGen,水印可留;入包终稿须干净)。 > **建立**:2026-10-31 · 状态:三关背景变体与共用地面已按本工单出图并入包(选定=dungeon v10c/underdark v10c/deep_underdark v10c/ground v12b,落点与读数见 art-bible §6.1「B 区舞台背景与共用地面的交付绑定」);出图通道由作者自定(参考候选可用内置 ImageGen,水印可留;入包终稿须干净)。
@@ -12,7 +12,7 @@
1. **出图**:按 §2 把提示词贴进生图渠道;每次出图先放 §1 的风格参考图。**先只出 dungeon 背景 1 张**,作者确认风格前缀后,再出 underdark / deep_underdark 两张变体与连续地面层。 1. **出图**:按 §2 把提示词贴进生图渠道;每次出图先放 §1 的风格参考图。**先只出 dungeon 背景 1 张**,作者确认风格前缀后,再出 underdark / deep_underdark 两张变体与连续地面层。
2. **入库**:候选原图放 `artwork/candidates/scene_stage_bg/`(三关变体用 `dungeon_*` / `underdark_*` / `deep_underdark_*` 命名)与 `artwork/candidates/scene_stage_ground/`;`_登记.txt` 记用途与生成时间。 2. **入库**:候选原图放 `artwork/candidates/scene_stage_bg/`(三关变体用 `dungeon_*` / `underdark_*` / `deep_underdark_*` 命名)与 `artwork/candidates/scene_stage_ground/`;`_登记.txt` 记用途与生成时间。
3. **后处理**:三张背景不去底(不透明全幅);连续地面层去底转透明(顶缘以上键控)+最近邻降采样+色板量化+底测试条;工具清单与已知边界见 [art-pipeline-tools](art-pipeline-tools.md)。 3. **后处理**:三张背景不去底(不透明全幅);连续地面层去底转透明(顶缘以上键控)+最近邻降采样+色板量化+底测试条;工具清单与已知边界见 [art-pipeline-tools](art-pipeline-tools.md)。
4. **转正**:终稿转入 `game/assets/art/scene/`;三张背景按 `board_type` 选图、连续地面层接线与布局表 `ground_h` 字段由实装批落码。 4. **转正**:终稿转入 `game/assets/art/scene/`;三张背景按 `board_type` 选图、连续地面层接线与布局表 `ground_h` 字段均已实装落码〔2026-11-02 迭代 48〕。
--- ---
@@ -92,7 +92,7 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain
**画什么**:全宽近景地面——**干净压实泥土为主**,整片平整、中低明度;全幅只保留**零星 3–5 颗小石**,散点分布、不成排不成堆;顶缘为不规则泥土边+阴影缝,可带 2–3 颗小石;中央平缓留空;地面跨三关恒定。 **画什么**:全宽近景地面——**干净压实泥土为主**,整片平整、中低明度;全幅只保留**零星 3–5 颗小石**,散点分布、不成排不成堆;顶缘为不规则泥土边+阴影缝,可带 2–3 颗小石;中央平缓留空;地面跨三关恒定。
**不画什么**:瓷砖、砖缝、规则铺装、石板块、踢脚线/直亮边;草、木地板;远景/洞壁/天空;角色、生物、道具、火把/灯;中央大石或碎石堆挡站位;满铺碎石、密集砂砾、成排/成堆碎石、亮色浅棕大片、泥点噪声、垃圾杂物。 **不画什么**:瓷砖、砖缝、规则铺装、石板块、踢脚线/直亮边;草、木地板;远景/洞壁/天空;角色、生物、道具、火把/灯;中央大石或碎石堆挡站位;满铺碎石、密集砂砾、成排/成堆碎石、亮色浅棕大片、泥点噪声、垃圾杂物。
**出图画布**:终稿 = 基准屏宽 × `ground_h`(`battle_layout.tres` 新增字段,地面层实装批回填);本件是极宽薄条,平台无对应宽高比时按横向可平铺纹理条出图(左右无缝,宽度取平台方档,高度取 `ground_h` 的整数倍),终稿裁/平铺到目标宽高比,禁横向拉伸。试片阶段可按构图比例先出,终稿尺寸读表。 **出图画布**:终稿 = 基准屏宽 × `ground_h`(`battle_layout.tres` 字段已回填 100);本件是极宽薄条,平台无对应宽高比时按横向可平铺纹理条出图(左右无缝,宽度取平台方档,高度取 `ground_h` 的整数倍),终稿裁/平铺到目标宽高比,禁横向拉伸。试片阶段可按构图比例先出,终稿尺寸读表。
**正向提示词**: **正向提示词**:
@@ -167,11 +167,11 @@ Do not add any of the following: realistic, photorealistic or 3D rendering; pain
## 5. 待裁与待办(不阻塞提示词成文) ## 5. 待裁与待办(不阻塞提示词成文)
1. **三张背景按 `board_type` 选图**——游戏代码改动,走需求卡片+迭代;背景 `wall_ambient` tint 退役,棋盘/世界的该槽保留。 1. **三张背景按 `board_type` 选图**——游戏代码改动,走需求卡片+迭代;背景 `wall_ambient` tint 退役,棋盘/世界的该槽保留。
2. **`ground_h` 字段**——布局表新增字段,地面层实装批回填;本卡试片按构图比例,终稿读表。 2. **`ground_h` 字段**——布局表新增字段,已由实装批回填 100〔2026-11-02 迭代 48〕;本卡试片按构图比例,终稿读表。
3. **冷/灰色入板**——underdark / deep_underdark 需要的冷蓝灰、灰黑与矿脉色按 art-bible §4.1 战斗屏场景环境子板两道门入板;三张背景共用该子板 ≤32 色。 3. **冷/灰色入板**——underdark / deep_underdark 需要的冷蓝灰、灰黑与矿脉色按 art-bible §4.1 战斗屏场景环境子板两道门入板;三张背景共用该子板 ≤32 色。
4. **地面层出图工艺**——极宽薄条;默认横向可平铺纹理条(左右无缝);若作者要整幅不拼接,另议。 4. **地面层出图工艺**——极宽薄条;默认横向可平铺纹理条(左右无缝);若作者要整幅不拼接,另议。
5. **小石台 `scene_stage_plaza.png`**——先保留;是否退役归实装批/后续裁决。 5. **小石台 `scene_stage_plaza.png`**——先保留;是否退役归实装批/后续裁决。
6. **四柱光柱程序层退役**——光柱不迁入背景;背景资产入包后该程序层退役(代码批)。 6. **四柱光柱程序层退役**——光柱不迁入背景;该程序层已随背景实装批退役〔2026-11-02 迭代 48〕。
7. **风格前缀**——首张 dungeon 背景试片后由作者确认,确认后才出另外两张与地面层。 7. **风格前缀**——首张 dungeon 背景试片后由作者确认,确认后才出另外两张与地面层。
8. **可选要素池**——按 §3.2 可选项本版关闭;要加走本卡修订。 8. **可选要素池**——按 §3.2 可选项本版关闭;要加走本卡修订。
@@ -2,8 +2,8 @@
## 文档状态 ## 文档状态
- 版本:1.29 - 版本:1.30
- 最近更新:2026-11-02(B5 设计闭合——「战斗编排域拆件定稿」节轴戊:效果端口件+掷格分件两件设计定稿,功能层四行随动注记;沿革查 git) - 最近更新:2026-11-02(迭代 48 批后收尾随动——ConfigDB 行版本常量失真句订正;沿革查 git)
- 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定) - 引擎:Godot 4.7.2-stable(GDScript 单语言;2026-09-07 锁定)
- 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调) - 评审模式:solo(`review-mode.txt`,2026-09-12 用户拍板——TD/LP 门禁按 solo 跳过,用户授权架构产出自主推进、迭代期回调)
- 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准) - 覆盖 GDD:现行全集(根索引=`design/gdd/02-系统清单.md`,文档树构成以根索引为准)
@@ -85,7 +85,7 @@
| 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API | | 模块 | 独占职责 | 对外暴露 | 消费依赖 | 引擎 API |
|---|---|---|---|---| |---|---|---|---|---|
| **ConfigDB**(autoload,D2) | 全部玩法数值表与表现层布局配置表(`data/tables/*.tres` + `data/schemas/*.gd`);SCHEMA_VERSION;加载/校验/override/诊断状态机。**行族访问器归位各 schema 表类(表管自己的行查询),本类只留加载/校验/override/诊断门面;表持有成员按域收进四张域容器 Resource(`config_domain_combat/run/crossrun/presentation.gd`——前三件迭代 41 已建件,第四件表现层布局域 2026-10-30 建件,类型化成员 7/7/5/1);三张 resolver 表(board_gen.resolve_row/enemy.resolve_rowset/difficulty.resolve_modifiers)经 `load_tables` 装配段注入各容器,resolver 文件与键零搬移**——红线不变:本类仍是唯一加载与持有单点,"经 ConfigDB 单点读取"=经其持有的表对象 | 类型化域容器属性(每域一张容器);公开面 8(push_diag/is_fatal/reset_diagnostics/diagnostics/diagnostics_count/load_tables/set_reload_gate/reload)、类变量 10 | 无(基础层顶点) | Resource/.tres 加载、autoload 生命周期——LOW | | **ConfigDB**(autoload,D2) | 全部玩法数值表与表现层布局配置表(`data/tables/*.tres` + `data/schemas/*.gd`);加载/校验/override/诊断状态机。**行族访问器归位各 schema 表类(表管自己的行查询),本类只留加载/校验/override/诊断门面;表持有成员按域收进四张域容器 Resource(`config_domain_combat/run/crossrun/presentation.gd`——前三件迭代 41 已建件,第四件表现层布局域 2026-10-30 建件,类型化成员 7/7/5/1);三张 resolver 表(board_gen.resolve_row/enemy.resolve_rowset/difficulty.resolve_modifiers)经 `load_tables` 装配段注入各容器,resolver 文件与键零搬移**——红线不变:本类仍是唯一加载与持有单点,"经 ConfigDB 单点读取"=经其持有的表对象 | 类型化域容器属性(每域一张容器);公开面 8(push_diag/is_fatal/reset_diagnostics/diagnostics/diagnostics_count/load_tables/set_reload_gate/reload)、类变量 10 | 无(基础层顶点) | Resource/.tres 加载、autoload 生命周期——LOW |
| **SlotStore**(`core/slot_store.gd`,D3 存档槽位域件,已建件——迭代 41 存量债批) | 存档三槽位文件域唯一所有者(自 save_manager 收编槽位族):槽位挂载与模板、激活与建删、槽位摘要窥视(peek 族);改名覆盖原语(_rename_overwrite)留 save_manager(IO 原语单点) | 槽位读写原语族+摘要投影(公开 10/类变量 4;SaveManager 与菜单消费方经 `save.slots.` 直连) | save_manager(注入路径与模板配置);FileAccess——LOW | | **SlotStore**(`core/slot_store.gd`,D3 存档槽位域件,已建件——迭代 41 存量债批) | 存档三槽位文件域唯一所有者(自 save_manager 收编槽位族):槽位挂载与模板、激活与建删、槽位摘要窥视(peek 族);改名覆盖原语(_rename_overwrite)留 save_manager(IO 原语单点) | 槽位读写原语族+摘要投影(公开 10/类变量 4;SaveManager 与菜单消费方经 `save.slots.` 直连) | save_manager(注入路径与模板配置);FileAccess——LOW |
| **MetaStateStore**(`core/meta_state_store.gd`,D3 存档内元进度数据件,已建件——迭代 41 存量债批) | 存档内元进度数据的读写唯一层(自 save_manager 收编 accessor 族:钥石/道具解锁/树节点与叉侧/锻造路线/同调/真视/计数器/摘要——数据读写原语,不含业务规则);save_manager 与 meta_progression 双 God Class 的共同病根=该数据域摊在两文件,本件即其归一 | 写口原语 13+只读投影 6(tree_state/forge_state/attune_state/career_state 四投影+keystone_balance/item_unlocked)=公开 19(add_keystone 私有 `_add_keystone`),零 _data 副本零缓存;MetaProgression 业务层与营地/锻造 UI 消费方经 `save.meta_state.` 直连(meta 的纯转发读方法已退役) | save_manager(序列化接线);FileAccess——LOW | | **MetaStateStore**(`core/meta_state_store.gd`,D3 存档内元进度数据件,已建件——迭代 41 存量债批) | 存档内元进度数据的读写唯一层(自 save_manager 收编 accessor 族:钥石/道具解锁/树节点与叉侧/锻造路线/同调/真视/计数器/摘要——数据读写原语,不含业务规则);save_manager 与 meta_progression 双 God Class 的共同病根=该数据域摊在两文件,本件即其归一 | 写口原语 13+只读投影 6(tree_state/forge_state/attune_state/career_state 四投影+keystone_balance/item_unlocked)=公开 19(add_keystone 私有 `_add_keystone`),零 _data 副本零缓存;MetaProgression 业务层与营地/锻造 UI 消费方经 `save.meta_state.` 直连(meta 的纯转发读方法已退役) | save_manager(序列化接线);FileAccess——LOW |
| **RngService**(autoload,D2) | master_seed、各流 scope 计数器(封闭流词表现值以 `RngServiceCore.PURPOSE_TAGS` 为准;增流走 P1 评审) | `set_master_seed()`(唯一调用方 C2);`open_stream(stream)` 有状态门面;`derive_at(stream, scope)` 纯函数;只读计数器 | ConfigDB(无) | 无——纯逻辑 | | **RngService**(autoload,D2) | master_seed、各流 scope 计数器(封闭流词表现值以 `RngServiceCore.PURPOSE_TAGS` 为准;增流走 P1 评审) | `set_master_seed()`(唯一调用方 C2);`open_stream(stream)` 有状态门面;`derive_at(stream, scope)` 纯函数;只读计数器 | ConfigDB(无) | 无——纯逻辑 |
+2 -2
View File
@@ -2,7 +2,7 @@
> **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。 > **一句话定位**:本文定义这个项目的 **Alpha 版本包含哪些东西**——它是里程碑 M3 的完成标准,也是判断"还差什么"的对照表。
> **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。 > **本文只列条目,不写内容**:每样东西是什么、规则怎么走,一律归各自的权威文档,本文只给指路链接。想知道某样东西的定义,请点链接,不要在本文里找解释。
> **状态**:**已定稿(v1.23)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。 > **状态**:**已定稿(v1.24)**——2026-10-13 用户令定稿,历次升版明细见 git 提交史。Alpha 的内容范围自此冻结:增删条目一律须经用户裁决。
> **成文**:2026-10-13。 > **成文**:2026-10-13。
## 本文怎么用 ## 本文怎么用
@@ -147,7 +147,7 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
| 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 | | 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 |
| 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史,复核转正归战斗一屏样张) | | 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史,复核转正归战斗一屏样张) |
| 棋盘观感(第二 / 三关亮度与对比度) | [待办清单](../../待办清单.md) | 待做(开工前置=先做素材轴/UI 轴对照截图定性,再按定轴修复;旧卡 v1.4 存 reports/ 作素材、非已写卡状态,重启须重新立卡;出口=用户实机目检第二、三关不再判「看着费劲」) | | 棋盘观感(第二 / 三关亮度与对比度) | [待办清单](../../待办清单.md) | 待做(开工前置=先做素材轴/UI 轴对照截图定性,再按定轴修复;旧卡 v1.4 存 reports/ 作素材、非已写卡状态,重启须重新立卡;出口=用户实机目检第二、三关不再判「看着费劲」) |
| 立绘显示清晰度(原稿分辨率+三档显示) | [角色设计](../art/character-design.md) | 待做(评估已结——不回退高清、维持像素风;终态方案=保留原稿分辨率、入包禁降采样、显示按三档绝对高 96/144/188 缩放、现有形象即终稿;裁决录=待办清单本条+art-bible §8.2;出口=9 件按档落位+用户目检清晰度与同屏体量顺序通过) | | 立绘显示清晰度(原稿分辨率+三档显示) | [角色设计](../art/character-design.md) | 在役(九件已按档落位+机检全绿——原稿分辨率入包禁降采样、显示按三档绝对高 96/144/188 缩放、现有形象即终稿;定值单点=art-bible §8.2;实机目检清晰度与同屏体量顺序登记体验验证清单 ㊻) |
| 敌人立绘(全敌种) | [角色设计](../art/character-design.md) | 在役 | | 敌人立绘(全敌种) | [角色设计](../art/character-design.md) | 在役 |
| 主角立绘三态 | [角色设计](../art/character-design.md) | 在役 | | 主角立绘三态 | [角色设计](../art/character-design.md) | 在役 |
| 状态图标 | [美术圣经](../art/art-bible.md) | 在役 | | 状态图标 | [美术圣经](../art/art-bible.md) | 在役 |
@@ -1,7 +1,7 @@
# 增益状态 # 增益状态
> 一句话:增益/减益的状态池、叠层与衰减 > 一句话:增益/减益的状态池、叠层与衰减
> 状态:已定稿(自旧体系迁移);现行为 v1.3 > 状态:已定稿(自旧体系迁移);现行为 v1.4
## 设计目的 ## 设计目的
@@ -83,7 +83,7 @@
| 合并策略 | 重复授予时发生什么 | 说明 | | 合并策略 | 重复授予时发生什么 | 说明 |
|---|---|---| |---|---|---|
| 叠加 | 层数加一;剩余结算次数不动——只有首次授予定钟 | 现行内容行多数用叠加(逐行合并策略读 `status_effects.tres`) | | 叠加 | 层数加一;剩余结算次数不动——只有首次授予定钟 | 现行内容行多数用叠加(逐行合并策略读 `status_effects.tres`) |
| 累加 | 剩余结算次数加上本次授予的时长——技能施放行带覆盖时长时按覆盖值加;层数不变 | 现行内容行六行用累加(削弱行 weaken、增益技行 empower / fortify、主角增益行 attack_up / ac_up);重复拿一次就多攒一段时长,同一轮拿几份攒几段,停手后按剩余次数逐轮耗完;逐行读 `status_effects.tres` | | 累加 | 剩余结算次数加上本次授予的时长——技能施放行带覆盖时长时按覆盖值加;层数不变 | 现行内容行七行用累加(削弱行 weaken、增益技行 empower / fortify / defensive_stance、主角增益行 attack_up / ac_up);重复拿一次就多攒一段时长,同一轮拿几份攒几段,停手后按剩余次数逐轮耗完;逐行读 `status_effects.tres` |
| 并存 | 新建一份独立实例,两份各算各的 | 同上 | | 并存 | 新建一份独立实例,两份各算各的 | 同上 |
并存分支没有满层上限,但状态池规模天然有界:实例数的上界就是受理过的授予数——多受理一份就多一份实例,多少份在授予那一刻就完全确定,不会无限膨胀。 并存分支没有满层上限,但状态池规模天然有界:实例数的上界就是受理过的授予数——多受理一份就多一份实例,多少份在授予那一刻就完全确定,不会无限膨胀。
@@ -110,7 +110,7 @@
### 剩余次数怎么倒数:按结算次数衰减 ### 剩余次数怎么倒数:按结算次数衰减
每个状态实例自带一个倒数计数——剩余结算次数(本文说的"衰减"就是它逐次递减、归零消失)。它不承诺"活几轮",而是数"经历过几次轮末结算":每轮结算先让状态起作用,随后计数减一,减到零状态即被移除。持续 1 的状态就是"一次性":在授予它的那轮结算里生效一次,轮末消失。现行累加行里主角增益两行持续 1、削弱与敌方增益技行持续 2——累加语义下重复拿一次就按本次授予时长多攒一段,同一轮拿几份攒几段;跨轮持续的状态,寿命由表行初始值表达,给几就活几次结算。 每个状态实例自带一个倒数计数——剩余结算次数(本文说的"衰减"就是它逐次递减、归零消失)。它不承诺"活几轮",而是数"经历过几次轮末结算":每轮结算先让状态起作用,随后计数减一,减到零状态即被移除。持续 1 的状态就是"一次性":在授予它的那轮结算里生效一次,轮末消失。现行累加行里主角增益两行持续 1、削弱与敌方增益技行(含护身)持续 2——累加语义下重复拿一次就按本次授予时长多攒一段,同一轮拿几份攒几段;跨轮持续的状态,寿命由表行初始值表达,给几就活几次结算。
``` ```
一轮结算:查询生效清单 → 逐行兑付(层数 × 行值)→ 轮末衰减(全部实例剩余次数 −1)→ 归零实例移除 一轮结算:查询生效清单 → 逐行兑付(层数 × 行值)→ 轮末衰减(全部实例剩余次数 −1)→ 归零实例移除
@@ -145,9 +145,9 @@
状态池还有一条快照纪律:实例的幅度、初始次数、量纲在授予那一刻从表行拷贝。战斗中配置表即使被重载,已授予实例不受任何影响,只影响后续授予。 状态池还有一条快照纪律:实例的幅度、初始次数、量纲在授予那一刻从表行拷贝。战斗中配置表即使被重载,已授予实例不受任何影响,只影响后续授予。
### 现在有哪些状态:现行九行内容 ### 现在有哪些状态:现行十行内容
现行状态表恰有九行:主角侧四行(增伤/盾牌加护两增益 + 失衡/乏力两减益)、敌方侧五行(削弱/暴走/警觉/蓄力/硬化——警觉为 blast 型负向踩雷载体,2026-09-20 伏击退役后进表)。全部用同构实例承载;数值全部 provisional(临时值,过锚验收后才定稿)。 现行状态表恰有十行:主角侧四行(增伤/盾牌加护两增益 + 失衡/乏力两减益)、敌方侧六行(削弱/暴走/警觉/蓄力/硬化/护身——警觉为 blast 型负向踩雷载体,2026-09-20 伏击退役后进表;护身 defensive_stance 为敌方低血防御增益〔地精池情境技「孤注守势」载体,2026-10-27 迭代 39 投放——本行当时漏登,2026-11-02 随状态合并累加制批考证补录〕)。全部用同构实例承载;数值全部 provisional(临时值,过锚验收后才定稿)。
| 字段 | 取值 | 说明 | | 字段 | 取值 | 说明 |
|---|---|---| |---|---|---|
@@ -157,7 +157,7 @@
| magnitude | 整数 | 幅度:百分比行 ∈ [−100,100] 且非 0;固定值行 ≥ 1;护甲等级行 ∈ [−20,20] 且非 0 | | magnitude | 整数 | 幅度:百分比行 ∈ [−100,100] 且非 0;固定值行 ≥ 1;护甲等级行 ∈ [−20,20] 且非 0 |
| unit | percent / flat / ac | 百分比修正 / 固定值 / 护甲等级(掷点折扣判定阈值轴——2026-09-16 护甲等级掷点批新增) | | unit | percent / flat / ac | 百分比修正 / 固定值 / 护甲等级(掷点折扣判定阈值轴——2026-09-16 护甲等级掷点批新增) |
| duration_settlements | 整数 [1,99] | 授予时初始剩余结算次数(1 = 一次性) | | duration_settlements | 整数 [1,99] | 授予时初始剩余结算次数(1 = 一次性) |
| stack_policy | stack / refresh / independent | 同名再授予的合并策略 | | stack_policy | stack / accumulate / independent | 同名再授予的合并策略(叠加 / 累加 / 并存) |
| max_stack | 整数 [1,16] | 叠层上限,仅叠加策略消费 | | max_stack | 整数 [1,16] | 叠层上限,仅叠加策略消费 |
| 状态 | 效果一句话 | 发给谁 | 幅度(现行值) | 时限 / 合并 | 来源类别 | | 状态 | 效果一句话 | 发给谁 | 幅度(现行值) | 时限 / 合并 | 来源类别 |
@@ -171,6 +171,7 @@
| sapped 乏力 | 主角输出降低(weaken 型负向,主角输出池) | 主角 | 见 `status_effects.tres` sapped 行 | 时限/上限读表 / 叠加 | 危险格负向 / 标空封印(2026-09-15 格面资源批)/ 敌方妨害技(大地脉动——L3 Boss 石君王独占,2026-09-20 第三关内容批) | | sapped 乏力 | 主角输出降低(weaken 型负向,主角输出池) | 主角 | 见 `status_effects.tres` sapped 行 | 时限/上限读表 / 叠加 | 危险格负向 / 标空封印(2026-09-15 格面资源批)/ 敌方妨害技(大地脉动——L3 Boss 石君王独占,2026-09-20 第三关内容批) |
| empower 蓄力 | 敌方输出倍率增益(敌方输出池——蓄力技载体;幅度读表) | 敌方 | 见 `status_effects.tres` empower 行 | duration 读表 = 1 个有效增益拍 / 累加 | 敌方技能施放(2026-09-16 敌人技能池批) | | empower 蓄力 | 敌方输出倍率增益(敌方输出池——蓄力技载体;幅度读表) | 敌方 | 见 `status_effects.tres` empower 行 | duration 读表 = 1 个有效增益拍 / 累加 | 敌方技能施放(2026-09-16 敌人技能池批) |
| fortify 硬化 | 敌方防御提升(**敌方防御池**——硬化技载体;负值入池 = 主角攻击折半,2026-09-18 符号纠正——旧正值实际翻倍) | 敌方 | 见 `status_effects.tres` fortify 行 | duration 读表 = 1 个有效增益拍 / 累加 | 敌方技能施放(2026-09-16 敌人技能池批) | | fortify 硬化 | 敌方防御提升(**敌方防御池**——硬化技载体;负值入池 = 主角攻击折半,2026-09-18 符号纠正——旧正值实际翻倍) | 敌方 | 见 `status_effects.tres` fortify 行 | duration 读表 = 1 个有效增益拍 / 累加 | 敌方技能施放(2026-09-16 敌人技能池批) |
| defensive_stance 护身 | 敌方输出降低(敌方输出池——敌方低血防御增益;地精池情境技「孤注守势」载体,血量阈值触发施放,duration 由技能行覆盖) | 敌方 | 见 `status_effects.tres` defensive_stance 行 | duration 读表 / 累加 | 敌方技能施放(2026-10-27 迭代 39 触发条件批投放——行值随卡①累加制批改累加) |
empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(技能行 buff_ref 引用,施放时长由技能行覆盖——技能冷却与增益持续是两个计时器):两行 duration 表值(读表)的口径是"先兑付后衰减含施放当轮"——施放发生在第 N 结算战斗段,存活到第 N+1 结算战斗段才兑付"下一拍",即"持续 1 个有效结算"(proposal 语义的状态池落地)。敌方防御池是第四个乘区池:敌方作为防守方的百分比修正池,消费面 = [战斗结算](战斗结算.md)主角攻击的池乘区——四池对称(敌打主角 = 主角防御池 × 敌方输出池,主角打敌 = 主角输出池 × 敌方防御池),状态池语义零延伸:仍是同构实例、side-wide 加算、不封顶不保底。 empower 与 fortify 是敌方技能池增益技在状态池侧的数据落点(技能行 buff_ref 引用,施放时长由技能行覆盖——技能冷却与增益持续是两个计时器):两行 duration 表值(读表)的口径是"先兑付后衰减含施放当轮"——施放发生在第 N 结算战斗段,存活到第 N+1 结算战斗段才兑付"下一拍",即"持续 1 个有效结算"(proposal 语义的状态池落地)。敌方防御池是第四个乘区池:敌方作为防守方的百分比修正池,消费面 = [战斗结算](战斗结算.md)主角攻击的池乘区——四池对称(敌打主角 = 主角防御池 × 敌方输出池,主角打敌 = 主角输出池 × 敌方防御池),状态池语义零延伸:仍是同构实例、side-wide 加算、不封顶不保底。
@@ -57,7 +57,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
| 区 | 位置与几何 | 管什么 | | 区 | 位置与几何 | 管什么 |
|---|---|---| |---|---|---|
| B 战斗画面 | 全宽,高读布局表 `stage_h` | 主角站桩立绘、敌人站桩立绘 ×1–3(**全站桩形态,2026-09-20 用户拍板:无框立绘+底座、状态小图标挂血条下,英雄卡/敌人卡退役**)、轮次阶段指示、结算明细带 | | B 战斗画面 | 全宽,高读布局表 `stage_h`(背景三关变体+连续地面层高另读 `ground_h`) | 三关舞台背景+连续地面层、主角站桩立绘、敌人站桩立绘 ×1–3(**全站桩形态,2026-09-20 用户拍板:无框立绘+底座、状态小图标挂血条下,英雄卡/敌人卡退役**)、轮次阶段指示、结算明细带 |
| C 角色信息 | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 | | C 角色信息 | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 |
| D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距(原右下面板删除后横向加宽),高同 C 区 | 行动点条与按钮组、棋盘本体、toast 槽 | | D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距(原右下面板删除后横向加宽),高同 C 区 | 行动点条与按钮组、棋盘本体、toast 槽 |
@@ -244,7 +244,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
## 调参表 ## 调参表
本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / C 区宽 / AP 条高 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。 本系统的参数全部是呈现节奏与可读性常量,不是玩法数值——玩法数值一律归[数据配置](数据配置.md)的表,与本表无关。修订本文常量走文档修订流程。**本表常量无数据表承载,为文档面唯一事实源;入驻 .tres 时本列改指路。** 布局几何(B 区高 / B 区连续地面层高 / C 区宽 / AP 条高 / 明细带两态高)已入驻 `game/data/tables/battle_layout.tres`,不在本表重复。
| 参数 | 域 | 现行值(文档自持,无表承载) | 说明 | | 参数 | 域 | 现行值(文档自持,无表承载) | 说明 |
|---|---|---|---| |---|---|---|---|
@@ -1,7 +1,7 @@
# 数据配置 # 数据配置
> 一句话:数值表与单一事实源管线 > 一句话:数值表与单一事实源管线
> 状态:已定稿(自旧体系迁移);现行为 v1.1 > 状态:已定稿(自旧体系迁移);现行为 v1.2
## 设计目的 ## 设计目的
@@ -70,7 +70,7 @@
| 关卡表 | 逐关节点图与层名 | [冒险结构](../冒险循环/冒险结构.md) | | 关卡表 | 逐关节点图与层名 | [冒险结构](../冒险循环/冒险结构.md) |
| 冒险表 | 关卡大奖励与钥石入账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) | | 冒险表 | 关卡大奖励与钥石入账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) |
| 元进度表 | 元进度字段(已建表 2026-09-21——现行五行族:属性锻造 / Boss 钥石 / 工坊阈值 / 换算率 / 同调刷新升级行族,顺带扩列) | [元进度](../跨局循环/元进度.md) | | 元进度表 | 元进度字段(已建表 2026-09-21——现行五行族:属性锻造 / Boss 钥石 / 工坊阈值 / 换算率 / 同调刷新升级行族,顺带扩列) | [元进度](../跨局循环/元进度.md) |
| 战斗屏布局表(`battle_layout.tres`) | 分区几何与明细带两态高(单行;呈现层布局配置,非玩法数值——供呈现层与样张工具同源读取) | [战斗屏规格](../../ux/battle.md)(结构)/[HUD框架](HUD框架.md)(呈现常量) | | 战斗屏布局表(`battle_layout.tres`) | 分区几何、B 区连续地面层高与明细带两态高(单行;呈现层布局配置,非玩法数值——供呈现层与样张工具同源读取) | [战斗屏规格](../../ux/battle.md)(结构)/[HUD框架](HUD框架.md)(呈现常量) |
举证:本节为数据纪律约定,无计算。违规检测 = 静态扫描加人工复核,随各表回填定稿与里程碑检查执行。 举证:本节为数据纪律约定,无计算。违规检测 = 静态扫描加人工复核,随各表回填定稿与里程碑检查执行。
+3 -3
View File
@@ -2,7 +2,7 @@
> **Status**: Complete(现行) > **Status**: Complete(现行)
> **Author**: user + ux-designer > **Author**: user + ux-designer
> **Last Updated**: 2026-11-01 > **Last Updated**: 2026-11-02
> **Platform Target**: PC (Steam)——Keyboard/Mouse 主(全部操作纯鼠标可完成)、Gamepad Partial 非 MVP、Touch None(同 technical-preferences) > **Platform Target**: PC (Steam)——Keyboard/Mouse 主(全部操作纯鼠标可完成)、Gamepad Partial 非 MVP、Touch None(同 technical-preferences)
> **上游修订依赖**: 弃图刷新挖掘期受理已随布局决策 4 落稿上游(2026-09-12:行动经济 Active 受理 + 每轮上限 2 次、排雷玩法 Active·仅刷新路径装板、战斗结算的挖掘期刷新编排 + 恒同盘不变、系统索引的刷新规则同步——见 OQ11) > **上游修订依赖**: 弃图刷新挖掘期受理已随布局决策 4 落稿上游(2026-09-12:行动经济 Active 受理 + 每轮上限 2 次、排雷玩法 Active·仅刷新路径装板、战斗结算的挖掘期刷新编排 + 恒同盘不变、系统索引的刷新规则同步——见 OQ11)
> **Template**: UX Spec > **Template**: UX Spec
@@ -115,7 +115,7 @@
### Layout Zones ### Layout Zones
采用用户拍板的布局图(2026-09-12),按 1280×800 基座落尺寸。**分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`**(经 `ConfigDb.presentation.battle_layout` 读取;字段 `stage_h` / `info_panel_w` / `ap_bar_h` / `log_band_h_dig` / `log_band_h_settle`)。本节只写结构关系与内容职责,不复写数值;任何文档与代码不另立第二份布局值。 采用用户拍板的布局图(2026-09-12),按 1280×800 基座落尺寸。**分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`**(经 `ConfigDb.presentation.battle_layout` 读取;字段 `stage_h` / `ground_h`(B 区连续地面层高)/ `info_panel_w` / `ap_bar_h` / `log_band_h_dig` / `log_band_h_settle`)。本节只写结构关系与内容职责,不复写数值;任何文档与代码不另立第二份布局值。
| 区 | 位置与几何 | 内容 | | 区 | 位置与几何 | 内容 |
|---|---|---| |---|---|---|
@@ -152,7 +152,7 @@
| 区 | 组件 | 类型 | 内容 | 交互 | 载体 | | 区 | 组件 | 类型 | 内容 | 交互 | 载体 |
|---|---|---|---|---|---| |---|---|---|---|---|---|
| B | 主角站桩立绘 | 站桩(无框立绘+落影) | HP 条落底盘(2026-10-06 方案二拍板:站桩排式 = **立绘→血条→状态**,全场血条对齐一线;血条嵌石板位、台缘线留作地面线;原「悬浮头顶」退役——高盒下血条-立绘空洞,用户点名否决)、状态效果小图标一排挂血条正下方(形状+色相双通道、层数角标;空态不占位退化为空行)——**HP 与状态效果的唯一展示面(2026-09-26 信息归属拍板,原 C 区状态槽职责〔悬停 tooltip 来源+语义+剩余结算次数〕并入本组件)**;攻击值等规划数据仍归 C 区数据框(2026-09-20 全站桩拍板,英雄卡退役) | 悬停状态小图标看 tooltip | HUD 视图拆分改造 | | B | 主角站桩立绘 | 站桩(无框立绘+落影) | HP 条落底盘(2026-10-06 方案二拍板:站桩排式 = **立绘→血条→状态**,全场血条对齐一线;血条嵌石板位、台缘线留作地面线;原「悬浮头顶」退役——高盒下血条-立绘空洞,用户点名否决)、状态效果小图标一排挂血条正下方(形状+色相双通道、层数角标;空态不占位退化为空行)——**HP 与状态效果的唯一展示面(2026-09-26 信息归属拍板,原 C 区状态槽职责〔悬停 tooltip 来源+语义+剩余结算次数〕并入本组件)**;攻击值等规划数据仍归 C 区数据框(2026-09-20 全站桩拍板,英雄卡退役) | 悬停状态小图标看 tooltip | HUD 视图拆分改造 |
| B | 敌人站桩立绘 ×1–3 | 站桩(无框立绘+落影) | 血条+顺位徽标落底盘(同主角排式,2026-10-06 方案二;**大体档〔显示 >150px 级:drider/duergar_king〕允许向上溢出盒顶 N px(N 由实装批 C0 实算,与背景/光柱无关——现行溢出区为临时光柱氛围层,正式舞台背景插画到位后该层退役,判定不变),血条仍落底**)、状态小图标挂血条正下方(敌方 side-wide 增益各立绘同值呈现——蓄力/硬化/削弱/暴走/警觉;伏击层数通道随 2026-09-20 八型批退役——数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;2026-09-16 敌人技能池批改型:行为环点拆除〔proposal §2.4〕,意图占位 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,**意图徽标悬浮头顶上方,探顶档压胸**,敌方增益〔蓄力/硬化〕入状态图标行);死亡灰化加碎裂退场直接演在立绘上(2026-09-20 全站桩拍板,敌人卡退役);血条下名字行 = 纯名字 + 护甲类型图标(形状+色相双通道,与状态图标同行共存,状态空时为纯名字;原「底座下」随石板退位改落底排),AC 数值不展示——2026-09-26 终裁(用户口径:HP 信息已足够,攻防数值不直接写上;护甲类型图标保留克制对策可读性——类型可读、数值隐藏) | 只读 | 新建 | | B | 敌人站桩立绘 ×1–3 | 站桩(无框立绘+落影) | 血条+顺位徽标落底盘(同主角排式,2026-10-06 方案二;**大体档〔显示 >150px 级:drider/duergar_king〕允许向上溢出盒顶 N px(N 由实装批 C0 实算,与背景无关——原临时光柱氛围层已随舞台背景实装批退役〔2026-11-02 迭代 48〕,溢出判定不变),血条仍落底**)、状态小图标挂血条正下方(敌方 side-wide 增益各立绘同值呈现——蓄力/硬化/削弱/暴走/警觉;伏击层数通道随 2026-09-20 八型批退役——数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;2026-09-16 敌人技能池批改型:行为环点拆除〔proposal §2.4〕,意图占位 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,**意图徽标悬浮头顶上方,探顶档压胸**,敌方增益〔蓄力/硬化〕入状态图标行);死亡灰化加碎裂退场直接演在立绘上(2026-09-20 全站桩拍板,敌人卡退役);血条下名字行 = 纯名字 + 护甲类型图标(形状+色相双通道,与状态图标同行共存,状态空时为纯名字;原「底座下」随石板退位改落底排),AC 数值不展示——2026-09-26 终裁(用户口径:HP 信息已足够,攻防数值不直接写上;护甲类型图标保留克制对策可读性——类型可读、数值隐藏) | 只读 | 新建 |
| B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 | | B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 |
| B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 点击展开明细回看 overlay(2026-10-04 P-C7 退役——带保留单行摘要,回看归「生涯」) | 改造 | | B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 点击展开明细回看 overlay(2026-10-04 P-C7 退役——带保留单行摘要,回看归「生涯」) | 改造 |
| B | ~~结算明细回看~~(已退役) | —— | 2026-10-04 P-C7 裁:冒险中回看退役归「生涯」——回看覆盖层为未接线遗留件(待办清单登记) | —— | 未接线 | | B | ~~结算明细回看~~(已退役) | —— | 2026-10-04 P-C7 裁:冒险中回看退役归「生涯」——回看覆盖层为未接线遗留件(待办清单登记) | —— | 未接线 |
+1
View File
@@ -109,6 +109,7 @@
| 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地砖换色板) | | 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地砖换色板) |
| 方向稿 | 冻结前的方向性候选稿,供气质目检;过目检后才进机检冻结 | | 方向稿 | 冻结前的方向性候选稿,供气质目检;过目检后才进机检冻结 |
| 站桩 | 战斗画面区(B 区)里角色直立立绘的显示形态(配血条与状态行) | | 站桩 | 战斗画面区(B 区)里角色直立立绘的显示形态(配血条与状态行) |
| 显示档 | 站桩立绘的显示尺寸规则——源用原稿分辨率入包(禁降采样),显示按三档绝对高(小型 96/中型 144/大型 188)缩放、宽随源比例;定值单点见[美术圣经](../art/art-bible.md) §8.2 站桩立绘显示档条 |
| 徽章 | 库存条与结算明细用的小图标(与格面类型微光预读相区分) | | 徽章 | 库存条与结算明细用的小图标(与格面类型微光预读相区分) |
## 开发流程 ## 开发流程
@@ -1,33 +0,0 @@
# 迭代 48 代拍板追认单(2026-11-02)
> 全部代拍板均落在各卡白名单内,无超白名单事项。本单按卡逐条备案追认(随 commit 留痕)。
## 卡①状态合并累加制(白名单 1–3 全用,零超出)
| 白名单项 | 落地 | 追认 |
|---|---|---|
| 1 词表值命名 `accumulate` | schema `STACK_POLICIES := ["stack", "accumulate", "independent"]` | 追认 |
| 2 合并授予不改快照(首授快照恒定) | `_apply_accumulate` 零快照写入;V1 断言 snap_magnitude==−65 背书 | 追认 |
| 3 测试函数改名 `_weaken_accumulate_probe` 与 V 尾缀措辞 | 全仓旧名零残留;〔状态累加 V1/V2/V3/V4〕在案 | 追认 |
| 裁决补记随动(2026-11-02 用户甲案——非代拍板,用户裁决授权) | `_ineffective_row` 载荷 `deferred: true`+`_row_phase` 分类补 deferred→战斗段(卡①申报 5+R7 行) | 随用户裁决生效 |
## 卡②立绘显示档(白名单 1–5 全用,零超出)
| 白名单项 | 落地 | 追认 |
|---|---|---|
| 1 `portrait_probe()` 新读数键名 | `display_size`/`display_scale`(卡面拟定名照用) | 追认 |
| 2 `pixelize_candidates.py` 函数与 CLI 旗标改名 | `build_standee_display`/`--standee-display` | 追认 |
| 3 测试尾缀〔立绘显示档 Vn〕括注格式 | V13–V18 六尾缀 | 追认 |
| 4 对照图目录名 | `artwork/candidates/立绘显示档批-2026-11-02/` | 追认 |
| 5 主角取 key 实现写法 | `enemy_id()` 空值判 hero | 追认 |
## 卡③战斗区背景替换(白名单 1–6 全用,零超出)
| 白名单项 | 落地 | 追认 |
|---|---|---|
| 1 私有函数顺序/局部变量名 | `_build_ground`/`_load_stage_texture`/`set_board_type` 布局与命名 | 追认 |
| 2 测试 helper 顺序与断言消息措辞 | stage_background_test 18 checks 消息(判据值/阈值零改) | 追认 |
| 3 注释与日志文案 | 舞台顶注/背景域注释换代(零「光柱仍在」类误导、零变更史) | 追认 |
| 4 TextureRect expand/stretch 写法 | `EXPAND_IGNORE_SIZE`+`STRETCH_SCALE`(基准档 1×) | 追认 |
| 5 B 区 1px 面板描边可见性处理 | 平色 Panel 描边保留被背景覆盖(未另加描边层、零新增类变量) | 追认 |
| 6 既有错误扫描暴露的纯格式问题一次修净 | 无新增格式修(gdstyle 零新键) | 追认(空项) |
@@ -1,45 +0,0 @@
# 停机呈报:迭代 48 卡①(状态合并累加制批)——round_flow 相位单调断言红(L3②)
> 日期:2026-11-02 · 性质:实现段停机呈报(缺陷移交,非提问)。呈报即卡①停摆,改动全部留在迭代工作区 `g-plan2-iter48` **未提交**,卡②卡③已各自提交收口。
> **裁决闭合(2026-11-02 用户甲案)**:按生产行载荷自描述键方案补记卡①(申报 5+R7 行+写面两行+T1 随动步)后本区继续施工——`_ineffective_row` 加 `deferred: true`+`_row_phase` 分类随动,七套件复跑全绿,卡①收口提交 df173018。第六节待办清单状态回退拟稿作废不执行。本呈报留作裁决与根因记录。
## 一、停机点(哪条判据触发)
卡①第十节 T1 末项:「孤立验证:六套件最窄复跑(…round_flow_skill_pool——EV 锚套件提前曝红)全绿或按 L3②停机」。round_flow_skill_pool_test 套件红(133 PASS / 1 FAIL,exit=1,两次复跑确定性复现同断言同行)→ 按卡①第十二节 L3② 停机呈报。
## 二、红项全貌
- 断言:`game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd:422`「每轮行相位单调(授予→增益/减益→战斗→衰减→判定)」,宿主函数 `_smoke_settlement_segments`。
- 违序行(种子 42,L1·D0 自动局,round 2):
`{"batch_key":"magic_bolt","type":"reward_ineffective","source_class":"safe_cell","display_name":"魔法矢 未生效(无存活敌人)","value":0,"round_index":2}`——出现在同轮战斗段伤害行之后,被测试的相位分类器判为第 0 段(授予段),形成 0 段行后于 2 段行的读序。
- 改前 CI(de5e31ed 回执 unit.log:3923)同断言 PASS——红确属本批新增,非存量红。
## 三、根因(两条事实链)
1. **生产侧行为符合设计**:该行由 `damage_controller.gd:543/:568 → _ineffective_row(:686)` 在「案C 地图账殿后」补提交结算时发射(魔法矢找不到存活目标)——行本身落在战斗段末是案C 既有口径;累加制使削弱实例存续更长 → 战斗轨迹改变(该局敌人 round 2 内提前全灭)→ 这类「战斗段内未生效」行首次在该种子轨迹出现。
2. **测试侧分类器存在潜伏缺口**:`_row_phase`(round_flow_skill_pool_test.gd:466-467)把无 `hero_down` forfeit 的 `reward_ineffective` 一律判第 0 段(授予段未生效);该假设在旧轨迹下从未被打破,累加制轨迹首次暴露。
## 四、分歧点与两种读法
- 读法 A(测试缺陷 exposed):断言冻结的五段全序不变量本身仍被生产行为满足(行序实际是 授予→…→战斗→地图账→衰减→判定),红的直接原因是分类器对「战斗段地图账未生效行」这一已存在行型缺映射。修复=把该行型正确归类到战斗段(相位 2)——属**断言改判**,须卡片申报(卡①测试削弱申报四条未含此项,写面亦不含 round_flow_skill_pool_test.gd)。
- 读法 B(生产缺陷):「奖励直伤找不到目标」不应以第 0 段形态出现在战斗段——若设计意图是该行必须留在授予段,则生产发射时点错位。查证:案C 口径(combat_segment.gd:107-109 注释「主角死于怪物 → 地图账不兑,逐单留『未生效』行不作废静默」)明确未生效行属战斗段末地图账——读法 B 不成立,但归类标记(现仅 `hero_down` 一种 forfeit)是否扩词表属设计面裁量。
## 五、建议案(供裁决,二选一或另裁)
- **甲案(推荐)**:卡①补申报一条测试随动——`_row_phase` 对「战斗段地图账未生效行」补归类。实现取其一:① 最小测试面:`reward_ineffective` 行按「同轮已出现战斗段行」状态化归类(分类器带一比特状态,不变量强度不降);② 生产观测面扩展:`_ineffective_row`(damage_controller.gd:686-690)载荷加自描述键(如 `"deferred": true`,零行为改动、行载荷观测面扩展),分类器读键归类——行自描述优于启发式,推荐②。两法都须写卡段补记进卡①对照表与削弱申报后方可施工。
- **乙案**:判为累加制的设计后果重裁(例如「敌人全灭后地图直伤奖励该不该仍结账」属玩法问题)——若如此,卡①整体退回设计段,与本批解耦。
EV 锚三值(goblin 0.9148/bugbear 1.0012/ogre_chief 1.1948)改前改后逐位一致、全绿——**无期望值漂移**,乙案如走重锚通道无数据依据。
## 六、待办清单对应条目状态回退+缺口补记(拟稿,落笔归上游段/用户)
条目「状态合并改累加制——同名状态重复授予改加时长」(待办清单 :20-32):
- 状态回退:「文档设计已闭合+已写卡+已编迭代 48」→「已写卡(实现停机待卡补记——round_flow 相位断言随动申报未决)」。
- 缺口补记:需求卡片-状态合并累加制批-2026-11-01.md 需补第十一节申报一条(round_flow `_row_phase` 战斗段未生效行归类,甲案①或②取一)+第七节文件结构图补 round_flow_skill_pool_test.gd(甲①)或 damage_controller.gd 观测面一行(甲②);补记后重新编入迭代。
## 七、卡①已完成面(停机不抹账)
- 实装六处全落:tres 六行 accumulate/schema 词表/容器累加臂(`_apply_accumulate`,R += D)/roll_multiplier 探针五段式+V1/V2/V3 断言/table_structure_guard V4/damage_controller 标签换代。grep 四项可核查全过(值行 refresh 零残留、accumulate 恰六处、容器与全仓定义面 refresh 零残留)。
- 六套件窄测:五套件全绿(roll_multiplier 42 checks/table_structure_guard/system_contracts/damage_controller 44/seal_polarity 70),round_flow 133 PASS+1 FAIL(本呈报主体)。
- 改前基线:S13 两产品文件零基线键;EV 锚改前读数 goblin 0.9148(CI unit.log:3968)。
-28
View File
@@ -1,28 +0,0 @@
# 迭代 48 反哺点清单(2026-11-02)
> 本批未写 `design/`、未写根流程清单、未写 `game/tests/README.md`。以下逐条待用户裁决后由文档批落文,落文后本清单逐条清除。
## 卡②立绘显示档
1. **08-Alpha版本标准.md 覆盖行**:立绘清晰度条目「待做」→「在役」列呈裁——九件已按档落位+机检全绿,实机目检四项登记在案(实现报告第四节 1–5)。
2. **art-prompts.md §5.4 产出状态**:「待实装批落位」→「已落位」(依据:九件原稿分辨率入包、`STANDEE_SRC_H` 表在案、`--standee-display` 派生管线)。
3. **art-status-checklist.md/art-assets-checklist.md 站桩行**:「按档派生落位归本条实装批」→ ✅ 已交付(依据同上;闸件 standee_asset_check 已换显示档口径全绿)。
4. **待办清单.md 本条**:状态推进已编迭代 48 → 完成删条(状态机推进,非实现批直改)。
5. **术语表「显示档」是否立条**:呈裁——卡②三处口径(art-bible §8.2 定值单点/GDScript `PORTRAIT_DISPLAY_H`/Python `STANDEE_DISPLAY_H`)已稳定使用「显示档」一词,是否进术语表归用户裁。
6. **体验验证清单.md**:实机目检五项(实现报告第四节 1–5)转正式条目呈裁。
## 卡③战斗区背景替换
7. **art-bible.md §6.1**:三句实装化——「程序化平色+光柱现行使用=占位」改为背景三关变体+连续地面已实装;「ground_h 由实装批新增并回填」改为已回填 100;「资产到位后四柱直接退役」改为已退役(依据:`TEX_STAGE_BG_FMT`/`TEX_STAGE_GROUND`/`set_board_type` 落码,光柱层与 BEAM_LIGHT 删除,断言 V2–V5 绿)。
8. **art-bible.md §4.1 换色合并登记③**:`STAGE_BG` 由「随舞台背景插画批处置」改为已退役、平色缺图回退改指 `SLOT_BACKDROP`(#3E362C)——代码事实(常量表零键、回退点改指,断言 V5 绿)。
9. **art-assets-checklist.md §4**:三张背景与地面「已出候选 v10」状态句 → 候选 v12 过审、终稿入包已实装消费;小石台保留句核对无误(原样保留、叠于地面之上)。
10. **battle-stage-prompts.md §4/§5**:「ground_h 待实装批回填」→ 已回填 100;档 6「四柱退役(代码批)」→ 已退役。
11. **design/gdd/ux/battle.md :118、:155**:布局字段清单补 `ground_h`(B 区连续地面层高,源=基准屏宽×本值);「现行溢出区为临时光柱氛围层,正式背景到位后该层退役」→ 已退役,溢出判定不变。
12. **HUD框架.md :60、:247**:B 区内容补「三关背景+连续地面层」;布局几何清单补地面层高(读布局表 ground_h)。
13. **数据配置.md :73**:布局表用途句补「地面层高度」。
14. **体验验证清单.md**:实机目检五项(实现报告第四节 6–10)转正式条目呈裁。
## 卡①状态合并累加制(甲案裁决已闭合——随本批合回生效)
15. **增益状态.md 字段表 stack_policy 取值行**:「stack / refresh / independent」→「stack / accumulate / independent」(依据:schema 词表与表行已换代——该落文随卡①合回生效,卡未闭合前禁落)。
16. **增益状态.md「现在有哪些状态」节**:「现行九行」→ 十行+补 defensive_stance(护身)行(敌方输出减益 −25 percent、duration 2、累加、max_stack 1、来源敌方技能「孤注守势」)——本批考证发现的存量漂移,非本批造成。
-81
View File
@@ -1,81 +0,0 @@
# 迭代 48 实现报告(2026-11-02)
> 批性质:需求改动实现批(三卡:①状态合并累加制②立绘显示档③战斗区背景替换)。执行形态=整迭代单工作区 `g-plan2-iter48` 串行。开工基点 bfa0a8be→a5c89d67(批中并入 master 对齐绿基线)。卡① 曾按 L3② 停机呈报(`iter48-停机呈报-卡1状态相位断言-2026-11-02.md`),**2026-11-02 用户甲案裁决**=补记卡①申报(R7 行:`_ineffective_row` 载荷自描述键+`_row_phase` 分类随动)后本区继续施工——七套件复跑全绿后卡①收口。三卡全收口,合并走总收口流程。
## 一、各卡状态
| 卡 | 状态 | 提交 | 窄测证据 |
|---|---|---|---|
| ①状态合并累加制 | 收口(甲案裁决随动后) | df173018 | roll_multiplier 42 绿(V1/V2/V3)/table_structure_guard 绿(V4)/system_contracts 绿/damage_controller 44 绿/seal_polarity 70 绿/round_flow 全绿(相位单调 PASS——deferred 归类随动)/refresh_feats 绿;EV 三锚 0.9148/1.0012/1.1948 逐位不变 |
| ②立绘显示档 | 收口 | ec385772 | standee_present_values 50 checks 绿(V13–V18 全执行)+素材闸 11 件全 PASS+样张脚本 30/30 全绿(V10 并排图产出) |
| ③战斗区背景替换 | 收口 | 33e5b72d | stage_background 18 checks 绿(V1–V5)+六套件关联窄测全 PASS+layout_probe 两档 PASS+ui_contrast 36 测点绿+ground_h 工具读取=100 |
## 二、实际改动—验收对照表(结果列)
### 卡②(对照表 V1–V8)
| 需求点 | 改动 | 验收断言(尾缀〔立绘显示档 Vn〕) | 结果 |
|---|---|---|---|
| 逐件显示档高 | standee_motion.gd `PORTRAIT_DISPLAY_H` 九键+`_place_portrait` 按档算倍率 | V13 九键逐一(源高==原稿表值+显示高≈档高双读数) | 绿(9 键 ×2 断言全 PASS) |
| 硬编码 ×2 退役 | 同上 | V14 源码锚(读表+零 `Vector2(2.0,2.0)`) | 绿 |
| 纵横倍率恒等 | 同上 | V15 双轴同倍率+显示宽 round 档 ±0.51 | 绿(9 键全 PASS) |
| 主角中档 144 三态 | 素材 2× 手修稿+register 链 | V16 组合根装载 normal/attack/hit 逐态复读 | 绿(3 断言) |
| 素材不降采样 | 9 件原稿紧裁+闸件新口径 | `standee_asset_check.py` 断言①源高==表值②显示宽≤150(酋长 157 例外逐字) | 绿(11 件 PASS) |
| 两表同值不漂移 | Python STANDEE_DISPLAY_H/STANDEE_SLOT_H ↔ GDScript 表 | V17 源文本逐键对账 | 绿(文件可读路径生效;L2 退路在件未触发) |
| 表键集完整 | 同上 | V18 恰九键无多余 | 绿 |
| 样张口径随动 | render_sample_sheet_v3.py 站桩段+A4 解冻重校 88×92 | 脚本 CHECKS 全绿+V10 改前改后并排 | 绿(30/30) |
| 实机观感 | 九件+两消费面 | 目检(登记不阻塞) | 见第四节 |
### 卡③(对照表 V1–V8)
| 需求点 | 改动 | 验收断言(尾缀〔舞台背景 Vn〕) | 结果 |
|---|---|---|---|
| V1 ground_h 字段与校验 | schema+tres 100+layout_config | `_test_layout_ground_field`(表值/三态拒绝族)+config_db_test | 绿 |
| V2 按 board_type 选图 | TEX_STAGE_BG_FMT+set_board_type+两处接板同步 | `_test_background_selection`+layout_probe L1 真实入口(路径 `_dungeon.png` 结尾) | 绿 |
| V3 缺图回退 | `_load_stage_texture`+回退链 | `_test_background_fallback`(子类缺图→dungeon;全缺→平色不崩) | 绿 |
| V4 地面层几何 | TEX_STAGE_GROUND+_build_ground | `_test_ground_layer_geometry`+layout_probe 两档 size.y==ground_h | 绿 |
| V5 光柱与舞台底退役 | 删层删双常量;回退改指 SLOT_BACKDROP | `_test_beams_retired`+theme_projection/ui_contrast 锚改读后全绿 | 绿 |
| V6 接板真实链路 | main.gd/main_debug_flow.gd 各一守卫行 | layout_probe(L1 进入后路径 dungeon)+源码锚断言(stage_background_test:两文件含 `stage.set_board_type(`) | 绿 |
| V7 既有呈现回归 | 零改站桩/明细/棋盘 | 六套件关联窄测+两探针 | 全 PASS |
| V8 能力行名实与登记 | run_all.gd 登记;README 写卡段行 | README:138 三用例名与套件函数逐字一致;套件 manifest 在册 exit 0 | 绿(capability_audit 归合回 CI) |
卡①对照表 R1–R7:R1/R2/R3/R4 断言全部落地且绿(V1/V2/V3/V4 尾缀可 grep);R5 快照断言随 V1 绿;R6 既有断言零改动复跑绿;R7(裁决补记随动)=`_ineffective_row` 载荷 `deferred: true`+`_row_phase` deferred→战斗段,相位单调断言在 seed 42 真实轨迹(含该行型)当轮执行且 PASS,申报 1–4 与 R1–R6 断言零变化。
## 三、读数留痕
- **EV 锚改前改后对拍**:goblin 0.9148 / bugbear 1.0012 / ogre_chief 1.1948——改前(CI unit.log:3968 区)与改后(卡①两轮窄测)逐位一致,全绿,零漂移。
- **S13**:卡①触面(status_effect_table/status_container/damage_controller)与卡③触面(battle_stage_view/battle_layout_table/ui_kit/main/main_debug_flow)改前均零基线键;批中 gdstyle 跑批「基线内 5、基线外新违规 0、较登记值恶化 0」。
- **结构预算**:battle_stage_view 类变量 11→14(≤15);公开方法 12→13(≤20);validate 分支 7 不变(地面校验拆 `_ground_field_errors`)。
- **素材九件**(改前→改后):bugbear 51x62→102x123/drider 67x90→140x189/duergar 34x46→93x126/duergar_king 66x94→133x189/giant_spider 48x38→102x81/goblin 36x36→89x90/hook_horror 46x58→74x94/ogre_chief 62x74→158x189/hero 46x48,48x48,46x48→88x92,92x92,88x92。F7 实证:改前管线产物与包上素材逐件同尺寸。
- **舞台背景四件**:三关背景各 1280×252、地面 1280×100(T0 PIL 实读)。
- **对照图**:`artwork/candidates/立绘显示档批-2026-11-02/改前改后三面对照.png`(站桩区/标题屏看台/地图头像三面);样张并排图 `artwork/mockups/sample_battle_screen_before_after.png`(改前基线由旧脚本+旧资产生成)。
## 四、实机目检总清单(登记不阻塞)
1. 九件立绘清晰度可接受(含灰矮人 126→96 的 0.76× 抽行观感判读——头号回退候选)〔卡②〕
2. 同屏体量顺序 小<中<大〔卡②〕
3. 标题屏看台与关卡地图头像无可感劣化(地图头像 0.52× 降采样)〔卡②〕
4. 食人魔酋长显示宽 157 不碰邻位/不压顶部轮次指示〔卡②〕
5. 主角三态切换横跳读数(三态源宽 88/92/88,切换约 3–6px 横跳——重摆归另批)〔卡②〕
6. 三关背景可辨为不同洞窟、远景有纵深、非贴墙〔卡③〕
7. 背景无光柱/光带/光源实体(缺图态同)〔卡③〕
8. 地面读作泥土/碎石非瓷砖、中低明度不刺眼〔卡③〕
9. 站桩与小石台踩在连续地面上;结算期明细带压住地面底带〔卡③〕
10. B 区文字(轮次牌/演出提示/明细带)对背景/地面可读〔卡③〕
## 五、实现决定记录(代拍板随 commit 留痕+备案)
- 卡②:CLI 旗标 `--standee48`→`--standee-display`、函数 `build_standee48`→`build_standee_display`(代拍板 2);hero key=`enemy_id()` 空值判 hero(代拍板 5);V17=源文本逐键 contains 对账+L2 打印退路(读不到不判红);**V15 判据实现**=双轴同倍率比例恒等(is_equal_approx)+round 档 ±0.51 带——卡面字面 `display_size.x == round(...)` 在非整数比下物理不可达(如地精 94.93),取更强判据实现,缩放几何零改动;产物计数=八敌+主角立绘恰九(attack/hit 为伴随态不入计数——`STANDEE_SRC_H` 九键口径);样张 S6 语境 x 坐标随动(②③④+60、⑤+30,断言与 meta 全随动);闸件第三处复写兜底字面量删除(import 失败即崩——契约 2 单点纪律)。
- 卡③:接板同步取「board 存局部变量→rebuild→守卫同步」三行形态;`_beams_rect` 判定用源码锚(函数不进 script constant map,卡内 haskey 备选按实况取源码形态);layout_probe 地面高容差 0.51(float 布局);卡②ui_kit.gd 注释「48px 档」残留未动(该件不在卡②写面——留观察)。
- 卡①:停机呈报另件。
## 六、遗留读数义务与观察
- 卡①停机已随甲案裁决闭合(2026-11-02)——停机呈报第六节的待办清单状态回退拟稿**作废不执行**(卡已收口,条目状态走完成删条通道归批后收尾)。
- status_effects.tres :99-141 批注含 refresh 陈旧叙事(用户 2026-11-01 恢复令在案)——本批零触碰,处置归用户另裁(卡①范围边界在案)。
- ui_kit.gd TEX_HERO_PORTRAIT 行注释「48px 档」与 path_check.py 已改指外的一处陈旧表述——随下次触碰该件的批次顺带换代(反哺点清单未列——非文档面)。
- 渲染闸(05)与 golden 零变化判据归合回后本地 CI(里程碑 --code 出口因卡①停机未跑——合并前置齐)。
## 七、独立验收审计
独立验收审计已执行(未参与实现的子代理,报告 `reports/iter48-验收审计-2026-11-02.md`):首轮结论=窄口径不通过,缺漏三项——①卡③ V6 源码锚断言未落地(实现遗漏,卡面本有 prescribed);②代拍板追认单未另立件;③两处甲案裁决前陈旧叙述。三项已随审计补差修齐(V6 锚断言入 stage_background_test 套件并跑绿;追认单另立 `reports/iter48-代拍板追认单-2026-11-02.md`;陈旧叙述订正),复审结论见审计报告末节。
-150
View File
@@ -1,150 +0,0 @@
# 迭代 48 验收审计(2026-11-02)
> 审计性质:独立验收审计(未参与实现的会话执行,test-conventions §8.7 口径)。工作区=`g-plan2-iter48`(分支 iter48),基点 master=a5c89d67,四笔=f08b63a3(卡②立绘显示档批)/ ef8154b2(卡③战斗区背景替换批)/ 64b9d79a(卡①状态合并累加制批,含甲案裁决随动)/ 3dd93dde(收尾)。审计只读:可 Read/grep/跑测试,禁改源码/测试/卡片;唯一写面=本报告。
> 审计输入:三份需求卡片、`iter48-实现报告-2026-11-02.md`、`iter48-停机呈报-卡1状态相位断言-2026-11-02.md`、`git diff a5c89d67..iter48` 逐笔。
## 一、总结论
**不通过(窄口径)。** 三卡改动—验收对照表共 24 行,23 行证据齐备、当轮真实跑批绿、测试削弱零申报外动作、R7 零行为改动与九件素材原稿分辨率两大专项均实证成立;唯卡③ V6 申报的「源码锚(main.gd 与 main_debug_flow.gd 均含 `stage.set_board_type(`)」未在任何测试/探针落地,且实现报告§二卡③ V6 行「+源码锚在套件」与实况不符(证据误报)。修复面极窄(补一条静态锚断言或由用户裁对该判据改口径),补齐后复审只需核该一点。
> **复审结果(2026-11-02,同日):三项缺漏已修齐,终结论=通过——见文末「复审(2026-11-02)」节。**
## 二、对照表逐行核对
### 2.1 卡①(状态合并累加制)R1–R7
| # | 需求点 | 断言存在+尾缀 grep | 真实入口 | 判读 |
|---|---|---|---|---|
| R1 | 六行换代+词表+加载期校验 | `table_structure_guard_test.gd`〔状态累加 V4〕在位(:272-275),值判 `accumulate`;实跑 66 checks 全绿=全表装载零红 | ConfigDB 加载链 → `row_by_id()`(套件经 `_db` 实装装载) | 通过 |
| R2 | 重复授予累加+层数恒 1 | `roll_multiplier_test.gd`〔状态累加 V1〕在位(remaining==3、layers==1、snap_magnitude==−65);实跑 PASS | `battle_orchestrator.new(_db,rng)`+`begin_battle` 真实编排宿主 → `apply_effect` | 通过 |
| R3 | 同轮双授予累加两段 | 〔状态累加 V2〕在位(6+2=8);实跑 PASS | 同上 | 通过 |
| R4 | 覆盖时长按覆盖值累加 | 〔状态累加 V3〕在位(3+3=6,`apply_effect(...,3)`);实跑 PASS | 同上(覆盖入参即 combat_segment 同口) | 通过 |
| R5 | 快照纪律不变 | V1 断言内 `snap_magnitude==−65` 承载;实跑 PASS | 同 R2 | 通过 |
| R6 | 两臂零变化=既有断言零改动回归 | diff 核实三套件零触碰(numstat:damage_controller_test 仅 :376 标签 1/1;seal_polarity、system_contracts 不在 diff);实跑三套件全绿(44/70/15 checks) | 各既有真实入口 | 通过 |
| R7 | 相位分类随动(甲案) | `round_flow_skill_pool_test.gd`〔:422 相位单调〕+:466-468 `deferred` 分支在位;实跑 134 checks 全绿含「每轮行相位单调」PASS | `_run_battle(1,0)` 真实结算流(seed 42 轨迹) | 通过(零行为改动自证见第六节 a) |
### 2.2 卡②(立绘显示档批)对照表 9 行
| # | 需求点 | 断言存在+尾缀 grep | 真实入口 | 判读 |
|---|---|---|---|---|
| 1 | 逐件显示档高 | `_check_display_tier`〔立绘显示档 V13〕九键逐一在位;实跑 9 条 PASS(源高实读==原稿表值+显示高≈档高双读数) | `StandeeBody.new("enemy")`→`set_data(enemy_id)`→`set_portrait_texture(真纹理)`→`portrait_probe()`;主角经 `StandeeBody.new("hero")` 同链——**未直读常量,读数取自落位后 sprite 实测** | 通过 |
| 2 | 硬编码 ×2 退役 | 〔V14〕源码锚(读表+零 `Vector2(2.0, 2.0)`)在位;实跑 PASS;审计另 grep 全 presentation 确认零残留 ×2 立绘倍率 | `FileAccess` 静态判据(卡面即申报为静态判据) | 通过 |
| 3 | 纵横倍率恒等 | 〔V15〕双轴同倍率(is_equal_approx)+显示宽 round 档 ±0.51 带在位;九键实跑 PASS | 同 V13 | 通过(±0.51 带见第六节 b) |
| 4 | 主角中档 144 三态 | 〔V16〕三条在位(normal/attack/hit 逐态显示高 144);实跑 PASS | `BattleStageView` 组合根装载 → `hero_standee.portrait_probe()` → `set_hero_state`(内部即 `apply_hero_state`,同一真实链);「源高」腿由素材闸三态断言(92/92/92)承载 | 通过 |
| 5 | 素材不降采样 | `standee_asset_check.py` 断言①源高==`STANDEE_SRC_H` 表值在位;实跑 11 件全 PASS | 工具闸实跑(读盘上真实 PNG) | 通过(第六节 c) |
| 6 | 两表同值不漂移 | 〔V17〕源文本逐键对账在位;实跑 PASS(文件可读路径生效) | 读 `tools/pixelize_candidates.py` 源文本逐键 contains 对账 | 通过(L2 退路见第六节 b) |
| 7 | 表键集完整 | 〔V18〕恰九键无多余在位;实跑 PASS | `get_script_constant_map()` 读 `PORTRAIT_DISPLAY_H` | 通过 |
| 8 | 样张口径随动 | A4 冻结断言显式解冻重校到 88×92(diff 在案,卡 T3 明令「解冻重校、禁放宽凑绿」);站桩段按 `STANDEE_SLOT_H` 取数+S6 坐标随动在 diff。**脚本 30/30 未由审计复跑**(脚本落盘产物且资产根两级回退指向主检出,避免审计写盘)——依据=A4 冻结值 88×92 与盘上素材实读(素材闸 88×92)逐位一致+报告申报 | `python tools/render_sample_sheet_v3.py` | 通过(依据留痕,未复跑) |
| 9 | 实机观感 | 目检十项落实现报告第四节(登记不阻塞) | 真人目检 | 通过(登记义务完成) |
### 2.3 卡③(战斗区背景替换)V1–V8
| # | 需求点 | 断言存在+尾缀 grep | 真实入口 | 判读 |
|---|---|---|---|---|
| V1 | ground_h 字段与校验 | `_test_layout_ground_field` 四条〔舞台背景 V1〕在位;实跑全 PASS;`config_db_test` 29 checks 绿;工具读取 `ground_h=100`(审计实跑输出 100) | `BattleLayoutTable.validate()`+`ConfigDB.load_tables()` | 通过 |
| V2 | 按 board_type 选图 | `_test_background_selection` 五条〔舞台背景 V2〕在位;实跑 PASS;`layout_probe` 两断言〔舞台背景 V2〕〔舞台背景 V2/V6〕在位且实跑 PASS | 探针 `main.ui.modals.level_screen.press_candidate(0)`(layout_probe.gd:32)→`board_changed` 真实选路进战斗屏后才断言 | 通过 |
| V3 | 缺图回退 | `_test_background_fallback` 两条在位;实跑 PASS(子类覆写 `_load_stage_texture` 构造缺图——卡面申报的观测法,不注入不改资产) | `set_board_type("underdark")`(缺图子类) | 通过 |
| V4 | 地面层几何 | `_test_ground_layer_geometry` 四条在位;实跑 PASS;`layout_probe` 两档 `size.y==ground_h`(容差 0.51,报告§五备案)实跑 PASS | 舞台构造+press_candidate(0) 真实进入 | 通过 |
| V5 | 光柱与舞台底退役 | `_test_beams_retired` 三条(源码锚+常量表+菜单斜光带在位)实跑 PASS;`theme_projection_test` 160 checks 绿(对比锚改读合并目标后 6.33:1/5.75:1 PASS);`ui_contrast_probe` 36 测点绿 | 构造+常量表+两探针 | 通过 |
| V6 | 接板真实链路 | layout_probe 真实入口腿 PASS(路径 `_dungeon.png` 结尾,尾缀〔舞台背景 V2/V6〕);**申报的源码锚断言(main.gd+main_debug_flow.gd 含 `stage.set_board_type(`)全仓测试/探针 grep 零命中=未落地**;实现报告§二 V6 行「+源码锚在套件」与 diff 实况不符 | press_candidate(0)(仅覆盖 main.gd 链);main_debug_flow 调试链零自动化断言 | **缺漏**(生产行在案可 grep——main.gd:388、main_debug_flow.gd:106;缺的是申报的验收断言) |
| V7 | 既有呈现回归 | 六套件+两探针实跑全绿(审计复跑其中 standee_present_values 50/theme_projection 160/layout_probe/ui_contrast PASS;diff 证实站桩/明细/棋盘/golden/shot_checker 零触碰) | 各既有真实入口 | 通过 |
| V8 | 能力行名实与登记 | run_all.gd:196 登记行在案;README:138 能力行三用例名与套件函数逐字一致(`_test_background_selection`/`_test_ground_layer_geometry`/`_test_beams_retired` 均实存);capability_audit 归合回 CI(报告已声明) | `res://tests/run_all.gd` | 通过 |
## 三、抽查实跑记录(审计本人在工作区执行)
| 测试 | 退出码 | 关键结果 |
|---|---|---|
| `--headless --path game --script res://tests/unit/battle_settlement/roll_multiplier_test.gd` | 0 | 42 checks 全绿;〔状态累加 V1〕「累加至 3(1+2——快照沿首授)」/〔V3〕「累加至 6(3+3)」/〔V2〕「累加至 8(6+2)」三条 PASS |
| `res://tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | 0 | 134 checks 全绿;「每轮行相位单调(授予→增益/减益→战斗→衰减→判定)」PASS——deferred 归类在 seed 42 真实轨迹生效 |
| `res://tests/unit/data_config/table_structure_guard_test.gd` | 0 | 66 checks 全绿;〔状态累加 V4〕「ac_up 行在位(hero · +1 ac · 累加语义)」PASS |
| `res://tests/unit/battle_settlement/damage_controller_test.gd` | 0 | 44 checks 全绿(R6 回归证词) |
| `res://tests/unit/battle_settlement/seal_polarity_test.gd` | 0 | 70 checks 全绿(R6) |
| `res://tests/unit/contracts/system_contracts_test.gd` | 0 | 15 checks 全绿;「开域后受理已知 id(布尔受理口径 true 通道)」PASS(R6) |
| `res://tests/unit/presentation/standee_present_values_test.gd` | 0 | 50 checks 全绿;V13 九键 ×2+V14+V16 三态+V17+V18 共 24 条显示档断言逐条 PASS |
| `python tools/standee_asset_check.py` | 0 | 11 件全 PASS(源高 90/81/126/94/123/189/189/189/92 逐件==原稿表值;酋长显示宽 157 例外逐字命中) |
| `res://tests/unit/presentation/stage_background_test.gd` | 0 | 18 checks 全绿(V1 四条/V2 五条/V3 两条/V4 四条/V5 三条) |
| `res://tests/unit/presentation/theme_projection_test.gd` | 0 | 160 checks 全绿;舞台底对比锚(SLOT_BACKDROP)6.33:1、5.75:1 ≥4.5 PASS |
| `res://tests/unit/data_config/config_db_test.gd` | 0 | 29 checks 全绿(V1 装载链腿) |
| `res://probe/layout_probe.tscn`(headless) | 0 | 「PASS — 2 档几何不变量全过」——含新增舞台背景/地面层断言两档通过 |
| `res://probe/ui_contrast_probe.tscn`(headless) | 0 | 「对比度 36 对测点全绿」 |
| `python -c "from tools.layout_config import load; print(load()['ground_h'])"` | 0 | 输出 `100`(V1 工具腿) |
## 四、测试削弱申报核对(申报 vs diff,逐处)
- 卡①申报 1–5:diff 逐处对上——①:160-161 削弱断言换代(2→3,含 layers/snap 双判据);②:157-158、:230、:358 三处注释与 `_weaken_refresh_probe`→`_weaken_accumulate_probe` 改名(全仓旧名零残留);③table_structure_guard :272-275 值+消息换代;④damage_controller_test :376 仅标签文字、断言数值逐字未动;⑤round_flow `_row_phase` 补 `or bool(row.get("deferred", false))` 分支(申报 5=甲案随动)。**申报外零删除、零放宽、零扫描面缩小、零换下层直调**(numstat:roll_multiplier 31/12 全属申报面;其余测试件 1-2 行均申报内)。
- 卡②申报「不删不改任何既有断言」:`standee_present_values_test.gd` diff 93/0 纯新增;`ui_probe.gd` 2/2 仅文案(判据 `has_tex` 不变);样张 A4 冻结值 46×48→88×92 系卡 T3 明令「显式解冻重校到新档」(非放宽——旧值对原稿分辨率素材必红,新值与盘上素材逐位绑定)。无申报外改动。
- 卡③申报「零删除零放宽,唯一改读=theme_projection_test 与 ui_contrast_probe 舞台底锚 STAGE_BG→SLOT_BACKDROP」:diff 恰为该两处 1 行/1 行改读,阈值与文案未动;`layout_probe` 14/1 纯追加(1 删=文件末补换行符);其余测试件零触碰。无申报外改动。
## 五、内部字段直查受控例外核对
| 直查点 | 是否申报/在案 | 判读 |
|---|---|---|
| 卡①探针 `settlement._status_effects` / `settlement._damage.clamped_pool` | 卡对照表 R2 真实入口列注明「经真实编排宿主 begin_battle」+「remaining/layers 只读投影(query_active)」;该直查为既有探针沿例(旧 `_weaken_refresh_probe` 同面) | 通过(在案) |
| 卡② `mo._portrait_sprite`(portrait_probe 扩两读数) | 卡§6 文件结构图「探针 portrait_probe() 扩显示读数(几何出口单点)」+§12 落位预检「复用既有探针出口」;旧 `has_tex` 即读同成员 | 通过(在案) |
| 卡③ layout_probe `stage.get("bg_texture")`/`get("ground_layer")` | 二者为本批新增公开 var(非 `_` 私有),非内部直查 | 不适用 |
| layout_probe `bv.get("_board")`(既有) | 探针源码 :102 注释自带例外理由(受控例外在案,非本批引入) | 通过(既有) |
## 六、特别核三点
**(a)卡① R7 deferred 方案=零行为改动:成立。**
- 生产侧 diff 仅 `_ineffective_row` 一行:载荷 dict 在原 `"batch_key"` 键后追加 `"deferred": true`——行型(reward_ineffective)、source_class、origin_cell、highlight、display 文案、value 0、round_index 全部逐字未动。
- 全仓 grep:生产码无任何消费方读取结算行的 `deferred` 键(其余 `deferred` 命中全属宝物域 treasure_items,异面无关);分类读取只在该测试 `_row_phase`。
- 归类非一刀切:`grant_segment.gd:301` 的授予段未生效行(坑道小憩)不带 deferred 键,仍归第 0 段——分类器仍按行自描述区分「授予段未生效」与「战斗段地图账殿后」,五段全序不变量强度不降。
- 非空转证据链:停机呈报在案的红(seed 42 round 2 magic_bolt 行判第 0 段致违序)发生先于随动;载荷加键不消耗 RNG、不改判定/数值路径 → 轨迹逐行不变,该行只能经新分支归入相位 2——套件由 133+1FAIL 转 134 全绿即该分支真实生效的直接证据。
**(b)卡② V17 L2 退路与 V15 ±0.51 带:均按备案执行。**
- V17:测试内置 `../tools/`→`tools/` 两级路径回退,双双不可读时打印 `[L2] V17 工具源不可读…(记录不判红)` 并跳过对账——与卡面「禁当红亦禁当绿」逐字一致;本轮文件可读、对账正常执行并 PASS(退路在件未触发)。
- V15:实现=双轴同倍率 is_equal_approx+`absf(display_size.x − round 档) < 0.51`;卡面字面 `display_size.x == round(...)` 在非整数比(如地精 89×96/90=94.93)下物理不可达,取带式为更强可行判据——实现报告§五已备案且九键 round 档值(95/121/71/113/119/138/157/139/132)与源宽×档高/源高的四舍五入逐一吻合;±0.51 覆盖 round 语义 ±0.5 加浮点残差,未放宽体量语义(酋长 157 超宽例外仍由素材闸逐字校验)。
**(c)九件素材=原稿分辨率:实证成立。**
- 素材闸断言①逐件「源高 == STANDEE_SRC_H 表值」11 件全 PASS(含主角三态 92/92/92);旧降采样稿(八敌 36–94 高、主角 46–48 高)任一回填即在该断言红。
- 管线侧 `build_standee_display` 紧裁后 `im.height != STANDEE_SRC_H` 即 `sys.exit(2)`+产物计数 ≠9 即停(L3#2 防回退顶替)双自证在 diff 在案。
- 报告§三改前→改后九件读数(如 goblin 36×36→89×90、ogre_chief 62×74→158×189)与闸件实跑输出逐件一致。
## 七、缺漏清单与观察项
**缺漏(判不通过的依据):**
1. 卡③ V6 源码锚断言未落地+证据误报:卡面 V6 行判据面含「源码锚 `main.gd` 与 `main_debug_flow.gd` 均含 `stage.set_board_type(`」,实现报告§二卡③ V6 行称「+源码锚在套件」;实测 `stage_background_test.gd:_test_background_selection` 与全仓测试/探针均无该断言。影响面:main.gd 链已由 layout_probe 真实入口覆盖;**main_debug_flow 调试链的同步行(main_debug_flow.gd:106)零自动化断言**。生产行本身在案(两处 grep 可定位、行为形态与卡 T2 一致),缺的是申报的验收证据。修复建议:在 `stage_background_test.gd` 补一条双文件源码锚断言(或经用户裁对该判据改口径并订正实现报告),随修后复审只核此点。
**记录级(不单独构成不通过,随批处置):**
2. 卡② T3/卡③ T5 各要求产出物三份(实现报告/代拍板追认/反哺点),「代拍板追认单」未另立件;代拍板内容已在实现报告§五逐条备案(卡②五条/卡③三条,覆盖面与卡面白名单对得上)。补立或由用户裁认「报告§五代行追认单」二选一。
3. 实现报告§七「当前合并被卡①停机阻塞」与反哺点清单卡①节标题「停机在案」均为甲案裁决前的陈旧叙述(同文头部已记卡①收口)——随补丁顺带订正,禁留两处记同一件事互相矛盾。
**观察项(无需动作):**
- 卡②自报遗留:ui_kit.gd:233 注释「48px 档」残留(该件不在卡②写面)——实现报告§六已登记,随下次触碰顺带换代。
- path_check.py 注释改名(`STANDEE_TIER_H`→`STANDEE_DISPLAY_H`)不在卡②文件结构图列面,属表改名的必要注释联动(1 行注释,零行为)——记录为申报外最微触碰,不判红。
- 渲染闸(05)与 golden 零变化判据归合回后本地 CI(里程碑 --code 出口因卡①停机未跑,实现报告§六已声明)——本审计不含窗口化渲染闸,合并后以 CI 回执为准。
## 八、证据基线
审计只读声明:本审计未修改任何源码/测试/卡片/工具;写面仅本报告。实跑 14 项(第三节清单)全部退出码 0;关键 grep(refresh 残留、accumulate 恰 6 处、`Vector2(2.0, 2.0)` 零残留、`set_board_type` 锚点)均留存于本文各节。
**总结论(首轮):不通过(窄口径)——缺漏清单见第七节第 1 条(卡③ V6 源码锚未落地+报告证据误报),补齐该点并处置第 2/3 条记录项后,本批其余 23 行对照表证据、削弱申报合规性、R7 零行为改动与素材原稿分辨率专项均已实证通过。**(终结论随复审更新=通过,见下节。)
## 九、复审(2026-11-02)
> 复审面=窄口径,只核首轮缺漏清单三项修复,不改首轮其他结论。实现侧在审计补差后按卡序重塑重建分支:新链 db43f77e(卡①)→ 99095d88(卡②)→ 0478258d(卡③含审计补差)→ 7c9e5722(收尾),基点仍 a5c89d67。`git diff d2b034b1 HEAD` 输出为空(逐字节一致)自证成立——首轮对代码/测试/工具面的全部结论对新链继续有效;本报告文件本身已随收尾提交入库,复审写面仍仅本文件。
**修复 1——卡③ V6 源码锚断言落地:核验通过。**
- `stage_background_test.gd:_test_background_selection` 内新增循环断言(逐 `res://presentation/main.gd` 与 `res://presentation/main_debug_flow.gd` 读源,断言 `contains("stage.set_board_type(")`,尾缀〔舞台背景 V6〕两条)——grep 在位;读文件失败时 `contains` 必假(fail-closed,不空转)。
- 实跑:`--headless --path game --script res://tests/unit/presentation/stage_background_test.gd` → **exit 0,「all green (20 checks)」**(首轮 18 → 20),两条 V6 PASS 逐条在案:「接板同步源码锚 main.gd 含 stage.set_board_type(」「接板同步源码锚 main_debug_flow.gd 含 stage.set_board_type(」。
- 首轮缺漏 1 关闭:main.gd 与 main_debug_flow 两条接板链均有真实入口腿(layout_probe,首轮已绿)+静态锚腿(本轮绿),V6 判据面两腿齐备。
**修复 2——代拍板追认单另立件:核验通过。**
- `reports/iter48-代拍板追认单-2026-11-02.md` 在库:卡①白名单 1–3(词表命名 accumulate/快照不改/探针改名与尾缀)+甲案裁决随动单列且正确标注「非代拍板,用户裁决授权」;卡②白名单 1–5(probe 键名/CLI 与函数改名/尾缀格式/对照图目录名/hero key 判法)逐项与首轮实核落地一致;卡③白名单 1–6(私有函数布局/helper 与措辞/注释文案/TextureRect 写法/描边可见性=平色 Panel 描边被背景覆盖零新增类变量/格式修空项)逐项一致,无超白名单事项。
- 首轮记录的实现决定(V15 ±0.51 带、V17 L2 退路形态、产物计数九件口径、样张 S6 坐标随动、闸件兜底字面量删除、接板三行形态、`_beams_rect` 源码锚形态、layout_probe 0.51 容差)与追认单不矛盾——其性质属卡面明令步骤或已在实现报告§五备案的判据实现(首轮第六节 b 已按备案口径核过),追认单按「白名单逐项」口径立单,覆盖面成立。首轮缺漏 2 关闭。
**修复 3——陈旧叙述订正:核验通过。**
- 实现报告§七已换代为「审计已执行(首轮窄口径不通过三项缺漏)→三项已随审计补差修齐→复审结论见审计报告末节」,与实况一致(含对本报告路径与追认单路径的正确指引);首轮指出的「§七仍称合并被卡①停机阻塞」矛盾句已消除。
- 反哺点清单卡①节标题已改「(甲案裁决已闭合——随本批合回生效)」。首轮缺漏 3 关闭。
**复审实跑记录:**
| 测试 | 退出码 | 关键结果 |
|---|---|---|
| `--headless --path game --script res://tests/unit/presentation/stage_background_test.gd` | 0 | 20 checks 全绿;两条〔舞台背景 V6〕源码锚 PASS |
| `git diff d2b034b1 HEAD` | 0 | 空输出(重塑后终树与审计补差树逐字节一致) |
**总结论(终版):通过。** 首轮三项缺漏全部修齐并经当轮实跑核验;三卡 24 行对照表证据、测试削弱申报合规性、内部字段直查例外、R7 零行为改动、V17/V15 备案执行、九件素材原稿分辨率专项全部成立。本报告为合并前独立验收审计的最终口径。
@@ -1,36 +0,0 @@
# 迭代 41 测试债批——实现报告(2026-10-29)
**接收方**:待办清单原「迭代 41 测试债修复——9 个套件失败与静态扫描三项红」条目(随本批完成整条删除,本报告为收尾凭据)。
**改动面**:游戏代码(worktree 批)。
**执行**:worktree `g-plan2-testdebt-20261029`(分支 `testdebt-20261029`,自 master cf0e40cc 分出,批内 `git merge master` 到 39c1fc69 后跑闸),提交 215da315/413124b0/afd1a41f,合并提交 43906cdd;工作区与分支已删除。
## 一、登记范围完成度
| 登记项 | 结果 |
|---|---|
| 02 九套件失败 | 全部归绿(65 套件全跑,`[run_all] 0 个套件失败`) |
| S9 类型闸 24 处 | 归零——`node_map_generator` 三处给真类型(`Array[int]` 贯通 `_vo_flow_facts`→`_build_trunk`),其余 21 处为动态边界(Variant 出值/鸭子型注入/异构 Callable 束),按 V7 白名单逐处补 `# type-hint: ignore` 并写明理由 |
| S10 文件头 4 处 | 归零——`config_db` 与三张域容器头注去日期 |
| S11 注释禁用词 1 处 | 归零——`adventure_table.gd:55` 档位退役词「罕见」改现行「稀有」 |
| 死常量 `SCHEMA_VERSION` | 已删(全仓零引用;文档侧「表结构版本」冲突面已由文档批清偿) |
## 二、实测扩出的范围(登记条目未预见,全部由代码域闸实跑暴露)
登记时 03/04/05 三闸在能力审计上电批被记为 SKIP(测量面批口径),其红项从未被实测过,故条目只记了 02 与 09。本批按代码域实跑,三闸皆红,逐条追因如下——**四处是迭代 41 特许直接合回留在产品码里的运行期断链,不是测试债**:
1. **数字色牌守卫丢失**(`game/presentation/views/board_cell_unit.gd` `_draw_glyph_layer`):迭代 41 卡②绘制分层时把 `if plate:` 判据丢掉,变成「凡有字形即垫牌」。后果=dungeon 关数字(本应亮墨直画在棕底)一律落到奶油色牌上。判据=棋盘 golden 逐像素:L1_dungeon changed=2.74% 超容差、L2/L3 与菜单 0.00%;恢复守卫后 L1 回 0.00%(与迭代 37 换代基线逐像素一致)。墨族自适应实测读数同时佐证现行口径:dungeon `plate=false`(亮族对比度 4.79/5.80 过门槛)、underdark `plate=true`(深族均值 2.41 不过门槛)。
2. **`open_victory` 第 4 参未随 opts 改型**(`game/presentation/curio_interact_controller.gd:79`):迭代 41 卡②把该函数的四散参数收拢为 `opts := {}`,其余调用方(`main.gd`/`main_adventure_flow.gd`)已改,此处仍传字符串 → 运行期 `Cannot convert argument 4 from String to Dictionary`,关卡完成三选一停点与续玩恢复路径的胜利总结面开不起来(探针报「三选一停点分支中断」)。改型为 `{"gp_summary": …}`,串内容与改前逐字同。
3. **站桩补间目标写错**(`game/presentation/views/standee_body.gd`):状态收进内部件 `st` 后,9 条 `tween_property(self, "st.xxx", …)` 的属性路径不成立(引擎报 `The tweened property ... does not exist`,并连带 `set_trans` 落在 null 上)→ 血量条与三档意图动效全静。改为直接补间子对象 `tween_property(st, "xxx", …)`。
4. **调参批量模拟运行态收尾位置**(`game/presentation/tune_sim_controller.gd`):循环体提函数时把 `set_sim_running(false)`/`_running = false` 搬进了单局函数,等于每局结束就宣布模拟结束——面板置灰与组合根互查守卫在剩余局数内失效。归还到 `run()` 末尾。
另有探针面随拆件改址(断言零删减、零放宽):`ui_input_probe` 格面成员入 `st` 六处、`ui_struct_probe` 的 `level_screen._runner` → `._map._runner`;测试面改址九处(`slots`/`meta_state`/`crossrun`/`_forge`/`_side`/`_meta_rows`→表成员直读/`_shop_rows`→表成员直读)。
## 三、闸与回执
`tools/run_all_gates.sh --code`(域=code、scope=full、dirty_game=false):00 冒烟/01 系统测试/02 单元与集成/03 探针 --click/04 探针 --full/05 渲染闸/09 静态扫描/10 熵增闸全部退出 0;11 回放确定性对拍按触面判定 SKIP(本批未触数值·存档·RNG·结算)。与基线比对=**零新增红**,且 02、09 两闸「基线红 → 现绿(改善)」,`all_green=true`。合回后主区两件秒级事已过:`--editor --quit` 重刷类名缓存、冒烟 15 项 0 失败。
## 四、遗留与待裁
1. **闸基线 02/09 两键待换代**:两键仍记本批已消除的存量红指纹,未来若回归到同一红项会被判「存量红·零新增」而静默放行。换代须改 `game/tests/.gates/baseline.json`(代码面)→ 已另立待办条目,随下一个代码批一并落。
2. **architecture.md 残留常量名**:`design/engineering/architecture/architecture.md:88` 的 ConfigDB 行仍把 `SCHEMA_VERSION` 列为该类职责,常量已删,该句失真——属文档面反哺点,待文档批按「删该词或改现役 `SAVE_FORMAT_VERSION`」落文(本批为实现批,禁写 `design/`)。
3. **实机目检**(归用户,不阻塞):dungeon 关胜利后数字回到棕底直画(无奶油牌);关卡完成三选一停点的胜利总结面能正常开出并可继续;调参面板批量模拟期间浮窗置灰、结束后解除。
@@ -1,453 +0,0 @@
# 需求卡片:战斗区背景替换——B 区舞台插画与连续地面层
> 日期:2026-10-31
> 性质:需求改动实现批卡片;零待裁点,开工门=U0。
> 来源:待办清单「战斗区背景图替换——B 区舞台插画 + 临时光柱退役」条(唯一事实源:[art-bible](../design/art/art-bible.md) §6.1 v3.28 与 [battle-stage-prompts](../design/art/battle-stage-prompts.md) v1.7;候选样张过审 2026-10-31,候选与推荐套见 `artwork/2026-10-30-战斗区背景/候选保存清单-2026-10-31.md`)。
> 估时:T0–T5 ≈ **3.75~4.5 个工作日**;切分预案见第十三节。
## 一、设计事实源
1. [art-bible](../design/art/art-bible.md) §6.1 v3.28:B 区舞台场景构成、图层归属与资产契约——背景层三关变体(按 `board_type` 选图、不画光柱、不走 tint)、独立连续地面层(三关共用、不吃 tint、高度读 `ground_h`)、小石台保留并叠在连续地面之上;`ground_h` 字段由本实装批新增并回填。
2. [art-bible](../design/art/art-bible.md) §4.1 换色合并登记③(现行工作区 v3.29 行):`STAGE_BG`(原舞台底)随 §6.1 舞台背景插画批一并处置——背景资产接管绘制面时源常量退役或改指,禁单独为改值出批。本卡按其口径退役源常量,平色缺图回退改指 `UiKit.SLOT_BACKDROP`(#3E362C,合并目标)。
3. [battle-stage-prompts](../design/art/battle-stage-prompts.md) v1.7:三张背景与一张共用地面的画布尺寸、分层要求、否定后缀与验收;终稿尺寸 = 基准屏宽 × `stage_h`/基准屏宽 × `ground_h`。
4. 候选过审:2026-10-31 用户确认三关背景各 3 张全部可用、共用地面前后两轮修正后 v12 系列可用;遴选与后续替换/编辑由作者另行安排,不阻塞本卡。
本卡只实现上述设计,不改设计。艺术资产的最终遴选、编辑与入包走美术素材直改通道(asset-ingest),不属本卡写面。
## 二、目标与完成定义
本批把 B 区舞台从「程序化平色底+四柱光柱层」临时占位,换成「三关背景变体+共用连续地面层+保留小石台」的正式呈现,并把选图接到真实装板链上。
完成定义:
1. B 区背景按 `board_type` 选图:`dungeon` / `underdark` / `deep_underdark` 三值分别命中 `scene_stage_bg_<board_type>.png`;空串与未知值回落 `dungeon`;目标变体缺图时先回落 `dungeon`,仍缺则保留平色底 `UiKit.SLOT_BACKDROP`(#3E362C,原舞台底合并目标)。
2. B 区底部新增共用连续地面层 `scene_stage_ground.png`,底边贴 B 区底、全宽、高度读布局表 `ground_h`;三关共用,不按 `board_type` 换图。
3. 布局表新增 `ground_h` 字段(本卡回填 100)并带加载期校验;`tools/layout_config.py` 同步读取该字段。
4. 四柱光柱程序层退役:删除光柱绘制层与 `UiKit.BEAM_LIGHT`,任何缺图态也不出现光柱;舞台底源常量 `UiKit.STAGE_BG` 随背景接管退役,平色回退改指 `UiKit.SLOT_BACKDROP`(#3E362C,换色合并③目标);背景与地面均不引用 `wall_ambient` tint(现行代码本就无该路径)。
5. 现有小石台 `scene_stage_plaza.png` 原样保留,叠在连续地面之上;不改地台件与 `standee_body` 的地台绘制。
6. 装板真实链路(`board_changed` 与调试对局就绪)把当前板 `board_type` 同步到舞台;连续一层未知或空串时不崩、不刷错误。
7. 既有战斗屏呈现回归全绿:站桩、排播、明细带、三区几何、文字对比、明度三档带、棋盘/菜单/关卡 golden 零变化;渲染闸全绿。
8. 独立验收审计通过;反哺点清单覆盖第六节全部目标;本批不写 `design/` 与根规则文件。
## 三、现状事实
1. `BattleStageView._init(db_ref, layout)` 以 `layout.stage_h` 设置 B 区最小高度,随后建背景、世界、文本半区、伴随件层:[battle_stage_view.gd:27](../game/presentation/views/battle_stage_view.gd#L27)。
2. 背景现行=`Panel` 平色底 `UiKit.panel_flat(UiKit.STAGE_BG, UiKit.PANEL_BORDER, 0, 1)`,随后调用光柱层:[battle_stage_view.gd:37](../game/presentation/views/battle_stage_view.gd#L37)、[:44](../game/presentation/views/battle_stage_view.gd#L44)。
3. 光柱层为全幅 `Control`,绘制四柱(x 基准 110/900/1055/1210@1280,60 段,α26→0):[battle_stage_view.gd:50](../game/presentation/views/battle_stage_view.gd#L50)、[:145](../game/presentation/views/battle_stage_view.gd#L145)。
4. `UiKit.STAGE_BG = Color8(62,52,42)`、`UiKit.BEAM_LIGHT = Color8(255,236,200)`:[ui_kit.gd:185](../game/presentation/views/ui_kit.gd#L185)、[:186](../game/presentation/views/ui_kit.gd#L186)。
5. `UiKit.TEX_STAGE_PLAZA` 是现有唯一场景件常量;`UiKit.load_tex()` 以 `ResourceLoader.exists` 守卫缺图:[ui_kit.gd:250](../game/presentation/views/ui_kit.gd#L250)、[:290](../game/presentation/views/ui_kit.gd#L290)。
6. `game/assets/art/scene/` 现只有 `scene_stage_plaza.png`;三张背景与地面尚未入包(素材目录不入 git,工作区需同步素材)。
7. 布局表 schema 现五字段:`stage_h` / `info_panel_w` / `ap_bar_h` / `log_band_h_dig` / `log_band_h_settle`;`validate()` 已检查域与两处跨字段:[battle_layout_table.gd:7](../game/data/schemas/battle_layout_table.gd#L7)、[:14](../game/data/schemas/battle_layout_table.gd#L14)。无 `ground_h`。
8. 布局表值:`stage_h=252`、`info_panel_w=240`、`ap_bar_h=44`、`log_band_h_dig=24`、`log_band_h_settle=84`:[battle_layout.tres:7](../game/data/tables/battle_layout.tres#L7)。
9. `ConfigDB` 的 manifest 已登记 `battle_layout`,加载后装配到 `presentation.battle_layout`:[config_db.gd:32](../game/core/config_db.gd#L32)、[:151](../game/core/config_db.gd#L151)。
10. `BoardData.board_type` 为图类型标签(`dungeon` / `underdark` / `deep_underdark`):[board_data.gd:19](../game/core/board_data.gd#L19)。
11. 棋盘视图 `rebuild()` 已按 `board_type` 装载瓦片套,空串回落 `dungeon`:[board_view.gd:257](../game/presentation/views/board_view.gd#L257)。
12. 装板成功即发 `board_changed`:[battle_orchestrator.gd:406](../game/core/battle_orchestrator.gd#L406);主场景处理点重建棋盘视图:[main.gd:361](../game/presentation/main.gd#L361)、[:367](../game/presentation/main.gd#L367)。
13. 调试对局就绪路径直接重建棋盘视图,不经过主场景处理点:[main_debug_flow.gd:101](../game/presentation/main_debug_flow.gd#L101)、[:103](../game/presentation/main_debug_flow.gd#L103)。
14. 舞台当前没有任何接收 `board_type` 的入口,也没有背景/地面纹理常量(全仓 grep 零命中)。
15. 舞台世界为透明 SubViewport;站桩、地台、落影都在世界内绘制:[battle_stage_view.gd:60](../game/presentation/views/battle_stage_view.gd#L60)、[:71](../game/presentation/views/battle_stage_view.gd#L71);小石台绘制在站桩底:[standee_body.gd:367](../game/presentation/views/standee_body.gd#L367),台面矩形 `_pedestal_rect()` 在 [standee_body.gd:312](../game/presentation/views/standee_body.gd#L312)。
16. 舞台由装配器一次性构造(冒险屏 `_ready` 时):[ui_assembler.gd:27](../game/presentation/ui_assembler.gd#L27)、[adventure_screen.gd:28](../game/presentation/scenes/adventure_screen.gd#L28);背景/地面只能在建件后按板同步,不能重建整屏。
17. 布局表读取工具 `FIELDS` 现五字段,无 `ground_h`:[layout_config.py:12](../tools/layout_config.py#L12)。
18. 渲染闸 `shot_checker` 对战斗屏判 C 区文字、明细带提示、明度三档带(信息面 > 世界中 > 世界底):[shot_checker.py:143](../tools/shot_checker.py#L143);golden 仅棋盘三张+菜单+关卡,不覆盖 B 区舞台。
19. `theme_projection_test` 的光柱断言对象是 `UiKit._beams_rect()`(菜单斜光带),不是舞台四柱层:[theme_projection_test.gd:628](../game/tests/unit/presentation/theme_projection_test.gd#L628);本批退役舞台层不影响该断言。
20. 全仓代码无 `wall_ambient` 标识符;仅 `ui_kit.gd:249` 有注释说明小石台不吃该 tint,内容不构成本批改动。
21. 现有地台件入包与尺寸断言:[standee_present_values_test.gd:76](../game/tests/unit/presentation/standee_present_values_test.gd#L76)。
22. 布局探针已从真实选路入口进战斗屏并逐档检查三区几何:[layout_probe.gd:31](../game/probe/layout_probe.gd#L31)、[:55](../game/probe/layout_probe.gd#L55)。
23. `STAGE_BG` 现行四处引用:`ui_kit.gd:185` 常量、`battle_stage_view.gd:39` 绘制点、`theme_projection_test.gd:669`、`ui_contrast_probe.gd:30`;art-bible §4.1 换色合并③(工作区 v3.29 行)要求随本批退役或改指,禁单独改值出批。
## 四、设计契约
- 🔴 **C1 选图口径**:背景只按 `board_type` 三值选图;空串与未知值回落 `dungeon`;不得按关卡序号、节点深度或 `board_variants` 另造第二套选择逻辑。
- 🔴 **C2 背景尺寸**:背景纹理源 = 1280 × `stage_h`,基准档显示 1×;三张文件名必须带 `_dungeon` / `_underdark` / `_deep_underdark` 后缀,禁止同一张图换色或换 tint。
- 🔴 **C3 地面层**:连续地面层源 = 1280 × `ground_h`,三关共用、文件名不带 `board_type` 后缀;底边贴 B 区底、全宽;顶缘即与远景的分隔带;禁横向拉伸(基准档 1×)。
- 🔴 **C4 图层序**:背景 < 连续地面 < 世界站桩/小石台 < 文本半区 < 壳层伴随件。小石台必须在连续地面之上;禁把地面画进背景、禁把地台并进地面件。
- 🔴 **C5 光柱退役**:四柱程序层与 `UiKit.BEAM_LIGHT` 全删;任何缺图态、任何 `board_type` 下都不得再出现光柱/光带/光晕;菜单斜光带 `UiKit._beams_rect()` 不在退役面。
- 🔴 **C6 `ground_h` 单源**:`ground_h` 只存布局表,经 `ConfigDb.presentation.battle_layout` 读取;视图层零 `ground_h` 数值字面量。schema 校验不得放行「地面层被收起态明细带整条盖住」与「地面层超过 B 区一半」。
- 🔴 **C7 缺图回退**:目标背景缺图 → 回 `dungeon` 背景 → 再缺 → 保留平色底 `UiKit.SLOT_BACKDROP`(#3E362C,原舞台底合并目标);地面缺图 → 地面层隐藏、背景仍显示。任何回退都不得崩溃、不得刷脚本错误、不得出现光柱。
- 🔴 **C8 接板真实入口**:`board_changed` 与调试就绪两条现有入口都在重建棋盘后同步舞台 `board_type`;禁另立轮询、定时器或第二套装板通知。
- 🔴 **C9 tint 口径**:背景三张各自带关卡色族、连续地面三关恒定,二者均不引用 `wall_ambient` 槽;不得给舞台加第二层 tint 或乘色。
- 🔴 **C10 呈现回归**:渲染闸全绿——B 区文字对比、明细带纹理幅度、明度三档带(信息面 > 世界中 > 世界底)判据不变;棋盘三张、菜单、关卡 golden 零改动。判据若需改动=停卡呈报,禁调阈值换绿。
- 🔴 **C11 结构预算**:`battle_stage_view.gd` 类变量 ≤15、公开方法 ≤20、函数长 ≤50 行、单函数分支 ≤8;`battle_layout_table.gd` 的 `validate()` 不新增分支(地面校验拆私有辅助);S13 基线外零新增、存量键只降不升。
- 🔴 **C12 写面**:实现批只写 `game/` 与 `reports/`;禁写 `design/`、`roadmap.md`、`待办清单.md`、`体验验证清单.md`、`game/tests/README.md`;文档同步只列反哺点。
- 🔴 **C13 禁凑计数袋**:不得为凑「类变量数」把背景/地面状态塞进无关容器;不得为凑「方法数」把选图与地面几何强行合并成一个无职责函数;拆分单元须有可陈述职责。
- 🔴 **C14 舞台底换色合并**:`UiKit.STAGE_BG` 源常量随本批退役;平色缺图回退改指 `UiKit.SLOT_BACKDROP`(#3E362C,art-bible §4.1 换色合并③目标);`theme_projection_test` 与 `ui_contrast_probe` 的舞台底对比锚同步改读合并目标,阈值、判据与覆盖不变。
## 五、范围边界
做:
1. `UiKit` 增三关背景路径格式常量与共用地贴路径常量。
2. `BattleStageView` 增背景纹理层、连续地面层、`set_board_type()`、缺图回退与测试用取纹理单点。
3. 布局表增 `ground_h=100`、schema 校验与 `tools/layout_config.py` 读取字段。
4. `main.gd` 与 `main_debug_flow.gd` 在既有棋盘重建点同步舞台 `board_type`。
5. 删四柱光柱层、`_draw_light_beams` 与 `UiKit.BEAM_LIGHT`;退役 `UiKit.STAGE_BG` 源常量,平色回退改指 `UiKit.SLOT_BACKDROP`;同步改读两处对比锚。
6. 新增单元套件、扩充布局探针断言、登记 `run_all.gd`。
7. 实现报告、代拍板追认单、反哺点清单与独立验收审计。
不做:
1. 不选图、不修图、不生成新图、不入包素材——本卡开工前置是四件终稿已在 `game/assets/art/scene/`;遴选与编辑归作者/asset-ingest。
2. 不改 `scene_stage_plaza.png`、不改 `standee_body` 的地台绘制与落影。
3. 不改棋盘瓦片、数字、图标、文字排版、明细带内容。
4. 不改样张工具 `render_sample_sheet*.py` 的光柱绘制与注释;不更新任何 golden。
5. 不跑 MC;不做数值调参。
6. 不新增 UI 组件、不新增场景文件、不新增 ConfigDB 容器。
7. 不把「背景/地面」做成可按 `wall_ambient` 换色的通用槽。
## 六、关联文档同步面
| 文档 | 关联点 | 同步义务 |
|---|---|---|
| [art-bible](../design/art/art-bible.md) §6.1 | 「程序化平色+光柱现行使用=占位」「`ground_h` 由实装批新增并回填」「资产到位后四柱直接退役」三句改为实装事实;回填 `ground_h=100` | 实现批禁写;逐条落 `reports/iter<N>-反哺点-<日期>.md`,用户裁决后文档批落文 |
| [art-bible](../design/art/art-bible.md) §4.1 换色合并登记③ | `STAGE_BG` 由「随舞台背景插画批处置」改为已退役、平色回退改指 `SLOT_BACKDROP`(#3E362C) | 同上 |
| [art-assets-checklist](../design/art/art-assets-checklist.md) §4 | 三张背景与地面「已出候选 v10」状态句——更新为候选 v12 过审、终稿入包状态;小石台保留句核对 | 同上 |
| [battle-stage-prompts](../design/art/battle-stage-prompts.md) §4/§5 | `ground_h` 由「待实装批回填」改为已回填 100;档 6「四柱退役(代码批)」改为已退役 | 同上 |
| [battle.md](../design/gdd/ux/battle.md) :118、:155 | 布局字段清单补 `ground_h`;「现行溢出区为临时光柱氛围层,正式背景到位后该层退役」改为已退役、判定不变 | 同上 |
| [HUD框架.md](../design/gdd/systems/表现与支撑/HUD框架.md) :60、:247 | B 区内容补「三关背景+连续地面层」;布局几何清单补地面层高 | 同上 |
| [数据配置.md](../design/gdd/systems/表现与支撑/数据配置.md) :73 | 布局表用途句补「地面层高度」 | 同上 |
| [体验验证清单.md](../体验验证清单.md) | 三关背景可辨、无光柱、地面非瓷砖/非亮面、结算带压底带等目检项如要转正式条目 | 实现批禁写;实现报告登记,转条目走反哺点 |
| [game/tests/README.md](../game/tests/README.md) | 新增「B 区舞台背景三关变体与连续地面层」能力行与覆盖域表 | 写卡段已入表;实现批只核对名实,不再修改 |
| [architecture.md](../design/engineering/architecture/architecture.md) | 无字段级陈述需要改;本批不新增容器/类,仅舞台视图内部图层 | 无同步义务 |
## 七、落位与可复用性预检
### 7.1 新增件与新增成员
| 新增件/成员 | 复用面查询结论 | 唯一面 | 分层与交互路径 |
|---|---|---|---|
| `UiKit.TEX_STAGE_BG_FMT` | 全仓无背景路径常量;`UiKit` 已是场景件/角色件/图标路径的唯一装载单点(`TEX_STAGE_PLAZA` 先例),不新建路径件 | 背景路径格式只在 `ui_kit.gd` 一处 | 舞台视图经 `UiKit.load_tex` 装载;不直连 ResourceLoader |
| `UiKit.TEX_STAGE_GROUND` | 同上;地面是唯一共用场景件 | 地面路径只此一处 | 同上 |
| `BattleStageView.set_board_type()` | 舞台无任何板类型入口;棋盘视图的 `tile_palette.load_board_tiles` 只管瓦片,不复用其选择逻辑(职责不同) | 舞台选图只在这一方法 | 组合根在 `board_changed` 后调用;舞台不反向读结算内部 |
| `BattleStageView.bg_texture` / `ground_layer` | 舞台现无背景纹理层与地面层;不复用 `Panel` 平色底(平色底保留为回退) | 两层各一枚,几何只由布局表与舞台锚点决定 | 都是舞台子 Control,位于世界 SubViewport 之下 |
| `BattleStageView._load_stage_texture()` | 现有 `UiKit.load_tex` 是公共单点;此私有薄封装只服务缺图回退的可测性,不复制资源路径 | 背景与地面装载都经此一处 | 只被本件 `set_board_type`/`_build_ground` 调用 |
| `BattleLayoutTable.ground_h` + `_ground_field_errors()` | 布局表是分区几何唯一事实源;不把地面高塞进 `BattleStageView` 常量 | `ground_h` 只在布局表;校验只在此 schema | ConfigDB 加载期 `validate()` 调用;视图经容器读取 |
| `tools/layout_config.py` FIELDS 补 `ground_h` | 工具读取单点已存在;只补字段,不新建读取器 | 工具侧字段清单只此一处 | 样张工具与游戏侧同源读表 |
| `stage_background_test.gd` | 现有 `standee_present_values_test` 是「战斗一屏样张批 V5–V9」专用套件;`layout_probe` 是场景探针。两者职责都不覆盖「背景选图/地面几何/缺图回退」单元面 | 舞台背景与地面层单元断言唯一落点 | `run_all.gd` 单元入口;舞台直建,不起完整存档 |
| `layout_probe.gd` 追加断言 | 已有真实选路进战斗屏的探针,不新建第二探针 | 真实入口接线断言唯一落点 | `probe_gate.sh` 默认段;读 `main.ui.battle.stage` |
### 7.2 唯一性核查
- 背景路径、地面路径、`ground_h`、`board_type` 归一化规则各只有一处定义:`ui_kit.gd` 两常量、`battle_layout_table.gd` 一字段、`BattleStageView.set_board_type()` 一方法。
- 舞台接板同步只在 `main.gd:_on_board_changed` 与 `main_debug_flow.gd:_on_debug_battle_ready` 两个既有重建点各加一行;不新增第三通知源。
- 小石台绘制保持 `standee_body.gd` 唯一落点;地面层不重画地台,不复制 `_pedestal_rect`。
- 缺图回退只走 `_load_stage_texture` → `UiKit.load_tex` 一条链,不另建资源检查器。
### 7.3 分层与跨层出口
- Core 零改动:`BoardData.board_type` 只读;舞台不导入 core 内部,只接组合根传入的字符串。
- 呈现层内部:布局值经 `ConfigDb.presentation.battle_layout` 单点;纹理装载经 `UiKit.load_tex`;世界内站桩/地台不动。
- 测试面:单元套件直建 `BattleStageView`(与 `pacing_queue_test` 的 `FakeStage` 同型手法);真实入口由 `layout_probe` 从选路按钮进入。
## 八、实现规范预算
| 触面 | 预算 | 结论 |
|---|---|---|
| [battle_stage_view.gd](../game/presentation/views/battle_stage_view.gd) | 类变量 11→14(+`bg_texture`/`ground_layer`/`_bg_board_type`,≤15);公开方法 12→13(+`set_board_type`,≤20);新增私有 `_build_ground`、`_load_stage_texture`;函数长 ≤50、分支 ≤8;文件长 394→目标 ≤470(gdstyle 现无该件基线键) | 通过;T4 后光柱删除会回收约 15 行 |
| [ui_kit.gd](../game/presentation/views/ui_kit.gd) | 加 2 条 const、删 `BEAM_LIGHT` 与 `STAGE_BG`(净 0);不新增变量/方法 | 通过 |
| [battle_layout_table.gd](../game/data/schemas/battle_layout_table.gd) | 类变量 5→6;公开方法仍 1(`validate`);`validate` 现有 7 个 if 不再增分支,地面校验拆 `_ground_field_errors()`(2 个 if、返回 2 次) | 通过;避免 `validate` 9 分支越默认 8 |
| [main.gd](../game/presentation/main.gd) | 既有 `_on_board_changed` 内加局部变量与 2 行守卫同步;不增成员 | 通过;文件无 S13 基线键 |
| [main_debug_flow.gd](../game/presentation/main_debug_flow.gd) | 既有就绪函数内加局部变量与 2 行守卫同步;不增成员 | 通过 |
| [layout_config.py](../tools/layout_config.py) | `FIELDS` +1 字符串 | 通过 |
| [stage_background_test.gd](../game/tests/unit/presentation/stage_background_test.gd) | 新件;公开函数 0(仅 `_init` 与私有测试函数)、类变量 0;预计 ≤220 行 | 通过 |
| 迁移函数 | 本批无函数自存量文件迁入;无 `gdstyle_baseline.txt` 同名函数键 | 通过 |
| 存量触面 | 所有被改 `.gd` 的 S13 键只降不升;超出即停卡 | 通过 |
## 九、文件结构图
| 文件 | 职责 | 改动类型 | 验收行 |
|---|---|---|---|
| [ui_kit.gd](../game/presentation/views/ui_kit.gd) | 背景路径格式常量、共用地贴常量;退役 `BEAM_LIGHT` 与 `STAGE_BG` | 行为改动 | V2/V3/V5 |
| [battle_stage_view.gd](../game/presentation/views/battle_stage_view.gd) | 背景纹理层、连续地面层、`set_board_type()`、缺图回退;平色回退改指 `SLOT_BACKDROP`;退役四柱层 | 行为改动 | V2/V3/V4/V5 |
| [battle_layout_table.gd](../game/data/schemas/battle_layout_table.gd) | 新增 `ground_h` 字段与地面校验辅助 | 行为改动(加载期校验) | V1 |
| [battle_layout.tres](../game/data/tables/battle_layout.tres) | 回填 `ground_h = 100` | 行为改动(数据表) | V1/V4 |
| [layout_config.py](../tools/layout_config.py) | 工具读取字段补 `ground_h` | 非游戏行为(工具维护) | V1 |
| [main.gd](../game/presentation/main.gd) | `_on_board_changed` 重建棋盘后同步舞台板型 | 行为改动 | V6 |
| [main_debug_flow.gd](../game/presentation/main_debug_flow.gd) | 调试对局就绪同步舞台板型 | 行为改动 | V6 |
| [layout_probe.gd](../game/probe/layout_probe.gd) | 真实入口追加背景/地面装载断言 | 非行为改动(探针断言) | V6/V7 |
| [theme_projection_test.gd](../game/tests/unit/presentation/theme_projection_test.gd) | `STAGE_BG` 对比锚改读 `SLOT_BACKDROP`(合并目标,阈值不变) | 非行为改动(测试改读) | V5 |
| [ui_contrast_probe.gd](../game/probe/ui_contrast_probe.gd) | 舞台底对比锚改读 `SLOT_BACKDROP`(合并目标,阈值不变) | 非行为改动(探针改读) | V5/V7 |
| [stage_background_test.gd](../game/tests/unit/presentation/stage_background_test.gd) | 新建单元套件:字段/选图/回退/地面几何/光柱退役 | 非行为改动 | V1–V5/V8 |
| [run_all.gd](../game/tests/run_all.gd) | 登记新套件 | 非行为改动 | V8 |
| [README.md](../game/tests/README.md) | 能力行与覆盖域表 | 非行为改动;**写卡段已入表** | V8 |
| `game/assets/art/scene/scene_stage_bg_*.png` ×3、`scene_stage_ground.png` | 开工前置资产,非本批写面;实现期只读装载 | 输入件 | V2/V3/V4 |
## 十、任务卡
### T0 开工基线与资产前置(0.25d)
取用:
- 待办清单条目状态=美术设计已闭合+已写卡;本卡路径。
- 候选过审记录:`artwork/2026-10-30-战斗区背景/候选保存清单-2026-10-31.md`(工作区文件,不入 git)。
步骤:
- [ ] 读 `game/tests/.gates/ci-status.json`;CI 红未修复即停本卡,禁开新批。
- [ ] 核对四件终稿已在包:`game/assets/art/scene/scene_stage_bg_dungeon.png`、`scene_stage_bg_underdark.png`、`scene_stage_bg_deep_underdark.png`、`scene_stage_ground.png`;用 PIL 读数:三张背景恰为 `(1280, stage_h)`、地面恰为 `(1280, ground_h=100)`。缺位或尺寸不符=L3 停卡,退回 asset-ingest;禁在实现期自行裁图/缩图。
- [ ] 复核第三节 1–22 行的 file:line 与实数;漂移先停卡核对,不靠猜行号施工。
- [ ] 跑 `python tools/gdstyle_gate.py` 记录本批触面当前读数;另记录 `battle_stage_view.gd` 行数/类变量/公开方法数、`battle_layout_table.validate()` 分支数。
- [ ] `grep -rn "STAGE_BG" game` 记录四处现行引用:`ui_kit.gd` 常量、`battle_stage_view.gd` 绘制点、`theme_projection_test.gd:669`、`ui_contrast_probe.gd:30`;T4 收口时四处全部处置。
- [ ] 写开工闸记录:基线 commit、既有红项、资产四件尺寸读数、S13 读数。
产出:资产齐盘、代码事实无漂移、预算基线可对账。
### T1 布局字段 `ground_h` 与读表口径(0.5d)
取用:T0 确认的表结构;`ConfigDb` manifest 已登记 `battle_layout`。
接口块:
```gdscript
@export var ground_h: int = 100
func validate() -> Array
func _ground_field_errors() -> Array
```
步骤:
- [ ] 在 [battle_layout_table.gd:7](../game/data/schemas/battle_layout_table.gd#L7) 的 `stage_h` 后新增 `@export var ground_h: int = 100`,注释写「B 区连续地面层高(源 = 基准屏宽 × 本值)」。
- [ ] 在 [battle_layout_table.gd:14](../game/data/schemas/battle_layout_table.gd#L14) 的 `validate()` 末尾追加 `errs.append_array(_ground_field_errors())`;不把两个新 if 直接塞进 `validate()`(保持分支 ≤8)。
- [ ] 新增私有 `_ground_field_errors() -> Array`:`ground_h < 16 or ground_h > stage_h / 2` 报 `domain`;`ground_h <= log_band_h_dig` 报 `cross_field`(地面层不得被收起态明细带整条盖住)。消息含字段名与实际值。
- [ ] 在 [battle_layout.tres:7](../game/data/tables/battle_layout.tres#L7) 的 `stage_h = 252` 后写 `ground_h = 100`;其余五值不动。
- [ ] 在 [layout_config.py:12](../tools/layout_config.py#L12) 的 `FIELDS` 元组中 `stage_h` 后加 `"ground_h"`。
- [ ] 新建 [stage_background_test.gd](../game/tests/unit/presentation/stage_background_test.gd),先写 `_test_layout_ground_field()`:
1. `load("res://data/tables/battle_layout.tres")`,断言 `ground_h == 100` 且 `validate()` 为空。
2. 用 `BattleLayoutTable.new()` 三态:`ground_h=20`(≤log_band_h_dig=24)、`ground_h=200`(>252/2)、`ground_h=100`;断言前两态各返回一条含 `ground_h` 的错误,第三态无 ground 相关错误。
- [ ] 在 [run_all.gd:191](../game/tests/run_all.gd#L191) 邻近 presentation 区追加:
`{"path": "res://tests/unit/presentation/stage_background_test.gd", "expect": 0}`
- [ ] 验证步骤:
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/stage_background_test.gd`
`python -c "from tools.layout_config import load; print(load()['ground_h'])"` → 必须输出 `100`。
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/data_config/config_db_test.gd` → 绿。
验收:布局表单源有 `ground_h`,校验拒绝越域与「被收起带整条盖住」,游戏侧与工具侧读同值。
产出:`ground_h` 字段、schema 校验、工具读取与 `_test_layout_ground_field`。
### T2 背景层与 `board_type` 选图(1.0d)
取用:T1 的布局表;`UiKit.load_tex`;`BoardData.board_type`;`board_changed` 信号。
接口块:
```gdscript
const TEX_STAGE_BG_FMT := "res://assets/art/scene/scene_stage_bg_%s.png"
var bg_texture: TextureRect
func set_board_type(board_type: String) -> void
func _load_stage_texture(path: String) -> Texture2D
```
步骤:
- [ ] 在 [ui_kit.gd:250](../game/presentation/views/ui_kit.gd#L250) 邻近 `TEX_STAGE_PLAZA` 新增 `TEX_STAGE_BG_FMT`;注释写「三关背景按 board_type 选图,不走 tint」。
- [ ] 在 [battle_stage_view.gd:14](../game/presentation/views/battle_stage_view.gd#L14) 成员区新增 `var bg_texture: TextureRect` 与 `var _bg_board_type := ""`。
- [ ] 在 [battle_stage_view.gd:37](../game/presentation/views/battle_stage_view.gd#L37) 的 `_build_backdrop()` 中,平色 Panel 之后新增全幅 `TextureRect`:`set_anchors_preset(PRESET_FULL_RECT)`、`expand_mode=EXPAND_IGNORE_SIZE`、`stretch_mode=STRETCH_SCALE`、`mouse_filter=IGNORE`、初始 `visible=false`;随后调用 `set_board_type("dungeon")`。
- [ ] 新增 `set_board_type(board_type: String) -> void`:
- 空串归一为 `"dungeon"`;与 `_bg_board_type` 相同则直接返回。
- 先取 `UiKit.TEX_STAGE_BG_FMT % bt`;为目标缺图且 `bt != "dungeon"` 时再取 `dungeon` 路径;两取都经 `_load_stage_texture`。
- 写入 `bg_texture.texture`;`visible = texture != null`;不得在缺图时抛错或打印产品日志。
- [ ] 新增私有 `_load_stage_texture(path: String) -> Texture2D`,只返回 `UiKit.load_tex(path)`;作为缺图回退的可测单点。
- [ ] 在 [main.gd:367](../game/presentation/main.gd#L367) 前后:把 `current_board()` 存局部变量,`board_view.rebuild(board, ...)` 后加 `if board != null: ui.battle.stage.set_board_type(String(board.board_type))`;不改信号连接与重建顺序。
- [ ] 在 [main_debug_flow.gd:103](../game/presentation/main_debug_flow.gd#L103) 同型:存局部变量、重建后同两行同步;不新增第三个通知源。
- [ ] 在 `stage_background_test.gd` 写 `_test_background_selection()`:
1. 直建 `BattleStageView.new(null, load("res://data/tables/battle_layout.tres"))`;默认应已装载 dungeon 背景,纹理非空且尺寸 1280×`stage_h`。
2. 依次 `set_board_type("underdark")`、`"deep_underdark"`、`"dungeon"`;每次断言 `bg_texture.texture.resource_path` 以对应 `_<board_type>.png` 结尾,且尺寸不变。
3. 断言 `bg_texture.get_index()` 小于 `world.get_parent().get_parent().get_index()`(背景在世界之下)。
- [ ] 写 `_test_background_fallback()`:用 `class MissingUnderdarkStage extends BattleStageView` 覆写 `_load_stage_texture`——`underdark` 路径返回 null、其余走 `UiKit.load_tex`;断言 `set_board_type("underdark")` 后纹理路径为 dungeon。再用全 null 子类断言 `set_board_type("dungeon")` 后 `bg_texture.texture == null` 且 `visible == false`,无异常。
- [ ] 在 [layout_probe.gd:55](../game/probe/layout_probe.gd#L55) 的 `_check_one()` 内追加:`stage.bg_texture` 非空、纹理非空、`resource_path` 以 `_dungeon.png` 结尾(L1 真实入口);记录 `label` 便于两档定位。
- [ ] 窄测:
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/stage_background_test.gd`
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game res://probe/layout_probe.tscn`
验收:三值各命中对应文件;未知/空串→dungeon;目标缺图→dungeon→平色;真实选路进 L1 后背景为 dungeon。
产出:`TEX_STAGE_BG_FMT`、`bg_texture`、`set_board_type`、两处接板同步、背景选图/回退断言。
### T3 连续地面层与几何(0.75d)
取用:T1 的 `ground_h`;T2 的舞台图层序与 `_load_stage_texture`;T0 已入包的地面件。
接口块:
```gdscript
const TEX_STAGE_GROUND := "res://assets/art/scene/scene_stage_ground.png"
var ground_layer: TextureRect
func _build_ground(layout: BattleLayoutTable) -> void
```
步骤:
- [ ] 在 [ui_kit.gd:250](../game/presentation/views/ui_kit.gd#L250) 新增 `TEX_STAGE_GROUND`;注释写「三关共用、无 board_type 后缀、不吃 tint」。
- [ ] 在 [battle_stage_view.gd:14](../game/presentation/views/battle_stage_view.gd#L14) 成员区新增 `var ground_layer: TextureRect`。
- [ ] 在 [battle_stage_view.gd:27](../game/presentation/views/battle_stage_view.gd#L27) 的 `_init` 中,`_build_backdrop()` 之后、`_build_world_stage()` 之前调用 `_build_ground(layout)`。
- [ ] 新增 `_build_ground(layout)`:全幅 `TextureRect`,`set_anchors_preset(PRESET_BOTTOM_WIDE)` 后四 offset 归零再把 `offset_top = -float(layout.ground_h)`;`expand_mode=EXPAND_IGNORE_SIZE`、`stretch_mode=STRETCH_SCALE`、`mouse_filter=IGNORE`;`texture = _load_stage_texture(UiKit.TEX_STAGE_GROUND)`;`visible = texture != null`。
- [ ] 不修改 `standee_body.gd`;小石台仍在世界内站桩底绘制,天然位于地面层之上。
- [ ] 在 `stage_background_test.gd` 写 `_test_ground_layer_geometry()`:
1. 地面纹理可加载且尺寸 `(1280, layout.ground_h)`。
2. `ground_layer.anchor_left==0`、`anchor_top==1`、`anchor_right==1`、`anchor_bottom==1`;`offset_left==0`、`offset_right==0`、`offset_bottom==0`、`offset_top == -layout.ground_h`。
3. 把 stage 尺寸设为 `Vector2(1280, layout.stage_h)` 并加树一帧后,`ground_layer.size == Vector2(1280, layout.ground_h)`、`ground_layer.position.y == layout.stage_h - layout.ground_h`。
4. `ground_layer.get_index()` 大于 `bg_texture.get_index()`、小于 `world.get_parent().get_parent().get_index()`。
- [ ] 在 [layout_probe.gd:55](../game/probe/layout_probe.gd#L55) 追加:`ground_layer` 可见、`ground_layer.size.y == layout.ground_h`(两档都成立;宽度随档位变化不判)。
- [ ] 窄测:
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/stage_background_test.gd`
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game res://probe/layout_probe.tscn`
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/standee_present_values_test.gd`(地台件 V9 不动)。
验收:地面层底边贴 B 区底、高读表、全宽、位于背景与世界之间;小石台仍在其上;缺图时地面隐藏不崩。
产出:`TEX_STAGE_GROUND`、`ground_layer`、`_build_ground`、地面几何断言。
### T4 四柱光柱与舞台底源常量退役(0.5d)
取用:T2/T3 已完成的舞台图层;现有 `UiKit._beams_rect()` 菜单斜光带不在退役面;art-bible §4.1 换色合并③。
步骤:
- [ ] 删除 [battle_stage_view.gd:44](../game/presentation/views/battle_stage_view.gd#L44) 的 `_build_beams_layer()` 调用。
- [ ] 删除 [battle_stage_view.gd:50](../game/presentation/views/battle_stage_view.gd#L50) 的 `_build_beams_layer()` 与 [battle_stage_view.gd:145](../game/presentation/views/battle_stage_view.gd#L145) 的 `_draw_light_beams()`。
- [ ] 删除 [ui_kit.gd:186](../game/presentation/views/ui_kit.gd#L186) 的 `BEAM_LIGHT` 常量;平色回退能力由下一步改指 `SLOT_BACKDROP` 承接。
- [ ] 按 art-bible §4.1 换色合并③:把 [battle_stage_view.gd:39](../game/presentation/views/battle_stage_view.gd#L39) 的 `UiKit.STAGE_BG` 改指 `UiKit.SLOT_BACKDROP`(#3E362C,合并目标);删除 [ui_kit.gd:185](../game/presentation/views/ui_kit.gd#L185) 的 `STAGE_BG` 常量。
- [ ] 把 [theme_projection_test.gd:669](../game/tests/unit/presentation/theme_projection_test.gd#L669) 的 `uikit_s.STAGE_BG` 改读 `uikit_s.SLOT_BACKDROP`;把 [ui_contrast_probe.gd:30](../game/probe/ui_contrast_probe.gd#L30) 的 `UiKit.STAGE_BG` 改读 `UiKit.SLOT_BACKDROP`;两处阈值与断言文案不变,标签可注「合并目标」。
- [ ] 更新 `battle_stage_view.gd` 顶注与 `_build_backdrop()` 注释:去掉「四柱/光柱氛围层」表述,写明「背景三关变体→连续地面→世界站桩;光柱层已退役,不迁入背景;平色回退走合并目标 `SLOT_BACKDROP`」。
- [ ] 在 `stage_background_test.gd` 写 `_test_beams_retired()`:
1. 读 `res://presentation/views/battle_stage_view.gd` 源码,断言不含 `_build_beams_layer`、`_draw_light_beams`、`BEAM_LIGHT`,且含 `UiKit.SLOT_BACKDROP`。
2. `load("res://presentation/views/ui_kit.gd").get_script_constant_map()` 不含 `BEAM_LIGHT` 与 `STAGE_BG`。
3. 断言菜单 `_beams_rect()` 仍在(`haskey("_beams_rect")` 或调用返回 TextureRect),防止误删菜单斜光带。
- [ ] 静态核实全仓代码 `wall_ambient` 仅 `ui_kit.gd:249` 注释一处;不新增该标识符。
- [ ] 窄测:
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/stage_background_test.gd`
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/presentation/theme_projection_test.gd`
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game res://probe/ui_contrast_probe.tscn`
验收:舞台无光柱层与相关常量;舞台底源常量退场、回退改指合并目标;菜单斜光带与两处对比锚仍绿;缺图态仍无光柱。
产出:光柱层退役、`_test_beams_retired`、注释口径更新。
### T5 回归、渲染闸与产出物(0.75d)
取用:T0–T4 全部产物;`tools/run_all_gates.sh` 为唯一闸入口;独立验收审计未参与实现。
步骤:
- [ ] 运行开发期关联窄测:
`D:/code/godot/Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/run_all.gd -- --only=stage_background|standee_present_values|standee_fx_sweep|pacing_queue|theme_projection|config_db`
- [ ] 出红只做红件最小单元复跑;禁在波内追加全量档。
- [ ] 里程碑出口跑一次代码域全套闸:
`bash tools/run_all_gates.sh --code`
- [ ] 回执必须 `all_green=true`、`dirty_game=false`;重点读 `05 渲染闸`:`shot_checker` 的 C 区文字 WCAG ≥4.5、纹理幅度 ≤18、明度三档带 `info>world>bottom` 全过;棋盘三张、菜单、关卡 golden 零变化。任何新增红停卡,禁带红合回。
- [ ] 独立验收审计由未参与实现的会话或子代理执行,产出 `reports/iter<N>-验收审计-<日期>.md`;未过禁合并。
- [ ] 轻闸全绿、合并前写齐三份:
1. `reports/iter<N>-实现报告-<日期>.md`
2. `reports/iter<N>-代拍板追认单-<日期>.md`
3. `reports/iter<N>-反哺点-<日期>.md`
- [ ] 实现报告须含:T0–T5 状态、V1–V8 实跑读数、S13 前后数、资产四件尺寸、渲染闸逐项读数、玩家目检总清单(登记不阻塞:三关背景可辨、无光柱、远景有纵深、地面为泥土非瓷砖且不亮、结算带压住地面底带、站桩踩在连续地面/小石台上)。
- [ ] 反哺点逐条覆盖第六节九个目标;每条写文件、节、原句、拟改句、依据,并明确「实现批未写 design/、未写根流程清单、未写 game/tests/README.md」。
- [ ] 本批不新增 golden、不改 `shot_checker` 阈值、不删既有断言。
完成定义:三份产出物齐全+代码域闸全绿+验收审计通过,才进入合回;合回后按项目现行机制由本地 CI 复验。
## 十一、验证闸:改动—验收对照表
| 需求点 | 改动(文件/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| V1 `ground_h` 字段与校验 | schema 加字段+地面校验辅助;表回填 100;工具读取 | `stage_background_test.gd:_test_layout_ground_field`;`config_db_test.gd:_test_manifest_dir_sync` | 单元 | `BattleLayoutTable.validate()`;`ConfigDB.load_tables()` | 表值=100;默认表 validate 空;`ground_h=20` 与 `=200` 各得一条含 `ground_h` 的错误;工具 load() 得 100 | 新增:B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) |
| V2 背景按 board_type 选图 | `TEX_STAGE_BG_FMT`+`set_board_type`+两处接板同步 | `stage_background_test.gd:_test_background_selection`;`layout_probe.gd:_check_one` | 单元+探针 | `BattleStageView.set_board_type()`;`level_screen.press_candidate(0)`→`board_changed` | 三值纹理路径逐值对应且尺寸 1280×252;L1 真实进入后路径以 `_dungeon.png` 结尾 | 新增:B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) |
| V3 缺图回退 | `_load_stage_texture`+回退链 | `stage_background_test.gd:_test_background_fallback` | 单元 | `BattleStageView.set_board_type("underdark")`(子类缺图) | 目标缺→dungeon 路径;全缺→`texture=null`、`visible=false`、无异常 | 新增:B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) |
| V4 连续地面层几何 | `TEX_STAGE_GROUND`+`_build_ground` | `stage_background_test.gd:_test_ground_layer_geometry`;`layout_probe.gd:_check_one` | 单元+探针 | 舞台构造+真实进战斗屏 | 纹理 1280×100;anchor 0/1/1/1;`offset_top=-100`;1280 档 `size.y=100`;图层序 bg<ground<world;探针两档 `size.y=ground_h` | 新增:B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) |
| V5 四柱光柱与舞台底源常量退役 | 删舞台光柱层、`BEAM_LIGHT`、`STAGE_BG`;回退改指 `SLOT_BACKDROP` | `stage_background_test.gd:_test_beams_retired`;`theme_projection_test.gd:_smoke_contrast_inks`;`ui_contrast_probe.gd:_ready` | 单元+探针 | `BattleStageView` 构造+`UiKit` 常量表;`ui_contrast_probe.tscn` | 舞台源码零 `_build_beams_layer`/`_draw_light_beams`/`BEAM_LIGHT` 且含 `UiKit.SLOT_BACKDROP`;UiKit 常量表无 `BEAM_LIGHT`/`STAGE_BG`;菜单 `_beams_rect` 仍在;两处舞台底对比锚读合并目标且阈值不变 | 新增:B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) |
| V6 接板真实链路 | main 与调试就绪两处同步 board_type | `layout_probe.gd:_check_one`;`stage_background_test.gd:_test_background_selection` 的源码锚 | 探针+单元 | `level_screen.press_candidate(0)`→`board_changed` | L1 舞台背景路径为 `_dungeon.png`;源码锚 `main.gd` 与 `main_debug_flow.gd` 均含 `stage.set_board_type(` | 新增:B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) |
| V7 既有呈现回归 | 不改站桩/明细/棋盘;只换舞台底图 | `standee_present_values_test.gd:_init`;`standee_fx_sweep_test.gd:_init`;`pacing_queue_test.gd:_init`;`layout_probe.gd:_check_one` | 单元+集成+探针 | 现有各套件真实入口 | 地台 48×12、站桩几何、排播、三区几何全绿;渲染闸 shot_checker 三项与明度带全过;棋盘/菜单/关卡 golden 零变化 | 既有:站桩敌人呈现与结算演出落点;既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
| V8 能力行名实与套件登记 | `run_all.gd` 登记;README 写卡段入表 | `run_all.gd` manifest 与整套 `stage_background_test.gd` | 单元 | `res://tests/run_all.gd` | 套件在 manifest 且 exit 0;能力行代表用例与函数名逐字一致;`capability_audit` 零红 | 新增:B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) |
落点集中:V1 归 T1;V2/V3/V6 归 T2;V4 归 T3;V5 归 T4;V7/V8 归 T5。全表名实核对归 T5 与独立审计。
## 十二、测试方式与测试削弱申报
自动验证:
- V1–V6 全部从真实入口或舞台直建公共面驱动;缺图路径用子类覆写 `_load_stage_texture` 构造观测,不改包内资产、不注入破坏。
- 真实接板链路只认 `board_changed` 与调试就绪两条既有入口;不建后门 API、不在产品码写测试专用分支。
- 渲染闸为窗口化实跑;`shot_checker` 阈值与 golden 不因本批改动。
真人目检(登记不阻塞,写入实现报告):
- 三关背景可辨为不同洞窟(地精暖石/卓尔冷蓝灰/灰矮人灰黑),远景有纵深、非贴墙、无孤立圆柱贴顶。
- 背景无光柱/光带/光源实体;任何缺图态也不出现光柱。
- 连续地面读作泥土/碎石,不是瓷砖/石板;全幅只零星小石、不成排成堆;中低明度不刺眼。
- 站桩与小石台踩在连续地面上;结算期明细带压住地面底带,不出现半截地台/悬空。
- B 区文字(轮次牌、演出提示、明细带)对背景/地面可读,无字压纹理。
测试削弱申报:
- 零删除、零放宽、零换下层直调。唯一允许的改读:`theme_projection_test.gd:669` 与 `ui_contrast_probe.gd:30` 的舞台底对比锚由 `STAGE_BG` 改读 `SLOT_BACKDROP`(art-bible §4.1 换色合并③,目标色 #3E362C);阈值、断言文案与覆盖不变。
- 舞台四柱层退役不涉任何现存断言(全仓核实:光柱断言只针对菜单 `UiKit._beams_rect`)。
- `layout_probe` 只追加背景/地面断言,不改既有三区几何判据。
- 若实现期发现任何既有断言因换图而红,先停卡呈报并列入本表,禁静默删/改阈值。
## 十三、估时与切分预案
| 卡 | T0 | T1 | T2 | T3 | T4 | T5 | 合计 |
|---|---:|---:|---:|---:|---:|---:|---:|
| 工作日 | 0.25 | 0.5 | 1.0 | 0.75 | 0.5 | 0.75 | **3.75d** |
浮动 ±0.75d(渲染闸首跑与两档探针等待占大头)。
切分预案:若 T2/T3 超软盒,段一=T0–T2(资产前置、布局字段、背景选图,约 1.75d);段二=T3–T5(地面层、光柱退役、闸与产出物,约 2.0d)。两段各自可测;段一合回前必须保证光柱层仍在时背景已正确显示(不半删),段二再退役光柱。禁在段一合回。
## 十四、异常分级
L1(自救一次):
- 编译错误、签名拼写、`run_all.gd` 登记遗漏、测试 helper 顺序。
- 注释措辞与私有局部变量命名。
L2(记录继续;同一红连续三次升 L3):
- 与本批无关的存量红,先按回执归因并留档。
- 行数较 T0 预期漂移但 S13 键不升。
L3(立即停卡写报告):
- CI 状态红未修。
- 四件资产缺位或尺寸不符(停卡退回 asset-ingest;禁实现期裁图代偿)。
- 机检键/计数与卡片契约互斥;**上游缺陷停卡退回写卡段,禁为凑绿保留无效成员或造第三条路**。
- `battle_stage_view` 类变量 >15、公开方法 >20,或 S13 基线外新增键无法在不改契约下消除。
- `ground_h` 校验与既有跨字段校验冲突,或必须改 `log_band_h_*` 才能成立。
- 渲染闸新增红(文字对比、纹理幅度、明度三档带、golden)且不属于可归因的既有存量红。
- 任何验收行无法从真实入口绑定特有可观测提交面。
- 必须改 `design/`、根流程清单或 `game/tests/README.md` 才能过关。
## 十五、代拍板白名单
允许实现期自行拍板:
1. 私有函数在指定文件内的顺序、局部变量名;签名与行为不变。
2. 测试 helper 的顺序与断言消息措辞;不得改判据值、阈值与层级。
3. 注释与日志文案;不得引入「光柱仍在」类误导表述,不得写变更历史。
4. `TextureRect` 的 `expand_mode`/`stretch_mode` 写法细节,只要满足基准档 1×、全幅锚点与尺寸判据。
5. B 区 1px 面板描边的可见性处理(被背景覆盖或另加描边薄层均可);不得为描边缩放/裁切纹理,且不得新增类变量。
6. 既有错误扫描暴露的本文件纯格式问题,在不改语义范围内一次修净。
超出必须呈报:
- 任何资产尺寸、`ground_h` 取值、`board_type` 词表、回退链顺序、图层序、文件职责、T 卡验收落点。
- 任何对 `shot_checker`、golden、既有断言或探针判据的改动。
- 任何新增 ConfigDB 容器、Core 字段、UI 组件或第二套板类型选择逻辑。
## 十六、待裁点与开工门
待裁点:**零**。
卡内 provisional(不是设计待裁):
- `ground_h = 100`——按候选出图 1280×100 工艺回填;作者后续可直接调表值,不重开设计。
- 背景/地面文件名与路径格式——art-bible/asset-path-map 已定,本卡只落常量。
- 缺图回退链顺序——dungeon → 平色,按 C7 执行。
开工门:
1. 四件终稿已入包且尺寸对(T0 实读);缺位退 asset-ingest。
2. 待办清单条目状态=美术设计已闭合+已写卡,实况载本卡路径。
3. 经 iter-plan 编入迭代后由 `/iter` 发令开工;本卡无迭代外执行通道。
4. CI 绿、T0 基线无漂移。
5. 本卡估时 3.75~4.5 个工作日;是否单独成批或与邻卡凑迭代归 iter-plan,本卡不代裁。
@@ -1,157 +0,0 @@
# 需求卡片:状态合并累加制——同名状态重复授予改加时长
> 日期:2026-11-01
> 性质:需求改动实现批卡片;零待裁点,开工门=U0。
> 裁决补记(2026-11-02 用户甲案):round_flow 相位单调断言红=测试分类器对「战斗段地图账未生效行」缺映射(生产行序符合案C)——补记第十一节申报第 5 条+第七节写面两行+第十节 T1 两步;方案=生产行载荷自描述键 `deferred`(零行为改动、观测面扩展),裁决原文见 reports/iter48-停机呈报-卡1状态相位断言-2026-11-02.md。
> 来源:待办清单「状态合并改累加制——同名状态重复授予改加时长」条(2026-10-31 用户立案并四点裁决闭合;登记批 git 提交 d216ae04,设计闭合批 870b2f2b)。
> 唯一事实源:[增益状态](../design/gdd/systems/战斗循环/增益状态.md) v1.3(2026-10-31)——§同名状态再拿到(合并策略表:叠加/累加/并存)· §剩余次数怎么倒数 · 「幅度与量纲」节盾牌加护行与字段表。本卡只实现上述设计,不改设计。
> 估时:T0–T2 ≈ **1.0~1.25 个工作日**(中值 ≈1.125)。
## 一、目标与完成定义
本批把状态表六行(attack_up/ac_up/weaken/empower/fortify/defensive_stance)的合并策略由「refresh=重复授予重置剩余次数」改为「accumulate=重复授予在剩余次数上累加本次授予的时长」,状态容器 refresh 臂同步换为累加臂。
完成定义:
1. 表行:六行 `stack_policy` 值 refresh→accumulate;四行 stack 行与其余全部字段值零改动。
2. 容器:同名重复授予 → 剩余结算次数加上本次授予的生效时长(`duration_override` ≥1 时加覆盖值);层数恒 1;时长不封顶;空授予面消除(每次授予必有剩余次数变化)。
3. 叠加(stack)与并存(independent)两臂语义零变化;快照纪律不变(首授快照恒定)。
4. 词表换代:schema 词表改 `["stack", "accumulate", "independent"]`,加载期枚举校验随词表生效(fail-fast 不变)。
5. 既有断言数值换代两处+断言标签/注释文字换代两处(第十一节申报共四条)+新增累加断言三条,全部真实入口、当轮执行并通过。
6. 独立验收审计通过(报告落 `reports/iter<N>-验收审计-<日期>.md`,未过不得合并);反哺点两条落反哺点清单;README 能力行批末只核对名字与实际落地一致;本批不写 `design/` 与根规则文件。
## 二、设计事实源
1. 增益状态.md v1.3 §同名状态再拿到·合并策略表「累加」行:剩余结算次数加上本次授予的时长——技能施放行带覆盖时长时按覆盖值加;层数不变;现行内容行六行用累加。
2. 同文档 §剩余次数怎么倒数:累加语义下重复拿一次就按本次授予时长多攒一段,同一轮拿几份攒几段。
3. 同文档「幅度与量纲」节例表(盾牌加护行):层数恒 1、剩余结算次数累加;掷点判定阈值=主角基准+层数——该句为现状描述,AC 读取路径本无「上限 2 层叠读取法」代码(见第三节 8),AC 侧零改动。
4. 四点裁决(待办清单条目在案):六行 refresh 全改累加/时长不封顶/只加时长、层数与强度不变/累加量=本次授予的生效时长(带覆盖时长时按覆盖值)。
5. [地图战斗资源](../design/gdd/systems/战斗循环/地图战斗资源.md) 削弱行引用句(:130,2026-10-31 设计闭合批随改、累加语义已落)——待办清单条目闭合凭据的第二件,与条目实况对齐;无实现缺口。
## 三、现状事实(代码级,开工自行复核)
1. 表行:`game/data/tables/status_effects.tres` 十行;六行 `stack_policy: "refresh"`——attack_up :14、ac_up :23、weaken :32、empower :68、fortify :77、defensive_stance :86;四行 `"stack"`——enrage :41、off_guard :50、sapped :59、alert :95;无 independent 行。相关表值:attack_up/ac_up duration 1·max_stack 2;weaken duration 2·max_stack 16;empower/fortify/defensive_stance duration 2·max_stack 1。
2. 词表:`game/data/schemas/status_effect_table.gd:11` `STACK_POLICIES := ["stack", "refresh", "independent"]`;:55–56 加载期枚举校验(出域致命——fail-fast)。
3. 容器:`game/core/status_container.gd:28` `apply_effect(effect_id, source, duration_override=-1)` 唯一授予入口(:37 override <1 → 行值 duration_settlements);:40–49 策略 match;:44–45 refresh 臂转发 `_apply_refresh` :61–67——命中 `inst.remaining = dur`(重置)、未命中追加(层数 1)、恒返回 true。
4. 叠加臂 :72–80(满层拒零写入、未满加层、不触碰 remaining)与并存臂 :41–43(新建独立实例)——本批零改动。
5. 快照:`_grant_snapshot` :52–57 授予时快照;refresh 臂重授不换快照——本批沿用该口径(第 13 节代拍板 2)。
6. 衰减:`decay_round` :122–134 每实例 −1、归 0 移除(先兑付后衰减的编排信任在战斗结算)——累加制零改动。
7. 授予链三路(真实入口全走 `apply_effect` 同口):`game/core/reward_grant.gd:239`(安全格 percent 奖励 → attack_up/ac_up)· `game/core/damage_controller.gd:451`(效果引擎 fx_apply_status)· `game/core/settlement/combat_segment.gd:89`(敌方增益/妨害技施放——:88 `dur = srow.buff_duration`,覆盖时长的真实入口)。
8. AC 读取:`game/core/damage_controller.gd:616–631` `defender_ac` = 基线(hero 表或合流入参)+Σ ac 型 `effective_value`(层数×快照幅度)——无上限钳制;ac_up 层数恒 1 → 阈值=基准+1。v1.3「上限 2 层叠读取法退役」为现状描述句,代码无该读取路径——AC 侧零改动。
9. AC11 采样:`game/tests/unit/battle_settlement/roll_multiplier_test.gd:241` 起 `_ac11_tier_samples` 每轮衰减后重授——实例已移除、重授为新建,不触合并臂——累加制下行为与断言不变。
10. 断言换代点:`roll_multiplier_test.gd:158–161`(削弱重复授予 remaining==2 重置语义断言与 :157–158 注释)+ :221–236 `_weaken_refresh_probe`(:230 重授注释「remaining ← 2」;:159 调用点与 :342 注释引用该探针名——改名随批换代);`game/tests/unit/data_config/table_structure_guard_test.gd:273–275`(ac_up 行断言 `stack_policy == "refresh"`);`game/tests/unit/battle_settlement/damage_controller_test.gd:376`(断言标签「refresh 政策重复授予受理且层数恒 1」——行为面累加制下仍绿〔层数恒 1、池值不变〕,仅标签文字换代)。
11. 不受影响断言:`damage_controller_test.gd:391`(stack 行过滤)· `seal_polarity_test.gd:684`(sapped=="stack")· `system_contracts_test.gd:_test_status_boolean_acceptance`(布尔受理——attack_up 行,refresh→accumulate 行;单次授予不触合并臂)。
12. sim/probe 零消费:`stack_policy`/`apply_effect` 于 `game/sim`、`game/probe` grep 零命中;状态实例不落存档断点(战斗域生命周期——`notify_battle_start` 清空,`game/core/breakpoint_store.gd` 无状态片段)。
13. EV 锚:战斗结算域 EV 抽样对锚(goblin 锚)读战斗真实结算——合并语义改变重复授予的削弱/增益存续时长,EV 有漂移可能(先例:触发器批 git 提交 4868e11b 触发重锚 ba5105aa 归绿)。
14. S13 基线:status_container/status_effect_table/damage_controller 均不在 `tools/gdstyle_baseline.txt`(默认阈值内);tests 不在 S13 扫描面。
15. 表批注:status_effects.tres :99–141 为逐批变更叙事批注(含 :129–141 叙述 refresh 语义的历史——本批换代后成陈旧叙事)。批注保留是用户明令现状(git 提交 4a2ed961,2026-11-01:数值表 `; ` 批注全量恢复)——本批零触碰,处置归用户另裁,实现报告留遗留观察记录。
16. 文档漂移(考证发现,非本批造成):增益状态.md「现在有哪些状态」节记「现行九行」且行表缺 defensive_stance(护身)行——该行 2026-10-27 触发器批落表(git 提交 4868e11b),文档行清单未跟;合并策略表「六行用累加」计数与表实况一致。
## 四、设计契约
- 🔴 **C1 累加语义单点**:重复授予的合并只发生在状态容器策略臂(match 分派后累加实现)——任何调用方不得自算 remaining 或二次实现合并。
- 🔴 **C2 表驱动**:累加行集合以 `stack_policy` 字段为唯一依据——禁按 effect_id 白名单另立硬编码集合。
- 🔴 **C3 只加时长**:累加臂只改 remaining;层数、快照(m/unit/display)、source_class、origin_cell 首授后恒定;时长不封顶(运行期 remaining 无上限,禁自造 clamp)。
- 🔴 **C4 覆盖时长口径**:`duration_override` ≥1 时累加量=override 值;<1 时=行值 duration_settlements。
- 🔴 **C5 两臂不动**:stack 臂满层拒零写入与 independent 臂新建实例语义零变化——触碰即 L3。
- 🔴 **C6 词表唯一**:`stack_policy` 取值集合只在 schema 词表一处定义;tres 六行与词表同批换代,禁留双值兼容(旧值 "refresh" 出词表即加载期致命,同批清干净)。
## 五、范围边界
不做:衰减节拍改动(先兑付后衰减不变);单体寻址扩展位实现(接口定稿在案、随首个单体效果内容批);叠加/并存行为调整;status_effects.tres 其余字段与四行 stack 行值改动;表批注处置(:99–141 含本批换代后的陈旧叙事——用户 2026-11-01 恢复令 git 提交 4a2ed961 在案,本批零触碰,另裁另批);「增益叠层/衰减/清除结算链」覆盖缺口的其余断言补齐(归待办清单「能力清单覆盖缺口补齐」条);EV 锚重锚(红则停机呈报,重锚归用户档位发起)。
反哺去向:第六节两条 → `reports/iter<N>-反哺点-<日期>.md`,用户裁决后归文档批落文。
## 六、关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| design/gdd/systems/战斗循环/增益状态.md | 字段表 `stack_policy` 取值行记「stack / refresh / independent」——词表换代后 refresh 值不复存在 | 反哺点(iterN 反哺点清单):取值改「stack / accumulate / independent」,用户裁决后文档批落文 |
| design/gdd/systems/战斗循环/增益状态.md | 「现在有哪些状态」节记「现行九行」且行表缺 defensive_stance(护身)行——本批考证发现的存量漂移,非本批造成 | 反哺点(iterN 反哺点清单):九行→十行+补护身行(敌方输出减益 −25 percent、duration 2、累加、max_stack 1、来源敌方技能「孤注守势」),文档批落文 |
| game/tests/README.md | 能力行新增+覆盖域表「增益状态」行更新 | 写卡段随本卡已入表(实现批禁写该文件红线不变;批末收尾只核对表上名字与实际落地一致) |
## 七、文件结构图
| 文件 | 职责 | 改动性质 |
|---|---|---|
| game/data/tables/status_effects.tres | 状态表十行 | 行为改动:六行 stack_policy 值换代(对照表 R1);表批注零触碰(范围边界在案) |
| game/data/schemas/status_effect_table.gd | 表 schema 与词表加载期校验 | 行为改动:词表换代(对照表 R1) |
| game/core/status_container.gd | 状态容器(授予/合并/衰减唯一落点) | 行为改动:refresh 臂→累加臂(对照表 R2/R3/R4) |
| game/tests/unit/battle_settlement/roll_multiplier_test.gd | 掷点/削弱/AC11 套件 | 行为改动(测试面):削弱累加探针换代+新增三条断言(对照表 R2–R4;申报见第十一节) |
| game/tests/unit/data_config/table_structure_guard_test.gd | 表结构守卫 | 行为改动(测试面):ac_up 行断言换代(对照表 R1;申报见第十一节) |
| game/tests/README.md | 能力清单与覆盖域表 | 写卡段维护件——本卡落位时已入表,实现批零改动 |
| game/core/damage_controller.gd `_ineffective_row` | 行载荷加自描述键 `deferred: true`(战斗段地图账未生效行——裁决补记 2026-11-02 甲案) | 非行为改动(观测面扩展,零绘制/结算变化;对照表 R7) |
| game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd `_row_phase` | reward_ineffective 分类补 deferred 分支(战斗段)——裁决补记随动(对照表 R7) | 行为改动(测试面,断言判据随申报 5 换代) |
## 八、落位与可复用性预检
- **复用面**:零新增文件、零新增函数、零新增数据件——累加臂就地替换 refresh 臂(`_apply_refresh` 改名 `_apply_accumulate`),词表与表行就地换代;合并逻辑唯一落点=容器策略 match(C1/C6),无第二处可复用或需新建的合并实现。
- **唯一面**:`stack_policy` 词表唯一出处=schema :11;取值**定义面**全仓 grep 仅存于 tres 六行+schema 词表+容器臂+三处断言(第三节 1/2/3/10)——叙事批注与测试注释例外(第三节 15/10 在案),不属定义面。
- **分层与交互面**:表行(data/tables)→ schema 校验(data/schemas,加载期致命)→ 容器臂(core)→ 消费面(defender_ac 与池乘区——零改动)。Core 零 UI、数值单点经 ConfigDB、RNG 零新增——既有红线零触碰。
## 九、实现规范预算
- 新增文件:零——新件三查不适用;迁移函数:零(累加臂就地改写,无自存量文件迁入的函数)。
- 存量触面一查:触碰产品码两件(status_effect_table.gd、status_container.gd)均不在 gdstyle 基线(默认阈值内);预期 S13 键较现状零新增。tests 不在 S13 扫描面。
## 十、任务卡
**T0 开工门+基线读数(0.25 天)**
- [ ] worktree 建区+`git status` 归属核对(并行遗留只登记不触碰)
- [ ] S13 触面读数:两产品文件现行键数记录进实现报告(预期零键——不在基线)
- [ ] EV 锚改前读数留底:从最近 CI 回执抄录战斗结算域 EV 锚读数(goblin 现值)进实现报告,作批末对拍锚
**T1 累加制单点实装(0.5~0.75 天)**
- [ ] status_effects.tres:六行 `stack_policy` "refresh"→"accumulate"(:14/:23/:32/:68/:77/:86;保持既有 CRLF 行尾)——可核查:grep '"stack_policy": "refresh"' 零命中(值行限定写法——:129/:139 恢复批注含同词、不属值行,禁触碰)、"accumulate" 恰六处
- [ ] status_effect_table.gd:11:`STACK_POLICIES` 换代 `["stack", "accumulate", "independent"]`——可核查:加载链全表装载零红(枚举校验随词表生效)
- [ ] status_container.gd::44–45 match 臂 "refresh"→"accumulate";`_apply_refresh` 改名 `_apply_accumulate`——命中 `inst.remaining = int(inst.remaining) + dur`、未命中追加、恒 true;:60 注释换代(累加语义——R += D;L 不变;快照沿首授)——可核查:容器内 stack_policy 语境 "refresh" 零残留
- [ ] roll_multiplier_test.gd:③段 :157–158 注释与 :160–161 断言换代(重置 2 → 累加 3);`_weaken_refresh_probe` 改名 `_weaken_accumulate_probe`(:159 调用点与 :342 引用注释随改),探针改五段式——授予(2)→衰减(1)→重授(1+2=3,V1)→覆盖值重授(3+3=6,V3)→同轮再授(6+2=8,V2);返回 {layers, pool, after_regrant, after_override, after_extra, snap_magnitude} 六读数(pool 键保留——:163 池读数断言零改动在位)
- [ ] 新增断言三条(尾缀〔状态累加 V1/V2/V3〕):V1=重授后 remaining==3、layers==1、snap_magnitude==−65(首授快照恒定);V3=覆盖值累加后 remaining==6;V2=同轮再授后 remaining==8
- [ ] table_structure_guard_test.gd:273–275:ac_up 行断言 `stack_policy == "accumulate"`+消息换代(累加语义句)——可核查:断言尾缀〔状态累加 V4〕可 grep、套件绿
- [ ] 裁决补记随动(2026-11-02 甲案):`_ineffective_row` 载荷加 `"deferred": true`;`_row_phase` reward_ineffective 分类补 `or bool(row.get("deferred", false))` → 战斗段
- [ ] 孤立验证:六套件最窄复跑(roll_multiplier/table_structure_guard/system_contracts/damage_controller/seal_polarity/round_flow_skill_pool——EV 锚套件提前曝红)全绿或按 L3②停机、断言尾缀可 grep
**T2 产出物落位(0.25 天)**
- [ ] 实现报告:各卡状态+改动—验收对照表结果列+EV 锚改前改后读数对拍+实机目检总清单(同名状态重复授予后状态存续时长延长——登记不阻塞)+遗留观察记录(tres :129–141 refresh 陈旧叙事批注——处置归用户另裁)
- [ ] 反哺点清单:第六节反哺两条逐条落点
- [ ] 独立验收审计:未参与实现的会话/子代理按 test-conventions §8.7 审计,报告落 `reports/iter<N>-验收审计-<日期>.md`——未过不得合并
- [ ] 批末按改动域跑闸(代码域)全绿;合回后本地 CI 复验
## 十一、验证闸(改动—验收对照表)
| # | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|---|
| R1 | 六行合并策略换代+词表加载期校验 | status_effects.tres :14/:23/:32/:68/:77/:86;status_effect_table.gd :11 | table_structure_guard_test ac_up 行断言换代〔状态累加 V4〕(值=="accumulate")+全表装载零红 | 接口 | ConfigDB 加载链 → `StatusEffectTable.row_by_id()` | stack_policy 字段取值(加载期枚举校验随行生效) | 新增:同名状态合并策略(叠加/累加/并存)与剩余次数语义 |
| R2 | 同名重复授予累加时长+层数恒 1 | status_container.gd :44–45/:60–67 累加臂 | roll_multiplier_test._smoke_armor_roll 削弱累加断言〔状态累加 V1〕(重授 remaining==3、layers==1、snap_magnitude==−65) | 单元 | `StatusContainer.apply_effect()` 经真实编排宿主 begin_battle | remaining/layers 只读投影(query_active) | 新增:同名状态合并策略(叠加/累加/并存)与剩余次数语义 |
| R3 | 同轮双授予累加两段 | 同上 | 〔状态累加 V2〕(同轮再授 remaining==8) | 单元 | 同上 | remaining 累计 | 新增:同名状态合并策略(叠加/累加/并存)与剩余次数语义 |
| R4 | 覆盖时长按覆盖值累加 | apply_effect :37 override 入累加臂 | 〔状态累加 V3〕(覆盖值 3 重授 remaining==6) | 单元 | 同上(真实施放链 combat_segment :89 走同口) | remaining 累加覆盖值 | 新增:同名状态合并策略(叠加/累加/并存)与剩余次数语义 |
| R5 | 快照纪律不变(首授快照恒定) | 非行为改动——累加臂沿用既有重授不换快照口径,零代码变化 | 〔状态累加 V1〕快照断言(snap_magnitude==−65) | 单元 | 同 R2 | 快照域取值(snap_magnitude) | 新增:同名状态合并策略(叠加/累加/并存)与剩余次数语义 |
| R6 | 叠加/并存两臂零变化 | 非行为改动——两臂零代码变化 | damage_controller_test :391+seal_polarity_test :684+system_contracts_test 布尔受理——既有断言零改动复跑即回归证词 | 单元 | 各既有真实入口 | 既有断言零改动 | 既有:系统间契约词表与受理口径:五配方互异/掷点标签成员性/增益布尔受理 |
| R7 | 战斗段地图账未生效行归类随动(裁决补记 2026-11-02 甲案) | damage_controller.gd `_ineffective_row` 载荷加 `deferred: true`(非行为改动);round_flow `_row_phase` 分类补 deferred→战斗段 | round_flow_skill_pool_test 相位单调断言(同轮执行且通过——seed 42 轨迹含该行型)+五套件回归 | 单元 | `_run_battle(1,0)` 真实结算流 | 相位分类器按自描述键归类;既有申报 1–4 与 R1–R6 断言零变化 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
**测试削弱申报**(允许的旧断言改动,全部为语义换代非削弱):
1. roll_multiplier_test.gd:160–161 削弱续时断言——refresh 重置语义(remaining==2)作废,换代为累加语义(remaining==3)——被测行为就是本批改动本体。
2. roll_multiplier_test.gd:157–158 注释、:230 探针注释与 :342 探针名引用注释换代(「续时:remaining ← 2」→累加口径;旧函数名 `_weaken_refresh_probe` 全仓清零)。
3. table_structure_guard_test.gd:274–275 ac_up 行断言值与消息换代(refresh→accumulate)——同上。
4. damage_controller_test.gd:376 断言标签「refresh 政策重复授予受理且层数恒 1(叠层改续时裁决)——池值不变」——行为面累加制下仍绿(层数恒 1、池值不变,断言数值零改动),仅标签文字换代为累加口径。
5. **round_flow_skill_pool_test.gd `_row_phase` 分类补 deferred 分支(裁决补记 2026-11-02 用户甲案)**:「每轮行相位单调」断言的相位分类器对「战斗段地图账未生效行」(damage_controller `_ineffective_row` 发射、案C 口径在案)原判第 0 段——累加制改变战斗轨迹后该行型首次在种子 42 轨迹出现致断言红。随动=`_ineffective_row` 行载荷加 `deferred: true` 自描述键(非行为改动)+分类器按键归战斗段(相位 2)。五段全序不变量强度不降:归类的是既有设计口径行型,非放宽任何阈值。裁决原文=reports/iter48-停机呈报-卡1状态相位断言-2026-11-02.md。
## 十二、异常分级
- **L1 自救**:一次重试(表装载/套件瞬时红)。
- **L2 记录继续**:同红灯连续 3 次升级。
- **L3 停机呈报**:①C1–C6 任一触碰;②战斗结算域 EV 锚套件红(累加制有意行为改动的期望值漂移)——锚内子集判红即停,重锚归用户档位发起(先例=触发器批 2026-10-27:EV 0.9148 出带 → 重锚 ba5105aa 归绿);③S13 新增红键=上游缺陷停卡退回写卡段(机检预算互斥)。
## 十三、代拍板白名单
1. 词表值命名 `accumulate`(实现标识符——语义已由 v1.3 全定;反哺点随批登记文档字段表行换代)。
2. 合并授予不改快照(沿用既有 refresh 臂口径——首授快照恒定、幅度 override 只作用首授)。
3. 测试函数改名 `_weaken_refresh_probe`→`_weaken_accumulate_probe` 与新增断言措辞(V 尾缀〔状态累加 Vn〕编号在案)。
## 十四、待裁点
零待裁点,开工门=U0。(四点裁决 2026-10-31 用户裁闭合——待办清单条目在案;本卡全部实现项与代拍板 1–3 均为该裁决的实现面,无新增设计分叉。)
@@ -1,244 +0,0 @@
# 需求卡片 · 立绘显示档批(v1.1)
> **用途**:迭代实现批的实施合同(卡①单卡批)。v1.1=双审(grilling+godot-master)后执行级订正,设计面零改动(复核记录=`reports/复核-双审-grilling与godot-master-立绘显示档批-2026-11-01.md`)。
> **来源**:待办清单「立绘清晰度回退评估——原稿分辨率+三档显示」条目(状态=美术设计已闭合+已写卡)。
> **唯一事实源**:`design/art/art-bible.md` §8.2「站桩立绘显示档 = 三档绝对高」条(v3.32)+ `design/art/character-design.md` §5.2/§5.5 指路行。
> **改动面**:美术素材+游戏代码。 **估时**:≈0.85 个工作日。
---
## 1. 目标与完成定义
**做什么**:把 9 件站桩立绘(八敌 + 主角三态)从「原稿降采样到 48–94 再 ×2 显示」改成「原稿分辨率入包 + 显示按三档绝对高缩放」。
| 档 | 绝对显示高 | 归档 |
|---|---|---|
| 小型 | 96 | 地精 goblin、巨蜘蛛 giant_spider、灰矮人 duergar |
| 中型 | 144 | 主角 hero、钩爪恐魔 hook_horror、熊地精 bugbear |
| 大型 | 188 | 食人魔酋长 ogre_chief、蛛化卓尔 drider、灰矮人石君王 duergar_king |
宽度一律随源图比例(高定宽随),缩放过滤 NEAREST。
**什么状态算完**:
1. 9 件素材 = 原稿紧裁原样落 `game/assets/art/character/`,盘上无任何降采样痕迹;
2. `standee_motion.gd` 硬编码 ×2 退役,显示倍率由逐件档高算出;
3. `tools/standee_asset_check.py` 与 `tools/pixelize_candidates.py` 改按显示档与原稿高校验,全绿;
4. 真实入口断言钉住逐件显示档高、纵横倍率恒等、两表同值;
5. 样张脚本站桩段与探针文案随动;
6. 代码域闸全绿 + 改前/改后并排对照图落盘 + 产出物三份齐。
---
## 2. 现状事实(代码级,开工复核)
| # | 事实 | 出处 |
|---|---|---|
| F1 | 显示倍率硬编码:`w/h = tex.get_width/height() * 2.0`、`scale = Vector2(2.0, 2.0)` | [standee_motion.gd:63](game/presentation/views/standee_motion.gd#L63) |
| F2 | 立绘盒几何:`box := Vector2(150, 176)`;立绘盒矩形 `(0,44)-(box.x, box.y-80)` → 立绘区 150×96,高于 96 者按 `(box_h-h)*0.5` 向上溢出 | [standee_body.gd:24](game/presentation/views/standee_body.gd#L24)、[:309](game/presentation/views/standee_body.gd#L309)、[standee_motion.gd:62](game/presentation/views/standee_motion.gd#L62) |
| F3 | 盒宽常量与盒高注入:`_STANDEE_W := 150.0`;`hero_standee.box = Vector2(_STANDEE_W, box_h)`(盒高=行高) | [battle_stage_view.gd:10](game/presentation/views/battle_stage_view.gd#L10)、[:197](game/presentation/views/battle_stage_view.gd#L197) |
| F4 | 主角立绘装载与三态注册(含「48px 档」注释);敌侧 `_enemy_portrait_tex(enemy_id)` 查表后 `set_portrait_texture` | [battle_stage_view.gd:132-140](game/presentation/views/battle_stage_view.gd#L132)、[:252-267](game/presentation/views/battle_stage_view.gd#L252) |
| F5 | 纹理路径常量单点在 UiKit(八敌 + 主角三态) | [ui_kit.gd:233-247](game/presentation/views/ui_kit.gd#L233) |
| F6 | 现行入包稿尺寸:主角三态 46×48 / 48×48 / 46×48;八敌 36×36、48×38、34×46、46×58、51×62、62×74、67×90、66×94 | 盘上 `game/assets/art/character/`(素材不入 git) |
| F7 | **现行入包稿 = 原稿降采样,逐像素相同**:`dom_block_resize(pixel-1, 74/90/94)` 与 ogre_chief/drider/duergar_king 三件 diff 框为空(2026-11-01 会话实测) | 管线 [pixelize_candidates.py:430-457](tools/pixelize_candidates.py#L430) |
| F8 | 原稿在盘:八敌 `pixel-1.png` 高 81–189(地精 89×90/巨蜘蛛 102×81/灰矮人 93×126/钩爪 74×94/熊地精 102×123/酋长 158×189/卓尔 140×189/石君王 133×189);主角手修 2× 三态稿内容 88×92 / 92×92 / 88×92 | `artwork/remote-gen-2026-09-26/`(不入 git) |
| F9 | 派生管线末步即降采样:`build_standee48` 紧裁 → 等比缩至 `STANDEE_TIER_H` → `dom_block_resize` | [pixelize_candidates.py:28](tools/pixelize_candidates.py#L28)、[:38-43](tools/pixelize_candidates.py#L38)、[:459-504](tools/pixelize_candidates.py#L459) |
| F10 | 闸件按源档高校验:`DISPLAY_SCALE=2`、`SRC_W_MAX=75`、断言①档高、断言②源宽×2≤150 | [standee_asset_check.py:50-53](tools/standee_asset_check.py#L50)、[:75-98](tools/standee_asset_check.py#L75) |
| F11 | 样张脚本站桩段硬编码「立绘盒 96px(48 源 ×2)」;另有 A4 尺寸基线硬锁 `PORTRAIT_SRC.size==(46,48)` 与战斗语境 96×96 方框 mockup(脚本自述「换代须显式解冻重校」) | [render_sample_sheet_v3.py:775-791](tools/render_sample_sheet_v3.py#L775)、[:1135-1139](tools/render_sample_sheet_v3.py#L1135)、[:1501](tools/render_sample_sheet_v3.py#L1501) |
| F12 | 探针文案「48px 档」(判据只查 `has_tex`,非尺寸断言) | [ui_probe.gd:139-144](game/probe/ui_probe.gd#L139) |
| F13 | 另两消费面按固定框装载同一素材:标题屏 138×144/46×96/80×96(`STRETCH_KEEP_ASPECT_CENTERED`+NEAREST);关卡地图头像定高 48、宽随源比 | [ui_assembler.gd:170](game/presentation/ui_assembler.gd#L170)、[level_map_screen.gd:176-190](game/presentation/views/level_map_screen.gd#L176) |
| F14 | 能力清单现行行「站桩呈现定值与素材绑定」→ `standee_present_values_test.gd`(V5–V12 在此套件) | [README:136](game/tests/README.md#L136) |
| F15 | 舞台高 252(溢出上限的物理边界) | `game/data/tables/battle_layout.tres` |
---
## 3. 设计契约(违反即返工;标 🔴 触碰=L3 停机呈报)
1. 🔴 **禁改形象**:9 件素材 = 原稿紧裁原样,禁重画、禁生成、禁 `dom_block_resize` 降档(art-bible §8.2 v3.32)。
2. 🔴 **显示档定值单点** = art-bible §8.2;GDScript 侧 `PORTRAIT_DISPLAY_H` 与 Python 侧 `STANDEE_DISPLAY_H` 逐键同值、两侧各自钉死字面值,跨语言对账由 V17 承担(读不到文件走 L2,见 §8/§9);禁第三处复写,**禁查表兜底字面量**。
3. 🔴 **纵横倍率恒等**(高定宽随),禁方框强拉(art-bible §8.2 槽位条)。
4. 🔴 **体量顺序由显示档承载**:小 < 中 < 大;禁按强度重排(character-design §5.2)。
5. 🔴 **已接受项不得当缺陷回炉**:①五件源高低于档高属放大显示(主角 92/钩爪 94/熊地精 123/地精 90/巨蜘蛛 81,倍率 1.07–1.57);②灰矮人 126→96 是全批唯一 <0.8 档(0.76× 抽行,NEAREST 描边约每 4 行断点),列目检①头号回退候选;③食人魔酋长显示宽 157 超桩盒 150;④关卡地图头像由 ≈1× 变 0.52× 降采样,列目检③。
6. 🔴 显示档数值只落显示档表,绘制点与检查器一律读表,禁字面量散落(数值单点纪律)。
7. 🔴 素材不入 git(art-bible §8.3);本批入 git 的只有代码/工具/测试/文档件,素材落盘由实现批执行并在实现报告逐件留读数。
---
## 4. 范围边界
**做**:9 件素材按档派生落盘;`standee_motion.gd` 显示倍率改造;`pixelize_candidates.py`/`standee_asset_check.py` 改显示档;样张脚本站桩段随动;探针与装载点注释随动;`standee_present_values_test.gd` 增显示档断言。
**不做(去向明示)**:
- 不重画、不生成任何图像(现有形象即终稿)。
- 不动棋盘小人(`character_hero_idle/walk.png` 32×32 独立资产)——另属棋盘面。
- 不改标题屏与关卡地图头像的框尺寸(两面只随素材分辨率自动变化;若目检判需专件,另批)。
- 不动色板与 `#A79CB8`(保留在板、本批不消费;色板额度议题另批讨论)。
- 不做站桩帧动画(待办清单「站桩帧动画」条)。
- 不做主角态切换重摆(`standee_motion.gd:85-86` `apply_hero_state` 换纹理不重算 position,三态源宽 88/92/88 → 切换有约 3–6px 横跳,系现行 2px 的放大版;重摆=行为改动,禁实现批顺手加,要修另批)。
- 不做关卡地图 48px 头像专件(新源在该面为 0.52× 降采样;目检判不可受则另批出专件)。
- 不做桩盒宽 150 与 >150 溢出档的布局重排(食人魔超宽 8px 按已接受项走;实机若碰邻位则 L3 停机,布局另批)。
---
## 5. 关联文档同步面
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|---|---|---|
| `design/art/art-bible.md` §8.2 | 显示档条与排版条 >150 举例 | **已落**(前置文档批 v3.32,本区已改)——实现批禁写 `design/`,本批零义务 |
| `design/art/art-bible.md` §8.2 槽位条 | 「高度的整数倍档」与绝对档高+非整数倍率字面冲突 | **已落**(双审后随设计批改「高度的绝对档(档高取整数像素值)」) |
| `design/art/art-assets-checklist.md` §0 分辨率档位行 | 旧口径「站桩源高 48/敌种逐键源档 36–94/整数倍缩放纪律」 | **已落**(改指 §8.2 显示档条) |
| `design/art/character-design.md` §5.5 | 指路行 | 同上,已落 v3.32 配套 |
| `design/gdd/08-Alpha版本标准.md` 覆盖行 | 出口从「重产完成」改「9 件按档落位+目检」 | 已落 v1.22;实现完成后「待做→在役」列**反哺点**呈裁 |
| `待办清单.md` 本条 | 状态推进(已写卡→已编迭代→完成删条) | 各段按状态机推进,非实现批直改 → 列**反哺点** |
| `design/art/art-prompts.md` §5.4 产出状态 | 「待实装批落位」→「已落位」 | 实现完成后 → 列**反哺点** |
| `design/art/art-status-checklist.md`/`art-assets-checklist.md` 站桩行 | 「按档派生落位归本条实装批」→ ✅ 已交付 | 实现完成后 → 列**反哺点** |
| `game/tests/README.md` 能力清单 | 新能力行「站桩显示档与素材分辨率绑定」 | **写卡段已同批补行**(本卡 §9 能力行与之一致);实现批禁写该文件 |
| `design/gdd/术语表.md` | 「显示档」是否立条 | 列**反哺点**呈裁 |
| `体验验证清单.md` | 实机目检项(9 件清晰度、同屏体量顺序、标题屏/地图头像消费面) | 实现批禁写 → 列**反哺点**,目检清单先落实现报告 |
---
## 6. 卡前文件结构图
| 文件 | 职责 | 改动性质 | 验收行 |
|---|---|---|---|
| `game/presentation/views/standee_motion.gd` | 显示档表 `PORTRAIT_DISPLAY_H` + `_place_portrait` 按档算倍率 | **行为改动** | V1 V2 V3 |
| `game/presentation/views/standee_body.gd` | 探针 `portrait_probe()` 扩显示读数(几何出口单点) | **行为改动**(观测面扩展,绘制零改) | V3 V4 |
| `game/presentation/views/battle_stage_view.gd` | 「48px 档」注释随动 | 非行为 | — |
| `game/probe/ui_probe.gd` | 文案随动(判据不变) | 非行为 | — |
| `game/tests/unit/presentation/standee_present_values_test.gd` | 增 V13–V16 显示档断言(复用既有套件,禁新增文件) | 新增测试 | V1–V4 |
| `tools/pixelize_candidates.py` | `STANDEE_TIER_H` → `STANDEE_DISPLAY_H`;`build_standee48` 改紧裁不降档 | 工具(非行为) | V5 |
| `tools/standee_asset_check.py` | 断言①改源高=原稿表+显示宽;断言②宽上限按显示宽;表名随动 | 闸件(非行为) | V5 |
| `tools/render_sample_sheet_v3.py` | 站桩 mockup 按显示档取数 | 工具(非行为) | V7 |
| `game/assets/art/character/`(9 件,不入 git) | 原稿紧裁落盘 | 资产 | V5 |
| `artwork/candidates/立绘显示档批-<日期>/`(不入 git) | 改前/改后并排对照图 | 取证 | V6 |
---
## 7. 任务卡 T0..T3
### 7.1 T0——改前读数与基线(估时 0.1 个工作日)
- [ ] 跑 `python tools/standee_asset_check.py` 记录现行 9 件读数(尺寸/档高/色数/描边占比),存实现报告改前基线表。
- [ ] 跑 `python tools/pixelize_candidates.py --standee48 --standee-out /tmp/precheck` 确认现行管线产物与盘上素材逐件同尺寸(证明 F7 降采样链在位)。
- [ ] 跑代码域闸确认改前全绿(确切命令见 §9 末注)。
**取用**:无。**产出**:改前基线读数表(T3 对照用)。
### 7.2 T1——素材按档派生落盘+闸件同批改口径(估时 0.25 个工作日)
- [ ] `tools/pixelize_candidates.py`:`STANDEE_TIER_H` 改名 `STANDEE_DISPLAY_H`,值改显示档 `{goblin:96, giant_spider:96, duergar:96, hook_horror:144, bugbear:144, ogre_chief:188, drider:188, duergar_king:188}`,主角侧 `STANDEE_SLOT_H` 改 `144`;新增原稿高表 `STANDEE_SRC_H = {goblin:90, giant_spider:81, duergar:126, hook_horror:94, bugbear:123, ogre_chief:189, drider:189, duergar_king:189, hero:92}`。
- [ ] `build_standee48` 改紧裁不降档:内容紧裁 → 底中锚 → 原样存盘;**删除 `dom_block_resize` 调用路径**(函数与 CLI 旗标改名按档派生);主角源由 `hero-ref/edit/*_1x.png` 改指 `*_2x.png`(canvas 94×112/96×112,紧裁后 88×92/92×92/88×92)。
- [ ] **原稿输入面显式定径**:`python tools/pixelize_candidates.py D:/code/g-plan2/artwork/remote-gen-2026-09-26 --standee-out game/assets/art/character`——worktree 的 `artwork/` 不含原稿(`sync_worktree_assets.sh:26-34` 只同步 `game/assets/art` 与 `.import`),缺省根路径在本区必**静默空跑**(缺件逐键 `isfile` 跳过、exit 0)。
- [ ] 产物计数自证:九件逐件尺寸 == `STANDEE_SRC_H` 表值,**计数 ≠ 9 即停(L3#2)**,禁回退用旧降采样稿顶替。
- [ ] `tools/standee_asset_check.py` 同批改口径(素材与闸件同批,禁中间态报红):import 改 `STANDEE_DISPLAY_H/STANDEE_SRC_H`;断言①「源高 == 原稿表值(禁降档)」;断言②「显示宽 = round(源宽×档高/源高) ≤ 150,食人魔酋长 157 登记例外」;其余四断言(底中锚/色数≤32/alpha 二值/描边占比)不变。跑至九件全 PASS。
- [ ] 跑 `D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --editor --quit --path game` 刷 `.godot` 导入缓存,确认九件 `.ctex` 在位。
**取用**:T0 基线表。**产出**:九件原稿分辨率素材(盘上)+ `STANDEE_DISPLAY_H`/`STANDEE_SRC_H` 两张 Python 表+新口径闸。
### 7.3 T2——代码显示倍率改造(估时 0.25 个工作日)
- [ ] `standee_motion.gd` 增常量表 `PORTRAIT_DISPLAY_H`(九键字面值钉死;**禁 `.get(key, 96.0)` 类兜底字面量**——档值第二处散落即违契约 2/6)。
- [ ] `_place_portrait` 改:`key` 主角取 `"hero"`、敌取 `_owner.enemy_id()`;查无键 → `push_error` 并按 1× 落位(不崩、不静默兜档),由 V18 键集自检在测试期报警;命中 → `s = disp_h / 源高`、`scale = Vector2(s, s)`、`w/h = 源尺寸 × s`,`position` 式沿用 F2 居中溢出机制。
- [ ] `standee_body.gd` `portrait_probe()` 扩两读数:`display_size`(Vector2)、`display_scale`(float)。
- [ ] `standee_present_values_test.gd` 增私有函数 `_check_display_tier()` 承载 V13–V18(断言内写死规格值;**浮点判等一律 `is_equal_approx` 或 `absf(...)<0.01`**——0.99/1.57 档回程有 ULP 级残差,裸 `==` 会假红)。
- [ ] 注释随动:`standee_motion.gd:38-39,59,65`(旧「盒高 96=48 源整数 2×/§8.2 禁非整数缩放」已反向引用注销条款)、`battle_stage_view.gd:134`、`ui_probe.gd:140,144`、`level_map_screen.gd:176`(「定高 48px=1×」)。
- [ ] 跑 `standee_present_values_test.gd` 单件至 exit 0。
**取用**:T1 素材与 Python 表。**产出**:`PORTRAIT_DISPLAY_H`、`portrait_probe()` 两读数、V13–V18 断言。
### 7.4 T3——样张随动、对照取证、素材落递与批末收口(估时 0.25 个工作日)
- [ ] `render_sample_sheet_v3.py`:站桩段按显示档取数;A4 尺寸基线冻结断言(`:1135-1139` 锁 `PORTRAIT_SRC.size==(46,48)`)与战斗语境 96×96 方框(`:1501`)**显式解冻重校到新档**,禁放宽阈值凑绿。
- [ ] 出改前/改后并排对照图(同屏站桩区+标题屏看台+关卡地图头像三面)落 `artwork/candidates/立绘显示档批-<日期>/`,路径写进实现报告。
- [ ] **素材落递主工作区**:合回落地后、删区前,把九件新稿拷回 `D:/code/g-plan2/game/assets/art/character/` 并逐件复核尺寸 == 表值——素材不入 git、worktree→主区无同步通道,漏这步则主区 CI 只有 V16 一处报警、敌侧无人看守。
- [ ] 跑代码域闸全绿(§9 末注),读数与闸况写进实现报告。
- [ ] **产出物落位卡**:`reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单:①九件清晰度含灰矮人 0.76× 判读、②同屏体量顺序、③标题屏看台与地图头像 0.52×、④酋长超宽不碰邻位、⑤主角态切换横跳读数+遗留读数义务)/`reports/iter<N>-代拍板追认-<日期>.md`/`reports/iter<N>-反哺点-<日期>.md`(§5 每条都有落点)。
- [ ] 独立验收审计入口与报告:`reports/iter<N>-验收审计-<日期>.md`(未过不得合并)。
**取用**:T1 素材+T2 表与探针。**产出**:闸全绿回执+主区素材追平+三份产出物。
---
## 8. 验证闸(改动—验收对照表)
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|---|---|---|---|---|---|---|
| 逐件显示档高 | `standee_motion.gd` 新增 `PORTRAIT_DISPLAY_H` + `_place_portrait` | 「九键显示档实读 = 96/144/188 逐键钉值,且源高 == 原稿表值(旧降采样稿必红)」`standee_present_values_test.gd:_check_display_tier`〔立绘显示档 V13〕 | 单元 | `StandeeBody.new("enemy")` → `set_data(enemy_id)` → `set_portrait_texture(真纹理)` → `portrait_probe()` | `display_size.y` 与 `display_scale × 源高` 双读数 ≈ 档高(`is_equal_approx`);九键逐一 | 新增:站桩显示档与素材分辨率绑定 |
| 硬编码 ×2 退役 | `standee_motion.gd:63-65` | 「`_place_portrait` 体内引用 `PORTRAIT_DISPLAY_H` 且零 `Vector2(2.0, 2.0)`」〔V14〕 | 单元(静态判据) | `FileAccess` 读 `res://presentation/views/standee_motion.gd` | 源锚正证(读表)+反证(无字面 2× 倍率) | 新增:站桩显示档与素材分辨率绑定 |
| 纵横倍率恒等 | 同上 | 「`scale.x == scale.y` 且 `display_size.x == round(源宽×档高/源高)`」〔V15〕 | 单元 | 同 V13 入口 | 探针 `display_scale`/`display_size` 实读 | 新增:站桩显示档与素材分辨率绑定 |
| 主角中档 144(三态) | 素材 = 手修 2× 稿;`register_hero_state` 面 | 「主角三态纹理源高 ≥92 且显示高 = 144」〔V16〕 | 单元 | `BattleStageView` 组合根装载后 `hero_standee.portrait_probe()`,再逐态 `apply_hero_state` 复读 | 探针显示高逐态实读 | 新增:站桩显示档与素材分辨率绑定 |
| 素材不降采样 | 9 件 = 原稿紧裁;`standee_asset_check.py` 新口径 | 「源高 == 原稿表值 +显示宽 ≤150(酋长例外)+色数 ≤32+底中锚+alpha 二值+描边占比」 | 闸(工具) | `python tools/standee_asset_check.py` | 逐件源高/显示宽读数 == 表值 | 既有:站桩呈现定值与素材绑定 |
| 两表同值不漂移 | Python `STANDEE_DISPLAY_H` ↔ GDScript `PORTRAIT_DISPLAY_H` | 「读 `../tools/pixelize_candidates.py` 源文本逐键对账」〔V17〕 | 单元(静态判据) | `FileAccess` 读仓库内 `tools/` 件(双审对此点结论相左,见复核报告 S9) | 两表逐键相等;**读不到文件 → L2 记录、退回双端字面钉值+独立审计对账,禁当红亦禁当绿** | 新增:站桩显示档与素材分辨率绑定 |
| 显示档表键集完整 | 同上 | 「表键集 ⊇ 八敌 ∪ hero 且无多余键」〔V18〕 | 单元 | 读 `PORTRAIT_DISPLAY_H` | 键集对账(防新敌种漏登记被 `push_error` 静默) | 新增:站桩显示档与素材分辨率绑定 |
| 样张口径随动 | `render_sample_sheet_v3.py` 站桩段 | 样张脚本自跑断言(脚本内 CHECKS 全绿)+改前改后并排图 | 工具 | `python tools/render_sample_sheet_v3.py` | 脚本内站桩档高读数 | 既有:站桩呈现定值与素材绑定 |
| 实机观感 | 9 件显示档 + 两消费面 | 用户目检:①9 件清晰度可接受;②同屏体量顺序小<中<大;③标题屏看台与关卡地图头像无可感劣化;④酋长超宽不碰邻位 | 目检(登记不阻塞) | 实机战斗屏/标题屏/地图屏 | 目检总清单落实现报告 | 新增:站桩显示档与素材分辨率绑定 |
**测试削弱申报**:本批不删不改任何既有断言;`ui_probe` 只改文案(判据 `has_tex` 不变);样张脚本改取数方式,其机检项断言不减。
**判据口径**:全批无变异类/撤销类取证;每行从真实入口进入、绑被测改动特有的可观测读数。
**代码域闸命令(里程碑步出口跑一次全套,波内修复只做出红件最窄确认)**:`bash tools/run_all_gates.sh --code`。
---
## 9. 异常分级
- **L1 自救**:`.import`/`.ctex` 缺位 → 重跑 `--editor --quit` 刷缓存;对照图目录不存在 → 建目录。
- **L2 记录继续**:样张脚本整屏读数偏移但四项机检仍绿 → 读数写实现报告,不返工;V17 读 `../tools/` 路径不通 → 记录后退回「双端字面钉值+独立审计对账」,禁判红。
- **L3 停机写报告等用户**:
1. V13–V16 任一断言在真实跑批中做不出(判据绑不上)→ 停卡呈报,禁放宽阈值或换下层直调;
2. 原稿缺件(任一 `pixel-1`/手修 2× 稿不在盘)→ 停机呈报,**禁回退用旧降采样稿顶替**;
3. 食人魔酋长实机碰邻位/压到顶部轮次指示 → 停机呈报(布局重排另批);
4. 机检预算互斥=上游缺陷停卡退回写卡段(新增件契约与闸键冲突时禁自造第三条路)。
---
## 10. 代拍板白名单(超清单必呈报)
1. `portrait_probe()` 新读数键名(`display_size`/`display_scale` 之外的等价命名)。
2. `pixelize_candidates.py` 函数与 CLI 旗标改名措辞(`--standee48` → 按档派生类命名)。
3. 测试尾缀用词〔立绘显示档 V13〕的括注格式。
4. 对照图目录名与文件名(保持 `artwork/candidates/立绘显示档批-<日期>/` 形态)。
5. 主角取 key 的实现写法(`_owner.enemy_id()` 空值判 hero,或经 kind 判定),只要最终表键集为九键。
---
## 11. 待裁点
**零待裁点,开工门 = U0。** 三档绝对高、逐件归档、放大与超宽两项已接受,均由用户在写卡前的设计会话中裁定(凭据见 §2 与待办清单本条实况)。
---
## 12. 落位与可复用性预检
| 新增件 | 复用面(盘上是否已有同职责件) | 唯一面 | 分层与交互面 |
|---|---|---|---|
| `PORTRAIT_DISPLAY_H`(`standee_motion.gd` const) | 无同类——现行倍率是 `_place_portrait` 内字面量(F1),本表是把它从「隐式 ×2」变「显式逐件档高」;不新增文件 | 显示档在 GDScript 侧只落这一张表;绘制点只此一处读表 | 呈现层内部件,不跨层;取 key 走宿主 `StandeeBody.enemy_id()` 既有出口,禁 Core 依赖 |
| `portrait_probe()` 两读数 | 复用既有探针出口(`standee_body.gd:283`),不新建探针件 | 显示尺寸读数唯一出口 | 测试侧只读,不反向驱动绘制 |
| 测试 V13–V16 | **复用既有套件** `standee_present_values_test.gd`(能力=站桩呈现定值与素材绑定,先例=迭代 46 卡B 在同文件加 V10–V12)——不新增测试文件 | 一套件一能力域 | headless 无渲染面,像素采样以探针几何+源锚承载(沿该套件既有口径) |
| `STANDEE_DISPLAY_H`/`STANDEE_SRC_H`(Python) | 改名/扩表,不新增脚本;`dom_block_resize` 保留为管线其他用途件(禁删函数本体) | Python 侧显示档只此一处,`standee_asset_check.py` 经 import 读(沿 F10 现例) | 工具侧,不进游戏运行时 |
| 9 件素材 | 复用原稿(F8),零新增绘制 | 一素材一路径,键名不变(F5 常量单点不动) | 素材不入 git(契约 7) |
---
## 13. 禁为机检文本保留无效成员
本批为呈现改造,仍立条款:若 `standee_asset_check.py` 或测试的消息文本要求保留旧键名(`STANDEE_TIER_H`/`STANDEE_SLOT_H`)凑计数或凑正则,一律停卡呈报;闸键与卡片契约互斥时禁自造第三条路,禁为过闸保留无消费方的别名。
---
## 14. 实现规范预算
- **新件三查**:本批**无新增 .gd 文件**(§12 复用面已定),三查不适用;新增常量表 1 个、探针读数 2 个,不触公开方法/var 阈值。
- **扫描面事实(双审核正)**:gdstyle 只扫 `game/core|data|presentation`(`tools/gdstyle_gate.py:49`),**tests 不在面**,`tools/gdstyle_baseline.txt` 内亦无该测试键——v1.0 所写「核该测试键登记值」属空操作,注销。
- **存量触面一查(S13 键只降不升,适用在面件)**:`standee_motion.gd`(在面)——只增一个常量表并改 `_place_portrait` 换算式,branches 不变、不产新键;`standee_body.gd:portrait_probe()`(在面)——返回字典扩两键,branches 不变。
- **测试侧纪律**:V13–V18 提私有函数 `_check_display_tier()` 承载(拆分不改语义,非凑机检);新写测试码按 test-conventions §7 带全类型标注。
- **指标例外申报**:无。
---
## 15. 估时与切分预案
≈0.85 个工作日(T0 0.1/T1 0.25/T2 0.25/T3 0.25)。
切分预案:素材与闸件已在 T1 同批改口径(不留中间态报红窗口);若 T3 三面对照图+主区素材追平压超软盒,切分点=把 T3 的「样张随动」独立成卡②,两卡同迭代合回,不拆迭代;若实机判酋长超宽碰邻位或灰矮人 0.76× 不可受,本卡止于 L3 停机/回设计段裁档,另立新条。
+3 -3
View File
@@ -5,8 +5,8 @@
## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照) ## 当前位(只回答「现在该做什么」;三行内随批次换代,禁止在此扩写成状态快照)
- **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。 - **阶段**:M3——Alpha 版本的完整实现(2026-10-09 立规:未明令宣布完成前停留 M3,迭代只排 M3 需求,M4 不排期;根目录 stage.txt 为旧阶段开关仅存档)。
- **迭代位**:迭代 1–47 全部已完成——迭代 47(营地模态句柄子容器批卡⑥+营地场景图新建批卡④+Esc浮窗与营地顶栏批卡⑤)2026-11-01 合回(合并提交 3443890d,独立验收审计处置后通过),批后收尾闭合(2026-11-02):反哺点十二条处置闭合(architecture v1.28 营地域六件归属行增补+D1 营地面与 ui_registry 行现状化+层序合同槽换代与产品码首个键盘输入入口注记/camp.md v2.4 顶栏刷新单口实装回填/art-bible v3.35 围墙细条实装落盘值与营地场景环境子板 32 色行/camp-scene-prompts v1.4 八物件落位实测表与量化缩放实况注记/生涯.md v1.4 P6 甲落地条带撤下/08-Alpha v1.23 键盘行 Esc 例外注记与营地两行在役换代/asset-path-map 与美术清单 §3.5 营地十件实装入库确认;反哺 #10 shot_checker 色数判据互斥已随 82b2cbea/8e294de9 用户裁决落地〔阈值 40、camp 特判删除、色数收敛登记待办新条〕——零落文面)、目检五项登记体验验证清单 ㊺、产出物退役九件(三需求卡片+反哺点+实现报告+验收审计+需求澄清+美术生成方案提案+卡④⑤双审复核)、待办清单营地交互重做条整条删除(五卡全落地,状态机出口)+UI 贴图重构条与图鉴条落地注记+palette_check 双门机检化与 CAMP_HEADER_BAND 令牌退役评估两条新登记(未决先迁);提案-营地色彩与氛围脚本按 art-bible §6.2/camp-scene-prompts 依据行活引用保留。迭代 46 收尾记录见 git 提交 73fc11eb,迭代 45 见 457e0739。 - **迭代位**:迭代 1–48 全部已完成——迭代 48(状态合并累加制+立绘显示档+战斗区背景替换三卡)2026-11-02 合回(合并提交 4c94eee3,独立验收审计首轮窄口径三项缺漏修齐后复审通过;CI 红三项随 fix-iter48ci 追绿,提交 4b626261),批后收尾闭合(2026-11-02):反哺点十六条处置闭合(art-bible v3.36 §6.1 背景三句实装化+§4.1 换色合并登记③ STAGE_BG 退役改指/art-prompts v2.14 产出状态已落位/battle-stage-prompts v1.9 ground_h 已回填与四柱已退役/battle.md 布局字段补 ground_h 与光柱氛围层退役句/HUD框架 B 区行补三关背景+连续地面层/数据配置 v1.2 布局表用途句补地面层高/增益状态 v1.4 字段表词表换代累加+现行十行补护身 defensive_stance 行〔存量漏登补录〕/08-Alpha v1.24 立绘显示清晰度行换在役〔用户裁〕/术语表立「显示档」条〔用户裁〕/art-status-checklist 与 art-assets-checklist 站桩行已交付换代;architecture v1.30 ConfigDB 行 SCHEMA_VERSION 失真句订正〔迭代 41 测试债批遗留义务〕)、目检十项登记体验验证清单 ㊻+迭代 41 测试债批三项补登记 ㊼、产出物退役九件(三需求卡片+反哺点+实现报告+验收审计+停机呈报+代拍板追认单+迭代 41 测试债批实现报告〔遗留义务已清:闸基线换代随工程小件批落地〕)、待办清单三卡条目整条删除(状态机出口)+status_effects.tres 陈旧批注处置〔待用户裁〕与 ui_kit.gd 注释顺带换代两条新登记(未决先迁)。迭代 47 收尾记录见 git 提交 bd54d1f4,迭代 46 见 73fc11eb。
- **下一步**:迭代 48(状态合并累加制+立绘显示档+战斗区背景替换三卡,≈6.1 个工作日)已编排待 `/iter` 发令开工。待编池:冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。 - **下一步**:已写卡待编排三批——效果端口与掷格分件批(T0-T4 估 2.63 工作日)、模态句柄分域批(估 1.9 工作日)、营地五界面真窗口化批(估 2.75 工作日)——待 `/iter-plan` 编排入迭代、`/iter` 发令开工。待编池:冒险前资源配比预设(冻结备选)、迭代 30 原卡②③(2026-10-17 已剔出迭代 30 规划、退回待设计,待美术/设计定稿后重新立卡)。
## 里程碑时间线 ## 里程碑时间线
@@ -81,7 +81,7 @@
| 迭代 45 | 已完成(2026-10-31) | 已退役(git 历史可考) | 2026-10-29 | ≈7 个工作日 | 已退役(git 历史可考) | | 迭代 45 | 已完成(2026-10-31) | 已退役(git 历史可考) | 2026-10-29 | ≈7 个工作日 | 已退役(git 历史可考) |
| 迭代 46 | 已完成(2026-11-01) | 已退役(git 历史可考) | 2026-11-01 | ≈8.625 个工作日 | 已退役(git 历史可考) | | 迭代 46 | 已完成(2026-11-01) | 已退役(git 历史可考) | 2026-11-01 | ≈8.625 个工作日 | 已退役(git 历史可考) |
| 迭代 47 | 已完成(2026-11-01) | 已退役(git 历史可考) | 2026-11-01 | ≈15 个工作日〔用户特批 2026-11-01 超 10 个工作日〕 | 已退役(git 历史可考) | | 迭代 47 | 已完成(2026-11-01) | 已退役(git 历史可考) | 2026-11-01 | ≈15 个工作日〔用户特批 2026-11-01 超 10 个工作日〕 | 已退役(git 历史可考) |
| 迭代 48 | 待开工 | reports/需求卡片-状态合并累加制批-2026-11-01.md<br>reports/需求卡片-立绘显示档批-2026-11-01.md<br>reports/需求卡片-战斗区背景替换-B区舞台插画与地面层-2026-10-31.md | 2026-11-01 | ≈6.1 个工作日 | — | | 迭代 48 | 已完成(2026-11-02) | 已退役(git 历史可考) | 2026-11-01 | ≈6.1 个工作日 | 已退役(git 历史可考) |
- 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。 - 迭代 38 收口为带红合并〔用户特批 2026-10-26〕:09 静态扫描 S13 gdstyle 恶化 2 条经批准记入基线存量红(git 提交 c4c69701),卡② 停卡退上游,处方已于 2026-10-26 修订定稿 v1.3(git 提交 b3ea7532),随「gdstyle 存量债全量清偿」条目波 7 待编排。
- 迭代 39 收口为带红合并〔用户特批 2026-10-27〕:02 EV 锚 goblin 0.9148∉[1.00,1.20](触发器批有意行为改动,fp f74b9a48ef4a)已随 EV 锚重锚批换带归绿(git 提交 ba5105aa);08d 生涯.md:55 行号漂移已随 2026-10-28 批后收尾反哺落文修复归绿。三卡拆分后终局 gdstyle 恶化 2 条(battle_orchestrator max-file-length、level_map_screen max-class-variables)归迭代 40 卡①还债与迭代 41 存量债序列。 - 迭代 39 收口为带红合并〔用户特批 2026-10-27〕:02 EV 锚 goblin 0.9148∉[1.00,1.20](触发器批有意行为改动,fp f74b9a48ef4a)已随 EV 锚重锚批换带归绿(git 提交 ba5105aa);08d 生涯.md:55 行号漂移已随 2026-10-28 批后收尾反哺落文修复归绿。三卡拆分后终局 gdstyle 恶化 2 条(battle_orchestrator max-file-length、level_map_screen max-class-variables)归迭代 40 卡①还债与迭代 41 存量债序列。
+32
View File
@@ -546,3 +546,35 @@
- **红灯信号**:场景图层错位、物件不可点或误路由、动线死路、窗口遮挡关系错误即报缺陷。 - **红灯信号**:场景图层错位、物件不可点或误路由、动线死路、窗口遮挡关系错误即报缺陷。
- **结论回流**:呈现缺陷归待办清单登记新条目。 - **结论回流**:呈现缺陷归待办清单登记新条目。
## ㊻ 迭代 48——三卡实机目检(2026-11-02 随批后收尾登记)
> 三卡合回(2026-11-02,合并提交 4c94eee3):卡① 状态合并累加制批+卡② 立绘显示档批+卡③ 战斗区背景替换批。独立验收审计处置后通过;机检读数与论证详见实现报告(git 提交 4c94eee3 一线可考)。登记不阻塞(2026-10-12 真人检测立规)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | 九件立绘清晰度可接受(含灰矮人 126→96 的 0.76× 缩小显示观感——头号回退候选) | 站桩立绘放大后不再判「看不清」;灰矮人缩小后仍可辨读 |
| 2 | 同屏体量顺序 | 小型<中型<大型读数正确,无「小的比大的大」错位 |
| 3 | 标题屏看台与关卡地图头像 | 两处降采样显示无可感劣化 |
| 4 | 食人魔酋长显示宽 157 | 不碰邻位立绘、不压顶部轮次指示 |
| 5 | 主角三态切换 | 攻击/受击切换时横跳(约 3–6px,三态源宽 88/92/88)不判刺眼;重摆归另批 |
| 6 | 三关背景可辨为不同洞窟、远景有纵深、非贴墙 | 三关观感有区分度,符合 §6.1 构图契约 |
| 7 | 背景无光柱/光带/光源实体 | 正常态与缺图回退态均无 |
| 8 | 地面层观感 | 读作泥土/碎石非瓷砖,中低明度不刺眼 |
| 9 | 站桩与小石台踩在连续地面上;结算期明细带压住地面底带 | 层序正确、无悬空感 |
| 10 | B 区文字可读性 | 轮次牌/演出提示/明细带对背景与地面均可读 |
- **红灯信号**:立绘清晰度不可接受(灰矮人列为头号回退候选)、体量顺序错乱、背景读作贴墙、层序错位即报缺陷。
- **结论回流**:呈现缺陷归待办清单登记新条目;清晰度回退评估重启归待办清单原条目。
## ㊼ 迭代 41 测试债批——回归修复实机目检(2026-11-02 补登记)
> 测试债批合回(2026-10-29,合并提交 43906cdd):02 九套件归绿+S9/S10/S11 归零+四处迭代 41 特许合回遗留产品回归修复(数字色牌守卫/open_victory 改型/站桩补间目标/调参模拟运行态收尾)。原实现报告(已退役,git 提交 d9e5c019 一线可考)第四节登记的实机目检三项当时漏登本清单,2026-11-02 随迭代 48 批后收尾补登记。登记不阻塞(2026-10-12 真人检测立规)。
| # | 目检项 | 判据 |
|---|---|---|
| 1 | dungeon 关数字呈现 | 胜利后数字直接画在棕底上(无奶油色垫牌);暗底对照关(underdark)数字仍垫牌 |
| 2 | 关卡完成三选一停点 | 胜利总结面正常开出并可继续(原运行期报错已修) |
| 3 | 调参面板批量模拟 | 模拟运行期间浮窗置灰、全部局结束后解除 |
- **红灯信号**:数字垫牌错族、胜利总结面开不出、置灰态失灵即报缺陷。
+14 -25
View File
@@ -38,13 +38,23 @@
**状态**:待文档设计 **状态**:待文档设计
#### 状态合并改累加制——同名状态重复授予改加时长(2026-10-31 登记,来源=会话提及) #### status_effects.tres 陈旧批注处置——refresh 叙事批注段(2026-11-02 登记,来源=批次移交)
**实况**:2026-10-31 用户立案并四点裁决闭合:六行 refresh 全改累加/时长不封顶/只加时长、层数与强度不变/累加量=本次授予的生效时长(技能施放行带覆盖时长时按覆盖值)。设计定稿=[增益状态](design/gdd/systems/战斗循环/增益状态.md) v1.3(2026-10-31,合并策略「刷新」改「累加」)+[地图战斗资源](design/gdd/systems/战斗循环/地图战斗资源.md) 削弱行引用句随改。查证记录:全仓设计文档、reports 与 git 全历史均无既往累加制决策,本次为新裁决、非补同步。本裁决消解「空刷新的可见性」条目(累加制下重复授予恒有变化,无空操作授予面)。需求卡片:reports/需求卡片-状态合并累加制批-2026-11-01.md(2026-11-01 写卡会话落位,零待裁点,开工门=U0)。 **实况**:证据=迭代 48 实现报告§六(已退役,git 提交 4c94eee3 可考)——`status_effects.tres` :99-141 批注段含「weaken 叠层改续时 refresh」等陈旧叙事(2026-11-01 用户恢复令在案,卡①范围边界零触碰)。表行值已全部换代累加(schema 词表 refresh 已退役),批注段与表行不同步。处置方式待用户裁:删批注段(沿革查 git 提交史)或改写为现行口径;表文件属游戏代码面,动手须走写卡通道。
**改动面**:文档+游戏代码 **缺口**:还差处置方式裁决——删批注段(沿革查 git 提交史)或改写现行口径,二选一;动手通道(写卡或工程批)随裁决定。
**状态**:文档设计已闭合+已写卡+已编迭代 48 **改动面**:游戏代码
**状态**:待文档设计
#### ui_kit.gd 立绘注释陈旧顺带换代(2026-11-02 登记,来源=批次移交)
**实况**:证据=迭代 48 实现报告§六与验收审计观察项(已退役,git 提交 4c94eee3 可考)——`ui_kit.gd` TEX_HERO_PORTRAIT 行注释仍写「48px 档」(现行=原稿分辨率+显示档缩放),`path_check.py` 一处注释表述也已改指外;零行为,随下次触碰该两件的批次顺带换代(顺带件,不独立出批)。
**改动面**:游戏代码
**状态**:待执行
#### 迭代 43 批后移交小件——能力清单补行+四色墨断言(2026-10-30 登记,来源=批次移交) #### 迭代 43 批后移交小件——能力清单补行+四色墨断言(2026-10-30 登记,来源=批次移交)
@@ -294,16 +304,6 @@
**状态**:待文档设计+待美术设计 **状态**:待文档设计+待美术设计
#### 立绘清晰度回退评估——原稿分辨率+三档显示(2026-10-13 登记,来源=playnote)
**实况**:来源=playnote 用户试玩记录「现在的立绘太丑了,像素化的粒度太低了,导致根本看不清立绘;看是否可以改回用较为高清的图片?还有一个问题是大小的问题……现在地精的图片看起来比熊地精还要大,这并不合理」。2026-10-13 用户裁定:与「第二 / 三关棋盘观感」同属**美术线更新**。**两个子问题均已定**:子问题一=怪物大小比例——体量语义改生物体型(character-design §5.2,弃强度线性映射),2026-11-01 进一步归并为三档绝对显示高;子问题二=像素粒度/是否回退高清——2026-10-14 裁不回退高清(裁决录=[美术审计-cursor会话存档](reports/美术审计-cursor会话存档-2026-10-14.md) §2.2),2026-11-01 会话查明根因=入包前 `dom_block_resize` 把原稿 189px 细节砍到 74–94(现行入包稿与原稿降采样**逐像素相同**),当日用户裁终态方案:**保留原稿分辨率、入包禁再降采样、显示按三档绝对高缩放**(小型 96=地精/巨蜘蛛/灰矮人;中型 144=主角/钩爪恐魔/熊地精;大型 188=食人魔酋长/蛛化卓尔/灰矮人石君王;宽随源比例、NEAREST)。同日裁:2026-10-14「须手绘重产」方向作废,现有形象即终稿、禁改形象。已接受项:五件源高低于档高属放大显示(主角 92/钩爪 94/熊地精 123/地精 90/巨蜘蛛 81);食人魔酋长显示宽 157 超桩盒 150。2026-10-28 为重产新增的色板额度议题(含 `#A79CB8` 去留)按用户令保留在板、另批讨论,本批不动色板。
- 相关文档:[美术圣经](design/art/art-bible.md) §8.2 站桩立绘显示档条(v3.32,显示档定值单点)+ [角色设计](design/art/character-design.md) §5.2/§5.5 + [生图提示词卡](design/art/art-prompts.md) §5.4 按档派生工单(v2.13)+ [08-Alpha版本标准](design/gdd/08-Alpha版本标准.md) v1.22 覆盖行
- 需求卡片:[需求卡片-立绘显示档批-2026-11-01](reports/需求卡片-立绘显示档批-2026-11-01.md)
**改动面**:美术素材+游戏代码
**状态**:美术设计已闭合+已写卡+已编迭代 48
#### 站桩帧动画——Alpha 定版闸前完成(2026-10-06 登记,来源=审计发现) #### 站桩帧动画——Alpha 定版闸前完成(2026-10-06 登记,来源=审计发现)
**实况**:审计报告 P0-3——定稿立绘零帧动画;现行动画全部程序化(死亡碎裂/受击闪白/意图徽标弹入=程序 tween,非帧资产)。用户裁定**动画是较往后的优化,Alpha 版本定版时间点之前完成即可**——当前 Alpha 开发期达成「看上去可游玩」即可。路线未拍板,审计报告三路线供重启时裁决:①**拆件驱动**(报告推荐:定稿立绘切部件〔头/躯干/臂/腿/武器〕+ 节点层级 tween 驱动——零身份漂移、帧数无限、内存小;项目已有先例=shovel_swing 三帧 + 程序化死亡碎裂)②AI 关键姿势 + 人工修 + 程序补帧 ③全 AI 逐帧(不推荐:身份漂移/像素抖动)。前置依赖=「立绘→派生形态」管线(等比整数缩放 + 降色 ≤32 + 脚底基线对齐 + 命名合规)——该管线同时是棋盘小人重出与八敌档位重算的前提。Alpha 出口裁决:列入 Alpha 定版前置清单——定版前完成最小版,路线预选拆件驱动;未完成则顺延 Beta,不占功能迭代。 **实况**:审计报告 P0-3——定稿立绘零帧动画;现行动画全部程序化(死亡碎裂/受击闪白/意图徽标弹入=程序 tween,非帧资产)。用户裁定**动画是较往后的优化,Alpha 版本定版时间点之前完成即可**——当前 Alpha 开发期达成「看上去可游玩」即可。路线未拍板,审计报告三路线供重启时裁决:①**拆件驱动**(报告推荐:定稿立绘切部件〔头/躯干/臂/腿/武器〕+ 节点层级 tween 驱动——零身份漂移、帧数无限、内存小;项目已有先例=shovel_swing 三帧 + 程序化死亡碎裂)②AI 关键姿势 + 人工修 + 程序补帧 ③全 AI 逐帧(不推荐:身份漂移/像素抖动)。前置依赖=「立绘→派生形态」管线(等比整数缩放 + 降色 ≤32 + 脚底基线对齐 + 命名合规)——该管线同时是棋盘小人重出与八敌档位重算的前提。Alpha 出口裁决:列入 Alpha 定版前置清单——定版前完成最小版,路线预选拆件驱动;未完成则顺延 Beta,不占功能迭代。
@@ -326,17 +326,6 @@
**状态**:待美术设计(备选) **状态**:待美术设计(备选)
#### 战斗区背景图替换——B 区舞台插画 + 临时光柱退役(2026-10-07 登记,来源=会话提及)
**实况**:B 区舞台现行=程序化平色底(`UiKit.STAGE_BG`,`battle_stage_view.gd:37-44`)+ 四柱光柱层(`:50-56`/`:145-155`)——临时占位。美术设计已闭合:`design/art/art-bible.md` §6.1(v3.30)定场景构成与图层归属——背景层 = 三关变体 `scene_stage_bg_dungeon/_underdark/_deep_underdark.png`(顶部空区+纵深洞厅远景:远/中/近三层剪影与岩体,三关母题按地精/卓尔/灰矮人;不画近景地面、不画光柱/光带/光源实体;源 = 基准屏宽 × `stage_h`,读 `battle_layout.tres`;按 `board_type` 选图,不走 tint)+ 连续地面层 `scene_stage_ground.png`(泥土/砂砾/碎石;源 = 基准屏宽 × `ground_h`,三关共用、不吃 tint)+ 现有小石台 `scene_stage_plaza.png`;逐条要素、分层提示词与验收 = `design/art/battle-stage-prompts.md` v1.8;`art-prompts.md` §5.1 已转指路;路径与清单同步 `asset-path-map.md` / `art-assets-checklist.md`。候选样张 2026-10-31 过审;作者选定终稿并已入包:地精 dungeon v10c/卓尔 underdark v10c/灰矮人 deep_underdark v10c/地面 v12b(背景 1280×252、地面 1280×100;地面按作者裁保留原亮度 L≈0.132,低于 §2 世界中层带、登记为例外)。art-bible v3.30「B 区舞台背景与共用地面的交付绑定」条与两份清单已同步。**与立绘探顶解耦**:大体档「允许向上溢出盒顶 N px」的判定(2026-10-07 用户裁甲案)**不依赖光柱是否存在**,换背景零返工。**STAGE_BG 平色底随本批一并消化(2026-10-31 用户裁)**:art-bible §4.1 换色合并登记的舞台底对(`STAGE_BG`→`#3E362C`)不单独出批——背景资产接管该绘制面时常量随绘制点退役或改指。
- 相关文档:[art-bible](design/art/art-bible.md) §6.1(v3.30)· [battle-stage-prompts](design/art/battle-stage-prompts.md) v1.8 · [art-prompts](design/art/art-prompts.md) §5.1(指路)· [asset-path-map](design/art/asset-path-map.md) · [art-assets-checklist](design/art/art-assets-checklist.md)
- 需求卡片:[需求卡片-战斗区背景替换-B区舞台插画与地面层-2026-10-31](reports/需求卡片-战斗区背景替换-B区舞台插画与地面层-2026-10-31.md)
- 工作区与过程稿:`artwork/2026-10-30-战斗区背景/`(要素草案已被本卡吸收;候选保存清单 `候选保存清单-2026-10-31.md`)
**改动面**:文档+美术素材+游戏代码
**状态**:美术设计已闭合+已写卡+已编迭代 48
#### 棋盘封印印记图形换代——现件仍是扫雷旗形,改法阵或锁链待设计(2026-10-30 登记,来源=会话提及) #### 棋盘封印印记图形换代——现件仍是扫雷旗形,改法阵或锁链待设计(2026-10-30 登记,来源=会话提及)
**实况**:用户口径=棋盘封印图标现在还是按旧扫雷的做法画成一个旗子,希望换成法阵那样的封印、或锁链;形未定,先做设计讨论再出图。现状证据: **实况**:用户口径=棋盘封印图标现在还是按旧扫雷的做法画成一个旗子,希望换成法阵那样的封印、或锁链;形未定,先做设计讨论再出图。现状证据: