14 KiB
25 · 《暗室》地图与流程(as-built 地图 + 26 号交互目标)
双轨声明(读本文前先读这一段)
- 交互目标以 26-audio-interaction-playbook.md 与 01-escape-redesign.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 §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 → 开柜→修电→开门。
分支:
- 回访者跳过教案:直进 PLAY,必须补播目标句(B8 保留)。
- 撞墙:闷响 + 方位句(每向整局语音一次)。
- 空房首访
empty_*(B5a)。 - 重访关键房:amb + 单击复核状态。
- 结算:链完可重开;
_settleBusy(B7)。 - 菜单:暂停语音队列;左右滑+单击。
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 缓存:未改。