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

14 KiB
Raw Permalink Blame History

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 → 开柜→修电→开门。

分支:

  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 缓存:未改。