1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 04:07:25 +08:00

Collect and sort points from nested objects before extracting

This commit is contained in:
Bartłomiej Dach 2021-09-16 18:04:26 +02:00
parent 8026968939
commit 76ccdd1340
No known key found for this signature in database
GPG Key ID: BCECCD4FA41F6497

View File

@ -182,11 +182,8 @@ namespace osu.Game.Beatmaps.Formats
bool isOsuRuleset = beatmap.BeatmapInfo.RulesetID == 0; bool isOsuRuleset = beatmap.BeatmapInfo.RulesetID == 0;
// iterate over hitobjects and pull out all required sample and difficulty changes // iterate over hitobjects and pull out all required sample and difficulty changes
foreach (var h in beatmap.HitObjects) extractDifficultyControlPoints(beatmap.HitObjects);
{ extractSampleControlPoints(beatmap.HitObjects);
extractDifficultyControlPoints(h);
extractSampleControlPoints(h);
}
// handle scroll speed, which is stored as "slider velocity" in legacy formats. // handle scroll speed, which is stored as "slider velocity" in legacy formats.
// this is relevant for scrolling ruleset beatmaps. // this is relevant for scrolling ruleset beatmaps.
@ -239,36 +236,52 @@ namespace osu.Game.Beatmaps.Formats
writer.WriteLine(); writer.WriteLine();
} }
void extractDifficultyControlPoints(HitObject hitObject) IEnumerable<DifficultyControlPoint> collectDifficultyControlPoints(IEnumerable<HitObject> hitObjects)
{ {
if (!isOsuRuleset) if (!isOsuRuleset)
return; yield break;
var hDifficultyPoint = hitObject.DifficultyControlPoint; foreach (var hitObject in hitObjects)
if (!hDifficultyPoint.IsRedundant(lastRelevantDifficultyPoint))
{ {
legacyControlPoints.Add(hDifficultyPoint.Time, hDifficultyPoint); yield return hitObject.DifficultyControlPoint;
lastRelevantDifficultyPoint = hDifficultyPoint;
}
foreach (var nested in hitObject.NestedHitObjects) foreach (var nested in collectDifficultyControlPoints(hitObject.NestedHitObjects))
extractDifficultyControlPoints(nested); yield return nested;
}
} }
void extractSampleControlPoints(HitObject hitObject) void extractDifficultyControlPoints(IEnumerable<HitObject> hitObjects)
{ {
// process nested objects first as these use EndTime for legacy storage. foreach (var hDifficultyPoint in collectDifficultyControlPoints(hitObjects).OrderBy(dp => dp.Time))
foreach (var nested in hitObject.NestedHitObjects)
extractSampleControlPoints(nested);
var hSamplePoint = hitObject.SampleControlPoint;
if (!hSamplePoint.IsRedundant(lastRelevantSamplePoint))
{ {
legacyControlPoints.Add(hSamplePoint.Time, hSamplePoint); if (!hDifficultyPoint.IsRedundant(lastRelevantDifficultyPoint))
lastRelevantSamplePoint = hSamplePoint; {
legacyControlPoints.Add(hDifficultyPoint.Time, hDifficultyPoint);
lastRelevantDifficultyPoint = hDifficultyPoint;
}
}
}
IEnumerable<SampleControlPoint> collectSampleControlPoints(IEnumerable<HitObject> hitObjects)
{
foreach (var hitObject in hitObjects)
{
yield return hitObject.SampleControlPoint;
foreach (var nested in collectSampleControlPoints(hitObject.NestedHitObjects))
yield return nested;
}
}
void extractSampleControlPoints(IEnumerable<HitObject> hitObject)
{
foreach (var hSamplePoint in collectSampleControlPoints(hitObject).OrderBy(sp => sp.Time))
{
if (!hSamplePoint.IsRedundant(lastRelevantSamplePoint))
{
legacyControlPoints.Add(hSamplePoint.Time, hSamplePoint);
lastRelevantSamplePoint = hSamplePoint;
}
} }
} }
} }