# 17 · 《深海回音》(abyss) — 深海救援叙事 RPG > **给开发的实现要点摘要** > 1. 交互权威:26 号手册。叙事范式对齐 [26-apply-storyline.md](26-apply-storyline.md)。搜索等待的单击=发声呐脉冲,等同宪法「检查」,**不是**四向滑动玩法,帮助用上滑。 > 2. 骨架同 radio:节点链 + seqToken + pendingChoice。宏状态 INTRO / DIVE / COMMS / SURFACE / ENDING + MENU。 > 3. 氧气=步进资源,无实时倒计时、无中途死亡。软失败=少一潜/少带一人。声呐与语音互斥(sonarGate)。 > 4. 台词 [17-abyss-voice-ids.md](17-abyss-voice-ids.md)(148 句:双性别 127 + NPC 21)。废除双击重听回波:搜索等待再单击=再发脉冲(自然再听)。 > 5. 章程 N2:15–25 分钟、9 抉择(实走 7–9)、4 结局。 --- ## 附录 C · 设计单 ### 1. 一句话核心动作 **听一段救援,单击继续或发声呐;听到选项时左右滑做决定。** ### 2. 玩家能感知的状态(3 个) | 状态 | 听感 | Floor | |---|---|---| | 听讲 | 调度/船员语音,BGM 整链压低 | SPEAKING | | 轮到你 | turn → 等待声;搜索等待用深海 amb + 余音 | YOUR_TURN | | 危险 | danger 签名 + 火花/滑坡(仅 D2/D4) | SPEAKING/BUSY | 氧气档靠跨档句与 breath_loop(low/crit),不单开第四态。 ### 3. 新手手势与解锁 | 手势 | 含义 | 解锁 | |---|---|---| | 单击 | 继续 / 搜索等待发脉冲 / 跳过当前句 | 阶段 0 | | 左/右滑 | 抉择 | 阶段 0 | | 上滑 | 我在哪(潜次 → 已救人数 → 氧档 → 一个动作) | 阶段 1(第一次脉冲成功后) | | 下滑 | 菜单 | 阶段 2(第一次结局) | | 双击 | 按单击。阶段 3=重听当前等待点完整句 | 阶段 3 | | 长按 | 新手 invalid;之后旁白加速 | — | ### 4. 状态 × 手势矩阵(新手期) | 状态 \ 手势 | 单击 | 左/右滑 | 上滑 | 下滑(未解锁) | 双击 | 连点 | |---|---|---|---|---|---|---| | 游戏在说 | 跳句 + ok(p*/锚句/档位句不可跳 → busy) | 抉择点缓存,不盲选;否则 invalid | 打断,我在哪 | invalid | 按单击 | 400ms busy | | 等你继续 | 继续 | invalid | 我在哪 | invalid | 按单击 | busy | | 搜索等待 | **脉冲** sonar_ping(silent-ok) | invalid +「点一下,发脉冲。」 | 「第 N 潜。点一下发脉冲。」 | invalid | 按单击=再脉冲 | 冷却/连点 busy | | 等你选择 | 再听选项 | 抉择 | 「左右滑。」 | invalid | 按单击 | 迷茫 | | 结算 | 新救援 | invalid | 结局+氧档一句 | 菜单(阶段2) | 按单击 | 第一下 | | 菜单 | 确认当前项 | 左上一项 / 右下一项 | 重听说明 | 关闭 | 按单击 | busy | 搜索中再点=再听回波,废除「双击=重听上一条回波」。玩家脉冲**先于**向导散句(先掐 gd 再出 ping)。 ### 5. 等待点 | id | 期待 | full | short | 静默 | L2 | L3 | |---|---|---|---|---|---|---| | intro | tap | 「点一下屏幕。」 | 「点一下。」 | 6s/15s | tap | 替点 | | ping | tap | 「单击,发一枚脉冲。」 | 「点一下。」 | 8s/18s | tap | 替发脉冲 | | continue | tap | 「单击,继续。」 | 「单击。」 | 13s/30s | tap | 替继续 | | choice | L/R | pN | 「左右滑,选。」 | 25s/50s | 左右滑 | 演示 | | settle | tap | 「单击,重新开始。」 | 「单击。」 | 20s/45s | tap | 提示音 | COMMS 链末 full 档静默 13s/30s(不对齐旧 25/50)。乱滑不推进节点:迷茫 L1 短句 → L2 只留期待手势 → L3 演示脉冲或选择。 ### 6. 首 3 分钟 | 时间 | 播 | 期待 | 没做 | 做错 | |---|---|---|---|---| | 0~3s | 甲板风浪 →「点一下屏幕。」 | 单击 | 「点一下。」 | 滑动 invalid | | 3~8s | ok → 极短目标句 → 下潜声 →「点一下,发脉冲。」 | 单击脉冲 | 「点一下。」 | 滑动 invalid | | 8~10s | sonar_ping → 静默一拍 → echo_metal →「金属回波,钢板。」 | —(第一次成功) | | | | 10~20s | turn 教学 → 接通小舟 | 单击继续 | 三档 | inv_nosel | | 20~60s | p1 听暗号/直接上 | 左右滑 | 复述 p1 | 不盲选 | | ≈60s | 解锁上滑 | 上滑 | 「向上滑。」 | | | 60~180s | p2 → 上浮扣 3 格 → 档位句 | 单击/滑 | 接管 | 归因真话 | ### 7. 失败表 | 类型 | 判定 | 归因 | 回到 | 新手期 | |---|---|---|---|---| | 搜索滑动 | DIVE 等待滑 | 「点一下,发脉冲。」 | 原地 | 无 | | 非抉择滑动 | | 「现在不用选。」 | 原地 | 无 | | 氧气门取消第四潜 | SURFACE(3) oxy≤2 | 取消链指向实际花气的左选择 | 签收 p9 | 已救者不失去 | | 干涸 | mid-dive floor 0 | dry_b 指向最后那个左选择 | 上浮结算 | 人已上吊索仍救出 | | 迷茫 | 信号≥2 | L1–L3 | 原地 | 无 | ### 8. 台词类别 - `critical`:sys_first_tap;dv1_teach「点一下,发脉冲」 - `content`:b_*、dv*、船员对白、p1–p9、e*、ep_*、dv4_dual、oxy_*(水面 crit 用 oxy_crit_deck「一潜都下不去了。」) - `hint`:gd_ping1/2、prog_dN、prog_savedN、oxy 档、sys_continue_ask - `feedback`:inv_*、dry_b、gao_final 留别句 - 停用:任何「双击重听回波」句 148 句(含 `_k` 11 对);音频 127×2+21=275 条 ×2 格式。 ### 9. 断点复述 保存:每潜进入、抉择后、SURFACE/ENDING、菜单保存。回来 sys_continue_ask;单击重播当前节点(恢复首句锁)。上滑:第 N 潜。已救 K 人。氧档。点一下或左右滑。 ### 10. 测试记录 `web/abyss/test/playtest.mjs`。改:双击不重听回波;菜单左右+单击确认;首次脉冲 ≤10s;回波与 voice 零重叠仍失败即不通过。真人待测。 --- ## 1. 概述 深潜救援员,声呐里是「海燕号」。氧气在倒数,但全是事件点扣格:无实时倒计时、无死亡。最优省气路径全员生还。与 radio 同骨架,压力源=氧气稀缺(宽限化)。 ## 2. 状态机 | 状态 | 内容 | BGM | |---|---|---| | INTRO | 极短甲板口播 | deck | | DIVE | 下潜 auto → 搜索单击脉冲 → 回波+接通 | dive | | COMMS | 对白+抉择 | comms | | SURFACE | 扣账+档位+补给(D2),auto | deck | | ENDING | 结局+回响 | ending | | MENU | 覆盖 | deck 低响 | ``` INTRO ──单击──> DIVE(1) ──脉冲找到──> COMMS ──> SURFACE ──> DIVE(2)… SURFACE(3) 氧气门:oxy≥4 双载 / =3 单载 / ≤2 取消链 ──> ◆p9 ──> ENDING ``` 取消链/干涸链/结局链/签收链入口 800ms 手势死窗。档位句纳入尾句保护(不可单击掐)。非 auto 叙事尾句**首播**保护,复播可掐。 ## 3. 抉择树 D1 找船·小舟:教学脉冲 → p1 听暗号(−1, knowsPipe) / 直接上 → p2 等日志(−1, hasLog) / 不等 → 扣 3。 D2 机舱·老白:p3 慢撬(knowsPipe?0:−1) / 快切(危机拍火花)→ p4 关阀门(−2, valve) / 走 → 应急瓶 +3(全局一次)。 D3 病舱:p5 先陈 / 先郑(stayer)→ p6 留瓶(−2, spareGift) / 约定。 D4:双载 p7 慢浮(−2)/快浮;单载 p7 带船长/带留守;p8 说出来(gaoPeace)/不问。 p9 取钟(需 oxy≥1)/ 进医疗舱;oxy<1 封锁左路(g9_dry,不摆假选项)。 | 结局 | 条件 | |---|---| | e1 海燕归钟 | saved=5 且 p9 左 | | e2 满载的黎明 | saved=5 且 p9 右 | | e3 最后一潜 | saved<5 且 p9 左 | | e4 按规程上浮 | saved<5 且 p9 右 | 跨潜仅标量:oxy、saved×5、stayer、flag×6。约 70 节点。 ## 4. 氧气经济 初值 12;D2 后 +3,总预算 15。每潜起扣 3。抉择耗气见上。mid-dive 负数 floor 0。档位=floor(oxy/3):full≥9 / ok 6–8 / low 3–5 / crit 0–2。水面 crit 用 oxy_crit_deck。双载 D4 口播 dv4_dual「这趟往返,扣四格气。」 SURFACE(3) 时 oxy=6−lefts → 双载 lefts≤2;单载=3;取消≥4。教学潜与机舱潜预算上永不卡死。 船员:小舟/老白恒活;陈/郑/船长按 p5/p6/氧气门/p7。好感只影响 ep 选播。 ## 5. 声呐双通道 信息类回波与 voice **零重叠**(sonarGate)。搜索段:脉冲 → 静默一拍 → 回波 → 解读。回波时长:金属 3300 / 敲管 3500 / 呻吟 5000ms。玩家脉冲抢先于向导散句。语音在播时远程脉冲垫 −6dB。并发前景 ≤2。 教学承诺:金属回波=船身(凡「船身」节点必播 echo_metal*);单击=脉冲;四潜=基础 3×4=12;氧气门=oxy<3 取消;每潜扣 3;敲管=老白;补给恰 +3 一次。 ## 6. 音频资产 BGM:deck / dive / comms / ending。SFX:sonar_ping、echo_metal_l/r、echo_debris、echo_groan、pipe_knock、link_beep、static_burst、amb_deep、amb_deck、breath_loop、spark_flash、valve_close、landslide、surf_splash、ascent_chime、bell_toll。 Voice:潜航员 30 + 调度 97(双性别)+ 船员 21 平铺滤波。D4 danger 震间隔 1100ms。crit 档 warning 震按「进入该档」去重。 ## 7. 存档 ```json { "phase": "COMMS", "node": "bai_b", "dive": 2, "oxy": 6, "saved": { "zhou": 1, "bai": 0, "chen": 0, "zheng": 0, "gao": 0 }, "flags": { "knowsPipe": true } } ``` summary:`第N潜·<舱段> · 氧气K格 · 结局X/4`。 ## 8. playtest 指针 四结局 + 氧气逐点、sonarGate 零重叠、教学承诺、结算死窗、pendingChoice:保留。删除双击回波重听与菜单双击确认。乱按 96s 必须被迷茫/三档救出,不得静默死局。