diff --git a/osu.Game.Rulesets.Catch/CatchRuleset.cs b/osu.Game.Rulesets.Catch/CatchRuleset.cs index df212f7df7..2902455808 100644 --- a/osu.Game.Rulesets.Catch/CatchRuleset.cs +++ b/osu.Game.Rulesets.Catch/CatchRuleset.cs @@ -83,6 +83,8 @@ namespace osu.Game.Rulesets.Catch } } + public override Mod GetAutoplayMod() => new ModAutoplay(); + public override string Description => "osu!catch"; public override FontAwesome Icon => FontAwesome.fa_osu_fruits_o; diff --git a/osu.Game.Rulesets.Mania/ManiaRuleset.cs b/osu.Game.Rulesets.Mania/ManiaRuleset.cs index 8be3870ebe..1b50b8809c 100644 --- a/osu.Game.Rulesets.Mania/ManiaRuleset.cs +++ b/osu.Game.Rulesets.Mania/ManiaRuleset.cs @@ -104,6 +104,8 @@ namespace osu.Game.Rulesets.Mania } } + public override Mod GetAutoplayMod() => new ModAutoplay(); + public override string Description => "osu!mania"; public override FontAwesome Icon => FontAwesome.fa_osu_mania_o; diff --git a/osu.Game.Rulesets.Osu/OsuRuleset.cs b/osu.Game.Rulesets.Osu/OsuRuleset.cs index 8e8e186d40..efa6ae75d4 100644 --- a/osu.Game.Rulesets.Osu/OsuRuleset.cs +++ b/osu.Game.Rulesets.Osu/OsuRuleset.cs @@ -104,6 +104,8 @@ namespace osu.Game.Rulesets.Osu } } + public override Mod GetAutoplayMod() => new OsuModAutoplay(); + public override FontAwesome Icon => FontAwesome.fa_osu_osu_o; public override DifficultyCalculator CreateDifficultyCalculator(Beatmap beatmap) => new OsuDifficultyCalculator(beatmap); diff --git a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs index 303d936fb9..c244616d47 100644 --- a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs +++ b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs @@ -83,6 +83,8 @@ namespace osu.Game.Rulesets.Taiko } } + public override Mod GetAutoplayMod() => new TaikoModAutoplay(); + public override string Description => "osu!taiko"; public override FontAwesome Icon => FontAwesome.fa_osu_taiko_o; diff --git a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs index 0885fb05e5..bd53a80555 100644 --- a/osu.Game/Beatmaps/DummyWorkingBeatmap.cs +++ b/osu.Game/Beatmaps/DummyWorkingBeatmap.cs @@ -60,6 +60,8 @@ namespace osu.Game.Beatmaps { public override IEnumerable GetModsFor(ModType type) => new Mod[] { }; + public override Mod GetAutoplayMod() => new ModAutoplay(); + public override HitRenderer CreateHitRendererWith(WorkingBeatmap beatmap, bool isForCurrentRuleset) { throw new NotImplementedException(); diff --git a/osu.Game/Rulesets/Ruleset.cs b/osu.Game/Rulesets/Ruleset.cs index 3dbb39d894..316b3ad276 100644 --- a/osu.Game/Rulesets/Ruleset.cs +++ b/osu.Game/Rulesets/Ruleset.cs @@ -18,6 +18,8 @@ namespace osu.Game.Rulesets public abstract IEnumerable GetModsFor(ModType type); + public abstract Mod GetAutoplayMod(); + /// /// Attempt to create a hit renderer for a beatmap /// diff --git a/osu.Game/Screens/Select/PlaySongSelect.cs b/osu.Game/Screens/Select/PlaySongSelect.cs index d17e4d0421..7a4f7c404d 100644 --- a/osu.Game/Screens/Select/PlaySongSelect.cs +++ b/osu.Game/Screens/Select/PlaySongSelect.cs @@ -114,32 +114,18 @@ namespace osu.Game.Screens.Select originalMods = modSelect.SelectedMods.Value; if (state?.Keyboard.ControlPressed == true) - if (findAutoMod(originalMods) == null) - { - var auto = findAutoMod(Ruleset.Value.CreateInstance().GetModsFor(ModType.Special)); - if (auto != null) - modSelect.SelectedMods.Value = originalMods.Concat(new[] { auto }); - } + { + var auto = Ruleset.Value.CreateInstance().GetAutoplayMod(); + var autoType = auto.GetType(); + + if (originalMods.All(m => m.GetType() != autoType)) + modSelect.SelectedMods.Value = originalMods.Concat(new[] { auto }); + } Beatmap.Value.Track.Looping = false; Beatmap.Disabled = true; LoadComponentAsync(player = new PlayerLoader(new Player()), l => Push(player)); } - - private Mod findAutoMod(IEnumerable mods) - { - foreach (var mod in mods) - { - if (mod is ModAutoplay) return mod; - var multimod = mod as MultiMod; - if (multimod != null) - { - var find = findAutoMod(multimod.Mods); - if (find != null) return find; - } - } - return null; - } } }