save
This commit is contained in:
+185
-111
@@ -1,68 +1,145 @@
|
||||
# 03 · 《节拍行者》重构施工稿(rhythm rebuild,R3 施工依据)
|
||||
# 03 · 《节拍行者》跟随领奏模式(26 号对齐)
|
||||
|
||||
> **给开发者的实现要点摘要**
|
||||
> 1. 玩法 = **跟随领奏(call & response)**:系统奏 1 小节节奏型(2-4 个手势乐器音),玩家在下一小节的相同拍点用相同手势跟打。3 首曲目(90/105/120 BPM)解锁制。完整谱面见 §3(每首前 8 句全部写出,后续句按 §3.5 规则生成)。
|
||||
> 2. 判定沿用现版常量:PERFECT ±0.12s / GOOD ±0.25s / TAP_DELAY 0.30s 补偿 / LOOKAHEAD 0.6s / 调度泵 40ms;tap 只允许出现在第 1、3 拍(强拍)。
|
||||
> 3. 判定反馈全改震动(`engine/haptics.js`):出手震动引擎 gesture.js 已内置(swipe/confirm),游戏层只加 Miss=`error`、16 连击=`success`、乐句全 Perfect=自定义 [20,40,20];领奏音符锚点自定义 BEAT=[8]。`judge_*` 提示音删除。
|
||||
> 4. 语音台词全表在 **[03-rhythm-voice-ids.md](03-rhythm-voice-ids.md)**(音频总监照录):旁白 female=Vivian / male=Uncle_Fu(R1 音色分配表),准确率分档整句播报。
|
||||
> 5. 进度 data:`{ summary, unlocked, grades, bestCombo }`(§7),大厅卡片显示 summary。
|
||||
> 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)(不在本次改写范围);须停用「双击是军鼓」教学句,直至双击解锁后再启用。
|
||||
|
||||
---
|
||||
|
||||
## 1. 现版问题与重构方向(结论,不再展开)
|
||||
## 0. 设计单(26 号附录 C)
|
||||
|
||||
现版"听令行动"(指令音→下一拍做手势)认知负荷四层(认音色→忆映射→换算拍点→精确出手),且 judge 提示音制造"考试感"。重构为跟随领奏:记忆负荷压到 ≤4 音短句,负荷转移到节奏精度;玩家动作触发与 BGM 同调性的**乐器音**,做对时听到自己在演奏。现版的 AudioContext 预排程泵(`_pump`/`_scheduleSfx`/tap 补偿)工程质量好,**保留复用**,只重写谱面与判定逻辑。
|
||||
### 0.1 一句话核心动作
|
||||
|
||||
## 2. 常量与判定(施工契约,直接抄)
|
||||
**我奏一句,你在下一小节同一拍点用同一手势跟打。**
|
||||
|
||||
### 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; // Perfect 窗口 ±120ms
|
||||
const GOOD = 0.25; // Good 窗口 ±250ms(蓝牙延迟由它吸收)
|
||||
const TAP_DELAY = 0.30; // 引擎 tap 回调延迟补偿(沿用现版)
|
||||
const LOOKAHEAD = 0.6; // 调度前瞻(秒)
|
||||
const PUMP_MS = 40; // 调度泵周期
|
||||
const PERFECT = 0.12;
|
||||
const GOOD = 0.25;
|
||||
const TAP_DELAY = 0.30; // 仅非 immediateTap 通道;演奏期优先 immediateTap,单击零补偿
|
||||
const LOOKAHEAD = 0.6;
|
||||
const PUMP_MS = 40;
|
||||
```
|
||||
|
||||
- **tap 补偿**:判定时 `if (g === 'tap') t -= TAP_DELAY`;tap 音符的 Miss 超时检查放宽 `TAP_DELAY + 0.08`,其他手势放宽 `0.05`(现版 game.js:159-164 原样保留)。
|
||||
- **tap 位置约束**:谱面中 tap 只允许落在第 1、3 拍(强拍),给补偿留足余量;doubletap 不落在 x.5 反拍(曲目三之前)。
|
||||
- 判定结果:
|
||||
- 手势对 + |dt|≤0.12 → Perfect:玩家手势乐器音 + accent 亮音层叠加。
|
||||
- 手势对 + |dt|≤0.25 → Good:只播乐器音。
|
||||
- |dt|>0.25 或手势错 → Miss:**不播乐器音**(错过=没出声,本身就是反馈)+ `vibrate('error')`。
|
||||
- 手势对但窗口内找错音符归属:按现版"最近未判定音符"归属逻辑(game.js:278-293)保留。
|
||||
- 计分:Perfect=2 / Good=1 / Miss=0;`rate = 得分 / (2 × 总音符数)`;评级 S≥0.95 / A≥0.85 / B≥0.70 / C<0.70。不掉血、不中断,歌照唱完。
|
||||
- 连击:每 16 连击 `vibrate('success')`(不打断演奏,不播报);乐句全部 Perfect 时乐句末 `vibrate([20,40,20])`。
|
||||
- 手势对 + \|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。**
|
||||
|
||||
## 3. 谱面
|
||||
工程质量:AudioContext 预排程泵、BGM `src.start(t0)` 对网格 **保留**。
|
||||
|
||||
### 3.1 记号与结构
|
||||
---
|
||||
|
||||
- 拍点记号:`拍号:手势`,1 小节 = 4 拍(1, 2, 3, 4),`x.5` = 八分音符反拍。
|
||||
- 手势:`tap`(T) `doubletap`(D) `left`(L) `right`(R) `up`(U) `down`(N)。
|
||||
- 每个乐句 = **领奏 1 小节 + 应答 1 小节**(应答拍点 = 领奏拍点 + 4 拍)。
|
||||
- 曲目流程:`数拍 1 小节(BGM 内鼓点,无独立节拍器)→ 逐乐句 → 结算`。
|
||||
- 乐句间休止:曲目一前 4 句应答后各休 1 小节;曲目二前 2 句各休 1 小节;曲目三不休。
|
||||
## 2. 谱面(新手无双击)
|
||||
|
||||
### 3.2 曲目一《启程》90 BPM(SPB=0.667s,10 句,≈70s)
|
||||
记号:`拍号:手势`。乐句 = 领奏 1 小节 + 应答 1 小节。流程:数拍 1 小节 → 逐乐句 → 结算。
|
||||
|
||||
定位:教学曲。全强拍,2→4 音,无反拍。
|
||||
### 2.1 曲目一《启程》90 BPM(教学曲,无双击、无反拍)
|
||||
|
||||
| 句 | 领奏节奏型 | 音符数 |
|
||||
|---|---|---|
|
||||
| 1 | `1:tap, 3:tap` | 2 |
|
||||
| 2 | `1:left, 3:right` | 2 |
|
||||
| 3 | `1:tap, 2:doubletap, 3:tap` | 3 |
|
||||
| 4 | `1:left, 2:doubletap, 3:right` | 3 |
|
||||
| 5 | `1:tap, 3:left, 4:doubletap` | 3 |
|
||||
| 6 | `1:right, 3:tap, 4:doubletap` | 3 |
|
||||
| 7 | `1:up, 3:down, 4:doubletap` | 3 |
|
||||
| 8 | `1:tap, 2:up, 3:right, 4:doubletap` | 4 |
|
||||
| 9 | `1:left, 2:right, 3:tap, 4:doubletap` | 4 |
|
||||
| 10 | `1:tap, 2:doubletap, 3:tap, 4:doubletap` | 4(终句,全鼓组收束) |
|
||||
| 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 |
|
||||
|
||||
### 3.3 曲目二《追风》105 BPM(SPB=0.571s,12 句,≈75s)
|
||||
休止:前 4 句应答后各休 1 小节。
|
||||
|
||||
定位:引入反拍(第 5 句起)与 4 音密集句。
|
||||
### 2.2 曲目二《追风》105 BPM(SPB=0.571s,12 句)
|
||||
|
||||
未解锁双击时:表中 `doubletap` 改写为已解锁手势(优先整拍 `up`/`down`,或 1/3 拍 `tap`)。已解锁则按表演奏。反拍从第 5 句起,每句至多 1 个。
|
||||
|
||||
| 句 | 领奏节奏型 | 音符数 |
|
||||
|---|---|---|
|
||||
@@ -70,18 +147,20 @@ const PUMP_MS = 40; // 调度泵周期
|
||||
| 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(首个反拍 2.5) |
|
||||
| 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(终句) |
|
||||
| 12 | `1:left, 1.5:right, 2:doubletap, 3:tap, 4:doubletap` | 5 |
|
||||
|
||||
### 3.4 曲目三《星爆》120 BPM(SPB=0.5s,12 句,≈70s)
|
||||
前 2 句应答后各休 1 小节。
|
||||
|
||||
定位:4-6 音密集句、切分、doubletap 上反拍。不设十六分音符(盲玩极限)。
|
||||
### 2.3 曲目三《星爆》120 BPM(SPB=0.5s,12 句)
|
||||
|
||||
双击可落反拍,**仅双击已入池**。未入池不得进入曲目三,或进曲前先做军鼓解锁课。
|
||||
|
||||
| 句 | 领奏节奏型 | 音符数 |
|
||||
|---|---|---|
|
||||
@@ -92,76 +171,65 @@ const PUMP_MS = 40; // 调度泵周期
|
||||
| 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(高潮句) |
|
||||
| 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(终句) |
|
||||
| 12 | `1:tap, 2:doubletap, 2.5:left, 3:tap, 3.5:right, 4:doubletap` | 6 |
|
||||
|
||||
### 3.5 难度曲线规则(谱面设计约束,续作/改谱遵守)
|
||||
全曲不休。
|
||||
|
||||
1. 乐句长度:曲目一 2→4 音,曲目二 2→5 音,曲目三 4→6 音;同曲内单调不减(终句允许 +1 爆发)。
|
||||
2. 反拍(x.5)引入:曲目一禁用;曲目二第 5 句起、每句至多 1 个反拍音;曲目三不限。
|
||||
3. tap 只落 1/3 拍(全曲目铁律);doubletap 曲目一/二只落整拍,曲目三可落反拍。
|
||||
4. 同一手势连续出现 ≤2 次(跨音符);同一乐句内手势种类 ≥2(第 1、10 句的全鼓句除外)。
|
||||
5. up/down 作为"音高对"尽量成对出现在同一乐句(↑↓ 或 ↓↑),利于听觉记忆。
|
||||
6. 左右声道手势不放在相邻反拍连续位(如 `1:left, 1.5:right` 只允许曲目三)——声像跳变过快在耳机上易混。
|
||||
### 2.4 改谱约束
|
||||
|
||||
## 4. 手势 → 乐器音映射(sfx 资产)
|
||||
1. 曲目一禁止反拍、禁止双击。
|
||||
2. tap 只落 1/3 拍。
|
||||
3. 同一手势连击 ≤2;乐句内手势种类 ≥2(全鼓收束句除外)。
|
||||
4. up/down 尽量成对。
|
||||
5. 左右不放在相邻反拍(仅曲目三允许 `1:left, 1.5:right`)。
|
||||
|
||||
| 手势 | 乐器音 | sfx id | 声像/音高 |
|
||||
---
|
||||
|
||||
## 3. 手势 → 乐器(资产保留)
|
||||
|
||||
| 手势 | 乐器 | sfx | 何时入池 |
|
||||
|---|---|---|---|
|
||||
| tap | 底鼓 kick | `sfx/inst_kick` | 中央,低频 |
|
||||
| doubletap | 军鼓 snare | `sfx/inst_snare` | 中央偏上 |
|
||||
| left | 闭合镲 closed hat | `sfx/inst_hat_l` | 极左 |
|
||||
| right | 开放镲 open hat | `sfx/inst_hat_r` | 极右 |
|
||||
| up | 高通 tom | `sfx/inst_tom_hi` | 中央,升调感 |
|
||||
| down | 低通 tom | `sfx/inst_tom_lo` | 中央,降调感 |
|
||||
| (叠加层) | Perfect accent 亮音 | `sfx/accent` | 共用 1 个,叠在乐器音上 |
|
||||
| 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` | — |
|
||||
|
||||
全部与 BGM 同调性(曲目一/二/三 BGM 根音需在 Mureka prompt 里统一,建议 A minor)。乐器音时长 ≤0.4s,起音要硬(盲玩靠起音对拍)。生成方式:Stable Audio 3(打击乐短采样质量足够)或程序合成兜底;accent 可用程序合成(高频短琶音)。
|
||||
---
|
||||
|
||||
## 5. 流程与教学(30 秒上手)
|
||||
|
||||
### 5.1 状态机
|
||||
## 4. 流程与教学
|
||||
|
||||
```
|
||||
idle → intro(语音) → tut(3 步教学) → select(选曲,二周目起) → countin → main(逐乐句) → end(结算)
|
||||
↑_________________|
|
||||
idle → intro → tut → select(二周目)→ countin → main → end
|
||||
```
|
||||
|
||||
- `select`:左右滑切曲目(播曲目名 + 已解锁状态),单击进入,下滑回大厅。未解锁曲目播报"上一首拿到 B 级以上解锁"。
|
||||
- 教学只在首次进游戏出现(`progress.data.tutorialDone`);之后 intro 缩减为一句"跟着音乐,我奏一句,你跟一句。"
|
||||
教学 3 步,一次一击,**T3 不再含双击**:
|
||||
|
||||
### 5.2 教学 3 步(台词见 voice-ids 文档 T 组)
|
||||
|
||||
| 步 | 内容 | 机制 |
|
||||
| 步 | 领奏 | 机制 |
|
||||
|---|---|---|
|
||||
| T1 | 领奏 `1:tap`(第 1 拍单底鼓)→ 玩家在第 2 小节同位置跟打 | 做错:error 震动 + 纠正语音(早了/晚了/不是这个手势,按 dt 与手势选句)→ 重播领奏重试;2 次失败跳过进 T2 |
|
||||
| T2 | 领奏 `1:left, 3:right` → 跟打 | 同上 |
|
||||
| T3 | 领奏 `1:tap, 2:doubletap, 3:tap` → 跟打 | 通过后进曲目一 |
|
||||
| T1 | `1:tap` | 做错:归因 + 重来;2 败降速;3 败演示通过 |
|
||||
| T2 | `1:left, 3:right` | 同上 |
|
||||
| T3 | `1:tap, 2:up, 3:tap` | 通过后进曲目一 |
|
||||
|
||||
纠正判定复用正式判定窗口,只是不计分。教学期间 BGM 已在播(从 intro 第 6 秒起),数拍感来自 BGM 本身。
|
||||
`tutorialDone` 后 intro 缩为一句「我奏一句,你跟一句。」点一下开始。
|
||||
|
||||
## 6. 震动与语音在流程中的落点
|
||||
选曲:左右滑切曲,单击进入。未解锁:「上一首拿到 B 级以上解锁。」
|
||||
|
||||
| 时机 | 震动 | 语音 |
|
||||
|---|---|---|
|
||||
| 领奏每个音符 | [8](BEAT,自定义) | — |
|
||||
| 玩家出手 | (引擎内置 swipe/confirm,游戏层不重复) | 乐器音 |
|
||||
| Miss | error | — |
|
||||
| 16 连击 | success | — |
|
||||
| 乐句全 Perfect | [20,40,20] | — |
|
||||
| 曲目过半 | — | `mid_song`("过半了,保持。") |
|
||||
| 结算 | success(S/A)/ 无(B/C) | `grade_*` + `restart_hint` |
|
||||
| 解锁新曲 | success + [20,40,20] | `unlock_song2/3` |
|
||||
结算:单击=同曲再来;右滑=下一首;阶段 2 下滑=菜单(左右滑+单击确认)。
|
||||
|
||||
## 7. 进度存储
|
||||
---
|
||||
|
||||
## 5. 进度
|
||||
|
||||
```json
|
||||
{
|
||||
"schema": 1,
|
||||
"updatedAt": "2026-08-29T12:00:00Z",
|
||||
"summary": "《追风》B级 · 已解锁2/3首",
|
||||
"tutorialDone": true,
|
||||
"unlocked": 2,
|
||||
@@ -170,25 +238,31 @@ idle → intro(语音) → tut(3 步教学) → select(选曲,二周目起)
|
||||
}
|
||||
```
|
||||
|
||||
- 评级提升(如 b→a)、解锁变化、bestCombo 刷新时在结算后 PUT;`summary` 格式:`《曲名》X级 · 已解锁N/3首`(取最高评级的曲目)。
|
||||
- 解锁规则:曲目 n 拿到 B 级以上 → 解锁 n+1。
|
||||
|
||||
## 8. 实现要点(给开发 agent)
|
||||
|
||||
1. 保留现版:`AudioContext.currentTime` 预排程、40ms 泵、LOOKAHEAD、`TAP_DELAY` 补偿与 Miss 放宽(现 game.js:26-30, 149-176, 267-293)、BGM 手动 `src.start(t0)` 对网格(game.js:221-239)。
|
||||
2. 重写:谱面数据从 40 指令流改为 `phrases: [{ notes: [{ beat, gesture }] }]`(本文 §3 表格直接转 JSON);调度时领奏音符排第 k 小节、应答 `_cues` 期望时刻 = 领奏时刻 + 4 拍;间奏休止按曲目参数插入空小节。
|
||||
3. 玩家乐器音不走预排程:出手即播(sfx 即发即弃),Perfect 时叠播 `sfx/accent`。
|
||||
4. BGM:3 首重生成(Mureka,90/105/120 BPM 精确、鼓组清晰、A minor、60-90s 无缝循环,沿用现版 groove 归一化工艺);现版 `bgm/groove` 弃用。数拍融入 BGM,删独立 tick 节拍器。
|
||||
5. 震动接 `engine/haptics.js`;BEAT 用自定义数组 `vibrate([8])`,领奏音符在调度时同步排一个 `setTimeout` 对齐(或用 pump 在音符时刻触发,误差 <40ms 可接受)。
|
||||
6. 语音全表见 03-rhythm-voice-ids.md;现版 `voice/welcome/rules/tut_start/tut_done` 弃用,`grade_*`/`restart` id 沿用但文案变更(重录)。
|
||||
7. 结算画面:单击=再来一遍(同曲),右滑=下一首(若已解锁),下滑=回大厅。
|
||||
8. 更新 `web/rhythm/README.md`(玩法、手势表、进度结构)。
|
||||
曲目 n 拿到 B → 解锁 n+1。
|
||||
|
||||
---
|
||||
|
||||
> **取代指针(2026-09-14,24 号裁定)**:本文档(及 03-rhythm-voice-ids.md)的
|
||||
> 施工依据地位已被 [24-rhythm-drummer.md](24-rhythm-drummer.md) +
|
||||
> [24-rhythm-voice-ids.md](24-rhythm-voice-ids.md) 取代——《节拍行者》重构为
|
||||
> 屏幕分区鼓手模式(6 区打击乐 + 无鼓伴奏,跟随领奏核心/评级/解锁/BPM 精确性
|
||||
> 延续)。本文仅作历史档案保留,正文一字不改;13 号文档 §4 rhythm 断言段
|
||||
> 同理冻结,新断言见 24 号文档 §11。
|
||||
## 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 号鼓手模式为准**;本文仅手势变体/档案 |
|
||||
|
||||
震动连击里程碑可保留为补充;主通道永远是声音。
|
||||
|
||||
Reference in New Issue
Block a user