266 lines
14 KiB
Markdown
266 lines
14 KiB
Markdown
# 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 缓存:**未改。**
|