Files
gplan-2/design/gdd/d1-hud-framework.md
T
2026-09-14 18:18:49 +08:00

682 lines
78 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# D1 HUD 与界面框架(HUD & UI Framework)
> **状态**:Designed · **版本**:v2 · 2026-09-14 · 作者:user + agents
> **承载支柱**:P1 主("我算对了"看得见的感知面)· P2 主(逐行归因的呈现半边)· P4(地牢氛围容器) · **层级**:Layer 4 Presentation · Milestone MVP(设计顺序第 10 位)
> **一句话**:D1 把 A1–B4 的全部玩法事实变成玩家看得见、点得动、归因得了的界面——零玩法状态的双层边界呈现框架。
> **推演件**:`design/gdd/analysis/d1-hud-framework.md`(本文件只收结论,理由在那里)
## 设计目的
D1 是项目首个零玩法上游假设的表现层系统:战斗屏(MVP 唯一玩法屏,五区常驻双舞台布局,屏级 spec = `design/ux/battle.md`)+ 一族共享呈现设施——toast 提示体系、模态覆盖层家族、输入翻译、模态层级管理、面向呈现的信号载荷契约、ux 遥测。少了 D1,A2 的三事件流没有读者、B1 的流水协议没有呈现面、27 项上游呈现义务没有兑付点。
1. 「我看见的每一步都是真的」——四种格态一瞥可辨、每次拒绝可感知、结算逐行可归因(P1 感知面)。
2. 「这个结果是我哪步扫雷带来的」——结算明细逐行兑现且每行带来源标注;四类未生效行不静默、零值行不被吞(P2 呈现半边)。
3. 「挖掘期一块干净的玻璃,结算期一场丰收」——能量档转场由 D1 承载:挖掘 2/10 → 结算 7/10 → 清图 8/10 → 失败 1/10(P4 容器)。
4. 「完美被加倍看见」——完美排雷全屏喝彩级反馈、标中旗与 H2 清图奖励金框行(高光节拍)。
5. 界面绝不替玩家思考、绝不静默改判、绝不用装饰伪装逻辑差异——玩家对 D1 的正确感觉是"一块干净的玻璃"。
## 系统范围
负责:
- 五区布局落位与常驻组件呈现形态(战斗屏)
- 输入翻译(鼠标意图 → A2 意图对象)与单意图帧收集
- toast 提示体系 / 图例面板 / 一次性提示
- 模态覆盖层家族(图例 / 明细回看 / 胜负终局)与模态层级纪律
- 13 项面向呈现的信号载荷 schema 与消费侧断言
- 命令式回执刷新面(零事件外发动作的界面刷新契约)
- 程序化占位策略与 art-bible §4.6 键位映射表挂接
- ux 遥测六行族(playtest JSONL `ux` 行)
- F1 呈现几何与 F2 可读性判据的执行
不负责:
- 任何玩法状态与玩法数值(各玩法 GDD;数值表归 D2)——读经核心只读面、写经组合根
- 合法性判定与机制语义裁定(A2 / A3 / B1 等上游系统)
- 屏级布局/组件/交互/动画时长的裁决权威(`design/ux/battle.md`)
- 美术裁决与终稿资产(art-bible / asset-spec 批);动画密度(B5)
- 音频(D4)· 教学内容(D5)· 本地化文本生产(D6——D1 仅消费契约)
- 任何随机消费(呈现层零 RNG)
## 核心循环
```
玩家输入(D 区,仅挖掘期可交互;全部操作纯鼠标可完成——Gamepad Partial 非 MVP)
│ 左键已开格 = 移动 ─ 左键未开相邻格 = 挖 ─ 右键 = 插拔旗 ─ 停手按钮 = settle_batch([stop])
▼
单意图帧收集(一帧内 collected 意图整批;stop 点击终结当帧收集;F4 语义序仲裁退为防御性兜底)
▼
组合根 ──► A2 settle_batch(intents) [唯一写路径;零直调 A3]
│
├─ 回执链(零事件外发动作:旗插拔 / 移动 / AP / RAP / 库存——规则 2 命令式回执)
│ settle_batch 返回 → 组合根立刻重查只读面(current_board / A3 getter / query_inventory)
│ → 视图 setter 只读注入 → 就地更新(字段级 setter,禁全量重建)
│
└─ 事件链(A2 cell_revealed / flag_judged → B1 按轮缓冲)
▼
B1 结算编排(七段)→ 步骤流(13 类行协议——呈现层唯一订阅面之一)
│
├─ 明细带:逐行来源标注「{行为} {值} → {目标}(来源)」→ 84px 实时流(挖掘期收起为 24px 摘要)
├─ 窗口锚点(授予段后、增益/减益段前):E 区原位激活(usable_now 投影;空库存 skip 不弹窗)
├─ 高光:flag_hit 金框行 ─ clear_reward_h2 金框 ─ perfect 独立高光行(全屏喝彩级)
├─ 状态栏刷新(B3 零信号外发):绑 B1 结算编排完成时点(命令式)
▼
判定段 → 判定行(终局呈现数据锚)→ presentation_snapshot()(despawn 前捕获——规则 18①)
▼
终局呈现(胜利金蜡封 / 失败暮蓝 overlay)→ 状态槽全清 + RAP 清零反馈(battle_over)
▼
level_clear(关卡末)→ 库存清空反馈「剩余道具 ×N」→ 下一节点 / 返回(runner 推进,写经组合根)
```
| 出口 | 触发 | 呈现动作 | 约束 |
|---|---|---|---|
| 继续挖掘 | settle_batch 回执、轮次未结束 | 命令式重查刷新对应面;明细带保持上轮摘要 1 行 | 每帧至多一批提交(单意图帧) |
| 结算展示 | `round_end`(A2 棋盘路径 / A3 stopped 直发——双发射源同构) | D 区锁输入(去饱和 + 金橙色相偏移、明度不变、数字保持全对比);明细带展开 84px 逐行兑现;阶段指示→"结算中";能量 7/10 | 呈现订阅面 = B1 步骤流;零直订 A2/A3 |
| 清图换图 | cleared 判定 | 金粒喷泉 + 彩纸 3–5s 即收;H2 清图奖励行金框强调;随后换新图 install(200ms 淡入) | 完美排雷高光叠加于清图瞬间之上 |
| 道具窗口 | B1 授予段完成(窗口锚点信号) | E 区原位激活(规则 13);选用/跳过 → 回结算流(结算阶段续) | 空库存直接 skip 不弹窗、结算零停顿 |
| 战斗终局 | 判定行 verdict=win / lose | 胜利 = 金蜡封 + 暖白金 overlay;失败 = 暮蓝 overlay(明度不变);终局数据全部来自流水行 + `presentation_snapshot()` | 出口 = 下一节点(win)/ 返回(lose)——写经组合根 |
| 关卡结束 | level_clear 编排 | 库存清空反馈「剩余道具 ×N 随关卡结束清空」(N = 清空前快照计数) | 与 battle_over 反馈不合并、时序不倒挂 |
## 呈现边界与数据通道
### 规则 1:界面只当翻译不当裁判——数值不写死、对错不自己判、核心数据不碰
1. D1 显示任何玩法数字时,全部从上游系统只读接口现读现显;不写死玩法数值。
2. D1 遇到"动作合不合法、结果算什么意思"时一律交上游裁定;只把裁定结果翻译成画面,不自行判对错。
3. 玩家改变游戏状态的操作(挖格 / 插旗 / 选道具),D1 只递话;写调用唯一发生在组合根一处。
4. 界面单元只做两件事:向外发信号、被 setter 注入数据后就地刷新(字段级 setter,禁全量重建)。
依据:视图单元九件套 = BoardView / HUDView / HudPresenter / BattleLogView / ItemWindowOverlay / NodeOverlay / LevelStripView / TunePanel / UiKit(切片九单元形态转正);读表口径 = D2 Rule 1 对呈现消费面的适用;写路径唯一入口 = 组合根(ADR-0003 Key Interfaces)。无计算。
### 规则 2:界面听消息只走中转,不私接玩法系统的线
1. D1 永不直接订阅 A2 / A3 的通知;要听的消息全部由组合根接线转发,或直接来自 B1 步骤流信号与 runner 信号。
2. 棋盘 / AP / RAP / 库存等"不发通知"的数据面,D1 在动作调用返回后由组合根立刻重查只读面刷新(命令式回执);不干等通知信号。
依据:订阅纪律固化自 ADR-0001;battle.md §Events Fired 的"呈现订阅 A2 三事件"表述按本条收窄为"经组合根转发或命令式回执"(冲突清单⑥,见 analysis 附录 C)。无计算。
### 规则 3:读数据只走登记过的口子,内部字段一律不碰
1. D1 要显示的每个数据只允许从成文读数清单(下表)拿;清单之外的私有字段直读一律禁止。登记载体 = registry `d1_presentation_surface`。
| 数据从哪来 | 允许读的口子 |
|---|---|
| A2 扫雷 | `current_board()`(格态/旗/小人/变异只读投影)、`reveal_record()`、`compute_move_path(cell)`(不可达返回空——预览与执行同源) |
| A3 行动经济 | `phase / ap / rap / last_round_end`(getter-only) |
| B1 结算编排 | `presentation_snapshot() / is_battle_live() / stock_count() / query_reward_identity()` + 步骤流信号 |
| B2 战斗单位 | `hero_unit() / all_enemies()` 投影 |
| B3 / B4 | 零直读——经 B1 呈现面与流水投影(协作对象私有化) |
| runner | 节点链 / 当前节点 / HP 携带(A 区) |
依据:读接口白名单 = 上表(封装收口批 entry 39/40 转正);接口漂移见 OQ3(analysis 开放问题)。无计算。
### 规则 4:界面的每个动作都走同一条提交通道,总闸只有组合根
1. 玩家在界面上能发起的每类操作各只有一条提交通道,全部先过组合根这道总闸再转给对应系统;不存在绕过总闸的第二写入口。每帧至多提交一批意图(规则 7)。
| 玩家动作 | 提交通道 |
|---|---|
| 挖掘 / 插拔旗 / 移动 / 停手 | A2 `settle_batch(intents)`——停手也打包成 stop 走同一接口,不直调 A3 |
| 窗口里选道具 | B1 `submit_window_selection(窗口条目位置序)`——传窗口条目位置,不传库存句柄 |
| 弃图刷新 | 组合根提交刷新意图 → B1 `refresh_board` 编排:A3 扣费 → A2 retire → A1 generate → A2 install → B4 roll_board |
| 节点推进 | runner |
依据:窗口选择传位置序 = 切片缺陷④的契约修正;停手不经 A3 直调 = 义务 A2×6①。无计算。
### 规则 17:界面收到的每份消息,字段清单先写成合同
1. D1 消费的每一份跨系统载荷(事件 / 快照 / 回执 / 遥测行)都必须先把字段清单写成文(13 项,下表);清单既是实现契约也是消费侧断言——逐字段断言防缺字段、防多字段(信号参数没有运行时类型检查)。
| # | 载荷 | 来源 | 字段 schema | 状态 |
|---|---|---|---|---|
| 1 | `cell_revealed` | A2 | `{cell, kind ∈ {safe,mine}, digit(仅 safe 携带,恒真透传), variant_ids, channel ∈ {initial,chain,dig}, reward_eligible}` | A2 Core Rule 2 已 schema——引用 |
| 2 | `flag_judged` | A2 | `{cell, hit}`(轮末判定批、行主序) | 同上 |
| 3 | `round_end_board` / `round_end_stopped` | A2 / A3 | `{path_tag ∈ {ap_exhausted,cleared}, continuation_hint ∈ {same_board,new_board}}`(双发射源 payload 同构;信号实名 per ADR-0001) | 同上 + ADR-0001 |
| 4 | 流水行 ×13 类 | B1 | 公共 7 字段 `type / source_class / origin_cell(板级行可空)/ round_index / display_name / value / highlight?({flag_hit, clear_reward_h2, perfect_broken})` + 特有:伤害行/道具行(生效)→ `target`;效果行 → `effect_id` + `pool_value`;未生效四类 + 标旗未中行 → 聚合计数/批次字段;source_class 值域 ⊆ `source_label_map` 键集(B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack}) | B1 Core Rule 14 已 schema——引用+重述 |
| 5 | 结算快照 | B1 | `presentation_snapshot()` 返回(终局呈现数据面——despawn 前全量状态);独立 `settlement_snapshot` 信号系切片实现、B1 GDD 未登记契约——D1 现行消费 = 步骤流判定行 + `presentation_snapshot()`;若需独立信号回 B1 修订批补登记(OQ3) | 切片实现 / 契约待登记 |
| 6 | 意图回执 | A2 | `ActionOutcome{accepted, outcome ∈ {executed, voided, rejected}, reject_reason ∈ {board_face, resource_face, phase, board_invalid}, sub_reason(仅 board_face:not_adjacent / target_revealed / target_concealed / flag_present / flag_absent / no_path / out_of_catalog)}` | A2 已 schema——拒绝呈现数据源 |
| 7 | 资源面拒绝 | A3 | 无载荷(`try_spend` / `request_refresh` 仅 bool + debug 诊断)——呈现文案按动作上下文映射(诚实登记:资源面原因客户端推断,双源可辨由"动作种类 + 拒绝源"组合承载) | A3 AC 前言口径——引用 |
| 8 | 窗口载荷 | B1 组装 | `query_inventory` 逐件 `{item_id, source{cell,round}(不呈现于库存列表与 tooltip), 行值快照投影, 状态 InStock/Used}`(枚举序 = stock 受理序)+ `usable_now`(B1 守卫预判——满血治疗包 false) | B4/B1 已 schema——引用 |
| 9 | 奖励身份投影 | B1 呈现面 | `query_reward_identity(cell) → {reward_id, category, tier} \| null`(引用级投影;未开格可查但 MVP 不呈现) | B4 AC-2 已 schema——引用 |
| 10 | 状态投影 | B3 经 B1 | `query_active(side)` 元素 = 六归因字段 + `display_name` + 授予时快照 `(magnitude, unit)`;有效值 = L×快照 magnitude | B3 已 schema——引用 |
| 11 | 单位投影 | B2 | 敌单位七字段 `enemy_id/hp/max_hp/atk/heavy_multiplier/pattern/cap` + `beat` + 存活态;hero 投影 `hp/max_hp/atk`(经 `hero_unit()/all_enemies()`) | B2 已 schema——引用 |
| 12 | 零事件外发动作刷新面(命令式回执清单) | A2/A3/B3/B4 | 旗插/拔与移动成功(A2 零事件外发)→ `settle_batch` 回执后重查 `current_board()`;AP/RAP(A3 无推送)→ 每次写路径回执后重读 getter;状态效果(B3 零信号)→ B1 结算编排完成时点刷新;库存(B4 查询面)→ 写路径回执后重查 `query_inventory` / `stock_count()` | battle.md 更新触发注记——本行成文为契约 |
| 13 | D1 自有遥测 | D1 | `ux_round_input_ratio{ratio}` · `ux_round_exit{path_tag}` · `ux_refresh_attempt{result ∈ {accepted,rejected_rap,rejected_cap}, round_refresh_index ∈ [1,2]}` · `ux_window_choice{selected_item_id, usable_now, skip}` · `ux_reject{source ∈ {board,resource,phase}, sub_reason}` · `ux_hint_shown{hint_id}`——写 playtest JSONL `ux` 行族(playtest_logger 扩展) | 本 GDD 成文(新) |
依据:口径对齐 A2 三事件先例;消费侧断言 = ADR-0001"信号参数无运行时类型检查"的缓解;AC-24 承载。无计算。
### 规则 18:对象销毁前先拍快照——界面永远不回读已销毁的东西
1. 核心对象销毁前后,D1 不准"回头查"核心内部——只许用三样东西:消息载荷自带的数据、销毁前已取好的快照、封装好的只读投影。
| 细则 | 内容 |
|---|---|
| 销毁前捕获 | 终局与死亡的呈现数据(血条归零、卡体灰化、判定行)在核心对象销毁前已进流水行与快照 |
| 载荷自包含 | 每行流水自带来源 / 值 / 目标——界面不按行序反推目标状态机、不回查容器补数据 |
| 生命周期态禁读 | "战斗还能不能刷"只准问 `is_battle_live()` 与阶段投影,禁止读核心对象内部状态位 |
2. 敌卡死亡灰化后仍留场的呈现 = 就地更新保留的最后已知投影(规则 6);不回读 Dead 句柄以外的任何东西。
依据:销毁时序 = B1 判定段先于 battle_over 清理序列(快照含 despawn 前终局);自包含字段 = `target` / `effect_id` / `pool_value` / `origin_cell`;生命周期观测口经组合根;AC-20 静态扫描承载。无计算。
### 规则 20:切片里的临时名字统一换成正式名
1. D1 正式实现时,切片阶段的临时名换成本 GDD 正式名——只换名字、不改任何行为;`can_request_refresh` 不引入(上游 A3 没有这个接口)。
| 切片 provisional 名 | GDD 正式名 | 载体 |
|---|---|---|
| `request_refresh_active()` | `request_refresh` | A3 API(Active 相位受理——A3 Rule 11 现行口径) |
| `can_request_refresh()` | 不引入(A3 无此 API) | 入口可用性 = 组合根按只读观测量预判 + `request_refresh` 返回值兜底(规则 16) |
| `refresh_max_per_round` | `refresh_cap_per_round` | ActionEconomyTable 结构位(默认 2)——D2/registry 字段回写随实现批(A3 Schema 定稿节已预留) |
| `during_round`(A2 装板参数) | 无独立参数(受理域语义) | A2 `install_board` 受理域增 Active·仅弃图刷新路径(B1 `refresh_board` 编排内)——A2 Core Rule 3 |
| `round_end`(信号名) | 实名 `round_end_board`(A2 面)/ `round_end_stopped`(A3 面) | ADR-0001 信号实名映射 |
依据:入口可用性 = 组合根按只读观测量预判 + `request_refresh` 返回值兜底(规则 16);AC-25 grep 断言承载。无计算。
设计意图:呈现层零玩法状态、零写、零 RNG,是切片两起呈现层崩溃之后的结构性防线。
## 战斗屏布局与组件
### 规则 5:战斗画面分五区常驻同屏,棋盘与敌人不切场景
1. 1280×800 基座下(canvas_items/expand 拉伸),战斗画面固定分成五块常驻区域;战斗画面与扫雷图同屏常驻是硬形态:挖掘期敌人在上方待机可见、结算期原地展开明细,全程不切场景。
| 区 | 位置 / 尺寸 | 内容 | 数据源 |
|---|---|---|---|
| A 关卡进度条 | 全宽 28px | 节点链步进、当前高亮、已过暗金(LevelStripView) | runner |
| B 战斗画面 | 全宽 252px | 英雄卡 + 敌人卡 ×1–3 + 轮次·阶段指示 + 结算明细带(24px 摘要 / 84px 实时流) | B2 投影 + B1 步骤流 |
| C 角色信息 | 左下 240×520 | HP / 攻击值含修正显示 / RAP 数据框(直角细线素面)+ 状态效果槽固定 4 槽 + 小人立绘占位 | A3 getter + B3 投影(经 B1) |
| D 扫雷图 | 中下 ~760×520 | AP 点阵条 44px(停手按钮居左、图例与弃图刷新按钮居右——刷新按钮置雷图右上角)+ BoardView 棋盘 + toast 槽(上缘内侧) | A2 呈现面 |
| E 道具栏 | 右下 280×520 | 库存常读列表 + 窗口态原位激活 | B4 库存载荷(经 B1) |
依据:分区尺寸与组件落位的屏级权威 = `design/ux/battle.md`;拉伸模式 = ADR-0002;五区布局为结构冻结项(非调参 knob,修订走 GDD 流程)。无计算。
### 规则 6:敌人卡把"它是谁、下拍干什么、还剩几滴血"全写在脸上
| 卡面元素 | 玩家读出什么 |
|---|---|
| 敌像 | 这是谁——姿态即线索 |
| 血条 | 还剩多少血(hp/max_hp 数字可读) |
| 顺位徽标 | 它第几个出手(固定顺位可读) |
| 意图徽标 | 下一拍它要干什么——把即将执行的一拍的视觉状态摆出来;挖掘期全程可见,结算期不另设播片 |
| 行为环点 | 行动周期多长(环点数 = 环长)、现在走到哪(当前位置高亮) |
| 状态槽 | 它身上挂着什么增益减益 |
1. 伏击层数是全体敌人共享的一个数——各卡显示同一个值(数据源 = B1 流水经 B3 投影)。
2. 敌人死亡 = 血条直角递减归零 → 卡体灰化 + 碎裂退场;禁止瞬间消失。
3. 战斗段被短路掐灭的重击不单独产行动明细行(从行序可推断)。
4. 敌卡刷新必须就地更新(字段级 setter),禁止逐行重建——全量重建会把死亡灰化态吞掉。
依据:敌像线索键 = art-bible §4.6.4;意图预告时序 = B2 Rule 8⑤;义务源 = B2×4④ / D1×4③④;禁瞬消 = B2 资产下限;就地更新 = 切片 entry 36 教训。无计算。
### 意图线索映射目录(B2×4① 成文载体——继承 battle.md 目录 + art-bible §4.6.4 键契约;资产定稿归 B5,本表为 D1 侧成文占位)
| enemy_id(§4.6.4 冻结键集) | 视觉状态(下一拍预告) | 强度档位编码 | 环长编码 |
|---|---|---|---|
| grub(蛆虫) | 攻击 ×1 态 | 小体量墩形 = 轻击(§3.1 普通怪) | 环点 1(单拍环——无蓄力态 = 每拍都动手) |
| ambusher(伏击兽) | 攻击 / 蓄力 / 重击 ×3 态 | 垂直延伸体量 = 重击(heavy_multiplier 直觉) | 环点 = 拍数;蓄力态在场 = 环里空一拍("可以贪") |
- 预告时序 = 下一拍预告、挖掘期全程可见、结算期不另设意图播片(B2 Rule 8⑤);精确数值只在结算明细兑现(B2 Rule 8④——图像不报数)。
- 映射键 = enemy_id,跨 run 恒定、禁重掷(B2 Rule 8③);形状 + 色相双通道;蓄力姿态必须含可辨识蓄力记号(§4.6.4)。
- 资产需求下限三类(受击反馈 / 死亡表现 / 顺位标记)在程序化占位中先行(占位纹样挂键);终稿归 B5/样张批。
- 键集注记:切片 DND 更名(goblin/bugbear/ogre_chief)与 GDD 键集 {grub, ambusher} 差异登记冲突清单②——键位映射表以 GDD 键集为锚,切片更名随 B2/C3 修订批对齐。
### 规则 21:弹层排队进出——打开哪层,哪层就真的能用
1. 全部模态弹层(图例面板 / 明细回看 / 胜利 overlay / 失败 overlay)走同一张登记序栈:统一入栈出栈、后开置顶、关闭逐层恢复;任何一层打开时,被它遮住的东西要么隐藏、要么锁输入。
2. 道具窗口不是模态:不入栈,但锁 D 区输入(规则 13)。
3. TunePanel 显式初始化为不可见;它是切片调试入口,正式侧归 C4 天赋树——C4 落位时退役;Playtest 诊断按钮(卡死转储)保留为调试设施。
依据:退役时点 = battle.md OQ10 承接;AC-21 承载。无计算。
### 战斗屏状态机
触发全部来自核心信号/回执——呈现层不自持玩法状态;"阶段"投影枚举 = {挖掘中, 结算中, 道具窗口}。
| 屏状态 | 进入触发 | 变化 / 出口 |
|---|---|---|
| 挖掘阶段(默认态) | 轮次开始 / 结算完毕回 Active | D 区可交互(AP 条点亮、可挖域呼吸微光);B 区敌人待机(意图徽标全程可见);明细带收起为上轮摘要 1 行;能量 2/10 |
| 结算阶段 | `round_end`(A2 棋盘路径 / A3 stopped 直发) | D 区锁输入(棋盘去饱和 + 金橙色相偏移,明度不变,数字保持全对比);明细带展开 84px 逐行滚动;阶段指示→"结算中";能量 7/10;B1 步骤流驱动逐行兑现 |
| 道具窗口态 | B1 授予段完成(窗口锚点信号) | E 区原位激活(规则 13);空库存直接 skip 不弹窗;选用/跳过 → 回结算流(结算阶段续) |
| 清图瞬间 | cleared 判定(round_end) | 金粒喷泉 + 彩纸 3–5s 即收(§2.3);H2 清图奖励行金框强调;随后换新图 install |
| 完美排雷高光 | B1 高光行(perfect_sweep) | 全屏喝彩级:金光带加倍扫射 + 「完美排雷 ×2」横幅(叠加于清图瞬间之上) |
| 标中旗高光 | 流水行 highlight=flag_hit | 该旗化暴击弹道加重 + 明细行金框(当轮即兑付) |
| 敌人死亡呈现 | 流水行击杀标记(target 字段) | 该敌卡血条归零 → 灰化 + 碎裂退场(禁瞬消、就地更新) |
| 胜利终局 | 判定行 verdict=win | 金蜡封落于扫雷图区中央 + 暖白金 overlay + 判定行 + 状态槽全清反馈 + RAP 清零反馈;出口 = 下一节点(runner) |
| 失败终局 | 判定行 verdict=lose | 暮蓝氛围 overlay(明度不变)+ 旗化光点收回 + 判定行 + 明细回看 + 状态槽全清反馈 + RAP 清零反馈;出口 = 返回 |
| Boss 遭遇变体 | encounter=boss | 战斗开始一次性紫赤影子爬棋盘 + 敌卡体量最大 + 阶段指示附 Boss 名 |
| 雾图变体 | 板含雾格 | 雾纹带 + 首遇提示(每 run 一次)+ 已开雾格 tint 残留 + 雾区全开合并域完成信号 |
| 空态:无状态效果 | query_active 双侧空 | 状态槽隐藏、数据框上移补位(规则 11) |
| 空态:零库存 | 关卡初 / 清空后 | E 区「道包空空——安全格里藏着补给」(指引性空态,非报错) |
| 调试变体 | 测试模式 | TunePanel 入口(正式侧归 C4 退役)+ Playtest 诊断按钮 |
不变式:全部状态触发来自核心信号/回执——呈现层不自持玩法状态;模态子栈(规则 21 统一登记序)= 图例面板 / 明细回看 / 胜利 overlay / 失败 overlay——任一打开时遮挡物隐藏或输入锁定;非模态层 = toast(自动消退)与窗口态(锁 D 区)。
## 挖掘输入与棋盘可读
### 规则 7:鼠标点哪就是哪个意思,一帧内的操作合成一批提交
| 鼠标操作 | 翻译成 |
|---|---|
| 左键点已开格 | 移动(免费) |
| 左键点未开的相邻格 | 挖 |
| 右键 | 插旗 / 拔旗 |
| 点停手按钮 | 提交 stop——本轮结束 |
1. 单意图帧:一帧内收集到的意图整批提交,点到停手当帧收集立即终结;F4 语义序仲裁只作防御性兜底(生产面造不出会乱序的输入)。
2. 悬停预承诺:光标按目标切换三种语义、目标格边框高亮——点下去会发生什么,先看见再点。
3. 可挖域常驻指示:小人八向相邻的未开格呼吸微光,是挖掘期唯一在动的元素。
4. 悬停不可挖域 = 禁止光标 + 每 run 一次提示「需先走近(点击已开格移动,免费)」。
5. 点击远格自动"先移动再挖"的复合意图本期不做(见 P1/P2 后置表)。
依据:光标三语义见「光标语义」;no_adjacent 提示见「一次性提示 hint_id」;义务源 = A2×6①③⑥。无计算。
### 规则 8:悬停已开的格,先画给你看小人会怎么走
1. 玩家悬停任何已开格时,D1 立刻把小人到该格的合法路径用蓝色细线点迹画出——它是合法性指示,不是穿行动画。
2. 移动执行用不超过 150 毫秒的短滑表现;不做"穿行动画轨道"。
3. 路径数据 = `compute_move_path` 的 BFS 结果(不可达返回空)——预览与执行同源。
依据:短滑 ≤150ms 与再议挂 playtest 观测(battle.md OQ5,knob = move_slide_ms);义务源 = A2×6⑤(继承 battle.md 布局决策 D3)。无计算。
### 规则 9:四种格子一眼分得清,黑白截图也能逐格分类
1. 四种格态必须一眼可辨,灰度截图下也能逐格分类——这是左键双义的消歧前提(点已开格 = 移动、点未开格 = 挖),误挖不可逆(花 1 AP、可能触雷)。
2. 已引爆的雷格要"可通行可读":已开的底 + 巢穴纹(危险红族)+ 可作移动目标的视觉线索。
3. 数字显示判定数据源 = `variant_ids`(digit 恒真透传、雾格隐藏呈现——A2 Core Rule 2);呈现层禁读真实数字自行判定。
依据:绘制优先级栈 = 数字 > 小人 > 旗 > 徽章 > 变异纹理 > 底色,任何元素不遮挡数字、小人与旗不得覆盖文本(art-bible §1.2);义务源 = A2×6②④。无计算。
### 四种格态(A2×6②——灰度截图逐格可分类)
| 格态 | 视觉构成 | 语义 |
|---|---|---|
| 已开 0 格 | 裸土地板 | 携带"八邻无雷"推理信息——与已开雾格必须灰度可判定区分(混淆即污染推理) |
| 已开雾格 | 地板无字 + 底色层淡雾 tint 残留 | 雾格只是不显示;tint 为残留视觉锚(battle.md OQ8 采纳) |
| 未开格 | 掩尘完整砖 | 左键 = 挖(1 AP) |
| 未开雾格 | 掩尘砖 + 雾纹带 | 左键 = 挖;雾语义 = 无雷盲区(图例恒在条目) |
### 光标语义(A2×6③⑤——悬停预承诺)
| 光标 | 悬停目标 | 伴随指示 |
|---|---|---|
| 移动箭头 | 已开格 | `compute_move_path` 路径蓝细线点迹(规则 8)+ 目标格边框高亮 |
| 挖镐 | 可挖未开格 | 目标格边框高亮(可挖域另有常驻呼吸微光) |
| 旗形 | 旗插拔语义 | 目标格边框高亮 |
| 禁止 | 不可挖域 | + 首 run 一次 no_adjacent toast |
### 规则 15:雾格有雾的样子,整片雾开完只报一次"开完了"
1. 未开的雾格 = 掩尘完整砖 + 雾纹带——雾身份走形状通道、色相不承载。
2. 开过的雾格 = 地板无字 + 底色层淡雾 tint 残留——残留 tint 与"已开 0 格"必须灰度可判定区分(0 格携带"八邻无雷"推理信息,混淆即污染推理)。
3. 整片连续雾区全开时,完成信号以视觉合并域为单位一次呈现——相邻两个雾区规则上是独立实例、呈现上合并成一片;禁止逐实例响两次。
依据:雾语义条目(无雷盲区)见图例(规则 14);tint 与完成信号随雾重设计批可复核(art-bible 雾格资产占位——内容封禁期);双雾区相邻 = A4 EC11(边界情况表);义务源 = A4×3③。无计算。
### 一次性提示 hint_id(封闭枚举——遥测值域与去重键)
| 值 | 触发 | 必含要点 | 频次 |
|---|---|---|---|
| `fog_first`(雾首遇——A4×3②) | 首个实际含雾格的板进入可操作状态(挖掘阶段开始;生成期一次查询即判定,免疫降级板误触发) | 无雷盲区不赌命 / 雾格不传播连锁(连锁止于雾界属正常)/ 雾内插旗纯损 | 每 run 一次 |
| `chord`(chord 肌肉记忆——A2×6③) | 经典扫雷玩家首日尝试双击快开 | 本作无双击快开——插旗后轮末自动判定标中;点数字格可移动小人 | 每 run 一次 |
| `no_adjacent`(不可挖域——规则 7) | 不可挖域悬停 | 需先走近(点击已开格移动,免费) | 每 run 一次 |
- hint_id 封闭枚举 = 上表三值;拒绝 / voided / 零合法板 toast 族不占 hint_id(拒绝须每次可感知——见边界情况表)。
- 文案定稿权归实现期文案 pass(本 GDD 只锁必含要点与形态约束)。
### 拒绝与 voided 呈现映射(A2×6⑥——映射源 = reject_reason + sub_reason)
| 拒绝源 | 触发 | 呈现动作 | 文案 |
|---|---|---|---|
| board_face·not_adjacent | 挖非相邻格 | 目标格旗朱 `#C63D22` 边框闪 + toast | 「需先走近」 |
| board_face·target_revealed | 目标已开 | 同上 | 「该格已翻开」 |
| board_face·target_concealed | 目标未探明 | 同上 | 「该格未探明」 |
| board_face·flag_present | 目标有旗 | 同上 | 「须先拔旗」 |
| board_face·flag_absent | 目标无旗 | 同上 | 「该格没有旗」 |
| board_face·no_path | 路径不通 | 同上 | 「路径不通」 |
| board_face·out_of_catalog | 调试态 | debug 级 | 不与玩家语义混桶 |
| resource_face(AP 不足 / RAP 不足——无上游载荷,按动作上下文映射) | 资源不足 | AP/RAP 数字脉冲 + toast | 「AP 不足 · 剩 0 点」 |
| phase | 非 Active | toast | 「结算进行中」 |
- 图标 + 文案冗余(非色相独载)。
## 信息与归因呈现
### 规则 10:奖励是什么、包里有什么,随时一眼可读
1. 已开的格子里若藏着奖励,格面显示它的家族类型徽章、拾取瞬间档位可读。
2. 右侧道具栏是挖掘期的规划面——背包每一件一行(下表);悬停看完整描述与触发注记,但看不到来源——来源归因是结算明细行的职责。
3. 奖励身份键全局恒定、跨 run 禁重掷。
| 常读条每行显示 | 说明 |
|---|---|
| 图标 | 家族键定纹样(同族不同档可互辨——刀的两档并排分得清) |
| 名称 | 道具显示名 |
| 属性简述 | 行值快照派生的一句话(伤害 / 回复 / 增益) |
| 状态 | 在包 / 已用(已用的过滤出常读条) |
实现参照——奖励徽章与库存常读条:
| 口径 | 内容 | 依据 |
|---|---|---|
| 格面家族徽章 | 五键 attack/defense/heal/blast/weaken——键集冻结;五键槽位在程序化占位映射表预留、未启用键不呈现 | art-bible §4.6.3 |
| 拾取瞬间 | 格面徽章 tier 档位可读 | H1 节拍 |
| 库存徽章 | 八键、reward_id 键——knife_t1/knife_adv 同族互辨是硬需求 | art-bible §4.6.2 |
| MVP 呈现范围 | 格面徽章只在已开格呈现(未开格不预告身份) | B4 Rule 8 现行锁定;冲突清单⑤ |
| 徽章栈位 | 旗之下、变异纹理之上、不进数字区、不构成格内第二焦点 | art-bible §3.4 |
| 常读条枚举序 | 入包受理序 | B4 E21 |
| tooltip | 完整描述 + 触发注记、不含来源(来源归因由结算明细行承载) | battle.md 口径 |
| Used 过滤 | 已用件过滤出常读条——查询面保留只读、过滤归呈现 | query_inventory 保留只读 |
| 身份恒定 | reward_id / enemy_id / effect_id 三键全局恒定、跨 run 禁重掷 | B4×5① |
依据:义务源 = B4×5①。无计算。
### 规则 11:身上的增益减益看得见、好坏分得清、没了有交代
| 槽位元素 | 玩家读出什么 |
|---|---|
| 图标 | 哪种效果(形状纹样定身份,色相不承载身份) |
| 层数角标(L) | 叠了几层 |
| 剩余结算次数点(R) | 还会结算几次 |
| 悬停 tooltip | 来源 + 语义 + 剩余 |
1. C 区固定 4 个状态槽;好坏一望即知:有利 = 金族满框、有害 = 红族缺框——判别按效果键的极性表,不看数值正负。
2. 开局没有任何状态 → 整排槽隐藏、HP/攻击/RAP 数据框上移补位;图例面板载空态说明「战斗中拾取的增益在此显示,随战斗结束消散」。
3. 状态系统不发任何信号——状态栏刷新绑定在结算编排完成的时点(命令式)。
| 口径 | 内容 | 依据 |
|---|---|---|
| 图标键 | 效果图标七键——形状纹样身份、色相不承载身份 | art-bible §4.6.1(七键冻结) |
| 极性判别 | 键级极性表:attack_up/defense_up/weaken 有利、ambush 有害——禁以 magnitude 符号判极性(负值增益存在;pool 亦不足以判——enemy_output 池两向并存) | B3×4③ |
| 极性键扩容 | 提案扩展键 enrage/off_guard/sapped 随极性提案实施批 | 极性提案实施批 |
| 语义归属 | 经 SettlementTable `effect_pool_map` 成文(作用面) | B3×4③ |
| 空态裁决 | 槽整体隐藏 + HP/攻击/RAP 上移补位(D1 定稿) | B3×4① |
| 数据源 | B3 投影:六归因字段 + display_name + 授予时数值快照(经 B1 编排面) | B3 已 schema——引用 |
| tooltip 文案 | source_class 文案经 B1 `source_label_map` | B1/B3 协作 |
依据:义务源 = B3×4①②③。无计算。
### 规则 12:结算逐行念账——每笔收益标明来源,该高光的当场高光
1. 结算推进时,明细带把 B1 流水逐行实时滚出,每行标明「做了什么、多少、到谁头上、因为什么」——玩家能把每一分收益对回自己哪一步扫雷决策。
2. 高光分三档:标中旗金框、清图奖励金框、完美排雷全屏喝彩级——庆祝不打在空兑现上。
| 行的类型 | 呈现口径 | 依据 |
|---|---|---|
| 生效行(伤害 / 道具入库) | 实时滚出,逐行来源标注「{行为} {值} → {目标}(来源)」——模板插值,行宽预留 40% 膨胀 + 固定槽高 + clip_contents | 切片缺陷①回归 |
| 效果行 | 两列分示:value = 单次贡献值、pool_value = 池合成值——禁相加(防"−130%×2 行 = −260%"误读) | B1 Core Rule 14 字段 |
| 零值伤害行 | 照常可见、不被吞 | B4×5③ |
| 未生效四类行 + 标旗未中行 | 聚合计数呈现(防逐行惩罚轰炸)+ 形状冗余(图标 / 划线——非色相独载,色弱清单 #9) | B4×5③ |
| 四类未生效行划分 | 道具行(入库 / 生效语境注记)/「奖励未生效」(聚合计数)/「已消耗未生效」/「使用被拒」 | B4×5③ |
| 未选用件 | 语境注记「未选用件随关卡结束清空」(关卡域口径) | B4×5③ |
| 标中旗高光行 | 旗化暴击弹道加重 + 明细行金框(chord 缺席的即时兑现补偿) | B1×3① |
| H2 清图奖励行 | 金框高亮行(轮末仪式峰值) | B1×3① / B4×5④ |
| 完美排雷 | 全屏喝彩级:金光带加倍扫射 + 「完美排雷 ×2」横幅;高光行 value = 实际有效兑付当量;首份即零兑付不发高光 | B1×3② / art-bible §2.2 最高档(创意风险 #2 落点) |
依据:行协议 = 13 类封闭枚举(B1 Core Rule 14——字段分层见规则 17 载荷表 #4);高光使用规则 = 事件型用独立高光行、属性型强调用行字段标记(B1);义务源 = B4×5③④ / B1×3①②。无计算。
### 规则 13:轮末道具窗口在道具栏原地亮起,至多选一件
1. 结算推进到窗口锚点(授予段之后、增益减益段之前)时,E 区道具栏原地激活:面板点亮金描边、标题换成「轮末道具窗口 · 至多选用 1 件」,阶段指示同步标出窗口锚点位置;棋盘区去饱和 + 金橙色相偏移并锁输入(明度不变)。
2. 满血的治疗包灰置、悬停说明禁选原因(「HP 已满 · 禁选」)。
3. 选中即承诺——窗口关闭、回结算流,提交的是窗口条目位置;跳过按钮恒在;政策注记常驻「未选用件随关卡结束清空」。
4. 背包为空就不弹窗(窗口标记照常登记——回放输入完整性归 B1),结算零停顿。
5. 窗口期棋盘输入不竞争(结算期棋盘本就锁输入);窗口激活期间跳过常读条全量重建——全量刷新会冲掉窗口态。
依据:E 区原位激活 = battle.md 布局决策 D2;usable_now 投影 = B1 组装载荷;去饱和 + 金橙偏移 = art-bible §2 明度恒定硬规则的合规化实例;窗口触发政策 = MVP 有库存恒弹(候选取舍见 analysis);义务源 = B4×5②。无计算。
设计意图:本节每条呈现口径都是"把每一分收益对回玩家哪一步扫雷决策"的落点——P2 裁剪判据的最后半米由 D1 走完。
## 提示·终局反馈·美术与可访问性
### 规则 14:新机制第一次遇到给提示,忘了随时查图例
1. toast = 棋盘区上缘内侧浮出的非模态提示:自动消退 2.5 秒、不劫持输入、不打断挖掘流。
2. 一次性提示共三种(雾首遇 / chord 肌肉记忆 / 不可挖域走近),每个整 run 只弹一次;拒绝、voided、零合法板的提示不属于一次性族——每次都要可感知。
3. 图例面板 = 模态覆盖层:格态 / 变异 / 雾语义三组条目,「迷雾 = 无雷盲区」条目恒在、不设解锁门、可随时回看,并载状态槽空态说明(规则 11)。文案定稿权归实现期文案 pass——本规则只锁必含要点与形态。
依据:义务源 = A2×6③ / A4×3①②。无计算。
### 规则 16:一场打完,输了赢了、剩什么没了什么,样样有交代
1. 六种反馈各有触发与呈现(下表)。
2. 暮蓝 overlay 是全部界面里唯一的暮蓝档、明度不变——失败氛围靠色相与运动表达、不靠变暗。
3. 不存在"RAP 满自动刷"——刷新的决策主体恒为玩家(A3 Rule 11)。
| 反馈 | 触发 | 呈现 |
|---|---|---|
| 胜利终局 | 判定行 verdict=win | 金蜡封落于扫雷图区中央 + 全屏暖白金 overlay + 判定行(终局判定行 = 胜负画面数据锚)+「下一节点」+ 明细回看入口 |
| 失败终局 | 判定行 verdict=lose | 明度不变的暮蓝 `#5A6C8C` 氛围 overlay(全作唯一暮蓝档)+ 小人坐砖掸灰 + 插过的旗逐面化光点收回 + 判定行 + 返回 |
| 状态槽全清 | battle_over(B3×4④) | 状态逐槽化光收回 + 微文案「状态随战斗结束消散」(防"我的 buff 哪去了"误读——胜负两终局同款) |
| RAP 清零 | battle_over(A3) | RAP 数字滚动归零 + 微文案(防"攒的钱凭空没了") |
| 库存清空 | level_clear(B4×5⑤——关卡域口径) | 道包逐件化光点飞出 +「剩余道具 ×N 随关卡结束清空」(N = clear_inventory 返回的清空前快照计数——B1 编排义务⑤数据面) |
| Boss 遭遇变体 | encounter=boss | 战斗开始一次性紫赤影子爬过棋盘(§2.6——纯视觉预告)+ 敌人卡体量最大 + 阶段指示附 Boss 名 |
| 弃图刷新确认 | 按钮点击(A3 契约的呈现半边) | 按钮置 AP 条右端,文案实时「RAP−{rap_refresh_cost 表读值} · 本轮剩 N 次」(剩余次数 = `refresh_cap_per_round` − 本轮已用;轮内已用次数读数 = A3 只读观测量缺口,接口漂移登记见 OQ2);入口可用性 = 组合根按只读观测量预判(rap ≥ rap_refresh_cost ∧ 剩余次数 > 0)+ `request_refresh` 返回值兜底(A3 无 `can_request_refresh` API——不引入);确认微交互显式提示代价与旧板旗失效;确认交互与常规确认不同位(位置通道——破坏性确认异位,色弱清单 #7);RAP<8 / cap 超限拒绝可见(边界情况表);换图后 AP 不重置、剩余次数扣减可见 |
依据:battle_over 与 level_clear 两反馈不合并、时序不倒挂(边界情况表);义务源 = B3×4④ / A3 / B4×5⑤。无计算。
### 规则 19:美术没画好先用代码画的占位图顶着,占位图同样要过硬指标
1. 全部等终稿美术的面(砖面 / 雾纹 / 敌像 / 图标 / 徽章 / 立绘 / 蜡封)以程序化占位先行:色值直接取冻结色板、形状按形状语言参数域用代码绘制(圆角砖 / 直角数据框 / 纹带形);图标、徽章、线索按键契约挂进键位映射表(数据键 → 占位纹样 ID,一键一槽位)——终稿美术到位时零数据层改动、零运行时换图。
2. 占位图同样要过硬指标:数字可读性(1–8 全档对格底 ≥4.5:1、0.5× 缩放可辨、纹带不侵数字字形区)必须通过。
3. 样张定稿 = 砖面形态与色板的冻结闸、终稿资产开工的前置;样张批不阻塞 D1 其余全部验收。
依据:判据 = F2;色板 = art-bible §4.1 冻结色板(底 L≥0.30 ∧ 饱和 ≤0.40 ∧ 墨 L≤0.027);形状语言 = §3;样张标准 = §1.4 第一验收项;键集扩容走 §4.6 修订;终稿开工 = asset-spec 批。
### 规则 22:中文不缺字、字看得清、颜色不独挑大梁、不用键盘也能玩
| 基线 | 要求 |
|---|---|
| 中文字体 | 随包内置 + 设为主题默认字体——运行时默认字体无 CJK 字形,豆腐块 = 验收硬断言 |
| 按钮文案 | 4 汉字上限(「停手」「弃图刷新」「跳过」「选用」);译英 ≤1.6× 不破版;德语长词允许两行或图标+缩写 |
| 明细行宽 | 模板预留 40% 膨胀 |
| 对比度 | 数字对格底 ≥4.5:1(WCAG AA) |
| 色弱安全 | 无信息仅靠色相承载(九对语义对逐项成立)、灰度可辨 |
| 字号下限 | 棋盘数字 ≥18px / 明细正文 ≥14px / tooltip ≥13px(@1280×800) |
| 闪烁 | 无 >3 次/秒 |
| 减动效 | 全部动画时长减半或跳终态开关;结算逐行兑现是信息载体——不可整体跳过、可加速 |
| 输入 | 纯鼠标可完成全部操作 |
依据:对比判据引用 = F2;本地化契约消费方 = D6(CJK / 按钮宽 / 术语表);正式分层(文本缩放 / 色盲模式 / 按键重映射)待 accessibility-requirements.md 定稿(OQ7);承载 AC-23 / AC-26。无计算。
### Visual/Audio 执行锚点(art-bible 逐条执行)
D1 是本体系中唯一的自有渲染面系统——视觉义务从"数据供给规格"反转为"执行 art-bible"。
| art-bible 锚点 | D1 执行 |
|---|---|
| §1.2 绘制优先级栈 | 数字 > 小人 > 旗 > 徽章 > 变异纹理 > 底色——BoardView 分层绘制/控件叠序按此栈实现,任何元素不遮挡数字(小人与旗不得覆盖文本;小人所在格边框高亮) |
| §1.4 格子样张(引用依据) | 样张 = 砖面形态定稿闸;D1 引用其验收标准(第一验收项 = 数字可读性硬指标)作为程序化占位与正式资产的共同判据;样张未制作不阻塞 D1(规则 19);样张通过后冻结为制作标准,终稿资产替换走 asset-spec 批 |
| §3.3 UI 形状语法 | 半拟物——面板 = 石板圆角矩形(与地砖同圆角率)、按钮 = 凸圆角"可按的砖"、仪式性确认(胜利蜡封)= 圆形;数据框/准线/进度条一律直角细线无纹理("圆角 = 可触摸的物件,直角 = 须精确的信息") |
| §4.1/§4.4 UI 色板 | 数据素面墨族(#33261B 系)——棋盘与面板读同一种墨;战斗容器中性石色(防暖色渗入分走数字对比预算);语义色规则(红只说危险 / 金只说收益 / 蓝只说己方 / 紫赤只说 Boss / 绿零逻辑语义 / 禁入色相带 300°–345°)逐条适用;明度恒定硬规则(状态区分只经色相/饱和/运动/元素——去饱和 + 金橙偏移即其合规化实例) |
| §4.5 色弱安全清单(逐对执行) | 九对语义对的冗余通道(形/图标/位置/运动)在对应组件落实——四格态靠完整/碎裂形、奖励金 vs 危险红靠剪影+运动、UI 红/金强调对加图标+文案冗余、破坏性确认异位(位置通道)、图标键族一键一纹样色相不承载身份 |
| §4.6 图标键契约(键位挂接) | 效果图标 §4.6.1(七键——sapped 键冻结未入表前禁引用)、奖励徽章 §4.6.2(八键 + clear_blast 并列预留)、格面类型 §4.6.3(五键——MVP 只挂已开格)、敌种线索 §4.6.4(行为拍姿态键)——键位映射表(规则 19)为唯一挂接点,键集扩容走 §4.6 修订、禁运行时换图 |
| §2 能量档承载 | 五区布局的动效与色彩转场按 §2.1–2.6 能量档实现(挖掘 2/10 唯一微光在动 → 结算 7/10 金橙光带 → 清图 8/10 金粒喷泉 → 胜利 6/10 克制 → 失败 1/10 暮蓝最静一拍 → Boss 5/10 紫赤)——"状态间区分度自检"三条(挖掘 vs 结算靠谁在动+饱和;胜负以色相即判;Boss 以紫赤登场标记)为转场验收锚 |
| 音频(D4,Alpha 占位) | MVP 无音频;挂点清单引用 B1/B4 音频挂钩点(明细行类型流 / 负反馈聚合单次 / 开格拾取按 category 分色 / 清图奖励音)+ toast 提示触发(本 GDD 新增挂点候选);临时 SFX 随垂直切片(AD 项先例) |
> Asset Spec:Visual/Audio 义务已定义。art-bible 已定稿(§1–4),样张批后运行 `/asset-spec system:d1-hud-framework` 产出逐资产视觉描述/尺寸/生成提示词(样张先行——§1.4 为定稿闸)。
### 边界情况
| 条件 | 行为 | 依据 |
|---|---|---|
| 每次拒绝(A2×6⑥) | 棋盘面拒绝(sub_reason 七值)→ 目标格旗朱 `#C63D22` 边框闪 + toast(文案映射见「拒绝与 voided 呈现映射」);资源面拒绝(AP 不足 / RAP 不足——无上游载荷,按动作上下文映射)→ AP/RAP 数字脉冲 + toast;相位拒绝 → toast「结算进行中」;图标+文案冗余(非色相独载) | 映射源 = reject_reason + sub_reason——每次拒绝玩家可感知 |
| 轮末意图 voided(至少 stop 被清零须可感知) | toast「本轮已清图,停手未执行 · 剩余 AP 已清零」——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP 的读感欺骗(F4 联合清图让位在生产面不可构造,本条为诚实兜底) | A2×6⑥ / A2 voided 语义 |
| 零合法板(A1 EC5 → B1×3③——三形态选型定稿) | B1 上抛非法产物标记 → toast 诚实提示(非模态、不打断);补偿与回退不提供(补偿逻辑归 B1 域外、确定性回退已知好种子 = 实现期 ADR 候选〔A1 OQ2 关联〕——MVP 面向玩家的形态 = 仅提示);玩家永不卡死由 A1 验收三分支保证,提示是体验债的诚实兜底(原"玩家不可见遥测域"口径由本条承接闭合) | B1×3③ / A1 EC5 |
| 弃图刷新被拒(RAP 不足) | 按钮 + RAP 读数脉冲 + toast | A3 EC13 |
| 弃图刷新被拒(本轮 cap=2 超限) | toast「本轮刷新次数已用完」 | A3 EC15 |
| 确认微交互缺一步 | 不提交(防误触——破坏性确认异位) | 规则 16 |
| 两个雾区相邻(A4 EC11) | 规则上独立布置实例、呈现合并为一片——雾区全开完成信号以视觉合并域为单元、禁实例级双响(信号只响一次);样张最坏用例含"宽度 1 雾带两侧毗邻数字格" | A4 EC11 / A4 AC-9 |
| 雾首遇触发边界 | 触发谓词 = 首个实际含雾格的板进入可操作状态——免疫 EC2 降级板(无变异)误触发、免疫贴脸雾 t=0 歧义;一次性作用域 = 每 run | A4 UI Requirements 修正口径 |
| 敌人死亡与终局同帧(despawn 时序) | 死亡呈现数据 = 流水行击杀标记 + 目标字段(despawn 前已产出——规则 18①);battle_over 清理序列后呈现层零核心回读;`is_battle_live()` false 后视图进入终局态只消费快照 | 规则 18① |
| 窗口打开时库存为空 | 不弹窗、直接 skip(结算零停顿);窗口标记照常登记(B1 回放输入完整性) | B4 E8 |
| 满血时窗口含治疗包 | usable_now=false 灰置 + 禁选原因 tooltip;强制提交(不可经 UI 达成——禁选态拦截)→「使用被拒」行兜底 | B1 守卫 |
| battle_over 与 level_clear 反馈叠加(关卡末战) | RAP 清零 + 状态槽全清反馈先行(battle_over),库存清空反馈随后(level_clear 编排)——两反馈不合并(防"N 道具消失"误读为战斗结算内容) | 规则 16 |
| 模态覆盖层叠开(图例上开明细回看) | 统一登记序栈——后开者置顶、关闭逐层恢复;任一层打开时其遮挡物隐藏/输入锁定断言成立 | 切片缺陷⑤回归 |
| 悬停文案换行 | 全部动态区固定槽高 + clip_contents——换行裁剪不推挤布局(明细行 40% 膨胀 + tooltip 独立浮层) | 切片缺陷①回归 |
| CJK 字形缺失 | 豆腐块 = AC 硬断言失败(字体随包 + theme 默认;首次导出 checklist 项) | ADR-0003 |
| 敌卡刷新与死亡灰化竞争 | 就地更新(字段级 setter)禁全量重建——死亡灰化态不被后续刷新吞掉;窗口激活期同理跳过常读重建 | entry 36 教训 |
| 减动效开启 | 全部转场/高光/演出时长减半或跳终态;结算逐行兑现降速不跳过(信息载体);无闪烁 >3 次/秒恒成立 | 规则 22 |
| 移动目标 = 当前格 | 幂等零移动——无动画、无 toast | A2 EC14(合法受理的呈现静默) |
| `compute_move_path` 返回空(不可达) | 路径预览不显示 + 禁止光标(预览与执行同源) | A2 AC-14② 对侧 |
| 键集扩容(新 effect_id / reward_id / enemy_id 上线) | 键槽映射表缺键 = 呈现层 fail-fast(debug 断言 + 占位"?"纹样 + 诊断,禁静默空图标)——扩容走 art-bible §4.6 修订(禁运行时换图) | 规则 19 / AC-15 |
## 呈现几何与可读性判据
D1 零玩法公式——本节仅承载呈现几何与可读性判据。全部取色禁新增色值,一切经 art-bible §4.1/§4.4 冻结色板。
### F1 棋盘格尺寸(cell_size)
**结论**:cell 为两档定值(battle.md 拍板)——12×12 → 36px、10×10 → 45px;F1 公式为可行性校验器而非闭式推导:floor(min(D_w − pad_h, D_h − ap_bar_h − pad_v) ÷ N) ≥ cell(N) 且 cell(N) ∈ [30, 45] 断言成立;数字字号 = max(18, ceil(cell × 0.5)),像素字体整数倍缩放。
```
两档定值:cell(12) = 36px、cell(10) = 45px(battle.md 拍板值,非公式导出)
可行性校验(装板期断言,违例 fail-fast):
floor(min(D_w − pad_h, D_h − ap_bar_h − pad_v) / N) ≥ cell(N)
且 cell(N) ∈ [30, 45]
N ∈ {10, 12}(A1 BoardGenTable 尺寸档);D 区基准 1280×800 下 D_w=760、D_h=520−44(AP 条)
@1280×800 实算(pad_h=pad_v=16):min(744, 460) = 460
460 ÷ 12 → 38 ≥ 36 ✓ 460 ÷ 10 → 46 ≥ 45 ✓
数字字号 = max(18, ceil(cell × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰)
```
| 变量 | 符号 | 类型 | 范围 | 说明 |
|---|---|---|---|---|
| D 区宽/高 | D_w / D_h | int px | 布局常量 | 五区布局基准(battle.md Layout) |
| AP 条高 | ap_bar_h | int px | 44 | D 区顶条 |
| 棋盘维数 | N | int | {10, 12} | A1 行值(MVP 两档) |
| 定值档 | cell(N) | int px | {36, 45} | battle.md 拍板两档;非闭式导出(为何定值而非闭式见 analysis 问题 4) |
- Example:12×12 → floor(min(760−16, 476−16)/12) = 38 ≥ 36 ✓(定值取 36)→ 数字字号 = 18px;10×10 → floor(460/10) = 46 ≥ 45 ✓(定值取 45)。
设计意图:两档值来源 = battle.md 拍板("格 36–45px 见方"两端),公式只承载界限与可行性断言。
### F2 数字对比恒等式(引用 art-bible §4.1——D1 不新增参数)
**结论**:1–8 全档数字对所在格底 WCAG 对比 ≥4.5:1(§1.4 第一验收项,对程序化占位同样适用)——由色板参数域结构保证:格底相对亮度 L≥0.30 ∧ HSV 饱和 ≤0.40 ∧ 数字墨 L≤0.027 ⇒ 任意底墨组合 ≥4.5:1 恒成立。
| 实测锚(底 / 墨) | 对比 |
|---|---|
| #33261B / #C9AF83 | 6.9:1 |
| #4A1E14 / #B39A78 | 5.3:1 |
- D1 侧判据 = 灰度截图分类 + 对比抽测进 AC;换 biome 色板须重跑 §1.4(换皮只换四槽、永不变信)。
### 显式排除声明
| 对象 | 归属 |
|---|---|
| 伤害 / 经济 / 概率 / 生成公式 | A1–B4/B1/C3 |
| AP/RAP/价目显示值 | A3 表读值投影 |
| 伤害数字 | B1 流水行 value 投影 |
| D1 拥有的全部 | F1 几何换算、F2 可读性判据的引用执行、调参表呈现常量 |
| 随机 | 零——呈现层无任何 RNG 消费(S1/S2 扫描域适用) |
## 依赖与输出
权威分层:冲突时以 battle.md + art-bible 为呈现形态权威、以本 GDD 为系统契约权威、以各玩法 GDD 为机制语义权威。
| 系统 | 方向 / 性质 | 接口要点 |
|---|---|---|
| A2 | 上游 hard | 读:`current_board()` / `reveal_record()` / `compute_move_path(cell)`(呈现面,entry 39 E2 收口);订阅:零直订(ADR-0001——B1 facts 与组合根转发);写:`settle_batch(intents)` 经组合根(D1×6①);消费其三事件 schema(规则 17 载荷表 #1–3)与 ActionOutcome(#6);D1×6 六项义务全落位(台账表) |
| A3 | 上游 hard | 读:`phase / ap / rap / last_round_end`(getter-only——entry 39 E5);刷新意图经组合根 → B1 `refresh_board` 编排内 A3 `request_refresh`(挖掘期 Active 受理、每轮上限 `refresh_cap_per_round`=2);接口漂移登记:轮内已用刷新次数读数缺口(OQ2);AP/RAP 常显、RAP 清零反馈、双源拒绝呈现(A3 契约) |
| B1 | 上游 hard(数据供给主通道) | 读:步骤流信号(13 类行协议——载荷表 #4)、`presentation_snapshot()` / `is_battle_live()` / `stock_count()` / `query_reward_identity()`(切片实现、registry `d1_presentation_surface` 登记、B1 GDD 契约登记待批——冲突⑧/OQ3);写:`submit_window_selection(窗口位置序)` / 刷新提交面;level_clear 反馈行数据面(清空前快照计数);B1×3 + B4×5 + B3×4 呈现义务的统一数据源契约 = B1 Core Rule 14 |
| B2 | 上游投影 | `hero_unit() / all_enemies()` 只读投影(entry 39 E3;切片实现、B2 GDD 契约登记待批——冲突⑧);血条/顺位/姿态/存活数据面;despawn 前捕获纪律(规则 18);B2×4 四项义务落位(规则 6) |
| B3 | 上游投影(经 B1) | 零直读(B1 协作对象私有化)——状态投影经 B1 编排面(载荷表 #10);EC12 空态、极性映射、全清反馈(规则 11/16) |
| B4 | 上游投影(经 B1) | 零直读——`query_reward_identity()` / 库存载荷经 B1(载荷表 #8–9);奖励徽章键 §4.6.2、窗口呈现、四类行、H2、关卡末清空反馈(规则 10/12/13/16) |
| A4 | 上游 soft(呈现规格) | 雾纹理双通道、图例条目、首遇提示三要点、tint + 完成信号(A4×3——规则 9/14/15);A4 UI Requirements 为本 GDD 引用源 |
| A1 | 间接 | 零直接接口——EC5 零合法板数据面经 B1 上抛(非法产物标记 → toast 告知);biome 标签 = 换皮色板数据锚(程序化占位消费);产物字段保真是呈现诚实的数据前提 |
| D2 | 数据读取 | display_name 等本地化名经核心读表面;D1 自有常量不入 D2 玩法表(调参表载体声明) |
| C1-lite(level_runner) | 上游 hard | A 区节点链 / 当前节点 / HP 携带(关卡域);胜利 overlay「下一节点」→ runner 推进(写经组合根);level_clear 编排反馈;C1 GDD 未开始——本三项为切片代码契约,C1 GDD 定稿时回填(接口漂移回 C1 批) |
| C2 | 预留 | 关卡结算屏(关卡末清空反馈的完整屏形态)归后续 spec `design/ux/level-clear.md`(battle.md OQ9)——MVP 以 overlay 反馈承载 |
| B5 | 下游 hard | D1→B5 交付物:五区布局与双舞台裁决(第三形态)、B 区演出区结构、明细带呈现位、流水行协议呈现语义、敌人卡呈现语义(死亡灰化/禁瞬消)、art-bible §4.6 键位映射表——B5 只叠加动画密度与演出(受击反馈/弹道/退场动画),呈现语义已在本 GDD 定稿;"战斗表现美术测试"以本布局出样 |
| D4 | 下游 soft | 音频挂点事件源 = 明细行类型流 + toast 提示触发(B1/B4 音频挂钩点清单引用);MVP 无音频(Alpha) |
| D5 | 下游 soft | 教学承载位 = toast 体系 + 图例面板(雾三要点 / chord 提示 / 蓄力拍提示候选 / RAP 清零 / 库存清空教学条目)——D5 GDD 定稿口径 |
| A5 | 预留 | 探测类道具显影面(未开格身份呈现深度 OQ2)——接口归 A5 GDD,本 GDD 不预写 |
| D6 | 下游 | 本地化契约消费方(CJK/按钮宽/术语表——规则 22) |
- 索引分层注记:systems-index 依赖分层 "D1 ← A2,A3,B1"——本 GDD 实际投影消费扩至 B2/B3/B4/A4/runner,全部经 B1 编排呈现面 + 封装收口批成文呈现面(entry 39/40),零新增运行时直调边;D1 无游戏状态、无 knob 联动、无 RNG——层 4 Presentation 定位不变。
### 呈现义务台账逐项落位表(门禁核对用——27 项,缺项即 blocking)
| 义务源 | 义务 | 承接方式(本 GDD 落点) | 状态 |
|---|---|---|---|
| A2×6 | ① stop 意图经 `settle_batch` 提交、不直调 A3 | 规则 7 + 写路径总表(规则 4)+ AC-13 | 落位 |
| A2×6 | ② 四种格态一眼可辨 | 规则 9 + AC-4 | 落位 |
| A2×6 | ③ 悬停预承诺 + 可挖域常驻指示 + chord 首遇提示 | 规则 7 / 14② + AC-5 / AC-14 | 落位 |
| A2×6 | ④ 已引爆雷格"可通行可读" | 规则 9 + AC-4 | 落位 |
| A2×6 | ⑤ `compute_move_path` 呈现语义 = 合法性指示(裁决继承 battle.md D3) | 规则 8 + AC-6 | 落位 |
| A2×6 | ⑥ 单意图帧收集 + voided 呈现 + 每次拒绝可感知 | 规则 7 + 边界情况表 + AC-7 / AC-8 | 落位 |
| B2×4 | ① enemy_id→图像线索映射清单成文(预告时序 = 下一拍、挖掘期全程可见;含强度档位/环长直觉编码;双通道) | 规则 6 + 意图线索映射目录 + AC-10 | 落位 |
| B2×4 | ② 线索映射全局恒定(enemy_id 键,跨 run 禁重掷) | 规则 6 / 10 + AC-10 | 落位 |
| B2×4 | ③ 单位顺位与存活可读 | 规则 6(顺位徽标)+ AC-10 | 落位 |
| B2×4 | ④ 敌方 side 池呈现口径(共享单值、各卡同值) | 规则 6 + AC-10 | 落位 |
| B3×4 | ① HUD 常显 + EC12 空态规格定稿(裁决:槽隐藏) | 规则 11 + AC-12 | 落位 |
| B3×4 | ② effect_id→icon 映射键契约 | 规则 11(引用 art-bible §4.6.1 七键冻结)+ AC-15 | 落位 |
| B3×4 | ③ 有利/有害极性呈现映射(非 magnitude 符号) | 规则 11(键级极性表 + pool 语义归属)+ AC-12 | 落位 |
| B3×4 | ④ 战斗结束全清的状态栏去留 | 规则 16 + 状态机胜负终局 + AC-16 | 落位 |
| B4×5 | ① 已开格 + 库存奖励身份恒定可读(常读条 = 挖掘期规划面) | 规则 10 + AC-9 | 落位 |
| B4×5 | ② 道具使用窗口呈现(原位激活/单件/usable_now/政策注记/空库存) | 规则 13 + AC-13 / AC-17 | 落位 |
| B4×5 | ③ 结算明细四类行呈现(聚合计数 + 语境注记) | 规则 12 + AC-11 | 落位 |
| B4×5 | ④ H2 清图奖励行强调呈现 | 规则 12 + 状态机清图瞬间 + AC-11 | 落位 |
| B4×5 | ⑤ 关卡末(level_clear)库存清空可见反馈 | 规则 16 + 边界情况表 + AC-16 | 落位 |
| B1×3 | ① 高光行强调呈现(标中旗金框 / H2 金框) | 规则 12 + AC-11 | 落位 |
| B1×3 | ② 完美排雷呈现形态 | 规则 12 + 状态机 + AC-11 | 落位 |
| B1×3 | ③ EC5 零合法板提示/补偿/回退形态(裁决:仅提示) | 边界情况表 + AC-19 | 落位 |
| A4×3 | ① 图例「迷雾 = 无雷盲区」条目(恒在/可回看) | 规则 14① + AC-14 | 落位 |
| A4×3 | ② 雾首遇提示(每 run 一次、三要点、非模态) | 规则 14② + AC-14 | 落位 |
| A4×3 | ③ 已开雾格 tint 残留 + 雾区全开合并域完成信号(battle.md OQ8 采纳) | 规则 9 / 15 + AC-4 | 落位 |
| A3 | AP/RAP 常显 + 刷新入口(玩家发起)+ RAP 清零反馈 + 双源拒绝 | 规则 16 + 边界情况表 + AC-8 / AC-16 | 落位 |
| A1 | EC5 零合法板诚实呈现(数据面经 B1×3③ 上抛) | 同 B1×3③ | 落位 |
### 屏级 spec 与配套文档(UI 要求)
| 项 | 要点 |
|---|---|
| 权威屏级 spec | `design/ux/battle.md`(APPROVED,B1 UX Flag 的 /ux-design 产物——覆盖子屏:挖掘主界面 / 结算明细 / 道具窗口 / 终局 / 明细回看):本 GDD 为其系统级承接(布局/组件/交互裁决全部继承);本节不重复 spec 内容,stories 引用 `design/ux/battle.md` 而非本 GDD 直引组件细节 |
| UX Flag 处置 | B1 UX Flag(结算明细屏 + 道具窗口 → Phase 4 前置 /ux-design)已由 battle.md 兑现闭合;D1 自身无新增屏(战斗屏 = 唯一 MVP 玩法屏);相邻域屏 NodeOverlay / 关卡结算 = 后续 spec `design/ux/node-reward.md` / `design/ux/level-clear.md`(battle.md OQ9——本 GDD 只锁出口锚点) |
| pattern 库 | `design/ux/interaction-patterns.md` 已建(核心 8 条:双源拒绝反馈 / 原位窗口激活 / 逐行兑现明细带 / 悬停预承诺光标 / 点阵资源显示 / 模态 overlay 层级纪律 / 破坏性确认异位 / 禁用态即理由全文)——本 GDD 组件全部对号入座;12 目录占位(实现期回写义务) |
| accessibility | `design/accessibility-requirements.md` 未建(gate-check Pre-Production 缺口在案)——本 GDD 内建基线承诺(规则 22),正式分层(文本缩放/色盲模式/按键重映射)待该文档定稿 |
| 场景探针标配(code-conventions) | 每个可交互 UI 区域配套场景级探针——切片三探针(ui_probe / ui_click_probe / ui_tune_probe)扩展 + 战斗屏场景级探针(AC 硬性块);探针即呈现层契约的活文档 |
## P0 最小闭环
1. 玩家进入战斗屏——五区同屏就绪,≤500ms 内首格可点。
2. 挖掘期鼠标操作经单意图帧整批提交 `settle_batch`(唯一写路径,经组合根)。
3. 回执链:组合根立刻重查只读面 → 视图字段级 setter 就地刷新。
4. 停手或 AP 尽 → `round_end` → D 区锁输入,明细带展开 84px 逐行兑现(B1 步骤流驱动)。
5. 窗口锚点:E 区原位激活,选用/跳过 → 回结算流。
6. 判定行 → 终局呈现(胜利金蜡封 / 失败暮蓝)+ 状态槽全清 + RAP 清零反馈。
7. level_clear → 库存清空反馈「剩余道具 ×N」→ 下一节点 / 返回(runner 推进,写经组合根)。
## P1 / P2 后置
| 优先级 | 内容 | 后置原因 |
|---|---|---|
| P1 | 远格点击自动"先移动再挖"复合意图 | 移动免费高频,两击摩擦符合观测假设——先经 playtest 验证 P4 ≤2 观测假设 |
| P1 | Gamepad 焦点序 | Partial 支持非 MVP(OQ5) |
| P1 | 相邻域屏 node-reward / level-clear 完整屏形态 | 归后续 spec(OQ6 / battle.md OQ9);MVP 以 overlay 反馈承载 |
| P1 | accessibility 正式分层(文本缩放/色盲模式/按键重映射) | 待 accessibility-requirements.md 定稿(OQ7) |
| P2 | 存档级"一生一次"提示作用域 | 归 D3/C4 后重议(hint_once_scope) |
| P2 | TunePanel 退役 | C4 天赋树落位批(OQ12);Playtest 诊断按钮保留 |
| P2 | 探测类道具显影面 | 接口归 A5 GDD,本 GDD 不预写 |
| P2 | 未开格预读徽章 | 随极性提案实施批(冲突⑤/OQ9)——B4 Rule 8 现行锁定 MVP 不呈现 |
| P2 | 音频挂点出声 | MVP 无音频(Alpha,归 D4) |
## 调参表
D1 knob = 呈现节奏与可读性常量(非玩法数值——D2 Rule 1"全部玩法数值入表"纪律不适用);单一来源登记防散落,载体 = presentation 主题资源/常量单点(实现期裁决载体形态);修订走本 GDD 流程非调参。
| 字段 | 域(尺度) | 默认 | owner | 调过高 / 调过低 |
|---|---|---|---|---|
| toast_display_ms | 每条提示 | 2500 | D1 | 信息滞留、遮挡节奏 / 读不完即消(拒绝原因漏读) |
| move_slide_ms | 每次移动 | ≤150 | D1 | 移动拖沓(违反 P4 摩擦护栏)/ "太瞬"无方向感(battle.md OQ5 playtest 观测调) |
| board_install_fade_ms | 每次装板 | 200 | D1 | 换图迟滞 / 闪切无地牢感 |
| clear_celebration_ms | 每次清图 | 3000–5000 | D1 | 拖节奏(§2.3"三五秒即收"上限约束)/ 丰收感不足 |
| font_min_board / detail / tooltip | @1280×800 基座 | 18 / 14 / 13 px | D1 | 挤占格内空间 / 可读性下限击穿(可访问性基线) |
| hint_once_scope | 每提示项 | per_run | D1 | —— / ——(存档级"一生一次"归 D3/C4 后重议) |
| reduce_motion_scale | 每动画 | 0.5(或跳终态) | D1 | 减动效失效 / 等效关闭动效 |
| detail_band_height | 摘要 / 实时流 | 24 / 84 px | D1 | 挤压 B 区演出区 / 行数不足(逐行归因截断) |
- 非 knob(结构冻结,修订走 GDD 流程):五区布局与分区尺寸(battle.md 拍板)、双舞台常驻、窗口原位激活形态、单意图帧纪律、模态层级纪律、键位映射契约(§4.6)、程序化占位策略、订阅纪律(ADR-0001)。
- 性能预算(引用非 knob):同屏 draw calls < 200、进入战斗屏 ≤500ms 可交互、headless 全套 < 30s(technical-preferences / ADR-0004)。
- Knob 交互:font_min_board × cell 尺寸(F1 字号下限随格尺寸联动——12×12 板 36px 格是 18px 下限的绑定域);toast_display_ms × 一次性提示去重(提示频率观感)。
- 调参流程:改先测量后复测(切片 mock 数据先行——code-conventions 数值纪律);playtest 观测项 = 移动手感(OQ5 关联 battle.md)/ 明细带常驻(OQ10)/ 窗口存在感。
## 验收标准
### 测试口径
| 口径 | 要点 |
|---|---|
| 测试载体 | ADR-0004 双载体定稿(gdUnit4 deferred——D2 OQ1 关闭形态):逻辑断言类 = `godot --headless --script` 冒烟扩展;场景级类 = 场景探针(`godot --headless --path . res://smoke/<probe>.tscn` 走正常项目引导——autoload 在位、真实 SceneTree;切片三探针为先例) |
| 期望值纪律 | 呈现断言引用表读值(AP=ap_per_round 表读值、RAP 门槛=rap_refresh_cost 表读值等)与 art-bible 冻结参数,不写死玩法数值;呈现常量(toast 时长等)为本 GDD 调参表登记值可直断;每用例先 `reset_diagnostics()` |
| 覆盖声明(out-of-scope) | 玩法行为正确性(上游 GDD AC 域——D1 只断言呈现投影与上游契约一致)· 美术终稿质量(样张/asset-spec 批)· 动画密度(B5)· 音频(D4)· gamepad 焦点序(OQ5) |
### AC 清单(编号不变,Given-When-Then)
| AC | Given | When | Then | 覆盖 |
|---|---|---|---|---|
| AC-1 | 1280×800 与 16:9 全屏(canvas_items/expand) | 进入战斗屏(12×12 板) | 五区无遮挡/无重叠/无内容裁切(棋盘全部格子+数字完整可见)、分区尺寸 = battle.md 布局表值、同屏 draw calls < 200、进入后 ≤500ms 内首格可点 | 五区布局与基座 |
| AC-2 | 12×12 / 10×10 两档板 | 装板渲染 | cell = F1 定值档(36 / 45px @1280×800)且可行性校验通过、数字字号 ≥ max(18, cell/2)、像素字体整数倍缩放无模糊 | F1 格尺寸与字号 |
| AC-3 | 全部格底×数字组合 | 灰度截图 + 对比抽测 | 1–8 全档对比 ≥4.5:1(F2)、0.5× 缩放数字仍可辨、纹带不侵数字字形区;全部状态转场(去饱和+金橙偏移 / 暮蓝 / Boss 紫赤)明度恒定(无变亮/变暗表达) | 对比度与明度恒定(F2) |
| AC-4 | 含雾板 | 逐格渲染后灰度截图(+代码走查) | 四种格态一眼可辨;已引爆雷格呈"可通行可读"(已开底+巢穴纹+可作移动目标);已开雾格 = 地板无字 + 底色层 tint 残留且与已开 0 格灰度可判定区分;数字显示判定消费 variant_ids(呈现层无独立雾判定——代码走查) | A2×6②④ / A4×3③ |
| AC-5 | 小人在场 | 挖掘期任意时刻静止截图 | 8 向相邻未开格常驻呼吸微光(挖掘期唯一在动元素——其余静止截图断言);绘制优先级栈成立(徽章在旗之下纹理之上、不进数字区、无第二焦点) | 可挖域与绘制栈 |
| AC-6 | 悬停已开格 | 悬停 / 点击移动 | `compute_move_path` BFS 路径以小人蓝细线点迹高亮(合法性指示);移动执行 ≤150ms 短滑;不可达格返回空且禁止光标(预览执行同源——A2 AC-14② 对侧);点击远格无自动 move+dig 复合意图(负空间) | A2×6⑤ 定稿 |
| AC-7 | 一帧内多意图(含 stop) | 提交 | 整批经 `settle_batch` 单批到达(stop 终结当帧收集——探针断言单批);光标三语义(移动/挖/旗)随悬停目标正确切换 + 目标格边框高亮 | A2×6⑥③ |
| AC-8 | Active 挖掘期 | ① 点击停手 ② 弃图刷新成功 ③ RAP<8 或 cap 超限提交 | ① 意图经 `settle_batch([stop])` 提交(代码走查 + 探针:零直调 A3 符号)+ 按钮下压 + AP→RAP 飞行数字(RAP 增量 = 剩余 AP 读数投影)② RAP 扣 rap_refresh_cost、AP 不重置、剩余次数扣减可见、旧板旗失效提示可见 ③ 资源面拒绝可见(脉冲 + toast——EC13/EC15) | A2×6① / A3 |
| AC-9 | 已开格 + 库存 | 渲染已开格与库存常读条 | 已开格家族徽章(§4.6.3 键)+ tier 档位拾取瞬间可读;库存常读条逐件 icon+名称+属性简述、枚举序 = stock 受理序、不含来源信息(列表与 tooltip 均无);Used 件不在常读条;同族刀(knife_t1/knife_adv)并排互辨 | B4×5① |
| AC-10 | 双敌种遭遇 | 渲染敌卡 + 击杀驱动 | 意图徽标 = 下一拍预告且挖掘期全程可见、映射按 enemy_id 全局恒定(跨 run 重放同姿态)、含强度档位与环长编码(环点数 = 拍数)、蓄力态含蓄力记号;顺位徽标可读(固定顺位最前者可辨);血条 hp/max_hp 数字可读;多敌伏击层数各卡同值呈现;敌死亡 = 血条归零→灰化+碎裂退场(禁瞬消)、就地更新不丢灰化态(entry 36 回归) | B2×4①②③④ |
| AC-11 | 完整结算 | B1 步骤流驱动明细带 | 逐行明细实时可见且每行带来源标注(source_label_map 文案)、四类未生效行按聚合计数呈现且带形状冗余、零值行可见、效果行 value/pool_value 分示禁相加;标中旗行金框+弹道加重;H2 清图奖励行金框;完美排雷 = 金光带加倍+「完美排雷 ×2」横幅、value = 实际有效兑付当量、首份零兑付时高光降级不发;战斗后可经明细回看 overlay 复看完整流水 | B4×5③④ / B1×3①② |
| AC-12 | 状态在场/清空 | 渲染状态槽 | 槽显示 icon(§4.6.1 键)+层数+剩余结算次数点+tooltip(来源+语义);极性按键级表呈现(金满框/红缺框——非 magnitude 符号:负 magnitude 有利行测试例);空态 = 槽隐藏 + 数据框上移 + 图例载空态说明;battle_over 逐槽化光收回 + 微文案 | B3×4①③④ |
| AC-13 | 窗口触发 | 窗口交互 | E 区原位激活(非中央弹窗)+ 至多选 1 件 + usable_now=false 灰置带禁选原因 + 政策注记「未选用件随关卡结束清空」常驻 + 空库存不弹窗 + 选中提交 = 窗口条目位置(选中件库存态必变 Used——缺陷④回归探针)+ 窗口期不被常读刷新 stomped(entry 36 回归)+ D 区去饱和锁输入(明度不变) | B4×5② |
| AC-14 | 含雾板首遇 + 图例/提示系统在位 | 驱动各 hint_id 触发条件(含同 run 重复触发) | 图例面板「迷雾 = 无雷盲区」条目恒在可随时回看、载状态空态说明;雾首遇提示每 run 一次、非模态不劫持输入、必含三要点;chord 提示每 run 一次含「点数字格 = 移动小人」锚点;no_adjacent 首次提示;hint_id 去重生效(同 run 二次触发零 toast) | A2×6③ / A4×3①② |
| AC-15 | 程序化占位渲染全组件集 | 键位映射表挂接核查 + 未知键注入 | 全部 icon/徽章/线索经键位映射表挂接(数据键→纹样 ID);§4.6.1 七键/§4.6.2 八键/§4.6.3 五键/§4.6.4 姿态键逐一在位;未知键 = fail-fast 断言 + "?"占位 + 诊断(禁静默空图标);sapped 键未入 StatusEffectTable 前零引用 | 键契约执行 |
| AC-16 | battle_over 与 level_clear 信号(关卡末战) | 清空反馈逐项到达 | battle_over:RAP 数字滚动归零+微文案、状态槽逐槽化光+微文案;level_clear:库存逐件化光飞出+「剩余道具 ×N 随关卡结束清空」(N = 清空前快照计数);两反馈不合并、时序不倒挂 | A3 / B3×4④ / B4×5⑤ |
| AC-17 | 判定行 verdict=win/lose(Boss encounter 变体) | 终局呈现 | 胜利 = 金蜡封落于扫雷图区中央+暖白金 overlay+判定行+明细回看入口;失败 = 暮蓝 overlay(明度不变)+旗化光点收回+判定行;判定行内容 = B1 终局判定行投影(数据锚);Boss 战 = 紫赤影子爬棋盘一次性演出 + 阶段指示附 Boss 名 | 终局与变体 |
| AC-18 | 完整对局驱动 | 采集 playtest JSONL | 六类 ux 行按规则 17 载荷表 #13 schema 写入 playtest JSONL(字段名与值域逐项对表);ux_round_exit.path_tag 值域 = 上游封闭枚举 | 遥测 |
| AC-19 | 真实实例化战斗屏场景(探针场景加载、autoload 在位) | 驱动完整对局(两场遭遇 × 含雾板 × 窗口选用/跳过 × 刷新 × 胜负两终局) | 全程零脚本错误(stderr 归零)+ 五区断言 + 首格可点计时 ≤500ms(切片 ui_probe/click_probe 模式扩展) | 战斗屏场景级探针 |
| AC-20 | AC-19 对局至 despawn 与 battle_over 之后 | 静态扫描 views/ 文件集 + 终局后重放渲染比对 | 呈现层对核心生命周期状态的读数 = 零(静态扫描:views/ 文件集禁 `is_battle_live()` 以外的核心状态位读取、禁核心内部字段访问——只许成文呈现面);终局呈现数据全部来自流水行/快照(断言终局后重放渲染与实时渲染逐像素一致——快照自包含判据) | 信号时点状态可见性——缺陷②回归 |
| AC-21 | 逐一打开全部模态覆盖层(含叠开) | 逐层打开 / 关闭 | 每层打开时遮挡物隐藏/输入锁定断言成立、关闭逐层恢复;TunePanel 默认不可见(显式初始化) | 模态层级——缺陷⑤回归 |
| AC-22 | 悬停 tooltip 最长文案 / 明细行 40% 膨胀宽度构造 | 渲染后截图差分 | 全部动态区固定槽高 + clip_contents:布局零推挤(截图差分断言) | 布局稳定——缺陷①回归 |
| AC-23 | 全部中文文案界面 | 渲染 + 字形覆盖抽测 | 全部中文文案渲染非豆腐块(字形覆盖抽测——ADR-0003 硬性前置) | CJK 字体 |
| AC-24 | AC-19 对局全载荷流 + 六面回执 | 探针逐字段断言 + 代码走查 | 探针对规则 17 载荷表 #1–#9 载荷逐字段断言(消费侧校验——缺字段/多字段 = 失败,切片"窗口载荷缺 round_index"崩溃回归);#12 命令式刷新面 = 代码走查(旗插拔/移动/AP/RAP/状态/库存六面各一个回执后重查断言) | payload schema 消费断言——硬性要求①兑现 |
| AC-25 | 呈现层文件集 | 静态扫描 / grep | 零 `randomize()`/`randi()`/`randf*`(S1/S2)、零玩法数值字面量(期望值经只读面推导——人工三要素口径 warning 级 + AC-1/2/8 表读值推导合成判定)、核心写调用仅组合根(S7 呈现侧)、切片 provisional 名(`request_refresh_active` / `can_request_refresh` / `refresh_max_per_round` / `during_round`)零残留(grep 断言——entry 35 命名统一核销);每视图单元头注含「实现 GDD:design/gdd/d1-hud-framework.md(系统 ID D1)」溯源行 | 静态扫描与命名 |
| AC-26 | 1280×800 全量界面(含 AC-19 对局) | 截图抽测 + 静态扫描 + 探针 | 字号下限成立(棋盘数字 ≥18px / 明细正文 ≥14px / tooltip ≥13px);无闪烁 >3 次/秒(动画时长/频率参数扫描);减动效开启 = 全部转场/高光/演出减半或跳终态、结算逐行兑现降速不跳过(探针断言);AC-19 对局全程纯鼠标驱动(零键盘依赖) | 可访问性基线(规则 22) |
## 版本历史
| 版本 | 日期 | 改动 |
|---|---|---|
| v2 | 2026-09-14 | 两件套迁移:按模板 v2 重排——设计推演(存在理由/候选取舍/数值论证/体验锚点论证)与审计附录(切片教训落位表/覆盖矩阵/冲突清单/复核注记)迁至 `design/gdd/analysis/d1-hud-framework.md`;规则 1–22 / F1–F2 / AC-1–26 / OQ1–12 / 27 项义务台账编号全保留,零规则与数值变更 |
| v1.1 | 2026-09-14 | /design-review(lean)NEEDS REVISION 同日核销:F1 改两档定值 + 可行性校验式(原闭式在固定边距下无法同时得出 36/45——用户裁决方案 A);呈现面 API 接口漂移登记扩条(冲突⑧/OQ3 覆盖 B1×5 函数 + B2×2 投影 + settlement_snapshot 信号);状态头 C3 状态更正(Designed 非 Approved);C1-lite 切片契约注记(C1 GDD 定稿时回填);新增 AC-26 可访问性基线(字号下限/无闪烁/减动效/纯鼠标)并扩覆盖矩阵 Rule 22→AC-23/26;"尸位"用语替换为直白表述;RAP 文案模板改表读值占位 |
| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;核心规则/枚举/边界情况/AC 转表格;呈现刷新链路转字符画 + 出口分发表;13 项载荷 schema、27 项呈现义务台账、意图线索目录、切片教训落位表、冲突清单、25 条 AC 全保留;语义与当日定稿版对齐,零规则变更 |
| v1 | 2026-09-13 | /design-system 一次会话定稿:27 项呈现义务落位 + 22 条核心规则 + 13 项载荷 schema 成文 + 25 条 AC + 三条切片硬性要求(solo 模式出稿,未经 /design-review) |