78 KiB
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 项上游呈现义务没有兑付点。
- 「我看见的每一步都是真的」——四种格态一瞥可辨、每次拒绝可感知、结算逐行可归因(P1 感知面)。
- 「这个结果是我哪步扫雷带来的」——结算明细逐行兑现且每行带来源标注;四类未生效行不静默、零值行不被吞(P2 呈现半边)。
- 「挖掘期一块干净的玻璃,结算期一场丰收」——能量档转场由 D1 承载:挖掘 2/10 → 结算 7/10 → 清图 8/10 → 失败 1/10(P4 容器)。
- 「完美被加倍看见」——完美排雷全屏喝彩级反馈、标中旗与 H2 清图奖励金框行(高光节拍)。
- 界面绝不替玩家思考、绝不静默改判、绝不用装饰伪装逻辑差异——玩家对 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:界面只当翻译不当裁判——数值不写死、对错不自己判、核心数据不碰
- D1 显示任何玩法数字时,全部从上游系统只读接口现读现显;不写死玩法数值。
- D1 遇到"动作合不合法、结果算什么意思"时一律交上游裁定;只把裁定结果翻译成画面,不自行判对错。
- 玩家改变游戏状态的操作(挖格 / 插旗 / 选道具),D1 只递话;写调用唯一发生在组合根一处。
- 界面单元只做两件事:向外发信号、被 setter 注入数据后就地刷新(字段级 setter,禁全量重建)。
依据:视图单元九件套 = BoardView / HUDView / HudPresenter / BattleLogView / ItemWindowOverlay / NodeOverlay / LevelStripView / TunePanel / UiKit(切片九单元形态转正);读表口径 = D2 Rule 1 对呈现消费面的适用;写路径唯一入口 = 组合根(ADR-0003 Key Interfaces)。无计算。
规则 2:界面听消息只走中转,不私接玩法系统的线
- D1 永不直接订阅 A2 / A3 的通知;要听的消息全部由组合根接线转发,或直接来自 B1 步骤流信号与 runner 信号。
- 棋盘 / AP / RAP / 库存等"不发通知"的数据面,D1 在动作调用返回后由组合根立刻重查只读面刷新(命令式回执);不干等通知信号。
依据:订阅纪律固化自 ADR-0001;battle.md §Events Fired 的"呈现订阅 A2 三事件"表述按本条收窄为"经组合根转发或命令式回执"(冲突清单⑥,见 analysis 附录 C)。无计算。
规则 3:读数据只走登记过的口子,内部字段一律不碰
- 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:界面的每个动作都走同一条提交通道,总闸只有组合根
- 玩家在界面上能发起的每类操作各只有一条提交通道,全部先过组合根这道总闸再转给对应系统;不存在绕过总闸的第二写入口。每帧至多提交一批意图(规则 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:界面收到的每份消息,字段清单先写成合同
- 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:对象销毁前先拍快照——界面永远不回读已销毁的东西
- 核心对象销毁前后,D1 不准"回头查"核心内部——只许用三样东西:消息载荷自带的数据、销毁前已取好的快照、封装好的只读投影。
| 细则 | 内容 |
|---|---|
| 销毁前捕获 | 终局与死亡的呈现数据(血条归零、卡体灰化、判定行)在核心对象销毁前已进流水行与快照 |
| 载荷自包含 | 每行流水自带来源 / 值 / 目标——界面不按行序反推目标状态机、不回查容器补数据 |
| 生命周期态禁读 | "战斗还能不能刷"只准问 is_battle_live() 与阶段投影,禁止读核心对象内部状态位 |
- 敌卡死亡灰化后仍留场的呈现 = 就地更新保留的最后已知投影(规则 6);不回读 Dead 句柄以外的任何东西。
依据:销毁时序 = B1 判定段先于 battle_over 清理序列(快照含 despawn 前终局);自包含字段 = target / effect_id / pool_value / origin_cell;生命周期观测口经组合根;AC-20 静态扫描承载。无计算。
规则 20:切片里的临时名字统一换成正式名
- 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:战斗画面分五区常驻同屏,棋盘与敌人不切场景
- 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 数字可读) |
| 顺位徽标 | 它第几个出手(固定顺位可读) |
| 意图徽标 | 下一拍它要干什么——把即将执行的一拍的视觉状态摆出来;挖掘期全程可见,结算期不另设播片 |
| 行为环点 | 行动周期多长(环点数 = 环长)、现在走到哪(当前位置高亮) |
| 状态槽 | 它身上挂着什么增益减益 |
- 伏击层数是全体敌人共享的一个数——各卡显示同一个值(数据源 = B1 流水经 B3 投影)。
- 敌人死亡 = 血条直角递减归零 → 卡体灰化 + 碎裂退场;禁止瞬间消失。
- 战斗段被短路掐灭的重击不单独产行动明细行(从行序可推断)。
- 敌卡刷新必须就地更新(字段级 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:弹层排队进出——打开哪层,哪层就真的能用
- 全部模态弹层(图例面板 / 明细回看 / 胜利 overlay / 失败 overlay)走同一张登记序栈:统一入栈出栈、后开置顶、关闭逐层恢复;任何一层打开时,被它遮住的东西要么隐藏、要么锁输入。
- 道具窗口不是模态:不入栈,但锁 D 区输入(规则 13)。
- 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——本轮结束 |
- 单意图帧:一帧内收集到的意图整批提交,点到停手当帧收集立即终结;F4 语义序仲裁只作防御性兜底(生产面造不出会乱序的输入)。
- 悬停预承诺:光标按目标切换三种语义、目标格边框高亮——点下去会发生什么,先看见再点。
- 可挖域常驻指示:小人八向相邻的未开格呼吸微光,是挖掘期唯一在动的元素。
- 悬停不可挖域 = 禁止光标 + 每 run 一次提示「需先走近(点击已开格移动,免费)」。
- 点击远格自动"先移动再挖"的复合意图本期不做(见 P1/P2 后置表)。
依据:光标三语义见「光标语义」;no_adjacent 提示见「一次性提示 hint_id」;义务源 = A2×6①③⑥。无计算。
规则 8:悬停已开的格,先画给你看小人会怎么走
- 玩家悬停任何已开格时,D1 立刻把小人到该格的合法路径用蓝色细线点迹画出——它是合法性指示,不是穿行动画。
- 移动执行用不超过 150 毫秒的短滑表现;不做"穿行动画轨道"。
- 路径数据 =
compute_move_path的 BFS 结果(不可达返回空)——预览与执行同源。
依据:短滑 ≤150ms 与再议挂 playtest 观测(battle.md OQ5,knob = move_slide_ms);义务源 = A2×6⑤(继承 battle.md 布局决策 D3)。无计算。
规则 9:四种格子一眼分得清,黑白截图也能逐格分类
- 四种格态必须一眼可辨,灰度截图下也能逐格分类——这是左键双义的消歧前提(点已开格 = 移动、点未开格 = 挖),误挖不可逆(花 1 AP、可能触雷)。
- 已引爆的雷格要"可通行可读":已开的底 + 巢穴纹(危险红族)+ 可作移动目标的视觉线索。
- 数字显示判定数据源 =
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:雾格有雾的样子,整片雾开完只报一次"开完了"
- 未开的雾格 = 掩尘完整砖 + 雾纹带——雾身份走形状通道、色相不承载。
- 开过的雾格 = 地板无字 + 底色层淡雾 tint 残留——残留 tint 与"已开 0 格"必须灰度可判定区分(0 格携带"八邻无雷"推理信息,混淆即污染推理)。
- 整片连续雾区全开时,完成信号以视觉合并域为单位一次呈现——相邻两个雾区规则上是独立实例、呈现上合并成一片;禁止逐实例响两次。
依据:雾语义条目(无雷盲区)见图例(规则 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:奖励是什么、包里有什么,随时一眼可读
- 已开的格子里若藏着奖励,格面显示它的家族类型徽章、拾取瞬间档位可读。
- 右侧道具栏是挖掘期的规划面——背包每一件一行(下表);悬停看完整描述与触发注记,但看不到来源——来源归因是结算明细行的职责。
- 奖励身份键全局恒定、跨 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 | 来源 + 语义 + 剩余 |
- C 区固定 4 个状态槽;好坏一望即知:有利 = 金族满框、有害 = 红族缺框——判别按效果键的极性表,不看数值正负。
- 开局没有任何状态 → 整排槽隐藏、HP/攻击/RAP 数据框上移补位;图例面板载空态说明「战斗中拾取的增益在此显示,随战斗结束消散」。
- 状态系统不发任何信号——状态栏刷新绑定在结算编排完成的时点(命令式)。
| 口径 | 内容 | 依据 |
|---|---|---|
| 图标键 | 效果图标七键——形状纹样身份、色相不承载身份 | 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:结算逐行念账——每笔收益标明来源,该高光的当场高光
- 结算推进时,明细带把 B1 流水逐行实时滚出,每行标明「做了什么、多少、到谁头上、因为什么」——玩家能把每一分收益对回自己哪一步扫雷决策。
- 高光分三档:标中旗金框、清图奖励金框、完美排雷全屏喝彩级——庆祝不打在空兑现上。
| 行的类型 | 呈现口径 | 依据 |
|---|---|---|
| 生效行(伤害 / 道具入库) | 实时滚出,逐行来源标注「{行为} {值} → {目标}(来源)」——模板插值,行宽预留 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:轮末道具窗口在道具栏原地亮起,至多选一件
- 结算推进到窗口锚点(授予段之后、增益减益段之前)时,E 区道具栏原地激活:面板点亮金描边、标题换成「轮末道具窗口 · 至多选用 1 件」,阶段指示同步标出窗口锚点位置;棋盘区去饱和 + 金橙色相偏移并锁输入(明度不变)。
- 满血的治疗包灰置、悬停说明禁选原因(「HP 已满 · 禁选」)。
- 选中即承诺——窗口关闭、回结算流,提交的是窗口条目位置;跳过按钮恒在;政策注记常驻「未选用件随关卡结束清空」。
- 背包为空就不弹窗(窗口标记照常登记——回放输入完整性归 B1),结算零停顿。
- 窗口期棋盘输入不竞争(结算期棋盘本就锁输入);窗口激活期间跳过常读条全量重建——全量刷新会冲掉窗口态。
依据:E 区原位激活 = battle.md 布局决策 D2;usable_now 投影 = B1 组装载荷;去饱和 + 金橙偏移 = art-bible §2 明度恒定硬规则的合规化实例;窗口触发政策 = MVP 有库存恒弹(候选取舍见 analysis);义务源 = B4×5②。无计算。
设计意图:本节每条呈现口径都是"把每一分收益对回玩家哪一步扫雷决策"的落点——P2 裁剪判据的最后半米由 D1 走完。
提示·终局反馈·美术与可访问性
规则 14:新机制第一次遇到给提示,忘了随时查图例
- toast = 棋盘区上缘内侧浮出的非模态提示:自动消退 2.5 秒、不劫持输入、不打断挖掘流。
- 一次性提示共三种(雾首遇 / chord 肌肉记忆 / 不可挖域走近),每个整 run 只弹一次;拒绝、voided、零合法板的提示不属于一次性族——每次都要可感知。
- 图例面板 = 模态覆盖层:格态 / 变异 / 雾语义三组条目,「迷雾 = 无雷盲区」条目恒在、不设解锁门、可随时回看,并载状态槽空态说明(规则 11)。文案定稿权归实现期文案 pass——本规则只锁必含要点与形态。
依据:义务源 = A2×6③ / A4×3①②。无计算。
规则 16:一场打完,输了赢了、剩什么没了什么,样样有交代
- 六种反馈各有触发与呈现(下表)。
- 暮蓝 overlay 是全部界面里唯一的暮蓝档、明度不变——失败氛围靠色相与运动表达、不靠变暗。
- 不存在"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:美术没画好先用代码画的占位图顶着,占位图同样要过硬指标
- 全部等终稿美术的面(砖面 / 雾纹 / 敌像 / 图标 / 徽章 / 立绘 / 蜡封)以程序化占位先行:色值直接取冻结色板、形状按形状语言参数域用代码绘制(圆角砖 / 直角数据框 / 纹带形);图标、徽章、线索按键契约挂进键位映射表(数据键 → 占位纹样 ID,一键一槽位)——终稿美术到位时零数据层改动、零运行时换图。
- 占位图同样要过硬指标:数字可读性(1–8 全档对格底 ≥4.5:1、0.5× 缩放可辨、纹带不侵数字字形区)必须通过。
- 样张定稿 = 砖面形态与色板的冻结闸、终稿资产开工的前置;样张批不阻塞 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 最小闭环
- 玩家进入战斗屏——五区同屏就绪,≤500ms 内首格可点。
- 挖掘期鼠标操作经单意图帧整批提交
settle_batch(唯一写路径,经组合根)。 - 回执链:组合根立刻重查只读面 → 视图字段级 setter 就地刷新。
- 停手或 AP 尽 →
round_end→ D 区锁输入,明细带展开 84px 逐行兑现(B1 步骤流驱动)。 - 窗口锚点:E 区原位激活,选用/跳过 → 回结算流。
- 判定行 → 终局呈现(胜利金蜡封 / 失败暮蓝)+ 状态槽全清 + RAP 清零反馈。
- 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) |