// Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Graphics; using osu.Framework.Input.Bindings; using osu.Game.Beatmaps; using osu.Game.Graphics; using osu.Game.Overlays.Settings; using osu.Game.Rulesets.Edit; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; namespace osu.Game.Rulesets { public abstract class Ruleset { public readonly RulesetInfo RulesetInfo; public virtual IEnumerable GetBeatmapStatistics(WorkingBeatmap beatmap) => new BeatmapStatistic[] { }; public IEnumerable GetAllMods() => Enum.GetValues(typeof(ModType)).Cast() // Confine all mods of each mod type into a single IEnumerable .SelectMany(GetModsFor) // Filter out all null mods .Where(mod => mod != null) // Resolve MultiMods as their .Mods property .SelectMany(mod => (mod as MultiMod)?.Mods ?? new[] { mod }); public abstract IEnumerable GetModsFor(ModType type); public Mod GetAutoplayMod() => GetAllMods().First(mod => mod is ModAutoplay); protected Ruleset(RulesetInfo rulesetInfo = null) { RulesetInfo = rulesetInfo ?? createRulesetInfo(); } /// /// Attempt to create a hit renderer for a beatmap /// /// The beatmap to create the hit renderer for. /// Whether the hit renderer should assume the beatmap is for the current ruleset. /// Unable to successfully load the beatmap to be usable with this ruleset. /// public abstract RulesetContainer CreateRulesetContainerWith(WorkingBeatmap beatmap, bool isForCurrentRuleset); public abstract DifficultyCalculator CreateDifficultyCalculator(Beatmap beatmap, Mod[] mods = null); public virtual PerformanceCalculator CreatePerformanceCalculator(Beatmap beatmap, Score score) => null; public virtual HitObjectComposer CreateHitObjectComposer() => null; public virtual Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_question_circle }; public abstract string Description { get; } public virtual SettingsSubsection CreateSettings() => null; /// /// Do not override this unless you are a legacy mode. /// public virtual int LegacyID => -1; /// /// A unique short name to reference this ruleset in online requests. /// public abstract string ShortName { get; } /// /// A list of available variant ids. /// public virtual IEnumerable AvailableVariants => new[] { 0 }; /// /// Get a list of default keys for the specified variant. /// /// A variant. /// A list of valid s. public virtual IEnumerable GetDefaultKeyBindings(int variant = 0) => new KeyBinding[] { }; /// /// Gets the name for a key binding variant. This is used for display in the settings overlay. /// /// The variant. /// A descriptive name of the variant. public virtual string GetVariantName(int variant) => string.Empty; /// /// Create a ruleset info based on this ruleset. /// /// A filled . private RulesetInfo createRulesetInfo() => new RulesetInfo { Name = Description, ShortName = ShortName, InstantiationInfo = GetType().AssemblyQualifiedName, ID = LegacyID }; } }