Files
gplan-2/design/ux/battle.md
T
2026-09-14 18:18:49 +08:00

428 lines
45 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.
# UX Spec: 战斗屏(Battle Screen)
> **Status**: Complete — /ux-review 修订落稿(2026-09-12,blocking 7 项已修,待复检)
> **Author**: user + ux-designer
> **Last Updated**: 2026-09-12
> **Platform Target**: PC (Steam)——Keyboard/Mouse 主(全部操作纯鼠标可完成)、Gamepad Partial 非 MVP、Touch None(同 technical-preferences)
> **上游修订依赖**: 弃图刷新挖掘期受理已随 D4 落稿上游(2026-09-12:A3 Active 受理 + 每轮上限 2 次、A2 Active·仅刷新路径装板、B1 `refresh_board` 编排 + 恒 same_board、registry `rap_rules` 同步——见 OQ12)
> **Template**: UX Spec
> **覆盖子屏**: 挖掘阶段主界面 · 轮末自动战斗结算(B1 明细屏) · 道具使用窗口(B4/B1 域屏) · 胜利/失败终局 · 结算明细回看
> **输入义务**: A2×6 + A3 + A4×3 + B1×3 + B2×4 + B3×4 + B4×5(systems-index 门禁增补记录,缺项即 blocking——承接落点见 §13 义务对照表)
---
## Purpose & Player Need
战斗屏是 Dungeon Sweeper 的核心玩法屏——游戏的全部 agency(排雷规划 + 轮末资源决策)都发生在这里。玩家在此屏完成完整轮次循环:**用本轮 AP 在扫雷图上挖掘/标旗 → 主动停手或 AP 耗尽 → 观看轮末自动战斗结算逐行兑现 → 下一轮**。
一句话目的:**让"我算对了"的推理过程与它的战果兑现同屏可见、互为因果。**
- 扫雷图区承载 P1(推理掌控感):数字是主角,一切服务信息可读
- 战斗画面区承载 P2(规划的延迟兑现):扫雷之因逐行兑现为战果,全程可见可归因
- 角色信息/道具区承载规划面:状态、资源、库存常读,支撑"往雾区推进/囤刀待机"类决策(B4 可证伪信号的 MVP 观测面)
若此屏缺失或难用:推理与兑现分裂(自动战斗沦为无聊过场——已登记创意风险)、逐行归因不可见(P2 失败)、AP/RAP/库存不可读(规划失去原料)。
---
## Player Context on Arrival
- **首次到达**:从关卡首节点(战×2 的第一战)进入。MVP 无引导流,A4 雾首遇提示、chord 肌肉记忆提示等非模态提示承担首次教学(见 §States)
- **到达前刚在做**:关卡节点链上点击战斗节点(LevelRunner 推进);或上一场战斗胜利后点下一节点
- **情绪状态**:棋手式清明专注(art-bible §2.1,能量 2/10)——挖掘期画面必须无杂音;结算期转为清算爽感(7/10)
- **到达方式**:游戏推进送入(非自愿导航),进入即处于挖掘阶段(棋盘已 install、初始 3×3 已展开、小人出生)
> ⚠️ Player journey map 未建(`design/player-journey.md` 不存在)。模板位于 ux-design 技能;建议在本 spec 进入实现前补建,以校准各阶段情绪曲线。
---
## Navigation Position
```
存档 → 冒险 → 关卡(节点链,C1-lite) → 【战斗屏】
├─ 胜利 → 节点奖励/恢复覆盖层 → 下一节点(下一场战斗屏)
├─ 胜利(末节点 Boss)→ 关卡结算(level_clear,库存清空反馈)→ 下关
└─ 失败 → 冒险终结 → 返回存档/营地
```
战斗屏是**上下文相关屏**(仅由战斗节点进入),非顶层常驻。关卡内节点进度常驻屏顶(A 区),玩家始终知道自己身处链中第几环。
- 上游屏:关卡节点链(节点地图形态 = 线性,C1 已裁剪为线性第一关)
- 下游屏:节点奖励/恢复覆盖层(NodeOverlay,已有 demo 组件——建议后续单独出 spec `design/ux/node-reward.md`)
- 平行屏:结算明细回看 overlay(本屏内域屏)、图例面板 overlay(本屏内域屏)
---
## Entry & Exit Points
**进入**:
| Entry Source | Trigger | Player carries this context |
|---|---|---|
| 关卡战斗节点 | 点击节点(LevelRunner 推进 encounter) | 携带 HP(跨战斗延续)、库存(关卡域延续)、RAP=0(战斗域新开) |
| 上一场战斗胜利 → 下一节点 | 同上 | 同上 |
**离开**:
| Exit Destination | Trigger | Notes |
|---|---|---|
| 节点奖励/恢复覆盖层 | 敌方全灭(B1 判定段 verdict=win)且非末节点 | 不可逆:battle_over 已发生,RAP 清零 |
| 关卡结算 | Boss 战胜利 → level_clear | 不可逆:库存清空(须可见反馈,B4 D1×⑤) |
| 冒险终结 | 主角 HP=0(verdict=lose) | 不可逆:Roguelike 死亡重开(art-bible §2.5 温柔惋惜调性) |
| 无中途退出 | — | MVP 不设战斗内放弃/暂停菜单(回合制无时间压力;如需暂停留 Playtest 诊断按钮,调试用) |
---
## Layout Specification
### Information Hierarchy
本屏必须传达的全部信息,按注视优先级分五层:
1. **扫雷图本体**(第一注视点,挖掘期占视觉预算大头):四格态(已开 0 格地板/已开雾格无字/未开格/未开雾格——A2 D1×6② 一眼可辨)、数字、旗、小人、可挖域(8 向相邻常驻指示)、变异纹理(迷雾)
2. **本轮行动资源**:AP 余量(决定还能挖几格)、停手/弃图刷新按钮——紧贴棋盘上缘(动作发生地)
3. **战果兑现面**(结算期为第一注视点):敌人血条变化、逐行结算明细、高光(完美排雷/标中旗)
4. **规划面**(边缘注视,常读):HP、攻击、RAP 池、状态效果(己方/敌方)、库存列表、敌人意图徽标与顺位
5. **进度语境**:轮次/阶段指示、关卡节点进度、雾图例入口
依据:挖掘期玩家视线锚定棋盘(art-bible §2.1"视线始终被数字牵引");结算期视线转向战斗画面区(§2.2"兑现光带逐行横扫")。规划信息必须常读但不得抢焦——这正是用户布局图三分下栏的合理性:**动作区居中,规划区两翼**。
### Layout Zones
采用用户拍板的布局图(2026-09-12),按 1280×800 基座(ADR-0002)落尺寸:
| 区 | 位置与尺寸 | 内容 |
|---|---|---|
| **A 关卡进度条** | 全宽 × 28px 顶栏 | 节点链步进(⚔战 ◆道具 ⚔战 ⚔战 ♥恢复 👑Boss),当前节点高亮 |
| **B 战斗画面** | 全宽 × 252px | 英雄卡(左)+ 兑现演出区(中)+ 敌人卡 ×1–3(右);底部结算明细带(24px 摘要 / 结算期 84px 实时流);顶部中央轮次·阶段指示 |
| **C 角色信息** | 左下 240px × 520px | HP 条、攻击值(含修正显示)、RAP 池、状态效果槽(固定 4 槽)、小人立绘占位 |
| **D 扫雷图** | 中下 ~760px × 520px | 顶部 AP 条(44px:左——AP 点阵 + 停手按钮;右——图例按钮 + 弃图刷新按钮〔雷图右上角,2026-09-12 拍板〕);棋盘主体(居中,格 36–45px 见方);toast 槽(上缘内侧) |
| **E 道具** | 右下 280px × 520px | 库存常读列表(固定槽高 + clip_contents——缺陷①教训);窗口期原位激活为道具使用窗口 |
**布局决策 D1(本 spec 最大决策,用户拍板)**:**常驻双舞台分屏**——战斗画面与扫雷图同屏常驻,挖掘期敌人待机可见,结算期不切场景。
- 备选(已否决):Peglin 式"结算时才切入独立战斗场景"——切换打断推理心流,且资产管线成本翻倍
- **对 B5 双舞台陷阱的输入**:game-concept 登记的"战斗发生在棋盘上还是独立场景"悬念,由本布局裁决为**第三形态:同屏双舞台**。B5 前的"战斗表现美术测试"(一屏样张)应按此布局出样
- 敌人不占格(B2 已锁)与本布局自洽:敌人实体只存在于 B 区,棋盘永远只有数字/旗/小人/变异
**棋盘格尺寸公式**:`cell = floor(min(D宽−padding, D高−AP条−padding) / N)`,N∈{10,12}(A1 D1–D4 行)。1280×800 下 12×12 → 36px,10×10 → 45px。数字字号 ≥ 格高的 50%,像素字体整数倍缩放(canvas_items stretch 保证清晰,ADR-0002)。
### Component Inventory
| 区 | 组件 | 类型 | 内容 | 交互 | 现有 demo 组件 |
|---|---|---|---|---|---|
| A | LevelStripView | 步进条 | 节点链 + 当前位置 | 只读(点击节点不可跳) | ✅ level_strip_view.gd 迁移 |
| B | 英雄卡 | 卡片 | 小人像、HP 条、攻击值、状态效果槽 ×4 | 只读 | HUDView 拆分 |
| B | 敌人卡 ×1–3 | 卡片 | 敌像、血条、顺位徽标、意图徽标、行为环点、状态槽(含敌方 side 池口径:伏击层数为全体敌人共享单值、各卡同值呈现——数据源 = B1 流水经 B3 投影,B2×4④) | 只读 | 新建 |
| B | 轮次·阶段指示 | 标签 | "第 N 轮 · 挖掘中/结算中/道具窗口" | 只读 | 新建 |
| B | 结算明细带 | 滚动列表 | 结算期逐行流水(B1 13 类行协议);挖掘期收起为上轮摘要 1 行 | 点击展开明细回看 overlay | battle_log_view.gd 改造 |
| B | 结算明细回看 | 模态 overlay | 完整流水逐行(四类行呈现,B4 D1×③) | 关闭 | battle_log_view.gd 改造 |
| C | HP/攻击/RAP 显示 | 直角细线数据框 | 当前值/上限、修正来源角标 | 只读;RAP 清零有可见反馈 | HUDView 拆分 |
| C | 状态效果槽 ×4 | 图标槽 | effect_id→icon(形状+色相双通道)、层数角标、剩余结算次数点 | 悬停 tooltip(来源+语义) | 新建(B3 D1×①) |
| D | AP 条 | 点阵 + 按钮组 | 本轮 AP 点阵、停手按钮(左)、弃图刷新按钮(右端·雷图右上角;RAP−8 · 本轮剩 N 次——上限 2 次已随 A3 2026-09-12 修订生效) | 点击提交意图 | HUDView 拆分 |
| D | BoardView | 网格 | 棋盘全部格态 + 小人 + 旗 + 雾纹带 + 奖励身份 icon(已开格;绘制优先级 数字>小人>旗>奖励徽章>变异纹带>底色——徽章不进数字区,样张验收项) | 左/右键意图提交 | ✅ board_view.gd 迁移 |
| D | 悬停预承诺光标 | 光标态 | 移动/挖/旗三语义光标 + 目标格边框高亮 | 自动 | 新建(A2 D1×6③) |
| D | 可挖域指示 | 常驻微高亮 | 小人 8 向相邻可操作格 | 自动 | 新建(A2 D1×6③) |
| D | 移动路径预览 | 路径高亮 | 悬停已开格显示 BFS 路径(合法性指示) | 自动 | 新建(A2 D1×6⑤,裁决见下) |
| D | toast 槽 | 非模态提示 | 拒绝原因(双源)、voided、满层溢出、雾首遇、chord 提示、零合法板告知 | 自动消退 2.5s | 新建 |
| D | 图例按钮 + 面板 | 按钮+模态 overlay | 格态/变异/雾语义图例("迷雾 = 无雷盲区"条目恒在) | 开/关 | 新建(A4 D1×②) |
| E | 库存列表 | 固定槽高列表 | 逐件:icon+名称+属性简述+状态;枚举序 = stock 受理序(E21) | 悬停 tooltip(完整描述+触发注记);窗口期点选 | item_window_overlay.gd 改造 |
| E | 道具使用窗口态 | 面板原位激活态 | "轮末道具窗口 · 至多选 1 件"+ 时机指示 + usable_now 禁选态 + 跳过按钮 + 触发政策注记 | 点选/跳过 | ✅ item_window_overlay.gd 改造(形态裁决见下) |
| 全屏 | 胜利/失败 overlay | 模态 | 金蜡封/暮蓝收旗 + 判定行 + 明细回看入口 | 继续/下一节点 | node_overlay.gd 扩展 |
| 调试 | TunePanel | 调试面板 | atk%/hp% 滑条 + 批量模拟(正式侧归 C4,切片调试入口保留) | 调试 | ✅ tune_panel.gd 保留 |
**布局决策 D2 — 道具窗口形态 = 右栏原位激活**:窗口触发时 E 区面板点亮描边、标题切换为窗口态,棋盘侧去饱和 + 金橙色相偏移锁输入(明度不变——art-bible §2 明度恒定合规化,2026-09-12)。
- 备选(已否决):中央模态弹窗——遮挡结算演出首屏(授予段刚完成的视觉记忆),且库存常读位置与窗口位置分离造成空间记忆断裂
- 依据:窗口期棋盘输入本就不竞争(结算期棋盘不可交互,A2 单意图帧先例),无模态必要性;B1 窗口锚点 = 授予段后、增益/减益段前——玩家需同时看库存与刚到手的奖励
**布局决策 D3 — 移动路径预览 = 合法性指示**(A2 D1×6⑤ 悬案裁决):悬停已开格时高亮 BFS 路径(小人蓝细线点迹),移动执行为 ≤150ms 短滑。
- 备选(登记不采纳):穿行动画轨道——移动免费高频,动画时间税违反 P4 点击摩擦护栏(每轮输入动作:AP ≤2 的观测假设);正式版若 playtest 反馈"移动太瞬"再议(留痕)
**布局决策 D4 — 弃图刷新 = 挖掘期当场换图(2026-09-12 用户拍板,同日落稿上游)**:按钮置 AP 条右端(雷图右上角)。点击即当轮就地换新图继续挖——AP 不重置、剩余 AP 保留,RAP−8,本轮上限 2 次。
- **上游修订(2026-09-12 已落稿,OQ12)**:① A3 `request_refresh` Active 相位受理 + 每轮上限 2 次(Waiting 代理退役)② A2 装板受理域增 Active·仅刷新路径 ③ 编排 owner = **B1 `refresh_board`**(A3 扣费 → A2 retire → A1 generate → A2 install → B4 roll_board 恰一次;无结算段、无 round_end——B1 编排唯一性原则保持)④ 旧板旗随旧板**作废**(零兑付、旗 AP 不返还——A2 EC11 全量重置承载;确认微交互须显式提示)。**经济预警**:当场刷新无结算发生,原「敌方时间税」自惩失效——A3 OQ3 弃图率/刷新率预警阈值联动复核。
- 备选(已否决):结算期决策提示(Waiting 内联)——结算期不做刷新决策(用户拍板);挖掘期预承诺 stop+reroll 复合——决策即终轮,不符「换图继续挖」语义。
**敌人意图线索映射目录(B2×4① 成文占位,2026-09-12)**:
| enemy_id | 视觉状态(意图线索) | 强度档位编码 | 环长编码 |
|---|---|---|---|
| grub(蛆虫) | 攻击 ×1 态 | 小体量墩形 = 轻击 | 环点 1 |
| ambusher(伏击者) | 攻击 / 蓄力 / 重击 ×3 态 | 垂直延伸体量 = 重击(heavy_multiplier) | 环点 = 拍数 |
- 预告时序 = **下一拍预告**(当前拍视觉状态),挖掘期全程可见;结算期不另设意图播片(B2 Rule 8⑤)
- 映射键 = enemy_id,跨 run 恒定、禁止重掷(B2 Rule 8③);形状 + 色相双通道(art-bible 约束)
- 资产定稿归 B5;本表为 D1 侧成文占位(B2 Visual Req 2 口径:grub 1 态 / ambusher 3 态)
### ASCII Wireframe
```
1280 × 800 ────────────────────────────────────────────────────────────────────
┌─[A] 关卡进度条 28px ─────────────────────────────────────────────────────────┐
│ ⚔──⚔──◆──⚔──⚔──♥──👑 (当前节点高亮,已过节点暗金) │
├─[B] 战斗画面 252px ──────────────────────────────────────────────────────────┤
│ ┌────────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 英雄卡 │ 第 3 轮 · 挖掘中 │ ①蛆虫 │ │ ②蛆虫 │ │
│ │ [小人像] │ │ HP▓▓▓░ │ │ HP▓▓░░ │ │
│ │ HP▓▓▓▓░ │ [ 兑现演出区 ] │ 意图:爪击 │ │ 意图:蓄力 │ │
│ │ 攻 6 (+50%) │ (结算期: 光带→弹道→受击) │ 环 ●○○○ │ │ 环 ●●○○ │ │
│ │ 状态 ⬆2 ·🛡1 │ │ 状态 ⚡2 │ │ 状态 🛡1 │ │
│ └────────────┘ └──────────┘ └──────────┘ │
│ ├─ 结算明细带 ────────────────────────────────────────────────────────────┤ │
│ │ ▸上轮: 主角攻击9→蛆虫-9 | 攻击+50%(1结算) | 伏击+3×2 … [展开明细▾] │ │
│ └────────────────────────────────────────────────────────────────────────┘ │
├─[C] 角色信息 240px ───┬─[D] 扫雷图 ~760px ────────────┬─[E] 道具 280px ─────┤
│ 520px │ 520px │ 520px │
│ ┌──────────────────┐ │ ┌───────────────────────────┐ │ ┌─────────────────┐ │
│ │ HP 42/50 ▓▓▓░ │ │ │ AP ●●●●●○○○ 5/8 │ │ │ 道包 · 关卡域 │ │
│ │ 攻击 6 (+50%) │ │ │ [⏹停手] │ │ │ (窗口态标题位) │ │
│ │ RAP ▓▓▓░ 3/8 │ │ │ [?图例] [↻刷新 8|剩2] │ │ ├─────────────────┤ │
│ ├──────────────────┤ │ │ ┌─toast────────────┐ │ │ │ 🗡 小刀 │ │
│ │ 状态效果 │ │ │ │AP不足·剩0点 │ │ │ │ 伤害 · 一次性 │ │
│ │ ⬆攻击+50% ○1 │ │ │ └──────────────────┘ │ │ ├─────────────────┤ │
│ │ 🛑减攻−65% ○1 │ │ │ 12 12 1 ░ 2 ▓▓ ▓▓ │ │ │ 🗡 精工短刀 │ │
│ │ (槽×4 固定) │ │ │ 12 █ 1 1 2 ▓▓ ▓▓ │ │ │ 高伤 · 一次性 │ │
│ ├──────────────────┤ │ │ 1 2 2 🚩 █ 2 1 │ │ ├─────────────────┤ │
│ │ [小人立绘占位] │ │ │ ░ 1 ▓▓ 👫 1 1 ░ │ │ │ ❤ 治疗包 ×1 │ │
│ │ │ │ │ ▓▓雾 1 1 ░ ░ 2 ▓▓ │ │ │ 回复 12 · 可用 │ │
│ └──────────────────┘ │ │ ( █=可挖域微光 👫=小人) │ │ └─────────────────┘ │
│ │ └───────────────────────────┘ │ │
└───────────────────────┴───────────────────────────────┴─────────────────────┘
窗口态(E 区原位激活,轮末道具窗口):
│ ┌─────────────────┐ 面板描边点亮(金),D 区去饱和锁输入
│ │ ⏳ 轮末道具窗口 │ 时机指示:位于授予段后、增益段前
│ │ 至多选用 1 件 │
│ ├─────────────────┤ 可用件高亮可点;满血治疗包灰置+禁选原因
│ │ 🗡 小刀 [选用] │ 选中即承诺(照常消耗拍板)
│ │ 🗡 精工短刀[选用] │
│ │ ❤ 治疗包(满血) │ 灰置 + tooltip「HP 已满 · 禁选」
│ ├─────────────────┤
│ │ [跳过] 注记*:未 │ *「未选用件随关卡结束清空」政策注记常驻
│ │ 选用件关卡末清空 │
│ └─────────────────┘
```
---
## States & Variants
| State / Variant | Trigger | What Changes |
|---|---|---|
| **挖掘阶段(默认态)** | 轮次开始 / 结算完毕回 Active 相位 | B 区敌人待机(意图徽标全程可见——B2 Rule 8⑤),D 区棋盘可交互,AP 条点亮;能量 2/10,唯悬停呼吸微光在动(§2.1) |
| **结算阶段** | round_end 触发(AP 尽/停手/清图) | D 区锁输入(棋盘去饱和 + 金橙色相偏移,明度不变,数字保持全对比);B 区播放七段编排演出;明细带展开 84px 逐行滚动;阶段指示→"结算中";能量 7/10 |
| **道具窗口态** | 结算授予段完成后(窗口锚点) | E 区原位激活(决策 D2);空库存不弹窗直接跳过(B4 D1×②);usable_now=false 禁选+原因 |
| **清图瞬间** | 全部安全格开完 | 金粒喷泉 + 彩纸 3–5s 即收(§2.3);清图奖励行强调呈现(H2,B4 D1×④——金框高亮行);随后换新图 install |
| **完美排雷高光** | B1 高光判定(全图标中/零误标类) | 全屏喝彩级反馈(§2.2 最高档):金光带加倍扫射 + 「完美排雷 ×2」横幅——P2 爆发兑现节点(创意风险 #2 落点) |
| **标中旗高光** | flag_judged{hit=true} | 该旗化暴击弹道加重 + 明细行金框——chord 缺席的即时兑现补偿(创意风险 #3 落点) |
| **敌人死亡呈现** | 敌 hp=0(流水行击杀标记) | 该敌人卡血条归零 → 卡体灰化 + 碎裂退场(**禁瞬消**——B2 资产下限「死亡瞬间须可辨识、不得直接消失」,同等 blocking);战斗段短路的重击被掐灭不产行动明细行,由行序可推断(B1);动画密度归 B5,呈现语义在本 spec |
| **胜利终局** | verdict=win | 金蜡封落于**扫雷图区中央**(§2.4 字面锚定),全屏暖白金 overlay;判定行 + 「下一节点」;明细回看入口;状态槽全清可见反馈(B3×4④——逐槽化光收回 + 微文案「状态随战斗结束消散」,防「我的 buff 哪去了」误读) |
| **失败终局** | verdict=lose(hero hp=0,战斗段短路) | 明度不变的暮蓝 #5A6C8C 氛围 overlay(全作唯一暮蓝档);小人坐砖掸灰、插过的旗逐面化光点收回(§2.5);判定行 + 明细回看(学习用途)+「返回」;状态槽全清可见反馈(B3×4④,同胜利) |
| **Boss 遭遇变体** | encounter=boss(遗迹守卫) | 战斗开始一次性演出:紫赤 #8F2F6A 影子爬过棋盘(§2.6);敌人卡体量最大+锐角剪影;阶段指示附 Boss 名 |
| **雾图变体(L2+)** | 板含雾格 | 雾纹带双通道呈现;首次含雾板进入挖掘阶段触发一次性首遇提示(每 run 一次);图例恒可回看;**已开雾格保留底色层淡雾 tint**(与已开 0 格可判定区分——OQ8 裁决采纳 2026-09-12;tint 处视觉锚 3 最低层,不遮挡数字);**雾区全开一次性完成信号**(视觉合并域 = 信号单元,禁实例级双响;EC11:双雾区呈现合并、实例独立) |
| **空态:无状态效果** | B3 EC12 | 状态槽隐藏 or 空槽占位——**裁决:槽位隐藏,HP/攻击/RAP 上移补位**(角色信息区纵向空间紧张,空槽占位浪费);图例面板载空态说明(B3 D1×① 成文项) |
| **空态:零库存** | 关卡初/清空后 | E 区显示「道包空空——安全格里藏着补给」(指引性空态,非报错) |
| **调试变体** | 测试模式 | TunePanel 入口(demo 保留,正式侧 C4 退役);Playtest 诊断按钮(卡死转储) |
**拒绝/作废子态**(A2 D1×6⑥、A3 双源——每次拒绝玩家可感知):
- 棋盘面拒绝(sub_reason:非相邻/挖旗格等)→ 目标格 旗朱 #C63D22 边框闪 + toast 文案(图标+文案冗余,色弱清单 #7)
- 资源面拒绝(AP 不足/RAP 不足)→ AP/RAP 数字脉冲 + toast「AP 不足 · 剩 0 点」
- voided(stop 被作废等)→ toast「本轮已清图,停手未执行 · 剩余 AP 已作废」——防静默改判读感欺骗
---
## Interaction Map
**输入前提**(technical-preferences):Keyboard/Mouse 主输入,全部操作纯鼠标可完成;Gamepad Partial 非 MVP 门禁(导航序留 Open Questions);Touch None。
| 组件 | 动作 | 输入 | 即时反馈 | 结果(经组合根) |
|---|---|---|---|---|
| 未开相邻格 | 挖掘 | 左键 | 格碎裂 + 连锁展开(免费)+ 奖励身份揭显 | 意图入当帧批次 → A2 `settle_batch` |
| 已开格 | 移动 | 左键 | 悬停时路径预览高亮(D3);执行 ≤150ms 短滑 | 意图入批(BFS 移动,免费) |
| 未开格 | 插旗 / 已旗格拔旗 | 右键 | 旗落下/移除(旗朱) | 意图入批(1 AP / 免费) |
| 停手按钮 | 主动结束轮次 | 左键 | 按钮下压 + AP→RAP 飞行数字 | `settle_batch([stop])`(**经 A2 批次,不直调 A3**——A2 D1×6①) |
| 弃图刷新按钮(雷图右上角) | 当轮就地换图继续挖 | 左键 | 确认微交互(RAP−8 代价显式 + 旧板弃置提示);RAP<8 → 资源面拒绝可见(EC13) | `request_refresh`(**Active 相位当场换图继续挖**——AP 不重置、本轮剩 N 次扣减;**上游已修订受理——见布局决策 D4/OQ12**) |
| 图例按钮 | 开图例 | 左键 | 模态 overlay | 恒可开(A4 图例条目恒在) |
| 结算明细带 | 展开回看 | 左键 | 明细 overlay | 只读 |
| 状态/道具 tooltip | 悬停 | hover | 状态 tooltip(来源+语义+剩余);道具 tooltip(完整描述+触发注记——不含来源) | 只读 |
| 道具(窗口态可用件) | 选用 | 左键 | 选中态高亮 → 窗口关闭回结算流 | `submit_window_selection(窗口位置)`——**传窗口条目位置,非库存句柄**(缺陷④契约) |
| 道具(窗口态禁选件) | — | 左键无效 | 禁选原因 toast(满血治疗包) | 无 |
| 跳过按钮 | 跳过窗口 | 左键 | 窗口关闭 | 空选择序 |
| 胜利 overlay | 下一节点 | 左键 | → NodeOverlay / 关卡结算 | LevelRunner 推进 |
| 失败 overlay | 返回 | 左键 | → 存档/营地 | 冒险终结 |
**单意图帧纪律**(A2 D1×6⑥):一帧内 collected 意图整批提交,stop 点击终结当帧收集;F4 语义序仲裁为防御性兜底。悬停预承诺三态光标:移动(箭头)/挖(镐)/旗(旗形)——左键双义(移动 vs 挖)的消歧完全依赖四格态一瞥可辨 + 光标区分(误挖不可逆的感知保险)。
**复合意图(A2 评估项留痕)**:点击远格 = 自动 move+dig 的两击摩擦消解——**MVP 不做**(留痕 2026-09-12:免费移动高频,两击摩擦符合 P4 ≤2 观测假设;A2 L298 评估项)。
**可挖域常驻指示**:小人 8 向相邻未开格呼吸微光(§2.1 唯一在动的元素);不可挖域(非相邻)悬停显示禁止光标 + 首次 toast 提示「需先走近(点击已开格移动,免费)」。
**chord 肌肉记忆首遇提示**(A2 D1×6③):经典扫雷玩家首日尝试双击快开时,非模态 toast 每 run 一次:「本作无双击快开——插旗后轮末自动判定标中;点数字格可移动小人」(含 A2 登记锚点「点击数字格 = 移动小人」)。文案定稿权归实现期文案 pass。
---
## Events Fired
项目无分析系统;本节 = **呈现层订阅的核心信号**(ADR-0001 组合根直连 signal)+ playtest 遥测义务(playtest_logger.gd 已有五类行)。呈现层新遥测(写 playtest JSONL `ux` 行):
| Player Action | Event Fired | Payload / Data |
|---|---|---|
| 每轮结束 | `ux_round_input_ratio` | 原始输入动作数∶AP 消耗(A3 P4 ≤2 护栏观测,A2 D1 遥测义务) |
| 停手/清图 | `ux_round_exit` | path_tag {stopped, ap_exhausted, cleared}(对齐上游封闭枚举)——弃图率(C3 OQ4)观测 |
| 弃图刷新(挖掘期,非轮出口) | `ux_refresh_attempt` | {result: accepted/rejected_rap/rejected_cap, round_refresh_index: 1..2}——刷新使用(C3 OQ6)与 OQ3 预警阈值观测;每轮 0–2 次(D4 cap=2) |
| 窗口选用/跳过 | `ux_window_choice` | {selected_item_id, usable_now, skip} |
| 拒绝/voided | `ux_reject` | {source: board/resource/phase, sub_reason} |
| 提示触发/关闭 | `ux_hint_shown` | {hint_id: fog_first/chord/no_adjacent} |
| 呈现订阅(不改核心) | A2 三事件 / B1 步骤流(13 类行协议,含终局判定行) / battle_over / level_clear | 载荷 schema 成文义务见 §Data Requirements——entry 17 D1 硬性要求① |
**持久状态写入**全部经组合根唯一路径(settle_batch / submit_window_selection / request_refresh / runner 推进)——UI 层禁直调核心写(架构七原则"依赖单向组合根")。
---
## Transitions & Animations
| 时刻 | 过渡 | 依据 |
|---|---|---|
| 进入战斗屏 | 棋盘 install 淡入(200ms)+ 初始 3×3 展开涟漪 + Boss 战先播紫赤影子爬棋盘(§2.6) | A1 install / §2.6 |
| 挖掘→结算 | 明细带自底展开(150ms)+ 棋盘去饱和 + 金橙色相偏移 + 阶段指示翻转 | §2.2 色彩转金橙主导、饱和拉高、明度不变(状态区分经饱和/色相——art-bible §2 合规化 2026-09-12) |
| 结算逐行兑现 | 光带自棋盘行起点横扫 → 开格化箭雨/旗化暴击弹道飞向敌人卡 → 受击闪白 + 血条直角递减 | §2.2 承载元素;因果全程可见可归因(P2) |
| 道具窗口 | E 区描边金光点亮(非弹窗,无缩放突兀) | 决策 D2 |
| 清图换新图 | 金粒喷泉 3–5s → 旧图碎裂淡出 → 新图 install 淡入 | §2.3 短促丰收不拖节奏 |
| RAP 清零(battle_over) | RAP 数字滚动归零 + 「随战斗结束消散」微文案 | A3 可见反馈义务 |
| 敌人死亡 | 血条直角递减至零 → 卡体灰化 + 碎裂退场(禁瞬消) | B2 资产下限(同等 blocking);动画密度归 B5 |
| 状态槽全清(battle_over) | 状态逐槽化光收回 + 「状态随战斗结束消散」微文案 | B3×4④;RAP 清零同款先例 |
| 库存清空(level_clear) | 道包逐件化光点飞出 + 「剩余道具 ×N 随关卡结束清空」 | B4 D1×⑤ |
| 胜利 | 蜡封自上落下弹跳定格 → 碎砖拼纹章 → overlay 暖金渐显 | §2.4 克制不狂欢 |
| 失败 | 全屏明度不变转暮蓝色相 → 旗化光点 800ms 逐面收回 → overlay | §2.5 最静一拍 |
| 减动效选项 | 上述全部动画提供时长减半/直接跳终态开关(项目未建 accessibility 文档前,本项为 spec 内建承诺) | 动议:结算逐行兑现为信息载体不可整体跳过,可加速 |
---
## Data Requirements
| Data | Source System | Read / Write | Notes |
|---|---|---|---|
| 棋盘四格态/数字/雾/可挖域 | A2 只读面(query) | Read | 呈现刷新面 = A2 三事件信号(载荷 schema 成文——entry 17①) |
| BFS 移动路径 | A2 `compute_move_path` | Read | D3 合法性指示消费 |
| 拒绝原因 | A2 `sub_reason` 封闭枚举 + A3 资源面 | Read | 三源(board/resource/phase)映射文案——呈现层契约成文;资源面原因无上游载荷(A3 仅 bool + debug 诊断),客户端按动作上下文推断 |
| AP / RAP / 本轮刷新计数 | A3 | Read | 常显;刷新入口可用性 = RAP 读数客户端预判(RAP≥8)+ `request_refresh` 返回值(A3 无 `can_request_refresh` API——仅 bool 返回 + 只读观测量;EC13 拒绝合法可见) |
| 结算流水行(13 类)+ 四类行 | B1 流水协议 | Read | 逐行来源标注(P2);聚合计数行呈现 |
| 判定 verdict | B1 判定段 | Read | 终局画面数据锚 |
| 敌单位 hp/顺位/意图环下一拍/enemy_id/存活 | B2 只读面 | Read | 意图线索映射全局恒定(D1×4②);**despawn 前捕获**(entry 17③——缺陷②教训) |
| 状态效果投影(含空态/极性/溢出) | B3 投影口径 | Read | 极性映射数据源 = B1 SettlementTable 效果语义,非 magnitude 符号(B3 D1×③) |
| 库存(item_id/状态/枚举序/行值投影)+ 奖励身份 | B4 `query_inventory` / 快照 | Read | reward_id 全局恒定;**属性简述由行值快照投影派生**(伤害/回复/增益一句话);载荷含来源 {cell, round} 但**不呈现于库存列表与 tooltip**(2026-09-12 用户拍板——来源归因职责由结算明细行承载,P2 不受影响);窗口载荷 usable_now 由 B1 组装(B4 零跨系统读) |
| 节点链/当前节点/HP 携带 | C1-lite LevelRunner | Read | A 区进度条 |
| 意图提交 | A2 | **Write** | `settle_batch`(stop 亦经此——不直调 A3) |
| 窗口选择 | B1 | **Write** | `submit_window_selection(窗口位置序)` |
| 弃图刷新 | A3 | **Write** | `request_refresh`(挖掘期 Active 当场受理——D4 2026-09-12 上游已落稿;B1 `refresh_board` 编排承载) |
| 节点推进 | LevelRunner | **Write** | 胜利 overlay「下一节点」 |
| 终局画面数据锚 | B1 判定行(流水行协议) | Read | 「终局判定行 = 胜负画面的数据锚」(B1 UI Requirements);despawn 前状态可见性纪律 = entry 17③(销毁前捕获、**载荷数据自包含**、禁呈现层回读核心生命周期状态);若需独立终局快照信号,须回 B1/实现期 ADR 补登记(B1 现无 `settlement_snapshot` 契约——2026-09-12 评审修正) |
**架构注记**:UI 不拥有任何游戏状态——全部读经核心只读面,全部写经组合根(ADR-0001/0003)。呈现层信号载荷 schema 须在 D1 GDD 成文(entry 17①,缺项即 blocking);场景级 headless 测试进 AC(entry 17②);覆盖层层级断言(缺陷⑤——任何模态覆盖层必须有"打开时遮挡物隐藏"断言)。
**更新触发注记(2026-09-12 评审增补——防实现层等待不存在的信号,entry 17 教训同类)**:旗插/拔与移动成功反馈**零事件外发**(A2 发射面封闭)——经意图调用 `ActionOutcome` 返回值命令式驱动;AP/RAP 读数 A3 无推送信号——组合根每次调用返回后重查;状态效果 B3 纯被动容器零信号——状态栏刷新绑 B1 结算编排完成时点;库存 B4 `query_inventory` 查询面——写路径回执后重查。
---
## Accessibility
项目尚未建 `design/accessibility-requirements.md`(gate-check 缺口,见 Open Questions)。本 spec 内建基线承诺:
- **对比**:全部格底/面板底对数字墨 ≥4.5:1(WCAG AA)——art-bible §4.1 硬指标已可测(#33261B/#C9AF83 = 6.9:1 实测);UI 数据一律墨族素面
- **色弱冗余**:无任何信息仅靠色相承载——四格态靠完整/碎裂形+纹带形;奖励金 vs 危险红靠剪影+运动;UI 红/金强调对加图标+文案冗余;Boss 靠形状独占(art-bible §4.5 清单逐项成立)
- **灰度可辨**:变异格纹带、四格态在灰度截图下可分类(art-bible §3.2 验收标准)
- **非色彩破坏性确认**:弃图刷新(消耗 RAP 8 点)的确认交互与常规确认**不同位**(位置通道,色弱清单 #7)
- **字号下限**:棋盘数字 ≥18px、明细带正文 ≥14px、tooltip ≥13px(1280×800 基座)
- **运动**:无闪烁 >3次/秒;结算光带为方向性扫动非频闪;提供减动效选项(§Transitions)
- **键盘/Gamepad**:MVP 纯鼠标可完成全部操作(technical-preferences 平台注记);**MVP 决策留痕:纯键盘导航/焦点序不做**(2026-09-12——回合制点击驱动,平台仅承诺纯鼠标);gamepad 导航序延后(Open Questions)
---
## Localization Considerations
- **源语言中文(CJK)**:运行时默认字体无 CJK 字形——**CJK 字体随包为硬性前置**(ADR-0003 已锁),实现 AC 覆盖
- **按钮文案单行约束**:「停手」「弃图刷新」「跳过」「选用」——按钮宽度按 4 汉字上限设计;译为英文("Hold"/"Reroll"/"Skip")不超 1.6× 不破版;德语长词("Aufgeben+Neu"类复合词)风险 HIGH——弃图刷新按钮允许两行或图标+缩写
- **明细带行文案**:来源标注格式「{行为} {值} → {目标}(来源)」为模板插值,最长 token = 道具名(4 汉字);行模板预留 40% 膨胀宽度(固定槽高 + clip 兜底)
- **数字格式**:全部整数,无本地化格式需求;AP 点阵为图形载体不依赖文本
- **术语表锚定**:旗/雷/停手/弃图刷新/轮次/结算 已在 GDD 体系内定名,译文须同步 registry terminology(五词条先例)
---
## Acceptance Criteria
**布局与可读**
- [ ] 1280×800 与 16:9 全屏(canvas_items/expand)下五区无遮挡、无重叠、无内容裁切(棋盘 12×12 全部格子 + 数字完整可见)
- [ ] 进入战斗屏 ≤500ms 内可交互(棋盘 install 淡入完成后首格可点);同屏 draw calls < 200(technical-preferences 预算)
- [ ] 四种格态(已开 0 格地板/已开雾格无字/未开格/未开雾格)灰度截图下一眼可辨(A2 D1×6②)
- [ ] 悬停光标区分移动/挖/旗三语义;可挖域(8 向相邻)常驻指示;非相邻格悬停显禁止反馈(A2 D1×6③)
- [ ] 已引爆雷格呈"可通行可读"(A2 D1×6④)
- [ ] 全部数字对所在格底对比 ≥4.5:1;明度恒定规则无违例(art-bible §4.1)
**交互与反馈**
- [ ] 挖/移/旗/停手/刷新全部操作纯鼠标可完成;stop 意图经 `settle_batch` 提交(代码走查 + 探针断言)
- [ ] 每次拒绝(棋盘面/资源面/相位)玩家可感知且两源可区分;voided(至少 stop 作废)可感知(A2 D1×6⑥、A3 双源)
- [ ] 道具窗口:usable_now=false 禁选+原因可见;至多选用 1 件;空库存不弹窗;选择传窗口位置非库存句柄(选中件库存态必变 Used——行为探针断言,缺陷④回归)
- [ ] 弃图刷新消耗 RAP 8 点、本轮上限 2 次可见(按钮文案实时「剩 N 次」;上限已随 A3 2026-09-12 修订生效);RAP<8 资源面拒绝可见(EC13);确认交互与常规确认不同位;换图后 AP 不重置、剩余次数扣减可见(**上游已修订受理——2026-09-12 D4 落稿**)
- [ ] battle_over 时 RAP 清零有可见反馈;level_clear 时库存清空有可见反馈(A3/B4 D1×⑤)
- [ ] battle_over 时状态槽全清有可见反馈(逐槽化光 + 微文案)(B3 D1×④)
- [ ] 敌人死亡瞬间可辨识(卡体灰化 + 碎裂退场,禁瞬消);战斗段短路被掐灭的重击由行序可推断(B2 资产下限)
**信息与归因**
- [ ] 结算逐行明细实时可见、战斗后可回看完整流水(P2 逐行归因);四类行(道具语境/奖励未生效/已消耗未生效/使用被拒)按 B4 D1×③ 呈现
- [ ] 敌人意图徽标挖掘期全程可见、映射全局恒定、含顺位与环长直觉编码(B2 D1×4①②③)
- [ ] 状态效果:极性呈现映射成文且非 magnitude 符号;空态渲染成文(裁决:槽隐藏);满层溢出经明细行可见(B3 D1×①③④)
- [ ] 图例面板「迷雾 = 无雷盲区」条目恒在可随时回看;雾首遇提示一次性(每 run)且非模态不劫持输入,必含三要点(无雷盲区不赌命/雾格不传播连锁/雾内插旗纯损)(A4 D1×②)
- [ ] 零合法板(A1 EC5 降级)出现时玩家侧诚实提示(toast,非静默)
- [ ] 已开雾格与已开 0 格灰度截图下可判定区分(底色层 tint 残留——OQ8 裁决采纳);雾区全开完成信号以视觉合并域为单元、无实例级双响(EC11;样张须含宽度 1 雾带两侧毗邻数字格等最坏用例——A4 AC-9)
- [ ] 效果行 value 为单次贡献值,不得与 pool_value(池合成值)相加呈现;零值伤害行可见不被吞;衰减行按聚合计数呈现(B1 呈现细则)
- [ ] 未生效类行(奖励未生效/已消耗未生效/使用被拒/溢出未生效)携带形状冗余(icon/划线),非色相独载
- [ ] 奖励徽章绘制优先级:旗之下、变异纹带之上、不进数字区;拾取瞬间 tier 档位可读(H1)
**场景级测试**(entry 17②③,缺项即 blocking)
- [ ] 场景级 headless 测试:真实实例化战斗屏场景 + 驱动完整对局 + 断言零脚本错误(ui_click_probe 模式扩展)
- [ ] 任何模态覆盖层(图例/明细回看/胜利/失败/窗口态)有「打开时遮挡物隐藏/输入锁定」场景级断言(缺陷⑤对照)
- [ ] 动态区全部固定槽高 + clip_contents——悬停文案换行不推挤布局(缺陷①回归)
- [ ] CJK 字体随包,全部中文文案渲染非豆腐块(ADR-0003)
- [ ] 敌人 despawn 后呈现层不回读核心生命周期状态(快照纪律,缺陷②回归)
---
## Open Questions
1. **Player journey map 未建**——建议实现前补建(`design/player-journey.md`),校准挖掘→结算→终局情绪曲线与 art-bible §2 能量档的匹配
2. **`design/accessibility-requirements.md` 未建**(gate-check Pre-Production 缺口)——本 spec 内建 WCAG AA 基线承诺,正式分层(文本缩放/色盲模式/按键重映射)待该文档定稿
3. **`design/ux/interaction-patterns.md` 未建**——本 spec 新引入待入库 pattern:toast 双源拒绝、原位窗口激活、逐行兑现明细带、悬停预承诺光标、点阵资源显示(/ux-design patterns 批次入库)
4. **战斗表现美术测试**(game-concept 已登记,B5 前强制):本 spec 的常驻双舞台分屏(决策 D1)是测试的布局输入——敌人卡卡片式 vs 场景站桩式(无框立绘+底座)待样张定稿;本 spec 按"卡片式"起草(信息分层最稳),站桩式不改变分区结构
5. **移动动画形态**(D3):≤150ms 短滑为推荐值,playtest 观测「移动太瞬/太拖」反馈后调
6. **明细带挖掘期是否常驻上轮摘要**:常驻(现方案)vs 结算后即收起——playtest 观测回看频率
7. **道具窗口原位激活**(D2):若 playtest 反馈窗口存在感不足(漏选),升级为 E 区放大 + 全屏微暗(仍非中央弹窗)
8. **Gamepad 导航序**:Partial 支持(非 MVP 门禁)——焦点环顺序待 gamepad 批次定
9. **NodeOverlay / 关卡结算屏**:相邻域屏,建议后续 spec `design/ux/node-reward.md` + `design/ux/level-clear.md`(本 spec 只锁出口锚点)
10. **TunePanel 退役计划**:正式侧归 C4(天赋树),切片调试入口在 D1 GDD 标注退役时点
11. **提示文案定稿**:雾首遇三要点/chord 提示/空态文案归实现期文案 pass,本 spec 只锁必含要点与形态约束
12. **弃图刷新上游修订(已落稿 2026-09-12,布局决策 D4)**:A3(Active 相位受理 + 每轮上限 2 次 + Waiting 代理退役 + 旧旗作废裁决 + 时间税失效预警)、A2(Active·仅刷新路径装板受理)、B1(stopped/ap_exhausted 恒 same_board + `refresh_board` 挖掘期刷新编排;AC-29 改写/AC-30 恒 same_board)、registry `rap_rules` 同步、systems-index 修订块登记。遗留观察项:当场刷新的节奏健康由 A3 OQ3 弃图率/刷新率预警承载,playtest 复核
13. **D5 教学缺口挂靠(D5 GDD 未建,留痕)**:挖到雷 = 敌方优势而非死亡(A2 D5「经典扫雷玩家最大预期违背」)、旗挡链(连锁止于旗属正常)、首次蓄力姿态一次性提示(B2)、窗口拾取→囤刀→选用闭环教学(B4)——本屏 toast 体系为落点候选,随 D5 批次定
---
## §13 上游义务对照表(门禁核对用)
| 义务源 | 条目 | 本 spec 承载落点 |
|---|---|---|
| A2 D1×6 | ① stop 经批次 | §Interaction Map 停手行 + AC |
| A2 D1×6 | ② 四格态可辨 | §Layout 格态 + AC |
| A2 D1×6 | ③ 悬停预承诺+可挖域+chord 提示 | §Interaction Map + §States |
| A2 D1×6 | ④ 引爆雷格可通行可读 | §AC |
| A2 D1×6 | ⑤ 路径预览裁决 | 决策 D3 |
| A2 D1×6 | ⑥ 单意图帧+voided+拒绝可感知 | §Interaction Map + §States 拒绝子态 + AC |
| A3 | AP/RAP 常显+刷新入口+清零反馈+双源 | §Layout C/D 区 + §Transitions + AC |
| A4×3 | 雾纹理/图例+首遇/已开雾格+tint | §States 雾图变体 + 图例组件 + AC |
| B1×3 | ①高光行强调呈现(标中旗金框行/清图 H2 金框行)②完美排雷呈现形态 ③EC5 零合法板提示/补偿/回退形态(toast 提示;补偿/回退不提供——三形态选型留痕 2026-09-12) | §States 高光/清图 + §States 拒绝子态 + §AC;注:结算明细屏+道具窗口 = B1 UX Flag 事项(本 spec 即其 /ux-design 产物),非 B1×3 台账 |
| B2×4 | 意图映射/恒定/顺位/敌方池 | §Component Inventory 敌人卡 + **意图线索映射目录(B2×4① 成文占位,资产定稿归 B5)** + AC |
| B3×4 | 常显+空态/来源标注/溢出/去留 | §States 空态 + §AC |
| B4×5 | 身份恒读/窗口/四类行/清图强调/清空反馈 | §Component Inventory E 区 + §States 清图/高光 + AC |
| A1 | EC5 零合法板诚实呈现(数据面经 B1×3③ 上抛) | §States 拒绝子态(toast)+ AC |
| B2 资产下限 | 受击反馈/死亡表现/顺位标记 | §Transitions 受击 + §States 敌人死亡呈现(禁瞬消)+ §Component 顺位徽标;呈现语义在本 spec(同等 blocking),动画密度归 B5 |