// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Linq; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Screens.Play.HUD; using osu.Game.Skinning; using osuTK.Graphics; namespace osu.Game.Rulesets.Catch.Skinning.Legacy { public class CatchLegacySkinTransformer : LegacySkinTransformer { /// /// For simplicity, let's use legacy combo font texture existence as a way to identify legacy skins from default. /// private bool providesComboCounter => this.HasFont(LegacyFont.Combo); public CatchLegacySkinTransformer(ISkinSource source) : base(source) { } public override Drawable GetDrawableComponent(ISkinComponent component) { if (component is SkinnableTargetComponent targetComponent && targetComponent.Target == SkinnableTarget.MainHUDComponents) { if (!providesComboCounter) return null; if (Source.GetDrawableComponent(component) is SkinnableTargetComponentsContainer components) { // catch may provide its own combo counter; hide the default. // todo: this should probably be done in an elegant way. foreach (var legacyComboCounter in components.OfType()) legacyComboCounter.Expire(); return components; } return null; } if (!(component is CatchSkinComponent catchSkinComponent)) return null; switch (catchSkinComponent.Component) { case CatchSkinComponents.Fruit: if (GetTexture("fruit-pear") != null) return new LegacyFruitPiece(); break; case CatchSkinComponents.Banana: if (GetTexture("fruit-bananas") != null) return new LegacyBananaPiece(); break; case CatchSkinComponents.Droplet: if (GetTexture("fruit-drop") != null) return new LegacyDropletPiece(); break; case CatchSkinComponents.CatcherIdle: return this.GetAnimation("fruit-catcher-idle", true, true, true) ?? this.GetAnimation("fruit-ryuuta", true, true, true); case CatchSkinComponents.CatcherFail: return this.GetAnimation("fruit-catcher-fail", true, true, true) ?? this.GetAnimation("fruit-ryuuta", true, true, true); case CatchSkinComponents.CatcherKiai: return this.GetAnimation("fruit-catcher-kiai", true, true, true) ?? this.GetAnimation("fruit-ryuuta", true, true, true); case CatchSkinComponents.CatchComboCounter: if (providesComboCounter) return new LegacyCatchComboCounter(Source); break; } return null; } public override IBindable GetConfig(TLookup lookup) { switch (lookup) { case CatchSkinColour colour: var result = (Bindable)Source.GetConfig(new SkinCustomColourLookup(colour)); if (result == null) return null; result.Value = LegacyColourCompatibility.DisallowZeroAlpha(result.Value); return (IBindable)result; } return Source.GetConfig(lookup); } } }