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 置完成。
This commit is contained in:
@@ -166,3 +166,54 @@ web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
|
||||
|---|---|---|
|
||||
| `protect_soon` | 训练护盾还剩十秒。 | 开局第 50s(保护期剩 10s 预告;queue 不顶句,被菜单/分批引入打断由 _rearmRunTimers 补播) |
|
||||
| `boost_not_ready` | 引擎还在冷却,稍等一下。 | 加速冷却中单击(R5 归因真话:拒绝必须有回音,此前冷却单击全静默);与护盾拒绝共用 4s 去抖 |
|
||||
|
||||
## R6 · 26 号对齐改造(设计单 04-space-rebuild.md 附录 C;施工记录 26-apply-space.md)
|
||||
|
||||
> 交互权威 26 号手册。本轮删 D0 零操作欢迎、删单击/双击保护期插课、菜单改左右滑 + 单击
|
||||
> (00 §5.4)、帮助一律长按、新手期无双击。增量清单原文 = `tools/voice_lines_26/space.md`
|
||||
>(生成并表时逐字并入 `tools/gen_voice_dual.py` SPACE_LINES,两表一致铁律;
|
||||
>`web/harness/voice_text.json` space 键已同步)。类别:critical / content / hint / feedback。
|
||||
|
||||
**新增(18 句 × 2 性别)**:
|
||||
|
||||
| id | 台词全文 | 类别 | 触发 |
|
||||
|---|---|---|---|
|
||||
| `hint_tap` | 单击。 | hint | settle / reopen / ask 等待点 `_short` 档 |
|
||||
| `d_short_left` | 向左滑。 | hint | d1 等待点 `_short`;迷茫 L2 限定方向 |
|
||||
| `d_short_right` | 向右滑。 | hint | d2 等待点 `_short`;迷茫 L2 |
|
||||
| `d_short_up` | 向上滑。 | hint | d3 等待点 `_short`;迷茫 L2 |
|
||||
| `d_short_down` | 向下滑。 | hint | d4 等待点 `_short`;迷茫 L2 |
|
||||
| `hint_swipe` | 向声音那边滑。 | hint | 迷茫 L1;演练等待点单击首次解释 |
|
||||
| `inv_tap` | 现在只要滑。 | feedback | 对局未解锁加速时单击首次解释 |
|
||||
| `inv_whiff` | 现在没有这边的陨石。 | feedback | 挥空首次解释 |
|
||||
| `miss` | 没拨到。声音一响就滑。 | feedback | 演练没出手归因(禁说「慢了」) |
|
||||
| `lp_run` | 引擎舱。躲开呼啸。向声音那边滑。 | hint | 长按 = 我在哪(≤20 字) |
|
||||
| `lp_teach` | 想知道在哪,按住屏幕。 | content | 第一次成功闪避后教长按帮助(阶段 1) |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 教「轮到你」状态(D2 后一次;与 storyline 同文案) |
|
||||
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(结算/菜单长按与阶段 3 双击) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 第一局结束教阶段 2(挂结算链尾) |
|
||||
| `sys_demo` | 听我做一次。 | hint | 迷茫 L3 / 演练 2 次失败演示 |
|
||||
| `sys_now_you` | 现在你来。 | hint | L3 演示后交回话轮 |
|
||||
| `resume_ask` | 上次飞到一半。单击继续,右滑重开。 | hint | 断点复述询问(reopen 等待点 `_full`) |
|
||||
| `resume_recap` | 你在航道上。躲开呼啸。向声音那边滑。 | content | 续玩复述句(count-in 前) |
|
||||
|
||||
**修改(9 句,id 不变重录)**:`drill_left`「听,左边有陨石。向左滑。」(critical);
|
||||
`drill_right`「这次在右边。」;`drill_up`「上面,向上滑。」;`drill_down`「下面,向下滑。」
|
||||
(04 §0.5 d1~d4 `_full`,压进指令字数);`feat_boost`「点一下,加速。现在试试。」与
|
||||
`feat_shield`「双击,展开护盾。现在试试。」(04 §4 解锁教学,替代保护期第 20s/45s 插课);
|
||||
`help_recap`「听到哪边来,就向哪边滑。按住屏幕问路。」(删单击加速/双击护盾口径);
|
||||
`menu_main`「菜单。左右滑切换,单击确认。」(00 §5.4,旧「单击切换,双击确认」废止);
|
||||
`restart_hint`「单击,再飞一次。」(critical 承诺段;菜单入口改由 `sys_unlock_down` 教)。
|
||||
|
||||
**删除(9 句)**:`drill_welcome` / `drill_rule`(D0 零操作欢迎,04 §2)、`drill_skip`
|
||||
(演练不再提供下滑跳过)、`skip_hint`(开场零操作旁白已删)、`paused`(对局中不开菜单)、
|
||||
`settings_hint`(菜单帮助只留 help_recap 一句)、`feat_boost_done`(boost 音即反馈)、
|
||||
`gd_hit_hint` / `gd_last_life`(向导层让位 Floor:hit_<dir> 与 hit_last 已覆盖)。
|
||||
上方 D 组 / F 组 / Y 组表中对应行按本节口径废止;`second_run_ask` 保留。
|
||||
|
||||
**通用句取舍**:`sys_first_tap` 不引入(开场第一句 = D1 指令,§4.10 第一句就让玩家拨一颗);
|
||||
`sys_unlock_up` 不引入(up 是玩法闪避方向,阶段 1 教的是长按 → `lp_teach`);
|
||||
`sys_unlock_dt` 不引入(阶段 3 以后双击 = 护盾而非重听,教学用 `feat_shield`)。
|
||||
|
||||
**键盘变体**:新增 18 条 + 重录覆盖(`drill_right/up/down` 变体移除——修改后主句不含
|
||||
操作词,动作提示由 `d_short_*` 变体承担);多音字口径维持「重新听」(全表无「重听」)。
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|---|---|
|
||||
| `intro_1` | 你的眼睛看不见了。但你的耳朵,比谁都灵。 |
|
||||
| `intro_2` | 黑风寨掳走了你唯一的徒弟。追进迷雾林,把他们连根拔起。 |
|
||||
| `intro_3` | 先记住,怎么用耳朵走路。 |
|
||||
| ~~`intro_3`~~ | ~~先记住,怎么用耳朵走路。~~(**停用**:26 号 §4.10 砍开场规则念白,开场第一句改为 `sys_first_tap`) |
|
||||
|
||||
## S 组 · 系统/菜单/状态(旁白 ×28)
|
||||
|
||||
@@ -42,8 +42,8 @@
|
||||
| `sys_menu_resume` | 继续旅程。 | 菜单项 |
|
||||
| `sys_menu_save` | 保存并回大厅。 | 菜单项 |
|
||||
| `sys_menu_help` | 重新听帮助。 | 菜单项 |
|
||||
| `help_explore` | 左右滑切换选项,单击确认。双击重新听场景,上滑查看状态,下滑打开菜单。 | 帮助 |
|
||||
| `help_battle` | 战斗中,左右滑选招式,单击出手。听到敌人的前摇,双击格挡。 | 帮助 |
|
||||
| `help_explore` | 左右滑选,单击确认。上滑看状态,下滑开菜单。**(26 号修改稿:删「双击重新听」)** | 帮助 |
|
||||
| `help_battle` | 战斗中,左右滑选招,单击出手。前摇一响,点一下挡住。**(26 号修改稿:格挡=窗口内再单击)** | 帮助 |
|
||||
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内 |
|
||||
| `st_hp_high` | 你状态很好。 | 血量 >70% |
|
||||
| `st_hp_mid` | 你受了伤。 | 30~70% |
|
||||
@@ -61,6 +61,26 @@
|
||||
| `st_armor_none` | 你身无片甲。 | 无护甲 |
|
||||
| `st_armor_leather` | 你身着皮甲。 | leather |
|
||||
| `st_armor_iron` | 你身着铁鳞甲。 | iron_scale |
|
||||
| `sys_first_tap` | 点一下屏幕。 | **新增**(critical 开场指令,与 storyline 通用句一致) |
|
||||
| `sys_first_tap_short` | 点一下。 | **新增**(开场等待点短句/首次无效解释) |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | **新增**(「轮到你」状态课,链尾) |
|
||||
| `sys_say_again` | 再说一遍: | **新增**(主动重听前缀,阶段 3) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | **新增**(阶梯阶段 1,教学战胜利挂链尾) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | **新增**(阶梯阶段 2,第一章通关挂链尾) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | **新增**(阶梯阶段 3) |
|
||||
| `sys_demo_continue` | 听我做一次。 | **新增**(迷茫 L3 演示引导) |
|
||||
| `hint_explore_short` | 滑一下。 | **新增**(探索等待点 `_short`) |
|
||||
| `only_explore` | 现在,只要左右滑。 | **新增**(迷茫 L2 缩小说明) |
|
||||
| `hint_shop_full` | 单击,买下。 | **新增**(商店等待点 `_full`) |
|
||||
| `hint_shop_short` | 单击。 | **新增**(商店等待点 `_short`) |
|
||||
| `hint_cmd_short` | 单击出手。 | **新增**(玩家回合 `_short`) |
|
||||
| `hint_swipe_short` | 滑一下。 | **新增**(教学 T0 `_short`) |
|
||||
| `tut_def_short` | 选防御。 | **新增**(教学 T3 `_short`) |
|
||||
| `inv_up_locked` | 上滑还没解锁。先去战斗。 | **新增**(无效解释一次) |
|
||||
| `inv_down_locked` | 菜单,通关第一章解锁。 | **新增**(无效解释一次) |
|
||||
| `st_where_1` | 村外小路。去黑风寨。左右滑。 | **新增**(断点复述 zone1:village/path) |
|
||||
| `st_where_2` | 林子深处。去黑风寨。左右滑。 | **新增**(断点复述 zone2:fork/chest/stream/hunter) |
|
||||
| `st_where_3` | 黑风寨。救徒弟。左右滑。 | **新增**(断点复述 zone3:deepwood/gate/boss1) |
|
||||
|
||||
## D 组 · 场景描述(旁白 ×16)
|
||||
|
||||
@@ -141,10 +161,10 @@
|
||||
| `btl_loot_big` | 大获全胜,收获颇丰。 | >40 |
|
||||
| `btl_levelup` | 你的修为精进了。 | 升级(success 震动) |
|
||||
| `btl_lose` | 你倒下了,黑暗吞没了一切。 | 战败 |
|
||||
| `btl_lose_hint` | 记住,听清前摇,双击格挡。 | 战败提示 |
|
||||
| `btl_lose_hint` | 记住,听清前摇,点一下格挡。**(26 号修改稿:格挡=窗口内再单击)** | 战败提示 |
|
||||
| `tut_b1` | 它要扑了,听前摇! | 教学战 |
|
||||
| `tut_b2` | 就是现在,双击格挡! | 教学战 |
|
||||
| `tut_b3` | 挡住了!轮到你了。左右滑选攻击,单击出剑。 | 教学战 |
|
||||
| `tut_b2` | 就是现在,点一下挡住。**(26 号修改稿,critical ≤3s)** | 教学战 |
|
||||
| `tut_b3` | 选攻击,单击出剑。**(26 号修改稿:T1 攻击课)** | 教学战 |
|
||||
| `tut_b4` | 没挡住也没关系,再来一次。 | 教学战格挡失败 |
|
||||
| `tut_b5` | 好剑法!接下来,靠你自己了。 | 教学战结束 |
|
||||
|
||||
@@ -202,17 +222,47 @@ web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
|
||||
|---|---|
|
||||
| `sys_continue_ask` | 检测到你的旅程记录。按空格继续,按右方向键开始新的旅程。 |
|
||||
| `sys_menu` | 菜单。左右方向键选择,按空格确认。 |
|
||||
| `help_explore` | 左右方向键切换选项,按空格确认。按回车重新听场景,按上方向键查看状态,按下方向键打开菜单。 |
|
||||
| `help_battle` | 战斗中,左右方向键选招式,按空格出手。听到敌人的前摇,按回车格挡。 |
|
||||
| `btl_lose_hint` | 记住,听清前摇,按回车格挡。 |
|
||||
| `tut_b2` | 就是现在,按回车格挡! |
|
||||
| `tut_b3` | 挡住了!轮到你了。左右方向键选攻击,按空格出剑。 |
|
||||
| `help_explore` | 左右方向键选,按空格确认。上方向键看状态,下方向键开菜单。**(26 号修改稿)** |
|
||||
| `help_battle` | 战斗中,左右方向键选招,按空格出手。前摇一响,按空格挡住。**(26 号修改稿)** |
|
||||
| `btl_lose_hint` | 记住,听清前摇,按空格挡住。**(26 号修改稿)** |
|
||||
| `tut_b2` | 就是现在,按空格挡住!**(26 号修改稿)** |
|
||||
| `tut_b3` | 选攻击,按空格出剑。**(26 号修改稿)** |
|
||||
| `shop_open` | 商店。左右方向键看看货,按空格购买。 |
|
||||
| `skip_hint` | 按空格可跳过旁白。 |
|
||||
| `tut_battle_2` | 左右方向键切换招式,攻击、破空斩、防御、金疮药。按空格,出手。 |
|
||||
| `tut_battle_3` | 敌人出手前有一声前摇。听到前摇,马上按回车,就能格挡。 |
|
||||
| `tut_battle_5` | 记住:听清前摇,按回车格挡。开始吧! |
|
||||
| ~~`tut_battle_2`~~ | ~~左右方向键切换招式,攻击、破空斩、防御、金疮药。按空格,出手。~~(**停用**) |
|
||||
| ~~`tut_battle_3`~~ | ~~敌人出手前有一声前摇。听到前摇,马上按回车,就能格挡。~~(**停用**) |
|
||||
| ~~`tut_battle_5`~~ | ~~记住:听清前摇,按回车格挡。开始吧!~~(**停用**) |
|
||||
| `tut_b0` | 战斗里,左右方向键选招式,按空格出手。听到这个声音,就是你的回合。先按一按方向键,试试。 |
|
||||
| `tut_b6` | 来不及格挡,就选防御。左右方向键,选防御,按空格。 |
|
||||
| `gd_parry_miss` | 前摇声起的时候按回车,才能格挡。 |
|
||||
| `gd_stall` | 想好了吗?左右方向键选择,按空格出手。 |
|
||||
| `tut_b6` | 来不及挡,就选防御。左右方向键,选防御,按空格。 |
|
||||
| `gd_parry_miss` | 前摇响着呢。按空格,挡住。**(26 号修改稿)** |
|
||||
| ~~`gd_stall`~~ | ~~想好了吗?左右方向键选择,按空格出手。~~(**停用**) |
|
||||
| `sys_first_tap` / `sys_first_tap_short` | 按一下空格。**(新增)** |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就按上方向键。**(新增)** |
|
||||
| `sys_unlock_down` | 按下方向键,可以打开菜单。**(新增)** |
|
||||
| `sys_unlock_dt` | 没听清,就按回车,再听一遍。**(新增)** |
|
||||
| `hint_explore_short` / `hint_swipe_short` | 按方向键。**(新增)** |
|
||||
| `only_explore` | 现在,只要左右方向键。**(新增)** |
|
||||
| `hint_shop_full` | 按空格,买下。**(新增)** |
|
||||
| `hint_shop_short` | 按空格。**(新增)** |
|
||||
| `hint_cmd_short` | 按空格出手。**(新增)** |
|
||||
| `tut_def_short` | 选防御。**(新增,无操作词不变体)** |
|
||||
| `st_where_1` | 村外小路。去黑风寨。按方向键。**(新增)** |
|
||||
| `st_where_2` | 林子深处。去黑风寨。按方向键。**(新增)** |
|
||||
| `st_where_3` | 黑风寨。救徒弟。按方向键。**(新增)** |
|
||||
| `inv_up_locked` | 上方向键还没解锁。先去战斗。**(新增)** |
|
||||
| `inv_down_locked` | 菜单,通关第一章解锁。**(新增,无操作词不变体)** |
|
||||
|
||||
---
|
||||
|
||||
## 26 号重构变更登记(2026-10,docs/design/26-apply-rpg.md)
|
||||
|
||||
完整清单(含全部文案与类别)见 `tools/voice_lines_26/rpg.md`;生成仍以
|
||||
`tools/gen_voice_dual.py` `RPG_LINES` 为准(**本表与 KEY_LINES 两表一致铁律**)。
|
||||
NPC 平铺台词(N 组)不改。
|
||||
|
||||
| 变更 | id | 说明 |
|
||||
|---|---|---|
|
||||
| **新增 ×20** | `sys_first_tap` / `sys_first_tap_short` / `sys_turn_teach` / `sys_say_again` / `sys_unlock_up` / `sys_unlock_down` / `sys_unlock_dt` / `sys_demo_continue` / `hint_explore_short` / `only_explore` / `hint_shop_full` / `hint_shop_short` / `hint_cmd_short` / `hint_swipe_short` / `tut_def_short` / `inv_up_locked` / `inv_down_locked` / `st_where_1..3` | 已并入上文 S 组与键盘变体表;通用系统句与 storyline 逐字一致 |
|
||||
| **修改 ×6** | `help_explore` / `help_battle` / `btl_lose_hint` / `tut_b2` / `tut_b3` / `gd_parry_miss` | 全部消除「双击格挡 / 双击重听」旧口径:格挡 = 前摇窗口内**再单击**(05 系列明令) |
|
||||
| **停用 ×7** | `intro_3` / `tut_battle_1..5` / `gd_stall` | 开场规则念白砍掉(26 号 §4.10);R6 长教学链改一句一教(原则 11);旧看门狗插播句由三档提示 + 迷茫接管取代 |
|
||||
| **保留在用** | `gd_wrap_first` / `gd_wrap_last` / `tut_b0` / `tut_b1` / `tut_b2b` / `tut_b4` / `tut_b5` / `tut_b6` / `skip_hint` / `foe_hp_*` / `boss1_warn` / `btl_flee_fail` | 探索回绕/末位提示、教学四步、跳句提示、敌方血量档照旧引用 |
|
||||
|
||||
@@ -272,3 +272,58 @@ web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
|
||||
| `p7` | 她的呼吸平了。按左方向键,留在直播里,让全城等这个门铃。按右方向键,换垫乐,私下陪她说完。 |
|
||||
| `p8` | 方向盘比话筒危险。按左方向键,陪他聊聊闺女。按右方向键,让他立刻进服务区。 |
|
||||
| `p9` | 留言机红灯在闪,是老主播三年前没播完的那句晚安。按左方向键,替他播出去。按右方向键,照常收播。 |
|
||||
|
||||
## R4 · 26 号深度重构(设计单 26-apply-radio.md;施工台词清单 `tools/voice_lines_26/radio.md`)
|
||||
|
||||
> 交互权威 26 号手册。本轮开场第一句改 critical 指令「点一下屏幕。」(b_rule/gd_brief
|
||||
> 规矩念白废除)、等待点三档提示统一 sys_hint_* / 主动重听「再说一遍:」前缀、
|
||||
> 手势阶梯三阶段教学句、菜单改左右滑换项 + 单击确认(00 §5.4)、旧「双击重听 /
|
||||
> 单击循环菜单」口径全部废止。增量清单原文 = `tools/voice_lines_26/radio.md`
|
||||
>(生成并表时逐字并入 `tools/gen_voice_dual.py` RADIO_PROD_LINES,两表一致铁律;
|
||||
> `web/harness/voice_text.json` radio 主表已同步,149 条)。类别:critical / content /
|
||||
> hint / feedback。系统/交互层句子全部走 **PROD 导播组**(与既有 sys_skip 一致)。
|
||||
|
||||
**新增(25 句 × 双性别,PROD 组;其中 4 条由引擎播出但资产照落本目录)**:
|
||||
|
||||
| id | 台词全文 | 类别 | 触发 |
|
||||
|---|---|---|---|
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical | 冷启动第一句(≤3s,不可打断) |
|
||||
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 `_short` 档 |
|
||||
| `sys_ring_teach` | 热线灯亮了。点一下,接听。 | content | RING 状态声首现教学(全局一次) |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」状态声首现教学(挂 z1_a 链尾,全局一次;与 storyline 同文案) |
|
||||
| `sys_praise` | 对。 | feedback | 首抉择链头肯定句(原则 11,≤4 字) |
|
||||
| `sys_hint_continue_full` | 单击,继续。 | hint | continue 等待点 full 档 |
|
||||
| `sys_hint_continue_short` | 单击。 | hint | continue/settle 等待点 `_short` 档 |
|
||||
| `sys_hint_choice_short` | 左右滑,选。 | hint | choice 等待点 `_short` 档 |
|
||||
| `sys_hint_ring_short` | 点一下,接听。 | hint | ring 等待点 `_short` 档(18s) |
|
||||
| `sys_hint_again_full` | 单击,重新开始。 | hint | settle 等待点 full 档 / 结算滑动解释句 |
|
||||
| `sys_hint_menu_short` | 左右滑,点一下。 | hint | menu 等待点 `_short` 档 |
|
||||
| `sys_only_choice` | 现在,只要左右滑。 | hint | 迷茫 L2 抉择点缩小选择 |
|
||||
| `sys_demo_continue` | 听我做一次。 | hint | 迷茫 L3 演示前缀(intro/ring/continue) |
|
||||
| `sys_demo_choice` | 左右滑,都可以。现在你来。 | hint | 迷茫 L3 抉择点演示(不替玩家选) |
|
||||
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(engine/hints.js 播出,全项目一句) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content | 手势阶梯阶段 1 教学句(挂首抉择后链尾;engine/novice.js teachLine 播出) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 阶段 2 教学句(挂首局结局链尾;engine/novice.js) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 阶段 3 教学句(engine/novice.js) |
|
||||
| `menu_help` | 左右滑换项,点一下确认。 | content | 菜单说明(menu 等待点 full 档 + 菜单内上滑重听) |
|
||||
| `status_choice` | 正在抉择。左右滑。 | hint | 抉择等待点上滑「我在哪」 |
|
||||
| `inv_nosel` | 现在不用选。单击继续。 | feedback | 非抉择点滑动首次解释(原则 7) |
|
||||
| `inv_ring` | 现在不用选。点一下,接听。 | feedback | RING 滑动首次解释 |
|
||||
| `inv_generic` | 这个操作用不上。单击继续。 | feedback | 其余无效格子 / 新手期长按首次解释 |
|
||||
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释 |
|
||||
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释 |
|
||||
|
||||
**修改(2 句,id 不变重录)**:`gd_ring1`「热线在闪。点一下,接听。」(原「单击,接听」,
|
||||
动作词与 sys_ring_teach 统一);`sys_menu`「菜单。左右滑换项,点一下确认。」(原
|
||||
「单击切换选项,双击确认」= 旧菜单口径,00 §5.4 废止)。
|
||||
|
||||
**删除(8 句)**:`gd_brief` / `gd_continue` / `gd_again` / `gd_invalid` / `gd_ring2`
|
||||
(向导层让位三档提示 + inv_* 首次解释,原则 7/9)、`sys_help`(全局帮助溢出废止,
|
||||
「双击重新听」旧口径)、`b_rule`(开场规矩念白,§4.10 零规则念白)、`sys_saved`
|
||||
(「保存并回大厅」由 sys_menu_lobby 一句承担)。上方 G0 / G1 组表中对应行按本节
|
||||
口径废止;合计 132 − 8 + 25 = **149 句**(双性别 120 ×2 + NPC 29)。
|
||||
|
||||
**键盘变体**:新增 21 条 + `sys_menu` 重录(「菜单。左右方向键换项,按空格确认。」);
|
||||
`gd_ring1` 变体沿用不重录(现变体不含「单击」字样);`gd_brief` / `gd_continue` /
|
||||
`gd_again` / `gd_ring2` / `sys_help` 变体随主句停用。多音字口径维持全表无「重听」
|
||||
(一律「重新听」/「再听一遍」)。
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# 16b · 《回声地窟》语音台词表(voice ids,录音依据)
|
||||
|
||||
> **26 号对齐(资产清单,不是交互宪法)**
|
||||
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准。
|
||||
> - 本表仍是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准)。含「双击重听 / 双击使用 / 双击格挡 / 单击循环菜单」的句子 **停用或按游戏正文重录**。
|
||||
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复;重听前加「再说一遍:」。
|
||||
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听」类旧口径,或仅在阶段 3 解锁双击后启用。
|
||||
> - 共用新句见 [14-guide-layer.md](14-guide-layer.md) §7(`sys_first_tap` 等)。各游戏 `_full` / `_short` 在游戏正文设计单里点名,补进本表后再进生成脚本。
|
||||
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准;本作深度改造设计单见 [26-apply-dungeon.md](26-apply-dungeon.md)。
|
||||
> - 本表是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准;26 号改造替换稿见 `tools/voice_lines_26/dungeon.md`:新增 35 / 修改 4 / 删除 25 / 键盘变体 44,127 → 137 句)。下方 A~M 组为 26 号前登记底表,增量以文末「26 号同步」三节为准。
|
||||
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字,状态查询 ≤20 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复(30s 台账);主动重听前加「再说一遍:」。
|
||||
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听/确认」类旧口径,阶段 3 解锁双击后才按回车重听。
|
||||
> - 通用系统句与 storyline 文案逐字一致(sys_first_tap / sys_turn_teach / sys_say_again / sys_unlock_*)。多音字:「重听」一律作「重新听」。
|
||||
|
||||
|
||||
> **给音频总监的录制说明**
|
||||
@@ -182,14 +182,79 @@
|
||||
|
||||
---
|
||||
|
||||
**合计:127 句 ×2 性别 = 254 条音频**(×2 格式 = 508 文件;无 NPC 平铺件。R3:125 + `gold_some` + `tut_flee_hold`;`st_best_2` 措辞重录不加句)。
|
||||
死亡结算链 = `die_intro → die_cause_X → die_adv_Y → st_floor_N(复用)→ meta_gold_X(band1 且金>0 时为 gold_some)→ settle_stronger → settle_again`;
|
||||
通关链 = `settle_win_1 → settle_win_2 → meta_gold_X(同上)→ unlock 段 → settle_again`;
|
||||
上滑局面复述链 = `st_floor_N → st_hp_X → st_gold_X(band1 且金>0 时为 gold_some)→ st_face_X → st_threat_X`。
|
||||
主设计触发逻辑对照 [16-dungeon.md](16-dungeon.md) §4-§11;资产规模核对见其 §9。
|
||||
## 26 号同步 · 新增(35 句;`tools/voice_lines_26/dungeon.md` §1)
|
||||
|
||||
| id | 文案 | 类别 | 触发/语境 |
|
||||
|---|---|---|---|
|
||||
| `d0_new` | 黑暗。点一下,听回声。 | critical | D0 开场首句(§4.10 第一句即动手) |
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical | TITLE 无档询问句(与 storyline 逐字一致) |
|
||||
| `sys_first_tap_short` | 点一下。 | hint | TITLE / 教学等待点短句档 |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | D1→D2 交话轮状态教学 |
|
||||
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(阶段 3 双击重听) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 阶梯 2 解锁教学(ladder.teachLine) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 阶梯 3 解锁教学(ladder.teachLine) |
|
||||
| `tut_praise` | 对。 | feedback | 教学做对肯定(原则 11,≤4 字) |
|
||||
| `tut_move` | 朝前,滑一下。 | content | D2 前进教学 |
|
||||
| `tut_side_move` | 向左滑,转身走。 | content | D3 侧移转向教学 |
|
||||
| `tut_coin` | 房里有金币,走过去捡。 | content | D4 自由拾取教学 |
|
||||
| `tut_help_hold` | 迷路了,按住屏幕。 | content | D5 长按问路教学 |
|
||||
| `tut_parry_tap` | 听到动静,单击格挡。 | content | D6 前摇单击格挡教学 |
|
||||
| `hint_swipe` | 滑一下。 | hint | 教学等待点/接管 L1 短句 |
|
||||
| `btl_turn_short` | 点一下,打。 | hint | 战斗等待点短句档 |
|
||||
| `wall` | 那边是墙。 | feedback | 首次撞墙归因(整局一次) |
|
||||
| `wall_dir_front` | 墙就在正前。 | feedback | 撞墙方位真话·前(每方向一次) |
|
||||
| `wall_dir_left` | 墙在左手边。 | feedback | 撞墙方位真话·左 |
|
||||
| `wall_dir_right` | 墙在右手边。 | feedback | 撞墙方位真话·右 |
|
||||
| `wall_dir_back` | 墙在身后。 | feedback | 撞墙方位真话·后 |
|
||||
| `inv_pulse` | 回声还没回来,稍等。 | feedback | 脉冲冷却期单击(状态×手势一次) |
|
||||
| `inv_title` | 标题页,点一下就行。 | feedback | TITLE 意外滑动 |
|
||||
| `inv_settle` | 结算完,点一下再来。 | feedback | SETTLE 意外滑动 |
|
||||
| `inv_drill` | 先照我说的做。 | feedback | 教学步骤外手势 |
|
||||
| `inv_tel` | 格挡只要单击。 | feedback | 前摇窗内长按/上下滑 |
|
||||
| `inv_menu_locked` | 菜单,玩完一局解锁。 | feedback | 阶段 2 前下滑开菜单 |
|
||||
| `menu_open` | 菜单。 | content | 菜单呼出(后接首项报名) |
|
||||
| `menu_help` | 左右滑换项,单击确认。 | hint | 菜单说明/重听 |
|
||||
| `menu_restart_confirm` | 重开就丢了这局。再点一次。 | feedback | 重开二次确认(原则 6) |
|
||||
| `sys_only_up` | 现在,只要向上滑。 | feedback | 迷茫 L2 只放行·上 |
|
||||
| `sys_only_down` | 现在,只要向下滑。 | feedback | 迷茫 L2 只放行·下 |
|
||||
| `sys_only_left` | 现在,只要向左滑。 | feedback | 迷茫 L2 只放行·左 |
|
||||
| `sys_only_right` | 现在,只要向右滑。 | feedback | 迷茫 L2 只放行·右 |
|
||||
| `sys_demo` | 听我做一次。 | feedback | 迷茫 L3 演示前缀 |
|
||||
| `sys_now_you` | 现在,你来。 | feedback | 迷茫 L3 演示交回 |
|
||||
|
||||
## 26 号同步 · 修改(4 句;id 不变整句替换)
|
||||
|
||||
| id | 新文案 | 旧文案(废止口径) |
|
||||
|---|---|---|
|
||||
| `help_explore` | 四向滑动走路,单击脉冲,长按问路。 | 单击脉冲,按住前进,左右滑转身。双击再听,上滑状态,下滑菜单。 |
|
||||
| `help_battle` | 听到动静单击格挡;轮到你,单击挥击。下滑逃跑。 | 敌人前摇声响时双击格挡,单击挥击。打不过就按住屏幕逃跑。 |
|
||||
| `die_adv_1` | 下次,前摇声响时就单击。 | 下次,前摇声响时就双击。 |
|
||||
| `die_adv_2` | 打不过,就向下滑逃跑。 | 打不过,就按住屏幕逃跑。 |
|
||||
|
||||
## 26 号同步 · 删除(25 句;convert 后删音频)
|
||||
|
||||
`intro_1` `intro_2`(开场规则念白,§4.10 反模式);`tut_d0`(→ d0_new);`tut_echo_come`
|
||||
(D1 由 tut_praise + tut_front_rule 承担);`tut_side_rule`(侧墙做中学:撞墙归因当场教);
|
||||
`tut_walk`(长按=前进废);`tut_turn`(转身并入侧移);`tut_replay`(双击免冷却重播废);
|
||||
`tut_status`(上滑=状态废);`tut_menu`(对局下滑=后退);`tut_parry`(双击格挡废 →
|
||||
tut_parry_tap);`tut_flee_hold`(长按逃跑废 → 下滑);`sys_menu`(单击切换/双击确认废 →
|
||||
menu_open + menu_help);`sys_menu_resume`(新菜单无「返回探索」项);`gd_pulse`
|
||||
(探索等待声由环境承担);`gd_invalid`(回执 + inv_* 覆盖);`nav_e` `nav_s` `nav_w`
|
||||
`nav_n` `nav_done`(导航改 stair_dir_* + sys_only_*);`st_gold_1..4`(旧上滑状态链废,
|
||||
金位由 meta_gold_* + gold_some 承担)。
|
||||
|
||||
---
|
||||
|
||||
## 键盘变体(key,P1 输入平权路线 a,20 句)
|
||||
**合计(26 号后):沿用 98 + 修改 4 + 新增 35 = 137 句 ×2 性别 = 274 条音频**(×2 格式
|
||||
= 548 文件;无 NPC 平铺件)。
|
||||
死亡结算链 = `die_intro → die_cause_X → die_adv_Y → st_floor_N(复用)→ meta_gold_X(band1 且金>0 时为 gold_some)→ settle_stronger → settle_again`;
|
||||
通关链 = `settle_win_1 → settle_win_2 → meta_gold_X(同上)→ unlock 段 → settle_again`;
|
||||
局面复述链/长按帮助链 = `st_floor_N → [st_hp_X if 伤] → st_face_X → 楼梯方位句(stair_dir_* / stair_hint_b / btl_king)`。
|
||||
主设计触发逻辑对照 [16-dungeon.md](16-dungeon.md) §4-§11;施工单 [26-apply-dungeon.md](26-apply-dungeon.md);
|
||||
替换稿 `tools/voice_lines_26/dungeon.md`。
|
||||
---
|
||||
|
||||
## 键盘变体(key,P1 输入平权路线 a,26 号后 44 句)
|
||||
|
||||
「生效输入模式=键盘」(settings.input=key,或 auto 且键盘在跟/纯桌面初始判定,
|
||||
web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
|
||||
@@ -198,30 +263,55 @@ web/engine/gesture.js inputMode())时,引擎 voice 候选链前置加载
|
||||
> 措辞规范(02-input-parity.md §4.3 路线 a + P1 裁定):向左滑→按左方向键(四向同理,
|
||||
> WASD 不进台词);单击/轻触屏幕→按空格;双击→按回车;按住/长按→按住空格;
|
||||
> 复合短语(左右滑→左右方向键、滑动→方向键)按语义等价展开;只改操作词,其余
|
||||
> 内容一字不动,不新增「重」类多音字。本表与 `tools/gen_voice_dual.py` 的
|
||||
> `KEY_LINES` 逐字一致(两表一致铁律:改一处必改另一处)。
|
||||
> 资产:×2 性别 = 20×2 条、×2 格式 = 20×4 文件;管线 `gen_voice_dual.py --only-variants`
|
||||
> 内容一字不动,不新增「重」类多音字。26 号替换稿(44 句全表)见
|
||||
> `tools/voice_lines_26/dungeon.md` §4,与 `tools/gen_voice_dual.py` 的
|
||||
> `KEY_LINES["dungeon"]` 逐字一致(两表一致铁律:改一处必改另一处)。
|
||||
> 资产:×2 性别 = 44×2 条、×2 格式 = 44×4 文件;管线 `gen_voice_dual.py --only-variants`
|
||||
> 生成 → `--convert` 落盘,终检 `tools/check_all_assets.py`(key 两性别一致且 ⊆ 主集)。
|
||||
|
||||
| id | 键盘台词全文(触屏原句见本表上方对应 id) |
|
||||
| id | 键盘台词全文(触屏原句见本表上方对应 id / 26 号同步节) |
|
||||
|---|---|
|
||||
| `sys_continue_ask` | 检测到探窟记录。按空格继续,按右方向键重新开始。 |
|
||||
| `tut_d0` | 先学会用耳朵看。按空格,发出声波脉冲。 |
|
||||
| `tut_walk` | 按住空格不放,你就往前走。 |
|
||||
| `tut_turn` | 按左右方向键,可以转身。 |
|
||||
| `tut_replay` | 按回车,再发一次脉冲,不要钱。 |
|
||||
| `tut_status` | 按上方向键,随时听自己的状态。 |
|
||||
| `tut_menu` | 按下方向键,打开菜单。 |
|
||||
| `tut_parry` | 听到它的动静,按回车格挡。 |
|
||||
| `tut_attack` | 现在按空格,挥拳打它。 |
|
||||
| `tut_flee_hold` | 想逃跑,按住空格别松手。 |
|
||||
| `d0_new` | 黑暗。按一下空格,听回声。 |
|
||||
| `sys_first_tap` | 按空格。 |
|
||||
| `sys_first_tap_short` | 按一下空格。 |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 |
|
||||
| `sys_say_again` | 再说一遍: |
|
||||
| `sys_unlock_down` | 按下方向键,可以打开菜单。 |
|
||||
| `sys_unlock_dt` | 没听清,就按回车,再听一遍。 |
|
||||
| `sys_continue_ask` | 检测到探窟记录。按空格继续,右方向键重新开始。 |
|
||||
| `tut_move` | 朝前,按上方向键。 |
|
||||
| `tut_side_move` | 按左方向键,转身走。 |
|
||||
| `tut_coin` | 房里有金币,走过去捡。 |
|
||||
| `tut_help_hold` | 迷路了,按住空格。 |
|
||||
| `tut_parry_tap` | 听到动静,按空格格挡。 |
|
||||
| `tut_stairs_on` | 楼梯就在脚下。按空格,下潜。 |
|
||||
| `tut_skip` | 已跳过教学。按空格发脉冲,先听听四周。 |
|
||||
| `sys_menu` | 菜单。按空格切换,按回车确认。 |
|
||||
| `help_explore` | 按空格发脉冲,按住空格前进,左右方向键转身。按回车再听,上方向键查状态,下方向键开菜单。 |
|
||||
| `help_battle` | 敌人前摇声响时按回车格挡,按空格挥击。打不过就按住空格逃跑。 |
|
||||
| `die_adv_1` | 下次,前摇声响时就按回车。 |
|
||||
| `die_adv_2` | 打不过,就按住空格逃跑。 |
|
||||
| `gd_pulse` | 按空格发脉冲,听听四周。 |
|
||||
| `gd_turn` | 轮到你了。按空格挥击。 |
|
||||
| `tut_attack` | 现在按空格,挥拳打它。 |
|
||||
| `hint_swipe` | 按方向键。 |
|
||||
| `btl_turn_short` | 按空格,打。 |
|
||||
| `wall_dir_front` | 墙就在正前。 |
|
||||
| `wall_dir_left` | 墙在左手边。 |
|
||||
| `wall_dir_right` | 墙在右手边。 |
|
||||
| `wall_dir_back` | 墙在身后。 |
|
||||
| `inv_pulse` | 回声还没回来,稍等。 |
|
||||
| `inv_title` | 标题页,按空格就行。 |
|
||||
| `inv_settle` | 结算完,按空格再来。 |
|
||||
| `inv_drill` | 先照我说的做。 |
|
||||
| `inv_tel` | 格挡只要按空格。 |
|
||||
| `inv_menu_locked` | 菜单,玩完一局解锁。 |
|
||||
| `menu_help` | 左右方向键换项,按空格确认。 |
|
||||
| `menu_restart_confirm` | 重开就丢了这局。再按一次。 |
|
||||
| `sys_only_up` | 现在,只要按上方向键。 |
|
||||
| `sys_only_down` | 现在,只要按下方向键。 |
|
||||
| `sys_only_left` | 现在,只要按左方向键。 |
|
||||
| `sys_only_right` | 现在,只要按右方向键。 |
|
||||
| `sys_demo` | 听我做一次。 |
|
||||
| `sys_now_you` | 现在,你来。 |
|
||||
| `help_explore` | 方向键走路,按空格发脉冲,按住空格问路。 |
|
||||
| `help_battle` | 听到动静按空格格挡;轮到你,按空格挥击。下方向键逃跑。 |
|
||||
| `die_adv_1` | 下次,前摇声响时就按空格。 |
|
||||
| `die_adv_2` | 打不过,就按下方向键逃跑。 |
|
||||
| `settle_again` | 按空格,再探一次。 |
|
||||
| `gd_turn` | 轮到你了。按空格挥击。 |
|
||||
| `tut_kill` | 打中了,就是这样。 |
|
||||
| `tut_done` | 教学完了。地窟很深,小心走。 |
|
||||
| `tut_skip` | 已跳过教学。按空格发脉冲,先听听四周。 |
|
||||
|
||||
@@ -275,3 +275,65 @@
|
||||
| R2-F10 | 新增 `prog_saved1..5`(双性别):上滑状态链 G6 顺序改为 潜次→已救人数→氧档→帮助;saved=0 不播 | R1 P3:被打断后要捡回「船上躺着谁」 |
|
||||
|
||||
以上四组为新增/改词;其余裁定(148 句中未改词的 146 句原文、触发条件、滤波参数)不变。
|
||||
|
||||
## R3 · 26 号深度重构(设计单 26-apply-abyss.md;施工台词清单 `tools/voice_lines_26/abyss.md`)
|
||||
|
||||
> 交互权威 26 号手册;玩法正文 = 17-abyss.md 附录 C。本轮开场第一句改 critical 指令
|
||||
> 「点一下屏幕。」(b_rule / gd_brief 规矩念白废除)、等待点三档提示统一 sys_hint_* /
|
||||
> 主动重听「再说一遍:」前缀、手势阶梯三阶段教学句、菜单改左右滑换项 + 单击确认
|
||||
>(00 §5.4)、「双击重听回波」废止(搜索等待再单击=再发脉冲,自然再听)。增量清单
|
||||
> 原文 = `tools/voice_lines_26/abyss.md`(生成并表时逐字并入 `tools/gen_voice_dual.py`
|
||||
> ABYSS_DECK_LINES,两表一致铁律)。类别:critical / content / hint / feedback。
|
||||
> 系统/交互层句子全部走 **DECK 母船调度组**(=系统音,与 radio PROD 组同型)。
|
||||
|
||||
**新增(23 句 × 双性别,DECK 组;其中 4 条由引擎播出但资产照落本目录)**:
|
||||
|
||||
| id | 台词全文 | 类别 | 触发 |
|
||||
|---|---|---|---|
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical | 冷启动第一句(≤3s,不可打断,§4.10) |
|
||||
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 `_short` 档 |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」交接提示音首现教学(全局一次,原则 2) |
|
||||
| `sys_hint_ping_full` | 单击,发一枚脉冲。 | hint | 搜索等待 full 档(8s;与 dv1_teach 动作词一致) |
|
||||
| `sys_hint_ping_short` | 单击。 | hint | 搜索等待 `_short` 档(18s) |
|
||||
| `sys_hint_continue_full` | 单击,继续。 | hint | continue 等待点 full 档(13s;COMMS 链末复用) |
|
||||
| `sys_hint_continue_short` | 单击。 | hint | continue/settle 等待点 `_short` 档 |
|
||||
| `sys_hint_choice_short` | 左右滑,选。 | hint | choice 等待点 `_short` 档(25s 台账降档) |
|
||||
| `sys_hint_settle_full` | 单击,开始新救援。 | hint | 结算等待点 full 档(20s;结局链听完后的动作句) |
|
||||
| `sys_only_choice` | 现在,只要左右滑。 | hint | 迷茫 L2 抉择点缩小选择 |
|
||||
| `sys_demo_continue` | 听我做一次。 | hint | 迷茫 L3 演示前缀(intro/continue) |
|
||||
| `sys_demo_choice` | 左右滑,都可以。现在你来。 | hint | 迷茫 L3 抉择点演示(不替玩家选) |
|
||||
| `sys_act_ping` | 点一下,发脉冲。 | feedback | 搜索等待无效滑动首次解释(17 号 §7)+ 上滑状态链动作句 |
|
||||
| `status_choice` | 正在抉择。左右滑。 | hint | 抉择等待点上滑「我在哪」动作句 |
|
||||
| `menu_help` | 左右滑换项,点一下确认。 | content | 菜单说明(menu 等待点 full 档 + 菜单内上滑重听) |
|
||||
| `inv_nosel` | 现在不用选。单击继续。 | feedback | 非抉择点滑动首次解释(原则 7) |
|
||||
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释(阶段 0) |
|
||||
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释(阶段 <2) |
|
||||
| `sys_menu_restart_confirm` | 再点一下,确认重开。 | feedback | 「重新开始」二次确认(00 §5.4 破坏性操作) |
|
||||
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(engine/hints.js 播出,全项目一句) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content | 阶段 1 教学句(挂第一次脉冲成功后的回波链尾;engine/novice.js teachLine 播出) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 阶段 2 教学句(挂首局结局链尾;engine/novice.js) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 阶段 3 教学句(第 3 局;双击=重听等待点完整句;engine/novice.js) |
|
||||
|
||||
**修改(1 句,id 不变重录)**:`sys_menu`「菜单。左右滑换项,点一下确认。」(原
|
||||
「菜单。单击切换选项,双击确认。」= 旧菜单口径,00 §5.4 废止;`sys_menu_k` 同步重录
|
||||
「菜单。左右方向键换项,按空格确认。」)。其余既有句不动(sys_skip / sys_continue_ask /
|
||||
sys_new_dive / 菜单三项 / gd_invalid / prog_* / oxy_* / dry_* / prog_saved* 与全部剧情句;
|
||||
dv1_teach「单击,发一枚脉冲」与新 sys_hint_ping_full 动作词一致,不重录)。
|
||||
|
||||
**删除(10 句)**:`gd_brief` / `gd_continue` / `gd_again` / `gd_ping1` / `gd_ping2`
|
||||
(向导层让位三档提示 sys_hint_ping_*/continue_*,原则 7/9)、`gd_prog1` / `gd_prog2`
|
||||
(迷茫接管 L1 改用等待点 `_short` 档,原则 8 不说教)、`sys_help`(全局帮助溢出废止,
|
||||
含旧「双击重新听」口径)、`sys_settings`(菜单仅三项,永无播出位)、`b_rule`(开场
|
||||
规矩念白,§4.10 砍掉;氧气账目契约由档位句与取消链 dv4_none 承载)。上方 G0 / G1 组
|
||||
表中对应行按本节口径废止;「双击重听回波」无专属台词 id(旧实现复用回波资产),
|
||||
台词层无删项、代码层已清理。合计 123 − 10 + 23 = **136 句**(双性别)+ NPC 21。
|
||||
|
||||
**键盘变体**:新增 20 条(sys_first_tap / sys_first_tap_short / sys_hint_ping_full /
|
||||
sys_hint_ping_short / sys_hint_continue_full / sys_hint_continue_short /
|
||||
sys_hint_choice_short / sys_hint_settle_full / sys_only_choice / sys_demo_choice /
|
||||
sys_act_ping / status_choice / menu_help / inv_nosel / inv_up_locked / inv_down_locked /
|
||||
sys_menu_restart_confirm / sys_unlock_up / sys_unlock_down / sys_unlock_dt,措辞照
|
||||
KEY_LINES["storyline"]「按空格 / 左右方向键 / 按回车」)+ `sys_menu` 重录;删除
|
||||
6 对(gd_brief / gd_continue / gd_again / gd_ping1 / gd_ping2 / sys_help 随主句停用);
|
||||
保留 4 对(sys_skip / sys_continue_ask / dv1_teach / p1)。变体合计 11 − 6 + 21 = **26 对**。
|
||||
多音字口径维持全表无「重听」(一律「重新听」/「再听一遍」/「重开」)。
|
||||
|
||||
@@ -293,3 +293,65 @@
|
||||
状态链 = `st_asked_n → st_doubt_m →(尾句:recap_go / recap_cf(听齐未破,R2 F6)/ hint_fin(疑点齐,R2 F6))`;中断复述链 = `st_asked_n →(未听 ≤3 时)item_* 名链 → st_doubt_m → 同尾句`;
|
||||
错指链 = `acc_NPC → fin_clear → st_wrong(R2 F9)`;结案入口 = `fin_pre 闸(R2 F5)→ fin_start`。
|
||||
矩阵验算与触发逻辑对照 [18-detective.md](18-detective.md) §3-§7;资产规模核对见其 §8。
|
||||
|
||||
## R3 · 26 号深度重构(设计单 26-apply-detective.md;施工台词清单 `tools/voice_lines_26/detective.md`)
|
||||
|
||||
> 交互权威 26 号手册。本轮开场第一句改 critical 指令「点一下屏幕。」(DRILL 七步
|
||||
> 跟练废除,教学嵌真实案卷)、等待点三档提示 hint_board/cf_item/fin/tap 统一
|
||||
> `_full`/`_short`、主动重听「再说一遍:」前缀、手势阶梯三阶段教学句、指证=案卷
|
||||
> 列表项(「按住屏幕指证」「双击重听」口径全部废止)、菜单改左右滑换项+单击确认
|
||||
> (00 §5.4)。增量清单原文 = `tools/voice_lines_26/detective.md`(生成并表时逐字
|
||||
> 并入 `tools/gen_voice_dual.py` DETECTIVE_LINES;并入后重跑 `tools/extract_voice_text.py`
|
||||
> 刷新 harness 转写表)。类别:critical / content / hint / feedback。全部走
|
||||
> **`_DET` 探长组**;DETECTIVE_NPC 平铺 53 句不动。上方 G0/G1/G7 组表及 V 组中
|
||||
> 被本节点名废止的行按本节口径为准。
|
||||
|
||||
**新增(18 句 × 双性别,`_DET` 组;其中 4 条由引擎播出但资产照落本目录)**:
|
||||
|
||||
| id | 台词全文 | 类别 | 触发 |
|
||||
|---|---|---|---|
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical | 冷启动第一句(≤3s,不可打断;与 storyline 同文案) |
|
||||
| `sys_first_tap_short` | 点一下。 | hint | title 等待点 `_short` 档 |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」状态声首现教学(挂开场链尾,全局一次) |
|
||||
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(engine/hints.js 播出,全项目一句) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content | 阶段 1 教学句(听完第一份证词挂教学链尾;engine/novice.js teachLine 播出) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 阶段 2 教学句(挂首案结算链尾;engine/novice.js) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 阶段 3 教学句(挂第三案结算链尾;engine/novice.js) |
|
||||
| `tut_next_full` | 向右滑,下一份。 | content | 教学·换卷宗步(§4.10 第 10~25 秒,嵌真实案卷) |
|
||||
| `item_cf` | 指证。 | content | 「指证」案卷条目名(列表第 7 项,无签名音) |
|
||||
| `st_confront` | 正在指证。左右滑。 | hint | 指证选条目/选句相位上滑「我在哪」(附录 C §4) |
|
||||
| `hint_board_full` | 左右滑换卷宗。单击听取。 | hint | board 等待点 full 档(18s) |
|
||||
| `hint_board_short` | 左右滑。 | hint | board/cf_item 等待点 `_short` 档(共用) |
|
||||
| `hint_cf_item_full` | 左右滑,选一份证词。 | hint | cf_item 等待点 full 档 |
|
||||
| `hint_fin_short` | 左右滑,选。 | hint | finish 等待点 `_short` 档 |
|
||||
| `hint_tap_short` | 单击。 | hint | cf_line/cf_confirm/caseGate/settle 等待点 `_short` 档(共用) |
|
||||
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释(原则 7) |
|
||||
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释 |
|
||||
| `inv_longpress` | 长按用不上。单击继续。 | feedback | 长按首次解释(18 号 §3:长按不绑指证) |
|
||||
|
||||
**修改(4 句,id 不变重录)**:`tut_confront`「滑到指证,点一下。」(原「按住屏幕,
|
||||
进入指证……」;指证=案卷列表项)、`recap_cf`「滑到指证,去比对。」(原「……按住
|
||||
指证」;状态链尾指路句)、`sys_help`「左右滑换卷宗,单击听取。上滑问状态,下滑
|
||||
菜单。」(原句含「双击重新听/长按指证」废止口径,整句重写)、`sys_menu`「菜单。
|
||||
左右滑换项,单击确认。」(原「单击切换,双击确认」= 旧菜单口径,00 §5.4 废止)。
|
||||
|
||||
**删除(11 句)**:`sys_menu_cf`(指证入口=案卷列表项,菜单三项制)、`tut_d0` /
|
||||
`tut_replay` / `tut_status` / `tut_done` / `tut_skip`(DRILL 七步教学废止,教学嵌
|
||||
真实案卷;双击=阶段 3 由 sys_unlock_dt 统一教)、`gd_board` / `gd_board_cf` /
|
||||
`gd_cf` / `gd_fin`(看门狗句让位等待点三档提示,原则 9)、`gd_invalid`(让位
|
||||
inv_* 首次解释,原则 7)。合计 104 − 11 + 18 = **111 句**双性别(≤176 上限内),
|
||||
NPC 53 平铺不动。
|
||||
|
||||
**键盘变体**:新增 15 条(sys_first_tap「按空格。」/ sys_first_tap_short「按一下
|
||||
空格。」/ sys_unlock_up「想知道自己在哪,就按上方向键。」/ sys_unlock_down
|
||||
「按下方向键,可以打开菜单。」/ sys_unlock_dt「没听清,就按回车,再听一遍。」/
|
||||
tut_next_full「右方向键,下一份。」/ st_confront「正在指证。左右方向键。」/
|
||||
hint_board_full「左右方向键换卷宗。按空格听取。」/ hint_board_short「左右方向键。」/
|
||||
hint_cf_item_full「左右方向键,选一份证词。」/ hint_fin_short「左右方向键,选。」/
|
||||
hint_tap_short「按空格。」/ inv_up_locked / inv_down_locked / inv_longpress 同
|
||||
storyline 措辞)+ 重录 4 条(tut_confront「方向键到指证,按空格。」/ recap_cf
|
||||
「方向键到指证,去比对。」/ sys_help「左右方向键换卷宗,空格听取。上键状态,
|
||||
下键菜单。」/ sys_menu「菜单。左右方向键换项,按空格确认。」);删除 5 条变体
|
||||
随主句停用(tut_d0_k / tut_replay_k / gd_board_k / gd_cf_k / gd_board_cf_k)。
|
||||
V 组合计 14 − 5 + 15 = 24 对。多音字口径维持全表无「重听」(一律「重新听」/
|
||||
「再听一遍」)。
|
||||
|
||||
@@ -282,3 +282,71 @@ EP.b 组新增 4 句结局收集计数(结算链尾播报,数字规避分档
|
||||
- 无 `_k` 变体(无操作词);instruct 复用 WIND 常量;数字为分档整句无拼接。
|
||||
- 配套修复(同轮,无新台词):F1 NIGHT 链首纸面标记音(复用现有 sfx,零新增资产);
|
||||
F2 book_1 播报位附 warning 震(exp_hot 同机制)。
|
||||
|
||||
---
|
||||
|
||||
## R4 · 26 号深度重构(设计单 26-apply-cipher.md;施工台词清单 `tools/voice_lines_26/cipher.md`)
|
||||
|
||||
> 交互权威 26 号手册。本轮开场第一句改 critical 指令「点一下屏幕。」(b_rule/gd_brief
|
||||
> 规矩念白废除,b_open/b_goal/b_chief 移驻 NIGHT(1) 链首补全叙事)、等待点三档提示
|
||||
> 统一 sys_hint_* / gd_tune1_short / cf_hint_*、主动重听「再说一遍:」前缀、手势阶梯
|
||||
> 三阶段教学句、菜单改左右滑换项 + 单击确认(00 §5.4)、**「双击重听/慢放」「长按翻
|
||||
> 密码本」旧口径全部废止**(双击=阶段 3 阶梯重听电文原速→再请求慢放;翻本走菜单项
|
||||
> 或迷茫 L3)。增量清单原文 = `tools/voice_lines_26/cipher.md`(生成并表时逐字并入
|
||||
> `tools/gen_voice_dual.py` CIPHER_WIND_LINES,两表一致铁律;`web/harness/
|
||||
> voice_text.json` cipher 主表已同步,142 条)。类别:critical / content / hint /
|
||||
> feedback。系统/交互层句子全部走 **WIND 北风组**(北风电台=上线联络+系统音,与
|
||||
> radio 的 PROD 导播组同型;与既有 sys_skip 同组)。
|
||||
|
||||
**新增(20 句 × 双性别,WIND 组;其中 4 条由引擎播出但资产照落本目录)**:
|
||||
|
||||
| id | 台词全文 | 类别 | 触发 |
|
||||
|---|---|---|---|
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical | 冷启动第一句(≤3s,不可打断) |
|
||||
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 `_short` 档(full=null:指令句刚说过) |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」等待声首现教学(首夜开场第一下单击后,全局一次;与 storyline 同文案) |
|
||||
| `sys_hint_continue_full` | 单击,继续。 | hint | continue 等待点 full 档(13s) |
|
||||
| `sys_hint_continue_short` | 单击。 | hint | continue/settle 等待点 `_short` 档 |
|
||||
| `sys_hint_choice_short` | 左右滑,选。 | hint | choice 等待点 `_short` 档(25s 台账降档后首档) |
|
||||
| `sys_hint_again_full` | 单击,重新开始。 | hint | settle 等待点 full 档 / 结算态左右滑解释句 |
|
||||
| `gd_tune1_short` | 左右滑。 | hint | decode 等待点 `_short` 档(25s);menu 等待点 `_short` 复用同资产 |
|
||||
| `cf_hint_full` | 单击,定下这个词。 | hint | confirm 等待点 full 档(10s,19 号附录 C §5 原句) |
|
||||
| `cf_hint_short` | 单击。 | hint | confirm 等待点 `_short` 档(20s) |
|
||||
| `sys_only_choice` | 现在,只要左右滑。 | hint | 迷茫 L2 抉择点缩小选择(restrictLine) |
|
||||
| `sys_demo_continue` | 听我做一次。 | hint | 迷茫 L3 演示前缀(intro/continue:替玩家走一步) |
|
||||
| `sys_demo_choice` | 左右滑,都可以。现在你来。 | hint | 迷茫 L3 抉择点演示(不替玩家做有后果的选) |
|
||||
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(engine/hints.js 播出,全项目一句) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content | 手势阶梯阶段 1 教学句(T1 译对挂 dv1_right 揭晓链尾;engine/novice.js teachLine 播出) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 阶段 2 教学句(首局结局链尾;engine/novice.js) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 阶段 3 教学句(重听电文原速→再请求慢放 0.5×) |
|
||||
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释(原则 7) |
|
||||
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释 |
|
||||
| `inv_nosel` | 现在不用选。单击继续。 | feedback | 非抉择点滑动首次解释(叙事段左右滑) |
|
||||
|
||||
**修改(3 句,id 不变重录)**:`dv1_teach`「向右滑,听下一个词。」(原「电文进来了。
|
||||
先双击,把它重新听一遍。」= 双击重听口径,随阶段 3 阶梯废止;19 号附录 C §6 原句,
|
||||
critical);`sys_menu`「菜单。左右滑换项,点一下确认。」(原「单击切换选项,双击确认」
|
||||
= 旧菜单口径,00 §5.4 废止);`gd_invalid`「这个手势,值机室里用不上。单击,继续。」
|
||||
(补正确做法,原则 7 首次解释=原因+正确做法)。
|
||||
|
||||
**删除(10 句)**:`gd_brief` / `gd_continue` / `gd_again` / `gd_tune2`(向导层让位
|
||||
三档提示,原则 9;gd_tune2=双击重听/慢放常驻教学废止)/ `gd_prog1` / `gd_prog2`
|
||||
(无进展轨让位迷茫接管,且含双击口径)/ `sys_help`(帮助溢出废止,含「双击重新听」
|
||||
旧口径)/ `b_rule`(开场规矩念白,§4.10 零规则念白)/ `dv1_teach2`(两段确认教学
|
||||
停用,一句只教一个)/ `dv1_ask`(T1 职能并入 dv1_teach 改写版;dv2/dv3/dv4_ask
|
||||
保留)。上方 G0 / G1 / M1 组表中对应行按本节口径废止。
|
||||
|
||||
**计数(并表后)**:主句 132 − 10 + 20 = **142**(WIND 107 → 117,OP 20 与 NPC 平铺
|
||||
5 不动;`web/harness/voice_text.json` 已同步);`_k` 变体 11 → 24 对(删 6:
|
||||
gd_brief/gd_continue/gd_again/gd_tune2/sys_help/dv1_teach2;新增 19:17 条新增句
|
||||
+ dv1_teach/gd_invalid 改写句;sys_menu 重录替换);双性别组 138 → 161 句,总计
|
||||
**166 句**。上方头注「134 句 / 11 对变体」与 R2 节「143 句」按本节口径更新
|
||||
(R2 计数含变体:主句 127 + 变体 11 = 138)。
|
||||
|
||||
**键盘变体**:措辞照 KEY_LINES["storyline"](「按空格」「左右方向键」「按回车」);
|
||||
新增句无操作词不列(sys_turn_teach / sys_say_again / sys_demo_continue 落回主资产);
|
||||
修改句变体全部重录:`dv1_teach`「向右方向键,听下一个词。」、`sys_menu`「菜单。
|
||||
左右方向键换项,按空格确认。」、`gd_invalid`「这个手势,值机室里用不上。按空格
|
||||
继续。」。既有 gd_tune1 / sys_skip / sys_continue_ask / p2 变体不动;删除句变体随
|
||||
主句停用(b_rule / dv1_ask 本无变体)。多音字口径维持全表无「重听」(一律
|
||||
「重新听」/「再听一遍」)。
|
||||
|
||||
@@ -286,3 +286,77 @@
|
||||
| zhou_o3 / su_o3 | 头一回那盏 / 头一回那种 | 「回」口语连读 | 低风险,试听确认 |
|
||||
| 多处 | 还在/还有/还得/还是 | 「还」全表只用 hái 义(已排 huán 义句) | — |
|
||||
| 已排雷 | 全表 | 无「血爪挨壳酽」;「重听」一律写「重新听/再听一遍」;「空落落」统一「空荡荡」;数字全部整句写死(十五/二十/二十五/十二),无拼接 | — |
|
||||
|
||||
---
|
||||
|
||||
## R2 增量 · 26 号深度重构(2026-10)
|
||||
|
||||
> 施工单见 [26-apply-teahouse.md](26-apply-teahouse.md);清单副本
|
||||
> `tools/voice_lines_26/teahouse.md`(与下表逐字一致,并入 `tools/gen_voice_dual.py`
|
||||
> 时照抄)。本轮口径:废除「双击提壶/双击出汤/双击动手/单击切换+双击确认」,
|
||||
> tap 动作词统一「点一下」;上表含旧口径的句子按本节重录或停用。
|
||||
|
||||
### 新增(旁白 ×14,`_TEA`)
|
||||
|
||||
| id | 台词全文 | 类别 / 触发 |
|
||||
|---|---|---|
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical,开场第一句(≤3s) |
|
||||
| `sys_tap_start` | 点一下开始。 | critical,已 drillDone 玩家开场 |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content,「轮到你」状态声首现教学 |
|
||||
| `sys_say_again` | 再说一遍: | hint 前缀,主动重听(引擎 hints.js 播出) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content,阶梯阶段 1(引擎 novice.js 播出) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content,阶梯阶段 2(引擎 novice.js 播出) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content,阶梯阶段 3(引擎 novice.js 播出) |
|
||||
| `wp_tap_short` | 点一下。 | hint,intro/reopen/close/drill 等待点 _short 档 |
|
||||
| `wp_tea_full` | 左右滑选茶。点一下定。 | hint,TEA 等待点 full 档 |
|
||||
| `wp_tea_short` | 左右滑。 | hint,TEA 等待点 _short 档 |
|
||||
| `wp_up_short` | 向上滑。 | hint,D5 教学等待点 _short 档 |
|
||||
| `inv_up_locked` | 上滑还没解锁。先点一下继续。 | feedback,up 未解锁首次解释 |
|
||||
| `inv_down_locked` | 菜单,玩完一晚解锁。点一下继续。 | feedback,down 未解锁首次解释 |
|
||||
| `inv_serve_swipe` | 现在不用滑。听客人把话说完。 | feedback,堂前空档滑动首次解释 |
|
||||
|
||||
(water/steep 时机等待点 full/short 置空不新增——分层铁律:窗内只 earcon,
|
||||
26-apply-teahouse.md 偏差 1。)
|
||||
|
||||
### 修改(重录 ×10,id 不变)
|
||||
|
||||
| id | 旧文(关键词) | 新文 |
|
||||
|---|---|---|
|
||||
| `sys_menu` | 单击切换,双击确认 | 菜单。左右滑换项,点一下确认。 |
|
||||
| `sys_help` | 双击提壶/双击出汤 | 左右滑选茶,点一下定下。听水声,点一下提壶;滴答密,点一下出汤。上滑问状态,下滑开菜单。 |
|
||||
| `sys_continue_ask` | 单击继续 | 检测到没打烊的茶馆。点一下继续,右滑两次重开新店。 |
|
||||
| `tut_tea` | 单击,选定 | 点一下,选定这罐茶。 |
|
||||
| `tut_water` | 双击提壶 | 灶上坐水。泡泡细密是将沸,咕嘟连片是滚透——听到细密,点一下提壶。 |
|
||||
| `tut_steep` | 双击,出汤 | 注水,闷泡。滴答由稀到密,密起来就是将好——点一下,出汤。 |
|
||||
| `tut_serve` | 单击,端出去 | 茶好了。点一下,端出去。 |
|
||||
| `settle_night` | 单击,睡下 | 熄了灯,这一晚就过去了。点一下,睡下。 |
|
||||
| `upg_open` | 单击买定 | 要添置点什么?左右滑看,点一下买定。 |
|
||||
| `gd_close` | 单击,熄灯睡下 | 账报完了。点一下,熄灯睡下。 |
|
||||
|
||||
### 删除(停用 ×5,游戏零引用)
|
||||
|
||||
| id | 旧文(关键词) | 停用原因 |
|
||||
|---|---|---|
|
||||
| `intro_3` | 泡茶三步…… | §4.10 开场零规则念白(教学七步跟练承担) |
|
||||
| `tut_status` | 上滑,听今晚的局面 | D5 改 wp_up_short + 状态链实操 |
|
||||
| `tut_skip` | 已跳过教学……双击动手 | 教学跳过废除(90s 替打 + drillDone 直进) |
|
||||
| `gd_serve` | 客人还在堂前。上滑…… | 上滑状态链(再说一遍:+点单句)承担 |
|
||||
| `gd_brew` | 还在灶上……双击 | 时间线自动判定 + L3 替打承担;双击旧口径 |
|
||||
|
||||
### V 组键盘变体同步(10 对 → 19 对)
|
||||
|
||||
新增 11:sys_first_tap「按空格。」/ sys_tap_start「按空格,开始。」/ sys_unlock_up
|
||||
「想知道自己在哪,就按上方向键。」/ sys_unlock_down「按下方向键,可以打开菜单。」/
|
||||
sys_unlock_dt「没听清,就按回车,再听一遍。」/ wp_tap_short「按一下空格。」/
|
||||
wp_tea_full「左右方向键选茶。空格定。」/ wp_tea_short「左右方向键。」/
|
||||
wp_up_short「按上方向键。」/ inv_up_locked「上方向键还没解锁。先按空格继续。」/
|
||||
inv_down_locked「菜单,玩完一晚解锁。按空格继续。」
|
||||
|
||||
重录 5(旧含单击/双击):sys_menu「菜单。左右方向键换项,空格确认。」/ sys_help
|
||||
「方向键选茶,空格定下。听水声,空格提壶;滴答密,空格出汤。上键问状态,下键开菜单。」/
|
||||
sys_continue_ask「检测到没打烊的茶馆。空格继续,右方向键两次重开新店。」/ tut_water
|
||||
「……听到细密,空格提壶。」/ tut_steep「……空格,出汤。」
|
||||
沿用 5:tut_d0 / tut_tea / tut_serve / settle_night / upg_open。摘除 2:gd_serve / gd_brew。
|
||||
|
||||
**账目更新:旁白 98 − 5 + 14 = 107 句(×2 性别 214 条)+ NPC 65 = 279 条音频;
|
||||
V 组 10 → 19 对。** NPC 平铺 65 句不动。
|
||||
|
||||
@@ -227,6 +227,63 @@
|
||||
- 每结局专属台词齐备:e1/e2/e3/e4 各 2 句 + 尾声回响 11 句(p7×trust / p7×rev2 / p9×truth / rev2 条件选播)。
|
||||
- 每局到达全部 9 个抉择点(p1..p9 及 p8 双形态变体 p8_boat/p8_reef、p9 双变体 p9a/p9b),实选 8-9 个(p6 在 rev2=false 时被 m6_seal 自动走右)。
|
||||
|
||||
## R2 增量节 · 26 号深度重构(2026-10)
|
||||
|
||||
> 交互重构施工单见 [26-apply-keeper.md](26-apply-keeper.md);台词增量清单见
|
||||
> `tools/voice_lines_26/keeper.md`(管线路径两表一致铁律)。**系统/交互层新句全部
|
||||
> SHORE 组**(radio PROD 同型);本表头注的 26 号对齐口径(含「双击重听」的句子
|
||||
> 停用或重录)在此落地。
|
||||
|
||||
### 新增(24 句 × 双性别,SHORE 组)
|
||||
|
||||
| id | 台词全文 | 类别 | 触发 |
|
||||
|---|---|---|---|
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical | 开场第一句(0~3s 动手,§4.10;抢拍 busy) |
|
||||
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 _short 档 |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | content | 「轮到你」状态声首现教学(挂 amo_a 链尾,全局一次) |
|
||||
| `sys_praise` | 对。 | feedback | 首抉择结果链头肯定句(原则 11) |
|
||||
| `sys_hint_continue_full` | 单击,继续。 | hint | continue 等待点 full 档 + 上滑状态链动作尾巴 |
|
||||
| `sys_hint_continue_short` | 单击。 | hint | continue/settle 等待点 _short 档 |
|
||||
| `sys_hint_choice_short` | 左右滑,选。 | hint | choice 等待点 _short 档 |
|
||||
| `sys_hint_again_full` | 单击,重新开始。 | hint | settle 等待点 full 档 / 结算滑动解释句 |
|
||||
| `sys_hint_menu_short` | 左右滑,点一下。 | hint | menu 等待点 _short 档 |
|
||||
| `sys_only_choice` | 现在,只要左右滑。 | hint | 迷茫 L2 抉择点缩小选择 |
|
||||
| `sys_demo_continue` | 听我做一次。 | hint | 迷茫 L3 演示前缀(intro/continue 替玩家走一步) |
|
||||
| `sys_demo_choice` | 左右滑,都可以。现在你来。 | hint | 迷茫 L3 抉择点演示(不替玩家选) |
|
||||
| `sys_say_again` | 再说一遍: | hint 前缀 | 主动重听(engine/hints.js 播出,全项目一句) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | content | 手势阶梯阶段 1 教学句(挂首抉择后链尾;engine/novice.js) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 手势阶梯阶段 2 教学句(挂首局结局链尾) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 手势阶梯阶段 3 教学句 |
|
||||
| `menu_help` | 左右滑换项,点一下确认。 | content | 菜单说明(menu 等待点 full 档 + 菜单内上滑重听) |
|
||||
| `status_choice` | 正在抉择。左右滑。 | hint | 抉择等待点上滑「我在哪」 |
|
||||
| `sys_mem_back` | 听完,自动回到现在。 | hint | MEMORY 上滑状态链动作尾巴(§4「听完就回到现在」拆句兑现) |
|
||||
| `inv_nosel` | 现在不用选。单击继续。 | feedback | 非抉择点滑动首次解释(原则 7) |
|
||||
| `inv_mem` | 现在不用选。听完就好。 | feedback | 插叙中滑动首次解释(插叙无选择) |
|
||||
| `inv_generic` | 这个操作用不上。单击继续。 | feedback | 其余无效格子/长按首次解释 |
|
||||
| `inv_up_locked` | 上滑还没解锁。先单击继续。 | feedback | up 未解锁首次解释(管道触发) |
|
||||
| `inv_down_locked` | 菜单,玩完一局解锁。单击继续。 | feedback | down 未解锁首次解释(管道触发) |
|
||||
|
||||
(含操作词的键盘变体 18 + 1 句照 KEY_LINES["storyline"] 措辞,见清单第四节。)
|
||||
|
||||
### 修改(1 句重录,id 不变)
|
||||
|
||||
| id | 旧 → 新 | 原因 |
|
||||
|---|---|---|
|
||||
| `sys_menu` | 「菜单。单击切换选项,双击确认。」→「菜单。左右滑换项,点一下确认。」 | 菜单改 00 号 §5.4 左右滑换项+单击确认(旧「双击确认」= 26 §7 反模式 5;key 变体重录) |
|
||||
|
||||
### 删除(8 句停用,游戏零引用;key 变体随主句下线)
|
||||
|
||||
`gd_brief`(开场操作念白,§4.10 零规则念白)、`gd_continue` / `gd_again`(旧看门狗
|
||||
两档,三档提示取代)、`gd_invalid`(旧无效解释,inv_* 取代)、`gd_prog1` / `gd_prog2`
|
||||
(旧无进展轨,迷茫检测取代)、`sys_help`(帮助溢出废止,含「双击重新听」旧口径;
|
||||
手势阶梯取代)、`b_rule`(开场规矩念白,§4.10 砍掉)。
|
||||
|
||||
### R2 后总账
|
||||
|
||||
148 − 8(删除)+ 24(新增,SHORE 组)= **164 句**(双性别 137 = KEEPER 42 +
|
||||
SHORE 95;NPC 平铺 27 不变)。键盘变体:新增 19 对 + 修改 1 对(sys_menu)+
|
||||
既有保留 4 对(sys_menu / sys_skip / sys_continue_ask / p1)= 24 对。
|
||||
|
||||
## 多音字 / 发音风险自查注记
|
||||
|
||||
| 风险词 | 处理 |
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# 22b · 《星环舰长》语音台词表(voice ids,录音依据)
|
||||
|
||||
> **26 号对齐(资产清单,不是交互宪法)**
|
||||
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准。
|
||||
> - 本表仍是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准)。含「双击重听 / 双击使用 / 双击格挡 / 单击循环菜单」的句子 **停用或按游戏正文重录**。
|
||||
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复;重听前加「再说一遍:」。
|
||||
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听」类旧口径,或仅在阶段 3 解锁双击后启用。
|
||||
> - 共用新句见 [14-guide-layer.md](14-guide-layer.md) §7(`sys_first_tap` 等)。各游戏 `_full` / `_short` 在游戏正文设计单里点名,补进本表后再进生成脚本。
|
||||
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准;施工单见 [26-apply-bridge.md](26-apply-bridge.md)。
|
||||
> - 本表仍是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准)。含「双击重听 / 菜单双击确认 / 单击循环菜单」的句子 **已按 26 号口径修改或删除**(26 号重构增量:新增 23 / 修改 2 / 删除 11,见 [tools/voice_lines_26/bridge.md](../../tools/voice_lines_26/bridge.md);下表已同步,标 ~~删除~~ 的行随本轮 convert 后下线)。
|
||||
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复;重听前加「再说一遍:」;「重听」一律作「重新听」(多音字)。
|
||||
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听」类旧口径;双击=重新听当前选项句仅在阶段 3 解锁后启用。
|
||||
> - 共用新句见 [14-guide-layer.md](14-guide-layer.md) §7(`sys_first_tap` 等,文案与 STORYLINE_LINES 逐字一致)。各游戏 `_full` / `_short` 在游戏正文设计单里点名,补进本表后再进生成脚本。
|
||||
|
||||
|
||||
> **给音频总监的录制说明**
|
||||
> - **旁白双性别组**(142 句):旁白=舰载系统音(系统/教学/状态/账目/结算宣读),不念船员台词。落 `web/bridge/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
|
||||
> - **旁白双性别组**(26 号重构后实存 144 句,增量见 [tools/voice_lines_26/bridge.md](../../tools/voice_lines_26/bridge.md)):旁白=舰载系统音(系统/教学/状态/账目/结算宣读),不念船员台词。落 `web/bridge/audio/voice/female|male/<id>.{ogg,m4a}`,两性别 id 集合完全一致。
|
||||
> - female = `Serena`,instruct 常量:`清晰沉稳的女声,舰载系统音,冷静克制,句读干净`
|
||||
> - male = `Uncle_Fu`,instruct 常量:`低沉沉稳的男声,舰载系统音,冷静克制`
|
||||
> - 两常量全表统一(含教学/危机/结算),禁止句级变体、禁语速词(引擎 SoundTouch 变速)。
|
||||
@@ -27,39 +27,49 @@
|
||||
> - **键盘变体(V 组)**:操作提示句在 `gesture.inputMode()==='key'` 时改播 `_k` 变体(touch 回基础句);变体与基础句 id 一一对应、集中登记见文末 V 组。
|
||||
> - 管线:`tools/gen_voice_dual.py` 照录(SPEAKERS 需新增 bridge 行 + BRIDGE_NPC 平铺表);生成后 `--convert` 落盘 + `tools/check_all_assets.py` 终检(双格式配对、双性别集合一致)。
|
||||
|
||||
## G0 组 · 系统/菜单/帮助(旁白 ×10)
|
||||
## G0 组 · 系统/菜单/帮助(表 18 行:沿用 7 + 修改 2 + 新增 8 + 删除 1,实存 17)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `sys_menu` | 菜单。单击切换,双击确认。 | 下滑呼出模态菜单 |
|
||||
| `sys_menu` | 菜单。左右滑换项,单击确认。 | 下滑呼出模态菜单(**26 修改**:旧「单击切换,双击确认」废止,00 §5.4) |
|
||||
| `sys_menu_resume` | 回到舰桥。 | 菜单项 |
|
||||
| `sys_menu_save` | 保存并回大厅。 | 菜单项 |
|
||||
| `sys_menu_help` | 重新听帮助。 | 菜单项 |
|
||||
| `sys_menu_restart` | 放弃本次巡逻。 | 菜单项(run 清空保 meta) |
|
||||
| `sys_saved` | 进度已保存。 | 存档写入后 |
|
||||
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内设置提示 |
|
||||
| `sys_help` | 巡航中,上滑巡检全舰;危机中,左右滑听选项,单击下令。下滑菜单,双击重新听。 | 菜单内上滑 / 帮助项 |
|
||||
| `sys_continue_ask` | 检测到未完成的巡逻。单击继续,右滑进星港。 | 有存档进游戏(TITLE) |
|
||||
| ~~`sys_menu_help`~~ | ~~重新听帮助。~~ | **26 删除**:菜单内上滑=sys_help 已覆盖(菜单三态:回到舰桥/保存/放弃) |
|
||||
| `sys_menu_restart` | 放弃本次巡逻。 | 菜单项(run 清空保 meta;**26 新增二次确认** menu_restart_confirm) |
|
||||
| `menu_restart_confirm` | 放弃就丢了这局。再点一下。 | 「放弃巡逻」单击后的二次确认(原则 6,破坏性操作) |
|
||||
| `sys_saved` | 进度已保存。 | 存档写入后(critical:跳转大厅前不可打断) |
|
||||
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内上滑重听说明时的设置提示 |
|
||||
| `sys_help` | 上滑巡检全舰,点一下重播告警。危机时,左右滑听命令,单击下令。 | 菜单内上滑 / 帮助(**26 修改**:旧「下滑菜单,双击重新听」废止) |
|
||||
| `sys_continue_ask` | 检测到未完成的巡逻。单击继续,右滑进星港。 | 有存档进游戏(TITLE,§4.12 断点询问) |
|
||||
| `sys_new_patrol` | 新巡逻,星环号启航。 | 新巡逻开始 |
|
||||
| `sys_first_tap` | 点一下屏幕。 | 开场第一句 = critical 指令(§4.10,文案与 storyline 逐字一致) |
|
||||
| `sys_first_tap_short` | 点一下。 | title/decide 等待点短句档 |
|
||||
| `sys_turn_teach` | 听到这个声音,就是轮到你了。 | 等待声首现教学(挂 D0 教学链首) |
|
||||
| `sys_say_again` | 再说一遍: | 主动重听前缀(阶段 3 双击重听当前选项句) |
|
||||
| `sys_unlock_up` | 想知道自己在哪,就向上滑。 | D0 巡检链尾(阶段 1 提前解锁上滑) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | 第一次返航结算链尾(阶段 2) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | 累计 3 局(阶段 3) |
|
||||
|
||||
## G1 组 · 开场/教学(旁白 ×14)
|
||||
## G1 组 · 开场/教学(表 16 行:沿用 7 + 新增 2 + 删除 7,实存 9)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `intro_1` | 你是巡逻舰星环号的舰长。在这条航线上,耳朵就是雷达。 | 开场链 1(TITLE 上滑重听时可复用) |
|
||||
| `intro_2` | 全舰四个系统:引擎、护盾、扫描、武器,各守一方。 | 开场链 2 |
|
||||
| `intro_3` | 引擎在舰尾低鸣,护盾在舰首嗡响。 | 开场链 3(方位教学 a) |
|
||||
| `intro_4` | 扫描在左舷扫掠,武器在右舷充能。 | 开场链 4(方位教学 b) |
|
||||
| `intro_5` | 危机从哪边来,哪边先遭殃。 | 开场链 5(受殃规则承诺,playtest 锁定) |
|
||||
| `tut_d0` | 先试巡检。向上滑,听全舰状态。 | D0 前 |
|
||||
| ~~`intro_1`~~ | ~~你是巡逻舰星环号的舰长。在这条航线上,耳朵就是雷达。~~ | **26 删除**:开场规则念白废除(§4.10 反模式 6),第一句即 critical 指令句 |
|
||||
| ~~`intro_2`~~ | ~~全舰四个系统:引擎、护盾、扫描、武器,各守一方。~~ | **26 删除**:方位教学由 D0 巡检四系统音当场承担 |
|
||||
| ~~`intro_3`~~ | ~~引擎在舰尾低鸣,护盾在舰首嗡响。~~ | **26 删除**:同上 |
|
||||
| ~~`intro_4`~~ | ~~扫描在左舷扫掠,武器在右舷充能。~~ | **26 删除**:同上 |
|
||||
| ~~`intro_5`~~ | ~~危机从哪边来,哪边先遭殃。~~ | **26 删除**:受殃规则由检测链方位句+危机矩阵当场兑现 |
|
||||
| ~~`tut_d0`~~ | ~~先试巡检。向上滑,听全舰状态。~~ | **26 删除**:→ `hint_inspect_full`(22 附录 C §5 逐字) |
|
||||
| `hint_inspect_full` | 向上滑,听四个系统。 | D0 教学链尾句 / inspect 等待点 full 档 |
|
||||
| `hint_inspect_short` | 向上滑。 | inspect 等待点 short 档 / 巡航接管 L2 缩小句 |
|
||||
| `tut_all_ok` | 四个音都稳,全舰正常。 | D0 完成;**正片巡检全 ok 时复用为链尾句**(一句两用,登记) |
|
||||
| `tut_crisis` | 有情况。听签名音,辨认类型。 | D1 求救检测链前 |
|
||||
| `tut_decide` | 左右滑听选项,单击下令。 | D2 决策窗前(豁免/导航教学) |
|
||||
| `tut_decide` | 左右滑听选项,单击下令。 | D2 决策窗前(豁免/导航教学;并入首选项链) |
|
||||
| `tut_aid` | 驰援靠扫描。我们的扫描,稳得很。 | D2 选项引导(首局 S1 无磨损=承诺必兑现) |
|
||||
| `tut_after` | 就是这样:听声,辨型,下令。 | D2 结算链尾(教学要诀收束) |
|
||||
| `tut_loyal` | 船员的心分三档:离心、平常、信赖。上滑巡检听得到。 | D3 前 |
|
||||
| `tut_done` | 教学完了。舰长,航线交给你。 | D4(进自由巡航) |
|
||||
| `tut_skip` | 已跳过教学。上滑巡检,危机时左右滑听选项。 | 下滑跳过教学 |
|
||||
| ~~`tut_skip`~~ | ~~已跳过教学。上滑巡检,危机时左右滑听选项。~~ | **26 删除**:教学不可跳(D0/D3 由迷茫 L3 替播巡检自动过步;旧「下滑跳过」与下滑=菜单冲突) |
|
||||
|
||||
## G2 组 · 巡检/状态(旁白 ×30)
|
||||
|
||||
@@ -175,15 +185,28 @@
|
||||
| `merit_3` | 功勋,丰厚。 | ≥11 |
|
||||
| `settle_hook` | 星港期待你的下一次巡逻。单击,返航。 | 结算链尾(链锁解除后单击生效;键盘态播 settle_hook_k) |
|
||||
|
||||
## G7 组 · 看门狗/纠错(旁白 ×5)
|
||||
## G7 组 · 看门狗/纠错/等待点提示(表 18 行:沿用 2 + 新增 13 + 删除 3,实存 15)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `gd_cruise` | 还在巡航。上滑,巡检全舰。 | CRUISE 无操作轨第 1 级(10s,full,idle-only) |
|
||||
| `gd_decide` | 还在等命令。左右滑,听选项。 | ROUTE 12s / CRISIS 决策窗半程单级 |
|
||||
| `gd_dock` | 还在整备。左右滑,单击执行。 | DOCK 无操作轨第 1 级(15s) |
|
||||
| `gd_invalid` | 这个操作,这里用不上。 | 无效手势纠错(onceKey 同局 1 次) |
|
||||
| `hint_dock3` | 整备完毕,就启航。 | DOCK 无进展轨 L3(150s;同时自动预览启航项,不替玩家花资源) |
|
||||
| `gd_cruise` | 还在巡航。上滑,巡检全舰。 | 巡航(ACTION 无等待点)迷茫接管 L1 短令(静默梯子第 2 次喂信号,≈20s) |
|
||||
| ~~`gd_decide`~~ | ~~还在等命令。左右滑,听选项。~~ | **26 删除**:decide 等待点两档提示 + 窗内 tick 已催(危机倒计时是玩法时钟,不是看门狗重播说明书) |
|
||||
| ~~`gd_dock`~~ | ~~还在整备。左右滑,单击执行。~~ | **26 删除**:dock 等待点两档提示 + 迷茫 L3 替启航承接 |
|
||||
| `gd_invalid` | 这个操作,这里用不上。 | 锁定手势(长按)首次解释(26 角色变更:看门狗纠错句→管道锁定门解释句,文案沿用) |
|
||||
| ~~`hint_dock3`~~ | ~~整备完毕,就启航。~~ | **26 删除**:DOCK 无进展轨三级提示由等待点提示+接管 L3 替启航承接 |
|
||||
| `hint_route_full` | 左右滑选航线。点一下定。 | route 等待点 full 档(12s) |
|
||||
| `hint_route_short` | 左右滑。 | route 等待点 short 档(30s)/ 菜单·星港换项短句 |
|
||||
| `hint_decide_full` | 左右滑听命令。点一下下令。 | decide 等待点 full 档(22 附录 C「点一下下」系笔误,按指令句式落定) |
|
||||
| `hint_dock_full` | 点一下,启航。 | dock 等待点 full 档(12s) |
|
||||
| `hint_dock_short` | 单击。 | dock 等待点 short 档(30s) |
|
||||
| `inv_detect` | 先听类型和方位。 | 检测链被滑动打断的首次解释(并入续播链头,之后只回执) |
|
||||
| `inv_cruise` | 现在不用选。点一下听警报,或向上滑。 | 巡航空闲乱滑(22 §7 失败表逐字) |
|
||||
| `inv_tour` | 巡检中,先听完。 | 巡检链播中乱滑(保护链,首次解释后续完剩余句) |
|
||||
| `inv_drill` | 先向上滑,听全舰。 | 教学等上滑步乱按(D0/D3) |
|
||||
| `inv_title` | 点一下开始,右滑进星港。 | 标题页左滑 |
|
||||
| `inv_report` | 巡逻结束了。点一下,返航。 | 结算完左右滑 |
|
||||
| `inv_up_locked` | 上滑还没解锁。先点一下继续。 | 锁定上滑首次解释(管道口径;D0 起即解锁) |
|
||||
| `inv_down_locked` | 菜单,玩完一局解锁。 | 锁定下滑首次解释(阶段 2 前) |
|
||||
|
||||
## G8 组 · 星港(旁白 ×11)
|
||||
|
||||
@@ -209,21 +232,44 @@
|
||||
| `opt_route_safe` | 稳妥航线,采集平平,太平。 | 路线预览(采集 2/段,磨损 1 次;句内无数字=改装后恒真) |
|
||||
| `opt_route_rich` | 矿富航线,采得多,磨损也多。 | 路线预览(采集 4/段,磨损 2 次) |
|
||||
|
||||
## V 组 · 键盘变体(旁白 ×10;`gesture.inputMode()==='key'` 时替代同名基础句)
|
||||
## V 组 · 键盘变体(旁白 ×31;`gesture.inputMode()==='key'` 时替代同名基础句;26 号替换稿)
|
||||
|
||||
| id | 替代基础句 | 台词全文 |
|
||||
|---|---|---|
|
||||
| `sys_help_k` | sys_help | 巡航中,上键巡检全舰;危机中,方向键听选项,空格下令。下键菜单,回车重新听。 |
|
||||
| `tut_d0_k` | tut_d0 | 先试巡检。按上键,听全舰状态。 |
|
||||
| `sys_first_tap_k` | sys_first_tap | 按空格。 |
|
||||
| `sys_first_tap_short_k` | sys_first_tap_short | 按一下空格。 |
|
||||
| `sys_turn_teach_k` | sys_turn_teach | 听到这个声音,就是轮到你了。 |
|
||||
| `sys_say_again_k` | sys_say_again | 再说一遍: |
|
||||
| `sys_unlock_up_k` | sys_unlock_up | 想知道自己在哪,就按上方向键。 |
|
||||
| `sys_unlock_down_k` | sys_unlock_down | 按下方向键,可以打开菜单。 |
|
||||
| `sys_unlock_dt_k` | sys_unlock_dt | 没听清,就按回车,再听一遍。 |
|
||||
| `hint_inspect_full_k` | hint_inspect_full | 按上方向键,听四个系统。 |
|
||||
| `hint_inspect_short_k` | hint_inspect_short | 按上方向键。 |
|
||||
| `hint_route_full_k` | hint_route_full | 左右方向键选航线。按空格定。 |
|
||||
| `hint_route_short_k` | hint_route_short | 左右方向键。 |
|
||||
| `hint_decide_full_k` | hint_decide_full | 左右方向键听命令。按空格下令。 |
|
||||
| `hint_dock_full_k` | hint_dock_full | 按空格,启航。 |
|
||||
| `hint_dock_short_k` | hint_dock_short | 按空格。 |
|
||||
| `inv_detect_k` | inv_detect | 先听类型和方位。 |
|
||||
| `inv_cruise_k` | inv_cruise | 现在不用选。按空格听警报,或按上方向键。 |
|
||||
| `inv_tour_k` | inv_tour | 巡检中,先听完。 |
|
||||
| `inv_drill_k` | inv_drill | 先按上方向键,听全舰。 |
|
||||
| `inv_title_k` | inv_title | 按空格开始,右方向键进星港。 |
|
||||
| `inv_report_k` | inv_report | 巡逻结束了。按空格,返航。 |
|
||||
| `inv_up_locked_k` | inv_up_locked | 上方向键还没解锁。先按空格继续。 |
|
||||
| `inv_down_locked_k` | inv_down_locked | 菜单,玩完一局解锁。 |
|
||||
| `menu_restart_confirm_k` | menu_restart_confirm | 放弃就丢了这局。再按一次。 |
|
||||
| `sys_menu_k` | sys_menu | 菜单。左右方向键换项,按空格确认。 |
|
||||
| `sys_help_k` | sys_help | 上方向键巡检全舰,按空格重播告警。危机时,左右方向键听命令,按空格下令。 |
|
||||
| `tut_decide_k` | tut_decide | 方向键听选项,空格下令。 |
|
||||
| `cr_decide_k` | cr_decide | 听选项,空格下令。 |
|
||||
| `dock_open_k` | dock_open | 靠港整备。方向键看项目,空格执行。 |
|
||||
| `gd_cruise_k` | gd_cruise | 还在巡航。上键,巡检全舰。 |
|
||||
| `gd_decide_k` | gd_decide | 还在等命令。方向键,听选项。 |
|
||||
| `gd_dock_k` | gd_dock | 还在整备。方向键看,空格执行。 |
|
||||
| `sys_continue_ask_k` | sys_continue_ask | 检测到未完成的巡逻。空格继续,右方向键进星港。 |
|
||||
| `settle_hook_k` | settle_hook | 星港期待你的下一次巡逻。按空格,返航。 |
|
||||
|
||||
> 26 号删除的键盘变体(随主表行删除):`tut_d0_k` / `gd_decide_k` / `gd_dock_k`。
|
||||
|
||||
## N1 组 · 大副(NPC Dylan 平铺 ×4)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
@@ -253,9 +299,10 @@
|
||||
|
||||
---
|
||||
|
||||
**合计:154 句 ≤160 上限**(旁白 142 ×2 性别 = 284 条 + NPC 平铺 12 条 = **296 条音频** ×2 格式 = 592 文件)。
|
||||
分组账:G0 10 + G1 14 + G2 30 + G3 24 + G4 10 + G5 9 + G6 16 + G7 5 + G8 11 + GR 3 + V 10 = 142(旁白);N1-N3 12(NPC)。
|
||||
**合计(26 号重构后):156 句 ≤160 上限**(旁白 144 ×2 性别 = 288 条 + NPC 平铺 12 条 = **300 条音频** ×2 格式 = 600 文件)。
|
||||
分组账(表行数含删除标记,实存=生成集合):G0 18(删 1,实存 17)+ G1 16(删 7,实存 9)+ G2 30 + G3 24 + G4 10 + G5 9 + G6 16 + G7 18(删 3,实存 15)+ G8 11 + GR 3 = **144 旁白实存**;N1-N3 12(NPC,不动)。
|
||||
26 号增量:新增 23 / 修改 2 / 删除 11(含 V 组键盘变体替换稿 31 句,删 3 对)。
|
||||
检测链 = `sig_*(sfx,pan/尾音按方位)→ evt_* → dir_* →(陷阱加 trap_hint)→ cr_decide`;下令链 = `pa_chime(sfx)→ 执行音 →(不满足先 sys_*_off)→ 结果句 → 账目/忠诚句 →(NPC 接播)`;
|
||||
结算链 = `rep_open → rate_X → merit_档 → settle_hook`;死亡链 = `die_intro → die_cause → die_adv → rep_open → rate_d → merit_档 → settle_hook`;
|
||||
巡检全链 = `4×状态音(引擎→护盾→扫描→武器) →(tut_all_ok | sys_*_dmg/off…)→ st_hull → st_seg → st_rp → st_xo/st_eng/st_doc`;巡检简链 = `4×状态音 → st_hull → 最紧要异常句`;中断复述链 = `st_hull → 最紧要异常句 → st_seg → recap_go`。
|
||||
结算链 = `rep_open → rate_X → merit_档 →(阶段解锁教学句)→ settle_hook`;死亡链 = `die_intro → die_cause → die_adv → rep_open → rate_d → merit_档 → settle_hook`;
|
||||
巡检全链 = `4×状态音(引擎→护盾→扫描→武器) →(tut_all_ok | sys_*_dmg/off…)→ st_hull → st_seg → st_rp → st_xo/st_eng/st_doc(D0 链尾附 sys_unlock_up)`;巡检简链 = `4×状态音 → st_hull → 最紧要异常句`;中断复述链 = `st_hull → 最紧要异常句 → st_seg → recap_go`。
|
||||
判定矩阵/忠诚账/仲裁规则对照 [22-bridge.md](22-bridge.md) §3-§8;资产规模核对见其 §9。
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
> **26 号对齐(资产清单,不是交互宪法)**
|
||||
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准。
|
||||
> - **26 号重构修订(施工单 [26-apply-hunt.md](26-apply-hunt.md),台词增量
|
||||
> `tools/voice_lines_26/hunt.md`)**:教学重排 T0 点一下→T1 滑砍→T2 呼喊→T3 长按
|
||||
> (tut_hit/call/help 三对 _full/_short 新增;tut_rule/tut_attack/tut_callout/
|
||||
> tut_skill/tut_skill_cd/tut_status/tut_breach/tut_skip/settings_hint 删除);
|
||||
> 新增 L 组系统/等待点/帮助/归因 15 句;room_wait/sys_menu/help_main/gd_idle/
|
||||
> net_back/tut_kill_ok/tut_done 改写;键盘变体 V 组换 13 对。主表 60→76 句。
|
||||
> - 本表仍是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准)。含「双击重听 / 双击使用 / 双击格挡 / 单击循环菜单」的句子 **停用或按游戏正文重录**。
|
||||
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复;重听前加「再说一遍:」。
|
||||
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听」类旧口径,或仅在阶段 3 解锁双击后启用。
|
||||
@@ -34,24 +40,28 @@
|
||||
|---|---|---|
|
||||
| `intro_1` | 夜幕降临,野兽在山林里游荡。 | 开场 1(TITLE 单击后/教学房 T0) |
|
||||
| `intro_2` | 你们是守夜的猎人,营地就在身后。 | 开场 2 |
|
||||
| `room_wait` | 房间已开好,等同伴到齐。单击,立即开局。 | LOBBY 进入(12s 倒计时自动开局) |
|
||||
| `room_wait` | 等同伴到齐。点一下,开局。 | LOBBY 进入(lobby 等待点 full;12s 倒计时自动开局) |
|
||||
| `room_wait_short` | 单击。 | lobby 等待点 short(26 号) |
|
||||
| `room_start` | 狩猎开始,先听声音的方向。 | 开局(ev wave 1 前) |
|
||||
|
||||
## B 组 · 教学 TEACH(旁白 ×11;教学波突入不扣耐久,学期零惩罚)
|
||||
## B 组 · 教学 TEACH(旁白 ×9;26 号重排 T0 点一下→T1 滑砍→T2 呼喊→T3 长按问路;教学波突入不扣耐久,学期零惩罚;旋风斩口头不出现)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `tut_rule` | 野兽会从八个方向围上来。声音在哪边,就往哪边滑。 | T0(规则总述,含后半平面发闷约定由音效演示承担) |
|
||||
| `tut_attack` | 听,有狼在靠近。朝声音的方向,滑一下。 | T1(教学狼 1 放出后) |
|
||||
| `tut_kill_ok` | 好,杀掉了。就是这样。 | T1 首杀(成功只给新短句) |
|
||||
| `tut_callout` | 单击一下,呼喊支援,队友会来帮你。 | T2 |
|
||||
| `tut_hit_full` | 朝叫声,滑。 | T1(teach_hit 等待点 full;教学狼 1 放出后,critical) |
|
||||
| `tut_hit_short` | 滑一下。 | teach_hit 等待点 short / 迷茫接管档 |
|
||||
| `tut_kill_ok` | 对,就是这样。 | T1 首杀(肯定 ≤4 字口径) |
|
||||
| `tut_call_full` | 点一下,喊人。 | T2(teach_call 等待点 full,critical) |
|
||||
| `tut_call_short` | 点一下。 | teach_call 等待点 short |
|
||||
| `tut_callout_ok` | 听到没,同伴回应你了。 | T2(bot help_ack 播完后,呼喊-响应闭环点明) |
|
||||
| `tut_skill` | 双击,旋风斩,清掉身边一圈。 | T3(教学狼 2、3 贴近后) |
|
||||
| `tut_skill_cd` | 旋风斩有八秒冷却。冷却中双击,重新听威胁。 | T3 放出后(讲冷却与宪法双击语义) |
|
||||
| `tut_status` | 上滑,听营地状态。下滑,打开菜单。 | T4 |
|
||||
| `tut_breach` | 野兽冲进营地,营地就会受损。撑过五波就赢。 | T4 状态链播完后 |
|
||||
| `tut_done` | 教学完了。真正的围猎,现在开始。 | TEACH 完成 → 进 WAVE 1 |
|
||||
| `tut_skip` | 已跳过教学,开打。 | TEACH 中下滑跳过 |
|
||||
| `tut_help_full` | 按住屏幕,听营地。 | T3(teach_help 等待点 full,critical;阶段 1 长按教学) |
|
||||
| `tut_help_short` | 按住。 | teach_help 等待点 short |
|
||||
| `tut_done` | 教学完了。围猎开始。 | T3 长按作答后 → 等 ev WAVE 1 |
|
||||
|
||||
> 26 号删除:tut_rule(规则总述,做中学)、tut_attack / tut_callout(长指令 →
|
||||
> 上方 _full/_short 对替换)、tut_skill / tut_skill_cd(新手期旋风斩口头不出现,
|
||||
> 阶段 4 改 G 组 skill_teach 大厅专属教学)、tut_status(状态查询移长按)、
|
||||
> tut_breach(breach 警报句自带归因)、tut_skip(每步 L3 演示兜底,无手动跳过)。
|
||||
|
||||
## C 组 · 波次(旁白 ×6)
|
||||
|
||||
@@ -97,11 +107,12 @@
|
||||
| `breach_heavy` | 巨兽撞进营地,损伤很重! | ev breach(熊,-2);节流同上 |
|
||||
| `danger_low` | 营地危险了,一只都不能再漏! | 耐久首次 ≤2(每局 1 次,配 danger 震) |
|
||||
|
||||
## G 组 · 技能(旁白 ×1)
|
||||
## G 组 · 技能(旁白 ×2)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `skill_ready` | 旋风斩准备好了。 | 旋风斩冷却完成(queue:true,每轮冷却 1 次) |
|
||||
| `skill_ready` | 旋风斩准备好了。 | 旋风斩冷却完成(§4.6 hint 通道:只在空闲时播,每轮冷却 1 次) |
|
||||
| `skill_teach` | 双击,放出旋风斩。 | 阶段 4 专属教学:首次以已识别双击进入大厅(附录 C §3) |
|
||||
|
||||
## H 组 · 结算(旁白 ×9;进 END 盖 800ms 手势死窗)
|
||||
|
||||
@@ -114,7 +125,8 @@
|
||||
| `grade_b` | 评级,B。守得还行。 | 评级 B(4-6) |
|
||||
| `grade_c` | 评级,C。险胜。 | 评级 C(1-3) |
|
||||
| `end_rank` | 成绩已记入猎手榜。 | 胜利局排行榜写入后(失守局不播) |
|
||||
| `end_again` | 单击,再猎一局。 | 结算链尾句(重开入口) |
|
||||
| `end_again` | 单击,再猎一局。 | 结算链尾句(critical;重开入口) |
|
||||
| `end_again_short` | 单击。 | end 等待点 short(26 号) |
|
||||
|
||||
结算链:胜利 = `end_win → grade_* → kill_band_*(自己击杀档)→ end_rank → end_again`;失守 = `end_lose → kill_band_* → end_again`。
|
||||
|
||||
@@ -123,31 +135,53 @@
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `net_lost` | 与营地断了联系,正在重连。 | WS 断开(本地静默重连开始,≤30s) |
|
||||
| `net_back` | 联系恢复了,接着打。 | resume 回槽成功(joined + snap 到达) |
|
||||
| `net_back` | 你回来了。朝叫声滑。 | resume 回槽成功(§4.12 复述句,23 号 §9 原文) |
|
||||
| `net_to_bot` | 有猎人离队,老猎手顶上。 | roster 变更:他人槽位转 bot(非自己) |
|
||||
| `net_gone` | 回不去那场围猎了,回大厅。 | 重连失败/房已灭(err room_gone 或 30s 超时)→ LOST |
|
||||
|
||||
## J 组 · 菜单/帮助(旁白 ×6;菜单不暂停,E3 豁免)
|
||||
## J 组 · 菜单/帮助(旁白 ×6;菜单不暂停 E3 豁免;26 号:左右滑换项、单击确认)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `sys_menu` | 菜单。单击切换,双击确认。 | 下滑呼出模态菜单 |
|
||||
| `sys_menu` | 菜单。左右滑换项,单击确认。 | 下滑呼出模态菜单(menu 等待点 full) |
|
||||
| `sys_menu_short` | 左右滑,单击。 | menu 等待点 short(26 号) |
|
||||
| `sys_menu_resume` | 回到猎场。 | 菜单项 1 |
|
||||
| `sys_menu_help` | 重新听帮助。 | 菜单项 2 |
|
||||
| `sys_menu_home` | 退出房间,回大厅。 | 菜单项 3(= 发 leave) |
|
||||
| `help_main` | 朝声音的方向滑,就是出击。单击呼喊支援,双击旋风斩。上滑状态,下滑菜单。 | 菜单内上滑 / 帮助项 |
|
||||
| `settings_hint` | 音色、语速、背景音乐,请回大厅修改。 | 菜单内设置提示 |
|
||||
| `sys_menu_home` | 退出房间,回大厅。 | 菜单项 3(= 发 leave;二次确认 sys_home_check) |
|
||||
| `sys_home_check` | 再点一下,确认退出。 | 回大厅破坏性操作二次确认(原则 6,26 号) |
|
||||
| `help_main` | 朝声音的方向滑,就是出击。点一下呼喊,按住听状态。 | 菜单「重新听帮助」项 |
|
||||
|
||||
## K 组 · 向导/纠错(旁白 ×2;idle-only,queue:true)
|
||||
> 26 号删除:settings_hint(菜单上滑帮助组合废止;设置只在大厅改,00 §1.2)。
|
||||
|
||||
## K 组 · 向导/纠错(旁白 ×2;§4.6 feedback,每「状态×手势」一次 + 30s 台账)
|
||||
|
||||
| id | 台词全文 | 触发/语境 |
|
||||
|---|---|---|
|
||||
| `gd_invalid` | 这个操作现在用不上。 | 无效手势纠错(onceKey 同局 1 次,之后仅 error 震) |
|
||||
| `gd_idle` | 听声音的方向,滑过去。 | WAVE/LOBBY 看门狗第 1 级(10s);TEACH 错向重教复用 |
|
||||
| `gd_invalid` | 这个操作现在用不上。 | 无效手势通用解释(原则 7) |
|
||||
| `gd_idle` | 朝最响的滑。 | WAVE 迷茫接管 L1(附录 C §7) |
|
||||
|
||||
## L 组 · 26 号新增(旁白 ×14;系统句 / 等待点三档 / 长按帮助 / 失败归因)
|
||||
|
||||
| id | 台词全文 | 类别 | 触发/语境 |
|
||||
|---|---|---|---|
|
||||
| `sys_first_tap` | 点一下屏幕。 | critical | 教学 T0 第一句(首句动手,§4.10) |
|
||||
| `sys_first_tap_short` | 点一下。 | hint | intro 等待点 short |
|
||||
| `sys_say_again` | 再说一遍: | hint | 主动重听前缀(全项目同文案) |
|
||||
| `sys_unlock_down` | 向下滑,可以打开菜单。 | content | 第 1 局 END 解锁教学(ladder.onGameDone) |
|
||||
| `sys_unlock_dt` | 没听清,就双击,再听一遍。 | content | 第 3 局 END 解锁教学 |
|
||||
| `sys_recap` | 上次那局没打完。点一下,重新匹配。 | content | 断点复述(§4.12,一局内退出后回 TITLE) |
|
||||
| `lp_act` | 朝叫声滑。 | hint | 长按帮助链尾「一个动作」(原则 3) |
|
||||
| `lp_title` | 围猎。点一下,进入匹配。 | hint | TITLE 长按帮助(+ 有 best 追评级/击杀档) |
|
||||
| `atk_cd` | 出刀还在冷却。 | feedback | 出击冷却首拦解释(附录 C §7) |
|
||||
| `call_cd` | 呼喊要有间隔。 | feedback | 呼喊节流首拦解释 |
|
||||
| `inv_swipe` | 先朝声音滑。 | feedback | T1 期点按(附录 C §6 做错列) |
|
||||
| `inv_rest` | 下一波马上来。 | feedback | 波间休整窗滑/点(无可打目标) |
|
||||
| `miss_side` | 在另一边。 | feedback | 挥空归因(30s 台账去重,之后只 swish+回执) |
|
||||
| `wave_only` | 只朝声音那边滑。 | hint | WAVE 迷茫接管 L2(只放行该弧) |
|
||||
|
||||
---
|
||||
|
||||
**旁白合计:60 句 ×2 性别 = 120 条音频**(×2 格式 = 240 文件;预算 ≤60 打满,无冗余位)。
|
||||
**旁白合计(26 号后):76 句 ×2 性别 = 152 条音频**(×2 格式 = 304 文件;原 60 − 删 9 + 增 25)。
|
||||
|
||||
## N 组 · bot 喊话(24 句 = 3 角色 × 8;固定单音色,落盘 `audio/sfx/`,见头注)
|
||||
|
||||
@@ -187,25 +221,27 @@
|
||||
|
||||
---
|
||||
|
||||
## V 组 · 键盘变体(key,11 对;`gesture.inputMode()==='key'` 时选播,措辞规范同 dungeon/bridge)
|
||||
## V 组 · 键盘变体(key,13 对;`gesture.inputMode()==='key'` 时选播,措辞规范同 dungeon/bridge)
|
||||
|
||||
| id | 键盘台词全文(触屏原句见上方对应 id) |
|
||||
|---|---|
|
||||
| `room_wait` | 房间已开好,等同伴到齐。按空格,立即开局。 |
|
||||
| `tut_rule` | 野兽会从八个方向围上来。声音在哪边,就按哪边方向键。 |
|
||||
| `tut_attack` | 听,有狼在靠近。朝声音的方向,按方向键。 |
|
||||
| `tut_callout` | 按空格,呼喊支援,队友会来帮你。 |
|
||||
| `tut_skill` | 按回车,旋风斩,清掉身边一圈。 |
|
||||
| `tut_skill_cd` | 旋风斩有八秒冷却。冷却中按回车,重新听威胁。 |
|
||||
| `tut_status` | 按上方向键,听营地状态。按下方向键,打开菜单。 |
|
||||
| `sys_menu` | 菜单。按空格切换,按回车确认。 |
|
||||
| `help_main` | 朝声音的方向按方向键,就是出击。按空格呼喊支援,按回车旋风斩。上方向键状态,下方向键菜单。 |
|
||||
| `sys_first_tap` | 按空格。 |
|
||||
| `tut_hit_full` | 朝叫声,按方向键。 |
|
||||
| `tut_hit_short` | 按方向键。 |
|
||||
| `tut_call_full` | 按空格,喊人。 |
|
||||
| `tut_call_short` | 按空格。 |
|
||||
| `tut_help_full` | 按住空格,听营地。 |
|
||||
| `tut_help_short` | 按住空格。 |
|
||||
| `room_wait` | 等同伴到齐。按空格,开局。 |
|
||||
| `sys_menu` | 菜单。左右方向键换项,按空格确认。 |
|
||||
| `help_main` | 朝声音的方向按方向键,就是出击。按空格呼喊,按住空格听状态。 |
|
||||
| `skill_teach` | 按回车,放出旋风斩。 |
|
||||
| `end_again` | 按空格,再猎一局。 |
|
||||
| `gd_idle` | 听声音的方向,按方向键。 |
|
||||
| `gd_idle` | 朝最响的,按方向键。 |
|
||||
|
||||
**变体合计:11 对 ×2 性别 = 22 条**(×2 格式 = 44 文件;落 `voice/<gender>/key/`)。
|
||||
**变体合计:13 对 ×2 性别 = 26 条**(×2 格式 = 52 文件;落 `voice/<gender>/key/`)。
|
||||
|
||||
---
|
||||
|
||||
**全集账目**:旁白 60×2 + bot 24 + key 变体 11×2 = **166 条音频**(×2 格式 = 332 文件)。
|
||||
**全集账目(26 号后)**:旁白 76×2 + bot 24 + key 变体 13×2 = **190 条音频**(×2 格式 = 380 文件)。
|
||||
主设计触发逻辑对照 [23-hunt.md](23-hunt.md) §2/§5/§7/§8/§11/§12;协议事件(ev 种类 → 播报映射)对照其 §6.3。
|
||||
|
||||
@@ -1,48 +1,95 @@
|
||||
# 24a · 《节拍行者》鼓手模式语音台词表(voice ids,24 号施工录音依据)
|
||||
# 24a · 《节拍行者》鼓手模式语音台词表(voice ids,施工录音依据)
|
||||
|
||||
> **26 号对齐(资产清单,不是交互宪法)**
|
||||
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准。
|
||||
> - 本表仍是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准)。含「双击重听 / 双击使用 / 双击格挡 / 单击循环菜单」的句子 **停用或按游戏正文重录**。
|
||||
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复;重听前加「再说一遍:」。
|
||||
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听」类旧口径,或仅在阶段 3 解锁双击后启用。
|
||||
> - 共用新句见 [14-guide-layer.md](14-guide-layer.md) §7(`sys_first_tap` 等)。各游戏 `_full` / `_short` 在游戏正文设计单里点名,补进本表后再进生成脚本。
|
||||
|
||||
> - 交互与新手手势以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 和对应游戏正文为准;本作深度改造设计单见 [26-apply-rhythm.md](26-apply-rhythm.md)。
|
||||
> - 本表是 TTS id 事实源的**登记副本**(生成以 `tools/gen_voice_dual.py` 为准;26 号改造替换稿见 `tools/voice_lines_26/rhythm.md`:新增 32 / 修改 7 / 删除 5 / 键盘变体 22)。
|
||||
> - 写作:指令 ≤12 字,短句档 ≤6 字,叙事 ≤25 字,状态查询 ≤20 字;每句标 `critical` / `content` / `hint` / `feedback`。游戏主动提示不得原样重复(30s 台账);主动重听前加「再说一遍:」。
|
||||
> - 键盘变体:新手期回车当空格(单击)。删除「按回车=重听/确认」类旧口径,阶段 3 解锁双击后才按回车重听。
|
||||
> - 通用系统句与 storyline 文案逐字一致(sys_first_tap / sys_turn_teach / sys_say_again / sys_unlock_*)。多音字:「重听」一律作「重新听」。
|
||||
|
||||
> 双性别:male=Uncle_Fu / female=Vivian(gen_voice_dual.py SPEAKERS 沿用)。
|
||||
> instruct 对:「低沉醇厚的男声,像节奏游戏主持人,平稳有力」/「活力清晰的
|
||||
> 年轻女声,像节奏游戏主持人,情绪饱满但不夸张」——全表同一常量。
|
||||
> 主表 41 句 + 向导层沿用 9 句(gd_*,已在库不重录)= 50 句双性别(§8 配额)。
|
||||
> 废弃:tut_1 / tut_2 / tut_3 / retry_gesture(手势教学时代遗产,音频随
|
||||
> 本轮 convert 后删除)。
|
||||
> 年轻女声,像节奏游戏主持人,情绪饱满但不夸张」——全表同一常量 `_RHY`。
|
||||
> 汇总:主表 68 句(沿用 29 + 修改 7 + 新增 32)+ 向导层沿用 9 句(gd_*,已在库
|
||||
> 不重录)= 77 句双性别。本轮删除:welcome / tut_map / tut_skip / skip_hint /
|
||||
> settings_hint(旧手势时代遗产,convert 后删音频)。
|
||||
|
||||
## W 组 · 开场与流程(5 句)
|
||||
## 新增 · 系统层(7 句)
|
||||
|
||||
| id | 文案 |
|
||||
|---|---|
|
||||
| welcome | 欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。 |
|
||||
| welcome_back | 欢迎回来,鼓手。准备好了就开始。 |
|
||||
| tut_done | 很好,演出开始。 |
|
||||
| tut_skip | 跳过教学,直接开始。 |
|
||||
| mid_song | 过半了,保持。 |
|
||||
| id | 文案 | 类别 |
|
||||
|---|---|---|
|
||||
| sys_first_tap | 点一下屏幕。 | critical |
|
||||
| sys_first_tap_short | 点一下。 | hint |
|
||||
| sys_turn_teach | 听到这个声音,就是轮到你了。 | content |
|
||||
| sys_say_again | 再说一遍: | hint |
|
||||
| sys_unlock_up | 想知道自己在哪,就向上滑。 | content |
|
||||
| sys_unlock_down | 向下滑,可以打开菜单。 | content |
|
||||
| sys_unlock_dt | 没听清,就双击,再听一遍。 | content |
|
||||
|
||||
## Z 组 · 分区教学与区名(12 句)
|
||||
## 新增 · 等待点三档提示(5 句)
|
||||
|
||||
| id | 文案 |
|
||||
|---|---|
|
||||
| tut_map | 先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。随便摸一摸,听到哪面鼓,我就告诉你它在哪。 |
|
||||
| tut_probe | 摸到三个不同的地方,我们就开始。 |
|
||||
| tut_z_kick | 下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。 |
|
||||
| tut_z_sides | 左下是军鼓,右下是低嗵。一左一右,跟着打。 |
|
||||
| tut_z_patt | 上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。 |
|
||||
| tut_fill | 最后有一段加花,跟着我连打。 |
|
||||
| zone_tl | 左上,踩镲。 |
|
||||
| zone_tc | 上中,高嗵。 |
|
||||
| zone_tr | 右上,吊镲。 |
|
||||
| zone_bl | 左下,军鼓。 |
|
||||
| zone_bc | 下中,底鼓。 |
|
||||
| zone_br | 右下,低嗵。 |
|
||||
| id | 文案 | 类别 |
|
||||
|---|---|---|
|
||||
| select_full | 单击,开始。 | hint |
|
||||
| select_short | 单击。 | hint |
|
||||
| settle_full | 单击,再来一遍。 | hint |
|
||||
| settle_short | 单击。 | hint |
|
||||
| menu_help | 左右滑换项,单击确认。 | hint |
|
||||
|
||||
## C 组 · 教学纠正(5 句)
|
||||
## 新增 · 教学跟打等待点与肯定(7 句)
|
||||
|
||||
| id | 文案 | 类别 |
|
||||
|---|---|---|
|
||||
| tut_kick_full | 家区在下中。点一下。 | hint |
|
||||
| tut_kick_short | 点下中。 | hint |
|
||||
| tut_sides_full | 左下,再右下。 | hint |
|
||||
| tut_sides_short | 左右下。 | hint |
|
||||
| tut_top_full | 上排三个,挨个敲。 | hint |
|
||||
| tut_top_short | 跟上排。 | hint |
|
||||
| tut_ok | 对了。 | feedback |
|
||||
|
||||
## 新增 · 状态查询与无效解释、断点复述(13 句)
|
||||
|
||||
| id | 文案 | 类别 |
|
||||
|---|---|---|
|
||||
| st_p1a | 《启程》,前半段。 | hint |
|
||||
| st_p1b | 《启程》,后半段。 | hint |
|
||||
| st_p2a | 《追风》,前半段。 | hint |
|
||||
| st_p2b | 《追风》,后半段。 | hint |
|
||||
| st_p3a | 《星爆》,前半段。 | hint |
|
||||
| st_p3b | 《星爆》,后半段。 | hint |
|
||||
| st_c1 | 连上了,跟着敲。 | hint |
|
||||
| st_c2 | 连击正顺,保持。 | hint |
|
||||
| st_c3 | 连击如虹,稳住。 | hint |
|
||||
| inv_generic | 这个操作用不上。 | feedback |
|
||||
| inv_down_locked | 菜单,玩完一局解锁。 | feedback |
|
||||
| inv_up_locked | 上滑还没解锁。 | feedback |
|
||||
| sys_continue_ask | 上次的曲子没打完。单击继续,右滑重选。 | content |
|
||||
|
||||
## W 组 · 开场与流程(沿用 2 + 修改 0;welcome/tut_skip 删除)
|
||||
|
||||
| id | 文案 | 状态 |
|
||||
|---|---|---|
|
||||
| welcome_back | 欢迎回来,鼓手。准备好了就开始。 | 沿用 |
|
||||
| tut_done | 很好,演出开始。 | 沿用 |
|
||||
| ~~welcome~~ | ~~欢迎来到节拍行者。今天你是乐队的鼓手,整面屏幕都是你的鼓。~~ | **删除**(开场长句废止 → sys_first_tap 首句即动手,§4.10 反模式 6) |
|
||||
| ~~tut_skip~~ | ~~跳过教学,直接开始。~~ | **删除**(新手期无下滑跳教学;3 败自动跳步) |
|
||||
| mid_song | 过半了,保持。 | 沿用 |
|
||||
|
||||
## Z 组 · 分区教学与区名(修改 3 + 沿用 8;tut_map 删除)
|
||||
|
||||
| id | 文案 | 状态 |
|
||||
|---|---|---|
|
||||
| ~~tut_map~~ | ~~先认识你的鼓。屏幕横着分三列……~~ | **删除**(纯规则说明废止;区名自带教学) |
|
||||
| tut_probe | 摸到三个不同的地方,我们就开始。 | 沿用 |
|
||||
| tut_z_kick | 听我敲下中,你跟着敲。 | **修改**(旧「下面正中间,是底鼓,你的家。先听四下数拍,然后跟着我敲。」超 12 字;critical) |
|
||||
| tut_z_sides | 左下和右下,跟着敲。 | **修改**(旧「左下是军鼓,右下是低嗵。一左一右,跟着打。」;critical) |
|
||||
| tut_z_patt | 上排三个音,跟着敲。 | **修改**(旧「上面一排更清亮。左上踩镲,上中高嗵,右上吊镲。听这一句,三个音。」;乐器名由区名自带;critical) |
|
||||
| tut_fill | 最后有一段加花,跟着我连打。 | 沿用 |
|
||||
| zone_tl / zone_tc / zone_tr | 左上,踩镲。/ 上中,高嗵。/ 右上,吊镲。 | 沿用 |
|
||||
| zone_bl / zone_bc / zone_br | 左下,军鼓。/ 下中,底鼓。/ 右下,低嗵。 | 沿用 |
|
||||
|
||||
## C 组 · 教学纠正(沿用 5)
|
||||
|
||||
| id | 文案 |
|
||||
|---|---|
|
||||
@@ -52,39 +99,33 @@
|
||||
| retry_listen | 再听一遍,跟着来。 |
|
||||
| retry_skip | 没关系,我们先走下一句。 |
|
||||
|
||||
## S 组 · 选曲与解锁(7 句)
|
||||
## S 组 · 选曲与解锁(修改 1 + 沿用 6)
|
||||
|
||||
| id | 文案 |
|
||||
|---|---|
|
||||
| select_hint | 左右滑选曲目,单击开始,下滑回大厅。 |
|
||||
| song1_name | 第一首,启程,九十拍。 |
|
||||
| song2_name | 第二首,追风,一百零五拍。 |
|
||||
| song3_name | 第三首,星爆,一百二十拍。 |
|
||||
| song_locked | 这首还没解锁。上一首拿到 B 级以上就能解锁。 |
|
||||
| unlock_song2 | 新曲目解锁,追风! |
|
||||
| unlock_song3 | 新曲目解锁,星爆! |
|
||||
| id | 文案 | 状态 |
|
||||
|---|---|---|
|
||||
| select_hint | 左右滑选歌,单击开始。 | **修改**(旧含「下滑回大厅」——新手期下滑未解锁,不预告;content) |
|
||||
| song1_name / song2_name / song3_name | 第一首,启程,九十拍。/ 第二首,追风,一百零五拍。/ 第三首,星爆,一百二十拍。 | 沿用 |
|
||||
| song_locked | 这首还没解锁。上一首拿到 B 级以上就能解锁。 | 沿用 |
|
||||
| unlock_song2 / unlock_song3 | 新曲目解锁,追风!/ 新曲目解锁,星爆! | 沿用 |
|
||||
|
||||
## G 组 · 结算(6 句)
|
||||
## G 组 · 结算(修改 1 + 沿用 5)
|
||||
|
||||
| id | 文案 |
|
||||
|---|---|
|
||||
| grade_s | S 级!准确率超过九成五,完美演出。 |
|
||||
| grade_a | A 级!准确率超过八成五,非常出色。 |
|
||||
| grade_b | B 级,准确率超过七成。不错,还能更好。 |
|
||||
| grade_c | C 级,准确率不到七成。别灰心,再来一遍。 |
|
||||
| new_best_combo | 新连击纪录! |
|
||||
| restart | 单击再来一遍,右滑下一首,下滑回大厅。 |
|
||||
| id | 文案 | 状态 |
|
||||
|---|---|---|
|
||||
| grade_s / grade_a / grade_b / grade_c | S 级!准确率超过九成五,完美演出。/ A 级!……/ B 级,……/ C 级,…… | 沿用 |
|
||||
| new_best_combo | 新连击纪录! | 沿用 |
|
||||
| restart | 单击,再来一遍。右滑,下一首。 | **修改**(旧含「下滑回大厅」;交出选择句式;critical 承诺段) |
|
||||
|
||||
## M 组 · 菜单与规则(6 句)
|
||||
## M 组 · 菜单与规则(修改 2 + 沿用 2;skip_hint/settings_hint 删除)
|
||||
|
||||
| id | 文案 |
|
||||
|---|---|
|
||||
| rules | 规则:我敲一小节鼓,你在下一小节照着敲回来。鼓要选对,拍点也要对。 |
|
||||
| settings_hint | 音色、语速、背景音乐,请回大厅修改。 |
|
||||
| menu_main | 菜单。单击切换选项,双击确认。 |
|
||||
| menu_resume | 继续演奏。 |
|
||||
| menu_lobby | 回大厅。 |
|
||||
| skip_hint | 单击可跳过旁白。 |
|
||||
| id | 文案 | 状态 |
|
||||
|---|---|---|
|
||||
| rules | 我敲一小节,你照着敲。 | **修改**(旧 27 字规则句 → 帮助一句 ≤12 字;hint) |
|
||||
| menu_main | 菜单。左右滑换项,单击确认。 | **修改**(旧「单击切换选项,双击确认」——双击确认废止,00 号 §5.4;content) |
|
||||
| menu_resume | 继续演奏。 | 沿用 |
|
||||
| menu_lobby | 回大厅。 | 沿用 |
|
||||
| ~~skip_hint~~ | ~~单击可跳过旁白。~~ | **删除**(26 号管道自动回执,不再预告) |
|
||||
| ~~settings_hint~~ | ~~音色、语速、背景音乐,请回大厅修改。~~ | **删除**(菜单上滑帮助组合废止;设置只在大厅改) |
|
||||
|
||||
## 向导层沿用(9 句,已在库,不重录不重转)
|
||||
|
||||
@@ -95,29 +136,44 @@ gd_slow「我放慢一些,跟着试试。」/ gd_count「四拍之后,继续
|
||||
(gd_miss_early/late/wrong 的「滑」字文案在 24 号玩法下语义仍通——纠正语
|
||||
不点名手势;如需改口文案按「重教≤2」流程另行裁定,不在本轮。)
|
||||
|
||||
## 键盘变体(key,P1 输入平权路线 a,8 句)
|
||||
## 键盘变体(key,22 句全量替换稿)
|
||||
|
||||
| id | key 文案 |
|
||||
|---|---|
|
||||
| tut_map | 先认识你的鼓。屏幕横着分三列,左边、中间、右边;竖着分两行,上面清亮,下面低沉。按数字一键到六键,听六面鼓。 |
|
||||
| tut_probe | 按出三个不同的键,我们就开始。 |
|
||||
| tut_z_kick | 数字五,是底鼓,你的家。先听四下数拍,然后跟着我敲。 |
|
||||
| tut_z_sides | 数字四,军鼓。数字六,低嗵。一左一右,跟着打。 |
|
||||
| tut_z_patt | 上面一排更清亮。数字一踩镲,数字二高嗵,数字三吊镲。听这一句,三个音。 |
|
||||
| select_hint | 左右方向键选曲目,按空格开始,按下方向键回大厅。 |
|
||||
| restart | 按空格再来一遍,按右方向键下一首,按下方向键回大厅。 |
|
||||
| menu_main | 菜单。按空格切换选项,按回车确认。 |
|
||||
| sys_first_tap | 按空格敲鼓。 |
|
||||
| tut_z_kick | 听我敲数字五,你跟着敲。 |
|
||||
| tut_z_sides | 数字四和六,跟着敲。 |
|
||||
| tut_z_patt | 数字一、二、三,跟着敲。 |
|
||||
| tut_kick_full | 家区是数字五。按一下。 |
|
||||
| tut_kick_short | 按五。 |
|
||||
| tut_sides_full | 数字四,再数字六。 |
|
||||
| tut_sides_short | 按四六。 |
|
||||
| tut_top_full | 上排,按一、二、三。 |
|
||||
| tut_top_short | 按上排。 |
|
||||
| select_hint | 左右方向键选歌,按空格开始。 |
|
||||
| select_full / settle_full | 按空格,开始。/ 按空格,再来一遍。 |
|
||||
| select_short / settle_short | 按空格。 |
|
||||
| restart | 按空格,再来一遍。右方向键,下一首。 |
|
||||
| menu_main / menu_help | 菜单。左右方向键换项,按空格确认。/ 左右方向键换项,按空格确认。 |
|
||||
| sys_unlock_up | 想知道自己在哪,就按上方向键。 |
|
||||
| sys_unlock_down | 按下方向键,可以打开菜单。 |
|
||||
| sys_unlock_dt | 没听清,就按回车,再听一遍。 |
|
||||
| sys_continue_ask | 上次的曲子没打完。按空格继续,右方向键重选。 |
|
||||
|
||||
> skip_hint / rules / retry_* / zone_* 无操作词,主资产触屏/键盘通用,不设变体。
|
||||
> key 变体为**补充合成**( `--only-variants` 单独跑),主表同 id 文案照常重录。
|
||||
> 沿用键盘变体:tut_probe「按出三个不同的键,我们就开始。」(文案未变)。
|
||||
> 其余无操作词主资产(zone_* / retry_* / grade_* / song*_name / st_* / tut_ok /
|
||||
> sys_turn_teach / sys_say_again / inv_* / mid_song / tut_fill / menu_resume /
|
||||
> menu_lobby / welcome_back / new_best_combo / song_locked / unlock_song2/3 /
|
||||
> tut_done / gd_*)触屏/键盘通用,不设变体。
|
||||
> key 变体为**补充合成**(`--only-variants` 单独跑),主表同 id 文案照常重录。
|
||||
|
||||
## 录制说明
|
||||
|
||||
- gen_voice_dual.py RHYTHM_LINES 段全量替换为本表(41 句);KEY_LINES rhythm
|
||||
段替换为本表 key 变体(8 句)。
|
||||
- gen_voice_dual.py RHYTHM_LINES 段全量替换为本表(68 句);KEY_LINES rhythm
|
||||
段替换为本表 key 变体(22 句)。逐句全文见 `tools/voice_lines_26/rhythm.md`。
|
||||
- 生成:`.venv-tts/bin/python tools/gen_voice_dual.py --game rhythm --gender both`
|
||||
(flock .gpu.lock);检查 `--check`;转码 `--convert`。
|
||||
- convert 后删除废弃 id 音频:tut_1 / tut_2 / tut_3 / retry_gesture
|
||||
(male/female 及 key 变体共 16 文件)。
|
||||
- convert 后删除废弃 id 音频:welcome / tut_map / tut_skip / skip_hint /
|
||||
settings_hint(male/female 及 key 变体,共 10 id×2 格式)。
|
||||
- web/harness/voice_text.json 的 rhythm 主表与 `__key__` 变体表同步本台词
|
||||
(转写时长估算与 ASR 判定用)。
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
# 26-apply · 《深海回音》重构施工单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [17-abyss.md](17-abyss.md) 附录 C**(状态×手势矩阵、等待点配置、
|
||||
> 首 3 分钟逐秒脚本、失败表、氧气经济与四结局判定——不在本文重复)。本文件是瘦版
|
||||
> 施工单:只写实现接线、偏差记录、台词类别映射、测试记录。台词登记见
|
||||
> [17-abyss-voice-ids.md](17-abyss-voice-ids.md) R3 增量节;清单见
|
||||
> `tools/voice_lines_26/abyss.md`。交互权威:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。
|
||||
> 范式对齐 [26-apply-storyline.md](26-apply-storyline.md)(叙事型主参考)与
|
||||
> [26-apply-radio.md](26-apply-radio.md)(双音色组同型 + HOST/PROD 系统句归类先例)。
|
||||
|
||||
## 1. 一句话核心动作
|
||||
|
||||
**听一段深海救援:单击继续或发声呐脉冲;听到选项时左右滑做决定。**
|
||||
|
||||
## 2. 实现接线(web/abyss/game.js + index.html)
|
||||
|
||||
六模块(§4.1/§4.2/§4.3/§4.4/§4.5/§4.12)全部接通,玩法核心(节点链 + seqToken +
|
||||
pendingChoice 骨架、氧气步进经济、9 抉择、4 结局 + 尾声回响、DIVER/DECK 双音色 +
|
||||
NPC 平铺、存档 summary)不动:
|
||||
|
||||
- **接线**:`this.receipts = new Receipts(audio)`、`this.floor = new Floor(audio)`、
|
||||
`this.confusion = new Confusion({ onConfused: (lvl) => waitPoint?.takeover(lvl) })`、
|
||||
`this.invalidHints = new InvalidHints().bind(this.floor)`、`this.ladder = new GestureLadder()`
|
||||
(构造时按 `ladder.stage() >= 3` 开旁白加速)。`index.html` 照 storyline 同构:
|
||||
`makeInputPipeline({ floor, confusion, receipts, invalidHints, game, ladder,
|
||||
opts: game.PIPELINE_OPTS })` + `attachGestures(root, pipe, { doubleTapWindow: 0 })`,
|
||||
启动遮罩保留。
|
||||
- **PIPELINE_OPTS = `{ longpressCore: true }`**:长按由游戏层裁定——新手期 invalid
|
||||
(回执 + gd_invalid 首次解释),阶段 3 起 = 引擎旁白加速(`hold`,等待点保留)。
|
||||
doubleTapWindow: 0 → 未解锁双击由管道折算成 tap(搜索等待=再发一枚脉冲)。
|
||||
- **`onGesture` 返回值收口**(§4.2):`'ok'`(继续/抉择/菜单/状态)|`'hold'`
|
||||
(重听、菜单换项——等待点保留)|`'silent-ok'`(**搜索等待单击=发脉冲**:声呐脉冲
|
||||
即内容音,省 ok 回执)|`'invalid'`(pipeline 给回执 + explainOnce + 迷茫信号)。
|
||||
- **打断快照 `_chainSpeaking`**(本轮新增,见偏差 5):pipeline 的
|
||||
`floor.handleInput(滑动/长按)` 按 §4.1「打断并执行」先杀链把 floor 置 BUSY,游戏侧
|
||||
`floor.speaking` 已为 false——`_chainSpeaking` 在 speak 置位、onDone/interrupt/
|
||||
`_yieldTurn` 清零,让被掐断的旁白链按矩阵落「旁白中」分支(滑动命中抉择点 →
|
||||
缓存 pendingChoice + 跳选项句;未命中/长按 → `_recoverInterrupted()` 交回 continue
|
||||
等待点,零无声死锁)。
|
||||
- **pendingChoice(V1 播完才生效)**:旁白链中滑动只缓存方向并跳去 p* 选项句
|
||||
(`_swipePromptTarget`:本节点是抉择节点或 next 直入抉择节点);p* 整句 critical
|
||||
(tap=busy 不可跳),`_armChoice` 在选项句播完的当刻让缓存生效:ui_confirm 结算音 →
|
||||
结果句,零插播(W2 契约 + 盲玩公平)。
|
||||
- **critical 清单**(§8 台词类别 / 结算死窗等价实现):sys_first_tap(开场第一句)、
|
||||
dv1_teach(下潜链尾教学句)、p1~p9 选项句(整句)、lockFirst 节点首句(g9_in /
|
||||
c_none / dry_a / dry_b——结算链首句死窗)、结局链首句、恢复链首句(F4:
|
||||
`_resumeGuard` 播完即清)。**替代旧 800ms 手势死窗**:覆盖整句而非定时窗。
|
||||
- **sonarGate(§5 声呐与语音互斥)保留**:信息类声呐音(echo_*/pipe_knock)只在
|
||||
voice idle 时播出,否则挂队、链歇补发(`_sonar`/`_drainSonar`);玩家脉冲只在
|
||||
搜索等待(voice 恒静)受理,按构造不重叠。
|
||||
- **声呐步 = BUSY(`_runSteps` + `_seqBusy`)**:pre/post 信息音、危机前置(spark_flash/
|
||||
landslide 前置 2s + danger 震循环 ≥1000ms 间隔)期间手势统一 busy 回执——旧
|
||||
「tap 快进回波余音」废除。
|
||||
- **存档(§4.12/§7)**:DIVE 进入、SURFACE 进入、每个抉择结算后、ENDING 进入、
|
||||
stop() 退出、菜单「保存并回大厅」前(leaving 标记);MENU 态落盘记回原状态;ASK
|
||||
态不落盘(stash 原存档才是真进度)。runs 口径 = `newRun()` 时 +1(冷启动 0 起;
|
||||
ASK 右滑与结算单击同口径)。
|
||||
- **手势阶梯教学句挂链尾**:第一次脉冲成功(`_firePing` → `ladder.onGoal()`)→
|
||||
`sys_unlock_up` 挂本条回波链尾;一局结局(`enterEnding` → `onGameDone()`)→
|
||||
`sys_unlock_down` 挂结局链尾。`teachLine()` 已带 `voice/` 前缀(novice.js 修复后
|
||||
语义),游戏侧**直接引用不再拼前缀**(双前缀是曾出现过的坑,静态审计拦截
|
||||
`` `voice/${` `` 模板拼接)。
|
||||
- **上滑「我在哪」**(§3/§9 顺序:潜次 → 已救人数 → 氧档 → 一个动作):`interrupt` 摘
|
||||
等待点(状态链期间静默 timer 清零,见偏差 6)→ 状态句全量 `markHintSaid` → 播完
|
||||
**按原等待点类型重建**(搜索重挂/抉择重挂/结算/continue——radio 口径不重播节点)。
|
||||
crit 档附 warning 震按档进入去重;`oxy_crit_deck` 水面变体(R2-F5)保留。
|
||||
|
||||
## 3. 偏差记录(与 26 号手册 / 17 号附录 C 的实现偏差)
|
||||
|
||||
1. **搜索等待声(17 号 §2)**:引擎 Bed 为全局统一音色,游戏层在 ping 等待点置
|
||||
`floor.bedEnabled = false`——等待声由 amb_deep 常驻 + 回波余音的深海声场承担
|
||||
(`_yieldTurn` 按等待点 id 翻转)。测试侧统一压 false(mock 防周期定时器不排水)。
|
||||
2. **critical 粒度**:floor 的 critical 是整链一刀切,句级保护靠**拆链**实现
|
||||
(`_speakNodeVoices` 按 critical 分段顺序播)。非 auto 叙事节点的尾句**不做**首播
|
||||
critical——链级一刀切会把「滑动打断并执行 / 上滑我在哪」一并挡成 busy(§4.1
|
||||
宪法);叙事尾句跳过的代价只是提前进等待点,由三档提示兜底复述。
|
||||
3. **auto 过场链尾恒 critical**(`_tailLocked`):dv1_teach(教学句)、s_tier 档位句、
|
||||
p9 结果链尾、取消链尾——「next 是 @x 过场」时链尾即过场门,不可跳。
|
||||
4. **搜索等待单击恒出脉冲(silent-ok)**:包括等待声中的抢拍单击——比「轮到你提示音
|
||||
后才受理」更宽(17 号 §4:再单击=再听);四潜各恰一枚玩家脉冲由 playtest 断言。
|
||||
5. **打断快照为游戏层补丁**:引擎 pipeline/floor 未提供「这次手势打断了一条链」的
|
||||
回执,`_chainSpeaking` 由游戏包装 floor.speak/interrupt 维护(上游修复后可撤)。
|
||||
无效滑动打断旁白 → invalid 回执 + 解释句 + **交回 continue 等待点**(不重播原句,
|
||||
原则 9;链末单击继续到下一节点)。
|
||||
6. **引擎缺口(上报,未改引擎)**:`engine/hints.js` 的 `use()` 在 `ledgerSay(id)` 之后
|
||||
才 `floor.speak`(kind hint)——静默提示到点时恰逢 SPEAKING(如上滑状态链播放中)
|
||||
句子被丢弃**但台账已记**,之后 30s 内同句被动提示会错降档。游戏侧规避:上滑先
|
||||
`interrupt`(清 timer,状态链期间零 fire)。建议引擎改为「speak 返回 false 时不登
|
||||
台账」。同类:`InvalidHints.explainOnce` 的 ledgerSay 也在 speak 前。
|
||||
7. **结算重开链**:`sys_new_dive → b_open → b_goal → b_go`(重开不念开场教学,原则
|
||||
11——sys_first_tap/sys_skip 每实例一次);开场链首句 critical 指令、b_goal 极短
|
||||
目标句、b_rule/gd_brief 规矩念白废除(§4.10)。
|
||||
8. **状态链动作句**:search=「点一下,发脉冲。」(sys_act_ping 兼首次解释句);
|
||||
choice=「正在抉择。左右滑。」(status_choice);settle=「单击,开始新救援。」
|
||||
(sys_hint_settle_full);continue=「单击,继续。」——全部 DECK 组、进台账。
|
||||
|
||||
## 4. 台词类别映射(类别标注;增量清单见 `tools/voice_lines_26/abyss.md`)
|
||||
|
||||
- `critical`:sys_first_tap(开场 ≤3s 唯一指令);dv1_teach(下潜链尾教学);p1~p9
|
||||
选项句(整句,含 p7_chen/p7_zheng);g9_in / c_none / dry_a / dry_b(结算链首句
|
||||
死窗);结局链首句(e1~e4_a);恢复链首句(F4)。
|
||||
- `content`:b_*、各潜对白(dv*/sv*/z1/bai/chen/gao/d*_e 组)、结局与尾声
|
||||
(e*_b、ep_*)、prog_d1..4、prog_saved1..5、oxy_full/ok/low/crit/crit_deck/gain、
|
||||
sys_turn_teach、sys_unlock_*、sys_menu、menu_help、sys_menu_*、sys_new_dive、
|
||||
sys_continue_ask、sys_skip。
|
||||
- `hint`:sys_hint_ping_full/short、sys_hint_continue_full/short、
|
||||
sys_hint_choice_short、sys_hint_settle_full、sys_only_choice、sys_demo_continue、
|
||||
sys_demo_choice、status_choice、sys_say_again(「再说一遍:」前缀,engine/hints.js
|
||||
播出)。
|
||||
- `feedback`:sys_act_ping(搜索等待无效滑动首次解释)、inv_nosel、inv_up_locked、
|
||||
inv_down_locked、gd_invalid(通用格,保留旧句)、sys_menu_restart_confirm(重开
|
||||
二次确认)。
|
||||
- 音色组:系统/交互层全部 `_ABY_DECK`(母船调度=系统音,与 radio PROD 同型);
|
||||
剧情潜水员 `_ABY_DIVER`、幸存者 ABYSS_NPC 平铺(不动)。通用系统句与
|
||||
STORYLINE_LINES 的 sys_* 段逐字一致;键盘变体照 KEY_LINES["storyline"]。
|
||||
- 完整登记(新增 23 / 修改 1 / 删除 10)见 `tools/voice_lines_26/abyss.md` 与
|
||||
[17-abyss-voice-ids.md](17-abyss-voice-ids.md) R3 增量节。
|
||||
|
||||
## 5. 测试记录
|
||||
|
||||
- 无头 playtest:`web/abyss/test/playtest.mjs` **243 断言全绿**(`tools/node/bin/node
|
||||
web/abyss/test/playtest.mjs` 退出码 0;`node --check web/abyss/game.js` 通过)。
|
||||
覆盖:§4.10 首 3 分钟(3s 内动手、critical 指令句、规则念白零播出);剧本 A~F
|
||||
六路径四结局 + 氧气逐检查点验算 + 氧气门三形态 + 干涸链 + 尾声回响差分;
|
||||
pendingChoice V1 时序(缓存 → 选项句播完 → ui_confirm → 结果句);sonarGate
|
||||
零重叠 + 四潜各一脉冲;结算死窗(取消链/结局链首句 critical,幽灵手势不截链);
|
||||
等待点三档(ping 8/18、continue 13/30、choice 25 台账降档);迷茫接管三级
|
||||
(L1 短句 → L2 缩小 → L3 替发脉冲);手势阶梯(阶段 1/2 教学句挂链尾);
|
||||
§4.12 断点复述(ASK 左/右、F4 恢复首句锁、上滑状态链);菜单(左右滑换项 +
|
||||
单击确认 + 二次确认重开 + 回大厅);资产缺失续链;键盘变体路由;**§6.2 乱点
|
||||
机器人**:无声操作 0(0/309)、被动原句重复 0、打断失败 0、第一次操作 ≤10s
|
||||
(2120ms)、第一次成功 ≤20s(2120ms)、乱按不锁死(零死锁收在合法等待态)、
|
||||
关键路径手势预算 9 ≤70;静态审计(无运行时 id 拼接、11 句废止台词零引用、
|
||||
19 条游戏引用新台词待生成豁免 + 引擎侧 4 条入清单)。
|
||||
- 玩家感知转写:`web/harness/sessions/abyss.mjs` 已同步 26 号口径(菜单左右滑换项
|
||||
+ 单击确认、结局结算后下滑逛菜单——阶段 2 解锁时机、SURFACE 签收链中段链末
|
||||
单击继续、COMMS 走神触发 13s 首档提示),`tools/node/bin/node
|
||||
web/harness/transcribe.mjs abyss`(含 `--session sessionStress`)两剧本零死锁
|
||||
跑通(主线虚拟 279s 到 E1 海燕归钟;乱按剧本同达 E1)。
|
||||
- 新语音资产(23 句 DECK 组 + 键盘变体)由主会话统一生成;playtest mock 与真实
|
||||
资产解耦(缺失按可用处理,Floor 看门狗兜底)。
|
||||
- 真人冷启动:待测(26 §6.3,3~5 人)。
|
||||
@@ -0,0 +1,119 @@
|
||||
# 26-apply · 《星环舰长》重构设计单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [22-bridge.md 附录 C](22-bridge.md)**(一句话核心动作、状态×手势
|
||||
> 矩阵、等待点配置、首 3 分钟脚本、失败表),本文不重复,只记录实现接线、偏差、
|
||||
> 台词类别映射与测试记录。交互权威:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)、
|
||||
> [00-global-ux.md](00-global-ux.md)。台词登记 [22-bridge-voice-ids.md](22-bridge-voice-ids.md);
|
||||
> 增量清单 `tools/voice_lines_26/bridge.md`。范式对齐 [26-apply-storyline.md](26-apply-storyline.md)
|
||||
> (叙事型主参考)与 [26-apply-dungeon.md](26-apply-dungeon.md)(探索/演出混合型参考)。
|
||||
|
||||
## 1. 实现接线(web/bridge/game.js + index.html)
|
||||
|
||||
- **六模块装配**(构造器):`receipts` / `floor` / `confusion(onConfused→_onConfused)` /
|
||||
`invalidHints.bind(floor)` / `ladder`,全部挂在实例字段上(index.html 的
|
||||
`makeInputPipeline` 依赖)。`audio.setRateBoostEnabled(false)`(长按新手期无效,
|
||||
不触发旁白快进)。`PIPELINE_OPTS = {}`(本作无四向/长按/双击核心玩法,全走新手
|
||||
阶梯);`attachGestures(root, pipe, { doubleTapWindow: 0 })`。
|
||||
- **onGesture 返回值**:`'ok' | 'hold' | 'invalid' | 'silent-ok'`(E1 重播告警/
|
||||
cruise_ping = silent-ok,内容音即回执)。`stateName()`:menu/tour/title/port/
|
||||
route/cruise/drill/detect/decide/crisis-settle/dock/report;`invalidHint(state,g)`
|
||||
按 `INVALID_LINES` 表给「状态×手势」解释句(detect 的解释由游戏层并入续播链,
|
||||
此处返回 null)。
|
||||
- **发言权映射**(22 附录 C §2 → floor 四态):巡航=`enterAction()`(BGM+告警脉冲
|
||||
即状态);检测链签名音=floor 打断后的 BUSY(一切手势 busy 回执,签名音不可跳);
|
||||
检测链语音/结算链=`SPEAKING`(后者 critical=吞);下令/选航线/修理/抉择/结算/
|
||||
菜单/教学等上滑=`yieldTurn(WaitPoint)`。语音链统一走 `_speak`(floor.speak 包装,
|
||||
链落声 `_almResume` 唤醒被让路告警,R4)。
|
||||
- **等待点**(22 附录 C §5 全表):`inspect/route/decide/dock/title/settle/menu/port`,
|
||||
每点 full/short/silenceMs/onDemo 齐;decide 的 silenceMs=[600s](窗内 tick 已催,
|
||||
危机倒计时是玩法时钟,不是看门狗重播说明书)。L3 替做按表:替点/替选稳妥/
|
||||
替下令(教学 D2=驰援)/替启航/替播巡检。
|
||||
- **巡检链**=上滑触发的「我在哪」内容链(四系统音 2.0s+0.4s 固定序 → 异常句|
|
||||
tut_all_ok → 舰体/段/资源/三船员档);决策窗用简链(4 音+舰体档+榜首异常,
|
||||
≤10s)。链落声回发起状态等待态(cruise→ACTION,route/dock/decide→resumeTurn)。
|
||||
- **检测链/巡检链的打断保护**:被滑动掐断后按 `_lastVoiceStart` 游标(audio.play
|
||||
探针)续完剩余句,当前句不原样重播(原则 9);检测链首断附 inv_detect(每局
|
||||
一次)、巡检链附 inv_tour;上滑打断检测链=答方位一句再续完(22 附录 C「busy 或
|
||||
打断答方位一句」取后者)。
|
||||
- **转移承载链 `_sayFlow`**:开场/教学步/选项预览入场/段末/启航/复述/菜单开
|
||||
等以 onDone 推进流程的链,全部加兜底定时器(est=句数×2.6s+2.2s,到点即触发、
|
||||
菜单期间顺延)——链被掐或资产缺失时流程照常走到下一等待态,零死锁(取代旧
|
||||
`_transitionChains` 顺延/F5 机制)。结算链/死亡链/超时句/保存确认句 critical
|
||||
(22 附录 C「结算链内=吞」),菜单天然开不进。
|
||||
- **菜单**(00 §5.4):左右滑换项报名(hold)+ 单击确认 + 上滑=sys_help+
|
||||
settings_hint + 下滑关闭;「放弃巡逻」二次确认(menu_restart_confirm,原则 6)。
|
||||
R8 冻结保留:告警封锁(`_almKick` 门)+ 段/磨损/45s 航线计时器自旋重挂 + 兜底
|
||||
定时器顺延 + 倒计时 `_pauseCountdown`;关闭后 `_rederiveWait` 按当前局面重挂
|
||||
等待态(§4.1 不存在安静态;检测链自签名音重播)。
|
||||
- **手势阶梯**:D0 教学链起播前 `ladder.onGoal()` 提前解锁上滑(22 附录 C §3
|
||||
裁定),阶梯教学句(teachLine 已带 voice/ 前缀)挂 D0 巡检链尾;第一次下令再
|
||||
调 `onGoal()`(幂等兜底);`onGameDone()` 在 `_enterReport` 组装结算链时调用,
|
||||
教学句挂链尾(settle_hook 前)——第一次返航后下滑=菜单真正可用。
|
||||
- **迷茫检测**(§4.5):乱点/连无效由管道喂 confusion;静默走双通道——等待点
|
||||
WaitPoint 档位 + 游戏层 `_armFeed`(巡航/航线/靠港 12s 起每 8s 喂静默信号)。
|
||||
纯静默的接管升级由 `_feedEscalate` 梯子承担(第 2/4/6 次静默 → L1/L2/L3,
|
||||
≈20s/36s/52s;confusion 的静默权重只有 1,纯静默单独到不了阈值 2——与
|
||||
confusion.level 取大共享,不重复接管),接管的 L3 即「替做」,结构性取代旧
|
||||
30/60/90s 无进展轨(turn_tick/gd_* 三级提示全部下线)。巡航(ACTION 无等待点)
|
||||
自接管:L1 gd_cruise 短令 / L2 只留上滑(`_cruiseRestrict`)/ L3 替播巡检。
|
||||
- **断点复述**(§4.12):TITLE 有档播 sys_continue_ask;单击 `_resumeRun` 复述链
|
||||
st_hull → 最紧要异常 → st_seg → recap_go(与正在响的告警同源)→ 段 ROUTE/巡航。
|
||||
summary 字段与 PUT 进度逻辑保留(playtest 场景 1 锁定)。
|
||||
- **REPORT 800ms 死窗保留**(`_graceUntil`,onGesture 首查吞 ghost 手势;critical
|
||||
链锁在管道层天然成立)。
|
||||
- **玩法核心零改动**(playtest 场景 3-9 逐账本断言):seed 复现/首局约束、危机
|
||||
矩阵全组合、忠诚差分与支援、评级公式、经济与改装、R1-R8 仲裁(含 R2 轮转、
|
||||
R6 双危机 FIFO、R3 600ms 去重、R4 让路改判 `floor.speaking||isVoicePlaying`)、
|
||||
段长/磨损/余波调度。
|
||||
|
||||
## 2. 偏差记录(与 22 附录 C 的差异及理由)
|
||||
|
||||
| # | 偏差 | 理由 |
|
||||
|---|---|---|
|
||||
| 1 | 长按=invalid(全状态),`setRateBoostEnabled(false)`,未接「检测链以后可加速」 | 26 §4.3 长按新手期不开放(交互权威优先);引擎 rate boost 是全局旁白快进、无按链开关,误触代价大于收益。待引擎提供 per-chain 加速 API 再接 |
|
||||
| 2 | 检测链签名音期间手势=b busy 回执(22 附录 C「签名音不可跳」)由 floor BUSY 态实现;签名音后的语音段 tap=跳句照常 | floor 四态的既定语义,无新增机制 |
|
||||
| 3 | `hint_decide_full` 文案「左右滑听命令。点一下下令。」 | 22 附录 C 原文「左右滑听命令。点一下下。」系笔误(多一个「下」),按指令句式(动作+结果)落定 |
|
||||
| 4 | 决策窗上滑打断检测链选了「打断答方位一句」分支(22 附录 C 给的是「busy 或打断答方位一句」二选一) | 玩家主动问方位是真话回答,优于 busy 的冷反馈;当前句不重播、剩余句续完 |
|
||||
| 5 | 教学不可跳(tut_skip 删除):D0/D3 靠等待点提示+接管 L3 替播巡检自动过步,超时危机走默认结局收束(R11 路径保留) | 旧「下滑跳过教学」与下滑=菜单(阶段 2)冲突;教学全程 ≤3 分钟且有三级兜底,不会卡死(playtest R11 场景锁定) |
|
||||
| 6 | DOCK 45s turn_tick / 90s gd_dock / 150s 自动预览三级无进展轨下线,由等待点两档提示+静默接管梯子(L3=替启航,22 附录 C §5)承接 | 26 号结构性替代;45s 航线自动稳妥线保留为双保险(ROUTE L3 同义) |
|
||||
| 7 | `onGameDone()` 在 `_enterReport`(结算链组装时)调用而非「单击返航」瞬间 | 教学句必须挂在结算链尾才能被听到;返航单击(settle_hook)与「一局结束」语义等价 |
|
||||
| 8 | 开场念白 intro_1..5 删除(不迁移到别处复播) | §4.10 砍规则念白;方位教学由 D0 巡检四音(引擎舰尾低鸣=系统音本体)+检测链方位句当场承担 |
|
||||
|
||||
## 3. 台词类别映射(§4.6;增量见 tools/voice_lines_26/bridge.md)
|
||||
|
||||
- `critical`:sys_first_tap(开场唯一指令)、cr_timeout(超时=结算链首)、结算链/
|
||||
死亡链整链(22 附录 C「结算链内=吞」)、sys_saved(保存确认→跳转前不可打断)。
|
||||
- `content`:evt_*/dir_*/opt_*/res_*/loy_*/sup_*/rate_*/merit_*/recap_go、巡检链
|
||||
st_* 句、sys_turn_teach、sys_unlock_*、sys_new_patrol、evt_dock/evt_resume、
|
||||
dock_open/port_open、tut_crisis/tut_all_ok/tut_aid/tut_after/tut_loyal/tut_done、
|
||||
trap_hint、upg_*(含 upg_done)/port_back/port_poor、rep_*。
|
||||
- `hint`:hint_inspect/route/decide/dock 两档、hint_inspect_short(巡航接管 L2
|
||||
缩小句)、gd_cruise(巡航接管 L1 短令)、sys_say_again、sys_first_tap_short、
|
||||
sys_menu/menu_restart_confirm(报名/确认属提示性质)。
|
||||
- `feedback`:inv_detect/inv_cruise/inv_tour/inv_drill/inv_title/inv_report、
|
||||
inv_up_locked/inv_down_locked、gd_invalid(锁定长按首次解释,文案沿用)。
|
||||
- 停用口径(列入 22-bridge-voice-ids.md 修改/删除行):「双击重听(新手期)」
|
||||
「菜单双击确认」「单击循环菜单」三族;等待点提示类 gd_decide/gd_dock/hint_dock3
|
||||
由两档提示承接。
|
||||
|
||||
## 4. 测试记录
|
||||
|
||||
- **无头 playtest**:`tools/node/bin/node web/bridge/test/playtest.mjs` ——
|
||||
**352 断言全绿(退出码 0)**。14 组玩法断言保留适配(TITLE/PORT/经济、首局
|
||||
DRILL 全链+R11 超时收束、seed 复现、巡检节奏与中断保护、危机矩阵 21 组合、
|
||||
R1-R8 仲裁、忠诚/支援、评级三剧本、经济/改装、结构兜底+等待点三档+L3 替做、
|
||||
断点复述、REPORT 死窗、菜单(左右滑+二次确认+转移链兜底)、E1/E2/存量资产);
|
||||
新增 §6.2 乱点机器人段:**无声操作=0、被动原句重复=0、打断失败=0**、首操作
|
||||
≤10s、首成功 1150ms(§6.4 合格线)。被动原句重复口径:30s 内同 id 重播且第二
|
||||
次不处于玩家请求链(链起播前 12s 内有手势,或前 2.5s 有「再说一遍:」),
|
||||
被动链(hint/feedback 类被动提示)重复即计数——巡检重播/选项轮听属玩家请求,
|
||||
不计入。
|
||||
- **会话剧本**:`web/harness/sessions/bridge.mjs` 重写为 26 号口径(radio 范式),
|
||||
`web/harness/transcribe.mjs bridge --session session|sessionStress` 双会话验证:
|
||||
主线 594s 完整弧线(开场指令→D0..D4→S2..S4→结算返航),乱按压力 668s 走到
|
||||
结算、全程零死锁(检测链乱滑被解释并续完、危机超时默认结局、菜单只换项下滑关)。
|
||||
- **冷启动自测(§6.1)/真人冷启动(§6.3)**:待测(新语音资产生成后进行)。
|
||||
- 修缺陷两处(实现期发现):① `_sayFlow` 兜底若「等静默再触发」会在乱滑风暴下
|
||||
饿死(航线报名被连续打断 38 分钟不推进)——改为到点即触发(dungeon 语义);
|
||||
② 转写脚本注入的 tap 落在入场报名链中会被当「跳句」吞掉——剧本侧改为
|
||||
等待点武装后再出手(玩家不抢话语义)。
|
||||
@@ -0,0 +1,179 @@
|
||||
# 26-apply · 《暗码》重构施工单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [19-cipher.md](19-cipher.md) 附录 C**(一句话核心动作 / 状态 /
|
||||
> 手势表与解锁 / 状态×手势矩阵 / 等待点 / 首 3 分钟脚本 / 失败表 / 台词账目 /
|
||||
> 断点复述),本施工单不重复,只写:实现接线(§1)、台词类别映射(§2)、
|
||||
> 偏差记录(§3)、测试记录(§4)。交互规则权威来源:
|
||||
> [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)、
|
||||
> [00-global-ux.md](00-global-ux.md)。台词登记 [19-cipher-voice-ids.md](19-cipher-voice-ids.md)
|
||||
> R4 节;清单 `tools/voice_lines_26/cipher.md`。
|
||||
> 范式对齐 [26-apply-storyline.md](26-apply-storyline.md) / [26-apply-radio.md](26-apply-radio.md)
|
||||
> (叙事型主参考;OP/WIND 双音色组与 radio 的 HOST/PROD 同构)。
|
||||
> 本次只动交互层:电文生成(4 封固定字符)、摩尔斯运行时合成(morse.js)、暴露度
|
||||
> 隐藏账本、4 结局、OP/WIND 双音色一概不动。
|
||||
|
||||
## 1. 实现接线(引擎六模块,对齐 storyline/radio 参考)
|
||||
|
||||
- **装配**(game.js 构造器 + index.html):`this.receipts / this.floor / this.confusion /
|
||||
this.invalidHints(= new InvalidHints().bind(floor))/ this.ladder` 全部暴露;
|
||||
`audio.setRateBoostEnabled(false)`(长按不是玩法、也不触发旁白快进;摩尔斯 u 恒定
|
||||
不受 settings.speed)。index.html 照 storyline/radio:`makeInputPipeline({ floor,
|
||||
confusion, receipts, invalidHints, game, ladder, opts: game.PIPELINE_OPTS || {} })` +
|
||||
`attachGestures(root, pipe, { doubleTapWindow: 0 })`——叙事+解码型无核心玩法手势
|
||||
opt(doubletapCore/swipeCore/longpressCore 均 false),双击未解锁折算单击由管道
|
||||
新手门承担。
|
||||
- **onGesture 收口**:返回 `'ok' | 'hold' | 'invalid' | 'silent-ok'`(摩尔斯即内容音
|
||||
的操作给 hold 附 ok 回执;无 silent-ok 档位用法——全部操作都有回执或内容音)。
|
||||
`stateName()` → menu / ask / decode / confirm / settle / story / choice / night;
|
||||
`invalidHint(state, g)` → locked:up=inv_up_locked、locked:down=inv_down_locked、
|
||||
locked 其余=gd_invalid;left/right:menu=null(切项合法)、settle=sys_hint_again_full、
|
||||
其余=inv_nosel;默认 gd_invalid。
|
||||
- **floor 状态流**:叙事/提示链 `floor.speak`(critical:sys_first_tap、dv1_teach、
|
||||
揭晓/收尾链首句 dv1_right / d9_send / d9_send_e / d9_caught_e / d9_sleep / d9_sleepe
|
||||
——判定出口 800ms 手势死窗的 26 号等价物:抢拍 tap 给 busy 回执不吞揭晓)。
|
||||
摩尔斯排程 = BUSY(手势 busy 回执,G4 首播保护的等价物):RX 首播 `_rxGuard` 保护窗
|
||||
(floor BUSY + 作废令牌)、T4 danger 拍前置 2s(step_halt 渐强 + danger 签名/震同窗,
|
||||
直置 floor.state,见偏差 7)、两段确认电文重播(confirm 等待点在挂但摩尔斯可先起)。
|
||||
等待点 8 个全配 full/short/silenceMs/expected/onDemo(19 号附录 C §5 表 + ask/menu)。
|
||||
- **morseGate(19 号 §3.4 R1-R5)**:`_busyVoice() = floor.speaking ||
|
||||
audio.isVoicePlaying()`(整条链含句间空隙都算语音在播),在播则挂队 150ms 轮询补发;
|
||||
候选预听链 = 候选摩尔斯(620Hz / u=110 / 字母隙 5u 对照档)→ 静默一拍 ≥500ms →
|
||||
cand_* 词义句(给耳朵留对照时间);转写账本 `morseLog`(kind/word/preset/逐元素
|
||||
at/endMs,被掐断时收敛 endMs,零重叠断言口径)。
|
||||
- **BGM dip(R3 + §6.1)**:引擎 duck 独占 _bgmBus,游戏层在 _bgmBus → _bgmPrefBus
|
||||
之间插私有增益节点:摩尔斯排程期间 ×0.5(−6dB,排程到 endAt 自动恢复)、MENU 同曲
|
||||
低响度 ×0.4,复合相乘。
|
||||
- **confusion**:信号由管道喂(含锁定手势,2026-10 修复后锁定门在 record 之前);
|
||||
`onConfused → 当前等待点 takeover(lvl)`(引擎 takeover(1/2) 已带 30s 台账去重,
|
||||
游戏侧零自研路径);双击重听/再说一遍喂 recordReplay;L3 `onDemo` 分档:intro/
|
||||
continue 替玩家走一步、choice 只复述不替选、decode = 慢放电文 0.5× 一遍(u=160、
|
||||
字母隙 6u)+ T1 附免费教学页(hint_t1,不扣页数,Prime→Teach 兑现)再交还浏览。
|
||||
- **novice 阶梯**:T1 译对 = `ladder.onGoal()`(阶段 1),返回的 teachLine **已带
|
||||
voice/ 前缀**(2026-10 novice.js 修复,直接进 floor.speak,不要再加前缀)挂
|
||||
dv1_right 揭晓链尾;一局结束 = `ladder.onGameDone()`(阶段 2/3),教学句挂结局链尾,
|
||||
一局只报一次(_gameDoneCounted);第二夜起 `goalMet = ladder.stage() >= 1` 跨局
|
||||
记住不重教(做对过的事不教第二遍,原则 11)。
|
||||
- **存档(§8.1)**:schema 1、summary 人话必带(`第{N}封·{名} · 暴露:{档} · 结局{k}/4`
|
||||
/ 收台 `已收台·{结局名} · 结局{k}/4`);写入时机 = 每封 RX 进入 / NIGHT 进入 /
|
||||
每个抉择结算后 / ENDING 进入 / 菜单「保存并回大厅」。断点回来 5s 内
|
||||
sys_continue_ask → 单击恢复(DECODE 恢复链 prog_t → book 档 → 重挂浏览 + 自动
|
||||
预听当前候选,30s 台账内不重复;gd_tune2 已停用)/ 右滑新夜班。
|
||||
- **环境音**:静电底噪 static_bed(RX/DECODE)与值班室 amb_room 为游戏层 buffer
|
||||
loop(sfx 层无 loop API,持句柄起停;无头测试 ambLoopEnabled=false 防周期定时器
|
||||
不排水)。
|
||||
|
||||
## 2. 台词类别映射(瘦版;全量登记见 19-cipher-voice-ids.md R4 节与 `tools/voice_lines_26/cipher.md`)
|
||||
|
||||
- `critical`:sys_first_tap(开场 ≤3s 唯一一次指令)、dv1_teach(改写版「向右滑,
|
||||
听下一个词。」,19 号附录 C §6)、揭晓/收尾链首句(dv1_right、d9_send、d9_send_e、
|
||||
d9_caught_e、d9_sleep、d9_sleepe——判定出口死窗等价物,首句 <3s)
|
||||
- `content`:b_open/b_goal/b_chief(移驻 NIGHT(1) 链首)、n1..n3、rx1..4_in、rev_*、
|
||||
r*/m*_chief_c/g9_*/p2..p9/r1a..r4b、hint_t1..t4、cf_confirm、sys_turn_teach、
|
||||
sys_unlock_*(阶梯教学)、sys_menu、sys_menu_resume/book/restart/lobby、
|
||||
sys_new_night、prog_t1..t4、book_3..0、exp_calm/low/mid/hot、end_c1..c4、
|
||||
e1..e4 主句 + ep_*(OP/WIND/处长按 19b 原组)
|
||||
- `hint`:sys_hint_continue_full/short、sys_hint_choice_short、sys_hint_again_full、
|
||||
gd_tune1 / gd_tune1_short、cf_hint_full/short、sys_only_choice、sys_demo_continue、
|
||||
sys_demo_choice、sys_continue_ask、sys_skip
|
||||
- `hint 前缀`:sys_say_again「再说一遍:」(主动重听,全项目一句)
|
||||
- `feedback`:inv_up_locked、inv_down_locked、inv_nosel、gd_invalid(改写版补
|
||||
「单击,继续。」)、dv1_wrong(T1 译错即时归因真话,摩尔斯写死句内)
|
||||
- 音色组:系统/交互层句子全部走 **WIND 北风组**(北风电台=上线联络+系统音,radio
|
||||
PROD 同型);剧情句沿用原组(OP 报务员 / 处长 NPC 平铺)。
|
||||
- 账目:新增 20 / 修改 3 / 删除 10,主句 132 → **142**;`_k` 变体 11 → 24 对
|
||||
(`web/harness/voice_text.json` cipher 主表已同步 142 条)。
|
||||
|
||||
## 3. 偏差记录(与 26 号/19 号附录 C 的落地差异及理由)
|
||||
|
||||
1. **DECODE 左右滑切候选返回 hold(附 ok 回执)而非设计单的 silent-ok**:管道无
|
||||
「silent-hold」档——silent-ok 会被视为完成当前等待点(摘掉浏览点,三档提示计数
|
||||
清零),而切候选没有完成这个点;取 hold 保住等待点,回执由摩尔斯预听的内容音
|
||||
+ ok 双保险(§4.2「已有明显内容音」的反向适用)。
|
||||
2. **上滑状态链三句(prog_t → book 档 → exp 档),无「动作」尾句**:19 号附录 C §3
|
||||
写「第几封。密码本余页。暴露档。左右滑听词。」——落地与 radio 同型(动作由等待
|
||||
声/等待点提示承担,原则 3「一句话」);DECODE 态要听词时的动作指令由 decode
|
||||
等待点三档提示(gd_tune1 / gd_tune1_short)就近给。
|
||||
3. **无 sys_praise「对。」**:19 号附录 C §6 ≈25s「『对。』dv1_right」——首正反馈由
|
||||
dv1_right 本句(「货船,译对了。」)+ success 震承担,不再单设肯定句(避免
|
||||
「对」与「货船,译对了」连播两拍;radio 的 sys_praise 是其主播线无归因句所致)。
|
||||
4. **开场叙事移驻 NIGHT(1) 链首**:§4.10 首夜第一句只剩 critical 指令 + 状态教学,
|
||||
b_open/b_goal/b_chief 移驻 NIGHT(1) 链首补全叙事、sys_skip 每夜一次挂链尾;
|
||||
b_rule(规矩念白=重听承诺,随双击教学废止)、gd_brief、dv1_teach2、dv1_ask 停用
|
||||
(dv1_ask 仍留在 TELS 数据源但 T1 走 dv1_teach 改写版,不可达)。
|
||||
5. **阶段 3 双击语义分态**:19 号附录 C 只写「重听电文原速;再请求=慢放」——落地:
|
||||
DECODE = 重听电文(dtCount 连击:第 2 次起 0.5×,其他手势重置);叙事/菜单态 =
|
||||
等待点 requestReplay(「再说一遍:」+完整句)或无等待点时重播当前节点(NIGHT =
|
||||
重播夜链、ENDING = 重听结局链);RX 态 invalid(引入链一句在播,等待点不存在)。
|
||||
6. **翻密码本入口 = 菜单项(阶段 2)+ 迷茫 L3**:长按捷径废止(长按 → invalid +
|
||||
gd_invalid 解释一次);19 号 §7「页数用尽再翻 = paper_page + 无语音轰炸」照旧;
|
||||
非破译态选「翻密码本」= gd_invalid(feedback 通道,话轮保住)。
|
||||
7. **danger 拍前置 2s 直置 `floor.state = 'BUSY'`**:引擎无「演出 BUSY 定时」公开
|
||||
API(floor 只有 speak/yieldTurn/enterAction),游戏层直置 + seqToken 作废令牌,
|
||||
2s 后 _speakPayoff 接管(代码注释已标;dungeon 同款直置先例)。**引擎建议**:
|
||||
floor 补 `busyFor(ms)` 公开演出窗 API。
|
||||
8. **摩尔斯首播保护窗**:`_rxGuard` + floor BUSY(管道路径 busy 回执)双保险;
|
||||
会话/直调(transcribe 的 onGesture 直调不走管道)由 _rxGuard 返回 silent-ok
|
||||
兜底不推进状态(G4 轻震等价物移到回执层)。
|
||||
9. **intro 等待点 full=null**:指令句刚说过(§4.10 找猫示例同型),静默第一档直接
|
||||
short(sys_first_tap_short);第二夜起 newNight 只播 sys_new_night 不再重播
|
||||
sys_first_tap。
|
||||
10. **menu 等待点 short 复用 gd_tune1_short「左右滑。」**:菜单三档提示省一句资产
|
||||
(full=sys_menu 报幕句刚播过,30s 台账自动降档;两处「左右滑」语义一致)。
|
||||
11. **confirm 等待点 onDemo = 替确认(_settleDecode)**:迷茫兜底要能推进(19 号
|
||||
附录 C §5「替确认」);choice 的 onDemo 不替玩家做有后果的抉择(sys_demo_choice
|
||||
复述两向后交回);settle 的 onDemo 只给提示音(不替玩家开新夜班)。
|
||||
12. **m4_chief_a/b 登记未接线**:19b M4 组的处长试探 ①/② 在 26 号改造前(HEAD)即
|
||||
未进节点表(rev4 → @p8 直连),本轮维持现状不动玩法;台词资产维持登记不删。
|
||||
13. **乱点机器人白名单口径(§6.2 被动原句重复=0 的「主动查询」判定)**:a)「再说
|
||||
一遍:」前缀后的完整句;b) 玩家 8s 内主动操作索引的句子(候选词/状态句/
|
||||
dv1_wrong/dv1_right/cf_confirm/hint_t/rev_ 归因与确认句)。
|
||||
|
||||
## 4. 测试记录
|
||||
|
||||
- 无头 playtest:`tools/node/bin/node web/cipher/test/playtest.mjs`,**16 段、断言
|
||||
191 条全绿、退出码 0**(2026-10-02;`game.floor.bedEnabled = false` 关等待声周期
|
||||
定时器,mock 口径 2s/句)。覆盖:
|
||||
1. 开场 §4.10 + RX(1):第一句 critical 指令(抢拍 tap=busy)、3s 内动手、
|
||||
gd_brief/b_rule/gd_tune2 零播出、首候选预听 ≤12s、BAY 编码/时值逐元素
|
||||
(§2.2 表)、R3 摩尔斯 dip 0.5、首播保护窗 tap/left=busy;
|
||||
2. DECODE 浏览 / 两段确认 / T1 译对:右滑 ×3 循环候选、确认取消回浏览、揭晓首句
|
||||
critical、success 震、sys_unlock_up 挂链尾、抉择点「再说一遍:」+ 完整句;
|
||||
3. T1 译错即时归因 + 无限重选零惩罚(expose 不动、t1 恒收敛);
|
||||
4. 剧本 A(E1 全对全右 p9 左,guide=full):NIGHT(1) 开场叙事移驻各一次、四封
|
||||
编码逐元素断言(TOP/HAND/SPY)、danger 拍(step_halt+签名+震同窗)、ep 逐封
|
||||
点名 flags 单源、end_c1 分档计数、summary、手势数 ≤170(实际 24)、第二夜
|
||||
不重播 sys_first_tap;
|
||||
5. 剧本 B(E2)/ 剧本 D(E4,全译错全左 endingPre=8)playNight 驱动;
|
||||
6. 剧本 C(E3):暴露度逐 NIGHT 验算(0→2→5→8,§5.2 单源表)、跨档播报
|
||||
exp_low/exp_hot 各一次、warning 震、同档零重复;
|
||||
7. 手势阶梯:locked 首次解释一次(原则 7)、未解锁双击折算单击、上滑状态链
|
||||
G6 顺序、sys_help 零播出;
|
||||
8. 三档提示:decode 10s/25s、continue 13s/30s、choice 25s(台账降档直接 short)
|
||||
/50s(>30s 给完整句)、两级用尽即停;
|
||||
9. 迷茫接管:L1 短句 → L2 只放行 expected(L3 白盒 takeover(3):慢放 u=160/
|
||||
字母隙 6u + T1 免费教学页不扣页数,演示后重挂浏览);
|
||||
10. 菜单(seed 阶段 3):左右滑循环换项、上滑重听说明+设置提示、下滑关闭回
|
||||
DECODE(局面复述 + 30s 台账内自动预听不重复)、「翻密码本」= 回 DECODE 提示
|
||||
流程(T1 免费页 + paper_page)、「重新开始今晚」= 新夜班、「保存并回大厅」=
|
||||
leaving + 存档;MENU 同曲低响度 dip 复合断言;
|
||||
11. 阶段 3 双击:重听电文原速 → 再请求慢放 0.5×(字母隙 960ms 时值断言)、
|
||||
切候选重置连击;
|
||||
12. 断点复述:预置存档 phase=DECODE(tel=3/hints=1/cand=1)→ sys_continue_ask →
|
||||
单击恢复(数值全还原、恢复链 prog_t3 → book_1、gd_tune2 零播出、自动预听
|
||||
SAND);右滑 = 新夜班标量重置;
|
||||
13. §6.2 乱点机器人(120 步、seed 42):无声操作 0/114、第一次操作 2120ms ≤10s、
|
||||
第一次成功 2120ms ≤20s、打断失败 0、被动原句重复 0(白名单口径见偏差 13);
|
||||
14. morseGate:全剧本摩尔斯起振区间与 voice 零重叠、候选词义句全部 ≥500ms 接播;
|
||||
15. 资产缺失:屏蔽 rev_top 仅 console.error/warn,Floor 单句哨兵续链不卡死仍到 e1、
|
||||
gd_tune2/gd_prog1 零播出;
|
||||
16. 键盘变体(input=key:gd_tune1 走 key/ 目录)与语速边界(speed=2.2 首播 u 仍
|
||||
80ms)。
|
||||
- 玩家感知转写:`web/harness/sessions/cipher.mjs` 已同步 26 号口径(开场第一下 tap、
|
||||
主动重听、上滑状态链、走神听三档、结局后下滑逛菜单、`floor.state` 链级门控,
|
||||
radio 范式),`tools/node/bin/node web/harness/transcribe.mjs cipher`(含
|
||||
`--session sessionStress`)两剧本零死锁跑通(主线虚拟 174s 到 E1 并开第二夜 /
|
||||
乱按 416s:解码 12 步、5 抉择、乱试 66 次、逛菜单 11 次仍到结局)。
|
||||
`web/harness/voice_text.json` cipher 主表同步 142 条。
|
||||
- 待生成资产:新增 20 + 重录 3(`tools/voice_lines_26/cipher.md`,主会话统一生成;
|
||||
playtest 对缺失 voice 资产按可用 mock,与 TTS 生成解耦)。
|
||||
- 真人冷启动:待测(26 §6.3,3~5 人)。
|
||||
@@ -0,0 +1,116 @@
|
||||
# 26-apply · 《雨夜专案》重构设计单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [18-detective.md](18-detective.md) 附录 C**(一句话核心动作、三态
|
||||
> 声音身份、新手手势表、状态×手势矩阵、等待点配置、首 3 分钟脚本、失败表均以那份
|
||||
> 为准,本文不重复)。本文只记四件事:**实现接线、偏差记录、台词类别映射、测试记录**。
|
||||
> 台词登记见 [18-detective-voice-ids.md](18-detective-voice-ids.md)(R3 增量节);清单见
|
||||
> `tools/voice_lines_26/detective.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)
|
||||
> 与 [26-apply-radio.md](26-apply-radio.md)(叙事型主参考)。
|
||||
|
||||
## 1. 实现接线
|
||||
|
||||
**引擎六模块(构造并暴露,`web/detective/game.js` 构造函数)**:
|
||||
`receipts`(回执三件套)/ `floor`(发言权)/ `confusion`(`onConfused → floor.waitPoint.takeover(lvl)`)/
|
||||
`invalidHints`(`.bind(floor)`)/ `ladder`(手势阶梯)——`index.html` 用
|
||||
`makeInputPipeline({ floor, confusion, receipts, invalidHints, game, ladder })` +
|
||||
`attachGestures(root, pipe, { doubleTapWindow: 0 })` 接线(照 storyline/index.html)。
|
||||
本作无核心长按/四向滑动/双击玩法,不传 `opts`(`longpressCore` 等全 false),
|
||||
并 `setRateBoostEnabled(false)`(长按=新手 invalid,不快进)。
|
||||
|
||||
**状态机 → Floor 态映射**(18 号 §2 状态机不动):
|
||||
|
||||
| 游戏态 | Floor 态 | 说明 |
|
||||
|---|---|---|
|
||||
| TITLE/BOARD 空闲/CONFRONT/FINISH/SETTLE/MENU 的播报链 | SPEAKING → yieldTurn(等待点) | `floor.speak` 链级压低,句间不掉回「轮到你」 |
|
||||
| BOARD 听取中(`_play` 非空) | **ACTION** | 证词链由游戏层逐句推进(0.8s 句间 + 15s 单句兜底),`holdDuck` 自管;tap=停、左右滑=打断切条目直达游戏层(§4.1 裁定滑动有明确意图) |
|
||||
| VERDICT / 判定链 / 错指链 / 结算链 | SPEAKING(**critical 全链**) | 链锁:手势只给 busy 回执,链尾驱动相位推进 |
|
||||
|
||||
**等待点实现**(`_wp(conf)` 工厂 → `engine/hints.js` WaitPoint,对应 18 号附录 C §5):
|
||||
`title(12/30s)`、`board(18/40s)`、`caseGate(12/30s)`、`cf_item(15/30s)`、`cf_line(15/30s)`、
|
||||
`cf_confirm(15/30s)`、`finish(20/45s,full=当前问句)`、`settle(20/45s)`、`menu(20/45s)`。
|
||||
L3 演示:board=替滑下一份、cf_item=选第一份、cf_line/confirm=替确认/替定下、
|
||||
finish=滑到正确项**不代答**(保底必结不代答裁定)、其余=提示音。
|
||||
|
||||
**无进展轨(必结案保底,18 号 §5)**:45s `sfx/turn_tick`(earcon 层,证词播中也发)→
|
||||
90s 短句(hint_a/hint_b)→ 150s 直接给可指证矛盾对(hint_c1/c2、b_hint_c1/c2 按
|
||||
seed 定序轮询,每句全局限 2 次);只由进展事件(听完新条目/判定/结案推进)重置,
|
||||
任何手势都不重置,菜单挂起时长剔除(`_progAdjustMenuPause`)。
|
||||
|
||||
**存档(§4.12)**:进展即写 `soundgame.progress.detective`(seed/pack/layout/heard/
|
||||
heardLines/lastLine/doubts/cfMiss/wrongWho/zHits/hintsGiven/hintFinShown/weaponAns/
|
||||
motiveAns + meta;summary 必带:「雨夜·聚宝斋 · 已问n/6 · 疑点m/4」/「已结案N起 · 最佳X」)。
|
||||
回来 sys_continue_ask → 单击续玩(先播状态复述链=上滑链同构)→ 右滑换新案。
|
||||
VERDICT/SETTLE 链期间不落「进行中」快照(`run=null` 后才写)。
|
||||
|
||||
**开场(§4.10)**:第一句 = critical「点一下屏幕。」→ 砍掉旧 intro_1..3 规则链与
|
||||
DRILL 七步教学;教学嵌真实案卷(`_ob`:listen1 → nav → cf):新案一句 + intro_1 →
|
||||
签名+「老葛的证词」+「单击,听取。」+「轮到你」状态教学 → 听完第一份 →「向右滑,
|
||||
下一份。」+ 上滑解锁句 → 听完第二份 →「滑到指证,点一下。」→ 首次指证=练习
|
||||
(判定截获 tut_cf_ok,零账目污染,`meta.drillDone` 收官)。TITLE 上滑重听案情
|
||||
简介链(intro_1..3 不占开场)。
|
||||
|
||||
## 2. 偏差记录(相对 26 号手册/18 号附录 C 的落地裁定)
|
||||
|
||||
1. **听取 = ACTION 而非 SPEAKING**:证词是「玩法本身的声音」(§4.1 ACTION 定义),
|
||||
tap=停/左右滑=切条目直达游戏层、句粒度可停;游戏层自管 `holdDuck` 与 15s 单句
|
||||
兜底(引擎 Floor 哨兵只管自己的链)。矩阵「证词在播」行据此独立于「游戏在说」。
|
||||
2. **VERDICT 800ms 死窗被 critical 全链覆盖**:原显式死窗语义(18 号 §7.4)由
|
||||
critical 链锁结构性涵盖且更强(整条认罪+结算链手势全吞),`VERDICT_GRACE_MS`
|
||||
常量留档不另起计时器。
|
||||
3. **板上单击防抖在游戏层**:ACTION 态管道不设防(§4.2 只管 tap=继续/跳过),
|
||||
起停 400ms 防抖由 `_lastBoardTapAt` 自管(连点不把刚起的播掐死、闸不误进)。
|
||||
4. **入口句登 30s 台账(原则 9 补强)**:fin_pre(结案闸)、fin_start/fin_ask_weapon/
|
||||
fin_ask_motive(问句入口)、settle_hook(结算链)、title 句、sys_menu+首项(菜单)、
|
||||
cf_confirm(确认句)、FINISH 首选项名——播出即 `markHintSaid`,对应等待点静默
|
||||
提示自动降 short/提示音,**被动原句重复清零**(§6.2 指标;条目/选项报名本就走台账)。
|
||||
5. **关菜单签名 lead 的 450ms 为 BUSY 演出窗**:`_announceItem` 签名→条目名之间
|
||||
手势给 busy 回执(§4.1 BUSY 语义);真人听到条目名落声再动手,playtest 同律。
|
||||
6. **`sys_help` 保留但改词**(radio 路线是删除):本作菜单上滑=重听帮助+设置提示
|
||||
是附录 C 矩阵行,句子保留、旧「双击重新听/长按指证」口径整句重写。
|
||||
7. **结案三问上滑=重听问句**(矩阵行):不与「我在哪」争用——探长的「在哪」由
|
||||
板上状态链承担,问答态问句即位置。
|
||||
8. **矩阵外防御**:`_judge` 对矩阵外同轴异值对兜底 cf_diff(生成期矩阵不变式断言
|
||||
已排除,防御不崩);`_ensureTurn/_orphanTurnHeal` 保证任何打断不留 BUSY 悬空
|
||||
软锁(§4.1 不允许安静态)。
|
||||
|
||||
## 3. 台词类别映射(§4.6;完整清单见 `tools/voice_lines_26/detective.md`)
|
||||
|
||||
- `critical`:sys_first_tap(开场 ≤3s 唯一一次指令)、fin_pre(结案闸句)、判定链
|
||||
(cf_hit+react / 三档 miss)、错指链(acc+fin_clear+st_wrong)、cf_second(第二份
|
||||
定下自动重播,误触不打断)、VERDICT→SETTLE 全链(fin_right→break→gavel→结算)
|
||||
- `content`:intro_1..3、证词 NPC(N1-N7 平铺)、sc_*、z_break/b_shun_break、rate_*、
|
||||
settle_open/settle_hook、item_*/item_who_*/wp_*/mv_*、tut_next_full、tut_cf_try/ok、
|
||||
sys_turn_teach、sys_unlock_*、sys_menu*/sys_help/settings_hint、st_asked/st_doubt/st_miss
|
||||
- `hint`:hint_board_full/short、hint_cf_item_full、hint_fin_short、hint_tap_short、
|
||||
hint_a/b、hint_c1/c2、b_hint_c1/c2、hint_fin、recap_go/recap_cf、st_confront、
|
||||
sys_first_tap_short、sys_say_again(重听前缀)、sys_continue_ask
|
||||
- `feedback`:cf_self/cf_same/cf_diff(三档真话归因)、fin_wp_wrong/fin_mv_wrong、
|
||||
inv_up_locked/inv_down_locked/inv_longpress
|
||||
- 新增 18 / 修改 4 / 删除 11(含 KEY_LINES 变体:新增 15、重录 4、停用 5);
|
||||
双性别 104→111 句(≤176 上限),NPC 53 平铺不动。
|
||||
|
||||
## 4. 测试记录
|
||||
|
||||
- **无头 playtest**:`web/detective/test/playtest.mjs` **283 断言全绿**(`tools/node/bin/node
|
||||
web/detective/test/playtest.mjs` 退出码 0,三连跑稳定)。覆盖:开场 §4.10(3s 动手/
|
||||
首成功/教右滑/解锁上滑/滑到指证/练习零账目)、seed 复现与矩阵不变式(pack A/B
|
||||
同轴异值对 ≡ 矛盾表)、听取 ACTION 态手势矩阵(句序/续听/tap 停/连点 busy/
|
||||
滑动打断切条目/上滑状态链/15s 兜底)、M1-M4 指证(hit 按轴/共用 z_4/自动重播/
|
||||
4-4 hint_fin/选句位置记忆)、miss 三档真话+无序、结案闸/错指不在场证明/三问/
|
||||
VERDICT 死窗+链锁/接新案翻包、评级六变量 12 组注入矩阵、三档提示 18s/40s、
|
||||
迷茫接管 L1/L2、无进展轨 45/90/150、断点复述+上滑同链、pack B 变体、
|
||||
settings.input 键盘路由(游戏代码零 `_k` 硬编码)、模态菜单/重启二次确认/
|
||||
保存 PUT summary。
|
||||
- **§6.2 乱点机器人**(场景 15,140 步急躁新手模拟):**无声操作 0 / 被动原句重复 0 /
|
||||
打断失败 0**、第一次操作 ≤10s、第一次成功 ≤20s、结束态健康(零死锁)。被动重复
|
||||
的「玩家触发」豁免窗口 = 手势后 12s 内的响应链(含 onDone 续播与多句反馈链,
|
||||
恰低于最早等待点静默阈值 12s——看门狗句仍全计被动)。
|
||||
- **玩家感知转写**:`web/harness/sessions/detective.mjs` 已同步 26 号口径(开场第一下
|
||||
tap、指证=列表项单击进入、菜单左右滑+单击确认、`floor.state` 链级门控、不裸
|
||||
waitIdle)——`tools/node/bin/node web/harness/transcribe.mjs detective`(含
|
||||
`--session sessionStress`)两剧本零死锁跑通(主线虚拟 684s 全弧线到 pack B 短打;
|
||||
乱按压力 396s:零进展三级抢救→保底指证→乱答修正→SETTLE→接新案)。
|
||||
- 资产并行生产期:运行期引用 154 个 id 中缺失 13 个(新增句),mock 按可用推进
|
||||
不卡流程;`tools/node/bin/node --check web/detective/game.js` 通过。
|
||||
- 真人冷启动:待测(26 §6.3,3~5 人)。
|
||||
@@ -0,0 +1,206 @@
|
||||
# 26-apply · 《回声地窟》重构施工单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [16-dungeon.md](16-dungeon.md) 附录 C**(一句话核心动作 / 状态 /
|
||||
> 手势表 / 等待点 / 首 3 分钟脚本 / 失败表 / 台词账目 / 断点复述),本施工单不重复,
|
||||
> 只写:实现接线(§11)、偏差记录(§12)、台词类别映射(§8)、测试记录(§10)。
|
||||
> 交互规则权威来源:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)、
|
||||
> [00-global-ux.md](00-global-ux.md) §5.3。台词登记 [16-dungeon-voice-ids.md](16-dungeon-voice-ids.md)。
|
||||
> 本次只动交互层:地窟生成、回声编码、战斗数值、遗产经济一概不动。
|
||||
|
||||
## 1. 一句话核心动作
|
||||
|
||||
**朝四个方向滑动在洞窟里走,单击发出声波脉冲听地形,按住屏幕问路。**
|
||||
|
||||
## 2. 玩家可感知的状态(3 个)与声音身份
|
||||
|
||||
| 状态 | 听感 | 来源 |
|
||||
|---|---|---|
|
||||
| 探索(轮到你) | 洞穴环境垫 amb_cave(静默 20s 补一层)+ 脚步/回声/怪物脚步就是状态声 | §4.1 ACTION |
|
||||
| 听讲(游戏在说) | 教学/遭遇/结算语音,BGM 整链压低(floor.holdDuck) | §4.1 SPEAKING |
|
||||
| 危险(战斗) | battle/boss BGM;敌方前摇音 tel_* + beat 震;血 ≤25% warning 震 | ACTION + 战斗曲即状态 |
|
||||
|
||||
撞墙 = 闷响 bump + invalid 回执,不算第四态(一次性教,见 §7)。
|
||||
|
||||
## 3. 新手手势表(四向滑动是玩法 → §4.3 裁定:帮助换到长按)
|
||||
|
||||
| 手势 | 含义 | 说明 |
|
||||
|---|---|---|
|
||||
| 四向滑动 | **面朝相对移动**:上=前进一格;左=向左一格并转向;右=向右一格并转向;下=后退一格(面朝不变) | swipeCore,阶段 0 即核心,不按阶梯锁 |
|
||||
| 单击 | 脉冲(探索);楼梯格=下潜确认;战斗我的回合=挥击;敌方前摇窗内=格挡 | 核心动词;旧「双击=免冷却重发」「双击=格挡」废除 |
|
||||
| 长按 | 我在哪(层[+血 if 伤]+面朝+目标方位,≤20 字) | longpressCore;旧「按住前进」废除;对局期关闭旁白快进 |
|
||||
| 双击 | 新手期按单击处理;阶段 3 = 重听(结算/标题重听等待点句;探索 = 冷却外再脉冲) | 禁绑「立刻免冷却重播」 |
|
||||
| 下滑 | 探索/战斗=后退/逃跑(玩法占用);菜单仅阶段 2 且 TITLE/SETTLE | 00 §5.3 |
|
||||
|
||||
管道:`makeInputPipeline({ ..., opts: { swipeCore: true, longpressCore: true } })` +
|
||||
`attachGestures(root, pipe, { doubleTapWindow: 0 })`。
|
||||
|
||||
## 4. 状态 × 手势矩阵(新手期)
|
||||
|
||||
| 状态 \ 手势 | 单击 | 四向滑动 | 长按 | 双击(未解锁) | 连点/乱滑 |
|
||||
|---|---|---|---|---|---|
|
||||
| TITLE | 开始/继续 + ok | 右=新周目;上=元进度链;左/下(未解锁)=invalid+解释 | 重听询问句 | 按单击 | 计入迷茫 |
|
||||
| 教学作答 | 按步骤(脉冲/确认) | 按步骤走/转向;步骤外 invalid+inv_drill | 帮助(D5 即教学内容) | 按单击 | 计入迷茫 |
|
||||
| 探索(ACTION) | 楼梯格=下潜;否则脉冲+回声组(silent-ok);冷却中 invalid+inv_pulse | 移动=脚步(silent-ok);撞墙=bump+invalid+归因+方位真话 | 帮助(层/血/面朝/方位) | 按单击(=再脉冲) | 乱滑计入迷茫;冷却连点 invalid |
|
||||
| 描述在播 | 跳过这句 + ok | 打断并移动 | 打断,帮助 | 按单击 | 第一下有效 |
|
||||
| 战斗·我的回合 | 挥击(面前才中) | 左/右=转身(缠斗怪 btl_no_turn 每场一次);下=逃跑(Boss 拒绝);上=战斗状态 | 帮助(血+敌方位) | 按单击 | 计入迷茫 |
|
||||
| 战斗·敌前摇 | **格挡**(面对 ×0.2 / 未面对 ×1.0) | 左/右=转身(来得及则面对) | invalid+inv_tel | 按单击=格挡 | 只处理第一下 |
|
||||
| DESCEND 演出 | 跳句 + ok | 打断演出(兜底定时器续流程) | 同左 | 按单击 | busy/ok |
|
||||
| 结算(critical 链) | busy 回执(死亡/通关归因链不打断) | busy 回执 | busy 回执 | busy | busy |
|
||||
| 结算(等待) | 再探一次 + ok | 上=元进度链;左=invalid+inv_settle;下(阶段2)=菜单 | 重听结算句 | (阶段3)重听结算句 | 只处理第一下 |
|
||||
| 菜单 | 确认当前项 + ok | 右=下一项 / 左=上一项(hold);上=帮助 | 重听菜单说明 | 按单击=确认 | busy |
|
||||
| 迷茫 L2 期间 | 照常 | 只放行接管方向,其余 invalid(不移动) | 照常 | 照常 | 照常 |
|
||||
|
||||
验收:无空格、无「没有声音」的格子;连点/乱滑无破坏性效果(重开走菜单二次确认)。
|
||||
|
||||
## 5. 等待点配置表(教学期)与探索期接管
|
||||
|
||||
教学等待点(6s/15s 两档;wrong 手势 = invalid 回执 + explainOnce,三级接管后 75s 兜底自动过步):
|
||||
|
||||
| 步 | 期待 | 指令句(full) | short |
|
||||
|---|---|---|---|
|
||||
| D0 | 单击 | d0_new「黑暗。点一下,听回声。」(critical) | sys_first_tap_short「点一下。」 |
|
||||
| D1 | 再单击(巩固) | tut_praise + tut_front_rule(回声规则) | 「点一下。」 |
|
||||
| D2 | 上滑(前进) | sys_turn_teach → tut_move「朝前,滑一下。」 | hint_swipe「滑一下。」 |
|
||||
| D3 | 左/右滑(侧移转向) | tut_side_move「向左滑,转身走。」 | hint_swipe |
|
||||
| D4 | 走到金币格(四向) | tut_coin「房里有金币,走过去捡。」→ 拾取即 ladder.onGoal() | hint_swipe |
|
||||
| D5 | 长按 | tut_help_hold「迷路了,按住屏幕。」→ 帮助链即答案 | 「按住屏幕。」 |
|
||||
| D6 | 教学战:前摇单击格挡→单击挥击 | tut_mob → tut_parry_tap → tut_attack | btl_turn_short「点一下,打。」 |
|
||||
| D7 | 自行走到楼梯→单击下潜 | tut_stairs「铁器的回声,就是下潜的楼梯。」 | hint_swipe |
|
||||
|
||||
其他等待点:
|
||||
|
||||
| id | 期待 | full | short | 静默 | L3 演示 |
|
||||
|---|---|---|---|---|---|
|
||||
| title | tap/right | sys_first_tap / sys_continue_ask | 「点一下。」 | 12s/30s | 提示音 |
|
||||
| battle | tap/left/right | gd_turn「轮到你了。单击挥击。」 | btl_turn_short「点一下,打。」 | 8s/15s | 游戏替你挥一拳 |
|
||||
| settle | tap | settle_again「单击,再探一次。」 | 「点一下。」 | 20s/45s | 提示音 |
|
||||
| menu | tap/left/right | menu_help | menu_help | 20s/45s | 提示音 |
|
||||
|
||||
探索期(无固定等待点,静默 40s 起每 20s 喂迷茫信号)三级接管:
|
||||
|
||||
| 级 | 做什么 | 台词 |
|
||||
|---|---|---|
|
||||
| 1 | 说目标(铁器暗示/窟主守梯,30s 台账去重) | stair_hint_a「找找铁器的回声,那是楼梯。」/ stair_hint_b |
|
||||
| 2 | 只放行最短路首步方向(面朝相对换算) | sys_only_*「现在,只要向左滑。」 |
|
||||
| 3 | 听我做一次:游戏自己朝楼梯走一步 | sys_demo + 脚步声 + sys_now_you |
|
||||
|
||||
进展事件(拾取/击杀/踏上楼梯/下潜/下潜层)清零重来。
|
||||
|
||||
## 6. 首 3 分钟逐秒脚本
|
||||
|
||||
| 时间 | 游戏说 / 播 | 期待玩家做 | 没做 | 做错 |
|
||||
|---|---|---|---|---|
|
||||
| 0~3s | amb_cave →「黑暗。点一下,听回声。」(critical) | 单击脉冲 | 6s:「点一下。」15s:提示音 | 滑动:invalid + inv_drill |
|
||||
| 3~8s | pulse + echo + 材质 →「对。」「回声回来越快,墙就越近。」 | 再点一次(巩固) | 「点一下。」 | 冷却内连点:invalid + inv_pulse |
|
||||
| 8~10s | 第二组回声 + 奖励音(levelup 低音量)= 第一次成功 | — | | |
|
||||
| 10~25s | 「听到这个声音,就是轮到你了。」→ 交话轮 →「朝前,滑一下。」 | 上滑前进 | 「滑一下。」 | 撞墙:bump + wall + wall_dir_front |
|
||||
| 25~40s | 「向左滑,转身走。」→ 转身声+脚步 | 左/右滑侧移 | 「滑一下。」 | 其他方向也走(D3 接受左右) |
|
||||
| 40~60s | 「房里有金币,走过去捡。」→ 拾金币 + onGoal | 四向滑动 | 三档提示 | 撞墙归因 |
|
||||
| 60~75s | 「迷路了,按住屏幕。」→ 帮助链(层/面朝/楼梯方位) | 长按 | 「按住屏幕。」 | 其他:inv_drill |
|
||||
| 75~90s | 「前面有东西!放心,它伤不到你。」→ 教学蝠逼近 | 听脚步 | 接管 | 乱动:战斗内纠错 |
|
||||
| 90~180s | 「听到动静,单击格挡。」→ 前摇单击格挡 →「现在单击,挥拳打它」至击杀 →「铁器的回声,就是下潜的楼梯」→ 自行走到楼梯 →「楼梯就在脚下。单击,下潜。」 | 单击 | 三档/接管 | 挥空:btl_swish 每场一次 |
|
||||
|
||||
节奏检查 ✓:3s 内脉冲;~8s 第一次成功(听懂回声);每 30s 有可听进展(金币/击杀/下潜);开场零规则念白(intro_1/intro_2 砍掉)。
|
||||
|
||||
## 7. 失败表
|
||||
|
||||
| 失败类型 | 判定 | 归因句 | 回到哪里 | 新手期代价 |
|
||||
|---|---|---|---|---|
|
||||
| 撞墙 | 目标格越界 | 首次 wall「那边是墙。」;每方向整局一次 wall_dir_{front,left,right,back},之后只 bump+invalid | 原地 | 无伤 |
|
||||
| 脉冲冷却 | 1.2s 内再点 | inv_pulse「回声还没回来,稍等。」(状态×手势一次) | 原地 | 无 |
|
||||
| 挥空 | 怪不在面前 | btl_swish 每场一次(之后只挥空声) | 本回合 | 无 |
|
||||
| 格挡失败 | 前摇内未点/未面对 | 「慢了。听到就点。」= tut_parry_miss(教学期);背后 = btl_behind 每场一次 | 下回合 | L1–2 怪打不死你 |
|
||||
| 转身无效 | 缠斗怪时左右滑 | btl_no_turn 每场一次,之后仅 invalid | 本回合 | 无 |
|
||||
| 死亡 | HP≤0 | die_cause_* 按 lastHit;die_adv_* 按真实格挡/逃跑账(critical 链,不许打断) | SETTLE→新周目,金币入 meta | 学期不可能死 |
|
||||
| 迷路 | 迷茫信号 | 接管 L1→L2→L3 | 原地 | 无 |
|
||||
|
||||
## 8. 台词表(类别标注;清单见 tools/voice_lines_26/dungeon.md)
|
||||
|
||||
- `critical`:d0_new(开场指令 <3s);死亡链 die_intro→…→settle_again 整链(结局,§4.6);通关链同
|
||||
- `content`:intro 砍掉后的教学链(tut_praise/tut_move/tut_side_move/tut_coin/tut_help_hold/tut_stairs/tut_mob/tut_attack…)、st_*(层/血/金/面朝/威胁)、evt_*、btl_*(遭遇/半血/击杀/战利)、unlock_*、settle_win_*、tut_stairs_on
|
||||
- `hint`:长按帮助链(st_floor/st_face/stair_dir_*)、gd_turn、btl_turn_short、hint_swipe、sys_first_tap(_short)、sys_continue_ask、stair_hint_a/b、menu_help
|
||||
- `feedback`:wall、wall_dir_*、inv_*(pulse/title/settle/drill/tel/menu_locked)、btl_swish、btl_behind、btl_no_turn、tut_parry_miss、die_cause_*、die_adv_*、sys_only_*、sys_demo、sys_now_you、menu_restart_confirm
|
||||
- 通用系统句与 storyline 逐字一致:sys_first_tap / sys_turn_teach / sys_say_again / sys_unlock_down / sys_unlock_dt(00 号 §5.2 阶梯表)。
|
||||
- 数字全分档整句不变(层 7 / 血 4 / 面朝 4 / 威胁 4 / 战利 3 / 死因 3 / 建议 3 / 元进度 3;
|
||||
金位 = meta_gold 3 档 + gold_some 真话句——旧上滑状态链的 st_gold_1..4 随链下线)。
|
||||
- 净变化:新增 35、修改 4、删除 25(明细见 `tools/voice_lines_26/dungeon.md`);127 → 137 句 ×2 性别。
|
||||
|
||||
## 9. 断点复述句
|
||||
|
||||
- 保存:拾取/战斗胜负/下潜/死亡/菜单保存/stop() 自动存(schema 1,summary 字段不变:`第{floor}层 · {血量档} · 金币{meta.gold} · 遗产{n}/5`)。
|
||||
- 回来:TITLE 播 sys_continue_ask → 交出话轮;单击 = 恢复 + 复述链 `[st_floor_N, st_hp_X, st_face_X, 楼梯方位句]`(窟主未清换 stair_hint_b)→ 回 ACTION;右滑 = 新周目(meta 保留,开局 sys_new_run + 同款复述链)。
|
||||
|
||||
## 10. 测试记录
|
||||
|
||||
- 无头 playtest:`tools/node/bin/node web/dungeon/test/playtest.mjs`,**11 场景 + 资产审计,
|
||||
断言 1551 条全绿、退出码 0**(2026-10-02,seed 42/2026 等种子复现)。覆盖:
|
||||
1. seed 复现与七层网格不变式(两次构造逐格相等 / 连通 / 楼梯=最远房 / 安全区 / 密度 / L1 教学硬约束);
|
||||
2. 新教学链 D0~D7 全走通 + 回声调度全扫描(全地板格 ×4 面向 ===grid 真值,含延迟/音量/侧向时序)+ 下潜复现;
|
||||
3. 四向相对移动矩阵 / 撞墙归因(wall + wall_dir_* 每方向一次)/ 脉冲冷却 invalid / 双击(阶段 3)冷却外再脉冲 / 长按帮助 / 呼吸层;
|
||||
4. 战斗数学(单击格挡 ×0.2 / 缠斗纠错 / 下滑逃跑 / Boss 拒绝 / 绕位背刺 / 半血 ATK+1 / 自动喝药);
|
||||
5. 死亡归因真话 + 遗产自动购置 + 结算 critical 链(在途手势全 busy)+ 菜单(左右滑换项 / 单击确认 / 重开二次确认);
|
||||
6. 断点复述(stop 自动存档 / continue_ask / 复述链 / 右滑新周目 meta 保留);
|
||||
7. 迷茫接管三级(静默 40s 起 L1 目标句 → 乱撞 L2 sys_only_* 只放行 → 连续无效 L3 演示+交回;进展事件清零重来);
|
||||
8. 屏蔽 voice 资产流程不卡死(_sayFlow/_drillChain 兜底);
|
||||
9. L1..L7 全网格回声一致性 + 贴身即接战;
|
||||
10. 管道契约(stateName / invalidHint / PIPELINE_OPTS = { swipeCore, longpressCore });
|
||||
11. §6.2 乱点机器人(150 步):无声操作 0 / 打断失败 0(防连点 busy 回执不计——§4.2 刻意抑制且已有可听反馈)/ 被动原句重复 0 / 首次操作 ≤10s / 首次成功 ≤20s。
|
||||
- 资产审计:静态引用 192 id 全量双格式(ogg+m4a)齐全;新句以 PENDING_VOICE 35 条虚拟资产
|
||||
模拟(照常播放可断言),主会话生成落地后清空清单即自动转实物断言(台词数断言 127 → 137,
|
||||
口径见 `tools/voice_lines_26/dungeon.md`「生成与验收」)。
|
||||
- 真人冷启动:待测。
|
||||
|
||||
## 11. 实现接线(引擎六模块,对齐 escape 参考)
|
||||
|
||||
- **装配**(game.js 构造器 + index.html):`this.receipts / this.floor / this.confusion /
|
||||
this.invalidHints(= new InvalidHints().bind(floor)) / this.ladder` 全部暴露;
|
||||
`audio.setRateBoostEnabled(false)`(长按=帮助是核心手势,不触发旁白快进)。
|
||||
`get PIPELINE_OPTS() = { swipeCore: true, longpressCore: true }`;index.html 照 escape:
|
||||
`makeInputPipeline({ floor, confusion, receipts, invalidHints, game, ladder, opts })` +
|
||||
`attachGestures(root, pipe, { doubleTapWindow: 0 })`。
|
||||
- **onGesture 收口**:返回 `'ok' | 'hold' | 'invalid' | 'silent-ok'`(移动=脚步声
|
||||
silent-ok;撞墙/冷却/步骤外=invalid;转身(玩家回合)=hold 不消耗回合)。
|
||||
`stateName()` → title/drill/explore/battle/tel/settle/menu/descend;`invalidHint(state, g)`
|
||||
→ inv_pulse / inv_title / inv_settle / inv_drill / inv_tel / menu_help / locked=null
|
||||
(四向+长按均核心,无锁态)。
|
||||
- **floor 状态流**:探索/教学自由步 `floor.enterAction()`(玩法声即状态);描述/归因/
|
||||
帮助链走 `floor.speak`(`_sayContent`,播完回 ACTION 或等待点);流程链 `_sayFlow`
|
||||
(自然播完或超时先到先推进,资产缺失不卡死);教学链 `_drillChain`(arm 有界兜底)。
|
||||
等待点 `WaitPoint`:drill0..7 / title / battle / settle / menu,全配 full/short/
|
||||
silenceMs/expected/onDemo(§5 表)。
|
||||
- **confusion**:record 由管道喂(新手门之前,锁定手势也喂信号);探索态静默喂信号
|
||||
40s 首次、每 8s 再喂(窗口内两记静默可累计权重 2);`onConfused → 等待点 takeover
|
||||
(wp.takeover)`,探索态/教学态走游戏侧 `_takeover / _drillTakeover`(三级,台账去重)。
|
||||
- **novice 阶梯**:D4 拾金币 = `ladder.onGoal()`(阶段 1;返回的 up 教学对四向玩法
|
||||
无意义,与 escape 同样忽略);死亡/通关 = `ladder.onGameDone()`(阶段 2/3),返回的
|
||||
teachLine(**已带 voice/ 前缀,2026-10 novice.js 修复后不要再加前缀**)接在结算链尾。
|
||||
- **存档**:schema 1、summary `第{floor}层 · {血量档} · 金币{meta.gold} · 遗产{n}/5`
|
||||
字段不动;拾取/战斗/下潜/死亡/菜单/stop() 自动存。
|
||||
|
||||
## 12. 偏差记录(与 26 号/16 号的落地差异及理由)
|
||||
|
||||
1. **D1 巩固步等待点不即时挂**:设计单口径「巩固等待立即挂上」,实现改为回声组落地
|
||||
(+1.3s)后播规则链、链播完才 yieldTurn——管道契约是「onGesture 返回时 floor 在
|
||||
YOUR_TURN 即视为完成当前等待点」,手势内同步 yieldTurn 的新等待点会被当已完成摘掉,
|
||||
随后 invalid 解释链播完无人恢复话轮(floor 停 BUSY 吞手势,D1 卡死根因)。0~1.3s
|
||||
窗口由回声组内容音覆盖;窗口内抢先单击照常成立(case 1 直答)。
|
||||
2. **孤儿 BUSY 看门狗**(`_healOrphanBusy`,800ms 周期,仅 stop() 停):引擎
|
||||
InvalidHints 解释链的 onDone 只在「挂着等待点」时恢复话轮,探索/教学自由步没有
|
||||
等待点,链播完 floor 停 BUSY——管道在 floor.handleInput 就拦下 busy,游戏层永远
|
||||
收不到手势。看门狗按当前态拉回规范态(探索=ACTION / 答题步=重挂等待点 / 前摇=
|
||||
ACTION / TITLE·SETTLE=重交话轮)。**引擎缺口**:InvalidHints/feedback 链结束后
|
||||
的状态恢复依赖调用方,建议引擎侧统一兜底(escape 用无条件 resumeTurn 达成同效)。
|
||||
3. **教学态接管不走 wp.takeover**:其 L2(restrictLine/short 兜底)无 30s 台账检查,
|
||||
会把刚说过的指令句原样重播,违反「被动原句重复 = 0」红线;改走游戏侧
|
||||
`_drillTakeover`(L1 短句 → L2 重教指令句 → L3 `_drillDemo`,全过台账)。
|
||||
**引擎缺口**:WaitPoint.takeover(2) 建议补台账去重。
|
||||
4. **战斗玩家回合转身返回 hold**:转身不消耗回合,hold 让管道 settleWaitPoint(false)
|
||||
保住战斗等待点(血量/敌方位长按链播完要回它;silent-ok 会把等待点当已完成摘掉)。
|
||||
5. **D4 推进走 1.6s 有界定时**:evt_coin 链被乱手势打断也不丢 onGoal/进 D5(对齐
|
||||
_sayFlow 兜底语义,步骤号先守恒)。
|
||||
6. **tut_praise 不进 D4 链**:原则 9 逐字重复禁令(D2/D3 已各一次「对。」),D4 直接
|
||||
布置任务 tut_coin。
|
||||
7. **遭遇自动面对落在 _encounter**:走进怪格/相邻扑来先把玩家面朝转到怪的方向
|
||||
(报名「就在你面前」即真话),保证 D6 单击格挡教学确定性(16 号 §5「遭遇自动面对」)。
|
||||
8. **btl_no_turn 补 onDone**:链播完回战斗等待点(无 onDone 会孤儿 BUSY,见偏差 2)。
|
||||
9. **教学不存步骤**:断点回来教学未完从头再练(16 号 §10 口径),DRILL 步骤不进存档。
|
||||
@@ -0,0 +1,140 @@
|
||||
# 26-apply · 《围猎》重构施工单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [23-hunt.md](23-hunt.md) 附录 C**(状态×手势矩阵、等待点表、
|
||||
> 首 3 分钟逐秒脚本、失败表、台词类别)。本文不重复正文,只记录实现接线、
|
||||
> 偏差、台词类别映射与测试结果。交互规则权威来源:
|
||||
> [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。
|
||||
> 台词增量清单:`tools/voice_lines_26/hunt.md`;登记副本 [23-hunt-voice-ids.md](23-hunt-voice-ids.md)。
|
||||
|
||||
## 1. 实现接线(web/hunt/)
|
||||
|
||||
**引擎六模块**(`web/engine/`,未改动):`HuntGame` 构造并暴露 `receipts / floor /
|
||||
confusion / invalidHints / ladder`;`invalidHints.bind(floor)`;`confusion.onConfused
|
||||
→ _onConfused`:有等待点走 `wp.takeover(level)`,WAVE 对局走本作三级(见 §3)。
|
||||
`audio.setRateBoostEnabled(false)`(长按=帮助,不触发旁白快进)。
|
||||
|
||||
**发言权**(§4.1):
|
||||
|
||||
| 场景 | Floor 状态 |
|
||||
|---|---|
|
||||
| TITLE / WAVE / TEACH 战斗 | `enterAction()`(BGM/怪 loop 即状态声) |
|
||||
| 波次播报 wave_bandN | `floor.speak`(可被出击打断:打断并执行),播完回 ACTION |
|
||||
| LOBBY / 波间休整 / END / LOST / 菜单 | `floor.speak(...)` 后 `yieldTurn(wp)` |
|
||||
| MATCHING | BUSY(等 joined;二周目填 intro_1/2,可跳句) |
|
||||
|
||||
**管道**(index.html 与 playtest 同一接线):`makeInputPipeline({ floor, confusion,
|
||||
receipts, invalidHints, game, ladder, opts })`,`opts = { swipeCore: true,
|
||||
longpressCore: true }`。**双击窗口分档**:`game.DT_CORE = ladder.stage() >= 3` 快照
|
||||
——stage < 3 时 `attachGestures(..., { doubleTapWindow: 0 })`(双击不存在,键盘回车
|
||||
折算 tap);stage ≥ 3 用默认窗口 + `doubletapCore: true`(游戏内分发:阶段 3 双击
|
||||
= 重听威胁档 threat_*;skillUnlocked(阶段 4)= 旋风斩,冷却中仍回威胁档)。阶段 4
|
||||
解锁:首次以 stage≥3 进入大厅播 `skill_teach` 一句并落盘 `progress.skillUnlocked`
|
||||
(「大厅全部解锁/专属教学」双口径中的专属教学路径;全项目大厅按钮走
|
||||
novice.js 既有 unlockAll)。
|
||||
|
||||
**onGesture 收口**:`'ok' | 'hold' | 'invalid'`(本作不用 silent-ok:出击/呼喊的内容
|
||||
音走 R4 队列可能延迟 >100ms,统一 ok 回执保「禁止静默」红线)。`stateName()`:
|
||||
title/matching/lobby/teach/wave/rest/end/lost/menu。`invalidHint(state,g)` 映射见
|
||||
game.js `INVALID_LINES`。
|
||||
|
||||
**教学波**(§4.10):joined(teach) → T0 `sys_first_tap`(critical,首句动手)→
|
||||
tap → T1 `tut_hit_full`(critical「朝叫声,滑。」+ 服务器放教学狼)→ 滑砍(错向
|
||||
miss → atk_swish + `miss_side`「在另一边。」)→ 首杀(`tut_kill_ok` + ladder.onGoal
|
||||
= 阶段 1)→ T2 `tut_call_full` → 呼喊 → bot help_ack → `tut_callout_ok` → T3
|
||||
`tut_help_full`(长按=我在哪,阶段 1 教学)→ `tut_done` → 等 ev wave 1。教学步进链
|
||||
全部 critical(<3s,警报经 `_alertVoice` 排队到链尾冲刷,R1 教学不可顶)。
|
||||
旧 intro_1/2/tut_rule 规则总述废除(反模式 6);无手动跳过(每步 L3 演示兜底)。
|
||||
|
||||
**等待点**(§4.4 三档;配置见 game.js `_introWp/_hitWp/_callWp/_helpWp/_restWp/
|
||||
_endWp`):intro(tap, 6s/15s, L3 替点)、teach_hit(四向, 8s/15s, L3 替出刀)、
|
||||
teach_call(tap, 8s/15s, L3 替喊)、teach_help(longpress, 8s/15s, L3 替播帮助)、
|
||||
lobby(tap, 8s/12s 服务器自动开局, L3 替发 start)、rest(无 full/short——静默只给
|
||||
提示音)、end(tap, 20s/45s)。**wave 等待点无 WaitPoint**:本波未出手 8s 一次 earcon
|
||||
(`_startWaveIdleFeed`),出手即停(「本波已出手则永不语音催」);静默信号照喂
|
||||
迷茫检测(权重 1,单独不触发接管)。
|
||||
|
||||
**WAVE 接管**(附录 C §7 迷茫行):L1 `gd_idle`「朝最响的滑。」→ L2 只放行最近怪
|
||||
弧(`_restrictArc`,其余 invalid 回执)+ `wave_only` → L3 `_demoKillNearest` 替玩家
|
||||
出刀(服务端裁决;教学狼 ≤2 挡自动放过契约保留)。
|
||||
|
||||
**手势语义**(附录 C §3/§4 全表落地,文件头有矩阵注释):
|
||||
四向滑恒出击(90° 弧;WAVE 内下滑=出击南弧不弹菜单);单击=呼喊(5s 节流,节流内
|
||||
invalid + `call_cd` 一次解释);长按=我在哪(hp 档 + 波次档 + `lp_act` ≤20 字;重复
|
||||
问更短,全说过则「再说一遍:」+ lp_act);菜单仅 TITLE/LOBBY/波间休整/END(左右滑
|
||||
换项、单击确认、长按重听、下滑关闭、回大厅二次确认 `sys_home_check`——原则 6);
|
||||
结算尾句 end_again critical(800ms 死窗由 critical 承担:ghost tap 得 busy/跳句,
|
||||
不重开)。
|
||||
|
||||
**断点复述**(§4.12,联机豁免口径):联机局不按单机节点存档——①断线 30s 内 resume
|
||||
回槽播 `net_back`「你回来了。朝叫声滑。」;②一局内被迫退出(房灭/断线超时→LOST、
|
||||
菜单回大厅、对局中 stop)→ `progress.unfinished` 标记,下次进 TITLE 播 `sys_recap`
|
||||
一句复述,summary 保留(`_markUnfinished` 在改 phase 前判定)。
|
||||
|
||||
**手势阶梯上报**:第一次击杀 `ladder.onGoal()`(阶段 1;**不播 sys_unlock_up**——
|
||||
hunt 上滑=出击北弧,「我在哪」教学由 T3 tut_help_full 承担);一局 END
|
||||
`ladder.onGameDone()`(第 1 局 sys_unlock_down / 第 3 局 sys_unlock_dt 追加在结算
|
||||
尾句后)。
|
||||
|
||||
**协议/拥挤/渲染全保留**:join/act/leave + joined/ev/snap/err、服务端权威怪表
|
||||
对账、三源声像(loop pan + 后半平面低通、生成呼啸、bot 喊话防区 pan)、R2 bot
|
||||
喊话调度、R4 one-shot 账目、断线 30s 回槽、评级双轴、进度 PUT——playtest Block
|
||||
0/6/7 与 23 号 §10 验收口径逐条复测通过。
|
||||
|
||||
## 2. 偏差记录(对照 23-hunt.md 附录 C)
|
||||
|
||||
| # | 偏差 | 理由 |
|
||||
|---|---|---|
|
||||
| 1 | critical 落在 T0 `sys_first_tap` 与 T1 `tut_hit_full` 等教学指令句,而非附录 C §8 单指的开场「朝叫声,滑。」 | §8 原意「开场关键句 <3s 不可打断」;T0/T1 指令句均 <3s,critical 期间点按/滑动给 busy 回执(不打断指令),狼逼近期 ≤1.8s,代价可忽略;换来教学链不被警报/乱点打碎的确定性 |
|
||||
| 2 | 结算链头(end_win→grade→kill_band→end_rank)可跳句可打断;只尾句 end_again critical | §4.6「critical 必 <3s」;800ms 手势死窗由尾句 critical 承担(ghost tap 跳句/回执,不重开) |
|
||||
| 3 | 冷却内连滑「其后静默」→ 每下都给 invalid 回执(软「咚」),震动仍仅每窗首拦 | 「呼喊节流拒绝/挥空必须出声,禁止静默」红线 + §6.2 无声操作=0;v2 S2 要消灭的是连环 error 震,回执是 120ms 轻音不构成噪声 |
|
||||
| 4 | 「乱滑计入迷茫但不放技能」保真;阶段 3 双击在非 WAVE = 重听当前等待点(lobby/end),WAVE = 重听威胁档 | §4.3 阶段 3「双击=重听」通用语义与附录 C §3「重听威胁档」战斗语义并存,按语境分发 |
|
||||
| 5 | 死窗/吞手势一律给回执(busy/invalid),不物理静默 | 同偏差 3 红线 |
|
||||
| 6 | 状态链旧 4 段(hp/波次/人数/击杀)压缩为长按 3 段(hp+波次+动作);人数移 LOBBY 长按、击杀档留结算 | 附录 C §3 阶段 1 原文「耐久档。波次。一个动作」≤20 字;人数/击杀不属「我在哪」 |
|
||||
| 7 | 危险状态身份 = danger_low 语音 + danger 震(不再有 guide danger 签名 earcon) | Guide 层整体退役(floor/receipts/hints/confusion 接管);每局一次的语音句自带状态身份,避免新增资产 |
|
||||
| 8 | WAVE 期一次击杀奖励句不播(kill_wolf 音效 + pickup 震即反馈);教学首杀播 tut_kill_ok | 原则 11 肯定 ≤4 字只用于教学;对局击杀高频,内容音即回报(R5 非语音信息 <1s) |
|
||||
| 9 | 「冷却中双击=重听威胁」在阶段 4 之前不存在:阶段 3 双击恒重听(含就绪态),不放技能 | 附录 C §3:阶段 3「仍不放技能」;阶段 4 才有就绪/冷却分叉 |
|
||||
| 10 | 菜单开着时 waveclear 只延长休整窗、不播 wave_clear | E3 菜单链不可被波间播报顶掉;wave_clear 下一波照常播 |
|
||||
| 11 | `sys_turn_teach` 不使用 | 交接提示音(floor 风铃)+ 等待声已承担「轮到你了」教学;不额外占一句 |
|
||||
|
||||
## 3. 台词类别映射(§4.6;全表见 23-hunt-voice-ids.md 与 tools/voice_lines_26/hunt.md)
|
||||
|
||||
- `critical`:sys_first_tap(T0 首句)、tut_hit_full / tut_call_full / tut_help_full
|
||||
(教学指令,均 <3s)、tut_kill_ok 后的步进链、tut_done、结算尾句 end_again
|
||||
- `content`:intro_1/2、room_wait、room_start、wave_band1-5、wave_clear、end_win/
|
||||
end_lose/grade_*/end_rank、net_*(回槽/断线复述)、sys_recap、skill_teach、
|
||||
sys_unlock_down/dt、sys_home_check、sys_menu
|
||||
- `hint`:tut_*_short、room_wait_short、sys_menu_short、end_again_short、lp_act/
|
||||
lp_title、threat_*(重听威胁档)、st_wave_*/team_*(长按查询段)、wave_only、
|
||||
gd_idle、skill_ready
|
||||
- `feedback`:atk_cd、call_cd、inv_swipe、inv_rest、miss_side、gd_invalid
|
||||
- 停用/删除:tut_rule、tut_attack、tut_callout、tut_skill、tut_skill_cd、
|
||||
tut_status、tut_breach、tut_skip、settings_hint(详见台词清单 §3)
|
||||
|
||||
## 4. 测试记录
|
||||
|
||||
- 无头 playtest:`tools/node/bin/node web/hunt/test/playtest.mjs` —— **255 断言全绿
|
||||
(退出码 0)**,覆盖:引擎 opts.pan 回归(Block 0)、教学波 §4.10(首句动手 +
|
||||
首杀 ≤10s + critical 不打断 + 零规则总述)、WAVE 战斗全表(裁剪/冷却/节流/呼喊/
|
||||
突入/危险/长按状态/休整窗/wave 等待点 earcon 纪律)、双击分档(阶段 3 重听威胁、
|
||||
阶段 4 旋风斩 + skill_teach)、菜单 E3 + 二次确认、结算 + ladder.onGameDone 解锁
|
||||
教学 + PUT summary 双轴、断线 resume/net_back/房灭/sys_recap 断点复述、snap 收敛、
|
||||
R2/R4 拥挤、设置边界、座 3 哨音、资产缺失 Floor 看门狗兜底、静态 id 审计。
|
||||
- **§6.2 乱点机器人**(Block 10,157 手势跑完 lobby→两波→终局→再来一局):
|
||||
无声操作 **0**、被动原句重复 **0**、打断失败 **0**(口径注记:①防连点 400ms 内
|
||||
吸收的快速重点(busy 回执)算一次逻辑交互,豁免;②警报类按事件计重复——每次
|
||||
突入是新信息,机器人编排按真实节奏注入)。
|
||||
- 节奏检查(§4.10):教学 T0 第一句即动手(critical ≤1.8s);首杀路径实测 9.6s ≤
|
||||
10s;每 30s 有可听进展(呼啸/loop 档变化/波次播报/结算)。
|
||||
- 真人冷启动:待测(§6.3,3-5 人)。
|
||||
|
||||
## 5. 已知限制 / 引擎缺口
|
||||
|
||||
- 引擎 `InvalidHints.explainOnce` 的 onDone 只恢复等待点:ACTION 语境(无等待点)
|
||||
的解释句若被打断,floor 会漏在 BUSY。本作以**实例级包装 `floor.handleInput`**
|
||||
自愈(TITLE/WAVE 无合法长驻 BUSY,输入前回 ACTION),未改引擎;若后续游戏同样
|
||||
需要,建议把「反馈句播完回调用语境」收进 InvalidHints(引擎侧小改)。
|
||||
- `Floor.speak` 的 id 必须带 `voice/` 层前缀(裸 id 被引擎静默丢弃,靠 Floor 看门狗
|
||||
3s 后推进,表现为丢句)——本作在 `_enterEnd` 踩过一次(tail 尾句),已修;静态
|
||||
审计不覆盖此类问题,值得加一条「speak 前缀 lint」进 harness。
|
||||
- 联机局断点复述是「一句话 + 重进匹配」口径(23 号 §9 原文),不回填对局中段;
|
||||
单机式存档恢复与联机豁免冲突,维持不改。
|
||||
@@ -0,0 +1,157 @@
|
||||
# 26-apply · 《守塔人》重构施工单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [21-keeper.md](21-keeper.md) 附录 C**(一句话核心动作、状态×手势
|
||||
> 矩阵、等待点配置表、首 3 分钟逐秒脚本、失败表——不在本文重复)。本文件是瘦版
|
||||
> 施工单:只写实现接线、偏差记录、台词类别映射、测试记录。台词登记见
|
||||
> [21-keeper-voice-ids.md](21-keeper-voice-ids.md) R2 增量节;清单见
|
||||
> `tools/voice_lines_26/keeper.md`。交互权威:
|
||||
> [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。
|
||||
> 范式对齐 [26-apply-storyline.md](26-apply-storyline.md)(纯叙事主参考)、
|
||||
> [26-apply-radio.md](26-apply-radio.md) 与 [26-apply-abyss.md](26-apply-abyss.md)
|
||||
> (叙事型 + 双音色组同型——KEEPER/SHORE 与 HOST/PROD 同构;pendingChoice 缓存、
|
||||
> 打断快照 `_chainSpeaking`、sessions 范式重点参考 abyss)。
|
||||
|
||||
## 1. 一句话核心动作
|
||||
|
||||
**听一夜值守,单击继续;听到选项时左右滑:守灯还是救人、说出还是守住。**
|
||||
|
||||
## 2. 实现接线(web/keeper/game.js + index.html)
|
||||
|
||||
六模块(§4.1/§4.2/§4.3/§4.4/§4.5/§4.12)全部接通,玩法核心(风暴夜时间轴
|
||||
INTRO→C1→CALM→C2→CALM→C3→p9→ENDING、回忆插叙三段、trust×truth 双标量、
|
||||
9 抉择 4 结局、KEEPER/SHORE 双音色 + NPC 三代声、800ms 级结算保护、底噪互斥
|
||||
vinyl/storm、雾角四处兑现、存档 summary)不动,交互层整体换成 26 号模式:
|
||||
|
||||
- **接线**:`this.receipts = new Receipts(audio)`、`this.floor = new Floor(audio)`、
|
||||
`this.confusion = new Confusion({ onConfused: (lvl) => waitPoint?.takeover(lvl) })`、
|
||||
`this.invalidHints = new InvalidHints().bind(this.floor)`、`this.ladder = new
|
||||
GestureLadder()`(叙事类长按不占用:`setRateBoostEnabled(false)`,新手期
|
||||
longpress 由管道判 invalid)。`index.html` 照 storyline 同构:
|
||||
`makeInputPipeline({ floor, confusion, receipts, invalidHints, game, ladder,
|
||||
opts: game.PIPELINE_OPTS })` + `attachGestures(root, pipe, { doubleTapWindow: 0 })`,
|
||||
启动遮罩保留。doubleTapWindow: 0 → 未解锁双击由管道折算成 tap。
|
||||
- **`onGesture` 返回值收口**(§4.2):`'ok'`(继续/抉择/菜单/状态)|`'hold'`
|
||||
(重听、菜单换项——等待点保留)|`'silent-ok'` 本作无(无即时内容音手势)|
|
||||
`'invalid'`(pipeline 给回执 + explainOnce + 迷茫信号 + settleWaitPoint(false))。
|
||||
- **语音链 = floor.speak(critical/kind)**:节点链全部改走 floor;拆链实现句级
|
||||
critical(abyss `_speakNodeVoices` parts 模式)。跳句/打断由 floor 收口:
|
||||
tap=consumed 跳本句、滑动=打断并执行、critical=busy——旧 PROMPT_RE 门 / 锚句
|
||||
空点 beat 震 / F4 恢复锁 / F5 交接尾句保护 / G5 首播锁被结构性消解。
|
||||
- **等待点(§4.4 附录 A)**:intro(6/15s)|continue(13/30s)|choice(25/50s,
|
||||
full=当前 pN 且链播即登台账)|settle(20/45s)|reopen(12/30s)|menu(20/45s)。
|
||||
三档提示 + 30s 台账 + 主动重听「再说一遍:」全在 engine/hints.js。
|
||||
- **开场 §4.10**:冷启动第一句 = `sys_first_tap`(critical 指令句,0~3s 动手);
|
||||
第一下单击 → `[b_open, b_rain]`(雾角挂 b_rain 播完)→ `b_goal` 极短目标 →
|
||||
continue 等待点;`sys_turn_teach` 挂 amo_a 链尾、「轮到你」状态声首现教学,
|
||||
`sys_skip` 挂 amo_b 链尾(radio z1_a/z1_b 先例)。**b_rule 开场规矩念白与
|
||||
gd_brief 操作念白废除**;重开新夜链 = sys_new_night → b_open → b_rain(雾角)
|
||||
→ b_goal,教学句不再播(原则 11)。
|
||||
- **手势阶梯(§4.3)**:第一次抉择(choose 首次)→ `ladder.onGoal()` 解锁上滑,
|
||||
「对。」(sys_praise)挂下一段链头、教学句挂链尾;第一结局(enterEnding)→
|
||||
`ladder.onGameDone()` 解锁下滑/第 3 局双击,教学句挂结局链尾。`teachLine()`
|
||||
已带 `voice/` 前缀,游戏侧直接引用不拼前缀。
|
||||
- **上滑「我在哪」(21 附录 C §3:时位句先行 → 信任档 → 一个动作)**:
|
||||
now 线 = `prog_m{act}` → `tr_{tier}` → `tru_{truth}` → 动作尾巴(choice 等待=
|
||||
status_choice / 其余= sys_hint_continue_full);MEMORY = `prog_mem_*` → `tr_*`
|
||||
→ `tru_*` → `sys_mem_back`;ENDING = 结局主句 → `tr_*` → settle 动作句。
|
||||
状态句全量 markHintSaid(原则 9);播完回原等待点(radio 口径 resumeTurn,
|
||||
档位计数保留),等待点不在(旁白被打断/自动流)则按来源重建,不重播节点。
|
||||
G6 顺序(prog → tr → tru)由 playtest 断言锁定;G2 的 tr_thin 附 warning 震
|
||||
保留首夜首幕豁免(自然起点不是警告)。
|
||||
- **断点复述(§4.12)**:每抉择结算、CALM/ENDING 进入、菜单「保存并回大厅」写
|
||||
`soundgame.progress.keeper`(含 timeline 时空位 + goalMet/turnTaught/skipHintShown
|
||||
教学标志;**summary 必带**;MENU 落盘记回原状态)。回来:sys_continue_ask 询问
|
||||
(tap=继续上次 / right=新风暴夜);MEMORY 存档恢复链 = prog_m → prog_mem →
|
||||
重播当前回忆句起链(首句 critical,F4 等价),≤5s 回到可玩。
|
||||
- **迷茫检测(§4.5)**:confusion 信号(含管道在 invalid 时 recordInvalid、等待点
|
||||
静默阈值喂 recordSilence)→ 当前等待点三级接管(L1 短句 → L2 只留期待手势 →
|
||||
L3 演示:intro/continue 替玩家走一步,choice 只复述方向不替选)。
|
||||
|
||||
## 3. 偏差记录(与 26 号手册 / 21 号附录 C 的实现偏差)
|
||||
|
||||
1. **800ms 结算死窗升级为整句 critical**(abyss 先例):结局链首句(e1~e4_a)、
|
||||
c3_dark(灯灭差分插播,auto+@x 尾句锁)、rev_teach(时空教学)、插叙锚句首播
|
||||
(rev_g1/g4、rev_f1/f5、rev_c1/c5)、恢复链首句(_resumeGuard)整句 critical
|
||||
——tap/滑动给 busy 回执不截链,覆盖旧 `_settleGraceUntil` 800ms 定时窗且更强。
|
||||
插叙入口 600ms 静默拍期间 floor=BUSY,手势同样 busy 回执(死窗语义等价)。
|
||||
2. **p* 选项句整句 critical**(radio 口径):p1~p7、p8_boat/p8_reef、p9a/p9b 首播
|
||||
不可跳(tap=busy),链播即 markHintSaid——被动提示永不逐字复述选项。21 附录 C
|
||||
§8 台词表把 p* 归 content 指内容属性;矩阵 §4「p* 首播不可跳」以 critical 落地。
|
||||
3. **旁白链滑动 = 缓存抉择 + 跳选项句**(abyss 模式,兑现矩阵 §4「缓存抉择,不
|
||||
盲选」):旁白(含被打断快照 `_chainSpeaking`)中 left/right 若落在抉择点
|
||||
(本节点 next 直入 p*),缓存 pendingChoice 并 playNode(p*);选项句整句 critical
|
||||
播完当刻缓存生效(ui_confirm → 结果节点,W2 契约 + 盲玩公平)。非抉择点滑动
|
||||
→ invalid + `_recoverInterrupted` 交回 continue 等待点(零无声死锁)。
|
||||
4. **MEMORY 打断恢复 = 重播当前回忆节点**:插叙是 auto 链不设等待点;滑动打断/
|
||||
双击重听/菜单关闭/上滑播完都从「当前回忆句」(memIdx,由 audio.play 钩子实时
|
||||
维护)重播起链,复播不锁锚句(G5 复播可掐);链末照常自动回返现在线。
|
||||
MEMORY 中 left/right = invalid(插叙无选择,21 附录 C §4)。
|
||||
5. **CALM 幕间为自动流(BUSY)**:链播中 tap=跳句(consumed)、空档手势=busy;
|
||||
滑动打断后不重交话轮——`_ensureWait` CALM 分支直接挂喘息定时器推进下一幕
|
||||
(radio BRIDGE 同款)。跨档 tr_* 账目在链构造时结清(radio enterBridge 口径;
|
||||
不再逐句起播钩子)。
|
||||
6. **等待声**:六等待点统一引擎合成「嘟—嘟」bed;插叙/幕间/危机拍为 BUSY 演出
|
||||
态无等待声(原「统一 8 音词表纪律、时空不换 earcon」继续成立——本作不新增
|
||||
任何 earcon,时空签名全靠内容层底噪/BGM/锚句)。
|
||||
7. **过渡音 idle 门简化**:memory_in/out、static_burst 只在语音空闲时播出(原
|
||||
「挂队句间补发」依赖游戏层句级钩子,floor 时代无此钩子;调用点全在链入口前,
|
||||
在播即丢弃,playtest 断言成对性不受影响)。
|
||||
8. **`_chainSpeaking` 打断快照为游戏层补丁**(abyss 同款):pipeline 的
|
||||
floor.handleInput 对滑动「打断并执行」先杀链置 BUSY,游戏侧 floor.speaking
|
||||
已 false——快照在 speak 置位、onDone/interrupt 清零,让被掐断的旁白链按矩阵
|
||||
落「旁白中」分支(上游修复后可撤)。
|
||||
9. **旧交互债务清除**:双击=重听节点旧口令废止(阶段 3 起=重听当前等待点完整句
|
||||
/当前回忆节点);菜单改 00 号 §5.4(左右滑换项 + 单击确认,旧「单击循环+双击
|
||||
确认」= 26 §7 反模式 5);guide 层看门狗双轨/无进展轨/sys_help 帮助溢出全部
|
||||
废止(三档提示 + 迷茫接管 + 手势阶梯取代)。
|
||||
|
||||
## 4. 台词类别映射(类别标注;增量清单见 `tools/voice_lines_26/keeper.md`)
|
||||
|
||||
- `critical`:sys_first_tap(开场 ≤3s 唯一指令);p1~p7、p8_boat/p8_reef、p9a/p9b
|
||||
选项句(整句,首播不可跳);rev_teach(时空签名教学,全局一次);插叙锚句首播
|
||||
六句(rev_g1/g4、rev_f1/f5、rev_c1/c5);c3_dark(灯灭差分);结局链首句
|
||||
(e1~e4_a);恢复链首句(F4 等价)。
|
||||
- `content`:b_*、c*、amo_*、rev_* 中段句、e*_b、ep_*、prog_m1..3、prog_mem_g/f、
|
||||
tr_deep/half/thin、tru_zero..full、lull_1/2、sys_turn_teach、sys_skip、
|
||||
sys_unlock_*、sys_new_night、sys_continue_ask、sys_menu、menu_help、
|
||||
sys_menu_resume/restart/lobby、sys_settings。
|
||||
- `hint`:sys_hint_continue_full/short、sys_hint_choice_short、sys_hint_again_full、
|
||||
sys_hint_menu_short、sys_only_choice、sys_demo_continue、sys_demo_choice、
|
||||
sys_mem_back、status_choice、sys_say_again(「再说一遍:」前缀,engine/hints.js
|
||||
播出)、sys_first_tap_short。
|
||||
- `feedback`:inv_nosel、inv_mem、inv_generic、inv_up_locked、inv_down_locked、
|
||||
sys_praise(「对。」首抉择链头)。
|
||||
- 音色组:系统/交互层句子全部 `_SHORE`(岸台值班员=系统音,与 radio PROD、
|
||||
abyss DECK 同型);剧情守塔人 `_KEEPER`、NPC 平铺(阿澈/父/祖)不动。通用系统
|
||||
句与 STORYLINE_LINES 的 sys_* 段逐字一致;键盘变体照 KEY_LINES["storyline"];
|
||||
多音字「重听」→「重新听/再听一遍」。
|
||||
- 完整登记(新增 24 / 修改 1 / 删除 8)见 `tools/voice_lines_26/keeper.md` 与
|
||||
[21-keeper-voice-ids.md](21-keeper-voice-ids.md) R2 增量节。
|
||||
|
||||
## 5. 测试记录
|
||||
|
||||
- 无头 playtest:`web/keeper/test/playtest.mjs` **272 断言全绿**(`tools/node/bin/node
|
||||
web/keeper/test/playtest.mjs` 退出码 0;`node --check web/keeper/game.js` 通过;
|
||||
`game.floor.bedEnabled = false` 防周期定时器不排水)。覆盖:§4.10 首 3 分钟
|
||||
(3s 内动手、critical 指令句、规则念白零播出、开局 40s 内听到阿澈);剧本 A~F 六路径
|
||||
四结局 + 信任/真相逐档验算 + 尾声回响差分;时空签名(vinyl 与 storm/room/engine
|
||||
播放区间零重叠、memory_in/out 成对 ×3、BGM 切换、危机拍前置 2s);上滑状态链
|
||||
G6 顺序(prog → tr → tru → 动作)与 tr_thin 首夜豁免;pendingChoice 时序
|
||||
(旁白滑动缓存 → 选项句播完 → ui_confirm → 结果句);锚句首播 critical /
|
||||
复播可掐;结算保护(结局链/c3_dark 首句 critical,幽灵手势不截链);等待点三档
|
||||
(continue 13/30、主动重听「再说一遍:」);迷茫接管三级;手势阶梯(阶段 1/2
|
||||
教学句挂链头/尾);§4.12 断点复述(ASK 左/右、MEMORY 恢复链时位句先行、F4
|
||||
恢复首句锁);菜单(左右滑换项 + 单击确认 + 插叙中开关菜单底噪不丢);CALM
|
||||
幕间打断后喘息照走;资产缺失续链(Floor 哨兵 3s 宽限);键盘变体路由;
|
||||
**§6.2 乱点机器人**:无声操作 0、被动原句重复 0、打断失败 0、第一次操作
|
||||
≤10s、第一次成功 ≤20s、乱按不锁死(零死锁收在合法等待态或结局);静态审计
|
||||
(无运行时 id 拼接、8 句废止台词零引用、20 条游戏引用新台词待生成豁免 +
|
||||
引擎侧 4 条入清单一致)。
|
||||
- 玩家感知转写:`web/harness/sessions/keeper.mjs` 已同步 26 号口径(开场第一下
|
||||
tap、floor.state 链级门控、菜单左右滑换项+单击确认、插叙中不动手——「回忆没有
|
||||
选择」、CALM/危机拍 BUSY 段等它走完),`tools/node/bin/node
|
||||
web/harness/transcribe.mjs keeper`(含 `--session sessionStress`)两剧本零死锁
|
||||
跑通(主线虚拟 290s 到 E1 灯与归人;乱按剧本 643s 同样走完结局链)。
|
||||
- 新语音资产(24 句 SHORE 组 + 键盘变体)由主会话统一生成;playtest mock 与真实
|
||||
资产解耦(voice 层按可用处理,Floor 哨兵兜底缺失)。
|
||||
- 真人冷启动:待测(26 §6.3,3~5 人)。
|
||||
@@ -0,0 +1,140 @@
|
||||
# 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 人)。
|
||||
@@ -0,0 +1,110 @@
|
||||
# 26-apply · 《节拍行者》重构设计单(26 号文档落地)
|
||||
|
||||
> 按 26 号文档附录 C 填写。交互规则权威来源:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。
|
||||
> 玩法权威来源:[24-rhythm-drummer.md](24-rhythm-drummer.md)(谱面 / 判定窗 / BPM / 解锁 / 评级 / 音色全部不动)。
|
||||
> 台词清单:[tools/voice_lines_26/rhythm.md](../../tools/voice_lines_26/rhythm.md);登记副本同步 [24-rhythm-voice-ids.md](24-rhythm-voice-ids.md)。
|
||||
|
||||
## 1. 一句话核心动作
|
||||
|
||||
**屏幕是一面 3×2 鼓组。领奏敲一小节,你在下一小节同一拍点敲同一面鼓。**
|
||||
|
||||
## 2. 玩家可感知的状态(3 个)与声音身份
|
||||
|
||||
| 状态 | Floor | 听感 | 来源 |
|
||||
|---|---|---|---|
|
||||
| 演奏(摸鼓 / 教学跟打应答窗 / 正片) | `ACTION` | 无鼓伴奏 + 鼓声音色(声像+音高)就是状态;点按即敲,无等待声 | §4.1 |
|
||||
| 演出(开场指令后探针之外无;教学指令 / 数拍 / 领奏示范 / 结算评级链) | `SPEAKING` / `BUSY` | 语音链(教学指令 critical);数拍与示范小节只有内容音,手势给 busy 回执 | §4.1 |
|
||||
| 等你(选曲 / 结算 / 菜单 / 续玩问询 / 教学跟打等待点) | `YOUR_TURN` | 交接提示音 → 等待声;教学跟打等待点关等待声(演奏语义,24 号 A27) | §4.1 |
|
||||
|
||||
首次教:`sys_turn_teach`「听到这个声音,就是轮到你了。」在曲目一第一个应答窗前随交接提示音一起出现(每账号一次)。
|
||||
|
||||
## 3. 新手手势表与解锁阶梯
|
||||
|
||||
| 手势 | 演奏 ACTION | 选曲 / 结算 / 菜单 | 解锁 |
|
||||
|---|---|---|---|
|
||||
| 单击(分区坐标,`immediateTap`) | 敲该区(判定 / 自由演奏出声) | 开始 / 再来 / 确认菜单项 | 阶段 0 |
|
||||
| 左 / 右滑 | `invalid` 回执(非音符,不出声) | 切曲(每项报名)/ 结算下一首 / 菜单换项 | 阶段 0 |
|
||||
| 上滑 | 状态查询一句(同长按) | 状态查询 / 帮助一句 | 阶段 1(第一次成功跟打,`ladder.onGoal()`) |
|
||||
| 下滑 | 阶段 2 前回执 `invalid`;阶段 2 后无条件暂停菜单 | 菜单 / 回大厅 | 阶段 2(一首曲子打完,`ladder.onGameDone()`) |
|
||||
| 长按 | 状态查询(曲目 / 段落 / 连击一句 ≤20 字;`setRateBoostEnabled(false)` 豁免快进) | 帮助 / 重听最近播报 | 阶段 0(本作核心手势,`longpressCore`) |
|
||||
| 双击 | 当单击(同区两记连续点按本来就是两次 tap,`doubleTapWindow: 0`) | 阶段 3 后重听最近播报(`sys_say_again` 前缀) | 阶段 3 |
|
||||
|
||||
键盘平行通道:Digit1–6 / 小键盘 1–6 = 六区,按下即发零延迟(`tapcancel` 撤销认领同步适用);空格落 BC 家区;选曲 / 结算 / 菜单态数字键不生效。
|
||||
|
||||
## 4. 状态 × 手势矩阵(新手期)
|
||||
|
||||
| 状态 \ 手势 | 单击(分区) | 左 / 右滑 | 上滑 | 下滑 | 长按 | 双击(未解锁) | 连点 / 乱滑 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 开场指令(SPEAKING,critical) | busy 回执 | busy 回执 | busy | busy | 状态句 | 折算单击→busy | busy |
|
||||
| 摸鼓探针(ACTION) | 敲区出声 + 首摸报名(silent-ok) | `invalid` 回执 | `invalid` 回执 | `invalid` 回执 | 状态句 | 敲区 | 每下都出声(探索礼物) |
|
||||
| 教学指令 / 数拍 / 领奏示范(SPEAKING critical / BUSY) | busy 回执 | busy 回执 | busy | busy | busy | busy | busy |
|
||||
| 教学跟打应答窗(YOUR_TURN,无等待声) | 敲区判定(silent-ok;错鼓=invalid+归因) | `invalid` 回执 | 状态句 | `invalid` 回执 | 状态句 | 敲区 | 合法连击(hold) |
|
||||
| 正片(ACTION) | 敲区判定(silent-ok;窗外自由演奏出声) | `invalid` 回执 | 状态句 | 阶段2=菜单 / 回执 | 状态句 | 敲区 | 合法连击 |
|
||||
| 选曲(YOUR_TURN) | 开始当前曲(未解锁=invalid+song_locked) | 切曲报名(30s 台账去重后只给提示音) | 帮助一句 | 阶段2=回大厅 / 回执+解释 | 帮助一句 | (阶段3)重听 | 400ms 防连点 busy |
|
||||
| 暂停菜单(YOUR_TURN) | 确认当前项 | 换项报名 | 重听菜单说明 | 关闭菜单恢复 | 重听菜单说明 | (阶段3)重听 | 400ms 防连点 busy |
|
||||
| 结算(YOUR_TURN) | 同曲再来 | 右=下一首(未解锁=invalid+song_locked;末位=restart 句) | 重听评级 | 阶段2=回大厅 / 回执 | 重听评级 | (阶段3)重听 | 只处理第一下 |
|
||||
| 续玩问询(YOUR_TURN) | 继续上次曲目 | 右=重新选曲 | 帮助 | 回执+解释 | 帮助 | (阶段3)重听 | 400ms 防连点 busy |
|
||||
|
||||
无空格:每一格都有回执或内容音;`invalid` 在演奏态只给回执不解释(应答内零语音,24 号 §0.5),在等待态首次附一句解释(原则 7)。
|
||||
|
||||
## 5. 等待点配置表
|
||||
|
||||
| id | 期待 | full | short | 静默阈值 | L2 | L3(onDemo) |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `select` | tap | select_full「单击,开始。」 | select_short「单击。」 | 18s/40s | 只留 tap | 提示音 |
|
||||
| `settle` | tap | settle_full「单击,再来一遍。」 | settle_short「单击。」 | 20s/45s | 只留 tap | 提示音 |
|
||||
| `menu` | tap/left/right | menu_help | menu_help | 20s/45s | 只留三手势 | 提示音 |
|
||||
| `reopen` | tap/right | sys_continue_ask | select_short | 18s/40s | 只留两手势 | 提示音 |
|
||||
| `tut_0`(家区跟打) | tap | tut_kick_full「家区在下中。点一下。」 | tut_kick_short「点下中。」 | 8s/16s | 只留 tap | 演示:游戏把本步音符敲一遍再交回 |
|
||||
| `tut_1`(左右下跟打) | tap | tut_sides_full「左下,再右下。」 | tut_sides_short「左右下。」 | 8s/16s | 同上 | 同上 |
|
||||
| `tut_2`(上排跟打) | tap | tut_top_full「上排三个,挨个敲。」 | tut_top_short「跟上排。」 | 8s/16s | 同上 | 同上 |
|
||||
|
||||
- 教学跟打等待点在应答窗开时 `yieldTurn` 且 `bedEnabled=false`(交接提示音响、等待声不响)——演奏语义(24 号 A27);窗到期评估完成/失败即摘点。
|
||||
- 摸鼓探针(T0)不是等待点:ACTION 自由探索,任意敲出声 + 首摸报名,摸 ≥3 区或 8s 无触摸自动进 T1(探索是礼物不是门槛,24 号 §6)。
|
||||
- 正片全曲 ACTION,不挂等待点、不挂等待声;应答小节内零语音(hint/feedback 播不出就丢,§4.6)。
|
||||
|
||||
## 6. 首 3 分钟逐秒脚本
|
||||
|
||||
| 时间 | 游戏说 / 播 | 期待玩家做 | 没做 | 做错 |
|
||||
|---|---|---|---|---|
|
||||
| 0~3s | 「点一下屏幕。」(critical)→ 摸鼓探针开(ACTION) | 任意敲 | 8s 自动进 T1(不卡流程) | 滑动:invalid 回执 |
|
||||
| 3~10s | 区音色 + 区名(第一次成功=第一声鼓);首摸后「摸到三个不同的地方,我们就开始。」 | 摸 ≥3 区 | 同上 | 重复摸:只出声不报名 |
|
||||
| 10~30s | T1「听我敲下中,你跟着敲。」→ 木鱼数拍 + 领奏示范(BUSY)→ 交接提示音 → 应答窗(YOUR_TURN 无等待声) | 敲家区 BC | 8s:tut_kick_full → short → 提示音 | 错区:区名归因 + 错鼓句 |
|
||||
| 30~60s | 「对了。」→ T2 左右下、T3 上排各一步(教一个马上用) | 跟打 | 三档 + 迷茫接管 | 2 败降速 25%;3 败跳步 |
|
||||
| 60~90s | 「很好,演出开始。」→ 选曲(select_hint + 曲名,等待声) | 单击开始 | 18s:select_full → 「单击。」 | 滑动切曲报名 |
|
||||
| 90~100s | 四下底鼓数拍 + 无鼓 BGM 起(ACTION);首应答窗前 1 小节「听到这个声音,就是轮到你了。」+ 交接提示音 | 听 → 跟敲 | 曲目继续(不掉血不中断) | 早/晚/错鼓分档归因 |
|
||||
| 100~180s | 曲目一前半(Perfect 叠亮音、连击 16 震、mid_song 过半播报) | 敲对区 | 连 2 Miss 才 gd_miss 一次(曲尾 3s 不插) | Miss=闷镲 + 归因 |
|
||||
|
||||
节奏检查 ✓:3s 内动手(第一句就是指令);首成功=第一声鼓(≤10s);每 30s 有可听进展(区名 → 教学步 → 曲目句)。
|
||||
|
||||
## 7. 失败表(24 号 §0.7 数字保留,归因口径 26 号化)
|
||||
|
||||
| 失败类型 | 判定 | 归因句(feedback,2s 内) | 回到哪里 | 新手期代价 |
|
||||
|---|---|---|---|---|
|
||||
| 没出手 | expected+GOOD+0.10s 无应答 | 教学:gd_miss_none + retry_listen;正片:闷镲(连 2 才 gd_miss,同曲一次) | 教学该步重演;正片歌继续 | 不中断、不扣 |
|
||||
| 早 / 晚 | 同区超 Perfect 仍在 Good | 教学:retry_early / retry_late + gd_miss_early / late;正片 Good 出声不纠 | 教学该步重演 | 无 |
|
||||
| 错鼓 | 异分区音符半窗内被敲 | 教学:retry_wrong + gd_miss_wrong;正片错区音色本身(配额内不叠语音) | 教学该步重演 | combo 清零 |
|
||||
| 教学 2 败 | 同一步失败 2 次 | gd_slow「我放慢一些。」×0.75 重演(每教学局 1 次) | 该步 | 再败跳过不卡死 |
|
||||
| 长按演奏期误触 | 按下≥450ms | 状态查询句(不判定、不归属) | 原地 | 无 |
|
||||
|
||||
归因真话律:没出手不说「慢了半拍」;归因句 `feedback` 类,应答小节内播不出就丢(§4.6);曲尾 3s 内不插 gd_miss。
|
||||
|
||||
## 8. 台词表(类别标注)
|
||||
|
||||
- `critical`:sys_first_tap(开场指令 <3s)、tut_z_kick / tut_z_sides / tut_z_patt(教学指令各 <3s)、tut_ok+下一条教学指令链、结算承诺段 restart(+解锁教学 sys_unlock_*)
|
||||
- `content`:welcome_back、tut_done、tut_probe、zone_*(首摸报名)、song*_name、song_locked、unlock_song2/3、grade_s/a/b/c、new_best_combo、mid_song、tut_fill、sys_turn_teach、sys_continue_ask
|
||||
- `hint`:select_full/short、settle_full/short、menu_help、tut_kick/sides/top_full/short、st_p1a..p3b、st_c1..3(长按状态查询)、rules、sys_say_again
|
||||
- `feedback`:retry_early/late/wrong/listen/skip、inv_generic、inv_down_locked、inv_up_locked
|
||||
- 沿用向导层 9 句(已在库):gd_answer、gd_count、gd_miss、gd_miss_early/late/wrong/none、gd_slow
|
||||
- 完整清单(新增 32 / 修改 7 / 删除 5 / 键盘变体 22):`tools/voice_lines_26/rhythm.md`。
|
||||
|
||||
## 9. 断点复述句
|
||||
|
||||
- 保存:进曲即写 `progress.lastSong`(曲目粒度,schema 1 加字段);一曲打完清除。
|
||||
- 回来:tutorialDone 且 lastSong 有效 → 先播状态声与 `sys_continue_ask`「上次的曲子没打完。单击继续,右滑重选。」再 `yieldTurn(reopen)`;单击=继续该曲(从头起拍,count-in 进场),右滑=重新选曲。
|
||||
- 暂停(菜单):泵停、BGM 记 offset;恢复全网格平移 = 暂停时长 + 4 拍 count-in(guide full 先播 gd_count,每曲 1 次)。
|
||||
|
||||
## 10. 测试记录
|
||||
|
||||
- 无头 playtest:`web/rhythm/test/playtest.mjs`(判定窗 / 错鼓 / 超时 / tapcancel 撤销 / 双击两连击 / 数拍 / 加花 / 评级解锁 / 进度 summary 等玩法断言保留适配;新增 26 号断言:开场首句 critical 动手、演出期 busy 回执、ACTION 无等待声、等待点台账、§6.2 乱点机器人:无声操作 0 / 被动原句重复 0 / 打断失败 0)。
|
||||
- 真人冷启动:待测。
|
||||
@@ -0,0 +1,113 @@
|
||||
# 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 人)。
|
||||
@@ -0,0 +1,90 @@
|
||||
# 26-apply · 《盲航》重构施工单(26 号文档落地)
|
||||
|
||||
> 设计单正文见 04-space-rebuild.md 附录 C,本文是施工记录。交互规则权威:
|
||||
> [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)(施工口径
|
||||
> [00-global-ux.md](00-global-ux.md))。台词增量见
|
||||
> [04-space-voice-ids.md](04-space-voice-ids.md) R6 节与 `tools/voice_lines_26/space.md`。
|
||||
|
||||
## 1. 实现接线(状态 → Floor 态、等待点、接线面)
|
||||
|
||||
| 游戏状态(phase) | Floor 态 | 等待点 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `drill` 指令在播 | SPEAKING(**critical**) | — | 手势一律 busy 回执(不跳句、不打断);指令 ≤3s |
|
||||
| `drill` 演练陨石悬置 | YOUR_TURN | `d1_left`~`d4_down`(04 §0.5 表:full=指令句、short=`d_short_*`、静默 6s/15s、L2 只认该方向、L3=onDemo 演示拨开) | whoosh 即威胁声;帮助=长按不闭窗 |
|
||||
| `playing` | **ACTION**(`enterAction()`,不起等待声) | 无(刷怪节奏即状态声) | 玩法语音走游戏层语音队列(见 §2) |
|
||||
| `playing` 归因/里程碑/护盾在播 | SPEAKING(经队列) | 无 | 滑动打断并闪避;tap 跳句 |
|
||||
| `over` 结算链 | SPEAKING(成绩链 content → 承诺段 critical) | 链播完 `yieldTurn(settle)` | settle:tap=再飞,down(阶段 2)=菜单,长按/双击=重听 |
|
||||
| `menu` | SPEAKING → YOUR_TURN | `menu`(tap/left/right) | 左右滑换项报名、单击确认、长按重听菜单说明 |
|
||||
| `ask` / `reopen` | SPEAKING → YOUR_TURN | `ask`(tap/up)、`reopen`(tap/right) | 回访者「点一下出发」;断点「继续/重开」 |
|
||||
| `leaving` | SPEAKING(确认句) | — | 播完或 2.5s 看门狗跳大厅 |
|
||||
|
||||
构造暴露:`this.receipts / floor / confusion / invalidHints / ladder`;
|
||||
`invalidHints.bind(floor)`;`confusion.onConfused → _takeover`(对局三级接管);
|
||||
`onGesture` 返回 `ok|hold|invalid|silent-ok`;`stateName()`;`invalidHint(state,g)`;
|
||||
`PIPELINE_OPTS = { swipeCore: true, longpressCore: true }`;`DT_CORE`(双击窗口分档快照)。
|
||||
index.html:`makeInputPipeline` 接线;`ladder.stage() >= 3` 时默认双击窗口 +
|
||||
`doubletapCore: true`(双击=护盾),否则 `{ doubleTapWindow: 0 }`(双击折算 tap)。
|
||||
visibilitychange:隐藏 `game.stop()`(自动存档);回前台 `game.start()` 走断点复述。
|
||||
|
||||
**对局语音队列(`_say`/`_pumpVoice`,26 §4.6 优先级 + R5-2 保留)**:一条链一条链播。
|
||||
`interrupt`(dir 呼喊)= 生存优先,立刻顶断当前链,被顶断的 `defend` 包
|
||||
(hit_*、hit_last、protect_end)整链重排一次;`defend`(归因)排在呼喊后、内容前;
|
||||
其余(里程碑/护盾/教学/帮助)FIFO;`protect` 包去重(上一句在播即跳过 + 30s 台账)。
|
||||
玩家手势打断链 = 该包作废(原则 5)。26 号 §6.2 的「打断失败」指标由
|
||||
ACTION 态直通 + 呼喊豁免保证。
|
||||
|
||||
## 2. 与 04 号文档的偏差记录
|
||||
|
||||
1. **演练指令/纠错/带过链全部 critical**:04 §0.4 矩阵列「演练指令 critical 行」的
|
||||
长按格写「帮助」,引擎 critical 对所有手势一律 busy(floor.js 语义),无法豁免
|
||||
单一手势。指令 ≤3s,事后长按立即可用。取舍理由:流程驱动句被打断会卡死演练
|
||||
(onDone 不触发 → 不 spawn),critical 是唯一稳妥解。
|
||||
2. **round2 R2「hit_last 在播期间呼喊抑制」简化为「hit_last 一并走防顶断登记」**:
|
||||
Floor 单链模型下抑制呼喊会饿死生存信息(逼近最短 2.0s);hit_last(defend)
|
||||
被呼喊顶断后整链重排一次,保证完整送达,语义等价且更简单。
|
||||
3. **演练陨石 spawn 不再同窗播 dir 呼喊**:04 §2 流程表无此件(指令刚说过方向,
|
||||
语音先、音效后不叠)。实战呼喊保留(round4 R1 反应窗口起点不动)。
|
||||
4. **双击窗口分档在页面加载时快照**(`DT_CORE = ladder.stage() >= 3`):会话中途
|
||||
跨过阶段 3 的玩家本会话双击仍折算 tap(attach 不可热换),下局页面重进生效。
|
||||
5. **新手锁血的归因说 hit_<dir> 而非 protect_<dir>**(04 §0.7「撞击(保护后)」行):
|
||||
锁血发生在保护期外,说「训练护盾接住了」是假话;说真话(方位 + 正确滑向)。
|
||||
6. **`second_run_ask` 保留「上滑重听演练」**:04 §2「回访者:点一下出发」为主体,
|
||||
上滑在 ask 态不与玩法冲突(对局中 up 才是闪避),保留为可选重听入口。
|
||||
7. **断点续玩/暂停恢复共用裸飞缓冲**(前 3 颗 4.0s 慢速)作 count-in:04 §0.9 要求
|
||||
「一颗慢速预告」,实现为三颗(round2 R2 恢复缓冲机制复用),更软,不更硬。
|
||||
8. **help 经长按一句(lp_run)**;菜单「教学要点」项播 help_recap(改版口径,不含
|
||||
加速/护盾——未解锁前不教第二件事)。
|
||||
9. **里程碑档位 10/25/50/100** 沿用既有资产(04 §5 行文「10/20/30/40/50」与其自身
|
||||
语音表 M 组不一致,以语音表为准;「超出不播」照办)。
|
||||
10. **向导层(engine/guide.js)整体退役**:Floor + 等待点 + 迷茫接管替代;
|
||||
gd_hit_hint / gd_last_life 删除(hit_<dir> / hit_last 已覆盖,避免双句说一事)。
|
||||
|
||||
## 3. 台词类别映射(增量见 04a R6 节 / tools/voice_lines_26/space.md)
|
||||
|
||||
- `critical`:drill_left/right/up/down(演练指令)、drill_retry_*、miss、drill_moveon、
|
||||
drill_good、lp_teach + sys_turn_teach 链、drill_done、restart_hint(结算承诺段)。
|
||||
- `content`:feat_boost / feat_shield(解锁教学)、protect_end、ms_*、time_*、dodge_*、
|
||||
new_record、resume_recap、sys_unlock_down、menu_*(除说明句)、help_recap。
|
||||
- `hint`:protect_soon、lp_run、hint_swipe、d_short_*、hint_tap、resume_ask、
|
||||
sys_say_again(前缀)、sys_demo、sys_now_you。
|
||||
- `feedback`:hit_*、hit_last、protect_*(吸收教学)、inv_tap、inv_whiff、
|
||||
boost_not_ready、feat_shield_done(护盾不可用应答)、shield_block、shield_ready。
|
||||
- 去重台账(`markHintSaid`,原则 9):指令/询问/菜单/承诺句播出即登记;protect_*
|
||||
同方位 30s 不重播;纠错句(drill_retry_*)与 drill_moveon 30s 不重播;
|
||||
MarkingWaitPoint 子类给 L1/L2 接管句补登记(hints.js 不动)。
|
||||
|
||||
## 4. 测试记录
|
||||
|
||||
- 无头 playtest:`tools/node/bin/node web/space/test/playtest.mjs` **102 断言全绿
|
||||
(退出码 0,连跑 3 次确定通过)**。覆盖:§4.10 首三分钟(第一句 = D1 指令、
|
||||
第一次成功 1.2s、没出手「没拨到」、2 次后演示通过)、保护期(吸收归因 + R5 去重 +
|
||||
protect_soon/protect_end)、对局核心(早滑不吞、断崖过渡、新手锁血、第 3 次失败
|
||||
降难度、hit_last、R5-2 呼喊顶断重排、坠毁结算链 + settle 等待点 + sys_unlock_down)、
|
||||
菜单(左右滑 + 单击确认、回大厅收尾)、第二局(加速解锁教学 + 冷却拒绝出声)、
|
||||
断点复述(resume_ask/recap + count-in)、资产缺失看门狗、
|
||||
**§6.2 乱点机器人:无声操作 0/46、打断失败 0、被动原句重复 0**(dir 呼喊为
|
||||
玩法内容音不计重复;打断指标用 voice token 同一性判定,critical/呼喊豁免)、
|
||||
资产引用校验(新增 18 id 白名单 = 待生成,存量零缺失)。
|
||||
- 会话转写:`tools/node/bin/node web/harness/transcribe.mjs space` 跑通(359 行,
|
||||
虚拟 114s;新增 id 待生成资产前转写标注静默,属预期)。
|
||||
- 真人冷启动:待测(26 §6.3,3~5 人)。
|
||||
@@ -0,0 +1,136 @@
|
||||
# 26-apply · 《深夜茶馆》重构设计单(26 号文档落地)
|
||||
|
||||
> **设计单正文见 [20-teahouse.md](20-teahouse.md) 附录 C**(一句话核心动作 / 三态 /
|
||||
> 手势表 / 状态×手势矩阵 / 等待点表 / 首 3 分钟 / 失败表——本文件不重复,两处冲突
|
||||
> 以本文「偏差记录」节为准)。本文是 26 号深度重构的**施工单**:实现接线、偏差记录、
|
||||
> 台词类别映射、测试记录。台词登记见 [20-teahouse-voice-ids.md](20-teahouse-voice-ids.md)
|
||||
> R2 增量节;清单见 `tools/voice_lines_26/teahouse.md`。
|
||||
> 交互权威:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)、[00-global-ux.md](00-global-ux.md)。
|
||||
> 范式对齐 [26-apply-radio.md](26-apply-radio.md)(叙事型接线参考)与
|
||||
> [26-apply-storyline.md](26-apply-storyline.md)。
|
||||
|
||||
## 1. 实现接线
|
||||
|
||||
- **输入管道(§4.2/§4.3)**:`web/teahouse/index.html` 与 storyline 同构——
|
||||
`makeInputPipeline({ floor, confusion, receipts, invalidHints, game, ladder })`
|
||||
+ `attachGestures(root, pipe, { doubleTapWindow: 0 })`(关双击窗口:时机步单击
|
||||
即时生效,无 300ms 延迟;键盘回车发的 doubletap 由管道折算 tap)。
|
||||
- **game.js 暴露**:`this.receipts / this.floor / this.confusion / this.invalidHints`
|
||||
(`bind(floor)`)/ `this.ladder`;`onGesture(g)` 返回 `'ok'|'hold'|'invalid'|'silent-ok'`;
|
||||
`stateName()`(TITLE/OPENING/SERVE/CLOSE + BREW 细分 TEA/WATER/STEEP + MENU/SHOP);
|
||||
`invalidHint(state, g)`(原则 7 每格一句;WATER/STEEP 返回 null=只回执)。
|
||||
- **发言权层(§4.1)**:营业态自动链全部走 `_speakFlow` 包装(floor.speak + 续接点
|
||||
`_flow`)。管道对滑动统一「杀链后交给游戏」——floor.speaking 在 onGesture 入口
|
||||
已为 false,所以**打断续接一律无条件 `_popFlow()`**(有自动流=刚被打断),这是
|
||||
teahouse 改造的关键接线(被杀链的「迎下一位客人/进灶/反应链收尾」立即续上,
|
||||
流程不失速)。
|
||||
- **CONFUSION 接管**:`confusion.onConfused(lvl) → floor.waitPoint.takeover(lvl)`;
|
||||
`record` 在管道新手门之前(引擎 2026-10 修复版)。L3 替打口径见附录 C §5:
|
||||
intro 替点 / tea 替选点单那罐 / water 替提壶(拨到将沸窗中点)/ steep 替出汤 /
|
||||
close 与 reopen 只提示音。
|
||||
- **等待点(§4.4)**:`SILENCE` 表 + `_introWp/_reopenWp/_teaWp/_timingWp/_closeWp/
|
||||
_menuWp/_shopWp/_drillWp`;三档与 30s 台账由 `engine/hints.js` 统一实现。
|
||||
- **手势阶梯(§4.3)**:`ladder.onGoal()`(第一盏茶送出,D4 反应链尾)→ 阶段 1
|
||||
教学句挂 D5 链首;`ladder.onGameDone()`(第一晚睡下)→ 阶段 2 教学句挂下一晚
|
||||
开场链首;阶段 3(累计 3 局)解锁双击=重听(点单/茶名/开工问询),未解锁由管道
|
||||
折算 tap。`teachLine()` 返回带 `voice/` 前缀 id 直接进链。
|
||||
- **E3 加速**:进 BREW `audio.setRateBoostEnabled(false)`(全态关加速,长按不快进、
|
||||
时机窗不许倍速听);出灶(结算/堂前)恢复 true。
|
||||
- **教学寄生首晚(§5 单击版)**:D0 左右滑看柜(换罐即教选定,做中学)→ D1 单击
|
||||
选定 → tut_water 说完才起水声(听觉分层:注水/教学时间上串行)→ D2 窗内单击
|
||||
提壶 → D3 窗内单击出汤 → D4 单击端茶(反应链前停住等玩家)→ D5 上滑状态链 →
|
||||
tut_done,drillDone 落盘。偏手真话归因重教,2 次后替打,90s 无进展自动替打。
|
||||
已 drillDone 玩家开场 `sys_tap_start`(不念教学、不念 intro)。
|
||||
- **断点复述(§4.12)**:每位客人结算后 `_saveAuto()`(PUT /api/progress,summary
|
||||
必带:第 N 晚 · 客人 x/4 · 口碑档 · 存款/欠账);回来 `sys_continue_ask` →
|
||||
单击 = 复述链(客人序 → 口碑档 → [BREW 中断:sig+点单句] → recap_go)→ 当前
|
||||
客人从进门链重放;右滑两次 = 重开确认(sys_reset_ask)。
|
||||
- **菜单(00 §5.4)**:左右滑切项每项报名 + 单击确认 + 上滑重听说明 + 下滑关闭;
|
||||
BREW 内开菜单冻结水声/滴答时间线(elapsed 停表),关闭恢复并播一句复述
|
||||
(hint_water / 茶名)。打烊后菜单多一项「打烊置办」(二级列表,置办真话门
|
||||
upg_none/upg_lock)。
|
||||
|
||||
## 2. 偏差记录(对 20 号附录 C)
|
||||
|
||||
1. **timing 等待点 full/short 置空**(附录 C §5 water/steep full 写了
|
||||
「听到细密泡,点一下。」):实现取 null——分层铁律(26 §3.3 / 20 §3.3
|
||||
「时机窗内禁止向导语音」)优先,被动档与迷茫 L1 只剩交接提示音;那句教学职责
|
||||
由 tut_water/ tut_steep 承担(critical,播完才起水声/滴答时间线,时间上串行)。
|
||||
playtest 断言「WATER/STEEP 时机窗内 voice 播放事件 = 0」。
|
||||
2. **堂前链播中左/右滑 = 打断并推进**(附录 C §4 写 invalid):26 §4.1 管道统一
|
||||
裁定「滑动=打断并执行」优先于旧格;只有堂前链间空档的滑动才 invalid
|
||||
(inv_serve_swipe 首次解释)。被打断的迎客/进灶调度立即续上,不杀流程。
|
||||
3. **上滑状态链第一段(重播点单)覆盖堂前与灶上**:附录 C 只写 BREW;实现里
|
||||
只要客人未走(堂前点单链播中/空档、BREW 全程)上滑都先「再说一遍:」+ 点单句
|
||||
(sig 音随行),需求随时可查(原则 3)。
|
||||
4. **菜单关闭重播被停链 = 从链首重播**(非「从被停句续播」):下滑先经管道
|
||||
`floor.handleInput` 杀链,此后 `floor.currentId()` 不可查(引擎缺口,见 §5);
|
||||
盲玩语义「节点不丢」按完整重听算(被停链整条重播,玩家不丢任何一句话)。
|
||||
5. **教学跳过入口裁定为「无入口」**:附录 C §3「教学跳过仅 TITLE/OPENING 未入
|
||||
泡茶前用帮助长句」——实际形态下 sys_help 仅从菜单(阶段 2 解锁,时点必已
|
||||
drillDone)可达,且教学七步有 90s 自动替打保送、已 drillDone 玩家开场直接
|
||||
sys_tap_start 不进教学,「跳过教学」不再有真实需求。sys_help 保留为菜单帮助项
|
||||
(动作词全部换「点一下」口径重录)。
|
||||
6. CLOSE 800ms 死窗 + 结算链锁(critical 整链手势一律 busy)+ `settle_night`
|
||||
链尾交出睡下等待点——与附录 C §4 一致,无偏差;死窗内 ghost 手势不算输入。
|
||||
|
||||
## 3. 台词类别映射
|
||||
|
||||
增量清单(新增 14 / 修改 10 / 删除 5)见 `tools/voice_lines_26/teahouse.md`,
|
||||
登记副本见 [20-teahouse-voice-ids.md](20-teahouse-voice-ids.md) R2 增量节。类别口径:
|
||||
|
||||
- `critical`(不可打断,busy 回执):sys_first_tap、sys_tap_start(开场指令);
|
||||
tut_d0/tut_tea/tut_water/tut_steep/tut_serve(教学指令 = 规则唯一一次说明);
|
||||
brew_start(单句短链,防滑动打断后预览失联);res_good/plain/wrong(结果关键句);
|
||||
rent_due/rent_short(账目关键句);sys_continue_ask/sys_reset_ask(问询句);
|
||||
打烊结算链整链(close_open → close_coin_* → [debt/rent/chapter] → settle_night)。
|
||||
- `content`:night_*、intro_1/2、serve_link/bridge_*、amb_*(氛围客转述)、
|
||||
st_guest/rep/purse(状态链)、tea_*(口诀随身)、settle_night、upg_*、
|
||||
sys_turn_teach、sys_unlock_up/down/dt(阶梯教学句)、hint_water(菜单回灶复述)、
|
||||
recap_go、反应链 NPC 句(sig_* 为 sfx 不占)。
|
||||
- `hint`:wp_tap_short(intro/reopen/close/drill 的 _short 档)、wp_tea_full/
|
||||
wp_tea_short、wp_up_short(D5)、gd_close(close 等待点 full 档复用)、
|
||||
sys_say_again(主动重听前缀,全项目一句,资产每游戏各存一份)。
|
||||
- `feedback`(idle-only,原则 7 每格一次):water_early/ok/late、steep_early/ok/late
|
||||
(判定即归因,2 秒内真话)、inv_up_locked/inv_down_locked/inv_serve_swipe、
|
||||
gd_invalid(TITLE/OPENING/CLOSE 滑动、长按)。
|
||||
- 引擎播出(`engine/novice.js teachLine` / `engine/hints.js requestReplay`):
|
||||
sys_unlock_up/down/dt、sys_say_again——资产照常落 `web/teahouse/audio/voice/
|
||||
{female,male}/`。
|
||||
- 废止口径(26 §7 反模式 5 / §4.10):「双击提壶/双击出汤」(tut_water/tut_steep
|
||||
旧文)、「双击动手」(tut_skip)、「单击切换,双击确认」菜单(sys_menu 旧文)、
|
||||
intro_3 规则念白、tut_status/gd_serve/gd_brew 旧看门狗——全部停用或重录。
|
||||
|
||||
## 4. 测试记录
|
||||
|
||||
- **无头 playtest**:`web/teahouse/test/playtest.mjs` **216 断言全绿**
|
||||
(`tools/node/bin/node web/teahouse/test/playtest.mjs` 退出码 0)。覆盖:
|
||||
§4.10 开场链与教学七步(D0–D6,单击版)+ 二周目 drillDone 开场;§4.1/§4.2
|
||||
交互矩阵(跳句 ok/防连点 busy/滑动打断并推进/关键句 busy);手势阶梯三解锁
|
||||
(含链播中下滑开菜单);判定三元组 9 组合 + 水声 700/350ms 与滴答时间线 +
|
||||
超时自动过老/自动出汤;分层铁律(WATER/STEEP 窗内 voice=0);剧本 A 五晚逐晚
|
||||
对账(27/35/31/56/49 文 + 口碑跨档双向 + 置办三件 + chapter_end)与剧本 B
|
||||
贴钱营业(debt 20→9→clear→17,无 game over);CLOSE 800ms 死窗 + 链锁;
|
||||
三档提示 12s/30s 与迷茫接管 L1/L2/L3(替提壶拨将沸);断点复述(BREW 中断
|
||||
存档带 inBrew、复述链序、summary 规则);菜单/置办真话门/E3;键盘变体候选链;
|
||||
**§6.2 乱点机器人**(无声操作 0 / 被动原句重复 0 / 打断失败 0 / 首操作 ≤10s /
|
||||
首成功 ≤20s,走完第一晚打烊);资产缺失 Floor 哨兵兜底;静态审计(全部播放
|
||||
id 在台词表内、无未捕获异常)。
|
||||
- **玩家感知转写**:`web/harness/sessions/teahouse.mjs` 已同步 26 号口径
|
||||
(单击提壶/出汤、菜单左右滑+单击确认、教学不可跳、`floor.state` 链级门控、
|
||||
打烊段等待态收束),`tools/node/bin/node web/harness/transcribe.mjs teahouse`
|
||||
(含 `--session sessionStress`)两剧本零死锁跑通:主线虚拟 243s(教学零替打、
|
||||
三客全 good、上滑对账、睡下进 N2);乱按 276s(标题乱划、教学乱试探、心急
|
||||
提前提壶被真话归因、菜单乱逛、照样走到打烊睡下)。
|
||||
- 真人冷启动:待测(26 §6.3,3~5 人)。
|
||||
|
||||
## 5. 引擎缺口(报主会话)
|
||||
|
||||
- **floor.killChain 后不暴露被杀链进度**:`Floor.handleInput` 对滑动先
|
||||
`_killChain()`(`_chain = null`),游戏侧随后 `currentId()` 恒 null,菜单
|
||||
「从被停句续播」无法实现(本次按「从链首重播」落地,见偏差 4)。建议 floor
|
||||
保留 `_lastKilled = { ids, i }` 并暴露 `lastKilledChain()`——所有走「下滑开
|
||||
菜单停链」语义的游戏受益。
|
||||
- 其余六模块(floor/receipts/hints/confusion/novice/pipeline)本轮无缺口:
|
||||
pipeline `doubletapCore` 选项、novice `teachLine` 带 voice/ 前缀、confusion
|
||||
record 前置新手门,均已按 2026-10 修复版接线。
|
||||
+20
-4
@@ -17,13 +17,29 @@
|
||||
| [13-playtest-criteria.md](13-playtest-criteria.md) | 乱点机器人、矩阵、真人冷启动、玩法回归 |
|
||||
| [14-guide-layer.md](14-guide-layer.md) | Floor / 三档提示 / 迷茫接管;旧 gd_* 资产对照 |
|
||||
|
||||
## 首批落地设计单
|
||||
## 施工单(26 号落地,15 款全部完成)
|
||||
|
||||
首批三款为完整设计单(无独立正文的以施工单为设计正文);其余 12 款为瘦版施工单(实现接线 + 偏差记录 + 台词类别映射 + 测试记录,设计单正文见各游戏号附录 C):
|
||||
|
||||
| 文档 | 游戏 |
|
||||
|---|---|
|
||||
| [26-apply-storyline.md](26-apply-storyline.md) | 声命线 |
|
||||
| [26-apply-escape.md](26-apply-escape.md) | 暗室 |
|
||||
| [26-apply-simon.md](26-apply-simon.md) | 音序回响 |
|
||||
| [26-apply-storyline.md](26-apply-storyline.md) | 声命线(完整设计单) |
|
||||
| [26-apply-escape.md](26-apply-escape.md) | 暗室(完整设计单) |
|
||||
| [26-apply-simon.md](26-apply-simon.md) | 音序回响(完整设计单) |
|
||||
| [26-apply-rpg.md](26-apply-rpg.md) | 剑与声 |
|
||||
| [26-apply-rhythm.md](26-apply-rhythm.md) | 节拍行者 |
|
||||
| [26-apply-space.md](26-apply-space.md) | 盲航 |
|
||||
| [26-apply-hunt.md](26-apply-hunt.md) | 围猎 |
|
||||
| [26-apply-radio.md](26-apply-radio.md) | 不眠频率 |
|
||||
| [26-apply-dungeon.md](26-apply-dungeon.md) | 回声地窟 |
|
||||
| [26-apply-abyss.md](26-apply-abyss.md) | 深海回音 |
|
||||
| [26-apply-detective.md](26-apply-detective.md) | 雨夜专案 |
|
||||
| [26-apply-cipher.md](26-apply-cipher.md) | 暗码 |
|
||||
| [26-apply-teahouse.md](26-apply-teahouse.md) | 深夜茶馆 |
|
||||
| [26-apply-keeper.md](26-apply-keeper.md) | 守塔人 |
|
||||
| [26-apply-bridge.md](26-apply-bridge.md) | 星环舰长 |
|
||||
|
||||
台词增量清单(合并进 `tools/gen_voice_dual.py` 的原始记录):`tools/voice_lines_26/<game>.md`;合并工具 `tools/merge_voice_lines_26.py`;引用一致性校验 `tools/validate_voice_refs.py`。
|
||||
|
||||
各游戏正文已按同一附录 C 重写,与上表重复处以**游戏正文 + 26 号**为准。
|
||||
|
||||
|
||||
+16
-6
@@ -4,16 +4,19 @@
|
||||
|
||||
---
|
||||
|
||||
## 0. 当前最高优先级:按 26 号改交互(文档已齐,实现未做)
|
||||
## 0. 当前最高优先级:按 26 号改交互
|
||||
|
||||
只改一款验证体感,再推广。建议顺序:`storyline` → `escape` → 其余。
|
||||
**2026-10-02 更新:15 款全部完成深度落地(P0~P3 交互层),本节转为维护状态。**
|
||||
施工记录见 [26-apply-*](README.md#施工单26-号落地15-款全部完成);引擎六模块 + 后续修复
|
||||
(doubletapCore / teachLine 前缀 / confusion 前置 / InvalidHints 语境恢复 / takeover L2 台账 /
|
||||
丢弃不登台账)都在 `web/engine/`。余下验证:§4 真机听测 checklist(模拟器测不出听感)。
|
||||
|
||||
| 档 | 做什么 | 验收 |
|
||||
|---|---|---|
|
||||
| **P0** | 新手关双击(`doubleTapWindow: 0`);回执三件套;单击 400ms 防连点;滑动打断语音 | 闭眼冷启动:点两下不再整段重复;无效操作有「咚」 |
|
||||
| **P1** | Floor + 等待声 + 整链 duck;三档提示;hint/feedback 过期丢弃 | 能听出「轮到你了」;无被动原文重复 |
|
||||
| **P2** | 各游戏首 3 分钟脚本;迷茫三级;状态×手势矩阵无空格 | 10s 内第一次成功;乱点机器人无声操作=0 |
|
||||
| **P3** | 手势解锁阶梯;失败就近重试;30s 进展点;断点复述 | 真人 5 分钟放弃 ≤1/5 |
|
||||
| **P0** | ~~新手关双击~~;~~回执三件套~~;~~防连点~~;~~滑动打断语音~~ | ✅ 15 款 playtest 无声操作=0 |
|
||||
| **P1** | ~~Floor + 等待声 + 整链 duck~~;~~三档提示~~;~~hint/feedback 过期丢弃~~ | ✅ 无头断言全覆盖 |
|
||||
| **P2** | ~~各游戏首 3 分钟脚本~~;~~迷茫三级~~;~~状态×手势矩阵无空格~~ | ✅ 乱点机器人指标归零 |
|
||||
| **P3** | ~~手势解锁阶梯~~;~~失败就近重试~~;~~30s 进展点~~;~~断点复述~~ | ✅ 无头断言全覆盖;真人 5 分钟放弃率待测 |
|
||||
|
||||
引擎新模块落点:`web/engine/` 的 floor / receipts / hints / confusion / novice / pipeline(示意见 26 §4)。各游戏接线以各自设计单为准。
|
||||
|
||||
@@ -59,6 +62,13 @@ ch2/ch3 各约 60~80 句,格式同 05-rpg-ch1-voice-ids,须标类别与 `_
|
||||
- 平铺旧 voice 残留清理。
|
||||
- hunt 三源分辨真机听测(23 §8.4)。
|
||||
|
||||
### 3.1 26 号落地后新登记的引擎缺口(各施工单上报,游戏层已绕行)
|
||||
|
||||
- **Floor 缺「演出 BUSY 定时」API `busyFor(ms)`**(dungeon/cipher 手工直置 `floor.state='BUSY'` + 作废令牌实现同效;补 API 后两处可收编)。
|
||||
- **confusion.js 静默权重恒 +1**:纯静默单独累计到不了阈值 2,三级接管对「一直不动」的玩家不生效(bridge 用游戏层梯子 `_feedEscalate` 绕行;若引擎改为 `n('silence')>=2 → +2`,各游戏可去掉梯子——需同步回归全部 15 款)。
|
||||
- **无按链快进 API**:bridge 22 号「检测链以后可加速」无法只对单条链生效(rate boost 是全局旁白快进),已按长按新手期无效处理并记偏差。
|
||||
- transcribe.mjs 直调 `game.onGesture` 绕过输入管道(阶段门/回执/防连点在转写中不可见,会话剧本须自行按 `floor.state` 门控——14 款已按此写,接 makeInputPipeline 是一劳永逸方案)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 真机听测 checklist
|
||||
|
||||
Reference in New Issue
Block a user