Files
SoundGame/docs/design/25-escape-map-flow.md
T
2026-10-01 23:26:47 +08:00

266 lines
14 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.
# 25 · 《暗室》地图与流程(as-built 地图 + 26 号交互目标)
> **双轨声明(读本文前先读这一段)**
>
> - **交互目标**以 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md) 与 [01-escape-redesign.md](01-escape-redesign.md) / [26-apply-escape.md](26-apply-escape.md) 为准。单击=检查+使用;长按=我在哪;**无双击使用**;迷茫三级接管,**禁止** 60/120/180s 原样重播说明书。
> - **地图数据仍以代码 as-built 为准**(`web/escape/game.js`),直到 01 号交互落地。房间坐标、环境音、谜题链、物品旗标、最短路径格点,以本文 §1 为准。
> - 语音 id 全文仍以 `tools/gen_voice_dual.py` 的 `ESCAPE_LINES` 为准。本文不改 voice-ids 文件。
>
> 旧「现行交互」(双击使用、G6、60/120/180 卡关广播、菜单双击确认)仅作代码对照,**不是**新实现依据。
---
## 0. 设计单(交互目标,附录 C)
完整矩阵、等待点、首 3 分钟、失败表见 [01-escape-redesign.md](01-escape-redesign.md) §0 与 26-apply-escape。摘录:
| 项 | 目标 |
|---|---|
| 核心动作 | 四向滑移动;单击检查并使用;长按问路 |
| Floor | 探索=`ACTION`(房间 amb 常驻);描述=`SPEAKING` 整链 duck |
| 新手手势 | 四向滑 + 单击;帮助=长按;`doubleTapWindow: 0` |
| 卡关 | 迷茫三级(短提示 → 只留方向 → 走一步),提示三档且不原样重复 |
| 第一句 | 「黑暗。朝任意方向,滑一下。」成功=脚步 ≤10s |
---
# 阶段一 · 地图 as-built(代码为准,保留)
## 1. 地图章
### 1.1 房间总图(3×3,x 0 西→2 东,y 0 北→2 南)
```
x=0(西) x=1 x=2(东)
y=0 ┌───────────┬───────────┬───────────┐
(北) │ (0,0) │ (1,0) │ (2,0) │
│ 电箱房 │ 空房·风 │ 空房·嗡鸣 │
│ amb_power │ amb_wind │ amb_hum │
├───────────┼───────────┼───────────┤
y=1 │ (0,1) │ (1,1) │ (2,1) │
│ 空房·嗡鸣 │ 起点 │ 铁柜房 │
│ amb_hum │ amb_drip │ amb_cabinet│
├───────────┼───────────┼───────────┤
y=2 │ (0,2) │ (1,2) │ (2,2) │
(南) │ 储物间 │ 空房·风 │ 大门 │
│ amb_storage│ amb_wind │ amb_gate │
└───────────┴───────────┴───────────┘
(通电后 amb_gate → amb_gate_live)
```
- **连通**:相邻四向全通。`_move()` 只做 0..2 边界。无锁门、无单向通道。
- **动作门**(目标语义):站在正确房间 **单击** 使用物品。代码 as-built 仍可能是双击,落地时改单击。
- **撞墙**:外圈 12 段。目标出界 → `sfx/wall` + `invalid` 回执 + `wall` / `wall_dir_*`。
- **起点**:(1,1)。`start_room` 是全图唯一「中央」绝对方位锚点(文案落地时去掉「双击使用」)。
### 1.2 每房间资产与点位
| 房间 | 坐标 | 环境音 | 进入描述(首到) | 单击检查+使用(目标) |
|---|---|---|---|---|
| 电箱房 | (0,0) | `amb_power` | `room_power` | 未修 `inspect_box_dead`;有保险丝 → `fix_box`;已修 `box_fixed` |
| 空房 | (1,0) | `amb_wind` | 无 / 首访 `empty_1` | `empty_1` |
| 空房 | (2,0) | `amb_hum` | 无 / 首访 `empty_3` | `empty_3` |
| 空房 | (0,1) | `amb_hum` | 无 / 首访 `empty_2` | `empty_2` |
| 起点 | (1,1) | `amb_drip` | 无 | `start_room` |
| 铁柜房 | (2,1) | `amb_cabinet` | `room_cabinet` | 未开 `inspect_cabinet_locked`;有钥匙 → `unlock_cabinet`;已开 `empty_1` |
| 储物间 | (0,2) | `amb_storage` | `room_storage` | 无钥匙 → `found_key`;否则 `empty_2` |
| 空房 | (1,2) | `amb_wind` | 无 / 首访 `empty_3` | `empty_3` |
| 大门 | (2,2) | `amb_gate` / `amb_gate_live` | `room_gate` | 未通电 `inspect_gate`;通电 `inspect_gate_ready` → 逃脱 |
要点(as-built 仍成立):
- 环境音 6 类铺 9 房;4 空房仅 wind×2、hum×2 对角,空房之间声学弱区分(B5a 首访 `empty_*` 已补)。
- 首到描述 `visited` 一次;进房每次播 amb;单击先重播 amb 再描述(约 800ms 间隔)。
- 大门通电切 `amb_gate_live`:唯一「谜题状态改环境」通道。
### 1.3 解谜链依赖图
```
[储物间 (0,2) 单击] ──hasKey──▶ [铁柜房 (2,1) 单击] ──hasFuse + cabinetOpen──▶
[电箱房 (0,0) 单击] ──powerOn──▶ [大门 (2,2) 单击] ──▶ 逃脱
```
`_stage()`:`key → cabinet → box → gate`。
**最短通关路径**(11 次移动 + **4 次单击**,约 2–3 分钟):
(1,1)→左(0,1)→下(0,2)【单击拾钥匙】→右(1,2)→右(2,2)→上(2,1)【单击开柜】→左(1,1)→左(0,1)→上(0,0)【单击修电】→右(1,0)→右(2,0)→下(2,2)【单击逃脱】。
代码 as-built 路径相同,使用动作仍为双击,直至 01 落地。
### 1.4 阶段 → 目标房间(导航用,不是 60/120/180 广播稿)
| `_stage()` | 判定 | 目标格 | 进展事件 |
|---|---|---|---|
| `key` | `!hasKey && !cabinetOpen` | (0,2) 储物间 | 拾钥匙、首到储物间 |
| `cabinet` | `hasKey` | (2,1) 铁柜房 | 开柜 |
| `box` | `cabinetOpen && !powerOn` | (0,0) 电箱房 | 修电 |
| `gate` | `powerOn` | (2,2) 大门 | 逃脱 |
L1 意象 / L2 明示 / L3 带路的 **旧 stuck_* 句仍是资产**,迷茫接管时:L1 用短方位或意象(不泄完整解法)、L2 只放行第一导航方向、L3 游戏走一步。 **不要**按无操作 60/120/180s 把 stuck_* 全文周期重播。
### 1.5 代码 vs 01 号:地图相关差异(仍以代码地图为准)
| # | 说明 |
|---|---|
| ③ | 首到储物间也计进展(KEY_ROOMS 四房)。保留。 |
| ⑪ | 环境音 8 文件 6 类(含 `amb_gate_live`)。保留。 |
| 交互类 ①②④⑤⑥⑦⑧⑨⑩ | **作废为交互依据**。落地后以 01 / 26-apply 为准(单击使用、长按帮助、无下滑跳过引导、迷茫接管、结算守卫、busy 缓存等)。 |
撞墙方位 `wall_dir_*`、目标名+方位 `gd_*_dir`、空房首访、busy 缓存、结算 `_settleBusy`、跳过路径补目标句:地图/流程资产 **保留**,接线改挂 26 号提示与迷茫,不再挂 60/120/180 广播。
---
# 阶段二 · 玩家流程(交互目标,非整份 as-built 手势表)
## 2. 流程章
### 2.1 全局状态机(目标)
```
start → 首局 GUIDE(G0 任意滑 → 碰墙 → 左 → 下储物间 → 单击钥匙 → 长按教学)
→ PLAY(ACTION 探索,谜题 key→cabinet→box→gate)
→ ENDING(结算链)→ 单击再来 / 阶段 2 下滑菜单
二周目:单击继续上次 / 右滑重开(不再上滑=整段重听引导)
```
- `_session` 令牌使旧计时器/语音回调失效:保留。
- 语音:玩家一动,非 `critical` 即停;`hint`/`feedback` 过期丢弃。废止「卡关提示永不顶句排队到玩家已经走了还播」。
- 单击跳句:PLAY 描述可跳;引导指令与关键获得 `critical`≤3s 给 `busy`。废止「引导全链绝对不可跳」与「关键获得 <10s 不可跳」的旧长度,改为拆短。
### 2.2 引导 G0–G7(目标;删除 G6 双击)
| 步 | 语音意图 | 等待 | 答对 |
|---|---|---|---|
| G0 | 黑暗。朝任意方向,滑一下。 | 任意滑(可 1.2s 无操作自动进 G1 的 as-built 可保留为兜底) | 脚步 + 对 |
| G1 | 再活动 | 任意滑 | 脚步 |
| G2 | 再滑两下试试墙 | 滑×2(可伪撞墙) | 闷响+方位 |
| G3 | 向左滑 | 左滑 →(0,1) | 脚步 |
| G4 | 向下滑 | 下滑 →(0,2) | storage amb |
| G5 | 单击检查 | 单击拾钥匙 | pickup + 钥匙句 |
| G6 | **删除** | — | — |
| G7 | 找能用钥匙开的东西。迷路按住屏幕。 | 长按一次后 PLAY | 帮助句 |
- 路线写死与地图一致。越轨:「先跟我走。」
- **下滑不是跳过引导**(下滑=向下走)。回访者开场单击跳过教案。
- `_guideBusy` 缓存首个手势,结束后补判(B6 保留)。
### 2.3 手势语义(目标)
| 手势 | GUIDE | PLAY | ENDING | MENU(阶段 2) |
|---|---|---|---|---|
| 四向滑 | 按步作答 / 移动 | 移动;撞墙闷响+`invalid`+方位 | `invalid` | 左右切项 |
| 单击 | G5 拾取等 | 检查+使用;SPEAKING 跳句 | 链完后重开;守卫期 `busy` | 确认 |
| 长按 | 帮助 | 我在哪(位置→目标→一个动作) | 重听结算 | 重听说明 |
| 双击 | 当单击 | 当单击(**不是使用**) | 当单击 | 当单击 |
| 下滑 | G4 向下走 | 向下走 | 打开菜单 | 关闭 |
废止:PLAY 双击使用/兜底 L2 答案;帮助=双击;菜单单击循环+双击执行;对局长按=旁白加速。
### 2.4 迷茫三级(取代 60/120/180 原文轰炸)
信号与权重见 26 号 §4.5(连续无效、乱滑、失败、静默)。探索静默可从约 40s 起计。达到 2 分触发,15s 冷却。
| 级 | 做什么 | 用哪些旧资产 |
|---|---|---|
| 1 | 一句短目标/方位,不原样再念 | `nav_*`、`gd_prog_*`、stuck L1 意象(去重) |
| 2 | 只放行第一导航方向,其余滑=`invalid` 不移动 | `sys_only_*` 口径;**不要**播 stuck L2 全文答案 |
| 3 | 「听我做一次。」朝目标走一步 | 脚步 + `sys_now_you`;**不要**每 60s 重播 stuck L3 带路长句 |
升到 3 后只留房间 amb。长按主动问:完整短状态句,前缀「再说一遍:」仅在玩家请求时。
**代码 as-built 仍可能跑** `_checkStuck` 60/120/180 与双击兜底 L1——落地时拆除或改接 Confusion,勿把旧计时器当设计。
### 2.5 关键路径(目标)
引导完整:G0–G5 + 长按 → PLAY 已持钥匙 stage=cabinet → 开柜→修电→开门。
分支:
1. 回访者跳过教案:直进 PLAY,必须补播目标句(B8 保留)。
2. 撞墙:闷响 + 方位句(每向整局语音一次)。
3. 空房首访 `empty_*`(B5a)。
4. 重访关键房:amb + 单击复核状态。
5. 结算:链完可重开;`_settleBusy`(B7)。
6. 菜单:暂停语音队列;左右滑+单击。
### 2.6 信息渠道(目标分层)
| 层 | 管什么 |
|---|---|
| 语音 | 要做什么、发生了哪件具体事 |
| 内容音 | 脚步/墙/机关/房间身份 |
| 系统回执 / turn / 等待或 amb | 收到没有、现在能否走 |
| BGM drone | 还在暗室 |
震动只补充。禁止只震。游戏层不自研第四套 earcon 词表。
---
## 3. 信息账本(资产保留,语义改挂)
### 3.1 语音 id 三类(80 句量级,资产对照)
**A 状态**:`start_room`、`room_*`、`empty_*`、`inspect_*`、`inv_*`、`wall`/`wall_dir_*`、`gd_next_fuse`、`gd_*_dir`、`gd_prog_*`、`time_band*`、`menu_*`、`reopen_prompt`。长按帮助改走短状态句(可复用 gd_prog / 新 lp_*)。
**B 反馈**:`g1_done`/`g5_key`、`found_key`/`unlock_cabinet`/`fix_box`/`escape`、`replay`/`again`、引导纠正 `guide_wrong_*`/`guide_blunt_*`/`guide_offpath`。`use_fail` 仅「这里没有可做的」;不再接 L2 答案。
**C 叙事教学**:`g0_*`/`g1_move`/`g2_wall`/`g3_left`/`g4_down`/`g5_inspect`/`g7_goal`。**`g6_doubletap` 停用**。`skip_hint` 若仍教「下滑跳过引导」则停用。
`stuck_*_1/2/3`、`nav_udlr`、`stuck_ask`:可拆进迷茫 L1 或停用周期广播。禁止游戏主动 30s 内原样重播同一 id。
### 3.2 状态维度(目标覆盖)
| 维度 | 怎么给 |
|---|---|
| 绝对方位 | 开局中央一句;长按含房间名 |
| 相对方位 | 进展链 `gd_*_dir`;迷茫 L1 短滑向 |
| 撞墙哪面 | `wall_dir_*` |
| 来过吗 | 首到描述;重访 amb 不同+单击复核 |
| 空房 | 首访 empty_* |
| 谜题进度 | 长按一句;`gd_prog_*` 作 L1 不泄题 |
| 主动查询 | **长按**,不是双击 L2 |
| 物品 | 检查句 / 长按带「身上有钥匙」 |
| 互动物 | 单击检查 |
| busy 手势 | 缓存补判 + `busy` 回执 |
| 结算完整 | `_settleBusy` |
---
# 阶段三 · 状态改进(B1–B8)在 26 号下如何用
取证仍在 `research/escape-state/`。下列条目 **地图与资产保留**,交互改挂:
| 项 | 保留 | 改挂 |
|---|---|---|
| B1 撞墙方位 | `wall_dir_*` + 同向限频 | 每向整局语音一次后只闷响+`invalid` |
| B2 目标名+方位 | `gd_cabinet_dir` 等 | 仍挂进展链尾 |
| B3 活跃迷路进度句 | `gd_prog_*` | **并入迷茫 L1**,取消与 60/120/180 平行的 150s 第二广播 |
| B4 查询降级 | 不泄 L2 | 查询入口改为长按;双击兜底删除 |
| B5a 空房首访 | empty_* 映射 | 保留 |
| B6 busy 缓存 | 补判 | 保留;回执 `busy`/`ok` |
| B7 结算守卫 | `_settleBusy` | 守卫期回执 `busy` |
| B8 任何路径进 PLAY 有目标句 | g7_goal | 保留;回访者可跳 |
B9 角落词改词、B5b 空房改词:仍可选分期,不阻塞 26 号落地。
F1–F9 已实施的代码事实(round2 勾账)仍是 **as-built 证据**;其中 F4 双击兜底、F3 平行 150s 计时器、卡关 60/120/180 **在交互目标里废止或改接 Confusion**。playtest 条数以落地后 13 号 + 26-apply-escape 为准。
实施裁定 1–7(F6 留档、B4 记账、B3 作废计入、skip 链 guideStep=7、empty 映射、缓存绕过跳过、B1 开播记账)在 **不与单击使用/长按帮助/迷茫三档冲突** 的范围内可继续当实现细节。
---
## 4. 废止清单(本文曾作为交互权威的部分)
| 废止 | 改为 |
|---|---|
| 本文「以代码手势为准」盖过 01/26 | 地图 as-built;交互 26/01 |
| 双击使用;G6;双击兜底 L2 | 单击检查+使用;长按状态 |
| 无操作 60/120/180 原样 L1/L2/L3;L3 每 60s 重播 | 迷茫三级 + 三档提示 |
| 引导下滑跳过;上滑重听整段引导 | 下滑=向下;回访者单击跳过教案 |
| 菜单单击循环/双击执行 | 左右滑+单击 |
| 只震不响;提示永不打断 | 回执;玩家一动非 critical 即停 |
| 帮助藏在「错误的地方双击」 | 长按,首 3 分钟教一次 |
房间格点、amb id、谜题旗标、最短路径坐标、wall_dir/gd_*_dir/empty 映射、结算守卫、busy 缓存:**未改。**