Files
gplan-2/design/gdd/ux/interaction-patterns.md
T

226 lines
16 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.
# Interaction Pattern Library(交互 pattern 库)
> **Status**: Complete(核心 8 成文〔2 号已退役留档〕+ 12 目录占位)
> **Author**: user + ux-designer
> **Last Updated**: 2026-10-15(简明技术中文用语规范批:词面修正 6 处,见文末修订记录)
> **Template**: Interaction Pattern Library
> **来源**: `design/gdd/ux/battle.md`(2026-09-12 /ux-review APPROVED)已拍板内容的成文固化——本库不引入新设计决策
---
## Overview
- **用途**:ui-programmer 实现时引用既有 pattern,不重复发明;实现中出现新 pattern 时**必须回写本库**(team-ui Phase 3 义务)
- **输入约束**:PC / Keyboard-Mouse 主(全部操作纯鼠标可完成)、Gamepad Partial 非 MVP、Touch None
- **视觉依据**:art-bible §3.3(半拟物:容器穿戏服、数据素面;直角=逻辑信息、圆角=可触摸物件)、§4(彩为世,墨为信——逻辑信息一律近黑暖墨族)
- **全局语义红线**:无任何信息仅靠色相承载(art-bible §4.5 色弱安全清单逐对成立);明度分层(§2,2026-09-29 v3.0——状态与情绪区分仍只用色相/饱和/运动/元素四手段;空间纵深与光照可走明度带)
---
## Pattern Catalog
| # | Pattern | 类别 | 状态 |
|---|---|---|---|
| 1 | 双源拒绝反馈 | Feedback | **成文 ✓** |
| 2 | 原位窗口激活 | Overlay | **已退役**(2026-09-15 下线,留档) |
| 3 | 逐行兑现明细带 | Data Display | **成文 ✓** |
| 4 | 悬停预承诺光标 | Input | **成文 ✓** |
| 5 | 点阵资源显示 | Data Display | **成文 ✓** |
| 6 | 模态 overlay 层级纪律 | Modal | **成文 ✓** |
| 7 | 破坏性确认异位 | Feedback | **成文 ✓** |
| 8 | 禁用态即理由 | Feedback | **成文 ✓** |
| 9 | 常驻意图徽标 | Data Display | **已实现**(enemy_card_view.gd——规格全文待补) |
| 10 | 一次性非模态教学提示 | Feedback | **已实现**(chord 提示——规格全文待补) |
| 11 | tooltip 规范 | Feedback | **已实现**(状态/道具悬停——规格全文待补) |
| 12 | 单意图帧批次提交 | Input | **已实现**(main.gd 组合根——规格全文待补) |
| 13 | 状态效果槽 | Data Display | **已实现**(status_slot_row.gd——规格全文待补;载体变更留档:C 区四槽已退役,现役载体=B 区站桩伴随件) |
| 14 | 步进进度条 | Navigation | **已退役留档**(level_strip_view 已删,节点态承载进度) |
| 15 | 移动路径预览 | Input | **已实现**(board_view.gd BFS 蓝点——规格全文待补) |
| 16 | 清图/换图演出编排 | Feedback | **已实现·占位级**(board_fx_view.gd 金粒彩纸——规格随战斗表现 美术批补) |
| 17 | 胜利/失败终局编排 | Feedback | **已实现·占位级**(battle_end_overlay.gd——规格随战斗表现补) |
| 18 | Boss 遭遇演出 | Feedback | **已实现·占位级**(紫赤影子——规格随战斗表现补) |
| 19 | 库存常读列表 | Data Display | **占位失效**(所记载体 inventory_panel_view.gd 从未入库〔git 全史零记录,2026-10-09 复核〕;库存面已随秘宝过渡形态退役——C 区现行秘宝槽=装配呈现面、重接归装配面批次,见 battle.md 组件清单) |
| 20 | 标准控件组(button/progress bar/list) | Control | **已实现**(ui_kit.gd 直角细线/凸圆角——规格全文待补) |
MVP 未使用标准控件(不入库):toggle / dropdown / input field / tab bar——战斗屏无此需求;TunePanel slider 为调试专用。
---
## Patterns(核心 8)
### 1. 双源拒绝反馈(dual-source rejection feedback)
**Category**: Feedback
**Used In**: 战斗屏(棋盘/资源全部意图动作)
**Description**: 玩家意图被核心拒绝时,反馈必须同时做到:(a) 每次拒绝玩家可感知(防静默拒绝读感欺骗);(b) 来源可区分——棋盘面(排雷玩法判,携 sub_reason 封闭枚举)/资源面(行动经济判,客户端推断)/相位(排雷玩法 ActionOutcome)三源各异;(c) 图标+文案双通道,非色相独载。
**Specification**:
- 触发:`ActionOutcome{accepted=false, reject_reason, sub_reason}` **返回值驱动**(拒绝无事件外发——排雷玩法发射面封闭,实现层禁止等待拒绝信号)
- 反馈映射:board_face → 目标格危险红 `#A8321F` 边框闪(拒绝语义红族——旗朱→封印紫→封印黑 #000000,2026-09-28 用户拍板现行) + toast 具体原因(sub_reason→文案映射表:not_adjacent/target_revealed/target_concealed/flag_present/flag_absent/no_path/out_of_catalog);resource_face → 对应资源数字脉冲(AP/RAP)+「AP 不足 · 剩 0 点」式文案;phase → toast(结算中/非挖掘期)
- 即时性:拒绝当帧呈现;toast 自动消退 2.5s
- **voided 区分**:作废 ≠ 拒绝(零效果零扣费零事件)——须独立文案如「本轮已清图,停手未执行 · 剩余 AP 已作废」,至少 stop 作废可感知
- Accessibility:危险红边框闪为形状+运动通道;文案常驻
**When to Use**: 任何意图提交被拒绝时(唯一拒绝呈现通道)
**When NOT to Use**: 成功反馈(走动作本身的直接视觉反馈通道);voided 语义场景(作废文案独立)
**Reference**: battle.md §States 拒绝/作废子态、§Interaction Map;排雷玩法×6⑥、行动经济双源契约
---
### 2. 原位窗口激活(in-place window activation)——已退役留档
> **退役注记(2026-09-20 退役术语扫描批补标)**:唯一消费面"轮末道具使用窗口"已随 2026-09-15 可选类道具删除整体下线(地图战斗资源批),本条原 Specification 整段退役不再装载呈现义务;编号留空防后续 pattern 交叉引用失锚(照 battle.md 布局决策 2 先例)。
---
### 3. 逐行兑现明细带(line-by-line settlement feed)
**Category**: Data Display
**Used In**: 战斗画面区底部(结算期第一注视点)
**Description**: 轮末结算逐行流水实时呈现 + 可回看——「扫雷之因逐行兑现为战果」(P2 归因)的承载面。挖掘期收起为 1 行上轮摘要;结算期展开 84px 实时流;点击开完整回看 overlay。
**Specification**:
- 数据源:[战斗结算](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)步骤流(9 类行封闭协议(现行);公共字段 `type/source_class/origin_cell/round_index/display_name/value/highlight?`);**无来源行 = 断言失败**
- 行模板:「{行为} {值} → {目标}(来源)」——来源标注(第 N 轮 · 安全格式);行文案最长 token = 来源标签(4 汉字封闭枚举),模板预留 40% 膨胀宽度
- 聚合纪律:未生效类行(奖励未生效——现行 9 类行协议唯一未生效型,2026-09-20 收敛)按聚合计数呈现(防逐行惩罚轰炸);衰减行聚合计数;效果行 value=单次贡献值、禁与 pool_value(池合成值)相加呈现;零值行可见不吞(免伤轮归因不断点)
- 高亮:highlight 字段 {flag_hit, clear_reward_h2, perfect_broken} → 金框强调;完美排雷 = 独立高光行 + 全屏喝彩级反馈
- 布局:固定槽高 + clip_contents;正文 ≥14px;数值暗底高对比;未生效类行带 icon/划线形状冗余
- 击杀标记呈现(H3 数据源 = 战斗结算流水击杀结果字段)
**When to Use**: 任何「因果可归因」的逐行流水呈现
**When NOT to Use**: 自造行类型/字段(9 类封闭枚举(现行)——增删 = 接口漂移,须走[《战斗结算》](../systems/战斗循环/战斗结算.md#明细流水每一行都能指回你刚才的哪一步棋)修订)
**Reference**: battle.md §Component Inventory 结算明细带、§AC 信息与归因;归档《战斗结算》(b1-settlement.md)Core Rule 14 / Visual Req
---
### 4. 悬停预承诺光标(hover pre-commitment cursor)
**Category**: Input
**Used In**: 扫雷图 BoardView
**Description**: 左键双义(已开格=移动 / 未开相邻格=挖)的消歧完全依赖格态一瞥可辨 + 悬停光标区分——**误挖不可逆**(1 AP + 可能触雷)的感知保险。
**Specification**:
- 光标三态:移动(箭头)/挖(镐)/旗(旗形)——按悬停格态与键位自动切换
- 目标格边框高亮常驻
- 可挖域常驻指示:小人 8 向相邻未开格呼吸微光(挖掘期唯一在动元素——art-bible §2.1)
- 非相邻格:禁止光标 + 首次 toast「需先走近(点击已开格移动,免费)」
- 提交:悬停仅预承诺,**点击才提交意图**(单意图帧批次——目录 #12)
- chord 首遇提示:怀旧玩家双击快开尝试时一次性 toast(含排雷玩法登记锚点「点数字格可移动小人」)
**When to Use**: 一键多义且后果不对称的操作面
**When NOT to Use**: 单义控件(直接点击反馈即可,勿加光标层)
**Reference**: battle.md §Interaction Map;排雷玩法×6②③
---
### 5. 点阵资源显示(dot-matrix resource display)
**Category**: Data Display
**Used In**: AP 条(RAP 读数已并入,独立 RAP 框不存在)
**Description**: 离散点阵 + 数字双承载的资源显示——点阵为图形载体(本地化零成本、一眼可读余量),数字为精确值。
**Specification**:
- 形态:`●●●●●○○○` + 「5/8」;直角细线数据框(信息=直线直角,art-bible §3.3)
- 更新触发:组合根每次调用返回后重查(**行动经济无推送信号**——实现层禁止等待资源变更事件)
- 拒绝反馈:资源不足时数字脉冲(pattern 1 的 resource_face 腿)
- Accessibility:点阵=形状通道、数字=文本通道;对比 ≥4.5:1
**When to Use**: 小整数离散资源(≤16 量级)
**When NOT to Use**: 大数值/连续量(用直角细线进度条——目录 #20)
**Reference**: battle.md §Layout C/D 区;行动经济 UI Requirements
---
### 6. 模态 overlay 层级纪律(modal overlay discipline)
**Category**: Modal
**Used In**: 图例面板、结算明细回看、胜利/失败终局 overlay
**Description**: 任何模态覆盖层打开时必须**隐藏/锁定其遮挡的交互物**,关闭恢复——防「看不见但可点」的幽灵输入(垂直切片缺陷⑤教训,场景级断言强制)。
**Specification**:
- 打开:遮挡物隐藏或禁用 + 输入锁定;单一模态栈(无叠模态)
- 关闭:恢复被遮挡物;关闭按钮/再点入口切换
- 内容:固定槽高 + clip_contents(缺陷①——悬停文案换行禁止推挤布局)
- 验收:**场景级断言「打开时遮挡物隐藏/输入锁定」为每个模态 overlay 的强制 AC**(battle.md 场景级测试节)
**When to Use**: 全屏打断级信息、只读回看、仪式性终局
**When NOT to Use**: 与常读面板同域的窗口态(原 pattern 2 原位激活已随道具窗口退役——此类场景当前无消费面);**独立屏**(2026-09-28 起:关卡画面形态升格为独立屏退出本 pattern 族——其屏级语义见 [level-map.md](level-map.md);节点/商店覆盖层在关卡画面激活域内弹出时仍属本 pattern,遮挡/恢复语义复用单一模态栈)
**Reference**: battle.md §AC 场景级测试;缺陷①⑤(production/session-state entry 17)
---
### 7. 破坏性确认异位(destructive-confirm position offset)
**Category**: Feedback
**Used In**: 弃图刷新(RAP−8 消耗 + 旧板弃置)
**Description**: 消耗性/不可逆操作的确认交互与常规确认**不同位**——位置通道是色盲安全冗余(art-bible §4.5 清单 #7:UI 红/金强调对需图标+文案冗余,且破坏性确认禁止与常规确认同位)。
**Specification**:
- 弃图刷新:确认微交互显式呈现全部代价(RAP−8 · **旧板旗随旧板作废**提示);确认交互位置与常规确认不同位
- 双通道:图标 + 文案冗余
- 拒绝路径:RAP<8 → pattern 1 resource_face(EC13 合法拒绝可见)
**When to Use**: 任何消耗资源/不可逆的操作确认
**When NOT to Use**: 无代价操作(直接执行 + 直接反馈)
**Reference**: battle.md §Accessibility、§AC 交互与反馈;art-bible §4.5 #7
---
### 8. 禁用态即理由(disabled-state with reason)
**Category**: Feedback
**Used In**: 商店购买钮余额不足置灰(shop.md)/ 三选一与商店 GP 刷新钮余额不足禁用(node-reward.md、秘宝.md「三选一刷新双源」节)——原道具窗口满血治疗包消费面随可选类道具退役 2026-09-15,本条保留为通用模式
**Description**: 禁用不许静默——灰置必须伴随**可见的禁选原因**(tooltip/toast),防「为什么点不动」的困惑。
**Specification**:
- 形态:灰置 + tooltip「HP 已满 · 禁选」;点击无效 + 原因 toast 兜底
- 语义区分:满血 = 零收益守卫(禁选、不烧包)≠ 缺血不足(超量 clamp 部分回复,**不**禁选)
- usable_now 由战斗结算组装进窗口载荷(地图战斗资源零跨系统读)——呈现层只消费不推断
**When to Use**: 任何可见但不可交互的元素
**When NOT to Use**: 完全隐藏的不可用功能(不存在的东西无需解释)
**Reference**: battle.md §Interaction Map;地图战斗资源 Rule 7 / AC-14
---
## Gaps & Patterns Needed
- **目录 #9–#20 已全部实现**(2026-09-12 战斗屏实现批,冒烟 149/149 + 三探针全绿);规格全文回写 = HUD框架正式化批义务
- 实现期新增技术件(不单独立 pattern,规格归并):去饱和+金橙状态切换 = 逐格共享 ShaderMaterial(明度不变,gl_compatibility 安全);敌人死亡残位 = 卡体灰化+碎裂禁瞬消(归入 #17 终局编排规格)
- **MVP 未使用标准控件**:toggle / dropdown / input field / tab bar(无需求不设占位);TunePanel slider 为调试专用不入库
- **实现偏差规则**:pattern 近似但不完全适配时,实现层禁止静默变体——登记偏差交 ux-designer 复核后回写
---
## Open Questions
1. 目录占位项的补全时点 = 实现期顺带回写(owner:ui-programmer → ux-designer 复核)
2. Gamepad 批次引入时,需为 pattern 4/12/15 增补手柄映射节(焦点序已在 battle.md OQ8 留位)
---
## 修订记录
| 日期 | 改动 |
|---|---|
| 2026-09-15 | 雾格残留清理:pattern 1 无改;pattern 4 的悬停预承诺消歧依据改按格态两态表述;目录 #10 一次性非模态提示的已实现说明去掉雾首遇、只留 chord 提示。pattern 库不引入新决策 |
| 2026-09-20 | 退役术语扫描批(用户拍板):pattern 2 原位窗口激活退役留档(唯一消费面轮末道具窗口随 2026-09-15 可选类道具删除下线——编号留空防交叉引用失锚,照 battle.md 布局决策 2 先例);pattern 8 禁用态即理由 Used In/Reference 去道具窗口引用(保留为通用模式);聚合纪律未生效类行枚举收敛为奖励未生效 |
| 2026-10-09 | 文档正确性审查批:pattern 8「Used In 现无消费面、消费面随秘宝 Alpha 重设计回归」过期订正——消费面在役 = 商店购买钮余额不足置灰、三选一/商店 GP 刷新钮余额不足禁用 |
| 2026-10-09 | 文档正确性审查批·独立复核(worktree docaudit-2026-10-09):目录 #19「库存常读列表」状态订正——所记载体 inventory_panel_view.gd 经 git 全史复核**从未入库**(「已实现」系失实登记),库存面已随秘宝过渡形态退役,状态改「占位失效」 |
| 2026-10-15 | **简明技术中文用语规范批(用户令,词面层)**:词面修正 6 处——不得×5→禁止(pattern 1 触发条/pattern 5 更新触发条/pattern 6 内容条/pattern 7 Description/pattern 偏差规则);随批×1→顺带(Open Questions 目录占位补全时点条);Last Updated 同步本批 |