// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Platform; namespace osu.Game.Rulesets { /// /// A ruleset store that populates from loaded assemblies (and optionally, assemblies in a storage). /// public class AssemblyRulesetStore : RulesetStore { public override IEnumerable AvailableRulesets => availableRulesets; private readonly List availableRulesets = new List(); /// /// Create an assembly ruleset store that populates from loaded assemblies and an external location. /// /// An path containing ruleset DLLs. public AssemblyRulesetStore(string path) : this(new NativeStorage(path)) { } /// /// Create an assembly ruleset store that populates from loaded assemblies and an optional storage source. /// /// An optional storage containing ruleset DLLs. public AssemblyRulesetStore(Storage? storage = null) : base(storage) { List instances = LoadedAssemblies.Values .Select(r => Activator.CreateInstance(r) as Ruleset) .Where(r => r != null) .Select(r => r.AsNonNull()) .ToList(); // add all legacy rulesets first to ensure they have exclusive choice of primary key. foreach (var r in instances.Where(r => r is ILegacyRuleset)) { availableRulesets.Add(new RulesetInfo(r.RulesetInfo.ShortName, r.RulesetInfo.Name, r.RulesetInfo.InstantiationInfo, r.RulesetInfo.OnlineID) { Available = true }); } } } }