- 新增 web/ 纯音频 HTML5 平台:共享引擎(手势/WebAudio 三层/设置/震动)、 Node 零依赖服务器(静态 + 注册登录 + 进度存档 API) - 游戏:剑与声(RPG 新作)、声命线、暗室(重设计)、音序回响(重设计)、 节拍行者(跟随领奏重构)、盲航(同向闪避重构);声东击西删除 - 全局功能:男声/女声双套 TTS 资产、三档语速、BGM 音量三档、 震动反馈语言(10 种震型)、服务器进度同步 - 资产:899 ogg + 899 m4a(Qwen3-TTS 双性别语音、Stable Audio 3 音效、 Mureka BGM 4+3 首),终检零缺失 - 文档:docs/design/ 13 篇设计审查文档、docs/audio/ 资产管线、 web/server/README.md API 文档
90 lines
8.3 KiB
Markdown
90 lines
8.3 KiB
Markdown
# R2 落地一致性审查报告(策划,R3 轮)
|
||
|
||
审查对象:`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 教学节奏需真机验证手感。
|