Files
xsl ee5d4d2544 feat(playbook): 26 号交互手册全量落地——剩余 12 款深度重构 + 语音全量重制
storyline/escape/simon 首批之后的推广收官:15 款全部按 26 号模式运行
(发言权/回执/三档提示/迷茫接管/手势阶梯/断点复述),旧「双击重听/格挡/
菜单确认」等反模式口径全线废除,开场零规则念白(首句即动手)。

游戏层(12 款):rpg(格挡=前摇窗口内再单击)/ rhythm / space / radio /
dungeon / abyss / detective / cipher / teahouse / keeper / bridge /
hunt(联机切片):
- 每款 game.js 接引擎六模块 + makeInputPipeline(doubleTapWindow:0);
  四向玩法类 swipeCore + 长按帮助;双击是玩法的(space 护盾 / hunt
  旋风斩)按手势阶梯阶段 3 分档恢复双击窗口(doubletapCore)
- 每款 playtest 重写:玩法断言 + §6.2 乱点机器人(无声操作 / 被动
  原句重复 / 打断失败 = 0);15 款 3900+ 断言全绿
- 12 份 docs/design/26-apply-*.md 施工单 + tools/voice_lines_26/
  台词清单 + voice-ids 文档同步 + 转写会话剧本按新口径重写

引擎层(web/engine/,6 处修复):pipeline 增 doubletapCore;novice
teachLine 带 voice/ 前缀(此前教学句被静默丢弃);confusion.record
前置到新手门(锁定手势的乱点也计信号);InvalidHints 播完恢复解释前
状态(根治孤儿 BUSY);WaitPoint takeover(2) 台账去重;台账只在
speak 真正播出时登记。遗留引擎债登记 roadmap §3.1。

语音资产:台词表合并(新增 ~250 系统句 / 改 ~50 旧口径 / 删 ~110
废止句;合并器 tools/merge_voice_lines_26.py + 引用校验器
tools/validate_voice_refs.py),GPU 重录 1536 wav → 4204 ogg/m4a
落地,check_all_assets + validate_voice_refs 双绿;键盘变体同步扩表。

大厅/文档:15 款统一新交互口径(「新交互」徽标退役);README /
HANDOVER / rpg README 旧口径修正;roadmap P0-P3 置完成。
2026-10-02 12:33:20 +08:00

