// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; using osu.Game.Rulesets.Taiko.Difficulty.Preprocessing.Rhythm.Data; using osu.Game.Rulesets.Taiko.Difficulty.Utils; namespace osu.Game.Rulesets.Taiko.Difficulty.Preprocessing.Rhythm { public static class TaikoRhythmDifficultyPreprocessor { public static void ProcessAndAssign(List hitObjects) { var rhythmGroups = createSameRhythmGroupedHitObjects(hitObjects); foreach (var rhythmGroup in rhythmGroups) { foreach (var hitObject in rhythmGroup.HitObjects) hitObject.RhythmData.SameRhythmGroupedHitObjects = rhythmGroup; } var patternGroups = createSamePatternGroupedHitObjects(rhythmGroups); foreach (var patternGroup in patternGroups) { foreach (var hitObject in patternGroup.AllHitObjects) hitObject.RhythmData.SamePatternsGroupedHitObjects = patternGroup; } } private static List createSameRhythmGroupedHitObjects(List hitObjects) { var rhythmGroups = new List(); var groups = IntervalGroupingUtils.GroupByInterval(hitObjects); foreach (var group in groups) { var previous = rhythmGroups.Count > 0 ? rhythmGroups[^1] : null; rhythmGroups.Add(new SameRhythmHitObjectGrouping(previous, group)); } return rhythmGroups; } private static List createSamePatternGroupedHitObjects(List rhythmGroups) { var patternGroups = new List(); var groups = IntervalGroupingUtils.GroupByInterval(rhythmGroups); foreach (var group in groups) { var previous = patternGroups.Count > 0 ? patternGroups[^1] : null; patternGroups.Add(new SamePatternsGroupedHitObjects(previous, group)); } return patternGroups; } } }