Files
SoundGame/docs/design/26-apply-storyline.md
2026-10-01 23:26:47 +08:00

97 lines
6.0 KiB
Markdown
Raw Permalink 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.
# 26-apply · 《声命线》重构设计单(26 号文档落地)
> 按 26 号文档附录 C 填写。声命线无独立 01 号正文,**本文即施工设计单**。
> 交互权威:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)、[00-global-ux.md](00-global-ux.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) | 按单击处理 | 只处理第一下 |
| 菜单 | 确认当前项 + ok | 左右滑换项并报名 | 重听菜单说明 | — | 当单击 | 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、n01~n25、p1~p8、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 人)。