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

12 KiB
Raw Blame History

03 · 《节拍行者》跟随领奏模式(26 号对齐)

给开发者的实现要点摘要

  1. 现行施工依据是 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(不在本次改写范围);须停用「双击是军鼓」教学句,直至双击解锁后再启用。

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. 玩法与判定契约(数字保留)

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. 进度

{
  "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 号鼓手模式为准;本文仅手势变体/档案

震动连击里程碑可保留为补充;主通道永远是声音。