Files
SoundGame/research/03-schemes/schemes.md
T
SoundGame Dev 7eb9e7f025 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轮等硬参数
2026-08-30 21:20:35 +08:00

102 lines
8.5 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.
# 交互方案 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 状态混淆 → 结题;否则修订方案/实现后重跑。