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