2019-01-24 16:43:03 +08:00
|
|
|
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
|
|
|
// See the LICENCE file in the repository root for full licence text.
|
2018-04-13 17:19:50 +08:00
|
|
|
|
|
2020-04-13 19:00:06 +08:00
|
|
|
|
using osu.Framework.Audio.Sample;
|
2020-04-06 18:36:04 +08:00
|
|
|
|
using osu.Framework.Bindables;
|
2022-03-23 23:24:06 +08:00
|
|
|
|
using osu.Framework.Extensions.ObjectExtensions;
|
2021-05-20 04:01:27 +08:00
|
|
|
|
using osu.Framework.Graphics;
|
2018-03-14 19:45:04 +08:00
|
|
|
|
using osu.Framework.IO.Stores;
|
2020-04-13 19:00:06 +08:00
|
|
|
|
using osu.Game.Audio;
|
2018-03-14 19:45:04 +08:00
|
|
|
|
using osu.Game.Beatmaps;
|
2021-05-05 12:36:30 +08:00
|
|
|
|
using osu.Game.Beatmaps.Formats;
|
2022-03-24 18:09:17 +08:00
|
|
|
|
using osu.Game.Database;
|
2020-12-21 14:14:32 +08:00
|
|
|
|
using osu.Game.IO;
|
2020-04-14 20:33:32 +08:00
|
|
|
|
using osu.Game.Rulesets.Objects.Legacy;
|
2021-05-05 12:36:30 +08:00
|
|
|
|
using osu.Game.Rulesets.Objects.Types;
|
|
|
|
|
using osuTK.Graphics;
|
2018-04-13 17:19:50 +08:00
|
|
|
|
|
2018-03-14 19:45:04 +08:00
|
|
|
|
namespace osu.Game.Skinning
|
|
|
|
|
{
|
2020-09-01 00:29:46 +08:00
|
|
|
|
public class LegacyBeatmapSkin : LegacySkin
|
2018-03-14 19:45:04 +08:00
|
|
|
|
{
|
2023-09-06 17:00:49 +08:00
|
|
|
|
protected override bool AllowManiaConfigLookups => false;
|
2020-07-29 05:52:09 +08:00
|
|
|
|
protected override bool UseCustomSampleBanks => true;
|
2020-03-31 09:14:36 +08:00
|
|
|
|
|
2024-01-17 16:21:56 +08:00
|
|
|
|
// matches stable. references:
|
|
|
|
|
// 1. https://github.com/peppy/osu-stable-reference/blob/dc0994645801010d4b628fff5ff79cd3c286ca83/osu!/Graphics/Textures/TextureManager.cs#L115-L137 (beatmap skin textures lookup)
|
|
|
|
|
// 2. https://github.com/peppy/osu-stable-reference/blob/dc0994645801010d4b628fff5ff79cd3c286ca83/osu!/Graphics/Textures/TextureManager.cs#L158-L196 (user skin textures lookup)
|
|
|
|
|
protected override bool AllowHighResolutionSprites => false;
|
|
|
|
|
|
2022-03-23 12:14:56 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Construct a new legacy beatmap skin instance.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="beatmapInfo">The model for this beatmap.</param>
|
|
|
|
|
/// <param name="resources">Access to raw game resources.</param>
|
2022-03-23 23:24:06 +08:00
|
|
|
|
public LegacyBeatmapSkin(BeatmapInfo beatmapInfo, IStorageResourceProvider? resources)
|
|
|
|
|
: base(createSkinInfo(beatmapInfo), resources, createRealmBackedStore(beatmapInfo, resources), beatmapInfo.Path.AsNonNull())
|
2018-03-14 19:45:04 +08:00
|
|
|
|
{
|
2019-11-07 20:55:34 +08:00
|
|
|
|
// Disallow default colours fallback on beatmap skins to allow using parent skin combo colours. (via SkinProvidingContainer)
|
|
|
|
|
Configuration.AllowDefaultComboColoursFallback = false;
|
2018-03-14 19:45:04 +08:00
|
|
|
|
}
|
2018-04-13 17:19:50 +08:00
|
|
|
|
|
2022-03-23 23:24:06 +08:00
|
|
|
|
private static IResourceStore<byte[]> createRealmBackedStore(BeatmapInfo beatmapInfo, IStorageResourceProvider? resources)
|
2022-03-23 12:14:56 +08:00
|
|
|
|
{
|
2022-03-24 18:09:17 +08:00
|
|
|
|
if (resources == null || beatmapInfo.BeatmapSet == null)
|
2022-03-23 13:31:24 +08:00
|
|
|
|
// should only ever be used in tests.
|
|
|
|
|
return new ResourceStore<byte[]>();
|
2022-03-23 12:14:56 +08:00
|
|
|
|
|
2022-03-24 18:09:17 +08:00
|
|
|
|
return new RealmBackedResourceStore<BeatmapSetInfo>(beatmapInfo.BeatmapSet.ToLive(resources.RealmAccess), resources.Files, resources.RealmAccess);
|
2022-03-23 12:14:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-09 15:04:56 +08:00
|
|
|
|
public override Drawable? GetDrawableComponent(ISkinComponentLookup lookup)
|
2021-05-20 04:01:27 +08:00
|
|
|
|
{
|
2024-08-22 17:39:36 +08:00
|
|
|
|
if (lookup is GlobalSkinnableContainerLookup containerLookup)
|
2021-05-20 04:01:27 +08:00
|
|
|
|
{
|
2024-08-22 18:00:15 +08:00
|
|
|
|
switch (containerLookup.Component)
|
2021-05-20 04:01:27 +08:00
|
|
|
|
{
|
2024-08-22 17:45:44 +08:00
|
|
|
|
case GlobalSkinnableContainers.MainHUDComponents:
|
2021-05-20 04:01:27 +08:00
|
|
|
|
// this should exist in LegacySkin instead, but there isn't a fallback skin for LegacySkins yet.
|
|
|
|
|
// therefore keep the check here until fallback default legacy skin is supported.
|
|
|
|
|
if (!this.HasFont(LegacyFont.Score))
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-09 13:11:41 +08:00
|
|
|
|
return base.GetDrawableComponent(lookup);
|
2021-05-20 04:01:27 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-03-23 23:24:06 +08:00
|
|
|
|
public override IBindable<TValue>? GetConfig<TLookup, TValue>(TLookup lookup)
|
2020-04-06 18:36:04 +08:00
|
|
|
|
{
|
|
|
|
|
switch (lookup)
|
|
|
|
|
{
|
2021-10-22 13:41:59 +08:00
|
|
|
|
case SkinConfiguration.LegacySetting s when s == SkinConfiguration.LegacySetting.Version:
|
2020-05-12 10:08:30 +08:00
|
|
|
|
// For lookup simplicity, ignore beatmap-level versioning completely.
|
2020-04-06 18:36:04 +08:00
|
|
|
|
|
2020-05-12 10:08:30 +08:00
|
|
|
|
// If it is decided that we need this due to beatmaps somehow using it, the default (1.0 specified in LegacySkinDecoder.CreateTemplateObject)
|
|
|
|
|
// needs to be removed else it will cause incorrect skin behaviours. This is due to the config lookup having no context of which skin
|
|
|
|
|
// it should be returning the version for.
|
2023-09-06 16:37:17 +08:00
|
|
|
|
|
2023-11-16 19:16:23 +08:00
|
|
|
|
LogLookupDebug(this, lookup, LookupDebugType.Miss);
|
2020-04-06 18:36:04 +08:00
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.GetConfig<TLookup, TValue>(lookup);
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-23 23:24:06 +08:00
|
|
|
|
protected override IBindable<Color4>? GetComboColour(IHasComboColours source, int comboIndex, IHasComboInformation combo)
|
2021-07-21 16:32:56 +08:00
|
|
|
|
=> base.GetComboColour(source, combo.ComboIndexWithOffsets, combo);
|
2021-05-05 12:36:30 +08:00
|
|
|
|
|
2022-03-23 23:24:06 +08:00
|
|
|
|
public override ISample? GetSample(ISampleInfo sampleInfo)
|
2020-04-13 19:00:06 +08:00
|
|
|
|
{
|
2020-04-14 20:33:32 +08:00
|
|
|
|
if (sampleInfo is ConvertHitObjectParser.LegacyHitSampleInfo legacy && legacy.CustomSampleBank == 0)
|
2020-04-13 19:00:06 +08:00
|
|
|
|
{
|
2020-04-14 20:33:32 +08:00
|
|
|
|
// When no custom sample bank is provided, always fall-back to the default samples.
|
2020-04-13 19:00:06 +08:00
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.GetSample(sampleInfo);
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-02 23:55:29 +08:00
|
|
|
|
private static SkinInfo createSkinInfo(BeatmapInfo beatmapInfo) =>
|
2022-03-23 12:14:56 +08:00
|
|
|
|
new SkinInfo
|
|
|
|
|
{
|
|
|
|
|
Name = beatmapInfo.ToString(),
|
2022-07-16 11:32:25 +08:00
|
|
|
|
Creator = beatmapInfo.Metadata.Author.Username
|
2022-03-23 12:14:56 +08:00
|
|
|
|
};
|
2018-03-14 19:45:04 +08:00
|
|
|
|
}
|
|
|
|
|
}
|