research: 方法论v1 + 交互方案v1 + 玩家人设卡 + 第5份调研(sonification)

- 02-methodology/methodology.md 四通道模型/七公理/五层交互栈/决策推导机/度量闭环/反模式
- 03-schemes/schemes.md guide.js规格/8句新语音/逐游戏接线表/测试策略/人设×场景矩阵(分期)
- 04-playtests/personas.md 4人设卡(视障/大学生/白领/工人)+结构化评分规程
- 01-literature/02-sonification-design.md earcon学习成本8.5轮vs语音1.14轮等硬参数
This commit is contained in:
SoundGame Dev
2026-08-30 21:20:35 +08:00
parent 18f299f446
commit 7eb9e7f025
4 changed files with 523 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# 交互方案 v1(由方法论推导的实施蓝图)
> 推导路径:方法论 §3 交互栈 → 本项目差距表(methodology §7)→ 结合 6 游戏交互清点(game-inventory.md)落成本方案。
> 分期裁定:**本轮(v1)只实现「全局基线」= 引擎向导层 + 逐游戏接线**;场景参数包(通勤/摸鱼/睡前/下班)与人设旋钮在 v1 试玩验证后按反馈分期(见 §4)。
## 1. 全局向导层 `web/engine/guide.js`(新引擎模块)
### 1.1 设计立场
- **语音承载语义,earcon 只做粗标记**(L2 铁律):签名 earcon 全项目仅 6 个状态 + 2 个功能音,全部**运行时合成**(代码即生成脚本,零资产、可复现、天然双平台),参数守方法论 L2 硬边界(0.25~0.4s、单音 ≥0.08s、125Hz~5kHz、家族=音色/子类=节奏)。
- 向导默认开启(`guide: 'full'`),**老手可关**;`standard` 只留 earcon+震动,`off` 全静——尊重专家、服务新手(反「把玩家当白痴」)。
- 向导绝不打断内容:插播语音一律 `queue:true` 或等 voice 链尾;earcon 音量低于 BGM 背景约 +10dB。
### 1.2 API(游戏侧用法)
```js
import { Guide } from '../engine/guide.js';
const guide = new Guide(audio); // 游戏构造时创建一次
guide.level(); // 'full' | 'standard' | 'off'(读 settings.guide)
guide.state('battle'); // L3:播状态签名 earcon('menu'|'explore'|'battle'|'choice'|'settle'|'danger')
guide.turn({ voice: 'gd_your_turn', haptic: true }); // L3/A2:回合标记——earcon(turn)+ 可选轻震 + 可选语音(full 档才播 voice)
guide.watchdog({ arm: true, at: [8000, 20000], // L4:静默看门狗:8s 轻 earcon 提醒,
onEscalate: (n) => ... }); // 20s 升级回调(游戏播上下文提示);手势或 watch disarm 复位
guide.error({ voice: 'gd_parry_miss', onceKey: 'parry' }); // A4:纠错——error 震(游戏层已有则传 skipHaptic)+ full 档语音(onceKey 同局只播一次)
guide.setEventHook(fn); // 转写 harness 用:guide 事件流(earcon 名/语音 id/等级)→ fn(evt)
```
### 1.3 引擎配套改动
- `audio.js`:新增公开 `isVoicePlaying()`(收编各游戏对私有 `audio._voice` 的读取,HANDOVER 已知问题清一项);新增 `setRateBoostEnabled(bool)`(长按快进 per-game 开关,rhythm/space 演奏期豁免,清另一项)。
- `settings.js`:`VALID` 增加 `guide: 'full'|'standard'|'off'`(默认 `'full'`);`speed` 增加 `2.2` 档(视障档,03 报告:资深用户 250+ WPM)。
- 大厅 `index.html` 设置面板:加「向导帮助:详细/只听提示音/关闭」下拉;语速下拉加「特快++」。
- 同步义务:`docs/web-engine-api.md`、`docs/design/00-global-ux.md` §1 设置表 + 新增 §6 向导层节;`docs/design/14-guide-layer.md` 设计裁定存档。
### 1.4 状态签名 earcon 词表(6 状态 + 2 功能,全项目统一)
| 名 | 音色家族 | 节奏轮廓 | 语义 |
|---|---|---|---|
| `menu` | 柔和正弦双音 | 下行二度 | 系统界面 |
| `explore` | 温暖三角波单音 | 单音长尾 | 探索/安全 |
| `battle` | 略紧方波双音 | 上行纯五度短促 | 战斗/对抗 |
| `choice` | 清亮正弦三音 | 上行琶音 | 抉择/等待输入 |
| `settle` | 柔和三音 | 下行三连(松弛) | 结算/告一段落 |
| `danger` | 低频双音 | 急促重复 | 危险(配合既有 danger 震) |
| `turn` | 风铃质感单音 | 单音短 | 轮到你了 |
| `nudge` | 极轻木鱼单音 | 单音极短 | 看门狗轻提醒 |
教学义务:full 档下,各游戏开场教学把「本局用到的签名」各带教一次(语音句内口播「听到这个音,就是…」)。
### 1.5 新增语音资产(全部走 gen_voice_dual.py 台词表,旁白 speaker+同游戏同 instruct)
| 游戏 | id | 文本 | 触发 |
|---|---|---|---|
| storyline | `gd_continue` | 轻触屏幕,继续。 | W1 叙事节点播完静默 8s(看门狗第 1 级) |
| storyline | `gd_invalid` | 这个操作在这里用不上。 | 无效手势(静默 return 处,同局限 2 次) |
| simon | `gd_relisten` | 需要的话,双击可以重新听一遍序列。 | input 阶段 10s 无输入(不改变重听扣机会规则) |
| rhythm | `gd_answer` | 现在跟着我打。 | 每曲首次领奏→应答切换 |
| rhythm | `gd_miss` | 慢了半拍,下一小节跟上我就行。 | 连续 2 次 Miss(同曲限 1 次) |
| space | `gd_hit_hint` | 被撞了。听方位,同向滑动就能拨开。 | 对局第 1 次受击(保护期外,同局 1 次) |
| rpg | `gd_parry_miss` | 前摇声起的时候双击,才能格挡。 | 格挡窗口内做错(每场战斗 1 次) |
| rpg | `gd_stall` | 想好了吗?左右滑动选择,单击出手。 | PLAYER_SELECT 60s 无输入 |
(共 8 句 ×2 性别 = 16 个文件;storyline `gd_*` 用 _SL_NARR、其余用各游戏旁白 instruct。)
## 2. 逐游戏接线方案(依据 game-inventory.md 薄弱点)
| 游戏 | 薄弱点(清点结论) | 接线(钩子位置见清点行号) |
|---|---|---|
| storyline | W1 完全静默等待;无效手势零反馈 | `onNodeSeqDone`(:214→226) 挂 watchdog[8s]=nudge+`gd_continue`,[20s]=复用 `playHelpAndResume`;静默 return 处加 error 震 + `gd_invalid`;结算态挂 watchdog |
| simon | input 阶段无 BGM 无超时,挂机永久静默 | `_toInput`(:321) 挂 watchdog[10s]=nudge+`gd_relisten`,[25s]=自动重听序列一次(免扣机会,每局 2 次);`your_turn` 泛化为 turn earcon(每轮) |
| escape | PLAY 无主动帮助;错误反馈已最全 | 撞墙 2 次后 `_checkStuck`(:479) 提前一级(向导 full 档);REOPEN/`_advance` done 后 turn cue;其余保持(勿重复造轮子) |
| rhythm | 领奏→应答零显式标记;Miss 无语音;结算链无看门狗 | 谱面排程处推 `gd_answer`(每曲首次);`_applyMiss`(:548) 连 2 Miss 播 `gd_miss`(queue:true);`_finish`(:679) 换 `_speakGuarded`;main 阶段 `setRateBoostEnabled(false)` |
| space | 受击归因式缺指令式;结算链无看门狗 | 第 1 次受击追加 `gd_hit_hint`;`_gameOver`(:573) 换 guarded;feature 等待已有 8s 上限保持 |
| rpg | 格挡窗口内做错仅震动;PLAYER_SELECT 挂机无提示 | 窗口内错手势 → `guide.error({voice:'gd_parry_miss', onceKey})`(:675);PLAYER_SELECT 挂 watchdog[60s]=`gd_stall`;状态 BGM 进入点补 `guide.state()` 签名 |
各游戏 `start()` 时按宏观状态调 `guide.state(...)`(探索进 explore、进战斗 battle、菜单 menu、结算 settle),与既有状态 BGM 同点触发(同一行附近,不另造状态机)。
### 测试策略(回归保护)
- 6 个既有 playtest:setup 统一 `settings.set({ guide: 'off' })`(验证纯游戏逻辑不变),断言零改动为第一目标;个别必须感知向导的断言按 13 号文档流程补记后修改。
- 新增 `web/harness/guide.test.mjs`:storyline+simon 两代表游戏,`guide: 'full'` 下断言 turn cue/watchdog/error 三 API 的行为与等级衰减。
## 3. 人设 × 场景适配矩阵(v1 边界与分期)
| | 通勤·噪声 | 摸鱼·静默 | 睡前·低负 | 下班·回血 |
|---|---|---|---|---|
| 大学生(深玩) | 基线即可 | — | C 档 | D 档 |
| 视障(专家) | 基线+2.2×语速 | 不适用 | 基线 | 基线 |
| 白领(碎片) | A 档 | **B 档(震动语言)** | — | D 档 |
| 工人(疲惫) | 基线 | — | **C 档** | D 档 |
- **v1 已含**:基线(向导层)+ 视障旋钮(语速 2.2 档)+ guide 等级设置。
- **v2 候选(按本轮玩家代理反馈定优先级)**:A 档两遍式关键播报、C 档睡眠定时器+暖音量曲线、D 档容错参数、B 档纯震动玩法(带宽仅 ≤6 语义,只适合 storyline/rpg 轮转类,工程量最大)。
- 裁定理由:B 档需为震动重设计输入语义,独立立项;先把「状态感知」基线做扎实(章程核心痛点),避免首轮摊子过大无法验证。
## 4. 玩家代理评审规程(RQ8 闭环)
- 输入:6 游戏转写(guide:'full' 新手会话)+ 本方案 §1/§2 摘要 + 人设卡(research/04-playtests/personas.md)。
- 输出:每人设对每游戏一段心得 + 结构化评分:状态感知(1-5)/下一步明确性(1-5)/愿意继续玩(y/n)/P0 问题清单/改进建议。
- 门槛(章程 §4):≥3/4 人设愿意继续玩且无人设 P0 状态混淆 → 结题;否则修订方案/实现后重跑。