From e2f82ac29b242b6d7621faeb347b2cc9d1704d85 Mon Sep 17 00:00:00 2001 From: Lucas A Date: Sat, 22 Jun 2019 17:53:00 +0200 Subject: [PATCH 1/9] Move CatcherSprite to its own file + Make CatcherSprite a SkinReloadableDrawable --- osu.Game.Rulesets.Catch/UI/CatcherArea.cs | 22 +--------- osu.Game.Rulesets.Catch/UI/CatcherSprite.cs | 46 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 osu.Game.Rulesets.Catch/UI/CatcherSprite.cs diff --git a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs index 90052d9b11..18121bba4b 100644 --- a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs +++ b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs @@ -7,7 +7,6 @@ using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; -using osu.Framework.Graphics.Textures; using osu.Framework.Input.Bindings; using osu.Framework.MathUtils; using osu.Game.Beatmaps; @@ -141,7 +140,7 @@ namespace osu.Game.Rulesets.Catch.UI [BackgroundDependencyLoader] private void load() { - Children = new Drawable[] + Children = new[] { caughtFruit = new Container { @@ -212,7 +211,7 @@ namespace osu.Game.Rulesets.Catch.UI Scheduler.AddDelayed(beginTrail, HyperDashing ? 25 : 50); } - private Sprite createCatcherSprite() => new CatcherSprite(); + private Drawable createCatcherSprite() => new CatcherSprite(); /// /// Add a caught fruit to the catcher's stack. @@ -444,23 +443,6 @@ namespace osu.Game.Rulesets.Catch.UI fruit.Expire(); } - - private class CatcherSprite : Sprite - { - public CatcherSprite() - { - Size = new Vector2(CATCHER_SIZE); - - // Sets the origin roughly to the centre of the catcher's plate to allow for correct scaling. - OriginPosition = new Vector2(-0.02f, 0.06f) * CATCHER_SIZE; - } - - [BackgroundDependencyLoader] - private void load(TextureStore textures) - { - Texture = textures.Get(@"Play/Catch/fruit-catcher-idle"); - } - } } } } diff --git a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs new file mode 100644 index 0000000000..24e5ec500a --- /dev/null +++ b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs @@ -0,0 +1,46 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; +using osu.Game.Skinning; +using osuTK; + +namespace osu.Game.Rulesets.Catch.UI +{ + public class CatcherSprite : SkinReloadableDrawable + { + private Drawable catcher; + + public CatcherSprite() + { + Size = new Vector2(CatcherArea.CATCHER_SIZE); + + // Sets the origin roughly to the centre of the catcher's plate to allow for correct scaling. + OriginPosition = new Vector2(-0.02f, 0.06f) * CatcherArea.CATCHER_SIZE; + } + + [BackgroundDependencyLoader] + private void load(TextureStore textures) + { + InternalChild = new Container() + { + RelativeSizeAxes = Axes.Both, + Child = catcher = new SkinnableDrawable("fruit-catcher-idle", _ => new Sprite() + { + Texture = textures.Get(@"Play/Catch/fruit-catcher-idle"), + RelativeSizeAxes = Axes.Both, + Size = Vector2.One, + }, restrictSize: true) + { + RelativeSizeAxes = Axes.Both, + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, + } + }; + } + } +} From b6cae57694b813b1649c5e99efce25003dfce02f Mon Sep 17 00:00:00 2001 From: Lucas A Date: Sat, 22 Jun 2019 18:14:29 +0200 Subject: [PATCH 2/9] Add TestSceneCatcherSkinning --- .../TestSceneCatcherSkinning.cs | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs new file mode 100644 index 0000000000..fa9486b087 --- /dev/null +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs @@ -0,0 +1,99 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using NUnit.Framework; +using osu.Framework.Allocation; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics; +using osu.Game.Rulesets.Catch.UI; +using osu.Game.Tests.Visual; +using System; +using System.Collections.Generic; +using osu.Game.Skinning; +using osu.Framework.Graphics.Shapes; +using osu.Framework.Graphics.Sprites; +using osuTK.Graphics; +using osu.Framework.Audio.Sample; +using osu.Framework.Graphics.Textures; + +namespace osu.Game.Rulesets.Catch.Tests +{ + [TestFixture] + public class TestSceneCatcherSkinning : OsuTestScene + { + public override IReadOnlyList RequiredTypes => new[] + { + typeof(CatcherSprite), + }; + + private Container container; + + public TestSceneCatcherSkinning() + { + Child = container = new Container + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + }; + } + + [BackgroundDependencyLoader] + private void load() + { + AddStep("show default catcher implementation", () => + { + container.Clear(); + container.Child = new CatcherSprite(); + }); + + AddStep("show custom catcher implementation", () => + { + container.Clear(); + container.Child = new CatchCustomSkinSourceContainer + { + Child = new CatcherSprite() + }; + }); + } + + private class CatcherCustomSkin : Container + { + public CatcherCustomSkin() + { + RelativeSizeAxes = Axes.Both; + + Children = new Drawable[] + { + new Box + { + RelativeSizeAxes = Axes.Both, + Colour = Color4.Blue + }, + new SpriteText + { + Text = "custom" + } + }; + } + } + + private class CatchCustomSkinSourceContainer : Container, ISkinSource + { + public event Action SourceChanged; + + public Drawable GetDrawableComponent(string componentName) => new CatcherCustomSkin(); + + public SampleChannel GetSample(string sampleName) => throw new NotImplementedException(); + + public Texture GetTexture(string componentName) => throw new NotImplementedException(); + + public TValue GetValue(Func query) where TConfiguration : SkinConfiguration => throw new NotImplementedException(); + + protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) + { + ((DependencyContainer)parent).CacheAs(this); + return base.CreateChildDependencies(parent); + } + } + } +} From 332ac0b82ba974f65ac4fb9d6f6cfa6c6c1bdbd3 Mon Sep 17 00:00:00 2001 From: Lucas A Date: Sat, 22 Jun 2019 18:23:20 +0200 Subject: [PATCH 3/9] Fix CI inspections --- osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs | 8 ++++++-- osu.Game.Rulesets.Catch/UI/CatcherArea.cs | 1 - osu.Game.Rulesets.Catch/UI/CatcherSprite.cs | 6 ++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs index fa9486b087..e1ec88d4a9 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs @@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.Catch.Tests typeof(CatcherSprite), }; - private Container container; + private readonly Container container; public TestSceneCatcherSkinning() { @@ -79,7 +79,11 @@ namespace osu.Game.Rulesets.Catch.Tests private class CatchCustomSkinSourceContainer : Container, ISkinSource { - public event Action SourceChanged; + public event Action SourceChanged + { + add { } + remove { } + } public Drawable GetDrawableComponent(string componentName) => new CatcherCustomSkin(); diff --git a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs index 18121bba4b..0b06e958e6 100644 --- a/osu.Game.Rulesets.Catch/UI/CatcherArea.cs +++ b/osu.Game.Rulesets.Catch/UI/CatcherArea.cs @@ -6,7 +6,6 @@ using System.Linq; using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Sprites; using osu.Framework.Input.Bindings; using osu.Framework.MathUtils; using osu.Game.Beatmaps; diff --git a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs index 24e5ec500a..1308a9b7a1 100644 --- a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs +++ b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs @@ -13,8 +13,6 @@ namespace osu.Game.Rulesets.Catch.UI { public class CatcherSprite : SkinReloadableDrawable { - private Drawable catcher; - public CatcherSprite() { Size = new Vector2(CatcherArea.CATCHER_SIZE); @@ -26,10 +24,10 @@ namespace osu.Game.Rulesets.Catch.UI [BackgroundDependencyLoader] private void load(TextureStore textures) { - InternalChild = new Container() + InternalChild = new Container { RelativeSizeAxes = Axes.Both, - Child = catcher = new SkinnableDrawable("fruit-catcher-idle", _ => new Sprite() + Child = new SkinnableDrawable("fruit-catcher-idle", _ => new Sprite { Texture = textures.Get(@"Play/Catch/fruit-catcher-idle"), RelativeSizeAxes = Axes.Both, From 4cd8b6a2bd48d7ffc57a335dae4ec9e4f9bdc2a8 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Mon, 24 Jun 2019 13:37:06 +0900 Subject: [PATCH 4/9] Fix unsafe caching of dependencies --- osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs index e1ec88d4a9..a56a1e31c1 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs @@ -77,6 +77,7 @@ namespace osu.Game.Rulesets.Catch.Tests } } + [Cached(typeof(ISkinSource))] private class CatchCustomSkinSourceContainer : Container, ISkinSource { public event Action SourceChanged @@ -92,12 +93,6 @@ namespace osu.Game.Rulesets.Catch.Tests public Texture GetTexture(string componentName) => throw new NotImplementedException(); public TValue GetValue(Func query) where TConfiguration : SkinConfiguration => throw new NotImplementedException(); - - protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) - { - ((DependencyContainer)parent).CacheAs(this); - return base.CreateChildDependencies(parent); - } } } } From 2a4bd612d7e31a9a44467d6144f83d24c9c10052 Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Mon, 24 Jun 2019 13:47:37 +0900 Subject: [PATCH 5/9] Rename test scene --- .../{TestSceneCatcherSkinning.cs => TestSceneCatcher.cs} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename osu.Game.Rulesets.Catch.Tests/{TestSceneCatcherSkinning.cs => TestSceneCatcher.cs} (96%) diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs similarity index 96% rename from osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs rename to osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs index a56a1e31c1..e4c01cb668 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcherSkinning.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs @@ -19,7 +19,7 @@ using osu.Framework.Graphics.Textures; namespace osu.Game.Rulesets.Catch.Tests { [TestFixture] - public class TestSceneCatcherSkinning : OsuTestScene + public class TestSceneCatcher : OsuTestScene { public override IReadOnlyList RequiredTypes => new[] { @@ -28,7 +28,7 @@ namespace osu.Game.Rulesets.Catch.Tests private readonly Container container; - public TestSceneCatcherSkinning() + public TestSceneCatcher() { Child = container = new Container { From 06b087db701a97033fa15c678b73265afd1d1f41 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 14:39:20 +0900 Subject: [PATCH 6/9] Add SkinnableSprite implementation --- osu.Game/Skinning/SkinnableDrawable.cs | 26 +++++++++++++++++------- osu.Game/Skinning/SkinnableSprite.cs | 28 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 osu.Game/Skinning/SkinnableSprite.cs diff --git a/osu.Game/Skinning/SkinnableDrawable.cs b/osu.Game/Skinning/SkinnableDrawable.cs index 3ca58dc625..64ef50111c 100644 --- a/osu.Game/Skinning/SkinnableDrawable.cs +++ b/osu.Game/Skinning/SkinnableDrawable.cs @@ -23,6 +23,8 @@ namespace osu.Game.Skinning /// protected Drawable Drawable { get; private set; } + protected virtual T CreateDefault() => createDefault(componentName); + private readonly Func createDefault; private readonly string componentName; @@ -37,34 +39,44 @@ namespace osu.Game.Skinning /// A conditional to decide whether to allow fallback to the default implementation if a skinned element is not present. /// Whether a user-skin drawable should be limited to the size of our parent. public SkinnableDrawable(string name, Func defaultImplementation, Func allowFallback = null, bool restrictSize = true) + : this(name, allowFallback, restrictSize) + { + createDefault = defaultImplementation; + } + + protected SkinnableDrawable(string name, Func allowFallback = null, bool restrictSize = true) : base(allowFallback) { componentName = name; - createDefault = defaultImplementation; this.restrictSize = restrictSize; RelativeSizeAxes = Axes.Both; } + protected virtual bool ApplySizeToDefault => false; + protected override void SkinChanged(ISkinSource skin, bool allowFallback) { Drawable = skin.GetDrawableComponent(componentName); + bool isDefault = false; + + if (Drawable == null && allowFallback) + { + Drawable = CreateDefault(); + isDefault = true; + } + if (Drawable != null) { - if (restrictSize) + if (restrictSize && (!isDefault || ApplySizeToDefault)) { Drawable.RelativeSizeAxes = Axes.Both; Drawable.Size = Vector2.One; Drawable.Scale = Vector2.One; Drawable.FillMode = FillMode.Fit; } - } - else if (allowFallback) - Drawable = createDefault(componentName); - if (Drawable != null) - { Drawable.Origin = Anchor.Centre; Drawable.Anchor = Anchor.Centre; diff --git a/osu.Game/Skinning/SkinnableSprite.cs b/osu.Game/Skinning/SkinnableSprite.cs new file mode 100644 index 0000000000..4cf054b704 --- /dev/null +++ b/osu.Game/Skinning/SkinnableSprite.cs @@ -0,0 +1,28 @@ +// 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.Allocation; +using osu.Framework.Graphics.Sprites; +using osu.Framework.Graphics.Textures; + +namespace osu.Game.Skinning +{ + public class SkinnableSprite : SkinnableDrawable + { + protected override bool ApplySizeToDefault => true; + + private readonly string defaultName; + + protected override Sprite CreateDefault() => new Sprite { Texture = textures.Get(defaultName) }; + + [Resolved] + private TextureStore textures { get; set; } + + public SkinnableSprite(string name, string defaultName, Func allowFallback = null, bool restrictSize = true) + : base(name, allowFallback, restrictSize) + { + this.defaultName = defaultName; + } + } +} From d9f701176995af7b005034438e97b87878bed7f8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 14:39:46 +0900 Subject: [PATCH 7/9] Use SkinnableSprite to reduce complexity of implementation --- osu.Game.Rulesets.Catch/UI/CatcherSprite.cs | 21 +++++---------------- osu.Game/Skinning/SkinnableDrawable.cs | 4 ++-- osu.Game/Skinning/SkinnableSprite.cs | 7 ++----- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs index 1308a9b7a1..df396279fc 100644 --- a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs +++ b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs @@ -1,11 +1,9 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics.Sprites; -using osu.Framework.Graphics.Textures; using osu.Game.Skinning; using osuTK; @@ -22,22 +20,13 @@ namespace osu.Game.Rulesets.Catch.UI } [BackgroundDependencyLoader] - private void load(TextureStore textures) + private void load() { - InternalChild = new Container + InternalChild = new SkinnableSprite(@"Play/Catch/fruit-catcher-idle") { RelativeSizeAxes = Axes.Both, - Child = new SkinnableDrawable("fruit-catcher-idle", _ => new Sprite - { - Texture = textures.Get(@"Play/Catch/fruit-catcher-idle"), - RelativeSizeAxes = Axes.Both, - Size = Vector2.One, - }, restrictSize: true) - { - RelativeSizeAxes = Axes.Both, - Anchor = Anchor.TopCentre, - Origin = Anchor.TopCentre, - } + Anchor = Anchor.TopCentre, + Origin = Anchor.TopCentre, }; } } diff --git a/osu.Game/Skinning/SkinnableDrawable.cs b/osu.Game/Skinning/SkinnableDrawable.cs index 64ef50111c..dcbb63435a 100644 --- a/osu.Game/Skinning/SkinnableDrawable.cs +++ b/osu.Game/Skinning/SkinnableDrawable.cs @@ -23,7 +23,7 @@ namespace osu.Game.Skinning /// protected Drawable Drawable { get; private set; } - protected virtual T CreateDefault() => createDefault(componentName); + protected virtual T CreateDefault(string name) => createDefault(name); private readonly Func createDefault; @@ -63,7 +63,7 @@ namespace osu.Game.Skinning if (Drawable == null && allowFallback) { - Drawable = CreateDefault(); + Drawable = CreateDefault(componentName); isDefault = true; } diff --git a/osu.Game/Skinning/SkinnableSprite.cs b/osu.Game/Skinning/SkinnableSprite.cs index 4cf054b704..72b5740bd6 100644 --- a/osu.Game/Skinning/SkinnableSprite.cs +++ b/osu.Game/Skinning/SkinnableSprite.cs @@ -12,17 +12,14 @@ namespace osu.Game.Skinning { protected override bool ApplySizeToDefault => true; - private readonly string defaultName; - - protected override Sprite CreateDefault() => new Sprite { Texture = textures.Get(defaultName) }; + protected override Sprite CreateDefault(string name) => new Sprite { Texture = textures.Get(name) }; [Resolved] private TextureStore textures { get; set; } - public SkinnableSprite(string name, string defaultName, Func allowFallback = null, bool restrictSize = true) + public SkinnableSprite(string name, Func allowFallback = null, bool restrictSize = true) : base(name, allowFallback, restrictSize) { - this.defaultName = defaultName; } } } From 9baf8160d1e07256d36fe4ec7daee20f0be3259c Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 14:40:08 +0900 Subject: [PATCH 8/9] Remove pointless SkinReloadableDrawable specification --- osu.Game.Rulesets.Catch/UI/CatcherSprite.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs index df396279fc..c0c1952064 100644 --- a/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs +++ b/osu.Game.Rulesets.Catch/UI/CatcherSprite.cs @@ -1,4 +1,4 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; @@ -9,7 +9,7 @@ using osuTK; namespace osu.Game.Rulesets.Catch.UI { - public class CatcherSprite : SkinReloadableDrawable + public class CatcherSprite : CompositeDrawable { public CatcherSprite() { From 9ab520494773355c523d14f5eb3892c395377675 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 24 Jun 2019 15:09:28 +0900 Subject: [PATCH 9/9] Make test a bit more sane --- .../TestSceneCatcher.cs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs index e4c01cb668..33f93cdb4a 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatcher.cs @@ -40,15 +40,10 @@ namespace osu.Game.Rulesets.Catch.Tests [BackgroundDependencyLoader] private void load() { - AddStep("show default catcher implementation", () => - { - container.Clear(); - container.Child = new CatcherSprite(); - }); + AddStep("show default catcher implementation", () => { container.Child = new CatcherSprite(); }); AddStep("show custom catcher implementation", () => { - container.Clear(); container.Child = new CatchCustomSkinSourceContainer { Child = new CatcherSprite() @@ -86,13 +81,25 @@ namespace osu.Game.Rulesets.Catch.Tests remove { } } - public Drawable GetDrawableComponent(string componentName) => new CatcherCustomSkin(); + public Drawable GetDrawableComponent(string componentName) + { + switch (componentName) + { + case "Play/Catch/fruit-catcher-idle": + return new CatcherCustomSkin(); + } - public SampleChannel GetSample(string sampleName) => throw new NotImplementedException(); + return null; + } - public Texture GetTexture(string componentName) => throw new NotImplementedException(); + public SampleChannel GetSample(string sampleName) => + throw new NotImplementedException(); - public TValue GetValue(Func query) where TConfiguration : SkinConfiguration => throw new NotImplementedException(); + public Texture GetTexture(string componentName) => + throw new NotImplementedException(); + + public TValue GetValue(Func query) where TConfiguration : SkinConfiguration => + throw new NotImplementedException(); } } }