141 lines
11 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 填写。玩法正文见 [15-radio.md](15-radio.md)(其附录 C 为本文摘要,
> 两处冲突时以本文为准——本文是逐格落地的施工单)。台词登记见
> [15-radio-voice-ids.md](15-radio-voice-ids.md);清单见 `tools/voice_lines_26/radio.md`。
> 交互权威:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)、[00-global-ux.md](00-global-ux.md)。
> 范式对齐 [26-apply-storyline.md](26-apply-storyline.md)(《不眠频率》同为叙事型,主参考)。
## 1. 一句话核心动作
**听一段热线,单击继续或接听;听到选项时左右滑做决定。**
## 2. 玩家可感知的状态(3 个)与声音身份
| 状态 | 听感 | 来源 |
|---|---|---|
| 听讲(游戏在说) | 主播/导播/来电者语音,BGM 压低且跨整条链 | §4.1 SPEAKING |
| 轮到你(继续/接听/抉择) | 风铃交接音 → 400ms 后轻的「嘟—嘟」等待声;**RING 用铃声循环代替等待声**(15 号 §2 声音身份) | §4.1 YOUR_TURN |
| (菜单/结算属元状态:bgm/menu + 结算句标识,不占新手三态) | | |
状态声首现教学(原则 2):RING 首次进入配「热线灯亮了。点一下,接听。」(sys_ring_teach,
全局一次);「轮到你」等待声首现配 sys_turn_teach「听到这个声音,就是轮到你了。」
## 3. 新手手势表与解锁阶梯
| 手势 | 含义 | 解锁 |
|---|---|---|
| 单击 | 继续 / 接听 / 跳过这句(p* 首播=busy) | 阶段 0 |
| 左滑 / 右滑 | 抉择(左=走心,右=克制) | 阶段 0 |
| 上滑 | 我在哪(通号 → 口碑档,一句话) | 阶段 1(第一次抉择后,「对。」+ 教学句挂下一段链头/尾) |
| 下滑 | 菜单 | 阶段 2(第一次到达结局后,教学句挂结局链尾) |
| 双击 | 重听当前等待点完整句(「再说一遍:」前缀) | 阶段 3(累计 3 局);未解锁按单击处理 |
| 长按 | 新手期 invalid(叙事类不占用帮助,无四向玩法) | — |
旧「双击=重听整段 / RING 双击重听收尾句 / 菜单单击循环+双击确认」全部废止(26 §7 反模式 5)。
## 4. 状态 × 手势矩阵(新手期)
| 状态 \ 手势 | 单击 | 左/右滑 | 上滑 | 下滑(未解锁) | 双击(未解锁) | 连点 |
|---|---|---|---|---|---|---|
| 游戏在说 | 跳过这句 + ok(p* 首播 → busy) | 打断 → 非抉择点 invalid+解释一次(不盲选) | 打断,答「我在哪」 | invalid + 首次解释 | 按单击处理 | 400ms 内 busy |
| 等你继续 | 继续 + ok | invalid(inv_nosel) | 我在哪(通号+口碑) | invalid | (阶段3=重听) | busy |
| RING 等接听 | 接听 + line_connect(silent-ok) | invalid(inv_ring) | 我在哪(通号+口碑,铃声即接听提示) | invalid | (阶段3=重听) | 400ms 内 busy |
| 等你选择 | 再听选项(「再说一遍:」+ 完整句,hold) | 抉择 + ok(ui_confirm) | 「正在抉择。左右滑。」 | invalid | (阶段3=重听) | 计入迷茫 |
| 结算 | 新夜班 + ok | invalid(解释句=settle full) | 结局主句 + 口碑档 | 菜单(阶段2) | 按单击处理 | 只处理第一下 |
| 菜单 | 确认当前项 + ok | 左=上一项 / 右=下一项,每项报名 | 重听菜单说明 + 设置提示 | 关闭 | (阶段3=重听) | busy |
验收:无空格;无「没有声音」的格子;连点无重播/重开/连跳。BRIDGE(幕间)为自动流
(BUSY 演出态 ≤12s):一切手势 = busy 回执,不进本表。
被打断的兜底:任何打断后若判 invalid,由 `_ensureWait()` 按当前局面重新交出话轮,
不留安静态(§4.1)。
**跳过纪律(15 号 G5 的 26 号化)**:p* 首播 critical——tap/滑动都给 busy 回执
(盲玩公平;p9 是全表最长句,仍整句 critical,公平优先于「critical ≤3s」启发式);
其余句 tap=跳句、滑动=打断并执行,链尾交接由 floor 的 onDone 保证不被吃掉
(旧 F4 恢复锁 / F5 链末句保护被结构性消解;复播天然可掐)。
## 5. 等待点配置表
| id | 期待 | 提示 full | 提示 short | 静默阈值 | L2 只留 | L3 演示 | 失败归因 |
|---|---|---|---|---|---|---|---|
| intro | tap | (指令句刚说过)| 「点一下。」 | 6s / 15s | tap | 「听我做一次。」→ 替玩家进第一通 | — |
| ring | tap | 「热线在闪。点一下,接听。」(gd_ring1) | 「点一下,接听。」 | 8s / 18s | tap | 「听我做一次。」→ 替玩家接听 | — |
| continue | tap | 「单击,继续。」 | 「单击。」 | 18s / 40s | tap | 「听我做一次。」→ 替玩家走一步 | — |
| choice | left/right | 当前 pN(台账已记 → 被动首档自动降 short) | 「左右滑,选。」 | 25s / 50s | 左右滑 | 「左右滑,都可以。现在你来。」(不替玩家选) | — |
| settle | tap | 「单击,重新开始。」 | 「单击。」 | 20s / 45s | tap | 提示音 | — |
| reopen | tap/right | sys_continue_ask | 「单击。」 | 12s / 30s | — | 提示音 | — |
| menu | tap/left/right | menu_help | 「左右滑,点一下。」 | 20s / 45s | — | 提示音 | — |
三档选择 + 30s 台账跨等待点去重在 `engine/hints.js` 统一实现;选项句 pN 由游戏层在
链播时登台账(`markHintSaid`),被动提示永不原样复述选项(原则 9)。
## 6. 首 3 分钟逐秒脚本
| 时间 | 游戏说 / 播 | 期待玩家做 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | onair_sting + amb_studio →「点一下屏幕。」(critical) | 单击 | 6s:「点一下。」15s:提示音 | 滑动:invalid + inv_generic |
| 3~8s | ok 回执 →「热线灯亮了。点一下,接听。」→ 铃声循环 + 风铃 | 单击接听 | 8s:「热线在闪。点一下,接听。」18s:「点一下,接听。」 | 左右滑:invalid + inv_ring |
| 8~15s | line_connect → 一线来电(z1_ring_in)→ 老周开口(z1_a)→「听到这个声音,就是轮到你了。」→ 风铃 + 等待声 | 单击继续 | 18s:「单击,继续。」40s:「单击。」 | 左右滑:inv_nosel |
| 15~45s | z1_b +「想跳过这句,单击就行。」→ p1 选项句(critical,播完即选) | 左/右滑 | 25s:「左右滑,选。」50s:提示音 | p* 播放中任意手势:busy |
| ≈50s | 「对。」+ z1_song + 链尾「想知道自己在哪,就向上滑。」 | 上滑 | 「左右滑,选。」 | 单击=再听选项 |
| 50~180s | p2 抉择 → z1 收敛(z1_ok1)→ 幕间口碑跨档 → 第二通铃 | 单击/滑动 | 三档提示 + 迷茫接管 | 归因真话(z1_bade 指向实际选择) |
| 乱滑/无效×3 | 迷茫接管 L1「单击。」→ L2 只留期待手势 → L3 演示 | | | |
节奏检查:3s 内第一次操作 ✓(第一句即指令);10s 内接听成功 ✓;每 30s 有通号/对方
情绪变化 ✓;无一句纯规则说明 ✓(b_rule 开场规矩废除,冷启动不念;台标口播 b_open/
b_rain/b_goal 移到第二夜起的新夜班链)。
## 7. 失败表
| 失败类型 | 判定 | 归因句 | 回到哪里 | 新手期代价 |
|---|---|---|---|---|
| 非抉择点滑动 | 手势与状态不符 | 「现在不用选。单击继续。」(inv_nosel) | 原地 | 无 |
| RING 滑错 | RING 左右滑 | 「现在不用选。点一下,接听。」(inv_ring) | 原地 | 无 |
| 结算滑动 | ENDING 左右滑 | 「单击,重新开始。」(settle full 复用) | 原地 | 无 |
| 静默 | 阈值到点 | 三档提示(full → short → 提示音) | 原地 | 无 |
| 迷茫 | 信号累计 ≥2 | L1 短句 / L2 只留期待手势 / L3 演示 | 原地 | 无 |
| 负向结果(p1右+p2右) | 计分表 −1 | z1_bade 指向实际两连选(真话律) | 下一通 | 不扣资源 |
叙事无资源死亡;旧「双击=整节点重播」废除(反模式 5)。
## 8. 台词表(类别标注)
- `critical`:sys_first_tap(开场 ≤3s 唯一一次指令);p1~p9 抉择提示句(首播不可跳)
- `content`:b_*、各通对白(z1/l1/k1/w1/h1/d9 组)、e1~e4、ep_*、sys_turn_teach、
sys_ring_teach、sys_praise、sys_unlock_*、sys_menu、menu_help、sys_menu_*、
sys_new_night、prog_c1..c5、rep_*
- `hint`:sys_hint_continue_full/short、sys_hint_choice_short、sys_hint_ring_short、
sys_hint_again_full、sys_hint_menu_short、sys_only_choice、sys_demo_continue、
sys_demo_choice、status_choice、sys_continue_ask、gd_ring1、sys_skip
- `feedback`:inv_nosel、inv_ring、inv_generic、inv_up_locked、inv_down_locked、sys_praise
- 主动重听前缀:`sys_say_again`「再说一遍:」(全项目一句)
- 完整登记(新增/修改/删除)见 `tools/voice_lines_26/radio.md` 与
[15-radio-voice-ids.md](15-radio-voice-ids.md) R4 增量节。
## 9. 断点复述句
- 保存:每通 RING 进入、每个抉择结算后、ENDING 进入、菜单「保存并回大厅」写
`soundgame.progress.radio`(phase + node + rep/knot/heardArgument/bond/endings/nights
+ goalMet/skipHintShown/ringTaught 教学标志;**summary 字符串必带**,大厅卡片用;
菜单覆盖层落盘记回原状态)。
- 回来 5s 内:sys_continue_ask「检测到你的夜班记录。单击继续上次,右滑开始新的夜晚。」
→ 单击 = 恢复并重播当前节点(局面复述);右滑 = 新夜班。
- 上滑复述模板:位置(第 N 通)→ 目标(口碑档),动作由等待声/铃声承担;
ENDING = 结局主句 + 口碑档;抉择等待 =「正在抉择。左右滑。」
## 10. 测试记录
- 无头 playtest:`web/radio/test/playtest.mjs`(171 断言全绿,`tools/node/bin/node
web/radio/test/playtest.mjs` 退出码 0)。乱点机器人跑 `guide=off` 干净局:
无声操作 0、被动原句重复 0、打断失败 0、第一次操作 ≤10s(实际 2.1s)、
第一次成功 ≤20s(实际 2.1s),26 §6.2/§6.4;另含四结局矩阵(A~E 五剧本)、
等待点三档、迷茫接管三级、手势阶梯、断点复述(ASK 左/右滑)、菜单、
arg_muffled 线索音 ×2、危机拍自动流、资产缺失续链、静态审计
(无运行时 id 拼接 / 已废止台词零引用 / 21 条新增台词待生成豁免清单一致)。
- 玩家感知转写:`web/harness/sessions/radio.mjs` 已同步 26 号口径(开场第一下
tap、菜单左右滑换项+单击确认、结局后下滑逛菜单、`floor.state` 链级门控),
`tools/node/bin/node web/harness/transcribe.mjs radio`(含 `--session
sessionStress`)两剧本零死锁跑通(主线虚拟 283s / 乱按 910s 到 E1)。
- 真人冷启动:待测(26 §6.3,3~5 人)。