diff --git a/osu.Game.Modes.Catch/CatchRuleset.cs b/osu.Game.Modes.Catch/CatchRuleset.cs index 5a55db5ede..38edc6714b 100644 --- a/osu.Game.Modes.Catch/CatchRuleset.cs +++ b/osu.Game.Modes.Catch/CatchRuleset.cs @@ -16,6 +16,8 @@ namespace osu.Game.Modes.Catch public override HitRenderer CreateHitRendererWith(List objects) => new CatchHitRenderer { Objects = objects }; + protected override PlayMode PlayMode => PlayMode.Mania; + public override HitObjectParser CreateHitObjectParser() => new OsuHitObjectParser(); } } diff --git a/osu.Game.Modes.Mania/ManiaRuleset.cs b/osu.Game.Modes.Mania/ManiaRuleset.cs index f92ce9ba1a..cb122084df 100644 --- a/osu.Game.Modes.Mania/ManiaRuleset.cs +++ b/osu.Game.Modes.Mania/ManiaRuleset.cs @@ -17,6 +17,8 @@ namespace osu.Game.Modes.Mania public override HitRenderer CreateHitRendererWith(List objects) => new ManiaHitRenderer { Objects = objects }; + protected override PlayMode PlayMode => PlayMode.Mania; + public override HitObjectParser CreateHitObjectParser() => new OsuHitObjectParser(); } } diff --git a/osu.Game.Modes.Taiko/TaikoRuleset.cs b/osu.Game.Modes.Taiko/TaikoRuleset.cs index a85c2c7a32..fa9d0862c7 100644 --- a/osu.Game.Modes.Taiko/TaikoRuleset.cs +++ b/osu.Game.Modes.Taiko/TaikoRuleset.cs @@ -16,6 +16,8 @@ namespace osu.Game.Modes.Taiko public override HitRenderer CreateHitRendererWith(List objects) => new TaikoHitRenderer { Objects = objects }; + protected override PlayMode PlayMode => PlayMode.Taiko; + public override HitObjectParser CreateHitObjectParser() => new OsuHitObjectParser(); } } diff --git a/osu.Game/Modes/Ruleset.cs b/osu.Game/Modes/Ruleset.cs index 7fc4b3221d..dddcd0d0c5 100644 --- a/osu.Game/Modes/Ruleset.cs +++ b/osu.Game/Modes/Ruleset.cs @@ -7,13 +7,14 @@ using osu.Game.Modes.UI; using System.Reflection; using osu.Framework.Extensions; using System; +using System.Collections.Concurrent; using System.Linq; namespace osu.Game.Modes { public abstract class Ruleset { - private static List availableRulesets = new List(); + private static ConcurrentDictionary availableRulesets = new ConcurrentDictionary(); public abstract ScoreOverlay CreateScoreOverlay(); @@ -21,13 +22,15 @@ namespace osu.Game.Modes public abstract HitObjectParser CreateHitObjectParser(); - public static void Register(Ruleset ruleset) => availableRulesets.Add(ruleset.GetType()); + public static void Register(Ruleset ruleset) => availableRulesets.TryAdd(ruleset.PlayMode, ruleset.GetType()); + + protected virtual PlayMode PlayMode => PlayMode.Osu; public static Ruleset GetRuleset(PlayMode mode) { - Type type = availableRulesets.FirstOrDefault(t => t.Name == $@"{mode}Ruleset"); + Type type; - if (type == null) + if (!availableRulesets.TryGetValue(mode, out type)) return null; return Activator.CreateInstance(type) as Ruleset;