Files
SoundGame/docs/design/03-rhythm-rebuild.md
T
2026-10-01 23:26:47 +08:00

269 lines
12 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.
# 03 · 《节拍行者》跟随领奏模式(26 号对齐)
> **给开发者的实现要点摘要**
> 1. **现行施工依据是 [24-rhythm-drummer.md](24-rhythm-drummer.md)**(屏幕分区鼓手)。本文是「手势=乐器」跟随领奏变体的 26 号对齐规格:判定常量、评级、解锁、BPM 网格、call & response **保留**;交互按手册重写。
> 2. 演奏期 = Floor **`ACTION`**:不起等待声;手势即演奏。Miss = **不播该乐器音** + 回执/真话归因(没接 / 早 / 晚 / 方向)。禁止只震。
> 3. **新手谱面不得出现双击音符。** 四向滑是乐器 → 帮助=长按。`doubleTapWindow: 0`;`immediateTap` 仅演奏期。
> 4. 第一句就动手;第一次成功(跟上一击)≤10s。暂停恢复必须 count-in。
> 5. 语音全表仍见 [03-rhythm-voice-ids.md](03-rhythm-voice-ids.md)(不在本次改写范围);须停用「双击是军鼓」教学句,直至双击解锁后再启用。
---
## 0. 设计单(26 号附录 C)
### 0.1 一句话核心动作
**我奏一句,你在下一小节同一拍点用同一手势跟打。**
### 0.2 玩家可感知的状态(3 个)
| 状态 | Floor | 听感 | 第一次教 |
|---|---|---|---|
| 演奏(含教学跟打) | `ACTION` | 曲目 BGM + 领奏乐器 | 「跟着我敲。」 |
| 选曲 / 结算旁白 | `SPEAKING` / `YOUR_TURN` | menu pad + 交接提示音 | 「点一下选这首。」 |
| 暂停菜单 | `BUSY` | 音乐停,不叠 menu pad | — |
### 0.3 新手手势与解锁
| 手势 | 含义 | 解锁 |
|---|---|---|
| 单击、左滑、右滑 | 乐器(底鼓 / 闭镲 / 开镲) | 阶段 0 |
| 上滑、下滑 | 高 tom / 低 tom | 教学 T3 或曲目一中段,一次只加一个 |
| 长按 | 帮助(选曲/结算/教学讲解期) | 阶段 1 |
| 双击 | 军鼓 | 完成曲目一(第一局)且阶段 3 条件满足后才入谱;未解锁谱面不含双击 |
| 下滑(结算后) | 菜单 | 阶段 2 |
演奏期长按不加速旁白、不帮腔(避免误触成「空敲」);给 `invalid` 或忽略为 ghost(见判定)。选曲期长按=「选曲。左右滑切歌。单击开始。」
### 0.4 状态 × 手势矩阵(新手期)
| 状态 \ 手势 | 单击 | 左/右滑 | 上/下滑 | 长按 | 双击(未解锁) | 连点 |
|---|---|---|---|---|---|---|
| intro/结算 SPEAKING | 跳句 + `ok` | 打断并执行选曲语义 | 同左 | 帮助 | 当单击 | 400ms `busy` |
| 选曲 YOUR_TURN | 进入当前曲 | 切曲(报名) | `invalid`+解释 或 切曲若已映射 | 帮助 | 当单击 | `busy` |
| 教学/演奏 ACTION | 敲底鼓 | 敲对应镲 | 敲 tom(已教) | `invalid`(死输入) | 当单击(不当军鼓) | 各算一击 |
| 暂停菜单 | 确认 | 左右切换 | — | 重听说明 | 当单击 | `busy` |
| 结算 | 同曲再来 | 右滑=下一首(已解锁) | 阶段 2 下滑=菜单 | 重听评级 | 当单击 | 只处理第一下 |
### 0.5 等待点
| id | 期待 | `_full` | `_short` | 静默 | L3 |
|---|---|---|---|---|---|
| `tut_tap` | 应答小节单击 | 「第 1 拍,点一下。」 | 「点一下。」 | 该窗 Miss | 领奏再响一次 |
| `tut_lr` | 左然后右 | 「左,再右。」 | 「左右滑。」 | Miss | 演示 |
| `select` | 单击 | 「单击,开始。」 | 「单击。」 | 18s | — |
| `settle` | 单击 | 「单击,再来一遍。」 | 「单击。」 | 20s | — |
演奏 ACTION 不挂等待声。教学连败:第 3 次「我放慢一些。」降速,不卡死。
### 0.6 首 3 分钟逐秒脚本
| 时间 | 游戏说 / 播 | 期待 | 没做 | 做错 |
|---|---|---|---|---|
| 0~3s | 数拍底鼓 →「点一下,跟上。」领奏 `1:tap` | 下一小节第 1 拍单击 | 「这拍没接。」重来 | 早/晚真话;滑=「先点一下。」 |
| 3~10s | 跟上一击=第一次成功(乐器声)→「对。」 | — | — | — |
| 10~30s | 领奏 `1:left, 3:right` | 左右跟打 | 短句 | 方向归因 |
| 30~60s | 曲目一乐句 1–2(仅 tap/left/right) | 跟打 | 三档;连败降速 | Miss 无乐器音 |
| 60~120s | 引入上或下(一句+马上用) | 跟打 | 接管 | 归因 |
| 120~180s | 打完或过半 `mid_song`;结算 | 单击再来 | — | — |
### 0.7 失败表
| 类型 | 判定 | 归因 | 回到 | 新手代价 |
|---|---|---|---|---|
| 没出手 | 窗内无对应手势 | 「这拍没接。」 | 教学:该句领奏重来;正片:歌继续 | 不中断 |
| 早 / 晚 | 手势对但 \|dt\| 超窗 | 「早了。」/「晚了。」 | 教学重来;正片 Good 或 Miss | 不扣生命 |
| 方向错 | 手势种类错 | 「是向左滑。」 | 同上 | 无 |
| 双击未解锁 | 误当作军鼓 | 当单击判定;不报「你双击了」 | — | 无 |
| 教学连败 3 | 同一步 3 Miss | 「我放慢一些。」 | 该步降速 | 无 |
正片不掉血、不中断,歌照唱完。Miss **不播玩家乐器音**(错过=没出声)。
### 0.8 台词类别
- `critical`:开场「点一下,跟上。」(≤3s)。
- `content`:曲名、解锁、评级、`mid_song`。
- `hint`:教学短句、`gd_count` 恢复数拍。
- `feedback`:`gd_miss_none` / early / late / 方向。
### 0.9 断点复述
暂停记 BGM offset。恢复:**4 拍 count-in**(`gd_count` 每局限 1 次)后再入应答窗,第一拍不得注定 Miss。退出存 `tutorialDone / unlocked / grades / bestCombo / summary`。
### 0.10 测试
见 13 号 §5 与 24 号断言(鼓手模式)。若实现本文手势变体:新手谱面零 `doubletap` 音符;演奏期零等待声;Miss 无乐器音;恢复有 count-in。
---
## 1. 玩法与判定契约(数字保留)
```js
const PERFECT = 0.12;
const GOOD = 0.25;
const TAP_DELAY = 0.30; // 仅非 immediateTap 通道;演奏期优先 immediateTap,单击零补偿
const LOOKAHEAD = 0.6;
const PUMP_MS = 40;
```
- 手势对 + \|dt\|≤0.12 → Perfect:乐器 + accent。
- 手势对 + \|dt\|≤0.25 → Good:只播乐器。
- 否则 Miss:不播乐器 + `invalid` 或闷音反馈 + 教学期真话归因。
- 计分 Perfect=2 / Good=1 / Miss=0;S≥0.95 / A≥0.85 / B≥0.70 / C 其余。
- tap 只落第 1、3 拍。**双击音符:曲目一禁用;曲目二仅当双击已解锁;未解锁则改谱或降级为 tap。**
工程质量:AudioContext 预排程泵、BGM `src.start(t0)` 对网格 **保留**。
---
## 2. 谱面(新手无双击)
记号:`拍号:手势`。乐句 = 领奏 1 小节 + 应答 1 小节。流程:数拍 1 小节 → 逐乐句 → 结算。
### 2.1 曲目一《启程》90 BPM(教学曲,无双击、无反拍)
| 句 | 领奏节奏型 | 音符数 |
|---|---|---|
| 1 | `1:tap, 3:tap` | 2 |
| 2 | `1:left, 3:right` | 2 |
| 3 | `1:tap, 2:left, 3:tap` | 3 |
| 4 | `1:left, 2:up, 3:right` | 3 |
| 5 | `1:tap, 3:left, 4:up` | 3 |
| 6 | `1:right, 3:tap, 4:down` | 3 |
| 7 | `1:up, 3:down, 4:left` | 3 |
| 8 | `1:tap, 2:up, 3:right, 4:down` | 4 |
| 9 | `1:left, 2:right, 3:tap, 4:up` | 4 |
| 10 | `1:tap, 2:left, 3:tap, 4:right` | 4 |
休止:前 4 句应答后各休 1 小节。
### 2.2 曲目二《追风》105 BPM(SPB=0.571s,12 句)
未解锁双击时:表中 `doubletap` 改写为已解锁手势(优先整拍 `up`/`down`,或 1/3 拍 `tap`)。已解锁则按表演奏。反拍从第 5 句起,每句至多 1 个。
| 句 | 领奏节奏型 | 音符数 |
|---|---|---|
| 1 | `1:tap, 3:right` | 2 |
| 2 | `1:left, 2:doubletap, 3:tap` | 3 |
| 3 | `1:up, 3:down, 4:doubletap` | 3 |
| 4 | `1:tap, 2:right, 3:left, 4:doubletap` | 4 |
| 5 | `1:tap, 2.5:right, 3:tap` | 3 |
| 6 | `1:left, 2:up, 3.5:right, 4:doubletap` | 4 |
| 7 | `1:tap, 2:doubletap, 3:down, 3.5:up` | 4 |
| 8 | `1:right, 1.5:left, 3:tap, 4:doubletap` | 4 |
| 9 | `1:tap, 2.5:left, 3:tap, 4:doubletap` | 4 |
| 10 | `1:up, 2:right, 3:down, 3.5:left` | 4 |
| 11 | `1:tap, 2:doubletap, 2.5:right, 3:tap` | 4 |
| 12 | `1:left, 1.5:right, 2:doubletap, 3:tap, 4:doubletap` | 5 |
前 2 句应答后各休 1 小节。
### 2.3 曲目三《星爆》120 BPM(SPB=0.5s,12 句)
双击可落反拍,**仅双击已入池**。未入池不得进入曲目三,或进曲前先做军鼓解锁课。
| 句 | 领奏节奏型 | 音符数 |
|---|---|---|
| 1 | `1:tap, 2:doubletap, 3:tap, 4:doubletap` | 4 |
| 2 | `1:left, 2:right, 3:left, 4:doubletap` | 4 |
| 3 | `1:up, 2:down, 3:up, 4:doubletap` | 4 |
| 4 | `1:tap, 2.5:left, 3:tap, 4:right` | 4 |
| 5 | `1:left, 1.5:right, 2.5:left, 3:tap` | 4 |
| 6 | `1:tap, 2:up, 2.5:down, 3:tap, 4:doubletap` | 5 |
| 7 | `1:right, 2:doubletap, 3:left, 3.5:right, 4:up` | 5 |
| 8 | `1:tap, 1.5:doubletap, 2.5:left, 3:tap, 3.5:right, 4:doubletap` | 6 |
| 9 | `1:left, 2:doubletap, 2.5:up, 3:right, 4:doubletap` | 5 |
| 10 | `1:tap, 2.5:down, 3:tap, 3.5:up, 4:doubletap` | 5 |
| 11 | `1:right, 1.5:left, 2:right, 3:tap, 4:doubletap` | 5 |
| 12 | `1:tap, 2:doubletap, 2.5:left, 3:tap, 3.5:right, 4:doubletap` | 6 |
全曲不休。
### 2.4 改谱约束
1. 曲目一禁止反拍、禁止双击。
2. tap 只落 1/3 拍。
3. 同一手势连击 ≤2;乐句内手势种类 ≥2(全鼓收束句除外)。
4. up/down 尽量成对。
5. 左右不放在相邻反拍(仅曲目三允许 `1:left, 1.5:right`)。
---
## 3. 手势 → 乐器(资产保留)
| 手势 | 乐器 | sfx | 何时入池 |
|---|---|---|---|
| tap | 底鼓 | `inst_kick` | 开场 |
| left | 闭镲 | `inst_hat_l` | 开场 |
| right | 开镲 | `inst_hat_r` | 开场 |
| up | 高 tom | `inst_tom_hi` | 曲目一第 4 句前教 |
| down | 低 tom | `inst_tom_lo` | 曲目一第 6 句前教 |
| doubletap | 军鼓 | `inst_snare` | 曲目一通关且手势阶段 3 |
| accent | Perfect 亮音 | `accent` | — |
---
## 4. 流程与教学
```
idle → intro → tut → select(二周目)→ countin → main → end
```
教学 3 步,一次一击,**T3 不再含双击**:
| 步 | 领奏 | 机制 |
|---|---|---|
| T1 | `1:tap` | 做错:归因 + 重来;2 败降速;3 败演示通过 |
| T2 | `1:left, 3:right` | 同上 |
| T3 | `1:tap, 2:up, 3:tap` | 通过后进曲目一 |
`tutorialDone` 后 intro 缩为一句「我奏一句,你跟一句。」点一下开始。
选曲:左右滑切曲,单击进入。未解锁:「上一首拿到 B 级以上解锁。」
结算:单击=同曲再来;右滑=下一首;阶段 2 下滑=菜单(左右滑+单击确认)。
---
## 5. 进度
```json
{
"schema": 1,
"summary": "《追风》B级 · 已解锁2/3首",
"tutorialDone": true,
"unlocked": 2,
"grades": { "song1": "a", "song2": "b" },
"bestCombo": 42
}
```
曲目 n 拿到 B → 解锁 n+1。
---
## 6. 实现要点
1. 保留泵、LOOKAHEAD、网格对齐。演奏期 `immediateTap`;其它相位 `doubleTapWindow: 0`。
2. 谱面 JSON 按本文 §2;领奏第 k 小节、应答 = 领奏 + 4 拍。
3. 玩家乐器即发即弃;Perfect 叠 accent。
4. 三首 BGM 无缝循环工艺保留。数拍融入 BGM 或鼓手数拍(鼓手模式见 24)。
5. 暂停恢复:网格平移 + **count-in**。
---
## 7. 废止清单
| 废止 | 改为 |
|---|---|
| 曲目一句 3 起双击音符;T3 教双击 | 新手零双击;军鼓后解锁 |
| Miss 只震不响 / 仍播乐器 | Miss 静音该乐器 + 回执 + 真话归因 |
| 演奏期等待声、插播长教学 | ACTION,应答小节零语音 |
| 帮助用上滑(与 tom 冲突) | 长按(非演奏期) |
| 菜单双击确认 | 左右滑+单击 |
| 暂停恢复直接进窗导致必 Miss | count-in |
| 开场念完整规则 | 第一句就跟打 |
| 本文作为唯一施工依据 | **以 24 号鼓手模式为准**;本文仅手势变体/档案 |
震动连击里程碑可保留为补充;主通道永远是声音。