# 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_` 前摇音即状态(玩法声就是状态声);窗口内单击=格挡 | 教学战 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_` | 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_`(你在哪+目标+一个动作:如「林子深处。去黑风寨。左右滑。」),再接场景回访描述与选项报名,然后 `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 人)。