Files
SoundGame/docs/design/26-apply-space.md
T
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

91 lines
7.5 KiB
Markdown
Raw 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 号文档落地)
> 设计单正文见 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 人)。