User:ALFalpha/chartdata

来自Rotaeno中文维基
< User:ALFalpha
ALFalpha讨论 | 贡献2024年8月14日 (三) 20:54的版本 (to be continued...)


警告:Rotaeno中一切资源,包括图像、音源、代码等,
版权均为心动网络所有,擅自修改、传播,后果自负!
本页面严禁链入及引用!

本页面是对Rotaeno谱面格式的简要介绍。

总论

谱面文件存放于(Android apk)/assets/bin/Data/data.unity3d中。事实上,除了曲绘、音频文件外,绝大多数的小文件都在这里。

用AssetStudio等软件可提取出具体的谱面文件。它们名为 <曲目id> [难度] (如:after_rain [IV]),类型为MonoBehaviour,如果事先提取了游戏的dll文件则可以解析出详细数据。但就算不解析也能阅读出占文件大小90%+的加密字符串

"EncryptedV2ChartString": "cgjn/3jVl840+fB7..."

此时得到的谱面是用AES加密的base64字符串。采用适当的密钥解密,可以得到可供人类阅读的谱面:

# Version 2

# BPM
...

# Speed
...

# Note
...

解析

虽说是人类可读的谱面,但其中没有包含任何的额外信息,想要阅读靠文字脑补谱面还是有一定难度。

谱面以行为界,每行只有用逗号分隔的参数。下面详细说明它们的作用:

BPM

这部分每行只有两个参数:时间点(单位ms)和BPM大小,表示“歌曲进行到该时间点时,谱面BPM变为该值”。

大部分没有变速的谱面,这部分只有时间原点对应的一行:

例:After Rain 难度IV
# BPM
0,160

少数谱面的时间起点不是0,这可能是由音频延迟引起的:

例:The Formula 难度IV
# BPM
50,144

至于有些谱面……

例:Rush E 难度IV
# BPM
0,130
1846,30
5846,35
7560,46
8864,56
9935,67
10831,78
11600,89
12274,68
13156,115
...(总共108行)

流速

这部分每行三个参数:时间点,流速,是否渐变。这里流速不影响时间;谱面中所有的时间都是歌曲实际进行的时间。

在这部分最早的时间点(如果有)之前,流速默认为1。这里的流速乘上用户设置的流速,就是谱面实际的播放速度。

可以通过流速乘上对应的持续时间计算出谱面时间,这是物件出现的位置。

流速可以为0或者负数,Inverted World 难度IV 开幕的黑线表演就是这样实现的:

例:Inverted World 难度IV
# Speed
0,1,1
1000,0.2,1
1667,0.2,1
2000,1,1
2646,6,1
2667,10000,0
2669,-8,0
3333,-0.3,1
4333,-0.3,1
4667,-1,1
5312,-8,1
5333,10000,0
5335,-8,0
6000,-1,1
6333,-0.1,1
7000,-0.1,0
7333,-1,1
7979,-8,1
8000,400,0
8002,-8,0
8667,-0.5,1
9167,0,1
10333,1,1
...

物件

这部分每行至少有两个参数:物件类型和时间点。根据物件类型的不同,还会有一些额外参数。

TAP

0,1500,90

Tap对应物件类型0,第三个参数为角度。这里的角度是按时钟样式计算的:0度为正上方,90度为水平右手方,270度为水平左手方。

FLICK

1,3175,60

Flick对应物件类型1,第三个参数同样为角度。

SLIDE

2,135050,120,3,0,4,16,0,0

Slide对应物件类型2。这里参数很多,我们命名后逐一介绍:

noteType, time, degree, slideHeadType, sildeEndDegree, slideSnap, slideCount, prevCurvature, nextCurvature