Add legacy skin fallback when beatmap skin is providing resources

This commit is contained in:
Dean Herbert 2022-10-12 17:47:20 +09:00
parent fd20515a6d
commit 8bf4ca4b53
6 changed files with 35 additions and 4 deletions

View File

@ -13,6 +13,10 @@ namespace osu.Game.Rulesets.Catch.Skinning.Legacy
{
public class CatchLegacySkinTransformer : LegacySkinTransformer
{
public override bool IsProvidingLegacyResources => base.IsProvidingLegacyResources || hasPear;
private bool hasPear => GetTexture("fruit-pear") != null;
/// <summary>
/// For simplicity, let's use legacy combo font texture existence as a way to identify legacy skins from default.
/// </summary>
@ -49,7 +53,7 @@ public override Drawable GetDrawableComponent(ISkinComponent component)
switch (catchSkinComponent.Component)
{
case CatchSkinComponents.Fruit:
if (GetTexture("fruit-pear") != null)
if (hasPear)
return new LegacyFruitPiece();
return null;

View File

@ -19,6 +19,8 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy
{
public class ManiaLegacySkinTransformer : LegacySkinTransformer
{
public override bool IsProvidingLegacyResources => base.IsProvidingLegacyResources || hasKeyTexture.Value;
/// <summary>
/// Mapping of <see cref="HitResult"/> to their corresponding
/// <see cref="LegacyManiaSkinConfigurationLookups"/> value.

View File

@ -13,6 +13,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
{
public class OsuLegacySkinTransformer : LegacySkinTransformer
{
public override bool IsProvidingLegacyResources => base.IsProvidingLegacyResources || hasHitCircle.Value;
private readonly Lazy<bool> hasHitCircle;
/// <summary>

View File

@ -14,8 +14,13 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
{
public class TaikoLegacySkinTransformer : LegacySkinTransformer
{
public override bool IsProvidingLegacyResources => base.IsProvidingLegacyResources || hasHitCircle || hasBarLeft;
private readonly Lazy<bool> hasExplosion;
private bool hasHitCircle => GetTexture("taikohitcircle") != null;
private bool hasBarLeft => GetTexture("taiko-bar-left") != null;
public TaikoLegacySkinTransformer(ISkin skin)
: base(skin)
{
@ -42,14 +47,14 @@ public TaikoLegacySkinTransformer(ISkin skin)
return null;
case TaikoSkinComponents.InputDrum:
if (GetTexture("taiko-bar-left") != null)
if (hasBarLeft)
return new LegacyInputDrum();
return null;
case TaikoSkinComponents.CentreHit:
case TaikoSkinComponents.RimHit:
if (GetTexture("taikohitcircle") != null)
if (hasHitCircle)
return new LegacyHit(taikoComponent.Component);
return null;

View File

@ -67,9 +67,12 @@ protected override bool AllowSampleLookup(ISampleInfo sampleInfo)
return sampleInfo is StoryboardSampleInfo || beatmapHitsounds.Value;
}
private readonly ISkin skin;
public BeatmapSkinProvidingContainer(ISkin skin)
: base(skin)
{
this.skin = skin;
}
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
@ -84,11 +87,21 @@ protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnl
}
[BackgroundDependencyLoader]
private void load()
private void load(SkinManager skins)
{
beatmapSkins.BindValueChanged(_ => TriggerSourceChanged());
beatmapColours.BindValueChanged(_ => TriggerSourceChanged());
beatmapHitsounds.BindValueChanged(_ => TriggerSourceChanged());
// If the beatmap skin looks to have skinnable resources, add the default classic skin as a fallback opportunity.
if (skin is LegacySkinTransformer legacySkin && legacySkin.IsProvidingLegacyResources)
{
SetSources(new[]
{
skin,
skins.DefaultClassicSkin
});
}
}
}
}

View File

@ -13,6 +13,11 @@ namespace osu.Game.Skinning
/// </summary>
public abstract class LegacySkinTransformer : SkinTransformer
{
/// <summary>
/// Whether the skin being transformed is able to provide legacy resources for the ruleset.
/// </summary>
public virtual bool IsProvidingLegacyResources => this.HasFont(LegacyFont.Combo);
protected LegacySkinTransformer(ISkin skin)
: base(skin)
{