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 置完成。
11 KiB
11 KiB
26-apply · 《剑与声》深度重构设计单(26 号文档落地)
按 26 号文档附录 C 填写;正文权威 05-rpg.md + 05-rpg-chapter1.md
- 11-rpg-battle-rebalance.md,交互权威 26-audio-interaction-playbook.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_warnhint: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_askfeedback: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)。转写 harnessweb/harness/transcribe.mjs rpg全弧线跑通(虚拟时长 70s)。 - 资产校验:新台词落盘前以
tools/voice_lines_26/rpg.md登记为准(待生成清单),sfx/bgm 必须零缺失。 - 真人冷启动:待测(§6.3,3~5 人)。