策划轮:25-escape-map-flow.md as-built地图/玩家流程/信息账本+盲区清单(S1-S7)+方案B1-B8 实施(玩法零改动,只加状态引导层): - F1 撞墙方位句「左边是墙」(wall_dir_*×4,同向10s限频) - F2 目标句并入方位「铁柜,在右面的房间」(gd_*_dir×3) - F3 无进展150s活跃计时器+gd_prog_1..3进度重述(只重述不泄题,专治活跃迷路玩家——修卡关计时从「无进展」退化为「无操作」的既定偏差) - F4 双击兜底直通L2降级L1(不再白送答案) - F5 空房首访描述(4空房可区分) - F7 busy窗口手势缓存补判(原静默吞手势) - F8 结算链单击守卫(time_band/again完整到达) - F9 跳过引导补播目标句 - F6 空房方位特征句按25号裁定留档后续轮 新增语音10句×2性别(flock串行QC无离群,ASR逐字正确) 验证:escape playtest 235/235(+85新断言)+ guide 132/132 + 终检全绿 + 14游戏回归零回退 live复跑10.4分钟通关:零截断,S1-S7盲区逐条核销 档案 research/escape-state/round1-2;01号文档追加修订记录R1
50 KiB
25 · 《暗室》地图与玩家流程文档 + 状态引导改进方案
as-built 声明:本文档为「以代码为准」的现行实现文档化,权威来源是
web/escape/game.js(837 行,R2 重设计 + round1~round4 历次 live 修复), 与 01 号设计文档(01-escape-redesign.md)对账,凡不一致处以代码为准, 差异全录于 §1.5。语音 id 全集与全文以tools/gen_voice_dual.py的ESCAPE_LINES(80 句)为准。阶段三「状态引导改进方案」的取证材料在
research/escape-state/round1/(mock 转写 + live 真机一局 + P1/P3 人设评审)。方案只产出设计,未实施。轮次:escape-state round1(2026-09-14)。靶问题(用户真机反馈): 玩家不知道自己的状态——不知道自己在哪、不知道目标、不知道进度。
阶段一 · as-built 文档化
1. 地图章
1.1 房间总图(3x3,坐标 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 边界检查 (game.js:394-417),内部 12 条边全部可走。全图无锁门、无单向通道, 唯一"锁"是动作门(双击使用物品的前置条件),不是空间门。 - 撞墙边界:仅外圈 12 段墙。撞墙 = 目标坐标出界 →
sfx/wall闷响 +error震 +voice/wall「那边是墙,换个方向。」(每次撞都播, game.js:397-404)。 - 起点:(1,1) 正中央,检查语音
start_room「你站在设施中央的房间里」 ——"中央"是全图唯一一次给出的绝对方位锚点(见 §3 盲区 S1)。
1.2 每房间资产与点位表
| 房间 | 坐标 | 环境音 id | 进入描述(仅首到) | 单击检查语音(状态相关) | 双击使用 |
|---|---|---|---|---|---|
| 电箱房 | (0,0) | sfx/amb_power |
room_power「这个房间的墙上,有一只电箱。」 |
未修 inspect_box_dead / 已修 box_fixed |
hasFuse → fix_box(修电) |
| 空房 | (1,0) | sfx/amb_wind |
无 | empty_1「空空荡荡,只有你自己的回声。」 |
兜底 |
| 空房 | (2,0) | sfx/amb_hum |
无 | empty_3「除了远处的水滴声,这里什么都没有。」 |
兜底 |
| 空房 | (0,1) | sfx/amb_hum |
无 | empty_2「摸到的只有冰冷粗糙的墙壁。」 |
兜底 |
| 起点 | (1,1) | sfx/amb_drip |
无 | start_room(中央房间+操作总览) |
兜底 |
| 铁柜房 | (2,1) | sfx/amb_cabinet |
room_cabinet「这个房间里,立着一个铁柜。」 |
未开 inspect_cabinet_locked / 已开 empty_1 |
hasKey → unlock_cabinet(得保险丝) |
| 储物间 | (0,2) | sfx/amb_storage |
room_storage「货架上堆满杂物,角落里传来水滴声。」 |
有钥匙且柜未开 → 拾取钥匙 found_key;否则 empty_2 |
兜底 |
| 空房 | (1,2) | sfx/amb_wind |
无 | empty_3 |
兜底 |
| 大门 | (2,2) | sfx/amb_gate(通电后 amb_gate_live) |
room_gate「面前,是一扇沉重的铁门。」 |
未通电 inspect_gate / 已通电 inspect_gate_ready |
powerOn → 逃脱结算 |
要点:
- 环境音 6 类铺 9 房:4 间空房只有 2 种音(wind×2、hum×2)且成对角分布 ((1,0)/(1,2) 风、(0,1)/(2,0) 嗡鸣)——空房之间声学不可区分(盲区 S5)。
- 首到描述只播一次(
visited集合,game.js:112,412-416);重访关键房间 零语音,只换环境音。 - 进房间自动播环境音(每次移动都播,game.js:429-431),单击检查也先重播 环境音再播描述(800ms 间隔让环境音先进耳朵,game.js:446-448)。
- 大门通电后环境音切换
amb_gate_live是唯一一条"谜题状态改变可听觉感知" 的环境通道(01 号文档 §4.4 的设计意图,代码兑现)。
1.3 解谜链依赖图
[储物间 (0,2) 单击] ──得钥匙──▶ [铁柜房 (2,1) 双击] ──得保险丝──▶
[电箱房 (0,0) 双击] ──通电──▶ [大门 (2,2) 双击] ──▶ 逃脱结算
hasKey=true cabinetOpen=true powerOn=true
hasFuse=true
- 链上 4 个动作,每个都是"在对的房间双击",前置 = 上一环的物品/状态。
- 物品即进度:
hasKey/hasFuse为真即代表链推进到对应环;cabinetOpen/powerOn为真代表该环完成。_stage()(game.js:538-543)按此回退链判定 当前阶段:key → cabinet → box → gate。 - 最短通关路径(11 次移动 + 1 单击 + 3 双击,约 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)【双击逃脱】。 注意这条最短路径恰好绕过所有空房,且铁柜房/电箱房的方位句 (H1)在这条路径上分别给出"右面的房间"(储物间→铁柜房)与 "左面的房间"(铁柜房→电箱房)。
1.4 房间 → 谜题 → 状态映射表
阶段 _stage() |
判定条件 | 目标房间(L3 带路 STAGES) | L1 暗示 | L2 明示 | 进展事件(清已播级别) |
|---|---|---|---|---|---|
key |
!hasKey && !cabinetOpen |
(0,2) 储物间 | stuck_key_1 铁锈味意象 |
stuck_key_2 西南角储物间单击 |
拾钥匙、首到储物间 |
cabinet |
hasKey |
(2,1) 铁柜房 | stuck_cabinet_1 钥匙在你身上 |
stuck_cabinet_2 东边铁柜房双击 |
开柜(得保险丝) |
box |
cabinetOpen && !powerOn |
(0,0) 电箱房 | stuck_box_1 电流声意象 |
stuck_box_2 西北角电箱房双击 |
修电箱 |
gate |
powerOn |
(2,2) 大门 | stuck_gate_1 电已通 |
stuck_gate_2 东南角大门双击 |
逃脱 |
- 进展事件调
_progressEvent():清空_stuckShown,下段静默期从 L1 重新分级 (game.js:578-582)。 - 代码把首到储物间也算进展事件(KEY_ROOMS 含 (0,2)),01 号文档 §3.1 只列了铁柜房/电箱房/大门——差异见 §1.5-③。
1.5 代码 vs 设计文档差异清单(以代码为准)
| # | 01 号设计文档 | 现行代码 | 性质 |
|---|---|---|---|
| ① | §3.1/§3.2 卡关计时"以上一次进展事件起算"(无进展 60/120/180s) | 按"无操作时长"计时:PLAY 阶段任何有效手势重置计时(game.js:26-31,160-164,589-612) | round1-live 修复(原机关枪式报答案+顶语音),设计意图被反向修订 |
| ② | §2.1 G0「单击继续」+ CONFIRM 震 | intro 播完 1.2s 无操作自动推进 G1(game.js:205-211);G0 单击仍有效 | round2-live 修复(intro 后死寂 17~91s) |
| ③ | §3.1 进展事件列"首到铁柜房/电箱房/大门" | 首到储物间同样计进展(KEY_ROOMS 四房间统一处理) | 代码超集 |
| ④ | §2.1「引导期间任何步骤可下滑跳过」 | 仅 G0/G3/G5/G6 可下滑跳过;G1/G2/G4 下滑=作答(game.js:239-245) | 13 号文档裁定,round2-live 修复教学链断裂 |
| ⑤ | §3.2「双击无目标兜底:先播背包,再播 L2」 | 在关键房间内播 use_fail 而非背包;非关键房才播背包(game.js:519-527) |
代码细化 |
| ⑥ | 14 号文档 v1 裁定 5/§2:「连续撞墙 ≥2 次 → full 档卡关三级阈值提前一级」 | 未落地:game.js 无任何撞墙连击/阈值提前逻辑(已核实无 wallStreak 类状态) | 文档先行、代码缺失,以代码为准(=无此功能) |
| ⑦ | §2.1 G2 反馈含"未撞墙:脚步 + SWIPE_OK"分支 | 引导期位置固定,滑动即撞墙反馈(每滑必 wall 闷响+error 震+wall 语音),无"未撞墙"分支(game.js:264-272) | 设计草案分支不存在 |
| ⑧ | §2.1 G6 反馈「兜底播报背包 + CONFIRM 震」 | G6 双击答对播 inv_key+g6_done+g7_goal 链(无单独 confirm 震,靠引擎双击内置 confirm) |
等价 |
| ⑨ | (01 号文档无 REOPEN 相) | 存在 REOPEN 二周目阶段:上滑重听引导/单击直接开始(game.js:54-55,143-151) | 01 号文档 §2.1 末段提到过一次,代码为完整实现 |
| ⑩ | §3.2 L1 附"语音提示前播'需要帮助吗?'" | stuck_ask 仅 L1 前插播,L2/L3 无(game.js:607-611) |
一致(此处列出防误扩) |
| ⑪ | 01 号文档 §4.2「环境音扩到 6 种」 | 实际 8 个环境音资产 6 类(含 amb_gate_live 通电变体) |
一致(超集) |
另注:14 号文档 round2 F2.3「撞墙接播 guide_blunt_
方位句」曾被落地、 后被 round1-live 回退为只播voice/wall 极简句(game.js:400-403 注释),
教学腔方位句仅限引导期 G3 纠错路径——这条历史是阶段三 B1 方案的前车之鉴
(方位信息要给,但措辞不能再走教学腔)。
2. 玩家流程章
2.1 全局状态机
┌────────────── 首次开局 ──────────────┐
▼ │
start ─▶ REOPEN(二周目才有:上滑重听引导/单击直接开始)
│ 首局自动
▼
GUIDE(脚本化教学,玩家手势推进,G0→G7)
│ G6 双击答对 → g7_goal 链播完 _finishGuide
│ G0/G3/G5/G6 下滑跳过 → guide_skip → PLAY
▼
PLAY(自由探索 + 卡关三级提示计时器;谜题链阶段 key→cabinet→box→gate)
│ 大门双击(powerOn)→ _escape()
▼
ENDING(结算链 escape→time_band→again;单击重开 / 下滑菜单)
│ 下滑
▼
MENU(模态:单击循环选项 / 双击执行 / 上滑帮助 / 下滑关闭)
- 会话令牌
_session:重开/跳过/回大厅时递增,使旧计时器与语音链回调 全部失效(game.js:98,826-831)。 - 语音纪律基础设施:待播队列
_pendingVoice(kind=stuck卡关提示 /describe补发检查),只在当前语音自然播完后播出,绝不顶句;待播期间 玩家任何操作即作废卡关提示(未播级别不计入已播,game.js:125,783-810)。 - 单击跳句(12 号文档):可跳句播放中单击 =
skipVoice()跳过本句 + 补发检查 (环境音即时重播、描述进待播队列);不可跳句(引导 G0-G7、关键获得链、 L3 带路)单击 = 忽略(game.js:377-388,445)。
2.2 引导子状态 G0-G7(GUIDE 阶段)
| 步 | 语音(全文见 §3 账本) | 等待手势 | 答对反馈 | 答错(3 次给 blunt+warning 震) |
|---|---|---|---|---|
| G0 | g0_intro(剧情) |
单击;1.2s 无操作自动推进 | g1_move+skip_hint | intro 播放中滑动=忽略;空档滑动=guide_offpath「先跟我走。」 |
| G1 | g1_move「朝任意方向滑一下」 |
任意滑动(下滑也算作答,不可跳过) | step + g1_done + g2_wall |
guide_wrong_gesture |
| G2 | g2_wall「再滑两下,试试碰碰墙」 |
滑动×2(每滑必播 wall 闷响+error 震+wall) |
满 2 次 → wall+g3_left |
非滑动 = wrong_gesture |
| G3 | g3_left「向左滑。」 |
左滑(→(0,1)) | step + g4_down |
其他滑动 = guide_wrong_left |
| G4 | g4_down「再向下滑。」 |
下滑(→(0,2) 储物间) | step + amb_storage + g5_inspect |
其他滑动 = guide_wrong_down |
| G5 | g5_inspect「单击检查」 |
单击 → 拾钥匙 | pickup + g5_key |
非单击 = wrong_gesture |
| G6 | g6_doubletap「双击试试」 |
双击 | inv_key+g6_done+g7_goal |
非双击 = wrong_gesture |
| G7 | g7_goal「找到能用这把钥匙打开的东西…」 |
(无,链播完自动进 PLAY) | — | 手势忽略 |
- 引导期位置是脚本写死的:(1,1)→(0,1)→(0,2),与真实地图一致;G2 的"撞墙" 是伪撞墙(位置并未移动)。
_guideBusy推进语音播放中忽略一切非跳过分手势——这是阶段四 live 局 抓到的事故点(盲区 S6):G3 答案在 busy 窗口内被吞,玩家紧接着的下滑被 当成"跳过引导"。
2.3 手势语义总表(逐阶段)
| 手势 | REOPEN | GUIDE | PLAY | ENDING | MENU |
|---|---|---|---|---|---|
| 上滑 | 重听引导 | 下滑跳过仅限 G0/G3/G5/G6,上滑无跳过语义;其余步上滑=答错/忽略 | 移动(dy=-1) | 忽略 | 播 help_ops 操作说明 |
| 下滑 | 忽略 | G0/G3/G5/G6=跳过引导;G1/G2/G4=作答 | 移动(dy=+1) | 打开菜单 | 关闭菜单 |
| 左/右滑 | 忽略 | 按步骤判定(G3 左滑=答案) | 移动(dx=∓1) | 忽略 | 忽略 |
| 单击 | 直接开始(stopVoice+进 PLAY) | 按步骤判定(G0/G5=推进/拾取) | voice 播放中=跳句+补检查;无 voice=检查 | 重开一局 | 循环切换菜单项(播选项名) |
| 双击 | 忽略 | 按步骤判定(G6=答案) | 使用物品:有目标=解谜动作;无目标=兜底(背包或 use_fail + stuck_<stage>_2 L2 明示) |
忽略 | 执行当前项 |
| 长按 | 引擎:旁白快进(后松开) | 同左 | 同左 | 同左 | 同左 |
- escape 的手势映射全面偏离全局默认(四向滑=移动、双击=使用而非重听), 00 号文档 §5.3 豁免表已备案;偏离内容在引导 G1/G2/G5/G6 逐一手把手教过。
- PLAY 阶段没有菜单、没有上滑帮助(00 §5.3:帮助入口 = 双击兜底 + 卡关计时器)——"主动查状态"在 escape 里只有双击兜底一个口子,而它直通 L2 明示(盲区 S4)。
2.4 卡关三级提示(PLAY 阶段自动触发)
| 级别 | 触发(现行代码:无操作时长) | 内容 | 附带 | 重复规则 |
|---|---|---|---|---|
| L1 暗示 | 60s 无任何手势 | stuck_ask「需要帮助吗?」+ stuck_<stage>_1 意象句 |
warning 震 | 每进展段 1 次 |
| L2 明示 | 120s | stuck_<stage>_2 直接点明房间+动作 |
warning 震 | 每进展段 1 次 |
| L3 带路 | 180s | stuck_<stage>_3 + nav_* 按当前坐标算路(每轴一句,最多两句,先东西后南北) |
warning 震 | 此后每 60s 无操作重复,按当时坐标重算 |
- 队列与作废:提示只进待播队列,等当前语音播完;待播期间玩家任何操作
即作废(
_dropPendingStuck,game.js:803-810)。→ 活跃玩家可能连 L1 都 听不到,但它本来就不该听到(计时按无操作)。 - 双击兜底 = 另一条 L2 通道(game.js:519-527):在关键房间播 use_fail、
在非关键房播背包,都接
stuck_<stage>_2——玩家主动探状态会被直接 喂答案(阶段四 live 两次实录,见盲区 S4)。 - 14 号文档裁定的"连续撞墙 ≥2 次阈值提前一级"未落地(§1.5-⑥)。
2.5 关键路径与分支
主路径(引导完整走):REOPEN(跳过)→ G0 intro → G1 滑一步 → G2 撞墙×2 → G3 左滑 → G4 下滑进储物间 → G5 单击拾钥匙 → G6 双击 → G7 目标陈述 → PLAY(已持钥匙,阶段=cabinet)→ 自由探索开柜→修电箱→开门。 引导结束瞬间玩家已知:移动方式、撞墙反馈、检查、双击、背包里有钥匙、 下一步目标 = 找锁。这是全游戏信息最充裕的时刻。
分支与边界路径:
- 跳过引导(G0/G3/G5/G6 下滑):
guide_skip「跳过引导,直接开始自由 探索。」→ 直接 PLAY,不持钥匙、没听过 g7_goal——开局只有start_room一句操作总览,目标维度完全空白(盲区 S4,live 实录)。 - 二周目 REOPEN:上滑=重听引导;单击=直接开始(播 start_room)。
- 撞墙:外圈 12 段;反馈 wall 闷响+error 震+
wall极简句。无方位 信息(教学腔方位句已被 round1-live 回退,§1.5 注)。 - 双击兜底:非关键房 = 背包句 + L2;关键房 = use_fail + L2。
(live 实录:柜已开后再双击铁柜房,听到 use_fail +
stuck_box_2—— 玩家并没有卡关,答案句白送。) - 空房:进入只播环境音(与邻房可能同音),单击才播 empty_*。
- 重访关键房间:零语音(首到描述只一次)。
- 结算:escape 链(不可跳)播完淡入 bgm/menu;单击=立即重开
(
_restart不管结算链是否播完——live 实录结算链被单击截断, time_band/again 未播,见盲区 S7);下滑=菜单(重开/回大厅/返回)。 - 菜单:暂停一切(escape 无局内计时器,影响仅限语音队列)。
2.6 各阶段玩家可获得的信息渠道
| 阶段 | 语音 | earcon/音效 | 震动 | 环境音 | BGM |
|---|---|---|---|---|---|
| REOPEN | reopen_prompt | turn cue | —(等抉择) | — | bgm/drone |
| GUIDE | 逐句指令+纠错(不可跳) | step/wall/pickup | error(答错)/warning(3 连错)/pickup(拾钥匙)/引擎内置 swipe/confirm | amb_storage(G4 到储物间) | bgm/drone |
| PLAY | 首到房间描述/检查句/进展链(found_key→gd_room_*)/卡关三级/双击兜底 | step/wall/pickup/unlock/door_creak/spark/power_on/gate_open/win_chime | error(撞墙/无效使用)/success(开柜修电/逃脱)/pickup(拾钥匙)/warning(卡关提示)/引擎 swipe | 每房进来自动播,单击可重听 | bgm/drone |
| ENDING | escape+time_band+again(不可跳) | gate_open(后移 2.6s)+win_chime | success | — | drone 淡出→bgm/menu 淡入 |
| MENU | menu_open+选项名/help_ops | — | confirm(双击执行) | — | bgm/menu |
信息渠道的四division 铁律(14 号裁定 7):语音说"你要做什么"、earcon 说 "哪类事/哪个状态"、BGM 说"宏观状态"、震动说"刚才那下对不对"。escape 的 earcon 仅向导层 8 签名(explore/menu/settle/turn)+ 内容音效;游戏层没有 任何自研 earcon——方位/进度类信息目前没有 earcon 通道可用(新增需走 14 号文档的引擎词表修订,或改用语音/环境音通道)。
3. 信息账本(语音 id 全集三类归档 + 盲区清单)
3.1 语音 id 全集(80 句,按「状态告知 / 操作反馈 / 叙事·教学」三类)
A 类 · 状态告知(回答"我在哪/我有什么/进展如何/系统处于什么状态"):
| id | 全文(摘要) | 覆盖的状态维度 |
|---|---|---|
start_room |
你站在设施中央的房间里。滑动移动,单击检查,双击使用物品。 | 绝对方位(唯一一次)+ 操作总览 |
room_storage / room_cabinet / room_power / room_gate |
储物间/铁柜/电箱/大门 首到描述 | 房间身份(仅首到) |
empty_1/2/3 |
空空荡荡/冰冷墙壁/远处水滴 | 空房身份(仅单击检查时) |
inspect_cabinet_locked / inspect_box_dead / box_fixed / inspect_gate / inspect_gate_ready |
各互动物状态描述 | 谜题对象状态 |
inv_empty/key/fuse/both |
背包四档 | 物品持有 |
wall |
那边是墙,换个方向。 | 边界负信息(无方位) |
stuck_ask + stuck_<stage>_1 ×4 |
需要帮助吗?+ 意象暗示 | 目标(L1 级,意象) |
stuck_<stage>_2 ×4 |
点明房间+动作 | 目标(L2 级,明示) |
stuck_<stage>_3 ×4 + nav_udlr ×4 |
带路 | 目标+路线(L3 级) |
gd_next_fuse |
保险丝到手。接下来,去找电箱。 | 目标(进展事件当下) |
gd_room_l/r/u/d |
左/右/上/下面的房间。 | 目标相对方位(无目标名) |
time_band1-4 |
用时四档整句 | 结算用时 |
use_fail |
这里没有用得上东西的地方。 | 无效使用(状态否定) |
menu_open/restart/home/back + help_ops + reopen_prompt |
菜单与帮助 | 系统状态 |
box_fixed(重复列出处归入检查) |
— | — |
B 类 · 操作反馈(回答"刚才那下对不对/成了没"):
| id | 全文(摘要) | 触发 |
|---|---|---|
g1_done / g5_key / g6_done |
引导答对确认 | 引导 G1/G5/G6 |
found_key |
摸到钥匙(长句,不可跳) | 拾取 |
unlock_cabinet |
开柜得保险丝(不可跳) | 解谜成功 1 |
fix_box |
装保险丝通电(不可跳) | 解谜成功 2 |
escape |
逃脱结算(不可跳) | 通关 |
replay |
黑暗再次合拢(重开) | 重开 |
again |
单击再来一次(结算链尾) | 结算 |
use_fail(兼 A 类) |
无效使用 | 双击无目标 |
guide_wrong_up/down/left/right/gesture ×5 |
不是这个方向/操作 | 引导答错 |
guide_blunt_up/down/left/right ×4 |
直白重述(3 连错) | 引导连续答错 |
guide_offpath |
先跟我走。 | 引导期越轨滑动 |
C 类 · 叙事·教学(铺氛围/教手势,不承担状态):
| id | 全文(摘要) |
|---|---|
g0_intro |
黑暗。你在废弃的地下设施里醒来…… |
g1_move / g2_wall / g3_left / g4_down / g5_inspect / g6_doubletap / g7_goal |
引导指令六步 + 目标陈述 |
skip_hint / guide_skip |
跳过旁白提示 / 跳过确认 |
reopen_prompt(兼 A) |
二周目抉择 |
3.2 状态维度 × 信息渠道矩阵(空白格 = 盲区)
| 状态维度 | 语音 | 环境音 | 震动 | earcon/BGM | 结论 |
|---|---|---|---|---|---|
| 绝对方位(我在图上的哪格) | 仅开局 start_room 一句"中央";L2 角落词 |
无 | 无 | 无 | 盲区 S1 |
| 相对方位(目标在我哪边) | 仅进展链当下(gd_room)+ L3 带路 | 无 | 无 | 无 | 半盲区(时机太窄) |
| 撞墙方位(哪面不通) | 无(教学腔已被回退) | 无 | 无(撞墙=error 通式) | 无 | 盲区 S1b |
| 已探索地图(我来过这吗) | 无(首到描述不重复,重访零语音) | 无 | 无 | 无 | 盲区 S2 |
| 空房身份(这屋是哪间) | 仅单击检查时 empty_*,且文本无方位 | 2 种音铺 4 房,不可区分 | 无 | 无 | 盲区 S5 |
| 谜题链全局进度(几环完成/还剩几环) | 无主动渠道;inv_* 只报物品 | 仅大门通电有 amb_gate_live | 无 | 无 | 盲区 S3 |
| 当前目标(L0 轻量重述) | 仅引导尾 g7_goal(跳过即永久丢失)+ 进展链当下一句 | 无 | 无 | 无 | 盲区 S4 |
| 主动查询入口 | 双击兜底 = 直通 L2 明示(泄漏) | — | — | — | 盲区 S4b(机制错配) |
| 物品持有 | inv_* ✓(双击兜底时) | �� | 拾取时 pickup ✓ | 无 | 基本覆盖 |
| 互动物状态(锁/电/门) | 检查语音 ✓ | 大门通电 ✓ | 解谜 success ✓ | 无 | 覆盖(需玩家记得检查) |
| 卡关计时器状态 | 无(提示到点才出现) | — | — | — | 设计内,不动 |
| 引导 busy 窗口(我手势算数吗) | 无 | 无 | 仅引擎 [10] | 无 | 盲区 S6(事故级) |
| 结算完整性(我通关用时/重开确认) | 结算链可被单击无条件截断 | — | — | — | 盲区 S7 |
S1/S2/S3/S4/S5 是用户真机反馈"不知道自己在哪/目标/进度"的精确落点; S6/S7 是 live 局新抓到的机制级盲区。S1b(撞墙无方位)是 P1 评审的死线项。
阶段三 · 状态引导改进方案(escape-state round1)
4.0 取证摘要
- mock 转写(
research/escape-state/round1/transcript-mock.md):引导完整 路径(G0-G7 全覆盖),证明"引导结束时信息最充裕";此后唯一信息增量来自 进展链(mock 行 107-108、126:gd_next_fuse + 方位句)。 - live 真机一局(
research/escape-state/round1/live-transcript.md,女声响 full 档,约 14 分钟,打到通关并重开):52 个语音段,55 条判定行 (OK 35 / SFX_BGM_ONLY 18 / TRUNCATED 2;两条 TRUNCATED 均有玩家手势 归因,非资产缺陷)。 关键事件:引导期 busy 吞手势(行 30-35)、误触下滑跳过引导(行 61-74)、 双击兜底两次直通 L2 明示(行 161-178、230-243)、结算链被单击截断 (行 253-275)、L1/L2/L3 三级按时触发且 L3 每 60s 按坐标重算重播 (行 75-86、288-294、295-346)。 - 人设评审:P1 视障(
p1-blind.md)+ P3 白领(p3-office.md),双席对 盲区清单达成一致。
设计约束(本方案全部条目的共同红线):
- 00 号宪法:整句预生成、禁运行时拼接;数字信息分档整句;震动语义按 00 §2.2 既有 10 震型、不新增语义震;手势映射零改动(上滑仍是移动)。
- 14 号向导层:三档语义(full=earcon+语音+震 / standard=耳标+震 / off= 全静);新 earcon 不进本方案(引擎 8 签名词表修订成本过高,方位与进度信息 一律走语音通道,游戏反馈层全档位,与 gd_next_fuse/gd_room 先例同级)。
- 归因真话律:进度句报的完成数必须等于真实状态机(hasKey/cabinetOpen/ powerOn 派生),不许多报少报。
- 难度不降低:所有新语音只报"状态与方向",不报"做法";L2/L3 的到达不因 新通道提前或变频繁。
- 节奏不破:单局 15-30 分钟的宏观节奏由谜题链决定,新播报全部挂在 "进展事件 / 首次 / 限频"上,不给活跃玩家增加语音负担。
4.1 方案条目
B1 · 撞墙报方位(陈述式,非教学腔)
- 问题(证据):撞墙反馈只有
wall「那边是墙,换个方向。」——无方位。 live 行 40-55 连撞两次地图零增量;P1「每次错都学不到东西」、P3「盲操的 试错成本全是沉没成本」。14 号 F2.3 曾用guide_blunt_*「手指贴着屏幕,向 X 推一下」补方位,被 round1-live 以"教学腔中后期出戏"回退——回退掉的是 措辞,方位信息本身没有错杀的理由。 - 目标状态:玩家每次撞墙都能建立一个"此方向不通"的地图标记,措辞是 世界内陈述句而非操作教学。
- 方案:新增 4 句整句(游戏反馈层全档位,撞墙既有链路
sfx/wall+error 震+wall播完后接播,被下一次移动打断则自然作废——复用 F2.3 原接线模式):wall_dir_l「左边是墙。」 /wall_dir_r「右边是墙。」 /wall_dir_u「上边是墙。」 /wall_dir_d「下边是墙。」- 触发:PLAY 阶段撞墙、
voice/wall播完后、同方向 10s 内限频 1 次 (防贴墙连撞连播)。仅报方位事实,不说"换个方向/推一下"——后半句 现有wall已覆盖。 - 方位 = 滑动方向(escape 移动坐标系),按真实撞墙方向取句,归因真话。
- 震动:沿用 error,不新增。
- 宪法条款:00 §2.2(既有 error 震型);00 §3.2(整句预生成);14 裁定 7 (语音报事实、耳标报类别——本句是纯语音通道);14 F2.3 先例(接线模式)。
- 拥挤评估:撞墙在 3x3 图中的理论上限是外圈 12 段;限频后一局新增语音 ≤6-8 句短句(各 ≤5 字),对 15-30 分钟单局节奏影响可忽略。风险:贴墙探索 型玩家会听到成串方位句——10s 同向限频 + 移动即作废已把上限压住。
B2 · 目标方位句并入目标名(H1 的措辞升级)
- 问题(证据):H1 方位句只有方向词无目标名:「右面的房间。」(live 行 112-116、156-160、201-208)。P3:嘈杂环境 1.3s 短句被吃掉后只剩"……的 房间"(行 206-208 ASR sim 0.75 实证);P1:"右面是哪?我赌不起"。三处 触发点(found_key / gd_next_fuse / fix_box)在谜题链正常路径上位置固定, 方位可枚举。
- 目标状态:进展链尾玩家听到"目标名 + 方位"一体句,单句即可行动。
- 方案:新增 3 句整句替换三处
gd_room_*接播(接线点不变,全档位):- found_key 链尾 →
gd_cabinet_dir「铁柜,在右面的房间。」(储物间 (0,2) → 铁柜房 (2,1),轴序先东西,dx=+2 固定为右) - unlock_cabinet/gd_next_fuse 链尾 →
gd_box_dir「电箱,在左面的房间。」 (铁柜房 (2,1) → 电箱房 (0,0),dx=−2 固定为左) - fix_box 链尾 →
gd_gate_dir「大门,在右面的房间。」(电箱房 (0,0) → 大门 (2,2),dx=+2 固定为右) - 原
gd_room_l/r/u/d4 句保留不删(guide.test.mjs 的 H1 方向映射断言与 playtest 断言引用它们,删除触碰断言零改动红线);新句并行接线,仅替换 三处触发点。方位若在异常路径上计算结果与枚举不符(理论上不存在——三处 触发点坐标固定),兜底回落gd_room_*。
- found_key 链尾 →
- 宪法条款:00 §3.2(整句);归因真话(方位按房间图枚举核对过:三处 触发点→目标均同排/跨排但轴序先东西,方向唯一);14 H1 裁定(接线模式 原样,只改词)。
- 拥挤评估:3 处替换、0 处新增播出次数;句长 +4 字。对节奏零影响。 附带收益:修了 P3 的"关键信息听不清"——信息密度翻倍,重听价值也翻倍。
B3 · 无进展计时器 + L0 进度重述(活跃迷路通道)
- 问题(证据):卡关计时按"无操作"(§1.5-①,round1-live 修订),活跃 但无进展的玩家永远不会收到任何状态输入——live 局我在解谜链外探路时 (行 87-94、179-220 各段 transit)游戏只给我脚步和环境音。01 号文档原始 设计是"无进展起算",代码把"无进展"改成"无操作"后,"活跃迷路"这个状态 从提示体系里消失了。用户反馈"不知道进度"正是这个空洞。
- 目标状态:玩家长时间有操作但零进展时,收到一条不泄题的进度重述, 知道自己已完成几环、目标仍是什么,而不是答案。
- 方案:
- 新增独立计时:以
_progressEvent()起算的"无进展时长"(与现有无操作 计时器并存,互不复位)。触发点:无进展 ≥150s 且期间有 ≥5 次有效手势 (=活跃探索,排除挂机——挂机交给现有 60s L1 体系)→ 每进展段限 1 次。 - 播报内容(整句分档,不拼接,归因真话——完成数由
_stage()反推):gd_prog_1「钥匙已经到手。找到能用它的锁。」(stage=cabinet)gd_prog_2「铁柜已经打开。电还没有通。」(stage=box)gd_prog_3「电已经通了。去找那扇大门。」(stage=gate)- key 阶段无进展 150s 不走本通道(现有 L1/L2/L3 已覆盖"找不到钥匙", 避免双计时器对同一阶段轰炸)。
- 队列语义沿用
_pendingVoice(绝不顶句,待播期间有操作即作废);warning 震与 L1-L3 同款。
- 新增独立计时:以
- 宪法条款:00 §3.2(整句分档);归因真话律;14 裁定 5(escape 卡关 骨架保留,本通道是新增平行通道,不动既有 60/120/180 任何一级);01 号 文档 §3.1 原始意图的部分回收。
- 拥挤评估:触发频率 = 每进展段最多 1 次 × 最多 3 段(cabinet/box/gate) = 全局限 3 句;且要求 150s 活跃零进展,正常通关(2-3 分钟/环节)永远触发 不到。只补"该响没响"的洞,不给顺畅玩家加噪。
B4 · 双击兜底降级:背包 + L1 意象,不再直通 L2
- 问题(证据):双击无目标 = 玩家主动查询的唯一入口,现状直通
L2 明示:live 行 161-178(柜已开后再双击铁柜房 → use_fail +
stuck_box_2把电箱房和动作全报出来)、行 230-243(同理stuck_gate_2)。P1 定为 P0 "谜题被白送"——没卡关的人收到卡关 120s 才该有的答案,既是泄漏也稀释 L2 的稀缺性(难度变相降低)。 - 目标状态:主动查询返回"背包 + 当前目标的 L1 级暗示",答案仍锁在 计时器 L2/L3 与进展链里。
- 方案:
_useItem()兜底链第二句由voice/stuck_<stage>_2改为voice/stuck_<stage>_1(资产现成,4 句意象暗示:铁锈味/钥匙在身上/ 电流声/电已通——全部不点明房间与动作,零新资产)。use_fail与背包句 不动。已在_stuckShown里记过 L1 的进展段不重复播(沿用既有去重)。 - 宪法条款:00 §5.3(escape 帮助入口语义不变,只是档位归位);01 号 §3.2「主动求提示保留:先播背包,再播 L2」——本条是对 01 的有意修订 (泄漏 > 帮助,证据双实录),在本文档留痕;归因真话(L1 句无答案可泄漏)。
- 拥挤评估:播出次数不变(一次兜底两句);内容变轻。L2 触发总量下降 (对非卡关玩家),L3 不受影响。对卡关玩家:60s L1 → 120s L2 → 180s L3 的阶梯完整保留,难度不降。
B5 · 空房首访描述(复用现有资产)+ 方位线索句(新词,二选一落地)
- 问题(证据):进入空房零语音(live 行 87-94、179-186、209-220), 4 间空房 2 种环境音不可区分(amb_hum 行 90/182;amb_wind 行 120/212)。 玩家对 5/9 的地图面积永远建不起模型——用户反馈"不知道自己在哪"的大头。
- 目标状态:每间空房至少有一个可建立心智地图的听觉锚(首访一次性, 之后可单击复核)。
- 方案(两档,按实施预算二选一,建议 a 先行):
- a(零新资产):空房首访时补播现有
empty_1/2/3(现只在单击 检查时播;进入时播、单击时不再重复首访句)。三个 id 恰好够分给 (1,0)/(0,1)/(1,2)+(2,0)…4 房 3 句,需把 (1,2)/(2,0) 拆开:建议 (1,0)→empty_1、(0,1)→empty_2、(1,2)→empty_3、(2,0)→复用 empty_3 或 保持沉默(两间"远处水滴"空房对称分布也是合法的记忆点)。 - b(3-4 句新词,推荐终态):empty_* 改词重录为含固定方位特征的
句子(房间特征是固定的,方位词不随玩家状态变,归因真话):
empty_1→「北面墙缝透进一丝风。这里什么都没有。」((1,0) 北外墙)、empty_2→「回声从东面的墙折回来。这里空空荡荡。」((0,1) 东侧内墙—— 内墙方位特征需与地图核对后定稿)、empty_3a/3b同理。每句给一个方向 锚 + 一个可分辨特征,四间空房从此声学可区分。 - 触发:进入空房首访(visited 集合扩到空房坐标);震动/earcon 不动。
- a(零新资产):空房首访时补播现有
- 宪法条款:00 §3.2(整句);归因真话(方位特征写死前按房间图逐间核对); 14 裁定 7(描述句走语音通道)。
- 拥挤评估:每房一生一次,全局 +≤4 句;单击检查路径不变。对节奏零影响。 风险:empty_* 改词会动既有资产文本(playtest 断言若引用文本需同步登记)—— 方案 a 完全绕开此风险。
B6 · 引导 busy 窗口手势缓存(逻辑修复)
- 问题(证据):live 行 30-35:
g2_wall播放中(37.60-43.28)我滑了一下 (41.57),只有引擎 [10] 轻震——墙没响、G2 计数没走,静默吞手势。若玩家 信了这一下、只再补一滑,G2 永远不满足"滑两下",引导卡死(虽有 20s 看门狗 兜底推进,但那是防资产缺失的,不是交互语义)。P1 特别检查项"失败可否归因" 判半不过。 - 目标状态:busy 窗口内的首个手势在窗口结束后被补判(或明确拒绝并给 反馈)。
- 方案:
_guideBusy期间缓存首个非跳过分手势,推进语音播完(done()) 后立即按新步骤判定:若缓存手势对新步骤合法则直接作答(玩家体验为"我的 输入没丢");不合法则按新步骤的答错路径处理(有纠正语音,可归因)。缓存 仅 1 个、只存活到本步骤解锁,杜绝跨步幽灵输入。 - 宪法条款:00 §5.4「做了一个手势 3 秒内必须有反馈」(当前 busy 吞手势 违反此条,本条是合规修复);14 裁定 5(引导链结构不动)。
- 拥挤评估:零资产、零新增语音;只改引导期手势时序。引导链被 playtest 断言冻结的部分(finishVoices(3)→PLAY 等)不受影响——缓存只在 busy 窗口 内生效,脚本化玩家的手势本就在 turn cue 后送达。
B7 · 结算链单击守卫(逻辑修复)
- 问题(证据):live 行 253-275:
inspect_gate_ready被随后的逃脱双击 截断(行 256-257,属正常链式替换);更严重的是我的习惯性单击(369.22)在 结算链 escape 播到 10.7/15.3s 时直接触发重开——time_band1(用时)与again两句被永久吞掉(行 263-275)。P3 定为 P0:"结算是我唯一确认打完了/ 打得如何的窗口,一碰就碎"。 - 目标状态:结算链播完前,ENDING 单击不立即重开。
- 方案:
_escape()起设_settleBusy=true(结算链 onDone/30s 兜底处 复位);ENDING 单击在_settleBusy期间忽略(或在 full 档播一句既有again前句?—— 不新增语音,直接忽略+引擎 confirm 震已有)。again句 本身已含操作指引,链播完后再单击重开的原语义不变。30s 资产缺失兜底保留 (防静默死锁)。 - 宪法条款:00 §5.4(单击 3s 内反馈——忽略路径有引擎 confirm 震兜底, 合规);00 §3.2(结算整句分档的完整到达权);14 裁定 4(不顶句、不丢句)。
- 拥挤评估:零资产;只影响结算后前 ~15s 的重开时序。结算链播完 → 单击 重开 → replay 的既有闭环在转写里完整存在(mock 行 144-149),本条只是 把闭环的起点从"escape 第一句"推迟到"again 播完"。
B8 · 跳过引导后补播目标句(零资产)
- 问题(证据):
guide_skip路径(live 行 61-74)与 REOPEN 单击直进 路径都只播start_room(手势总览)——目标陈述 g7_goal 只在引导 G7 链尾 出现一次,跳过的玩家(恰是最需要目标的一群,P1/P3 共识)永远听不到 "找到能用这把钥匙打开的东西"。且跳过后阶段=key、身上无物品,60s 内只有 意象级 L1(行 75-86)。 - 目标状态:任何路径进入 PLAY 时,玩家都至少听过一次目标句。
- 方案:
guide_skip确认句后、_enterPlay前补播g7_goal(资产现成, 链式_speak);REOPEN 单击直进路径同样在start_room后接g7_goal。 二周目老手可单击跳过该句(skippable 默认 true,符合 12 号文档——教学 义务句已随首局完成,此处是状态告知不是教学)。 - 宪法条款:00 §3.2;14 H1 注(g7_goal 不接方位句的红线仅冻结于引导 链内——本方案接在跳过确认链后,不触碰被冻结的引导链断言);01 号 §2.1 设计意图(G7 目标陈述的全局可达)。
- 拥挤评估:两句短链、每会话最多一次;二周目玩家 1 次单击即可跳过。 对节奏影响 ≤5s,且只发生在"信息最空白"的路径上。
B9 · L2 台词顺带修订(不推荐本轮做,留档)
live 行 288-294 可见 L2/L3 句仍用"西南角/西北角/东南角"绝对方位词——对 从未建立坐标系的玩家,绝对角落词不如相对方向可用(L3 带路已经改用相对 滑动方向)。但 L2 明示句的改词会动 12 句资产与全部相关断言,且 L3 已兜底 带路,收益/成本比低,列为后续轮候选,不在本轮实施清单内。
4.2 盲区 → 方案对照表
| 盲区 | 方案 | 新语音资产 | 逻辑改动 | 证据 |
|---|---|---|---|---|
| S1/S1b 方位(撞墙/平时) | B1 | +4 句 | 撞墙链路接播+限频 | live 行 40-55;P1/P3 P0 |
| 相对方位半盲区(无目标名) | B2 | +3 句 | 三处接线点换 id | live 行 112-116/156-160/201-208 |
| S3 全局进度无渠道 | B3 | +3 句 | 新计时器+触发 | 用户反馈;live transit 段 |
| S4/S4b 目标重述/查询泄漏 | B4 + B8 | 0(复用) | 兜底换 id;跳过链补播 | live 行 61-74/161-178/230-243 |
| S5 空房不可区分 | B5a/b | 0 或 +3~4 句 | 首访描述接线 | live 行 90/182/120/212 |
| S6 busy 吞手势 | B6 | 0 | 缓存补判 | live 行 30-35 |
| S7 结算链截断 | B7 | 0 | 守卫 | live 行 253-275 |
4.3 实施清单(F 类编号,仅登记,未实施)
| # | 内容 | 资产管线步骤 | 断言登记建议 |
|---|---|---|---|
| F1(B1) | 撞墙方位句 wall_dir_l/r/u/d ×4,撞墙链路接播 + 同向 10s 限频 |
tools/gen_voice_dual.py --game escape --only wall_dir_l,wall_dir_r,wall_dir_u,wall_dir_d → --convert → check_all_assets.py → extract_voice_text.py 刷新 |
escape playtest:撞墙后方位句到达/限频生效/移动打断作废;guide.test 不受影(PLAY 期行为) |
| F2(B2) | gd_cabinet_dir / gd_box_dir / gd_gate_dir ×3,替换三处 gd_room_* 接播(原句保留) |
同 F1 管线,3 句 | playtest:三处进展链尾新句到达且方位正确;原 H1 断言(gd_room_* 映射表)保留不动 |
| F3(B3) | gd_prog_1/2/3 ×3 + 无进展 150s 活跃计时器(≥5 手势闸门、每段限 1 次、队列语义) |
同 F1 管线,3 句 | playtest(guide=off):计时器不误触(挂机不触、进展后清零、限 1 次);guide.test:队列不顶句、作废语义 |
| F4(B4) | 双击兜底第二句 stuck_2 → stuck_1 | 零资产 | playtest:兜底链内容变更需逐条同步(现有断言若期望 stuck_*_2 必改);L2 计时器触发路径断言不动 |
| F5(B5a) | 空房首访补播 empty_*(零资产先行版) | 零资产 | playtest:首访到达/重访不重复/单击检查语义不变 |
| F6(B5b,可分期) | empty_* 改词带方位特征 ×3~4 | 同 F1 管线;改词前逐间核对房间图方位特征(归因真话) | 文本断言同步;双耳一致性 |
| F7(B6) | 引导 busy 手势缓存补判 | 零资产 | guide.test:busy 窗口手势缓存→解锁后补判/答错路径;既有引导推进断言零改动红线 |
| F8(B7) | 结算链单击守卫 _settleBusy |
零资产 | playtest:结算链完整播完(time_band/again 到达)后才可重开;30s 兜底仍生效 |
| F9(B8) | 跳过引导/REOPEN 直进补播 g7_goal | 零资产 | playtest:两条路径 start_room 后 g7_goal 到达;二周目单击可跳过 |
统一收尾(每轮 F 实施完必做):check_all_assets.py 全绿 → 6 playtest
(guide=off)断言对账(escape 现有 103 条,F4/F5/F7/F9 会改其中若干,
须逐条登记变更原因)→ guide.test.mjs 增补 → live 复跑一局验证新句在
真实混音中可闻(B2/B3 短句尤其要做 ASR 层判定)。
阶段四 · 实施勾账(escape-state round2,2026-09-15)
§4.3 清单已从"仅登记,未实施"转为已实施(除 F6 按方案"可分期"留档, 见实施裁定 1)。验证档案:
research/escape-state/round2/(mock 转写 + live 真机一局 38 段 OK 37 / SFX_BGM_ONLY 19 / 零截断,S1-S7 逐条核对)。 新断言全部登记在web/escape/test/playtest.mjs(103 → 235 条全绿)与web/harness/guide.test.mjs(120 → 132 条全绿);既有断言变更 3 处, 逐条登记于下表"断言变更"列。
| # | 落地 | 断言登记(场景.条数) | 断言变更 | live 证据(round2/live-transcript.md 行号) |
|---|---|---|---|---|
| F1(B1) | ✅ wall_dir_l/r/u/d ×4 双性别已生成落盘;_move 撞墙链路 wall 播完接播、同向 10s 限频、被打断作废(game.js _move) |
playtest G×13(引导期不播/接播顺序/打断作废/限频与恢复)+ 资产校验 F 段扩 wall_dir 族 | 无 | 行 141-143 wall_dir_u、行 166-168 wall_dir_l、199.5s 限频 |
| F2(B2) | ✅ gd_cabinet_dir/gd_box_dir/gd_gate_dir ×3 替换三处接播;_playGoalDir(target, namedId, expectedId) 异常路径回落 gd_room_*(原句保留) |
playtest H×12(三处到达+顺序+不再播 gd_room_*+回落+同房间不播);guide.test ⑩c 换线 + 回落断言 | guide.test ⑩c 三处接线断言由 gd_room_* 改为 gd_*_dir(映射表单元断言保留不动) | 行 231-233 gd_box_dir、行 306-312 gd_gate_dir |
| F3(B3) | ✅ gd_prog_1/2/3 ×3 + _checkStuck 平行通道(150s 无进展 ∧ ≥5 手势 ∧ stage≠key,每段限 1 次,队列/作废语义同卡关提示) |
playtest I×11(key 不走/闸门/触发/限 1 次/进展复位/box 段再触/入队不顶句/作废计入不重发) | 无 | 行 265-268 gd_prog_2(活跃 154s 触发,期间 L1-L3 零误触) |
| F4(B4) | ✅ _useItem 兜底第二句 stuck_*_2→stuck_*_1,L1 播了即记账沿用 _stuckShown 去重 |
playtest J×8(背包+L1/不直通 L2/记账/再兜底不重复/60s 不重复 L1/120s L2 仍到达) | playtest 场景 A 兜底断言 stuck_key_2→stuck_key_1(+不播 _2 反向断言) | 行 180-182 use_fail+stuck_cabinet_1 |
| F5(B5a) | ✅ 空房首访补播 empty_*((1,0)→1/(0,1)→2/(1,2)→3/(2,0)→3 复用),_freshEmpty 实现"本房间内单击不重复首访句";不算进展事件 |
playtest K×9(首访到达/非进展事件/房内单击不重复/重访零语音/重访单击照常/四房映射) | 无(单击检查语义不变) | 行 115-118/189-192/199-202 三间首访 |
| F6(B5b) | ⏸ 留档(实施裁定 1) | — | — | — |
| F7(B6) | ✅ _guidePending 缓存首个非跳过分手势,_advance done() 解锁后按新步骤补判(fromCache 绕过下滑跳过检查);跳过分手势不缓存;G6 链尾离 GUIDE 缓存作废 |
playtest L×15(不当场判定/补判作答/答错路径/不触发跳过/仅 1 个/跳过分手势不缓存/引导链完整);guide.test ⑩d×7(full 档同款) | 无(既有引导推进断言零改动) | live-events 82.3s 缓存→87.9s 补判 |
| F8(B7) | ✅ _settleBusy 守卫:_escape 挂载,_startEndingBgm(链完/30s 兜底汇合点)解除;ENDING 单击守卫期忽略 |
playtest M×10(守卫期不重开/链完整 time_band+again/解除后重开/again 缺失 30s 兜底) | 无 | 行 336-347 习惯性单击被守卫挡下,time_band3+again 完整到达 |
| F9(B8) | ✅ _skipGuide 链 guide_skip→g7_goal→_enterPlay;REOPEN 单击 _enterPlay(true, true) start_room→g7_goal;_skipGuide 期间 guideStep=7(裁定 4) |
playtest N×6(直进顺序/可单击跳过)+ A2/B 场景跳过链更新(g7_goal 到达、顺序、两句后再进 PLAY) | playtest A2/B 跳过断言由"一句后 PLAY"改为"guide_skip→g7_goal 两句后 PLAY" | g7_goal OK sim=1(行 149.5s) |
统一收尾执行记录:check_all_assets.py 全项目 15 游戏全绿(escape voice 各 90
id 双性别一致);escape playtest 235/0、guide.test 132/0、其余 14 款 playtest
回归全绿、engine-voice 19/0 与 engine-input 72/0 无连带;live 复跑一局
(端口 8145,打完杀净)S1-S7 每个时刻现在都有落点(round2/README.md 对照表)。
实施裁定记录(编号自本轮起,接续追加不改旧文)
- F6(B5b)分期留档:B5b 草案台词未定稿——
empty_2东侧内墙方位特征 原文标注"需与地图核对后定稿"、empty_3a/3b无台词草案,无法按"台词与 草案逐字一致"的管线铁律生成;且 B5 原文即"建议 a 先行"、F6 标注"可分期"。 本轮只落地 F5(B5a 零资产版),B5b 连同 B9(L2 角落词改词)一并列为 后续轮候选。 - B4 去重双向化:方案只规定"已在
_stuckShown记过 L1 的进展段不重复 播";实施把兜底播出 L1 也记账(播了即加入_stuckShown),否则 60s 计时器会把玩家刚听过的同一句意象暗示再播一遍(去重只做单向等于没做)。 附带效果:L1 整级(含stuck_ask)跳过,L2/L3 阶梯与触发时点不变 (playtest J 冻结)。 - B3 作废计入已播:待播
gd_prog在排队期间被玩家操作作废后仍计入 "每进展段限 1 次"(触发即记账)。方案"每进展段限 1 次"若按播出记账, 5s 轮询会在条件持续成立时立即重发,形成骚扰循环;按触发记账与该条 "全局限 3 句"的拥挤评估一致(playtest I⑧ 冻结)。 - B8 跳过链期间 guideStep=7:
_skipGuide的两句链(guide_skip→g7_goal) 播放期间相位仍是 GUIDE,原 guideStep 下单击/滑动会被当成引导作答(既有 竞态:skip 链中单击可误推 G1)。落地把 guideStep 置 7(G7 等待语义: 手势全忽略),链中输入 robustness 与 G7 自然链尾对齐;语音缺失兜底计时 5s→9s(覆盖两句链)。 - B5a 两个二选一:(2,0) 选"复用 empty_3"(方案原文认可"两间'远处水滴'
空房对称分布也是合法的记忆点");"单击时不再重复首访句"以
_freshEmpty实现——仅首访句刚播过的那个房间内抑制同句,离开即恢复单击播句, 重访后单击检查语义完全不变(playtest K 冻结)。 - B6 缓存手势绕过下滑跳过:方案"不合法则按新步骤的答错路径处理"
意味着缓存的下滑在可跳过步骤上也不再触发
_skipGuide(fromCache 绕过 skip 检查)——这正是 live round1 S6 事故(答案被吞后下滑被当成跳过)的 修复点;实时注入的下滑跳过语义不变(playtest L⑤/guide.test ⑩d 冻结)。 - B1 限频记账点:同向 10s 限频按方位句实际开播时刻记账;仅调度 (wall 接播注册)未播出即被打断的不占额度(playtest G③"被作废的方向 补撞后正常接播"冻结)。
盲区清单核销(§3.2 → round2)
S1/S1b(B1)、相对方位半盲区(B2)、S2(B5a)、S3(B3)、S4/S4b(B4+B8)、
S5(B5a,B5b 留档)、S6(B6)、S7(B7)——live round2 逐条核对证据见
research/escape-state/round2/README.md,每个盲区时刻现在都有落点。