物量与判定机制
此页面为技术型隐藏页面 |
由于本页面全部内容采用自制谱面形式验证,特此考虑将本页面归入技术性隐藏页面。
物量计算机制
能够产生计入总物量的物件类型共有Tap、Hold、Arc、Arctap与Flick五种。物量计算的方式根据物件类型而决定。
物量计入总物量的前提条件是物件能够击打。因此,处于包含noinput参数的timinggroup中的物件不会计入总物量。特别地,对于类型为designant的Arc物件上的Arctap,虽然其有击打判定,但仍然不会计入总物量。
点击与滑键物量计算
Tap、Arctap与Flick分别占1个物量。
长键物量计算
能够产生物量的长键包含Hold类型物件与类型为false且没有悬挂Arctap的Arc类型物件。
长键的物量与判定点密度因数(TimingPointDensityFactor)、物件起始时间戳所处的timing区间的BPM以及长键自身的持续时间有关。
若长键持续时间为0(即起始时间戳与终止时间戳相同),则长键不会产生物量。
起始时间戳位于bpm为0的timing区间内的长键存在1物量;但是,若Arc类型物件的起始时间戳位于bpm为0的timing区间内,则游戏将无法渲染该物件,进而会导致游戏闪退。Hold类型物件则不会有此行为。
需要注意的是,bpm为0的timing区间与判定点密度因数(TimingPointDensityFactor)为0是不同的效果。后者的所有长键均保持1物量,且Arc类型物件也能够正常渲染。
(待详细分析)若判定点密度因数(TimingPointDensityFactor)小于0,则所有长键的物量为1,且判定点可能早于物件本身出现时间,导致在没有物件的地方出现LOST判定等异常现象。
BPM计算
对于其他情况,首先计算长键起始时间戳所处的实际BPM(bpm_real):
bpm_real = bpm * density
其中bpm为起始时间戳所处的timing区间的BPM,density为判定点密度因数(TimingPointDensityFactor)。
而后,计算计算用BPM(bpm_calc):
- 若bpm_real的绝对值大于等于255(|bpm_real| >= 255),则bpm_calc = |bpm_real| / 2;
- 否则,bpm_calc = |bpm_real|。
长键实际物量计算
首先计算长键持续拍数(ln_beats):
ln_beats = note_len * bpm_calc / 60000
其中note_len是长键的持续时间。
若ln_beats严格小于1.5,则长键物件有1物量;若ln_beats大于等于1.5,则物量(note_count)按如下方法计算:
note_count = [ln_beats * 2] - 1
其中方括号代表向下取整。
Arc物件的首尾连接追加物量
Arc物件除了物件本身的物量之外,还存在因为首尾接续而额外追加的物量。
对于两个Arc物件,如果他们满足如下条件,则这两个相邻的Arc物件是首尾连接的:
- 前一个Arc物件的终止x、y坐标与后一个Arc物件的起始x、y坐标完全一致;
- 前一个Arc物件的终止时间戳与后一个Arc物件的起始时间戳的时间差严格小于10。
Arc物件的首尾连接只与上述两个条件有关;无论这两个Arc物件是否同色、是否已经与其他Arc物件首尾连接、两个Arc物件之间是否存在额外的timing区间,都不会影响首尾连接状态。
对于首尾连接的两个Arc物件,如果后一个Arc物件的长键持续拍数大于等于1,则这个Arc物件会额外增加1个物量。
判定点时间计算机制
物件判定点时间计算的方式根据物件类型而决定。
点击与滑键判定点时间计算
Tap、Arctap与Flick的判定点时间与其时间戳相同。
长键基础判定点时间计算
下文在计算判定点时,会使用判定点基于长键起始时间戳的判定点相对拍数(judge_beat) 来表示。其与判定点时间戳(judge_time) 的关系为:
judge_beat = (judge_time - ln_start) / bpm_calc
其中ln_start为长键的起始时间戳。
长键的每个判定点时间由长键的持续拍数ln_beats决定:
- 当ln_beats < 0.5时,judge_beat = 0。
- 当0.5 <= ln_beats <= 1时,judge_beat = (ln_beats - 0.5) / 2。
- 当ln_beats > 1时,对于长键的第n个判定点,其相对拍数judge_beat_n = (n / 2) - 0.25。
Arc物件的首尾连接的判定点时间偏移
Arc首尾连接会导致前后Arc物件的判定点位置均发生变化:
- 对于后一个Arc物件:
- 若其ln_beats < 1,则其判定点移动至起始时间戳位置;
- 否则,在起始时间戳位置追加一个判定点。
- 对于前一个Arc物件:
- 若其ln_beats < 1,则不变;
- 对于其他情况:
- 计算最大的比ln_beats小的0.5的整数倍拍im_beats = [ln_beats * 2] / 2,其中方括号表示向下取整;
- 计算im_beats对应的时长im_len = im_beats * 60000 / bpm_calc;
- 如果note_len - im_len <= 1,则将最后一个判定点移动至倒数第二个判定点的位置;否则保持不变。
判定区间计算机制
点击与滑键判定区间计算
参见机制#判定。
长键判定区间计算
对于长键的每一个判定点,其判定结束时间取以下几个时间戳中的最小值:
- 判定点时间+0.25拍+500毫秒;
- 判定点时间+1拍;
- 若该判定点是Arc物件的最后一个判定点且该Arc物件与后一个Arc物件首尾连接,其后一个Arc物件的起始时间戳;
- 从本判定点向后数第二个判定点的时间戳。
需要注意的是,长键的判定区间有可能超过长键本身的持续时间。考虑到长键的判定机制为首尾之间的图形在判定区域内才可以判定,这一现象可能会导致判定点的实际判定区间窄于系统内对于判定点定义的判定区间。可以通过以下谱面验证判定区间可以宽于长键持续时间:
timing(0,150.00,4.00); arc(0,1,0.50,0.50,s,1.00,1.00,0,none,false); timing(1,0.00,4.00);