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 置完成。
7.5 KiB
26-apply · 《盲航》重构施工单(26 号文档落地)
设计单正文见 04-space-rebuild.md 附录 C,本文是施工记录。交互规则权威: 26-audio-interaction-playbook.md(施工口径 00-global-ux.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 号文档的偏差记录
- 演练指令/纠错/带过链全部 critical:04 §0.4 矩阵列「演练指令 critical 行」的 长按格写「帮助」,引擎 critical 对所有手势一律 busy(floor.js 语义),无法豁免 单一手势。指令 ≤3s,事后长按立即可用。取舍理由:流程驱动句被打断会卡死演练 (onDone 不触发 → 不 spawn),critical 是唯一稳妥解。
- round2 R2「hit_last 在播期间呼喊抑制」简化为「hit_last 一并走防顶断登记」: Floor 单链模型下抑制呼喊会饿死生存信息(逼近最短 2.0s);hit_last(defend) 被呼喊顶断后整链重排一次,保证完整送达,语义等价且更简单。
- 演练陨石 spawn 不再同窗播 dir 呼喊:04 §2 流程表无此件(指令刚说过方向, 语音先、音效后不叠)。实战呼喊保留(round4 R1 反应窗口起点不动)。
- 双击窗口分档在页面加载时快照(
DT_CORE = ladder.stage() >= 3):会话中途 跨过阶段 3 的玩家本会话双击仍折算 tap(attach 不可热换),下局页面重进生效。 - 新手锁血的归因说 hit_ 而非 protect_(04 §0.7「撞击(保护后)」行): 锁血发生在保护期外,说「训练护盾接住了」是假话;说真话(方位 + 正确滑向)。
second_run_ask保留「上滑重听演练」:04 §2「回访者:点一下出发」为主体, 上滑在 ask 态不与玩法冲突(对局中 up 才是闪避),保留为可选重听入口。- 断点续玩/暂停恢复共用裸飞缓冲(前 3 颗 4.0s 慢速)作 count-in:04 §0.9 要求 「一颗慢速预告」,实现为三颗(round2 R2 恢复缓冲机制复用),更软,不更硬。
- help 经长按一句(lp_run);菜单「教学要点」项播 help_recap(改版口径,不含 加速/护盾——未解锁前不教第二件事)。
- 里程碑档位 10/25/50/100 沿用既有资产(04 §5 行文「10/20/30/40/50」与其自身 语音表 M 组不一致,以语音表为准;「超出不播」照办)。
- 向导层(engine/guide.js)整体退役:Floor + 等待点 + 迷茫接管替代; gd_hit_hint / gd_last_life 删除(hit_ / 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.mjs102 断言全绿 (退出码 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 人)。