// 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 osu.Framework.Graphics; using osu.Game.Configuration; using osu.Game.Database; using osu.Game.Rulesets.Configuration; namespace osu.Game.Rulesets { /// /// A cache that provides a single per-ruleset. /// This is done to support referring to and updating ruleset configs from multiple locations in the absence of inter-config bindings. /// public class RulesetConfigCache : Component { private readonly RealmContextFactory realmFactory; private readonly RulesetStore rulesets; private readonly Dictionary configCache = new Dictionary(); public RulesetConfigCache(RealmContextFactory realmFactory, RulesetStore rulesets) { this.realmFactory = realmFactory; this.rulesets = rulesets; } protected override void LoadComplete() { base.LoadComplete(); var settingsStore = new SettingsStore(realmFactory); // let's keep things simple for now and just retrieve all the required configs at startup.. foreach (var ruleset in rulesets.AvailableRulesets) { if (ruleset.ID == null) continue; configCache[ruleset.ID.Value] = ruleset.CreateInstance().CreateConfig(settingsStore); } } /// /// Retrieves the for a . /// /// The to retrieve the for. /// The defined by , null if doesn't define one. /// If doesn't have a valid . public IRulesetConfigManager GetConfigFor(Ruleset ruleset) { if (ruleset.RulesetInfo.ID == null) return null; if (!configCache.TryGetValue(ruleset.RulesetInfo.ID.Value, out var config)) // any ruleset request which wasn't initialised on startup should not be stored to realm. // this should only be used by tests. return ruleset.CreateConfig(null); return config; } protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing); // ensures any potential database operations are finalised before game destruction. foreach (var c in configCache.Values) c?.Dispose(); } } }