Files
SoundGame/docs/design/26-apply-rhythm.md
T
xsl ee5d4d2544 feat(playbook): 26 号交互手册全量落地——剩余 12 款深度重构 + 语音全量重制
storyline/escape/simon 首批之后的推广收官:15 款全部按 26 号模式运行
(发言权/回执/三档提示/迷茫接管/手势阶梯/断点复述),旧「双击重听/格挡/
菜单确认」等反模式口径全线废除,开场零规则念白(首句即动手)。

游戏层(12 款):rpg(格挡=前摇窗口内再单击)/ rhythm / space / radio /
dungeon / abyss / detective / cipher / teahouse / keeper / bridge /
hunt(联机切片):
- 每款 game.js 接引擎六模块 + makeInputPipeline(doubleTapWindow:0);
  四向玩法类 swipeCore + 长按帮助;双击是玩法的(space 护盾 / hunt
  旋风斩)按手势阶梯阶段 3 分档恢复双击窗口(doubletapCore)
- 每款 playtest 重写:玩法断言 + §6.2 乱点机器人(无声操作 / 被动
  原句重复 / 打断失败 = 0);15 款 3900+ 断言全绿
- 12 份 docs/design/26-apply-*.md 施工单 + tools/voice_lines_26/
  台词清单 + voice-ids 文档同步 + 转写会话剧本按新口径重写

引擎层(web/engine/,6 处修复):pipeline 增 doubletapCore;novice
teachLine 带 voice/ 前缀(此前教学句被静默丢弃);confusion.record
前置到新手门(锁定手势的乱点也计信号);InvalidHints 播完恢复解释前
状态(根治孤儿 BUSY);WaitPoint takeover(2) 台账去重;台账只在
speak 真正播出时登记。遗留引擎债登记 roadmap §3.1。

语音资产:台词表合并(新增 ~250 系统句 / 改 ~50 旧口径 / 删 ~110
废止句;合并器 tools/merge_voice_lines_26.py + 引用校验器
tools/validate_voice_refs.py),GPU 重录 1536 wav → 4204 ogg/m4a
落地,check_all_assets + validate_voice_refs 双绿;键盘变体同步扩表。

大厅/文档:15 款统一新交互口径(「新交互」徽标退役);README /
HANDOVER / rpg README 旧口径修正;roadmap P0-P3 置完成。
2026-10-02 12:33:20 +08:00

