Files
xsl ee5d4d2544 feat(playbook): 26 号交互手册全量落地——剩余 12 款深度重构 + 语音全量重制
storyline/escape/simon 首批之后的推广收官:15 款全部按 26 号模式运行
(发言权/回执/三档提示/迷茫接管/手势阶梯/断点复述),旧「双击重听/格挡/
菜单确认」等反模式口径全线废除,开场零规则念白(首句即动手)。

游戏层(12 款):rpg(格挡=前摇窗口内再单击)/ rhythm / space / radio /
dungeon / abyss / detective / cipher / teahouse / keeper / bridge /
hunt(联机切片):
- 每款 game.js 接引擎六模块 + makeInputPipeline(doubleTapWindow:0);
  四向玩法类 swipeCore + 长按帮助;双击是玩法的(space 护盾 / hunt
  旋风斩)按手势阶梯阶段 3 分档恢复双击窗口(doubletapCore)
- 每款 playtest 重写:玩法断言 + §6.2 乱点机器人(无声操作 / 被动
  原句重复 / 打断失败 = 0);15 款 3900+ 断言全绿
- 12 份 docs/design/26-apply-*.md 施工单 + tools/voice_lines_26/
  台词清单 + voice-ids 文档同步 + 转写会话剧本按新口径重写

引擎层(web/engine/,6 处修复):pipeline 增 doubletapCore;novice
teachLine 带 voice/ 前缀(此前教学句被静默丢弃);confusion.record
前置到新手门(锁定手势的乱点也计信号);InvalidHints 播完恢复解释前
状态(根治孤儿 BUSY);WaitPoint takeover(2) 台账去重;台账只在
speak 真正播出时登记。遗留引擎债登记 roadmap §3.1。

语音资产:台词表合并(新增 ~250 系统句 / 改 ~50 旧口径 / 删 ~110
废止句;合并器 tools/merge_voice_lines_26.py + 引用校验器
tools/validate_voice_refs.py),GPU 重录 1536 wav → 4204 ogg/m4a
落地,check_all_assets + validate_voice_refs 双绿;键盘变体同步扩表。

大厅/文档:15 款统一新交互口径(「新交互」徽标退役);README /
HANDOVER / rpg README 旧口径修正;roadmap P0-P3 置完成。
2026-10-02 12:33:20 +08:00

120 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 26-apply · 《星环舰长》重构设计单(26 号文档落地)
> **设计单正文见 [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 落在入场报名链中会被当「跳句」吞掉——剧本侧改为
等待点武装后再出手(玩家不抢话语义)。