// 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 osu.Framework.Graphics; using osu.Framework.Bindables; using osu.Game.Rulesets.Scoring; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Skinning; using System.Collections.Generic; namespace osu.Game.Rulesets.Mania.Skinning { public class ManiaLegacySkinTransformer : LegacySkinTransformer { private readonly ManiaBeatmap beatmap; /// /// Mapping of to their corresponding /// value. /// private static readonly IReadOnlyDictionary hitresult_mapping = new Dictionary { { HitResult.Perfect, LegacyManiaSkinConfigurationLookups.Hit300g }, { HitResult.Great, LegacyManiaSkinConfigurationLookups.Hit300 }, { HitResult.Good, LegacyManiaSkinConfigurationLookups.Hit200 }, { HitResult.Ok, LegacyManiaSkinConfigurationLookups.Hit100 }, { HitResult.Meh, LegacyManiaSkinConfigurationLookups.Hit50 }, { HitResult.Miss, LegacyManiaSkinConfigurationLookups.Hit0 } }; /// /// Mapping of to their corresponding /// default filenames. /// private static readonly IReadOnlyDictionary default_hitresult_skin_filenames = new Dictionary { { HitResult.Perfect, "mania-hit300g" }, { HitResult.Great, "mania-hit300" }, { HitResult.Good, "mania-hit200" }, { HitResult.Ok, "mania-hit100" }, { HitResult.Meh, "mania-hit50" }, { HitResult.Miss, "mania-hit0" } }; private Lazy isLegacySkin; /// /// Whether texture for the keys exists. /// Used to determine if the mania ruleset is skinned. /// private Lazy hasKeyTexture; public ManiaLegacySkinTransformer(ISkinSource source, IBeatmap beatmap) : base(source) { this.beatmap = (ManiaBeatmap)beatmap; Source.SourceChanged += sourceChanged; sourceChanged(); } private void sourceChanged() { isLegacySkin = new Lazy(() => Source.GetConfig(LegacySkinConfiguration.LegacySetting.Version) != null); hasKeyTexture = new Lazy(() => Source.GetAnimation( this.GetManiaSkinConfig(LegacyManiaSkinConfigurationLookups.KeyImage, 0)?.Value ?? "mania-key1", true, true) != null); } public override Drawable GetDrawableComponent(ISkinComponent component) { switch (component) { case GameplaySkinComponent resultComponent: return getResult(resultComponent.Component); case ManiaSkinComponent maniaComponent: if (!isLegacySkin.Value || !hasKeyTexture.Value) return null; switch (maniaComponent.Component) { case ManiaSkinComponents.ColumnBackground: return new LegacyColumnBackground(maniaComponent.TargetColumn == beatmap.TotalColumns - 1); case ManiaSkinComponents.HitTarget: return new LegacyHitTarget(); case ManiaSkinComponents.KeyArea: return new LegacyKeyArea(); case ManiaSkinComponents.Note: return new LegacyNotePiece(); case ManiaSkinComponents.HoldNoteHead: return new LegacyHoldNoteHeadPiece(); case ManiaSkinComponents.HoldNoteTail: return new LegacyHoldNoteTailPiece(); case ManiaSkinComponents.HoldNoteBody: return new LegacyBodyPiece(); case ManiaSkinComponents.HitExplosion: return new LegacyHitExplosion(); case ManiaSkinComponents.StageBackground: return new LegacyStageBackground(); case ManiaSkinComponents.StageForeground: return new LegacyStageForeground(); } break; } return null; } private Drawable getResult(HitResult result) { string filename = this.GetManiaSkinConfig(hitresult_mapping[result])?.Value ?? default_hitresult_skin_filenames[result]; return this.GetAnimation(filename, true, true); } public override IBindable GetConfig(TLookup lookup) { if (lookup is ManiaSkinConfigurationLookup maniaLookup) return Source.GetConfig(new LegacyManiaSkinConfigurationLookup(beatmap.TotalColumns, maniaLookup.Lookup, maniaLookup.TargetColumn)); return Source.GetConfig(lookup); } } }