# 04 · 《盲航》重构方案(26 号对齐) > **给开发者的实现要点摘要** > 1. **交互权威**:26 号手册。四向滑动是核心玩法 → **帮助一律长按**;新手期无双击;`doubleTapWindow: 0`。 > 2. **保留同向闪避**:听到哪边来,就向哪边滑(把陨石拨开)。判定窗、whoosh 四向资产、前 60s 保护期、死亡归因分方位,全部保留。 > 3. **单击加速、护盾**改为解锁阶梯后的高级手势,**开场不教、保护期内不塞第二种机制**。 > 4. 对局 = Floor `ACTION`。第一句就让玩家拨一颗;第一次成功 ≤10s。回执 ≤100ms;挥空/冷却拒绝必须出声,禁止只震。 > 5. 暂停恢复后必须 count-in 式的再瞄准(至少一颗慢速预告),不能一恢复就注定撞上。 --- ## 0. 设计单(26 号附录 C) ### 0.1 一句话核心动作 **听到陨石从哪边来,就向哪边滑,把它拨开。** ### 0.2 玩家可感知的状态(3 个) | 状态 | Floor | 听感 | 第一次教 | |---|---|---|---| | 演练 / 对局 | `ACTION` | 引擎 `bgm/engine` + whoosh/alarm;玩法声即状态 | 「陨石有声音。向声音那边滑。」 | | 游戏在说 | `SPEAKING` | 演练指令、归因;整链 duck | 开场第一句 | | 坠毁结算 | — | 停 engine → 结算链 → `bgm/menu` | — | 危险预警用 alarm(内容音)+ 可选 danger 震;**不能只靠震动**。新手期只教这 3 种听感。 ### 0.3 新手手势与解锁 | 手势 | 含义 | 解锁 | |---|---|---| | 四向滑动 | 同向闪避 | 阶段 0(核心) | | 单击 | 演练里=继续;对局未解锁加速时=`invalid`+首次「现在只要滑。」 | 加速=阶段 4 或「完成第一局保护期且闪避成功 ≥3」后教一次 | | 长按 | 我在哪(「引擎舱。躲开呼啸。向声音那边滑。」) | 阶段 1(第一次成功闪避后马上用一次) | | 双击 | 新手期不存在;护盾同加速,更晚解锁 | 阶段 4 大厅或累计 3 局后专属教学 | | 下滑(对局) | 向下闪避,不是菜单 | — | | 下滑(结算后) | 菜单 | 阶段 2 | ### 0.4 状态 × 手势矩阵(新手期) | 状态 \ 手势 | 单击 | 四向滑 | 长按 | 双击(未解锁) | 连点 / 乱滑 | |---|---|---|---|---|---| | 演练指令 `critical` | `busy` | `busy`(等指令说完再出陨石) | 帮助 | `busy` | `busy` | | 演练陨石 ACTION | `invalid`+「向声音那边滑。」 | 同向=拨开;错向=纠正+重来 | 帮助(不闭窗) | 当单击 | 乱滑计入迷茫 | | 对局 ACTION | 未解锁加速=`invalid` 首次解释;已解锁=加速或冷却拒绝声 | 同向闪避 / 挥空 `whiff`+`invalid` | 帮助 | 当单击 | 计入迷茫 | | 归因 / 结算 SPEAKING | 跳过这句(归因是 `feedback`,已操作则作废不播) | 打断并闪避(对局中) | 打断,帮助 | 当单击 | 400ms `busy` | | 结算 | 再飞一次 | `invalid`+解释 | 重听结算 | 当单击 | 只处理第一下 | | 菜单 | 确认 | 左右滑切换 | 重听说明 | 当单击 | `busy` | ### 0.5 等待点 | id | 期待 | `_full` | `_short` | 静默 | L2 | L3 | |---|---|---|---|---|---|---| | `d1_left` | 左滑 | 「听,左边有陨石。向左滑。」 | 「向左滑。」 | 演练窗结束=超时 | 左滑 | 游戏演示拨开 | | `d2_right` | 右滑 | 「这次在右边。」 | 「向右滑。」 | 同 | 右滑 | 演示 | | `d3_up` | 上滑 | 「上面,向上滑。」 | 「向上滑。」 | 同 | 上滑 | 演示 | | `d4_down` | 下滑 | 「下面,向下滑。」 | 「向下滑。」 | 同 | 下滑 | 演示 | | `settle` | 单击 | 「单击,再飞一次。」 | 「单击。」 | 20s / 45s | — | 提示音 | 对局 ACTION 不起等待声。迷茫:10s 内 3 次挥空/错向 → L1 短句「向声音那边滑。」→ L2 只认当前最近一颗的正确方向 → L3 自动拨开最近一颗(保护期或不扣血演示)。 ### 0.6 首 3 分钟逐秒脚本 | 时间 | 游戏说 / 播 | 期待 | 没做 | 做错 | |---|---|---|---|---| | 0~3s | 「陨石在左边。向左滑。」(whoosh 在指令后) | 左滑 | 超时重来;2 次后演示通过 | 错向:纠正「在左边。」 | | 3~10s | dodge 音 +「对。」→「这次在右边。」 | 右滑 | 同上 | 同上 | | 10~30s | 上、下各一颗慢速演练 | 上滑、下滑 | 演示通过 | 纠正 | | 30~40s | 「四个方向你会了。出发。」→ 保护期第一颗 | 同向滑 | 保护期撞了不掉血 + 归因 | 归因含方位 | | 40~60s | 保护期:慢、稀、撞了不掉血 | 闪避 | 长按帮助 | 挥空 `whiff` | | 约 50s | 「训练护盾还剩十秒。」(`hint`,空闲才播) | — | — | — | | 约 60s | 「训练护盾关闭。」 | 继续闪避 | — | — | | 60~180s | 难度爬坡;不插入加速/护盾课 | 闪避 | 迷茫接管 | 真话归因;没出手不报「慢了」 | 第一次成功=第一颗拨开 ≤10s。每 30s 有可听进展(拨开声 / 里程碑句)。 ### 0.7 失败表 | 类型 | 判定 | 归因 | 回到哪里 | 新手代价 | |---|---|---|---|---| | 错向 | 滑向 ≠ 陨石方向 | 「在左边。向左滑。」 | 演练:同一颗重来;对局:该颗结算 | 保护期不掉血 | | 挥空 | 无悬置陨石的方向 | `whiff` + 首次「现在没有这边的陨石。」 | 继续 | 无 | | 没出手 | 窗口内无滑 | 「没拨到。声音一响就滑。」**禁止说慢了** | 演练重来;对局掉血或保护吸收 | 前两次保护/锁血 | | 撞击(保护后) | 窗口过且未拨开 | `hit_` 方位 + 正确动作 | 继续;HP=0 结算 | 第 3 次可降刷怪 | | 第三次同向失败 | 演练同方向 3 次 | 「听我做一次。」演示 | 通过该方向 | 无 | 坠毁结算:时间段整句 + 躲避段整句 +「单击,再飞一次。」破纪录加「新纪录!」。 ### 0.8 台词类别 - `critical`:各方向演练指令(≤3s)。 - `content`:出发句、保护结束、里程碑、结算段。 - `hint`:`protect_soon`、长按帮助、迷茫短句。 - `feedback`:`hit_left/right/up/down`、`hit_last`、挥空解释、冷却拒绝。 `hit_*` / `protect_end` 被呼喊顶断时必须登记残留并补播一次(R5-2 保留),但仍是 `feedback`:玩家已进入下一威胁则过期丢弃,不排在长链尾。 ### 0.9 断点复述 对局可中途退出自动存:存活秒、闪避数、是否过保护期。回来:「你在航道上。躲开呼啸。向声音那边滑。」然后 count-in 一颗慢速陨石再恢复刷怪。 进度:`{ bestSec, totalRuns, summary }`。 ### 0.10 测试 关键路径:四向各一次(做错重教,2 次后演示通过)→ 保护期被撞不掉血且归因 → 保护解除后闪避 → 结算。同向闪避。帮助=长按。加速/护盾不得开场同时教。 --- ## 1. 核心决策:同向闪避(保留) `PUSH_SWIPE = {left:'left', right:'right', up:'up', down:'down'}`。 - 左 whoosh → 左滑,上=高频→上滑,下=低频→下滑。whoosh_* 四资产复用,只改映射与文案。 - 判定:撞击前 1.5s 内滑动有效 + 250ms 宽限;`need` = `dir` 本身。 - 反向映射表 `ESCAPE_SWIPE` **废止**。 --- ## 2. 交互式演练(DRILL) 每步 = 一句短指令 → 一颗演练陨石(逼近 4.5s,`harmless`)→ 操作 → 反馈。语音 `onComplete` 后再 spawn,不与 whoosh 叠。做错/超时:纠正 + 同一颗重来;**最多 2 次后自动演示通过**。 | 步 | 指令 | 内容 | |---|---|---| | D1 | 「听,左边有陨石。向左滑。」 | 左来左滑 | | D2 | 「这次在右边。」 | 右 | | D3 | 「上面,向上滑。」 | 上 | | D4 | 「下面,向下滑。」 | 下 | | D5 | 「四个方向你会了。出发。」 | 进保护期 | 删除 D0 两句零操作欢迎。成功:dodge +「对。」(仅 D1 语音肯定,其余只内容音)。 回访者:开场「点一下出发」,跳过演练。 --- ## 3. 保护期与难度(数字保留) | 参数 | 保护期 60s | 之后 | |---|---|---| | 逼近 | 4.0s | 3.2s → 2.0s(120s 爬满) | | 间隔 | 4.0s | 3.2s → 1.4s | | 撞击 | 不掉血:shield_block + 归因(方位+正确滑向) | 正常掉血 | | 加速 / 护盾 | **不可用**(未解锁) | 仅已解锁玩家 | 第 50s:`protect_soon`「训练护盾还剩十秒。」第 60s:保护关闭。 **废止**:保护期内第 20s/45s 暂停刷怪插入单击加速课、双击护盾课。 同一窗口内「撞击与下一颗 spawn 重叠」导致归因被杀:保留 R5 的「呼喊优先 + 被顶断补播」;`protect_*` 上一句未完则新吸收只播 shield_block、跳过重复教学句。 --- ## 4. 高级手势解锁(加速 / 护盾) 机制代码可保留(持续增益规避 tap 延迟等),**新手局不暴露**: | 能力 | 手势 | 解锁 | 教学 | |---|---|---|---| | 短促加速 | 单击 | 第一局结束或大厅全部解锁 | 一句:「点一下,加速。现在试试。」马上用一次 | | 护盾 | 双击(仅阶段 3/4 已识别双击后) | 累计 3 局或大厅 | 单独一课,不与加速同句 | 未解锁:单击在对局中=`invalid`+解释一次。冷却中已解锁加速:`boost_not_ready` 必须出声(R5-4),可叠心跳震,**禁止静默**。挥空:`sfx/whiff` + `invalid`。 护盾充能完毕 `shield_ready` 保留,仅已解锁玩家播放。 --- ## 5. 死亡即教学 + 结算整句 每次被撞:`sfx/hit` + `hit_`(「左边撞上的。向左滑。」)。第二次加 `hit_last`。没出手用「没拨到」,不用「慢了」。 删除 `numClips` 拼接。存活 4 段 + 躲避 4 段整句保留。里程碑 10/20/30/40/50 固定句,超出 50 不播。 结算单击=再飞;阶段 2 下滑=菜单(左右滑+单击)。禁止坠毁后死寂。 --- ## 6. 回执与刺耳修复(R5 音频保留) alarm / dodge / shield_block / boost / shield / whiff 程序合成峰值标准保留(≤−3.4 dBFS)。回执 ok/invalid/busy 走引擎合成,与内容音不混用。 激活加速/护盾:内容音 + `ok` 可省(已有 boost/shield 音)+ 可选 confirm 震。 --- ## 7. 实现要点 1. 同向映射一行;判定常量不动。 2. `phase='drill'`:参数化 approachMs / harmless / 指定 dir。 3. 保护期撞击不掉血 + 归因。 4. 暂停:停刷怪;恢复先播复述或 count-in 慢速一颗,再 `_scheduleSpawn`。 5. 语音约 35 句×2 性别;删 num 拼接;删加速/护盾开场课句或改为解锁课。 6. README 手势表:同向闪避;长按帮助;新手无双击。 --- ## 8. 废止清单 | 废止 | 改为 | |---|---| | 反向闪避 | 同向拨开 | | 47s 连播旁白后即死 | 交互式四向演练,第一句就滑 | | 开场同时教闪避+加速+护盾 | 先只会滑;加速/护盾后解锁 | | 保护期 20s/45s 插入单击/双击课 | 删除 | | 新手双击护盾 | 双击不存在 | | 对局无帮助手势 | 长按=我在哪 | | 加速冷却静默;挥空静默 | 拒绝句 / `whiff` + 回执 | | 撞击只报损不报方位 | `hit_` 真话 | | 没出手报「慢了」 | 「没拨到」 | | 反馈只靠震动 | 回执必响;iOS 无震仍有声 | | 菜单双击确认 | 左右滑+单击 | | 帮助用上滑(与向上闪避冲突) | 长按 | R5 刺耳重合成、归因补播、protect 去重、protect_soon、挥空音:**保留**,并补齐回执。