# 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 人)。