Files
2026-10-01 23:26:47 +08:00

92 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# R2 落地一致性审查报告(策划,R3 轮)
> **档案带(26 号之后)**:工程质量结论可参考。裁决②「单击循环 + 双击确认菜单」、simon 双击上下文、escape 双击使用/求提示 **已废止**(见 00 §5、01、02)。交互施工以 26 号为准。
审查对象:`web/escape/game.js`、`web/simon/game.js`(R2 重写版)、`docs/audio/round2-voice-ids.md`、`docs/audio/round2-report.md`、`web/engine/haptics.js`(R2 增补)。
对照基准:`docs/design/01-escape-redesign.md`、`02-simon-redesign.md`、`00-global-ux.md`(R2 修订版)。
**总体结论:两款游戏落实度约 95%,核心设计(引导式开场、三级提示、可重听环境音 / 去 BGM、整句化、交互教学、复活机制)全部落地且工程质量高于设计预期(语音链看门狗、会话令牌、进度 summary 同步)。发现 5 处偏差,全部裁定;两个开发疑问的裁决见 §3。**
---
## 1. 《暗室》落实度核查(对照 01 文档)
| 设计条目 | 落实情况 | 结论 |
|---|---|---|
| G0-G7 引导式脚本(带路到储物间、教移动/撞墙/检查/双击) | 完整实现(g0-g7 + `_advance` 步骤机 + 20s 看门狗防卡死) | ✅ |
| 引导期做错纠正(错 3 次直白重述 + warning 震动)、下滑跳过 | 完整实现(guide_wrong_*/guide_blunt_*/guide_offpath/guide_skip) | ✅ |
| 二周目开场询问(上滑重听引导/单击直接开始) | 实现(REOPEN + reopen_prompt + guideDone localStorage) | ✅ |
| 卡关三级提示 60/120/180s、L3 每 60s 重复、按坐标算路 nav_* | 完整实现(5s 轮询、阶段×级别 12 句 + stuck_ask 前置 + nav 4 句) | ✅ |
| 环境音可重听(单击=重播环境音+描述)、每次进房都播 | 实现(`_inspect` 先播 amb、800ms 后播描述;`_playAmbient` 每次进房播) | ✅ |
| 环境音 3→6 种 + 大门通电切 amb_gate_live | 实现(KEY_ROOMS 4 专属 + 2 空房轮换 + gate_live) | ✅ |
| 撞墙每次播 wall(取消一次性限制) | 实现(含引导 G2) | ✅ |
| 用时 4 段整句替代数字拼接 | 实现(time_band1..4,区间与语音清单一致) | ✅ |
| ui_deny 退役改 error 震动 | 实现 | ✅ |
| 双击兜底:背包 + L2 级明示 | **偏差 1**:关键房间内播 `use_fail` 替代背包播报(非关键房间仍播背包 inv_* + stuck_*_2) | 以实现为准(更合语境),设计文档视为已修订 |
| 菜单并入双击兜底链(00 豁免表原表述) | **偏差 2**:PLAY 阶段无菜单入口;菜单仅在 ENDING 下滑呼出 | 以实现为准(PLAY 中帮助需求已被双击兜底 + 自动卡关提示覆盖),00 豁免表已修订 |
| G2"滑两下碰碰墙(撞墙也计数)" | **偏差 3**:引导期位置固定,两次滑动必然撞墙 | 以实现为准(教学目标就是撞墙反馈,更可靠) |
另确认:震动语义正确(撞墙 error、拾取 pickup、机关 success、提示 warning;gesture.js 内置识别反馈未重复调用);进度存档带 summary 同步服务器(超出设计要求,符合 00 §4.3)。
## 2. 《音序回响》落实度核查(对照 02 文档)
| 设计条目 | 落实情况 | 结论 |
|---|---|---|
| 去 BGM(不加载不播放) | 实现(prewarm 无 bgm,开场静默 0.5s 进教学) | ✅ |
| 轮次整句 round_01..20 + round_more 兜底 | 实现 | ✅ |
| 成绩 6 段整句(0/≤3/≤6/≤9/10-14/≥15) | 实现(score_band1..6 区间一致) | ✅ |
| 交互式教学 T0-T7(教一个练一个、错 3 次直白版、下滑跳过) | 完整实现(t_wrong_*/t_blunt_* 六手势各一 + t_try 等待 + 跳过兜底) | ✅ |
| 播放序列 BEAT 节拍锚点 + 播完 400ms confirm "轮到你了" | 实现(第 1 轮同播 your_turn,之后仅震动) | ✅ |
| 复活机制:初始 1 次、每 4 轮 +1 上限 2、答错自动消耗重播同一序列、双击主动重听 | 完整实现(chances_out/retry_use/relisten/chance_plus 语音齐全) | ✅ |
| 速度曲线 max(420, 700-(r-1)*25) | 实现 | ✅ |
| 序列约束(第 1 轮两音不同 / 前 5 轮禁三连 / 全局禁四连) | 实现(`_violates`,20 次重试抽样) | ✅ |
| 答对每 4 轮才播"答对了",其余仅 success 震动 | 实现 | ✅ |
| 结算:error+hit 震动、sfx/gameover 保留、best 持久化+服务器 summary | 实现 | ✅ |
| 播放/播报阶段手势静默忽略 | 实现(phase 守卫 default 分支) | ✅ |
| 双击语义(输入阶段=主动重听) | **偏差 4**:与序列含 doubletap 冲突,开发按上下文判定(见 §3 裁决①) | 裁决采纳 |
另确认:`wrong` 语音在语音清单中标注"可选",实现未引用(retry_use 已含"错了")——不算缺失,清单口径一致。
## 3. 两个开发疑问的裁决
### 裁决①:simon 双击语义冲突 —— **采纳实现的上下文判定**
实现的规则(game.js:294-297):输入阶段,若当前期望输入恰为 doubletap,双击=答题;否则双击=主动重听(耗机会;机会为 0 时仅提示 chances_out,不判错)。
裁决理由:
1. **序列必须永远可答**。任何让"双击=重听"优先的方案都会使含 doubletap 的序列无法复现,破坏玩法完整性——答题优先是唯一可接受的解释。
2. **边缘情况不自锁**。玩家想重听而当前期望恰是 doubletap 时:双击被当答题——答对则推进(玩家本来就会背到这一位,损失为零);答错则自动消耗机会重听,殊途同归。不存在"想重听却永远做不到"的死锁。
3. **宽容性正确**:机会为 0 时双击非期望手势不判答错、只提示——避免了"想重听却被判错直接结算"的最坏体验。
补充规定(写入 02 文档):重听播报期间 phase 切 roundend 暂停接收输入(实现已做),防止重听语音播完前的手势被吞。
### 裁决②:菜单手势 —— **采纳进 00-global-ux.md,作为全球菜单约定(RPG 豁免)**
开发自拟方案:菜单内 **单击=循环切换选项(播选项名)/ 双击=确认执行 / 上滑=帮助**,下滑或"返回"项关闭。
裁决:**采纳**。理由:
1. 解决了全局约定"单击=确认"与结算页"单击=重开"的冲突——结算页单击已被占用,菜单内单击若仍是确认,玩家想重开时会误触发菜单项。单击循环 + 双击确认把"浏览"与"执行"分离,误操作成本归零。
2. 两款游戏已一致落地,交互范式统一(菜单项 3 个:重新开始/回大厅/返回游戏,菜单打开时先播 menu_open + 第一项)。
3. 单击循环有 ~300ms 引擎延迟,但菜单非即时场景,可接受;双击确认即时,关键的"执行"动作不拖。
配套修订(00 文档 §5.1 已更新):
- 新全球菜单约定:**下滑呼出(模态)→ 单击循环切换(播选项名)→ 双击确认执行 → 上滑=帮助/规则 → 下滑或"返回游戏"项关闭**。菜单打开时暂停计时类玩法。
- **RPG《剑与声》豁免**:探索态菜单保持"左右滑切换 + 单击确认"——RPG 的探索本身就是这个范式(选项列表即游戏本体),菜单与探索同构反而少学一套;战斗态不设菜单。
- **storyline**:R3 打磨轮统一到本约定(现状未审,列入 R3 检查项)。
- **rhythm / space**:R3/R4 施工直接按新约定(03/04 文档中"左右滑切曲目/菜单"的表述以此为准——选曲界面不是模态菜单,仍用左右滑+单击;模态菜单用新约定)。
## 4. 偏差 5:haptics.js 震型增补(引擎侧,R2 已做)
- 引擎已补 `pickup=[15]`、`hit=[80]`、`beat=[8]`、`danger=[25,40,25,40,25]`——正是 round1-review 转达事项①,但 pickup/danger 数值与设计不同(设计 [15,40,15] / [20,50,30,50,40])。
- **裁定:以实现为准**(pickup 单震更轻、不与 error 混淆;danger 节奏更密更接近"逼近"感)。00 文档 §2.2 已更新为实现的 10 种震型全表。
## 5. 遗留问题(转达开发/音频)
1. **escape PLAY 阶段无法回大厅**:结算前想退出只能刷新页面。建议 R3 打磨:PLAY 中双击兜底链末尾追加"要回大厅?再双击一次"二级入口(语音 id `menu_hint` 需补录 1 句 ×2 性别)。非阻塞。
2. **simon `voice/wrong` 已生成但代码未引用**:保留无妨(资产冗余 1 句),或 R3 清理清单标注。
3. **storyline 菜单约定统一**:列入 R3 检查项(裁决②配套)。
4. 两游戏真机听测仍未做(沿用 R1 遗留):escape 提示计时阈值(60/120/180s)与 simon 教学节奏需真机验证手感。