- 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轮等硬参数
8.5 KiB
8.5 KiB
交互方案 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、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 状态混淆 → 结题;否则修订方案/实现后重跑。