round3: G1 gd_answer提前一小节(根因=排程压窗起点) + G2教学降难DDA + G3 count-in修复(根因=未重排调度队列) + G4 escape目标链 + G5 simon双击根治(重听改上滑,重录3句) + G6轮成功/破纪录 + G7 space方向呼喊 + 22语音文件 + guide93断言全绿
This commit is contained in:
@@ -108,3 +108,29 @@
|
||||
3. 设置边界:settings.voice 切换后下一句起用对应目录(voice 缓存键含性别);settings.bgm=0 时无 bgm 层加载;speed=1.7 时下一句 playbackRate 生效。
|
||||
4. 双击=重听在其声明可用的阶段生效(escape 检查/simon 规则/rpg 场景 desc 等)。
|
||||
5. 菜单约定(裁决②):适用游戏的模态菜单 = 单击循环 / 双击确认 / 上滑帮助 / 下滑关闭(RPG 豁免)。
|
||||
|
||||
---
|
||||
|
||||
## 8. round3 变更记录(simon 手势映射例外)
|
||||
|
||||
> round3 G5(research/04-playtests/round2/synthesis.md §2)改变了 simon 的**玩法**
|
||||
> 手势映射(不是向导层断言):input 阶段双击永远=作答(第 6 音色),主动重听改绑
|
||||
> 上滑。按本研究「playtest 断言零改动」红线的例外流程,本节只做追加记录 §3 受影响
|
||||
> 断言的替换口径;§3 既有文字不回改,其余 5 个游戏断言零改动。
|
||||
|
||||
- §3 关键路径 4「主动重听:input 阶段且期望输入非 doubletap 时双击 → 断言 chances
|
||||
减少、inputIdx 清零、序列重播」→ 替换为:**input 阶段上滑(且期望输入非 up)=
|
||||
主动重听**,断言目标不变(chances 减少、inputIdx 清零、序列重播)。
|
||||
- §3 边界「双击冲突(裁定①):期望输入恰为 doubletap 时双击 = 答题(inputIdx 前进),
|
||||
不触发重听」→ 保留并强化为:**input 阶段双击永远=作答**——期望非 doubletap 时
|
||||
照常判错(耗机会/死亡),不再触发重听。
|
||||
- §3 边界「chances=0 时双击非期望手势:不判错(round 不变、inputIdx 不变)、播
|
||||
chances_out」→ 替换为:**chances=0 时上滑非期望手势**,断言目标不变。
|
||||
- 新增边界断言:期望输入恰为 up 时上滑=作答(六手势全是答题输入,00 号文档 §5.3
|
||||
豁免同款);非输入阶段(gameover/菜单)上滑行为不变。
|
||||
- 随上述改口的测试脚手架微调(非断言变更):两处「错手势注入」的取值从
|
||||
`GESTURES.find(g => g !== exp && g !== 'doubletap')` 增加排除 `up`(round3 后
|
||||
up=重听键,注入 up 会触发重听而非判错,与旧版注入 doubletap 需避开是同一道理)。
|
||||
- 依据:docs/design/14-guide-layer.md「round3 v1.2」§8/G5;simon playtest 断言仅
|
||||
上述 3 处改口(108 条总数不变),其余断言(含教学、复活、结算、菜单、序列约束、
|
||||
速度下限)零改动。
|
||||
|
||||
@@ -114,3 +114,73 @@
|
||||
`tools/extract_voice_text.py` 已刷新 `web/harness/voice_text.json`(428 句)。
|
||||
- 转写渲染适配:实际播出的 `voice/gd_*` 由 play 捕获照常渲染;被 idle-skip 的
|
||||
向导句单独标注「本句按 idle-only 跳过未播」。
|
||||
|
||||
---
|
||||
|
||||
# 14 · 向导交互层设计裁定(round3 v1.2 增补)
|
||||
|
||||
> 依据:research/04-playtests/round2/synthesis.md(G1~G8 + §3 新语音表,唯一事实源)。
|
||||
> 本文只做**追加**,上文 v1 / round2 裁定不回改;实现载体同前(`web/engine/guide.js`
|
||||
> + 各游戏 game.js 接线),全部改动已落地。G8(不做项)照裁定书记录,不再列。
|
||||
|
||||
## 8. round3 裁定落地摘要(G1~G7)
|
||||
|
||||
| # | 裁定 | 落地 |
|
||||
|---|---|---|
|
||||
| G1 | rhythm「轮到你」迟到 bug | **根因诊断**:round2 F3 把 gd_answer 排在 `leadBarT0 + 4*spb`——那是首个应答窗口**起点本身**(领奏小节的末尾),不是窗口前;P4 转写(窗口 t+79~95、gd_answer t+93.7)即窗口开后才响,起不到预警作用。**修复**:排程点改到 `leadBarT0`(窗口前整整 1 小节 = 领奏小节头);`_armAnswerCue`/`_fireAnswerCue` 承接——菜单恢复也是一次「进 main」,旧标记已消费时对恢复后首个未判定窗口重排同款标记(已迫近则 0.15s 内尽早补上);上一句结束后的下一句不适用(裁定原文)。gd_answer 语音 full 档经曲谱定时队列直达(不走 guide queue),turn earcon **standard 也发**(off 全静不变)。guide.test 增转写级断言:真实跑 90BPM 一曲,gd_answer 时刻 < 首窗口起点,且窗口起点 − gd_answer ≈ 4×spb。 |
|
||||
| G2 | rhythm 教学降难 DDA | 同一步连续 2 次失败 → 该步领奏**降速 25% 重演**(`_tutRate=0.75`:该步领奏与应答网格间隔 ×1/0.75,领奏小节头仍对齐 BGM 小节,BGM 不变速;排程照走 `_sched` 绝对时间 + 40ms 泵,泵与判定零改动)+ full 档先播 `gd_slow`「我放慢一些,跟着试试。」(经 `_speakGuarded` 串行,播完才重演);每教学局 1 次封顶(`_tutSlowUsed`);该步做对或离开(跳步)恢复正常速度;降速重演后该步重新给两次机会。**off 档维持 round2 的 retry_skip 跳步原路径**(6 playtest 断言零改动红线)。 |
|
||||
| G3 | rhythm 恢复 count-in 可感知化 | **根因诊断**:round2 F3.2 的 count-in 排了但**从未按时响过**——底鼓 push 进 `_sched` 后没有重排,队头是数秒外的领奏音符,40ms 泵的 `LOOKAHEAD(0.6s)` 前瞻窗口永远轮不到队尾的 count-in(复现实测:恢复后 4 记底鼓与 beat 震全部迟到聚堆),P3 听到的正是「恢复后 5 秒死寂」。**修复**:push 后 `_sortSched()`;底鼓音量 0.7→**1.0**(sfx 层独立于 BGM,每拍 beat 震保持);full 档恢复时先经 `_speakGuarded` 播 `gd_count`「四拍之后,继续。」(每局恢复限 1 次,`_gdCountUsed`;链完/缺失兜底后才开始数拍);恢复用令牌 `_resumeSeq` 防 count-in 语音期间再开菜单的旧恢复串场。**off 档保持 v1 即时续播**(playtest 断言零改动红线)。 |
|
||||
| G4 | escape 保险丝→新目标断链 | 拾取保险丝的 `unlock_cabinet`(关键获得不可跳)播完后接 `gd_next_fuse`「保险丝到手。接下来,去找电箱。」——游戏反馈层**全档位**(走游戏语音链不走向导通道,gd_economy 先例)。 |
|
||||
| G5 | simon 双击双义根治 | **改全局规则**:input 阶段**双击永远=作答(第 6 音色)**——期望恰为 doubletap 判对,否则照常判错,不再承担重听;主动重听改绑**上滑**(期望输入恰为 up 时上滑=作答,六手势全是答题输入的 00 §5.3 豁免同款);非输入阶段行为不变。`gd_economy` 按裁定书新文案**重录**(记不住就向上滑…);教学第 6 音色步资产 `t6_double`「双击,是这个声音。」不含重听语义、无需改动,教学步与新文案不矛盾。**超出裁定书 §3 清单的同口径修正(2 句,见 §9 注)**:`gd_relisten`(input 看门狗提示)与 `t7_retry`(教学收尾链)旧文案都在教「双击重听」,不清掉等于保留 P0,随 G5 一并重录为上滑口径,台词改动仅「双击→向上滑」机械替换。 |
|
||||
| G6 | simon 局尾反馈轻量化 | 每轮成功在既有轮结算链(`_roundClear` 的 correct/chance_plus 链)尾追加 `gd_clear`「漂亮,过了。」(每局 1 次);本轮完成数超过历史最佳且确有旧纪录(`best>0`)时追加 `gd_record`「破纪录了。」(每局 1 次;结算另有 new_record,此处是局中破纪录的即时一刻)。游戏反馈层全档位。 |
|
||||
| G7 | space 方向呼喊第二通道 | loud 警报档(撞击前 500ms)回调里同窗直达播 `voice/dir_<dir>`「左!/右!/上!/下!」——与 sfx/alarm 分属 voice/sfx 两通道天然同时不互顶(引擎对白 duck 压 BGM 保证可闻);**直达式播放不排队**(呼喊必须赶在撞击前,宁可顶掉里程/充能类短句也不排到链尾迟到);游戏反馈层全档位。 |
|
||||
|
||||
## 9. round3 新增语音资产台词表(11 句 ×2 性别 = 22 文件;其中 G5 为重录 3 句)
|
||||
|
||||
全文与 synthesis §3 逐字一致(speaker/instruct 沿用各游戏旁白 pair 常量,dir_* 按表注
|
||||
用 space 旁白 pair);另 2 句为 G5 手势映射的同口径机械修正(裁定书 §3 未列,落地
|
||||
原因见 §8/G5——不清掉「双击重听」旧文案,input 看门狗与教学收尾仍在教已废除的手势):
|
||||
|
||||
| 游戏 | id | 全文 | 触发 |
|
||||
|---|---|---|---|
|
||||
| rhythm | `gd_slow` | 我放慢一些,跟着试试。 | 教学连 2 失败降速重演前(G2,full 档,每教学局 1 次) |
|
||||
| rhythm | `gd_count` | 四拍之后,继续。 | 菜单恢复 count-in 前(G3,full 档,每局恢复限 1 次) |
|
||||
| escape | `gd_next_fuse` | 保险丝到手。接下来,去找电箱。 | 拾取保险丝链尾(G4,全档位) |
|
||||
| simon | `gd_economy`(重录) | 记不住就向上滑,重新听一遍。免费机会有两次,用完要扣一次机会。 | 开局教学末尾(G5,全档位) |
|
||||
| simon | `gd_clear` | 漂亮,过了。 | 每轮成功链尾(G6,全档位,每局 1 次) |
|
||||
| simon | `gd_record` | 破纪录了。 | 局中破个人纪录(G6,全档位,每局 1 次) |
|
||||
| space | `dir_left` / `dir_right` / `dir_up` / `dir_down` | 左!/ 右!/ 上!/ 下! | loud 警报档方向呼喊(G7,全档位) |
|
||||
| simon | `gd_relisten`(同口径修正) | 需要的话,向上滑可以重新听一遍序列。 | input 10s 看门狗(原「双击可以重新听」,G5) |
|
||||
| simon | `t7_retry`(同口径修正) | 答错可以消耗机会重听。向上滑,可以随时重听。 | 教学收尾链(原「双击,可以随时重听」,G5) |
|
||||
|
||||
资产落位与管线同前:`web/<game>/audio/voice/{female,male}/<id>.{ogg,m4a}`
|
||||
(`tools/gen_voice_dual.py --game <g> --only <id>` 生成 → `--convert` 落盘 →
|
||||
`tools/check_all_assets.py` 终检)。
|
||||
|
||||
## 10. round3 验证记录
|
||||
|
||||
- 6 playtest(guide=off):除 simon 按 13 号文档 round3 变更记录改口 3 处断言
|
||||
(input 双击=作答、上滑=重听;108 条总数与 round2 基线一致)外,**断言零改动
|
||||
全绿**:storyline 54 / escape 103 / simon 108 / rhythm 81 / space 113 / rpg 139。
|
||||
- `web/harness/guide.test.mjs` **93 条断言全绿**(round2 基线 52 条既有断言零改动,
|
||||
其余为新增):G1(gd_answer 时间窗=窗口前整整 1 小节、恢复后重排仍在窗前)、
|
||||
G2(连 2 失败降速 ×1/0.75 + gd_slow + 做对恢复 + 每局封顶后回退 retry_skip)、
|
||||
G3(恢复先 gd_count 后 count-in、底鼓重排入队头、beat 震、每局限 1 次)、
|
||||
G5(双击作答/上滑重听/期望恰为 up 时上滑=作答,full 与 off 双档)、
|
||||
G6(gd_clear 每局 1 次 + 破纪录 gd_record)、G7(dir_* 与 loud 警报同窗 ≤50ms)。
|
||||
为此给 harness mock 补了 setInterval/虚拟 ctx.currentTime/用例间 localStorage 隔离。
|
||||
- 转写 harness 修复(`web/harness/mock.mjs`,工具层非玩法):decodeAudioData 原来
|
||||
按「最近一次 fetch 的 url」估时长,prewarm 并发下 voice 会随机继承 bgm 的 90s
|
||||
时长,语音结束定时器形同虚设(链全靠兜底看门狗推进、教学 tap 被滞留语音当跳过
|
||||
吃掉)——改为按 ArrayBuffer 自身 `__url` 估算,与各 playtest mock 对齐。
|
||||
- `tools/check_all_assets.py` 全绿(双格式配对、无 0 字节、全可解码、双性别集合
|
||||
一致);`tools/extract_voice_text.py` 已刷新 `web/harness/voice_text.json`
|
||||
(437 句)。`gen_voice_dual.py --check` 中 rpg/tut_b0 等 4 句「缺 staging」为
|
||||
R5 既有已知项(资产已先行落盘、staging 无 wav),非本轮引入。
|
||||
- 转写抽查(research/04-playtests/transcripts/,6 份全部重跑、零资产缺失):
|
||||
rhythm gd_answer 落在首窗口前整整 1 小节(t+67.0 vs 窗口 t+69.7)、教学第 2 句
|
||||
连 2 失败触发「我放慢一些」+ 慢速领奏(拍距 ×1/0.75)+ 做对恢复、菜单恢复
|
||||
「四拍之后,继续」+ 4 记底鼓 count-in 在;escape 保险丝后紧接 gd_next_fuse、
|
||||
其后再走两步;simon 看门狗提示上滑重听 + 期望恰为 up 时上滑作答 + 双击音
|
||||
双击作答,全程无双击歧义时刻;space 每次撞击前 500ms 警报与「左!/右!/上!/
|
||||
下!」同窗到达。
|
||||
|
||||
Reference in New Issue
Block a user