@@ -45,32 +45,15 @@ private void AddNote(Note note)
4545 _nowFalseEachIndex = note . FalseEachIdx ;
4646 }
4747
48- // T_JUDGE_HOLD 原理应该是游戏DLL中的Manager.NotesReader.getProgJudgeGrid。
48+ // T_JUDGE_HLD 原理应该是游戏DLL中的Manager.NotesReader.getProgJudgeGrid。
4949 // 但是具体的机制研究的也不是太明白,只是尽力实现了下
5050 if ( note is Hold or TouchHold )
5151 {
5252 var bpmRanges = note . BpmRanges ;
53- for ( int i = 0 ; i < bpmRanges . Count ; i ++ )
53+ foreach ( var ( _ , bpm , _ , len ) in bpmRanges )
5454 {
55- var ( _, bpm , start , len ) = bpmRanges [ i ] ;
5655 var gridSize = new Rational ( getProgJudgeGrid ( bpm ) , 384 ) ;
57- T_JUDGE_HLD += ( int ) ( len / gridSize ) . Ceil ( ) ;
58- continue ;
59- // TODO 当前版本的实现还有一定问题,还有一部分测试(Statistics测试.cs的SkippedKeys注释掉之后)过不了,差个位数数字
60- // 具体什么原因后续还需要调研一下
61-
62- // 数:当前音符落在当前BPM区间内,所跨过的整数格点的个数
63- var startPointF = start / gridSize ;
64- var startPoint = ( int ) startPointF . Ceil ( ) ;
65- // if (startPointF.FractionPart == 0) startPoint++;
66- var endPointF = ( start + len ) / gridSize ;
67- var endPoint = ( int ) endPointF . WholePart ; // 相当于Floor
68- if ( endPointF . FractionPart == 0 ) endPoint -- ;
69- var gridCount = endPoint - startPoint + 1 ;
70- T_JUDGE_HLD += gridCount ;
71-
72- // 如果:整个hold的头,不是落在整数格点上。则还要加一个单独的头判
73- if ( i == 0 && startPointF . FractionPart != 0 ) T_JUDGE_HLD ++ ;
56+ T_JUDGE_HLD += Math . Max ( ( int ) ( len / gridSize ) . Ceil ( ) , 1 ) ;
7457 }
7558 }
7659 }
0 commit comments