311 lines
15 KiB
Markdown
311 lines
15 KiB
Markdown
# 24 · 《节拍行者》鼓手模式(26 号对齐)
|
||
|
||
> **给开发者的实现要点摘要**
|
||
> 1. **玩法保留**:3×2 分区鼓组、跟随领奏、PERFECT ±0.15 / GOOD ±0.35、S~C 评级、B 级解锁下一首、无鼓伴奏、BPM 网格。本文取代 03 号作为施工依据。语音表仍见 [24-rhythm-voice-ids.md](24-rhythm-voice-ids.md)。
|
||
> 2. **演奏期 = Floor `ACTION`**:不起等待声;点按即敲。Miss = 不按「敲对」计、该音符无领奏应答感 + 闷镲/回执 + 真话归因。禁止只震。
|
||
> 3. **新手期无双击手势**(`doubleTapWindow: 0`)。同区两记连续点按是两下敲击,不是「双击手势」。菜单禁止双击确认。双击手势直至阶段 3 才存在,且不绑音符类型。
|
||
> 4. 分区点按是核心;选曲/结算/暂停说明的**帮助=长按**(上半屏点按是鼓,上滑易混)。暂停恢复必须 **count-in**。
|
||
> 5. 第一句就摸鼓或跟打;第一次成功 ≤10s。
|
||
|
||
---
|
||
|
||
## 0. 设计单(26 号附录 C)
|
||
|
||
### 0.1 一句话核心动作
|
||
|
||
**屏幕是一面 3×2 鼓组。领奏敲一小节,你在下一小节同一拍点敲同一面鼓。**
|
||
|
||
### 0.2 玩家可感知的状态(3 个)
|
||
|
||
| 状态 | Floor | 听感 | 第一次教 |
|
||
|---|---|---|---|
|
||
| 演奏 / 教学跟打 | `ACTION` | 无鼓伴奏 + 鼓声音色(声像+音高) | 「敲屏幕。摸到哪是哪。」 |
|
||
| 选曲 | `YOUR_TURN` | `bgm/menu` + 等待声 | 「左右滑选歌。单击开始。」 |
|
||
| 结算 | `YOUR_TURN` | menu pad + 评级句 | 「单击,再来一遍。」 |
|
||
|
||
暂停:音乐停,不叠 menu pad。恢复先 count-in,再进窗。
|
||
|
||
### 0.3 新手手势与解锁
|
||
|
||
| 手势 | 演奏 ACTION | 选曲 / 结算 | 解锁 |
|
||
|---|---|---|---|
|
||
| 单击(含分区坐标) | 敲该区 | 开始 / 再来 | 阶段 0;演奏期 `immediateTap` |
|
||
| 左 / 右滑 | 不作为音符(可 `invalid` 或忽略为非敲) | 切曲 / 右滑下一首 | 阶段 0 |
|
||
| 长按 | 死输入:`invalid` 或闷镲,不判定 | **帮助一句** | 阶段 1 |
|
||
| 下滑 | 阶段 2 前=`invalid`「现在只要敲。」;阶段 2 后无条件暂停菜单 | 菜单 | 阶段 2(第一局结束) |
|
||
| 双击手势 | **不存在**;300ms 内两下=两次 tap | 当单击 | 阶段 3 仅重听选曲说明/评级,禁止绑重开 |
|
||
|
||
键盘:Digit1–6 = 六区,按下即发。空格落 BC(家区)。选曲态数字键无效。
|
||
|
||
### 0.4 状态 × 手势矩阵(新手期)
|
||
|
||
| 状态 \ 手势 | 分区单击 | 左右滑 | 长按 | 下滑(未解锁菜单) | 双击 | 连点 |
|
||
|---|---|---|---|---|---|---|
|
||
| intro/tut 讲解 SPEAKING | 跳句 或 摸鼓(T0 探索) | 打断 | 帮助 | `invalid`+解释 | 当单击 | 400ms `busy`(讲解);T0 每下都出声 |
|
||
| 教学跟打 ACTION | 敲区判定 | `invalid` | 死输入 | `invalid` | 当两次单击 | 两下两击 |
|
||
| 演奏 ACTION | 敲区判定 | 非音符 | 死输入 | 未解锁=`invalid` | 两次单击 | 合法连击 |
|
||
| 选曲 | 开始当前曲 | 切曲报名 | 帮助 | 阶段 2 菜单 | 当单击 | `busy` |
|
||
| 暂停菜单 | 确认当前项 | 左右切换 | 重听说明 | 关闭菜单 | 当单击 | `busy` |
|
||
| 结算 | 同曲再来 | 右=下一首 | 重听评级 | 菜单 | 当单击 | 只处理第一下 |
|
||
|
||
### 0.5 等待点
|
||
|
||
| id | 期待 | `_full` | `_short` | 静默 | L2 / L3 |
|
||
|---|---|---|---|---|---|
|
||
| `tut_probe` | 任意敲 ≥1 | 「随便摸,听鼓在哪。」 | 「摸一下。」 | 8s 自动进 T1 | — |
|
||
| `tut_kick` | 应答敲 BC | 「家区在下中。点一下。」 | 「点下中。」 | Miss | 降速重演 → 演示 |
|
||
| `tut_sides` | BL 然后 BR | 「左下,再右下。」 | 「左右下。」 | Miss | 同上 |
|
||
| `select` | 单击 | 「单击,开始。」 | 「单击。」 | 18s | — |
|
||
| `settle` | 单击 | 「单击,再来一遍。」 | 「单击。」 | 20s | — |
|
||
|
||
演奏 ACTION 不挂等待声、应答小节内零语音。
|
||
|
||
### 0.6 首 3 分钟逐秒脚本
|
||
|
||
| 时间 | 游戏说 / 播 | 期待 | 没做 | 做错 |
|
||
|---|---|---|---|---|
|
||
| 0~3s | 「点一下屏幕。」或直接「随便摸。」 | 任意敲 | 8s 自动进 T1 | — |
|
||
| 3~10s | 区音色 + 区名(第一次成功)→ T1 数拍 → 领奏 BC | 应答敲家区 | 「这拍没接。」 | 错区:报名实际区 +「敲家区。」 |
|
||
| 10~30s | T2 左右下排 | 跟打 | 短句;2 败降速 | 真话归因 |
|
||
| 30~60s | T3 上排三音或进曲目一句 1 | 跟打 | 接管 | Miss 无「假成功」乐器归属 |
|
||
| 60~180s | 曲目一前句(无双击手势、反拍仅加花) | 敲对区 | 连 2 Miss 才 `gd_miss` 一次 | 早/晚/没接/错鼓分档 |
|
||
|
||
### 0.7 失败表
|
||
|
||
| 类型 | 判定 | 归因 | 回到 | 新手代价 |
|
||
|---|---|---|---|---|
|
||
| 没出手 | expected+GOOD+0.10s 无应答 | 「这拍没接。」 | 教学重来;正片歌继续 | 不中断 |
|
||
| 早 / 晚 | 同区超 Perfect 但仍在 Good | 教学事后「早了/晚了」;正片 Good 出声 | 教学重来 | 无 |
|
||
| 错鼓 | 异分区音符半窗内被敲 | 教学:区名+「敲错鼓了」;正片:错区音色本身(配额不叠语音) | 同上 | combo 清零 |
|
||
| 教学 2 败 | 同一步 | 「我放慢一些。」×0.75 | 该步 | 再败跳过不卡死 |
|
||
| 长按演奏期 | 按下≥450ms | 闷镲 + `invalid` | 不归属 | 无 |
|
||
|
||
### 0.8 台词类别
|
||
|
||
- `critical`:开场动手句 ≤3s。
|
||
- `content`:曲名、评级、解锁、`tut_map` 拆句后非关键段。
|
||
- `hint`:`gd_answer`、`gd_count`、区名、短教学。
|
||
- `feedback`:`gd_miss_none` / early / late / `retry_wrong`。
|
||
|
||
应答小节内:hint/feedback 播不出则丢。曲尾 3s 内不插 `gd_miss`。
|
||
|
||
### 0.9 断点复述
|
||
|
||
暂停:泵停、BGM 记 offset。恢复:cue.expected / `_bgmT0` 平移 = 暂停时长 + **count-in 小节**;guide full 先播 `gd_count`(每曲 1 次)。退出写进度 schema 1。
|
||
|
||
### 0.10 测试
|
||
|
||
§12 断言清单(已按新手无双击、菜单单击确认、ACTION、count-in 修订)。乱点:无声操作 0;被动原句重复 0。
|
||
|
||
---
|
||
|
||
## 1. 可行性决策(保留)
|
||
|
||
引擎 `onGesture(g, info?: {x,y})` 后向兼容扩展;键盘 `keyCenter` 免费得坐标。打击乐 numpy 合成。BGM 硬性 `no drums`。回归义务见 `research/rhythm-drummer/round0/`。
|
||
|
||
---
|
||
|
||
## 2. 屏幕分区与音色(保留)
|
||
|
||
```
|
||
┌─────────┬─────────┬─────────┐
|
||
│ TL 左上 │ TC 上中 │ TR 右上 │ 上排:清亮 pan -0.6 / 0 / +0.6
|
||
│ 踩镲 │ 高嗵 │ 吊镲 │
|
||
├─────────┼─────────┼─────────┤
|
||
│ BL 左下 │ BC 下中 │ BR 右下 │ 下排:低沉
|
||
│ 军鼓 │ 底鼓 │ 低嗵 │
|
||
└─────────┴─────────┴─────────┘
|
||
```
|
||
|
||
| 区 | 乐器 | sfx | pan | 合成要点 |
|
||
|---|---|---|---|---|
|
||
| TL | 闭合踩镲 | `dm_hat` | -0.6 | 6–10kHz 噪声,0.06s |
|
||
| TC | 高音嗵 | `dm_tomhi` | 0 | 200→140Hz,0.25s |
|
||
| TR | 吊镲 | `dm_crash` | +0.6 | 长尾 ≤1.2s |
|
||
| BL | 军鼓 | `dm_snare` | -0.6 | 鼓皮+带通噪声,0.2s |
|
||
| BC | 底鼓 | `inst_kick` | 0 | 130→45Hz,0.25s |
|
||
| BR | 低音嗵 | `dm_tomlo` | +0.6 | 120→75Hz,0.3s |
|
||
|
||
Perfect 叠 `dm_accent`。`zoneOf(x,y)` 以 `#game-root` 为界;缺 payload 落 BC。领奏与玩家同一批 sfx。
|
||
|
||
**同区连击**:谱面上 `1:BC, 2:BC` 是两记点按。新手 `doubleTapWindow: 0` 时两下都是 `tap`,各自判定。不要再走「双击改判 / 序曲撤销账簿」——只保留 immediateTap 的 `tapcancel`(转滑动/长按时撤销这一下的认领,ghost 音收不回,统计必须回滚且不计 Miss)。
|
||
|
||
---
|
||
|
||
## 3. 循环与状态机(保留)
|
||
|
||
```
|
||
选曲 → 数拍(1 小节底鼓×4 + 每拍轻震)→ 逐乐句 → 过门/加花 → 终句吊镲 → 结算
|
||
idle → intro → tut → select → countin → main → end
|
||
```
|
||
|
||
- 正片数拍:`inst_kick`×4(guide.test G3 `_sched` 锚点保留)。
|
||
- 教学数拍:木鱼 `dm_accent`(G2:教学 `_sched` 里 kick=领奏音)。
|
||
- 每曲第一个应答窗前 1 小节:`gd_answer` + `turn`。
|
||
- **模态菜单**(阶段 2):下滑呼出;**左右滑切换、单击确认**;长按=重听菜单说明;再下滑关闭。暂停真冻结。恢复全网格平移 + **4 拍 count-in**。
|
||
|
||
---
|
||
|
||
## 4. 谱面与难度(保留;新手无「双击手势」需求)
|
||
|
||
记号 `拍:区码`。加花尾音恒 TR。
|
||
|
||
### 4.1 曲目一《启程》90 BPM(8 句 + 终曲加花,≈65s)
|
||
|
||
| 句 | 领奏节奏型 | 音符数 |
|
||
|---|---|---|
|
||
| 1 | `1:BC, 3:BC` | 2 |
|
||
| 2 | `1:BL, 3:BR` | 2 |
|
||
| 3 | `1:BC, 2:BC, 3:BL` | 3(同区两记点按,不是双击手势) |
|
||
| 4 | `1:BL, 2:BR, 3:BC` | 3 |
|
||
| 5 | `1:BC, 2:BL, 3:BC, 4:BR` | 4 |
|
||
| 6 | `1:TL, 3:BL, 4:BC` | 3 |
|
||
| 7 | `1:BC, 2:TL, 3:BC, 4:TR` | 4 |
|
||
| 8 | `1:BL, 2:BR, 3:TL, 4:BC` | 4 |
|
||
| 终曲加花 | `1:BC, 1.5:BC, 2:BC, 2.5:BL, 3:BL, 3.5:BC, 4:TR` | 7 |
|
||
|
||
前 4 句应答后各休 1 小节。曲目一普通句无反拍;反拍仅加花。
|
||
|
||
### 4.2 曲目二《追风》105 BPM
|
||
|
||
| 句 | 领奏节奏型 | 音符数 |
|
||
|---|---|---|
|
||
| 1 | `1:BC, 3:BR` | 2 |
|
||
| 2 | `1:BL, 2:BL, 3:BC` | 3 |
|
||
| 3 | `1:TL, 3:BL, 4:BR` | 3 |
|
||
| 4 | `1:BC, 2:BL, 3:BC, 4:TL` | 4 |
|
||
| 5 | `1:BC, 2.5:BR, 3:BC` | 3(首个反拍) |
|
||
| 中途加花 | `1:BL, 1.5:BL, 2:BC, 2.5:BC, 3:BR, 3.5:BR, 4:TR` | 7 |
|
||
| 6 | `1:BL, 2:TL, 3.5:BR, 4:BC` | 4 |
|
||
| 7 | `1:BC, 2:BL, 3:BR, 3.5:TL` | 4 |
|
||
| 8 | `1:BR, 1.5:BL, 3:BC, 4:TR` | 4 |
|
||
| 9 | `1:BC, 2.5:TL, 3:BC, 4:BL` | 4 |
|
||
| 10 | `1:BL, 2:BR, 3:TL, 4:BC` | 4 |
|
||
| 终曲加花 | `1:BC, 1.5:BL, 2:BC, 2.5:BL, 3:BC, 3.5:BR, 4:TR` | 7 |
|
||
|
||
前 2 句应答后各休 1 小节。
|
||
|
||
### 4.3 曲目三《星爆》120 BPM
|
||
|
||
| 句 | 领奏节奏型 | 音符数 |
|
||
|---|---|---|
|
||
| 1 | `1:BC, 2:BL, 3:BC, 4:BL` | 4 |
|
||
| 2 | `1:TL, 2:BL, 3:TL, 4:BC` | 4 |
|
||
| 3 | `1:BR, 2:TR, 3:BR, 4:BL` | 4 |
|
||
| 4 | `1:BC, 2.5:TL, 3:BC, 4:BR` | 4 |
|
||
| 5 | `1:BL, 1.5:BR, 2.5:BL, 3:BC` | 4 |
|
||
| 6 | `1:BC, 2:TL, 2.5:BL, 3:BC, 4:TR` | 5 |
|
||
| 中途加花 | `1:TL, 1.5:TL, 2:BL, 2.5:BL, 3:BC, 3.5:BC, 4:TR` | 7 |
|
||
| 7 | `1:BR, 2:BC, 3:BL, 3.5:BR, 4:TL` | 5 |
|
||
| 8 | `1:BC, 1.5:BC, 2.5:BL, 3:BC, 3.5:TL, 4:TR` | 6 |
|
||
| 9 | `1:BL, 2:BC, 2.5:BR, 3:TL, 4:BL` | 5 |
|
||
| 10 | `1:BC, 2:BR, 3:BC, 3.5:TL, 4:BL` | 5 |
|
||
| 终曲加花 | `1:BC, 1.5:BL, 2:BC, 2.5:BL, 3:BC, 3.5:BC, 4:TR` | 7 |
|
||
|
||
全曲不休。
|
||
|
||
### 4.4 改谱规则
|
||
|
||
1. 曲目一 2→4 音、曲目二 2→4、曲目三 4→6;加花不计。
|
||
2. 反拍:曲目一只允许加花;曲目二第 5 句起普通句每句 ≤1;曲目三不限。
|
||
3. 同一分区连续 ≤2(两连合法,三连禁止)。
|
||
4. 乐句内分区种类 ≥2(仅曲目一句 1 允许纯底鼓)。
|
||
5. 相邻反拍禁止左列↔右列大跳(仅曲目三允许 BL↔BR)。
|
||
6. 加花尾音恒 TR。
|
||
7. **谱面不得要求「双击手势」**;只需连续 tap。
|
||
|
||
---
|
||
|
||
## 5. 判定与计分(数字保留)
|
||
|
||
```js
|
||
const PERFECT = 0.15;
|
||
const GOOD = 0.35;
|
||
const LOOKAHEAD = 0.6;
|
||
const PUMP_MS = 40;
|
||
```
|
||
|
||
- 判定时刻 = 触摸/数字键按下(immediateTap 零补偿)。
|
||
- 同分区最近未判定音符 \|dt\|≤GOOD → 出该区音;Perfect 叠 accent。
|
||
- 异分区音符 \|dt\|≤GOOD×0.5 被敲 = Miss(错鼓)。
|
||
- 窗外同区 = 自由演奏(出声不判定)。
|
||
- Miss 超时:expected+GOOD+0.10s → 闷镲(`dm_hat` 0.5×)+ `invalid` 回执 + 可选 error 震。**主反馈是声音。**
|
||
- 计分/评级/16 连击震/全 Perfect 震:数字沿用;震是补充。
|
||
|
||
退役:TAP_DELAY / SWIPE_DELAY / DOUBLE_DELAY、双击序曲撤销账簿、超时复活窗、滑动音符。
|
||
|
||
---
|
||
|
||
## 6. 教学(分区心智,保留四步)
|
||
|
||
零惩罚,单步重教 ≤2,第 2 次失败降速 25%,再败跳过。
|
||
|
||
| 步 | 内容 |
|
||
|---|---|
|
||
| T0 摸鼓 | 双轴模型一句 → 探索:敲哪区出哪音+区名。摸 ≥3 区进 T1;**8s 无触摸自动进 T1** |
|
||
| T1 家区 | 数拍 → 领奏 `1:BC` → 应答 |
|
||
| T2 左右下 | `1:BL, 3:BR` |
|
||
| T3 上排 | `1:TL, 2:TC, 3:TR` → `tut_done` → 曲目一 |
|
||
|
||
教学 Miss 归因真话。下滑跳过教学仅阶段 2 以后;新手回访者用开场「点一下开始」跳过。`tut_fill` 在曲目一终曲加花前 1 小节,每账号一次。
|
||
|
||
---
|
||
|
||
## 7. 反馈与语音配额(保留数字)
|
||
|
||
应答小节内零语音。教学失败至多 1 条纠正链。正片连 2 Miss 才 `gd_miss`,同曲一次。探索区名每区每轮一次。结算链 = grade + [new_best_combo] + [unlock] + restart。引擎 3s/5 次保险丝不得绕过。
|
||
|
||
---
|
||
|
||
## 8. 资产规格(保留)
|
||
|
||
打击乐 7 件程序合成,QC:去直流、8ms 淡化、真峰值 ≤−3 dBFS。BGM 三首 prompt 仍要求 **no drums no percussion**,90/105/120 BPM,A minor,`bpm_precise.py` 误差 >0.5 则 atempo。`bgm/menu` 保留。旧含鼓 track 删除。
|
||
|
||
---
|
||
|
||
## 9. 进度
|
||
|
||
key `soundgame.rhythm.progress`,schema 1:`tutorialDone, unlocked, grades, bestCombo, summary`(`《曲名》X级 · 已解锁N/3首`)。B 级解锁下一首。
|
||
|
||
结算:单击=同曲;右滑=下一首(未解锁播 `song_locked`;song3 右滑播 restart);阶段 2 下滑=菜单。
|
||
|
||
---
|
||
|
||
## 10. 断言清单(修订)
|
||
|
||
A1–A5、A7–A5、A8–A25 原编号保留,交互口径改:
|
||
|
||
- **A6**:新手期 300ms 内同区两 `tap` = 两次独立敲击(可认领两音),**不产生 `doubletap` 手势、无撤销账簿**。阶段 3 若引擎仍发 `doubletap`,游戏层当第二次 `tap`。
|
||
- **A10 菜单**:main 中阶段 2 后下滑呼菜单;**单击确认当前项,不是双击确认**;恢复后平移量 = 暂停 + count-in;`gd_count` 每曲 1 次。
|
||
- **A21**:演奏期单击是演奏;讲解期单击跳句,400ms 内再点=`busy`。
|
||
- 增补 **A26**:新手谱面/教程不依赖 `g==='doubletap'`。
|
||
- 增补 **A27**:演奏期 Floor=ACTION,无等待声;选曲 YOUR_TURN 有等待声或 menu pad。
|
||
- 增补 **A28**:无声操作 0;Miss 有闷镲或回执。
|
||
|
||
其余 A1 分区、A2 窗、A3 错鼓、A4 超时、A5 tapcancel、A9 数拍、A11 加花、A12–A16 评级进度、A17 配额、A18 键盘、A19 guide 签名、A20 资产、A22 全局、A23–A25 R1 修复:**保留**。
|
||
|
||
13 号旧 §4 手势模式断言不回改;鼓手验收以本节 + 13 号 §5 为准。
|
||
|
||
---
|
||
|
||
## 11. 预算台账(保留)
|
||
|
||
语音 49 id×2;打击乐 7 件;BGM 上限见原文工艺。开发零 API 费。
|
||
|
||
---
|
||
|
||
## 12. 废止清单
|
||
|
||
| 废止 | 改为 |
|
||
|---|---|
|
||
| 双击手势=一种音符;双击确认菜单 | 只有分区点按;菜单左右滑+单击 |
|
||
| 新手 `doubleTapWindow` 300ms | 0;两下两击 |
|
||
| 演奏期等待声 / 帮助插播 | ACTION;应答内零语音 |
|
||
| 暂停恢复无 count-in | 4 拍 count-in |
|
||
| Miss 只震 | 闷镲 + 回执 + 真话归因 |
|
||
| 帮助用上滑(与上排鼓冲突) | 非演奏期长按 |
|
||
| 开场长规则 | T0 先摸鼓 |
|
||
| 03 号手势乐器谱作为现行施工 | 以本文为准 |
|
||
|
||
引擎坐标第二参、分区布局、时值、曲目表、合成与 BGM 工艺:**全部保留**。
|