# 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 为准,不以旧代码双击语义为准。