Files
SoundGame/docs/design/01-escape-redesign.md
2026-10-01 23:26:47 +08:00

277 lines
17 KiB
Markdown
Raw Permalink 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.
# 01 · 《暗室》重设计(26 号对齐)
> **给开发者的实现要点摘要**
> 1. **交互权威**:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。施工设计单摘要见 [26-apply-escape.md](26-apply-escape.md)。地图 as-built 见 [25-escape-map-flow.md](25-escape-map-flow.md)。冲突以 26 号为准。
> 2. **保留**:3×3 网格、谜题链(钥匙→铁柜→保险丝→电箱→大门)、房间环境音签名、引导走到储物间拿钥匙。
> 3. **探索 = Floor `ACTION`**:四向滑=移动;**单击=检查并使用**(站在目标上点一下就完成拾取/开柜/修电/开门);**长按=我在哪**(位置→目标→一个动作)。新手期 `doubleTapWindow: 0`,双击不存在。
> 4. 第一句就让玩家滑;第一次成功(脚步声)≤10s。回执 ok/invalid/busy ≤100ms,禁止只震不响。
> 5. 卡关不再按 60/120/180s 原样重播说明书。走迷茫三级接管 + 三档提示(完整句→短句→提示音)。
---
## 0. 设计单(26 号附录 C)
### 0.1 一句话核心动作
**朝四个方向滑动在房间里移动,单击检查和使用,按住屏幕问路。**
### 0.2 玩家可感知的状态(3 个)与声音身份
| 状态 | Floor | 听感 | 第一次出现时教一句 |
|---|---|---|---|
| 探索(轮到你) | `ACTION` | 当前房间环境音常响(水滴/风/电流) | 「听到房间的声音,就可以走。」 |
| 描述在播 | `SPEAKING` | 房间描述语音;BGM 整链压低;句间不起等待声 | (开场指令即 SPEAKING) |
| 撞墙 / 无效 | — | 闷响 + `invalid` 回执(低「咚」) | 「那边是墙,换个方向。」 |
结算、菜单是元状态,用 `bgm/menu` + 结算句标识,新手期不新教第 4 种状态音乐。
### 0.3 新手手势表与解锁(四向滑动是玩法 → 帮助一律长按)
| 手势 | 含义 | 解锁 |
|---|---|---|
| 四向滑动 | 移动 | 阶段 0(核心玩法,不锁) |
| 单击 | 检查 + 使用(站在目标上即用) | 阶段 0 |
| 长按 | 我在哪(目标 + 方位一句,≤20 字) | 阶段 1(拿到钥匙时教,马上用一次) |
| 下滑(对局中) | 仍是「向下走」,**不是菜单、不是跳过引导** | — |
| 下滑(结算后) | 菜单 | 阶段 2(第一次逃脱后) |
| 双击 | 重听最近描述 | 阶段 3(累计 3 局);未解锁按单击处理 |
`attachGestures(..., { doubleTapWindow: 0 })`。键盘回车当单击。
### 0.4 状态 × 手势矩阵(新手期)
| 状态 \ 手势 | 单击 | 四向滑动 | 长按 | 双击(未解锁) | 连点 / 乱滑 |
|---|---|---|---|---|---|
| 引导答题 | 按步骤答 / `invalid`+首次纠正 | 按步骤答(脚步=`silent-ok`;撞墙=闷响+`invalid`) | 帮助一句 | 按单击处理 | 只处理第一下,其余 `busy` |
| 探索 ACTION | 检查+使用(环境音/描述即反馈) | 移动=脚步;撞墙=闷响+`invalid`+方位归因 | 帮助(目标+方位) | 按单击处理 | 计入迷茫 |
| 描述在播 SPEAKING | 跳过这句 + `ok`(关键获得 `critical`→`busy`) | 打断并移动 | 打断,帮助 | 按单击处理 | 400ms 内 `busy` |
| 结算 | 再来一局 + `ok` | `invalid` + 首次解释 | 重听结算 | 按单击处理 | 只处理第一下 |
| 菜单(阶段 2) | 确认当前项 | 左右滑切换(报名) | 重听菜单说明 | 按单击处理 | `busy` |
| 迷茫 L2 | 照常 | 只放行接管方向,其余 `invalid`(不移动) | 照常 | 照常 | 计入冷却 |
无空格、无「没有声音」的格子。连点不绑定重播、重开、跳过引导。
### 0.5 等待点配置
引导等待点(静默 6s 短句 / 15s 提示音):
| id | 期待 | `_full` | `_short` | L2 只留 | L3 演示 |
|---|---|---|---|---|---|
| `g0_swipe` | 任意滑动 | 「黑暗。朝任意方向,滑一下。」 | 「滑一下。」 | 任意滑 | 游戏自己走一步 |
| `g2_wall` | 滑动×2(含撞墙) | 「再滑两下,试试墙。」 | 「再滑。」 | 任意滑 | 演示撞墙闷响一次 |
| `g3_left` | 左滑 | 「现在,向左滑。」 | 「向左滑。」 | 左滑 | 游戏向左走 |
| `g4_down` | 下滑 | 「对。再向下滑。」 | 「向下滑。」 | 下滑 | 游戏向下走进储物间 |
| `g5_tap` | 单击 | 「单击一下,仔细检查。」 | 「单击。」 | 单击 | 「听我做一次。」→ 拾钥匙 |
探索期无固定等待点。静默(约 40s 起,之后每 20s 喂一次静默信号)与乱点一并进迷茫:
| 级 | 做什么 | 台词 |
|---|---|---|
| 1 | 说目标方位短句(30s 台账去重,说过就只给提示音) | `nav_*`「向右滑。」 |
| 2 | 只放行第一导航方向 | 「现在,只要向左滑。」 |
| 3 | 游戏自己朝目标走一步 | 「听我做一次。」→ 脚步 →「现在你来。」 |
同一等待点升到 3 后停止接管,只留房间环境音。**禁止**同级原样重播 26 秒说明书。
### 0.6 首 3 分钟逐秒脚本
| 时间 | 游戏说 / 播 | 期待玩家做 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | 环境水滴 →「黑暗。朝任意方向,滑一下。」(`critical`,≤3s) | 任意滑动 | 6s:「滑一下。」再 6s 只提示音 | 单击:`invalid`+「先滑一下。」 |
| 3~10s | 脚步声(第一次成功)→「对。你被困在地下设施里。再滑两下,试试墙。」 | 滑动(撞墙也算) | 「再滑。」 | 方向错也有闷响(试错无代价) |
| 10~25s | 闷响 +「那边是墙,换个方向。」+ 方位句 →「现在,向左滑。」 | 左滑 | 「向左滑。」 | 其他方向:纠正,不惩罚 |
| 25~40s | 脚步 →「对。再向下滑。」→ 储物间环境音 | 下滑 | 「向下滑。」 | 纠正 |
| 40~55s | 「听到水声了吗?单击一下,仔细检查。」→ 拾取音 →「你摸到了一把钥匙!」 | 单击 | 「单击。」 | 滑动:纠正 |
| 55~70s | 「想知道自己在哪,就按住屏幕。」(马上等一次长按)→「找到能用钥匙打开的东西。」 | 长按一次,然后自由探索 | 「按住屏幕。」 | 其他手势:`invalid`+首次解释 |
| 70~180s | 首到房间描述、谜题链(钥匙→铁柜→保险丝→电箱→大门) | 探索:滑到目标,单击使用 | 迷茫三级 | 撞墙归因;用错地方由检查句说明 |
节奏检查:3s 内动手;10s 内第一次成功(脚步);每 30s 有可听进展(新房间环境音/描述)。无纯规则长说明。
### 0.7 失败表
| 失败类型 | 判定 | 归因句 | 回到哪里 | 新手期代价 |
|---|---|---|---|---|
| 方向错(撞墙) | 越界 | `wall` + `wall_dir_*`(每方向整局语音一次,之后只闷响+`invalid`) | 原地 | 无 |
| 引导错手势 | 与当前步不符 | 短纠正(「向左滑。」) | 本步重等 | 无 |
| 用错地方 | 站位不对 | 检查描述告诉你这里有什么;不扣物品 | 原地 | 无 |
| 迷路 / 乱点 | 迷茫信号 ≥2 | L1 短目标 → L2 只留方向 → L3 走一步 | 原地 | 无 |
| 同步失败 3 次 | 引导同一等待点 | 「听我做一次。」演示后交还 | 本步 | 无 |
归因 2s 内播出;玩家一操作,排队中的 `feedback` 作废。
### 0.8 台词类别
- `critical`:`g0_new`(开场指令 ≤3s);关键获得句拆短后的那一句(摸到钥匙 / 通电确认),≤3s。
- `content`:引导指令、房间描述、`found_key` 链其余句、`unlock_cabinet`、`fix_box`、`escape`、`time_band*`、`start_room`、`inspect_*`、`gd_*_dir`、`gd_next_fuse`。
- `hint`:长按帮助 `lp_*`、`nav_*`、三档短句、`sys_demo` / `sys_now_you`、菜单说明。
- `feedback`:`wall`、`wall_dir_*`、引导纠正、`inv_*`(首次解释无效手势)。
完整清单见 `tools/gen_voice_dual.py` 的 `ESCAPE_LINES` 与 [01-escape-voice-ids.md](01-escape-voice-ids.md)(本文不改 voice-ids 文件)。须停用或重录任何「双击使用 / 双击求提示」旧句(含 `g6_doubletap`)。
### 0.9 断点复述
- 每步移动/进展写 `soundgame.escape.save`(坐标 + 谜题旗标 + 用时)。
- 回来 5s 内:状态声(房间 amb)+ 复述句(位置。目标。一个动作。)+ 交出探索。
- 二周目开场:`sys_continue_ask` 语义——单击继续上次;右滑重新开始。不再用上滑重听整段引导。
### 0.10 测试记录
无头 playtest:`web/escape/test/playtest.mjs`。交互验收按 [13-playtest-criteria.md](13-playtest-criteria.md) §3:3s 内任意滑;引导走到储物间;**单击**检查得钥匙;自由探索同链逃脱。真人冷启动待测。
---
## 1. 保留的空间与谜题(不变)
### 1.1 3×3 网格
坐标 x 0 西→2 东,y 0 北→2 南。内部全连通,无锁门。外圈撞墙。起点 (1,1)。
| 房间 | 坐标 | 环境音 | 单击(检查+使用) |
|---|---|---|---|
| 电箱房 | (0,0) | `amb_power` | 有保险丝 → 修电(`fix_box`);否则描述未修/已修 |
| 空房 | (1,0) | `amb_wind` | `empty_1` |
| 空房 | (2,0) | `amb_hum` | `empty_3` |
| 空房 | (0,1) | `amb_hum` | `empty_2` |
| 起点 | (1,1) | `amb_drip` | `start_room`(操作总览改为:滑动移动,单击检查) |
| 铁柜房 | (2,1) | `amb_cabinet` | 有钥匙且未开 → 开柜得保险丝;否则锁着/已开描述 |
| 储物间 | (0,2) | `amb_storage` | 未拾钥匙 → 拾取;否则空描述 |
| 空房 | (1,2) | `amb_wind` | `empty_3` |
| 大门 | (2,2) | `amb_gate` / 通电后 `amb_gate_live` | 已通电 → 逃脱;否则门的状态描述 |
### 1.2 谜题链
```
储物间单击 ──得钥匙──▶ 铁柜房单击 ──得保险丝──▶
电箱房单击 ──通电──▶ 大门单击 ──▶ 逃脱
```
物品即进度:`hasKey` / `hasFuse` / `cabinetOpen` / `powerOn`。阶段:`key → cabinet → box → gate`。
最短路径(移动次数与旧路线相同,使用全部改为单击):
(1,1)→左(0,1)→下(0,2)【单击拾钥匙】→右(1,2)→右(2,2)→上(2,1)【单击开柜】→左(1,1)→左(0,1)→上(0,0)【单击修电】→右(1,0)→右(2,0)→下(2,2)【单击逃脱】。
### 1.3 环境音规则(保留)
1. 单击检查 = 先重播当前房间环境音,再播描述。
2. 每次进入房间都播环境音(错过可再听)。
3. 关键房间专属签名:储物间滴水杂物、铁柜铁皮共振、电箱火花、大门风声;通电后大门切 `amb_gate_live`。
4. 空房首访补播 `empty_*`((1,0)→1 / (0,1)→2 / (1,2)→3 / (2,0)→3),不算进展事件。
5. 探索期环境音常驻,承担「还活着」;等待声可更轻或由 amb 代替(全游戏统一,见 [10-feedback2-state-bgm.md](10-feedback2-state-bgm.md))。
---
## 2. 引导(GUIDE)——删除 G6 双击
引导仍写死路线:(1,1)→左(0,1)→下滑(0,2) 储物间。超出路线的滑动温和拦回(「先跟我走。」)。做错不惩罚。
| 步 | 指令 | 等待 | 成功 |
|---|---|---|---|
| G0 | 「黑暗。朝任意方向,滑一下。」 | 任意滑动 | 脚步 +「对。」 |
| G1–G2 | 再滑、碰墙 | 滑动(撞墙计数) | 闷响 + 方位 |
| G3 | 「现在,向左滑。」 | 左滑 | 脚步 |
| G4 | 「再向下滑。」 | 下滑 | 储物间 amb |
| G5 | 「单击一下,仔细检查。」 | 单击 | 拾钥匙(谜题第一环) |
| G6 | **废止**(原「双击使用」) | — | — |
| G7 | 「找到能用钥匙打开的东西。迷路了,按住屏幕。」 | 长按一次(阶段 1 教学)后进 PLAY | 帮助句 + 自由探索 |
- **没有「下滑跳过引导」**。下滑是向下走。已完成过引导的玩家:开场一句「点一下开始」直进 PLAY(可跳过引导复述);帮助手势重听「我在哪」,不重念整段教案。
- 引导指令标 `content`(G0 开场那句 `critical`)。迷茫接管后再演示,不靠玩家发现隐藏手势。
- `_guideBusy` 期间:缓存首个非帮助手势,语音结束后按新步骤补判(合法=作答,不合法=纠正)。缓存 1 个,不跨步。
进 PLAY 的任何路径(含二周目直进)都至少听过一次目标句(`g7_goal` 或等价短句)。二周目可单击跳过该句。
---
## 3. 单击 = 检查 + 使用
站在正确房间、满足前置时,**一次单击**同时完成「听这里有什么」和「用身上的东西」。
| 房间 | 前置 | 单击结果 |
|---|---|---|
| 储物间 | 尚无钥匙 | 拾钥匙(内容音 `pickup`,可省 `ok`) |
| 铁柜房 | 有钥匙且未开 | 开柜得保险丝 |
| 电箱房 | 有保险丝且未通电 | 修电 |
| 大门 | 已通电 | 逃脱 |
| 其他 / 前置不满足 | — | 只播检查描述(告诉你这里没有可做的,或还缺什么) |
废止:双击使用、双击无目标=背包+L2 答案。背包信息不作为「乱点奖励答案」;需要时由长按帮助一句带出(「储物间。找铁柜。向右滑。」),不点明未到达的解法步骤。
关键获得链标 `critical` 的那一句 ≤3s,其余可跳。结算链播完前单击不重开(`_settleBusy`,链完或 30s 兜底),给 `busy`。
---
## 4. 迷茫接管(取代 60/120/180 卡关广播)
**进展事件**(重置迷茫、进入下一目标):拾钥匙、开铁柜、拾保险丝、修电箱、逃脱;首到储物间/铁柜房/电箱房/大门各记一次。普通移动、检查空房不算进展。
旧「无操作 60s L1 / 120s L2 / 180s L3 且 L3 每 60s 原样重播带路句」**废止**。改为 26 号 §4.5:
- 信号:连续无效、乱滑、同步骤失败、静默(探索约 40s 无进展也计静默)。
- 权重到 2 → 接管,15s 冷却。
- L1 短目标句(不泄完整解法)→ L2 只放行导航方向 → L3 游戏走一步。
- 同一目标段升到 3 后只留环境音。
- 主动帮助 = 长按,回答一句(位置→目标→一个动作),**不是** L2 明示房间+动作的白送答案。
撞墙方位句 `wall_dir_*`、进展链尾目标名+方位 `gd_cabinet_dir` / `gd_box_dir` / `gd_gate_dir`、不泄题进度句 `gd_prog_*` **保留**,但:
- `gd_prog_*` 并入迷茫 L1 或进展事件当下,不另开 150s 平行广播与 60/120/180 叠炸。
- 游戏主动提示永不原样重复;玩家长按才给完整句,前加「再说一遍:」。
---
## 5. 回执、震动、发言权
| 事件 | 声音(主通道) | 震动(补充) |
|---|---|---|
| 移动成功 | 脚步 = `silent-ok` | swipe(引擎内置) |
| 撞墙 | 闷响 + `invalid` | error |
| 检查/使用成功 | 内容音(拾取/开门)可省 `ok` | pickup / success |
| 无效手势 | `invalid`;该状态×手势首次加一句解释 | error 可叠加 |
| 关键句期间操作 | `busy` | — |
| 逃脱 | 内容音 + 结算链 | success |
禁止:无效只震;iOS 无震动则无反馈;删除内容音只留震。`sfx/ui_deny` 仍退役。系统回执用合成音;脚步/墙/机关用录音。
Floor:描述链 `SPEAKING`(整链 duck);探索 `ACTION`;结算链 `SPEAKING`/`BUSY`;结算后 `YOUR_TURN`(单击再来)。
---
## 6. 语音与用时(整句,保留分段)
- 用时仍 4 段整句 `time_band1..4`,禁止数字拼接。
- 引导句按 §0.6 缩短为「动作+结果」;`start_room` 去掉「双击使用」。
- 男女双目录、ogg+m4a,规范见 [00-global-ux.md](00-global-ux.md) §3。
---
## 7. 流程
```
start → 首局 GUIDE(G0–G5 + 长按教学)→ PLAY → ENDING
→ 二周目:单击继续 / 右滑重开
ENDING:单击=再来一局;阶段 2 后下滑=菜单(左右滑切换,单击确认)
```
BGM:探索 `bgm/drone`;菜单/结算 `bgm/menu`。禁止结算黑屏寂静。见 10 号文档。
---
## 8. 废止清单
| 废止 | 改为 |
|---|---|
| G6 双击使用 / 双击求提示 | 单击检查+使用;长按=我在哪 |
| 新手期识别双击;`doubleTapWindow` 300ms | `doubleTapWindow: 0`;双击当单击 |
| 引导期下滑=跳过引导 | 下滑=向下走;回访者开场单击跳过教案 |
| 60/120/180s 原样重播 L1/L2/L3;L3 每 60s 再念带路 | 迷茫三级 + 三档提示,不原样重复 |
| 双击兜底直通 L2 答案 | 长按一句状态;答案不白送 |
| 操作反馈只靠震动;iOS 静默 | 回执声必响 |
| 开场两段可跳过长旁白、零交互 | 第一句就滑 |
| 菜单:单击循环、双击确认 | 左右滑切换、单击确认 |
| 看门狗重播完整说明书 | 完整句 → 短句 → 提示音 |
| 句间恢复 BGM | 整链压低 |
仍有效:3×3 地图与谜题链、环境音 6 类、撞墙方位、目标名+方位进展句、空房首访、busy 手势缓存、结算链守卫、用时分段整句、存档字段。
地图格点与 as-built 差异对照见 [25-escape-map-flow.md](25-escape-map-flow.md)。交互以本文与 26-apply-escape 为准,不以旧代码双击语义为准。