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 置完成。
114 lines
11 KiB
Markdown
114 lines
11 KiB
Markdown
# 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 人)。
|