mirror of
https://github.com/ppy/osu.git
synced 2026-05-28 12:30:42 +08:00
c361e6d3c2
This is a set of model changes which is supposed to facilitate support for custom sample sets to the beatmap editor that is on par with stable. It is the minimal set of changes. Because of this, it can probably be considered "ugly" or however else you want to put it - but before you say that, I want to try and pre-empt that criticism by explaining where the problems lie. Problem #1: duality in sample models --- There is currently a weird duality of what a `HitObject`'s samples will be. - If an object has just been placed in the editor, and not saved / decoded yet, it will use `HitSampleInfo`. - If an object has already been encoded to the beatmap at least once, it will use `ConvertHitObjectParser.LegacyHitSampleInfo`. As long as that state of affairs remains, `HitSampleInfo` must be able to represent anything that `LegacyHitSampleInfo` can, if feature parity is to be achieved. Problem 2: The 0 & 1 sample banks --- Custom sample banks of 2 and above are a pretty clean affair. They map to a suffix on the sample filename, and said samples are allowed to be looked up from the beatmap skin. `Suffix` already exists in `HitSampleInfo`. However, the 1 custom sample bank is evil. It uses *non-suffixed* samples, *allows lookups from the beatmap skins*, contrary to no bank / bank 0, which *also* uses non-suffixed samples, but *doesn't* allow them to be looked up from the beatmap skin. This is why `HitSampleInfo.UseBeatmapSamples` has been called to existence - without it there is no way to represent the ability of using or not using the beatmap skin assets. As has been stated previously in discussions about this feature, it's both a *mapping* and a *skinning* concern. There are many things you could do about either of these problems, but I am pretty sure tackling either one is going to take *many* more lines of code than this commit does. Which is why this is the starting point of negotiation.
106 lines
4.7 KiB
C#
106 lines
4.7 KiB
C#
// 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.
|
|
|
|
using osu.Framework.Audio.Sample;
|
|
using osu.Framework.Bindables;
|
|
using osu.Framework.Extensions.ObjectExtensions;
|
|
using osu.Framework.Graphics;
|
|
using osu.Framework.IO.Stores;
|
|
using osu.Game.Audio;
|
|
using osu.Game.Beatmaps;
|
|
using osu.Game.Beatmaps.Formats;
|
|
using osu.Game.Database;
|
|
using osu.Game.IO;
|
|
using osu.Game.Rulesets.Objects.Types;
|
|
using osuTK.Graphics;
|
|
|
|
namespace osu.Game.Skinning
|
|
{
|
|
public class LegacyBeatmapSkin : LegacySkin
|
|
{
|
|
protected override bool AllowManiaConfigLookups => false;
|
|
protected override bool UseCustomSampleBanks => true;
|
|
|
|
// 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;
|
|
|
|
/// <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>
|
|
public LegacyBeatmapSkin(BeatmapInfo beatmapInfo, IStorageResourceProvider? resources)
|
|
: base(createSkinInfo(beatmapInfo), resources, createRealmBackedStore(beatmapInfo, resources), beatmapInfo.Path.AsNonNull())
|
|
{
|
|
// Disallow default colours fallback on beatmap skins to allow using parent skin combo colours. (via SkinProvidingContainer)
|
|
Configuration.AllowDefaultComboColoursFallback = false;
|
|
}
|
|
|
|
private static IResourceStore<byte[]> createRealmBackedStore(BeatmapInfo beatmapInfo, IStorageResourceProvider? resources)
|
|
{
|
|
if (resources == null || beatmapInfo.BeatmapSet == null)
|
|
// should only ever be used in tests.
|
|
return new ResourceStore<byte[]>();
|
|
|
|
return new RealmBackedResourceStore<BeatmapSetInfo>(beatmapInfo.BeatmapSet.ToLive(resources.RealmAccess), resources.Files, resources.RealmAccess);
|
|
}
|
|
|
|
public override Drawable? GetDrawableComponent(ISkinComponentLookup lookup)
|
|
{
|
|
if (lookup is GlobalSkinnableContainerLookup containerLookup)
|
|
{
|
|
switch (containerLookup.Lookup)
|
|
{
|
|
case GlobalSkinnableContainers.MainHUDComponents:
|
|
// 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;
|
|
}
|
|
}
|
|
|
|
return base.GetDrawableComponent(lookup);
|
|
}
|
|
|
|
public override IBindable<TValue>? GetConfig<TLookup, TValue>(TLookup lookup)
|
|
{
|
|
switch (lookup)
|
|
{
|
|
case SkinConfiguration.LegacySetting s when s == SkinConfiguration.LegacySetting.Version:
|
|
// For lookup simplicity, ignore beatmap-level versioning completely.
|
|
|
|
// 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.
|
|
|
|
LogLookupDebug(this, lookup, LookupDebugType.Miss);
|
|
return null;
|
|
}
|
|
|
|
return base.GetConfig<TLookup, TValue>(lookup);
|
|
}
|
|
|
|
protected override IBindable<Color4>? GetComboColour(IHasComboColours source, int comboIndex, IHasComboInformation combo)
|
|
=> base.GetComboColour(source, combo.ComboIndexWithOffsets, combo);
|
|
|
|
public override ISample? GetSample(ISampleInfo sampleInfo)
|
|
{
|
|
if (sampleInfo is HitSampleInfo hitSampleInfo && !hitSampleInfo.UseBeatmapSamples)
|
|
return null;
|
|
|
|
return base.GetSample(sampleInfo);
|
|
}
|
|
|
|
private static SkinInfo createSkinInfo(BeatmapInfo beatmapInfo) =>
|
|
new SkinInfo
|
|
{
|
|
Name = beatmapInfo.ToString(),
|
|
Creator = beatmapInfo.Metadata.Author.Username
|
|
};
|
|
}
|
|
}
|