物量與判定機制
此頁面為技術型隱藏頁面 |
- 由於本頁面全部內容採用自製譜面形式驗證,特此將本頁面歸入技術性隱藏頁面。
- 本頁面將保持孤立狀態,嚴禁鏈入/引用。
物量計算機制
能夠產生計入總物量的物件類型共有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計算
對於其他情況,首先根據起始時間戳所處的timing區間的BPM(bpm)計算長鍵起始時間戳所處的實際BPM(bpm_real):
- 若bpm的絕對值大於等於256(|bpm| >= 256),則 bpm_real = |bpm| / 2;
- 否則,bpm_real = |bpm|。
而後,計算計算用BPM(bpm_calc):
bpm_calc = bpm_real * density
其中density為判定點密度因數(TimingPointDensityFactor)。
長鍵實際物量計算
首先計算長鍵持續拍數(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);