按 docs/design/26-audio-interaction-playbook.md 重构三款游戏(对白重写 + 双性别语音重生成 580 文件)。 引擎层(web/engine/,其余 12 款游戏零改动): - floor.js 发言权管理器:SPEAKING/YOUR_TURN/BUSY/ACTION 四态、交接提示音、 等待声(220/330Hz 嘟-嘟,20s 后放缓)、跨链音乐压低(audio.js holdDuck) - receipts.js 输入回执三件套(ok/invalid/busy,100ms 内,原则 4) - confusion.js 迷茫检测(乱点/无效/静默信号 → 三级接管,§4.5) - hints.js 等待点 + 三档提示(full→short→提示音,30s 台账跨点去重,原则 9) - novice.js 手势解锁阶梯(up/down/doubletap 跨局持久,§4.3) - pipeline.js 输入管道(回执收口、防连点 400ms、双击折算、explainOnce) 游戏层: - storyline R3:开场 71.7s 规则念白 → 3 秒内动手;双击=重播(反模式5)废除; 抉择点三档提示+主动重听;断点存档复述(§4.12) - escape R3:单击=检查+使用合并(双击用法废除);长按=我在哪(四向玩法裁定); 撞墙归因每方向一次(原则 7);迷茫 L2 缩小/L3 演示;坐标存档续玩 - simon R3:新手三音色,按实力渐进解锁(+up/down/dt);失败表替代机会账 (归因 2s 内→免费重听→放慢→结算,原则 15);播放期手势=busy 回执 测试:三款 playtest 重写(含 §6.2 乱点机器人:无声操作/被动重复/打断失败全 0, 首操作 ~2s);guide.test 改为 Guide 层单测+rhythm/space 段。全部通过 (38+33+22+72+19+35 断言)。设计单见 docs/design/26-apply-*.md。
6.0 KiB
6.0 KiB
26-apply · 《声命线》重构设计单(26 号文档落地)
按 26 号文档附录 C 填写。本文是 storyline R3 的施工依据与验收基准; 交互规则的权威来源是 26-audio-interaction-playbook.md。
1. 一句话核心动作
听一段故事,单击继续;听到「请选择」时左右滑做决定。
2. 玩家可感知的状态(3 个)与声音身份
| 状态 | 听感 | 来源 |
|---|---|---|
| 听讲(游戏在说) | 旁白语音,BGM 压低且跨整条链 | §4.1 SPEAKING |
| 轮到你(继续/抉择) | 风铃交接音 → 轻的「嘟—嘟」等待声 | §4.1 YOUR_TURN |
| (菜单/结算属元状态,由 bgm/menu 与结算句标识) |
3. 新手手势表与解锁阶梯
| 手势 | 含义 | 解锁 |
|---|---|---|
| 单击 | 继续 / 跳过这句 | 阶段 0 |
| 左滑 / 右滑 | 抉择 | 阶段 0 |
| 上滑 | 我在哪(一句话状态) | 阶段 1(第一次抉择后,教学句挂链尾) |
| 下滑 | 菜单 | 阶段 2(第一次到达结局后) |
| 双击 | 重听(等待点完整句 / 重播节点) | 阶段 3(累计 3 局);未解锁按单击处理 |
4. 状态 × 手势矩阵(新手期)
| 状态 \ 手势 | 单击 | 左/右滑 | 上滑 | 下滑(未解锁) | 双击(未解锁) | 连点 |
|---|---|---|---|---|---|---|
| 游戏在说 | 跳过这句 + ok | 跳去选项句(不盲选)/ 非抉择点 invalid+解释 | 打断,答「我在哪」 | invalid + 首次解释 | 按单击处理 | 400ms 内 busy |
| 等你继续 | 继续 + ok | invalid(inv_nosel) | 我在哪 | invalid | (阶段3=重听) | busy |
| 等你选择 | 再听选项(「再说一遍:」+ 完整句,hold) | 抉择 + ok | 「正在抉择。左右滑。」 | invalid | (阶段3=重听) | 计入迷茫 |
| 结算 | 重新开始 + ok | invalid(sys_hint_again_full) | 重播状态句 | 菜单(阶段2) | 按单击处理 | 只处理第一下 |
| 菜单 | 换一项 + 播报 | 右=确认 / 左=上一项 | 重听菜单说明 | invalid | 按单击处理 | busy |
验收:无空格;无「没有声音」的格子;连点无破坏性效果。
5. 等待点配置表
| id | 期待 | 提示 full | 提示 short | 静默阈值 | L2 只留 | L3 演示 | 失败归因 |
|---|---|---|---|---|---|---|---|
| intro | tap | (指令句刚说过) | 「点一下。」 | 6s / 15s | tap | 「听我做一次。」→ 替玩家走一步 | — |
| continue | tap | 「单击,继续。」 | 「单击。」 | 18s / 40s | tap | 同上 | — |
| choice | left/right | pN(选项句) | 「左右滑,选。」 | 25s / 50s | 左右滑 | 「左右滑,都可以。现在你来。」 | — |
| settle | tap | 「单击,重新开始。」 | 「单击。」 | 20s / 45s | tap | 提示音 | — |
| reopen | tap/right | sys_continue_ask | 「单击。」 | 12s / 30s | — | 提示音 | — |
| menu | tap/left/right | menu_help | menu_help | 20s / 45s | — | 提示音 | — |
三档选择 + 30s 台账跨等待点去重(说过就更短)在 engine/hints.js 统一实现。
6. 首 3 分钟逐秒脚本
| 时间 | 游戏说 / 播 | 期待玩家做 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | 心跳声 →「点一下屏幕。」(critical) | 单击 | 6s:「点一下。」15s:提示音 | 滑动:invalid + inv_up_locked 等 |
| 3~12s | ok 回执 → 旁白 n00_a →「听到这个声音,就是轮到你了。」→ 风铃 + 等待声 | 单击 | 18s:「单击,继续。」40s:「单击。」 | 双击:按单击处理 |
| 12~30s | n00_b + 「单击可跳过旁白」→ n01 醒来 | 单击(可跳句) | 三档提示 | 滑动:inv_nosel |
| 30~60s | n02 → p1 选项句 → 交出抉择 | 左/右滑 | 25s 复述 p1;50s「左右滑,选。」 | 滑早了:跳去选项句,不盲选 |
| ≈60s | 第一次抉择完成 → 解锁上滑:「想知道自己在哪,就向上滑。」 | 上滑 | 「向上滑。」 | 单击=再听选项 |
| 60~180s | n03~n07 剧情推进,p2 抉择 | 单击/滑动 | 三档提示 + 迷茫接管 | 归因真话 |
| 乱滑/无效×3 | 迷茫接管 L1「左右滑,选。」→ L2 只留期待手势 → L3 演示 |
节奏检查:3s 内第一次操作 ✓;10s 内第一次成功(ok 回执在第一下单击)✓;每 30s 有进展(节点推进 + sfx)✓;无纯规则说明句 ✓。
7. 失败表
| 失败类型 | 判定 | 归因句 | 回到哪里 | 新手期代价 |
|---|---|---|---|---|
| 无效滑动(非抉择点) | 手势与状态不符 | inv_nosel「现在不用选。单击继续。」 | 原地 | 无 |
| 静默 | 阈值到点 | 三档提示 | 原地 | 无 |
| 迷茫 | 信号累计 ≥2 | 接管 L1 短句 / L2 缩小 / L3 演示 | 原地 | 无 |
(叙事游戏无资源失败;旧「双击=整节点重播」为反模式 5,已废除。)
8. 台词表(类别标注)
critical:sys_first_tap(唯一一次开场指令,<3s)content:n00_a/b、n01n25、p1p8、e1~e4、skip_hint、sys_turn_teach、sys_unlock_、menu_itemhint:sys_hint_continue_full/short、sys_hint_choice_short、sys_only_choice、sys_demo_*、status_s1..3、status_choice、sys_continue_askfeedback:inv_nosel、inv_generic、inv_up_locked、inv_down_locked、sys_hint_again_full- 主动重听:sys_say_again「再说一遍:」(前缀,全项目一句)
- 完整清单见
tools/gen_voice_dual.pySTORYLINE_LINES(61 句 × 双性别;角色音沿用平铺资产)。
9. 断点复述句
- 保存:每个节点进入时写
soundgame.storyline.save(nodeId + 剧情标记)。 - 回来:sys_continue_ask「检测到上次的进度。单击,继续上次。右滑,从头开始。」
- 复述:status_sN(位置 → 目标 → 一个动作,≤20 字)。
10. 测试记录
- 无头 playtest:
web/storyline/test/playtest.mjs(37 断言,含 §6.2 乱点机器人: 无声操作 0 / 被动原句重复 0 / 打断失败 0 / 第一次操作 2.1s / 第一次成功 2.1s)。 - 真人冷启动:待测(§6.3,3~5 人)。