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

114 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 填写;正文权威 [05-rpg.md](05-rpg.md) + [05-rpg-chapter1.md](05-rpg-chapter1.md)
> + [11-rpg-battle-rebalance.md](11-rpg-battle-rebalance.md),交互权威 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)、
> [00-global-ux.md](00-global-ux.md)。本单是三份参考实现(escape 探索型 / simon 窗口输入型 /
> storyline 叙事型)在混合型游戏上的拼接:探索菜单=storyline、前摇窗口=simon、剧情链=storyline。
> **RPG 菜单豁免(round2 裁定②)**:探索态菜单保持「左右滑切换 + 单击确认」,不统一成单击循环。
## 1. 一句话核心动作
**听选项,左右滑挑选,单击去做;战斗里听前摇,再点一下挡住。**(05 号 §0.1)
## 2. 玩家可感知的状态(3 个)与声音身份
| 状态 | Floor | 听感 | 第一次教 |
|---|---|---|---|
| 听讲(旁白/NPC/结算/演出) | `SPEAKING` | 语音;BGM 整链压低(`holdDuck`),句间不回「轮到你」 | 开场第二句 `sys_turn_teach` |
| 轮到你(探索选选项 / 战斗选指令) | `YOUR_TURN` | 交接提示音 → 400ms 后「嘟—嘟」等待声 + 当前选项/指令名;战斗回合以 `sfx/turn_player` 为交接音(不叠风铃) | 同上 |
| 前摇窗口(危险) | `ACTION` | `tel_<enemy>` 前摇音即状态(玩法声就是状态声);窗口内单击=格挡 | 教学战 T2 一句一教 |
商店 / 菜单 / 继续询问属元状态:菜单态等待点(`bgm/menu` + 菜单句)。战斗 BGM、Boss BGM 是宏观层,不单开第 4 种状态课(05 号 §0.2)。
## 3. 新手手势表与解锁阶梯
| 手势 | 探索 | 战斗选指令 | 前摇 ACTION | 解锁 |
|---|---|---|---|---|
| 单击 | 确认选项 | 执行指令 | **格挡**(唯一教学手势) | 阶段 0 |
| 左 / 右滑 | 切选项+报名 | 切指令+报名 | 朝来招方向滑=格挡(中央敌任意左右,空间冗余不教学) | 阶段 0 |
| 上滑 | 状态链 | 战场状态 | `invalid` + 首次解释 | 阶段 1(`onGoal`=教学战胜利) |
| 下滑 | 菜单 | **逃跑**(RpgLadder:战斗下滑不随菜单解锁走,05 号 §0.3「战斗始终=逃跑」) | `invalid` | 阶段 2(`onGameDone`=第一章通关) |
| 双击 | 阶段 3=重听场景描述;未解锁按单击 | 阶段 3=重听当前指令名;未解锁按单击 | 按单击=格挡 | 阶段 3 |
| 长按 | 旁白加速(引擎内置,12 号;RPG 非四向玩法,帮助不占长按) | 加速 | 不占格挡(`silent-ok`) | 默认 |
阶梯钩子:`ladder.onGoal()` = 第一场教学战胜利(挂胜利链尾教上滑);`ladder.onGameDone()` = 第一章通关(挂章结算链尾教下滑)。
## 4. 状态 × 手势矩阵(新手期,逐格无空格、无纯静音)
| 状态 \ 手势 | 单击 | 左/右滑 | 上滑(未解锁) | 下滑(未解锁) | 双击(未解锁) | 长按 | 连点 |
|---|---|---|---|---|---|---|---|
| 开场指令(SPEAKING, critical) | `busy` 回执(关键句不打断) | `busy` | `busy` | `busy` | `busy` | 加速 | `busy` |
| 旁白/报名在播(SPEAKING) | 跳过这句 + `ok` | 打断并执行(切选项/切指令) | 打断,状态句 | 打断,菜单/逃跑 | 按单击 | 加速 | 400ms `busy` |
| 探索 YOUR_TURN | 执行选项(内容音=silent-ok / ok) | 切选项+报名(silent-ok) | 状态链(hold) | `invalid`+`inv_down_locked` | 当单击 | 加速 | `busy` |
| 商店(菜单态等待点) | 购买/离开(ok;钱不够 `invalid`+`shop_poor`) | 切货+报价(silent-ok) | 状态链(hold) | 离开商店(ok) | 当单击 | 加速 | `busy` |
| 菜单(RPG 豁免:左右滑+单击确认) | 确认当前项(ok) | 切项+报名(silent-ok) | 重听菜单说明(hold) | 关闭菜单(ok) | 当单击 | 加速 | `busy` |
| PLAYER_SELECT(YOUR_TURN) | 执行指令(silent-ok;无 MP/药=`invalid`+解释句) | 切指令+报名(silent-ok) | 战场状态(hold) | 逃跑检定(ok/invalid) | 阶段3重听/当单击 | 加速 | `busy` |
| ENEMY_TELEGRAPH(ACTION) | **格挡**(`parry` 音=silent-ok) | 中央敌:格挡 | `invalid`+`gd_parry_miss` 首次 | `invalid`+同上 | 当单击=格挡 | 加速(不占格挡) | 第一下格挡,其余 `busy` |
| 结算/胜负旁白(SPEAKING) | 跳过这句 + `ok` | 打断(流程链由看门狗兜底续走) | `invalid` | `invalid` | 当单击 | 加速 | `busy` |
| 继续询问(reopen 等待点) | 继续存档(ok) | 右滑=新旅程;左滑 `invalid`+`sys_continue_ask` | 状态句 | `invalid` | 当单击 | 加速 | `busy` |
验收:无空格;没有任何一格「没有声音」;连点无破坏性效果(重开/重播不绑连点)。
## 5. 等待点配置表
| id | 期待 | 交接提示音 | 等待声 | `_full` | `_short` | 静默阈值 | L2 只留 | L3 演示 | 失败归因 |
|---|---|---|---|---|---|---|---|---|---|
| `intro` | tap | 风铃 | 默认 | —(指令刚说过) | `sys_first_tap_short`「点一下。」 | 6s/15s | tap | 「听我做一次。」替玩家开场 | — |
| `reopen` | tap/right | 风铃 | 默认 | `sys_continue_ask` | `hint_explore_short` | 12s/30s | — | 提示音 | — |
| `explore_<scene>` | tap/left/right | 风铃 | 默认 | 当前选项名 | `hint_explore_short`「滑一下。」 | 18s/40s | 左右滑 | 替玩家切回首选项并报名 | — |
| `shop_buy` | tap/left/right | 风铃 | 默认 | `hint_shop_full`「单击,买下。」 | `hint_shop_short`「单击。」 | 12s/30s | — | 提示音 | 钱不够=`shop_poor`(invalid) |
| `menu` | tap/left/right | 风铃 | 默认 | `sys_menu` | `sys_menu` | 20s/45s | — | 提示音 | — |
| `tut_menu` | left/right | `turn_player` | 默认 | `tut_b0` | `hint_swipe_short`「滑一下。」 | 8s/16s | 左右滑 | 游戏切一次指令并报名 | — |
| `tut_atk` | tap | `turn_player` | 默认 | `tut_b3`「选攻击,单击出剑。」 | `hint_cmd_short`「单击出手。」 | 8s/16s | — | 「听我做一次。」代打一刀 | — |
| `tut_def` | tap | `turn_player` | 默认 | `tut_b6` | `tut_def_short`「选防御。」 | 8s/16s | — | 代选防御并执行 | — |
| `player_turn` | tap/left/right/down | `turn_player` | 默认 | 当前指令名(刚播过,台账自动降档) | `hint_cmd_short` | 8s/20s | — | 提示音 | 无 MP=`btl_nomp`;无药=`btl_noitem`(invalid) |
前摇窗口无等待点(`floor.enterAction()`,玩法声即状态)。教学步另有 **24s 兜底自动推进**(11 号 §7「绝不卡死」:menu→attack→parry→defend→自由)。三档选择 + 30s 台账跨等待点去重在 `engine/hints.js` 统一实现。
## 6. 首 3 分钟逐秒脚本
| 时间 | 游戏说 / 播 | 期待玩家做 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | 「点一下屏幕。」(critical,抢拍单击=busy) | 单击 | 6s「点一下。」15s 提示音;L3 演示 | 滑动:`invalid`+`sys_first_tap_short` 首次解释 |
| 3~16s | `ok` → intro_1/intro_2 + skip_hint + 「新的旅程」+「听到这个声音,就是轮到你了。」 | 听(可单击跳句) | — | — |
| 16~24s | 村长赠金 → desc_village → 报「前进」→ 风铃 + 等待声(第一次成功=接下来单击的脚步声) | 单击「前进」 | 18s `hint_explore_full` → 40s short → 提示音 | 左右滑=切选项(报名即反馈) |
| 24~60s | 村里滑一圈;进商店听价钱,单击买金疮药或离开 | 左右滑/单击 | 18s 当前选项名(刚报名过 → 台账降档直接短句)→ 40s 提示音 | 钱不够 `shop_poor`+invalid |
| 60~120s | 小路调查 +15 金 → 岔路 → 溪流 → 教学战:T0「先滑一滑」→ T1「选攻击,单击出剑」 | 滑指令、单击出剑 | 8s/16s 三档;24s 兜底推进 | 纠错句(原则 7 一次) |
| 120~180s | T2「它要扑了,听前摇。就是现在,点一下挡住。」→ T3 防御课 → 自由击杀 → 胜利链尾「想知道自己在哪,就向上滑。」 | 前摇内单击 | 同上 | 受击锁血 1 仍通过 |
节奏检查:3s 内第一次操作 ✓;第一次成功 ≤10s(第一下单击的 `ok`)✓;每 30s 有进展(新场景环境音/战斗回合/金币)✓;开场无纯规则念白(intro_3 删)✓。
## 7. 失败表(§4.9)
| 失败类型 | 判定 | 归因句 | 回到哪里 | 新手期代价 |
|---|---|---|---|---|
| 格挡没出手 | 窗口内无单击/同向滑 | 教学战 `tut_b4`「没挡住也没关系,再来一次。」 | 下一玩家回合 | 教学锁血 1 |
| 窗口内错手势 | 上滑/下滑 | `gd_parry_miss`(修改稿)「前摇响着呢。点一下,挡住。」首次,之后只回执 | 留在窗口 | 无 |
| 钱不够/已购 | 商店购买失败 | `shop_poor` / `shop_owned` + invalid | 留在商店 | 无 |
| 无 MP/无药 | 指令执行失败 | `btl_nomp` / `btl_noitem` + invalid | 留在选指令 | 无 |
| 逃跑失败 | Lv≥3 且 30% | `btl_flee_fail`;Boss/剧情 `btl_noflee` + invalid | 敌方可格挡前摇(不白打) | 无 |
| 战败 | HP≤0 | `btl_lose` + `btl_lose_hint`(修改稿「点一下格挡」) | 章首 village,等级金币装备保留 | 本章非 Boss 遭遇重置;仍存档 |
归因句全部 `feedback` 类(2s 内、可打断、过期即弃);受击日常播报仍按 addendum §1(降档才播 `st_hp_*`,擦伤静默走血)。
## 8. 台词表(类别标注)
- `critical`:`sys_first_tap`(开场指令 <3s)、`tut_b2`(「就是现在,点一下挡住。」<3s)
- `content`:intro_1/2、skip_hint、sys_new_game、sys_turn_teach、desc_*、opt_*、npc_*、evt_*、btl_start_*、btl_win/loot/levelup/lose、cmd_*、shop_open/price_*、sys_rest/drink/menu_*、st_* / foe_hp_*、sys_unlock_*、boss1_warn
- `hint`:hint_explore_short、hint_shop_full/short、hint_cmd_short、hint_swipe_short、tut_def_short、only_explore、sys_first_tap_short、st_where_1..3、sys_continue_ask
- `feedback`:gd_parry_miss(修改稿)、shop_poor/shop_owned、btl_nomp/btl_noitem、btl_noflee/btl_flee_fail、tut_b4、btl_lose_hint(修改稿)、inv_up_locked、inv_down_locked
- 主动重听:`sys_say_again`「再说一遍:」(前缀,全项目一句)
- 完整清单(新增 20 / 修改 6 / 停用 7)见 `tools/voice_lines_26/rpg.md`;NPC 平铺台词不改。
## 9. 断点复述句
- 保存:场景切换、战斗结算、商店交易、菜单(localStorage + 服务器双写,`summary` 字段保留)。
- 回来:`sys_continue_ask`「单击继续,右滑开始新的旅程」;单击后 **5 秒内**先播 `st_where_<zone>`(你在哪+目标+一个动作:如「林子深处。去黑风寨。左右滑。」),再接场景回访描述与选项报名,然后 `yieldTurn`。
- 分区:zone1=village/path,zone2=fork/chest/stream/hunter,zone3=deepwood/gate/boss1。
## 10. 测试记录
- 无头 playtest:`web/rpg/test/playtest.mjs`(114 断言全绿:开场脚本 / 阶梯锁与解释一次 / 三档提示与接管 L1 / 第一章全链 / 格挡=窗口单击与减伤 / 教学四步与 24s 兜底 / 逃跑规则 / 战败重生 / 受伤播报档位 / 断点复述 / §6.2 乱点机器人:无声操作 0、被动原句重复 0、打断失败 0、第一次操作 2.1s、第一次成功 2.1s;`game.floor.bedEnabled=false`)。转写 harness `web/harness/transcribe.mjs rpg` 全弧线跑通(虚拟时长 70s)。
- 资产校验:新台词落盘前以 `tools/voice_lines_26/rpg.md` 登记为准(待生成清单),sfx/bgm 必须零缺失。
- 真人冷启动:待测(§6.3,3~5 人)。