# 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 号鼓手模式为准**;本文仅手势变体/档案 | 震动连击里程碑可保留为补充;主通道永远是声音。