diff --git a/osu.Game.Rulesets.Sentakki/Beatmaps/SentakkiBeatmapProcessor.cs b/osu.Game.Rulesets.Sentakki/Beatmaps/SentakkiBeatmapProcessor.cs index 39499a371..36a250a21 100644 --- a/osu.Game.Rulesets.Sentakki/Beatmaps/SentakkiBeatmapProcessor.cs +++ b/osu.Game.Rulesets.Sentakki/Beatmaps/SentakkiBeatmapProcessor.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using osu.Game.Beatmaps; +using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Sentakki.Objects; using osuTK.Graphics; @@ -20,14 +21,12 @@ public override void PostProcess() Color4 twinColor = Color4.Gold; Color4 breakColor = Color4.OrangeRed; - var hitObjectGroups = Beatmap.HitObjects.GroupBy(h => h.StartTime).ToList(); + var hitObjectGroups = getColorableHitObject(Beatmap.HitObjects).GroupBy(h => new { isSlide = h is SlideBody, time = h.StartTime + (h is SlideBody s ? s.ShootDelay : 0) }); foreach (var group in hitObjectGroups) { bool isTwin = group.Count() > 1; // This determines whether the twin colour should be used - List slideBodiesInGroup = new List(); - foreach (SentakkiHitObject hitObject in group) { Color4 noteColor = hitObject.DefaultNoteColour; @@ -37,27 +36,33 @@ public override void PostProcess() else if (isTwin) noteColor = twinColor; - // SlideTaps follow the typical coloring rules, while SlideBodies follow a different set of rules - if (hitObject is Slide slide) - { - slide.SlideTap.NoteColour = noteColor; - slideBodiesInGroup.AddRange(slide.SlideBodies); - } - else - hitObject.NoteColour = noteColor; + hitObject.NoteColour = noteColor; } + } + } - // Colour Slide bodies separately - foreach (var slideBody in slideBodiesInGroup) - { - if (slideBody.Break) - slideBody.NoteColour = breakColor; - else if (slideBodiesInGroup.Count > 1) - slideBody.NoteColour = twinColor; - else - slideBody.NoteColour = slideBody.DefaultNoteColour; - } + private IEnumerable getColorableHitObject(IReadOnlyList hitObjects) + { + foreach (var hitObject in hitObjects) + { + if (canBeColored(hitObject)) yield return hitObject; + + foreach (var nested in getColorableHitObject(hitObject.NestedHitObjects).AsEnumerable()) + yield return nested; + } + } + + private bool canBeColored(HitObject hitObject) + { + switch (hitObject) + { + case Tap: + case SlideBody: + case Hold: + case Touch: + return true; } + return false; } } }