From 0a17adf21542bd48b32c778a933d58e58be8cf28 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sat, 12 Aug 2023 16:46:54 +0200 Subject: [PATCH 1/2] Fix mirror mod corrupting the valid slides list --- osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs | 4 +++- osu.Game.Rulesets.Sentakki/Objects/SlidePathPart.cs | 10 +--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs index 6032d331a..a3e697a11 100644 --- a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs +++ b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs @@ -56,8 +56,10 @@ public void ApplyToBeatmap(IBeatmap beatmap) { foreach (var slideInfo in slide.SlideInfoList) { - foreach (var part in slideInfo.SlidePathParts) + + for (int i = 0; i < slideInfo.SlidePathParts.Length; ++i) { + var part = slideInfo.SlidePathParts[i]; part.EndOffset = (part.EndOffset * -1).NormalizePath(); part.Mirrored ^= mirrored; } diff --git a/osu.Game.Rulesets.Sentakki/Objects/SlidePathPart.cs b/osu.Game.Rulesets.Sentakki/Objects/SlidePathPart.cs index fb805db6b..9b88855f1 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/SlidePathPart.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/SlidePathPart.cs @@ -1,8 +1,6 @@ -using System; - namespace osu.Game.Rulesets.Sentakki.Objects { - public class SlideBodyPart : IEquatable + public record struct SlideBodyPart { public SlidePaths.PathShapes Shape { get; private set; } public int EndOffset { get; set; } @@ -14,11 +12,5 @@ public SlideBodyPart(SlidePaths.PathShapes shape, int endOffset, bool mirrored) EndOffset = endOffset; Mirrored = mirrored; } - - public override bool Equals(object? obj) => obj is not null && obj is SlideBodyPart otherPart && Equals(otherPart); - - public bool Equals(SlideBodyPart? other) => other is not null && (ReferenceEquals(this, other) || (Shape == other.Shape && EndOffset == other.EndOffset)); - - public override int GetHashCode() => HashCode.Combine(Shape, EndOffset, Mirrored); } } From 3ceca2bd2f31f554e9e3f354d5151a0e2efde0f6 Mon Sep 17 00:00:00 2001 From: Derrick Timmermans Date: Sun, 13 Aug 2023 01:52:13 +0200 Subject: [PATCH 2/2] Use ref vars to modify slidePathParts array Structs are still copy on write, so modifying without ref vars only affected the local copy in the loop. --- osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs index a3e697a11..58d438b3e 100644 --- a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs +++ b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModMirror.cs @@ -56,10 +56,9 @@ public void ApplyToBeatmap(IBeatmap beatmap) { foreach (var slideInfo in slide.SlideInfoList) { - for (int i = 0; i < slideInfo.SlidePathParts.Length; ++i) { - var part = slideInfo.SlidePathParts[i]; + ref var part = ref slideInfo.SlidePathParts[i]; part.EndOffset = (part.EndOffset * -1).NormalizePath(); part.Mirrored ^= mirrored; }