From 8cfeffc085def6f9f063b3c6d7bf75e78e864bc7 Mon Sep 17 00:00:00 2001 From: Henry Lin Date: Tue, 8 Mar 2022 11:50:30 +0800 Subject: [PATCH] Extract a major part of `ApplyToBeatmap` to a new method --- osu.Game.Rulesets.Osu/Mods/OsuModRandom.cs | 103 +++++++++++---------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModRandom.cs b/osu.Game.Rulesets.Osu/Mods/OsuModRandom.cs index 1d0442438e..76183fe0aa 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModRandom.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModRandom.cs @@ -47,54 +47,7 @@ namespace osu.Game.Rulesets.Osu.Mods var randomObjects = randomiseObjects(hitObjects); - RandomObjectInfo previous = null; - - for (int i = 0; i < hitObjects.Count; i++) - { - var hitObject = hitObjects[i]; - - var current = randomObjects[i]; - - if (hitObject is Spinner) - { - previous = null; - continue; - } - - applyRandomisation(getAbsoluteAngle(hitObjects, i - 1), previous, current); - - // Move hit objects back into the playfield if they are outside of it - Vector2 shift = Vector2.Zero; - - switch (hitObject) - { - case HitCircle circle: - shift = clampHitCircleToPlayfield(circle, current); - break; - - case Slider slider: - shift = clampSliderToPlayfield(slider, current); - break; - } - - if (shift != Vector2.Zero) - { - var toBeShifted = new List(); - - for (int j = i - 1; j >= i - preceding_hitobjects_to_shift && j >= 0; j--) - { - // only shift hit circles - if (!(hitObjects[j] is HitCircle)) break; - - toBeShifted.Add(hitObjects[j]); - } - - if (toBeShifted.Count > 0) - applyDecreasingShift(toBeShifted, shift); - } - - previous = current; - } + applyRandomisation(hitObjects, randomObjects); } private List randomiseObjects(IEnumerable hitObjects) @@ -136,6 +89,58 @@ namespace osu.Game.Rulesets.Osu.Mods return randomObjects; } + private void applyRandomisation(IReadOnlyList hitObjects, IReadOnlyList randomObjects) + { + RandomObjectInfo previous = null; + + for (int i = 0; i < hitObjects.Count; i++) + { + var hitObject = hitObjects[i]; + + var current = randomObjects[i]; + + if (hitObject is Spinner) + { + previous = null; + continue; + } + + computeRandomisedPosition(getAbsoluteAngle(hitObjects, i - 1), previous, current); + + // Move hit objects back into the playfield if they are outside of it + Vector2 shift = Vector2.Zero; + + switch (hitObject) + { + case HitCircle circle: + shift = clampHitCircleToPlayfield(circle, current); + break; + + case Slider slider: + shift = clampSliderToPlayfield(slider, current); + break; + } + + if (shift != Vector2.Zero) + { + var toBeShifted = new List(); + + for (int j = i - 1; j >= i - preceding_hitobjects_to_shift && j >= 0; j--) + { + // only shift hit circles + if (!(hitObjects[j] is HitCircle)) break; + + toBeShifted.Add(hitObjects[j]); + } + + if (toBeShifted.Count > 0) + applyDecreasingShift(toBeShifted, shift); + } + + previous = current; + } + } + private float getAbsoluteAngle(IReadOnlyList hitObjects, int hitObjectIndex) { if (hitObjectIndex < 0) return 0; @@ -149,7 +154,7 @@ namespace osu.Game.Rulesets.Osu.Mods /// Returns the final position of the hit object /// /// Final position of the hit object - private void applyRandomisation(float previousAbsoluteAngle, RandomObjectInfo previous, RandomObjectInfo current) + private void computeRandomisedPosition(float previousAbsoluteAngle, RandomObjectInfo previous, RandomObjectInfo current) { float absoluteAngle = previousAbsoluteAngle + current.RelativeAngle;