diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs index 2608706264..10b37af957 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableOsuHitObject.cs @@ -58,7 +58,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables base.SkinChanged(skin, allowFallback); if (HitObject is IHasComboInformation combo) - AccentColour = skin.GetValue(s => s.ComboColours.Count > 0 ? s.ComboColours[combo.ComboIndex % s.ComboColours.Count] : Color4.White); + AccentColour = skin.GetValue(s => s.ComboColours.Count > 0 ? s.ComboColours[combo.ComboIndex % s.ComboColours.Count] : (Color4?)null) ?? Color4.White; } protected virtual void UpdatePreemptState() => this.FadeIn(HitObject.TimeFadeIn); diff --git a/osu.Game.Tests/Resources/skin-empty.ini b/osu.Game.Tests/Resources/skin-empty.ini new file mode 100644 index 0000000000..bdc2c4dfcf --- /dev/null +++ b/osu.Game.Tests/Resources/skin-empty.ini @@ -0,0 +1,20 @@ +[General] +Name: test skin +Author: +Version: +AnimationFramerate: +AllowSliderBallTint: +ComboBurstRandom: +CursorCentre: +CursorExpand: +CursorRotate: +CursorTrailRotate: +CustomComboBurstSounds: +HitCircleOverlayAboveNumber: +LayeredHitSounds: +SliderBallFlip: +SliderBallFrames: +SliderStyle: +SpinnerFadePlayfield: +SpinnerFrequencyModulate: +SpinnerNoBlink: \ No newline at end of file diff --git a/osu.Game.Tests/Resources/skin.ini b/osu.Game.Tests/Resources/skin.ini new file mode 100644 index 0000000000..2ae8fcbfc2 --- /dev/null +++ b/osu.Game.Tests/Resources/skin.ini @@ -0,0 +1,26 @@ +[General] +Name: test skin +Author: +Version: +AnimationFramerate: +AllowSliderBallTint: +ComboBurstRandom: +CursorCentre: +CursorExpand: +CursorRotate: +CursorTrailRotate: +CustomComboBurstSounds: +HitCircleOverlayAboveNumber: +LayeredHitSounds: +SliderBallFlip: +SliderBallFrames: +SliderStyle: +SpinnerFadePlayfield: +SpinnerFrequencyModulate: +SpinnerNoBlink: + +[Colours] +Combo1 : 142,199,255 +Combo2 : 255,128,128 +Combo3 : 128,255,255 +Combo7 : 100,100,100,100 \ No newline at end of file diff --git a/osu.Game.Tests/Skins/LegacySkinDecoderTest.cs b/osu.Game.Tests/Skins/LegacySkinDecoderTest.cs new file mode 100644 index 0000000000..2849b49fe5 --- /dev/null +++ b/osu.Game.Tests/Skins/LegacySkinDecoderTest.cs @@ -0,0 +1,44 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Collections.Generic; +using System.IO; +using NUnit.Framework; +using osu.Game.Skinning; +using osu.Game.Tests.Resources; +using osuTK.Graphics; + +namespace osu.Game.Tests.Skins +{ + [TestFixture] + public class SkinFallbackTest + { + [TestCase(true)] + [TestCase(false)] + public void TestDecodeSkinColours(bool hasColours) + { + var decoder = new LegacySkinDecoder(); + using (var resStream = TestResources.OpenResource(hasColours ? "skin.ini" : "skin-empty.ini")) + using (var stream = new StreamReader(resStream)) + { + var comboColors = decoder.Decode(stream).ComboColours; + + List expectedColors; + if (hasColours) + expectedColors = new List + { + new Color4(142, 199, 255, 255), + new Color4(255, 128, 128, 255), + new Color4(128, 255, 255, 255), + new Color4(100, 100, 100, 100), + }; + else + expectedColors = new DefaultSkin().Configuration.ComboColours; + + Assert.AreEqual(expectedColors.Count, comboColors.Count); + for (int i = 0; i < expectedColors.Count; i++) + Assert.AreEqual(expectedColors[i], comboColors[i]); + } + } + } +} diff --git a/osu.Game/Skinning/DefaultSkin.cs b/osu.Game/Skinning/DefaultSkin.cs index 61343b4e62..c7556dddd5 100644 --- a/osu.Game/Skinning/DefaultSkin.cs +++ b/osu.Game/Skinning/DefaultSkin.cs @@ -4,7 +4,6 @@ using osu.Framework.Audio.Sample; using osu.Framework.Graphics; using osu.Framework.Graphics.Textures; -using osuTK.Graphics; namespace osu.Game.Skinning { @@ -13,16 +12,7 @@ namespace osu.Game.Skinning public DefaultSkin() : base(SkinInfo.Default) { - Configuration = new SkinConfiguration - { - ComboColours = - { - new Color4(17, 136, 170, 255), - new Color4(102, 136, 0, 255), - new Color4(204, 102, 0, 255), - new Color4(121, 9, 13, 255) - } - }; + Configuration = new SkinConfiguration(); } public override Drawable GetDrawableComponent(string componentName) => null; diff --git a/osu.Game/Skinning/LocalSkinOverrideContainer.cs b/osu.Game/Skinning/LocalSkinOverrideContainer.cs index 8c172ffbcc..d51c11c5f4 100644 --- a/osu.Game/Skinning/LocalSkinOverrideContainer.cs +++ b/osu.Game/Skinning/LocalSkinOverrideContainer.cs @@ -12,6 +12,9 @@ using osu.Game.Configuration; namespace osu.Game.Skinning { + /// + /// A container which overrides existing skin options with beatmap-local values. + /// public class LocalSkinOverrideContainer : Container, ISkinSource { public event Action SourceChanged; @@ -19,6 +22,14 @@ namespace osu.Game.Skinning private readonly Bindable beatmapSkins = new Bindable(); private readonly Bindable beatmapHitsounds = new Bindable(); + private readonly ISkinSource source; + private ISkinSource fallbackSource; + + public LocalSkinOverrideContainer(ISkinSource source) + { + this.source = source; + } + public Drawable GetDrawableComponent(string componentName) { Drawable sourceDrawable; @@ -53,14 +64,6 @@ namespace osu.Game.Skinning return fallbackSource == null ? default : fallbackSource.GetValue(query); } - private readonly ISkinSource source; - private ISkinSource fallbackSource; - - public LocalSkinOverrideContainer(ISkinSource source) - { - this.source = source; - } - private void onSourceChanged() => SourceChanged?.Invoke(); protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) diff --git a/osu.Game/Skinning/SkinConfiguration.cs b/osu.Game/Skinning/SkinConfiguration.cs index 4d939bd87c..a8091d1f36 100644 --- a/osu.Game/Skinning/SkinConfiguration.cs +++ b/osu.Game/Skinning/SkinConfiguration.cs @@ -11,7 +11,13 @@ namespace osu.Game.Skinning { public readonly SkinInfo SkinInfo = new SkinInfo(); - public List ComboColours { get; set; } = new List(); + public List ComboColours { get; set; } = new List + { + new Color4(17, 136, 170, 255), + new Color4(102, 136, 0, 255), + new Color4(204, 102, 0, 255), + new Color4(121, 9, 13, 255) + }; public Dictionary CustomColours { get; set; } = new Dictionary();