Skip to content

Commit 98df2d6

Browse files
committed
[+] T_JUDGE_HLD能够正确计算了!
1 parent 2e5257f commit 98df2d6

3 files changed

Lines changed: 6 additions & 25 deletions

File tree

chart/Note.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,15 @@ protected Note(Chart chart, Rational time)
4949
List<(int, decimal, Rational, Rational)> result = [];
5050
var now = Time.CanonicalForm;
5151
var end = (Time + Duration.Bar).CanonicalForm;
52-
while (now < end)
52+
var isFirstRange = true; // 通过这个变量和对应的逻辑,确保返回的BpmRanges至少含有一个元素。即使note本身是0长度的,返回的BpmRanges也能有一个len=0的元素。
53+
while (now < end || isFirstRange)
5354
{
5455
var bpmIdx = Chart.BpmList.FindIndex(now);
5556
var curBpmRangeEnd = bpmIdx < Chart.BpmList.Count - 1 ? Chart.BpmList[bpmIdx + 1].Time : 999999; // 当前BPM区间的结束时刻
5657
var len = Utils.Min(end, curBpmRangeEnd) - now; // 音符落在本区间内的长度为,从当前时刻开始,到(本区间结束或音符结束的较早者)
5758
result.Add((bpmIdx, Chart.BpmList[bpmIdx].Bpm, now, len.CanonicalForm));
5859
now = (now + len).CanonicalForm;
60+
isFirstRange = false;
5961
}
6062
return result;
6163
}

chart/Statistics.cs

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

tests/Statistics测试.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,10 @@ public static IEnumerable<object[]> OfficialLevel5()
3333
}
3434
}
3535

36-
private static List<string> T_JUDGE_HLD不准确所以不测 = ["系ぎて", "PANDORA PARADOXXX", "Xaleid◆scopiX", "Ref:rain (for 7th Heaven)", "Grievous Lady"];
37-
3836
[SkippableTheory]
3937
[MemberData(nameof(OfficialLevel5))]
4038
public void 统计段与原版一致(TestInput input)
4139
{
42-
Skip.If(T_JUDGE_HLD不准确所以不测.Any(x=> Path.GetFileName(input.Dir).StartsWith(x)), "T_JUDGE_HLD的实现现在还不完全准确,在这些样例上会爆掉,所以暂时不测这些样例。");
43-
4440
var ma2Original = File.ReadAllText(input.MA2, Encoding.UTF8);
4541
var (chart, parseAlerts) = new MA2Parser().Parse(ma2Original);
4642
Assert.Empty(parseAlerts);

0 commit comments

Comments
 (0)