Files
SoundGame/docs/design/26-apply-storyline.md
T
xsl ee9d7efe57 feat(playbook): 26 号交互手册首批落地——storyline/escape/simon 全面重构 + 引擎六模块
按 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。
2026-10-01 08:11:12 +08:00

6.0 KiB
Raw Blame History

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_item
  • hint:sys_hint_continue_full/short、sys_hint_choice_short、sys_only_choice、sys_demo_*、status_s1..3、status_choice、sys_continue_ask
  • feedback:inv_nosel、inv_generic、inv_up_locked、inv_down_locked、sys_hint_again_full
  • 主动重听:sys_say_again「再说一遍:」(前缀,全项目一句)
  • 完整清单见 tools/gen_voice_dual.py STORYLINE_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 人)。