合并(美术圣经去数值化+文档结构搬移批): 两笔合入(77c1d360 结构搬移+85abe37c 去数值化)——design/gdd/ux 上提 design/ux 三目录同级(49 文件链接与声明同步)+art-bible v3.44 全文定值剥离(头注定值单点纪律, hex 清零, 数量面归执行件)+执行件三件(互辨抽测件 E 门子带检查/帧数规格守门测试/token 板两两互查守门测试, manifest 86 套)+art-pipeline-tools 升格执行件门值登记面+下游复写换代九件+待办去数值化条目闭合与欠账六对条目新立。区内凭据: 全仓 gdd/ux 零残留+熵增闸 PASS+流水线闸 PASS(34 条目)+能力审计红 0+七触碰套件与两新套件单跑 all green+--docs 域闸【验收通过】exit=0; 合回前置检查读数见本提交落地态; post-merge 钩子推送触发远端 CI
ci / gates (push) Successful in 7m2s
ci / gates (push) Successful in 7m2s
# Conflicts: # reports/需求卡片-营地交互修复批-2026-11-05.md # 待办清单.md
This commit is contained in:
commit
2a17260c8e
61 files changed
+486
-273
No files matched your search
@@ -24,7 +24,8 @@
|
|||||||
|
|
||||||
## Project Layout
|
## Project Layout
|
||||||
|
|
||||||
- `design/gdd/` — 现行设计文档树(根索引 `02-系统清单.md`,文档增删必须同步;`gdd/ux/` 战斗画面与交互规格)
|
- `design/gdd/` — 系统与概念文档树(根索引 `02-系统清单.md`,文档增删必须同步)
|
||||||
|
- `design/ux/` — 呈现实现设计规格层(屏级布局、交互规格与预览图;与 gdd/ 同级)
|
||||||
- `design/art/` — 美术文档(圣经/角色设计/两份清单/路径图/提示词库与生图操作单);只放 .md 与 `references/` 参考图,审计报告与调研归 `reports/`
|
- `design/art/` — 美术文档(圣经/角色设计/两份清单/路径图/提示词库与生图操作单);只放 .md 与 `references/` 参考图,审计报告与调研归 `reports/`
|
||||||
- `design/engineering/` — 工程规范(五份规约 + architecture + engine-reference)
|
- `design/engineering/` — 工程规范(五份规约 + architecture + engine-reference)
|
||||||
- `design/content-archive/` — 退役内容留底(活文档,2026-10-20 用户裁新立:内容已退役、留底供日后重新过准入;落内文件头部写明所属线)
|
- `design/content-archive/` — 退役内容留底(活文档,2026-10-20 用户裁新立:内容已退役、留底供日后重新过准入;落内文件头部写明所属线)
|
||||||
|
|||||||
@@ -27,11 +27,11 @@
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 一句话视觉规则 | 明快的地牢,轻快的扫荡,仔细的推理——**明亮像素幻想,全年龄,非暗黑**,角色 2~3 头身 |
|
| 一句话视觉规则 | 明快的地牢,轻快的扫荡,仔细的推理——**明亮像素幻想,全年龄,非暗黑**,角色 2~3 头身 |
|
||||||
| 原则一「预告上格」 | 格内绘制优先级 **数字(含色牌)> 小人 > 封印印记 > 变异纹带 > 装饰变体 > 底色**;任何元素禁止遮挡数字字形区;类型微光为底效泛光层,不入遮挡栈 |
|
| 原则一「预告上格」 | 格内绘制优先级 **数字(含色牌)> 小人 > 封印印记 > 变异纹带 > 装饰变体 > 底色**;任何元素禁止遮挡数字字形区;类型微光为底效泛光层,不入遮挡栈 |
|
||||||
| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;数字亮墨直画已开格底(亮墨 L≥0.75 / 已开格底 L 0.08–0.14,art-bible §4.1),对比 ≥4.5:1;色牌 `#F5EAD3` 为复杂格底后备(牌上深墨 L≤0.027);未开格底 L≥0.30、HSV 饱和 ≤0.55 |
|
| 原则二「明亮为皮,明度分档为骨」 | 暖倾向;数字亮墨直画已开格底(对比过 WCAG AA,art-bible §4.1);色牌为复杂格底后备;未开格底亮度地板与饱和上限同 §4.1(门值定值面=互辨抽测件) |
|
||||||
| 原则三「一砖一世界」 | 变体优先换色板不加新资产;危险状态必须**形状+颜色双通道**(色弱灰度可辨) |
|
| 原则三「一砖一世界」 | 变体优先换色板不加新资产;危险状态必须**形状+颜色双通道**(色弱灰度可辨) |
|
||||||
| 类型预读单通道(§4.6.3) | 未开格 = **类型常显微光**(五组色带 §4.2:芥末黄/黄绿/青/紫罗兰/绯红,色相+明度双码,避 300°–345° 禁入带,样张冻结);不呈现极性、不泄危险格与安全格(角嵌形状通道已不存在——微光格只留微光) |
|
| 类型预读单通道(§4.6.3) | 未开格 = **类型常显微光**(五组色带 §4.2:芥末黄/黄绿/青/紫罗兰/绯红,色相+明度双码,避 300°–345° 禁入带,样张冻结);不呈现极性、不泄危险格与安全格(角嵌形状通道已不存在——微光格只留微光) |
|
||||||
| 剪影哲学(§5.1) | **所有角色自带轮廓通道:亮色描边+落影底盘**,识别不依赖背景;四类原型见各条目 |
|
| 剪影哲学(§5.1) | **所有角色自带轮廓通道:亮色描边+落影底盘**,识别不依赖背景;四类原型见各条目 |
|
||||||
| 语义色规则(§4.2) | 红只说危险(危险红 `#A8321F` 单档)、金只说收益(`#F0A828`)、蓝只说己方(`#2E86DE`);封印印记现行色 = 封印黑 `#000000`(色史归 art-bible §4.1);**紫赤 `#8F2F6A` 为 Boss 独占,HSV 色相 300°–345° 全场禁入带**(微光群伤组绯红为类型先验色带域,例外见 §4.2) |
|
| 语义色规则(§4.2) | 红只说危险、金只说收益、蓝只说己方(各语义色定值面=ui_kit,art-bible §4.1);封印印记现行色 = 封印黑(色史归 art-bible §4.1);**紫赤为 Boss 独占,高饱和紫赤域全场禁入带**(带域定值面=互辨抽测件;微光群伤组绯红为类型先验色带域,例外见 §4.2) |
|
||||||
| UI 形状语法(§7.1,§3.3 存方向指导) | 半拟物:面板=石板圆角矩形(与地砖同圆角率),按钮=可按的砖,仪式确认=圆形蜡封;数据区直角细线无纹理 |
|
| UI 形状语法(§7.1,§3.3 存方向指导) | 半拟物:面板=石板圆角矩形(与地砖同圆角率),按钮=可按的砖,仪式确认=圆形蜡封;数据区直角细线无纹理 |
|
||||||
|
|
||||||
**参考图**:`design/art/references/` 三款×2 张(Into the Breach / Moonlighter / Peglin,与圣经点名池一一对应;gungeon 已退场,反面条款见 art-bible §9.2;正面取/弃与反面条款已成文 art-bible §9,反面图证待素材生成后增补)。
|
**参考图**:`design/art/references/` 三款×2 张(Into the Breach / Moonlighter / Peglin,与圣经点名池一一对应;gungeon 已退场,反面条款见 art-bible §9.2;正面取/弃与反面条款已成文 art-bible §9,反面图证待素材生成后增补)。
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
### 1.1 格子样张(砖面形态定稿闸)⚙
|
### 1.1 格子样张(砖面形态定稿闸)⚙
|
||||||
|
|
||||||
- **要什么**:一张按 art-bible §1.4 参数画成的格子风格试验图。**内容清单与验收四项以 art-bible §1.4 为唯一定义处**(含类型微光呈现组),本条只登记生产视角差异:图类型色板变体组至少两套、样张含至少一处砖缘/岛缘厚度与一格装饰立牌示例(§3.2 呈现基准)。
|
- **要什么**:一张按 art-bible §1.4 参数画成的格子风格试验图。**内容清单与验收四项以 art-bible §1.4 为唯一定义处**(含类型微光呈现组),本条只登记生产视角差异:图类型色板变体组至少两套、样张含至少一处砖缘/岛缘厚度与一格装饰立牌示例(§3.2 呈现基准)。
|
||||||
- **风格/规格**:色板 token 直接取 §4.1(掩尘 `#C9AF83`、裸土 `#B39A78`、数字墨三档、封印黑、危险红、奖励金、小人蓝、数字色牌)。
|
- **风格/规格**:色板 token 直接取 ui_kit 常量组(语义岗清单见 art-bible §4.1:掩尘、裸土、数字墨三档、封印黑、危险红、奖励金、小人蓝、数字色牌)。
|
||||||
- **验收**:art-bible §1.4 四项按序判定(数字可读性 WCAG ≥4.5:1 硬指标 → 格态三形与微光互辨灰度可辨 → 焦点预算 → 图类型换皮抽测)。**通过 = 砖面形态与色板冻结**。
|
- **验收**:art-bible §1.4 四项按序判定(数字可读性 WCAG ≥4.5:1 硬指标 → 格态三形与微光互辨灰度可辨 → 焦点预算 → 图类型换皮抽测)。**通过 = 砖面形态与色板冻结**。
|
||||||
- **来源**:⚙ 脚本管线自产——样张是验收闸本身,必须按圣经参数画,无复用意义。
|
- **来源**:⚙ 脚本管线自产——样张是验收闸本身,必须按圣经参数画,无复用意义。
|
||||||
- **现状**:验收标准已成文,**测试未跑**。
|
- **现状**:验收标准已成文,**测试未跑**。
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
- **要什么**:按双舞台布局(战斗画面与扫雷图同屏常驻)出的整屏试验图。要锁的四件事:**角色剪影方向 / 动画方案 / 战斗空间 / 敌人层绘制优先级插入位置**;**敌种呈现形态已裁决:全站桩式(主角同站桩、状态小图标挂血条下),卡片式已弃,正式样张按站桩形态单版出样**。
|
- **要什么**:按双舞台布局(战斗画面与扫雷图同屏常驻)出的整屏试验图。要锁的四件事:**角色剪影方向 / 动画方案 / 战斗空间 / 敌人层绘制优先级插入位置**;**敌种呈现形态已裁决:全站桩式(主角同站桩、状态小图标挂血条下),卡片式已弃,正式样张按站桩形态单版出样**。
|
||||||
- **风格/规格**:敌人剪影按 art-bible §5.1 四类原型出(见 2.2);战斗舞台背景=明亮地窟,紫赤仅 Boss;像素尺寸按已定案两档换算(见 §0 通用规格纪律)。
|
- **风格/规格**:敌人剪影按 art-bible §5.1 四类原型出(见 2.2);战斗舞台背景=明亮地窟,紫赤仅 Boss;像素尺寸按已定案两档换算(见 §0 通用规格纪律)。
|
||||||
- **验收**:战斗表现「一屏样张的验收标准」(已成文)。
|
- **验收**:战斗表现「一屏样张的验收标准」(已成文)。
|
||||||
- **联动**:样张未过,**不启动任何终稿资产与动画设计**(文档明文的排期硬前置);格边长的计算口径不在本清单——现行唯一出处是 [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」,HUD框架只判装板可行性(固定两档分辨率、窗口不可调、格子量增加则格边长相应变小;**档位值已定案 1280×800 + 1920×1080**)。
|
- **联动**:样张未过,**不启动任何终稿资产与动画设计**(文档明文的排期硬前置);格边长的计算口径不在本清单——现行唯一出处是 [battle.md](../ux/battle.md)「棋盘格尺寸公式」,HUD框架只判装板可行性(固定两档分辨率、窗口不可调、格子量增加则格边长相应变小;**档位值已定案 1280×800 + 1920×1080**)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+99
-100
@@ -1,7 +1,8 @@
|
|||||||
# 美术圣经(Art Bible)— Dungeon Sweeper
|
# 美术圣经(Art Bible)— Dungeon Sweeper
|
||||||
|
|
||||||
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.43,历次修订明细见 git 提交史
|
> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 状态:**第 1–9 节定稿**;现行为 v3.44,历次修订明细见 git 提交史
|
||||||
>
|
>
|
||||||
|
> **定值单点纪律(2026-11-07 用户裁,全文生效)**:本圣经只写概念、规则与方向,**不写具体数值定值**——色值、尺寸、阈值、档位、坐标、帧数等数量面的唯一事实源=执行件:代码常量、机检件与测试面守门件、数据表、golden 基线。本文提及定值时一律写指针句(「定值面=〈执行件〉」);工具与检查件的用法登记面=[art-pipeline-tools](art-pipeline-tools.md)。例外=行业标准的引用名(如 WCAG AA)与数据索引(表路径)。
|
||||||
> **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 头身。
|
||||||
> 参考池(用户审阅选定,三者相融):**Into the Breach**(网格信息分层;雷图棋盘呈现基准 = 其战棋地块质感 × 正俯视角,见 §3.2)× **Moonlighter**(明亮像素地牢质感)× **Peglin**(明快全年龄地牢色彩);参考截图存于 `design/art/references/`(三款 × 2 张,与点名池一一对应);Enter the Gungeon 不作参考,反面条款见 §9.2。
|
> 参考池(用户审阅选定,三者相融):**Into the Breach**(网格信息分层;雷图棋盘呈现基准 = 其战棋地块质感 × 正俯视角,见 §3.2)× **Moonlighter**(明亮像素地牢质感)× **Peglin**(明快全年龄地牢色彩);参考截图存于 `design/art/references/`(三款 × 2 张,与点名池一一对应);Enter the Gungeon 不作参考,反面条款见 §9.2。
|
||||||
@@ -30,7 +31,7 @@
|
|||||||
|
|
||||||
**原则二|明亮为皮,明度分档为骨**(取自 Moonlighter、Peglin;锚定 P1 可读性前提、P4 探险氛围)
|
**原则二|明亮为皮,明度分档为骨**(取自 Moonlighter、Peglin;锚定 P1 可读性前提、P4 探险氛围)
|
||||||
|
|
||||||
取 Moonlighter 的暖质地砖与亲和冒险者气质、Peglin 的明快全年龄洞穴色彩:全局暖倾向、无压抑。可读性由**格底明度分档**承载——已开格(数字所在格)明度走世界底层档(§2 明度分层;格态语义见《排雷玩法》;美术侧据此未开格走受光墙顶档、已开格走挖出空间沉暗档,与 §8.5 图底分离同轴),亮族数字墨直接画在格底上,直画对比 ≥4.5:1 恒成立。**数字色牌为后备手段**——仅复杂格底(物件纹样/变异纹带/微光叠加致格底对比不足)时垫牌后备(画法 §3.3、色值 §4.1)。格子本体美术放开:纹理、材质、装饰变体、类型纹样皆可入画;格底参数域见 §4.1 硬指标(分档明度域、饱和上限),仍避 Boss 禁入色相带。与参考之别:ITB 以半透明压暗板承载信息;本作格底功能分档(信息可读性服务)。验收:机检〈1–8 全档数字对所在已开格底对比 ≥4.5:1〉
|
取 Moonlighter 的暖质地砖与亲和冒险者气质、Peglin 的明快全年龄洞穴色彩:全局暖倾向、无压抑。可读性由**格底明度分档**承载——已开格(数字所在格)明度走世界底层档(§2 明度分层;格态语义见《排雷玩法》;美术侧据此未开格走受光墙顶档、已开格走挖出空间沉暗档,与 §8.5 图底分离同轴),亮族数字墨直接画在格底上,直画对比恒过 WCAG AA 门槛。**数字色牌为后备手段**——仅复杂格底(物件纹样/变异纹带/微光叠加致格底对比不足)时垫牌后备(画法 §3.3、色值 §4.1)。格子本体美术放开:纹理、材质、装饰变体、类型纹样皆可入画;格底参数域见 §4.1 硬指标(分档明度域、饱和上限),仍避 Boss 禁入色相带。与参考之别:ITB 以半透明压暗板承载信息;本作格底功能分档(信息可读性服务)。验收:机检〈1–8 全档数字对所在已开格底对比过 WCAG AA〉
|
||||||
|
|
||||||
*设计测试:当格子美术与数字可读性冲突时,先调格底明度档,复杂格底垫色牌后备,不动格子画。*
|
*设计测试:当格子美术与数字可读性冲突时,先调格底明度档,复杂格底垫色牌后备,不动格子画。*
|
||||||
|
|
||||||
@@ -50,35 +51,35 @@
|
|||||||
|
|
||||||
**验收项按序判定,第一项不过 = 整张否决(数字可读性定风格,风格服从可读)**:
|
**验收项按序判定,第一项不过 = 整张否决(数字可读性定风格,风格服从可读)**:
|
||||||
|
|
||||||
1. **第一验收项|数字可读性(硬指标,可测)**:1–8 全档数字对其所在**已开格底**直画 WCAG 对比 ≥4.5:1(参数域见 §4.1:已开格底走世界底层档、棋盘数字墨亮族);复杂格底(物件纹样/变异纹带/微光叠加致直画对比不足)启用**色牌后备**,牌墨组合 ≥4.5:1(色牌与牌上深墨族数字的定值见 §4.1),牌缘灰度可分;0.5× 缩放抽检数字仍可辨;纹带/裂纹/巢穴纹/物件纹样禁止侵入数字字形占位区(砖心留白,§3.2)。验收:机检〈1–8 数字对已开格底直画与牌墨组合对比均 ≥4.5:1〉
|
1. **第一验收项|数字可读性(硬指标,可测)**:1–8 全档数字对其所在**已开格底**直画 WCAG 对比过 AA 门槛(参数域见 §4.1:已开格底走世界底层上沿带、棋盘数字墨亮族);复杂格底(物件纹样/变异纹带/微光叠加致直画对比不足)启用**色牌后备**,牌墨组合同门槛(色牌与牌上深墨族数字定值面=ui_kit 色牌与主墨枚),牌缘灰度可分;缩放抽检数字仍可辨;纹带/裂纹/巢穴纹/物件纹样禁止侵入数字字形占位区(砖心留白,§3.2)。验收:机检〈1–8 数字对已开格底直画与牌墨组合对比均过门槛〉
|
||||||
2. **格态三形可辨(灰度通道)**:未开/已开/雷三态转灰度截图后仍可逐格分类;明度差(墙亮/空间暗)与碎裂形同为合法分类通道,双通道冗余(§3.2 完整度叙事)。装饰变体禁止制造新的分类特征——同一格态下带与不带变体的灰度差异禁止成为三态分类线索。色弱模拟(去色相)下封印印记、巢穴纹不与裂纹混淆。**五组类型微光互辨**:色弱玩家的类型主通道 = 微光,色相+明度双码,微光以明度梯度承载分组(组内不细分,属 §2 信息面层内梯度);微光禁止侵入数字字形占位区,明度梯度禁止压破格底明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉
|
2. **格态三形可辨(灰度通道)**:未开/已开/雷三态转灰度截图后仍可逐格分类;明度差(墙亮/空间暗)与碎裂形同为合法分类通道,双通道冗余(§3.2 完整度叙事)。装饰变体禁止制造新的分类特征——同一格态下带与不带变体的灰度差异禁止成为三态分类线索。色弱模拟(去色相)下封印印记、巢穴纹不与裂纹混淆。**五组类型微光互辨**:色弱玩家的类型主通道 = 微光,色相+明度双码,微光以明度梯度承载分组(组内不细分,属 §2 信息面层内梯度);微光禁止侵入数字字形占位区,明度梯度禁止压破格底明度档(三态分类不受扰)。验收:目检〈三态灰度逐格可分类;五组微光互辨;色弱模拟下封印印记、巢穴纹不与裂纹混淆〉
|
||||||
3. **焦点预算成立(§3.4)**:任意一格至多一个完整凸形;数字所在格无第二焦点。验收:目检〈任一格至多一个完整凸形,数字所在格无第二焦点〉
|
3. **焦点预算成立(§3.4)**:任意一格至多一个完整凸形;数字所在格无第二焦点。验收:目检〈任一格至多一个完整凸形,数字所在格无第二焦点〉
|
||||||
4. **图类型换皮抽测(§4.3)**:变体组中数字墨亮族三档、封印黑、危险红、奖励金、小人蓝、数字色牌(后备件)、类型微光五组恒定不动;变体格底仍过第 1、2 项指标。验收:机检〈换皮后不变槽色值恒定,变体格底仍过第 1、2 项〉
|
4. **图类型换皮抽测(§4.3)**:变体组中数字墨亮族三档、封印黑、危险红、奖励金、小人蓝、数字色牌(后备件)、类型微光五组恒定不动;变体格底仍过第 1、2 项指标。验收:机检〈换皮后不变槽色值恒定,变体格底仍过第 1、2 项〉
|
||||||
|
|
||||||
**判定与回退**:第 1 项不过时按原则二设计测试回退——先调格底明度档,复杂格底垫色牌后备,禁止缩字号换字形逃避;第 2–4 项不过时修形不修数。样张通过 = 砖面形态与色板冻结;新增图类型/变异色板须重跑本测试(§4.3)。执行时机:正式砖面资产开工前;《HUD框架》以本节为引用依据。验收:机检〈样张机检断言集全绿后方可冻结砖面形态与色板〉
|
**判定与回退**:第 1 项不过时按原则二设计测试回退——先调格底明度档,复杂格底垫色牌后备,禁止缩字号换字形逃避;第 2–4 项不过时修形不修数。样张通过 = 砖面形态与色板冻结;新增图类型/变异色板须重跑本测试(§4.3)。执行时机:正式砖面资产开工前;《HUD框架》以本节为引用依据。验收:机检〈样张机检断言集全绿后方可冻结砖面形态与色板〉
|
||||||
|
|
||||||
**整屏样张闸**:格子样张验"格",整屏样张验"屏"——战斗屏/关卡屏/菜单屏/营地屏各出一张整屏样张,验收四项:①全部文字(含菜单/说明/tooltip/按钮)对其直接背景 ≥4.5:1(WCAG AA),大字(≥18px 或加粗档)底线 3:1、目标 4.5:1;②明度分层三档带成立(信息面层 > 世界中层 > 世界底层,层间灰度可分);③整屏焦点预算(§3.4:首焦唯一——数字区/立绘/主按钮,无第二焦点竞争;负空间服务焦点,不属空窗);④文字禁直接压纹理底(垫容器或罩层)。验收顺序 = **方向稿目检先行**(防"机检过闸但气质否决"式返工),目检过后机检冻结。执行时机 = 屏级视觉落码开工前;过闸前一切屏级视觉为占位临时态(§7.1 完成条款)。**样张判定物的产出手段与素材输入级别不进圣经定值**——圣经只定样张要验什么,不定样张以何种手段产出、也不定它取哪一级别素材输入。验收:机检〈整屏样张四项断言全绿,且目检先行过审〉
|
**整屏样张闸**:格子样张验"格",整屏样张验"屏"——战斗屏/关卡屏/菜单屏/营地屏各出一张整屏样张,验收四项:①全部文字(含菜单/说明/tooltip/按钮)对其直接背景过 WCAG AA,大字按 WCAG 大字档(底线与目标分级);②明度分层三档带成立(信息面层 > 世界中层 > 世界底层,层间灰度可分);③整屏焦点预算(§3.4:首焦唯一——数字区/立绘/主按钮,无第二焦点竞争;负空间服务焦点,不属空窗);④文字禁直接压纹理底(垫容器或罩层)。验收顺序 = **方向稿目检先行**(防"机检过闸但气质否决"式返工),目检过后机检冻结。执行时机 = 屏级视觉落码开工前;过闸前一切屏级视觉为占位临时态(§7.1 完成条款)。**样张判定物的产出手段与素材输入级别不进圣经定值**——圣经只定样张要验什么,不定样张以何种手段产出、也不定它取哪一级别素材输入。验收:机检〈整屏样张四项断言全绿,且目检先行过审〉
|
||||||
|
|
||||||
**战斗一屏样张**:整屏样张闸已过——整屏四项机检全绿,方向稿目检已通过(用户实机目检核销,沿革查 git 提交史)
|
**战斗一屏样张**:整屏样张闸已过——整屏四项机检全绿,方向稿目检已通过(用户实机目检核销,沿革查 git 提交史)
|
||||||
|
|
||||||
**样张现状**:格子样张已冻结,冻结凭据 = §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 亮墨三档直画 + 色牌后备(值见 §4.1);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值均以 §4.1/§8.2 对应 owner 表为准〉
|
**样张现状**:格子样张已冻结,冻结凭据 = §4.1/§8.2 定值表;样张 v3 产物原件已丢失、未入 git。现行冻结态:色板与帧数档维持冻结;数字形制 = 亮墨三档直画 + 色牌后备(定值面=ui_kit 常量组与帧数守门测试);新增图类型/变异色板须重跑本节测试。验收:机检〈冻结项定值以对应执行件为准(色板=ui_kit 常量组、帧数=守门测试)〉
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. 氛围与情绪(Mood & Atmosphere)
|
## 2. 氛围与情绪(Mood & Atmosphere)
|
||||||
|
|
||||||
> 本节服从第 1 节宣言「明快的地牢,轻快的扫荡,仔细的推理」。能量值为全作统一 0–10 刻度:0 静谧,10 沸腾。
|
> 本节服从第 1 节宣言「明快的地牢,轻快的扫荡,仔细的推理」。能量值为全作统一 0–10 刻度:0 静谧,10 沸腾;八拍只有相对档序不落数值——由低到高:战斗失败 → 挖掘 → 菜单与元进度 → 下探过渡 → Boss 遭遇 → 战斗胜利 → 轮末结算 → 清图奖励(各拍档序见各节「能量」行)。
|
||||||
>
|
>
|
||||||
> **明度分层(硬规则)**:明度按视觉层分带——**信息面层**(数字/UI 数据/预告/语义标识)最高、**世界中层**(格底顶面/角色/物件)居中、**世界底层**(背景/纵深/远景/已开空间)可更低;层间明度差服务空间纵深与光照(Moonlighter 式洞穴层次)。类型微光的明度梯度(§4.2)属信息面层内梯度,不扰世界层明度档。验收:目检〈三档明度带层间灰度可分〉
|
> **明度分层(硬规则)**:明度按视觉层分带——**信息面层**(数字/UI 数据/预告/语义标识)最高、**世界中层**(格底顶面/角色/物件)居中、**世界底层**(背景/纵深/远景/已开空间)可更低;层间明度差服务空间纵深与光照(Moonlighter 式洞穴层次)。类型微光的明度梯度(§4.2)属信息面层内梯度,不扰世界层明度档。验收:目检〈三档明度带层间灰度可分〉
|
||||||
>
|
>
|
||||||
> **世界底层两子带**:世界底层拆两条子带——**底层下沿带 L 0.014–0.06**(远景、洞窟纵深、B 区舞台底、屏幕根底)与**底层上沿带 L 0.08–0.14**(已开格底、迷雾记忆态合成底),子带间隔 ≥0.02。拆两子带用于解决**世界底层内部** B 区舞台底(L=0.036)与 D 区已开格底(L≈0.10)同层难辨的问题——两者同属世界底层,单带下跨度 0.126 吃掉层间间隔 0.08,灰度图上会表现为两个不同的底。§1.4 整屏②项约束的是层间可分(底层上沿 0.14 对世界中层下沿 0.22,差 0.08 本就满足),②项不约束同层内可分,故本条不属②项的成立要件,而是世界底层内部的可读性纪律。验收:机检〈同一屏的世界底层成员全部落进两条子带之一,两子带 L 区间不重叠且间隔 ≥0.02〉
|
> **世界底层两子带**:世界底层拆两条子带——**底层下沿带**(远景、洞窟纵深、B 区舞台底、屏幕根底)与**底层上沿带**(已开格底、迷雾记忆态合成底),两子带区间不重叠、间隔不小于门值。拆两子带解决**世界底层内部** B 区舞台底与 D 区已开格底同层难辨的问题(同属世界底层、灰度图上须可分)。§1.4 整屏②项约束的是层间可分,②项不约束同层内可分,故本条不属②项的成立要件,而是世界底层内部的可读性纪律。**区间数值与间隔门值定值面=图类型色板互辨抽测执行件**(背景侧不侵入上沿带与结构间隔由其执法;已开格底侧由渲染装载的归一化目标常量承载、渲染面对比判据由对比探针兜)。验收:机检〈背景件不侵入上沿带、两子带结构间隔达标(互辨抽测件);渲染面归一化落带(棋盘装载链)〉
|
||||||
|
|
||||||
### 2.1 挖掘阶段(核心状态,占时最长)
|
### 2.1 挖掘阶段(核心状态,占时最长)
|
||||||
|
|
||||||
- **主情绪**:棋手式清明专注——视线始终被数字牵引,画面无一处杂音抢焦;久推不生视觉疲劳
|
- **主情绪**:棋手式清明专注——视线始终被数字牵引,画面无一处杂音抢焦;久推不生视觉疲劳
|
||||||
- **色彩性格**:暖石色低饱和打底(世界中层),高饱和高亮只属于信息面层(数字与封印印记)
|
- **色彩性格**:暖石色低饱和打底(世界中层),高饱和高亮只属于信息面层(数字与封印印记)
|
||||||
- **氛围形容词**:清爽、井然、可读、耐心
|
- **氛围形容词**:清爽、井然、可读、耐心
|
||||||
- **能量**:2/10
|
- **能量**:低位(八拍序第 2)
|
||||||
- **承载元素**:可挖域**接触带呼吸微光**——光画在英雄格周界的接触面上(正交邻墙 = 整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;画法 §3.2,蓝族色 §4.2)——画面里唯一在动的,是玩家的思路。验收:目检〈挖掘期仅接触带微光在动,棋盘与数字静止〉
|
- **承载元素**:可挖域**接触带呼吸微光**——光画在英雄格周界的接触面上(正交邻墙 = 整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;画法 §3.2,蓝族色 §4.2)——画面里唯一在动的,是玩家的思路。验收:目检〈挖掘期仅接触带微光在动,棋盘与数字静止〉
|
||||||
|
|
||||||
### 2.2 轮末自动战斗结算
|
### 2.2 轮末自动战斗结算
|
||||||
@@ -86,7 +87,7 @@
|
|||||||
- **主情绪**:延迟兑现的清算爽感——扫雷之因逐行兑现为战果;完美封印(概念定义与兑付结构见《地图战斗资源》)的高光兑现——结算带高光行,以其为全场喝彩级的最高反馈档
|
- **主情绪**:延迟兑现的清算爽感——扫雷之因逐行兑现为战果;完美封印(概念定义与兑付结构见《地图战斗资源》)的高光兑现——结算带高光行,以其为全场喝彩级的最高反馈档
|
||||||
- **色彩性格**:情绪由色相与饱和承载——金橙主导、饱和拉高,明度分层不动;数字色转译为弹道色沿行推进
|
- **色彩性格**:情绪由色相与饱和承载——金橙主导、饱和拉高,明度分层不动;数字色转译为弹道色沿行推进
|
||||||
- **氛围形容词**:酣畅、递进、一气呵成
|
- **氛围形容词**:酣畅、递进、一气呵成
|
||||||
- **能量**:7/10,随连击爬升
|
- **能量**:高位(八拍序第 7),随连击爬升
|
||||||
- **承载元素**:兑现光带逐行横扫棋盘,开格化箭雨、印记化暴击砸向敌人,因果全程可见可归因。验收:目检〈兑现光带逐行横扫、因果可见可归因〉
|
- **承载元素**:兑现光带逐行横扫棋盘,开格化箭雨、印记化暴击砸向敌人,因果全程可见可归因。验收:目检〈兑现光带逐行横扫、因果可见可归因〉
|
||||||
|
|
||||||
### 2.3 清图奖励与换图
|
### 2.3 清图奖励与换图
|
||||||
@@ -94,7 +95,7 @@
|
|||||||
- **主情绪**:短促丰收——宝箱揭盖式的喜悦,三五秒即收,不拖节奏
|
- **主情绪**:短促丰收——宝箱揭盖式的喜悦,三五秒即收,不拖节奏
|
||||||
- **色彩性格**:全屏饱和峰值:金粒喷泉与彩纸迸发,饱和瞬时拉满后回落;明度分层不动
|
- **色彩性格**:全屏饱和峰值:金粒喷泉与彩纸迸发,饱和瞬时拉满后回落;明度分层不动
|
||||||
- **氛围形容词**:丰收、轻快、干脆
|
- **氛围形容词**:丰收、轻快、干脆
|
||||||
- **能量**:8/10,尖峰后速降
|
- **能量**:全场峰值(八拍序第 8),尖峰后速降
|
||||||
- **承载元素**:最后一格碎砖中喷出的 GP 喷泉,叮当落入 UI 钱袋。验收:目检〈金粒喷泉短促收敛,饱和峰值后回落〉
|
- **承载元素**:最后一格碎砖中喷出的 GP 喷泉,叮当落入 UI 钱袋。验收:目检〈金粒喷泉短促收敛,饱和峰值后回落〉
|
||||||
|
|
||||||
### 2.4 战斗胜利
|
### 2.4 战斗胜利
|
||||||
@@ -102,7 +103,7 @@
|
|||||||
- **主情绪**:从容自信——「我算对了」的盖章确认;克制而非狂欢,胜利属于头脑
|
- **主情绪**:从容自信——「我算对了」的盖章确认;克制而非狂欢,胜利属于头脑
|
||||||
- **色彩性格**:暖白与金,不用红与爆炸
|
- **色彩性格**:暖白与金,不用红与爆炸
|
||||||
- **氛围形容词**:笃定、舒展、体面
|
- **氛围形容词**:笃定、舒展、体面
|
||||||
- **能量**:6/10
|
- **能量**:中位(八拍序第 6)
|
||||||
- **承载元素**:棋盘中央落下一枚金色蜡封,碎砖自动拼出胜利纹章。验收:方向性
|
- **承载元素**:棋盘中央落下一枚金色蜡封,碎砖自动拼出胜利纹章。验收:方向性
|
||||||
|
|
||||||
### 2.5 战斗失败(冒险终结)
|
### 2.5 战斗失败(冒险终结)
|
||||||
@@ -110,7 +111,7 @@
|
|||||||
- **主情绪**:温柔的惋惜与「再来一次」的邀请——有分量、不惩罚,像合上一册冒险日志
|
- **主情绪**:温柔的惋惜与「再来一次」的邀请——有分量、不惩罚,像合上一册冒险日志
|
||||||
- **色彩性格**:情绪由色相承载——色相转暖灰掺暮蓝,明度分层不动;全作禁血红与黑场,唯此一拍最静
|
- **色彩性格**:情绪由色相承载——色相转暖灰掺暮蓝,明度分层不动;全作禁血红与黑场,唯此一拍最静
|
||||||
- **氛围形容词**:惋惜、安静、余温、可再来
|
- **氛围形容词**:惋惜、安静、余温、可再来
|
||||||
- **能量**:1/10
|
- **能量**:全场最低(八拍序第 1)
|
||||||
- **承载元素**:小人坐在碎砖上摇头掸灰,落下的封印印记逐枚化作光点收回行囊。验收:目检〈无血红与黑场;色相转暖灰掺暮蓝〉
|
- **承载元素**:小人坐在碎砖上摇头掸灰,落下的封印印记逐枚化作光点收回行囊。验收:目检〈无血红与黑场;色相转暖灰掺暮蓝〉
|
||||||
|
|
||||||
### 2.6 Boss 与精英遭遇
|
### 2.6 Boss 与精英遭遇
|
||||||
@@ -118,7 +119,7 @@
|
|||||||
- **主情绪**:被注视的郑重感——预告更华丽,但预告上格规则不变,掌控仍在玩家
|
- **主情绪**:被注视的郑重感——预告更华丽,但预告上格规则不变,掌控仍在玩家
|
||||||
- **色彩性格**:格底保持基准,Boss 专属紫赤为全场唯一占用的色相——郑重感来自色相独占,不来自压暗
|
- **色彩性格**:格底保持基准,Boss 专属紫赤为全场唯一占用的色相——郑重感来自色相独占,不来自压暗
|
||||||
- **氛围形容词**:郑重、锋利、仪式感
|
- **氛围形容词**:郑重、锋利、仪式感
|
||||||
- **能量**:5/10,静水深流,结算时才沸腾
|
- **能量**:中位偏下(八拍序第 5),静水深流,结算时才沸腾
|
||||||
- **承载元素**:Boss 影子先于本体爬过棋盘,扫过处短暂留下紫赤足迹(纯视觉预告;是否绑定机制由战斗侧 GDD 定夺)。验收:目检〈紫赤足迹为纯视觉预告;高饱和紫赤仅 Boss 战占用〉
|
- **承载元素**:Boss 影子先于本体爬过棋盘,扫过处短暂留下紫赤足迹(纯视觉预告;是否绑定机制由战斗侧 GDD 定夺)。验收:目检〈紫赤足迹为纯视觉预告;高饱和紫赤仅 Boss 战占用〉
|
||||||
|
|
||||||
### 2.7 下探过渡(关卡间)
|
### 2.7 下探过渡(关卡间)
|
||||||
@@ -126,7 +127,7 @@
|
|||||||
- **主情绪**:纵深的期待——「下面还有一层」的探险引力,如降落时一瞬失重
|
- **主情绪**:纵深的期待——「下面还有一层」的探险引力,如降落时一瞬失重
|
||||||
- **色彩性格**:整层色板随图类型(board_type)递进换挡,以色相层进预告「更深更险」;世界层明度带允许随深度整体微移(空间纵深表达,非情绪;候选,待整屏样张冻结)
|
- **色彩性格**:整层色板随图类型(board_type)递进换挡,以色相层进预告「更深更险」;世界层明度带允许随深度整体微移(空间纵深表达,非情绪;候选,待整屏样张冻结)
|
||||||
- **氛围形容词**:纵深、期待、换气、进阶
|
- **氛围形容词**:纵深、期待、换气、进阶
|
||||||
- **能量**:4/10
|
- **能量**:中位偏下(八拍序第 4)
|
||||||
- **承载元素**:镜头沿竖井匀速下移,两侧砖层色板渐变,预演下一层主色。验收:目检〈下探过渡中砖层色板随图类型渐变〉
|
- **承载元素**:镜头沿竖井匀速下移,两侧砖层色板渐变,预演下一层主色。验收:目检〈下探过渡中砖层色板随图类型渐变〉
|
||||||
|
|
||||||
### 2.8 菜单与元进度(存档/永久强化)
|
### 2.8 菜单与元进度(存档/永久强化)
|
||||||
@@ -134,7 +135,7 @@
|
|||||||
- **主情绪**:可靠的营地感——成长可见、可点、可规划,归来即蓄势
|
- **主情绪**:可靠的营地感——成长可见、可点、可规划,归来即蓄势
|
||||||
- **色彩性格**:全作最暖:烛光黄与木色,中等饱和,无棋盘式高对比
|
- **色彩性格**:全作最暖:烛光黄与木色,中等饱和,无棋盘式高对比
|
||||||
- **氛围形容词**:温暖、笃实、归属
|
- **氛围形容词**:温暖、笃实、归属
|
||||||
- **能量**:3/10
|
- **能量**:低位(八拍序第 3)
|
||||||
- **承载元素**:**一张可点击的营地场景图**——远景天空与远山,中景木围墙(密排竖木桩、桩顶削尖、不透缝无横木)与半开的营地大门,近景中央的篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板;点画面里的物件进入对应界面(冒险/锻造工坊/秘宝匣/生涯记录/天赋树/图鉴/离开营地)。钥石余额常驻画面顶部的一行小 HUD 栏。场景构成、七物件绑定与呈现位见 §6.2。验收:目检〈点营地物件进入对应界面,钥石余额常驻顶部 HUD 栏〉
|
- **承载元素**:**一张可点击的营地场景图**——远景天空与远山,中景木围墙(密排竖木桩、桩顶削尖、不透缝无横木)与半开的营地大门,近景中央的篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板;点画面里的物件进入对应界面(冒险/锻造工坊/秘宝匣/生涯记录/天赋树/图鉴/离开营地)。钥石余额常驻画面顶部的一行小 HUD 栏。场景构成、七物件绑定与呈现位见 §6.2。验收:目检〈点营地物件进入对应界面,钥石余额常驻顶部 HUD 栏〉
|
||||||
|
|
||||||
### 2.9 状态间区分度自检
|
### 2.9 状态间区分度自检
|
||||||
@@ -164,15 +165,15 @@
|
|||||||
- **装饰变体(未开格氛围层)**:覆尘完整砖之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三
|
- **装饰变体(未开格氛围层)**:覆尘完整砖之上叠加裂纹/碎石斑/物件级点缀等装饰。物件级装饰(小石块/陶片/骨殖等)须走**专属装饰形状家族**(与信息元素形状语言隔离、灰度下不与任何逻辑元素同形),数量配额按图类型定(候选 3–5 种,样张已冻结,§1.4),一律残缺、内凹、低对比而自然后退(§3.4);零信息纪律(分布随机、与雷/安/类型零相关、灰度下禁止制造新分类特征、分布每板一次跨轮不复掷)以原则三为准,此处不赘。验收:目检〈物件级装饰不与任何逻辑元素同形;装饰残缺低对比后退〉 ←原三
|
||||||
- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于砖缘,砖心与数字字形占位区留白(已开格仍承载数字);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且砖心留白;巢穴纹更凶一档〉 ←原三;P3
|
- **结果整格表达(已开格)**:已开格按当格结果整格表达(结果清单见原则三);画法——产资源格的家族物件纹样用 §3.1 道具点剪影语言(直线几何体)角嵌于砖缘,砖心与数字字形占位区留白(已开格仍承载数字);危险格巢穴纹较已开格更凶一档,形状+颜色双通道。验收:目检〈产资源格嵌家族纹样且砖心留白;巢穴纹更凶一档〉 ←原三;P3
|
||||||
- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(微光格只留微光)。验收:目检〈微光格内零角嵌/箭头/加号类附加形〉 ←原一;原三
|
- **未开格预读通道(微光单通道)**:类型预读 = 类型微光单通道(色相+明度双码,色带 §4.2);色弱类型主通道 = 微光明度梯度(组粒度——组间互辨;§2 微光明度例外);格内零角嵌/箭头/加号类附加形(微光格只留微光)。验收:目检〈微光格内零角嵌/箭头/加号类附加形〉 ←原一;原三
|
||||||
- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;动作面见《排雷玩法》)——封印动作落在格上的印记称封印印记。**形 = 法阵**:一圈外环+环内一个十字,十字四端顶到环内沿、与环连成一体——两层构成取法阵通用骨架(外环=圈定范围,环内图形=力量图形,非指特定作品):环=封印圈定,十字=钉住此格。**画法 = 参数化绘制**(着色器按格边实时画环与十字,不出贴图):格边 26–46px 连续可变,任何贴图源都得非整数缩放(32px 源在 28 格缩到 0.875、在 46 格放到 1.44),像素必宽窄不均;参数化按比例画,任意格边清晰。**环外光圈**:印记外面一圈**压暗光**(纯黑只加透明度)——自环外缘起、向外衰减到格边为止、**不外溢邻格**,作用 =「此格被罩住」;禁中心亮、禁色相、禁呼吸。**尺寸定值**见 §8.2「封印印记参数表」(本处不复述数值)。**色** = 封印黑 `#000000`(§4.1),光圈只改 alpha、不新增色。**占位**:印记居格心,环外留 9% 格宽给光圈(见 §8.2);封印印记只出现在未开格,不与数字同格。格内栈位见 §1.2;层序纪律——印记层低于小人,且迷雾态(区外全黑/记忆态)隐藏(§6.5「封印随格隐没」)。封印特效两件:常显形态即本件,施印瞬间未实装。战末金蜡封徽记仍取贴图 `seal_mark.png`(与棋盘侧参数化绘制并存,两处互不依赖)。验收:目检〈环径占格宽 82%±1px;光圈只在环外且不出格;纯黑无色相〉 ←原一;P2
|
- **封印印记**:封印动作的叙事呈现 = **封印**(玩家可见专名,术语定义见 [术语表](../gdd/术语表.md)「封印」条;动作面见《排雷玩法》)——封印动作落在格上的印记称封印印记。**形 = 法阵**:一圈外环+环内一个十字,十字四端顶到环内沿、与环连成一体——两层构成取法阵通用骨架(外环=圈定范围,环内图形=力量图形,非指特定作品):环=封印圈定,十字=钉住此格。**画法 = 参数化绘制**(着色器按格边实时画环与十字,不出贴图):格边随板型连续可变,任何贴图源都得非整数缩放、像素必宽窄不均;参数化按比例画,任意格边清晰。**环外光圈**:印记外面一圈**压暗光**(纯黑只加透明度)——自环外缘起、向外衰减到格边为止、**不外溢邻格**,作用 =「此格被罩住」;禁中心亮、禁色相、禁呼吸。**尺寸定值**见 §8.2「封印印记参数表」(本处不复述数值)。**色** = 封印黑(§4.1,定值面=ui_kit 封印黑枚),光圈只改 alpha、不新增色。**占位**:印记居格心,环外留一档格宽比例给光圈(定值面=ui_kit 封印常量组,见 §8.2 指针);封印印记只出现在未开格,不与数字同格。格内栈位见 §1.2;层序纪律——印记层低于小人,且迷雾态(区外全黑/记忆态)隐藏(§6.5「封印随格隐没」)。封印特效两件:常显形态即本件,施印瞬间未实装。战末金蜡封徽记仍取贴图 `seal_mark.png`(与棋盘侧参数化绘制并存,两处互不依赖)。验收:目检〈渲染帧量环径占格宽比例与定值面常量一致(±1px 容差);光圈只在环外且不出格;纯黑无色相〉 ←原一;P2
|
||||||
- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间)一侧、不进墙格(与装饰变体零冲突,数字砖心不涉);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边〉 ←§2.1;§4.2;P1
|
- **可挖域接触带微光(交互反馈层)**:挖掘期,英雄格周界与可挖域(概念见《排雷玩法》动作合法性节;呈现义务见《HUD框架》可挖域指示)的接触面画呼吸微光——正交邻墙 = 该侧整条边,斜向邻墙 = 共享角点 + 向两侧各延伸半条边;光只画英雄格(空间)一侧、不进墙格(与装饰变体零冲突,数字砖心不涉);微光 = 空间的灯光边界(画法规则)。色相 = 蓝族浅一档(§4.2 蓝条;与主角蓝框的分层由样张测试定,§1.4);呼吸 = §2.1 挖掘期唯一在动元素,减动效停格。角点为斜墙与正交墙共享、不逐格归因,逐格指认 = 悬停金框(呈现交互归《HUD框架》悬停指示域)。验收:目检〈微光只画英雄格一侧接触面:正交邻墙整条边、斜向邻墙角点 + 半边〉 ←§2.1;§4.2;P1
|
||||||
- **墙体**:圆角砌块堆叠,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈墙体无尖刺装饰〉 ←原三
|
- **墙体**:圆角砌块堆叠,禁尖刺装饰——尖刺专属危险语义,装饰禁止伪装逻辑差异。验收:目检〈墙体无尖刺装饰〉 ←原三
|
||||||
- **高墙瓦片体系|术语与定义**:未挖格 = **一整块 32×32 自含凸起岩体**;素材语义名——未开格素材 = **墙瓦片**,已开格素材 = **地面瓦片**。瓦片以自含岩体为单位,Tiny Dungeon 拼块套不进自含岩体定义,不作瓦片参考。验收:目检〈未开格为整块凸起岩体,无拼块接缝感〉 ←原三
|
- **高墙瓦片体系|术语与定义**:未挖格 = **一整块自含凸起岩体**(源档规格=瓦片资产件本身);素材语义名——未开格素材 = **墙瓦片**,已开格素材 = **地面瓦片**。瓦片以自含岩体为单位,Tiny Dungeon 拼块套不进自含岩体定义,不作瓦片参考。验收:目检〈未开格为整块凸起岩体,无拼块接缝感〉 ←原三
|
||||||
- **高墙瓦片体系|边界墨线纪律**:墙瓦片与相邻格分界一律 1px 深墨线、直线贴格边、零锯齿;墨线职责 = 分隔,不追求与地面融合。验收:目检〈分界为 1px 深墨直线贴格边、零锯齿〉
|
- **高墙瓦片体系|边界墨线纪律**:墙瓦片与相邻格分界一律单像素深墨线、直线贴格边、零锯齿;墨线职责 = 分隔,不追求与地面融合。验收:目检〈分界为单像素深墨直线贴格边、零锯齿〉
|
||||||
- **高墙瓦片体系|光照纪律(单一北受光)**:北缘 = 墨线内侧 1px 微亮棱(就地取色提亮,禁宽亮带);西/东缘 = 墨线后直进纹理、不加修饰;南缘 = 墨线 + 立面窄暗条(约 1/3 格高,横层理叠石、禁竖条纹栅栏感)。验收:目检〈北缘亮棱、南缘窄暗条;无宽亮带、无竖条纹栅栏感〉
|
- **高墙瓦片体系|光照纪律(单一北受光)**:北缘 = 墨线内侧单像素微亮棱(就地取色提亮,禁宽亮带);西/东缘 = 墨线后直进纹理、不加修饰;南缘 = 墨线 + 立面窄暗条(约三分之一格高的画法比例,横层理叠石、禁竖条纹栅栏感)。验收:目检〈北缘亮棱、南缘窄暗条;无宽亮带、无竖条纹栅栏感〉
|
||||||
- **高墙瓦片体系|凹角收头**:角点单像素落线;南立面侧凹角加 1px 立面收头——带身与转角竖线同列收尾,禁悬空、禁突出。验收:目检〈凹角收头与转角竖线同列,无悬空突出〉
|
- **高墙瓦片体系|凹角收头**:角点单像素落线;南立面侧凹角加单像素立面收头——带身与转角竖线同列收尾,禁悬空、禁突出。验收:目检〈凹角收头与转角竖线同列,无悬空突出〉
|
||||||
- **高墙瓦片体系|现行定稿**:`game/assets/art/board/terrain_*`(16 唯一墙瓦片 + 5 地面瓦片变体;词表与查表逻辑落码于 `board_world.gd`)。验收:机检〈terrain_* 素材 16 墙瓦片 + 5 地面变体在库,查表逻辑与词表一致〉
|
- **高墙瓦片体系|现行定稿**:`game/assets/art/board/terrain_*`(墙瓦片与地面瓦片变体在库;词表与变体数定值面=查表逻辑落码件)。验收:机检〈terrain_* 素材与查表逻辑词表一致、变体数相符〉
|
||||||
- **高墙瓦片体系|高墙感 D 投影档与整板悬崖**:南临空墙格 = 立面口沿高光 2px `#C9AF83`(201,175,131——代码色 `BRICK`,与掩尘枚同源单点) + 双段暗带(0.16/0.25 格边,黑罩 α0.60/0.82);北邻墙地面格 = 三段渐隐投影(顶带 0.22 格边,α0.28 起);整板悬崖 = 板底/右侧 `DEPTH_PX 8px` 暗面 + 列分隔竖缝 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影(游戏 `board_world.gd` 同款结构件,样张脚本与游戏渲染常量同源)。验收:目检〈南临空墙格呈口沿高光+双段暗带;北邻墙地面格呈三段渐隐投影;整板悬崖结构件齐备〉
|
- **高墙瓦片体系|高墙感 D 投影档与整板悬崖**:南临空墙格 = 立面口沿高光(色=掩尘枚同源单点)+ 双段暗带;北邻墙地面格 = 三段渐隐投影;整板悬崖 = 板底/右侧暗面 + 列分隔竖缝 + 岩层横纹 + 口沿高光 + 接触 AO + 底线收边 + 悬浮影——全部结构件常量与画法落码于棋盘渲染件(样张脚本与游戏渲染常量同源),像素回归由渲染闸 golden 基线盯。验收:目检〈南临空墙格呈口沿高光+双段暗带;北邻墙地面格呈三段渐隐投影;整板悬崖结构件齐备〉
|
||||||
- **变异格形状通道**(双通道之"形",与色无关):底砖圆角外轮廓不变,砖面内缘绘一圈定宽专属几何纹带(纹带形全作不与他类共用),砖心留白予数字与封印印记;验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入数字字形占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于数字/小人/封印印记);原三
|
- **变异格形状通道**(双通道之"形",与色无关):底砖圆角外轮廓不变,砖面内缘绘一圈定宽专属几何纹带(纹带形全作不与他类共用),砖心留白予数字与封印印记;验收标准 = **灰度截图下仍可分类**。种类清单 = 地形变异六类型已定稿(地形变异 GDD;荆棘丛/藤蔓缠绕/岩浆/烬覆/落石/矿尘):**纹带形按轴只分两种**——伤害轴(荆棘丛/岩浆/落石)= 刺/缺排斥形,信息轴(藤蔓缠绕/烬覆/矿尘)= 遮蔽/缠绕形;同轴跨图类型只做色板变体(§4.3 `variant_tint` 槽),不做新纹形。岩浆纹带橙红须与危险红互辨(变异格不是雷,色相邻近有混淆风险);信息轴遮蔽呈现禁止侵入数字字形占位区(§1.4 验收 1 延伸)。验收:目检〈六类型纹带灰度下仍可分类,同轴不新增纹形;岩浆纹带与危险红互辨〉 ←原一(纹理位次第 4,让位于数字/小人/封印印记);原三
|
||||||
|
|
||||||
### 3.3 UI 形状语法(方向指导,细则见 §7.1)
|
### 3.3 UI 形状语法(方向指导,细则见 §7.1)
|
||||||
@@ -193,49 +194,48 @@
|
|||||||
|
|
||||||
### 4.1 主色板
|
### 4.1 主色板
|
||||||
|
|
||||||
- **掩尘 `#C9AF83`**|未开格底色,覆尘完整砖:全作的"未知",画面最大沉默面。验收:机检〈未开格底色 = #C9AF83〉 ←原二;§2.1
|
- **掩尘**|未开格底色,覆尘完整砖:全作的"未知",画面最大沉默面。定值面=ui_kit 掩尘枚(`BRICK`)。验收:机检〈未开格底色与 ui_kit 掩尘枚一致〉 ←原二;§2.1
|
||||||
- **裸土 `#B39A78`**|已开格底色,碎裂裸露:更收更退;明度分层——已开格(挖出的空间)走**世界底层档**,明度低于未开格墙体一档(与 §8.5 图底分离同轴),L 0.08–0.14 带(更高明度底实测达不到 4.5:1,故取本带;样张已冻结,§1.4)。验收:机检〈已开格底 L 落在 0.08–0.14,对亮墨数字 ≥4.5:1〉 ←原三
|
- **裸土**|已开格底色,碎裂裸露:更收更退;明度分层——已开格(挖出的空间)走**世界底层上沿带**(§2),明度低于未开格墙体一档(与 §8.5 图底分离同轴;更高明度底实测过不了文字对比门槛,故取本带;样张已冻结,§1.4)。验收:机检〈已开格底亮度落世界底层上沿带(定值面=互辨抽测件与渲染归一化常量),对亮墨数字过 WCAG AA〉 ←原三
|
||||||
- **数字墨双色制**:1–8 **不做八色分色**,按密度分三档色温(冷 = 稀疏,暖 = 密集);**字形为唯一数值载体**,色温只作密度氛围。验收:目检〈1–8 数字按密度呈三档色温而非八色〉 ←原一/原二;P3
|
- **数字墨双色制**:1–8 **不做八色分色**,按密度分三档色温(冷 = 稀疏,暖 = 密集);**字形为唯一数值载体**,色温只作密度氛围。验收:目检〈1–8 数字按密度呈三档色温而非八色〉 ←原一/原二;P3
|
||||||
- **棋盘数字呈现 = 按板自适应三态**:暗纹理板(dungeon 系)= **亮族**三档 1–3 冷亮青白 #D8ECF0/4–5 暖白 #F0E2C8/6–8 金亮 #F8E3A8 直画(判据 = 族最弱成员对 p90 ≥4.5:1 且对均值 ≥2.5:1);双峰纹理板(underdark/deep_underdark 系)= **色牌垫底**(素牌 DIGIT_PLATE + 深墨 #33261B 12:1,纹理免疫——双峰纹理板上任何墨族直画都不可读,渲染帧取证;判据 = 亮深两族皆不过门,深族均值门 3.0);缺盘平色回退态(#B39A78 中明度底)默认深墨直画。选模式管线落码单点 `board_view._digit_ink_mode`(三态:亮直/深直/落牌),机检面 = `terrain_tile_sets_test` 三关呈现模式断言;目视验证面 = board_shot_probe 渲染帧取证(机检≠看得清)。验收:机检〈terrain_tile_sets_test 三关呈现模式断言全绿,board_shot_probe 渲染帧目视复核〉
|
- **棋盘数字呈现 = 按板自适应三态**:暗纹理板(dungeon 系)= **亮族**三档(冷亮青白/暖白/金亮——1–3/4–5/6–8 密度分档;档值定值面=ui_kit 数字墨三档)直画(判据 = 族最弱成员对 p90 与对均值各自过门槛——门槛定值面=棋盘渲染查表件);双峰纹理板(underdark/deep_underdark 系)= **色牌垫底**(素牌+深墨直画,纹理免疫——双峰纹理板上任何墨族直画都不可读,渲染帧取证);缺盘平色回退态默认深墨直画。选模式管线落码单点 `board_view._digit_ink_mode`(三态:亮直/深直/落牌),机检面 = 三关呈现模式断言;目视验证面 = 渲染取证探针(机检≠看得清)。验收:机检〈三关呈现模式断言全绿,渲染帧目视复核〉
|
||||||
- **垫牌与 UI 数据墨 = 深墨族 `#33261B` 系**(L≤0.027,§7.2)。验收:机检〈垫牌与 UI 数据墨取深墨族,L≤0.027〉
|
- **垫牌与 UI 数据墨 = 深墨族**(§7.2;定值面=ui_kit 主墨枚)。验收:机检〈垫牌与 UI 数据墨取 ui_kit 主墨枚〉
|
||||||
- **八色弃用**:八色必与红/金/蓝/紫赤语义冲突,故弃。验收:方向性
|
- **八色弃用**:八色必与红/金/蓝/紫赤语义冲突,故弃。验收:方向性
|
||||||
- **封印黑 `#000000`**|封印宣告色,无色相:玩家的宣告"此格封印"。封印现行 = 无色相黑——紫色与微光蓝族(魔法微光 256° 等)色相冲突,黑色无色相天然避开 300°–345° 禁入带与全部微光色带;未开格墙顶明度 ≈113 对纯黑对比 ≥4.4:1,纯黑实心剪影单靠明度差即成立,不依赖任何浅色细件。封印紫不再用于棋盘(色史归 git 提交史);红族棋盘侧只剩危险红;主角随身背包件为朱红矩形件(人设侧见 character-design),与棋盘封印色脱钩。验收:机检〈封印宣告色 = #000000,未开格墙顶对其对比 ≥4.4:1〉 ←原一;P2
|
- **封印黑**|封印宣告色,无色相(定值面=ui_kit 封印黑枚):玩家的宣告"此格封印"。封印现行 = 无色相黑——紫色与微光蓝族色相冲突,黑色无色相天然避开禁入带与全部微光色带;未开格墙顶对纯黑的明度对比实测达标,纯黑实心剪影单靠明度差即成立,不依赖任何浅色细件。封印紫不再用于棋盘(色史归 git 提交史);红族棋盘侧只剩危险红;主角随身背包件为朱红矩形件(人设侧见 character-design),与棋盘封印色脱钩。验收:机检〈封印宣告色与 ui_kit 封印黑枚一致,未开格墙顶对其对比达门槛〉 ←原一;P2
|
||||||
- **危险红 `#A8321F`**|危险色:雷 = 被惊动的巢穴,兑现档红,更深更沉。验收:机检〈危险语义色 = #A8321F〉 ←原三;P2
|
- **危险红**|危险色:雷 = 被惊动的巢穴,兑现档红,更深更沉(定值面=ui_kit 危险红枚)。验收:机检〈危险语义色与 ui_kit 危险红枚一致〉 ←原三;P2
|
||||||
- **奖励金 `#F0A828`**|已兑现的收益:GP/宝箱/蜡封,全作唯一亮金。验收:机检〈收益语义色 = #F0A828〉 ←P2;§2.3/2.4
|
- **奖励金**|已兑现的收益:GP/宝箱/蜡封,全作唯一亮金(定值面=ui_kit 奖励金枚)。验收:机检〈收益语义色与 ui_kit 奖励金枚一致〉 ←P2;§2.3/2.4
|
||||||
- **小人蓝 `#2E86DE`**|小人主色:棋盘唯一"己方",与光标准线同族。验收:机检〈己方语义色 = #2E86DE〉 ←P1;§2.1
|
- **小人蓝**|小人主色:棋盘唯一"己方",与光标准线同族(定值面=ui_kit 小人蓝枚)。验收:机检〈己方语义色与 ui_kit 小人蓝枚一致〉 ←P1;§2.1
|
||||||
- **数字色牌 `#F5EAD3`**|数字底具,**后备手段**:素色暖纸白直角小牌,仅复杂格底(物件纹样/变异纹带/微光叠加致直画对比不足)垫于数字正下方;素面无纹理、不随图类型/装饰变体变。验收:机检〈色牌 L≥0.70,仅复杂格底垫用〉 ←原二
|
- **数字色牌**|数字底具,**后备手段**:素色暖纸白直角小牌,仅复杂格底(物件纹样/变异纹带/微光叠加致直画对比不足)垫于数字正下方;素面无纹理、不随图类型/装饰变体变(定值面=ui_kit 色牌枚)。验收:机检〈色牌亮度落定值面域,仅复杂格底垫用〉 ←原二
|
||||||
- **收益金亮档 `#E0B860`(GOLD_BRIGHT)**|UI 徽标可读性亮档 token:敌顺位徽标①②③与重甲徽标对舞台底 6.47:1(GOLD_DEEP 3.26:1 不达 §7.2 带,故另立亮档);金族亮档,与奖励金 #F0A828 同族不同岗——奖励金 = 已兑现收益语义(§4.2 金条),本 token 只承载徽标可读性、不占收益语义。GOLD_DEEP/HERO_BLUE 常量本尊不动(standee 意图判据等语义岗现行使用)。验收:机检〈GOLD_BRIGHT 对舞台底 ≥4.5:1〉
|
- **收益金亮档 `GOLD_BRIGHT`**|UI 徽标可读性亮档 token:敌顺位徽标①②③与重甲徽标对舞台底过文字对比门槛(深金档不达 §7.2 带,故另立亮档);金族亮档,与奖励金同族不同岗——奖励金 = 已兑现收益语义(§4.2 金条),本 token 只承载徽标可读性、不占收益语义。GOLD_DEEP/HERO_BLUE 常量本尊不动(standee 意图判据等语义岗现行使用)。定值面=ui_kit。验收:机检〈GOLD_BRIGHT 对舞台底过门槛〉
|
||||||
- **小人蓝亮档 `#7EBAF0`(HERO_BLUE_BRIGHT)**|魔法护甲徽标对舞台底 5.88:1(HERO_BLUE 3.23:1 不达带,故另立亮档);蓝族亮档,与小人蓝 #2E86DE 同族不同岗——本 token 只承载徽标可读性,不占用「蓝只说己方」的语义。验收:机检〈HERO_BLUE_BRIGHT 对舞台底 ≥4.5:1〉
|
- **小人蓝亮档 `HERO_BLUE_BRIGHT`**|魔法护甲徽标对舞台底过门槛(小人蓝本档不达带,故另立亮档);蓝族亮档,与小人蓝同族不同岗——本 token 只承载徽标可读性,不占用「蓝只说己方」的语义。定值面=ui_kit。验收:机检〈HERO_BLUE_BRIGHT 对舞台底过门槛〉
|
||||||
- **图标槽柔和档 `#806A4E`(SLOT_BACKDROP_SOFT)**|BCard 图标槽底:对米色卡面 PANEL_DATA 3.69:1(深档 SLOT_BACKDROP #3E362C 8.53:1 过强、像硬贴补丁,故槽底另立柔和档),槽内白图标 5.14:1,满足 ≥3:1 图形参考线硬约束;仅 BCard 图标槽换档,B 区状态槽仍用深档 SLOT_BACKDROP。验收:机检〈槽内白图标对槽底 ≥3:1〉
|
- **图标槽柔和档 `SLOT_BACKDROP_SOFT`**|BCard 图标槽底:对米色卡面柔和可辨(深档过强、像硬贴补丁,故槽底另立柔和档),槽内白图标过图形参考线门槛;仅 BCard 图标槽换档,B 区状态槽仍用深档 SLOT_BACKDROP。定值面=ui_kit。验收:机检〈槽内白图标对槽底过门槛〉
|
||||||
- **群伤微光暗档 `#A61D37`(TG_GLOW_AOE)**|类型微光群伤组的**明度档**(UI token 板,占 1 枚额度,**余量 3→2**):色相 349° 与亮档 `#FF2D55` 零移动,明度落 V=0.65 档——即 §4.2「微光 = 色相+明度双码」里明度侧的落法;与 §4.2「红只说危险」不相撞(微光组色相刻意错开语义红,见 §4.2「类型微光色带」条)。已在役(`ui_kit.gd` 常量与 `type_glow_test.gd` 守门断言),本节为登记转正。验收:机检〈ui_kit.gd TG_GLOW_AOE 与 type_glow_test 断言的 H/S 逐位一致、V 落 0.65 档〉
|
- **群伤微光暗档 `TG_GLOW_AOE`**|类型微光群伤组的**明度档**(UI token 板,占 1 枚额度):色相与亮档零移动,明度落暗档——即 §4.2「微光 = 色相+明度双码」里明度侧的落法;与 §4.2「红只说危险」不相撞(微光组色相刻意错开语义红,见 §4.2「类型微光色带」条)。已在役(ui_kit 常量与微光守门测试),本节为登记转正。定值面=ui_kit 常量+微光守门断言。验收:机检〈ui_kit TG_GLOW_AOE 与守门断言 H/S 逐位一致、明度落暗档〉
|
||||||
- **站桩石板地台板身 `#968264`(STAND_STONE)**|战斗屏场景环境子板(分层②,不占 48 token 额度):B 区站桩地台板身与顶缘的材质色,跨三关恒定、不吃 §4.3 `wall_ambient` tint(地台是 §6.1 定死的世界中层承载面,随关卡变会破 §2 明度分层的层间关系)。转正前即在役。验收:机检〈战斗屏场景环境子板色数 ≤32 且本值在册〉
|
- **站桩石板地台板身 `STAND_STONE`**|战斗屏场景环境子板(分层②,不占 token 额度):B 区站桩地台板身与顶缘的材质色,跨三关恒定、不吃 §4.3 `wall_ambient` tint(地台是 §6.1 定死的世界中层承载面,随关卡变会破 §2 明度分层的层间关系)。转正前即在役;定值面=ui_kit。验收:机检〈战斗屏场景环境子板色数不超子板上限且本值在册〉
|
||||||
- **营地场景环境子板(分层②,不占 48 token 额度)**:营地场景十层环境色按子板制落地——各层独立量化并集 272 色经最近对合并收敛至 **32 色、违例对 0**,十层按终版色板重量化回写。色值不另立逐值清单,事实源=入包素材 `scene_camp_*` 十件的量化产物;换算与合并过程登记于 artwork 工作区换算式登记。验收:机检〈营地屏唯一色数判据(shot_checker 闸件承载,2026-11-01 用户裁口径)〉
|
- **营地场景环境子板(分层②,不占 token 额度)**:营地场景十层环境色按子板制落地——各层独立量化并集经最近对合并收敛至子板上限、违例对清零,十层按终版色板重量化回写。色值不另立逐值清单,事实源=入包素材 `scene_camp_*` 十件的量化产物;换算与合并过程登记于 artwork 工作区换算式登记。验收:机检〈营地屏唯一色数判据(shot_checker 闸件承载,2026-11-01 用户裁口径)〉
|
||||||
- **重甲冷灰金属材质色 `#868C9A`(ARMOR_PLATE_COLD,token 名暂拟)**|语义/UI token 板(**分层①**,占 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〉
|
- **重甲冷灰金属材质色 `ARMOR_PLATE_COLD`**|语义/UI token 板(**分层①**,占 1 枚额度;用户裁):重甲档甲材质色;character-design §5.3 通道 = 甲面覆盖率 × 甲材质色,甲材质色按甲档统一,故石君王岩石板甲**同引本枚、不另计额度**;材质色跨屏恒定,落分层①不落分层②(环境色才随场景走)。过门情况:第二道门按宽松口径与在册色逐一比对过门;§4.2 语义检查过门(不占语义段、不在禁入带;材质色不进信息层与语义物件岗);亮度落 §2 世界中层带。定值面=ui_kit。验收:机检〈本值入板后互查守门件账外零新增近色对〉
|
||||||
- **卓尔浅紫灰皮 `#A79CB8`(DRIDER_SKIN,token 名暂拟)**|语义/UI token 板(**分层①**,占 1 枚额度,**额度用尽**;用户裁):蛛化卓尔精灵上体皮色(体块主色,L≈0.355 落 §2 世界中层带)。过门情况:第二道门同上行口径,**无三通道全 <8 的对 → 过门**;§4.2 语义检查过门(色相 264°,避开 300°–345° 禁入带,紫赤独占仍归 `#8F2F6A`;不占本节五语义段)。对比实测:对深素底 `#282220` **6.04:1**、对舞台底 `#3E362C` **4.57:1**——**两处均过图形 ≥3:1 门槛**。验收:机检〈本值入板后全板色对中三通道差全部 <8/255 的对数 = 0〉
|
- **卓尔浅紫灰皮 `DRIDER_SKIN`**|语义/UI token 板(**分层①**,占 1 枚额度,**额度用尽**;用户裁):蛛化卓尔精灵上体皮色(体块主色,落 §2 世界中层带)。过门情况:第二道门同上行口径过门;§4.2 语义检查过门(避开禁入带,紫赤独占仍归 Boss 枚;不占本节五语义段);对深素底与舞台底均过图形门槛(实测在案)。定值面=ui_kit。验收:机检〈本值入板后互查守门件账外零新增近色对〉
|
||||||
- **换色合并登记五处(用户裁,部件色落值)**|按本表「不过门即触发换色合并、禁加色绕行」执行,五处**零新增额度**(各件原拟新增候选一律不取):① 主角铲刃浅铁灰(原拟 `#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 金只说收益与兑现)——两者均作角色随身件材质色用,不进信息层与语义物件岗;③④⑤ 无语义岗冲突。验收:机检〈五处部件取值点全部改指合并目标色,四枚原拟新增候选值零入板〉
|
- **换色合并登记(沿革)**|历次不过门换色合并的部件取值与源常量退役记录归 git 提交史(角色部件五处+地台/舞台底三处;现行部件色全部落 ui_kit 常量与素材件,一色两岗代价已随裁定接受);纪律同色板增量条「不过门即换色合并、禁加色绕行」。验收:机检〈部件取值点指向在册常量,退役源常量全仓零引用〉
|
||||||
- **换色合并登记三处**|按本表「不过门即触发换色合并、禁加色绕行」执行,三处零新增额度:①地台顶缘受光线 `#C4AC84` 已并入 `#C9AF83`(掩尘枚 `BRICK`,与 §8.2 高墙口沿高光同枚)——源常量已删除(全仓零引用,退役断言测试串为预期例外),绘制点全部改指 `#C9AF83`;②地台描边 `#5A4C3A` 已并入 `#4C4038`(代码 `PLAZA_EDGE`,ui_kit 唯一落点)——源常量已删除,绘制点全部改指;③舞台底 `#3E342A`(代码 `STAGE_BG`)→ 并入 `#3E362C`(状态槽底)——源常量已删除(常量表零键),背景资产接管该绘制面,程序化平色缺图回退改指 `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)。未开格底槽(含全部图类型)与类型微光、已开格底之间存在**相对亮度与相对饱和关系**——禁止底槽吞没微光环、禁止底槽与已开格底同档;本节只定这层关系,阈值与准入判定由图类型色板互辨抽测的执行件承载(用法登记见 [art-pipeline-tools](art-pipeline-tools.md))。已开格底走世界底层档(见上)。物件识别不依赖格底(§5.1 轮廓通道),封印印记、金色不作识别依赖。验收:机检〈亮墨对已开格底 ≥4.5:1;未开格底对微光环与对已开格底的相对亮度关系经互辨抽测准入;任意牌墨组合 ≥4.5:1〉 ←原二;地形变异 AC-9
|
**对比硬指标(可测)**:数字可读性由**格底明度分档**承载——棋盘数字亮墨对已开格底(世界底层上沿带)直画对比**恒过 WCAG AA 门槛**(样张逐组合抽测冻结);**色牌后备**:色牌素色与牌上深墨的任意组合同门槛(组合实测在案)。未开格底槽(含全部图类型)与类型微光、已开格底之间存在**相对亮度与相对饱和关系**——禁止底槽吞没微光环、禁止底槽与已开格底同档;本节只定这层关系,阈值与准入判定由图类型色板互辨抽测的执行件承载(用法登记见 [art-pipeline-tools](art-pipeline-tools.md))。已开格底走世界底层上沿带(见上)。物件识别不依赖格底(§5.1 轮廓通道),封印印记、金色不作识别依赖。验收:机检〈亮墨对已开格底过 WCAG AA;未开格底对微光环与对已开格底的相对亮度关系经互辨抽测准入;任意牌墨组合过门槛〉 ←原二;地形变异 AC-9
|
||||||
|
|
||||||
**色板增量纪律(数值状态 = 待定现用)**:全作色板硬上限 **48 色**(防色板无限膨胀的封口条款;**额度已用尽、余量 0**,后续余量以色板检查器实报为准);新色入板须同时过两道门:①§4.2 语义检查(不占语义色段/禁入带);②**与既有任一色的 RGB 三通道差禁止全部 <8/255**——即三通道里至少一通道 ≥8/255 即过门,「三通道差全部 <8」才算不过门(条文原写的「三通道差 ≥8/255」有「逐通道全过」与「禁止全灭」两种互斥读法,前者下现行色板 247 对不达标、与本节自认的「现行即执法」合规状态不能同真,故取后者;用户裁)。**额度已用尽:后续任何新增须先压缩或合并既有色**——按本节「额度不足时呈报作者」口径呈报,**压缩或合并哪几枚由作者裁,本节不代裁、不预指对象**。反例实证:#3A2E22 ↔ #362B20 三通道差均 <5,肉眼不可辨,同板共存只增噪。不过门即触发「换色合并」(把意图色并进最近既有色),**禁加色绕行**;加色义务同时登记于本表修订。**「待定现用」态释义**:数值**现行即执法**(色板检查器按此拦,§8.3)——非候选(不存在"等冻结"空窗)、非死规(后续需求引入时可变);调整走本节修订并登记,改值 = 修订不是违约。验收:机检〈色板总数 ≤48;新色入板过两道门〉
|
**色板增量纪律(数值状态 = 待定现用)**:全作色板硬上限(数值定值面=色板检查器常量;**额度已用尽、余量以色板检查器实报为准**);新色入板须同时过两道门:①§4.2 语义检查(不占语义色段/禁入带);②**与既有任一色的 RGB 三通道差禁止全部小于近色容差**——三通道至少一通道达容差即过门,容差定值面=token 互查守门件与色板检查器(条文两种读法的取舍=「禁止全灭」,用户裁)。**额度已用尽:后续任何新增须先压缩或合并既有色**——按本节「额度不足时呈报作者」口径呈报,**压缩或合并哪几枚由作者裁,本节不代裁、不预指对象**。不过门即触发「换色合并」(把意图色并进最近既有色),**禁加色绕行**;加色义务同时登记于本表修订。**「待定现用」态释义**:数值**现行即执法**(机检件按此拦,§8.3)——非候选(不存在"等冻结"空窗)、非死规(后续需求引入时可变);调整走本节修订并登记,改值 = 修订不是违约。验收:机检〈色板总数不超上限;新色入板过两道门(互查守门件账外零新增)〉
|
||||||
|
|
||||||
- **换色合并欠账清单(全板重扫 6 对不达标,逐对清偿)**:`#18120C` ↔ `#181410`、`#33261B` ↔ `#362B20`、`#362B20` ↔ `#3A2E22`、`#3E362C` ↔ `#3E3731`、`#3E4048` ↔ `#3F4147`、`#453723` ↔ `#4A3B2A`——六对按「不过门即换色合并」纪律逐对清偿(并进最近既有色);清偿前该对不视作合规,清偿动作落本节修订。**本节所举反例 `#3A2E22` ↔ `#362B20` 正在这 6 对之内**,与本口径自洽。验收:机检〈全板色对中三通道差全部 <8/255 的对数 = 0〉
|
- **换色合并欠账(已迁出)**:全板重扫六对不达标的清偿义务已迁登记处——债务登记=待办清单「色板近色欠账六对清偿」条;常量面豁免账=token 互查守门件(账内标〔欠账〕的对),素材侧伙伴对随素材批清偿。清偿前各对不视作合规,清偿动作=逐对从豁免账移除。验收:机检〈互查守门件账外零新增近色对〉
|
||||||
|
|
||||||
- **色板分层**:色板分两层管理——① **语义/UI token 板**:全作共享,硬上限 **48 色**,管 UI 语义色、墨色、材质色,跨屏恒定;② **场景环境子板**:**每屏一套,≤32 色,允许跨屏不共享**(环境色 = 天空、地面、植被、石材、火焰等随场景走的颜色)。新增环境色仍须过两道门(§4.2 语义检查 + 与既有任一色 RGB 三通道差禁止全部 <8/255),但**不占用 48 token 额度**;不过门照旧走「换色合并」,**禁加色绕行**。单张 PNG 的像素域色数上限 **≤32 色**另由 `standee_asset_check` 执法(按单图像素域取值方式计数,与本表 token 计数互不干扰)。额度不足时向作者报告,由作者决定压缩或合并既有色。验收:机检〈token 板 ≤48;每屏环境子板 ≤32〉
|
- **色板分层**:色板分两层管理——① **语义/UI token 板**:全作共享,硬上限(定值面=色板检查器常量),管 UI 语义色、墨色、材质色,跨屏恒定;② **场景环境子板**:**每屏一套、独立上限(定值面同上),允许跨屏不共享**(环境色 = 天空、地面、植被、石材、火焰等随场景走的颜色)。新增环境色仍须过两道门(§4.2 语义检查 + 三通道差门),但**不占 token 额度**;不过门照旧走「换色合并」,**禁加色绕行**。单张 PNG 的像素域色数上限另由素材检查件执法(按单图像素域取值方式计数,与本表 token 计数互不干扰)。额度不足时向作者报告,由作者决定压缩或合并既有色。验收:机检〈token 板与每屏环境子板各不超各自上限(检查器承载)〉
|
||||||
- **整屏有效色数总闸(色板第三层,2026-11-02 用户裁)**|整屏的色板纪律裁判面=**画面上成片出现的颜色数(有效色数)**,不是逐像素去重总数:多源并集与程序混合(压暗遮罩/软阴影/渐变/tween 中间帧)使逐像素色数随素材与渲染状态大幅漂移(实测同屏不同时点差一至九倍),不可治理也不承载观感。整屏唯一色数只保留「渲染真实发生」的存在性地板(地板值归闸件承载);**色板纪律的上限闸=每屏有效色数 ≤128**(**待定现用**——现行即执法、修订走登记,释义同色板增量纪律条)。构成推导源:双环境层 32×2+token 板 48+混合容差 16(←本条色板分层;推导源非额度分配,各层额度照旧独立执法)。超限处置沿色板增量纪律:先合并压缩既有色再进,禁加色绕行。有效色的测量口径(面积阈值等实现参数)归色数检查器承载,本圣经不载。验收:机检〈各屏有效色数 ≤128,口径=色数检查器现行定义〉
|
- **整屏有效色数总闸(色板第三层,2026-11-02 用户裁)**|整屏的色板纪律裁判面=**画面上成片出现的颜色数(有效色数)**,不是逐像素去重总数:多源并集与程序混合(压暗遮罩/软阴影/渐变/tween 中间帧)使逐像素色数随素材与渲染状态大幅漂移(实测同屏不同时点差一至九倍),不可治理也不承载观感。整屏唯一色数只保留「渲染真实发生」的存在性地板(地板值归闸件承载);**色板纪律的上限闸=每屏有效色数上限**(**待定现用**——现行即执法、修订走登记;数值定值面=整屏检查器常量)。构成推导源:双环境层+token 板+混合容差(←本条色板分层;推导源非额度分配,各层额度照旧独立执法)。超限处置沿色板增量纪律:先合并压缩既有色再进,禁加色绕行。有效色的测量口径(面积阈值等实现参数)归色数检查器承载,本圣经不载。验收:机检〈各屏有效色数不超上限,口径=色数检查器现行定义〉
|
||||||
|
|
||||||
### 4.2 语义色彩规则
|
### 4.2 语义色彩规则
|
||||||
|
|
||||||
> **适用域**:本节「X 只说 Y」约束**信息层**(格内信息/UI 数据/预告/语义标识)与**语义物件**(GP=收益金、血条=危险红等);**纯环境氛围**(背景/装饰变体/远景/非语义物件)不受色相独占约束,改受 §3.4 焦点预算与低饱和后退约束(不抢读即可用色)。禁入带 300°–345°:信息层与语义物件禁入不变;环境层可入但限低饱和(高饱和紫赤仍 Boss 独占,§2.6)。验收:目检〈信息层与语义物件不落禁入带、不占语义独占色相;环境层用色低饱和〉
|
> **适用域**:本节「X 只说 Y」约束**信息层**(格内信息/UI 数据/预告/语义标识)与**语义物件**(GP=收益金、血条=危险红等);**纯环境氛围**(背景/装饰变体/远景/非语义物件)不受色相独占约束,改受 §3.4 焦点预算与低饱和后退约束(不抢读即可用色)。禁入带 300°–345°:信息层与语义物件禁入不变;环境层可入但限低饱和(高饱和紫赤仍 Boss 独占,§2.6)。验收:目检〈信息层与语义物件不落禁入带、不占语义独占色相;环境层用色低饱和〉
|
||||||
|
|
||||||
- **红只说危险**:危险红 = 兑现档,红族单档。禁(信息层域):红禁止用于奖励、装饰性标识与常规 UI(微光群伤组除外——见「类型微光色带」条,其色相刻意错开语义红)。验收:目检〈信息层域红色仅出现在危险语义与微光群伤组〉 ←原三;P2;§2.1
|
- **红只说危险**:危险红 = 兑现档,红族单档。禁(信息层域):红禁止用于奖励、装饰性标识与常规 UI(微光群伤组除外——见「类型微光色带」条,其色相刻意错开语义红)。验收:目检〈信息层域红色仅出现在危险语义与微光群伤组〉 ←原三;P2;§2.1
|
||||||
- **血条填充 = 危险红 `#A8321F`**(语义物件显式落法):血条是本节适用域点名的语义物件,填充色族一律归危险红,不因敌我分色、不因关卡换族。读数不依赖填充色对比——血量数字 11px 压 `HP_BAR_BACK` 素牌(§7.4 豁免①,14.3:1),填充只承载「剩余比例」的形状语义。**蓝族引擎默认近似值 `#689CE8` 登记为违例值、已退役**:它同时撞本条「血条=危险红」与蓝条「蓝禁止表示敌方危险」,禁再入任何血条绘制点。验收:机检〈血条填充绘制点取值为 #A8321F 且全仓零 #689CE8 字面量〉
|
- **血条填充 = 危险红**(语义物件显式落法;定值面=ui_kit 危险红枚):血条是本节适用域点名的语义物件,填充色族一律归危险红,不因敌我分色、不因关卡换族。读数不依赖填充色对比——血量数字压 `HP_BAR_BACK` 素牌(§7.4 豁免①,对比实测在案),填充只承载「剩余比例」的形状语义。**蓝族引擎默认近似值登记为违例值、已退役**:它同时撞本条「血条=危险红」与蓝条「蓝禁止表示敌方危险」,禁再入任何血条绘制点(退役字面量的零引用判据面=对比探针断言)。验收:机检〈血条填充绘制点取 ui_kit 危险红枚且全仓零退役字面量〉
|
||||||
- **金只说收益与兑现**(奖励、结算、胜利)。禁(信息层与语义物件域):金禁止作危险障碍色、不上格底、不作日常 UI 强调(防通胀;微光通用增益组的芥末黄属「类型微光色带」条色带,非收益语义金)。验收:目检〈信息层与语义物件域金色仅承载收益与兑现〉 ←P2;P3;§2.2–2.4
|
- **金只说收益与兑现**(奖励、结算、胜利)。禁(信息层与语义物件域):金禁止作危险障碍色、不上格底、不作日常 UI 强调(防通胀;微光通用增益组的芥末黄属「类型微光色带」条色带,非收益语义金)。验收:目检〈信息层与语义物件域金色仅承载收益与兑现〉 ←P2;P3;§2.2–2.4
|
||||||
- **蓝只说己方与冷静信息**(小人、光标、工具信息——含可挖域接触带呼吸微光,蓝族浅一档 `#D6ECFF`)。禁(信息层域):蓝禁止表示敌方危险;暮蓝 `#5A6C8C` 为失败独占(§2.5),只作全屏氛围,不作物件色。验收:目检〈信息层域蓝色仅承载己方与冷静信息;敌方危险无蓝色〉 ←P1;§2.5
|
- **蓝只说己方与冷静信息**(小人、光标、工具信息——含可挖域接触带呼吸微光,蓝族浅一档;浅档与暮蓝定值面=ui_kit,暮蓝为失败独占 §2.5)。禁(信息层域):蓝禁止表示敌方危险;暮蓝只作全屏氛围,不作物件色。验收:目检〈信息层域蓝色仅承载己方与冷静信息;敌方危险无蓝色〉 ←P1;§2.5
|
||||||
- **紫赤只说 Boss 与精英** `#8F2F6A`(色相 323°):郑重来自色相独占,不来自压暗。禁:**HSV 色相 300°–345° 为信息层与语义物件禁入带**——UI、粒子、类型微光、语义物件及图类型色板信息面禁止落入;环境层(背景/装饰)可入但限低饱和,高饱和紫赤仍 Boss 独占。验收:机检〈信息层与语义物件色值色相不落 300°–345°;高饱和紫赤仅 Boss 战〉 ←§2.6;原三
|
- **紫赤只说 Boss 与精英**(定值面=ui_kit 紫赤枚):郑重来自色相独占,不来自压暗。禁:**HSV 高饱和紫赤域为信息层与语义物件禁入带**(带域定值面=互辨抽测件门值)——UI、粒子、类型微光、语义物件及图类型色板信息面禁止落入;环境层(背景/装饰)可入但限低饱和,高饱和紫赤仍 Boss 独占。验收:机检〈信息层与语义物件色值色相不落禁入带;高饱和紫赤仅 Boss 战〉 ←§2.6;原三
|
||||||
- **绿只说自然生机**(环境植被;恢复类状态若有则用绿——待增益状态定夺)。**例外:类型微光治疗组**(见下条「类型微光色带」)。禁(信息层域):绿禁止承载逻辑状态(微光色带除外),禁止与红构成唯一区分对。验收:目检〈信息层域绿色仅微光治疗组;绿红不构成唯一区分对〉 ←原三
|
- **绿只说自然生机**(环境植被;恢复类状态若有则用绿——待增益状态定夺)。**例外:类型微光治疗组**(见下条「类型微光色带」)。禁(信息层域):绿禁止承载逻辑状态(微光色带除外),禁止与红构成唯一区分对。验收:目检〈信息层域绿色仅微光治疗组;绿红不构成唯一区分对〉 ←原三
|
||||||
- **类型微光色带 = 格面类型先验专用逻辑色带**(未开格类型预读的色彩通道;概念定义、可见范围与生命周期见《HUD框架》「未开格类型微光」节):未开格类型微光的信息色彩按以下五组执行——**通用增益组**(attack/defense/weaken/action/gp 五族)芥末黄 `#D6C13A`(≈52°)、**治疗组**(heal)黄绿 `#5CB83A`(≈104°)、**穿刺组**(pierce)青 `#2E9E9E`(≈180°)、**魔法组**(magic)紫罗兰 `#7B5BD6`(≈256°)、**群伤组**(blast)绯红 `#FF2D55`(≈349°,刻意避开危险红色相段与 300°–345° 禁入带)。验收:机检〈类型微光五组色值与本表一致〉
|
- **类型微光色带 = 格面类型先验专用逻辑色带**(未开格类型预读的色彩通道;概念定义、可见范围与生命周期见《HUD框架》「未开格类型微光」节):未开格类型微光的信息色彩按五组执行——**通用增益组**(attack/defense/weaken/action/gp 五族)芥末黄、**治疗组**(heal)黄绿、**穿刺组**(pierce)青、**魔法组**(magic)紫罗兰、**群伤组**(blast)绯红(刻意避开危险红色相段与禁入带);族↔色对应与五组色值定值面=ui_kit 微光常量组+微光守门测试(冻结表随件)。验收:机检〈类型微光五组色值与 ui_kit 微光常量逐位一致(守门测试)〉
|
||||||
- **微光呈现参数**:内缘带状泛光 α170、带宽 cell÷8(亮度不压格底明度档,§2 微光例外);组间互辨以抽检核对。验收:机检〈微光泛光 α=170、带宽=cell÷8〉
|
- **微光呈现参数**:内缘带状泛光+按格边比例的带宽(亮度不压格底明度档,§2 微光例外);参数定值面=ui_kit 微光呈现常量(守门测试锚定)。组间互辨以抽检核对。验收:机检〈微光泛光强度与带宽与 ui_kit 常量一致(守门测试)〉
|
||||||
- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破格底明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破格底明度档与三态分类〉 ←§4.6.3
|
- **微光分域纪律与双码**:微光色相只承载类型先验,不迁移复用为物件/阵营/UI 语义色;微光 = **色相+明度双码**——明度梯度承载分组(组间五色相、组内不细分:通用增益组五族同色相、不承诺组内分型;§2 微光明度例外:梯度禁止压破格底明度档与三态分类);色弱玩家的类型主通道 = 微光双码(组粒度:组间五色相 + 各组一档明度互辨)。验收:目检〈五组微光两两互辨,明度梯度不压破格底明度档与三态分类〉 ←§4.6.3
|
||||||
- **金/红兼作极性色相槽(§4.6)**:极性(概念定义与符号矩阵见《地图战斗资源》极性提案)的视觉取色只在这两族间——有利兑付 = 金族,有害兑付 = 红族,不新增语义色。验收:目检〈极性视觉取色仅金/红两族〉 ←§4.6;原二
|
- **金/红兼作极性色相槽(§4.6)**:极性(概念定义与符号矩阵见《地图战斗资源》极性提案)的视觉取色只在这两族间——有利兑付 = 金族,有害兑付 = 红族,不新增语义色。验收:目检〈极性视觉取色仅金/红两族〉 ←§4.6;原二
|
||||||
|
|
||||||
@@ -245,14 +245,14 @@
|
|||||||
|
|
||||||
- `tile_closed` 未开底:L 与饱和同 §4.1 硬指标,避禁入色相带。验收:机检〈各图类型 tile_closed 底色 L 与饱和落 §4.1 未开格底带〉
|
- `tile_closed` 未开底:L 与饱和同 §4.1 硬指标,避禁入色相带。验收:机检〈各图类型 tile_closed 底色 L 与饱和落 §4.1 未开格底带〉
|
||||||
- `tile_open` 已开底:世界底层档(L 带见 §4.1)、饱和 ≤0.55,避禁入色相带。验收:机检〈各图类型 tile_open 底色 L 落 §4.1 已开格底带〉
|
- `tile_open` 已开底:世界底层档(L 带见 §4.1)、饱和 ≤0.55,避禁入色相带。验收:机检〈各图类型 tile_open 底色 L 落 §4.1 已开格底带〉
|
||||||
- `wall_ambient` 墙雾氛围 tint:可带主题色相,L≥0.30。验收:机检〈wall_ambient tint L≥0.30〉
|
- `wall_ambient` 墙雾氛围 tint:可带主题色相、亮度不低于地板(定值面=互辨抽测件门值)。验收:机检〈wall_ambient tint 过互辨抽测件亮度地板门〉
|
||||||
- `variant_tint` 变异纹带染槽:只改色相不改纹形(纹带形按轴两分,见 §3.2 变异格形状通道;种类 = 地形变异六类型已定稿)。验收:目检〈同纹带形跨图类型仅色相不同〉
|
- `variant_tint` 变异纹带染槽:只改色相不改纹形(纹带形按轴两分,见 §3.2 变异格形状通道;种类 = 地形变异六类型已定稿)。验收:目检〈同纹带形跨图类型仅色相不同〉
|
||||||
|
|
||||||
**不变槽**:棋盘数字墨亮族三档、数字色牌(后备件)、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,格底两档明度关系(墙亮/空间暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9
|
**不变槽**:棋盘数字墨亮族三档、数字色牌(后备件)、封印黑、危险红、奖励金、小人蓝、紫赤、绿、类型微光五组——**信息与语义层全图类型恒定**;换挡动色相饱和,格底两档明度关系(墙亮/空间暗)全图类型恒定(§2 明度分层)。新增色板须重跑 §1.4 格子样张(灰度可辨+对比抽测)。验收:机检〈换皮前后不变槽色值逐项一致〉 ←原三/原二;地形变异 AC-9
|
||||||
|
|
||||||
### 4.4 UI 色板(方向指导,细则迁 §7.2)
|
### 4.4 UI 色板(方向指导,细则迁 §7.2)
|
||||||
|
|
||||||
**方向指导**:数据素面的墨来自世界的墨——UI 数字/进度/准线一律主墨 `#33261B` 系;容器按场景穿材质色(营地全作最暖、战斗中性石);UI 不新增语义色,强调沿用 §4.2。色板细则成文于 **§7.2**。验收:方向性 ←原一;§2.8
|
**方向指导**:数据素面的墨来自世界的墨——UI 数字/进度/准线一律主墨系(定值面=ui_kit 主墨枚);容器按场景穿材质色(营地全作最暖、战斗中性石);UI 不新增语义色,强调沿用 §4.2。色板细则成文于 **§7.2**。验收:方向性 ←原一;§2.8
|
||||||
|
|
||||||
### 4.5 色弱安全清单
|
### 4.5 色弱安全清单
|
||||||
|
|
||||||
@@ -378,36 +378,36 @@
|
|||||||
### 6.1 战斗舞台背景(B 区环境)
|
### 6.1 战斗舞台背景(B 区环境)
|
||||||
|
|
||||||
- **双舞台常驻下的 B 区环境**:战斗画面区(站桩立绘所在)的背景 = 明亮地窟,与 §1 风格基调同源——暖倾向、无压抑;背景整体**低对比自然后退**(§3.4 焦点预算延伸):背景禁止构成完整凸形、禁止抢 B 区立绘与 D 区数字的焦点,识别层级恒为 立绘 > 背景。验收:目检〈背景无完整凸形、立绘最抢眼〉
|
- **双舞台常驻下的 B 区环境**:战斗画面区(站桩立绘所在)的背景 = 明亮地窟,与 §1 风格基调同源——暖倾向、无压抑;背景整体**低对比自然后退**(§3.4 焦点预算延伸):背景禁止构成完整凸形、禁止抢 B 区立绘与 D 区数字的焦点,识别层级恒为 立绘 > 背景。验收:目检〈背景无完整凸形、立绘最抢眼〉
|
||||||
- **舞台正面目标**:B 区 = **地窟看台**——立绘脚下地台/落影承载(世界中层),背景环境层低饱和后退、明度走世界底层档;角色禁止直接贴平色底。规格与终值归整屏样张闸(§1.4)冻结。**地台面上零文字**——暖白 `#F0E2C8` 对地台板身 `#968264` 实测仅 2.89:1,已越 §7.2 的 4.5:1 硬指标,落法按 §7.2「文字禁直接压纹理底」(垫容器、素牌或罩层),非新条款;站桩文字位改垫素底或落进结算明细带(实装=站桩名字行垫 `HP_BAR_BACK` 深档素底牌、文字基线上移至地台顶上方)。验收:目检〈立绘脚下有地台/落影,非贴平色底〉+机检〈B 区站桩文字位正下方像素非地台板身色 #968264〉
|
- **舞台正面目标**:B 区 = **地窟看台**——立绘脚下地台/落影承载(世界中层),背景环境层低饱和后退、明度走世界底层档;角色禁止直接贴平色底。规格与终值归整屏样张闸(§1.4)冻结。**地台面上零文字**——暖白墨对地台板身实测对比不达 §7.2 硬门槛,落法按 §7.2「文字禁直接压纹理底」(垫容器、素牌或罩层),非新条款;站桩文字位改垫素底或落进结算明细带(实装=站桩名字行垫 `HP_BAR_BACK` 深档素底牌、文字基线上移至地台顶上方)。验收:目检〈立绘脚下有地台/落影,非贴平色底〉+机检〈B 区站桩文字位正下方像素非地台板身色(定值面=ui_kit 地台枚)〉
|
||||||
- **明度分层适用**:空间纵深与洞穴感走明度分层——世界底层档、光照氛围、色相饱和与形体承载(§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);现有每角色小石台 `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 的工艺(可平铺纹理条/最宽档裁切,禁横向拉伸)。**光柱不迁入背景**:三张背景均不画光柱/光带/光束/光晕与任何光源实体,明暗只由岩体层理与暗部承载;原四柱程序层与平色底已退役(背景资产接管该绘制面,平色缺图回退改指状态槽底色)。资产已入包;出图工单 = `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 的工艺(可平铺纹理条/最宽档裁切,禁横向拉伸)。**光柱不迁入背景**:三张背景均不画光柱/光带/光束/光晕与任何光源实体,明暗只由岩体层理与暗部承载;原四柱程序层与平色底已退役(背景资产接管该绘制面,平色缺图回退改指状态槽底色)。资产已入包;出图工单 = `battle-stage-prompts.md`,交付记录见本节「B 区舞台背景与共用地面的交付绑定」。验收:目检〈三关背景可辨为不同洞窟,非同一图换色;远景有纵深、非贴墙;无孤立圆柱贴顶;背景无地台/地面结构件、无砖石墙、无瓷砖地面、无光柱/光带;地面层为泥土/砂砾/碎石〉
|
||||||
- **B 区舞台背景与共用地面的交付绑定**:三张背景与一张地面已按本节契约入包 `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 色、三关共用。地面按作者裁保留候选 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 区舞台背景与共用地面的交付绑定**:三张背景与一张地面已按本节契约入包 `game/assets/art/scene/`——三件背景不透明全幅、单张色数不超上限、按 `board_type` 选图;`scene_stage_ground.png` 顶缘以上透明、三关共用(尺寸定值面=布局表 `stage_h`/`ground_h` 与素材件本身)。地面按作者裁保留候选 v12b 原亮度(实测低于 §2 世界中层带,登记为作者例外;后续调亮归调参/替换,不重开设计);背景实测亮度读数定值面=互辨抽测件子带门输出(读数随件落盘)。验收:机检〈四件文件名与尺寸逐位相符(尺寸读布局表);地面顶缘以上 alpha=0、不透明域色数不超上限;背景不透明全幅色数不超上限〉+目检〈三关可辨、无光柱、地面读作泥土〉。参考指针:`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` 均为独立层,三关共用、跨关恒定。小石台源档与顶缘受光线规格定值面=入包素材件(九宫格横向拉伸、受光线不随拉伸变形,规格见 §8.2);连续地面层的顶缘即分隔带(不规则碎石/阴影缝,不是直线亮边)。独立的两条理由——① 三张背景按关卡变体,地面若画进任一背景就得三张各画一遍、且三关站位面会漂移;② 结算期明细带整条压住底带(带高读 `log_band_h_settle`),地面在独立层才能跨关恒定并保持世界中层承载面不变。小石台先保留,是否退役归后续裁决。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒定(定值面=素材件)〉+目检〈连续地面为泥土碎石、顶缘不规则〉
|
||||||
|
|
||||||
### 6.2 营地场景
|
### 6.2 营地场景
|
||||||
|
|
||||||
- **情绪与色域**:承载 §2.8——全作最暖:烛光黄 `#F6C667` × 木色 `#8A5A34`(§7.2),中等饱和,无棋盘式高对比。
|
- **情绪与色域**:承载 §2.8——全作最暖:烛光黄(`CANDLE`)× 木色族(材质族名;烛光黄 token 定值面=ui_kit,木色随场景子板与内联用色,§7.2),中等饱和,无棋盘式高对比。
|
||||||
- **场景构成**:一张可点击的营地场景图(1280×800,与工程档同幅面)。远景=天空与远山;中景=**独立成层的木围墙**(密排竖木桩、桩顶削尖、不透缝无横木)与**半开的营地大门**;近景=中央篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板。**中景带自底部往上约 2/3 处起**;**近景物件可覆盖围墙,唯一例外=中间门洞必须留空、不被任何物件遮挡**。七个可点物件的功能绑定归 `camp.md`,本节只定画法。
|
- **场景构成**:一张可点击的营地场景图(与工程基座档同幅面)。远景=天空与远山;中景=**独立成层的木围墙**(密排竖木桩、桩顶削尖、不透缝无横木)与**半开的营地大门**;近景=中央篝火、左侧锻炉铁砧、右侧帐篷与宝箱、帐篷旁的笔记本,另有木桩与挂在围墙上的布告板。**中景带位置定值归坐标表**(`camp-scene-prompts.md`,本节只定构图关系);**近景物件可覆盖围墙,唯一例外=中间门洞必须留空、不被任何物件遮挡**。七个可点物件的功能绑定归 `camp.md`,本节只定画法。
|
||||||
- **图层拆分(10 张)**:场景按「远景/中景/近景要素各自成层」拆——`scene_camp_bg` 背景层(z0,不透明全幅)=天空+远山+整片地面+门洞内一条通向远处的小路;`scene_camp_wall` 围墙层(z1,透明底)=横贯全宽密排木桩墙(左右两段)+两根略高的门柱,**门洞处留透明缺口**透出背景层的小路;`scene_camp_board` 布告板(z2)、`scene_camp_gate` 门扇(z3)、`scene_camp_dummy` 木桩/`scene_camp_forge` 锻炉/`scene_camp_tent` 帐篷(z4)、`scene_camp_chest` 宝箱/`scene_camp_notebook` 笔记本(z5)、`scene_camp_campfire` 篝火(z6,最前)=八个物件层,各透明底单件一张。**帐篷**为承载件、不可点。围墙独立成层的好处:桩高可单独锁死、门洞做透明缺口、背景层不混入暖木色。提示词与坐标 = `camp-scene-prompts.md`,消费常量 = `asset-path-map`。
|
- **图层拆分(10 张)**:场景按「远景/中景/近景要素各自成层」拆——`scene_camp_bg` 背景层(z0,不透明全幅)=天空+远山+整片地面+门洞内一条通向远处的小路;`scene_camp_wall` 围墙层(z1,透明底)=横贯全宽密排木桩墙(左右两段)+两根略高的门柱,**门洞处留透明缺口**透出背景层的小路;`scene_camp_board` 布告板(z2)、`scene_camp_gate` 门扇(z3)、`scene_camp_dummy` 木桩/`scene_camp_forge` 锻炉/`scene_camp_tent` 帐篷(z4)、`scene_camp_chest` 宝箱/`scene_camp_notebook` 笔记本(z5)、`scene_camp_campfire` 篝火(z6,最前)=八个物件层,各透明底单件一张。**帐篷**为承载件、不可点。围墙独立成层的好处:桩高可单独锁死、门洞做透明缺口、背景层不混入暖木色。提示词与坐标 = `camp-scene-prompts.md`,消费常量 = `asset-path-map`。
|
||||||
- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序)。背景层由**远景片 `bg_far`(2560×734)与地面片 `bg_floor`(2560×866)两片出图、按 y734 拼成一张**——整张一次出图时模型把远山挤到画面下半部,被围墙挡住后完全消失(实测三张里两张山体上缘落在墙顶以下)。接缝整条落在围墙背后,画面无接缝。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条裁,不做全幅(全幅约 3.9 MB 显存,细条约 0.35 MB);**实装落盘矩形 `(0, 203, 1280, 164)`、底锚 y367**(桩身 150px、门柱 164px 终稿锁定值,落带内〔围墙带 (0,203,1280,164)〕)。
|
- **交付形态**:**背景层 1 张(不透明全幅)+ 围墙层 1 张 + 八个物件层 = 10 张**,其中 9 张透明底、1 张不透明全幅 + 一份坐标表(贴图矩形/命中矩形/z 序——落盘矩形、底锚与桩/柱高的定值面=坐标表与落盘件)。背景层由**远景片与地面片两片出图、按地平线拼成一张**——整张一次出图时模型把远山挤到画面下半部,被围墙挡住后完全消失(实测三张里两张山体上缘落在墙顶以下)。接缝整条落在围墙背后,画面无接缝。**篝火例外**:命中矩形只取下半(火堆),上半(火焰)只作特效展示。围墙层落盘按细条裁,不做全幅(全幅显存开销远大于细条)。
|
||||||
- **色彩与氛围依据**:营地整体偏暖、安全温馨,与冒险中的地下城形成对比;现行口径 = 本文件 §2.8「全作最暖」与本节「情绪与色域」条,远景淡而退后、近景暖调为主。本节不复述色值;新增环境色按 §4.1 场景环境子板条款登记(每屏一套、≤32 色、过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门)。
|
- **色彩与氛围依据**:营地整体偏暖、安全温馨,与冒险中的地下城形成对比;现行口径 = 本文件 §2.8「全作最暖」与本节「情绪与色域」条,远景淡而退后、近景暖调为主。本节不复述色值;新增环境色按 §4.1 场景环境子板条款登记(每屏一套、≤32 色、过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门)。
|
||||||
- **交互四态(零新素材,全部程序化)**:悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附);按下=位移 1px;**禁用/未解锁=降明度 + 去饱和**(§2 已缩窄至情绪域,状态表达不受限),**仅锻炉(锻造工坊)与宝箱(秘宝匣)两件会有此态**;已解锁=常态。
|
- **交互四态(零新素材,全部程序化)**:悬停=**轮廓亮边 + 浮动**(浮动须整像素吸附);按下=位移 1px;**禁用/未解锁=降明度 + 去饱和**(§2 已缩窄至情绪域,状态表达不受限),**仅锻炉(锻造工坊)与宝箱(秘宝匣)两件会有此态**;已解锁=常态。
|
||||||
- **钥石余额**:常驻画面顶部的一行小 HUD 栏(高 48px,**浮层覆盖,不挤压画面**)。栏体底=`CAMP_HEADER_BAND` `#6E4526`(§7.2 五 token 对齐表在册色)× 不透明度 0.80;栏内只钥石徽章一件、右位顶格,左位不放件。呈现定值的唯一事实源=[camp](../gdd/ux/camp.md) §顶栏,本节不复述判据。验收:目检〈顶栏成一条可辨窄带,徽章落在带内〉
|
- **钥石余额**:常驻画面顶部的一行小 HUD 栏(**浮层覆盖,不挤压画面**)。栏体底=`CAMP_HEADER_BAND`(§7.2 五 token 对齐表在册色)× 半透明档;栏内只钥石徽章一件、右位顶格,左位不放件。呈现定值的唯一事实源=[camp](../ux/camp.md) §顶栏(栏高、透明度与栏体色派生定值面=ui_kit),本节不复述判据。验收:目检〈顶栏成一条可辨窄带,徽章落在带内〉
|
||||||
- **事实源边界**:解锁条件/价格/存档写入归元进度 GDD 与 `MetaProgression`;素材命名与路径归 `asset-path-map`;清单登记归 `art-assets-checklist` §3.5。
|
- **事实源边界**:解锁条件/价格/存档写入归元进度 GDD 与 `MetaProgression`;素材命名与路径归 `asset-path-map`;清单登记归 `art-assets-checklist` §3.5。
|
||||||
- **已裁(2026-11-01 用户裁)**:① **营地环境子板色值**——不前置拍板:量化场景实际用色后按 §4.1 场景环境子板条款登记(每屏一套、≤32 色、过 §4.2 语义检查与 RGB 三通道差 ≥8/255 两道门);② **门扇与门洞的高宽比例**——门扇贴图 240×138(锁定 240×147),随门洞 y283–367 压扁重画,坐标按门洞 x520–760 对齐;③ **帐篷的落地尺寸**——251×170 落位 (982, 335),上端遮住围墙下部。
|
- **已裁(2026-11-01 用户裁)**:① **营地环境子板色值**——不前置拍板:量化场景实际用色后按 §4.1 场景环境子板条款登记(每屏一套、独立上限、过 §4.2 语义检查与三通道差门两道门);② **门扇与门洞的高宽比例**——门扇随门洞压扁重画(尺寸与坐标定值面=坐标表落盘值);③ **帐篷的落地尺寸**(定值面同上,上端遮住围墙下部)。
|
||||||
|
|
||||||
### 6.3 三关图类型色板候选(board_type 换挡方向)
|
### 6.3 三关图类型色板候选(board_type 换挡方向)
|
||||||
|
|
||||||
- **模板与不变槽**:换皮只换 §4.3 四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`),信息与语义层全图类型恒定——本节的三关两槽终值**已冻结**。**冻结口径(本节不抄色值字面量)**:各关 `tile_closed` 终值=该关在役墙瓦片三块底型件(素砖/裂纹/碎石斑)顶面受光档的实测最亮值,`wall_ambient` 取同关同槽值(两槽同值;同属 §4.1 分层②场景环境子板,零新增色值、不占 48 额度);实测值与准入判定只在执行件里算,执行件用法登记见 [art-pipeline-tools](art-pipeline-tools.md)。**冻结凭据**=「三关色相 × 五组类型微光」互辨抽测闭合(机检 17 项 0 红+目检四条全过;抽测样图与 2026-11-05 出图件同哈希,目检面未重跑)+ §1.4 格子样张重跑机检 30/31 绿(唯一红灯=改前/改后对拍一件,因在途素材区无改前基线件、属素材区环境坑不属色板回归,沿革查 git 提交史)——砖面形态与色板维持冻结。验收:机检〈三关行两槽终值与互辨抽测执行件的实测读数同值(该件三行铺底代表值判定全过),且本节三关行不含色值字面量〉
|
- **模板与不变槽**:换皮只换 §4.3 四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`),信息与语义层全图类型恒定——本节的三关两槽终值**已冻结**。**冻结口径(本节不抄色值字面量)**:各关 `tile_closed` 终值=该关在役墙瓦片三块底型件(素砖/裂纹/碎石斑)顶面受光档的实测最亮值,`wall_ambient` 取同关同槽值(两槽同值;同属 §4.1 分层②场景环境子板,零新增色值、不占 48 额度);实测值与准入判定只在执行件里算,执行件用法登记见 [art-pipeline-tools](art-pipeline-tools.md)。**冻结凭据**=「三关色相 × 五组类型微光」互辨抽测闭合(机检 17 项 0 红+目检四条全过;抽测样图与 2026-11-05 出图件同哈希,目检面未重跑)+ §1.4 格子样张重跑机检 30/31 绿(唯一红灯=改前/改后对拍一件,因在途素材区无改前基线件、属素材区环境坑不属色板回归,沿革查 git 提交史)——砖面形态与色板维持冻结。验收:机检〈三关行两槽终值与互辨抽测执行件的实测读数同值(该件三行铺底代表值判定全过),且本节三关行不含色值字面量〉
|
||||||
- **三关背景变体**:§6.1 的三张背景取本节三关方向作为岩体形态、剪影语言与色族差异(dungeon 暖石棕+地精巢穴支洞/木栈道/木桩围栏;underdark 冷蓝灰+卓尔巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;deep_underdark 灰黑+灰矮人石笋城郭/棱角石厅/矿道口/烟囱塔);背景不复用 `wall_ambient` tint(该槽作用于棋盘/世界),背景色值归战斗屏场景环境子板。验收:目检〈三关背景可辨为不同洞窟,非同一图换色〉
|
- **三关背景变体**:§6.1 的三张背景取本节三关方向作为岩体形态、剪影语言与色族差异(dungeon 暖石棕+地精巢穴支洞/木栈道/木桩围栏;underdark 冷蓝灰+卓尔巨柱/石笋/蛛网/螺旋塔剪影/巨菇/石桥;deep_underdark 灰黑+灰矮人石笋城郭/棱角石厅/矿道口/烟囱塔);背景不复用 `wall_ambient` tint(该槽作用于棋盘/世界),背景色值归战斗屏场景环境子板。验收:目检〈三关背景可辨为不同洞窟,非同一图换色〉
|
||||||
- **深度轴叙事**(§2.7 下探过渡):色相层进预告「更深更险」,明度档不动——
|
- **深度轴叙事**(§2.7 下探过渡):色相层进预告「更深更险」,明度档不动——
|
||||||
- **dungeon 地精洞窟**(第一关):现行掩尘系暖石棕(`#C9AF83` 基)即基准档,`wall_ambient` 暖棕;
|
- **dungeon 地精洞窟**(第一关):现行掩尘系暖石棕(掩尘枚基)即基准档,`wall_ambient` 暖棕;
|
||||||
- **underdark 幽暗地域**(第二关;方向:**冷调幽暗**):主调**灰白蓝**候选(低饱和蓝灰域,`tile_closed`),少量紫黑倾向点缀——紫系取紫罗兰域(≈256°)候选,禁入带 300°–345° 不变;`wall_ambient` 冷蓝灰;
|
- **underdark 幽暗地域**(第二关;方向:**冷调幽暗**):主调**灰白蓝**候选(低饱和蓝灰域,`tile_closed`),少量紫黑倾向点缀——紫系取紫罗兰域(微光魔法组同域)候选,禁入带不变;`wall_ambient` 冷蓝灰;
|
||||||
- **deep_underdark 灰矮人矿城**(第三关;方向:**灰黑主调 + 矿脉金属色点缀**候选,守 §4.1 明度地板 L≥0.30):矿脉点缀走金属质感族(冷银/铜灰候选)——「金属色」以材质感承载,奖励金亮金仍禁上格底(§4.2),不占用收益语义金;`wall_ambient` 铁灰。
|
- **deep_underdark 灰矮人矿城**(第三关;方向:**灰黑主调 + 矿脉金属色点缀**候选,守 §4.1 明度地板):矿脉点缀走金属质感族(冷银/铜灰候选)——「金属色」以材质感承载,奖励金亮金仍禁上格底(§4.2),不占用收益语义金;`wall_ambient` 铁灰。
|
||||||
- **共同纪律**:三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险);避 300°–345° 禁入带;L≥0.30、饱和 ≤0.55(§4.1 硬指标)。
|
- **共同纪律**:三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险);避禁入带;亮度地板与饱和上限同 §4.1 硬指标(门值定值面=互辨抽测件)。
|
||||||
|
|
||||||
### 6.4 关卡间下探过渡
|
### 6.4 关卡间下探过渡
|
||||||
|
|
||||||
@@ -418,10 +418,10 @@
|
|||||||
|
|
||||||
> **白话**:战斗棋盘不再整板可见——只有以角色为中心的菱形灯光区看得清,区外没开过的格子沉入全黑,开过的格子留下灰阶的「记忆」。像在洞穴里举灯探索。机制规则(可见性/生命周期/纯呈现纪律)的现行事实源 =《HUD框架》「视野迷雾:菱形灯光区与黑暗边界」节(全项目唯一事实源,引用只指路),该节点名「黑暗区域渲染规格(暗淡态明度、迷雾过渡)归 art-bible」,本节即其承载——只管"怎么画",不复述机制。纯呈现层:格态、数字真值、清图判定零影响;零素材新增(全部程序化遮罩/调制);类型微光语义零改动。
|
> **白话**:战斗棋盘不再整板可见——只有以角色为中心的菱形灯光区看得清,区外没开过的格子沉入全黑,开过的格子留下灰阶的「记忆」。像在洞穴里举灯探索。机制规则(可见性/生命周期/纯呈现纪律)的现行事实源 =《HUD框架》「视野迷雾:菱形灯光区与黑暗边界」节(全项目唯一事实源,引用只指路),该节点名「黑暗区域渲染规格(暗淡态明度、迷雾过渡)归 art-bible」,本节即其承载——只管"怎么画",不复述机制。纯呈现层:格态、数字真值、清图判定零影响;零素材新增(全部程序化遮罩/调制);类型微光语义零改动。
|
||||||
|
|
||||||
- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ LIGHT_RADIUS** 的格集,区内照常渲染。LIGHT_RADIUS 走表值/常量参数化,**基准 8**——现行事实源「灯光区起步半径=微光环 8 格」的落码取值(半径数值沿微光「周围 8 格」的 8 起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身 8 邻格(与可挖域同圈,现行事实源《HUD框架》「未开格类型微光」节),**不随灯光区扩**(权威文档配套裁决)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:FOG_LANTERN_BONUS = **+2**(flat 整数档,权威文档配套裁决;落码常量名 `board_view.gd FOG_LANTERN_BONUS`),**已接效果入库**(载体=秘宝·同调位 fog_lantern「魔法提灯」行,组合根每战装配链显式重算接线;呈现画法零改动——本节只管"怎么画",机制现行事实源仍归《HUD框架》)。边界随角色格位逐格重算,无半径插值动画。←现行事实源;§2 光照氛围允许域
|
- **菱形灯光区(遮罩几何)**:灯光区 = 以角色所在格为中心、**曼哈顿距离 ≤ 灯光半径**的格集,区内照常渲染。灯光半径走表值/常量参数化(半径定值面=棋盘渲染常量——沿微光「周围 8 格」的圈起步,实测后可调)。**两圈分立注**:类型微光作用圈 = 英雄贴身邻格圈(与可挖域同圈,现行事实源《HUD框架》「未开格类型微光」节),**不随灯光区扩**(权威文档配套裁决)——灯光区只裁可见性,微光锚仍是可挖域,两圈几何分立、半径参数互不读写。提灯插值位:FOG_LANTERN_BONUS(flat 整数档,权威文档配套裁决;定值面=棋盘渲染常量),**已接效果入库**(载体=秘宝·同调位 fog_lantern「魔法提灯」行,组合根每战装配链显式重算接线;呈现画法零改动——本节只管"怎么画",机制现行事实源仍归《HUD框架》)。边界随角色格位逐格重算,无半径插值动画。←现行事实源;§2 光照氛围允许域
|
||||||
- **区外未开格:全黑不渲染(不透明档,照抄现行事实源)**:现行事实源原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③现行事实源验收线「区外未开格不可见」须二值态才能逐格断言。←现行事实源;§4.2
|
- **区外未开格:全黑不渲染(不透明档,照抄现行事实源)**:现行事实源原文「区外**未开格=全黑不渲染**」——不透明纯黑(L=0),**非高遮蔽半透档**。理由注记(为何不用高遮蔽档):①三档信息阶梯干净——未开格不可见=零信息、记忆格=弱信息、活格=全信息,叠读不打架;②高遮蔽档下砖面纹理隐约残留,与「类型微光=未开格唯一信息通道」(§4.2/§4.6.3)冲突——纹理残影泄格面观感;③现行事实源验收线「区外未开格不可见」须二值态才能逐格断言。←现行事实源;§4.2
|
||||||
- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地板纹理原样 + 灰罩压顶**——纹理直画后 `FOG_MEMORY_PLATE #3A3A3A` α0.66 灰罩盖顶,素材零改动(原「程序化素色记忆板平涂」已弃用);格内元素灰阶随罩隐现:**记忆墨 #C4C4C4(中性灰 L≈0.55)**。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。**封印印记不在记忆态面**:印记只落在未开格,区外未开格全黑——印记随格隐没、灯光区移回复显(纯呈现,封印数据零影响,现行事实源的显式推论)。←HUD框架 可访问性基线;§4.1;§3.2
|
- **区外已开格:暗淡记忆态(灰显可读档)**:画法 = **地板纹理原样 + 灰罩压顶**——纹理直画后 `FOG_MEMORY_PLATE` 灰罩盖顶(定值面=ui_kit 迷雾常量组),素材零改动(原「程序化素色记忆板平涂」已弃用);格内元素灰阶随罩隐现:**记忆墨**(定值面=ui_kit 迷雾记忆墨枚,中性灰档)。双峰板色牌格在记忆态**退牌归板**——牌面并入记忆态、数字以记忆墨直画。**封印印记不在记忆态面**:印记只落在未开格,区外未开格全黑——印记随格隐没、灯光区移回复显(纯呈现,封印数据零影响,现行事实源的显式推论)。←HUD框架 可访问性基线;§4.1;§3.2
|
||||||
- **记忆态可读性判据**:数字对合成底**归一后(真实渲染面)三关 ≥4.5:1**(WCAG 硬指标;合成底 L1 #4C4038/L2 #3F4147/L3 #3E4048;行值与素材随动,测点=ui_contrast_probe 迷雾段)。**归一注**:装载亮度归一是现行生产路径(`board_view._normalize_floor_luma`),原图均值≠渲染面,复算须落归一后底。可辨性自查(三通道,随样张/实机自检):①对全黑未开格——合成底 #3E3731(L≈0.036)对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨 L0.55 对亮墨三档 L≥0.75 / 色牌 #F5EAD3 L≈0.83,灰度 ΔL≥0.20)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。验收:机检〈ui_contrast_probe 迷雾段记忆墨对比 ≥4.5:1〉←§1.4
|
- **记忆态可读性判据**:数字对合成底**归一后(真实渲染面)三关过 WCAG AA**(合成底行值与素材随动——素材侧色即迷雾合成底件;测点=ui_contrast_probe 迷雾段)。**归一注**:装载亮度归一是现行生产路径(棋盘装载链归一化目标常量),原图均值≠渲染面,复算须落归一后底。可辨性自查(三通道,随样张/实机自检):①对全黑未开格——合成底对 L0,实机目检常光档可分(暗房档一并抽检);②对灯光区内活态已开格——主判据=数字墨灰度差(记忆墨中性灰对亮墨三档与色牌暖纸白;灰度差门槛定值面=对比探针)+ 色相通道(记忆态近中性灰,对活态暖底暖墨);③格态三形在记忆态保持灰度可辨——形通道经纹理+灰罩形态不变,沿 §1.4 验收 2 同源判据。验收:机检〈ui_contrast_probe 迷雾段记忆墨对比过门槛〉←§1.4
|
||||||
- **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②现行事实源验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与砖面整格表达(§3.2 高墙瓦片体系)、ITB 格内信息分层气质同轴。无动画,减动效无涉。←现行事实源;§1.2 原则一;§3.2
|
- **迷雾过渡边:硬边(逐格二值)**:灯光区边界 = **整格二值切换**(区内全渲染 / 区外全黑或记忆态),**不做渐变过渡带、不做半透明晕边**。理由:①边界是信息边界不是氛围晕——渐变中间态 =「看得见但看不清」,破数字可读硬指标与记忆态明度档;②现行事实源验收断言(边界格呈态、两态逐位一致)须格级二值可判;③与砖面整格表达(§3.2 高墙瓦片体系)、ITB 格内信息分层气质同轴。无动画,减动效无涉。←现行事实源;§1.2 原则一;§3.2
|
||||||
- **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加规则 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。验收:机检〈叠加态下记忆态灰显不被二次调制〉
|
- **与结算期去饱和的叠加共存**:结算期去饱和偏移(settlement_fx_view,同族先例)与迷雾调制叠加规则 = **记忆态为终态档**——区外已开格在结算期保持记忆态档、**不再叠加**结算去饱和(灰显已含去饱和语义,二次调制无信息增量且明度不可控);灯光区内格照常吃结算去饱和;全黑格两态无差。叠加态随实施批共存校验 + 探针断言(provisional,实机目检可代拍)。验收:机检〈叠加态下记忆态灰显不被二次调制〉
|
||||||
|
|
||||||
@@ -436,33 +436,33 @@
|
|||||||
**半拟物:容器穿戏服,数据素面。**面板=石板圆角矩形(与地砖同圆角率,全 UI 恒定),按钮=凸圆角的"可按的砖"(按压态=下沉一档,运动手段 §2),仪式性确认(胜利等)=圆形蜡封(呼应 §2.4);数字框、准线、进度条一律直角细线、无纹理;**数字色牌 = 直角小素牌**(后备件)——宽随数字位、无纹理无装饰,仅复杂格底兜底时垫于数字正下方一层(色值 §4.1),属"须精确的信息"侧、走直角律。判据:圆角=可触摸的物件,直角=须精确的信息。与参考分界:取 ITB 的信息分层,弃其冷硬斜切 HUD;取 Moonlighter 的木石亲和,不做全拟物。验收:目检〈面板圆角/按钮凸圆角/数据直角三态可辨〉
|
**半拟物:容器穿戏服,数据素面。**面板=石板圆角矩形(与地砖同圆角率,全 UI 恒定),按钮=凸圆角的"可按的砖"(按压态=下沉一档,运动手段 §2),仪式性确认(胜利等)=圆形蜡封(呼应 §2.4);数字框、准线、进度条一律直角细线、无纹理;**数字色牌 = 直角小素牌**(后备件)——宽随数字位、无纹理无装饰,仅复杂格底兜底时垫于数字正下方一层(色值 §4.1),属"须精确的信息"侧、走直角律。判据:圆角=可触摸的物件,直角=须精确的信息。与参考分界:取 ITB 的信息分层,弃其冷硬斜切 HUD;取 Moonlighter 的木石亲和,不做全拟物。验收:目检〈面板圆角/按钮凸圆角/数据直角三态可辨〉
|
||||||
|
|
||||||
- **极性强调冗余**(§4.5⑦):UI 红/金强调对必须补图标+文案冗余;破坏性确认与常规确认禁止同位(位置通道)。验收:目检〈红/金强调位有图标+文案,破坏性确认独立位〉
|
- **极性强调冗余**(§4.5⑦):UI 红/金强调对必须补图标+文案冗余;破坏性确认与常规确认禁止同位(位置通道)。验收:目检〈红/金强调位有图标+文案,破坏性确认独立位〉
|
||||||
- **圆角率单点注记**:容器/按钮圆角值收敛为全站唯一 `RADIUS_OBJECT = 5`(ui_kit 单点;面板与按钮同圆角率即满足本节「全 UI 恒定圆角率」);数据框/数字牌/AP 点阵/准线/血条维持 0 直角;**例外三件保留**=标题屏底座椭圆 17/结算金印 200(圆形蜡封)/状态脉冲环 100(圆形)。验收:机检〈ui_kit 圆角取值仅 RADIUS_OBJECT 与例外三件〉
|
- **圆角率单点注记**:容器/按钮圆角值收敛为全站唯一 `RADIUS_OBJECT`(ui_kit 单点;面板与按钮同圆角率即满足本节「全 UI 恒定圆角率」);数据框/数字牌/AP 点阵/准线/血条维持直角;**例外三件保留**(标题屏底座椭圆/结算金印圆形蜡封/状态脉冲环圆形——取值定值面=ui_kit 例外常量组)。验收:机检〈ui_kit 圆角取值仅 RADIUS_OBJECT 与例外三件〉
|
||||||
- **九宫格切片注记**:panel 石皮 `PANEL_SLICE = 16`(button 维持 8、仪式框维持 12——素材 panel_stone/button_stone 均 48×48 不动);`panel_skinned` 工厂内 **content margin clamp**=低于切片的分量自动抬到切片(石框纹理不吃内容;工厂单点,调用点零改)。验收:机检〈九宫格面板切片 16、边角无错位〉
|
- **九宫格切片注记**:panel 石皮 `PANEL_SLICE`(button/仪式框各维持其档——素材件不动;切片值定值面=ui_kit 切片常量组);`panel_skinned` 工厂内 **content margin clamp**=低于切片的分量自动抬到切片(石框纹理不吃内容;工厂单点,调用点零改)。验收:机检〈九宫格面板切片与 ui_kit 常量一致、边角无错位〉
|
||||||
- **资产渠道**:♻ 九宫格面板/按钮改色过复用闸优先(清单 §0),⚙ 兜底;样式终稿随 §1.4 样张闸后定稿。验收:方向性
|
- **资产渠道**:♻ 九宫格面板/按钮改色过复用闸优先(清单 §0),⚙ 兜底;样式终稿随 §1.4 样张闸后定稿。验收:方向性
|
||||||
- **占位完成条款**:程序化占位 = **临时态**,任何屏的终稿闸 = §1.4 整屏样张过闸;占位态禁止跨里程碑。验收:目检〈过闸屏无程序化占位残留〉
|
- **占位完成条款**:程序化占位 = **临时态**,任何屏的终稿闸 = §1.4 整屏样张过闸;占位态禁止跨里程碑。验收:目检〈过闸屏无程序化占位残留〉
|
||||||
- **实现侧边界**:样式收敛 ui_kit;ui_kit 的工程契约归《HUD框架》,本节不重述。
|
- **实现侧边界**:样式收敛 ui_kit;ui_kit 的工程契约归《HUD框架》,本节不重述。
|
||||||
|
|
||||||
### 7.2 UI 色板细则(自 §4.4 迁入)
|
### 7.2 UI 色板细则(自 §4.4 迁入)
|
||||||
|
|
||||||
**全局文字可读性硬指标**:**一切文字**(含菜单/说明/tooltip/按钮/底栏,无区域例外)对其直接背景 **≥4.5:1**(WCAG AA);大字(≥18px 或加粗档)底线 3:1、目标 4.5:1;**文字禁直接压纹理底**——垫容器或罩层。**站桩石板地台面同理**(显式落法):地台板身 `#968264` 是 §6.1 定死的世界中层承载面,暖白 `#F0E2C8` 对其实测仅 2.89:1,文字禁直接压地台面——须垫容器、素牌或罩层,或落进结算明细带的素底。核验闸 = §1.4 整屏样张。验收:机检〈ui_contrast_probe 全文字位 ≥4.5:1;B 区站桩文字位正下方像素非地台板身色 #968264〉
|
**全局文字可读性硬指标**:**一切文字**(含菜单/说明/tooltip/按钮/底栏,无区域例外)对其直接背景过 **WCAG AA**;大字按 WCAG 大字档(底线与目标分级);**文字禁直接压纹理底**——垫容器或罩层。**站桩石板地台面同理**(显式落法):地台板身 `STAND_STONE`(定值面=ui_kit)是 §6.1 定死的世界中层承载面,暖白墨对其实测不达门槛,文字禁直接压地台面——须垫容器、素牌或罩层,或落进结算明细带的素底。核验闸 = §1.4 整屏样张。验收:机检〈ui_contrast_probe 全文字位过门槛;B 区站桩文字位正下方像素非地台板身色(定值面=ui_kit 地台枚)〉
|
||||||
|
|
||||||
**数据素面的墨来自世界的墨**:UI 数字、进度、准线一律主墨 `#33261B` 系——棋盘与面板读同一种墨;容器穿木石材质色,数据只穿墨。**营地与棋盘**:菜单容器背景用全作最暖的烛光黄 `#F6C667` 与木色 `#8A5A34`(§2.8;场景构成 §6.2);战斗容器转中性石色,防暖色渗入棋盘分走数字对比预算——氛围色向可读色让路。UI 不新增语义色,一切强调沿用 §4.2。**暗底呈现态双色墨制**(样张冻结):暗底系(已过/未来/候选/Boss 方块、暗数据框)图标与读数一律暖白 `#F0E2C8`(WARM)、亮底(当前金 `#F0A828`)转深墨 `#181410`(INK_ROUTE)——各态对比 ≥4.5:1;已过节点暗金冻结 `GOLD_DONE #68562C`(专用呈现态值;旧 GOLD_DIM 对双色墨不达标、已退出该呈现位);Boss 描边 = 紫赤 2px + 外缘 1px 深墨环(灰度冗余通道——§4.2 色相独占本色不变,§4.5 灰度可分类承载)。验收:机检〈暗底/亮底各态文字对比 ≥4.5:1〉
|
**数据素面的墨来自世界的墨**:UI 数字、进度、准线一律主墨系——棋盘与面板读同一种墨(定值面=ui_kit 主墨枚);容器穿木石材质色,数据只穿墨。**营地与棋盘**:菜单容器背景用全作最暖的烛光黄与木色(§2.8;场景构成 §6.2;烛光黄 token 定值面=ui_kit `CANDLE`,木色随场景子板);战斗容器转中性石色,防暖色渗入棋盘分走数字对比预算——氛围色向可读色让路。UI 不新增语义色,一切强调沿用 §4.2。**暗底呈现态双色墨制**(样张冻结):暗底系(已过/未来/候选/Boss 方块、暗数据框)图标与读数一律暖白、亮底(当前金)转深墨(各态对比过门槛;各态呈现态值——含已过节点暗金专用态——定值面=ui_kit 暗底呈现态常量组);Boss 描边 = 紫赤细边 + 外缘深墨环(灰度冗余通道——§4.2 色相独占本色不变,§4.5 灰度可分类承载)。验收:机检〈暗底/亮底各态文字对比过门槛〉
|
||||||
|
|
||||||
- **琥珀双岗注记**:主操作色与收益金分轨——主按钮/候选节点/钥石徽章底用烛光黄 `#F6C667`(CANDLE,独立 token),奖励数字/钥石读数/地图「当前位置」仍独占 §4.1 奖励金 `#F0A828`。烛光黄族身兼「主操作 + 收益邻近氛围」双岗系主动取舍,非疏忽,防回改。底色三件套:BG_ROOT `#3A2E22`/BG_OVERLAY `#362B20`/BG_BRIGHT `#453723`(配色总纲「提暖提亮禁近黑」);暖米族 WARM_SOFT `#E8D5A8`/WARM_FAINT `#CDB88C`(「米色去灰」)。验收:方向性
|
- **琥珀双岗注记**:主操作色与收益金分轨——主按钮/候选节点/钥石徽章底用烛光黄(CANDLE,独立 token),奖励数字/钥石读数/地图「当前位置」仍独占 §4.1 奖励金。烛光黄族身兼「主操作 + 收益邻近氛围」双岗系主动取舍,非疏忽,防回改。底色三件套(`BG_ROOT`/`BG_OVERLAY`/`BG_BRIGHT`)与暖米族(`WARM_SOFT`/`WARM_FAINT`)定值面=ui_kit(配色总纲「提暖提亮禁近黑」「米色去灰」)。验收:方向性
|
||||||
- **色板五件对齐注记(来源 = 原型 demo)**:数据板 `PANEL_DATA #E9D9B8`/板线 `PANEL_BORDER #786E58`/状态槽底 `SLOT_BACKDROP #3E362C`/血条深底 `HP_BAR_BACK #282220`/营地头带 `CAMP_HEADER_BAND #6E4526` 五 token 取值向原型 v2.1 对齐(Δ≤6/255 目视不可辨)。色板唯一来源 = ui_kit 单点不变;原型文件只读不改(artwork 红线)。验收:机检〈ui_kit 五 token 与本表一致〉
|
- **色板五件对齐注记(来源 = 原型 demo)**:数据板 `PANEL_DATA`/板线 `PANEL_BORDER`/状态槽底 `SLOT_BACKDROP`/血条深底 `HP_BAR_BACK`/营地头带 `CAMP_HEADER_BAND` 五 token 取值向原型对齐(容差内目视不可辨;容差定值面=ui_kit 对齐注记)。色板唯一来源 = ui_kit 单点不变;原型文件只读不改(artwork 红线)。验收:机检〈ui_kit 五 token 与对齐注记一致〉
|
||||||
|
|
||||||
### 7.3 布局栅格
|
### 7.3 布局栅格
|
||||||
|
|
||||||
- **结构**:双舞台三区(B 战斗画面/C 数据框/D 棋盘;字母保持不重编)为结构冻结项,分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`,分区尺寸与像素级裁决归 battle.md(HUD框架只载 1280×800 基座口径,不复写数值)。验收:机检〈三区结构常驻〉
|
- **结构**:双舞台三区(B 战斗画面/C 数据框/D 棋盘;字母保持不重编)为结构冻结项,分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`,分区尺寸与像素级裁决归 battle.md(HUD框架只载基座档口径,不复写数值)。验收:机检〈三区结构常驻〉
|
||||||
- **栅格规则(候选)**:面板间距/内边距按 4px 步进档(8/12/16/24 候选),全 UI 恒定;数据区直角细线不占圆角预算。终值归样张。验收:目检〈间距落在步进档〉
|
- **栅格规则(候选)**:面板间距/内边距按步进档(步长与档位候选,定值面=ui_kit 间距常量或样张冻结),全 UI 恒定;数据区直角细线不占圆角预算。终值归样张。验收:目检〈间距落在步进档〉
|
||||||
|
|
||||||
### 7.4 字体与字号
|
### 7.4 字体与字号
|
||||||
|
|
||||||
- **字体**:全局一套像素字,单套即终稿——缝合像素字体 Fusion Pixel(OFL,已接入 `game/assets/fonts/ui_font_fusion_pixel_zh_hans.ttf`),拉丁字符与数字沿用其自带拉丁字形,不另设拉丁专件(现状即终稿;旧拉丁候选 Kenney Fonts 已弃;生产工单=清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。验收:机检〈主题字体指向 Fusion Pixel 件〉
|
- **字体**:全局一套像素字,单套即终稿——缝合像素字体 Fusion Pixel(OFL,已接入 `game/assets/fonts/ui_font_fusion_pixel_zh_hans.ttf`),拉丁字符与数字沿用其自带拉丁字形,不另设拉丁专件(现状即终稿;旧拉丁候选 Kenney Fonts 已弃;生产工单=清单 §3.6);墨色走主墨系(§7.2);换字体 = 全局决策。验收:机检〈主题字体指向 Fusion Pixel 件〉
|
||||||
- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(1280×800 基座):棋盘数字 ≥18px(公式 = `max(18, ceil(格边长 × 0.5))`不变)、**正文/明细 ≥16px、tooltip ≥14px**(1280×800 低于 1080p 基准,同字号实际更小)。验收:机检〈静态文字位点字号 ≥ 档位表值〉
|
- **字号**:像素字体**整数倍缩放,禁非整数缩放**(像素模糊);下限(基座档;基座档低于 1080p 基准,同字号实际更小):棋盘数字(公式与下限定值面=ui_kit 字号常量与棋盘格公式,不随本节复述)、正文/明细与 tooltip 下限走字号档位表。验收:机检〈静态文字位点字号 ≥ 档位表值〉
|
||||||
- **字号档位表(六档)**:全站 UI 文字字号只经 `UiKit.FS_*` 单点取值,裸数字字号弃用——`FS_CAPTION 12`/`FS_HINT 14`/`FS_BODY 16`/`FS_SUB 18`/`FS_TITLE 24`/`FS_H1 34`。旧实测档按就近归档收编(10/11/12→CAPTION、13/14→HINT、15/16→BODY、17/18/20→SUB、21/22/24/26→TITLE、32/40→H1;静态位点全归档,数据驱动动态字号位点除外);棋盘数字公式 `maxi(18, ceil(格边长×0.5))` 与站桩血数 11px(条带内读数豁免)不入表。注:六档相邻比 12→14→16→18 三段 <1.25×,系裁决值优先于字重纪律的档差参考线,该参考线对新层级设计仍有效。验收:机检〈全站无裸数字字号,位点走 FS_*〉
|
- **字号档位表(六档)**:全站 UI 文字字号只经 `UiKit.FS_*` 单点取值,裸数字字号弃用——六档(caption/hint/body/sub/title/h1)档值定值面=ui_kit 字号常量组。旧实测档按就近归档收编(归档映射沿革查 git 提交史;静态位点全归档,数据驱动动态字号位点除外);棋盘数字公式与站桩血数(条带内读数豁免,见下条)不入表。注:相邻档比有不足 1.25× 的段,系裁决值优先于字重纪律的档差参考线,该参考线对新层级设计仍有效(档差比定值面=ui_kit 常量组)。验收:机检〈全站无裸数字字号,位点走 FS_*〉
|
||||||
- **小字号豁免条款(合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等 ≤12px 高带)内居中的数字,受条带高度物理约束,维持 11px 下限,且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数 11px 压 HP_BAR_BACK 牌 14.3:1);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 **12px**。**豁免逐处清单(撤除史归 git 提交史,余清单如下)**:条带内读数=B 区站桩血数一处;装饰 caption 档(FS_CAPTION)在册面=棋盘底操作提示条/营地柜台说明文与结构位预留注记/图例 RAP 词条说明/设置警示文两处/关卡地图底栏组标(生命/属性/特性)与分隔系/站桩消散提示/B 区状态槽微计数(×N●○)/bcard 脚注/RAP 反馈行/刷新余量徽标——清单外 11-13px 文字一律按正文/tooltip 下限提档,新增 caption 位须同批增补本清单。**站桩顺位徽标 ①②③ 不增列本清单**:既不在①条带内读数在册面、也不在②装饰 caption 在册面,按本条纪律取 `FS_HINT` 14 归六档;为它单独入册等于开第二口子,与「合并单条不开两口子」的立条理由正面相撞。**站桩名字行同理**:名字行(敌人名与护甲文字)承载须精确读取的信息,不在①②两在册面,按本条纪律取 `FS_HINT` 14 归六档、不增列②在册面,名字行几何(素底牌矩形、文字基线、宽度测量)随档位联动。②装饰 caption 在册面逐处维持不变。验收:机检〈豁免文字位均可对上本清单,清单外无 <14px;站桩顺位徽标与站桩名字行绘制点取 UiKit.FS_HINT,且②在册面不含该两位〉
|
- **小字号豁免条款(合并单条不开两口子)**:下款两类**豁免于本节下限**——①**条带内读数**:压在窄条带(血条/进度条等)内居中的数字,受条带高度物理约束,维持条带读数豁免下限(豁免下限与实装对比定值面=ui_kit 豁免常量与对比探针读数),且必须按 §7.2 垫素色牌后计对比(实装=B 区站桩血数压 HP_BAR_BACK 牌);②**装饰性 overline/caption**:不承载须精确读取的信息、仅作分区标题或氛围小字者,可至 caption 档(`FS_CAPTION`)。**豁免逐处清单(撤除史归 git 提交史,余清单如下)**:条带内读数=B 区站桩血数一处;装饰 caption 档(FS_CAPTION)在册面=棋盘底操作提示条/营地柜台说明文与结构位预留注记/图例 RAP 词条说明/设置警示文两处/关卡地图底栏组标(生命/属性/特性)与分隔系/站桩消散提示/B 区状态槽微计数(×N●○)/bcard 脚注/RAP 反馈行/刷新余量徽标——清单外低于 hint 档的文字一律按正文/tooltip 下限提档,新增 caption 位须同批增补本清单。**站桩顺位徽标 ①②③ 不增列本清单**:既不在①条带内读数在册面、也不在②装饰 caption 在册面,按本条纪律取 `FS_HINT` 归六档;为它单独入册等于开第二口子,与「合并单条不开两口子」的立条理由正面相撞。**站桩名字行同理**:名字行(敌人名与护甲文字)承载须精确读取的信息,不在①②两在册面,按本条纪律取 `FS_HINT` 归六档、不增列②在册面,名字行几何(素底牌矩形、文字基线、宽度测量)随档位联动。②装饰 caption 在册面逐处维持不变。验收:机检〈豁免文字位均可对上本清单,清单外无低于 hint 档文字;站桩顺位徽标与站桩名字行绘制点取 UiKit.FS_HINT,且②在册面不含该两位〉
|
||||||
- **字重纪律(字重两档不启用)**:层级手段为两件——**字号档差(相邻层级 ≥1.25×)+ 墨色深浅**;全局单字重,不上第二个字重(**重开钩子已注销**——整屏样张复核确认:屏内各级文字全部能归进本节六档字号,顺位徽标与站桩名字行两处按本节纪律提档即可,屏内实测对比全部达标(暖白对舞台底 9.49:1、GOLD_BRIGHT 6.47:1、血数 14.3:1),**未实证标题层级不足**,维持单字重,不另立条目);数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。验收:机检〈主题仅注册单字重〉/目检〈屏内标题与正文层级仅靠字号档差与墨色深浅两件即可分辨,无一处需要第二字重才读得清〉
|
- **字重纪律(字重两档不启用)**:层级手段为两件——**字号档差(相邻层级按档差参考线)+ 墨色深浅**;全局单字重,不上第二个字重(**重开钩子已注销**——整屏样张复核确认:屏内各级文字全部能归进本节六档字号,顺位徽标与站桩名字行两处按本节纪律提档即可,屏内实测对比全部达标(读数在案),**未实证标题层级不足**,维持单字重,不另立条目);数字禁描边/阴影伪加粗不变(字形为唯一数值载体,§4.1 同源纪律)。验收:机检〈主题仅注册单字重〉/目检〈屏内标题与正文层级仅靠字号档差与墨色深浅两件即可分辨,无一处需要第二字重才读得清〉
|
||||||
|
|
||||||
### 7.5 营地界面
|
### 7.5 营地界面
|
||||||
|
|
||||||
@@ -475,18 +475,18 @@
|
|||||||
**(一)按钮五态矩阵(冒烟五态断言在闸)**
|
**(一)按钮五态矩阵(冒烟五态断言在闸)**
|
||||||
|
|
||||||
- **五态齐全**:全站按钮(普通/主/危险三厂)必须五态非空——常态 / 悬停 / 按下 / 禁用 / 键盘焦点;任一态缺档即违本条。验收:机检〈冒烟五态断言全绿〉
|
- **五态齐全**:全站按钮(普通/主/危险三厂)必须五态非空——常态 / 悬停 / 按下 / 禁用 / 键盘焦点;任一态缺档即违本条。验收:机检〈冒烟五态断言全绿〉
|
||||||
- **悬停 = 常态图 + modulate 提亮**:提亮档 `Color(1.06,1.06,1.06)`,零素材;主钮承 `CANDLE.lightened(0.06)` 同纪律。验收:机检〈悬停态样式非空且非常态图直贴〉
|
- **悬停 = 常态图 + modulate 提亮**:提亮档定值面=ui_kit 悬停提亮常量,零素材;主钮承烛光黄提亮同纪律。验收:机检〈悬停态样式非空且非常态图直贴〉
|
||||||
- **按下 = 本族下沉**:石纹钮 `button_stone_pressed` 九宫格;危险钮补本族 pressed 深档(深红 `darkened(0.18)`)。验收:机检〈三厂 pressed 样式各归本族〉
|
- **按下 = 本族下沉**:石纹钮 `button_stone_pressed` 九宫格;危险钮补本族 pressed 深档(深档派生定值面=ui_kit 按下派生常量)。验收:机检〈三厂 pressed 样式各归本族〉
|
||||||
- **禁用 = 本族底 + α0.45 幽灵化**:flat 两厂 bg+border 同 α 全幽灵化;文字禁用色同档。(注:本条管 **UI 按钮**;营地场景图里的**物件**禁用态另按 §6.2——降明度 + 去饱和,不走 α 幽灵化。)验收:机检〈禁用态非按压图、α0.45〉
|
- **禁用 = 本族底 + α 幽灵化**:flat 两厂 bg+border 同透明度全幽灵化(透明度定值面=ui_kit 禁用透明度常量);文字禁用色同档。(注:本条管 **UI 按钮**;营地场景图里的**物件**禁用态另按 §6.2——降明度 + 去饱和,不走 α 幽灵化。)验收:机检〈禁用态非按压图、按禁用透明度常量幽灵化〉
|
||||||
- **键盘焦点 = INK 2px 内缩 1px 环**:负 expand margin 实现内缩;引擎 focus 样式盒叠加绘制、不遮钮底;逐实例 override、**主题层零新增词条**(冒烟双红线在闸)。验收:机检〈焦点样式在位、主题词条数不增〉
|
- **键盘焦点 = 主墨细环内缩**:负 expand margin 实现内缩(环宽与内缩定值面=ui_kit 焦点常量);引擎 focus 样式盒叠加绘制、不遮钮底;逐实例 override、**主题层零新增词条**(冒烟双红线在闸)。验收:机检〈焦点样式在位、主题词条数不增〉
|
||||||
- 新增按钮位须同批过五态清单;验收 = §1.4 样张 + 冒烟五态断言。验收:机检〈新增按钮位入冒烟五态清单〉
|
- 新增按钮位须同批过五态清单;验收 = §1.4 样张 + 冒烟五态断言。验收:机检〈新增按钮位入冒烟五态清单〉
|
||||||
|
|
||||||
**(二)引擎原生控件组件规格(15 类型词条全覆盖,预盖件零实役)**
|
**(二)引擎原生控件组件规格(15 类型词条全覆盖,预盖件零实役)**
|
||||||
|
|
||||||
- **滚动条**:V/HScrollBar 的 scroll 槽(直角)+ grabber 三态;**引擎事实 = grabber 走 StyleBox 非 Icon**(4.7.2 源码实证),滚动条无位图、无箭头按钮(increment/decrement 默认主题未定义);粗细 = content margin 4(8px)、柄最小 8px。验收:目检〈滚动条非引擎默认灰〉
|
- **滚动条**:V/HScrollBar 的 scroll 槽(直角)+ grabber 三态;**引擎事实 = grabber 走 StyleBox 非 Icon**(4.7.2 源码实证),滚动条无位图、无箭头按钮(increment/decrement 默认主题未定义);粗细与柄最小尺寸定值面=ui_kit 滚动条常量。验收:目检〈滚动条非引擎默认灰〉
|
||||||
- **滑轨**:HSlider/VSlider 的 slider(槽轨)+ grabber_area(填充段)两段必须**一眼可辨**(§7.2 可读性硬条款的滑轨侧落法——判据 = 拖到中点两段可辨,机检对 ≥4.5:1 文字位不覆盖该面,归样张目检);抓子三态位图;H/V 边距为旋转换位。验收:目检〈拖到中点两段可辨〉
|
- **滑轨**:HSlider/VSlider 的 slider(槽轨)+ grabber_area(填充段)两段必须**一眼可辨**(§7.2 可读性硬条款的滑轨侧落法——判据 = 拖到中点两段可辨,机检对过 WCAG AA 文字位不覆盖该面,归样张目检);抓子三态位图;H/V 边距为旋转换位。验收:目检〈拖到中点两段可辨〉
|
||||||
- **悬停气泡(Tooltip)**:TooltipPanel/TooltipLabel 深底 + 边 + 暖字,标题屏观感承旧值原样迁入;字号走 §7.4 既有档(tooltip 14)。验收:目检
|
- **悬停气泡(Tooltip)**:TooltipPanel/TooltipLabel 深底 + 边 + 暖字,标题屏观感承旧值原样迁入;字号走 §7.4 既有 tooltip 档。验收:目检
|
||||||
- **输入件**:LineEdit(数据框惯例:牌色底 + 板线 + `RADIUS_OBJECT` 圆角 + 占位色)、SpinBox(updown 合并箭头位图 + 箭头底 hover/pressed 覆盖)、H/VSeparator(单线 1px,默认灰 #808080 实证在位须接管)。验收:目检
|
- **输入件**:LineEdit(数据框惯例:牌色底 + 板线 + `RADIUS_OBJECT` 圆角 + 占位色)、SpinBox(updown 合并箭头位图 + 箭头底 hover/pressed 覆盖)、H/VSeparator(单线,默认灰实证在位须接管——线宽定值面=ui_kit)。验收:目检
|
||||||
- **预盖件**(零实役,备案待启用时复查):CheckBox/CheckButton 共用一套 `checked`/`unchecked`(+_disabled) 四态图标(**引擎事实 = 4.7 无 on/off 词条,两类同名同套——否则预盖静默空转**)、OptionButton(button_stone 九宫格 + 箭头位图)、PopupMenu(panel + hover 高亮 + 字色字号)。验收:方向性
|
- **预盖件**(零实役,备案待启用时复查):CheckBox/CheckButton 共用一套 `checked`/`unchecked`(+_disabled) 四态图标(**引擎事实 = 4.7 无 on/off 词条,两类同名同套——否则预盖静默空转**)、OptionButton(button_stone 九宫格 + 箭头位图)、PopupMenu(panel + hover 高亮 + 字色字号)。验收:方向性
|
||||||
- **字体防御**:主题 `default_font` 显式指向全局像素字(与 project.godot `theme/custom_font` 同文件),冒烟双断言(主题非空 + Label 实取非空);`default_font_size` 不设——全站字号走 §7.4 `UiKit.FS_*` 逐实例 override。验收:机检〈冒烟字体双断言全绿〉
|
- **字体防御**:主题 `default_font` 显式指向全局像素字(与 project.godot `theme/custom_font` 同文件),冒烟双断言(主题非空 + Label 实取非空);`default_font_size` 不设——全站字号走 §7.4 `UiKit.FS_*` 逐实例 override。验收:机检〈冒烟字体双断言全绿〉
|
||||||
- **组件新增位**:新引擎控件入 UI 须同批在本节登记规格(尺寸档/圆角/对比度底线),禁裸用引擎默认灰圆角现代风。验收:目检〈新控件无默认灰样式〉
|
- **组件新增位**:新引擎控件入 UI 须同批在本节登记规格(尺寸档/圆角/对比度底线),禁裸用引擎默认灰圆角现代风。验收:目检〈新控件无默认灰样式〉
|
||||||
@@ -503,29 +503,28 @@
|
|||||||
|
|
||||||
> **白话**:这一章是给所有出图者(人与脚本)的技术底线——多大的画布、什么格式、怎么命名。屏级格边长定值的裁决权在 battle.md;本节锁资产侧:分辨率档位、像素基准与缩放纪律、导出与命名、帧数规格。生产工单视图 = art-assets-checklist。
|
> **白话**:这一章是给所有出图者(人与脚本)的技术底线——多大的画布、什么格式、怎么命名。屏级格边长定值的裁决权在 battle.md;本节锁资产侧:分辨率档位、像素基准与缩放纪律、导出与命名、帧数规格。生产工单视图 = art-assets-checklist。
|
||||||
|
|
||||||
> **定值单点纪律**:全文数字定值只落在**两张表**——**§4.1 主色板**(全部色值+明度/饱和边界)与 **§8.2**(画布/体量/立绘源档/圆角率/缩放);其余章节一律**指路、禁复述数字**(修订改值只动单点处);character-design §5.5 为档位**语义**表(普通/精英/Boss + 例外),数值权威 = §8.2。
|
> **定值单点纪律(2026-11-07 换代)**:全文不落数字定值(头注定值单点纪律全文生效)——数量面定值单点=执行件,登记面=[art-pipeline-tools](art-pipeline-tools.md)「执行件门值登记」;character-design §5.5 为档位**语义**表(普通/精英/Boss + 例外),数值权威=对应执行件。
|
||||||
|
|
||||||
### 8.1 分辨率档位与格边长
|
### 8.1 分辨率档位与格边长
|
||||||
|
|
||||||
- **两档定案**:1280×800(基座)+ 1920×1080,窗口不可调;后续调整走修订。验收:机检〈工程分辨率配置与两档一致〉
|
- **两档定案**:基座档 + 高清档,窗口不可调(档位定值面=工程分辨率配置;基座口径归 battle.md/HUD框架);后续调整走修订。验收:机检〈工程分辨率配置与两档一致〉
|
||||||
- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**瓦片整格铺满**(32×32 源随格边长缩放,允许非整数倍——瓦片不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(1920 档已裁决全局等比缩放)验收:机检〈瓦片显示尺寸随格边长、小人占位 ≤0.75×〉
|
- **格边长取值**:按档位与板形计算——固定档位下格子量增加则格边长相应变小;公式、单位与现行算例的唯一出处 = [battle.md](../ux/battle.md)「棋盘格尺寸公式」,本节不复述数值。资产侧锁两条比例:**瓦片整格铺满**(瓦片源随格边长缩放,允许非整数倍——瓦片不适用 §8.2 甲类整数倍纪律)、**棋盘小人显示占位 ≤ 0.75× 格边长**。(高清档已裁决全局等比缩放)验收:机检〈瓦片显示尺寸随格边长、小人占位不超比例〉
|
||||||
|
|
||||||
### 8.2 像素基准与画布
|
### 8.2 像素基准与画布
|
||||||
|
|
||||||
- **缩放纪律(硬规则,按资产两类分级;不做个案豁免)**:
|
- **缩放纪律(硬规则,按资产两类分级;不做个案豁免)**:
|
||||||
- **甲类·文本与语义件**(数字、图标、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。封印印记不属本类(参数化绘制件,见本条末「封印印记参数表」)。砖面 tile 亦不属本类,随格边长整格铺满(见 §8.1)。验收:机检〈甲类件显示尺寸为源整数倍〉
|
- **甲类·文本与语义件**(数字、图标、格面纹样):维持严格整数倍缩放硬规则——可读性与语义精确性优先,**禁非整数缩放不变**。封印印记不属本类(参数化绘制件,见本条末「封印印记参数表」)。砖面 tile 亦不属本类,随格边长整格铺满(见 §8.1)。验收:机检〈甲类件显示尺寸为源整数倍〉
|
||||||
- **全局纹理过滤与平滑渐变件例外**:`project.godot` `default_texture_filter=0`(Nearest)全局——像素风 UI 皮(九宫格/主题石纹样式盒/滑轨抓子/勾选/箭头图标)翻 Nearest=意图面;**显式 LINEAR 豁免清单(有意例外)= vignette / gradient_base / beams 三件程序化平滑渐变件**——保平滑连续 alpha 的程序化氛围件(§7.6 三已裁);新增平滑件须同批入册本清单,禁静默挂 LINEAR。翻转面枚举与冒烟断言(6 条)在闸。验收:机检〈过滤面枚举与 LINEAR 清单逐项一致〉
|
- **全局纹理过滤与平滑渐变件例外**:`project.godot` `default_texture_filter=0`(Nearest)全局——像素风 UI 皮(九宫格/主题石纹样式盒/滑轨抓子/勾选/箭头图标)翻 Nearest=意图面;**显式 LINEAR 豁免清单(有意例外)= vignette / gradient_base / beams 三件程序化平滑渐变件**——保平滑连续 alpha 的程序化氛围件(§7.6 三已裁);新增平滑件须同批入册本清单,禁静默挂 LINEAR。翻转面枚举与冒烟断言(6 条)在闸。验收:机检〈过滤面枚举与 LINEAR 清单逐项一致〉
|
||||||
- **显示档登记例外(64 源 0.5×,待素材批消除)**:柜台四枚 `icon_forge/workshop/atlas/keystone`(64×64 源)显示档统一 **32px = 0.5×**;状态九枚(32×32 源)mini(站桩)档 **16px = 0.5×**。两处均系「显示尺寸侧唯一可调、素材一字节禁改」红线下的人工检整数半倍档,登记为**待消除例外**——素材设计出 32px 源后回归 1×。常规档显示一律 1×(状态九枚 32px、手绘十枚 20px/40px 双档、BCard 图标槽 40px=2×、**护甲类型图标三枚 24px=1×**——源 24×24,归甲类整数倍纪律)。验收:机检〈显示档与登记表一致〉
|
- **显示档登记例外(待素材批消除)**:柜台四枚与状态九枚 mini 档现走整数半倍显示档——系「显示尺寸侧唯一可调、素材一字节禁改」红线下的人工检整数半倍档,登记为**待消除例外**——素材设计出目标源档后回归 1×(源档与显示档定值面=入包素材件与消费常量)。常规档显示一律 1×(状态九枚、手绘十枚双档、BCard 图标槽与**护甲类型图标三枚**等各件显示档定值面=消费常量组与素材件;护甲图标源归甲类整数倍纪律)。验收:机检〈显示档与登记表一致〉
|
||||||
- **乙类·角色与单位精灵**(有机形体、非文字):允许运行时非整数倍缩放(NEAREST 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类免逐案豁免。验收:目检〈立绘无可感拉花〉
|
- **乙类·角色与单位精灵**(有机形体、非文字):允许运行时非整数倍缩放(NEAREST 过滤不变),容忍轻度像素宽窄不均;判据 = 实机目检,可感不适即回整数档。乙类免逐案豁免。验收:目检〈立绘无可感拉花〉
|
||||||
- **站桩立绘槽位=高定宽随**:立绘/精灵槽位只定「高度的绝对档(档高取整数像素值)」,宽度随源图宽高比自适应——**禁止把全部立绘塞进统一方框强拉**(纵横倍率必须恒等)。反面实例:统一方框把窄条生物源(细长本体裁掉透明边)按主角比例横拉压扁发花。乙类的非整数豁免只覆盖**等比**缩放,不含纵横异倍变形。验收:机检〈立绘纵横倍率恒等〉
|
- **站桩立绘槽位=高定宽随**:立绘/精灵槽位只定「高度的绝对档(档高取整数像素值)」,宽度随源图宽高比自适应——**禁止把全部立绘塞进统一方框强拉**(纵横倍率必须恒等)。反面实例:统一方框把窄条生物源(细长本体裁掉透明边)按主角比例横拉压扁发花。乙类的非整数豁免只覆盖**等比**缩放,不含纵横异倍变形。验收:机检〈立绘纵横倍率恒等〉
|
||||||
- **1920×1080 档策略**:全局等比(stretch=canvas_items+aspect **keep**)——16:10 设计在 16:9 窗口=等比 1.35×+左右黑边各 ~96px,构图与 1280×800 基准档完全一致;甲类 1.35 非整数缩放例外注记:轻度宽窄不均系本档位接受代价(像素游戏 shipped 常态),实机目检可感不适→回乙案(1920 独立 2× 基准)重议;乙类同前款。验收:目检〈1920 档构图与 1280 档一致〉
|
- **高清档策略**:全局等比(stretch=canvas_items+aspect **keep**)——16:10 设计在 16:9 窗口=等比缩放+左右黑边,构图与基座档完全一致(倍率与黑边宽为档位比派生读数,非定值);甲类非整数缩放例外注记:轻度宽窄不均系本档位接受代价(像素游戏 shipped 常态),实机目检可感不适→回乙案(高清档独立 2× 基准)重议;乙类同前款。验收:目检〈高清档构图与基座档一致〉
|
||||||
- **画布基准(暂定值)**:
|
- **画布基准(暂定值)**:
|
||||||
- **主角人设原图 = 48×72**(1× 基准,暂定;与站姿降采样可读性验证一致);
|
- **主角人设原图与人设派生小人**:源档定值面=入包素材件本身(1× 基准,暂定;与站姿降采样可读性验证一致);**棋盘小人 = 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(小板算例见 [battle.md](../ux/battle.md)「棋盘格尺寸公式」),小源档的去留已定终值 = **保留小源档**(沿「独立小源档」路线;最小板下显示占位正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销;
|
||||||
- **棋盘小人 = 32×32 二头身派生版(暂定,允许更小)**——独立资产,自人设定稿压缩派生(character-design §5.4),不吞数字位、占位 ≤ 0.75× 格边长;板越小占比摩擦越大(13×13 / 14×14 更小,算例见 [battle.md](../gdd/ux/battle.md)「棋盘格尺寸公式」),32px 源档的去留已定终值 = **保留 32×32 源档**(沿「独立小源档」路线;N=12 板下显示占位上限 27px = 0.84 倍,正落本节乙类非整数缩放许可范围,**连豁免都不用再办**),待决标注注销;
|
- **封印印记参数表(绘制件,非贴图件)**:形与画法见 §3.2。定值全部落码——**参数单点=ui_kit 六枚封印常量(`SEAL_RING_FRAC`/`SEAL_WALL_FRAC`/`SEAL_ARM_FRAC`/`SEAL_HALO_ALPHA`/`SEAL_HALO_GAMMA`/`SEAL_HALO_FRAC`:环外径比/环壁厚比/十字臂宽比/光圈峰值 alpha/衰减指数/光圈宽比),本节不复述数值**;圆心 = 格心,色 = 封印黑单色(光圈只改 alpha)。本件随格边连续缩放,**不适用甲类整数倍纪律**(非贴图件,见上条清单)。改值=ui_kit 常量修订,§3.2 验收句同批核对。验收:机检〈ui_kit 六常量在位(封印守门测试)〉+目检〈渲染帧量环径与光圈边界符合常量、光圈不越格边〉
|
||||||
- **封印印记参数表(绘制件,非贴图件)**:形与画法见 §3.2。定值——**环外径 = 0.82 × 格边**(26 格 21.3px/46 格 37.7px);**环壁厚 = 0.11 × 环径**(≈2.3/4.1px);**十字臂宽 = 0.156 × 环径**(≈3.3/5.9px);**环外光圈宽 = 0.09 × 格边**(≈2.3/4.1px),向外衰减指数 1.6、峰值 alpha 0.50;圆心 = 格心。色 = 封印黑单色(光圈只改 alpha)。本件随格边连续缩放,**不适用甲类整数倍纪律**(非贴图件,见上条清单)。参数单点 = `ui_kit.gd` 六枚常量 `SEAL_RING_FRAC`/`SEAL_WALL_FRAC`/`SEAL_ARM_FRAC`/`SEAL_HALO_ALPHA`/`SEAL_HALO_GAMMA`/`SEAL_HALO_FRAC`,本节为条款侧对照值。改值须本节与 §3.2 同批修订。验收:机检〈ui_kit 六常量与本表逐值一致〉+目检〈渲染帧量环径落 82%±1px、光圈不越格边〉
|
- **站桩立绘显示档 = 三档绝对高**(小型/中型/大型;档高定值面=站桩呈现守门测试与素材检查件)。逐件归档——小:地精、巨蜘蛛、灰矮人;中:主角、钩爪恐魔、熊地精;大:食人魔酋长、蛛化卓尔、灰矮人石君王。**源 = 原稿像素网格**(八敌 `pixel-1`、主角手修 2× 三态稿),紧裁后原样入包,**禁再降采样**;显示倍率 = 档高 ÷ 源高,NEAREST,宽度随源图比例(高定宽随不变,见上条)。定档依据 = 生物体型(体量=物种体型,非强度线性映射,见 character-design §5.2),**顺序由显示档承载、不由源高承载**。已接受项:中型档三件与地精、巨蜘蛛两件的源高低于档高,属放大显示;食人魔酋长显示宽超桩盒(逐件读数归素材检查件报告)。验收:机检〈素材检查件逐件显示档高与归档一致、纵横倍率恒等〉+目检〈同屏体量顺序成立〉
|
||||||
- **站桩立绘显示档 = 三档绝对高**:小型 96 / 中型 144 / 大型 188。逐件归档——小:地精、巨蜘蛛、灰矮人;中:主角、钩爪恐魔、熊地精;大:食人魔酋长、蛛化卓尔、灰矮人石君王。**源 = 原稿像素网格**(八敌 `pixel-1`、主角手修 2× 三态稿),紧裁后原样入包,**禁再降采样**;显示倍率 = 档高 ÷ 源高,NEAREST,宽度随源图比例(高定宽随不变,见上条)。定档依据 = 生物体型(体量=物种体型,非强度线性映射,见 character-design §5.2),**顺序由显示档承载、不由源高承载**。已接受项:中型三件与地精/巨蜘蛛的源高(92/94/123/90/81)低于档高,属放大显示;食人魔酋长显示宽 157 超桩盒 150。验收:机检〈standee_asset_check 逐件显示档高与归档一致、纵横倍率恒等〉+目检〈同屏体量顺序成立〉
|
- **站桩立绘排版**:① 区高两区占比(读布局表),**扫雷盘原尺寸不缩、格子不变**(区高事实源 = 布局表 `battle_layout.tres`;压缩由 C 区面板空档吸收);② 站桩内部重排——立绘双脚落石台上缘(弃盒内居中)、**血条+状态/名字行落底排**(立绘→血条→状态 顺序,全场血条对齐一线;血条嵌石板位、台缘线留作地面线、落影保留接地感),状态空时该行退化为名字行;③ 大体档(大档三件:食人魔酋长/蛛化卓尔/灰矮人石君王)**允许向上溢出盒顶**(溢出量按实测尺寸算定,**与背景/光柱无关**——现行溢出区恰为临时光柱氛围层〔§6.1 方向稿四柱,落码见战斗舞台视图〕,正式舞台背景插画(三关变体)到位后该层直接退役(背景不画光柱),**溢出判定不随之变更**;横向禁止压到顶部中央轮次·阶段指示,溢出上限用真图复算定),血条仍落底(落底排的第二个收益=头部探顶不带出血条);意图徽标悬浮头顶上方(探顶档压胸);④ 「血条悬浮头顶+立绘盒内居中」排式已弃——盒顶固定 y 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉
|
||||||
- **站桩立绘排版**:① 区高 B 区 ≈1/3 屏 / C 区 ≈2/3 屏,**扫雷盘原尺寸不缩、格子不变**(区高事实源 = 布局表 `battle_layout.tres`;压缩由 C 区面板空档吸收);② 站桩内部重排——立绘双脚落石台上缘(弃盒内居中)、**血条+状态/名字行落底排**(立绘→血条→状态 顺序,全场血条对齐一线;血条嵌石板位、台缘线留作地面线、落影保留接地感),状态空时该行退化为名字行;③ 大体档(显示 >150px 级:食人魔酋长/蛛化卓尔/灰矮人石君王)**允许向上溢出盒顶 N px**(N 按实测尺寸算定,**与背景/光柱无关**——现行溢出区恰为临时光柱氛围层〔§6.1 方向稿四柱,x 基准 110/900/1055/1210@1280,`battle_stage_view.gd:47-56`〕,正式舞台背景插画(三关变体)到位后该层直接退役(背景不画光柱),**溢出判定不随之变更**;横向禁止压到顶部中央轮次·阶段指示,溢出上限用真图复算 x 区间定),血条仍落底(落底排的第二个收益=头部探顶不带出血条);意图徽标悬浮头顶上方(探顶档压胸);④ 「血条悬浮头顶+立绘盒内居中」排式已弃——盒顶固定 y 与盒内居中在高盒下拉开血条-立绘空洞。验收:目检〈血条一线对齐、大体档溢出不压轮次指示〉
|
- **站桩石板地台件**:`scene_stage_plaza.png`——源档与顶缘受光线规格定值面=入包素材件,九宫格横向拉伸、顶缘受光线不随拉伸变形;跨三关恒定、不吃 §4.3 `wall_ambient` tint(独立理由见 §6.1 近景地台独立件条)。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒定(定值面=素材件)〉
|
||||||
- **站桩石板地台件**:`scene_stage_plaza.png`,源 48×12、九宫格横向拉伸、顶缘受光线 2px 不随拉伸变形;跨三关恒定、不吃 §4.3 `wall_ambient` tint(独立理由见 §6.1 近景地台独立件条)。验收:机检〈地台件按九宫格拉伸后顶缘受光线宽度恒为 2px〉
|
|
||||||
|
|
||||||
### 8.3 导出格式与命名规范
|
### 8.3 导出格式与命名规范
|
||||||
|
|
||||||
@@ -536,7 +535,7 @@
|
|||||||
|
|
||||||
### 8.4 帧数规格(样张冻结)
|
### 8.4 帧数规格(样张冻结)
|
||||||
|
|
||||||
- **帧数规格(样张冻结)**:待机循环 4 帧;攻击/技能准备 6 帧单次;受击 2 帧;死亡 = 灰化+碎裂退场(§4.6.4 语义硬规则),序列帧归 ✦ 缺料清单;帧时长与结算节拍对齐(预告时序见 §4.6.4)。验收:机检〈序列帧数与档位一致〉
|
- **帧数规格(样张冻结)**:帧数档定值面=动画帧数规格守门测试(规格表随件——待机循环/攻击准备单次/受击;序列帧资产入包后逐件判帧数);死亡 = 灰化+碎裂退场(§4.6.4 语义硬规则),序列帧归 ✦ 缺料清单;帧时长与结算节拍对齐(预告时序见 §4.6.4)。验收:机检〈序列帧数与守门测试规格表一致〉
|
||||||
- **方向集**:棋盘小人=**一份画稿+左右镜像**(现行资产=朝左帧两态 idle/walk,右向 = `flip_h`;下/上向无独立帧);斜向移动/挖掘按**主导轴吸附最近正交向**呈现,不出 45° 斜向帧(斜向信息由位移轨迹与目标格预告承载,ITB 实态同款)。镜像与「旗面恒画右」纪律(character-design.md 冒险背包条)的相容归属:棋盘小人默认镜像豁免、旗右纪律限立绘侧——代拟口径已追认(棋盘小人朝左时旗面朝左,与立绘侧「旗面恒画右」并存;画稿维持一份 + 镜像,零新增资产)。验收:目检〈侧向镜像无破绽〉
|
- **方向集**:棋盘小人=**一份画稿+左右镜像**(现行资产=朝左帧两态 idle/walk,右向 = `flip_h`;下/上向无独立帧);斜向移动/挖掘按**主导轴吸附最近正交向**呈现,不出 45° 斜向帧(斜向信息由位移轨迹与目标格预告承载,ITB 实态同款)。镜像与「旗面恒画右」纪律(character-design.md 冒险背包条)的相容归属:棋盘小人默认镜像豁免、旗右纪律限立绘侧——代拟口径已追认(棋盘小人朝左时旗面朝左,与立绘侧「旗面恒画右」并存;画稿维持一份 + 镜像,零新增资产)。验收:目检〈侧向镜像无破绽〉
|
||||||
|
|
||||||
### 8.5 结构件完整性与参考核验
|
### 8.5 结构件完整性与参考核验
|
||||||
|
|||||||
@@ -1,7 +1,28 @@
|
|||||||
# 美术后处理与校验工具清单
|
# 美术后处理与校验工具清单
|
||||||
|
|
||||||
> **性质**:本文件是 `tools/` 下美术资产处理与校验脚本的用法清单。回答三件事:这类资产该跑哪件工具、命令怎么敲、判据与坑在哪。
|
> **性质**:本文件是 `tools/` 下美术资产处理与校验脚本的用法清单,兼**执行件门值登记面**——美术数值定值(色值、阈值、档位、帧数、区间)的唯一事实源索引。回答三件事:这类资产该跑哪件工具、命令怎么敲、判据与坑在哪。
|
||||||
> **边界**:只管工具用法,不立美术规格。色值、画布、体量、命名与验收条款归 [art-bible](art-bible.md)(§4.1 主色板、§8 资产与技术规范)和 [art-assets-checklist](art-assets-checklist.md);命令与源码冲突时以源码现行为准,美术规格冲突时以 art-bible 为准。素材入库与代码接线归 [asset-path-map](asset-path-map.md),不在本文件。
|
> **边界**:只管工具用法与定值落点登记,不立美术规格。概念、规则与方向归 [art-bible](art-bible.md)(其定值单点纪律指向本登记面);命令与源码冲突时以源码现行为准,美术规格冲突时以 art-bible 为准。素材入库与代码接线归 [asset-path-map](asset-path-map.md),不在本文件。
|
||||||
|
|
||||||
|
## 执行件门值登记(定值单点索引,2026-11-07 立)
|
||||||
|
|
||||||
|
art-bible 数量面定值的落点登记——每行=一个定值面与其承载件;改值=改对应执行件并跑其守门断言,art-bible 不改值只同批核对指针:
|
||||||
|
|
||||||
|
| 定值面 | 承载件 |
|
||||||
|
|---|---|
|
||||||
|
| 色值 token 全板(语义色/墨族/材质色/呈现态) | `game/presentation/views/ui_kit.gd` 常量组(色板唯一来源)+ theme README 溯源表 |
|
||||||
|
| token 存量近色互查与新增色第二道门 | `tools/palette_check.py`(素材侧)+ `palette_token_pairwise_test.gd`(常量面守门,含在册豁免账) |
|
||||||
|
| 微光五组色值与呈现参数 | `ui_kit.gd` 微光常量组+`type_glow_test.gd` 守门断言 |
|
||||||
|
| 未开格底/图类型色板准入门(亮度地板/饱和上限/禁入带/近色容差)与**世界底层两子带** | `tools/glow_discrimination_sheet.py` 门值常量(本件「判据或口径」节) |
|
||||||
|
| 已开格底渲染面亮度 | `game/presentation/views/tile_palette.gd` 归一化目标常量;对比判据=`game/probe/ui_contrast_probe.gd` |
|
||||||
|
| 文字对比门槛(WCAG AA)与整屏有效色数上限 | `tools/shot_checker.py` 常量(`ui_contrast_probe` 同源) |
|
||||||
|
| 封印印记六参数 | `ui_kit.gd` `SEAL_*` 六常量+`seal_mark_params_test.gd` |
|
||||||
|
| 站桩显示档三档与源档逐件 | `standee_present_values_test.gd` 钉值+`tools/standee_asset_check.py` |
|
||||||
|
| 动画帧数档(待机/攻击/受击) | `animation_frame_spec_test.gd` 规格表(序列帧资产入包后逐件判) |
|
||||||
|
| 字号六档与下限 | `ui_kit.gd` `FS_*` 常量组 |
|
||||||
|
| 屏级分区几何/带高 | `game/data/tables/battle_layout.tres`(数据索引,art-bible 直指) |
|
||||||
|
| 营地场景坐标群(落盘矩形/命中矩形/z 序/桩柱高) | `camp-scene-prompts.md` 坐标表+落盘件 |
|
||||||
|
| 棋盘结构件 px(墨线/暗带/投影/悬崖) | `board_world.gd`/`board_view.gd` 常量+渲染闸 golden 基线 |
|
||||||
|
| 视野迷雾半径/提灯加成/记忆态常量 | `board_view.gd` `FOG_*` 常量+`ui_kit.gd` 迷雾常量组 |
|
||||||
> **分工**:[art-prompts](art-prompts.md) 管角色级提示词与五步出图流程,[camp-scene-prompts](camp-scene-prompts.md) 管营地场景分层提示词与四步流程;两卡只把「后处理」一步指到本文件。提示词怎么写出图、出完图怎么处理,是两件事。
|
> **分工**:[art-prompts](art-prompts.md) 管角色级提示词与五步出图流程,[camp-scene-prompts](camp-scene-prompts.md) 管营地场景分层提示词与四步流程;两卡只把「后处理」一步指到本文件。提示词怎么写出图、出完图怎么处理,是两件事。
|
||||||
> **命令前提**:以下命令均在仓库根执行。素材不入 git,worktree 缺件时部分脚本回退主检出 `D:/code/g-plan2`,部分直接返回错误,见各节「已知坑与适用边界」。
|
> **命令前提**:以下命令均在仓库根执行。素材不入 git,worktree 缺件时部分脚本回退主检出 `D:/code/g-plan2`,部分直接返回错误,见各节「已知坑与适用边界」。
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
| 素材 | 状态 | 需求文档 |
|
| 素材 | 状态 | 需求文档 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 主角战斗小人(待机/攻击/受击三态) | ✅ 已交付:B 区站桩三态按原稿分辨率入包、显示按档缩放落位(显示档=中档 144,源=手修 2× 三态稿,art-bible §8.2),机检全绿;挂事件切换、结算回 idle 短驻自回;棋盘 1.5×/脚锚25%/椭圆影在役 | [character-design](character-design.md) + [art-prompts](art-prompts.md) §2 |
|
| 主角战斗小人(待机/攻击/受击三态) | ✅ 已交付:B 区站桩三态按原稿分辨率入包、显示按档缩放落位(显示档=中档,源=手修 2× 三态稿,art-bible §8.2),机检全绿;挂事件切换、结算回 idle 短驻自回;棋盘 1.5×/脚锚25%/椭圆影在役 | [character-design](character-design.md) + [art-prompts](art-prompts.md) §2 |
|
||||||
| 八敌种形象(L2 熊地精=bugbear 复用,不单列) | ✅ 已交付:B 区站桩八敌真图服役——八件源=原稿不降采样入包、显示按档缩放落位(三档绝对高 96/144/188,art-bible §8.2),闸件全绿;character_enemy_<键>.png 按常量入位,字形回退退役为缺位兜底;素材不入 git 本地在盘 | [art-bible](art-bible.md) §5 + [art-prompts](art-prompts.md) §3 |
|
| 八敌种形象(L2 熊地精=bugbear 复用,不单列) | ✅ 已交付:B 区站桩八敌真图服役——八件源=原稿不降采样入包、显示按档缩放落位(三档绝对高,art-bible §8.2),闸件全绿;character_enemy_<键>.png 按常量入位,字形回退退役为缺位兜底;素材不入 git 本地在盘 | [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 图标与格面(可与样张并行)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@
|
|||||||
- **主色域 = 物种本色**,不受圣经 §4.2 语义色禁则约束(该禁则管格面与 UI 的逻辑色,角色身体主色豁免);**两例外**:禁入带 300°–345° 全角色禁入(仅 drider/duergar_king 两 Boss 独占)、蓝族禁入敌方主色(§5.4 同款)。
|
- **主色域 = 物种本色**,不受圣经 §4.2 语义色禁则约束(该禁则管格面与 UI 的逻辑色,角色身体主色豁免);**两例外**:禁入带 300°–345° 全角色禁入(仅 drider/duergar_king 两 Boss 独占)、蓝族禁入敌方主色(§5.4 同款)。
|
||||||
- **L2 熊地精 = bugbear 复用**(第二关三行,显示名熊地精系,非独立键):同剪影**换色板不换形**(色板替换走脚本管线——原则三"先换色板"的角色侧应用);变体主色避小人蓝族与禁入带。
|
- **L2 熊地精 = bugbear 复用**(第二关三行,显示名熊地精系,非独立键):同剪影**换色板不换形**(色板替换走脚本管线——原则三"先换色板"的角色侧应用);变体主色避小人蓝族与禁入带。
|
||||||
- 每敌种出 2–3 版候选(清单 §2.2);受击反馈/死亡表现/顺位标记三类呈现下限见圣经 §4.6.4 资产需求行。
|
- 每敌种出 2–3 版候选(清单 §2.2);受击反馈/死亡表现/顺位标记三类呈现下限见圣经 §4.6.4 资产需求行。
|
||||||
- **立绘显示档(定值单点 = 圣经 §8.2 站桩立绘显示档条,本档指路不复述)**:三档绝对高 96/144/188,逐件归档、源档与缩放规则一律见圣经 §8.2——**数值权威 = 圣经 §8.2**(定值单点纪律,圣经 §8 头注);归档经三体型约束校验(§5.2)确认;派生管线与排版规范同归圣经 §8.2。
|
- **立绘显示档(定值单点 = 圣经 §8.2 站桩立绘显示档条,本档指路不复述)**:三档绝对高,逐件归档、源档与缩放规则一律见圣经 §8.2——**数值权威 = 圣经 §8.2 指向的执行件**(定值单点纪律,圣经头注);归档经三体型约束校验(§5.2)确认;派生管线与排版规范同归圣经 §8.2。
|
||||||
- **钩爪恐魔「宽≥高」豁免登记(待样张终审)**:定档源 58 高窄条束状剪影(长臂圆钩),宽高比 <1,与 §5.1 普通怪「近圆墩形宽≥高」冲突——按体量=生物天性(§5.2)登记豁免:以长臂束状轮廓为识别锚,不强行压成墩形;样张(圣经 §1.4)终审复验灰度剪影可辨性。
|
- **钩爪恐魔「宽≥高」豁免登记(待样张终审)**:定档源 58 高窄条束状剪影(长臂圆钩),宽高比 <1,与 §5.1 普通怪「近圆墩形宽≥高」冲突——按体量=生物天性(§5.2)登记豁免:以长臂束状轮廓为识别锚,不强行压成墩形;样张(圣经 §1.4)终审复验灰度剪影可辨性。
|
||||||
|
|
||||||
## 5.6 意图准备动画三档(规格承载节)
|
## 5.6 意图准备动画三档(规格承载节)
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
| 后置 ≠ 删除 | P1/P2 后置内容逐条列出;复活后置项 = 修订文档,禁静默加回 |
|
| 后置 ≠ 删除 | P1/P2 后置内容逐条列出;复活后置项 = 修订文档,禁静默加回 |
|
||||||
| 活体清单不冻结计数 | 对会生长的清单(文档树构成、UI 层项、RNG 流词表等)不写死计数与枚举——写指针到 owner(根索引/常量表/实现文件),现状值由 owner 承载;历史计数只进 git 提交信息 |
|
| 活体清单不冻结计数 | 对会生长的清单(文档树构成、UI 层项、RNG 流词表等)不写死计数与枚举——写指针到 owner(根索引/常量表/实现文件),现状值由 owner 承载;历史计数只进 git 提交信息 |
|
||||||
|
|
||||||
**数值纪律(概念/实现分界,2026-11-05 用户立)**:GDD 概念文档只定概念、机制与规则——是什么、有什么、为什么;数量面(多大、多少、多大概率)与呈现实现细节不进概念文档正文。分工三处:取值域与字段契约归 `game/data/schemas/*.gd`(表结构定义+域校验执法,provisional 随值标注);现行值归 `game/data/tables/*.tres`;呈现实现规格(冻结公式、像素值、动效参数)居 `design/gdd/ux/`=呈现实现设计规格层,豁免概念纯度约束。存量系统文档的旧调参表节由独立清扫批消化,消化期不作机检对象(现行闸无此项判据)。
|
**数值纪律(概念/实现分界,2026-11-05 用户立)**:GDD 概念文档只定概念、机制与规则——是什么、有什么、为什么;数量面(多大、多少、多大概率)与呈现实现细节不进概念文档正文。分工三处:取值域与字段契约归 `game/data/schemas/*.gd`(表结构定义+域校验执法,provisional 随值标注);现行值归 `game/data/tables/*.tres`;呈现实现规格(冻结公式、像素值、动效参数)居 `design/ux/`=呈现实现设计规格层,豁免概念纯度约束。存量系统文档的旧调参表节由独立清扫批消化,消化期不作机检对象(现行闸无此项判据)。
|
||||||
|
|
||||||
**登记处唯一性**:`design/registry/`(`entities.yaml`/`architecture.yaml`)已注销删除,禁再建第二处事实登记——术语进 术语表、数值进 `.tres`、架构进 架构文档、影响面靠全仓搜索概念规范名得出。强制收口条款:
|
**登记处唯一性**:`design/registry/`(`entities.yaml`/`architecture.yaml`)已注销删除,禁再建第二处事实登记——术语进 术语表、数值进 `.tres`、架构进 架构文档、影响面靠全仓搜索概念规范名得出。强制收口条款:
|
||||||
|
|
||||||
|
|||||||
@@ -126,7 +126,7 @@
|
|||||||
|
|
||||||
**新增 core 件的覆盖登记义务(2026-11-03 架构审查 P1 余项裁)**:拆件或重构产出的新 core 文件不触发 process-conventions §3 第 6 条「新功能必配新测试」(那条只管新增玩法/机制),因此单由本条承接——新 core 件要么被 `game/tests/` 某套件按文件名或 `class_name` 点名,要么在承接它的能力行「代表用例」里申报「经宿主链覆盖(宿主=<件>)」;两者都无=批末收尾核对时补登。本条**不是覆盖率要求**,与 §7「覆盖率不是目标」同轨:登记的是能力义务的归属,不做文件计数——「每个 core 件必须被点名一次」的机器闸已裁否(它逼出为点名而点名的空套件,且与 §7 正面冲突)。落笔面沿用现行分工:申报行由写卡段入能力清单(实现批禁写该文件),核对归批末收尾提交。
|
**新增 core 件的覆盖登记义务(2026-11-03 架构审查 P1 余项裁)**:拆件或重构产出的新 core 文件不触发 process-conventions §3 第 6 条「新功能必配新测试」(那条只管新增玩法/机制),因此单由本条承接——新 core 件要么被 `game/tests/` 某套件按文件名或 `class_name` 点名,要么在承接它的能力行「代表用例」里申报「经宿主链覆盖(宿主=<件>)」;两者都无=批末收尾核对时补登。本条**不是覆盖率要求**,与 §7「覆盖率不是目标」同轨:登记的是能力义务的归属,不做文件计数——「每个 core 件必须被点名一次」的机器闸已裁否(它逼出为点名而点名的空套件,且与 §7 正面冲突)。落笔面沿用现行分工:申报行由写卡段入能力清单(实现批禁写该文件),核对归批末收尾提交。
|
||||||
|
|
||||||
**退役对账义务(2026-11-05 立)**:需求卡片退役(吸收即死)时,其对照表每行的验收意图必须已被承接——承接形态=能力清单行(能力+真实入口+代表用例)或已落地的断言;退役后无承接=该能力的规格判据断链,收尾核对判红。机检=`tools/capability_audit.py`(套件→能力行反向覆盖+断言链核验)。先例教训:营地图批卡片退役后,大门判据(`design/gdd/ux/camp.md:16`)无任何活面承接,探针 emit 断言悬空假绿——规格在、链接断。
|
**退役对账义务(2026-11-05 立)**:需求卡片退役(吸收即死)时,其对照表每行的验收意图必须已被承接——承接形态=能力清单行(能力+真实入口+代表用例)或已落地的断言;退役后无承接=该能力的规格判据断链,收尾核对判红。机检=`tools/capability_audit.py`(套件→能力行反向覆盖+断言链核验)。先例教训:营地图批卡片退役后,大门判据(`design/ux/camp.md:16`)无任何活面承接,探针 emit 断言悬空假绿——规格在、链接断。
|
||||||
|
|
||||||
### 8.4 真实入口断言(验收闭合的主判据)
|
### 8.4 真实入口断言(验收闭合的主判据)
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
| `教学引导.md` | 新手教学与提示 | 范围草案·待设计 |
|
| `教学引导.md` | 新手教学与提示 | 范围草案·待设计 |
|
||||||
| `设置与本地化.md` | 设置项与多语言 | 范围草案·待设计 |
|
| `设置与本地化.md` | 设置项与多语言 | 范围草案·待设计 |
|
||||||
|
|
||||||
## ux/(战斗画面与交互规格,`ux/`)
|
## ux/(战斗画面与交互规格,`design/ux/`——与 gdd/ 同级的呈现实现设计规格层)
|
||||||
|
|
||||||
| 文件 | 一句话概要 | 状态 |
|
| 文件 | 一句话概要 | 状态 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
|||||||
+10
-10
@@ -103,15 +103,15 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 主菜单 | —— | 在役(三入口:进入存档/设置/退出游戏——入口拓扑=进入存档→选档界面→进档/新档→营地覆盖层→营地场景图与生涯笔记本) |
|
| 主菜单 | —— | 在役(三入口:进入存档/设置/退出游戏——入口拓扑=进入存档→选档界面→进档/新档→营地覆盖层→营地场景图与生涯笔记本) |
|
||||||
| 开始覆盖层 | —— | 在役 |
|
| 开始覆盖层 | —— | 在役 |
|
||||||
| 选档界面(3 存档位) | —— | 在役(空槽新档/有档进档/删档二次确认+摘要三项) |
|
| 选档界面(3 存档位) | —— | 在役(空槽新档/有档进档/删档二次确认+摘要三项) |
|
||||||
| 营地(天赋树 / 锻造工坊 / 秘宝匣 / 图鉴) | [camp](ux/camp.md) | 在役(场景图+七物件点选+Esc 浮窗与顶栏;五功能页呈现=居中定尺寸功能窗口、场景根留底、窗内滚动) |
|
| 营地(天赋树 / 锻造工坊 / 秘宝匣 / 图鉴) | [camp](../ux/camp.md) | 在役(场景图+七物件点选+Esc 浮窗与顶栏;五功能页呈现=居中定尺寸功能窗口、场景根留底、窗内滚动) |
|
||||||
| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](ux/camp.md) | 在役(五卡全部落地,2026-10-21 用户裁整体列入 Alpha;沿革查 git 提交史。出口=五卡各自验收标准通过+营地屏用户目检〔登记体验验证清单 ㊺〕) |
|
| 营地交互重做(五卡:存档制数据层/主菜单三入口/选档界面/营地场景图/Esc 浮窗与营地顶栏) | [camp](../ux/camp.md) | 在役(五卡全部落地,2026-10-21 用户裁整体列入 Alpha;沿革查 git 提交史。出口=五卡各自验收标准通过+营地屏用户目检〔登记体验验证清单 ㊺〕) |
|
||||||
| 生涯页 | [生涯](systems/跨局循环/生涯.md) | 在役(期一) |
|
| 生涯页 | [生涯](systems/跨局循环/生涯.md) | 在役(期一) |
|
||||||
| 关卡地图屏 | [level-map](ux/level-map.md) | 在役 |
|
| 关卡地图屏 | [level-map](../ux/level-map.md) | 在役 |
|
||||||
| 战斗屏 | [battle](ux/battle.md) | 在役 |
|
| 战斗屏 | [battle](../ux/battle.md) | 在役 |
|
||||||
| 战斗结算总结框 | [settlement-summary](ux/settlement-summary.md) | 在役 |
|
| 战斗结算总结框 | [settlement-summary](../ux/settlement-summary.md) | 在役 |
|
||||||
| 关卡结算屏 | [level-clear](ux/level-clear.md) | 在役 |
|
| 关卡结算屏 | [level-clear](../ux/level-clear.md) | 在役 |
|
||||||
| 三选一(奖励节点 / 关卡完成) | [node-reward](ux/node-reward.md) | 在役(两渠道均三选一停点:关卡完成与奖励节点各停一次,奖励节点经兑付拉起开三选一) |
|
| 三选一(奖励节点 / 关卡完成) | [node-reward](../ux/node-reward.md) | 在役(两渠道均三选一停点:关卡完成与奖励节点各停一次,奖励节点经兑付拉起开三选一) |
|
||||||
| 商店 | [shop](ux/shop.md) | 在役 |
|
| 商店 | [shop](../ux/shop.md) | 在役 |
|
||||||
| 状态面板(局内) | [元进度](systems/跨局循环/元进度.md)(「解锁界面:双入口框架」节) | 在役 |
|
| 状态面板(局内) | [元进度](systems/跨局循环/元进度.md)(「解锁界面:双入口框架」节) | 在役 |
|
||||||
| 冒险终局面板 | —— | 在役 |
|
| 冒险终局面板 | —— | 在役 |
|
||||||
| 图例面板 | —— | 在役 |
|
| 图例面板 | —— | 在役 |
|
||||||
@@ -147,12 +147,12 @@ Alpha 内以玩法循环本身的内容与表现为主(棋盘、关卡、战
|
|||||||
| 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 |
|
| 棋盘瓦片与格面资源图标 | [美术圣经](../art/art-bible.md) | 在役 |
|
||||||
| 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史;观感复核已随战斗一屏样张过闸完成——用户实机目检核销,沿革查 git 提交史) |
|
| 未开格类型微光(五组色相+明度档) | [HUD框架](systems/表现与支撑/HUD框架.md) | 在役(明度档 provisional 值登记见 art-bible 的 git 提交史;观感复核已随战斗一屏样张过闸完成——用户实机目检核销,沿革查 git 提交史) |
|
||||||
| 棋盘观感(第二 / 三关亮度与对比度) | [待办清单](../../待办清单.md) | 待做(开工前置=先做素材轴/UI 轴对照截图定性,再按定轴修复;旧卡 v1.4 存 reports/ 作素材、非已写卡状态,重启须重新立卡;出口=用户实机目检第二、三关不再判「看着费劲」) |
|
| 棋盘观感(第二 / 三关亮度与对比度) | [待办清单](../../待办清单.md) | 待做(开工前置=先做素材轴/UI 轴对照截图定性,再按定轴修复;旧卡 v1.4 存 reports/ 作素材、非已写卡状态,重启须重新立卡;出口=用户实机目检第二、三关不再判「看着费劲」) |
|
||||||
| 立绘显示清晰度(原稿分辨率+三档显示) | [角色设计](../art/character-design.md) | 在役(原稿分辨率入包禁降采样、显示按三档绝对高 96/144/188 缩放、现有形象即终稿;定值单点=art-bible §8.2;实机目检清晰度与同屏体量顺序登记体验验证清单 ㊻) |
|
| 立绘显示清晰度(原稿分辨率+三档显示) | [角色设计](../art/character-design.md) | 在役(原稿分辨率入包禁降采样、显示按三档绝对高缩放、现有形象即终稿;定值单点=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) | 在役 |
|
||||||
| 战斗演出链(弹道 / 受击 / 血条 / 灰化) | [战斗表现](systems/战斗循环/战斗表现.md) | 在役 |
|
| 战斗演出链(弹道 / 受击 / 血条 / 灰化) | [战斗表现](systems/战斗循环/战斗表现.md) | 在役 |
|
||||||
| 逐行结算排播 | [settlement-summary](ux/settlement-summary.md) | 在役 |
|
| 逐行结算排播 | [settlement-summary](../ux/settlement-summary.md) | 在役 |
|
||||||
| 减动效开关 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
|
| 减动效开关 | [设置与本地化](systems/表现与支撑/设置与本地化.md) | 在役 |
|
||||||
| 全局纹理过滤设为邻近采样 | [待办清单](../../待办清单.md) | 在役(default_texture_filter=0+平滑渐变件三处显式 LINEAR 白名单,翻转面全枚举闭合) |
|
| 全局纹理过滤设为邻近采样 | [待办清单](../../待办清单.md) | 在役(default_texture_filter=0+平滑渐变件三处显式 LINEAR 白名单,翻转面全枚举闭合) |
|
||||||
| UI 字体(全局像素字,Fusion Pixel 单套单字重) | [美术圣经](../art/art-bible.md) §7.4 | 在役(现状即终稿——拉丁沿用自带字形不另接专件、不上第二字重;信息层级手段=字号档差+墨色深浅) |
|
| UI 字体(全局像素字,Fusion Pixel 单套单字重) | [美术圣经](../art/art-bible.md) §7.4 | 在役(现状即终稿——拉丁沿用自带字形不另接专件、不上第二字重;信息层级手段=字号档差+墨色深浅) |
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
|
|
||||||
每关一套参数档(L1/L2/L3),生成器只吃参数档、不认关卡号。生长曲线:层高、宽度、节点总数、路径长度逐关递增且增幅变大;决策点密度逐关递增;第一关即含岔口——第一关也要有选择。单链是分支密度取下限的合法退化形态,不作为三关参数档的取值。
|
每关一套参数档(L1/L2/L3),生成器只吃参数档、不认关卡号。生长曲线:层高、宽度、节点总数、路径长度逐关递增且增幅变大;决策点密度逐关递增;第一关即含岔口——第一关也要有选择。单链是分支密度取下限的合法退化形态,不作为三关参数档的取值。
|
||||||
|
|
||||||
图规模无呈现侧上限:关卡画面为卷轴视口呈现,画布随图生长、屏为窗口(呈现规格归 [level-map](../../ux/level-map.md));规模由参数档与生长曲线约束,参数档给不出合法图即致命中止。
|
图规模无呈现侧上限:关卡画面为卷轴视口呈现,画布随图生长、屏为窗口(呈现规格归 [level-map](../../../ux/level-map.md));规模由参数档与生长曲线约束,参数档给不出合法图即致命中止。
|
||||||
|
|
||||||
### 节点类型配比:类型分布怎么掷、内容归谁
|
### 节点类型配比:类型分布怎么掷、内容归谁
|
||||||
|
|
||||||
|
|||||||
@@ -64,9 +64,9 @@
|
|||||||
|
|
||||||
每个节点在图上有**节点深度**(本文含义:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径),用来当战斗的定位地址——遭遇坐标=关卡序号+节点深度,敌人表按**深度带**(深度区间)配池,寻址语义见[敌人系统](../战斗循环/敌人系统.md)。不用最短路径:合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。"最深处是关底"的直感由深度承载:终点恒在各路径最深处。单链(每步只有一条连线)是合法退化形态,节点深度等于它前面走过的战斗场数;三关参数档都含岔口,第一关不再是单链。图的来源见[关卡节点图生成](关卡节点图生成.md)。
|
每个节点在图上有**节点深度**(本文含义:自入口沿路走到该节点的最长路径步数;多入口时取距任一入口的最长路径),用来当战斗的定位地址——遭遇坐标=关卡序号+节点深度,敌人表按**深度带**(深度区间)配池,寻址语义见[敌人系统](../战斗循环/敌人系统.md)。不用最短路径:合流节点或多入口图上取最短,会让某些出边指向深度不增甚至更浅的节点,破坏「连线只朝前进方向」的无环判据。"最深处是关底"的直感由深度承载:终点恒在各路径最深处。单链(每步只有一条连线)是合法退化形态,节点深度等于它前面走过的战斗场数;三关参数档都含岔口,第一关不再是单链。图的来源见[关卡节点图生成](关卡节点图生成.md)。
|
||||||
|
|
||||||
呈现侧口径(2026-09-17 用户拍板):节点图的画面表达走**方块地牢观感**——节点画成地牢房间的方块、连线画成通道——但逻辑拓扑就是本文的节点图,不产生任何额外选路或探索语义。关卡画面本体即节点链进度的呈现载体(选路覆盖层的常驻形态,节点态直接读图:已过暗金 / 当前金 / 候选下一跳通道亮金 / Boss 紫赤描边(紫赤+深墨环,视觉定稿见 [level-map](../../ux/level-map.md))),不另设进度条组件;视觉规格归 [HUD 框架](../表现与支撑/HUD框架.md)。
|
呈现侧口径(2026-09-17 用户拍板):节点图的画面表达走**方块地牢观感**——节点画成地牢房间的方块、连线画成通道——但逻辑拓扑就是本文的节点图,不产生任何额外选路或探索语义。关卡画面本体即节点链进度的呈现载体(选路覆盖层的常驻形态,节点态直接读图:已过暗金 / 当前金 / 候选下一跳通道亮金 / Boss 紫赤描边(紫赤+深墨环,视觉定稿见 [level-map](../../../ux/level-map.md))),不另设进度条组件;视觉规格归 [HUD 框架](../表现与支撑/HUD框架.md)。
|
||||||
|
|
||||||
**商店覆盖层呈现**(呈现 spec:[design/gdd/ux/shop.md](../../ux/shop.md) v1.0;pool 模式货架面=共享池三选一同构卡〔进店抽 3/买 1 全重抽/空架售罄态〕,与三选一奖励同一交互语言;legacy 固定三件面随对照模式保留。**库存余量不呈现**(2026-10-04 用户裁)——货架卡不带「库存余 N/∞」字样,库存语义仍在共享池令牌库、只是不呈现):兑付 = 打开商店覆盖层(模态)——货架卡陈列、GP 余额读数、购买/离开;离开后兑付确认回选路。本节锁编排面(何时开/何时关/回选路),呈现细节归 spec;定价数值归[难度曲线与Boss](难度曲线与Boss.md)(shop.tres)。
|
**商店覆盖层呈现**(呈现 spec:[design/ux/shop.md](../../../ux/shop.md) v1.0;pool 模式货架面=共享池三选一同构卡〔进店抽 3/买 1 全重抽/空架售罄态〕,与三选一奖励同一交互语言;legacy 固定三件面随对照模式保留。**库存余量不呈现**(2026-10-04 用户裁)——货架卡不带「库存余 N/∞」字样,库存语义仍在共享池令牌库、只是不呈现):兑付 = 打开商店覆盖层(模态)——货架卡陈列、GP 余额读数、购买/离开;离开后兑付确认回选路。本节锁编排面(何时开/何时关/回选路),呈现细节归 spec;定价数值归[难度曲线与Boss](难度曲线与Boss.md)(shop.tres)。
|
||||||
|
|
||||||
### 行进与选路:兑付后确认,选路就是行进
|
### 行进与选路:兑付后确认,选路就是行进
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
| 纪律 | 内容 |
|
| 纪律 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 兑付后确认 | 到达节点立即兑付,不设"进入前确认"步;兑付反馈呈现完,玩家确认才回图。战斗节点的确认挂在战斗总结结算上(呈现 spec:design/gdd/ux/settlement-summary.md),奖励/恢复节点挂在兑付反馈覆盖层上,商店节点挂在商店覆盖层的离开动作上——复用既有呈现位,零新增交互范式 |
|
| 兑付后确认 | 到达节点立即兑付,不设"进入前确认"步;兑付反馈呈现完,玩家确认才回图。战斗节点的确认挂在战斗总结结算上(呈现 spec:design/ux/settlement-summary.md),奖励/恢复节点挂在兑付反馈覆盖层上,商店节点挂在商店覆盖层的离开动作上——复用既有呈现位,零新增交互范式 |
|
||||||
| 零自动推进 | 确认之后回到关卡画面的选路口:岔路口玩家选一条连线,单链路口确认"继续"。选了才走;不选就停在图上 |
|
| 零自动推进 | 确认之后回到关卡画面的选路口:岔路口玩家选一条连线,单链路口确认"继续"。选了才走;不选就停在图上 |
|
||||||
|
|
||||||
Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选路——关卡已定局,后续流程归冒险结构。
|
Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选路——关卡已定局,后续流程归冒险结构。
|
||||||
@@ -123,7 +123,7 @@ Boss 兑付(胜利或英雄死亡)触发关卡收束点,此后不再有选
|
|||||||
|
|
||||||
第二关的"新内容 = 既有池新技能"(技能池构成已定稿入[敌人系统](../战斗循环/敌人系统.md)技能池节)投放时,改的是战斗侧行里引用的技能池内容——节点图结构原样不动,本文无需为投放留任何新结构位。
|
第二关的"新内容 = 既有池新技能"(技能池构成已定稿入[敌人系统](../战斗循环/敌人系统.md)技能池节)投放时,改的是战斗侧行里引用的技能池内容——节点图结构原样不动,本文无需为投放留任何新结构位。
|
||||||
|
|
||||||
**节点奖励 = 提升三选一(用户 2026-10-01 拍板:与通关三选一共享同池)**:奖励节点到达即开三选一(呈现 = 提升三选一覆盖层共用面,spec:[node-reward.md](../../ux/node-reward.md) v2.0)——从提升池七种(攻击/生命上限/护甲/GP 袋/行动点件/恢复件/刷新件)按同一令牌库洗牌不放回抽 3(同 kind 去重、同一封闭随机流),玩家点选一件兑付(选中踢池、未选回池;秘宝件已出池,满位替换子交互随之不再触发)。件获取次数计数与令牌库为冒险级单例——两渠道同一令牌库合计消耗。「池空直通」为合法态——池耗即枯竭,空库 = 零候选合法态直通(见[冒险结构](冒险结构.md)令牌池节)。
|
**节点奖励 = 提升三选一(用户 2026-10-01 拍板:与通关三选一共享同池)**:奖励节点到达即开三选一(呈现 = 提升三选一覆盖层共用面,spec:[node-reward.md](../../../ux/node-reward.md) v2.0)——从提升池七种(攻击/生命上限/护甲/GP 袋/行动点件/恢复件/刷新件)按同一令牌库洗牌不放回抽 3(同 kind 去重、同一封闭随机流),玩家点选一件兑付(选中踢池、未选回池;秘宝件已出池,满位替换子交互随之不再触发)。件获取次数计数与令牌库为冒险级单例——两渠道同一令牌库合计消耗。「池空直通」为合法态——池耗即枯竭,空库 = 零候选合法态直通(见[冒险结构](冒险结构.md)令牌池节)。
|
||||||
|
|
||||||
### 关卡收束点:先清库、后宣布
|
### 关卡收束点:先清库、后宣布
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
| 节点奖励件的分类与凭证定义、池结构与抽取机制(案D——共享池库存仍归本文) | [奇物](奇物.md) |
|
| 节点奖励件的分类与凭证定义、池结构与抽取机制(案D——共享池库存仍归本文) | [奇物](奇物.md) |
|
||||||
| 关卡完成率带、敌我数值与 Boss 设计 | [难度曲线与Boss](难度曲线与Boss.md) |
|
| 关卡完成率带、敌我数值与 Boss 设计 | [难度曲线与Boss](难度曲线与Boss.md) |
|
||||||
| 钥石与跨局成长 | [元进度](../跨局循环/元进度.md) |
|
| 钥石与跨局成长 | [元进度](../跨局循环/元进度.md) |
|
||||||
| 冒险总结结算(呈现摘要五件事;呈现 spec:design/gdd/ux/settlement-summary.md)与关卡推进指示 | [HUD框架](../表现与支撑/HUD框架.md) |
|
| 冒险总结结算(呈现摘要五件事;呈现 spec:design/ux/settlement-summary.md)与关卡推进指示 | [HUD框架](../表现与支撑/HUD框架.md) |
|
||||||
|
|
||||||
## 在核心循环中的位置
|
## 在核心循环中的位置
|
||||||
|
|
||||||
|
|||||||
@@ -281,7 +281,7 @@
|
|||||||
**两层是两件事,别混**:
|
**两层是两件事,别混**:
|
||||||
|
|
||||||
- **命名是本节的规矩**——三个分类各有一个专名,文档、代码词族、帮百科一律用它。指代某个分类时直接说「专长」,不说「机制类」「专长那一类」。
|
- **命名是本节的规矩**——三个分类各有一个专名,文档、代码词族、帮百科一律用它。指代某个分类时直接说「专长」,不说「机制类」「专长那一类」。
|
||||||
- **呈现是另一件事**(归 [battle](../../ux/battle.md) 与 [node-reward](../../ux/node-reward.md),本节不裁决):玩家看到某件奇物时,卡面只写**这件东西的名字与效果**,不附带它的分类。玩家可以从效果反推它属于哪一类,但界面不替他说破。
|
- **呈现是另一件事**(归 [battle](../../../ux/battle.md) 与 [node-reward](../../../ux/node-reward.md),本节不裁决):玩家看到某件奇物时,卡面只写**这件东西的名字与效果**,不附带它的分类。玩家可以从效果反推它属于哪一类,但界面不替他说破。
|
||||||
|
|
||||||
**为什么两层都要有**:分类名在卡面上不出现,不等于玩家对它没有概念——帮助手册、百科条目、成就名称三处一定会用到它(「首次集齐 4 件专长」「三件属性值提升」),效果描述里出现指代时也需要名字(如「本项属专长」类归类指代)。所以它必须是一个**玩家读得懂、读一遍就懂**的正式名词,不能是内部描述或自造词。
|
**为什么两层都要有**:分类名在卡面上不出现,不等于玩家对它没有概念——帮助手册、百科条目、成就名称三处一定会用到它(「首次集齐 4 件专长」「三件属性值提升」),效果描述里出现指代时也需要名字(如「本项属专长」类归类指代)。所以它必须是一个**玩家读得懂、读一遍就懂**的正式名词,不能是内部描述或自造词。
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:战斗屏上"发生什么、摆在哪里、是什么意思"已经由两份现行文档定稿——屏级呈现形态归 [战斗屏 UX 规格 battle.md](../../ux/battle.md),视觉基调与剪影色彩归 [美术圣经 art-bible](../../../art/art-bible.md)。本文只负责"这些东西怎么动",而且是排期靠后的打磨项(见 [不做清单](../../05-不做清单.md):战斗动画演出是 MVP 内的打磨项,一律排后)。
|
边界这样划:战斗屏上"发生什么、摆在哪里、是什么意思"已经由两份现行文档定稿——屏级呈现形态归 [战斗屏 UX 规格 battle.md](../../../ux/battle.md),视觉基调与剪影色彩归 [美术圣经 art-bible](../../../art/art-bible.md)。本文只负责"这些东西怎么动",而且是排期靠后的打磨项(见 [不做清单](../../05-不做清单.md):战斗动画演出是 MVP 内的打磨项,一律排后)。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
| 不负责 | 归谁 |
|
| 不负责 | 归谁 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 屏级呈现形态与呈现语义(四区布局、敌人呈现〔站桩形态〕、明细带、高光行) | [battle.md](../../ux/battle.md) 与 [HUD 框架](../表现与支撑/HUD框架.md),本文只引用 |
|
| 屏级呈现形态与呈现语义(四区布局、敌人呈现〔站桩形态〕、明细带、高光行) | [battle.md](../../../ux/battle.md) 与 [HUD 框架](../表现与支撑/HUD框架.md),本文只引用 |
|
||||||
| 视觉基调、剪影哲学、色彩与图标键契约 | [art-bible](../../../art/art-bible.md),本文只引用 |
|
| 视觉基调、剪影哲学、色彩与图标键契约 | [art-bible](../../../art/art-bible.md),本文只引用 |
|
||||||
| 结算逻辑与逐行流水本身 | [战斗结算](战斗结算.md) |
|
| 结算逻辑与逐行流水本身 | [战斗结算](战斗结算.md) |
|
||||||
| 敌种视觉状态的数据面(哪个敌种有几态、什么姿态) | [敌人系统](敌人系统.md) |
|
| 敌种视觉状态的数据面(哪个敌种有几态、什么姿态) | [敌人系统](敌人系统.md) |
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
### 不另起场景:在既有呈现上叠加动画密度
|
### 不另起场景:在既有呈现上叠加动画密度
|
||||||
|
|
||||||
战斗屏是挖掘与结算两种形态共用的同一张屏:常驻双舞台(白话:战斗画面与扫雷图同屏常驻,像同一块屏上的两个舞台),结算期不切换场景,裁决与理由见 [battle.md 布局决策 1](../../ux/battle.md)。所以战斗表现的工作不是另做一个战斗场景,而是在既有呈现上叠加动画密度与演出——这是本系统范围边界的第一条。
|
战斗屏是挖掘与结算两种形态共用的同一张屏:常驻双舞台(白话:战斗画面与扫雷图同屏常驻,像同一块屏上的两个舞台),结算期不切换场景,裁决与理由见 [battle.md 布局决策 1](../../../ux/battle.md)。所以战斗表现的工作不是另做一个战斗场景,而是在既有呈现上叠加动画密度与演出——这是本系统范围边界的第一条。
|
||||||
|
|
||||||
"发生什么"与"怎么动"因此分了工:敌人死亡是血条归零后灰化加碎裂退场、禁止瞬间消失,结算明细带逐行滚动,完美封印与封印标中有高光行强调——这些呈现语义已由 battle.md 与 HUD 框架定稿,本文不复述。本文将来承接的只是其上的动画密度:受击反馈、弹道、退场动画等类别。
|
"发生什么"与"怎么动"因此分了工:敌人死亡是血条归零后灰化加碎裂退场、禁止瞬间消失,结算明细带逐行滚动,完美封印与封印标中有高光行强调——这些呈现语义已由 battle.md 与 HUD 框架定稿,本文不复述。本文将来承接的只是其上的动画密度:受击反馈、弹道、退场动画等类别。
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
|
|
||||||
样张是前置美术测试的判定物;本节把"怎么算过"在测试组织前写成文,避免临场现定标准。成文做法参照 [art-bible](../../../art/art-bible.md) §1.4 格子样张测试(内容清单、按序验收项、判定与回退),判据全部落到已冻结的现行口径上——本节不定任何新的视觉参数。
|
样张是前置美术测试的判定物;本节把"怎么算过"在测试组织前写成文,避免临场现定标准。成文做法参照 [art-bible](../../../art/art-bible.md) §1.4 格子样张测试(内容清单、按序验收项、判定与回退),判据全部落到已冻结的现行口径上——本节不定任何新的视觉参数。
|
||||||
|
|
||||||
样张内容清单(一组齐备,缺项即无效):按 [battle.md 布局决策 1](../../ux/battle.md) 的常驻双舞台四区布局整屏出样;角色剪影按棋盘格、结算明细带、战斗舞台三个语境同图摆放;~~敌人卡两候选形态对照(卡片式与站桩式各一版,其余内容不变)~~——**本项已完成(全站桩定稿、卡片式退役),正式样张按站桩形态单版出样即可**;受击、退场、高光兑现三组动画关键帧条(每组至少起、中、末三帧);敌人姿态精灵与数字、封印印记、小人同格叠放的遮挡对照组至少一组。
|
样张内容清单(一组齐备,缺项即无效):按 [battle.md 布局决策 1](../../../ux/battle.md) 的常驻双舞台四区布局整屏出样;角色剪影按棋盘格、结算明细带、战斗舞台三个语境同图摆放;~~敌人卡两候选形态对照(卡片式与站桩式各一版,其余内容不变)~~——**本项已完成(全站桩定稿、卡片式退役),正式样张按站桩形态单版出样即可**;受击、退场、高光兑现三组动画关键帧条(每组至少起、中、末三帧);敌人姿态精灵与数字、封印印记、小人同格叠放的遮挡对照组至少一组。
|
||||||
|
|
||||||
验收项按序判定,第一项不过 = 整张否决(继承格子样张"数字可读性定风格"的次序):
|
验收项按序判定,第一项不过 = 整张否决(继承格子样张"数字可读性定风格"的次序):
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@
|
|||||||
| 上游 | [HUD 框架](../表现与支撑/HUD框架.md) | 四区布局、战斗画面区(四区中的 B 区)演出区结构、敌人呈现(站桩形态)与明细带呈现语义——本文在其上叠加密度 |
|
| 上游 | [HUD 框架](../表现与支撑/HUD框架.md) | 四区布局、战斗画面区(四区中的 B 区)演出区结构、敌人呈现(站桩形态)与明细带呈现语义——本文在其上叠加密度 |
|
||||||
| 上游 | [敌人系统](敌人系统.md) | 资产需求下限三类与敌种姿态数据面——数据已锁,本文出终稿;另登记一项随样张一并裁决的事项:敌人层绘制优先级的插入位置 |
|
| 上游 | [敌人系统](敌人系统.md) | 资产需求下限三类与敌种姿态数据面——数据已锁,本文出终稿;另登记一项随样张一并裁决的事项:敌人层绘制优先级的插入位置 |
|
||||||
| 上游 | [art-bible](../../../art/art-bible.md)(现行权威) | 剪影、色彩、图标键契约、各阶段氛围——表现侧约束 |
|
| 上游 | [art-bible](../../../art/art-bible.md)(现行权威) | 剪影、色彩、图标键契约、各阶段氛围——表现侧约束 |
|
||||||
| 上游 | [battle.md](../../ux/battle.md)(现行权威) | 屏级呈现形态与呈现语义 |
|
| 上游 | [battle.md](../../../ux/battle.md)(现行权威) | 屏级呈现形态与呈现语义 |
|
||||||
| 协作 | [音频](../表现与支撑/音频.md) | 坍塌显形动画与音效方向配对登记,将来对位设计(挂点未定) |
|
| 协作 | [音频](../表现与支撑/音频.md) | 坍塌显形动画与音效方向配对登记,将来对位设计(挂点未定) |
|
||||||
|
|
||||||
## P0 最小闭环
|
## P0 最小闭环
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ HUD框架把各玩法系统产生的事实变成玩家看得见、点得动、
|
|||||||
|
|
||||||
## 系统范围
|
## 系统范围
|
||||||
|
|
||||||
边界这样划:本系统管"怎么呈现、怎么翻译输入、弹层怎么排队"。一个动作合不合法、结果算什么意思,归排雷玩法、行动经济、战斗结算等上游裁定;画面具体长什么样、组件落在哪一像素,屏级权威按屏分治——战斗屏是 [battle.md](../../ux/battle.md)、关卡画面是 [level-map.md](../../ux/level-map.md)——本文只锁系统级契约。
|
边界这样划:本系统管"怎么呈现、怎么翻译输入、弹层怎么排队"。一个动作合不合法、结果算什么意思,归排雷玩法、行动经济、战斗结算等上游裁定;画面具体长什么样、组件落在哪一像素,屏级权威按屏分治——战斗屏是 [battle.md](../../../ux/battle.md)、关卡画面是 [level-map.md](../../../ux/level-map.md)——本文只锁系统级契约。
|
||||||
|
|
||||||
负责:
|
负责:
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ HUD框架把各玩法系统产生的事实变成玩家看得见、点得动、
|
|||||||
|---|---|
|
|---|---|
|
||||||
| 任何玩法状态与玩法数值 | 各玩法系统;数值表本体归[数据配置](数据配置.md) |
|
| 任何玩法状态与玩法数值 | 各玩法系统;数值表本体归[数据配置](数据配置.md) |
|
||||||
| 合法性判定与机制语义裁定 | [排雷玩法](../排雷循环/排雷玩法.md)、[行动经济](../排雷循环/行动经济.md)、[战斗结算](../战斗循环/战斗结算.md) |
|
| 合法性判定与机制语义裁定 | [排雷玩法](../排雷循环/排雷玩法.md)、[行动经济](../排雷循环/行动经济.md)、[战斗结算](../战斗循环/战斗结算.md) |
|
||||||
| 屏级布局与动画时长的像素级裁决 | [battle.md](../../ux/battle.md)(战斗屏)与 [level-map.md](../../ux/level-map.md)(关卡画面) |
|
| 屏级布局与动画时长的像素级裁决 | [battle.md](../../../ux/battle.md)(战斗屏)与 [level-map.md](../../../ux/level-map.md)(关卡画面) |
|
||||||
| 美术终稿与动画密度 | [art-bible](../../../art/art-bible.md)与[战斗表现](../战斗循环/战斗表现.md) |
|
| 美术终稿与动画密度 | [art-bible](../../../art/art-bible.md)与[战斗表现](../战斗循环/战斗表现.md) |
|
||||||
| 音频、教学内容、本地化文本生产 | [音频](音频.md)、[教学引导](教学引导.md)、[设置与本地化](设置与本地化.md) |
|
| 音频、教学内容、本地化文本生产 | [音频](音频.md)、[教学引导](教学引导.md)、[设置与本地化](设置与本地化.md) |
|
||||||
| 任何随机消费 | 无——呈现层零随机 |
|
| 任何随机消费 | 无——呈现层零随机 |
|
||||||
@@ -61,9 +61,9 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| C 角色信息 | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 |
|
| C 角色信息 | 左下,宽读 `info_panel_w`,高 = 基准屏高 − B 区高 | 生命 / 攻击 / 储备数据框、状态效果槽、小人立绘 |
|
||||||
| D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区 | 行动点条与按钮组、棋盘本体、toast 槽 |
|
| D 扫雷图 | 中下,宽 = 基准屏宽 − C 区宽 − 列间距,高同 C 区 | 行动点条与按钮组、棋盘本体、toast 槽 |
|
||||||
|
|
||||||
分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`(经 `ConfigDb.presentation.battle_layout` 读取);分区尺寸与组件落位的像素级裁决归 [battle.md](../../ux/battle.md),两份文档只写结构关系、不复写数值。三区结构与双舞台常驻是结构冻结项,修订走文档修订而非调参。节点链进度不在战斗屏呈现——它由关卡画面(选路覆盖层常驻形态)的节点态承载,见[关卡节点地图](../冒险循环/关卡节点地图.md)。
|
分区几何的唯一事实源 = `game/data/tables/battle_layout.tres`(经 `ConfigDb.presentation.battle_layout` 读取);分区尺寸与组件落位的像素级裁决归 [battle.md](../../../ux/battle.md),两份文档只写结构关系、不复写数值。三区结构与双舞台常驻是结构冻结项,修订走文档修订而非调参。节点链进度不在战斗屏呈现——它由关卡画面(选路覆盖层常驻形态)的节点态承载,见[关卡节点地图](../冒险循环/关卡节点地图.md)。
|
||||||
|
|
||||||
**结论**:棋盘格边长由 [battle.md](../../ux/battle.md)「棋盘格尺寸公式」按棋盘区实测面积与板型算出;本文只判"塞不塞得进",不复制算式与算例。**分辨率档位**:两档=1280×800 基准档(本表全部定值的口径)+1920×1080 档=**全局等比**(stretch canvas_items+aspect keep——16:10 设计在 16:9 窗口为等比 1.35×+左右黑边各 ~96px);本节与各屏定值一律按 1280 基准档书写,1920 档由引擎等比承载、零重排。
|
**结论**:棋盘格边长由 [battle.md](../../../ux/battle.md)「棋盘格尺寸公式」按棋盘区实测面积与板型算出;本文只判"塞不塞得进",不复制算式与算例。**分辨率档位**:两档=1280×800 基准档(本表全部定值的口径)+1920×1080 档=**全局等比**(stretch canvas_items+aspect keep——16:10 设计在 16:9 窗口为等比 1.35×+左右黑边各 ~96px);本节与各屏定值一律按 1280 基准档书写,1920 档由引擎等比承载、零重排。
|
||||||
|
|
||||||
```
|
```
|
||||||
装板可行性(网格实高 ≤ 棋盘区可用高):
|
装板可行性(网格实高 ≤ 棋盘区可用高):
|
||||||
@@ -76,7 +76,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| N | 棋盘边长格数 | 读[棋盘生成](../排雷循环/棋盘生成.md)(现行四档;事实源 board_gen.tres) |
|
| N | 棋盘边长格数 | 读[棋盘生成](../排雷循环/棋盘生成.md)(现行四档;事实源 board_gen.tres) |
|
||||||
| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 由 D 区尺寸扣行动点条高(读 `ap_bar_h`)得出,本表不复制现算值 |
|
| 棋盘区宽 / 高 | 扫雷图区基准尺寸 | 由 D 区尺寸扣行动点条高(读 `ap_bar_h`)得出,本表不复制现算值 |
|
||||||
|
|
||||||
装板可行性由上面的不等式保证;格边长的可读下限见 [battle.md](../../ux/battle.md),算例由样张渲染脚本按布局表现算、不入文档。棋盘数字直接显示排雷玩法给的真值——呈现层禁止自己算数字,这是"数据层从不说谎"在呈现侧的镜像。
|
装板可行性由上面的不等式保证;格边长的可读下限见 [battle.md](../../../ux/battle.md),算例由样张渲染脚本按布局表现算、不入文档。棋盘数字直接显示排雷玩法给的真值——呈现层禁止自己算数字,这是"数据层从不说谎"在呈现侧的镜像。
|
||||||
|
|
||||||
### 提示与弹层:轻提示随起随消、重弹层排队进出
|
### 提示与弹层:轻提示随起随消、重弹层排队进出
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
|
|
||||||
### 营地:可点击场景图
|
### 营地:可点击场景图
|
||||||
|
|
||||||
营地形态**已换代为一张可点击的场景图 + 七物件点选**(现行权威=[camp](../../ux/camp.md));全部程序占位视觉(占位纪律延续,2026-10-11 用户令),**视觉与布局终稿归 HUD 营地视觉批**(未立项)。结构现行事实源 = [天赋树](../跨局循环/天赋树.md)「营地=树:统一模型」节。
|
营地形态**已换代为一张可点击的场景图 + 七物件点选**(现行权威=[camp](../../../ux/camp.md));全部程序占位视觉(占位纪律延续,2026-10-11 用户令),**视觉与布局终稿归 HUD 营地视觉批**(未立项)。结构现行事实源 = [天赋树](../跨局循环/天赋树.md)「营地=树:统一模型」节。
|
||||||
|
|
||||||
### 可访问性基线:看得清、不闪、纯鼠标玩得通
|
### 可访问性基线:看得清、不闪、纯鼠标玩得通
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| [排雷玩法](../排雷循环/排雷玩法.md) | 已开 / 未开格态一眼可辨;悬停预承诺与可挖域常驻指示;移动路径预览即合法性指示;每次拒绝可感知且棋盘面细因可区分;停手被改判可感知 |
|
| [排雷玩法](../排雷循环/排雷玩法.md) | 已开 / 未开格态一眼可辨;悬停预承诺与可挖域常驻指示;移动路径预览即合法性指示;每次拒绝可感知且棋盘面细因可区分;停手被改判可感知 |
|
||||||
| [行动经济](../排雷循环/行动经济.md) | 行动点与储备常显;储备清零反馈;棋盘面与资源面拒绝可区分;刷新入口与代价可读 |
|
| [行动经济](../排雷循环/行动经济.md) | 行动点与储备常显;储备清零反馈;棋盘面与资源面拒绝可区分;刷新入口与代价可读 |
|
||||||
| [战斗结算](../战斗循环/战斗结算.md) | 未生效类明细行(奖励未生效)的呈现;高光行强调 |
|
| [战斗结算](../战斗循环/战斗结算.md) | 未生效类明细行(奖励未生效)的呈现;高光行强调 |
|
||||||
| [关卡节点地图](../冒险循环/关卡节点地图.md) | 节点链进度呈现(关卡画面选路覆盖层节点态承载:暗金已过、金当前、候选下一跳通道亮金、Boss 紫赤描边);选路覆盖层只读呈现(零自动推进停点语义)——屏级 spec:[level-map](../../ux/level-map.md) |
|
| [关卡节点地图](../冒险循环/关卡节点地图.md) | 节点链进度呈现(关卡画面选路覆盖层节点态承载:暗金已过、金当前、候选下一跳通道亮金、Boss 紫赤描边);选路覆盖层只读呈现(零自动推进停点语义)——屏级 spec:[level-map](../../../ux/level-map.md) |
|
||||||
| [敌人系统](../战斗循环/敌人系统.md) | 意图线索映射成文且全局恒定;单位顺位与血条可读;敌方共享层数各卡同值 |
|
| [敌人系统](../战斗循环/敌人系统.md) | 意图线索映射成文且全局恒定;单位顺位与血条可读;敌方共享层数各卡同值 |
|
||||||
| [增益状态](../战斗循环/增益状态.md) | 状态栏常显;无状态时整排槽隐藏;有利 / 有害极性呈现不看数值符号 |
|
| [增益状态](../战斗循环/增益状态.md) | 状态栏常显;无状态时整排槽隐藏;有利 / 有害极性呈现不看数值符号 |
|
||||||
| [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格的奖励身份常读;未开格类型微光(英雄周围 8 格内的未开格显示资源类型——概念定义见本篇「未开格类型微光」节) |
|
| [地图战斗资源](../战斗循环/地图战斗资源.md) | 已开格的奖励身份常读;未开格类型微光(英雄周围 8 格内的未开格显示资源类型——概念定义见本篇「未开格类型微光」节) |
|
||||||
@@ -236,7 +236,7 @@ HUD框架站在玩家与全部玩法系统之间:挖掘期它是输入的翻
|
|||||||
| P1 | 远格点击自动"先移动再挖"复合意图 | 移动免费高频,两击摩擦先经实测验证再裁 |
|
| P1 | 远格点击自动"先移动再挖"复合意图 | 移动免费高频,两击摩擦先经实测验证再裁 |
|
||||||
| P1 | Gamepad 焦点序 | 纯鼠标已覆盖 MVP 全部操作 |
|
| P1 | Gamepad 焦点序 | 纯鼠标已覆盖 MVP 全部操作 |
|
||||||
| P1 | 可访问性正式分层(文本缩放 / 色盲模式 / 按键重映射) | 归[设置与本地化](设置与本地化.md)设置项全集裁决(2026-09-27 拍板不另立专项文档) |
|
| P1 | 可访问性正式分层(文本缩放 / 色盲模式 / 按键重映射) | 归[设置与本地化](设置与本地化.md)设置项全集裁决(2026-09-27 拍板不另立专项文档) |
|
||||||
| P1 | 相邻域屏(节点奖励 / 关卡结算)完整屏形态 | 归后续 UX 文档(关卡结算屏 spec 已建 [level-clear](../../ux/level-clear.md);节点奖励屏 spec 已在役:[node-reward](../../ux/node-reward.md) v2.5 令牌池口径);MVP 以覆盖层反馈承载 |
|
| P1 | 相邻域屏(节点奖励 / 关卡结算)完整屏形态 | 归后续 UX 文档(关卡结算屏 spec 已建 [level-clear](../../../ux/level-clear.md);节点奖励屏 spec 已在役:[node-reward](../../../ux/node-reward.md) v2.5 令牌池口径);MVP 以覆盖层反馈承载 |
|
||||||
| P2 | 提示一次性作用域升级为存档级"一生一次" | 归[存档序列化](存档序列化.md)与[元进度](../跨局循环/元进度.md)后重议 |
|
| P2 | 提示一次性作用域升级为存档级"一生一次" | 归[存档序列化](存档序列化.md)与[元进度](../跨局循环/元进度.md)后重议 |
|
||||||
| P2 | 调试面板退役 | 正式侧归元进度;诊断按钮保留为调试设施 |
|
| P2 | 调试面板退役 | 正式侧归元进度;诊断按钮保留为调试设施 |
|
||||||
| P2 | 探测类秘宝的显影呈现面 | 接口归[秘宝](../跨局循环/秘宝.md)定稿批 |
|
| P2 | 探测类秘宝的显影呈现面 | 接口归[秘宝](../跨局循环/秘宝.md)定稿批 |
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
| 关卡表 | 逐关节点图与层名 | [冒险结构](../冒险循环/冒险结构.md) |
|
| 关卡表 | 逐关节点图与层名 | [冒险结构](../冒险循环/冒险结构.md) |
|
||||||
| 冒险表 | 关卡大奖励与钥石入账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) |
|
| 冒险表 | 关卡大奖励与钥石入账(单行全局) | [冒险结构](../冒险循环/冒险结构.md) |
|
||||||
| 元进度表 | 元进度字段(现行五行族:属性锻造 / Boss 钥石 / 工坊阈值 / 换算率 / 同调刷新升级行族) | [元进度](../跨局循环/元进度.md) |
|
| 元进度表 | 元进度字段(现行五行族:属性锻造 / Boss 钥石 / 工坊阈值 / 换算率 / 同调刷新升级行族) | [元进度](../跨局循环/元进度.md) |
|
||||||
| 战斗屏布局表(`battle_layout.tres`) | 分区几何、B 区连续地面层高与明细带两态高(单行;呈现层布局配置,非玩法数值——供呈现层与样张工具同源读取) | [战斗屏规格](../../ux/battle.md)(结构)/[HUD框架](HUD框架.md)(呈现常量) |
|
| 战斗屏布局表(`battle_layout.tres`) | 分区几何、B 区连续地面层高与明细带两态高(单行;呈现层布局配置,非玩法数值——供呈现层与样张工具同源读取) | [战斗屏规格](../../../ux/battle.md)(结构)/[HUD框架](HUD框架.md)(呈现常量) |
|
||||||
|
|
||||||
举证:本节为数据纪律约定,无计算。违规检测 = 静态扫描加人工复核,随各表回填定稿与里程碑检查执行。
|
举证:本节为数据纪律约定,无计算。违规检测 = 静态扫描加人工复核,随各表回填定稿与里程碑检查执行。
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
| 不负责 | 归谁 |
|
| 不负责 | 归谁 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 呈现语义与可访问性基线本体(字号下限、闪烁上限、纯鼠标可玩等) | [HUD 框架](HUD框架.md) |
|
| 呈现语义与可访问性基线本体(字号下限、闪烁上限、纯鼠标可玩等) | [HUD 框架](HUD框架.md) |
|
||||||
| 逐行结算的呈现规则 | [battle.md](../../ux/battle.md) 与 [HUD 框架](HUD框架.md),本文只引用 |
|
| 逐行结算的呈现规则 | [battle.md](../../../ux/battle.md) 与 [HUD 框架](HUD框架.md),本文只引用 |
|
||||||
| 减动效开启后动画怎么演 | [战斗表现](../战斗循环/战斗表现.md)——本文提供开关,动画侧兑现归对方 |
|
| 减动效开启后动画怎么演 | [战斗表现](../战斗循环/战斗表现.md)——本文提供开关,动画侧兑现归对方 |
|
||||||
| 音量调节对声音怎么生效 | [音频](音频.md)——生效侧归对方,口径已对齐 |
|
| 音量调节对声音怎么生效 | [音频](音频.md)——生效侧归对方,口径已对齐 |
|
||||||
| 文案内容本体(教学条目、界面用语等写了什么) | 各系统文档——本文只做翻译生产,不改含义 |
|
| 文案内容本体(教学条目、界面用语等写了什么) | 各系统文档——本文只做翻译生产,不改含义 |
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
|
|
||||||
| 输入 | 登记处 | 将来要做的 |
|
| 输入 | 登记处 | 将来要做的 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 减动效开关 | [HUD 框架](HUD框架.md)的可访问性基线与 [battle.md](../../ux/battle.md)的呈现承诺;[战斗表现](../战斗循环/战斗表现.md)已登记承接其动画侧 | 提供开关:开启后全部动画有时长减半或直达终态的通路。呈现侧的约束以 battle.md 与 HUD 框架为权威,本文不复述 |
|
| 减动效开关 | [HUD 框架](HUD框架.md)的可访问性基线与 [battle.md](../../../ux/battle.md)的呈现承诺;[战斗表现](../战斗循环/战斗表现.md)已登记承接其动画侧 | 提供开关:开启后全部动画有时长减半或直达终态的通路。呈现侧的约束以 battle.md 与 HUD 框架为权威,本文不复述 |
|
||||||
| 音量控制入口 | 归档对本系统的常规分工登记;[音频](音频.md)已登记同款分工 | 在设置里提供音量入口;生效侧归音频(口径已对齐) |
|
| 音量控制入口 | 归档对本系统的常规分工登记;[音频](音频.md)已登记同款分工 | 在设置里提供音量入口;生效侧归音频(口径已对齐) |
|
||||||
| 键位映射表 | [HUD 框架](HUD框架.md)定稿登记的交付物输入(全键族) | 如何转化成设置项(比如是否允许改键)待设计 |
|
| 键位映射表 | [HUD 框架](HUD框架.md)定稿登记的交付物输入(全键族) | 如何转化成设置项(比如是否允许改键)待设计 |
|
||||||
| 结算风味词 | 归档概念层增补批随巢穴隐喻换轴登记("封印 / 镇 / 反制"一类类型风味词),只登记了存在、各归各的时机 | 内容与形态未定,本文只登记这条输入在 |
|
| 结算风味词 | 归档概念层增补批随巢穴隐喻换轴登记("封印 / 镇 / 反制"一类类型风味词),只登记了存在、各归各的时机 | 内容与形态未定,本文只登记这条输入在 |
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
|
|
||||||
### 解锁界面:双入口框架
|
### 解锁界面:双入口框架
|
||||||
|
|
||||||
(2026-09-18 拍板;入口拓扑=三入口化)营地消费面(消费钥石、查看与管理永久强化)经主菜单「进入存档」→选档界面→进档/新档进入,主菜单不再设营地独立钮;局内状态面板(游戏非实时无暂停语义)也可查看钥石余额与本局冒险信息(只读)。钥石余额在 HUD 常驻展示。呈现 spec:[ux/camp.md](../../ux/camp.md) v1.0(退役/封存件「已退役/已解锁·能力封存中」呈现语义随 spec 落位);视觉终稿已落码。本节锁框架与需求,呈现细节归 spec;局内状态面板入口已实装(实机目检待用户,待办清单登记条在册)。
|
(2026-09-18 拍板;入口拓扑=三入口化)营地消费面(消费钥石、查看与管理永久强化)经主菜单「进入存档」→选档界面→进档/新档进入,主菜单不再设营地独立钮;局内状态面板(游戏非实时无暂停语义)也可查看钥石余额与本局冒险信息(只读)。钥石余额在 HUD 常驻展示。呈现 spec:[ux/camp.md](../../../ux/camp.md) v1.0(退役/封存件「已退役/已解锁·能力封存中」呈现语义随 spec 落位);视觉终稿已落码。本节锁框架与需求,呈现细节归 spec;局内状态面板入口已实装(实机目检待用户,待办清单登记条在册)。
|
||||||
|
|
||||||
### 单局循环零依赖:排期边界的推论
|
### 单局循环零依赖:排期边界的推论
|
||||||
|
|
||||||
|
|||||||
@@ -69,9 +69,9 @@
|
|||||||
|
|
||||||
| 界面 | 管什么(现状指证) | 与生涯的边界 |
|
| 界面 | 管什么(现状指证) | 与生涯的边界 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 营地([camp UX spec](../../ux/camp.md)) | 跨局成长**操作**面(花钥石买强化 / 装配 / 点树——营地场景图+五功能窗口形态);原底栏「最近冒险」条带已撤下(P6 甲),逐局历史回看唯一归生涯 | 营地不改生涯只读定位;生涯不做任何购买入口,也不放「去买」按钮。营地条带已撤(P6 甲) |
|
| 营地([camp UX spec](../../../ux/camp.md)) | 跨局成长**操作**面(花钥石买强化 / 装配 / 点树——营地场景图+五功能窗口形态);原底栏「最近冒险」条带已撤下(P6 甲),逐局历史回看唯一归生涯 | 营地不改生涯只读定位;生涯不做任何购买入口,也不放「去买」按钮。营地条带已撤(P6 甲) |
|
||||||
| 状态面板 | **局内**只读查看这一局进行中的钥石与本局冒险进度 | 状态面板看当局当前值,生涯看跨局累计与历史;局内无生涯入口(P4 甲) |
|
| 状态面板 | **局内**只读查看这一局进行中的钥石与本局冒险进度 | 状态面板看当局当前值,生涯看跨局累计与历史;局内无生涯入口(P4 甲) |
|
||||||
| 结算屏([settlement-summary UX spec](../../ux/settlement-summary.md)) | 冒险收束当下的入账明细——冒险收束时由结算屏呈现入账明细与钥石明细(复用终局面账行的呈现形态) | 收束当下的呈现保留不动;生涯承接的是收束之后的任意时刻回看 |
|
| 结算屏([settlement-summary UX spec](../../../ux/settlement-summary.md)) | 冒险收束当下的入账明细——冒险收束时由结算屏呈现入账明细与钥石明细(复用终局面账行的呈现形态) | 收束当下的呈现保留不动;生涯承接的是收束之后的任意时刻回看 |
|
||||||
| 帮助手册(Beta 批,未实装——教学内容归 Beta 帮助手册) | 讲「怎么玩」 | 生涯讲「我玩过什么」。图鉴条目文案与手册是否共用内容源,接口登记归 Beta 批一并裁 |
|
| 帮助手册(Beta 批,未实装——教学内容归 Beta 帮助手册) | 讲「怎么玩」 | 生涯讲「我玩过什么」。图鉴条目文案与手册是否共用内容源,接口登记归 Beta 批一并裁 |
|
||||||
| 图例面板 | 局内符号/徽标即时解码 | 不合并——图例是局内解码面,图鉴是跨局收集面 |
|
| 图例面板 | 局内符号/徽标即时解码 | 不合并——图例是局内解码面,图鉴是跨局收集面 |
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -111,7 +111,7 @@
|
|||||||
| 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地砖换色板) |
|
| 图类型 | 棋盘生成产物 `board_type` 的中文名——三关换皮的单位(同款地砖换色板) |
|
||||||
| 方向稿 | 冻结前的方向性候选稿,供气质目检;过目检后才进机检冻结 |
|
| 方向稿 | 冻结前的方向性候选稿,供气质目检;过目检后才进机检冻结 |
|
||||||
| 站桩 | 战斗画面区(B 区)里角色直立立绘的显示形态(配血条与状态行) |
|
| 站桩 | 战斗画面区(B 区)里角色直立立绘的显示形态(配血条与状态行) |
|
||||||
| 显示档 | 站桩立绘的显示尺寸规则——源用原稿分辨率入包(禁降采样),显示按三档绝对高(小型 96/中型 144/大型 188)缩放、宽随源比例;定值单点见[美术圣经](../art/art-bible.md) §8.2 站桩立绘显示档条 |
|
| 显示档 | 站桩立绘的显示尺寸规则——源用原稿分辨率入包(禁降采样),显示按三档绝对高缩放、宽随源比例;定值单点见[美术圣经](../art/art-bible.md) §8.2 站桩立绘显示档条(档值定值面=站桩呈现守门测试) |
|
||||||
| 徽章 | 库存条与结算明细用的小图标(与格面类型微光预读相区分) |
|
| 徽章 | 库存条与结算明细用的小图标(与格面类型微光预读相区分) |
|
||||||
|
|
||||||
## 开发流程
|
## 开发流程
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
- **首次到达**:从关卡首节点(战×2 的第一战)进入。MVP 无引导流,chord 肌肉记忆提示等非模态提示承担首次教学(见 §States)
|
- **首次到达**:从关卡首节点(战×2 的第一战)进入。MVP 无引导流,chord 肌肉记忆提示等非模态提示承担首次教学(见 §States)
|
||||||
- **到达前刚在做**:关卡画面(独立屏)上点击战斗节点(关卡推进方受理);或上一场战斗胜利后返回关卡画面再选下一节点
|
- **到达前刚在做**:关卡画面(独立屏)上点击战斗节点(关卡推进方受理);或上一场战斗胜利后返回关卡画面再选下一节点
|
||||||
- **情绪状态**:棋手式清明专注(art-bible §2.1,能量 2/10)——挖掘期画面必须无杂音;结算期转为清算爽感(7/10)
|
- **情绪状态**:棋手式清明专注(art-bible §2.1,能量低位)——挖掘期画面必须无杂音;结算期转为清算爽感(能量高位)
|
||||||
- **到达方式**:游戏推进送入(非自愿导航),进入即处于挖掘阶段(棋盘已 install、初始 3×3 已展开、小人出生)
|
- **到达方式**:游戏推进送入(非自愿导航),进入即处于挖掘阶段(棋盘已 install、初始 3×3 已展开、小人出生)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -142,7 +142,7 @@
|
|||||||
|
|
||||||
- N = 棋盘长宽两边的较大者;格间距 2px;垂直预留 24px(上 12 / 下 12);悬崖厚度 8px;结构钳制区间 [26, 46]px。
|
- N = 棋盘长宽两边的较大者;格间距 2px;垂直预留 24px(上 12 / 下 12);悬崖厚度 8px;结构钳制区间 [26, 46]px。
|
||||||
- 格边长可读性以用户验收的现行画面为锚点(2026-11-01 用户裁——现行渲染值即基准,基座档 14×14=28px 达标);全域不设人造的格边长可读阈值。结构钳制 [26, 46] 只管算式结果不越界;格边长接线守卫=生产写入值与上式单点算式的返回值严格相等,最大板型的推定读数仅留痕观察、不作判红依据。
|
- 格边长可读性以用户验收的现行画面为锚点(2026-11-01 用户裁——现行渲染值即基准,基座档 14×14=28px 达标);全域不设人造的格边长可读阈值。结构钳制 [26, 46] 只管算式结果不越界;格边长接线守卫=生产写入值与上式单点算式的返回值严格相等,最大板型的推定读数仅留痕观察、不作判红依据。
|
||||||
- N 的取值与每关板型的对应关系读[棋盘生成](../systems/排雷循环/棋盘生成.md),现行值的事实源是 `data/tables/board_gen.tres`。
|
- N 的取值与每关板型的对应关系读[棋盘生成](../gdd/systems/排雷循环/棋盘生成.md),现行值的事实源是 `data/tables/board_gen.tres`。
|
||||||
- 数字字号 = max(18, ceil(格边长 × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰)。
|
- 数字字号 = max(18, ceil(格边长 × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰)。
|
||||||
|
|
||||||
算例不入文档:棋盘区可用面积随布局表与板型变化,不是契约值——现算并绘在整屏样张上,本文件不复写。
|
算例不入文档:棋盘区可用面积随布局表与板型变化,不是契约值——现算并绘在整屏样张上,本文件不复写。
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
| B | 主角站桩立绘 | 站桩(无框立绘+落影) | HP 条落底盘(2026-10-06 方案二拍板:站桩排式 = **立绘→血条→状态**,全场血条对齐一线;血条嵌石板位、台缘线留作地面线;不悬浮头顶——高盒下血条-立绘空洞,用户点名否决)、状态效果小图标一排挂血条正下方(形状+色相双通道、层数角标;空态不占位退化为空行)——**HP 与状态效果的唯一展示面(2026-09-26 信息归属拍板;悬停 tooltip〔来源+语义+剩余结算次数〕职责在本组件)**;攻击值等规划数据仍归 C 区数据框(2026-09-20 全站桩拍板,英雄卡退役) | 悬停状态小图标看 tooltip | HUD 视图拆分改造 |
|
| B | 主角站桩立绘 | 站桩(无框立绘+落影) | HP 条落底盘(2026-10-06 方案二拍板:站桩排式 = **立绘→血条→状态**,全场血条对齐一线;血条嵌石板位、台缘线留作地面线;不悬浮头顶——高盒下血条-立绘空洞,用户点名否决)、状态效果小图标一排挂血条正下方(形状+色相双通道、层数角标;空态不占位退化为空行)——**HP 与状态效果的唯一展示面(2026-09-26 信息归属拍板;悬停 tooltip〔来源+语义+剩余结算次数〕职责在本组件)**;攻击值等规划数据仍归 C 区数据框(2026-09-20 全站桩拍板,英雄卡退役) | 悬停状态小图标看 tooltip | HUD 视图拆分改造 |
|
||||||
| B | 敌人站桩立绘 ×1–3 | 站桩(无框立绘+落影) | 血条+顺位徽标落底盘(同主角排式,2026-10-06 方案二;**大体档〔显示 >150px 级:drider/duergar_king〕允许向上溢出盒顶 N px(N 由实装实算,溢出判定与背景无关),血条仍落底**)、状态小图标挂血条正下方(敌方增益按个体呈现——各立绘只显示它自己名下的状态实例〔蓄力/硬化/削弱/暴走/警觉,2026-11-02 个体化裁〕;数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;无行为环点〔proposal §2.4〕,意图占位 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,**意图徽标悬浮头顶上方,探顶档压胸**,敌方增益〔蓄力/硬化〕入状态图标行);死亡灰化加碎裂退场直接演在立绘上(2026-09-20 全站桩拍板,敌人卡退役);血条下名字行 = 纯名字 + 护甲类型图标(形状+色相双通道,与状态图标同行共存,状态空时为纯名字),AC 数值不展示——2026-09-26 终裁(用户口径:HP 信息已足够,攻防数值不直接写上;护甲类型图标保留克制对策可读性——类型可读、数值隐藏) | 只读 | 新建 |
|
| B | 敌人站桩立绘 ×1–3 | 站桩(无框立绘+落影) | 血条+顺位徽标落底盘(同主角排式,2026-10-06 方案二;**大体档〔显示 >150px 级:drider/duergar_king〕允许向上溢出盒顶 N px(N 由实装实算,溢出判定与背景无关),血条仍落底**)、状态小图标挂血条正下方(敌方增益按个体呈现——各立绘只显示它自己名下的状态实例〔蓄力/硬化/削弱/暴走/警觉,2026-11-02 个体化裁〕;数据源 = 战斗结算流水经增益状态投影,敌人系统×4④;无行为环点〔proposal §2.4〕,意图占位 = 本拍摇定结果的动画占位——普通攻击零表示 / 特殊技类型级提示,**意图徽标悬浮头顶上方,探顶档压胸**,敌方增益〔蓄力/硬化〕入状态图标行);死亡灰化加碎裂退场直接演在立绘上(2026-09-20 全站桩拍板,敌人卡退役);血条下名字行 = 纯名字 + 护甲类型图标(形状+色相双通道,与状态图标同行共存,状态空时为纯名字),AC 数值不展示——2026-09-26 终裁(用户口径:HP 信息已足够,攻防数值不直接写上;护甲类型图标保留克制对策可读性——类型可读、数值隐藏) | 只读 | 新建 |
|
||||||
| B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 |
|
| B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中"(终局定格「战斗结束」;Boss 变体附 Boss 名) | 只读 | 新建 |
|
||||||
| B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 无明细回看——带保留单行摘要,冒险中回看归「生涯」 | 改造 |
|
| B | 结算明细带 | 滚动列表 | 结算期逐行流水([战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 9 类行协议);挖掘期收起为上轮摘要 1 行 | 无明细回看——带保留单行摘要,冒险中回看归「生涯」 | 改造 |
|
||||||
| B | 结算明细回看(已退役) | —— | 冒险中回看归「生涯」;回看覆盖层为未接线遗留件(待办清单登记) | —— | 未接线 |
|
| B | 结算明细回看(已退役) | —— | 冒险中回看归「生涯」;回看覆盖层为未接线遗留件(待办清单登记) | —— | 未接线 |
|
||||||
| C | 攻击数据框 | 直角细线数据框 | 攻击值 + 修正来源角标 + 护甲 AC(AC 二轮拍板 2026-09-26 补入——我方 AC 唯一展示面;HP 与状态归 B 区站桩、RAP 归 D 区 AP 条,不在本组件) | 只读 | HUD 视图拆分 |
|
| C | 攻击数据框 | 直角细线数据框 | 攻击值 + 修正来源角标 + 护甲 AC(AC 二轮拍板 2026-09-26 补入——我方 AC 唯一展示面;HP 与状态归 B 区站桩、RAP 归 D 区 AP 条,不在本组件) | 只读 | HUD 视图拆分 |
|
||||||
| C | 秘宝槽 | 图标槽 ×4 | 四槽壳在役、空槽占位(标题「秘宝」,悬停「秘宝槽(空)」);局内两步使用与关卡域库存随秘宝过渡形态退役——现行秘宝 = 营地同调装配件(秘宝.md),本区展示重接归装配面 | 悬停 tooltip | 已实装 |
|
| C | 秘宝槽 | 图标槽 ×4 | 四槽壳在役、空槽占位(标题「秘宝」,悬停「秘宝槽(空)」);局内两步使用与关卡域库存随秘宝过渡形态退役——现行秘宝 = 营地同调装配件(秘宝.md),本区展示重接归装配面 | 悬停 tooltip | 已实装 |
|
||||||
@@ -282,7 +282,7 @@
|
|||||||
| 弃图刷新(挖掘期,非轮出口) · 刷新尝试遥测 | 刷新使用(难度曲线与Boss OQ6)与行动经济 OQ3 预警阈值观测;每轮 0–2 次(布局决策 4 cap=2) | {受理结果: 受理 / 拒因 RAP 不足 / 拒因触上限, 本轮第几次刷新: 1..2} |
|
| 弃图刷新(挖掘期,非轮出口) · 刷新尝试遥测 | 刷新使用(难度曲线与Boss OQ6)与行动经济 OQ3 预警阈值观测;每轮 0–2 次(布局决策 4 cap=2) | {受理结果: 受理 / 拒因 RAP 不足 / 拒因触上限, 本轮第几次刷新: 1..2} |
|
||||||
| 拒绝/voided · 拒绝遥测 | 拒绝来源(板面/资源/相位三源)与细分原因 | {拒绝来源: 板面/资源/相位, 细分原因} |
|
| 拒绝/voided · 拒绝遥测 | 拒绝来源(板面/资源/相位三源)与细分原因 | {拒绝来源: 板面/资源/相位, 细分原因} |
|
||||||
| 提示触发/关闭 · 提示展示遥测 | 提示类型 | {提示类型: chord 提示 / 无相邻可挖格} |
|
| 提示触发/关闭 · 提示展示遥测 | 提示类型 | {提示类型: chord 提示 / 无相邻可挖格} |
|
||||||
| 呈现订阅(不改核心) | 排雷玩法三事件 / [战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行协议,含终局判定行) / 战斗结束 / 关卡完成 | 载荷 schema 成文义务见 §Data Requirements(HUD框架硬性要求) |
|
| 呈现订阅(不改核心) | 排雷玩法三事件 / [战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行协议,含终局判定行) / 战斗结束 / 关卡完成 | 载荷 schema 成文义务见 §Data Requirements(HUD框架硬性要求) |
|
||||||
|
|
||||||
**持久状态写入**全部经组合根唯一路径(意图批次提交 / 刷新意图提交 / 关卡推进)——UI 层禁直调核心写(架构七原则"依赖单向组合根")。
|
**持久状态写入**全部经组合根唯一路径(意图批次提交 / 刷新意图提交 / 关卡推进)——UI 层禁直调核心写(架构七原则"依赖单向组合根")。
|
||||||
|
|
||||||
@@ -313,7 +313,7 @@
|
|||||||
| BFS 移动路径 | 排雷玩法 路径规划只读面 | Read | 布局决策 3 合法性指示消费 |
|
| BFS 移动路径 | 排雷玩法 路径规划只读面 | Read | 布局决策 3 合法性指示消费 |
|
||||||
| 拒绝原因 | 排雷玩法 细分原因封闭枚举 + 行动经济 资源面 | Read | 三源(板面/资源/相位)映射文案——呈现层契约成文;资源面原因无上游载荷(行动经济仅回受理与否,细分原因仅调试诊断可见),客户端按动作上下文推断 |
|
| 拒绝原因 | 排雷玩法 细分原因封闭枚举 + 行动经济 资源面 | Read | 三源(板面/资源/相位)映射文案——呈现层契约成文;资源面原因无上游载荷(行动经济仅回受理与否,细分原因仅调试诊断可见),客户端按动作上下文推断 |
|
||||||
| AP / RAP / 本轮刷新计数 | 行动经济 | Read | 常显;刷新入口可用性 = RAP 读数客户端预判(RAP≥8)+ 刷新意图提交的受理回执(行动经济 无刷新可用性预查询——仅受理与否的回执 + 只读观测量;行动经济 EC13 拒绝合法可见) |
|
| AP / RAP / 本轮刷新计数 | 行动经济 | Read | 常显;刷新入口可用性 = RAP 读数客户端预判(RAP≥8)+ 刷新意图提交的受理回执(行动经济 无刷新可用性预查询——仅受理与否的回执 + 只读观测量;行动经济 EC13 拒绝合法可见) |
|
||||||
| 结算流水行(9 类封闭协议) | [战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 流水协议 | Read | 逐行来源标注(P2);未生效类行(奖励未生效)聚合计数呈现 |
|
| 结算流水行(9 类封闭协议) | [战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋) 流水协议 | Read | 逐行来源标注(P2);未生效类行(奖励未生效)聚合计数呈现 |
|
||||||
| 判定胜负 | 战斗结算 判定段 | Read | 终局画面数据锚 |
|
| 判定胜负 | 战斗结算 判定段 | Read | 终局画面数据锚 |
|
||||||
| 敌单位 生命/顺位/摇定动作(技能标识·类型·名称)/敌方增益/敌单位标识/存活 | 敌人系统 只读面(经战斗结算呈现快照) | Read | 意图线索映射全局恒定(敌人系统×4②,技能池批三档口径);**销毁前捕获**(缺陷②教训) |
|
| 敌单位 生命/顺位/摇定动作(技能标识·类型·名称)/敌方增益/敌单位标识/存活 | 敌人系统 只读面(经战斗结算呈现快照) | Read | 意图线索映射全局恒定(敌人系统×4②,技能池批三档口径);**销毁前捕获**(缺陷②教训) |
|
||||||
| 状态效果投影(含空态/极性/溢出) | 增益状态 投影口径 | Read | 极性映射数据源 = 战斗结算效果表语义,非幅度符号(增益状态×③) |
|
| 状态效果投影(含空态/极性/溢出) | 增益状态 投影口径 | Read | 极性映射数据源 = 战斗结算效果表语义,非幅度符号(增益状态×③) |
|
||||||
@@ -332,9 +332,9 @@
|
|||||||
|
|
||||||
## Accessibility
|
## Accessibility
|
||||||
|
|
||||||
无障碍基线权威 = [HUD框架](../systems/表现与支撑/HUD框架.md)「可访问性基线」节;不再另立专项文档(2026-09-27 拍板,见 OQ2)。本 spec 内建基线承诺(呈现侧落地):
|
无障碍基线权威 = [HUD框架](../gdd/systems/表现与支撑/HUD框架.md)「可访问性基线」节;不再另立专项文档(2026-09-27 拍板,见 OQ2)。本 spec 内建基线承诺(呈现侧落地):
|
||||||
|
|
||||||
- **对比**:全部格底/面板底对数字墨 ≥4.5:1(WCAG AA)——art-bible §4.1 硬指标已可测(#33261B/#C9AF83 = 6.9:1 实测);UI 数据一律墨族素面
|
- **对比**:全部格底/面板底对数字墨过 WCAG AA——art-bible §4.1 硬指标已可测(判据由对比机检件承载);UI 数据一律墨族素面
|
||||||
- **色弱冗余**:无任何信息仅靠色相承载——格态靠完整/碎裂形;奖励金 vs 危险红靠剪影+运动;UI 红/金强调对加图标+文案冗余;Boss 靠形状独占(art-bible §4.5 清单逐项成立)
|
- **色弱冗余**:无任何信息仅靠色相承载——格态靠完整/碎裂形;奖励金 vs 危险红靠剪影+运动;UI 红/金强调对加图标+文案冗余;Boss 靠形状独占(art-bible §4.5 清单逐项成立)
|
||||||
- **灰度可辨**:变异格纹带、格态在灰度截图下可分类(art-bible §3.2 验收标准)
|
- **灰度可辨**:变异格纹带、格态在灰度截图下可分类(art-bible §3.2 验收标准)
|
||||||
- **非色彩破坏性确认**:弃图刷新(消耗 RAP 8 点)的确认交互与常规确认**不同位**(位置通道,色弱清单 #7)
|
- **非色彩破坏性确认**:弃图刷新(消耗 RAP 8 点)的确认交互与常规确认**不同位**(位置通道,色弱清单 #7)
|
||||||
@@ -397,8 +397,8 @@
|
|||||||
|
|
||||||
## Open Questions
|
## Open Questions
|
||||||
|
|
||||||
1. **Player journey map——已完成(2026-09-27 拍板:不建)**:实现前补建的前提随战斗屏实装失效;情绪曲线事实源 = art-bible §2 能量档,真人体验观测与结论回流 = [体验验证清单](../../../体验验证清单.md)
|
1. **Player journey map——已完成(2026-09-27 拍板:不建)**:实现前补建的前提随战斗屏实装失效;情绪曲线事实源 = art-bible §2 能量档,真人体验观测与结论回流 = [体验验证清单](../../体验验证清单.md)
|
||||||
2. **无障碍专项文档——已完成(2026-09-27 拍板:不另立 design/accessibility-requirements.md)**:基线(对比/色弱/字号/闪烁/减动效/纯鼠标/中文字体)权威 = [HUD框架](../systems/表现与支撑/HUD框架.md)「可访问性基线」节;正式分层(文本缩放/色盲模式/按键重映射)归 [设置与本地化](../systems/表现与支撑/设置与本地化.md) 待设计问题清单 #1(设置项全集裁决时定);本 spec §Accessibility 为呈现侧落地承诺
|
2. **无障碍专项文档——已完成(2026-09-27 拍板:不另立 design/accessibility-requirements.md)**:基线(对比/色弱/字号/闪烁/减动效/纯鼠标/中文字体)权威 = [HUD框架](../gdd/systems/表现与支撑/HUD框架.md)「可访问性基线」节;正式分层(文本缩放/色盲模式/按键重映射)归 [设置与本地化](../gdd/systems/表现与支撑/设置与本地化.md) 待设计问题清单 #1(设置项全集裁决时定);本 spec §Accessibility 为呈现侧落地承诺
|
||||||
3. **interaction-patterns.md——已建成**:本 spec 引入的四 pattern(双源拒绝反馈/逐行兑现明细带/悬停预承诺光标/点阵资源显示)均已入库成文(pattern 1/3/4/5)
|
3. **interaction-patterns.md——已建成**:本 spec 引入的四 pattern(双源拒绝反馈/逐行兑现明细带/悬停预承诺光标/点阵资源显示)均已入库成文(pattern 1/3/4/5)
|
||||||
4. **战斗表现美术测试**(game-concept 已登记,战斗表现前强制):本 spec 的常驻双舞台分屏(布局决策 1)是测试的布局输入——**敌人卡形态已裁决(2026-09-20 用户看对照样张拍板):全站桩式(无框立绘+底座),主角同样站桩、状态小图标挂血条下,卡片式整体退役**;站桩式不改变分区结构。对照样张已存档(敌人卡与站桩式对照样张)
|
4. **战斗表现美术测试**(game-concept 已登记,战斗表现前强制):本 spec 的常驻双舞台分屏(布局决策 1)是测试的布局输入——**敌人卡形态已裁决(2026-09-20 用户看对照样张拍板):全站桩式(无框立绘+底座),主角同样站桩、状态小图标挂血条下,卡片式整体退役**;站桩式不改变分区结构。对照样张已存档(敌人卡与站桩式对照样张)
|
||||||
5. **移动动画形态**(布局决策 3):≤150ms 短滑为推荐值,playtest 观测「移动太瞬/太拖」反馈后调
|
5. **移动动画形态**(布局决策 3):≤150ms 短滑为推荐值,playtest 观测「移动太瞬/太拖」反馈后调
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
# 营地场景 UX spec(camp)
|
# 营地场景 UX spec(camp)
|
||||||
|
|
||||||
> 状态:v2.8(现行)
|
> 状态:v2.8(现行)
|
||||||
> 事实源:本 spec(呈现)+ [元进度](../systems/跨局循环/元进度.md)(机制)
|
> 事实源:本 spec(呈现)+ [元进度](../gdd/systems/跨局循环/元进度.md)(机制)
|
||||||
> 美术画法:[art-bible](../../art/art-bible.md) §6.2/§7.5;素材命名与路径:[asset-path-map](../../art/asset-path-map.md)
|
> 美术画法:[art-bible](../art/art-bible.md) §6.2/§7.5;素材命名与路径:[asset-path-map](../art/asset-path-map.md)
|
||||||
> 相邻:[level-map.md](level-map.md)(主菜单语境)
|
> 相邻:[level-map.md](level-map.md)(主菜单语境)
|
||||||
|
|
||||||
## 定位
|
## 定位
|
||||||
@@ -26,9 +26,9 @@
|
|||||||
|
|
||||||
**场景按要素分层(10 张)**:远景天空/远山/整片地面/门洞内的小路合成 `scene_camp_bg` 背景层(z0,不透明全幅);中景木围墙独立成 `scene_camp_wall` 围墙层(z1,透明底,门洞处留透明缺口);其余八个物件层各一张、由上往下叠。门洞是围墙层的透明缺口,透出背景层画的**一条通向远处的小路**,不可填死。
|
**场景按要素分层(10 张)**:远景天空/远山/整片地面/门洞内的小路合成 `scene_camp_bg` 背景层(z0,不透明全幅);中景木围墙独立成 `scene_camp_wall` 围墙层(z1,透明底,门洞处留透明缺口);其余八个物件层各一张、由上往下叠。门洞是围墙层的透明缺口,透出背景层画的**一条通向远处的小路**,不可填死。
|
||||||
|
|
||||||
**地平线在终稿 y367**(自画面底部往上约 46%),其上是天空与远山、其下整片地面;**中景围墙带 y203–367**,桩身 150、门柱 164;近景物件允许压住围墙(围墙不可点,z 序在近景物件之下),**唯一例外=中间门洞必须留空、不被任何物件遮挡**。围墙形态、门扇比例与帐篷尺寸的现行口径归 [art-bible](../../art/art-bible.md) §6.2,本 spec 不再复述。
|
**地平线在终稿 y367**(自画面底部往上约 46%),其上是天空与远山、其下整片地面;**中景围墙带 y203–367**,桩身 150、门柱 164;近景物件允许压住围墙(围墙不可点,z 序在近景物件之下),**唯一例外=中间门洞必须留空、不被任何物件遮挡**。围墙形态、门扇比例与帐篷尺寸的现行口径归 [art-bible](../art/art-bible.md) §6.2,本 spec 不再复述。
|
||||||
|
|
||||||
坐标草案与分层验收判据见 [camp-scene-prompts](../../art/camp-scene-prompts.md) §2.3/§4(10 张口径现行事实源);2026-10-22 美术方案讨论沿革查 git 提交史。
|
坐标草案与分层验收判据见 [camp-scene-prompts](../art/camp-scene-prompts.md) §2.3/§4(10 张口径现行事实源);2026-10-22 美术方案讨论沿革查 git 提交史。
|
||||||
|
|
||||||
## 点选反馈(根态)
|
## 点选反馈(根态)
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
## 顶栏
|
## 顶栏
|
||||||
|
|
||||||
钥石余额常驻画面顶部一行小 HUD 栏:高 48px、全宽窄条、**浮层覆盖在场景图上层,不挤压画面**。栏体底=营地头带深棕 `#6E4526`(token `CAMP_HEADER_BAND`,色值出处 [art-bible](../../art/art-bible.md) §7.2 五 token 对齐表)× **不透明度 0.80**——半透明系定值,底下画面透出 20%。栏内**只放钥石徽章一件**,右位、顶格落座(徽章自高 48px=栏高,无顶距可言),左位不放件。验收:目检〈顶栏成一条可辨窄带、徽章落在带内〉+机检〈栏体呈色对其下方落位带底色对比 ≥3:1〉。刷新入口已实装=营地刷新单口(进档与营地内写口尾触发,现开界面与顶栏余额同步取现值)。
|
钥石余额常驻画面顶部一行小 HUD 栏:高 48px、全宽窄条、**浮层覆盖在场景图上层,不挤压画面**。栏体底=营地头带深棕(token `CAMP_HEADER_BAND`,色值定值面=ui_kit 常量,token 对齐注记见 [art-bible](../art/art-bible.md) §7.2)× **不透明度 0.80**——半透明系定值,底下画面透出 20%。栏内**只放钥石徽章一件**,右位、顶格落座(徽章自高 48px=栏高,无顶距可言),左位不放件。验收:目检〈顶栏成一条可辨窄带、徽章落在带内〉+机检〈栏体呈色对其下方落位带底色对比 ≥3:1〉。刷新入口已实装=营地刷新单口(进档与营地内写口尾触发,现开界面与顶栏余额同步取现值)。
|
||||||
|
|
||||||
## 叠层与开合
|
## 叠层与开合
|
||||||
|
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
> **Author**: user + ux-designer
|
> **Author**: user + ux-designer
|
||||||
> **Last Updated**: 2026-10-29
|
> **Last Updated**: 2026-10-29
|
||||||
> **Template**: Interaction Pattern Library
|
> **Template**: Interaction Pattern Library
|
||||||
> **来源**: `design/gdd/ux/battle.md` 已拍板内容的成文固化——本库不引入新设计决策
|
> **来源**: `design/ux/battle.md` 已拍板内容的成文固化——本库不引入新设计决策
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
**Description**: 轮末结算逐行流水实时呈现——「扫雷之因逐行兑现为战果」(P2 归因)的承载面。挖掘期收起为 1 行上轮摘要;结算期展开为实时流(带高读 `log_band_h_settle`)。
|
**Description**: 轮末结算逐行流水实时呈现——「扫雷之因逐行兑现为战果」(P2 归因)的承载面。挖掘期收起为 1 行上轮摘要;结算期展开为实时流(带高读 `log_band_h_settle`)。
|
||||||
|
|
||||||
**Specification**:
|
**Specification**:
|
||||||
- 数据源:[战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行封闭协议(现行);公共字段:来源类别 / 来源格 / 轮次 / 显示名 / 数值 / 可空高光标记);**无来源行 = 断言失败**
|
- 数据源:[战斗结算](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行封闭协议(现行);公共字段:来源类别 / 来源格 / 轮次 / 显示名 / 数值 / 可空高光标记);**无来源行 = 断言失败**
|
||||||
- 行模板:「{行为} {值} → {目标}(来源)」——来源标注(第 N 轮 · 安全格式);行文案最长 token = 来源标签(4 汉字封闭枚举),模板预留 40% 膨胀宽度
|
- 行模板:「{行为} {值} → {目标}(来源)」——来源标注(第 N 轮 · 安全格式);行文案最长 token = 来源标签(4 汉字封闭枚举),模板预留 40% 膨胀宽度
|
||||||
- 聚合纪律:未生效类行(奖励未生效——现行 9 类行协议唯一未生效型)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行数值 = 单次贡献值、禁与池合成值相加呈现;零值行可见不吞(免伤轮归因不断点)
|
- 聚合纪律:未生效类行(奖励未生效——现行 9 类行协议唯一未生效型)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行数值 = 单次贡献值、禁与池合成值相加呈现;零值行可见不吞(免伤轮归因不断点)
|
||||||
- 高亮:高亮标记(封印标中、清图奖励、完美破除) → 金框强调;完美封印 = 独立高光行 + 全屏喝彩级反馈。「完美破除」的判据句读作「本板首次标错受检」,不等于完美资格已失——专长「完美保险」可在本场首次标错时豁免,实际资格按有效误标(误标总数 − 豁免数)判定
|
- 高亮:高亮标记(封印标中、清图奖励、完美破除) → 金框强调;完美封印 = 独立高光行 + 全屏喝彩级反馈。「完美破除」的判据句读作「本板首次标错受检」,不等于完美资格已失——专长「完美保险」可在本场首次标错时豁免,实际资格按有效误标(误标总数 − 豁免数)判定
|
||||||
@@ -92,7 +92,7 @@ MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab
|
|||||||
- 击杀标记呈现(H3 数据源 = 战斗结算流水击杀结果字段)
|
- 击杀标记呈现(H3 数据源 = 战斗结算流水击杀结果字段)
|
||||||
|
|
||||||
**When to Use**: 任何「因果可归因」的逐行流水呈现
|
**When to Use**: 任何「因果可归因」的逐行流水呈现
|
||||||
**When NOT to Use**: 自造行类型/字段(9 类封闭枚举(现行)——增删 = 接口漂移,须走[《战斗结算》](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)修订)
|
**When NOT to Use**: 自造行类型/字段(9 类封闭枚举(现行)——增删 = 接口漂移,须走[《战斗结算》](../gdd/systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)修订)
|
||||||
|
|
||||||
**Reference**: battle.md §Component Inventory 结算明细带、§AC 信息与归因;归档《战斗结算》(b1-settlement.md)Core Rule 14 / Visual Req
|
**Reference**: battle.md §Component Inventory 结算明细带、§AC 信息与归因;归档《战斗结算》(b1-settlement.md)Core Rule 14 / Visual Req
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
## 现行载体与目标形态(重要边界)
|
## 现行载体与目标形态(重要边界)
|
||||||
|
|
||||||
本屏**没有独立新屏**:现行与 MVP 目标载体都是关卡收束时刻的覆盖层反馈([HUD框架](../systems/表现与支撑/HUD框架.md) P1 行「相邻域屏完整屏形态:MVP 以覆盖层反馈承载」)。本 spec 锁义务与数据锚,不锁视觉形态;完整屏形态待 P1 屏实装时定。
|
本屏**没有独立新屏**:现行与 MVP 目标载体都是关卡收束时刻的覆盖层反馈([HUD框架](../gdd/systems/表现与支撑/HUD框架.md) P1 行「相邻域屏完整屏形态:MVP 以覆盖层反馈承载」)。本 spec 锁义务与数据锚,不锁视觉形态;完整屏形态待 P1 屏实装时定。
|
||||||
|
|
||||||
| 时刻 | 载体(目标形态) | 呈现内容 |
|
| 时刻 | 载体(目标形态) | 呈现内容 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
|
|
||||||
## Accessibility
|
## Accessibility
|
||||||
|
|
||||||
沿用 [HUD框架](../systems/表现与支撑/HUD框架.md)「可访问性基线」节全量(对比/色弱/字号/闪烁/减动效/纯鼠标/中文字体)——本屏无新增承诺。结算数字是本屏信息主载体,遵守同一字号下限与对比硬指标。
|
沿用 [HUD框架](../gdd/systems/表现与支撑/HUD框架.md)「可访问性基线」节全量(对比/色弱/字号/闪烁/减动效/纯鼠标/中文字体)——本屏无新增承诺。结算数字是本屏信息主载体,遵守同一字号下限与对比硬指标。
|
||||||
|
|
||||||
## Acceptance Criteria
|
## Acceptance Criteria
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
> **Template**: UX Spec
|
> **Template**: UX Spec
|
||||||
> **覆盖范围**: 独立屏形态(关卡停点全景)· 入口停点 · 岔路停点 · 单链停点 · 放弃冒险入口
|
> **覆盖范围**: 独立屏形态(关卡停点全景)· 入口停点 · 岔路停点 · 单链停点 · 放弃冒险入口
|
||||||
> **不覆盖**: 节点覆盖层(NodeOverlay——奖励/恢复兑付反馈,spec:[node-reward.md](node-reward.md))、商店覆盖层(spec:[shop.md](shop.md))、关卡结算屏([level-clear.md](level-clear.md))、战斗屏([battle.md](battle.md))
|
> **不覆盖**: 节点覆盖层(NodeOverlay——奖励/恢复兑付反馈,spec:[node-reward.md](node-reward.md))、商店覆盖层(spec:[shop.md](shop.md))、关卡结算屏([level-clear.md](level-clear.md))、战斗屏([battle.md](battle.md))
|
||||||
> **机制权威**: [关卡节点地图](../systems/冒险循环/关卡节点地图.md)(选路、兑付、停点语义);图的来源 = [关卡节点图生成](../systems/冒险循环/关卡节点图生成.md)(参数化长图——只换图的来源与形态,不换本屏的呈现语义;多终点时各终点均带 Boss 标记,标记语义不变、数量随图;图形态随参数变化,布局自适应,形态不进呈现代码);**系统契约**: [HUD框架](../systems/表现与支撑/HUD框架.md)(订阅纪律、模态层级、可访问性基线)
|
> **机制权威**: [关卡节点地图](../gdd/systems/冒险循环/关卡节点地图.md)(选路、兑付、停点语义);图的来源 = [关卡节点图生成](../gdd/systems/冒险循环/关卡节点图生成.md)(参数化长图——只换图的来源与形态,不换本屏的呈现语义;多终点时各终点均带 Boss 标记,标记语义不变、数量随图;图形态随参数变化,布局自适应,形态不进呈现代码);**系统契约**: [HUD框架](../gdd/systems/表现与支撑/HUD框架.md)(订阅纪律、模态层级、可访问性基线)
|
||||||
> **生成图随动登记**:入口停点候选数=入口个数(1 或多,多入口并列呈现,首跳即选从哪个入口进场);节点数字=图内句柄 id(非节点深度、非数组序);生成图深度域 L3 上探至 0–13——卷轴视口范式(布局决策 5)下画布随图生长、屏为窗口,深度不再受屏预算约束(2026-11-05 用户裁:滚动视口案落地、等比缩放案否决;原「超预算」挂账闭合)。
|
> **生成图随动登记**:入口停点候选数=入口个数(1 或多,多入口并列呈现,首跳即选从哪个入口进场);节点数字=图内句柄 id(非节点深度、非数组序);生成图深度域 L3 上探至 0–13——卷轴视口范式(布局决策 5)下画布随图生长、屏为窗口,深度不再受屏预算约束(2026-11-05 用户裁:滚动视口案落地、等比缩放案否决;原「超预算」挂账闭合)。
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
- **到达时机**:关卡开始即出图(停点前移——入口不自动进入,第一次选路就是「出发」);或每次兑付确认后返回(战后回图、奖励/恢复反馈确认后回图、商店覆盖层离开后回图)
|
- **到达时机**:关卡开始即出图(停点前移——入口不自动进入,第一次选路就是「出发」);或每次兑付确认后返回(战后回图、奖励/恢复反馈确认后回图、商店覆盖层离开后回图)
|
||||||
- **到达前刚在做**:上一场战斗的结算画面,或奖励/恢复/商店覆盖层的确认动作
|
- **到达前刚在做**:上一场战斗的结算画面,或奖励/恢复/商店覆盖层的确认动作
|
||||||
- **情绪状态**:谋定后动——[art-bible](../../art/art-bible.md) §2.7 下探过渡的「纵深的期待」(能量 4/10);画面应安静可读,不给选路决策添噪
|
- **情绪状态**:谋定后动——[art-bible](../art/art-bible.md) §2.7 下探过渡的「纵深的期待」(能量 4/10);画面应安静可读,不给选路决策添噪
|
||||||
- **到达方式**:游戏推进送入(屏级切换——独立屏激活期战斗屏整体隐藏)
|
- **到达方式**:游戏推进送入(屏级切换——独立屏激活期战斗屏整体隐藏)
|
||||||
|
|
||||||
## Navigation Position
|
## Navigation Position
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
|
|
||||||
本屏必须传达的全部信息,按注视优先级分六层:
|
本屏必须传达的全部信息,按注视优先级分六层:
|
||||||
|
|
||||||
1. **节点图本体**(第一注视点):节点方块(五类型字面:战/赏/疗/王/商)、通道连线、当前位置、可选去路;类型可见性=邻近 N 层内显示类型,范围外只见结构(机制见[关卡节点地图](../systems/冒险循环/关卡节点地图.md))
|
1. **节点图本体**(第一注视点):节点方块(五类型字面:战/赏/疗/王/商)、通道连线、当前位置、可选去路;类型可见性=邻近 N 层内显示类型,范围外只见结构(机制见[关卡节点地图](../gdd/systems/冒险循环/关卡节点地图.md))
|
||||||
2. **候选选路口**:亮金候选通道 + 候选节点亮金描边——「下一步能去哪」的图上双冗余(2026-09-27 拍板:候选按钮退役,图上点击为唯一提交通道)
|
2. **候选选路口**:亮金候选通道 + 候选节点亮金描边——「下一步能去哪」的图上双冗余(2026-09-27 拍板:候选按钮退役,图上点击为唯一提交通道)
|
||||||
3. **常驻语境**(顶栏):关卡名(第 N 层·名称)、GP 常驻总量(2026-09-26 二轮拍板:GP = 关卡画面常驻总量)
|
3. **常驻语境**(顶栏):关卡名(第 N 层·名称)、GP 常驻总量(2026-09-26 二轮拍板:GP = 关卡画面常驻总量)
|
||||||
4. **状态展示**(底栏,2026-09-27 拍板):生命(当前/上限)、属性(攻击 / 护甲 AC 有效值)、本关已选加成(统一冒险加算区增量)——选路规划原料常读
|
4. **状态展示**(底栏,2026-09-27 拍板):生命(当前/上限)、属性(攻击 / 护甲 AC 有效值)、本关已选加成(统一冒险加算区增量)——选路规划原料常读
|
||||||
@@ -233,7 +233,7 @@
|
|||||||
|
|
||||||
## Accessibility
|
## Accessibility
|
||||||
|
|
||||||
无障碍基线权威 = [HUD框架](../systems/表现与支撑/HUD框架.md)「可访问性基线」节,本屏无新增豁免。呈现侧内建承诺:
|
无障碍基线权威 = [HUD框架](../gdd/systems/表现与支撑/HUD框架.md)「可访问性基线」节,本屏无新增豁免。呈现侧内建承诺:
|
||||||
|
|
||||||
- **节点态形状冗余**(全局语义红线「无任何信息仅靠色相承载」的合规项):已过 = 暗金无描边、当前 = 金填充 + 唯一焦点方块、候选 = 亮金粗描边、未来 = 暗底无描边;Boss = 紫赤描边 + 外缘 1px 深墨环(**灰度冗余通道**——紫赤灰度对石纹噪底不可辨)+ 图标冗余。四态在灰度截图下可分类(AC,样张 L2 断言承载)
|
- **节点态形状冗余**(全局语义红线「无任何信息仅靠色相承载」的合规项):已过 = 暗金无描边、当前 = 金填充 + 唯一焦点方块、候选 = 亮金粗描边、未来 = 暗底无描边;Boss = 紫赤描边 + 外缘 1px 深墨环(**灰度冗余通道**——紫赤灰度对石纹噪底不可辨)+ 图标冗余。四态在灰度截图下可分类(AC,样张 L2 断言承载)
|
||||||
- **对比**:节点图标对方块底(双色墨制:暗底态暖白/当前金底深墨,各态 ≥4.5:1)、顶栏数字对底 ≥4.5:1(样张 L3 断言承载);色值取 art-bible §4.1 冻结色板(已过暗金 = GOLD_DONE #68562C 冻结新值)
|
- **对比**:节点图标对方块底(双色墨制:暗底态暖白/当前金底深墨,各态 ≥4.5:1)、顶栏数字对底 ≥4.5:1(样张 L3 断言承载);色值取 art-bible §4.1 冻结色板(已过暗金 = GOLD_DONE #68562C 冻结新值)
|
||||||
@@ -295,12 +295,12 @@
|
|||||||
|
|
||||||
| 义务源 | 义务 | 本 spec 承载落点 |
|
| 义务源 | 义务 | 本 spec 承载落点 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| [关卡节点地图](../systems/冒险循环/关卡节点地图.md) | 呈现侧口径:方块地牢观感、节点态四色、不另设进度条 | Information Hierarchy 第 5 层 + 图区组件行 |
|
| [关卡节点地图](../gdd/systems/冒险循环/关卡节点地图.md) | 呈现侧口径:方块地牢观感、节点态四色、不另设进度条 | Information Hierarchy 第 5 层 + 图区组件行 |
|
||||||
| 关卡节点地图 | 零自动推进、兑付后确认、选路只读 | Interaction Map + Data Requirements + AC |
|
| 关卡节点地图 | 零自动推进、兑付后确认、选路只读 | Interaction Map + Data Requirements + AC |
|
||||||
| 关卡节点地图 | 呈现只读(节点图/当前位置/可选下一跳对呈现层只读可见) | Data Requirements 只读出口清单 |
|
| 关卡节点地图 | 呈现只读(节点图/当前位置/可选下一跳对呈现层只读可见) | Data Requirements 只读出口清单 |
|
||||||
| [HUD框架](../systems/表现与支撑/HUD框架.md) | 模态 overlay 层级纪律、订阅纪律(推进信号两线之一) | Navigation Position + Data Requirements 架构注记 |
|
| [HUD框架](../gdd/systems/表现与支撑/HUD框架.md) | 模态 overlay 层级纪律、订阅纪律(推进信号两线之一) | Navigation Position + Data Requirements 架构注记 |
|
||||||
| HUD框架 | 可访问性基线全量(对比/色弱/字号/闪烁/减动效/纯鼠标/中文字体) | Accessibility |
|
| HUD框架 | 可访问性基线全量(对比/色弱/字号/闪烁/减动效/纯鼠标/中文字体) | Accessibility |
|
||||||
| [battle.md](battle.md) OQ14 二轮拍板 | GP = 关卡画面常驻总量 | 顶栏 GP 常驻徽章 |
|
| [battle.md](battle.md) OQ14 二轮拍板 | GP = 关卡画面常驻总量 | 顶栏 GP 常驻徽章 |
|
||||||
| [art-bible](../../art/art-bible.md) | 方块地牢观感(§3.2 圆角方形世界侧)、色板冻结(§4.1)、半拟物(§7.1)、明度分层(§2) | 图区组件 + Accessibility 对比条 |
|
| [art-bible](../art/art-bible.md) | 方块地牢观感(§3.2 圆角方形世界侧)、色板冻结(§4.1)、半拟物(§7.1)、明度分层(§2) | 图区组件 + Accessibility 对比条 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
> 状态:v3.0(现行)
|
> 状态:v3.0(现行)
|
||||||
> 事实源:本 spec(呈现)+ 三选一覆盖层(共用呈现件)+ 头部行文案(旁白条目)
|
> 事实源:本 spec(呈现)+ 三选一覆盖层(共用呈现件)+ 头部行文案(旁白条目)
|
||||||
> 相邻:[level-clear](level-clear.md)(关卡完成三选一面——同一覆盖层的另一上下文)/ [level-map](level-map.md)(关卡画面)/ [秘宝](../systems/跨局循环/秘宝.md)(道具件内容权威——局外同调件,不再入三选一牌库)/ [冒险结构](../systems/冒险循环/冒险结构.md)(共享池令牌库账本)
|
> 相邻:[level-clear](level-clear.md)(关卡完成三选一面——同一覆盖层的另一上下文)/ [level-map](level-map.md)(关卡画面)/ [秘宝](../gdd/systems/跨局循环/秘宝.md)(道具件内容权威——局外同调件,不再入三选一牌库)/ [冒险结构](../gdd/systems/冒险循环/冒险结构.md)(共享池令牌库账本)
|
||||||
|
|
||||||
## 定位
|
## 定位
|
||||||
|
|
||||||
@@ -13,8 +13,8 @@
|
|||||||
- 载体 = 提升三选一覆盖层(与 [level-clear](level-clear.md) 共用组件——零新增交互原语)。
|
- 载体 = 提升三选一覆盖层(与 [level-clear](level-clear.md) 共用组件——零新增交互原语)。
|
||||||
- 头部行:「关卡奖励点 / 从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流):选择一件带走:」(旁白条目)。
|
- 头部行:「关卡奖励点 / 从冒险牌库抽三选一(属性值提升与补给;与通关专长三选一同库分流):选择一件带走:」(旁白条目)。
|
||||||
- 三卡点选(✓ 高亮,确认前可改选)→「确认选择」→ 兑付反馈(选中件效果 + 丢弃提示)→「继续」→ 回图选路(零自动推进同款)。
|
- 三卡点选(✓ 高亮,确认前可改选)→「确认选择」→ 兑付反馈(选中件效果 + 丢弃提示)→「继续」→ 回图选路(零自动推进同款)。
|
||||||
- **三选一刷新**(X/Y 双源;机制现行事实源=[秘宝](../systems/跨局循环/秘宝.md)「三选一刷新双源」节,X 源承载件=现行目录「刷新练习」):装配「三选一刷新件」给 X 次(每次碰三选一重给、优先消耗、不结转)+ 营地「刷新升级」给 Y 次(每冒险开局注入冒险周期池、用完即无);刷新钮余量 >0 时现形,点按重抽三候选(奖励抽取既有洗牌流,池规则全保留:不放回/达上限剔牌/掷定前置直显/停点可中断)。自动演示默认不刷(钓鱼归玩家)。
|
- **三选一刷新**(X/Y 双源;机制现行事实源=[秘宝](../gdd/systems/跨局循环/秘宝.md)「三选一刷新双源」节,X 源承载件=现行目录「刷新练习」):装配「三选一刷新件」给 X 次(每次碰三选一重给、优先消耗、不结转)+ 营地「刷新升级」给 Y 次(每冒险开局注入冒险周期池、用完即无);刷新钮余量 >0 时现形,点按重抽三候选(奖励抽取既有洗牌流,池规则全保留:不放回/达上限剔牌/掷定前置直显/停点可中断)。自动演示默认不刷(钓鱼归玩家)。
|
||||||
|
|
||||||
## 口径
|
## 口径
|
||||||
|
|
||||||
- **同库同池耗**:池=固定配额令牌库(档位=四级框架 普通/优秀/稀有/传说,传说=头奖位留空〔稀有档现投放为行动点件〕;各 kind 现行配额读 `game/data/tables/adventure.tres`);洗牌不放回抽 3(**同 kind 去重每 kind 至多一枚**——「三种不同选项」体验延续,kind 出现率∝剩余令牌数)、选中踢池未选回池、池耗即枯竭(余库不足出齐剩余,空库=零候选合法态直通);**种类次数上限退役**(池消耗即上限)。数值对:小GP 20/大GP 50、小增伤 +1/大 +2、小护甲 +1/大 +2、小生命 +5/大 +10、恢复 +6 当即回血(封顶生效上限)、AP +1。**MC 策略 316-f**:1 级优先度=最稀有(legendary>rare>excellent>common,头奖位现行留空)、2 级=最左(并列同档取最左)。配额结构锚与档位构成读冒险表(结构校验归实现侧)。商店货架=同库付费渠道(令牌级货架,买一件=奖励面少一件),库存=剩余令牌数,账本语义与切边注记归[冒险结构](../systems/冒险循环/冒险结构.md)共享池账本节。
|
- **同库同池耗**:池=固定配额令牌库(档位=四级框架 普通/优秀/稀有/传说,传说=头奖位留空〔稀有档现投放为行动点件〕;各 kind 现行配额读 `game/data/tables/adventure.tres`);洗牌不放回抽 3(**同 kind 去重每 kind 至多一枚**——「三种不同选项」体验延续,kind 出现率∝剩余令牌数)、选中踢池未选回池、池耗即枯竭(余库不足出齐剩余,空库=零候选合法态直通);**种类次数上限退役**(池消耗即上限)。数值对:小GP 20/大GP 50、小增伤 +1/大 +2、小护甲 +1/大 +2、小生命 +5/大 +10、恢复 +6 当即回血(封顶生效上限)、AP +1。**MC 策略 316-f**:1 级优先度=最稀有(legendary>rare>excellent>common,头奖位现行留空)、2 级=最左(并列同档取最左)。配额结构锚与档位构成读冒险表(结构校验归实现侧)。商店货架=同库付费渠道(令牌级货架,买一件=奖励面少一件),库存=剩余令牌数,账本语义与切边注记归[冒险结构](../gdd/systems/冒险循环/冒险结构.md)共享池账本节。
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
- 触发:主角倒下(判负)/ 末关完成 / 玩家放弃——三结局同面(由冒险收束信号统一触发)。
|
- 触发:主角倒下(判负)/ 末关完成 / 玩家放弃——三结局同面(由冒险收束信号统一触发)。
|
||||||
- 载体:与战斗面同一个战斗结束覆盖层——末关关卡完成走胜利态开屏(金蜡封 +「本局 GP 入账 · 合计 N」行,GP 收束清零前的呈现侧影子账);倒下 / 放弃走失败态开屏(暮蓝)。无独立「冒险终局面板」实体。
|
- 载体:与战斗面同一个战斗结束覆盖层——末关关卡完成走胜利态开屏(金蜡封 +「本局 GP 入账 · 合计 N」行,GP 收束清零前的呈现侧影子账);倒下 / 放弃走失败态开屏(暮蓝)。无独立「冒险终局面板」实体。
|
||||||
- 呈现内容:冒险摘要五件事(定义归[冒险结构](../systems/冒险循环/冒险结构.md))+ 钥石写入明细(= 本局逐杀 Boss 掉落合计;消费归[元进度](../systems/跨局循环/元进度.md) 的冒险结算入账——大奖励面不产钥石)+ GP 合计行。
|
- 呈现内容:冒险摘要五件事(定义归[冒险结构](../gdd/systems/冒险循环/冒险结构.md))+ 钥石写入明细(= 本局逐杀 Boss 掉落合计;消费归[元进度](../gdd/systems/跨局循环/元进度.md) 的冒险结算入账——大奖励面不产钥石)+ GP 合计行。
|
||||||
- 出口:确认 → 回存档首页。
|
- 出口:确认 → 回存档首页。
|
||||||
|
|
||||||
## 口径
|
## 口径
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
> 状态:v1.2(现行)
|
> 状态:v1.2(现行)
|
||||||
> 事实源:本 spec(呈现)+ 商店覆盖层(呈现件)
|
> 事实源:本 spec(呈现)+ 商店覆盖层(呈现件)
|
||||||
> 机制权威:[关卡节点地图](../systems/冒险循环/关卡节点地图.md)(商店房编排:每关恰 1/Boss 前一位必经/兑付触发);定价数值归[难度曲线与Boss](../systems/冒险循环/难度曲线与Boss.md)(shop.tres,provisional)
|
> 机制权威:[关卡节点地图](../gdd/systems/冒险循环/关卡节点地图.md)(商店房编排:每关恰 1/Boss 前一位必经/兑付触发);定价数值归[难度曲线与Boss](../gdd/systems/冒险循环/难度曲线与Boss.md)(shop.tres,provisional)
|
||||||
|
|
||||||
## 定位
|
## 定位
|
||||||
|
|
||||||
@@ -17,6 +17,6 @@
|
|||||||
|
|
||||||
## 口径
|
## 口径
|
||||||
|
|
||||||
- GP 余额读数 = runner 钱包投影(GP 归[冒险结构](../systems/冒险循环/冒险结构.md) GP 节);本层不作计算。
|
- GP 余额读数 = runner 钱包投影(GP 归[冒险结构](../gdd/systems/冒险循环/冒险结构.md) GP 节);本层不作计算。
|
||||||
- 与关卡画面 GP 常驻徽章的关系:进店语境余额与选路常驻总量不同义(本层带购买语境),不构成重复展示——钥石「写入/存量」拆名逻辑同款。
|
- 与关卡画面 GP 常驻徽章的关系:进店语境余额与选路常驻总量不同义(本层带购买语境),不构成重复展示——钥石「写入/存量」拆名逻辑同款。
|
||||||
- 购买确认交互:现行直接购买(无二次确认步);是否需破坏性确认异位(pattern 7)未裁决,本 spec 只登记现状不立新裁。
|
- 购买确认交互:现行直接购买(无二次确认步);是否需破坏性确认异位(pattern 7)未裁决,本 spec 只登记现状不立新裁。
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
// 封印印记(卡④ 法阵化批)——环+十字+环外压暗光圈,canvas_item 距离场实时绘制(无贴图缩放,
|
// 封印印记(卡④ 法阵化批)——环+十字+环外压暗光圈,canvas_item 距离场实时绘制(无贴图缩放,
|
||||||
// 格边 26–46px 连续可变下任意格边清晰)。
|
// 格边 26–46px 连续可变下任意格边清晰)。
|
||||||
// 事实源:art-bible v3.41 §3.2「封印印记」(形/画法/光圈/层序纪律)+ §8.2「封印印记参数表」;
|
// 事实源:art-bible v3.41 §3.2「封印印记」(形/画法/光圈/层序纪律)+ §8.2「封印印记参数表」;
|
||||||
// gdd/ux/battle.md「棋盘格尺寸公式」(格边 clampi 26–46)。
|
// design/ux/battle.md「棋盘格尺寸公式」(格边 clampi 26–46)。
|
||||||
// 纪律:参数五枚+色全由 gd 侧逐次注入(参数单点 = ui_kit SEAL_* 五常量——禁在此改值,
|
// 纪律:参数五枚+色全由 gd 侧逐次注入(参数单点 = ui_kit SEAL_* 五常量——禁在此改值,
|
||||||
// 下方默认值仅为兜底且与 §8.2 同值);光圈不出格(半径夹 cell_px/2);
|
// 下方默认值仅为兜底且与 §8.2 同值);光圈不出格(半径夹 cell_px/2);
|
||||||
// 零动效(不呼吸不脉冲——§2.1 挖掘期唯一在动 = 接触带微光);印记与光圈同用一色(光圈只改 alpha)。
|
// 零动效(不呼吸不脉冲——§2.1 挖掘期唯一在动 = 接触带微光);印记与光圈同用一色(光圈只改 alpha)。
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# VERTICAL SLICE - NOT FOR PRODUCTION
|
# VERTICAL SLICE - NOT FOR PRODUCTION
|
||||||
# 布局几何断言探针(现行事实源=tools/probe_gate.sh 默认段;呈现层三区布局的分辨率维度验收)
|
# 布局几何断言探针(现行事实源=tools/probe_gate.sh 默认段;呈现层三区布局的分辨率维度验收)
|
||||||
# 用途:battle.md §验收「1280×800 与 16:9 全屏下三区无遮挡/无重叠/无裁切」的可执行化
|
# 用途:battle.md §验收「1280×800 与 16:9 全屏下三区无遮挡/无重叠/无裁切」的可执行化
|
||||||
# GDD 锚:design/gdd/ux/battle.md §Layout Zones(B/C/D 三区几何)
|
# GDD 锚:design/ux/battle.md §Layout Zones(B/C/D 三区几何)
|
||||||
# 硬约束:档位表是数据、断言是一份函数据——加档只改表不动断言(禁每档建一个探针)
|
# 硬约束:档位表是数据、断言是一份函数据——加档只改表不动断言(禁每档建一个探针)
|
||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
|||||||
@@ -22,14 +22,14 @@ var _runner # 当前停点的单关 runner(open_choices 驱动随记——
|
|||||||
|
|
||||||
|
|
||||||
func _check(desc: String, ok: bool) -> void:
|
func _check(desc: String, ok: bool) -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
_checks += 1
|
_checks += 1
|
||||||
if not ok:
|
if not ok:
|
||||||
_problems.append(desc)
|
_problems.append(desc)
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (关卡画面视口跟随——卷轴视口组)
|
# oracle: design/ux/level-map.md:3 (关卡画面视口跟随——卷轴视口组)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
var host := Control.new()
|
var host := Control.new()
|
||||||
@@ -62,7 +62,7 @@ func _ready() -> void:
|
|||||||
|
|
||||||
## R1 浅图整幅居中无裁切+画布入视口件承载(画布=视口首子件——setup 注入序)
|
## R1 浅图整幅居中无裁切+画布入视口件承载(画布=视口首子件——setup 注入序)
|
||||||
func _probe_shallow_no_crop(screen, vp) -> void:
|
func _probe_shallow_no_crop(screen, vp) -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (浅层不裁切组)
|
# oracle: design/ux/level-map.md:3 (浅层不裁切组)
|
||||||
_runner = _make_runner_entry(1, SEED_L1)
|
_runner = _make_runner_entry(1, SEED_L1)
|
||||||
screen.open_choices(_cand_nodes(_runner), _runner)
|
screen.open_choices(_cand_nodes(_runner), _runner)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
@@ -81,7 +81,7 @@ func _probe_shallow_no_crop(screen, vp) -> void:
|
|||||||
|
|
||||||
## R5 前置+深图入口停点:锚点=入口组包围盒中心夹紧(spec :101——多入口并列取包围盒居中)
|
## R5 前置+深图入口停点:锚点=入口组包围盒中心夹紧(spec :101——多入口并列取包围盒居中)
|
||||||
func _probe_deep_entry_clamp(screen, vp) -> void:
|
func _probe_deep_entry_clamp(screen, vp) -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (深层入口钳制组)
|
# oracle: design/ux/level-map.md:3 (深层入口钳制组)
|
||||||
_runner = _make_runner_entry(3, SEED_L3)
|
_runner = _make_runner_entry(3, SEED_L3)
|
||||||
screen.open_choices(_cand_nodes(_runner), _runner)
|
screen.open_choices(_cand_nodes(_runner), _runner)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
@@ -175,7 +175,7 @@ func _probe_clamp_bounds_and_columns(screen, vp) -> void:
|
|||||||
|
|
||||||
## R6 拖拽不触发选路提交;阈值另一侧完整点击仍提交(提交语义零改动)
|
## R6 拖拽不触发选路提交;阈值另一侧完整点击仍提交(提交语义零改动)
|
||||||
func _probe_drag_no_submit(screen, vp) -> void:
|
func _probe_drag_no_submit(screen, vp) -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
# 重建到中段可居中停点(候选=停点出边——候选节点居屏中可拖可达)
|
# 重建到中段可居中停点(候选=停点出边——候选节点居屏中可拖可达)
|
||||||
var stops := _centerable_stops(screen, vp)
|
var stops := _centerable_stops(screen, vp)
|
||||||
if stops.size() < 3:
|
if stops.size() < 3:
|
||||||
@@ -214,7 +214,7 @@ func _probe_drag_no_submit(screen, vp) -> void:
|
|||||||
|
|
||||||
## R2 停点切换后当前节点居中(视口中线投影 x=640±2——视口满屏宽即屏中线)
|
## R2 停点切换后当前节点居中(视口中线投影 x=640±2——视口满屏宽即屏中线)
|
||||||
func _probe_follow_anchor(screen, vp) -> void:
|
func _probe_follow_anchor(screen, vp) -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
var stops := _centerable_stops(screen, vp)
|
var stops := _centerable_stops(screen, vp)
|
||||||
if stops.size() < 3:
|
if stops.size() < 3:
|
||||||
_problems.append("R2 可居中停点不足(=%d)" % stops.size())
|
_problems.append("R2 可居中停点不足(=%d)" % stops.size())
|
||||||
@@ -230,7 +230,7 @@ func _probe_follow_anchor(screen, vp) -> void:
|
|||||||
|
|
||||||
## R7 平滑滚动有 tween 中间帧;减动效开=位置即达(画布坐标域判定)
|
## R7 平滑滚动有 tween 中间帧;减动效开=位置即达(画布坐标域判定)
|
||||||
func _probe_smooth_scroll_reduced_motion(screen, vp) -> void:
|
func _probe_smooth_scroll_reduced_motion(screen, vp) -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
var saved_scale: float = UiKit.motion_scale
|
var saved_scale: float = UiKit.motion_scale
|
||||||
UiKit.motion_scale = 1.0
|
UiKit.motion_scale = 1.0
|
||||||
var stops := _centerable_stops(screen, vp)
|
var stops := _centerable_stops(screen, vp)
|
||||||
@@ -270,7 +270,7 @@ func _probe_smooth_scroll_reduced_motion(screen, vp) -> void:
|
|||||||
|
|
||||||
## R8 指引件可见性与几何(深图超窗——像素级判据②③)
|
## R8 指引件可见性与几何(深图超窗——像素级判据②③)
|
||||||
func _probe_guidance_chrome(screen, vp) -> void:
|
func _probe_guidance_chrome(screen, vp) -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
var band_l: Control = vp.get_node_or_null(NodePath("FadeL"))
|
var band_l: Control = vp.get_node_or_null(NodePath("FadeL"))
|
||||||
var band_r: Control = vp.get_node_or_null(NodePath("FadeR"))
|
var band_r: Control = vp.get_node_or_null(NodePath("FadeR"))
|
||||||
var chip: Control = vp.get_node_or_null(NodePath("PanHint"))
|
var chip: Control = vp.get_node_or_null(NodePath("PanHint"))
|
||||||
@@ -302,7 +302,7 @@ func _probe_shallow_guidance_hidden(screen, vp) -> void:
|
|||||||
|
|
||||||
## 入口停点 runner(defer_entry——选路态挂起、候选=入口节点)
|
## 入口停点 runner(defer_entry——选路态挂起、候选=入口节点)
|
||||||
func _make_runner_entry(level_index: int, seed_val: int):
|
func _make_runner_entry(level_index: int, seed_val: int):
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
var rng = load("res://core/rng_service.gd").new()
|
var rng = load("res://core/rng_service.gd").new()
|
||||||
rng.new_adventure(seed_val)
|
rng.new_adventure(seed_val)
|
||||||
var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng)
|
var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng)
|
||||||
@@ -313,7 +313,7 @@ func _make_runner_entry(level_index: int, seed_val: int):
|
|||||||
|
|
||||||
## 中段停点 runner(断点续玩重建——图由种子+参数档重生成同图,零 RNG 消耗)
|
## 中段停点 runner(断点续玩重建——图由种子+参数档重生成同图,零 RNG 消耗)
|
||||||
func _make_runner_at_stop(level_index: int, seed_val: int, node_id: int):
|
func _make_runner_at_stop(level_index: int, seed_val: int, node_id: int):
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
var rng = load("res://core/rng_service.gd").new()
|
var rng = load("res://core/rng_service.gd").new()
|
||||||
rng.new_adventure(seed_val)
|
rng.new_adventure(seed_val)
|
||||||
var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng)
|
var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng)
|
||||||
@@ -388,7 +388,7 @@ func _extreme_node(pos: Dictionary, nodes: Array, first: bool) -> Dictionary:
|
|||||||
|
|
||||||
|
|
||||||
func _finish() -> void:
|
func _finish() -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||||
if _checks == 0:
|
if _checks == 0:
|
||||||
_problems.append("零断言执行(断言数下限闸——三硬闸③)")
|
_problems.append("零断言执行(断言数下限闸——三硬闸③)")
|
||||||
if _problems.is_empty():
|
if _problems.is_empty():
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ func _step_boot_menu() -> void:
|
|||||||
|
|
||||||
# ---- ② 菜单 → 营地(真实按钮信号路径)----
|
# ---- ② 菜单 → 营地(真实按钮信号路径)----
|
||||||
func _step_menu_to_camp() -> void:
|
func _step_menu_to_camp() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:10 (菜单→营地组)
|
# oracle: design/ux/camp.md:10 (菜单→营地组)
|
||||||
# 营地经进档开层(卡② mn9 新路径——campbtn 已撤;槽模板注入隔离命名空间)
|
# 营地经进档开层(卡② mn9 新路径——campbtn 已撤;槽模板注入隔离命名空间)
|
||||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_camp"):
|
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_camp"):
|
||||||
_problems.append("②菜单→营地:选档层新档钮缺失(新路径驱动中断)")
|
_problems.append("②菜单→营地:选档层新档钮缺失(新路径驱动中断)")
|
||||||
@@ -130,7 +130,7 @@ func _step_menu_to_camp() -> void:
|
|||||||
|
|
||||||
# ---- ③ 营地 → 菜单(回退路径:篝火二次确认动线——卡④ 营地唯一回菜单出口;选档层随关层收闭同收)----
|
# ---- ③ 营地 → 菜单(回退路径:篝火二次确认动线——卡④ 营地唯一回菜单出口;选档层随关层收闭同收)----
|
||||||
func _step_camp_back_to_menu() -> void:
|
func _step_camp_back_to_menu() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:22 (营地→菜单组)
|
# oracle: design/ux/camp.md:22 (营地→菜单组)
|
||||||
if main.ui.modals.camp.scene == null:
|
if main.ui.modals.camp.scene == null:
|
||||||
_problems.append("③营地→菜单:营地场景根句柄缺失〔句柄子容器批 V1〕")
|
_problems.append("③营地→菜单:营地场景根句柄缺失〔句柄子容器批 V1〕")
|
||||||
return
|
return
|
||||||
@@ -194,7 +194,7 @@ func seals_check_single(f: Dictionary) -> bool:
|
|||||||
|
|
||||||
|
|
||||||
func _step_menu_to_adventure() -> void:
|
func _step_menu_to_adventure() -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:11 (菜单→冒险组)
|
# oracle: design/ux/level-map.md:11 (菜单→冒险组)
|
||||||
# 开始冒险钮已随三入口化撤出——函数直调中间态(卡② mn10;卡④ 大门两分支换代)
|
# 开始冒险钮已随三入口化撤出——函数直调中间态(卡② mn10;卡④ 大门两分支换代)
|
||||||
main._start_adventure_from_menu()
|
main._start_adventure_from_menu()
|
||||||
await _frames(3)
|
await _frames(3)
|
||||||
@@ -208,7 +208,7 @@ func _step_menu_to_adventure() -> void:
|
|||||||
|
|
||||||
# ---- ⑤ 冒险内屏切换:关卡地图屏 ⇄ 战斗屏(屏内两态,屏级仍独占)----
|
# ---- ⑤ 冒险内屏切换:关卡地图屏 ⇄ 战斗屏(屏内两态,屏级仍独占)----
|
||||||
func _step_level_to_battle_and_back() -> void:
|
func _step_level_to_battle_and_back() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:57 (冒险内切换组)
|
# oracle: design/ux/battle.md:57 (冒险内切换组)
|
||||||
if not main.ui.modals.run.level_screen.visible:
|
if not main.ui.modals.run.level_screen.visible:
|
||||||
_problems.append("⑤冒险内切换:前置不在关卡地图屏")
|
_problems.append("⑤冒险内切换:前置不在关卡地图屏")
|
||||||
return
|
return
|
||||||
@@ -228,7 +228,7 @@ func _step_level_to_battle_and_back() -> void:
|
|||||||
|
|
||||||
# ---- ⑥ 放弃 → 终局(放弃路径=回退路径的非正常出口)----
|
# ---- ⑥ 放弃 → 终局(放弃路径=回退路径的非正常出口)----
|
||||||
func _step_abandon_to_end() -> void:
|
func _step_abandon_to_end() -> void:
|
||||||
# oracle: design/gdd/ux/level-map.md:42 (放弃→终局组)
|
# oracle: design/ux/level-map.md:42 (放弃→终局组)
|
||||||
if main.run_scope == null or main.run_scope.adventure == null:
|
if main.run_scope == null or main.run_scope.adventure == null:
|
||||||
_problems.append("⑥放弃→终局:前置无冒险实例")
|
_problems.append("⑥放弃→终局:前置无冒险实例")
|
||||||
return
|
return
|
||||||
@@ -241,7 +241,7 @@ func _step_abandon_to_end() -> void:
|
|||||||
|
|
||||||
# ---- ⑦ 终局 → 菜单(终局出口返回开始界面)----
|
# ---- ⑦ 终局 → 菜单(终局出口返回开始界面)----
|
||||||
func _step_end_back_to_menu() -> void:
|
func _step_end_back_to_menu() -> void:
|
||||||
# oracle: design/gdd/ux/settlement-summary.md:24 (终局→菜单组)
|
# oracle: design/ux/settlement-summary.md:24 (终局→菜单组)
|
||||||
if main.ui.modals.run.end_overlay == null or not main.ui.modals.run.end_overlay.visible:
|
if main.ui.modals.run.end_overlay == null or not main.ui.modals.run.end_overlay.visible:
|
||||||
_problems.append("⑦终局→菜单:前置不在终局")
|
_problems.append("⑦终局→菜单:前置不在终局")
|
||||||
return
|
return
|
||||||
@@ -254,7 +254,7 @@ func _step_end_back_to_menu() -> void:
|
|||||||
|
|
||||||
# ---- ③' 营地 Esc 浮窗+HUD(卡⑤——真实键盘合成路径 push_input;四态路由+三出口+语境分支+余额单口)----
|
# ---- ③' 营地 Esc 浮窗+HUD(卡⑤——真实键盘合成路径 push_input;四态路由+三出口+语境分支+余额单口)----
|
||||||
func _step_camp_esc_and_hud() -> void:
|
func _step_camp_esc_and_hud() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:45 (Esc 段组)
|
# oracle: design/ux/camp.md:45 (Esc 段组)
|
||||||
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_esc", false, false, true)
|
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_esc", false, false, true)
|
||||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_esc"):
|
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_esc"):
|
||||||
_problems.append("[esc] 营地入口缺失(选档层新档钮驱动中断)〔ESC批 V1〕")
|
_problems.append("[esc] 营地入口缺失(选档层新档钮驱动中断)〔ESC批 V1〕")
|
||||||
@@ -320,7 +320,7 @@ func _step_camp_esc_and_hud() -> void:
|
|||||||
# 判的是呈现形态换壳(近全屏面板→居中定尺寸窗壳 720×640):窗几何/场景根留底/遮罩 0.6/关闭钮/
|
# 判的是呈现形态换壳(近全屏面板→居中定尺寸窗壳 720×640):窗几何/场景根留底/遮罩 0.6/关闭钮/
|
||||||
# 互斥单开/ESC 优先序/窗内滚动/生涯同壳——行为面(开合路由)零改,只钉窗壳可观测提交面。
|
# 互斥单开/ESC 优先序/窗内滚动/生涯同壳——行为面(开合路由)零改,只钉窗壳可观测提交面。
|
||||||
func _step_camp_window_shell() -> void:
|
func _step_camp_window_shell() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:45 (窗壳 V1–V8 组)
|
# oracle: design/ux/camp.md:45 (窗壳 V1–V8 组)
|
||||||
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_winshell", false, false, true)
|
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_winshell", false, false, true)
|
||||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_winshell"):
|
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_winshell"):
|
||||||
_problems.append("[winshell] 营地入口缺失(选档层新档钮驱动中断)〔窗口化批 V1〕")
|
_problems.append("[winshell] 营地入口缺失(选档层新档钮驱动中断)〔窗口化批 V1〕")
|
||||||
@@ -478,7 +478,7 @@ func _step_camp_window_shell() -> void:
|
|||||||
|
|
||||||
# 清窗经真实钮(逐窗巡检 visible→钮 pressed——栈 close 恢复账随层清空)
|
# 清窗经真实钮(逐窗巡检 visible→钮 pressed——栈 close 恢复账随层清空)
|
||||||
func _close_all_windows(views: Dictionary) -> void:
|
func _close_all_windows(views: Dictionary) -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:45 (清窗组)
|
# oracle: design/ux/camp.md:45 (清窗组)
|
||||||
for k: StringName in [&"forge", &"chest", &"dummy", &"board"]:
|
for k: StringName in [&"forge", &"chest", &"dummy", &"board"]:
|
||||||
var w: Control = views[k]
|
var w: Control = views[k]
|
||||||
if not w.visible:
|
if not w.visible:
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ func _ready() -> void:
|
|||||||
ProbeUiUtil.push_click(main, set_close)
|
ProbeUiUtil.push_click(main, set_close)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
# ①c 生涯页(函数直调中间态——卡② mn10:careerbtn 已撤,卡④ 笔记本改挂前无 UI 路径)
|
# ①c 生涯页(函数直调中间态——卡② mn10:careerbtn 已撤,卡④ 笔记本改挂前无 UI 路径)
|
||||||
# oracle: design/gdd/ux/camp.md:45 生涯页与四子界面同壳同形态(生涯组)
|
# oracle: design/ux/camp.md:45 生涯页与四子界面同壳同形态(生涯组)
|
||||||
if true:
|
if true:
|
||||||
main._open_career()
|
main._open_career()
|
||||||
for i in 3:
|
for i in 3:
|
||||||
@@ -123,7 +123,7 @@ func _ready() -> void:
|
|||||||
if main.ui.modals.menu.career_overlay.visible or not main.ui.screens.start_overlay.visible:
|
if main.ui.modals.menu.career_overlay.visible or not main.ui.screens.start_overlay.visible:
|
||||||
_problems.append("生涯页关闭后页未隐藏或开始层未恢复")
|
_problems.append("生涯页关闭后页未隐藏或开始层未恢复")
|
||||||
# ② 营地场景图(进档开层新路径——卡② mn9;截图=可点击场景图形态——卡④ 契约 9 V1 验收载体)
|
# ② 营地场景图(进档开层新路径——卡② mn9;截图=可点击场景图形态——卡④ 契约 9 V1 验收载体)
|
||||||
# oracle: design/gdd/ux/camp.md:16 营地=可点击场景图(七物件命中区表——场景图形态组)
|
# oracle: design/ux/camp.md:16 营地=可点击场景图(七物件命中区表——场景图形态组)
|
||||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_shot_probe_camp"):
|
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_shot_probe_camp"):
|
||||||
_problems.append("营地入口缺失(选档层新档钮——新路径驱动中断)〔句柄子容器批 V1〕")
|
_problems.append("营地入口缺失(选档层新档钮——新路径驱动中断)〔句柄子容器批 V1〕")
|
||||||
else:
|
else:
|
||||||
@@ -132,16 +132,16 @@ func _ready() -> void:
|
|||||||
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"campfire").get_center()) # 收闭改接篝火动线(营地根态无关闭钮——卡④ T5)
|
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"campfire").get_center()) # 收闭改接篝火动线(营地根态无关闭钮——卡④ T5)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
ProbeUiUtil.push_click(main, main.ui.modals.menu.confirm_dialog._confirm_btn) # 二次确认离场(关层收闭——选档层随收)
|
ProbeUiUtil.push_click(main, main.ui.modals.menu.confirm_dialog._confirm_btn) # 二次确认离场(关层收闭——选档层随收)
|
||||||
# oracle: design/gdd/ux/camp.md:22 篝火=离开营地回主菜单、必须二次确认(篝心动线组)
|
# oracle: design/ux/camp.md:22 篝火=离开营地回主菜单、必须二次确认(篝心动线组)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
# ③ 关卡画面(开始冒险→停点出图——入口停点语义;函数直调中间态 mn10)
|
# ③ 关卡画面(开始冒险→停点出图——入口停点语义;函数直调中间态 mn10)
|
||||||
# oracle: design/gdd/ux/level-map.md:11 入口停点候选数=入口个数(关卡画面出图组)
|
# oracle: design/ux/level-map.md:11 入口停点候选数=入口个数(关卡画面出图组)
|
||||||
main._start_adventure_from_menu()
|
main._start_adventure_from_menu()
|
||||||
for i in 4:
|
for i in 4:
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
await _snap("level")
|
await _snap("level")
|
||||||
# GP 常驻徽章断言(读数=runner.gp 现值,刷新=写路径回执后重查〔open_choices〕)
|
# GP 常驻徽章断言(读数=runner.gp 现值,刷新=写路径回执后重查〔open_choices〕)
|
||||||
# oracle: design/gdd/ux/level-map.md:77 GP 常驻徽章=GP 图标+数字(冒险钱包读数;写路径回执后重查)
|
# oracle: design/ux/level-map.md:77 GP 常驻徽章=GP 图标+数字(冒险钱包读数;写路径回执后重查)
|
||||||
var gp_label: Label = ProbeUiUtil.find_label(main.ui.modals.run.level_screen, "◈ ")
|
var gp_label: Label = ProbeUiUtil.find_label(main.ui.modals.run.level_screen, "◈ ")
|
||||||
if gp_label == null or not gp_label.is_visible_in_tree():
|
if gp_label == null or not gp_label.is_visible_in_tree():
|
||||||
_problems.append("GP 徽章不可见(关卡画面顶栏)")
|
_problems.append("GP 徽章不可见(关卡画面顶栏)")
|
||||||
@@ -150,7 +150,7 @@ func _ready() -> void:
|
|||||||
if gp_label.text != expect:
|
if gp_label.text != expect:
|
||||||
_problems.append("GP 徽章读数不符: %s != %s" % [gp_label.text, expect])
|
_problems.append("GP 徽章读数不符: %s != %s" % [gp_label.text, expect])
|
||||||
# ④ 战斗(节点一——candidate_rect 命中矩形真点选路提交,ui_click_probe 同款)
|
# ④ 战斗(节点一——candidate_rect 命中矩形真点选路提交,ui_click_probe 同款)
|
||||||
# oracle: design/gdd/ux/battle.md:122 B 区构建:站桩/明细带/轮次指示(战斗出图与几何锚组)
|
# oracle: design/ux/battle.md:122 B 区构建:站桩/明细带/轮次指示(战斗出图与几何锚组)
|
||||||
if main.ui.modals.run.level_screen != null and main.ui.modals.run.level_screen.visible:
|
if main.ui.modals.run.level_screen != null and main.ui.modals.run.level_screen.visible:
|
||||||
ProbeUiUtil.push_click_at(main, main.ui.modals.run.level_screen.candidate_rect(0).get_center())
|
ProbeUiUtil.push_click_at(main, main.ui.modals.run.level_screen.candidate_rect(0).get_center())
|
||||||
for i in 10:
|
for i in 10:
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ var _problems: Array = []
|
|||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:122 (明细带挖掘期收起——T17 视觉扩展时序组)
|
# oracle: design/ux/battle.md:122 (明细带挖掘期收起——T17 视觉扩展时序组)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
main = load("res://presentation/main.tscn").instantiate()
|
main = load("res://presentation/main.tscn").instantiate()
|
||||||
add_child(main)
|
add_child(main)
|
||||||
|
|||||||
@@ -385,7 +385,7 @@ func _ready() -> void:
|
|||||||
if ProbeUiUtil.find_button(main.ui.modals.menu.settings_overlay, "退出游戏", "prefix") != null:
|
if ProbeUiUtil.find_button(main.ui.modals.menu.settings_overlay, "退出游戏", "prefix") != null:
|
||||||
_problems.append("设置面仍含退出游戏按钮(二轮 D1——只在一级菜单出现)")
|
_problems.append("设置面仍含退出游戏按钮(二轮 D1——只在一级菜单出现)")
|
||||||
# ---- 生涯页段(入口点击链+关闭回返,真实按钮信号路径;本页只读零写,
|
# ---- 生涯页段(入口点击链+关闭回返,真实按钮信号路径;本页只读零写,
|
||||||
# oracle: design/gdd/ux/camp.md:45 (生涯页段——同壳同形态组)
|
# oracle: design/ux/camp.md:45 (生涯页段——同壳同形态组)
|
||||||
# 值断言归冒烟投影段与 ui_struct 结构族,此处只验开合路径与零跳转)----
|
# 值断言归冒烟投影段与 ui_struct 结构族,此处只验开合路径与零跳转)----
|
||||||
# 生涯页驱动=函数直调中间态(卡② mn10——careerbtn 已撤,卡④ 笔记本改挂前无 UI 路径)
|
# 生涯页驱动=函数直调中间态(卡② mn10——careerbtn 已撤,卡④ 笔记本改挂前无 UI 路径)
|
||||||
if true:
|
if true:
|
||||||
@@ -640,7 +640,7 @@ func _ready() -> void:
|
|||||||
_run_modal_probes_once()
|
_run_modal_probes_once()
|
||||||
_play_one_action()
|
_play_one_action()
|
||||||
# ---- 预算耗尽收口(T17 硬锁批适配):选件变强后 probe 可能活过预算不再战败——断点段前提
|
# ---- 预算耗尽收口(T17 硬锁批适配):选件变强后 probe 可能活过预算不再战败——断点段前提
|
||||||
# oracle: design/gdd/ux/level-map.md:11 (主循环选路段——入口候选组)
|
# oracle: design/ux/level-map.md:11 (主循环选路段——入口候选组)
|
||||||
# (冒险终局面在案)须主动满足。收口驱动:任何停点层逐个推进(复用主循环分支语义)至
|
# (冒险终局面在案)须主动满足。收口驱动:任何停点层逐个推进(复用主循环分支语义)至
|
||||||
# level_screen 选路停点→真实放弃二击→终局面。战斗中则继续 autoplay 打完。
|
# level_screen 选路停点→真实放弃二击→终局面。战斗中则继续 autoplay 打完。
|
||||||
if not _done and not main.ui.modals.run.end_overlay.is_open():
|
if not _done and not main.ui.modals.run.end_overlay.is_open():
|
||||||
@@ -721,7 +721,7 @@ func _ready() -> void:
|
|||||||
# ① 战斗收口断点写盘断言保留(上方——冒险流直调中间态 mn10)。
|
# ① 战斗收口断点写盘断言保留(上方——冒险流直调中间态 mn10)。
|
||||||
|
|
||||||
# ---- 大门两分支断言段(卡④ T5 接收——卡② 移交落点;V3 断言面)----
|
# ---- 大门两分支断言段(卡④ T5 接收——卡② 移交落点;V3 断言面)----
|
||||||
# oracle: design/gdd/ux/camp.md:16 (大门段——点大门先出确认组)
|
# oracle: design/ux/camp.md:16 (大门段——点大门先出确认组)
|
||||||
# 驱动=营地场景根点选信号(真实路由)→组合根 _on_camp_object_pressed→确认弹窗。
|
# 驱动=营地场景根点选信号(真实路由)→组合根 _on_camp_object_pressed→确认弹窗。
|
||||||
# 无断点=两出口(是/否);有断点=三出口(set_breakpoint 注入选路停点形——同下方开场行③先例)。
|
# 无断点=两出口(是/否);有断点=三出口(set_breakpoint 注入选路停点形——同下方开场行③先例)。
|
||||||
# 判据绑可观测提交面:点大门不直接进冒险(is_adventure 翻转只在 confirmed 后);cancelled 恒=
|
# 判据绑可观测提交面:点大门不直接进冒险(is_adventure 翻转只在 confirmed 后);cancelled 恒=
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func _pairs() -> Array:
|
|||||||
["RAP标签", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # N1-7(T0 实测已合规,显式化)
|
["RAP标签", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # N1-7(T0 实测已合规,显式化)
|
||||||
["锚·正文墨/数据板", UiKit.INK, UiKit.PANEL_DATA, 1.0], # 全站锚点:正文墨对数据板
|
["锚·正文墨/数据板", UiKit.INK, UiKit.PANEL_DATA, 1.0], # 全站锚点:正文墨对数据板
|
||||||
["锚·暖白/屏根", UiKit.WARM, UiKit.BG_ROOT, 1.0], # 全站锚点:暗底正文
|
["锚·暖白/屏根", UiKit.WARM, UiKit.BG_ROOT, 1.0], # 全站锚点:暗底正文
|
||||||
["锚·暖白弱/舞台底", UiKit.WARM_FAINT, UiKit.SLOT_BACKDROP, 1.0], # 全站锚点:B区辅助墨(合并目标——art-bible §4.1 换色合并③)
|
["锚·暖白弱/舞台底", UiKit.WARM_FAINT, UiKit.SLOT_BACKDROP, 1.0], # 全站锚点:B区辅助墨(合并目标色,换色合并沿革查 git 提交史)
|
||||||
["钥石徽·深墨/烛光黄", UiKit.INK_ON_GOLD, UiKit.CANDLE, 1.0], # badge 工厂件文字(营地徽+状态面板余额行同形制)
|
["钥石徽·深墨/烛光黄", UiKit.INK_ON_GOLD, UiKit.CANDLE, 1.0], # badge 工厂件文字(营地徽+状态面板余额行同形制)
|
||||||
["生涯页·行名墨/暖亮页底", UiKit.WARM, UiKit.BG_BRIGHT, 1.0], # 生涯页行名列/提示文(WARM_SOFT 同族亮墨)
|
["生涯页·行名墨/暖亮页底", UiKit.WARM, UiKit.BG_BRIGHT, 1.0], # 生涯页行名列/提示文(WARM_SOFT 同族亮墨)
|
||||||
["生涯页·行值墨/暖亮页底", UiKit.CANDLE, UiKit.BG_BRIGHT, 1.0], # 生涯页数值列(烛光黄 bold)
|
["生涯页·行值墨/暖亮页底", UiKit.CANDLE, UiKit.BG_BRIGHT, 1.0], # 生涯页数值列(烛光黄 bold)
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ func _ready() -> void:
|
|||||||
if not ms.is_revealed(dig_t):
|
if not ms.is_revealed(dig_t):
|
||||||
_problems.append("case⑥ 核心揭格未落位(目标=%s)" % dig_t)
|
_problems.append("case⑥ 核心揭格未落位(目标=%s)" % dig_t)
|
||||||
# ---- case⑦ 英雄精灵世界落位(回归闸):精灵在 SubViewport 世界内,
|
# ---- case⑦ 英雄精灵世界落位(回归闸):精灵在 SubViewport 世界内,
|
||||||
# oracle: design/gdd/ux/battle.md:154 主角站桩立绘带落影、贴脚与缩放档(case⑦-⑩ 呈现落位)
|
# oracle: design/ux/battle.md:154 主角站桩立绘带落影、贴脚与缩放档(case⑦-⑩ 呈现落位)
|
||||||
# 落位 = 格×步距 + 脚底锚(横=格中线/纵=格底往上 25% 线=HERO_GROUND_FRAC 自底边口径——「脚踩
|
# 落位 = 格×步距 + 脚底锚(横=格中线/纵=格底往上 25% 线=HERO_GROUND_FRAC 自底边口径——「脚踩
|
||||||
# 格子 1/4 处·从下往上数」;禁带壳层 _svp_container.position 居中偏移——上批误用壳层
|
# 格子 1/4 处·从下往上数」;禁带壳层 _svp_container.position 居中偏移——上批误用壳层
|
||||||
# cell_origin 实测右偏 ~7 格+偏离格心,实机截图用户报缺陷)。素材缺位树(hero==null,字形
|
# cell_origin 实测右偏 ~7 格+偏离格心,实机截图用户报缺陷)。素材缺位树(hero==null,字形
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func _ready() -> void:
|
|||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
var problems: Array = []
|
var problems: Array = []
|
||||||
# ---- 放弃入口(台账 119):默认隐藏(非冒险模式无冒险可放弃——开始层/调试两层)----
|
# ---- 放弃入口(台账 119):默认隐藏(非冒险模式无冒险可放弃——开始层/调试两层)----
|
||||||
# oracle: design/gdd/ux/level-map.md:59 放弃冒险入口=边缘动作、任意选路停点承载——非冒险模式无入口(默认隐藏)
|
# oracle: design/ux/level-map.md:59 放弃冒险入口=边缘动作、任意选路停点承载——非冒险模式无入口(默认隐藏)
|
||||||
if main.ui.modals.run.level_screen.abandon_btn == null or main.ui.modals.run.level_screen.abandon_btn.visible:
|
if main.ui.modals.run.level_screen.abandon_btn == null or main.ui.modals.run.level_screen.abandon_btn.visible:
|
||||||
print("[ui_probe] FAIL — 放弃按钮默认应隐藏(非冒险模式关)")
|
print("[ui_probe] FAIL — 放弃按钮默认应隐藏(非冒险模式关)")
|
||||||
get_tree().quit(1)
|
get_tree().quit(1)
|
||||||
@@ -24,7 +24,7 @@ func _ready() -> void:
|
|||||||
# ---- 营地覆盖层(主菜单入口/开合/余额文案/购买禁用态;
|
# ---- 营地覆盖层(主菜单入口/开合/余额文案/购买禁用态;
|
||||||
# 隔离存档换注 main.meta 保确定性(禁碰真实档 user://save.json——SaveManager 路径注入纪律;
|
# 隔离存档换注 main.meta 保确定性(禁碰真实档 user://save.json——SaveManager 路径注入纪律;
|
||||||
# 营地先行段只换 meta 不换 save_manager——冒险段换注零档在前)----
|
# 营地先行段只换 meta 不换 save_manager——冒险段换注零档在前)----
|
||||||
# oracle: design/gdd/ux/camp.md:45 五功能窗统一窗壳、五窗互斥单开、各窗自带关闭钮(营地开合组)
|
# oracle: design/ux/camp.md:45 五功能窗统一窗壳、五窗互斥单开、各窗自带关闭钮(营地开合组)
|
||||||
ProbeUiUtil.isolate_save(main, "smoke_ui_probe_camp", false, false, false)
|
ProbeUiUtil.isolate_save(main, "smoke_ui_probe_camp", false, false, false)
|
||||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_probe_camp"):
|
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_probe_camp"):
|
||||||
problems.append("营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕")
|
problems.append("营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕")
|
||||||
@@ -36,12 +36,12 @@ func _ready() -> void:
|
|||||||
problems.append("营地层打开时开始层未隐藏(规范 2.3 遮挡纪律)〔句柄子容器批 V1〕")
|
problems.append("营地层打开时开始层未隐藏(规范 2.3 遮挡纪律)〔句柄子容器批 V1〕")
|
||||||
else:
|
else:
|
||||||
# 天赋树子界面(场景点选真实路由——木桩命中区进树界面;卡④ T5 深员改指)
|
# 天赋树子界面(场景点选真实路由——木桩命中区进树界面;卡④ T5 深员改指)
|
||||||
# oracle: design/gdd/ux/camp.md:20 木桩命中区→天赋树界面入口(场景点选路由)
|
# oracle: design/ux/camp.md:20 木桩命中区→天赋树界面入口(场景点选路由)
|
||||||
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"dummy").get_center())
|
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"dummy").get_center())
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
if not main.ui.modals.camp.tree.visible:
|
if not main.ui.modals.camp.tree.visible:
|
||||||
problems.append("天赋树子界面未打开(场景点选路由中断)〔营地图批 V2〕")
|
problems.append("天赋树子界面未打开(场景点选路由中断)〔营地图批 V2〕")
|
||||||
# oracle: design/gdd/ux/camp.md:41 钥石余额常驻画面顶部 HUD 栏(余额文案组)
|
# oracle: design/ux/camp.md:41 钥石余额常驻画面顶部 HUD 栏(余额文案组)
|
||||||
if not String(main.ui.modals.camp.tree._balance_label.text).begins_with("钥石"):
|
if not String(main.ui.modals.camp.tree._balance_label.text).begins_with("钥石"):
|
||||||
problems.append("营地余额文案缺失(%s)〔句柄子容器批 V1〕" % main.ui.modals.camp.tree._balance_label.text)
|
problems.append("营地余额文案缺失(%s)〔句柄子容器批 V1〕" % main.ui.modals.camp.tree._balance_label.text)
|
||||||
if main.ui.modals.camp.tree._tree_buy_btns.is_empty():
|
if main.ui.modals.camp.tree._tree_buy_btns.is_empty():
|
||||||
@@ -57,7 +57,7 @@ func _ready() -> void:
|
|||||||
ProbeUiUtil.push_click(main, ProbeUiUtil.find_button(main.ui.modals.camp.tree, "返回营地")) # 真点底栏返回钮→_emit_closed(camp_sub_view_base.gd:66-84)
|
ProbeUiUtil.push_click(main, ProbeUiUtil.find_button(main.ui.modals.camp.tree, "返回营地")) # 真点底栏返回钮→_emit_closed(camp_sub_view_base.gd:66-84)
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
# 秘宝匣子界面(场景点选真实路由——宝箱命中区)
|
# 秘宝匣子界面(场景点选真实路由——宝箱命中区)
|
||||||
# oracle: design/gdd/ux/camp.md:18 宝箱命中区→秘宝匣界面入口
|
# oracle: design/ux/camp.md:18 宝箱命中区→秘宝匣界面入口
|
||||||
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"chest").get_center())
|
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"chest").get_center())
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
if main.ui.modals.camp.treasure._workshop_rows.size() != 12:
|
if main.ui.modals.camp.treasure._workshop_rows.size() != 12:
|
||||||
@@ -76,7 +76,7 @@ func _ready() -> void:
|
|||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
# ---- 入口选路停点(关卡开始即出节点图——level_started 后、首战前弹选路层;
|
# ---- 入口选路停点(关卡开始即出节点图——level_started 后、首战前弹选路层;
|
||||||
# candidate_rect 命中矩形真点 pick 入口单候选进首战)----
|
# candidate_rect 命中矩形真点 pick 入口单候选进首战)----
|
||||||
# oracle: design/gdd/ux/level-map.md:11 入口停点候选数=入口个数(入口单候选断言)
|
# oracle: design/ux/level-map.md:11 入口停点候选数=入口个数(入口单候选断言)
|
||||||
# ---- 独立性断言(独立屏激活期战斗屏宿主整体隐藏,零透出)----
|
# ---- 独立性断言(独立屏激活期战斗屏宿主整体隐藏,零透出)----
|
||||||
if not main.ui.modals.run.level_screen.visible:
|
if not main.ui.modals.run.level_screen.visible:
|
||||||
problems.append("关卡开始未弹入口选路停点(level_screen 应可见)")
|
problems.append("关卡开始未弹入口选路停点(level_screen 应可见)")
|
||||||
@@ -92,7 +92,7 @@ func _ready() -> void:
|
|||||||
if not main.ui.screens.battle_root.visible or main.ui.modals.run.level_screen.visible:
|
if not main.ui.screens.battle_root.visible or main.ui.modals.run.level_screen.visible:
|
||||||
problems.append("选路提交战斗节点后未切回战斗屏(屏级互斥恢复失守)")
|
problems.append("选路提交战斗节点后未切回战斗屏(屏级互斥恢复失守)")
|
||||||
# ---- 放弃入口·冒险模式可见 + 战斗中按下被拒(真实按钮路径——入口挂选路停点,战斗中拒绝为防御分支)----
|
# ---- 放弃入口·冒险模式可见 + 战斗中按下被拒(真实按钮路径——入口挂选路停点,战斗中拒绝为防御分支)----
|
||||||
# oracle: design/gdd/ux/level-map.md:42 放弃冒险(任意选路停点)→ 冒险落幕——战斗域单事务在飞时拒绝
|
# oracle: design/ux/level-map.md:42 放弃冒险(任意选路停点)→ 冒险落幕——战斗域单事务在飞时拒绝
|
||||||
if main.ui.modals.run.level_screen.abandon_btn == null or not main.ui.modals.run.level_screen.abandon_btn.visible:
|
if main.ui.modals.run.level_screen.abandon_btn == null or not main.ui.modals.run.level_screen.abandon_btn.visible:
|
||||||
problems.append("冒险模式放弃按钮未开放(选路停点入口在案)")
|
problems.append("冒险模式放弃按钮未开放(选路停点入口在案)")
|
||||||
else:
|
else:
|
||||||
@@ -101,7 +101,7 @@ func _ready() -> void:
|
|||||||
if main.run_scope.adventure == null or String(main.run_scope.adventure.state) != "running":
|
if main.run_scope.adventure == null or String(main.run_scope.adventure.state) != "running":
|
||||||
problems.append("首战中放弃未被拒(战斗域单事务在飞——state 应保持 running)")
|
problems.append("首战中放弃未被拒(战斗域单事务在飞——state 应保持 running)")
|
||||||
# ---- 既有断言(回归基线;A 区无进度条——节点链进度由关卡画面独立屏承载)----
|
# ---- 既有断言(回归基线;A 区无进度条——节点链进度由关卡画面独立屏承载)----
|
||||||
# oracle: design/gdd/ux/battle.md:122 B 区构建组:主角与敌人站桩、明细带挖掘期收起、轮次指示、棋盘与 C 区/秘宝槽、首战进行中
|
# oracle: design/ux/battle.md:122 B 区构建组:主角与敌人站桩、明细带挖掘期收起、轮次指示、棋盘与 C 区/秘宝槽、首战进行中
|
||||||
if main.ui.battle.board_zone.board_view.cells_probe().is_empty():
|
if main.ui.battle.board_zone.board_view.cells_probe().is_empty():
|
||||||
problems.append("棋盘格未生成(cells=0)")
|
problems.append("棋盘格未生成(cells=0)")
|
||||||
if main.ui.battle.board_zone.board_view.board() == null:
|
if main.ui.battle.board_zone.board_view.board() == null:
|
||||||
@@ -237,7 +237,7 @@ func _ready() -> void:
|
|||||||
# ---- GP 终局行:summary gp_final 键取数+胜利面板 GP 行呈现(C5:GP 行只上冒险终局面板;
|
# ---- GP 终局行:summary gp_final 键取数+胜利面板 GP 行呈现(C5:GP 行只上冒险终局面板;
|
||||||
# 断言面 = summary 键,无影子账清零转存)----
|
# 断言面 = summary 键,无影子账清零转存)----
|
||||||
# (置于战斗态断言之后——合成收束会灰化站桩并清 settlement 引用,具污染性)
|
# (置于战斗态断言之后——合成收束会灰化站桩并清 settlement 引用,具污染性)
|
||||||
# oracle: design/gdd/ux/settlement-summary.md:20 战利品行=GP 增量+总量(冒险终局面板 GP 行组)
|
# oracle: design/ux/settlement-summary.md:20 战利品行=GP 增量+总量(冒险终局面板 GP 行组)
|
||||||
var meta_saved = main.meta.save
|
var meta_saved = main.meta.save
|
||||||
for p2 in ["user://smoke_ui_probe_settle_scratch.json", "user://smoke_ui_probe_settle_scratch.json.tmp"]:
|
for p2 in ["user://smoke_ui_probe_settle_scratch.json", "user://smoke_ui_probe_settle_scratch.json.tmp"]:
|
||||||
if FileAccess.file_exists(p2):
|
if FileAccess.file_exists(p2):
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ func _ready() -> void:
|
|||||||
# ---- 生涯页:入口=帐篷旁笔记本(卡④ T3 改挂——场景点选信号真实路由→组合根 _open_career)→
|
# ---- 生涯页:入口=帐篷旁笔记本(卡④ T3 改挂——场景点选信号真实路由→组合根 _open_career)→
|
||||||
# 结构断言族→只读巡检(契约 3)+零动效契约+零跳转契约(提纲 P4 甲)→组合根真实路径关闭。
|
# 结构断言族→只读巡检(契约 3)+零动效契约+零跳转契约(提纲 P4 甲)→组合根真实路径关闭。
|
||||||
#(登记序/树序契约统一在全模态 _modal_registry_contract——boot 段跑)----
|
#(登记序/树序契约统一在全模态 _modal_registry_contract——boot 段跑)----
|
||||||
# oracle: design/gdd/ux/camp.md:19 帐篷旁笔记本→生涯记录;生涯页返回钮口径由结构校验兜底(生涯段)
|
# oracle: design/ux/camp.md:19 帐篷旁笔记本→生涯记录;生涯页返回钮口径由结构校验兜底(生涯段)
|
||||||
# 营地语境:开始层全程隐藏(笔记本入口在营地场景根——关生涯回营地不回开始层,卡④ T3 语境分支)
|
# 营地语境:开始层全程隐藏(笔记本入口在营地场景根——关生涯回营地不回开始层,卡④ T3 语境分支)
|
||||||
main._camp_pres.open_camp() # 重开营地场景根(笔记本入口语境)
|
main._camp_pres.open_camp() # 重开营地场景根(笔记本入口语境)
|
||||||
_settle()
|
_settle()
|
||||||
@@ -106,7 +106,7 @@ func _ready() -> void:
|
|||||||
if main.ui.modals.menu.career_overlay.visible or main.ui.screens.start_overlay.visible:
|
if main.ui.modals.menu.career_overlay.visible or main.ui.screens.start_overlay.visible:
|
||||||
problems.append("[career] 关闭后页未隐藏或开始层回弹(营地语境分支失守)〔营地图批 V5〕")
|
problems.append("[career] 关闭后页未隐藏或开始层回弹(营地语境分支失守)〔营地图批 V5〕")
|
||||||
# ---- Esc 浮窗结构段(卡⑤——三钮在位且仅三+零动效契约+登记序在册+debug_badge 不波及)----
|
# ---- Esc 浮窗结构段(卡⑤——三钮在位且仅三+零动效契约+登记序在册+debug_badge 不波及)----
|
||||||
# oracle: design/gdd/ux/camp.md:45 ESC 优先序:有窗先关最上层窗、无窗才进浮窗;各窗自带关闭钮(Esc 段)
|
# oracle: design/ux/camp.md:45 ESC 优先序:有窗先关最上层窗、无窗才进浮窗;各窗自带关闭钮(Esc 段)
|
||||||
main._camp_pres.open_camp()
|
main._camp_pres.open_camp()
|
||||||
_settle()
|
_settle()
|
||||||
var gpos_gate: Vector2 = main.ui.modals.camp.scene.get_hotspot_rect(&"gate").get_center()
|
var gpos_gate: Vector2 = main.ui.modals.camp.scene.get_hotspot_rect(&"gate").get_center()
|
||||||
@@ -213,7 +213,7 @@ func _ready() -> void:
|
|||||||
_settle()
|
_settle()
|
||||||
|
|
||||||
# ---- 冒险簇(真流推进:开冒险→地图选路态→选战斗节点→战斗 HUD)----
|
# ---- 冒险簇(真流推进:开冒险→地图选路态→选战斗节点→战斗 HUD)----
|
||||||
# oracle: design/gdd/ux/level-map.md:3 图上点击选路·候选按钮退役(冒险簇选路真点组)
|
# oracle: design/ux/level-map.md:3 图上点击选路·候选按钮退役(冒险簇选路真点组)
|
||||||
ProbeUiUtil.isolate_save(main, "smoke_ui_struct_probe_adv", true, false, true)
|
ProbeUiUtil.isolate_save(main, "smoke_ui_struct_probe_adv", true, false, true)
|
||||||
main.ui.modals.menu.debug_overlay.seed_edit.text = "42" # 种子钉死(种子框默认为空=非首局随机,结构采样确定性禁依赖默认分支)
|
main.ui.modals.menu.debug_overlay.seed_edit.text = "42" # 种子钉死(种子框默认为空=非首局随机,结构采样确定性禁依赖默认分支)
|
||||||
main._start_adventure_from_menu()
|
main._start_adventure_from_menu()
|
||||||
@@ -648,7 +648,7 @@ func _modal_registry_contract(main: Node) -> void:
|
|||||||
|
|
||||||
# ⑬career 零跳转契约(提纲 P4 甲——页内零「前往他处」入口:除「返回」外任何导航钮=红)
|
# ⑬career 零跳转契约(提纲 P4 甲——页内零「前往他处」入口:除「返回」外任何导航钮=红)
|
||||||
func _career_nojump_contract(main: Node) -> void:
|
func _career_nojump_contract(main: Node) -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:19 生涯记录入口与返回钮口径由结构校验兜底——页内零导航入口(零跳转契约组)
|
# oracle: design/ux/camp.md:19 生涯记录入口与返回钮口径由结构校验兜底——页内零导航入口(零跳转契约组)
|
||||||
for nav in ["营地", "商店", "设置", "冒险", "继续上局", "退出", "前往"]:
|
for nav in ["营地", "商店", "设置", "冒险", "继续上局", "退出", "前往"]:
|
||||||
if ProbeUiUtil.find_button(main.ui.modals.menu.career_overlay, nav, "contains") != null:
|
if ProbeUiUtil.find_button(main.ui.modals.menu.career_overlay, nav, "contains") != null:
|
||||||
problems.append("[career][nojump] 页内出现导航入口「%s」(零跳转违约——生涯纯只读)" % nav)
|
problems.append("[career][nojump] 页内出现导航入口「%s」(零跳转违约——生涯纯只读)" % nav)
|
||||||
@@ -658,7 +658,7 @@ func _career_nojump_contract(main: Node) -> void:
|
|||||||
# (名行基线离盒底 1px 同型高危写法返修回归闸;
|
# (名行基线离盒底 1px 同型高危写法返修回归闸;
|
||||||
# 内容矩形=StandeeBody.content_rect(),最低绘制元素=底座下缘)
|
# 内容矩形=StandeeBody.content_rect(),最低绘制元素=底座下缘)
|
||||||
func _standeefit_contract(main: Node) -> void:
|
func _standeefit_contract(main: Node) -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:154 主角站桩立绘(无框立绘+落影)——站桩内容矩形⊆舞台(站桩适配组)
|
# oracle: design/ux/battle.md:154 主角站桩立绘(无框立绘+落影)——站桩内容矩形⊆舞台(站桩适配组)
|
||||||
var st: Node = main.ui.battle.stage
|
var st: Node = main.ui.battle.stage
|
||||||
if st == null or st.hero_standee == null:
|
if st == null or st.hero_standee == null:
|
||||||
problems.append("[standee] 舞台/主角站桩缺失(断言中断)")
|
problems.append("[standee] 舞台/主角站桩缺失(断言中断)")
|
||||||
|
|||||||
@@ -135,13 +135,14 @@ tests/
|
|||||||
| 模态句柄分域寻址面 | HUD框架 | 局内/菜单/营地三子容器句柄经注册面合同寻址(`UiRegistry.node()` 逐键取层)+模态编排口开合(`ModalFlow.open()`/`ModalFlow.close()`) | `ui_struct_probe.gd:_modal_registry_contract`(registry 合同序段+分域句柄段) |
|
| 模态句柄分域寻址面 | HUD框架 | 局内/菜单/营地三子容器句柄经注册面合同寻址(`UiRegistry.node()` 逐键取层)+模态编排口开合(`ModalFlow.open()`/`ModalFlow.close()`) | `ui_struct_probe.gd:_modal_registry_contract`(registry 合同序段+分域句柄段) |
|
||||||
| 未开格类型微光(8 邻作用集/五组色相/零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` |
|
| 未开格类型微光(8 邻作用集/五组色相/零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` |
|
||||||
| 棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | HUD框架 | `ui_input_probe` 合成鼠标事件→`BoardView._gui_input()`;读面 `BoardView.hover_probe()` | `ui_input_probe.gd:_ready`(case①到达②禁入③路径预览三语义) |
|
| 棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | HUD框架 | `ui_input_probe` 合成鼠标事件→`BoardView._gui_input()`;读面 `BoardView.hover_probe()` | `ui_input_probe.gd:_ready`(case①到达②禁入③路径预览三语义) |
|
||||||
| UI 全局主题与按钮五态(含对比度锚) | HUD框架 | `UiKit.button()`/`UiKit.primary_button()` | `theme_projection_test.gd:_smoke_global_theme`;`theme_projection_test.gd:_smoke_button_five_states`;`theme_projection_test.gd:_smoke_contrast_inks` |
|
| UI 全局主题与按钮五态(含对比度锚) | HUD框架 | `UiKit.button()`/`UiKit.primary_button()` | `theme_projection_test.gd:_smoke_global_theme`;`theme_projection_test.gd:_smoke_button_five_states`;`theme_projection_test.gd:_smoke_contrast_inks`;`palette_token_pairwise_test.gd:_test_pairwise`(色板近色纪律存量面) |
|
||||||
| 中文字体随包与字形覆盖 | HUD框架 | `UiKit.load_font()` | `ui_font_asset_test.gd:_init`;`theme_projection_test.gd:_smoke_global_theme` |
|
| 中文字体随包与字形覆盖 | HUD框架 | `UiKit.load_font()` | `ui_font_asset_test.gd:_init`;`theme_projection_test.gd:_smoke_global_theme` |
|
||||||
| 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes` |
|
| 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes` |
|
||||||
| 站桩敌人呈现与结算演出落点 | 战斗表现 | `BattleStageView.enemy_standee_center()`/`BattleEndOverlay.open_victory()` | `standee_fx_sweep_test.gd:_init`;`pacing_queue_test.gd:_init` |
|
| 站桩敌人呈现与结算演出落点 | 战斗表现 | `BattleStageView.enemy_standee_center()`/`BattleEndOverlay.open_victory()` | `standee_fx_sweep_test.gd:_init`;`pacing_queue_test.gd:_init` |
|
||||||
| 站桩呈现定值与素材绑定 | 战斗表现 | `UiKit.load_tex()`/`StandeeBody.name_line_probe()` | `standee_present_values_test.gd:_init` |
|
| 站桩呈现定值与素材绑定 | 战斗表现 | `UiKit.load_tex()`/`StandeeBody.name_line_probe()` | `standee_present_values_test.gd:_init` |
|
||||||
| 站桩显示档与素材分辨率绑定 | 战斗表现 | `StandeeBody.portrait_probe()`/`StandeeMotion.PORTRAIT_DISPLAY_H` | `standee_present_values_test.gd:_check_display_tier` |
|
| 站桩显示档与素材分辨率绑定 | 战斗表现 | `StandeeBody.portrait_probe()`/`StandeeMotion.PORTRAIT_DISPLAY_H` | `standee_present_values_test.gd:_check_display_tier` |
|
||||||
| B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) | HUD框架 | `BattleStageView.set_board_type()` | `stage_background_test.gd:_test_background_selection`;`stage_background_test.gd:_test_ground_layer_geometry`;`stage_background_test.gd:_test_beams_retired` |
|
| B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) | HUD框架 | `BattleStageView.set_board_type()` | `stage_background_test.gd:_test_background_selection`;`stage_background_test.gd:_test_ground_layer_geometry`;`stage_background_test.gd:_test_beams_retired` |
|
||||||
|
| 动画帧数规格(待机/攻击/受击;现役单帧形制锚定) | 战斗表现 | `UiKit.load_tex()`(`TEX_HERO_*` 四态件装载链——棋盘站立/行走与舞台三态同源) | `animation_frame_spec_test.gd:_test_spec_table`;`animation_frame_spec_test.gd:_test_current_form` |
|
||||||
| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula` |
|
| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula` |
|
||||||
| 调参测速批量模拟(逐帧步进与统计读数) | 调参测量 | `TuneSimController.run()`(调试浮窗批量模拟入口) | `tune_sim_batch_parity_test.gd:_init`(配对对拍套件) |
|
| 调参测速批量模拟(逐帧步进与统计读数) | 调参测量 | `TuneSimController.run()`(调试浮窗批量模拟入口) | `tune_sim_batch_parity_test.gd:_init`(配对对拍套件) |
|
||||||
| sim 驱动循环单点(缺省零变化与策略/日志回调形态) | 调参测量 | `BattleDriver.drive_round()`(两参缺省与五参回调两形态) | `battle_driver_drive_test.gd:_smoke_drive_round_contract` |
|
| sim 驱动循环单点(缺省零变化与策略/日志回调形态) | 调参测量 | `BattleDriver.drive_round()`(两参缺省与五参回调两形态) | `battle_driver_drive_test.gd:_smoke_drive_round_contract` |
|
||||||
|
|||||||
@@ -206,6 +206,8 @@ func _suites() -> Array:
|
|||||||
{"path": "res://tests/unit/presentation/forge_workbench_test.gd", "expect": 0}, # 工作间两区六路线 UI 直验(V13 自动化前置面)
|
{"path": "res://tests/unit/presentation/forge_workbench_test.gd", "expect": 0}, # 工作间两区六路线 UI 直验(V13 自动化前置面)
|
||||||
{"path": "res://tests/unit/presentation/camp_scene_layout_test.gd", "expect": 0}, # 营地场景布局数据件校验(V14——fail-fast 判据+七命中区几何红线)
|
{"path": "res://tests/unit/presentation/camp_scene_layout_test.gd", "expect": 0}, # 营地场景布局数据件校验(V14——fail-fast 判据+七命中区几何红线)
|
||||||
{"path": "res://tests/unit/presentation/stage_background_test.gd", "expect": 0}, # B 区舞台背景三关变体与连续地面层(V1–V5/V8——ground_h 表单源/board_type 选图/缺图回退/地面几何/光柱退役)
|
{"path": "res://tests/unit/presentation/stage_background_test.gd", "expect": 0}, # B 区舞台背景三关变体与连续地面层(V1–V5/V8——ground_h 表单源/board_type 选图/缺图回退/地面几何/光柱退役)
|
||||||
|
{"path": "res://tests/unit/presentation/animation_frame_spec_test.gd", "expect": 0}, # 动画帧数规格守门(帧数档定值面=本套件——规格表冻结+现役单帧形制锚定)
|
||||||
|
{"path": "res://tests/unit/presentation/palette_token_pairwise_test.gd", "expect": 0}, # token 板两两互查守门(色板增量纪律存量面——豁免账外零近色对,六对欠账在册)
|
||||||
{"path": "res://tests/unit/battle_settlement/damage_math_test.gd", "expect": 0},
|
{"path": "res://tests/unit/battle_settlement/damage_math_test.gd", "expect": 0},
|
||||||
{"path": "res://tests/unit/battle_settlement/damage_controller_test.gd", "expect": 0},
|
{"path": "res://tests/unit/battle_settlement/damage_controller_test.gd", "expect": 0},
|
||||||
{"path": "res://tests/unit/battle_settlement/effect_port_test.gd", "expect": 0}, # 效果端口件(效果端口与掷格分件批 V1–V3——端口单实例/业务类零引擎直连源码锚/事实面闭集两对照)
|
{"path": "res://tests/unit/battle_settlement/effect_port_test.gd", "expect": 0}, # 效果端口件(效果端口与掷格分件批 V1–V3——端口单实例/业务类零引擎直连源码锚/事实面闭集两对照)
|
||||||
|
|||||||
@@ -608,7 +608,7 @@ func _smoke_lifecycle_matrix() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _smoke_camp_hud_band() -> void:
|
func _smoke_camp_hud_band() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:41 (营地顶栏栏体定值与落座——几何/色值/吃点击五钉组)
|
# oracle: design/ux/camp.md:41 (营地顶栏栏体定值与落座——几何/色值/吃点击五钉组)
|
||||||
print("--- 营地交互修复批 T3 顶栏栏体(R5:色值/铺满/不吃点击/首子件/徽章落座)---")
|
print("--- 营地交互修复批 T3 顶栏栏体(R5:色值/铺满/不吃点击/首子件/徽章落座)---")
|
||||||
var main: Node = load("res://presentation/main.tscn").instantiate()
|
var main: Node = load("res://presentation/main.tscn").instantiate()
|
||||||
root.add_child(main)
|
root.add_child(main)
|
||||||
|
|||||||
@@ -1576,7 +1576,7 @@ func _has_err_category(errs: Array, category: String) -> bool:
|
|||||||
# ---- 货架位数读表(架构整改——shelf_size 表头单点:进店与重抽同源)----
|
# ---- 货架位数读表(架构整改——shelf_size 表头单点:进店与重抽同源)----
|
||||||
|
|
||||||
func _test_shelf_size_from_table() -> void:
|
func _test_shelf_size_from_table() -> void:
|
||||||
# oracle: design/gdd/ux/shop.md:13 (货架位数读表组)
|
# oracle: design/ux/shop.md:13 (货架位数读表组)
|
||||||
var autoplay = load("res://sim/level_autoplay.gd")
|
var autoplay = load("res://sim/level_autoplay.gd")
|
||||||
var st = _db.run.shop
|
var st = _db.run.shop
|
||||||
var saved: int = int(st.shelf_size)
|
var saved: int = int(st.shelf_size)
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://ccl0nket4ybvu
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# tests/unit/presentation/animation_frame_spec_test.gd — 动画帧数规格守门(定值面=本测试)
|
||||||
|
# 断言面:①帧数规格表冻结(待机循环 4 帧/攻击准备 6 帧单次/受击 2 帧——样张冻结定值落码于本表,
|
||||||
|
# 文档侧只述规则并指路本测试);②现役四态单帧形制锚定(idle/walk 32×32、attack 92×92、
|
||||||
|
# hit 88×92——现役为单帧状态件,序列帧资产入包时按规格表逐件判帧数并同批换代本套件);
|
||||||
|
# ③死亡=灰化+碎裂退场(非帧件,无帧数断言面)。
|
||||||
|
# 运行:godot --headless --path game --script res://tests/unit/presentation/animation_frame_spec_test.gd
|
||||||
|
extends SceneTree
|
||||||
|
|
||||||
|
const Kit := preload("res://tests/unit/test_kit.gd")
|
||||||
|
|
||||||
|
# 帧数规格表(样张冻结值——多帧序列帧资产的生产规格;现役单帧占位件不适用本表)
|
||||||
|
const SPEC := {"idle": 4, "attack": 6, "hit": 2}
|
||||||
|
# 现役单帧形制(宽,高)——序列帧资产替换形制时同批修订本表并激活规格逐件断言
|
||||||
|
const CURRENT_FORM := {
|
||||||
|
"character_hero_idle.png": Vector2i(32, 32),
|
||||||
|
"character_hero_walk.png": Vector2i(32, 32),
|
||||||
|
"character_hero_attack.png": Vector2i(92, 92),
|
||||||
|
"character_hero_hit.png": Vector2i(88, 92),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func _init() -> void:
|
||||||
|
# oracle: design/art/art-bible.md:538 (帧数规格条——样张冻结定值组)
|
||||||
|
_test_spec_table()
|
||||||
|
_test_current_form()
|
||||||
|
quit(Kit.finish("animation_frame_spec_test"))
|
||||||
|
|
||||||
|
|
||||||
|
# ① 规格表冻结面(帧数档定值单点=本表)
|
||||||
|
func _test_spec_table() -> void:
|
||||||
|
# oracle: design/art/art-bible.md:538 (帧数规格表冻结组)
|
||||||
|
Kit.check("待机循环 4 帧在表〔帧规格 V1〕", SPEC.get("idle", 0) == 4)
|
||||||
|
Kit.check("攻击准备 6 帧单次在表〔帧规格 V2〕", SPEC.get("attack", 0) == 6)
|
||||||
|
Kit.check("受击 2 帧在表〔帧规格 V3〕", SPEC.get("hit", 0) == 2)
|
||||||
|
|
||||||
|
|
||||||
|
# ② 现役单帧形制锚定(真实加载链——资产被换形制而未走规格表时此处红)
|
||||||
|
func _test_current_form() -> void:
|
||||||
|
# oracle: design/art/art-bible.md:538 (现役单帧形制组)
|
||||||
|
for fn: String in CURRENT_FORM:
|
||||||
|
var tex: Texture2D = load("res://assets/art/character/" + fn)
|
||||||
|
var want := Vector2(CURRENT_FORM[fn])
|
||||||
|
Kit.check("现役件在库且形制冻结:%s %s〔帧规格 V4〕" % [fn, want],
|
||||||
|
tex != null and tex.get_size() == want)
|
||||||
@@ -92,7 +92,7 @@ func _test_boss_name_uses_boss_rowset() -> void:
|
|||||||
# 关卡完成停点文案族措辞钉子(口径换代批):回血行/满血合法态/渠道句/摘要关数行——
|
# 关卡完成停点文案族措辞钉子(口径换代批):回血行/满血合法态/渠道句/摘要关数行——
|
||||||
# 旧措辞退役后玩家可见面由本组断言钉在新措辞上(撤销证明:回退 battle_narrator 对应行→断言红→复原复绿)
|
# 旧措辞退役后玩家可见面由本组断言钉在新措辞上(撤销证明:回退 battle_narrator 对应行→断言红→复原复绿)
|
||||||
func _test_level_clear_wording() -> void:
|
func _test_level_clear_wording() -> void:
|
||||||
# oracle: design/gdd/ux/level-clear.md:11 (关卡结算屏文案组)
|
# oracle: design/ux/level-clear.md:11 (关卡结算屏文案组)
|
||||||
var healed: String = NarratorScript.curio_pick_header({"level_index": 1, "heal_gained": 5, "hp_before": 10, "hp_after": 15})
|
var healed: String = NarratorScript.curio_pick_header({"level_index": 1, "heal_gained": 5, "hp_before": 10, "hp_after": 15})
|
||||||
Kit.check("关卡完成回血行带入回血量与生命区间(实际「%s」)〔口径换代 V1〕" % healed,
|
Kit.check("关卡完成回血行带入回血量与生命区间(实际「%s」)〔口径换代 V1〕" % healed,
|
||||||
healed.contains("关卡完成回血 +5(生命 10 → 15)"))
|
healed.contains("关卡完成回血 +5(生命 10 → 15)"))
|
||||||
|
|||||||
@@ -10,19 +10,19 @@ const _EXPECTED_KEYS: Array[StringName] = [&"gate", &"forge", &"dummy", &"chest"
|
|||||||
|
|
||||||
|
|
||||||
func _initialize() -> void:
|
func _initialize() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:29 (营地场景布局数据件——纵深与地平线组)
|
# oracle: design/ux/camp.md:29 (营地场景布局数据件——纵深与地平线组)
|
||||||
call_deferred("_run_all")
|
call_deferred("_run_all")
|
||||||
|
|
||||||
|
|
||||||
func _run_all() -> void:
|
func _run_all() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:29 (套件统一收尾——双测试函数单进程单 quit)
|
# oracle: design/ux/camp.md:29 (套件统一收尾——双测试函数单进程单 quit)
|
||||||
await _test_layout_hotspot_geometry()
|
await _test_layout_hotspot_geometry()
|
||||||
await _test_hud_band_contrast_over_bg()
|
await _test_hud_band_contrast_over_bg()
|
||||||
quit(Kit.finish("camp_scene_layout_test", "PASS — 布局几何+顶栏栏体对比 全过"))
|
quit(Kit.finish("camp_scene_layout_test", "PASS — 布局几何+顶栏栏体对比 全过"))
|
||||||
|
|
||||||
|
|
||||||
func _test_layout_hotspot_geometry() -> void:
|
func _test_layout_hotspot_geometry() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:16 (七物件命中区几何红线组)
|
# oracle: design/ux/camp.md:16 (七物件命中区几何红线组)
|
||||||
var table: CampSceneLayoutTable = load("res://data/tables/camp_scene_layout.tres")
|
var table: CampSceneLayoutTable = load("res://data/tables/camp_scene_layout.tres")
|
||||||
Kit.check("V14 布局表加载且 schema 类在位〔营地图批 V14〕", table is CampSceneLayoutTable and table != null)
|
Kit.check("V14 布局表加载且 schema 类在位〔营地图批 V14〕", table is CampSceneLayoutTable and table != null)
|
||||||
if table == null:
|
if table == null:
|
||||||
@@ -100,7 +100,7 @@ func _test_layout_hotspot_geometry() -> void:
|
|||||||
# 按规格句在测试内写死 #6E4526 与 α0.80,与背景贴图顶带实测均色做 α 合成后算 WCAG 对比 ≥3.0。
|
# 按规格句在测试内写死 #6E4526 与 α0.80,与背景贴图顶带实测均色做 α 合成后算 WCAG 对比 ≥3.0。
|
||||||
# 禁把视图件的 color 直接当预期值喂进算式(oracle 镜像——test-conventions §8.7 判红)。
|
# 禁把视图件的 color 直接当预期值喂进算式(oracle 镜像——test-conventions §8.7 判红)。
|
||||||
func _test_hud_band_contrast_over_bg() -> void:
|
func _test_hud_band_contrast_over_bg() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:41 (顶栏栏体定值——对落位带底色对比 ≥3:1 组)
|
# oracle: design/ux/camp.md:41 (顶栏栏体定值——对落位带底色对比 ≥3:1 组)
|
||||||
var table: CampSceneLayoutTable = load("res://data/tables/camp_scene_layout.tres")
|
var table: CampSceneLayoutTable = load("res://data/tables/camp_scene_layout.tres")
|
||||||
var band_h := 48
|
var band_h := 48
|
||||||
if table != null:
|
if table != null:
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://d0afgefg84yin
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
# tests/unit/presentation/palette_token_pairwise_test.gd — 语义/UI token 板两两互查守门
|
||||||
|
# 断言面:ui_kit 全部 Color 常量两两 RGB 三通道差禁止全部 <8/255(色板增量纪律第二道门的存量面;
|
||||||
|
# 文档侧只述纪律并指路本测试,数值门=本件 NEAR_EPS);六对已登记欠账走豁免账(清偿批逐对销账,
|
||||||
|
# 债务登记=待办清单「色板近色欠账六对清偿」条;新增欠账禁直入本账,须走待办清单修订)。
|
||||||
|
# 豁免账中两对伙伴色(3e3731/3e4048/3f4147)为迷雾合成底素材侧色——不在 ui_kit 常量面,
|
||||||
|
# 其清偿随素材批处理;本测试扫常量面,素材侧对子由互辨抽测件近色读数承载。
|
||||||
|
# 运行:godot --headless --path game --script res://tests/unit/presentation/palette_token_pairwise_test.gd
|
||||||
|
extends SceneTree
|
||||||
|
|
||||||
|
const Kit := preload("res://tests/unit/test_kit.gd")
|
||||||
|
const UI_KIT_PATH := "res://presentation/views/ui_kit.gd"
|
||||||
|
|
||||||
|
const NEAR_EPS := 8
|
||||||
|
|
||||||
|
# 存量近色关系在册账(键=两色 hex 升序拼接,值=性质标签)。账面=常量面全量现状的机器真值;
|
||||||
|
# 闸只拦「账外新增」。标「欠账」四对=art-bible 原六对债的常量面部分(清偿批销账);
|
||||||
|
# 另两对(3e362c3e3731/3e40483f4147)伙伴为迷雾合成底素材侧色,不在常量面,随素材批清偿。
|
||||||
|
# 同一键可覆盖多名对(同值别名与其伙伴构成的同 hex 对)。
|
||||||
|
const EXEMPT_LEDGER := {
|
||||||
|
"140f0d18120c": "深墨族(DIM↔DIM_NIGHT)",
|
||||||
|
"140f0d181410": "深墨族(DIM↔INK_ROUTE)",
|
||||||
|
"18120c181410": "深墨族(DIM_NIGHT↔INK_ROUTE)〔欠账〕",
|
||||||
|
"18120c1e1812": "深墨族(DIM_NIGHT↔FOG_OUTLINE)",
|
||||||
|
"291f172e2218": "暗底族(INK_LABEL↔TIP_BG)",
|
||||||
|
"2820182e2218": "暗底族(CAMP_BADGE_PANEL↔INK_LABEL)",
|
||||||
|
"282018291f17": "暗底族(CAMP_BADGE_PANEL↔TIP_BG)",
|
||||||
|
"33261b342a20": "墨族近结构件(E_FACADE_FOOT_COL↔INK)",
|
||||||
|
"33261b362b20": "墨族近屏底(INK↔BG_OVERLAY)〔欠账〕",
|
||||||
|
"342a20362b20": "结构件暗棕近屏底(E_FACADE_FOOT_COL↔BG_OVERLAY)",
|
||||||
|
"342a203a2e22": "结构件暗棕近屏底(E_FACADE_FOOT_COL↔BG_ROOT)",
|
||||||
|
"362b203a2e22": "屏底双件(BG_OVERLAY↔BG_ROOT)〔欠账〕",
|
||||||
|
"3a3a3a403a34": "暗板族(DARK_UPCOMING↔FOG_MEMORY_PLATE)",
|
||||||
|
"4537234a3b2a": "暖亮底双件(BG_BRIGHT↔BG_MAP_TOP)〔欠账〕",
|
||||||
|
"4a3b2a4a3e30": "同域暗棕(BG_MAP_TOP↔HINT_STRIP_EDGE)",
|
||||||
|
"6e45266e4526": "α 派生别名(CAMP_HEADER_BAND↔CAMP_HUD_BAND,非色板新增)",
|
||||||
|
"786e58786e58": "文档别名(DOT_OFF↔PANEL_BORDER——兼熄灭点阵)",
|
||||||
|
"1a17141e1812": "深墨族(FOG_OUTLINE↔ICON_TINT_ON_GOLD)",
|
||||||
|
"1814101a1714": "深墨族(ICON_TINT_ON_GOLD↔INK_ROUTE)",
|
||||||
|
"1a17141e1a16": "深墨族(ICON_TINT_ON_GOLD↔INK_TITLE)",
|
||||||
|
"1814101e1812": "深墨族(FOG_OUTLINE↔INK_ROUTE)",
|
||||||
|
"1e18121e1a16": "深墨族(FOG_OUTLINE↔INK_TITLE)",
|
||||||
|
"1814101e1a16": "深墨族(INK_ROUTE↔INK_TITLE)",
|
||||||
|
"1a1a1c1e1a16": "深墨族(HP_BAR_TRACK↔INK_TITLE)",
|
||||||
|
"2e221833261b": "墨族(INK↔INK_LABEL)",
|
||||||
|
"c9b88ecdb88c": "暖米族(MAP_VDIV↔WARM_FAINT)",
|
||||||
|
"e0b860e6be5a": "金族亮档双件(GOLD_BRIGHT↔GOLD_LIT)",
|
||||||
|
"f0e2c8f0e2c8": "同值别名(INK_L_WARM↔WARM)",
|
||||||
|
"f0e2c8f0e4c8": "暖米板族(INK_L_WARM/MAP_BAR_PLATE/WARM 同 hex 双名对)",
|
||||||
|
"f0e2c8f0e6ce": "暖米板族(CAMP_ROW_PLATE↔INK_L_WARM/WARM 同 hex 双名对)",
|
||||||
|
"f0e4c8f0e6ce": "暖米板族(CAMP_ROW_PLATE↔MAP_BAR_PLATE)",
|
||||||
|
"f0e6cef5ead3": "暖米板族(CAMP_ROW_PLATE↔DIGIT_PLATE)",
|
||||||
|
"f0e8d6f5ead3": "暖纸板族(DIGIT_PLATE↔TOAST_BG)",
|
||||||
|
"f5ead3f6eeda": "暖纸板族(DIGIT_PLATE↔INK_ON_DEEP)",
|
||||||
|
"f0e8d6f6eeda": "暖纸板族(INK_ON_DEEP↔TOAST_BG)",
|
||||||
|
"f8e2a8f8e3a8": "同族亮金墨(INK_L_GOLD↔RAP_DOT_CORE_WARM)",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func _init() -> void:
|
||||||
|
# oracle: design/art/art-bible.md:220 (色板增量纪律条——存量两两互查组)
|
||||||
|
_test_pairwise()
|
||||||
|
quit(Kit.finish("palette_token_pairwise_test"))
|
||||||
|
|
||||||
|
|
||||||
|
func _token_colors() -> Dictionary:
|
||||||
|
var script: Script = load(UI_KIT_PATH)
|
||||||
|
var cmap: Dictionary = script.get_script_constant_map()
|
||||||
|
var out: Dictionary = {}
|
||||||
|
for name: String in cmap:
|
||||||
|
if cmap[name] is Color:
|
||||||
|
out[name] = cmap[name]
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
func _hex(c: Color) -> String:
|
||||||
|
return "%02x%02x%02x" % [c.r8, c.g8, c.b8]
|
||||||
|
|
||||||
|
|
||||||
|
# 存量两两互查:豁免账外零近色对(扫描面>0 前置防静默绿)
|
||||||
|
func _test_pairwise() -> void:
|
||||||
|
# oracle: design/art/art-bible.md:220 (色板增量纪律条——存量两两互查组)
|
||||||
|
var tokens := _token_colors()
|
||||||
|
Kit.check("token 面非空(扫描面>0)〔token互查 V1〕", tokens.size() >= 40)
|
||||||
|
var names: Array = tokens.keys()
|
||||||
|
names.sort()
|
||||||
|
var bad: Array = []
|
||||||
|
for i in range(names.size()):
|
||||||
|
for j in range(i + 1, names.size()):
|
||||||
|
var a: Color = tokens[names[i]]
|
||||||
|
var b: Color = tokens[names[j]]
|
||||||
|
if absi(a.r8 - b.r8) < NEAR_EPS and absi(a.g8 - b.g8) < NEAR_EPS \
|
||||||
|
and absi(a.b8 - b.b8) < NEAR_EPS:
|
||||||
|
var pair: Array = [_hex(a), _hex(b)]
|
||||||
|
pair.sort()
|
||||||
|
var key: String = pair[0] + pair[1]
|
||||||
|
if not EXEMPT_LEDGER.has(key):
|
||||||
|
bad.append("%s↔%s(%s)" % [names[i], names[j], key])
|
||||||
|
Kit.check("豁免账外零新增近色对〔token互查 V2〕", bad.is_empty())
|
||||||
|
if not bad.is_empty():
|
||||||
|
for item: String in bad:
|
||||||
|
print(" [近色对] ", item)
|
||||||
@@ -10,7 +10,7 @@ const ProbeUiUtil := preload("res://probe/probe_ui_util.gd") # 真输入合成
|
|||||||
|
|
||||||
# 断言 + 失败即停(原直写 print FAIL + quit(1) + return 样板单点化——早退语义逐位保持)
|
# 断言 + 失败即停(原直写 print FAIL + quit(1) + return 样板单点化——早退语义逐位保持)
|
||||||
func _req(desc: String, ok: bool) -> bool:
|
func _req(desc: String, ok: bool) -> bool:
|
||||||
# oracle: design/gdd/ux/node-reward.md:9 (奖励覆盖层直验——需求包装组)
|
# oracle: design/ux/node-reward.md:9 (奖励覆盖层直验——需求包装组)
|
||||||
Kit.check(desc, ok)
|
Kit.check(desc, ok)
|
||||||
if not ok:
|
if not ok:
|
||||||
quit(1)
|
quit(1)
|
||||||
@@ -18,11 +18,11 @@ func _req(desc: String, ok: bool) -> bool:
|
|||||||
return true
|
return true
|
||||||
|
|
||||||
func _initialize() -> void:
|
func _initialize() -> void:
|
||||||
# oracle: design/gdd/ux/node-reward.md:9 (奖励节点装载组)
|
# oracle: design/ux/node-reward.md:9 (奖励节点装载组)
|
||||||
call_deferred("_run")
|
call_deferred("_run")
|
||||||
|
|
||||||
func _run() -> void:
|
func _run() -> void:
|
||||||
# oracle: design/gdd/ux/node-reward.md:9 (奖励三选一呈现组)
|
# oracle: design/ux/node-reward.md:9 (奖励三选一呈现组)
|
||||||
var ov = load("res://presentation/views/curio_pick_overlay.gd").new()
|
var ov = load("res://presentation/views/curio_pick_overlay.gd").new()
|
||||||
root.add_child(ov)
|
root.add_child(ov)
|
||||||
var picked := []
|
var picked := []
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# tests/unit/presentation/seal_mark_params_test.gd — 封印印记参数化绘制守门(卡④ R1–R4)
|
# tests/unit/presentation/seal_mark_params_test.gd — 封印印记参数化绘制守门(卡④ R1–R4)
|
||||||
# 断言面:五常量取值逐项相等(ui_kit ↔ art-bible §8.2 对照);着色器文件存在且七个 uniform 名在文;
|
# 断言面:五常量取值逐项相等(封印六参数定值面=本测试断言);着色器文件存在且七个 uniform 名在文;
|
||||||
# 迷雾门控(seal_on × fog_state → 封印子件可见性)〔seal批 V1–V4〕。
|
# 迷雾门控(seal_on × fog_state → 封印子件可见性)〔seal批 V1–V4〕。
|
||||||
# 运行:godot --headless --path game --script res://tests/unit/presentation/seal_mark_params_test.gd
|
# 运行:godot --headless --path game --script res://tests/unit/presentation/seal_mark_params_test.gd
|
||||||
extends SceneTree
|
extends SceneTree
|
||||||
@@ -10,16 +10,16 @@ const CELL_UNIT := preload("res://presentation/views/board_cell_unit.gd")
|
|||||||
|
|
||||||
|
|
||||||
func _init() -> void:
|
func _init() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:128 (封印印记参数宿主——装载组)
|
# oracle: design/ux/battle.md:128 (封印印记参数宿主——装载组)
|
||||||
_test_param_values()
|
_test_param_values()
|
||||||
_test_shader_uniforms()
|
_test_shader_uniforms()
|
||||||
_test_fog_gate()
|
_test_fog_gate()
|
||||||
quit(Kit.finish("seal_mark_params_test"))
|
quit(Kit.finish("seal_mark_params_test"))
|
||||||
|
|
||||||
|
|
||||||
# R1–R3/R7 前置:五常量取值逐项相等(art-bible §8.2 定值)
|
# R1–R3/R7 前置:五常量取值逐项相等(定值面=本组断言)
|
||||||
func _test_param_values() -> void:
|
func _test_param_values() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:128 (环径与法阵定值组)
|
# oracle: design/ux/battle.md:128 (环径与法阵定值组)
|
||||||
Kit.check("SEAL_RING_FRAC = 0.82〔seal批 V1〕", UiKit.SEAL_RING_FRAC == 0.82)
|
Kit.check("SEAL_RING_FRAC = 0.82〔seal批 V1〕", UiKit.SEAL_RING_FRAC == 0.82)
|
||||||
Kit.check("SEAL_WALL_FRAC = 0.11〔seal批 V2〕", UiKit.SEAL_WALL_FRAC == 0.11)
|
Kit.check("SEAL_WALL_FRAC = 0.11〔seal批 V2〕", UiKit.SEAL_WALL_FRAC == 0.11)
|
||||||
Kit.check("SEAL_ARM_FRAC = 0.156〔seal批 V2〕", UiKit.SEAL_ARM_FRAC == 0.156)
|
Kit.check("SEAL_ARM_FRAC = 0.156〔seal批 V2〕", UiKit.SEAL_ARM_FRAC == 0.156)
|
||||||
@@ -29,7 +29,7 @@ func _test_param_values() -> void:
|
|||||||
|
|
||||||
# R1–R3/R7:着色器存在+七个 uniform 名在文(参数注入面契约)
|
# R1–R3/R7:着色器存在+七个 uniform 名在文(参数注入面契约)
|
||||||
func _test_shader_uniforms() -> void:
|
func _test_shader_uniforms() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:128 (着色器参数化绘制组)
|
# oracle: design/ux/battle.md:128 (着色器参数化绘制组)
|
||||||
var src := FileAccess.get_file_as_string(SEAL_SHADER)
|
var src := FileAccess.get_file_as_string(SEAL_SHADER)
|
||||||
Kit.check("着色器文件存在且非空:%s〔seal批 V1〕" % SEAL_SHADER, src.length() > 0)
|
Kit.check("着色器文件存在且非空:%s〔seal批 V1〕" % SEAL_SHADER, src.length() > 0)
|
||||||
if src.length() == 0:
|
if src.length() == 0:
|
||||||
@@ -43,7 +43,7 @@ func _test_shader_uniforms() -> void:
|
|||||||
# R4 迷雾门控:seal_on × fog_state → 封印子件可见性(内部字段直查=受控例外——子件可见性无公开可观测面,
|
# R4 迷雾门控:seal_on × fog_state → 封印子件可见性(内部字段直查=受控例外——子件可见性无公开可观测面,
|
||||||
# 卡面 R4 断言即 prescribe 子件 visible 直查;对照表该行注记理由)
|
# 卡面 R4 断言即 prescribe 子件 visible 直查;对照表该行注记理由)
|
||||||
func _test_fog_gate() -> void:
|
func _test_fog_gate() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:128 (迷雾联动门控组)
|
# oracle: design/ux/battle.md:128 (迷雾联动门控组)
|
||||||
var u: Node2D = CELL_UNIT.new()
|
var u: Node2D = CELL_UNIT.new()
|
||||||
u.seal_on = true
|
u.seal_on = true
|
||||||
Kit.check("seal_on 即挂封印子件〔seal批 V4〕", u._seal_layer != null)
|
Kit.check("seal_on 即挂封印子件〔seal批 V4〕", u._seal_layer != null)
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ class AllMissingStage extends BattleStageView:
|
|||||||
|
|
||||||
|
|
||||||
func _initialize() -> void:
|
func _initialize() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:122 (舞台背景宿主——装载组)
|
# oracle: design/ux/battle.md:122 (舞台背景宿主——装载组)
|
||||||
call_deferred("_run")
|
call_deferred("_run")
|
||||||
|
|
||||||
|
|
||||||
func _run() -> void:
|
func _run() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:122 (B 区背景宿主组)
|
# oracle: design/ux/battle.md:122 (B 区背景宿主组)
|
||||||
_test_layout_ground_field()
|
_test_layout_ground_field()
|
||||||
await _test_background_selection()
|
await _test_background_selection()
|
||||||
await _test_background_fallback()
|
await _test_background_fallback()
|
||||||
@@ -42,7 +42,7 @@ func _run() -> void:
|
|||||||
|
|
||||||
# ---- V1 ground_h 字段与校验(表值/默认表 validate 空/三态拒绝族) ----
|
# ---- V1 ground_h 字段与校验(表值/默认表 validate 空/三态拒绝族) ----
|
||||||
func _test_layout_ground_field() -> void:
|
func _test_layout_ground_field() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:122 (连续地面层组)
|
# oracle: design/ux/battle.md:122 (连续地面层组)
|
||||||
var layout = load("res://data/tables/battle_layout.tres")
|
var layout = load("res://data/tables/battle_layout.tres")
|
||||||
Kit.check("布局表 ground_h = 100 且默认表 validate 为空〔舞台背景 V1〕",
|
Kit.check("布局表 ground_h = 100 且默认表 validate 为空〔舞台背景 V1〕",
|
||||||
int(layout.ground_h) == 100 and layout.validate().is_empty())
|
int(layout.ground_h) == 100 and layout.validate().is_empty())
|
||||||
@@ -75,7 +75,7 @@ func _make_stage() -> Node:
|
|||||||
|
|
||||||
# ---- V2 背景按 board_type 选图(直建默认 dungeon + 三值路径逐值对应 + 层序在世界之下) ----
|
# ---- V2 背景按 board_type 选图(直建默认 dungeon + 三值路径逐值对应 + 层序在世界之下) ----
|
||||||
func _test_background_selection() -> void:
|
func _test_background_selection() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:122 (三关变体选图组)
|
# oracle: design/ux/battle.md:122 (三关变体选图组)
|
||||||
var layout = load("res://data/tables/battle_layout.tres")
|
var layout = load("res://data/tables/battle_layout.tres")
|
||||||
var stage: Node = _make_stage()
|
var stage: Node = _make_stage()
|
||||||
await process_frame
|
await process_frame
|
||||||
@@ -104,7 +104,7 @@ func _test_background_selection() -> void:
|
|||||||
|
|
||||||
# ---- V3 缺图回退(目标缺→dungeon;全缺→平色兜底不崩不刷产品日志) ----
|
# ---- V3 缺图回退(目标缺→dungeon;全缺→平色兜底不崩不刷产品日志) ----
|
||||||
func _test_background_fallback() -> void:
|
func _test_background_fallback() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:122 (缺位回退组)
|
# oracle: design/ux/battle.md:122 (缺位回退组)
|
||||||
var s1: Node = MissingUnderdarkStage.new(null, load("res://data/tables/battle_layout.tres"))
|
var s1: Node = MissingUnderdarkStage.new(null, load("res://data/tables/battle_layout.tres"))
|
||||||
root.add_child(s1)
|
root.add_child(s1)
|
||||||
await process_frame
|
await process_frame
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class FakeDB:
|
|||||||
|
|
||||||
|
|
||||||
func _init() -> void:
|
func _init() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:154 (站桩呈现域缺陷扫掠组)
|
# oracle: design/ux/battle.md:154 (站桩呈现域缺陷扫掠组)
|
||||||
UiKit.motion_scale = 1.0
|
UiKit.motion_scale = 1.0
|
||||||
|
|
||||||
# ---- ⑤ 站桩按 id 解析(两口共用同名字敌载体)----
|
# ---- ⑤ 站桩按 id 解析(两口共用同名字敌载体)----
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func _read_source(rel_path: String) -> String:
|
|||||||
|
|
||||||
|
|
||||||
func _init() -> void:
|
func _init() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:154 (站桩呈现定值与素材绑定组)
|
# oracle: design/ux/battle.md:154 (站桩呈现定值与素材绑定组)
|
||||||
# ---- V5 血条填充 = 危险红 #A8321F(§4.2 语义物件显式落法) ----
|
# ---- V5 血条填充 = 危险红 #A8321F(§4.2 语义物件显式落法) ----
|
||||||
Kit.check("血条填充常量 = 危险红 #A8321F〔样张批 V5〕",
|
Kit.check("血条填充常量 = 危险红 #A8321F〔样张批 V5〕",
|
||||||
UiKit.HP_BAR_FILL.to_html(false) == "a8321f")
|
UiKit.HP_BAR_FILL.to_html(false) == "a8321f")
|
||||||
@@ -122,7 +122,7 @@ func _init() -> void:
|
|||||||
|
|
||||||
# ---- V13–V18 立绘显示档(迭代 48 卡②——显示档 = 三档绝对高,入包件 = 原稿紧裁零降采样) ----
|
# ---- V13–V18 立绘显示档(迭代 48 卡②——显示档 = 三档绝对高,入包件 = 原稿紧裁零降采样) ----
|
||||||
|
|
||||||
# 规格钉值(显示档定值单点 = art-bible §8.2;源高 = 原稿表值——旧降采样稿必红;
|
# 规格钉值(显示档定值单点 = 本测试钉值;源高 = 原稿表值——旧降采样稿必红;
|
||||||
# 显示宽 = round(源宽×档高/源高),食人魔酋长 157 为已接受超宽项):
|
# 显示宽 = round(源宽×档高/源高),食人魔酋长 157 为已接受超宽项):
|
||||||
# 键 → [源高, 显示档高, 显示宽]
|
# 键 → [源高, 显示档高, 显示宽]
|
||||||
const _DISPLAY_SPEC := {
|
const _DISPLAY_SPEC := {
|
||||||
@@ -137,7 +137,7 @@ func _enemy_tex_path(key: String) -> String:
|
|||||||
|
|
||||||
|
|
||||||
func _check_display_tier() -> void:
|
func _check_display_tier() -> void:
|
||||||
# oracle: design/gdd/ux/battle.md:154 (显示档与分辨率绑定组)
|
# oracle: design/ux/battle.md:154 (显示档与分辨率绑定组)
|
||||||
# V13/V15 九键逐一:真实入口 StandeeBody → set_data(enemy_id) → set_portrait_texture(真纹理) → portrait_probe
|
# V13/V15 九键逐一:真实入口 StandeeBody → set_data(enemy_id) → set_portrait_texture(真纹理) → portrait_probe
|
||||||
for key: String in _DISPLAY_SPEC:
|
for key: String in _DISPLAY_SPEC:
|
||||||
var spec: Array = _DISPLAY_SPEC[key]
|
var spec: Array = _DISPLAY_SPEC[key]
|
||||||
|
|||||||
@@ -673,7 +673,7 @@ func _smoke_contrast_inks() -> void:
|
|||||||
# oracle: design/gdd/systems/表现与支撑/HUD框架.md:281 (对比度墨色锚组)
|
# oracle: design/gdd/systems/表现与支撑/HUD框架.md:281 (对比度墨色锚组)
|
||||||
print("--- UI 残余 <4.5:1 文字位换墨(V4 对比度锚定)---")
|
print("--- UI 残余 <4.5:1 文字位换墨(V4 对比度锚定)---")
|
||||||
var uikit_s = load("res://presentation/views/ui_kit.gd")
|
var uikit_s = load("res://presentation/views/ui_kit.gd")
|
||||||
var stage: Color = uikit_s.SLOT_BACKDROP # 舞台底对比锚改读合并目标(art-bible §4.1 换色合并③——阈值与判据不变)
|
var stage: Color = uikit_s.SLOT_BACKDROP # 舞台底对比锚读合并目标色(换色合并沿革查 git 提交史——阈值与判据不变)
|
||||||
var r_order := _theme_contrast(uikit_s.GOLD_BRIGHT, stage)
|
var r_order := _theme_contrast(uikit_s.GOLD_BRIGHT, stage)
|
||||||
Kit.check("V4 顺位徽标/重甲徽标 GOLD_BRIGHT 对舞台底 %.2f:1 ≥4.5:1" % r_order, r_order >= 4.5)
|
Kit.check("V4 顺位徽标/重甲徽标 GOLD_BRIGHT 对舞台底 %.2f:1 ≥4.5:1" % r_order, r_order >= 4.5)
|
||||||
var r_ward := _theme_contrast(uikit_s.HERO_BLUE_BRIGHT, stage)
|
var r_ward := _theme_contrast(uikit_s.HERO_BLUE_BRIGHT, stage)
|
||||||
@@ -805,7 +805,7 @@ func _all_labels(root: Node) -> Array:
|
|||||||
# 只读性连接巡检与零动效断言归 ui_struct_probe 呈现侧,本段只管数据面+旧档载入显示
|
# 只读性连接巡检与零动效断言归 ui_struct_probe 呈现侧,本段只管数据面+旧档载入显示
|
||||||
# (v5 样档升 v6——完成定义 6「计数域缺省补零、页正常显示」))----
|
# (v5 样档升 v6——完成定义 6「计数域缺省补零、页正常显示」))----
|
||||||
func _career_overlay_projection() -> void:
|
func _career_overlay_projection() -> void:
|
||||||
# oracle: design/gdd/ux/camp.md:45 (生涯页只读投影组)
|
# oracle: design/ux/camp.md:45 (生涯页只读投影组)
|
||||||
print("--- 生涯页·只读投影一致性(隔离档 smoke_meta_career/career_v5)---")
|
print("--- 生涯页·只读投影一致性(隔离档 smoke_meta_career/career_v5)---")
|
||||||
var sv = _meta_new_save(_META_SMOKE_PATHS[9])
|
var sv = _meta_new_save(_META_SMOKE_PATHS[9])
|
||||||
var mp = load("res://core/meta_progression.gd").new(_db, sv)
|
var mp = load("res://core/meta_progression.gd").new(_db, sv)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# tests/unit/presentation/type_glow_test.gd — 未开格类型微光数据面直验
|
# tests/unit/presentation/type_glow_test.gd — 未开格类型微光数据面直验
|
||||||
# 断言面 = 纯函数/常量域(无渲染):① 九 cell_type → 五组封闭判定(含清单外显式失败、
|
# 断言面 = 纯函数/常量域(无渲染):① 九 cell_type → 五组封闭判定(含清单外显式失败、
|
||||||
# 禁子串匹配、与卡顶带 tg_band 的归组差异锚定——Q3 甲案两带并存);② 五组色值冻结面
|
# 禁子串匹配、与卡顶带 tg_band 的归组差异锚定——Q3 甲案两带并存);② 五组色值冻结面
|
||||||
# (HSV 对照 art-bible §4.2 冻结值只准动明度档——群伤组
|
# (冻结值落码于本文件 FROZEN/IMPL,只准动明度档——群伤组
|
||||||
# #A61D37 为终值,本测试即该判据的守门件);③ 呈现参数锚定(α170/带宽 cell÷8);④ 合成空间
|
# #A61D37 为终值,本测试即该判据的守门件);③ 呈现参数锚定(α170/带宽 cell÷8);④ 合成空间
|
||||||
# 阶梯单调 + 相邻组模型 CR ≥1.20(色弱灰度互辨的数据面预判,终审在渲染取证探针实测);
|
# 阶梯单调 + 相邻组模型 CR ≥1.20(色弱灰度互辨的数据面预判,终审在渲染取证探针实测);
|
||||||
# ⑤ probe API 形状(默认开/空态键集)。
|
# ⑤ probe API 形状(默认开/空态键集)。
|
||||||
@@ -13,13 +13,13 @@ const Kit := preload("res://tests/unit/test_kit.gd")
|
|||||||
const UiKitScript := preload("res://presentation/views/ui_kit.gd")
|
const UiKitScript := preload("res://presentation/views/ui_kit.gd")
|
||||||
const BoardViewScript := preload("res://presentation/views/board_view.gd")
|
const BoardViewScript := preload("res://presentation/views/board_view.gd")
|
||||||
|
|
||||||
# art-bible §4.2 样张 v2 冻结五组(F3 抄录表——本测试的冻结面基准)
|
# 样张 v2 冻结五组(F3 定值面=本表——本测试的冻结面基准)
|
||||||
const FROZEN := {
|
const FROZEN := {
|
||||||
"BUFF": Color8(0xD6, 0xC1, 0x3A), "HEAL": Color8(0x5C, 0xB8, 0x3A),
|
"BUFF": Color8(0xD6, 0xC1, 0x3A), "HEAL": Color8(0x5C, 0xB8, 0x3A),
|
||||||
"PIERCE": Color8(0x2E, 0x9E, 0x9E), "MAGIC": Color8(0x7B, 0x5B, 0xD6),
|
"PIERCE": Color8(0x2E, 0x9E, 0x9E), "MAGIC": Color8(0x7B, 0x5B, 0xD6),
|
||||||
"AOE": Color8(0xFF, 0x2D, 0x55),
|
"AOE": Color8(0xFF, 0x2D, 0x55),
|
||||||
}
|
}
|
||||||
# 九 cell_type 全值域 → 期望组号(art-bible §4.2 成员集合逐字照抄)
|
# 九 cell_type 全值域 → 期望组号(微光五组成员集合,与 ui_kit 封闭判定逐字一致)
|
||||||
const TYPE_EXPECT := {
|
const TYPE_EXPECT := {
|
||||||
"attack": UiKitScript.GLOW_BUFF, "defense": UiKitScript.GLOW_BUFF,
|
"attack": UiKitScript.GLOW_BUFF, "defense": UiKitScript.GLOW_BUFF,
|
||||||
"weaken": UiKitScript.GLOW_BUFF, "action": UiKitScript.GLOW_BUFF,
|
"weaken": UiKitScript.GLOW_BUFF, "action": UiKitScript.GLOW_BUFF,
|
||||||
@@ -79,7 +79,7 @@ func _test_grouping_closed() -> void:
|
|||||||
UiKitScript.glow_color_for_group(99) == Color(0, 0, 0, 0))
|
UiKitScript.glow_color_for_group(99) == Color(0, 0, 0, 0))
|
||||||
|
|
||||||
|
|
||||||
# ② 冻结色相面:逐组 HSV 对照 art-bible §4.2 冻结值——只准动明度(ΔH≤0.2°/ΔS≤0.01)
|
# ② 冻结色相面:逐组 HSV 对照本文件 FROZEN 冻结值——只准动明度(ΔH≤0.2°/ΔS≤0.01)
|
||||||
func _test_frozen_hue_face() -> void:
|
func _test_frozen_hue_face() -> void:
|
||||||
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
|
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
|
||||||
for g in FROZEN:
|
for g in FROZEN:
|
||||||
@@ -98,7 +98,7 @@ func _test_frozen_hue_face() -> void:
|
|||||||
Kit.check("群伤组专项:V=0.65 明度档( provisional 域内)", absf(aoe_m.v - 166.0 / 255.0) < 0.002)
|
Kit.check("群伤组专项:V=0.65 明度档( provisional 域内)", absf(aoe_m.v - 166.0 / 255.0) < 0.002)
|
||||||
|
|
||||||
|
|
||||||
# ③ 呈现参数锚定(art-bible §4.2 v2 冻结参数)
|
# ③ 呈现参数锚定(v2 冻结参数,定值面=本测试与 ui_kit 常量)
|
||||||
func _test_render_params() -> void:
|
func _test_render_params() -> void:
|
||||||
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
|
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
|
||||||
Kit.check("泛光强度 α = 170/255(v2 呈现参数冻结)",
|
Kit.check("泛光强度 α = 170/255(v2 呈现参数冻结)",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
> 版本 v1 | 2026-10-30 | 目标引擎 Godot 4.7.2-stable(`gl_compatibility` / 纯 2D)| 平台 PC Windows 先行 | 设计分辨率 1280×800 基座 + 1920×1080(全局 1.35× 等比)
|
> 版本 v1 | 2026-10-30 | 目标引擎 Godot 4.7.2-stable(`gl_compatibility` / 纯 2D)| 平台 PC Windows 先行 | 设计分辨率 1280×800 基座 + 1920×1080(全局 1.35× 等比)
|
||||||
> 性质:评估过程件,对应美术师交付物「美术资产清单」+「美术规格与预算」两章合并(一次问三事,不拆两份重复)。**未改任何权威文档与 `game/` 文件**;结论若要进 `design/` 走 doc-design 登记 + 用户发令。
|
> 性质:评估过程件,对应美术师交付物「美术资产清单」+「美术规格与预算」两章合并(一次问三事,不拆两份重复)。**未改任何权威文档与 `game/` 文件**;结论若要进 `design/` 走 doc-design 登记 + 用户发令。
|
||||||
> 事实源:`design/art/art-assets-checklist.md`(需求)· `art-status-checklist.md`(现状)· `art-bible.md` §8(尺寸定值单点)· `asset-path-map.md`(路径)· `game/assets/` 实扫 · `game/project.godot` 与 117 份 `.import`(引擎现状)· `design/gdd/ux/battle.md` 板形表 · `game/data/tables/enemy.tres`。
|
> 事实源:`design/art/art-assets-checklist.md`(需求)· `art-status-checklist.md`(现状)· `art-bible.md` §8(尺寸定值单点)· `asset-path-map.md`(路径)· `game/assets/` 实扫 · `game/project.godot` 与 117 份 `.import`(引擎现状)· `design/ux/battle.md` 板形表 · `game/data/tables/enemy.tres`。
|
||||||
> 显存口径:`art-engine-handoff/scripts/asset_budget.py` 实算;格式按项目真实导入(`compress/mode=0` Lossless → 运行时解码为 RGBA8 = 4 B/px,关 mipmap)。Draw Call 与峰值显存**未真机实测**,只给内控线与估算口径。
|
> 显存口径:`art-engine-handoff/scripts/asset_budget.py` 实算;格式按项目真实导入(`compress/mode=0` Lossless → 运行时解码为 RGBA8 = 4 B/px,关 mipmap)。Draw Call 与峰值显存**未真机实测**,只给内控线与估算口径。
|
||||||
|
|
||||||
## 0. 结论先行
|
## 0. 结论先行
|
||||||
|
|||||||
@@ -49,6 +49,10 @@ FLOOR_L = 0.30 # 未开格底相对亮度地板(线性域)
|
|||||||
CEIL_SAT = 0.55 # 饱和度上限
|
CEIL_SAT = 0.55 # 饱和度上限
|
||||||
BANNED_HUE = (300.0, 345.0) # 禁入色相带(Boss 紫赤独占)
|
BANNED_HUE = (300.0, 345.0) # 禁入色相带(Boss 紫赤独占)
|
||||||
NEAR_EPS = 8 # 近色容差(三通道差全 <此值 即近色)
|
NEAR_EPS = 8 # 近色容差(三通道差全 <此值 即近色)
|
||||||
|
# 世界底层两子带门值(art-bible §2 只述「底层分两子带、间隔不小于门值」,数值归本件)──
|
||||||
|
BAND_LOW_TOP = 0.06 # 底层下沿带上沿(背景/舞台底件不得越界侵入上沿带)
|
||||||
|
BAND_HIGH = (0.08, 0.14) # 底层上沿带(已开格底——渲染面由 tile_palette 归一化目标 0.10 落带承载)
|
||||||
|
BAND_GAP = 0.02 # 两子带最小间隔
|
||||||
B_MIN_CH_DIFF = 8 # 机检 B|格底-微光可辨底线(三通道至少一通道 ≥此值)
|
B_MIN_CH_DIFF = 8 # 机检 B|格底-微光可辨底线(三通道至少一通道 ≥此值)
|
||||||
C_MODEL_TOL = 2 # 机检 C|样图与合成模型容差(±此值 /255)
|
C_MODEL_TOL = 2 # 机检 C|样图与合成模型容差(±此值 /255)
|
||||||
BOARD_TYPES = ["dungeon", "underdark", "deep_underdark"]
|
BOARD_TYPES = ["dungeon", "underdark", "deep_underdark"]
|
||||||
@@ -237,6 +241,36 @@ def gate_d(tiles):
|
|||||||
return all_pass, rows
|
return all_pass, rows
|
||||||
|
|
||||||
|
|
||||||
|
# ── 机检 E:世界底层两子带(资产侧门;下沿带成员=三关背景件,上沿带成员=已开格底,
|
||||||
|
# 其渲染面由 tile_palette.gd 归一化目标常量 0.10 承载、对比判据由 ui_contrast_probe 兜——
|
||||||
|
# 原图瓦片亮度≠渲染面〔装载归一化路径〕,不作本门判据)──
|
||||||
|
def gate_e():
|
||||||
|
rows = []
|
||||||
|
all_pass = True
|
||||||
|
# 结构自检:两子带不重叠且间隔达门值(常量自身恒真——防改常量时破结构)
|
||||||
|
check("E-struct", "下沿带上沿+间隔 ≤ 上沿带下沿(两子带不重叠)",
|
||||||
|
BAND_LOW_TOP + BAND_GAP <= BAND_HIGH[0],
|
||||||
|
"下沿带上沿 %.2f 间隔 %.2f 上沿带 %s" % (BAND_LOW_TOP, BAND_GAP, BAND_HIGH))
|
||||||
|
# 三关背景件 → 下沿带(只判上沿不越界;逐件读数落 stdout 供观感对照)
|
||||||
|
scene_dir = os.path.join(REPO, "game", "assets", "art", "scene")
|
||||||
|
for bt in BOARD_TYPES:
|
||||||
|
fn = "scene_stage_bg_%s.png" % bt
|
||||||
|
path = os.path.join(scene_dir, fn)
|
||||||
|
if not os.path.exists(path):
|
||||||
|
print("[阻塞] 素材缺位:%s" % path, file=sys.stderr)
|
||||||
|
sys.exit(2)
|
||||||
|
img = Image.open(path).convert("RGB")
|
||||||
|
pts = [(x, y) for x in range(img.width) for y in range(img.height)]
|
||||||
|
rgb = mean_rgb(img.load(), pts)
|
||||||
|
lin = rel_lum(rgb)
|
||||||
|
ok = lin <= BAND_LOW_TOP
|
||||||
|
all_pass = all_pass and ok
|
||||||
|
rows.append(("bg", bt, lin, ok))
|
||||||
|
check("E-bg-%s" % bt, "背景件 L ≤ 下沿带上沿 %.2f(不侵入上沿带)" % BAND_LOW_TOP,
|
||||||
|
ok, "RGB=%s L=%.4f%s" % (rgb, lin, "" if ok else " [越界红]"))
|
||||||
|
return all_pass, rows
|
||||||
|
|
||||||
|
|
||||||
# ── 样图绘制 ──
|
# ── 样图绘制 ──
|
||||||
PAGE_W, PAGE_H = 640, 1120
|
PAGE_W, PAGE_H = 640, 1120
|
||||||
MARGIN, HEAD, BLOCK_TITLE, GAP, LEGEND = 10, 60, 20, 30, 80
|
MARGIN, HEAD, BLOCK_TITLE, GAP, LEGEND = 10, 60, 20, 30, 80
|
||||||
@@ -447,8 +481,10 @@ def main():
|
|||||||
tiles = load_tiles()
|
tiles = load_tiles()
|
||||||
print("== S1 机检 D:三关铺底代表值 ==")
|
print("== S1 机检 D:三关铺底代表值 ==")
|
||||||
d_ok, d_rows = gate_d(tiles)
|
d_ok, d_rows = gate_d(tiles)
|
||||||
|
print("== S1b 机检 E:世界底层两子带 ==")
|
||||||
|
e_ok, _e_rows = gate_e()
|
||||||
if args.no_sheet:
|
if args.no_sheet:
|
||||||
return 0 if d_ok else 1
|
return 0 if (d_ok and e_ok) else 1
|
||||||
os.makedirs(args.art, exist_ok=True)
|
os.makedirs(args.art, exist_ok=True)
|
||||||
out = os.path.join(args.art, "glow-discrimination-sheet-2026-11-05.png")
|
out = os.path.join(args.art, "glow-discrimination-sheet-2026-11-05.png")
|
||||||
print("== S2 出并列样图 ==")
|
print("== S2 出并列样图 ==")
|
||||||
|
|||||||
@@ -38,9 +38,9 @@ IMAGE_PREFIXES = ("artwork/", "game/assets/", "design/art/references/", "design/
|
|||||||
# 4) 退役路径(目录或文件任一再现即 FAIL)
|
# 4) 退役路径(目录或文件任一再现即 FAIL)
|
||||||
RETIRED = ["production", "docs", "tests", "qa-data", "design/registry", "design/research",
|
RETIRED = ["production", "docs", "tests", "qa-data", "design/registry", "design/research",
|
||||||
"design/art/candidates", "production/mockups",
|
"design/art/candidates", "production/mockups",
|
||||||
"design/ux", "game/tools", "design/qa", "game/smoke"]
|
"game/tools", "design/qa", "game/smoke"]
|
||||||
# 5) design/ 一级子目录白名单(防 ad-hoc 新目录)
|
# 5) design/ 一级子目录白名单(防 ad-hoc 新目录)
|
||||||
DESIGN_SUBDIRS = {"art", "engineering", "gdd", "content-archive"}
|
DESIGN_SUBDIRS = {"art", "engineering", "gdd", "ux", "content-archive"}
|
||||||
# 6) design/art/ 内容白名单——美术只放 .md 文档与 references/ 参考图;
|
# 6) design/art/ 内容白名单——美术只放 .md 文档与 references/ 参考图;
|
||||||
# 审计报告属中间文档,按 doc-conventions §11 落 reports/,禁驻 art/
|
# 审计报告属中间文档,按 doc-conventions §11 落 reports/,禁驻 art/
|
||||||
ART_EXTS = {".md"}
|
ART_EXTS = {".md"}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
#### UI 贴图重构批——元进度件仍是程序化占位(2026-10-13 登记,来源=审计发现)
|
#### UI 贴图重构批——元进度件仍是程序化占位(2026-10-13 登记,来源=审计发现)
|
||||||
|
|
||||||
**实况**:元进度图标目前仍是程序化画出来的占位形态,没有上贴图(原登记见 [美术资产清单](design/art/art-assets-checklist.md))。规格已定——烛光黄 `#F6C667` 配木色 `#8A5A34`(见 [美术圣经](design/art/art-bible.md) §4.4),素材来源允许走"通用图标改色复用"低成本渠道。营地柜台贴图义务已随营地场景图形态终结(见 [camp](design/gdd/ux/camp.md));九宫格切片错位归「UI 氛围层与九宫格切片观感修」条。本条余元进度件贴图终稿,排 Beta。
|
**实况**:元进度图标目前仍是程序化画出来的占位形态,没有上贴图(原登记见 [美术资产清单](design/art/art-assets-checklist.md))。规格已定——烛光黄 `#F6C667` 配木色 `#8A5A34`(见 [美术圣经](design/art/art-bible.md) §4.4),素材来源允许走"通用图标改色复用"低成本渠道。营地柜台贴图义务已随营地场景图形态终结(见 [camp](design/ux/camp.md));九宫格切片错位归「UI 氛围层与九宫格切片观感修」条。本条余元进度件贴图终稿,排 Beta。
|
||||||
|
|
||||||
**缺口**:还差一次「自己画 vs 找 CC0 素材改色」的美术裁决(见 [美术资产清单](design/art/art-assets-checklist.md) §0 的复用渠道闸),裁决后才能定素材工单写卡。
|
**缺口**:还差一次「自己画 vs 找 CC0 素材改色」的美术裁决(见 [美术资产清单](design/art/art-assets-checklist.md) §0 的复用渠道闸),裁决后才能定素材工单写卡。
|
||||||
|
|
||||||
@@ -309,11 +309,17 @@
|
|||||||
|
|
||||||
#### 美术圣经去数值化——定值改由机检件与数据表承载(2026-11-06 登记,来源=会话提及)
|
#### 美术圣经去数值化——定值改由机检件与数据表承载(2026-11-06 登记,来源=会话提及)
|
||||||
|
|
||||||
**实况**:本条立文档分层规矩——美术圣经与 GDD 同级属 Meta 层,只写概念与方向(可写「两者存在相对亮度关系」),不写具体数值约束;阈值与准入判定归执行件,执行件登记面=[art-pipeline-tools](design/art/art-pipeline-tools.md)(三关色板互辨抽测件本批已入册)。
|
**实况**:文档设计已闭合(2026-11-07 用户裁两准则:有落点补指针、无落点建脚本承载)——art-bible v3.44 全文定值剥离+指针句式(定值单点纪律入头注,执行件门值登记面=[art-pipeline-tools](design/art/art-pipeline-tools.md)「执行件门值登记」节);同批落地=世界底层两子带门(互辨抽测件 E 门)+动画帧数规格守门测试+token 板两两互查守门测试(86 套 manifest);下游复写换代=术语表/08-Alpha/camp/battle/character-design/两清单。
|
||||||
- 相关文档:纪律出处=[doc-conventions §5 禁实现内容行](design/engineering/doc-conventions.md);同款先例=[08-Alpha版本标准](design/gdd/08-Alpha版本标准.md) 二节「面值一律不在此抄录,以数据表为准」
|
- 相关文档:[art-bible](design/art/art-bible.md) v3.44;纪律出处=[doc-conventions §5](design/engineering/doc-conventions.md);同款先例=[08-Alpha版本标准](design/gdd/08-Alpha版本标准.md)
|
||||||
|
|
||||||
**缺口**:还差一次清点与归属设计讨论——圣经全部定值逐条定落点(机检件/代码常量/数据表/golden 基线)、定文档侧指针句式、核下游反向引用面(ux 文档、需求卡片、探针注引圣经定值之处)。
|
|
||||||
|
|
||||||
**改动面**:文档+工具代码
|
**改动面**:文档+工具代码
|
||||||
|
|
||||||
**状态**:待文档设计
|
**状态**:文档设计已闭合+待执行
|
||||||
|
|
||||||
|
#### 色板近色欠账六对清偿(2026-11-07 登记,来源=批次移交)
|
||||||
|
|
||||||
|
**实况**:art-bible §4.1 全板重扫六对三通道差全低于容差的清偿义务自圣经迁出(去数值化批);常量面四对(DIM_NIGHT↔INK_ROUTE/INK↔BG_OVERLAY/BG_OVERLAY↔BG_ROOT/BG_BRIGHT↔BG_MAP_TOP)在册于 `palette_token_pairwise_test.gd` 豁免账(标〔欠账〕),素材侧两对(迷雾合成底 3e3731/3e4048/3f4147 伙伴)随素材批清偿。清偿=逐对并入最近既有色并从豁免账移除。证据=`game/tests/unit/presentation/palette_token_pairwise_test.gd` 豁免账四对标〔欠账〕+art-bible §4.1 换色合并欠账条迁出句。
|
||||||
|
|
||||||
|
**改动面**:游戏代码+美术素材
|
||||||
|
|
||||||
|
**状态**:待执行
|
||||||
Reference in new issue
Block a user