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

78 KiB
Raw Blame History

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() 与阶段投影,禁止读核心对象内部状态位
  1. 敌卡死亡灰化后仍留场的呈现 = 就地更新保留的最后已知投影(规则 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)