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 置完成。
120 lines
11 KiB
Markdown
120 lines
11 KiB
Markdown
# 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 落在入场报名链中会被当「跳句」吞掉——剧本侧改为
|
||
等待点武装后再出手(玩家不抢话语义)。
|