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

8.5 KiB
Raw Blame History

交互方案 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.250.4s、单音 ≥0.08s、125Hz5kHz、家族=音色/子类=节奏)。
  • 向导默认开启(guide: 'full'),老手可关;standard 只留 earcon+震动,off 全静——尊重专家、服务新手(反「把玩家当白痴」)。
  • 向导绝不打断内容:插播语音一律 queue:true 或等 voice 链尾;earcon 音量低于 BGM 背景约 +10dB。

1.2 API(游戏侧用法)

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