111 lines
11 KiB
Markdown
Raw 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.
# 26-apply · 《节拍行者》重构设计单(26 号文档落地)
> 按 26 号文档附录 C 填写。交互规则权威来源:[26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。
> 玩法权威来源:[24-rhythm-drummer.md](24-rhythm-drummer.md)(谱面 / 判定窗 / BPM / 解锁 / 评级 / 音色全部不动)。
> 台词清单:[tools/voice_lines_26/rhythm.md](../../tools/voice_lines_26/rhythm.md);登记副本同步 [24-rhythm-voice-ids.md](24-rhythm-voice-ids.md)。
## 1. 一句话核心动作
**屏幕是一面 3×2 鼓组。领奏敲一小节,你在下一小节同一拍点敲同一面鼓。**
## 2. 玩家可感知的状态(3 个)与声音身份
| 状态 | Floor | 听感 | 来源 |
|---|---|---|---|
| 演奏(摸鼓 / 教学跟打应答窗 / 正片) | `ACTION` | 无鼓伴奏 + 鼓声音色(声像+音高)就是状态;点按即敲,无等待声 | §4.1 |
| 演出(开场指令后探针之外无;教学指令 / 数拍 / 领奏示范 / 结算评级链) | `SPEAKING` / `BUSY` | 语音链(教学指令 critical);数拍与示范小节只有内容音,手势给 busy 回执 | §4.1 |
| 等你(选曲 / 结算 / 菜单 / 续玩问询 / 教学跟打等待点) | `YOUR_TURN` | 交接提示音 → 等待声;教学跟打等待点关等待声(演奏语义,24 号 A27) | §4.1 |
首次教:`sys_turn_teach`「听到这个声音,就是轮到你了。」在曲目一第一个应答窗前随交接提示音一起出现(每账号一次)。
## 3. 新手手势表与解锁阶梯
| 手势 | 演奏 ACTION | 选曲 / 结算 / 菜单 | 解锁 |
|---|---|---|---|
| 单击(分区坐标,`immediateTap`) | 敲该区(判定 / 自由演奏出声) | 开始 / 再来 / 确认菜单项 | 阶段 0 |
| 左 / 右滑 | `invalid` 回执(非音符,不出声) | 切曲(每项报名)/ 结算下一首 / 菜单换项 | 阶段 0 |
| 上滑 | 状态查询一句(同长按) | 状态查询 / 帮助一句 | 阶段 1(第一次成功跟打,`ladder.onGoal()`) |
| 下滑 | 阶段 2 前回执 `invalid`;阶段 2 后无条件暂停菜单 | 菜单 / 回大厅 | 阶段 2(一首曲子打完,`ladder.onGameDone()`) |
| 长按 | 状态查询(曲目 / 段落 / 连击一句 ≤20 字;`setRateBoostEnabled(false)` 豁免快进) | 帮助 / 重听最近播报 | 阶段 0(本作核心手势,`longpressCore`) |
| 双击 | 当单击(同区两记连续点按本来就是两次 tap,`doubleTapWindow: 0`) | 阶段 3 后重听最近播报(`sys_say_again` 前缀) | 阶段 3 |
键盘平行通道:Digit1–6 / 小键盘 1–6 = 六区,按下即发零延迟(`tapcancel` 撤销认领同步适用);空格落 BC 家区;选曲 / 结算 / 菜单态数字键不生效。
## 4. 状态 × 手势矩阵(新手期)
| 状态 \ 手势 | 单击(分区) | 左 / 右滑 | 上滑 | 下滑 | 长按 | 双击(未解锁) | 连点 / 乱滑 |
|---|---|---|---|---|---|---|---|
| 开场指令(SPEAKING,critical) | busy 回执 | busy 回执 | busy | busy | 状态句 | 折算单击→busy | busy |
| 摸鼓探针(ACTION) | 敲区出声 + 首摸报名(silent-ok) | `invalid` 回执 | `invalid` 回执 | `invalid` 回执 | 状态句 | 敲区 | 每下都出声(探索礼物) |
| 教学指令 / 数拍 / 领奏示范(SPEAKING critical / BUSY) | busy 回执 | busy 回执 | busy | busy | busy | busy | busy |
| 教学跟打应答窗(YOUR_TURN,无等待声) | 敲区判定(silent-ok;错鼓=invalid+归因) | `invalid` 回执 | 状态句 | `invalid` 回执 | 状态句 | 敲区 | 合法连击(hold) |
| 正片(ACTION) | 敲区判定(silent-ok;窗外自由演奏出声) | `invalid` 回执 | 状态句 | 阶段2=菜单 / 回执 | 状态句 | 敲区 | 合法连击 |
| 选曲(YOUR_TURN) | 开始当前曲(未解锁=invalid+song_locked) | 切曲报名(30s 台账去重后只给提示音) | 帮助一句 | 阶段2=回大厅 / 回执+解释 | 帮助一句 | (阶段3)重听 | 400ms 防连点 busy |
| 暂停菜单(YOUR_TURN) | 确认当前项 | 换项报名 | 重听菜单说明 | 关闭菜单恢复 | 重听菜单说明 | (阶段3)重听 | 400ms 防连点 busy |
| 结算(YOUR_TURN) | 同曲再来 | 右=下一首(未解锁=invalid+song_locked;末位=restart 句) | 重听评级 | 阶段2=回大厅 / 回执 | 重听评级 | (阶段3)重听 | 只处理第一下 |
| 续玩问询(YOUR_TURN) | 继续上次曲目 | 右=重新选曲 | 帮助 | 回执+解释 | 帮助 | (阶段3)重听 | 400ms 防连点 busy |
无空格:每一格都有回执或内容音;`invalid` 在演奏态只给回执不解释(应答内零语音,24 号 §0.5),在等待态首次附一句解释(原则 7)。
## 5. 等待点配置表
| id | 期待 | full | short | 静默阈值 | L2 | L3(onDemo) |
|---|---|---|---|---|---|---|
| `select` | tap | select_full「单击,开始。」 | select_short「单击。」 | 18s/40s | 只留 tap | 提示音 |
| `settle` | tap | settle_full「单击,再来一遍。」 | settle_short「单击。」 | 20s/45s | 只留 tap | 提示音 |
| `menu` | tap/left/right | menu_help | menu_help | 20s/45s | 只留三手势 | 提示音 |
| `reopen` | tap/right | sys_continue_ask | select_short | 18s/40s | 只留两手势 | 提示音 |
| `tut_0`(家区跟打) | tap | tut_kick_full「家区在下中。点一下。」 | tut_kick_short「点下中。」 | 8s/16s | 只留 tap | 演示:游戏把本步音符敲一遍再交回 |
| `tut_1`(左右下跟打) | tap | tut_sides_full「左下,再右下。」 | tut_sides_short「左右下。」 | 8s/16s | 同上 | 同上 |
| `tut_2`(上排跟打) | tap | tut_top_full「上排三个,挨个敲。」 | tut_top_short「跟上排。」 | 8s/16s | 同上 | 同上 |
- 教学跟打等待点在应答窗开时 `yieldTurn` 且 `bedEnabled=false`(交接提示音响、等待声不响)——演奏语义(24 号 A27);窗到期评估完成/失败即摘点。
- 摸鼓探针(T0)不是等待点:ACTION 自由探索,任意敲出声 + 首摸报名,摸 ≥3 区或 8s 无触摸自动进 T1(探索是礼物不是门槛,24 号 §6)。
- 正片全曲 ACTION,不挂等待点、不挂等待声;应答小节内零语音(hint/feedback 播不出就丢,§4.6)。
## 6. 首 3 分钟逐秒脚本
| 时间 | 游戏说 / 播 | 期待玩家做 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | 「点一下屏幕。」(critical)→ 摸鼓探针开(ACTION) | 任意敲 | 8s 自动进 T1(不卡流程) | 滑动:invalid 回执 |
| 3~10s | 区音色 + 区名(第一次成功=第一声鼓);首摸后「摸到三个不同的地方,我们就开始。」 | 摸 ≥3 区 | 同上 | 重复摸:只出声不报名 |
| 10~30s | T1「听我敲下中,你跟着敲。」→ 木鱼数拍 + 领奏示范(BUSY)→ 交接提示音 → 应答窗(YOUR_TURN 无等待声) | 敲家区 BC | 8s:tut_kick_full → short → 提示音 | 错区:区名归因 + 错鼓句 |
| 30~60s | 「对了。」→ T2 左右下、T3 上排各一步(教一个马上用) | 跟打 | 三档 + 迷茫接管 | 2 败降速 25%;3 败跳步 |
| 60~90s | 「很好,演出开始。」→ 选曲(select_hint + 曲名,等待声) | 单击开始 | 18s:select_full → 「单击。」 | 滑动切曲报名 |
| 90~100s | 四下底鼓数拍 + 无鼓 BGM 起(ACTION);首应答窗前 1 小节「听到这个声音,就是轮到你了。」+ 交接提示音 | 听 → 跟敲 | 曲目继续(不掉血不中断) | 早/晚/错鼓分档归因 |
| 100~180s | 曲目一前半(Perfect 叠亮音、连击 16 震、mid_song 过半播报) | 敲对区 | 连 2 Miss 才 gd_miss 一次(曲尾 3s 不插) | Miss=闷镲 + 归因 |
节奏检查 ✓:3s 内动手(第一句就是指令);首成功=第一声鼓(≤10s);每 30s 有可听进展(区名 → 教学步 → 曲目句)。
## 7. 失败表(24 号 §0.7 数字保留,归因口径 26 号化)
| 失败类型 | 判定 | 归因句(feedback,2s 内) | 回到哪里 | 新手期代价 |
|---|---|---|---|---|
| 没出手 | expected+GOOD+0.10s 无应答 | 教学:gd_miss_none + retry_listen;正片:闷镲(连 2 才 gd_miss,同曲一次) | 教学该步重演;正片歌继续 | 不中断、不扣 |
| 早 / 晚 | 同区超 Perfect 仍在 Good | 教学:retry_early / retry_late + gd_miss_early / late;正片 Good 出声不纠 | 教学该步重演 | 无 |
| 错鼓 | 异分区音符半窗内被敲 | 教学:retry_wrong + gd_miss_wrong;正片错区音色本身(配额内不叠语音) | 教学该步重演 | combo 清零 |
| 教学 2 败 | 同一步失败 2 次 | gd_slow「我放慢一些。」×0.75 重演(每教学局 1 次) | 该步 | 再败跳过不卡死 |
| 长按演奏期误触 | 按下≥450ms | 状态查询句(不判定、不归属) | 原地 | 无 |
归因真话律:没出手不说「慢了半拍」;归因句 `feedback` 类,应答小节内播不出就丢(§4.6);曲尾 3s 内不插 gd_miss。
## 8. 台词表(类别标注)
- `critical`:sys_first_tap(开场指令 <3s)、tut_z_kick / tut_z_sides / tut_z_patt(教学指令各 <3s)、tut_ok+下一条教学指令链、结算承诺段 restart(+解锁教学 sys_unlock_*)
- `content`:welcome_back、tut_done、tut_probe、zone_*(首摸报名)、song*_name、song_locked、unlock_song2/3、grade_s/a/b/c、new_best_combo、mid_song、tut_fill、sys_turn_teach、sys_continue_ask
- `hint`:select_full/short、settle_full/short、menu_help、tut_kick/sides/top_full/short、st_p1a..p3b、st_c1..3(长按状态查询)、rules、sys_say_again
- `feedback`:retry_early/late/wrong/listen/skip、inv_generic、inv_down_locked、inv_up_locked
- 沿用向导层 9 句(已在库):gd_answer、gd_count、gd_miss、gd_miss_early/late/wrong/none、gd_slow
- 完整清单(新增 32 / 修改 7 / 删除 5 / 键盘变体 22):`tools/voice_lines_26/rhythm.md`。
## 9. 断点复述句
- 保存:进曲即写 `progress.lastSong`(曲目粒度,schema 1 加字段);一曲打完清除。
- 回来:tutorialDone 且 lastSong 有效 → 先播状态声与 `sys_continue_ask`「上次的曲子没打完。单击继续,右滑重选。」再 `yieldTurn(reopen)`;单击=继续该曲(从头起拍,count-in 进场),右滑=重新选曲。
- 暂停(菜单):泵停、BGM 记 offset;恢复全网格平移 = 暂停时长 + 4 拍 count-in(guide full 先播 gd_count,每曲 1 次)。
## 10. 测试记录
- 无头 playtest:`web/rhythm/test/playtest.mjs`(判定窗 / 错鼓 / 超时 / tapcancel 撤销 / 双击两连击 / 数拍 / 加花 / 评级解锁 / 进度 summary 等玩法断言保留适配;新增 26 号断言:开场首句 critical 动手、演出期 busy 回执、ACTION 无等待声、等待点台账、§6.2 乱点机器人:无声操作 0 / 被动原句重复 0 / 打断失败 0)。
- 真人冷启动:待测。