diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index 94aa165785..434a0ea030 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -1,6 +1,7 @@ // 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 System.Linq; using osu.Framework.Allocation; using osu.Framework.Graphics.Sprites; @@ -14,13 +15,13 @@ using osu.Game.Scoring; using osu.Game.Screens.Play; using osu.Game.Screens.Ranking; using osu.Game.Users; +using osu.Game.Utils; using osuTK.Input; namespace osu.Game.Screens.Select { public class PlaySongSelect : SongSelect { - private bool removeAutoModOnResume; private OsuScreen playerLoader; [Resolved(CanBeNull = true)] @@ -43,25 +44,6 @@ namespace osu.Game.Screens.Select protected override BeatmapDetailArea CreateBeatmapDetailArea() => new PlayBeatmapDetailArea(); - private ModAutoplay getAutoplayMod() => Ruleset.Value.CreateInstance().GetAutoplayMod(); - - public override void OnResuming(IScreen last) - { - base.OnResuming(last); - - playerLoader = null; - - if (removeAutoModOnResume) - { - var autoType = getAutoplayMod()?.GetType(); - - if (autoType != null) - Mods.Value = Mods.Value.Where(m => m.GetType() != autoType).ToArray(); - - removeAutoModOnResume = false; - } - } - protected override bool OnKeyDown(KeyDownEvent e) { switch (e.Key) @@ -77,10 +59,16 @@ namespace osu.Game.Screens.Select return base.OnKeyDown(e); } + private IReadOnlyList modsAtGameplayStart; + + private ModAutoplay getAutoplayMod() => Ruleset.Value.CreateInstance().GetAutoplayMod(); + protected override bool OnStart() { if (playerLoader != null) return false; + modsAtGameplayStart = Mods.Value; + // Ctrl+Enter should start map with autoplay enabled. if (GetContainingInputManager().CurrentState?.Keyboard.ControlPressed == true) { @@ -95,13 +83,12 @@ namespace osu.Game.Screens.Select return false; } - var mods = Mods.Value; + var mods = Mods.Value.Append(autoInstance).ToArray(); - if (mods.All(m => m.GetType() != autoInstance.GetType())) - { - Mods.Value = mods.Append(autoInstance).ToArray(); - removeAutoModOnResume = true; - } + if (!ModUtils.CheckCompatibleSet(mods, out var invalid)) + mods = mods.Except(invalid).Append(autoInstance).ToArray(); + + Mods.Value = mods; } SampleConfirm?.Play(); @@ -118,5 +105,16 @@ namespace osu.Game.Screens.Select return new SoloPlayer(); } } + + public override void OnResuming(IScreen last) + { + base.OnResuming(last); + + if (playerLoader != null) + { + Mods.Value = modsAtGameplayStart; + playerLoader = null; + } + } } }