From 235d3046c65d3e65fe924067ad57096537c86a92 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 11 Apr 2020 04:22:23 +0300 Subject: [PATCH 01/98] Move ruleset dependencies caching to its own container --- osu.Game/Rulesets/UI/DrawableRuleset.cs | 93 ++--------- .../UI/DrawableRulesetDependencies.cs | 148 ++++++++++++++++++ 2 files changed, 157 insertions(+), 84 deletions(-) create mode 100644 osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs diff --git a/osu.Game/Rulesets/UI/DrawableRuleset.cs b/osu.Game/Rulesets/UI/DrawableRuleset.cs index 5062c92afe..0a46f5207e 100644 --- a/osu.Game/Rulesets/UI/DrawableRuleset.cs +++ b/osu.Game/Rulesets/UI/DrawableRuleset.cs @@ -11,20 +11,15 @@ using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Drawables; using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading; -using System.Threading.Tasks; using JetBrains.Annotations; -using osu.Framework.Audio; -using osu.Framework.Audio.Sample; using osu.Framework.Audio.Track; using osu.Framework.Bindables; using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Textures; using osu.Framework.Input; using osu.Framework.Input.Events; -using osu.Framework.IO.Stores; using osu.Game.Configuration; using osu.Game.Graphics.Cursor; using osu.Game.Input.Handlers; @@ -113,6 +108,8 @@ namespace osu.Game.Rulesets.UI private OnScreenDisplay onScreenDisplay; + private DrawableRulesetDependencies dependencies; + /// /// Creates a ruleset visualisation for the provided ruleset and beatmap. /// @@ -147,30 +144,15 @@ namespace osu.Game.Rulesets.UI protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) { - var dependencies = new DependencyContainer(base.CreateChildDependencies(parent)); + dependencies = new DrawableRulesetDependencies(Ruleset, base.CreateChildDependencies(parent)); - var resources = Ruleset.CreateResourceStore(); - - if (resources != null) - { - textureStore = new TextureStore(new TextureLoaderStore(new NamespacedResourceStore(resources, "Textures"))); - textureStore.AddStore(dependencies.Get()); - dependencies.Cache(textureStore); - - localSampleStore = dependencies.Get().GetSampleStore(new NamespacedResourceStore(resources, "Samples")); - localSampleStore.PlaybackConcurrency = OsuGameBase.SAMPLE_CONCURRENCY; - dependencies.CacheAs(new FallbackSampleStore(localSampleStore, dependencies.Get())); - } + textureStore = dependencies.TextureStore; + localSampleStore = dependencies.SampleStore; + Config = dependencies.RulesetConfigManager; onScreenDisplay = dependencies.Get(); - - Config = dependencies.Get().GetConfigFor(Ruleset); - if (Config != null) - { - dependencies.Cache(Config); onScreenDisplay?.BeginTracking(this, Config); - } return dependencies; } @@ -362,13 +344,14 @@ namespace osu.Game.Rulesets.UI { base.Dispose(isDisposing); - localSampleStore?.Dispose(); - if (Config != null) { onScreenDisplay?.StopTracking(this, Config); Config = null; } + + // Dispose the components created by this dependency container. + dependencies.Dispose(); } } @@ -519,62 +502,4 @@ namespace osu.Game.Rulesets.UI { } } - - /// - /// A sample store which adds a fallback source. - /// - /// - /// This is a temporary implementation to workaround ISampleStore limitations. - /// - public class FallbackSampleStore : ISampleStore - { - private readonly ISampleStore primary; - private readonly ISampleStore secondary; - - public FallbackSampleStore(ISampleStore primary, ISampleStore secondary) - { - this.primary = primary; - this.secondary = secondary; - } - - public SampleChannel Get(string name) => primary.Get(name) ?? secondary.Get(name); - - public Task GetAsync(string name) => primary.GetAsync(name) ?? secondary.GetAsync(name); - - public Stream GetStream(string name) => primary.GetStream(name) ?? secondary.GetStream(name); - - public IEnumerable GetAvailableResources() => throw new NotSupportedException(); - - public void AddAdjustment(AdjustableProperty type, BindableNumber adjustBindable) => throw new NotSupportedException(); - - public void RemoveAdjustment(AdjustableProperty type, BindableNumber adjustBindable) => throw new NotSupportedException(); - - public BindableNumber Volume => throw new NotSupportedException(); - - public BindableNumber Balance => throw new NotSupportedException(); - - public BindableNumber Frequency => throw new NotSupportedException(); - - public BindableNumber Tempo => throw new NotSupportedException(); - - public IBindable GetAggregate(AdjustableProperty type) => throw new NotSupportedException(); - - public IBindable AggregateVolume => throw new NotSupportedException(); - - public IBindable AggregateBalance => throw new NotSupportedException(); - - public IBindable AggregateFrequency => throw new NotSupportedException(); - - public IBindable AggregateTempo => throw new NotSupportedException(); - - public int PlaybackConcurrency - { - get => throw new NotSupportedException(); - set => throw new NotSupportedException(); - } - - public void Dispose() - { - } - } } diff --git a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs new file mode 100644 index 0000000000..33b340a974 --- /dev/null +++ b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs @@ -0,0 +1,148 @@ +// 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 System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using osu.Framework.Allocation; +using osu.Framework.Audio; +using osu.Framework.Audio.Sample; +using osu.Framework.Audio.Track; +using osu.Framework.Bindables; +using osu.Framework.Graphics.Textures; +using osu.Framework.IO.Stores; +using osu.Game.Rulesets.Configuration; + +namespace osu.Game.Rulesets.UI +{ + public class DrawableRulesetDependencies : DependencyContainer, IDisposable + { + /// + /// The texture store to be used for the ruleset. + /// + public TextureStore TextureStore { get; private set; } + + /// + /// The sample store to be used for the ruleset. + /// + /// + /// This is the local sample store pointing to the ruleset sample resources, + /// the cached sample store () retrieves from + /// this store and falls back to the parent store if this store doesn't have the requested sample. + /// + public ISampleStore SampleStore { get; private set; } + + /// + /// The ruleset config manager. + /// + public IRulesetConfigManager RulesetConfigManager { get; private set; } + + public DrawableRulesetDependencies(Ruleset ruleset, IReadOnlyDependencyContainer parent) + : base(parent) + { + var resources = ruleset.CreateResourceStore(); + + if (resources != null) + { + TextureStore = new TextureStore(new TextureLoaderStore(new NamespacedResourceStore(resources, @"Textures"))); + TextureStore.AddStore(parent.Get()); + Cache(TextureStore); + + SampleStore = parent.Get().GetSampleStore(new NamespacedResourceStore(resources, @"Samples")); + SampleStore.PlaybackConcurrency = OsuGameBase.SAMPLE_CONCURRENCY; + CacheAs(new FallbackSampleStore(SampleStore, parent.Get())); + } + + RulesetConfigManager = parent.Get().GetConfigFor(ruleset); + if (RulesetConfigManager != null) + Cache(RulesetConfigManager); + } + + #region Disposal + + ~DrawableRulesetDependencies() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private bool isDisposed; + + protected void Dispose(bool disposing) + { + if (isDisposed) + return; + + isDisposed = true; + + SampleStore?.Dispose(); + RulesetConfigManager = null; + } + + #endregion + } + + /// + /// A sample store which adds a fallback source. + /// + /// + /// This is a temporary implementation to workaround ISampleStore limitations. + /// + public class FallbackSampleStore : ISampleStore + { + private readonly ISampleStore primary; + private readonly ISampleStore secondary; + + public FallbackSampleStore(ISampleStore primary, ISampleStore secondary) + { + this.primary = primary; + this.secondary = secondary; + } + + public SampleChannel Get(string name) => primary.Get(name) ?? secondary.Get(name); + + public Task GetAsync(string name) => primary.GetAsync(name) ?? secondary.GetAsync(name); + + public Stream GetStream(string name) => primary.GetStream(name) ?? secondary.GetStream(name); + + public IEnumerable GetAvailableResources() => throw new NotSupportedException(); + + public void AddAdjustment(AdjustableProperty type, BindableNumber adjustBindable) => throw new NotSupportedException(); + + public void RemoveAdjustment(AdjustableProperty type, BindableNumber adjustBindable) => throw new NotSupportedException(); + + public BindableNumber Volume => throw new NotSupportedException(); + + public BindableNumber Balance => throw new NotSupportedException(); + + public BindableNumber Frequency => throw new NotSupportedException(); + + public BindableNumber Tempo => throw new NotSupportedException(); + + public IBindable GetAggregate(AdjustableProperty type) => throw new NotSupportedException(); + + public IBindable AggregateVolume => throw new NotSupportedException(); + + public IBindable AggregateBalance => throw new NotSupportedException(); + + public IBindable AggregateFrequency => throw new NotSupportedException(); + + public IBindable AggregateTempo => throw new NotSupportedException(); + + public int PlaybackConcurrency + { + get => throw new NotSupportedException(); + set => throw new NotSupportedException(); + } + + public void Dispose() + { + } + } +} From 2b4208bebfa4e81894d7a9a107701f474478325b Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 11 Apr 2020 04:23:31 +0300 Subject: [PATCH 02/98] Cache ruleset dependencies if the scene tests ruleset-specific components --- .../Rulesets/Testing/IRulesetTestScene.cs | 20 +++++++++++++++++++ osu.Game/Tests/Visual/OsuTestScene.cs | 13 +++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 osu.Game/Rulesets/Testing/IRulesetTestScene.cs diff --git a/osu.Game/Rulesets/Testing/IRulesetTestScene.cs b/osu.Game/Rulesets/Testing/IRulesetTestScene.cs new file mode 100644 index 0000000000..e8b8a79eb5 --- /dev/null +++ b/osu.Game/Rulesets/Testing/IRulesetTestScene.cs @@ -0,0 +1,20 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +namespace osu.Game.Rulesets.Testing +{ + /// + /// An interface that can be assigned to test scenes to indicate + /// that the test scene is testing ruleset-specific components. + /// This is to cache required ruleset dependencies for the components. + /// + public interface IRulesetTestScene + { + /// + /// Retrieves the ruleset that is going + /// to be tested by this test scene. + /// + /// The . + Ruleset CreateRuleset(); + } +} diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index d1d8059cb1..eb1905cbe1 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -20,6 +20,8 @@ using osu.Game.Database; using osu.Game.Online.API; using osu.Game.Rulesets; using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Testing; +using osu.Game.Rulesets.UI; using osu.Game.Screens; using osu.Game.Storyboards; using osu.Game.Tests.Beatmaps; @@ -36,6 +38,8 @@ namespace osu.Game.Tests.Visual protected new OsuScreenDependencies Dependencies { get; private set; } + private DrawableRulesetDependencies rulesetDependencies; + private Lazy localStorage; protected Storage LocalStorage => localStorage.Value; @@ -64,7 +68,12 @@ namespace osu.Game.Tests.Visual protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) { - Dependencies = new OsuScreenDependencies(false, base.CreateChildDependencies(parent)); + var baseDependencies = base.CreateChildDependencies(parent); + + if (this is IRulesetTestScene rts) + baseDependencies = rulesetDependencies = new DrawableRulesetDependencies(rts.CreateRuleset(), baseDependencies); + + Dependencies = new OsuScreenDependencies(false, baseDependencies); Beatmap = Dependencies.Beatmap; Beatmap.SetDefault(); @@ -142,6 +151,8 @@ namespace osu.Game.Tests.Visual { base.Dispose(isDisposing); + rulesetDependencies?.Dispose(); + if (Beatmap?.Value.TrackLoaded == true) Beatmap.Value.Track.Stop(); From e10c973aa69b8b59df985c35debac260647b3845 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 11 Apr 2020 04:24:34 +0300 Subject: [PATCH 03/98] Add test cases for behaviour of ruleset dependencies caching on tests --- .../Gameplay/TestSceneStoryboardSamples.cs | 6 +- .../Resources/{ => Samples}/test-sample.mp3 | Bin .../Resources/Textures/test-image.png | Bin 0 -> 4852 bytes .../Testing/TestSceneRulesetTestScene.cs | 80 ++++++++++++++++++ 4 files changed, 83 insertions(+), 3 deletions(-) rename osu.Game.Tests/Resources/{ => Samples}/test-sample.mp3 (100%) create mode 100644 osu.Game.Tests/Resources/Textures/test-image.png create mode 100644 osu.Game.Tests/Testing/TestSceneRulesetTestScene.cs diff --git a/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs b/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs index 84506739ab..8adf6064f5 100644 --- a/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs +++ b/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs @@ -60,11 +60,11 @@ namespace osu.Game.Tests.Gameplay this.resourceName = resourceName; } - public byte[] Get(string name) => name == resourceName ? TestResources.GetStore().Get("Resources/test-sample.mp3") : null; + public byte[] Get(string name) => name == resourceName ? TestResources.GetStore().Get("Resources/Samples/test-sample.mp3") : null; - public Task GetAsync(string name) => name == resourceName ? TestResources.GetStore().GetAsync("Resources/test-sample.mp3") : null; + public Task GetAsync(string name) => name == resourceName ? TestResources.GetStore().GetAsync("Resources/Samples/test-sample.mp3") : null; - public Stream GetStream(string name) => name == resourceName ? TestResources.GetStore().GetStream("Resources/test-sample.mp3") : null; + public Stream GetStream(string name) => name == resourceName ? TestResources.GetStore().GetStream("Resources/Samples/test-sample.mp3") : null; public IEnumerable GetAvailableResources() => new[] { resourceName }; diff --git a/osu.Game.Tests/Resources/test-sample.mp3 b/osu.Game.Tests/Resources/Samples/test-sample.mp3 similarity index 100% rename from osu.Game.Tests/Resources/test-sample.mp3 rename to osu.Game.Tests/Resources/Samples/test-sample.mp3 diff --git a/osu.Game.Tests/Resources/Textures/test-image.png b/osu.Game.Tests/Resources/Textures/test-image.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0092edc89e6cb91a46c1dacba724642e3d880d GIT binary patch literal 4852 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 mkLc+&yII5jkHf{w{y_mZ|9^*. Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System; +using System.Collections.Generic; +using NUnit.Framework; +using osu.Framework.Allocation; +using osu.Framework.Audio.Track; +using osu.Framework.Configuration.Tracking; +using osu.Framework.Graphics.Textures; +using osu.Framework.IO.Stores; +using osu.Game.Beatmaps; +using osu.Game.Configuration; +using osu.Game.Rulesets; +using osu.Game.Rulesets.Configuration; +using osu.Game.Rulesets.Difficulty; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Testing; +using osu.Game.Rulesets.UI; +using osu.Game.Tests.Resources; +using osu.Game.Tests.Visual; + +namespace osu.Game.Tests.Testing +{ + public class TestSceneRulesetTestScene : OsuTestScene, IRulesetTestScene + { + [Test] + public void TestRetrieveTexture() + { + AddAssert("ruleset texture retrieved", () => + Dependencies.Get().Get(@"test-image") != null); + } + + [Test] + public void TestRetrieveSample() + { + AddAssert("ruleset sample retrieved", () => + Dependencies.Get().Get(@"test-sample") != null); + } + + [Test] + public void TestResolveConfigManager() + { + AddAssert("ruleset config resolved", () => + Dependencies.Get() != null); + } + + public Ruleset CreateRuleset() => new TestRuleset(); + + private class TestRuleset : Ruleset + { + public override string Description => string.Empty; + public override string ShortName => string.Empty; + + public TestRuleset() + { + // temporary ID to let RulesetConfigCache pass our + // config manager to the ruleset dependencies. + RulesetInfo.ID = -1; + } + + public override IResourceStore CreateResourceStore() => new NamespacedResourceStore(TestResources.GetStore(), @"Resources"); + public override IRulesetConfigManager CreateConfig(SettingsStore settings) => new TestRulesetConfigManager(); + + public override IEnumerable GetModsFor(ModType type) => throw new NotImplementedException(); + public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => throw new NotImplementedException(); + public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => throw new NotImplementedException(); + public override DifficultyCalculator CreateDifficultyCalculator(WorkingBeatmap beatmap) => throw new NotImplementedException(); + } + + private class TestRulesetConfigManager : IRulesetConfigManager + { + public void Load() => throw new NotImplementedException(); + public bool Save() => throw new NotImplementedException(); + public TrackedSettings CreateTrackedSettings() => throw new NotImplementedException(); + public void LoadInto(TrackedSettings settings) => throw new NotImplementedException(); + public void Dispose() => throw new NotImplementedException(); + } + } +} From a314a6119a9461155fdb083976f45121c704d796 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 11 Apr 2020 05:13:04 +0300 Subject: [PATCH 04/98] Fix CI issues --- osu.Game/Rulesets/UI/DrawableRuleset.cs | 8 -------- osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/osu.Game/Rulesets/UI/DrawableRuleset.cs b/osu.Game/Rulesets/UI/DrawableRuleset.cs index 0a46f5207e..265c6a7319 100644 --- a/osu.Game/Rulesets/UI/DrawableRuleset.cs +++ b/osu.Game/Rulesets/UI/DrawableRuleset.cs @@ -14,10 +14,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using JetBrains.Annotations; -using osu.Framework.Audio.Track; using osu.Framework.Bindables; using osu.Framework.Graphics.Cursor; -using osu.Framework.Graphics.Textures; using osu.Framework.Input; using osu.Framework.Input.Events; using osu.Game.Configuration; @@ -58,10 +56,6 @@ namespace osu.Game.Rulesets.UI private readonly Lazy playfield; - private TextureStore textureStore; - - private ISampleStore localSampleStore; - /// /// The playfield. /// @@ -146,8 +140,6 @@ namespace osu.Game.Rulesets.UI { dependencies = new DrawableRulesetDependencies(Ruleset, base.CreateChildDependencies(parent)); - textureStore = dependencies.TextureStore; - localSampleStore = dependencies.SampleStore; Config = dependencies.RulesetConfigManager; onScreenDisplay = dependencies.Get(); diff --git a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs index 33b340a974..168e937256 100644 --- a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs +++ b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs @@ -21,7 +21,7 @@ namespace osu.Game.Rulesets.UI /// /// The texture store to be used for the ruleset. /// - public TextureStore TextureStore { get; private set; } + public TextureStore TextureStore { get; } /// /// The sample store to be used for the ruleset. @@ -31,7 +31,7 @@ namespace osu.Game.Rulesets.UI /// the cached sample store () retrieves from /// this store and falls back to the parent store if this store doesn't have the requested sample. /// - public ISampleStore SampleStore { get; private set; } + public ISampleStore SampleStore { get; } /// /// The ruleset config manager. From 97340da2f296eb1d88ac70c7addfb5cf2dd76a23 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sun, 12 Apr 2020 02:24:36 +0300 Subject: [PATCH 05/98] Add null-conditional to acesses in dispose methods Such a terrible mistake, the finalizer may be called while the dependencies have an instance but the local itself doesn't have a value yet. --- osu.Game/Rulesets/UI/DrawableRuleset.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/UI/DrawableRuleset.cs b/osu.Game/Rulesets/UI/DrawableRuleset.cs index 265c6a7319..06f8715929 100644 --- a/osu.Game/Rulesets/UI/DrawableRuleset.cs +++ b/osu.Game/Rulesets/UI/DrawableRuleset.cs @@ -343,7 +343,7 @@ namespace osu.Game.Rulesets.UI } // Dispose the components created by this dependency container. - dependencies.Dispose(); + dependencies?.Dispose(); } } From 67bd7bfa3905aa96f21f2225a517e2e369e80540 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 17 Apr 2020 06:17:15 +0300 Subject: [PATCH 06/98] Add `CreateRuleset` in OsuTestScene for scenes that depend on it --- osu.Game/Tests/Visual/OsuTestScene.cs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index 5dc8714c07..8058a074ef 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -70,7 +70,18 @@ namespace osu.Game.Tests.Visual Beatmap.SetDefault(); Ruleset = Dependencies.Ruleset; - Ruleset.SetDefault(); + + var definedRuleset = CreateRuleset()?.RulesetInfo; + + if (definedRuleset != null) + { + // Set global ruleset bindable to the ruleset defined + // for this test scene and disallow changing it. + Ruleset.Value = definedRuleset; + Ruleset.Disabled = true; + } + else + Ruleset.SetDefault(); SelectedMods = Dependencies.Mods; SelectedMods.SetDefault(); @@ -124,6 +135,14 @@ namespace osu.Game.Tests.Visual [Resolved] protected AudioManager Audio { get; private set; } + /// + /// Creates the ruleset to be used for this test scene. + /// + /// + /// When testing against ruleset-specific components, this method must be overriden to their ruleset. + /// + protected virtual Ruleset CreateRuleset() => null; + protected virtual IBeatmap CreateBeatmap(RulesetInfo ruleset) => new TestBeatmap(ruleset); protected WorkingBeatmap CreateWorkingBeatmap(RulesetInfo ruleset) => @@ -135,7 +154,8 @@ namespace osu.Game.Tests.Visual [BackgroundDependencyLoader] private void load(RulesetStore rulesets) { - Ruleset.Value = rulesets.AvailableRulesets.First(); + if (!Ruleset.Disabled) + Ruleset.Value = rulesets.AvailableRulesets.First(); } protected override void Dispose(bool isDisposing) From 5fa6bcb5a3f73b080873f48ee34a7dcec0a9da58 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 17 Apr 2020 11:17:14 +0300 Subject: [PATCH 07/98] Move `SkinnableTestScene` into using the global `CreateRuleset` method --- .../CatchSkinnableTestScene.cs | 2 +- .../Skinning/ManiaSkinnableTestScene.cs | 4 ++-- .../OsuSkinnableTestScene.cs | 2 +- .../TaikoSkinnableTestScene.cs | 2 +- osu.Game/Tests/Visual/SkinnableTestScene.cs | 13 ++++++++----- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs b/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs index 0c46b078b5..c0060af74a 100644 --- a/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Catch.Tests typeof(CatchLegacySkinTransformer), }; - protected override Ruleset CreateRulesetForSkinProvider() => new CatchRuleset(); + protected override Ruleset CreateRuleset() => new CatchRuleset(); } } diff --git a/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs b/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs index a3c1d518c5..f41ba4db42 100644 --- a/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs @@ -34,8 +34,6 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning typeof(ManiaSettingsSubsection) }; - protected override Ruleset CreateRulesetForSkinProvider() => new ManiaRuleset(); - protected ManiaSkinnableTestScene() { scrollingInfo.Direction.Value = ScrollingDirection.Down; @@ -60,6 +58,8 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning AddStep("change direction to up", () => scrollingInfo.Direction.Value = ScrollingDirection.Up); } + protected override Ruleset CreateRuleset() => new ManiaRuleset(); + private class TestScrollingInfo : IScrollingInfo { public readonly Bindable Direction = new Bindable(); diff --git a/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs b/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs index 90ebbd9f04..1458270193 100644 --- a/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Osu.Tests typeof(OsuLegacySkinTransformer), }; - protected override Ruleset CreateRulesetForSkinProvider() => new OsuRuleset(); + protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs b/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs index 6db2a6907f..98e6c2ec52 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Taiko.Tests typeof(TaikoLegacySkinTransformer), }; - protected override Ruleset CreateRulesetForSkinProvider() => new TaikoRuleset(); + protected override Ruleset CreateRuleset() => new TaikoRuleset(); } } diff --git a/osu.Game/Tests/Visual/SkinnableTestScene.cs b/osu.Game/Tests/Visual/SkinnableTestScene.cs index ace24c0d7e..d648afd504 100644 --- a/osu.Game/Tests/Visual/SkinnableTestScene.cs +++ b/osu.Game/Tests/Visual/SkinnableTestScene.cs @@ -13,7 +13,6 @@ using osu.Framework.Graphics.Textures; using osu.Framework.IO.Stores; using osu.Game.Beatmaps; using osu.Game.Graphics.Sprites; -using osu.Game.Rulesets; using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -30,11 +29,15 @@ namespace osu.Game.Tests.Visual protected SkinnableTestScene() : base(2, 3) { + // avoid running silently incorrectly. + if (CreateRuleset() == null) + { + throw new InvalidOperationException( + $"No ruleset provided, override {nameof(CreateRuleset)} to the ruleset belonging to the skinnable content." + + "This is required to add the legacy skin transformer for the content to behave as expected."); + } } - // Required to be part of the per-ruleset implementation to construct the newer version of the Ruleset. - protected abstract Ruleset CreateRulesetForSkinProvider(); - [BackgroundDependencyLoader] private void load(AudioManager audio, SkinManager skinManager) { @@ -107,7 +110,7 @@ namespace osu.Game.Tests.Visual { new OutlineBox { Alpha = autoSize ? 1 : 0 }, mainProvider.WithChild( - new SkinProvidingContainer(CreateRulesetForSkinProvider().CreateLegacySkinProvider(mainProvider, beatmap)) + new SkinProvidingContainer(Ruleset.Value.CreateInstance().CreateLegacySkinProvider(mainProvider, beatmap)) { Child = created, RelativeSizeAxes = !autoSize ? Axes.Both : Axes.None, From 92df4e3a9eb8ad56c6da99b088d0159a419c8110 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 17 Apr 2020 10:32:12 +0300 Subject: [PATCH 08/98] Remove `PlayerTestScene` constructor and use `CreateRuleset` method instead --- .../TestSceneAutoJuiceStream.cs | 7 +------ .../TestSceneBananaShower.cs | 8 +------ .../TestSceneCatchPlayer.cs | 10 ++++++--- .../TestSceneCatchStacker.cs | 8 +------ .../TestSceneHyperDash.cs | 8 +------ .../TestSceneJuiceStream.cs | 8 +------ .../TestSceneManiaPlayer.cs | 19 +++++++++++++++++ .../TestScenePlayer.cs | 15 ------------- .../TestSceneHitCircleLongCombo.cs | 8 +------ .../TestSceneOsuPlayer.cs | 10 ++++++--- .../TestSceneSkinFallbacks.cs | 3 +-- .../TestSceneSwellJudgements.cs | 8 +------ .../TestSceneTaikoPlayer.cs | 19 +++++++++++++++++ .../TestSceneTaikoSuddenDeath.cs | 7 +------ .../Gameplay/TestSceneHitObjectSamples.cs | 10 ++------- .../Visual/Gameplay/TestPlayerTestScene.cs | 16 ++++++++++++++ .../Gameplay/TestSceneGameplayRewinding.cs | 8 +------ .../Visual/Gameplay/TestScenePause.cs | 4 +--- .../Gameplay/TestScenePauseWhenInactive.cs | 8 +------ osu.Game/Tests/Visual/PlayerTestScene.cs | 21 +++++++------------ 20 files changed, 89 insertions(+), 116 deletions(-) create mode 100644 osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs delete mode 100644 osu.Game.Rulesets.Mania.Tests/TestScenePlayer.cs create mode 100644 osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs create mode 100644 osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneAutoJuiceStream.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneAutoJuiceStream.cs index ed7bfb9a44..7c2304694f 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneAutoJuiceStream.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneAutoJuiceStream.cs @@ -12,13 +12,8 @@ using osuTK; namespace osu.Game.Rulesets.Catch.Tests { - public class TestSceneAutoJuiceStream : PlayerTestScene + public class TestSceneAutoJuiceStream : TestSceneCatchPlayer { - public TestSceneAutoJuiceStream() - : base(new CatchRuleset()) - { - } - protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) { var beatmap = new Beatmap diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneBananaShower.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneBananaShower.cs index 024c4cefb0..56f94e609f 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneBananaShower.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneBananaShower.cs @@ -8,12 +8,11 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Catch.Objects; using osu.Game.Rulesets.Catch.Objects.Drawables; using osu.Game.Rulesets.Catch.UI; -using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Catch.Tests { [TestFixture] - public class TestSceneBananaShower : PlayerTestScene + public class TestSceneBananaShower : TestSceneCatchPlayer { public override IReadOnlyList RequiredTypes => new[] { @@ -26,11 +25,6 @@ namespace osu.Game.Rulesets.Catch.Tests typeof(DrawableCatchRuleset), }; - public TestSceneBananaShower() - : base(new CatchRuleset()) - { - } - [Test] public void TestBananaShower() { diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs index 9836a7811a..722f3b5a3b 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs @@ -1,6 +1,8 @@ // 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 System.Collections.Generic; using NUnit.Framework; using osu.Game.Tests.Visual; @@ -9,9 +11,11 @@ namespace osu.Game.Rulesets.Catch.Tests [TestFixture] public class TestSceneCatchPlayer : PlayerTestScene { - public TestSceneCatchPlayer() - : base(new CatchRuleset()) + public override IReadOnlyList RequiredTypes => new[] { - } + typeof(CatchRuleset), + }; + + protected override Ruleset CreateRuleset() => new CatchRuleset(); } } diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchStacker.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchStacker.cs index 9ce46ad6ba..44672b6526 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchStacker.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchStacker.cs @@ -4,18 +4,12 @@ using NUnit.Framework; using osu.Game.Beatmaps; using osu.Game.Rulesets.Catch.Objects; -using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Catch.Tests { [TestFixture] - public class TestSceneCatchStacker : PlayerTestScene + public class TestSceneCatchStacker : TestSceneCatchPlayer { - public TestSceneCatchStacker() - : base(new CatchRuleset()) - { - } - protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) { var beatmap = new Beatmap diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs index 49ff9df4d7..75b8b68c14 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs @@ -10,24 +10,18 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Catch.Objects; using osu.Game.Rulesets.Catch.UI; using osu.Game.Rulesets.Objects; -using osu.Game.Tests.Visual; using osuTK; namespace osu.Game.Rulesets.Catch.Tests { [TestFixture] - public class TestSceneHyperDash : PlayerTestScene + public class TestSceneHyperDash : TestSceneCatchPlayer { public override IReadOnlyList RequiredTypes => new[] { typeof(CatcherArea), }; - public TestSceneHyperDash() - : base(new CatchRuleset()) - { - } - protected override bool Autoplay => true; [Test] diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneJuiceStream.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneJuiceStream.cs index cbc87459e1..ffcf61a4bf 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneJuiceStream.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneJuiceStream.cs @@ -7,18 +7,12 @@ using osu.Game.Beatmaps; using osu.Game.Rulesets.Catch.Objects; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; -using osu.Game.Tests.Visual; using osuTK; namespace osu.Game.Rulesets.Catch.Tests { - public class TestSceneJuiceStream : PlayerTestScene + public class TestSceneJuiceStream : TestSceneCatchPlayer { - public TestSceneJuiceStream() - : base(new CatchRuleset()) - { - } - [Test] public void TestJuiceStreamEndingCombo() { diff --git a/osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs b/osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs new file mode 100644 index 0000000000..11663605e2 --- /dev/null +++ b/osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs @@ -0,0 +1,19 @@ +// 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 System.Collections.Generic; +using osu.Game.Tests.Visual; + +namespace osu.Game.Rulesets.Mania.Tests +{ + public class TestSceneManiaPlayer : PlayerTestScene + { + public override IReadOnlyList RequiredTypes => new[] + { + typeof(ManiaRuleset), + }; + + protected override Ruleset CreateRuleset() => new ManiaRuleset(); + } +} diff --git a/osu.Game.Rulesets.Mania.Tests/TestScenePlayer.cs b/osu.Game.Rulesets.Mania.Tests/TestScenePlayer.cs deleted file mode 100644 index cd25d162d0..0000000000 --- a/osu.Game.Rulesets.Mania.Tests/TestScenePlayer.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -using osu.Game.Tests.Visual; - -namespace osu.Game.Rulesets.Mania.Tests -{ - public class TestScenePlayer : PlayerTestScene - { - public TestScenePlayer() - : base(new ManiaRuleset()) - { - } - } -} diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLongCombo.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLongCombo.cs index b99cd523ff..8cf29ddfbf 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLongCombo.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneHitCircleLongCombo.cs @@ -4,19 +4,13 @@ using NUnit.Framework; using osu.Game.Beatmaps; using osu.Game.Rulesets.Osu.Objects; -using osu.Game.Tests.Visual; using osuTK; namespace osu.Game.Rulesets.Osu.Tests { [TestFixture] - public class TestSceneHitCircleLongCombo : PlayerTestScene + public class TestSceneHitCircleLongCombo : TestSceneOsuPlayer { - public TestSceneHitCircleLongCombo() - : base(new OsuRuleset()) - { - } - protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) { var beatmap = new Beatmap diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs index 0a33b09ba8..102f8bf841 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs @@ -1,6 +1,8 @@ // 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 System.Collections.Generic; using NUnit.Framework; using osu.Game.Tests.Visual; @@ -9,9 +11,11 @@ namespace osu.Game.Rulesets.Osu.Tests [TestFixture] public class TestSceneOsuPlayer : PlayerTestScene { - public TestSceneOsuPlayer() - : base(new OsuRuleset()) + public override IReadOnlyList RequiredTypes => new[] { - } + typeof(OsuRuleset), + }; + + protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs index d39e24fc1f..b357e20ee8 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneSkinFallbacks.cs @@ -25,13 +25,12 @@ using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Osu.Tests { [TestFixture] - public class TestSceneSkinFallbacks : PlayerTestScene + public class TestSceneSkinFallbacks : TestSceneOsuPlayer { private readonly TestSource testUserSkin; private readonly TestSource testBeatmapSkin; public TestSceneSkinFallbacks() - : base(new OsuRuleset()) { testUserSkin = new TestSource("user"); testBeatmapSkin = new TestSource("beatmap"); diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneSwellJudgements.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneSwellJudgements.cs index 303f0163b1..965cde0f3f 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TestSceneSwellJudgements.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneSwellJudgements.cs @@ -5,17 +5,11 @@ using System.Linq; using NUnit.Framework; using osu.Game.Beatmaps; using osu.Game.Rulesets.Taiko.Objects; -using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Taiko.Tests { - public class TestSceneSwellJudgements : PlayerTestScene + public class TestSceneSwellJudgements : TestSceneTaikoPlayer { - public TestSceneSwellJudgements() - : base(new TaikoRuleset()) - { - } - [Test] public void TestZeroTickTimeOffsets() { diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs new file mode 100644 index 0000000000..4c5ab7eabf --- /dev/null +++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs @@ -0,0 +1,19 @@ +// 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 System.Collections.Generic; +using osu.Game.Tests.Visual; + +namespace osu.Game.Rulesets.Taiko.Tests +{ + public class TestSceneTaikoPlayer : PlayerTestScene + { + public override IReadOnlyList RequiredTypes => new[] + { + typeof(TaikoRuleset) + }; + + protected override Ruleset CreateRuleset() => new TaikoRuleset(); + } +} diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs index 2ab041e191..aaa634648a 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoSuddenDeath.cs @@ -11,13 +11,8 @@ using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Taiko.Tests { - public class TestSceneTaikoSuddenDeath : PlayerTestScene + public class TestSceneTaikoSuddenDeath : TestSceneTaikoPlayer { - public TestSceneTaikoSuddenDeath() - : base(new TaikoRuleset()) - { - } - protected override bool AllowFail => true; protected override TestPlayer CreatePlayer(Ruleset ruleset) diff --git a/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs b/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs index f611f2717e..7d3d8b7f16 100644 --- a/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs +++ b/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs @@ -16,17 +16,16 @@ using osu.Game.Beatmaps; using osu.Game.Beatmaps.Formats; using osu.Game.IO; using osu.Game.Rulesets; -using osu.Game.Rulesets.Osu; using osu.Game.Skinning; using osu.Game.Storyboards; using osu.Game.Tests.Resources; -using osu.Game.Tests.Visual; +using osu.Game.Tests.Visual.Gameplay; using osu.Game.Users; namespace osu.Game.Tests.Gameplay { [HeadlessTest] - public class TestSceneHitObjectSamples : PlayerTestScene + public class TestSceneHitObjectSamples : TestPlayerTestScene { private readonly SkinInfo userSkinInfo = new SkinInfo(); @@ -44,11 +43,6 @@ namespace osu.Game.Tests.Gameplay protected override bool HasCustomSteps => true; - public TestSceneHitObjectSamples() - : base(new OsuRuleset()) - { - } - private SkinSourceDependencyContainer dependencies; protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent) diff --git a/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs b/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs new file mode 100644 index 0000000000..2130171449 --- /dev/null +++ b/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs @@ -0,0 +1,16 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Rulesets; +using osu.Game.Rulesets.Osu; + +namespace osu.Game.Tests.Visual.Gameplay +{ + /// + /// A with an arbitrary ruleset value to test with. + /// + public abstract class TestPlayerTestScene : PlayerTestScene + { + protected override Ruleset CreateRuleset() => new OsuRuleset(); + } +} diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs index 310746d179..744eeed022 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs @@ -10,23 +10,17 @@ using osu.Framework.Utils; using osu.Framework.Timing; using osu.Game.Beatmaps; using osu.Game.Rulesets; -using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Storyboards; using osuTK; namespace osu.Game.Tests.Visual.Gameplay { - public class TestSceneGameplayRewinding : PlayerTestScene + public class TestSceneGameplayRewinding : TestPlayerTestScene { [Resolved] private AudioManager audioManager { get; set; } - public TestSceneGameplayRewinding() - : base(new OsuRuleset()) - { - } - private Track track; protected override WorkingBeatmap CreateWorkingBeatmap(IBeatmap beatmap, Storyboard storyboard = null) diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs index 944e6ca6be..411265d600 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs @@ -10,14 +10,13 @@ using osu.Framework.Testing; using osu.Game.Graphics.Containers; using osu.Game.Graphics.Cursor; using osu.Game.Rulesets; -using osu.Game.Rulesets.Osu; using osu.Game.Screens.Play; using osuTK; using osuTK.Input; namespace osu.Game.Tests.Visual.Gameplay { - public class TestScenePause : PlayerTestScene + public class TestScenePause : TestPlayerTestScene { protected new PausePlayer Player => (PausePlayer)base.Player; @@ -26,7 +25,6 @@ namespace osu.Game.Tests.Visual.Gameplay protected override Container Content => content; public TestScenePause() - : base(new OsuRuleset()) { base.Content.Add(content = new MenuCursorContainer { RelativeSizeAxes = Axes.Both }); } diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs index a83320048b..20911bfa4d 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs @@ -8,12 +8,11 @@ using osu.Framework.Platform; using osu.Framework.Testing; using osu.Game.Beatmaps; using osu.Game.Rulesets; -using osu.Game.Rulesets.Osu; namespace osu.Game.Tests.Visual.Gameplay { [HeadlessTest] // we alter unsafe properties on the game host to test inactive window state. - public class TestScenePauseWhenInactive : PlayerTestScene + public class TestScenePauseWhenInactive : TestPlayerTestScene { protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) { @@ -27,11 +26,6 @@ namespace osu.Game.Tests.Visual.Gameplay [Resolved] private GameHost host { get; set; } - public TestScenePauseWhenInactive() - : base(new OsuRuleset()) - { - } - [Test] public void TestDoesntPauseDuringIntro() { diff --git a/osu.Game/Tests/Visual/PlayerTestScene.cs b/osu.Game/Tests/Visual/PlayerTestScene.cs index 9e852719e0..f5e78fbbd1 100644 --- a/osu.Game/Tests/Visual/PlayerTestScene.cs +++ b/osu.Game/Tests/Visual/PlayerTestScene.cs @@ -19,15 +19,8 @@ namespace osu.Game.Tests.Visual /// protected virtual bool HasCustomSteps { get; } = false; - private readonly Ruleset ruleset; - protected TestPlayer Player; - protected PlayerTestScene(Ruleset ruleset) - { - this.ruleset = ruleset; - } - protected OsuConfigManager LocalConfig; [BackgroundDependencyLoader] @@ -53,7 +46,7 @@ namespace osu.Game.Tests.Visual action?.Invoke(); - AddStep(ruleset.RulesetInfo.Name, LoadPlayer); + AddStep(CreateRuleset().RulesetInfo.Name, LoadPlayer); AddUntilStep("player loaded", () => Player.IsLoaded && Player.Alpha == 1); } @@ -63,28 +56,28 @@ namespace osu.Game.Tests.Visual protected void LoadPlayer() { - var beatmap = CreateBeatmap(ruleset.RulesetInfo); + var beatmap = CreateBeatmap(Ruleset.Value); Beatmap.Value = CreateWorkingBeatmap(beatmap); - Ruleset.Value = ruleset.RulesetInfo; - SelectedMods.Value = Array.Empty(); + var rulesetInstance = Ruleset.Value.CreateInstance(); + if (!AllowFail) { - var noFailMod = ruleset.GetAllMods().FirstOrDefault(m => m is ModNoFail); + var noFailMod = rulesetInstance.GetAllMods().FirstOrDefault(m => m is ModNoFail); if (noFailMod != null) SelectedMods.Value = new[] { noFailMod }; } if (Autoplay) { - var mod = ruleset.GetAutoplayMod(); + var mod = rulesetInstance.GetAutoplayMod(); if (mod != null) SelectedMods.Value = SelectedMods.Value.Concat(mod.Yield()).ToArray(); } - Player = CreatePlayer(ruleset); + Player = CreatePlayer(rulesetInstance); LoadScreen(Player); } From 155bc8b49a08842297cf1a4eb1b4d9e36d799b55 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 17 Apr 2020 10:56:01 +0300 Subject: [PATCH 09/98] Remove `ModTestScene` ruleset parameter on constructor and use `CreateRuleset` instead --- .../Mods/TestSceneCatchModPerfect.cs | 4 +++- .../Mods/TestSceneManiaModPerfect.cs | 4 +++- .../Mods/TestSceneOsuModDifficultyAdjust.cs | 7 ++----- .../Mods/TestSceneOsuModDoubleTime.cs | 7 ++----- osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs | 4 +++- .../TestSceneMissHitWindowJudgements.cs | 7 ++----- .../Mods/TestSceneTaikoModPerfect.cs | 4 +++- osu.Game/Tests/Visual/ModPerfectTestScene.cs | 7 ++----- osu.Game/Tests/Visual/ModTestScene.cs | 5 ----- 9 files changed, 20 insertions(+), 29 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs b/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs index 47e91e50d4..1e69a3f1b6 100644 --- a/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs +++ b/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs @@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Catch.Tests.Mods public class TestSceneCatchModPerfect : ModPerfectTestScene { public TestSceneCatchModPerfect() - : base(new CatchRuleset(), new CatchModPerfect()) + : base(new CatchModPerfect()) { } @@ -50,5 +50,7 @@ namespace osu.Game.Rulesets.Catch.Tests.Mods // We only care about testing misses, hits are tested via JuiceStream [TestCase(true)] public void TestTinyDroplet(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new TinyDroplet { StartTime = 1000 }), shouldMiss); + + protected override Ruleset CreateRuleset() => new CatchRuleset(); } } diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs index 607d42a1bb..72ef58ec73 100644 --- a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs +++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs @@ -11,7 +11,7 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods public class TestSceneManiaModPerfect : ModPerfectTestScene { public TestSceneManiaModPerfect() - : base(new ManiaRuleset(), new ManiaModPerfect()) + : base(new ManiaModPerfect()) { } @@ -22,5 +22,7 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods [TestCase(false)] [TestCase(true)] public void TestHoldNote(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new HoldNote { StartTime = 1000, EndTime = 3000 }), shouldMiss); + + protected override Ruleset CreateRuleset() => new ManiaRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs index 69415b70e3..6c5949ca85 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs @@ -15,11 +15,6 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { public class TestSceneOsuModDifficultyAdjust : ModTestScene { - public TestSceneOsuModDifficultyAdjust() - : base(new OsuRuleset()) - { - } - [Test] public void TestNoAdjustment() => CreateModTest(new ModTestData { @@ -82,5 +77,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { return Player.ScoreProcessor.JudgedHits >= 2; } + + protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs index dcf19ad993..c61ef2724b 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs @@ -10,11 +10,6 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { public class TestSceneOsuModDoubleTime : ModTestScene { - public TestSceneOsuModDoubleTime() - : base(new OsuRuleset()) - { - } - [TestCase(0.5)] [TestCase(1.01)] [TestCase(1.5)] @@ -31,5 +26,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods Precision.AlmostEquals(Player.GameplayClockContainer.GameplayClock.Rate, mod.SpeedChange.Value) }); } + + protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs index b03a894085..ddbbf9554c 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs @@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods public class TestSceneOsuModPerfect : ModPerfectTestScene { public TestSceneOsuModPerfect() - : base(new OsuRuleset(), new OsuModPerfect()) + : base(new OsuModPerfect()) { } @@ -48,5 +48,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods CreateHitObjectTest(new HitObjectTestData(spinner), shouldMiss); } + + protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs index 5f3596976d..13457ccaf9 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs @@ -19,11 +19,6 @@ namespace osu.Game.Rulesets.Osu.Tests { public class TestSceneMissHitWindowJudgements : ModTestScene { - public TestSceneMissHitWindowJudgements() - : base(new OsuRuleset()) - { - } - [Test] public void TestMissViaEarlyHit() { @@ -66,6 +61,8 @@ namespace osu.Game.Rulesets.Osu.Tests }); } + protected override Ruleset CreateRuleset() => new OsuRuleset(); + private class TestAutoMod : OsuModAutoplay { public override Score CreateReplayScore(IBeatmap beatmap) => new Score diff --git a/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs b/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs index 26c90ad295..a9c962bfa0 100644 --- a/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs +++ b/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs @@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods public class TestSceneTaikoModPerfect : ModPerfectTestScene { public TestSceneTaikoModPerfect() - : base(new TestTaikoRuleset(), new TaikoModPerfect()) + : base(new TaikoModPerfect()) { } @@ -29,6 +29,8 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods [TestCase(true)] public void TestSwell(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Swell { StartTime = 1000, EndTime = 3000 }), shouldMiss); + protected override Ruleset CreateRuleset() => new TestTaikoRuleset(); + private class TestTaikoRuleset : TaikoRuleset { public override HealthProcessor CreateHealthProcessor(double drainStartTime) => new TestTaikoHealthProcessor(); diff --git a/osu.Game/Tests/Visual/ModPerfectTestScene.cs b/osu.Game/Tests/Visual/ModPerfectTestScene.cs index 798947eb40..3565fe751b 100644 --- a/osu.Game/Tests/Visual/ModPerfectTestScene.cs +++ b/osu.Game/Tests/Visual/ModPerfectTestScene.cs @@ -10,13 +10,10 @@ namespace osu.Game.Tests.Visual { public abstract class ModPerfectTestScene : ModTestScene { - private readonly Ruleset ruleset; private readonly ModPerfect mod; - protected ModPerfectTestScene(Ruleset ruleset, ModPerfect mod) - : base(ruleset) + protected ModPerfectTestScene(ModPerfect mod) { - this.ruleset = ruleset; this.mod = mod; } @@ -25,7 +22,7 @@ namespace osu.Game.Tests.Visual Mod = mod, Beatmap = new Beatmap { - BeatmapInfo = { Ruleset = ruleset.RulesetInfo }, + BeatmapInfo = { Ruleset = Ruleset.Value }, HitObjects = { testData.HitObject } }, Autoplay = !shouldMiss, diff --git a/osu.Game/Tests/Visual/ModTestScene.cs b/osu.Game/Tests/Visual/ModTestScene.cs index 8b41fb5075..c198d6b52c 100644 --- a/osu.Game/Tests/Visual/ModTestScene.cs +++ b/osu.Game/Tests/Visual/ModTestScene.cs @@ -19,11 +19,6 @@ namespace osu.Game.Tests.Visual typeof(ModTestScene) }; - protected ModTestScene(Ruleset ruleset) - : base(ruleset) - { - } - private ModTestData currentTestData; protected void CreateModTest(ModTestData testData) => CreateTest(() => From 7f791dcdf04d3434ea7275de20fd8d369060b062 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 17 Apr 2020 10:57:58 +0300 Subject: [PATCH 10/98] Re-enable ruleset bindable before setting defined ruleset in case it's disabled Happens on cases like restarting the test scene by clicking directly on it on the browser (*where it for some reason reloads the entire test scene*) --- osu.Game/Tests/Visual/OsuTestScene.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index 8058a074ef..25ac768272 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -75,6 +75,10 @@ namespace osu.Game.Tests.Visual if (definedRuleset != null) { + // re-enable the bindable in case it was disabled. + // happens when restarting current test scene. + Ruleset.Disabled = false; + // Set global ruleset bindable to the ruleset defined // for this test scene and disallow changing it. Ruleset.Value = definedRuleset; From 0a0ea39431ebf6432c0aa7eb071591931074a7fc Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 23 Apr 2020 13:24:18 +0300 Subject: [PATCH 11/98] Mark the top ruleset creation method as can-be-null --- osu.Game/Tests/Visual/OsuTestScene.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index 25ac768272..83db86c0a0 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; +using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Audio.Track; @@ -145,6 +146,7 @@ namespace osu.Game.Tests.Visual /// /// When testing against ruleset-specific components, this method must be overriden to their ruleset. /// + [CanBeNull] protected virtual Ruleset CreateRuleset() => null; protected virtual IBeatmap CreateBeatmap(RulesetInfo ruleset) => new TestBeatmap(ruleset); From 2fa47992dc58f0c8293be22eba14673391181933 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 23 Apr 2020 13:25:06 +0300 Subject: [PATCH 12/98] Seal the ruleset creation methods and let abstract method take their place Also makes `CreatePlayerRuleset()` and `CreateRulesetForSkinProvider()` not-null to avoid unwanted behaviour with their derivers --- .../CatchSkinnableTestScene.cs | 2 +- .../Mods/TestSceneCatchModPerfect.cs | 4 +-- .../TestSceneCatchPlayer.cs | 2 +- .../Mods/TestSceneManiaModPerfect.cs | 4 +-- .../Skinning/ManiaSkinnableTestScene.cs | 4 +-- .../TestSceneManiaPlayer.cs | 2 +- .../Mods/TestSceneOsuModDifficultyAdjust.cs | 4 +-- .../Mods/TestSceneOsuModDoubleTime.cs | 4 +-- .../Mods/TestSceneOsuModPerfect.cs | 4 +-- .../OsuSkinnableTestScene.cs | 2 +- .../TestSceneMissHitWindowJudgements.cs | 4 +-- .../TestSceneOsuPlayer.cs | 2 +- .../Mods/TestSceneTaikoModPerfect.cs | 4 +-- .../TaikoSkinnableTestScene.cs | 2 +- .../TestSceneTaikoPlayer.cs | 2 +- .../Visual/Gameplay/TestPlayerTestScene.cs | 2 +- osu.Game/Tests/Visual/PlayerTestScene.cs | 30 ++++++++++++++----- osu.Game/Tests/Visual/SkinnableTestScene.cs | 19 +++++++----- 18 files changed, 58 insertions(+), 39 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs b/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs index c0060af74a..0c46b078b5 100644 --- a/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Catch.Tests/CatchSkinnableTestScene.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Catch.Tests typeof(CatchLegacySkinTransformer), }; - protected override Ruleset CreateRuleset() => new CatchRuleset(); + protected override Ruleset CreateRulesetForSkinProvider() => new CatchRuleset(); } } diff --git a/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs b/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs index 1e69a3f1b6..3e06e78dba 100644 --- a/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs +++ b/osu.Game.Rulesets.Catch.Tests/Mods/TestSceneCatchModPerfect.cs @@ -13,6 +13,8 @@ namespace osu.Game.Rulesets.Catch.Tests.Mods { public class TestSceneCatchModPerfect : ModPerfectTestScene { + protected override Ruleset CreatePlayerRuleset() => new CatchRuleset(); + public TestSceneCatchModPerfect() : base(new CatchModPerfect()) { @@ -50,7 +52,5 @@ namespace osu.Game.Rulesets.Catch.Tests.Mods // We only care about testing misses, hits are tested via JuiceStream [TestCase(true)] public void TestTinyDroplet(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new TinyDroplet { StartTime = 1000 }), shouldMiss); - - protected override Ruleset CreateRuleset() => new CatchRuleset(); } } diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs index 722f3b5a3b..e1de461e3b 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneCatchPlayer.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Catch.Tests typeof(CatchRuleset), }; - protected override Ruleset CreateRuleset() => new CatchRuleset(); + protected override Ruleset CreatePlayerRuleset() => new CatchRuleset(); } } diff --git a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs index 72ef58ec73..2e3b21aed7 100644 --- a/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs +++ b/osu.Game.Rulesets.Mania.Tests/Mods/TestSceneManiaModPerfect.cs @@ -10,6 +10,8 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods { public class TestSceneManiaModPerfect : ModPerfectTestScene { + protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset(); + public TestSceneManiaModPerfect() : base(new ManiaModPerfect()) { @@ -22,7 +24,5 @@ namespace osu.Game.Rulesets.Mania.Tests.Mods [TestCase(false)] [TestCase(true)] public void TestHoldNote(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new HoldNote { StartTime = 1000, EndTime = 3000 }), shouldMiss); - - protected override Ruleset CreateRuleset() => new ManiaRuleset(); } } diff --git a/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs b/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs index f41ba4db42..a3c1d518c5 100644 --- a/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Mania.Tests/Skinning/ManiaSkinnableTestScene.cs @@ -34,6 +34,8 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning typeof(ManiaSettingsSubsection) }; + protected override Ruleset CreateRulesetForSkinProvider() => new ManiaRuleset(); + protected ManiaSkinnableTestScene() { scrollingInfo.Direction.Value = ScrollingDirection.Down; @@ -58,8 +60,6 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning AddStep("change direction to up", () => scrollingInfo.Direction.Value = ScrollingDirection.Up); } - protected override Ruleset CreateRuleset() => new ManiaRuleset(); - private class TestScrollingInfo : IScrollingInfo { public readonly Bindable Direction = new Bindable(); diff --git a/osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs b/osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs index 11663605e2..f4640fd05b 100644 --- a/osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs +++ b/osu.Game.Rulesets.Mania.Tests/TestSceneManiaPlayer.cs @@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Mania.Tests typeof(ManiaRuleset), }; - protected override Ruleset CreateRuleset() => new ManiaRuleset(); + protected override Ruleset CreatePlayerRuleset() => new ManiaRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs index 6c5949ca85..7c396054f1 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs @@ -15,6 +15,8 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { public class TestSceneOsuModDifficultyAdjust : ModTestScene { + protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); + [Test] public void TestNoAdjustment() => CreateModTest(new ModTestData { @@ -77,7 +79,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { return Player.ScoreProcessor.JudgedHits >= 2; } - - protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs index c61ef2724b..94ef6140e9 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs @@ -10,6 +10,8 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { public class TestSceneOsuModDoubleTime : ModTestScene { + protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); + [TestCase(0.5)] [TestCase(1.01)] [TestCase(1.5)] @@ -26,7 +28,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods Precision.AlmostEquals(Player.GameplayClockContainer.GameplayClock.Rate, mod.SpeedChange.Value) }); } - - protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs index ddbbf9554c..985baa8cf5 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModPerfect.cs @@ -13,6 +13,8 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods { public class TestSceneOsuModPerfect : ModPerfectTestScene { + protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); + public TestSceneOsuModPerfect() : base(new OsuModPerfect()) { @@ -48,7 +50,5 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods CreateHitObjectTest(new HitObjectTestData(spinner), shouldMiss); } - - protected override Ruleset CreateRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs b/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs index 1458270193..90ebbd9f04 100644 --- a/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Osu.Tests/OsuSkinnableTestScene.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Osu.Tests typeof(OsuLegacySkinTransformer), }; - protected override Ruleset CreateRuleset() => new OsuRuleset(); + protected override Ruleset CreateRulesetForSkinProvider() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs index 13457ccaf9..f3221ffe32 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneMissHitWindowJudgements.cs @@ -19,6 +19,8 @@ namespace osu.Game.Rulesets.Osu.Tests { public class TestSceneMissHitWindowJudgements : ModTestScene { + protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); + [Test] public void TestMissViaEarlyHit() { @@ -61,8 +63,6 @@ namespace osu.Game.Rulesets.Osu.Tests }); } - protected override Ruleset CreateRuleset() => new OsuRuleset(); - private class TestAutoMod : OsuModAutoplay { public override Score CreateReplayScore(IBeatmap beatmap) => new Score diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs index 102f8bf841..4ae19624c0 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneOsuPlayer.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Osu.Tests typeof(OsuRuleset), }; - protected override Ruleset CreateRuleset() => new OsuRuleset(); + protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs b/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs index a9c962bfa0..a83cc16413 100644 --- a/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs +++ b/osu.Game.Rulesets.Taiko.Tests/Mods/TestSceneTaikoModPerfect.cs @@ -12,6 +12,8 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods { public class TestSceneTaikoModPerfect : ModPerfectTestScene { + protected override Ruleset CreatePlayerRuleset() => new TestTaikoRuleset(); + public TestSceneTaikoModPerfect() : base(new TaikoModPerfect()) { @@ -29,8 +31,6 @@ namespace osu.Game.Rulesets.Taiko.Tests.Mods [TestCase(true)] public void TestSwell(bool shouldMiss) => CreateHitObjectTest(new HitObjectTestData(new Swell { StartTime = 1000, EndTime = 3000 }), shouldMiss); - protected override Ruleset CreateRuleset() => new TestTaikoRuleset(); - private class TestTaikoRuleset : TaikoRuleset { public override HealthProcessor CreateHealthProcessor(double drainStartTime) => new TestTaikoHealthProcessor(); diff --git a/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs b/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs index 98e6c2ec52..6db2a6907f 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TaikoSkinnableTestScene.cs @@ -16,6 +16,6 @@ namespace osu.Game.Rulesets.Taiko.Tests typeof(TaikoLegacySkinTransformer), }; - protected override Ruleset CreateRuleset() => new TaikoRuleset(); + protected override Ruleset CreateRulesetForSkinProvider() => new TaikoRuleset(); } } diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs index 4c5ab7eabf..bc6f664942 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneTaikoPlayer.cs @@ -14,6 +14,6 @@ namespace osu.Game.Rulesets.Taiko.Tests typeof(TaikoRuleset) }; - protected override Ruleset CreateRuleset() => new TaikoRuleset(); + protected override Ruleset CreatePlayerRuleset() => new TaikoRuleset(); } } diff --git a/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs b/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs index 2130171449..bbf0136b00 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs @@ -11,6 +11,6 @@ namespace osu.Game.Tests.Visual.Gameplay /// public abstract class TestPlayerTestScene : PlayerTestScene { - protected override Ruleset CreateRuleset() => new OsuRuleset(); + protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); } } diff --git a/osu.Game/Tests/Visual/PlayerTestScene.cs b/osu.Game/Tests/Visual/PlayerTestScene.cs index f5e78fbbd1..53abf83e72 100644 --- a/osu.Game/Tests/Visual/PlayerTestScene.cs +++ b/osu.Game/Tests/Visual/PlayerTestScene.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Testing; @@ -23,6 +24,22 @@ namespace osu.Game.Tests.Visual protected OsuConfigManager LocalConfig; + /// + /// Creates the ruleset for setting up the component. + /// + [NotNull] + protected abstract Ruleset CreatePlayerRuleset(); + + protected sealed override Ruleset CreateRuleset() => CreatePlayerRuleset(); + + [NotNull] + private readonly Ruleset ruleset; + + protected PlayerTestScene() + { + ruleset = CreatePlayerRuleset(); + } + [BackgroundDependencyLoader] private void load() { @@ -46,7 +63,7 @@ namespace osu.Game.Tests.Visual action?.Invoke(); - AddStep(CreateRuleset().RulesetInfo.Name, LoadPlayer); + AddStep(ruleset.Description, LoadPlayer); AddUntilStep("player loaded", () => Player.IsLoaded && Player.Alpha == 1); } @@ -56,28 +73,27 @@ namespace osu.Game.Tests.Visual protected void LoadPlayer() { - var beatmap = CreateBeatmap(Ruleset.Value); + var beatmap = CreateBeatmap(ruleset.RulesetInfo); Beatmap.Value = CreateWorkingBeatmap(beatmap); + Ruleset.Value = ruleset.RulesetInfo; SelectedMods.Value = Array.Empty(); - var rulesetInstance = Ruleset.Value.CreateInstance(); - if (!AllowFail) { - var noFailMod = rulesetInstance.GetAllMods().FirstOrDefault(m => m is ModNoFail); + var noFailMod = ruleset.GetAllMods().FirstOrDefault(m => m is ModNoFail); if (noFailMod != null) SelectedMods.Value = new[] { noFailMod }; } if (Autoplay) { - var mod = rulesetInstance.GetAutoplayMod(); + var mod = ruleset.GetAutoplayMod(); if (mod != null) SelectedMods.Value = SelectedMods.Value.Concat(mod.Yield()).ToArray(); } - Player = CreatePlayer(rulesetInstance); + Player = CreatePlayer(ruleset); LoadScreen(Player); } diff --git a/osu.Game/Tests/Visual/SkinnableTestScene.cs b/osu.Game/Tests/Visual/SkinnableTestScene.cs index d648afd504..98164031b0 100644 --- a/osu.Game/Tests/Visual/SkinnableTestScene.cs +++ b/osu.Game/Tests/Visual/SkinnableTestScene.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text.RegularExpressions; +using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Audio; using osu.Framework.Graphics; @@ -13,6 +14,7 @@ using osu.Framework.Graphics.Textures; using osu.Framework.IO.Stores; using osu.Game.Beatmaps; using osu.Game.Graphics.Sprites; +using osu.Game.Rulesets; using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -26,16 +28,17 @@ namespace osu.Game.Tests.Visual private Skin specialSkin; private Skin oldSkin; + /// + /// Creates the ruleset for adding the ruleset-specific skin transforming component. + /// + [NotNull] + protected abstract Ruleset CreateRulesetForSkinProvider(); + + protected sealed override Ruleset CreateRuleset() => CreateRulesetForSkinProvider(); + protected SkinnableTestScene() : base(2, 3) { - // avoid running silently incorrectly. - if (CreateRuleset() == null) - { - throw new InvalidOperationException( - $"No ruleset provided, override {nameof(CreateRuleset)} to the ruleset belonging to the skinnable content." - + "This is required to add the legacy skin transformer for the content to behave as expected."); - } } [BackgroundDependencyLoader] @@ -110,7 +113,7 @@ namespace osu.Game.Tests.Visual { new OutlineBox { Alpha = autoSize ? 1 : 0 }, mainProvider.WithChild( - new SkinProvidingContainer(Ruleset.Value.CreateInstance().CreateLegacySkinProvider(mainProvider, beatmap)) + new SkinProvidingContainer(CreateRulesetForSkinProvider().CreateLegacySkinProvider(mainProvider, beatmap)) { Child = created, RelativeSizeAxes = !autoSize ? Axes.Both : Axes.None, From 836efe3f7c697448b82a1f3b053ef0dd85f3efc0 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Thu, 7 May 2020 08:07:22 +0200 Subject: [PATCH 13/98] Initial commit --- osu.Desktop/Updater/SquirrelUpdateManager.cs | 4 +++- .../Settings/Sections/General/UpdateSettings.cs | 13 ++++++++++++- osu.Game/Updater/SimpleUpdateManager.cs | 4 +++- osu.Game/Updater/UpdateManager.cs | 6 ++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index ade8460dd7..b287dd6527 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -37,10 +37,12 @@ namespace osu.Desktop.Updater if (game.IsDeployedBuild) { Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger)); - Schedule(() => Task.Run(() => checkForUpdateAsync())); + CheckForUpdate(); } } + public override void CheckForUpdate() => Schedule(() => Task.Run(() => checkForUpdateAsync())); + private async void checkForUpdateAsync(bool useDeltaPatching = true, UpdateProgressNotification notification = null) { // should we schedule a retry on completion of this check? diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 188c9c05ef..71deeee693 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -5,15 +5,19 @@ using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Platform; using osu.Game.Configuration; +using osu.Game.Updater; namespace osu.Game.Overlays.Settings.Sections.General { public class UpdateSettings : SettingsSubsection { + [Resolved(CanBeNull = true)] + private UpdateManager updateManager { get; set; } + protected override string Header => "Updates"; [BackgroundDependencyLoader] - private void load(Storage storage, OsuConfigManager config) + private void load(Storage storage, OsuConfigManager config, OsuGameBase game) { Add(new SettingsEnumDropdown { @@ -21,6 +25,13 @@ namespace osu.Game.Overlays.Settings.Sections.General Bindable = config.GetBindable(OsuSetting.ReleaseStream), }); + Add(new SettingsButton + { + Text = "Check for updates", + Action = () => updateManager?.CheckForUpdate(), + Enabled = { Value = game.IsDeployedBuild } + }); + if (RuntimeInfo.IsDesktop) { Add(new SettingsButton diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 1e8a96444f..41248ed796 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -30,9 +30,11 @@ namespace osu.Game.Updater version = game.Version; if (game.IsDeployedBuild) - Schedule(() => Task.Run(checkForUpdateAsync)); + CheckForUpdate(); } + public override void CheckForUpdate() => Schedule(() => Task.Run(checkForUpdateAsync)); + private async void checkForUpdateAsync() { try diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 28a295215f..f628bde324 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -4,6 +4,7 @@ using osu.Framework.Allocation; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; +using osu.Framework.Logging; using osu.Game.Configuration; using osu.Game.Graphics; using osu.Game.Overlays; @@ -44,6 +45,11 @@ namespace osu.Game.Updater config.Set(OsuSetting.Version, version); } + public virtual void CheckForUpdate() + { + Logger.Log("CheckForUpdate was called on the base class (UpdateManager)", LoggingTarget.Information); + } + private class UpdateCompleteNotification : SimpleNotification { private readonly string version; From c025814f403dc5fcf4f07342791387986c526809 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Thu, 7 May 2020 23:04:18 +0200 Subject: [PATCH 14/98] Finalize changes --- osu.Game/OsuGame.cs | 14 +++++++++++--- .../Settings/Sections/General/UpdateSettings.cs | 7 ++----- osu.Game/Updater/SimpleUpdateManager.cs | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index fdc8d94352..00b967c243 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -90,7 +90,7 @@ namespace osu.Game protected BackButton BackButton; - protected SettingsPanel Settings; + protected SettingsOverlay Settings; private VolumeOverlay volume; private OsuLogo osuLogo; @@ -609,6 +609,9 @@ namespace osu.Game loadComponentSingleFile(screenshotManager, Add); + // dependency on notification overlay + loadComponentSingleFile(CreateUpdateManager(), Add, true); + // overlay elements loadComponentSingleFile(beatmapListing = new BeatmapListingOverlay(), overlayContent.Add, true); loadComponentSingleFile(dashboard = new DashboardOverlay(), overlayContent.Add, true); @@ -641,7 +644,6 @@ namespace osu.Game chatOverlay.State.ValueChanged += state => channelManager.HighPollRate.Value = state.NewValue == Visibility.Visible; Add(externalLinkOpener = new ExternalLinkOpener()); - Add(CreateUpdateManager()); // dependency on notification overlay // side overlays which cancel each other. var singleDisplaySideOverlays = new OverlayContainer[] { Settings, notifications }; @@ -765,11 +767,17 @@ namespace osu.Game private Task asyncLoadStream; + /// + /// Schedules loading the provided in a single file. + /// + /// The component to load. + /// The method to invoke for adding the component. + /// Whether to cache the component as type into the game dependencies before any scheduling. private T loadComponentSingleFile(T d, Action add, bool cache = false) where T : Drawable { if (cache) - dependencies.Cache(d); + dependencies.CacheAs(d); if (d is OverlayContainer overlay) overlays.Add(overlay); diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 71deeee693..233a382b54 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -11,13 +11,10 @@ namespace osu.Game.Overlays.Settings.Sections.General { public class UpdateSettings : SettingsSubsection { - [Resolved(CanBeNull = true)] - private UpdateManager updateManager { get; set; } - protected override string Header => "Updates"; [BackgroundDependencyLoader] - private void load(Storage storage, OsuConfigManager config, OsuGameBase game) + private void load(Storage storage, OsuConfigManager config, OsuGameBase game, UpdateManager updateManager) { Add(new SettingsEnumDropdown { @@ -28,7 +25,7 @@ namespace osu.Game.Overlays.Settings.Sections.General Add(new SettingsButton { Text = "Check for updates", - Action = () => updateManager?.CheckForUpdate(), + Action = () => updateManager.CheckForUpdate(), Enabled = { Value = game.IsDeployedBuild } }); diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 41248ed796..234fe8be8b 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -33,7 +33,7 @@ namespace osu.Game.Updater CheckForUpdate(); } - public override void CheckForUpdate() => Schedule(() => Task.Run(checkForUpdateAsync)); + public override void CheckForUpdate() => Schedule(() => Task.Run(() => checkForUpdateAsync())); private async void checkForUpdateAsync() { From 92872496b86db2681da81cc151223e5707464940 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Thu, 7 May 2020 23:27:28 +0200 Subject: [PATCH 15/98] Convert to method groups because Inspector said so. --- osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs | 2 +- osu.Game/Updater/SimpleUpdateManager.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 233a382b54..5ddd12f667 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -25,7 +25,7 @@ namespace osu.Game.Overlays.Settings.Sections.General Add(new SettingsButton { Text = "Check for updates", - Action = () => updateManager.CheckForUpdate(), + Action = updateManager.CheckForUpdate, Enabled = { Value = game.IsDeployedBuild } }); diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 234fe8be8b..41248ed796 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -33,7 +33,7 @@ namespace osu.Game.Updater CheckForUpdate(); } - public override void CheckForUpdate() => Schedule(() => Task.Run(() => checkForUpdateAsync())); + public override void CheckForUpdate() => Schedule(() => Task.Run(checkForUpdateAsync)); private async void checkForUpdateAsync() { From 72b6bb25a5c1125f038d4b079e2e57fd31fdbcd1 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 00:33:33 +0200 Subject: [PATCH 16/98] Allow nulls and hide if missing dependencies --- .../Settings/Sections/General/UpdateSettings.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 5ddd12f667..23ca752f6e 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -13,7 +13,7 @@ namespace osu.Game.Overlays.Settings.Sections.General { protected override string Header => "Updates"; - [BackgroundDependencyLoader] + [BackgroundDependencyLoader(true)] private void load(Storage storage, OsuConfigManager config, OsuGameBase game, UpdateManager updateManager) { Add(new SettingsEnumDropdown @@ -22,12 +22,15 @@ namespace osu.Game.Overlays.Settings.Sections.General Bindable = config.GetBindable(OsuSetting.ReleaseStream), }); - Add(new SettingsButton + if (game != null && updateManager != null) { - Text = "Check for updates", - Action = updateManager.CheckForUpdate, - Enabled = { Value = game.IsDeployedBuild } - }); + Add(new SettingsButton + { + Text = "Check for updates", + Action = updateManager.CheckForUpdate, + Enabled = { Value = game.IsDeployedBuild } + }); + } if (RuntimeInfo.IsDesktop) { From 477bd7fa613c75a6b535324cf59e42bdb7dce669 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 00:35:27 +0200 Subject: [PATCH 17/98] Change to Resolved attribute --- .../Overlays/Settings/Sections/General/UpdateSettings.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 23ca752f6e..5af6a060ee 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -11,10 +11,16 @@ namespace osu.Game.Overlays.Settings.Sections.General { public class UpdateSettings : SettingsSubsection { + [Resolved(CanBeNull = true)] + private OsuGameBase game { get; set; } + + [Resolved(CanBeNull = true)] + private UpdateManager updateManager { get; set; } + protected override string Header => "Updates"; [BackgroundDependencyLoader(true)] - private void load(Storage storage, OsuConfigManager config, OsuGameBase game, UpdateManager updateManager) + private void load(Storage storage, OsuConfigManager config) { Add(new SettingsEnumDropdown { From a7792070bc01f4108515f665f5ff17dc750c25e4 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 01:08:17 +0200 Subject: [PATCH 18/98] Final changes to DI fields and values --- .../Settings/Sections/General/UpdateSettings.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 5af6a060ee..58966e8a4c 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -11,16 +11,13 @@ namespace osu.Game.Overlays.Settings.Sections.General { public class UpdateSettings : SettingsSubsection { - [Resolved(CanBeNull = true)] - private OsuGameBase game { get; set; } - [Resolved(CanBeNull = true)] private UpdateManager updateManager { get; set; } protected override string Header => "Updates"; - [BackgroundDependencyLoader(true)] - private void load(Storage storage, OsuConfigManager config) + [BackgroundDependencyLoader] + private void load(Storage storage, OsuConfigManager config, OsuGameBase game) { Add(new SettingsEnumDropdown { @@ -28,7 +25,8 @@ namespace osu.Game.Overlays.Settings.Sections.General Bindable = config.GetBindable(OsuSetting.ReleaseStream), }); - if (game != null && updateManager != null) + // We shouldn't display the button for the base UpdateManager (without updating logic) + if (updateManager != null && updateManager.GetType() != typeof(UpdateManager)) { Add(new SettingsButton { From 75e65766ffcf0e3e1820407534bcd0104d469adb Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 01:09:16 +0200 Subject: [PATCH 19/98] Annotate dependency --- osu.Game/OsuGame.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 00b967c243..899056e179 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -609,7 +609,7 @@ namespace osu.Game loadComponentSingleFile(screenshotManager, Add); - // dependency on notification overlay + // dependency on notification overlay, dependent by settings overlay loadComponentSingleFile(CreateUpdateManager(), Add, true); // overlay elements From e6ad28a1cbb66359faa430446ae1d7b1fbc75b64 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 02:09:37 +0200 Subject: [PATCH 20/98] Use property instead of type checking --- osu.Desktop/Updater/SquirrelUpdateManager.cs | 2 ++ osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs | 4 ++-- osu.Game/Updater/SimpleUpdateManager.cs | 2 ++ osu.Game/Updater/UpdateManager.cs | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index b287dd6527..2834f1f71d 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -22,6 +22,8 @@ namespace osu.Desktop.Updater { public class SquirrelUpdateManager : osu.Game.Updater.UpdateManager { + public override bool CanPerformUpdate => true; + private UpdateManager updateManager; private NotificationOverlay notificationOverlay; diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 58966e8a4c..b832e8930a 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -25,8 +25,8 @@ namespace osu.Game.Overlays.Settings.Sections.General Bindable = config.GetBindable(OsuSetting.ReleaseStream), }); - // We shouldn't display the button for the base UpdateManager (without updating logic) - if (updateManager != null && updateManager.GetType() != typeof(UpdateManager)) + // We should only display the button for UpdateManagers that do update the client + if (updateManager != null && updateManager.CanPerformUpdate) { Add(new SettingsButton { diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 41248ed796..5cc42090f4 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -19,6 +19,8 @@ namespace osu.Game.Updater /// public class SimpleUpdateManager : UpdateManager { + public override bool CanPerformUpdate => true; + private string version; [Resolved] diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index f628bde324..f8c8bfe967 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -17,6 +17,8 @@ namespace osu.Game.Updater /// public class UpdateManager : CompositeDrawable { + public virtual bool CanPerformUpdate => false; + [Resolved] private OsuConfigManager config { get; set; } From 7f61f27be1e3031266110c0f64a812bc2a787829 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 02:33:12 +0200 Subject: [PATCH 21/98] Use null-conditional operator when checking against UpdateManager Co-authored-by: Dean Herbert --- osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index b832e8930a..6ea9c975de 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -26,7 +26,7 @@ namespace osu.Game.Overlays.Settings.Sections.General }); // We should only display the button for UpdateManagers that do update the client - if (updateManager != null && updateManager.CanPerformUpdate) + if (updateManager?.CanPerformUpdate == true) { Add(new SettingsButton { From 3c24ca08d042782166b0e1a7e1ce7297062e309e Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 02:48:27 +0200 Subject: [PATCH 22/98] Check whether the build is deployed within the public check updates method --- osu.Desktop/Updater/SquirrelUpdateManager.cs | 15 +++++++++------ osu.Game/Updater/SimpleUpdateManager.cs | 12 +++++++++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index 2834f1f71d..a3b21b4bd9 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -26,6 +26,7 @@ namespace osu.Desktop.Updater private UpdateManager updateManager; private NotificationOverlay notificationOverlay; + private OsuGameBase gameBase; public Task PrepareUpdateAsync() => UpdateManager.RestartAppWhenExited(); @@ -34,16 +35,18 @@ namespace osu.Desktop.Updater [BackgroundDependencyLoader] private void load(NotificationOverlay notification, OsuGameBase game) { + gameBase = game; notificationOverlay = notification; - if (game.IsDeployedBuild) - { - Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger)); - CheckForUpdate(); - } + Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger)); + CheckForUpdate(); } - public override void CheckForUpdate() => Schedule(() => Task.Run(() => checkForUpdateAsync())); + public override void CheckForUpdate() + { + if (gameBase.IsDeployedBuild) + Schedule(() => Task.Run(() => checkForUpdateAsync())); + } private async void checkForUpdateAsync(bool useDeltaPatching = true, UpdateProgressNotification notification = null) { diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 5cc42090f4..8513ea94b4 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -26,16 +26,22 @@ namespace osu.Game.Updater [Resolved] private GameHost host { get; set; } + private OsuGameBase gameBase; + [BackgroundDependencyLoader] private void load(OsuGameBase game) { + gameBase = game; version = game.Version; - if (game.IsDeployedBuild) - CheckForUpdate(); + CheckForUpdate(); } - public override void CheckForUpdate() => Schedule(() => Task.Run(checkForUpdateAsync)); + public override void CheckForUpdate() + { + if (gameBase.IsDeployedBuild) + Schedule(() => Task.Run(checkForUpdateAsync)); + } private async void checkForUpdateAsync() { From ebd1df8c2822a76c683b1b0f01e6e7677c3a8f70 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Fri, 8 May 2020 02:50:58 +0200 Subject: [PATCH 23/98] Change property name to CanCheckForUpdate --- osu.Desktop/Updater/SquirrelUpdateManager.cs | 2 +- .../Overlays/Settings/Sections/General/UpdateSettings.cs | 4 ++-- osu.Game/Updater/SimpleUpdateManager.cs | 2 +- osu.Game/Updater/UpdateManager.cs | 5 ++++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index a3b21b4bd9..5c553f18f4 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -22,7 +22,7 @@ namespace osu.Desktop.Updater { public class SquirrelUpdateManager : osu.Game.Updater.UpdateManager { - public override bool CanPerformUpdate => true; + public override bool CanCheckForUpdate => true; private UpdateManager updateManager; private NotificationOverlay notificationOverlay; diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index b832e8930a..cadffd9d86 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -25,8 +25,8 @@ namespace osu.Game.Overlays.Settings.Sections.General Bindable = config.GetBindable(OsuSetting.ReleaseStream), }); - // We should only display the button for UpdateManagers that do update the client - if (updateManager != null && updateManager.CanPerformUpdate) + // We should only display the button for UpdateManagers that do check for updates + if (updateManager != null && updateManager.CanCheckForUpdate) { Add(new SettingsButton { diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 8513ea94b4..d4e8aed5ae 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -19,7 +19,7 @@ namespace osu.Game.Updater /// public class SimpleUpdateManager : UpdateManager { - public override bool CanPerformUpdate => true; + public override bool CanCheckForUpdate => true; private string version; diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index f8c8bfe967..41bbfb76a5 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -17,7 +17,10 @@ namespace osu.Game.Updater /// public class UpdateManager : CompositeDrawable { - public virtual bool CanPerformUpdate => false; + /// + /// Whether this UpdateManager is capable of checking for updates. + /// + public virtual bool CanCheckForUpdate => false; [Resolved] private OsuConfigManager config { get; set; } From 39c36998c99509104c60f23cdce61a70e64e3c59 Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Tue, 12 May 2020 06:06:31 +0200 Subject: [PATCH 24/98] Revert changes that are to be resolved in #9002 --- osu.Game/OsuGame.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 899056e179..294180cb30 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -90,7 +90,7 @@ namespace osu.Game protected BackButton BackButton; - protected SettingsOverlay Settings; + protected SettingsPanel Settings; private VolumeOverlay volume; private OsuLogo osuLogo; @@ -767,17 +767,11 @@ namespace osu.Game private Task asyncLoadStream; - /// - /// Schedules loading the provided in a single file. - /// - /// The component to load. - /// The method to invoke for adding the component. - /// Whether to cache the component as type into the game dependencies before any scheduling. private T loadComponentSingleFile(T d, Action add, bool cache = false) where T : Drawable { if (cache) - dependencies.CacheAs(d); + dependencies.Cache(d); if (d is OverlayContainer overlay) overlays.Add(overlay); From 611f64fd364525be3f98c553ce9501a4c3505291 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 3 Jun 2020 23:23:56 +0300 Subject: [PATCH 25/98] Add base ready-made abstract scene for osu! mod tests --- osu.Game.Rulesets.Osu.Tests/Mods/OsuModTestScene.cs | 12 ++++++++++++ .../Mods/TestSceneOsuModDifficultyAdjust.cs | 5 +---- .../Mods/TestSceneOsuModDoubleTime.cs | 5 +---- .../Mods/TestSceneOsuModHidden.cs | 5 +---- 4 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 osu.Game.Rulesets.Osu.Tests/Mods/OsuModTestScene.cs diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/OsuModTestScene.cs b/osu.Game.Rulesets.Osu.Tests/Mods/OsuModTestScene.cs new file mode 100644 index 0000000000..7697f46160 --- /dev/null +++ b/osu.Game.Rulesets.Osu.Tests/Mods/OsuModTestScene.cs @@ -0,0 +1,12 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using osu.Game.Tests.Visual; + +namespace osu.Game.Rulesets.Osu.Tests.Mods +{ + public class OsuModTestScene : ModTestScene + { + protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); + } +} diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs index 7c396054f1..49c1fe8540 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDifficultyAdjust.cs @@ -9,14 +9,11 @@ using osu.Framework.Utils; using osu.Game.Graphics.Containers; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects.Drawables; -using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Osu.Tests.Mods { - public class TestSceneOsuModDifficultyAdjust : ModTestScene + public class TestSceneOsuModDifficultyAdjust : OsuModTestScene { - protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); - [Test] public void TestNoAdjustment() => CreateModTest(new ModTestData { diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs index 94ef6140e9..335ef31019 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModDoubleTime.cs @@ -4,14 +4,11 @@ using NUnit.Framework; using osu.Framework.Utils; using osu.Game.Rulesets.Osu.Mods; -using osu.Game.Tests.Visual; namespace osu.Game.Rulesets.Osu.Tests.Mods { - public class TestSceneOsuModDoubleTime : ModTestScene + public class TestSceneOsuModDoubleTime : OsuModTestScene { - protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); - [TestCase(0.5)] [TestCase(1.01)] [TestCase(1.5)] diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModHidden.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModHidden.cs index 8ef2240c66..40f1c4a52f 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModHidden.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModHidden.cs @@ -8,15 +8,12 @@ using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Osu.Objects; -using osu.Game.Tests.Visual; using osuTK; namespace osu.Game.Rulesets.Osu.Tests.Mods { - public class TestSceneOsuModHidden : ModTestScene + public class TestSceneOsuModHidden : OsuModTestScene { - protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); - [Test] public void TestDefaultBeatmapTest() => CreateModTest(new ModTestData { From 11da045d8cc54111157e76a9f91e6ae93a7b2c3d Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 3 Jun 2020 23:43:18 +0300 Subject: [PATCH 26/98] Reorder declaration position of ruleset-creation methods Should be recognized as a normal protected method in its declaring class. --- .../TestSceneHyperDash.cs | 1 - osu.Game/Tests/Visual/PlayerTestScene.cs | 17 +++++++------- osu.Game/Tests/Visual/SkinnableTestScene.cs | 23 +++++++++++-------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs index 83a6dc3d07..a0dcb86d57 100644 --- a/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs +++ b/osu.Game.Rulesets.Catch.Tests/TestSceneHyperDash.cs @@ -16,7 +16,6 @@ namespace osu.Game.Rulesets.Catch.Tests [TestFixture] public class TestSceneHyperDash : TestSceneCatchPlayer { - protected override bool Autoplay => true; [Test] diff --git a/osu.Game/Tests/Visual/PlayerTestScene.cs b/osu.Game/Tests/Visual/PlayerTestScene.cs index 53abf83e72..d663848bbf 100644 --- a/osu.Game/Tests/Visual/PlayerTestScene.cs +++ b/osu.Game/Tests/Visual/PlayerTestScene.cs @@ -24,15 +24,6 @@ namespace osu.Game.Tests.Visual protected OsuConfigManager LocalConfig; - /// - /// Creates the ruleset for setting up the component. - /// - [NotNull] - protected abstract Ruleset CreatePlayerRuleset(); - - protected sealed override Ruleset CreateRuleset() => CreatePlayerRuleset(); - - [NotNull] private readonly Ruleset ruleset; protected PlayerTestScene() @@ -97,6 +88,14 @@ namespace osu.Game.Tests.Visual LoadScreen(Player); } + /// + /// Creates the ruleset for setting up the component. + /// + [NotNull] + protected abstract Ruleset CreatePlayerRuleset(); + + protected sealed override Ruleset CreateRuleset() => CreatePlayerRuleset(); + protected virtual TestPlayer CreatePlayer(Ruleset ruleset) => new TestPlayer(false, false); } } diff --git a/osu.Game/Tests/Visual/SkinnableTestScene.cs b/osu.Game/Tests/Visual/SkinnableTestScene.cs index 98164031b0..41147d3768 100644 --- a/osu.Game/Tests/Visual/SkinnableTestScene.cs +++ b/osu.Game/Tests/Visual/SkinnableTestScene.cs @@ -23,27 +23,24 @@ namespace osu.Game.Tests.Visual { public abstract class SkinnableTestScene : OsuGridTestScene { + private readonly Ruleset ruleset; + private Skin metricsSkin; private Skin defaultSkin; private Skin specialSkin; private Skin oldSkin; - /// - /// Creates the ruleset for adding the ruleset-specific skin transforming component. - /// - [NotNull] - protected abstract Ruleset CreateRulesetForSkinProvider(); - - protected sealed override Ruleset CreateRuleset() => CreateRulesetForSkinProvider(); - protected SkinnableTestScene() : base(2, 3) { + ruleset = CreateRulesetForSkinProvider(); } [BackgroundDependencyLoader] private void load(AudioManager audio, SkinManager skinManager) { + Ruleset.Value = ruleset.RulesetInfo; + var dllStore = new DllResourceStore(DynamicCompilationOriginal.GetType().Assembly); metricsSkin = new TestLegacySkin(new SkinInfo { Name = "metrics-skin" }, new NamespacedResourceStore(dllStore, "Resources/metrics_skin"), audio, true); @@ -113,7 +110,7 @@ namespace osu.Game.Tests.Visual { new OutlineBox { Alpha = autoSize ? 1 : 0 }, mainProvider.WithChild( - new SkinProvidingContainer(CreateRulesetForSkinProvider().CreateLegacySkinProvider(mainProvider, beatmap)) + new SkinProvidingContainer(ruleset.CreateLegacySkinProvider(mainProvider, beatmap)) { Child = created, RelativeSizeAxes = !autoSize ? Axes.Both : Axes.None, @@ -126,6 +123,14 @@ namespace osu.Game.Tests.Visual }; } + /// + /// Creates the ruleset for adding the corresponding skin transforming component. + /// + [NotNull] + protected abstract Ruleset CreateRulesetForSkinProvider(); + + protected sealed override Ruleset CreateRuleset() => CreateRulesetForSkinProvider(); + protected virtual IBeatmap CreateBeatmapForSkinProvider() => CreateWorkingBeatmap(Ruleset.Value).GetPlayableBeatmap(Ruleset.Value); private class OutlineBox : CompositeDrawable From 136e10086acef397193487e11597623f2867f05b Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 4 Jun 2020 00:37:06 +0300 Subject: [PATCH 27/98] Set the ruleset bindable value at the BDL for its subclasses usages There are test scenes using current value of ruleset bindable on their BDL (example in TestSceneSliderSnaking's BDL) --- osu.Game/Tests/Visual/PlayerTestScene.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osu.Game/Tests/Visual/PlayerTestScene.cs b/osu.Game/Tests/Visual/PlayerTestScene.cs index d663848bbf..1e267726e0 100644 --- a/osu.Game/Tests/Visual/PlayerTestScene.cs +++ b/osu.Game/Tests/Visual/PlayerTestScene.cs @@ -34,6 +34,8 @@ namespace osu.Game.Tests.Visual [BackgroundDependencyLoader] private void load() { + Ruleset.Value = ruleset.RulesetInfo; + Dependencies.Cache(LocalConfig = new OsuConfigManager(LocalStorage)); LocalConfig.GetBindable(OsuSetting.DimLevel).Value = 1.0; } @@ -67,7 +69,6 @@ namespace osu.Game.Tests.Visual var beatmap = CreateBeatmap(ruleset.RulesetInfo); Beatmap.Value = CreateWorkingBeatmap(beatmap); - Ruleset.Value = ruleset.RulesetInfo; SelectedMods.Value = Array.Empty(); if (!AllowFail) From bbad70c3f0101fed3121bb894f28b3d6884a1322 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 4 Jun 2020 00:40:24 +0300 Subject: [PATCH 28/98] Fix mod perfect test scenes failing due to null ruleset provided Just a workaround for now, a better fix may be to put the test data creation in an action that is guaranteed to be invoked after the test scene has fully loaded (all dependencies would've been resolved by then). --- osu.Game/Tests/Visual/ModPerfectTestScene.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Tests/Visual/ModPerfectTestScene.cs b/osu.Game/Tests/Visual/ModPerfectTestScene.cs index bfd540093b..93b38a149c 100644 --- a/osu.Game/Tests/Visual/ModPerfectTestScene.cs +++ b/osu.Game/Tests/Visual/ModPerfectTestScene.cs @@ -22,7 +22,7 @@ namespace osu.Game.Tests.Visual Mod = mod, Beatmap = new Beatmap { - BeatmapInfo = { Ruleset = Ruleset.Value }, + BeatmapInfo = { Ruleset = CreatePlayerRuleset().RulesetInfo }, HitObjects = { testData.HitObject } }, Autoplay = !shouldMiss, From c72592c52ce200cd1500d261f349d72caa99dd41 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 4 Jun 2020 00:44:28 +0300 Subject: [PATCH 29/98] Remove bindable-disabling logic and don't tie immediately to CreateRuleset() --- osu.Game/Tests/Visual/OsuTestScene.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index 1b0dff162b..88bd087215 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -72,22 +72,7 @@ namespace osu.Game.Tests.Visual Beatmap.SetDefault(); Ruleset = Dependencies.Ruleset; - - var definedRuleset = CreateRuleset()?.RulesetInfo; - - if (definedRuleset != null) - { - // re-enable the bindable in case it was disabled. - // happens when restarting current test scene. - Ruleset.Disabled = false; - - // Set global ruleset bindable to the ruleset defined - // for this test scene and disallow changing it. - Ruleset.Value = definedRuleset; - Ruleset.Disabled = true; - } - else - Ruleset.SetDefault(); + Ruleset.SetDefault(); SelectedMods = Dependencies.Mods; SelectedMods.SetDefault(); @@ -145,7 +130,7 @@ namespace osu.Game.Tests.Visual /// Creates the ruleset to be used for this test scene. /// /// - /// When testing against ruleset-specific components, this method must be overriden to their ruleset. + /// When testing against ruleset-specific components, this method must be overriden to their corresponding ruleset. /// [CanBeNull] protected virtual Ruleset CreateRuleset() => null; From 741fa201492c41b916744315f28593f1e3c57cd9 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 4 Jun 2020 00:47:10 +0300 Subject: [PATCH 30/98] Use CreateRuleset() for editor test scenes as well --- .../TestSceneEditor.cs | 3 ++- .../TestSceneEditor.cs | 5 +---- .../TestSceneEditor.cs | 5 +---- .../Editing/TestSceneEditorChangeStates.cs | 8 +++----- osu.Game/Tests/Visual/EditorTestScene.cs | 19 +++++++++++-------- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/TestSceneEditor.cs b/osu.Game.Rulesets.Mania.Tests/TestSceneEditor.cs index 7ed886be49..3b9c03b86a 100644 --- a/osu.Game.Rulesets.Mania.Tests/TestSceneEditor.cs +++ b/osu.Game.Rulesets.Mania.Tests/TestSceneEditor.cs @@ -15,8 +15,9 @@ namespace osu.Game.Rulesets.Mania.Tests { private readonly Bindable direction = new Bindable(); + protected override Ruleset CreateEditorRuleset() => new ManiaRuleset(); + public TestSceneEditor() - : base(new ManiaRuleset()) { AddStep("upwards scroll", () => direction.Value = ManiaScrollingDirection.Up); AddStep("downwards scroll", () => direction.Value = ManiaScrollingDirection.Down); diff --git a/osu.Game.Rulesets.Osu.Tests/TestSceneEditor.cs b/osu.Game.Rulesets.Osu.Tests/TestSceneEditor.cs index 4aca34bf64..9239034a53 100644 --- a/osu.Game.Rulesets.Osu.Tests/TestSceneEditor.cs +++ b/osu.Game.Rulesets.Osu.Tests/TestSceneEditor.cs @@ -9,9 +9,6 @@ namespace osu.Game.Rulesets.Osu.Tests [TestFixture] public class TestSceneEditor : EditorTestScene { - public TestSceneEditor() - : base(new OsuRuleset()) - { - } + protected override Ruleset CreateEditorRuleset() => new OsuRuleset(); } } diff --git a/osu.Game.Rulesets.Taiko.Tests/TestSceneEditor.cs b/osu.Game.Rulesets.Taiko.Tests/TestSceneEditor.cs index 089a7ad00b..411fe08bcf 100644 --- a/osu.Game.Rulesets.Taiko.Tests/TestSceneEditor.cs +++ b/osu.Game.Rulesets.Taiko.Tests/TestSceneEditor.cs @@ -9,9 +9,6 @@ namespace osu.Game.Rulesets.Taiko.Tests [TestFixture] public class TestSceneEditor : EditorTestScene { - public TestSceneEditor() - : base(new TaikoRuleset()) - { - } + protected override Ruleset CreateEditorRuleset() => new TaikoRuleset(); } } diff --git a/osu.Game.Tests/Visual/Editing/TestSceneEditorChangeStates.cs b/osu.Game.Tests/Visual/Editing/TestSceneEditorChangeStates.cs index 20862e9cac..293a6e6869 100644 --- a/osu.Game.Tests/Visual/Editing/TestSceneEditorChangeStates.cs +++ b/osu.Game.Tests/Visual/Editing/TestSceneEditorChangeStates.cs @@ -4,6 +4,7 @@ using System.Linq; using NUnit.Framework; using osu.Framework.Testing; +using osu.Game.Rulesets; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Objects; @@ -13,13 +14,10 @@ namespace osu.Game.Tests.Visual.Editing { public class TestSceneEditorChangeStates : EditorTestScene { - public TestSceneEditorChangeStates() - : base(new OsuRuleset()) - { - } - private EditorBeatmap editorBeatmap; + protected override Ruleset CreateEditorRuleset() => new OsuRuleset(); + public override void SetUpSteps() { base.SetUpSteps(); diff --git a/osu.Game/Tests/Visual/EditorTestScene.cs b/osu.Game/Tests/Visual/EditorTestScene.cs index 2f6e6fb599..4f9a5b53b8 100644 --- a/osu.Game/Tests/Visual/EditorTestScene.cs +++ b/osu.Game/Tests/Visual/EditorTestScene.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System.Linq; +using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Testing; using osu.Game.Rulesets; @@ -15,17 +16,11 @@ namespace osu.Game.Tests.Visual { protected Editor Editor { get; private set; } - private readonly Ruleset ruleset; - - protected EditorTestScene(Ruleset ruleset) - { - this.ruleset = ruleset; - } - [BackgroundDependencyLoader] private void load() { - Beatmap.Value = CreateWorkingBeatmap(ruleset.RulesetInfo); + Ruleset.Value = CreateEditorRuleset().RulesetInfo; + Beatmap.Value = CreateWorkingBeatmap(Ruleset.Value); } public override void SetUpSteps() @@ -37,6 +32,14 @@ namespace osu.Game.Tests.Visual && Editor.ChildrenOfType().FirstOrDefault()?.IsLoaded == true); } + /// + /// Creates the ruleset for providing a corresponding beatmap to load the editor on. + /// + [NotNull] + protected abstract Ruleset CreateEditorRuleset(); + + protected sealed override Ruleset CreateRuleset() => CreateEditorRuleset(); + protected virtual Editor CreateEditor() => new Editor(); } } From 0f78af7252a08179cce65ee47d9bbe3acbf70c00 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 6 Jun 2020 19:19:30 +0300 Subject: [PATCH 31/98] Remove unnecessary disabled check I have a bad memory here, til. --- osu.Game/Tests/Visual/OsuTestScene.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index 88bd087215..e5d5442074 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -146,8 +146,7 @@ namespace osu.Game.Tests.Visual [BackgroundDependencyLoader] private void load(RulesetStore rulesets) { - if (!Ruleset.Disabled) - Ruleset.Value = rulesets.AvailableRulesets.First(); + Ruleset.Value = rulesets.AvailableRulesets.First(); } protected override void Dispose(bool isDisposing) From efd5e144103cfb7a06563674f23d712017550dd2 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sat, 6 Jun 2020 19:20:06 +0300 Subject: [PATCH 32/98] Clarify why ruleset bindable must be set at the BDL of any base test scene --- osu.Game/Tests/Visual/PlayerTestScene.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Tests/Visual/PlayerTestScene.cs b/osu.Game/Tests/Visual/PlayerTestScene.cs index 1e267726e0..05b1eea6b3 100644 --- a/osu.Game/Tests/Visual/PlayerTestScene.cs +++ b/osu.Game/Tests/Visual/PlayerTestScene.cs @@ -34,6 +34,8 @@ namespace osu.Game.Tests.Visual [BackgroundDependencyLoader] private void load() { + // There are test scenes using current value of the ruleset bindable + // on their BDLs (example in TestSceneSliderSnaking's BDL) Ruleset.Value = ruleset.RulesetInfo; Dependencies.Cache(LocalConfig = new OsuConfigManager(LocalStorage)); From 101604e741c70ffa92f0b10c39191d687749316b Mon Sep 17 00:00:00 2001 From: Craftplacer Date: Mon, 8 Jun 2020 00:39:33 +0200 Subject: [PATCH 33/98] Redesign classes and generally improve code --- osu.Desktop/Updater/SquirrelUpdateManager.cs | 20 +++------ .../Sections/General/UpdateSettings.cs | 14 +++--- osu.Game/Updater/SimpleUpdateManager.cs | 15 +------ osu.Game/Updater/UpdateManager.cs | 43 +++++++++++++------ 4 files changed, 43 insertions(+), 49 deletions(-) diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index 5c553f18f4..c55917fb5f 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -22,33 +22,25 @@ namespace osu.Desktop.Updater { public class SquirrelUpdateManager : osu.Game.Updater.UpdateManager { - public override bool CanCheckForUpdate => true; - private UpdateManager updateManager; private NotificationOverlay notificationOverlay; - private OsuGameBase gameBase; public Task PrepareUpdateAsync() => UpdateManager.RestartAppWhenExited(); private static readonly Logger logger = Logger.GetLogger("updater"); [BackgroundDependencyLoader] - private void load(NotificationOverlay notification, OsuGameBase game) + private void load(NotificationOverlay notification) { - gameBase = game; notificationOverlay = notification; Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger)); - CheckForUpdate(); + Schedule(() => Task.Run(CheckForUpdateAsync)); } - public override void CheckForUpdate() - { - if (gameBase.IsDeployedBuild) - Schedule(() => Task.Run(() => checkForUpdateAsync())); - } + protected override async Task InternalCheckForUpdateAsync() => await checkForUpdateAsync(); - private async void checkForUpdateAsync(bool useDeltaPatching = true, UpdateProgressNotification notification = null) + private async Task checkForUpdateAsync(bool useDeltaPatching = true, UpdateProgressNotification notification = null) { // should we schedule a retry on completion of this check? bool scheduleRecheck = true; @@ -90,7 +82,7 @@ namespace osu.Desktop.Updater // could fail if deltas are unavailable for full update path (https://github.com/Squirrel/Squirrel.Windows/issues/959) // try again without deltas. - checkForUpdateAsync(false, notification); + await checkForUpdateAsync(false, notification); scheduleRecheck = false; } else @@ -109,7 +101,7 @@ namespace osu.Desktop.Updater if (scheduleRecheck) { // check again in 30 minutes. - Scheduler.AddDelayed(() => checkForUpdateAsync(), 60000 * 30); + Scheduler.AddDelayed(async () => await checkForUpdateAsync(), 60000 * 30); } } } diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 62d1ef162f..4a2a50885e 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Threading.Tasks; using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Platform; @@ -28,15 +29,12 @@ namespace osu.Game.Overlays.Settings.Sections.General }); // We should only display the button for UpdateManagers that do check for updates - if (updateManager?.CanCheckForUpdate == true) + Add(new SettingsButton { - Add(new SettingsButton - { - Text = "Check for updates", - Action = updateManager.CheckForUpdate, - Enabled = { Value = game.IsDeployedBuild } - }); - } + Text = "Check for updates", + Action = () => Schedule(() => Task.Run(updateManager.CheckForUpdateAsync)), + Enabled = { Value = updateManager.CanCheckForUpdate } + }); if (RuntimeInfo.IsDesktop) { diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index d4e8aed5ae..78d27ab754 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -19,31 +19,20 @@ namespace osu.Game.Updater /// public class SimpleUpdateManager : UpdateManager { - public override bool CanCheckForUpdate => true; - private string version; [Resolved] private GameHost host { get; set; } - private OsuGameBase gameBase; - [BackgroundDependencyLoader] private void load(OsuGameBase game) { - gameBase = game; version = game.Version; - CheckForUpdate(); + Schedule(() => Task.Run(CheckForUpdateAsync)); } - public override void CheckForUpdate() - { - if (gameBase.IsDeployedBuild) - Schedule(() => Task.Run(checkForUpdateAsync)); - } - - private async void checkForUpdateAsync() + protected override async Task InternalCheckForUpdateAsync() { try { diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 41bbfb76a5..abe21f08a4 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -1,10 +1,10 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System.Threading.Tasks; using osu.Framework.Allocation; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; -using osu.Framework.Logging; using osu.Game.Configuration; using osu.Game.Graphics; using osu.Game.Overlays; @@ -18,9 +18,11 @@ namespace osu.Game.Updater public class UpdateManager : CompositeDrawable { /// - /// Whether this UpdateManager is capable of checking for updates. + /// Whether this UpdateManager should be or is capable of checking for updates. /// - public virtual bool CanCheckForUpdate => false; + public bool CanCheckForUpdate => game.IsDeployedBuild; + + private string lastVersion; [Resolved] private OsuConfigManager config { get; set; } @@ -35,24 +37,37 @@ namespace osu.Game.Updater { base.LoadComplete(); - var version = game.Version; - var lastVersion = config.Get(OsuSetting.Version); + Schedule(() => Task.Run(CheckForUpdateAsync)); - if (game.IsDeployedBuild && version != lastVersion) + // debug / local compilations will reset to a non-release string. + // can be useful to check when an install has transitioned between release and otherwise (see OsuConfigManager's migrations). + config.Set(OsuSetting.Version, game.Version); + } + + public async Task CheckForUpdateAsync() + { + if (!CanCheckForUpdate) + return; + + await InternalCheckForUpdateAsync(); + } + + protected virtual Task InternalCheckForUpdateAsync() + { + // Query last version only *once*, so the user can re-check for updates, in case they closed the notification or else. + lastVersion ??= config.Get(OsuSetting.Version); + + var version = game.Version; + + if (version != lastVersion) { // only show a notification if we've previously saved a version to the config file (ie. not the first run). if (!string.IsNullOrEmpty(lastVersion)) Notifications.Post(new UpdateCompleteNotification(version)); } - // debug / local compilations will reset to a non-release string. - // can be useful to check when an install has transitioned between release and otherwise (see OsuConfigManager's migrations). - config.Set(OsuSetting.Version, version); - } - - public virtual void CheckForUpdate() - { - Logger.Log("CheckForUpdate was called on the base class (UpdateManager)", LoggingTarget.Information); + // we aren't doing any async in this method, so we return a completed task instead. + return Task.CompletedTask; } private class UpdateCompleteNotification : SimpleNotification From 4fb71eeb20dcf96a46a54d025eca6689489bf2a5 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Wed, 10 Jun 2020 18:23:31 +0300 Subject: [PATCH 34/98] Move setting up the ruleset bindable to top-base test scene --- osu.Game/Tests/Visual/EditorTestScene.cs | 1 - osu.Game/Tests/Visual/OsuTestScene.cs | 2 +- osu.Game/Tests/Visual/PlayerTestScene.cs | 14 ++------------ osu.Game/Tests/Visual/SkinnableTestScene.cs | 7 +------ 4 files changed, 4 insertions(+), 20 deletions(-) diff --git a/osu.Game/Tests/Visual/EditorTestScene.cs b/osu.Game/Tests/Visual/EditorTestScene.cs index 4f9a5b53b8..cd08f4712a 100644 --- a/osu.Game/Tests/Visual/EditorTestScene.cs +++ b/osu.Game/Tests/Visual/EditorTestScene.cs @@ -19,7 +19,6 @@ namespace osu.Game.Tests.Visual [BackgroundDependencyLoader] private void load() { - Ruleset.Value = CreateEditorRuleset().RulesetInfo; Beatmap.Value = CreateWorkingBeatmap(Ruleset.Value); } diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index e5d5442074..6d0fc199c4 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -146,7 +146,7 @@ namespace osu.Game.Tests.Visual [BackgroundDependencyLoader] private void load(RulesetStore rulesets) { - Ruleset.Value = rulesets.AvailableRulesets.First(); + Ruleset.Value = CreateRuleset()?.RulesetInfo ?? rulesets.AvailableRulesets.First(); } protected override void Dispose(bool isDisposing) diff --git a/osu.Game/Tests/Visual/PlayerTestScene.cs b/osu.Game/Tests/Visual/PlayerTestScene.cs index 05b1eea6b3..2c46e7f6d3 100644 --- a/osu.Game/Tests/Visual/PlayerTestScene.cs +++ b/osu.Game/Tests/Visual/PlayerTestScene.cs @@ -24,20 +24,9 @@ namespace osu.Game.Tests.Visual protected OsuConfigManager LocalConfig; - private readonly Ruleset ruleset; - - protected PlayerTestScene() - { - ruleset = CreatePlayerRuleset(); - } - [BackgroundDependencyLoader] private void load() { - // There are test scenes using current value of the ruleset bindable - // on their BDLs (example in TestSceneSliderSnaking's BDL) - Ruleset.Value = ruleset.RulesetInfo; - Dependencies.Cache(LocalConfig = new OsuConfigManager(LocalStorage)); LocalConfig.GetBindable(OsuSetting.DimLevel).Value = 1.0; } @@ -58,7 +47,7 @@ namespace osu.Game.Tests.Visual action?.Invoke(); - AddStep(ruleset.Description, LoadPlayer); + AddStep(CreatePlayerRuleset().Description, LoadPlayer); AddUntilStep("player loaded", () => Player.IsLoaded && Player.Alpha == 1); } @@ -68,6 +57,7 @@ namespace osu.Game.Tests.Visual protected void LoadPlayer() { + var ruleset = Ruleset.Value.CreateInstance(); var beatmap = CreateBeatmap(ruleset.RulesetInfo); Beatmap.Value = CreateWorkingBeatmap(beatmap); diff --git a/osu.Game/Tests/Visual/SkinnableTestScene.cs b/osu.Game/Tests/Visual/SkinnableTestScene.cs index 41147d3768..ea7cdaaac6 100644 --- a/osu.Game/Tests/Visual/SkinnableTestScene.cs +++ b/osu.Game/Tests/Visual/SkinnableTestScene.cs @@ -23,8 +23,6 @@ namespace osu.Game.Tests.Visual { public abstract class SkinnableTestScene : OsuGridTestScene { - private readonly Ruleset ruleset; - private Skin metricsSkin; private Skin defaultSkin; private Skin specialSkin; @@ -33,14 +31,11 @@ namespace osu.Game.Tests.Visual protected SkinnableTestScene() : base(2, 3) { - ruleset = CreateRulesetForSkinProvider(); } [BackgroundDependencyLoader] private void load(AudioManager audio, SkinManager skinManager) { - Ruleset.Value = ruleset.RulesetInfo; - var dllStore = new DllResourceStore(DynamicCompilationOriginal.GetType().Assembly); metricsSkin = new TestLegacySkin(new SkinInfo { Name = "metrics-skin" }, new NamespacedResourceStore(dllStore, "Resources/metrics_skin"), audio, true); @@ -110,7 +105,7 @@ namespace osu.Game.Tests.Visual { new OutlineBox { Alpha = autoSize ? 1 : 0 }, mainProvider.WithChild( - new SkinProvidingContainer(ruleset.CreateLegacySkinProvider(mainProvider, beatmap)) + new SkinProvidingContainer(Ruleset.Value.CreateInstance().CreateLegacySkinProvider(mainProvider, beatmap)) { Child = created, RelativeSizeAxes = !autoSize ? Axes.Both : Axes.None, From 91b6979c970cce7f6eadc11533b34848add6b8a8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 13:38:20 +0900 Subject: [PATCH 35/98] Fix LoadingSpinner not always playing fade in animation --- osu.Game/Graphics/UserInterface/LoadingSpinner.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Graphics/UserInterface/LoadingSpinner.cs b/osu.Game/Graphics/UserInterface/LoadingSpinner.cs index 4f4607c114..8174c4d5fe 100644 --- a/osu.Game/Graphics/UserInterface/LoadingSpinner.cs +++ b/osu.Game/Graphics/UserInterface/LoadingSpinner.cs @@ -17,6 +17,8 @@ namespace osu.Game.Graphics.UserInterface { private readonly SpriteIcon spinner; + protected override bool StartHidden => true; + protected Container MainContents; public const float TRANSITION_DURATION = 500; From 95f57ca88c3f17ddebe7e449d8345e9c672d98fc Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 18:05:23 +0900 Subject: [PATCH 36/98] Remove duplicate calls to CheckForUpdatesAsync --- osu.Desktop/Updater/SquirrelUpdateManager.cs | 1 - osu.Game/Updater/SimpleUpdateManager.cs | 2 -- 2 files changed, 3 deletions(-) diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index 3bd10215c2..748969ade5 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -35,7 +35,6 @@ namespace osu.Desktop.Updater notificationOverlay = notification; Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger)); - Schedule(() => Task.Run(CheckForUpdateAsync)); } protected override async Task InternalCheckForUpdateAsync() => await checkForUpdateAsync(); diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index 78d27ab754..b61c88a280 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -28,8 +28,6 @@ namespace osu.Game.Updater private void load(OsuGameBase game) { version = game.Version; - - Schedule(() => Task.Run(CheckForUpdateAsync)); } protected override async Task InternalCheckForUpdateAsync() From 6beb28b685205a886e98235c6c332912b612ad18 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 18:07:39 +0900 Subject: [PATCH 37/98] Rename method to be less bad --- osu.Desktop/Updater/SquirrelUpdateManager.cs | 2 +- osu.Game/Updater/SimpleUpdateManager.cs | 2 +- osu.Game/Updater/UpdateManager.cs | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Desktop/Updater/SquirrelUpdateManager.cs b/osu.Desktop/Updater/SquirrelUpdateManager.cs index 748969ade5..05c8e835ac 100644 --- a/osu.Desktop/Updater/SquirrelUpdateManager.cs +++ b/osu.Desktop/Updater/SquirrelUpdateManager.cs @@ -37,7 +37,7 @@ namespace osu.Desktop.Updater Splat.Locator.CurrentMutable.Register(() => new SquirrelLogger(), typeof(Splat.ILogger)); } - protected override async Task InternalCheckForUpdateAsync() => await checkForUpdateAsync(); + protected override async Task PerformUpdateCheck() => await checkForUpdateAsync(); private async Task checkForUpdateAsync(bool useDeltaPatching = true, UpdateProgressNotification notification = null) { diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs index b61c88a280..ebb9995c66 100644 --- a/osu.Game/Updater/SimpleUpdateManager.cs +++ b/osu.Game/Updater/SimpleUpdateManager.cs @@ -30,7 +30,7 @@ namespace osu.Game.Updater version = game.Version; } - protected override async Task InternalCheckForUpdateAsync() + protected override async Task PerformUpdateCheck() { try { diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index abe21f08a4..9037187e8d 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -49,10 +49,10 @@ namespace osu.Game.Updater if (!CanCheckForUpdate) return; - await InternalCheckForUpdateAsync(); + await PerformUpdateCheck(); } - protected virtual Task InternalCheckForUpdateAsync() + protected virtual Task PerformUpdateCheck() { // Query last version only *once*, so the user can re-check for updates, in case they closed the notification or else. lastVersion ??= config.Get(OsuSetting.Version); From 3dd642a33667d53d5d78a857c1f5548e335f9882 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 18:29:21 +0900 Subject: [PATCH 38/98] Ensure only one update check can be running at a time --- osu.Game/Updater/UpdateManager.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 9037187e8d..06d6a39066 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -44,12 +44,22 @@ namespace osu.Game.Updater config.Set(OsuSetting.Version, game.Version); } + private readonly object updateTaskLock = new object(); + + private Task updateCheckTask; + public async Task CheckForUpdateAsync() { if (!CanCheckForUpdate) return; - await PerformUpdateCheck(); + lock (updateTaskLock) + updateCheckTask ??= PerformUpdateCheck(); + + await updateCheckTask; + + lock (updateTaskLock) + updateCheckTask = null; } protected virtual Task PerformUpdateCheck() From 4f809767a5f9cf762244843021a6f33ac99c94af Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 18:36:36 +0900 Subject: [PATCH 39/98] Disable button while update check is in progress --- .../Settings/Sections/General/UpdateSettings.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 4a2a50885e..869e6c9c51 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -19,6 +19,8 @@ namespace osu.Game.Overlays.Settings.Sections.General protected override string Header => "Updates"; + private SettingsButton checkForUpdatesButton; + [BackgroundDependencyLoader(true)] private void load(Storage storage, OsuConfigManager config, OsuGame game) { @@ -29,11 +31,14 @@ namespace osu.Game.Overlays.Settings.Sections.General }); // We should only display the button for UpdateManagers that do check for updates - Add(new SettingsButton + Add(checkForUpdatesButton = new SettingsButton { Text = "Check for updates", - Action = () => Schedule(() => Task.Run(updateManager.CheckForUpdateAsync)), - Enabled = { Value = updateManager.CanCheckForUpdate } + Action = () => + { + checkForUpdatesButton.Enabled.Value = false; + Task.Run(updateManager.CheckForUpdateAsync).ContinueWith(t => Schedule(() => checkForUpdatesButton.Enabled.Value = true)); + } }); if (RuntimeInfo.IsDesktop) From 35f577375c53c9f1a7c2cc159c32d468a2d9ce41 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 19:20:45 +0900 Subject: [PATCH 40/98] Restore notification code --- osu.Game/Updater/UpdateManager.cs | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 06d6a39066..35f9ad512f 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -39,6 +39,18 @@ namespace osu.Game.Updater Schedule(() => Task.Run(CheckForUpdateAsync)); + // Query last version only *once*, so the user can re-check for updates, in case they closed the notification or else. + lastVersion ??= config.Get(OsuSetting.Version); + + var version = game.Version; + + if (game.IsDeployedBuild && version != lastVersion) + { + // only show a notification if we've previously saved a version to the config file (ie. not the first run). + if (!string.IsNullOrEmpty(lastVersion)) + Notifications.Post(new UpdateCompleteNotification(version)); + } + // debug / local compilations will reset to a non-release string. // can be useful to check when an install has transitioned between release and otherwise (see OsuConfigManager's migrations). config.Set(OsuSetting.Version, game.Version); @@ -62,23 +74,7 @@ namespace osu.Game.Updater updateCheckTask = null; } - protected virtual Task PerformUpdateCheck() - { - // Query last version only *once*, so the user can re-check for updates, in case they closed the notification or else. - lastVersion ??= config.Get(OsuSetting.Version); - - var version = game.Version; - - if (version != lastVersion) - { - // only show a notification if we've previously saved a version to the config file (ie. not the first run). - if (!string.IsNullOrEmpty(lastVersion)) - Notifications.Post(new UpdateCompleteNotification(version)); - } - - // we aren't doing any async in this method, so we return a completed task instead. - return Task.CompletedTask; - } + protected virtual Task PerformUpdateCheck() => Task.CompletedTask; private class UpdateCompleteNotification : SimpleNotification { From 89cf146d18a804cca959ff18dfceb399bbb31828 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 19:24:50 +0900 Subject: [PATCH 41/98] Fix base UpdateManager thinking it can check for updates --- osu.Game/Updater/UpdateManager.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 35f9ad512f..d3a05deac5 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -20,7 +20,9 @@ namespace osu.Game.Updater /// /// Whether this UpdateManager should be or is capable of checking for updates. /// - public bool CanCheckForUpdate => game.IsDeployedBuild; + public bool CanCheckForUpdate => game.IsDeployedBuild && + // only implementations will actually check for updates. + GetType() != typeof(UpdateManager); private string lastVersion; From 446ce2590cf93c4c69072f0e384d803ded88fc16 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 19:25:54 +0900 Subject: [PATCH 42/98] Move local back in place --- osu.Game/Updater/UpdateManager.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index d3a05deac5..51f48264b8 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -24,8 +24,6 @@ namespace osu.Game.Updater // only implementations will actually check for updates. GetType() != typeof(UpdateManager); - private string lastVersion; - [Resolved] private OsuConfigManager config { get; set; } @@ -42,7 +40,7 @@ namespace osu.Game.Updater Schedule(() => Task.Run(CheckForUpdateAsync)); // Query last version only *once*, so the user can re-check for updates, in case they closed the notification or else. - lastVersion ??= config.Get(OsuSetting.Version); + var lastVersion = config.Get(OsuSetting.Version); var version = game.Version; From f5c3863e6d97f71b65f06de59f2754b03f71f642 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 19:26:46 +0900 Subject: [PATCH 43/98] Revert variable usage --- osu.Game/Updater/UpdateManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 51f48264b8..bcaaf8e343 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -53,7 +53,7 @@ namespace osu.Game.Updater // debug / local compilations will reset to a non-release string. // can be useful to check when an install has transitioned between release and otherwise (see OsuConfigManager's migrations). - config.Set(OsuSetting.Version, game.Version); + config.Set(OsuSetting.Version, version); } private readonly object updateTaskLock = new object(); From 7ae421cc8e8a64f73a65e77e92c40c318f23b6a5 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 19:32:32 +0900 Subject: [PATCH 44/98] Revert more incorrect changes --- osu.Game/Updater/UpdateManager.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index bcaaf8e343..5da366bde9 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -39,11 +39,10 @@ namespace osu.Game.Updater Schedule(() => Task.Run(CheckForUpdateAsync)); - // Query last version only *once*, so the user can re-check for updates, in case they closed the notification or else. - var lastVersion = config.Get(OsuSetting.Version); - var version = game.Version; + var lastVersion = config.Get(OsuSetting.Version); + if (game.IsDeployedBuild && version != lastVersion) { // only show a notification if we've previously saved a version to the config file (ie. not the first run). From 9746e24d1efb5e85e22053e867629fc77910c4e7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 12 Jun 2020 19:40:54 +0900 Subject: [PATCH 45/98] Rename abstract TestScene --- osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs | 2 +- .../Gameplay/{TestPlayerTestScene.cs => OsuPlayerTestScene.cs} | 2 +- .../Visual/Gameplay/TestSceneCompletionCancellation.cs | 2 +- osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs | 2 +- osu.Game.Tests/Visual/Gameplay/TestScenePause.cs | 2 +- osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename osu.Game.Tests/Visual/Gameplay/{TestPlayerTestScene.cs => OsuPlayerTestScene.cs} (87%) diff --git a/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs b/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs index 7d3d8b7f16..acefaa006a 100644 --- a/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs +++ b/osu.Game.Tests/Gameplay/TestSceneHitObjectSamples.cs @@ -25,7 +25,7 @@ using osu.Game.Users; namespace osu.Game.Tests.Gameplay { [HeadlessTest] - public class TestSceneHitObjectSamples : TestPlayerTestScene + public class TestSceneHitObjectSamples : OsuPlayerTestScene { private readonly SkinInfo userSkinInfo = new SkinInfo(); diff --git a/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs b/osu.Game.Tests/Visual/Gameplay/OsuPlayerTestScene.cs similarity index 87% rename from osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs rename to osu.Game.Tests/Visual/Gameplay/OsuPlayerTestScene.cs index bbf0136b00..cbf8515567 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestPlayerTestScene.cs +++ b/osu.Game.Tests/Visual/Gameplay/OsuPlayerTestScene.cs @@ -9,7 +9,7 @@ namespace osu.Game.Tests.Visual.Gameplay /// /// A with an arbitrary ruleset value to test with. /// - public abstract class TestPlayerTestScene : PlayerTestScene + public abstract class OsuPlayerTestScene : PlayerTestScene { protected override Ruleset CreatePlayerRuleset() => new OsuRuleset(); } diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneCompletionCancellation.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneCompletionCancellation.cs index f87999ae61..79275d70a7 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneCompletionCancellation.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneCompletionCancellation.cs @@ -16,7 +16,7 @@ using osuTK; namespace osu.Game.Tests.Visual.Gameplay { - public class TestSceneCompletionCancellation : TestPlayerTestScene + public class TestSceneCompletionCancellation : OsuPlayerTestScene { private Track track; diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs index 744eeed022..2a119f5199 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestSceneGameplayRewinding.cs @@ -16,7 +16,7 @@ using osuTK; namespace osu.Game.Tests.Visual.Gameplay { - public class TestSceneGameplayRewinding : TestPlayerTestScene + public class TestSceneGameplayRewinding : OsuPlayerTestScene { [Resolved] private AudioManager audioManager { get; set; } diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs index 411265d600..387ac42f67 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePause.cs @@ -16,7 +16,7 @@ using osuTK.Input; namespace osu.Game.Tests.Visual.Gameplay { - public class TestScenePause : TestPlayerTestScene + public class TestScenePause : OsuPlayerTestScene { protected new PausePlayer Player => (PausePlayer)base.Player; diff --git a/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs b/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs index 20911bfa4d..e43e5ba3ce 100644 --- a/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs +++ b/osu.Game.Tests/Visual/Gameplay/TestScenePauseWhenInactive.cs @@ -12,7 +12,7 @@ using osu.Game.Rulesets; namespace osu.Game.Tests.Visual.Gameplay { [HeadlessTest] // we alter unsafe properties on the game host to test inactive window state. - public class TestScenePauseWhenInactive : TestPlayerTestScene + public class TestScenePauseWhenInactive : OsuPlayerTestScene { protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) { From 7c3e7b65a820365799af5ebb590276263d28bb2a Mon Sep 17 00:00:00 2001 From: mcendu Date: Fri, 12 Jun 2020 21:22:22 +0800 Subject: [PATCH 46/98] add custom file path support for osu\!mania judgement sprite --- .../Skinning/ManiaLegacySkinTransformer.cs | 66 +++++++++++-------- .../LegacyManiaSkinConfigurationLookup.cs | 8 ++- osu.Game/Skinning/LegacySkin.cs | 18 +++++ 3 files changed, 65 insertions(+), 27 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs index e64178083a..9ba544ed59 100644 --- a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs @@ -11,6 +11,7 @@ using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Skinning; +using System.Collections.Generic; namespace osu.Game.Rulesets.Mania.Skinning { @@ -19,6 +20,36 @@ namespace osu.Game.Rulesets.Mania.Skinning private readonly ISkin source; private readonly ManiaBeatmap beatmap; + /// + /// Mapping of to ther corresponding + /// value. + /// + private static readonly IReadOnlyDictionary componentMapping + = new Dictionary + { + { HitResult.Perfect, LegacyManiaSkinConfigurationLookups.Hit300g }, + { HitResult.Great, LegacyManiaSkinConfigurationLookups.Hit300 }, + { HitResult.Good, LegacyManiaSkinConfigurationLookups.Hit200 }, + { HitResult.Ok, LegacyManiaSkinConfigurationLookups.Hit100 }, + { HitResult.Meh, LegacyManiaSkinConfigurationLookups.Hit50 }, + { HitResult.Miss, LegacyManiaSkinConfigurationLookups.Hit0 } + }; + + /// + /// Mapping of to their corresponding + /// default filenames. + /// + private static readonly IReadOnlyDictionary defaultName + = new Dictionary + { + { HitResult.Perfect, "mania-hit300g" }, + { HitResult.Great, "mania-hit300" }, + { HitResult.Good, "mania-hit200" }, + { HitResult.Ok, "mania-hit100" }, + { HitResult.Meh, "mania-hit50" }, + { HitResult.Miss, "mania-hit0" } + }; + private Lazy isLegacySkin; /// @@ -47,15 +78,15 @@ namespace osu.Game.Rulesets.Mania.Skinning public Drawable GetDrawableComponent(ISkinComponent component) { + if (!isLegacySkin.Value || !hasKeyTexture.Value) + return null; + switch (component) { case GameplaySkinComponent resultComponent: - return getResult(resultComponent); + return getResult(resultComponent.Component); case ManiaSkinComponent maniaComponent: - if (!isLegacySkin.Value || !hasKeyTexture.Value) - return null; - switch (maniaComponent.Component) { case ManiaSkinComponents.ColumnBackground: @@ -95,30 +126,13 @@ namespace osu.Game.Rulesets.Mania.Skinning return null; } - private Drawable getResult(GameplaySkinComponent resultComponent) + private Drawable getResult(HitResult result) { - switch (resultComponent.Component) - { - case HitResult.Miss: - return this.GetAnimation("mania-hit0", true, true); + string image = GetConfig( + new ManiaSkinConfigurationLookup(componentMapping[result]) + )?.Value ?? defaultName[result]; - case HitResult.Meh: - return this.GetAnimation("mania-hit50", true, true); - - case HitResult.Ok: - return this.GetAnimation("mania-hit100", true, true); - - case HitResult.Good: - return this.GetAnimation("mania-hit200", true, true); - - case HitResult.Great: - return this.GetAnimation("mania-hit300", true, true); - - case HitResult.Perfect: - return this.GetAnimation("mania-hit300g", true, true); - } - - return null; + return this.GetAnimation(image, true, true); } public Texture GetTexture(string componentName) => source.GetTexture(componentName); diff --git a/osu.Game/Skinning/LegacyManiaSkinConfigurationLookup.cs b/osu.Game/Skinning/LegacyManiaSkinConfigurationLookup.cs index c76d5c8784..4990ca8e60 100644 --- a/osu.Game/Skinning/LegacyManiaSkinConfigurationLookup.cs +++ b/osu.Game/Skinning/LegacyManiaSkinConfigurationLookup.cs @@ -43,6 +43,12 @@ namespace osu.Game.Skinning MinimumColumnWidth, LeftStageImage, RightStageImage, - BottomStageImage + BottomStageImage, + Hit300g, + Hit300, + Hit200, + Hit100, + Hit50, + Hit0, } } diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs index 003fa24d5b..390dc871e4 100644 --- a/osu.Game/Skinning/LegacySkin.cs +++ b/osu.Game/Skinning/LegacySkin.cs @@ -257,6 +257,24 @@ namespace osu.Game.Skinning case LegacyManiaSkinConfigurationLookups.RightLineWidth: Debug.Assert(maniaLookup.TargetColumn != null); return SkinUtils.As(new Bindable(existing.ColumnLineWidth[maniaLookup.TargetColumn.Value + 1])); + + case LegacyManiaSkinConfigurationLookups.Hit0: + return SkinUtils.As(getManiaImage(existing, "Hit0")); + + case LegacyManiaSkinConfigurationLookups.Hit50: + return SkinUtils.As(getManiaImage(existing, "Hit50")); + + case LegacyManiaSkinConfigurationLookups.Hit100: + return SkinUtils.As(getManiaImage(existing, "Hit100")); + + case LegacyManiaSkinConfigurationLookups.Hit200: + return SkinUtils.As(getManiaImage(existing, "Hit200")); + + case LegacyManiaSkinConfigurationLookups.Hit300: + return SkinUtils.As(getManiaImage(existing, "Hit300")); + + case LegacyManiaSkinConfigurationLookups.Hit300g: + return SkinUtils.As(getManiaImage(existing, "Hit300g")); } return null; From 8a9d01119753923a0230e0c5bea40f93b4586cdf Mon Sep 17 00:00:00 2001 From: mcendu Date: Fri, 12 Jun 2020 22:09:58 +0800 Subject: [PATCH 47/98] add test files --- .../Resources/special-skin/mania/hit0@2x.png | Bin 0 -> 56621 bytes .../Resources/special-skin/mania/hit100@2x.png | Bin 0 -> 66535 bytes .../Resources/special-skin/mania/hit200@2x.png | Bin 0 -> 82190 bytes .../Resources/special-skin/mania/hit300@2x.png | Bin 0 -> 92906 bytes .../special-skin/mania/hit300g-0@2x.png | Bin 0 -> 56026 bytes .../special-skin/mania/hit300g-1@2x.png | Bin 0 -> 57038 bytes .../Resources/special-skin/mania/hit50@2x.png | Bin 0 -> 57215 bytes .../special-skin/mania/stage-bottom@2x.png | Bin 0 -> 1965 bytes .../Resources/special-skin/skin.ini | 11 +++++++++-- 9 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit0@2x.png create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit100@2x.png create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit200@2x.png create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit300@2x.png create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit300g-0@2x.png create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit300g-1@2x.png create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit50@2x.png create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/stage-bottom@2x.png diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit0@2x.png b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit0@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7b9bc34f3ea66e5d4e687adb312f36d7c5a4bd GIT binary patch literal 56621 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

~<2&bFepI2$u~| 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 FV1mC)D$D=? literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit200@2x.png b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit200@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..24ad926375e8c88df664bdd9555ddddc1a748be9 GIT binary patch literal 82190 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 IM6N<$f=61fdH?_b literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit300@2x.png b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit300@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..098561f980ddc8a17308c29a62a249fd2812e370 GIT binary patch literal 92906 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

E=Rmmw{ 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­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 literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit300g-1@2x.png b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/hit300g-1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f17b2b1e737a4d9b1c88247a738dadec3d9dfd1a GIT binary patch literal 57038 zcmV)0K+eC3P)4Tx07wm;mUmPX*B8g%%xo{TU6vwc>AklFq%OTkl_mFQv@x1^BM1TV}0C2duqR=S6Xn?LjUp6xrb&~O43j*Nv zEr418u3H3zGns$s|L;SQD-ufpfWpxLJ03rmi*g~#S@{x?OrJ!Vo{}kJ7$ajbnjp%m zGEV!%=70KpVow?KvV}a4moSaFCQKV= zXBIPnpP$8-NG!rR+)R#`$7JVZi#Wn10DSspSrkx`)s~4C+0n+?(b2-z5-tDd^^cpM zz5W?wz5V3zGUCskL5!X++LzcbT23thtSPiMTfS&1I{|204}j|3FPi>70OSh+Xzlyz zdl<5LNtZ}OE>>3g`T3RtKG#xK(9i3CI(+v0d-&=+OWAp!Ysd8Ar*foO5~i%E+?=c& zshF87;&Ay)i~kOm zCIB-Z!^JGdti+UJsxgN!t(Y#%b<8kk67vyD#cE*9urAm@Y#cTXn~yERR$}Y1E!Yd# zo7hq8Ya9;8z!~A3Z~?e@Tn26#t`xT$*Ni)h>&K1Yrto;Y8r}@=h7ZGY@Dh9xekcA2 z{tSKqKZ<`tAQQ9+wgf*y0zpVvOQ<9qCY&Y=5XJ~ILHOG0j2XwBQ%7jM`P2tv~{#P+6CGu9Y;5!2hua>CG_v;z4S?CC1rc%807-x z8s$^ULkxsr$OvR)G0GUn7`GVjR5Vq*RQM{JRGL%DRgX~5SKp(4L49HleU9rK?wsN|$L8GCfHh1tA~lw29MI^|n9|hJ z^w$(=?$kW5IibbS^3=-Es?a*EHLgw5cGnhYS7@Kne#%s4dNH$@Rm?8tq>hG8fR0pW zzfP~tjINRHeBHIW&AJctNO~;2RJ{tlPQ6KeZT(RF<@$~KcMXUJEQ54|9R}S7(}qTd zv4$HA+YFx=sTu_uEj4O1x^GN1_Ap*-Tx)#81ZToB$u!w*a?KPrbudjgtugI0gUuYx z1ZKO<`pvQC&gMe%TJu2*iiMX&o<*a@uqDGX#B!}=o8@yWeX9hktybMuAFUm%v#jf^ z@7XBX1lg>$>9G0T*3_13TVs2}j%w#;x5}>F?uEUXJ>Pzh{cQ)DL#V?BhfaqNj!uqZ z$0o;dCw-@6r(I5iEIKQkRm!^LjCJ;QUgdn!`K^nii^S!a%Wtk0u9>cfU7yS~n#-SC zH+RHM*Nx-0-)+d9>7MMq&wa>4$AjZh>+#4_&y(j_?>XjW;+5fb#Ot}YwYS*2#e16V z!d}5X>x20C`xN{1`YQR(_pSDQ=%?$K=GW*q>F?mb%>QfvHXt})YrtTjW*|4PA#gIt zDQHDdS1=_wD!4lMQHW`XIHV&K4h;(37J7f4!93x-wlEMD7`83!LAX));_x3Ma1r4V zH4%>^Z6cRPc1O{olA;bry^i*dE{nc5-*~=serJq)Okzw!%yg_zYWi`#ol25V;v^kU#wN!mA5MPH z3FFjqrcwe^cBM>m+1wr6XFN|{1#g`1#xLiOrMjh-r#?w@OWT$Wgg6&&5F%x&L(6hXP*!%2{VOVIa)adIsGCtQITk9vCHD^izmgw;`&@D zcVTY3gpU49^+=7S>!rha?s+wNZ}MaEj~6Hw2n%|am@e70WNfM5(r=exmT{MLF4tMU zX8G_6uNC`OLMu~NcCOM}Rk&(&wg2ivYe;J{*Zj2BdTsgISLt?eJQu}$~QLORDCnMIdyYynPb_W zEx0YhEw{FMY&}%2SiZD;WLxOA)(U1tamB0cN!u@1+E?z~LE0hRF;o>&)xJ}I=a!xC ztJAA*)_B)6@6y<{Y1i~_-tK`to_m`1YVIxB`);3L-|hYW`&(-bYby`n4&)tpTo+T< z{VnU;hI;k-lKKw^g$IWYMIP#EaB65ctZ}%k5pI+=jvq-pa_u{x@7kLzn)Wv{noEv? zqtc^Kzfb=D*0JDYoyS?nn|?6(VOI;SrMMMpUD7()mfkkh9^c-7BIrbChiga6kCs0k zJgIZC=9KcOveTr~g{NoFEIl)IR&;jaT-v#j&ZN$J=i|=b=!)p-y%2oi(nY_E=exbS z&s=i5bn>#xz3Ke>~2=f&N;yEFGz-^boBexUH6@}b7V+Mi8+ZXR+R zIyLMw-18{v(Y+Dw$g^K^e|bMz_?Y^*a!h-y;fd{&ljDBl*PbqTI{HlXY-Xb9SH)j< zJvV;-!*8Cy^-RW1j=m7TnEk!~;N?(*L2 z?gyYjG(kup1yP_ZQIb~#pb*t)B{p-}JQ|AOlQJ8T;5SU=}-gr@rUccrKR!Yicl_H;%SVi#skpIeiL0{-R^R)!oJ%-{_ln zZ2)BzFkGu0z;^48itTEuL(g=2Pw2a*q3^=>d`X}m5wH&KHDEt>>k639KYTygyTh2< z%S?AZvvRLq482ni2jzA&w3eGO9lha{so`{j~>WJ<`=DyDmX&Li7BD z-mW0{nb7y@YtNeky(4BF%Bn`X3f$*R(D_W+AbYa_c-83oPnh7AqsDYkKgzWuzJ9oU z|NP0o96r42+EsOO(x>*MY0Mt3myo| zKeOpQp|3Glb9>$p=vRUK8i4l=RUEq-X#a^v0QIAQI>+Z}ur$1Z_RlhAs68R;%m;IG zb2=P_VdrcGU!zM`#X;OYupzjcdBgv_3EOkk{nIAy9(2daYzg3vrE;&1K$WI(gDE`t zuLb@W0s6;%iFnZ8Wq=HG)hPjP<8 z)a#ClU_bT8tf@b~Xr79Cv?0x(3VJJ(D&eBW0QihQ1^WqopXB!Z6w-Gc(60sg<0R%G zL^SIGUJVs+pEiMjeb_R={to-50Q`VS8zxAX&Ie|8)?`ZyT-(Q=F==vve5(tD+&-);0>$GuPJJ4SonUG!ZK^bSI3RS?$?xdrl_L!N`L0X*Q|e$3cmlg24v zPdHyH_gQR$tjoq;jdZHVeujpt{WTL7T~5O0Okp_GnQd0^*XfwB*)GBs=NB)Uu(hXH z9GD^m{3G@P|F~^Nz@KzC2mQJEGR}2?UzOxj$?>ga1XKXWZY|~QYng!&xYwBh>WV(kVT7Cj>~g*@hSgVgsv;}7S*lJFGp`^ z9Yb^9(R+Fu^Qbx5Ia2u1oj`w6dMmG#z>`Vu34O0k`mO@{5s_=d?>fleGy_+Lh^8|D z+y(MOV|%HwZ5nGoGj@=5Y#z6RRzw44%lmBXn*;5;RMD2n2kcv|r@VRY{0F;CLICVZ z%k#B-qFbIXFPmO6RoGMjy<}`-x(GSewoFG54y$c&q39min|t72=*<_+o91#40w+6w ze+l`QW_j zOHkIAK3|xgHf5bzCP!07^@d$pXQ(?0W&Lr7{5+NQ2x1d#b_MiqLGO5l-Z7)Q&P`@S z?-ulatVVD1!2L|(-%)Jb!3O|7kiSD=Lf>ngzV*67>*Ak4Bi5wrT999Wc^L@c!Lu%4 z-v{Vh(_91W8*D?sKFODD9!&*l)@2_Ajj$QygI=X9gp6MqBz%L4`eP)V*ZRP3!v?Y5@zN~#@a)Ez0HV*V# ziOC)3*F9CVlSBDh09eKGd2vojxhI9&TLl7Zm;h;6`T3eT`ZO=fYpXs0@V)fB&63%m zm0h%1yeAlDi?$WbuwSBnOb1Od1Y!iJ7j7FG>Wr@STz$#Ia$ltVGKY3;L-g;Arx@a+vbhnrw^KuV2LQ^s@75{?K$qq#8T^QYU&RE#y(jyF z7L0(H0D*gw1rFGgrs@YwK-dc6yl3-4Gsp_n59);gUiE`x?M>1!vFZx-qzJWFP#yBe z?$ljf`Pqp&RU@(@u1+_iw{8zFL+=QB_iOZKXj8;tkqh*bWoQe%JA?B@Gn&mi(0v5> zbq>Fx_ed?b*1?ZU?+JZHJ;F6g-!gOM?+EBey}IY-tA>1i-`Is4Y9QZ+S-p5M98B%8 zkuhNun2>S`!=4F;K|hR&hDB^+qk>T`Fs8l0z5wV2@{x`+8gX1t##MGa1kA&@g1@2R zl#FpcfE^v}1@-`Z2*9%s8S4bupvbh(`$ZU-Jhcr6^22@!_5-_|N4+9Xr>8S<`G9*a zF5h$bCE!0=%ugT5{iLn9`<-n3o)V+_pbKlbct2m`W$+T^iG%O%T>^HBQ%QmE>D&;#7VPM$=0-d)Ud5BMt`{3FHQ#?gE| zcYn7rcimNJjJ#d2pU}6Ysr$VK>08U4JKPlLKYt$iJK7Q&j&}|)-*o0|*lQmE_9%WX$kggQ*#xZ2XtlV zhPafvUkCan&l`j^x9U7VB`&Q%UO;c*U(v)#t;i+?Q$j3(u4T)Y?4 zj7E7d0OH{NC{JR%$acdtY1y#X3$vtY?Vul)OaROPbt8%fHY?!tb?lgd7?I7eJQgzm zCn2UlOhTD94UtlJ%q;@vS$SUG-}&F2pm!J~(Am?w?`WSv^C;})S<%dxn9tLe$r1p+ z58zMb?aX)Z9j3K3XR~j{p+?6E(ySuMF*DN5NX`dFkrNIm6 zEnAkt*#T8~oMd)50Pi>ktt990wax@3gj;^!joF9={?9nB-Z2DX4m{9PXLLy2zsaVPtZGy zD|!!0ddD$MVnF9^vOG!X?@SgB1o%ak6s=5v?>hLL4nADSr}yv6I&|=HHD5E&eD$i) zoL_ITMVe3O>uS)tpKFD_>oQhd*bwMFH^1lP$#ChwVcVkN#xzv)WkTCuiV&y*@-6CW zKMukM63Ri$06hxwVU$|Hp9by#KP&fY)U;fMXYl4WU|hp-UV*y4P0+yg;3J~>G%mK=nR4KZ|JPpFIGE!zCMqiQN|>B#jU^L`B|<#mVQxLGnj`KWPp>kpGDJT(O_KG;!h#bNDz=&jN3- zKlGLoRJ&uB7#>r|1%FpTumLc%SsS}dr-j%?FC?rl~Q*8mG@*w zU(3d?22Z1-e-OA!OcR0OLjXQb5nW`l_GXaL?9(D_Fvs1?niT+0C8glEuJK^ zvR~9Wbcb63U7wI|*>hokxZfs@i#H*RQA-HZCb=W_+GYs>7cD+f1>zUiw!!*W>JsnI3XIFG6gR?=4Hd)mkU*aqK zovKflq&J_-r_C^E7v&TlBDULhGD>>WzXcf>O2l(&5+t~SAjg<`cT*x{f8nf+PjG{ez!o0H_ z2k{hBMkdbfAo=*6Nh|xY;^*Tp2X{z;rqHIzv1(t4`C@bXs{+zDFQ~Ea(E0&7lYGD| z4{s~JFnF!`T>kRnb3x1g)ywbA=EeAferYijCl8D{aOXVZxDgMvPjnocG%LDUK5W79 zEoRL;&j#6^tj)q>&*@zn>@Tf%4S7lm-R)ItS3us&;~VqyVR!EwGcD!l4$>l`>qdj1 z1z-d2sfmE|$Yks_vIF1^dwMF)*?5osKKk&TVPg8`mi&wP3zOdrUXXmk+#Eg{%=PYs zO%RM<&2^=scl;r9F@0h2_~4lNRQ8?4r-Ekj(97>(y|gV-*al`W0C}jbeIcM{Ujn{p zFW_fOn<*o{RNTF|`~iSJ&9+u_hjj=yPqPZ_RblJp=vkEseaCLf?#10gUue4>uwMoA z$4&t9$YM`^@{w@vhNGzdns8xhfoau!D1$Au>U~&inkxLXqWYSVLqze$}CxAX$+5F{kE1hbXG`(1IdTomP zvS3fTHmevTZVwPRephK?+KcbpWc=Wi)jW;XP6*_e`iqe!<5%WsNOjsEw}V)~PEOq( zaAG#01o@A>HA>R1c}e)o#T`?>6?|j&b*AMQfT~ykJ*}E%sKUlEq7TXB%MFks?fkg^ z@(rCol|l5af}=IZ+S7qKT5B(<(k1Er>Ea8$cNG7zcu{fxE8mx%VvxghJirdfYcE>6 z4qkf!J#=r`217kMcxaw>I$1kur`?+9&d<|$uwSQc>l3ZL1Nm|l^Mtron>F<{s|T z0WhRD?cX#-@6O^+(su;+yyCstLzLc-IMCHJLy+I?bzF4&Y0zvitJgz;2Sp7Od5Y#t zN|9&l!T!PG=Goiw7u6^0NYh%d_p}!X94GzGu92IJ*QoAM+Zi+*$ot9o$nFW3<7Gs6 znuzC5wS+mEqCl`GU}w)an6uGX&cq*nOR%r_Wbm5ykJ{HReW#gqBR*~nIxH{4W(2B* zWMGHt3qR3OPZw0CvM?|E0jT`LctvR{gC6dav(R?%7K%q=+3Uq^3N_ckGr zqc?eL{|1ZWURV5O`jf@`UU6UXXUsPM@_;@xRtN9)0i(HmkTO#-ROcSp<}l5dnAe_8 zz37g1=H_V}*#8M)oZCwctPR1w)`^Rmo1dT1cSOwU;HskUHs|0RNADW@@p8y6phtZ# zJQtouY;zE?jX-`WHZ6fX(84m7FdsDXJZL=dw)p1sN6qi#0N1G}jCq`fd!A*5eH!i4 z(Gb@X?#Vi@R|x+Nf6W7c+pFQT2>>LV))Ynz{E7E%0`js1F%1B;G3@D{2k_!S@n^+P z1poeJ_oSa^ZbL=@&`m|_Iv5TE33ynaGZ2>#r`H@Vr-i_N0N7`My%Xb{LjAIzOV@rC zm$yO1aCG;Ca@-yOP=SD#$u}_I*NIAvs}khN1}e3t+joEtq&sk@4|8D81S%_Iu0SQddyLM2=AcyuiH<@B(@TpUm>C z{N3nU{r*lKd-~Sn)HTsfL3GxkMssy~vmU}|8_^pxJu?S*j%xw*PEHn|%6_r<^;f;W z_$zYhI(T58ZnUDgXdNU&I!?#!=R=B$(cD_FpGT%!pP(Iqy-S@LIdYlMw%S@;nbQiqXx6r!XAg^Ml@zo_)#>ElK~(xl%8U-3hd8k?KI8$b90#{>ll^g z?X{XXE`b$wJeg`BFLMTdk=#XO@-xWf-5ibM%nHCWbD<GR2~ zQoXBot~mM89%^5f-e}L589MkqbnyGGr+4Jo3h?(79}j;x_|=!6NYA3NRdw*iAdO-u zJ)i>+;L{Pn*{^{81t#UQ%xPeqJ(W>tjVDl2?Y-PWKsG)nS%pVXqY$ zbgIn)oD4=>-6r6FMu)1%8HSf&B_QBXdV~W0a-ji@oPl}+&}#yIGt6!51qiR(59j;+ z3;_N(I5z!j;Y&XBtNFiq<@@u`Gl7ScM zUVUHj3DmJH%cp5%V0@6UWMzPQQp3$zXdZycY}0M*HEmf!MS-_-AU20FwZVkE!zKgK zwUBNt$WQ1yMorp<^i`X7Il238s@+|ng2eEfH=R`+{T*PDG;UxnL)$qU1^bE_N=^Xu5s*zfv0AI@F;_zd} z`r_`VX~28o?ytjK{|(RL970_89@C3{-~2DHyf6KPI6ZB-E&32{fEwZ;O@NMmDbLrC zzTG!y=QAR>9#PI&g9rzWj7lqG!~yt33it^!VCQw^OKq#uVS9KGP00(`9No*>34uJL zI!w>3fIQ&dPa7mXk+|l=Z;P(){IlX;F5MKoKwSK(M~yinP98DMqUYja+nJzsI;E@XiGC+Q@p?ZUBR!t;$3N1BRTX> z9oP^ z-#;DnUDu{b#HE0K6-U21%Loz)vL7$2f>brchJiCy#$}erIz>3UL`9XA@D3HX19Q2^ zCas%ExI_u4X1D;G4&njWhACHcRTA2vWzt8@k-~G}2 z{dyL#Kp}$=BNm67L*9!a0rt?E6{qY(Cr2_}@ z8q)X7ZJ4{zf)%y~I^zk9dE+B*w9h;D zc5{5;_F!(AQOU{2NWVILRu?Rhj{)fJWbmqqzDtec+LlZJo=eez9&7O!>{R`2wkiU1F*37^6=wmo)4Bx!g#7T zeW0MfC_3j)!OR~r^Rp)J%|9H-*R4#M^!tzCDClUpqB%M^q3=%Cz_IBYyz`asDb8(& zzVJ+iY)qYz_deIAPtc~1ag};;39f!M(BIC8@RN@OgT~Pynm!lU?*1U30_XvI8Jj|V z5(88*CWu-8N`1vjmtBH2S)!tPpa&oj9`9r+J`>_90iSsfEW;t{006!MAfDx%;ka4; zZx{glj{TwczQ#7+_@B~usYFc@}SP zTsnF~>v?EBPnkXExpa^Rg0CC=59Xa8{)Om&dc{5InLLRLi_yGjC?y;TiTZT#jUq~> zS!=fl%`ZapJw-2#oaZu)%uaT0EdYk#78E7A9^^4wfx?qbx)b_7X%%eC^bLRJ!@pp* zMPJvZabnY}M09iJ7)WvXuo~#y^GB<<5Edgk$d{I2Ghq#}2M#Ak7KXHb`VJsQyyYV5 zf*oqpMQZFKn}8lGeUmUo38+xD?mq+^FS6Verr0otDX)a)dCxcI;SZVb|G?Yr()av+ zeqR)^Zp{w!I1BO|Bhhg5d04b^%v5lFv6#N7MV5Pu4)*SE!oK;L^S2fAfI8}vhW>vg z(7E^K@fyZ_3^wp>z88T&fK(}NTj(94>mDHLH!tYtMAA%W->Ok}0LNT)!#!GWFi0lykyRZQF zhYD-pER1S;r*~0Q41<|z*2hffTNTsJ?{<*BIN-?<%VPDFQ5$V~&OFMfZ8@KR_*VH2 zDM#vRY6MnYuLJ)LfPN*vS+{iSmJf0MfI>Yi1t^3zoh%0G4{qTia>k3qBA^$@cPBu< zQh?(esd7-XYWzzS_aZXxi#VcIIpc%f{LP*AAN_|D=JcySkp36Uy*R^Juyic9iF2Hs z$XHfxnlt%;HKvH&@BlVnEG*7x_+AqKVJ7LYW3QxnEsUFPbVETzHfI^qACO7m(Dauh zOgBU*aiS~F3_^xQeXbyXkC6)}AAF;|wd`^O!QK%h`t|1zB$GUfS?ds?dshq;^@`|Vpw34=!S$$fW9oSEBd9)@_yO)m*MpAOlXz>`z02p9r^p1rubp|&p!Nr z*&lh?`_eB{ja-x0%m{k+*t#$Bu!&<6%-h0^+h%Vr@4?Z{C6C(q*(1&n*8BrRemgWn zb}zAx-2M#@91cu3v@M4A`GuvBbrTp}mfae(L338TqA#BhnT#(?@}ajyb07Z4#qo=; zH#1*Gt@bfwg*c`$J><*+c`yssLM*4t#ub&tGvnnF3}o6h1nl9+&7#C#U!rqo#C+k! z=E%~&3xE8hKWOgyj(4X_k1$pO?D5M8Z{N=YIQt0upES%|K8cr>7EF7%&p0Ra)El|H z6v)dXTw(WORF;lBn37TL34NcE3U&$lqHcS6`t}&Hvm_B0J;`t;hn8s8oh}Zy4>~O? zjnwO0{YF_TfnJb(e52dq3q07bxsQcDT@lD@lh_8&NTvta%M`*STww_Sl7Oopa5S7E7S_XB+N87;wWzO_^S$erN))d=OkQ=TM>+(8B{dpzlwBe#256=OP4iLBsk! zVBd#p9x$<%UxzGr+I+)ry*hl^_ukk4P!R(57z4IgK*WrIGYyPw9nRt40PtqB!tsxFpbr ztu`jWX|kH!QU8I`cM#IvWlK-Bk%-Te0=yoXE}OV{hWfA@6IO1+(jN1oN>gf;vI#R} zNT0(+Kl`XLzwlG$2R`!CjZa`MA;l^rx=)w{#<;P?Lu<*^FTw3i%i)C`BFgDEjr0He z*++~)Y>OraGCnx`wrot|0~nh|Hg8QM+wZ~kp(2kRc^+e+4?`cM@rT|N-TY5~sQBL2 z>)_-+2bW1&N={y=Q*rW+^b`719AgKSo;Z6f-I%^6wi!94Uqb!zP80mpJI#-N@F#+Q z^on<5<5J#;5tgL^j%zZ!yusaDG_PztQ}i$-6ia3=9hDGV+2 z%`jmxq3_tV8t29B(l^LZxj;k*eKRRrXks>_t$MEB7-nN{$4(VW6;1?SNloi%Q$t<} z53np>6Lsj~M*TyWoo9B9aiVQaGtq+uV(0IaMb|9OBuZSthPhV6GHq9K^ML%2W&SMa zS&4IUbmb*L%}~Fp6}2h-ZH5|70Czw2?Pm7F7xLFajdww&2pcI8mNI1o0j?fCA1Ur~ zv1s=uGg!(&goAGV!pW2N@a*9N{4nU*qfR*w6wJZRcM$S22I$%_My(PTCo*ZLt{pA? zH0F!(PyDv|;lZ1N@Ci8ibEt=~0@oQLWA3jM*H9NGVP{G}qd9@SJSPqz)(}~Hc7R26 zFEQ7j_(J$LX!7qF#nHLLerequ4j*vo$@=x6XhLVx!n{zrh*oSHqo>TpFy$lHj#|-< zus6iaxIiARenQ`!q1g6f*&cm|5%mCx4IOo_n}>}S?A%4T`aL$?Yx0{Ik!!8YoL9Km zAStVXzIq^;JyaMNfv~klJOeHg=M+R0_ij4^DYhy+oh;&0|NkpiQoJB z;M;!ae)A%(87v>V31V5CgslWslsL9Y|L)3lM}7qK4(tJWsjAYk=a`eY9-9BgubMaf z!8@bhd*!>+$LV3!72w$o%iz$SZ|5j$6$$V5n8CA42=b$4d(>yY1WYq+~9@%`d_PU~Z>0 zCk*YiBzF>?oD$GTPR`jx^9)g$I{4{VnB@3F<`|Rhzrt;`VaeJxN5f#dkL0vh3|KLj zgi~<%T?y`41gYVg^yaWf2*}I(7i!XA2k%4Y34Na&`du#8Ez>s`vUnZ~@utVBnW-#j zEn2+&x%sya{v!GvnDg6f;+r*W*D9cwel^URX#nsBu5n>%0i*Q$SijCpJ~REptglsh zc^D5Il2Be9{=mI|{b%Os&7RxyI2V}nLJ z7{-T!!^xvqCOxtuz8UfIWl~lFy)MZZl3W3vgQJhT`w-c{&F4!63$9sxXLC#;Fu6B$ zv-~`nNq0U#6fm3uQ=ItowR>f~c6+BvLL5DUTR3TkRSf3~6r$wh z;y?eX`Nq%uld$z&?~(*RMFE5Lt3|_RNjXDrvLzhYA(hP;pD~vs&VK0T==KMF#5WCq zUSgh<=NZz28w~N85)jBUc8mVr9~ZCgBMVqUKcZ{lXbD&-(z@($6e0}G5Ku|F!b zoP<+5;e2$gn`It%5(J$1MxSRqB||2QH2l5aY#M*Hl)r>~f5@#cr#l9SQI(`|7dnmHH%A!d1e8vXuT&Fpi2Ie5w8 zZ({OQA{)LbFHlZ}Qbizceg}gCHpQpvsuM915)J9Re(dg7*V(!I+V5nj=;!FT5xt>x zN&kx0PXfJ_9bYC^<<3aXNJrv&V}AX^=H=Jr!M#k;N62hsfC|1$I`Tj`iH3+sav+tu zY>DKC9P!7TzVqG7BNO_nfJL`mOkdFzAuV%e!;lHMaM{0?J|>$nzHfc`GBd!l?;>UVn^Xx>DJ7&Pq3FQki7*>ajT*rj(MpAXQ!#>SOQ z9;kNNnx-9-vNCzrJF%8Tn6l?q<_i68Mfg9X31vd z{?X!i8r|w?Y)|*Vk*2i+IC>`RaOn*^nDAG-;kV5(1F(e10F_P0&AY599Xko~BjDzM zc!8vHuNsQZk0jC3_*NZr_o#CMe$`k9gnECcgUZ;`O*HrPu4ueMb3QH*)_phBVejAD zsWgGzQd@Q-IYw0ieRJ5{_`%!4=Y03Q>1R1};x>T+u)y-RMltO60~__ldobC;P+v?w z&yh43{}S*g^rb{ZtKCfBclST5E?VML+-z!PvxUdEtfFLj)3g>;2PtaO&Xft-H%`s+ z7+n{#IqI)+r{?1-v-&gFRNBvnX~333f^(pleP>Q099H1<(3(sD`34hq1AIt@0Za3; z?)=HHn0+ox7gfkUhscm0$|-^xpWLcl^}!VrxzL`iI>!t2eCKF4LEv4F_z0{(WhCD`B^~z0^*xw zI-ddP@onTjkIHO-nOmEL)0UMHZXycfb&nWA*_eMYr*c?+DyGN{==Lzc0_m`}G+UtwghG zbDg+4^NQZ`>*DlOD_U!W<-ESCqpyL!k8ZrglyA9m;?T{{sC_Y#i{a}3`>y#WitY2H zEtJNT7;KbKKi~=x%^}1C>?icS8t4lVKkw$=pdn&6$H2w3 z@ji+cS_o$n|aDoEBNV0|FYIDrkN4-@4ZJsxUb+ z^9=Duu0>7SI4)?A4*WH5QEU8Hf|5?lML-J~-JA$OfATBl=D&WkiNEWFfsMneaE`0l zFwvloIXK2$(!R+wbxsQ(qFWtzf+5BeqG%?_H7;wkf(Q%sh~Atts&gE^Itqm=C@I&jKMxMFtcC2VE3OoYYv^fXl}m#Cf2Rp zNK-@9k)2^f9j;)3lR5$9rE>pVHvTJU^sXdHk8AwI!|G*o@C7D;*}M+Sq>D}g`B)Z@ zgQ(lLg9M1=uT{(hsKL5&&*FA~IpP2+(gU?{9|pj)DW~8#bYnH`&>Xqpt5{SCH?MEF z(F_l`^0`v#>3!nTk}OUBI|f0Z&S1k{N5wn<8UgMKrye!^!;$&?;p@%G=U$he`C4lh zZnI|b2u5D0aHbX7Wjc)9>-AE<9HZu5b|CAK)?KOnC^LlGu1;_2ZHRcQ1&3okTbSl2 z@_g@SQ@i)`XUq*J=go~ze8oKX@X_+^l#V?+%Ld(Z#Fx%|q(*k4cR2^nN%^_4f7QW? zTx7?MDrjksoi)$@i#M6*<@Yioqod{|)zR-T*Rqq}YgGa**VRZHxApIVw!3sXCyks!5s$KXick)PjB#xcv zMBj1&8I`WB30tPOW$07YVU!%1?99T$od5M(llZUu`B(k; z+DZ958-Oo0WgI{54A@uYrVdvk9I3k=e4c4yxAfV0T6|t!-|$-n{g_P0O$;iOG(}v> z)45YNEQ>&XuT`;tJk>b-KZf?GL}e5DZcg97=;tqZ$K$~_Ki%|2p8AM7>D;wz?1u+^ zdL-?YN|xX@8$=&%>x)2KU8w{a!1D^o4iGY z*s>0~nzLhg8qqinU=JX$HV=t0b4A=il2FPCWg-{!DLD*rm})2hC0svR9#l8Jtn<~$ zd3w)i10y|(Gjqhx2#R%*fV%o)c?HW6 z(+cP{nj*Eq6lJfy`e_rl=)8L10hK1jsSF&0%O6nxhZpS4>QLMq1K)6I=e%A-V`YGH zaMOX3y9?yS!2|FKBcao0O#jXo=J)*K&BaGw{hn<2M$H&FYdy>nrzrd&R05^&OOLj% zx?ahVNHIp$=%$o1dNt{Yt*Tkd1h>|NtQTys#+8csU|=Fyyp$(tX6Rbx>I8&mlor?Bi2Dx~%=0Gng|?Tb?l zLbuO@m#%H1^@t3;5j2>4VZ<2}XwC&@zndSu4|8m6nIk%)Vn2u@|hmQSITLvzde@s>3QpbdN0*&oPjHLSI*Nb}fD1*S9y(L&JK( zc2?~g<_m3@p3Tv!bJzrphcZEa6zr~P-cUnaP*vP8v`^jUs^iK2BN(_pnj^P2ZHCvF z#{}$iEbFzM;zyn?7f~PYHjO5WHF_adaA0fu%nYMm-%9W|tKLW4B@=^84heju(^FW1 z>^QA)!{m;4ab50LI-Ua4F=g^-DM~*H2UMl5d}niAugT*kj5wQC+T zvBV7@du#Hm&-+_*^VGA<^=?9wEURIu556J}Pf1n!1@LexM_%T!uJMn6OHh+7r6IqORii}v8| zvCB?s;Uri%R;2Q3%jzIkzNAm$itqjF~c!+mCz=1r}Rji8Q5sJ~>|+-*)gd{-f^9&ggdeCB9=vSTc^%xhr3 z7k@_7H^e&mB297{15!*a$K_RPhbsZ@}S5XbDTV%R-!L ze7z<#=#;pw<-!u<;=3~asiu#IzXCHjy}M6j&~DDUKzCQZJ3w(Ai@rH7P$?cwz9O=bKVp@K zL^h9iP4@Uv^S{3K-c+@zpm6)Jop`FX0}O3oxdC|8svzVN+((K=ZKLY3*Nna^YkH4@ zRlPhWv-uh>5z=x$jC5@U)XSUY?>d^VqIb!dh)KybTm}+Eb1g}iCUeRc!>V&fZtoZ$ zDt_|1_YNL^&+DWA{U0ybf2#axy@T(3oXV{@ae?$WK_j@Tb9Yfd_j7%7-2qoO0dRqV z0|h#43d@C9iq|PK4ct+CWKM>ROy~=nLmhHV=&q-4MOP%p4RldfexQ*j@^QM&7rq?@wjlg}5b1S<@52bC-yR z$Z8bS*%07NHl=qyWKlSER!oXpsKR&%_=KZpvXl8Jv|7}$)4?+U$zbs*LJjALu<_IH zPycH6JCgr${(AE*P7Tvf!t1WOt};bsBDV9Z)Qa|^xsKT{6vY9iIiz;SV2%`t*#hQs ziQ$lV73g^i*cpC0M>ISU-1io<_v_Cy{G`)YJQMnAq`o`pdja}h56v`B2)$X$DCP{t zQ+Qf*Y4I(mc>^U)|NP0IclaU{6{o%uRs+4iewXpG`arX{bGJKgJ~-KV1kV1bb70Xi zr(yRF78u4Vvey25`YgT=Sd0^}%F-of*dhTWOubBhNt%TMKL))`)CAxv-8gp2e{t9B z!?;2Kr5ACBL*)=oc$oriwGa^Z7!+?rxk=2l}evlUQM#sZE3uhJ$ERPjn|BcKPJ zzC1A5pYO{*@LDc2!-}GJh!P1PFOHrK;2OZsqboQ_rB6cLN*O8U*!##>w#U44m;Sj` zAUG?b)2(3QQ(V(0M?qqfdeAv#a4C9Q(OZlPqn{YJI&$D5p&0s$;V>NV#UYj@z)|V_ z!0OA(mIUN~=j@r@#@nur!qIS~%3V&d#2#*r(!o1Q?f3&?|2 zK^L}X|2&*~b8n8)eE|33dY+v=@*PC$j&|vXmH38O9TX?TE;k7^4XyMMgOT8(}8-)>i(=dwce! z(lQB@eF2RY)S&Y?RuJXZ{L-A|V_XGyx2E9)*oTd#xAF;hKFaAOz8%hz}PV= zqB;GzO#Sw-HDdcR`i8&OL}ua;f71`C;Pg*QG=C$h-s|3*o+`dG`E0b$+>)Yd8F;W) zipB+0(L?3vX~H?Zjre%}Bp0LC;YeaqYM`#FGgviRQ-4dkF-oncYjI8JySwS@J8E^@ z@IfIAoMT2aY0h25#sysDnjp3fPDGYNHVNtp?q0$v@f;j2;S^d8duB!w|3&RY0Y%1x>mcB;kPN*Dbcuv~K|PCd(MykIY<$N&I9 z07*naRI*eaZBgRT=-cpIi{XG7#sTc~uo(1Gd9D?I8W>h*%kE;Hql$2`u;HGx*rR# zFtxo&xD>thO0j&A@(BXbTvk5&4OFY(>X~Q3$X{QK6)C2;H7^1K081|%Rozgjg|FIU z{_}?h<`(5wJ_KC-7vG}}e$!Ox%bNtXD(LN6ZUxj>9Yy8{n2Yx6aWv56&xzuAT)>aE z5?UHur32u7lE;%u;e@_d1%1_7BQA8PVwiIggI0uyWE(Un)uZLrAU|3(RaG)U#Hz50 ztFPF8saz_EyPqRkMWRJjX8?BrzV6+G7DqRcr~^6C$&;fYgp~MoO*U|bIURvHSXOp- zaToqDbL~Uc!EU=w=H_S{dyR%hvi~f9jR}e?MQ@R2Gs7sI-V0F;rXgrtsFdc+(#ebf z(tU)cQfyB524+Ex%GqoId{P~ZtT!o{ltR|yEx#mhU<7S~9odU%>6d_J0>a_WfI zf0+GLVE*<)Dn{j(k(~1H)+MM_j05z_NWF6>?q}0C3(Q4(4Q`}mqm_%9o1B22Zn&@B zM=8}rg5&7%KtNpD1o#vB?ppdj3;IGK7s}3?L9ZAKarBx~%wR(IOe1F0qA9?C_K<&k zv=@2Tg%Q~6jw+)7|L&5z*Cj8`k&i;xbKGu>K;I0G=(gz{KCEi&0!}L2@hxBA^e7-- z3*FO?j-IPsei{#ttp4_tgL#CY03wqdl7Goc+`ie;3p)nh&D0*+RR^hZ6Xm)-$|BNG z#FQv}sdK_d@xg(z$R{i=3L@Z6OOO`;I}l#|$t|CWa*C_o=<6@*x+KV>url}H0AZ5HlN%|M>ERd%673 zaf&qBz3=0j(05nTS1hBWt=J3^k)gGqLrMZT3gXBIG#fSvBJqYnV6Pighq8WD=ep)O zd>tR>voecWcT8Ii8+6;*N7fFrA1-u0^C0ovR-GNG_E*7f`mjdbfkrNfTZ=BNQ>(eh zqzuR5l&!(qO3`Ry7@UP-&;T7g%|&Ng@k1ek57K!c0yU;;)3H~(+ja@~#;Ho+0oilg zx(D^#f-u%^AFF=M@5hYNuN$ zMcu>_DhmtD<4)6t5s$cez7LqALWxF;Cb^5KLGf`-I`n2b#gs$}pPqHjpUU^!L-|RP zPT%3`DOyBsPbxPEM>e>2`AdGZDrV&{iUxS%D(K{8#s--@9YD^S1jZDo3!`C12aiCB z?uwFv-l*I1NXA5be%<#ZkK2a1(U0a>MxusWrJVhCgXkc7c)CL>ap|adBCyk}Fvlc< zLybQQjndrbbnZkq$i4JU-g9v%o(X+-HGNr&?evNrN3XRJvmB7U``~@e?;C(1`qgpXd}=+UcL>-e>aieRi4$W@B{vm>lApzgZ#?%-E{QOi4)}G z*rrLEf3XQJqHen9>`5dwji56(hgZdEHEY}G_rk2zL?|y)5LliuQD*V`L#xWa`$X0? zZ-H9%Mx_Sp!Fkg!ZgNBMtZnesqax}^dlMPG+Vdy~?9sMy>2Mc;N^#nr3)agXG6f)d zS=apL?{R5cLGcLS_!jfS$QJNJ$eNLDc9XqyZsxM1##FX;Isnv!T=vYX4q2|P5GR<pGm4kA-X{xw)so-g$y~>qM zK){H|0ltq|x3$_?QK|EG2RebHcZuM=34N~)`l=%r>0D5|hc7b;mC3hTQ-XZ?z|nG7 z`&C`oa;SrT{iU)4xNGBTTf2I^{?cwez62;peC5Peb0$Ce#Nl8sa$6aELsZMOAmTC> zbjD25VO~J0mYQ;tS1$2T?%0v44)iMh5uvtOAbQttYV0f3z(u56wW3GPjEtUXPHRy+ zY%#tnMe^=hEeLby>(2Be-Ms2V>Gf$|8)@~(mUfCy6;zvmj`Z#em_n7!Nts92Qac#U zD38&yL{6iUiyB$fTf(NzbZ+P1K~o<2|l-J zxD35{&vhoyJ^1{2(u}+bWrRSBi*0WvOQ%>v((7W?sgX!waT^_K2iYMIs7{IBiJl8N?JM#@|CxBiJRdFjW zG%w&H(E{Q4l7Y1WR1)hH+o?pDe4vd35bCz8+Ek@?1Ofu8ae+W-)cb5M|HR$ES`ESv zO=Dx?6x%g2Yd|N7x@3<2VvbpZd^wzUj+OSEL^3($ps@sbw87lm5lJny$nQxA!Eu!X zQS)EffXW{>4+nEgw_IoVwV~ zmBp3P-qYRDTHHK~kCsvY zbrV!N-7wUszTy4J#aaodLvtm2f+k#rb3KiI7f|Dl%v5VeD%BE|B5;tFAdQSg>3UBJ z8oJ;BSPfL$h;Tl(ZS3`~k4Fu5l%j3K!J|$^tIXBtMRA1AF1w$s^J&#L$K^t+I7Xcu z>17>tkEL^(2BtGaH&v@S^8t%Y69@7rRALgT15mYbf@6wjA3#3-r3Vqk+*ZJ)Q>>Kf z8W~-VyC1 z=II@MD1%Y{RhDDY%+;F>X9|%-67$fP((_PpRCg-cxOXP>-L>=;8B-?K zvGW8MuVDj%OhmC;X_F%JBy6(;UUbYin@8Q7($jVeb65mrvt}XNDl}+x9ZREHv?rPw zU9lRVwtB-7^{!-7Tps8Zx2(#qPT%m`m84Z1z1~+`#EtrXsR;@g zqT}s0mJ++N(@IyVPKM2P5do+%8aDD}+otGD#I7jz*N1VTV zOuruJ71x!fZ$jTEjlLtAc}*%uz^(sGfPU*`weHE*!6P+3Nw?RovzJi31PS!s97pdO zrEgqo8}4?_eZ$n=1O2)bUf~4+!HxkG5&1ON(@Xil|H_|%>!7fK;J~u$Ru(N8tWQwJ z=Uhe_H*owwl_#a^sSN&meBY&``gWPVCDX_Bh#B;a((m%4J$YkxxvV34-{;@anG4&Y z_u6OcboXi7pgi1q3f}`Lj(X60K3!|$-}X5X`TR}j3vDTnZI>bR@b7GqzIAfCW7aEe z6cp_wJXIy2M&&`?H;Qp7p!fA|y+Ty^@ESL|bw$Cax1Q!TUE7x9uccQK0|AVa5}=f1 zB9Ad|CQ(5bbnroS-=TRtMEh;&LlySKZUg1fQk}earHw{a!uvl^*?C z2D6rt>QE$}gfUBC{erKx6C$+uN-au)d)Kghe6)$)wJ^Ga|OJ@u#Vp)T0Xa=!R%?Rmh!KqSm?!_s!TTkkt|DON; z%EzkobxE%jnx)Q!vt1V|uATvlD@WJCU1{0X-}iK3?k4G%MuGfP&&n95+X6?0nZ3}XGA8-9zS29`WC;d2Zc`lq^s)l?8{&+eYTS=A4d)7xAXew z*^SaPq3@`8bZ}MEx0aI$(ANrMoI`KyKbx5`X&03?nS)2a9?)V&PCCnF6PFp;QT#em zBlQh-bYmL_dRKAyO|SB4hvPbwe<8Q30>vKy$k|uXGov-i?xgw=IISelT~xdZKCM2z zR{{h+tv+r=?>KtTPl*%OjGl}MwMwg$oH@_xGIQX=U1E`+hM@0`I{B6FhYdtGnu|$E zH)ZX_P_ogcYxNOJJ^xn<^ggbYWL);has3i9In|%)@d)+z5ETJAOhwzGmB3uq8{1juOvRMCUsg(YiR(^@=LI(fifE=uZh z@FjnpC=sfG5sfzANUs#=J=lxn+KAVIi~t5?7i@;YaABu{7V;LbuNZBc-dc4+&;Z(%;R$OTS%|} z<>|+&b&uzXa{KT!s_+Zn>x~``~V*Zp5El>Rw5zHKYTy&-{Fk2-G4vlx87lInlZtdFB#j$f>bawD>sVxz{6r8%zGB$ zc}kXB%n+}lS}KFJ5g`48Zwte(RZ9Kl8>_%`oS^r7995jINZ{rrAI7{EZad)VHP;Ew z+g7v4`r_hO2Tgnywv;QczQfttwCa0TnqD8L_O%dT1x}WV9Yd_|)I!`oQ1nl7;qb%! zuq^p$4`n)(F8s`F7+ii>Cp!xDd|yd9Dnd_tUxt1^`q&l@lm?$B9s6xUUkc+IpzoS0 zu&aT76}USTBlRBGIdp)I2*u~gn@koUo4I4o5S72T(Y|-;;qu*8*s#a1=2 zkqF0qVVgf5EPP{iuOlBqXyXn6AaV5aZcB=%5go8&B}5s@#vWeeK#(tYlXg5 z?shHEJCLt8gbLt~-MV63@_t>ry|gT-{77z&-wDig0?M4X0OnE!@`!G)3bHSs?2%WN z!^ViH3LI_}2Io%&&Bh_~<+G=Q{nH17=mH`edjR$$v-Ryi(DP2NoZ#}0F1I6;8^p<@g9H8-<~n^3^j#13YZJ1Sa~h}9%l3_wcNl04aBL+jkmBpn z{=j9q%rRh4z02f5f_xr3@D5%iqc71y3ob4ZJfQf!zBf+r>8!tBEA1^sxmzSRTS}~d z2td%Zy$|(rxDudOJf0>#?s4`$4!^I{XFKuL^X1>0(ASs5_V&IkJx#Xv_J&XII-uVS z1M;-hvUn**pz z2Xkq1fg;2+^_mbgSHRuh%DNXBCE!LX?gU{I+qi%{hT`m07lz(+F-**7Fgy>#j**#R zj66K%4_M__Yb13KUixQEc%$MJ&mtS_^$OPsmh+e!`a>GT!QeQldR{$0gYrFWY#?4HNf;jDJixwW+Uy!*0nm0)YH zu6oMHvs2}$czl|)A1Ct?O+IUv=k31cTZM3C) zb5cS0XjHsND$Ibe+jLC=^(z8;vY{CO0lkXtyXepU5Rm7)Xn8t!rUjM?ivZ(Wc+4nl zzg6@qjy}oZ?v)&;byH^5rD^StZu!kO=C#jk<=n^N_m_Cb#wsq}gG`<(#Q4L-B2OFk{yPw0EeqPr^TTjgk10sV-Zuf#PgAP=C=;>PcZTZ1l` z-5D5*@u)yrFZ5NCmj~D!v6=zRi$%0xw4ZTKkj+#WSHF+D2Tx1JE%Wy8zxv|9Rg7{nv%&6vtSg1>CWbjyKrc=KUf_+=3|w z^0Kt34ok}P-75dCC#ovMhC2@ee!t;Em$|5X>V0k3L{P`GUi^32tobq+lkP5lAID`s zw#5e&pQq2b>GJPS=v&tDam!I8+iCg|<*ovH<;Mt9h;z0Bi`9z=uep7?;gVF zVPD+5v|h9+Z20B!)+K-S9u-MoFMS`?sV|egB(NuQY4dYj*f?imxWIoo+;OjHqBC!? zoi772HgzjGc}%_7r4!-q>W58p0veHw74&`;&sgtYD=$^$;9LNxJjMwk_zsn&OF|Xb zgudetW6e91rDMFVgg!e+U!S_&1@s!OOJsAG^xzS?9C{E={kEs(9AYy--O*-YBj7o?{Rv`R<`ofS5LYetc?2%| zvM5)LR%gQET+d*O3_bH8L1{+uWOnHEo$h=_+W^QBk(PR4Kpex8|wJRcS* z96k5*BJCD993%OFJj?Zw);I^@W=Me|CZR-7yIil^s6m5pUG+}DB!7tY;^J(}0qYDj z0B8Egtt3<2mmNuLIriQCpz^8wx)pSkp~_O+f&=?8k}e?eak+TMh(k1;(07c2+u)Vm zNZ+-|+%-T?Q&8bQ*z^yMGIBna*gSOW`V3Ug%!)~z0MzKL}o%)&z z+JL@B(`JKyh-d=GbOW2_fi1#;%w@5F33CMMYmuwSLklM8>1w!0pL zW5Ou*@^ovzyd;p<*W@Wkp5xSDzdAJ!El5}u;b1$(yBNGT${u+z=pn{w<*A%w$dQLM za-`_Fyv&U96sCbU|Ew}3a2KdJz<1!ZrjRy&ef1q8Q9K@C6t}i#LhyN26%hGdr%6Ge z6*X4&M;#__i}u>K8$^c*eYaa`8$Z7r>ANV&e zINAjz@!`1w^fYkStJOcRm$nkf1z&U`n}{zpD)9V;EdTQ#)N&|s^ng7mkJ@~{7$nWS zIb1GmYYLDTvMeIKVd|kd%^-*mI_>_AKdg)h;FWX-_I#`CoHl;`l2?_^Y7;Oi?wZo! zC11VTZz`Y4ukx)jaGX4QD#2Jmqa#-VdEdvo-H1j&&x;fKZnyMSKffF4yE=tsJz0D0 z={Xm3gV@H&=HcdhIAOkN=GI_==Fr9gcb5rRiEEbn;CC?N^w*0aAdh-ul(I+(;R=4; zB9^L#NLxZg7@C_cZOxcvHSt@7+7&rib}dQnyY!B8yiGi`Gr%3A zWdOaj)?H7)lSKG?Zw{kh34)itxMkmpLg#dkd}UI^VAHTbJ&#iMZNW6K;7 zVV?+tjnQ5pA`VnTmn#J)$*bgd+zo?>PjNrvfS!D>lqIC#e4L=pRvm`#FvsEO_1y`5 z$0_~w?~H(cm(jPLQqg+Xh0bRl49x6ptZFsE5{AQad(Og>Bd*yimN~R3i z!HD@F4(%`!XAQS51xJS`pp>NO0%QmD*y;tj%96a2GZxhO+fYhXr|uK)#fi zfTN|6GRuG>&sgzlg8SYaHkM8F+^jLB8`fl}g zmxRmx=vi90yVMu|#kL~Ai)X2zto_3dteq$!L z-40Gy+lG-2J?4~KJeA}AZnGfSql!uWR4JdAT-o&%o4s<0>lC{h0#7K-iW?c%Ga@LT z%CGV*cEXjVaz18RN_68pOvO7c&`;_{+tO zvVUpxfe%iY`;8Z^nL>?!_H<-#`1-(Hf4G8e)@GSLSU99bW0G8^W@z1TvvMBlxOty| zYQNQ;azoN^Hto3iCRve&|Cjj0ADZC(uS{LHM$d!TCIRfzMmFrLBuw56r*lRpML63o zGS(L?;;NeN?y^Cgia2^b>%qx!_LqHg{R2+i0I+FNMWwE|o30yK|LnDPMfpsCV|A$l zXq<*qK~*!y%c+Kx<>b^#2Qp4f6Z(!*YU|(Gt@N#@bR(pz-+xMvrEPQn-H2^atrRz} z)vglR%q05)xO9u;#MSS72*|_5fBe5nntv}Xe*SZjy+iPM{Tb?i3|cPP~PCuB3k zssMh?@0hWqm5Ezqf~6Sf%Ck$I5zn&`k6-!Q z*%!c(G(x|I`G}N0B}12zwOeT44Dw<*&x<5)7jW{0ROd-sVfri+CiTwXnHzSjPm~7& zDPd|3R~+cL9KD-Bbn#T&JjWXgjJR=)1?5v^DK^86j@U!aD=JIXLdBY=KQX9TcV8_>m-Lv;pK=4COXm1Z}lBnLLN(Dk=8s@$~XZMCRcp z8(^(tTK5#2Mh>TuBfT%n|J`e2gD$1PmKxl=889oH0NqW*H$XgNpJvd`8!Vt2p}}GY zJ=HcM{mmDRsk2lCroVC=J@X!-#Mt1Ze22U*?N$Ml;=YWP9iF&0g7T^SD&OVkhzdbj zxNVFqYBZpcf#RxnAlr>hNffxJLTngffpodL)su-&O3j9wME;I3)!Ho#ANz`fkm ze!0N8)O@Z8;CbC~^004KAkRA67A^ZaHFEC#U_XD?tL`bjgkc>m7fTTZq!A(V?=e;z2ZAHwFYH$O))Tuc zfZintk&X8$Au|WV@HER#4?3GQdBGZ3cv?UnWtu*wAcKg-r=g_MQvyLEkW)9U`N>!c znv0truMO49X4Ubk=-f#O@cNGP0$p7bxC`e;J=dyOws-;%C^(QObJ81)Dv+NgzcbvM z$@5SDfDPaM+i1u$S)4kKp0&YzH>2TaT_$0Xw_wqxop%;7aK>^j#kn}#TO{~D3>)pz zd9^NX6!@-yK%*n1MGo*)s9I<{PEeKvPM!-@+$-yo$BFUkc}MwFeg(+NKdMn2QGeW? z!)*r1=oODT4S|fdal(YYnYtmKwnRlJI3-P2E?QzS>)3JEhUJV1w}zT z%o~ZdgJFa@nNTuvar15=l7!?#*m(&tb~p&A>Y)zi?%rnjxAw()B%2-cj_2g%*(Ao8 zPYa-*g6 z^y;@`hDj>Nae;n9-<_#myOqB6-0do$mnq`jt#>%P^7{`Tc9tlq#WGnCG|*d@$Q#{3 z8xDtvZ&)9SdgC-~tELqZU!aPE>{6y)5ad7QVH`lOC35t-K;FsZQK6GLOqRa3V5zTz zlV{EXye_)GI0*jrYfdnefyl;j^Ym_UH3=Ix8W}cqGUi#c_L9l-_*@aU_ZOP?7&fuD zf1Zf6q;?B-b|n^5{~&M@u*gTDL=NKwsaBTa1})4*s6-?fl^7?gtL`1;v&?TM3{nZCn^jhukYG~ro#ds&g% zwRzNH%_*y;+=|!O4sp{5)LV%$1Q%jZW7l}-5ny1inlM6mFRB6H;o@;O%YrCtW&rs) zTBSI7WI~Jox?lXvYfj{kl4Rzf*JuY0;kEpP!R4 zvo;+C_V!au788AepIagn;41-Y_UnUyz%8ET5pneT)56|yNs6IN7k8L9hTSguO^PUX~hn={xt6O3;jBo@>9+0qQBI8b1I%(BJ4oTHE8LJH^9QU!d^grIz?EFI93 zf0i^jv5iJZ;{@p#i>dJdBfuUfOz1mKsjYu!x6-$s(%l90w<9X}6Uq@R7~=tT(U`F1XVyb*6%ajpFDfqu1~$7Qad3k$r-zD`?dy8>^jSX4wSt``B(I zgYttlmkvMq#zFim-+j+u2@7TPWq2mUc_9|nFkm)BSe0Zki=+l%@i4`O)DR)pOgnGW z^Tp>)k<3y!1dLS%Q6DjmYNluCb>shM?@gdAxz0Mz8|!;7GhbC!y3$gavXF7vV`QLd z#MW#QCE3`(0ftt|f@$cU)ATTB#={K9!_dpjR28S`nQ;%N!Sv~77!J$;2TLm1!)nX6 zWXlViK{jBl1|cLN6_jdmZMnQ9w)y?*b|;nq7WGy3kZ!M40y{doH5J6_%C0(x7wL-wz7wEDPy=4(XYA_<7%$OGR99S9RF zR776Sg`T()$&m&0u>~XR3~KLjJ^TUxB(nkN;dpr?3`fmgxcY;9@p|m!4<+dXUzS7< zzx{o{xGt6Kgf$Jy=Nxejq4xQ#xbw($d>o_v=3HJhS8P_P^I*w5Am3Osh5QmC0sa}? zfGZwly3Ad=zz^;0Caaj{EC9Af6sTJB@}$~5`QyOQ7+zVk%!g0p?$z2WB3 zqvpg;b22Kx9kEprHpwK_?b+BhaQS2eZx@;Y#>&Z)Ai_auL`~S=%Pp>61OfsBfs@)+ zvrAU9ZM6i86-k<^>%Q7vNgRFk&U$~bEQMxju`V@=5`^hK>ht30b?-VwznjswPRot| zM*Vmi={s7>sRnviQFX;Gk-2*KAz||YH}5dseJd_WjjUyCgMkASA+xVHfZQEl;=fE+ zdL!9IH!#AV<2}Bl-~Wxb7LAAAenQ5LqlLFaA|EKMn$|SJevjl<J283+35q3>u-uLGcW)%5|g%tiB-)abK|@oY%92SgoF@0kK`ZjaZF%m5{yj`8wO3L?;Bc!G5ynKaZ{6?Cfw$T#4W5;h_MYWQu_vGr-GBq`M=LHFn^LuM1+|$eEB0kAIMn&RSFhr~>*vV01lk^dg7@df&!f zCdLDfy`EVC)z6ryxz-H+s|#uGt3P;8^nbnmp%iOJ1UCe}A+8P+i=~%YluZ*Ji9JVEs9c>_o=DHkx%ycVoCe^*YukKx^4C^$bZ=Lq5elxA~t?H-! zbOHUxkyGCW3S2m4!rlS=Taj8Q^GIvHKtO>}p^f}&0UnUgGs1T@@f>xEDRou_Xe1&4 z+x1i=qbHlW4YCirPAvPvtT2dAV{Um1aM%kQUv)a{{_Ed95@JVhPJ*>$)51$wxpGNT z4iRNk?>EAx=Oyd@dO`GqwFNH$O%u}F(h-Y3!ShWEkhkUP+`KMR2bN_=i*~iEB~79= z+g9FfF~4`*qm;YVI*o%Hyhz~Y+ET!be4Ta>_nd7@CBC_Fhzw%s;o7pkQhP?<&23xf z%(T*X^j)S4=*ybL`woC~06}XHqRdr{46!5u=snB`VO?`{k?_2pwLlRNN$%^GvFUXQ z^m=V^^#q{gt)xm;qQBIf=W`IY%xihWb<{4@jX zqu5WnJwiFd%;yUp`dL2*39?JR*C%-k4P>(C&U)$IWkUN?WcYgpe<>~PtF{#fsx6^T z^+h)lGdPak0aO5&A*H#VbYmC2r)x`zt<;vv5+fmFJ)?mb#-K%BO5ICLjzUV*DKq-k zX|>J2nO6Fa)^sX?UKNZ8zJ<3=aj94+<`CDANCU|<;0_LEK}?iJ<<~H|>*!7qD=_LR zF{>vRs_U%)^}LYJ6js2lCn%m**#hJ+0kMabRx9@QECkK-|MSD|Sp4U2d%!%842wkQ zsdAjBgf;-|8$Q81F+N=xPoxmXc5Pg!1GHY9SfCF`zoZm8UKXUG4Fc!TDVO`9hL zpSbxsaX4&Uff1Y4Opd4E_I4b0-NygO~6ePhwgplX{OFort>#?Pra|3FkM@wv}I6JbR+$S zRs{kT(Z{aPYP|Z4zBL+c!cV4^zN1y0Dxg=znz-zXO*!9Q#(n<+FoZ z&f8~~*Vd_tHKmd3E5O=iyTrgg8_C0RkLh@e2g&aJ&j>*L)1+ewQ_n*$n}mTErGC!~ z()lKhfZi1EVK{t;Fo?oZv4RSmqastKs}x0>RQtvjR0J$&dF>>6l^;&{TFO`=71?{q zj$HSCB>}yQ+$mtD9cc&Yl9W)PPHCWm*Xl@2j>3Kr(6!EOEDdJ#t<`j6KTwM==b<>phUomsoCNsueB?*R^%LGCZWzP}Ez z&%);2ANs!HQ*S$AejibO=!a2&^-YM*pnxY$7-MDsShPS=H&YH2R z(~Q2m?KLkAee2PENPT?17OrFp{veaXqgT|4_2Nz$dL zOiTymX(#WQE?Wn&OHZbfB(No5ylTY1oddpV@5DG*X%L;bORrjiRbK)wyWZ;#M5c4M zmq)*i{x(GZ9>VaaL;?z;M$7lQ>wbZ(zMrlX3vnA057_wnvO>G`uL2# zby|P(Z(bVu>M8ZhQ~-Td{S!|dDee>+-Sz~rS#B#Z3oM#2v);K&erIuS?)MlO*x#_? z^@xYyfAf3$r$7GvZ~2jyf8sqo@2;kk`pRriSv9qdg1tMgo>gzZ^?=euuBH5lYjWp`~Ja) z4x^aGZZhDn@|FZiPo|c0a%Gi(fTS%n#%1j1ahhdbGI?*!^CK4(l$FxNsvs@19HUlE z+G4<|KG28u_qvZJ58d0%GP~=*6DvM-CvE!Pa?*6|D6YP)sjAE?T{}u_se6llJ6|8o z=zFa?%1c4t-Hnr}0(v#OEN@mW+*X_%{FsG`-$~MWxmfQpipA zj$bpsZ;B(|fIm*?ku??LLP-f=Y{@DJ;9Z>Lkmj_JhZ6@1PXnaE}CwoOOUc6$?8aL>C>)tij%EF4}LHD>;~v(^sPgI@!z~O^c{cZ zPCrc@(CY=-Z^Wb$@r}$ZSHfi_xAxZji(cFbyoT4#y!Caji^r#r=Ftmc^rHR3Lx2so z;#FQC;LtRH^%^$iB=Z1jExQBgxfn5sKnRz^@E8Gha_fO>qs@U-)k6pZ9|lHw$c{+m z8hUSk2&oL}1K4CTfMDs#U9eSr+?X#mAGqg7nqH86^5sVw75c+4J%Y> z9b@;tL^*b0BB0+H*n{0vgp~nR?E~~3e;(6PBH=`*5BuR4eUjU0%wvE9NALH7C~GLp zy^kUzpNrbwdTEE3dDzfr3r3J5(XGfaB-|QdP)g(P<~e0zK`adkI{0?^jZB zZ7FLb2l5u^Y1=v_qV+~6%(`tkqi>zopZuF?r0-}=N0Dvx{7ZkVX%Wuz&FmgKPW1T$ z#&Pv1Wmkw&+}^ur)(C$iTneK((@d~1pTm`kyle>W3%?a-N!ka#W0bTB(GskExsS91 zM_R!h5J(^}{#tBKwJgX|uWA708XpHu3e|h=v$}NCjVv{={s7}3g<@8y{yN_jvI4C@otte^|oC7vt(DeHD4hq zQj0Zf3vgO5!5+Mn*}M!biM8I#@eIxUem?*MeS|%PXYWhmLhvu7Ib^1?kX^vmVuTpl z@V-}h)c|A_7E5fStXA;LNJofLz+9r00%yQ`lKLSk@mq|;v7b~Nmh`8g| zGFg3?+XQ^a+(#Rz)_IqO2!5?)qjmeV(uZ1UO+G9v;;)2gd*;sTpjWL)x=rXCqX(WH(^#lU#}f!^u1PnZ#wBa`gT(X z^n=QM9Oo&x`m_6P&6n4ZH-j;)^laYQyKMU6MEw;rm$nOXPXYFD^jS0W`rRM}_F=+( zJgUTj`%x5wbpSqWkAPm%=z>Vch9s+b*1rNP1fUi89ZEigiHhRBhwx#VFc@XBctq*x z1*iq!>QjkL;h8Z}XY}wKIV^_X{*d|0hu`rF?`bwx-nE1lG!0e&=v8zBQqam~N4n*~ z8*l4C6()2gzeA;o(PZMS0@n>>RF}UjPxn2lDG4wQd}81zdAc7E%`)rwn9-A`_ykIBvOmG_zFo zNn=j-o+=Ku59KSINWeG@1&i)HvFa~h4)QqypQSC!a|g|)BqDf&c6}ICm~VU#J3R~X zv82~>F(E;RiHWwN{iY)J))i&6GO^g)hKW)pga+8nn39wT`w=2D0H&Du2U$WJBC$tj zNy2XI)|pSx|4NoF#_Melcz^P-|Kif8_5|&3>JqP}PqL5{@w6hfVIvA~?hxtiu;vDs z$!EnH(6P#6kkbdh@@7ByQL0qH(K8WAT$A?&@V@D{yk-HghveT4u~qGH6F^=m8kq>H zSKhQ2H(zz&3hV_^b&71E1afY3qMLf~ROjh0?{D;;)zW_02AVMIiEae+)qQkdZFS0w zzI9q{^KYh=zN0mr8lbn867-h1_vRy}`1}bzzme_9L;1;-r+k5Zk3b)I^PBd{Ig>W` z7mDN3qp#<4;$FceaL-3n0Ze;w+VPR!-~rk)=s~?a?0PMLE$^@nuzo^YgB*Fb2P^AL z_B)J8Y}FCmuz1LNKJ2_?H3;tcr=TT3JAcv65?WK@8LrLwgjG(^@4xOhnyu5{w1AaN z$Cqp!_|!zeP3zFW$}Wfj4i!~3O!A9=_B*tqMxDfUXplX65=LF^GVfuJ|c zL?j*5szxH3JY4tkKB6f8=LsnqC6?l=jYU>B6&H$S5l}5#*SZ|NG{u$JMia;@OBw6h z(yfrx4r)u;4AdzK`K;fIHkyd*w57mlM&CNEKlwM)M&FIKoGzfRY6n-3tlmRbZC zQ}zJ%y>;$G9*;p$Qnry2a!r379(*0MM7UqPNRi2SY1k5YN{@-sQ|6m6)&yD;YmRKE zK)(ws4eC3P*LVuP?L_**Cx77mPqn;nKh#2a)C76^F#cHbluFr==WgQ=gytW&M!73{ z$(*fkKEM={9Q2F)FJRMESLF0Kl>znwc-0+stOa?OWw(0J1mS%7mE-1z;3V0)K&noW z+SUDD;N$?R&V8=e-#9>4`wh3cVld|^qE(UFQH$An9Q};G*RD5BBYj8TZmNLZif@Er zC0Bpq2`uDqGu{yFjd_mR_g*mh!M5?l-FG{P+yVS0Bod0wC_qzorEE=hkB$pRbdKi| z%jZ4wc!qL+Y{>(->#a)GU9ppi-)`I3UwLPhxRDFkZt`0|vj@tLXkVl7V+oegnbkn&)6PO9-?4m||^;W#K>%5h0xsor}tFHrkaiK#_ zbn7Q?MVagMyaQtav);cFyVMumRQGTqu-yQ?1N&<7(Mn@R-<|ie>7?)IdrTG3k5){w zdUO1^cjAeo#j&HtSTW8iXJfDU>f-JJeD7fUS^Da&l1LE4MH!V&d!~DnS;D|YGX4Va z_dOJ$jq@0vFG-}bsibQcEU*v1*yj$*){#BE#6=4NPkES1q(0!1-1%4SPo zF+?&l?#G-{*I?<0eZGDXWm)`;mLJ%i0P;!zD1J_Zs@}lToa4!w(wfT%=Qo)9KE|&J#j;w z=T6ISM%%LD>g&>8ZK!)_?u+tIe17W$6Xb?ShAjH^F- z)bjQc<4|dF_r{!M8v*>4{;j4<2BqE$PkC=JhfF6XP?rh}yTHE+%bQ+U8VB>&*sI*1 zy(O@hr<7aOD7R`A$~RavOH3HDR!J~_&XS9MymyhXJFBc8uwp^=3xkeD4N6-tmc$zg zN(whG^(~@&vF*7>%@u7h0OVzFB6eR^H+6wiP!FpP*cY(ux;L_$X24p*lMN>ysgf1j zc*x<2o5)j9OjHXQmOb$I8y#Xt8byb0#W7SQ%2KFqeJjz8?kQ2jPQ?ue`OOom)RYv} zXS_(?!TdUYa`4H$xBL=z3j`I&SIX3#w`EnS8GWmk*u1|H=sSF?sRMddZ2!a*RtpPvYxkV&R;9;xVs%>P})I95QE~6!zV!ODy=?gX#}huF1eK8QAhn^~L!9 z4fZ1-UtXq747aiYxM!-%VMYx`ZW4oFKhB` zWi%5=8@;tMTJK%n(>|rq?D+ryKmbWZK~!f5F7<(4z@$1mfKq)Y7Ymr-&;n}mRoBm1 zy{Fo8^!?SI3X4~#xQW6|9J}S{UA=}Y1ktBX(TZ*K{aoLfe5V8!X*x#s z96RoAr<|>;jHEFR=ru3}_HOxZ6$SDD77ob%Kj?c65-wVSyqzwqx4H6O&NObYI`cgZ zV%1lgg*rv=?Iw!~plXO4w4$4aqI#U%Sw%+MvT6slXPu(oxd~IWcXX-xX*3Rc7w0bK!Th51s(wRe`e~26wph`V2@4w?lKM$mo8@nRzv=z{4+!Yte2~w> z_5*wZ`x=0!d+3338es24Aq;rcl2`}UWeWj)k)SVt)hdD>UlG(Fxx62=YFf^AmDpo%g-yTxH4}){6D*tj zJAy{K6mQJ(u`I>C+~|Dz7U2U=O;DX%RfTMRIJ*nQNsA$xt4NsKl?AIZ7)b%0JB zay8)HeapelBb@jKY>!zx^e~tQ^m9ZvV(Tr~#}4fEPMQP|^4r(j_@}zBt!oJayW!~F zebfe;oHl}!224HE&5iYb*+0|XZfFg~Ag(Pn(K(uHk2O}Us#f=?+HrGRZtu1;`fjhC zHeGd{(08=nVlZ#GqRC*_8yE<>k8S1{Ub~ol%G|SY{)r-9J6W{iCB*WViXdGr!l0EW zd9T1_Hc#_}XvRzcb_3+?Xmp@n4b+OGcfemw0NdR=z;J_IfUyxcfto=)AIZB*c|4+d zfxU?Cz+XpO6+2H^P_F7+ude09Mjb0~np9sj)e0W5sU$1sJabT|r$}}~eQdop*0!v_ zb*LEou4>Csu-`7NH(n>&yZg9y+)VqiM^F5q-&A!PPChgGs6;89u^@_D7xltg`y&yMUE5AEo0e8k`xk-$aU6cv}Ka;6yl7K2>Kl?J-_`baR2x4 ziyZ==0JKhVGWrVabq_ncIc}cuOZ*4U!66HHD#?iSubLCI@9R%xR>a}Nq92ZeKz&iu zr239N(gNcI)7Q~!uJ2=ctPR`JiAd_wen@xAKMV-G(-xZ1cc(43_4U(8-(hWMKtF7Y z9UPtD+9PbwnxK7aK~x19P!xWrrN}an0@&9BWGmqW2uOWi`n&G1IruSf}9xRG0CX(YG2a z(?j3U9x-{Wjb1T3-qZqbK5_(B=yB7!>DG!@F0ZLVDpX+wu!a$;Q}9|UuXScbYWQol zRTB0AF(*vldC>I~#LQJxV86YhA85N)b=7^U`q~WW z@k@CyuH@&*u3oaba^f&Sy-M{Sz_86!=FVQLcGP`FH+T1||3woI3WZ~Rwz|)ZzO>&| z)7P;+mDa~6;nLM9KD=TABn-ct9c|G9$2ossi|?#BgyAE5b&YpXrUWw$DiuNf=)iJk zclKBJ+60;#Zc(5X#^i^&W_Lx;s-9Q(Ue)ilA1yYWBbsG&7&a6%DoUJ}2_Y>DAud!h zb9pw8m!sn!U&c?W-+;i>Bgb#SzK%>=3$3cgX0ky$R_#%z>S`Bl8{2Xx_Zp?6?o-ug z^!!flSN(otoo4jiNh`W*uLXTKKD91gH{R!!_4$f8Qz|`6rQ9R~){O(JBJ580)qOS& zF3sN8Y6h>KvD3Ouy1u&C#`>!BSU@Oyk+lSpB0+)ZY&P@q3wCml(_bZsh2lC~WsDq^d2e*ROPa`wbOIey(ST6 zM&F&$ylTrGkn)O`ik7ods|9YyWA@n%eR{6E(}X3wG_(fWdP+q^?L~mm&)Yq&24Qu* z?pwc9?y{5bP(5Qe`(b@6*|K{U$_#6WgG&J6lHDfJjY3LSwNad+{)JQJ=R2#@FY8|Q zvGJ3@`COtKTVL`V_{1gEdpP$7oYtg^^~F7cBCidyOoJe#iwUDXq=;l6s_9SWr(`b&1Vcb^TQ@-U40V+1xX#{z8}E(%k!u6@Ol(aRPFkmZ^8XIF`UZ@! z5||UO)F`@W(mL(E;gI`{yp>;$a^$uX-pZ4Y+j=B~d?xOZr;ygFC!%;;cZG%4duY>p z>HW|&l#(>fY8A*2`@l}ybCeci?JxlH@+_ZGc&Nb#Mgi`)G7K2fbo8D(t>15$LOa zRfoPdLaiEBR%$O2eFvhs;L58rTa5{Su9YZv!mV$tQ&vW+A#ZJkJPoE z2iTJ^%0`MLRUyf^NhaG%d@u3{aLiZ}SLenQI}LE%Xnde^Vn@XduE9-r^xLtEWgt}P z69!+5BSuwufq}L<#ofcbw+4hOYuKZyuxIvxJC+O=^f=R+?cVY8(;H+hFEvE|E)#FZ8E8KLGBa=`{JDO+C`f{7s|=Y zP|Qha7LsWoh4vv16-6fe1M62yS)Sh8(O>PcySAJ}duv$BoyQfxoER1^A+N$%(Z{Mj zyQ`DPpzZpk@8=oQ#z-Vfev6X69`v1KB2SX;mh|=gioWjsNA)mc4ZY0|6+N^cEp}8U zsYye!mR8XT#j{nC;?avY9M`4m*lh%Yn>P9m6}@3LbBs;^$SV=b3h6zR>1wTe+E0m4 zOdNba!BLT1u#$%Q8GE=qf}9cIl1<#Ij*a;k8phGVZco}lHcH&>9E)(H*NGtdtfCH4 zLA4(`Gb}%9k}17OPpr844guK+XBjrsJ7Ga1%v~aP%v<=Xd09rEvzudgJH5XH0`hDH zYL}{g6ic5;anOcD|MX+xf3~vA{$g`kAn#uyli1T29`{8D3%=0BJANE6z4m?09AiDk z{VTdZeZf6n_2}$9Prb-boUIYDluTwhi#Fax_0L0(bdxE8?QB>h>ed->^!DBPVmIwr z{kEcy+cOI)wHb+vMSNyW=vi`qRc9Fa0e0^*`fh{1G4xeG9HTG&bTWN4(bBhH6#8=O z0Uhyq;eR!DeUb@{kaptXjyQUOxxLHA+v+nQIQE3&!%xR_c+`FV{D~7>=QtyG=KA=1 z);xxM_)haQ(JWsL*qnL(RL~9&_+Il8VdeMwd5g}_1?&NM4R(N-V;1oJUVt*p|Ij;v zl5eInAdI%1fp$})iIv@Hu`{TCdxakgxCghE&Zde=EUX`4`aDernRA#z)*w&bL9zAY zliMS19{Fx?(KZe&mxHoG<~3E1^}Q$d`u=Ne$RADz`bW#qeElHkEAcw^H_drP+VZpB z#b9yYVjytT5q!&tg&l3Bi4*$0e& zac#*D$Wv^xdDb7)FlzWz-X)EfMXTab6WXru1Ny?BE*kR&_uf`Z3((WZ_1m(d$HFfRZUSqzbq_39mF9LmSl^Gon zakPk8+n{n8{d#bGRiGaO_iB)jfcmkcHv5w|8ir(Gg2n(*d93{7LjGQVAg{zG=C(Uc z?{iO)(dv+QhJoJRcYwiuF$h+JfKbJ1{eXlbq!;uEb>lJS*{3Pc1=tr^fVh4^&EUKy z`Ib>xbqIHUXMaZlc+)R6x<~qh57%z<>RMp{p;GnOv7*>%cu5Q32S1=k zZXmB^Ha6XJ>_%7qVC(XVrtdpnRQfWtu)JiLh;WW4bG|wQaw`X3yCl+6MCm;=MzD>; zd+_BL!0YS?xZ7oOdF5k|(S4Ss#BklH8XWpsz-Y+eAzns_JX)`neDhh(-KsO!O@WKF z{kY#aMCdm`9?iL_{SSqM=r+vNaRY>>6#u$8e4f^SrdR% zor)g}iWYMERsgdRAO;s* zzYG6_*B8?8fJ8Iu&Q0_p=OdHv#hQ^fvvpP6A-=k1rFY?^7w=jiSxcT4yF z8Z-EO2pOqgFZ8_za+8F<;Dt0HS{kL0L|X%ieg8LKW6TdzL9&5apm&pey~;Xjl+@xD z?nrU61H7+2O_^$J{vmR(Z9;uuKh-DrOi#3UJVMDCeK*pVZrGP?z&7dY{eNF%%n#AH zqA#sYr*Qqf4u!X%ubs%Dp_JVS44lz$c$FVJb-k%ivDfVdl7;C!+w@TB${E`Oxd74u}ryB@ZlpKxy?R` z;q7@|q67l1=C)O{$yF8&DswK5>_yfp1N%b2L{xw4mNT0;~=j-any)||2)5t zNJffC-KV?ncB_ySxc6>Gobf!GX-v*^W7esjfU(KlrK~iUIN6CkGm@HBw&%KbdJ1Ax zia+Pj{UXPUYt+9(2Ee_0$>o77evEevidQUbWDf!tI!E$vfL?jHi#{8B(vzct3&B}T zsxv@9<`b53uxd6TEtcPEs*}J4NC}JR zh6zByihaIIqDB#58>%}BCqnfn5+%C23^@!v%RaA0omF4GGajS7Ka-t@Sp#ONzSnyr zAO2JzPs9L%MigY^Qo36Lell$VjyCza7ox{jScG^U3#V1ue<4R?mgn8ebn^X0np`qr ze{X>$3}x9xo2iyJI%P!Bjb$^l zbdH$tQ~CgphW@;Uj+u-4Z_+&rWs}cEdvSc_1YffqD>_sVZOqr=jn`$l7BX3LbDqF8 ztb*92oF#3s2&)=}v}lowImR5!0g%RTgVxL2omc#a%2FKC50q|HiTj z=m!@ZcVk*0Z{5!CxYG#aC7O}Ni2(l0g;RdgI^YS|efU;-wU@&2BG&L0FgdhwN&rW& z#S5DINWbLnsb|muEoKa!_p%?XmNk$?yek<8IjcBvL3t5)`5Gw$!+EPmYneGLC=q-F zv@e65){jh-V73BS<>dbsS8qbg;X?)!NB=ddpP%Hbbtr}SM)sK1fUoiHcCd3_*NA0P zst3>!tk_1JT%VN#tew@)Bc?IvZ7j&I6MQX1lc=f5AiwW35i}ZF14w*c(4P>~R6t-C z{XD0H6+NR)QC)do0i6XrpIp1#C-$HId&a!}PfK7#*ySr-OV0F|X9A_dSq;HCdqty# zVN;iBXhD(+{HoRpzt}@qXtgksvUz0q6&bm=JFHGj>gv^ZLz?T=`XSD58TvH}31z&Z z2grBUt>s0lG3Sf!exr$yq;KiXE5)P;jxk|kq5@78<%k(xtF~tRk*_l5R$gh9KEwpa zL}!Pp+QU9!XMe;PSX$VbQ+E)3=CK3f)(RA)$sB-(hRoG!7kTc5Xo)ZY<$Jm^ZKh7a z^1_xGeXj@lR$@0%RL4-B2^{XdgS^2SS%CB-;X;^X(B)ezw%;LTrYb-QvDhRA`jOYJaeYm zXD=7hxe87Pk9*kx8 zAcNh+yl;$GWXwQ|0QBJDBi^#-{oB_{q>$%IM^(vcHE8P<{jP-Ga$nwuk<4_9tVsYb zlSw6+qC=pa$1k^7@2vy&bA?u0rh^EF>ByHPIdL4lcv1c1zmxBXiM5-Bm-1O7ouqv1 z)pz_xcco+GxV+{_+kJ13ERbBnxj~A|5Ss*7T=48o_`!R^g)q4HYmE6Y?+eglmL)lgbCteo zwI(*HYYa7rql+fEqS%8gHaqwJj+^H#+yuyNL~AB+HK#7;6I^}8_|51${q$`sQl6}; zL}6$c;fo196&hW-sWlXab9;)4qN5$h_KC6!jGlML$DO^nIC%^5h-u{ZEz1Mh5TkPP z+R07+3gF%X1%L#fPK6!unqTDe-keR8O}A>b2n|pU6#R%ZhB99!&u~hEkhz;5|FWH- z%H{NEt5C=lp9wQ3+Hk`sXcbt84Ac*s4L|Mov73u!6@nxlP9AA8-)n=r%VJVXNdv0Q zw1QK2YhNHf$V#BMvma;lzfN(S-4N`{d!*_Rc0kh+tkSaw4$?VtUkf^M^s>2yqvyZh zm_vWab#xYhi@AvlKs@~(*^Lwl{03rMSP>xTdGpSi=-H(ftAA)>)AI>6x{TeI&LW^jA=hl6yNUCH#RezZIa!dxQn1T9?I`wdi5Fjq(^ z{oHE;{0t6U!n3?D{=vGn2e~5rB^aN9FoT??dhRq8F|!D;87h&rT@lP#j01fVu#z!> z=OY+^dAEf|tAGQ$SyLghapD{A;d|q-9e@8jjrn~vVo#bhy9{U7Wx$K8gFd#s>%6yv zcl{Lzi|bZ_zwH2yLJ`z})=e5*1>|Y!0`Ugw9NB`nrwRy>wfPxQ2qdl%xbr>W0Z^pH zTi%-`zxRV*beR^|tF(j_xCjg+BdAq`Qv6nO>Wm35^>H-~St^>3%SJX9 z^kZlFAoEFC)<`BVam^^mBfSj5KAnAm?wxdb9HM!zhesnljXs!Vcs3#>klSzoFC64> z!6rdp3l?F6D1ejfmAXw&kqXTg06xRoPplmOutl~iHn=yc8+vJx`Z5GWP%IP@t1Ah& z+EJT+Y~4{ma8JV|$#|JM^}dU5rDytA<3)y#*E_y^j}zxQLt{0in-a)KFF^krWraGU z@6^-x@1OG&O$kS9bsqKmBxbZrM$c%MRGFSwf%&yLr4P-%nv{k4l1ILPO;3{e647|ZVMq^GOWbNdEADLOY4r4xY zPyVF~t*`!Pp7+ZP_LG48sgkRMn}_|Ad4wD5^${fRK~-P^~PKu^0CYS23)psI{?-3<@+`CH3rY-Ld}ikNZ2I*WK;p zZu_>Sy}(}m|ZNLpKc(wp8?tUUj?dGnFmixcWFWf?-6hQx85Jz~rq zsIlPXI&kv}+$F`UWb%c-*AM$^CCDS_!(jyRjD)91GvT@zlzxUB6~xip204w3xsDS$d5pfd+rYYs$V+pTHq^?*MOIj z(?2C{jSr|oB057KuKRWx^ zeZTi;lFfbgEhqB7L(9WTDUcQ@qrOM7`b zmhA!?vUy8)DnOg8p)l88py(pTz61rwW4%ixsBLtOr^~PTbNMvT{3+VMc{s}>M^9DjqDJ7A)Sn#urA=#4T zfx#-x{VGWC3(L*;>HC1P`~Khu?_SH(AOGt#Kk~O(zH|;{_a)Y;Ypi8^RFdmudmv4t z=B$ln^O=oTsLPHOL7|L}I4}Bhf9jhx!OR5~6^l{$%uT-k^9OzZ7rzAkODO>QO|E~I z>qT<`{EF2>3_;$mx~~!4rT-V*WnJ`jIGA;xW+{e_E`SF~CAz_DILZ(x@$#^HQYJCd z8F=W5*#z`#DfDGgXYVtk?-bKF?>-HCEPa%~1KPoqF?OxkhGC-xxK?g*mZDeKKz|T* ztZV{$DPa|Bz2fF`Kf;7^$zSWO1{?X3K7O7} z+=e!d18sWLh5^Ny>%Ra>=4aW~*!~7Ukiu1ioDFVH%2#w20t#U#n}c{wC3TCnfI*a^ z!RZD&(^C3V|4AUP0gTTMsMpVvw1<#MVwnygJ`b}GC(O8a=(=J$S=%oEd`uKkurnzr zWMs_mZHLMVzxkKer4o7)rqcqwBy!Fdb*2ROq*?Q_Hd&bMK*qk1~su*a2m*Q1J<#?UEG{lC@rL& zT)S*_ep$CjU@WfMa@W2lQcbFag~`AAFL(yh8&xo2!3ALZy`0#|MK5gSa{xSkKt-^2 zsR&zp3&JVe>_}m=4X}6UI0&O8mE!kWc8PO1e1Ep`hd=O6#3n!g8Uc&r`mAigHpTAW z2F@OIk~|{=5Mf6_Doif}oVoyeY~bm>(4SQuH1s1(`!N}n0u75Xti~*DrDo0#KWHxh;Sc<`Gx`q3^_0@r zgs5AXm=RjilX9#Q5Y6Hm!)m`y4K>hNNgj! zc}47FoGD0|cL`5d-v{U$EkDM(22Y)5DC?Y?ij3Qg5t zy_6F>SPoPmE|-1{e9OIQFBgBE6ToXy(DlQ{*ex81R5GnoY-Hb8U>D-=AnVTk)*owm zhjmPbWm8Vr#~f4EJn=hph_zxJ7NC{1i_ZSNxj}EEDYzB1Spu#yXV6&~_^H>E%G2Hh zK!f8$%HRLh&&G}Q*AUc#=QRS0EN za}RszBdX1Tye2)zwp^Q<*y?QhGeUFTTq`rXL2re!u(Z~(rF;1u^xinJ@3w||RX4$l z?gDzPbg(wc-}D)t2F;nEQLX!cJf0kyKC_VO$>Z54v?mUJ^c%>I>Roi@$IR(7`Z}Nz zy);&*l)hr%#C$Q4qt~)yGz@SQq{4QE-lz5i@N4ZSy6f}2hRRU})-iiz{|q_$#guAt_-a~NH zJ#UQS-pLJObqaM58j8kIN3lRPmDhC z-!B=0<>pw&WkJ%%@?1(;mUnE6D{38>HfvPsiqS-ys@nV(~3!jk_}-vk}Z{ywcz&ZZ1?iNx7&=1XSW(1?JY; zhsn+DK|G!3A1An8+lyVOmuM}DR@C-NFAEt|&iuT{gl5PF7 zK31myJ;M=@k7zbr;h3c}jHSQ@Rvvix$|Q`CJd&dN&>6bQA7MscN1YMcZK7*Aw$(wa zJ}@BZwWP0GtxcjY15~bgjARKBV%DrIxU2$e%|u~yh5y_5ImJ~EWi|~)7fPq%tPNKy-W0>N?LTS z8e&kjm;J!Kk%+FU2{|&Un__Pf_RbX%A$^&Ty$-6AptItmSI$|RYJ-M^W;gS%1nSE@^azQuBT%twL#*zvV` z_Lc85c*XK%9pDdZ>iUB2F}U)|H{8*;ys@3^oJpl!#ra~apnP)wr{8iv3IXVjw+9|& z2>^~G2lOX}WY$k)g4ZY_fF9JxGO5p^FUF^iJ`xZS8t1baeMhMFa?;m|<(P#@TV^Wy zrYHVT^hJbXnXa5koG@CL`E?P=c97A}qlaOT$VFpB5qo0fm8z~by7;NU(G%-KW|Qy-(hh+401kr>R*5#J!U#biSZu{;eC-xLj~NfunV`fodt_8&X)>5s;Zv)^M->j%L(CK;5E z9(1;fMv?l(pmhbLqV@3p!y}!41r*Vpe^xdx(ODo)Uiz@a^s=`;!m7%O*ob_B>1l-O zr4Jae)K7XS*d@vX1PYR^V_t(Ji|s~q2qts-2!6gZ`o7G4sG=`Cx0tBF8X%PPP49YC z^u;|DYxP76=C(V{rV@3W?PG{a{K7%(L0ynrWIUA!ou}VAW7eSl^ zYpSe=z^>Jjn?gZ+J2-k`_b?G49OGK9=eINZzPM!E^6s1H3-C^&FJd;UbMX+#!Nf7t zvaqv;g;m>zPeSrikiBmxpVtF73`u}`a#7+C#gH1w;4=%o(Ctbu*-ZNC%$XiXku z&ugtW-B@=z4Pnr1yC!YGK$j^$%^hGnt-&6In(<{G^|g6F|E32K*GOdJHn=(@G7RJ< zk%owF&?)lO{>7q&yjCC|v&4(nP8Rdcn{sjYlGz8zEYRugSa4`pj_Li0*1}r;`c9?S<&W{QWdiV!FLg zzVGe_abp(91KfqUc_MpCHZPFRnnf136j`sx!hQz^ze5f&WkV@x%LFcs&Wye32W(@SP9k&%wDTc>A+3XRxOl>~R({u!F`N0B||aqs9C@%e#5W@z$O# zT5r0wkRAq=O3^||dokH#-RH?FK=F)?2jmqs51mXHq6`lO^4Q4c-+#6U{?msMzR9iz zI$?a{_hl6z_hAe2Y0=8^F3P&rJhT0pLaN$KBjV`EcASzUFChBojJ_{RkJ}b~KT^>b zhjGNQEpAT<#Pe5r-Pj&(Ql?ZXSL>&QR(?0(raOFZb+bWj8G_0`iy_;v50U?HNG*9q^*PaJvlV__pZtcfO! z2v$ES3&;)On&aC3XkX2lSs4l?y8U;(Y_s9S5;Rgwa8DKye zGs$Ot0?fyV?nHkDFlEAq`|A|*cD*%M%zJ&LJuy-o)H7bA==o^z=qW4`XY}1IscQXx zr}Sm$$_Nc5I(oO(Jfj}TX^6Fr#5O2noBi9y?P1kg~&-~n7 z?v#mO3eb)o6>dIgU`)}m1D(J&dEPXZn_r3#hcN8gx8 zRY?O@y4%X+lbI>`*~PQPo?fqb?%=^%x2&yu7Qg)2%-*prtN;(6?&EjMp0H_x&wZ((O^6B3xmP5X@`oWS}0IqtU11aKbx zOAAFiY4@`H(i$P^F|GnQqKrkHOt)pX!xQd$pg8-nd!PTgR_jmSWuk*7YzXLa76Rz? zU`6I+YMFsO?Yi?KqVr!oR0ZZbG^BBIFa5-Om9rF6;v9_TzoOl9yA3ZweC{@+g0lh%_cy(&K`;wE_|xYIv-_`%{Ni|0OZY|zU@39BwvUeK!7!RQXTJnWW0zJp|~ zF@GMviKQaN%e_zH^ce0Q>#S@&YI$VYmD$Y}^zHtA=zDlZ-_4Y&cjj8q7u`#DjR<@5 zmYZ+G&F9O@RtdW-C9LJ^qv7PE7;#MtkZ%F<0do2L`_8T>pZ^KWDOdRg zMm3mO_<(&QP9Q@$*okJqV9xgJ$*{PV9d&*ZZhkL%Q-Qp-v(>}YG2RGQPwtxKwGpl! zaSt)GQ0R65ffhMvNtosJ<%)_75A_TH(edy6+4=r`xA@V!-r%*q*brUCS_a9uPwPq< zbHLs^oOg(?C(g>m7H}&#*!WT=kGLiRbd#`w_`!6+q3#KeP$kbVJ<^kv|A8keAq|0(tR% zv$D+=fHL}DF4+kY>clmGd?b*cgPW5%W$`^1R=ZFAFL$3PUI4vi=b9vdd;nL6L^f?8 z!|OyFIs+EgZ5(A9aPw_sc*|Jby!nW+v8olo&U_pkIbe#DaP`YK!vRu_6+oT!O6E?N4tUPz0OCw{_-yojh2MA06p=X znS2r3#R2eV_v9E@n3C0v{__j44kngVu-ysh2 z!5MvDq>i>T`lgMWe-Uc*a73L*Un$p%d?CZ~BEzFSpTBexZXVe@+`Pv1F~I&xWdhJY z#r22Sh=+1{$@p`aXLaZ)#QcWQB(`~!qwOPprG)ogR)m`t)pT*R!2NOp)LI!+5CSF|T zSi~crMFDGC8#;q2&SE|(1*~Lv709aslIH>T)*PQCGnich2>ZGA40BHNQohzB$p=e( zCU7COb7b(l>FI!ZWX!W6f&d1SXMQI^l6gl_=lik?kOv!Vw_ul2cfF;U#k2s=)^xRSoi z(gd=a(U@T_hy1nu+zBrUzYG22RT5P#D05hp^?NZw zW3pK!@b$z%1}@<48y`91y=u;X=l|*l|Ac9S`mUZd`RZwtt&w~KL2=ecZjZuNA&6}> zPxVALSE_ya@rK^n=5{ML4LErnDwYUz51LHwEu7HiUj^F@$Twv#zmB-(4G(prSN+mk z9xS^28rm1o-ihpd46A#7m*sUcVM(9PHx}@oIuGtIWdeE8UQRS>(%uWkJJ=>FEsmF$ z&z=ny_AdJ~`d;hKb~XC$fxcKz)uu1pb$4&teYMHj=YU%*=&-cOmtoQdKM=wrZ+YIMvgpH-@2%KlB z?i8+CuG7X5GpYvq0u~l+%;?%*#6>tRCZGD_j(POoB9p&}+`b1V&9V+9EL-2}CAhn2 zImPk{kxgS|$kCM|o9FnlTG|adLscy%{|f9i5tsvq@<{0j{e7lY20af5bfCE>0fs zH^sMfJN+~7x#OYeW0u}AoIK7d4&)=mHa({FE%`3jR zP9VNn0|!;6xEyd?m6ual9l*SuKmJ^bMV_L^w_{ ziwFma3(7oC^4u6uAZi}MT^kUKI^%t%z;$6v7J5AJ(E@(!gXjdk*Z$mN-+SP*bKaN! zhzTEDGK+5n$OwS8dJdobOTdMO;flAKyD->_?W2&M|Dyg0w)A~H2i~+qelh6r@#=e7vT;|aW z6)5IxsCBgVd89GQKOuaeh*mxdophbs67>vD%_pyo&zJaSa_)K>q!U_ZN2k=vWwD0> zbv|pLTaXtQCveAL-Ewja_689sEjNcXO&gHcVApJ!yyM(@(EWFJy+8OY)+@;2<<&w& z8Xw&&1Ko1+CCKN|I-2-Ao5#s1DVXt@fVFHNTG>DZb%x{IS{!^?O)c+i)k+dccK`Vk z767bFUo|-&oc2fxZxbX2D=S{u#(aZ__HwZl*mF0T&$H+wWp@g%NuM};BK-YF?tSWs zI63uwaq#-@G!62pHuf`-oj1YSMH9l^100QCUE&ytW$x$puXbvRYA5* zU1`$^u6wCU*@$|aJuGQ$KX7a(bhl!Yc*cropgEE*+Kr4^qI-+rWOKx=nM27Q&vPT_ zo__E7PVwjePZ59pqjx=^IKw!?F(X=l7qFv?5hrg!-Y-GEU=?TDS$m(!7`ImOu2q}` zd5P;#(%BpnvarIWR;2>_8GT)QZ2mj_^qsUy-%4atz26wnS0~;6H1Kj$L5^e$C)UvQ z5+)DMJ`ae8oGTP6Iytxrld{&wYu1ZU;D<~#xNDQXZe&S5e%Bl2)1W()gWbNDMR(yl zCnbNEh^Abs<9<3E>~QfO+?<&Q$33vi^Rxh2+_blT;A(Jc3_@y>}qsXS}5F=nOD;!T;y%ph5 z8*7C_rXrNHrVSoN=i6jOMQMYapuqE9lb46NtxRp1?(+gG000~N8l|V>OmXwif9$^X z--`Nw_Kvvt2Zv4kyXa{ppX`}n{gMf~tUbHy2qPTe7YePJ$sQlEPRZqu$@8h~utVwC z^`dg;KD@|(hh#1(U!JhE)~pG=`7=&$0A4b94}kXoc#nzQi0&=u&b4l0Kk|ic@c3`! zjc0!A@Cmpk#rTHKuuJG&pm)D-1){RBk+^2S$pi9a9YFbtg-yC&AU{~eRXUkBv#dYH zQ;r=qMiaRdcPcabx^@`-dp*$?M$8&kjIGkIG8hm6mdaQiGabVK02CofL_t(8JaWSL zQp~-&XZ$mgDxf2jLe}e{lr7eyqUlFP-i)y2LLukHkKO0LK3@H4x)6xaLws|NEK`?d z?Wd<+<;kP1d|e;YMeKk5skR|UCz-3bcn>j+K_+Xe!Ojw1^Q6hXo=i|5{6x2L=X(#o z-+PWz<-leyH+O-%-D4}CG0@@Wuv|>j0-IW^fWtusknb%oTji@1aAQguwQb4GS0GOWB&P|l`Q!y{gn{TK49_>;WQyV3oJ-|9s_`Ndq~o(C^#dN2t+R)om!$yful3GgM1 zkR0C%3aK9TL$srM>YwXYWu2=RdCB(Bmr{XyMQ;o8tk@g}5ARfR@EF6FG{+@XaldWh zEwZoAa_>E#>Bs;0V@2HhT|{5R4Yk5g>*-8~f!4&9fbIhL0_Qc71*A|uEuuMSUxIwT zn2jpu2Aq7QcrTw=?WB00(YI=iN&D-JzFUmziEma}KnS7)^y&yFKlfCyeDfi!dU2p$ zyBNm)BHoc}5%%;1z3aueQbv*2j~_b{9EvX-eZRHQ^WaQVI`%4q7XKO+kUURZ%Z*rE zhY-NqB7nDO&t9AzgWhg{JhD!(O)beeTO{v52HN|fGyV3bK9)50d=O>pX$^F4W5do` zU^m#u=lxX9P_mOp<;oyOT9QcdDw#aGTDGk~eqc&@mCnF3okzs+<5d2rjAx?xxOD1>fd|IdKSI=&y&`DpUL8dPu_JRyNJuuAiOkY^vJMes|?*a zCanZP$M{}RMERHFBQXcvH4V~xtgU?a)%&dl#>thZioK0PI`js*=~up114V*)4+aeJ-2(Z=OrzH~kIDt|!tc{Oh~lt4x1n2~v_6 zz#7LC1&+vAE)#uH;119eLRfUqh&9w;VlUDrLNTU2R&Y(U*H-a5l*#84LB0Y3wVA-H zf_uRJ7#}}hPUbWE(il4~Q$*iwg1laF4CrA3B&)S{)vtan;+y9szBw1H;kGBPUcvOV zY%lU|gp4-C`Xc`1KZ=|F`m^sWx=${79SQm+t)fG`EY3Ta@@k*xD??|vWa92D7bXc-_V zc{T&x4fp^^x5wh-$oQ!Q60|adoJf=JK*fC7$-gH_up{PYo0k5bkqGfRa_4Gb9*op#O6Nf$W@ayOB0aqF>f`3 zBSI64UWJBs9}50` z{1&;FjJ{YUq+J3ruUpv|HS z6np`_%*DGOFc;CMU_%N+9t6sD?h>>^a|mxO)-YEl-5n54J)yL>nMf-AOiQA*y-9)bM1olU*%zj2+wMSV7WBEFw?{+x( z>ixC^dgYGYbMj=cw*R1Ypotiy9SzjpTIff9=q0VNAONbC>{d?e$Dx-eVM=mK`j{Kg z3}(h2209F694&FDRrj}s3EJCAR1%GHL38%)iLiL1VtoMtw6v|wiBQH;{lT#Xz9S78rYPTnDr8d0U?&% z>#VCAIk0#L(~Ann!v8JHcKg;gX>A{AY0VLI7V#^3V+{l0pf>~*&2=n#Tbe`rAapbj zB7Dw7dwz|ai&dK93c1Wr+H=bR-J8XHmM-9mfT7apfjUccI?0JP5 zeMQmXSk@=#V#oFMMqkzaN@XI@OHOZ>bqlw7XP!S5wD%qGS1w!#V%QV>uvxAz;F#F~ z>_Kigd%`n>m*{00%;mB6}x0R7woFMnT9~ogkDTw^PQJc4FNqf1$_iA7lr_J zB_L!zT4^(ehLw)Cy&9WcqGE47n5wAbWr1Ha4vqyl`T@F75- zLiaEx|EEpc*sxrFqI|t%50aQBA}>IS$!v_^tFw9`Z|~ceo$sEu=^uw;It8g?k{?yP z9;F}BN*h65?WQuLuWN^me{U4}ZhWuN&qJWsKoVRXABu0PfsL7+Z6EKq^Hy*aBd84FuWSfLC&DoU@kBL=l%t8QZ#r2GIbN0iFC{aS#572} z^O#74eWFl~a`9u_oJ=SM@}(J_(LlEq*?O?s@2~L3f`Ps-`+^QF*gpX`e}I4sfc-7F z)L)b+Xa1m9ard}y`7MN2#60)I67XZ_-}kyf#Q6-+_xl9U;arHi*6s!Re(Vtd&1acN z^U+UAfVV(z!Ck4WF(X&98(S1`Nt}Ge%Zo2|pWXM@?r%kF-Og5EG7vK{U-3JK$DC-h@7p+T6gremf zVw%M_xwtizx2v7padJC$oXXUs`;5M#D&+>HuY0-S-vQ9;6eG(MM}O?7Q`S6v;c>sa z?{@DN9QiJ;I-6>{TxS5|+~;>zSAs^X?f1O(AkOD}1j{~_gzOp2#4e9XCawXSbs5a! z$P`9T*1?WIK~Y=FHz12cRw01 zOX8d*e1ja|U-TE^MGpf}zWlxTB*H0_%6>M@Q@72@grSz7)MRkz+pz;Fll| zy%UZ-v{#nid}f6r(H((`*r#hn6wJFx9oh%UrJ@tGohzk7ESW zEa%x6N`yc!{h~P97_O*K%F)Z9N;qo}+%WvF^ifH-2;V&l_p2Uu>keqqV-7KyMZr zme!&-bnlA(c3Ugrz4MmlLBgaSw)55g#i9`{<{`dfQm{vWJDCH=0NyC|W0^2!k{(92 z*h(g^@2*y6^u4j^ThV_U=p_>sgaP!rV3TYX&c1WnSzaUpd@17qdEBo(!t43{Y{k!` zwnrK|5Als1$b`S~Fg#=cW3xj{oV?Gzg^m4nU$Cs>zaQheWDB#Oj&bzF2#|9m=}hMe zfjWu{yRB=U1Jv!-a$Fosc+$OX9O#n)UXQs}+?=cP_WxcH5K3=aiF0}{JVi)coT)F| zs`PajXW?N1;3q2;=zE?xeG*Yw&=>H}bzOfUwle)>jebH5R`s9$I>{69D&@cJH_C2J zaeb(&`%BT6AhgOvdapz8xiNYhlJx`)g1!pio5TXLG%tz%uZve6b2_8pTgV=aenlI zVtTesc;A+Op0P}sj9X#Cl+LxMG`s-g#>icxp_ub}q`%ONVCChTvOKu(nC{wU=maI1 zZdB8+DmdO_5j^KM@nk^8-=WgTA)pvNAyOirV+PXi#6iDoB&6T0Yg#+aO8rvb9=Rol z&Rk1pW=YR}mE0?RLrORu2|7f2bKcT0JSmUYA7)WR7?}6a(n_)B%pJS~&N1H3ow(NJ zd|UH-cZgk~f_$*R2y^H5+vPRHOgq$ew+q|c}V}C!#iY>k%GS?R&kh%nK zowS@7xpN1ue72fAq6c!{t!WI7bJA%6E-@4}P@kKgp>NZY6ZNOXt&X$VNsALMa#NK+*0_xa4c=Fc+8z*{)G!+^J| z*WJJjl<8D76Fd;K93H3YWKQm;ooBV8J$Iwg41NZYx)(>vnL zPCKE`oyD$xcM8TF^8()?_6&w&jPF3A=eqw6+%GcJ_hB|0?Mpu`$LN*w#G~si&re=K zz4bf2RvlpY+=;%F*xU;11wLY)8_TyEIU6K3H}2%lrDjQ{-mqcfEU>t(Ke_~2Ht`Jr znRlV2`8_xhw!SwFx5oJNw1oF1w;kSl=e9ux-fG6xkSqRBDxXB`A3OP+;a%X{ zZO?hY_g11ey-b0nprf8)b!5D@ef-#NWlt&XBl7s>W6zE9i0bl6?D6dlT26JSSAWK-j;DP)4Tx07wm;mUmPX*B8g%%xo{TU6vwc>AklFq%OTkl_mFQv@x1^BM1TV}0C2duqR=S6Xn?LjUp6xrb&~O43j*Nv zEr418u3H3zGns$s|L;SQD-ufpfWpxLJ03rmi*g~#S@{x?OrJ!Vo{}kJ7$ajbnjp%m zGEV!%=70KpVow?KvV}a4moSaFCQKV= zXBIPnpP$8-NG!rR+)R#`$7JVZi#Wn10DSspSrkx`)s~4C+0n+?(b2-z5-tDd^^cpM zz5W?wz5V3zGUCskL5!X++LzcbT23thtSPiMTfS&1I{|204}j|3FPi>70OSh+Xzlyz zdl<5LNtZ}OE>>3g`T3RtKG#xK(9i3CI(+v0d-&=+OWAp!Ysd8Ar*foO5~i%E+?=c& zshF87;&Ay)i~kOm zCIB-Z!^JGdti+UJsxgN!t(Y#%b<8kk67vyD#cE*9urAm@Y#cTXn~yERR$}Y1E!Yd# zo7hq8Ya9;8z!~A3Z~?e@Tn26#t`xT$*Ni)h>&K1Yrto;Y8r}@=h7ZGY@Dh9xekcA2 z{tSKqKZ<`tAQQ9+wgf*y0zpVvOQ<9qCY&Y=5XJ~ILHOG0j2XwBQ%7jM`P2tv~{#P+6CGu9Y;5!2hua>CG_v;z4S?CC1rc%807-x z8s$^ULkxsr$OvR)G0GUn7`GVjR5Vq*RQM{JRGL%DRgX~5SKp(4L49HleU9rK?wsN|$L8GCfHh1tA~lw29MI^|n9|hJ z^w$(=?$kW5IibbS^3=-Es?a*EHLgw5cGnhYS7@Kne#%s4dNH$@Rm?8tq>hG8fR0pW zzfP~tjINRHeBHIW&AJctNO~;2RJ{tlPQ6KeZT(RF<@$~KcMXUJEQ54|9R}S7(}qTd zv4$HA+YFx=sTu_uEj4O1x^GN1_Ap*-Tx)#81ZToB$u!w*a?KPrbudjgtugI0gUuYx z1ZKO<`pvQC&gMe%TJu2*iiMX&o<*a@uqDGX#B!}=o8@yWeX9hktybMuAFUm%v#jf^ z@7XBX1lg>$>9G0T*3_13TVs2}j%w#;x5}>F?uEUXJ>Pzh{cQ)DL#V?BhfaqNj!uqZ z$0o;dCw-@6r(I5iEIKQkRm!^LjCJ;QUgdn!`K^nii^S!a%Wtk0u9>cfU7yS~n#-SC zH+RHM*Nx-0-)+d9>7MMq&wa>4$AjZh>+#4_&y(j_?>XjW;+5fb#Ot}YwYS*2#e16V z!d}5X>x20C`xN{1`YQR(_pSDQ=%?$K=GW*q>F?mb%>QfvHXt})YrtTjW*|4PA#gIt zDQHDdS1=_wD!4lMQHW`XIHV&K4h;(37J7f4!93x-wlEMD7`83!LAX));_x3Ma1r4V zH4%>^Z6cRPc1O{olA;bry^i*dE{nc5-*~=serJq)Okzw!%yg_zYWi`#ol25V;v^kU#wN!mA5MPH z3FFjqrcwe^cBM>m+1wr6XFN|{1#g`1#xLiOrMjh-r#?w@OWT$Wgg6&&5F%x&L(6hXP*!%2{VOVIa)adIsGCtQITk9vCHD^izmgw;`&@D zcVTY3gpU49^+=7S>!rha?s+wNZ}MaEj~6Hw2n%|am@e70WNfM5(r=exmT{MLF4tMU zX8G_6uNC`OLMu~NcCOM}Rk&(&wg2ivYe;J{*Zj2BdTsgISLt?eJQu}$~QLORDCnMIdyYynPb_W zEx0YhEw{FMY&}%2SiZD;WLxOA)(U1tamB0cN!u@1+E?z~LE0hRF;o>&)xJ}I=a!xC ztJAA*)_B)6@6y<{Y1i~_-tK`to_m`1YVIxB`);3L-|hYW`&(-bYby`n4&)tpTo+T< z{VnU;hI;k-lKKw^g$IWYMIP#EaB65ctZ}%k5pI+=jvq-pa_u{x@7kLzn)Wv{noEv? zqtc^Kzfb=D*0JDYoyS?nn|?6(VOI;SrMMMpUD7()mfkkh9^c-7BIrbChiga6kCs0k zJgIZC=9KcOveTr~g{NoFEIl)IR&;jaT-v#j&ZN$J=i|=b=!)p-y%2oi(nY_E=exbS z&s=i5bn>#xz3Ke>~2=f&N;yEFGz-^boBexUH6@}b7V+Mi8+ZXR+R zIyLMw-18{v(Y+Dw$g^K^e|bMz_?Y^*a!h-y;fd{&ljDBl*PbqTI{HlXY-Xb9SH)j< zJvV;-!*8Cy^-RW1j=m7TnEk!NYwxwIsxMi!S4PGy zBfp6F$M=2lMMN0Kaq!)>KMI6g7s-u!_^u)@Lb&hJe61)De%ssmMFHY#Rm&9i+W=_$ zs>^Q!t=?4o{YC@Mz8YYC(oZ74cM`STPVFHxcssmqnDF6dfxiwYZ2Bw8olS+0z_{;;Oqu4NfRu! z#L{D<2Jl@ZM}doVpL*(j)9Yf5UImZBLp_lQ`KAKUTM0PLL1rCb-c*Br`0!!#*0iyy z1;K*{58l*gY$@4y!55{#TH{DPQpd)uzbOFp)&Nd3ka;}-vrq8Y*ov+w@H@aN5_VI4 zzDZgYpeB7t9mS6*J$+pP=#2u-ML=d>L;t2mSgPA^{NtPKbe_0h*ZSBe?FvwnKBNv$ zss=oc+@D;w%30b{u(H7Q4mTS z*1Dsz)Nd>JycWRO3^Yj}E8Z%JSm$|pkSQUDUX*xk0+A2v3bbecpEk%Z1*@&tvo%74 zx4o_?74@?1)fY%o$g&Z68bvB(Tla7g01AC(>kc21-rqLhxl+KnN}#zo$dpm$?{5q6 zTp8fhgH7y+P`sst+2+_CXmYI>XSpHov!QM)``Z@2tz)H~$`^c>zLX=ol9%c3v&`SW zj&)I{q0wxOPHP_d&#rV|4t(BT;MqIi)B}y^3d-<5aXCkW-`zka*V1w38~Q#P^hY0k zR9~BgZ@FK1+Whcnb8sp2$3OmYLd8I0es%>$n#`28PeGeo9(*nE+$9Bx2RGTARrX%g^lh^B@D(APM0;*}bD-AsWT@-wF2AVAG`^6u=xZHqveyx z{krO=5j`K3OQ+||vk3rs;8Dt-eB|x19_n%HwG;59c#}HP{9gy?Tncb%!6tU!klfM_ zs&X^~8l`+-$-U^bjicEWWG>c#f1~P?_U!kwz2&Ez-n$Ymsiue*0F#T=L(TiI*t-^t zGOS5Tka_F^K34%eDa@E7eJW7uDuL(1fb;sm=AuATYVD=R-5PcgSe`ujd9kK`T&S(EF`CxW?@_+k*~2#Q@m$X? zz_UBIQ*6q4T`K`7!y9sU4{r*13~I6;Pqp-Z6`->x zz=>TUxh1Z&&}Bz65$b^@Ya%{f9%!;gU1-D&8tbMgpMUf$r^gvxHmNF zd{8}*e2`Ys#T_5lCM|cso9ppsE#ch?#q72E!X467sh&f*i+b{Zey5_eB) zpGA@8-dFb;`sbtM-8IoKT2E^<*1M|7mn%gU!PB&omUwRCda8lvk-cl1m{qh|t_Pks z4LX+woPB}KCc7F3Huqg6CpSG*>uI(FP1fLRT5Lmrx$8<)`n^|r-t_pmGVqg1-)hgb zPLj3%>I4Pf>d3z16r%3? z1b9+zXAdG)r~+m`dP=X$idT&Qr;fY1IM_UJAHYph-gRJe5w50+qwynb)(J|Dz5&2w z;Bqe|z8o)JJhQ4PcwXY+#*JGQWPP0G*c6P?&f!yLeZl)|x$m4H$*)A)O>Zehy$Gme z^-_M(y|PDx=f{OO+i0EAxRO-P(}VXK_#_^6z;h|kNoTSi7QUzau!-BTMxFf>l3oUM zE(SQU>k}0{!wR-pjCx>k_N%Y?jbJ;_lv?)|kZ}$9UP|bV!18_??c$D4w&f5q&TREIHz=6Ao%N3q`-pbuPXd*`4cR40E zJ*kV(ZueLby5z9`Kzz<+F+mg$;;cmaHx z0MEL9Ck38IzWmNnr%;w&=dz#^`d5Xi%X}`%jaxBuBK8)Qwucr zjBtga@8rqkm73-oLS_J%E>L{bR@+{I_KDD$j(c97Yv68HDnCo0m4e(rm+t~y`fmlG98Epf^GS(_RUFTney0X>lvN5muK{#IU-nCiR<(e$ zCQe<5y8&#tq$J)v^}P*jb_1Hb32|P$IB;|-HU5Kw4kly6Plk26nIuDQ9&b)h2WcH- zp_g$z3yzMCV Ks#k-08_-AT>ABZ45&7U3%MLFgSfv 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

}+-2g^TWTo$yAMT?d2TCHI=II`n0mRKNHw#M7` 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 literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/stage-bottom@2x.png b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/stage-bottom@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ca590eaf08e65dc1ae40bce9f9f74e69c3a0f8a4 GIT binary patch literal 1965 zcmV;e2U7TnP)3L?K*_rKGQL~x> z08mZsB?AB;00{&D5QGE*00=??0RRLcfdBx4kU#(cK}a9~fFL9g06-8D2ml}m2?PKT zgaiTr2ton@00ep2fXKN$&0jO!YxaDt*~2%@9=&BYwcLXAPMQr~G21k5w&6kJxjb8A z_D|IAZ~bOB28!G08;c&-tz|}co88}PcJ#Q}%BR*6wH~u$-xc>$EBeCeshNF!$ZXkE z{4@Pc`rGCr-6ySR6WyVQ-FPAY_E=?Chs?hHsuAqU`YZ}YpPY$;++^|Vo<)i3z{N(e z%4_H7h_!?Q{lQCS*LIoxvfXU+xV41Z-S{|4x@)q3->SZFltBJiXSV8T{Ikhd%-($* zp6p+HV)pyGz&!{aR!1JHReDt%hW5g z1K;zRuk~Pe(Cp;lMj{afL)Gwe%S|Ve0rQ)YM(Ha}HGe(sZ;8)r6ciOiZ}ulkWz);! zV4G#u@vkXPAZ6QC-xPgLGxO0G&FJ%#jMQEgnrBKU55PwW3zcakeCk+SS65)``!)Nu zs-X{Fj-OxMlN~U98rf^a?Aq5z_{3rBc&+M-vwN)+|NrxT#S0Gfo_*)y=MO6;A1nFH7I=uowik4k0!)k7a$v5vLSeW3((Z%h21DwFB;V?Aq$W35s$!_q+l zK`=jQWYyQ}lkPL4SOv73A6O*{ewqUi1+`6gtYa-kU+8n(nTy`@@i{9+$LiMDsEw{LB_v=Mv^2@D zpOsnbgQbVdcrlBv6w-umnnt|}B>sf?4^fHa%hTEItb7)KKOGP-B|T4|1QxogdNKKZ zQT5W_y!R=IG;6D#1dhe?A3AfqFr43q>B;kZTMWoW0>LZ_Hk(VlE^iIPd|K9_31l(p z3`BkA7K7^ln_eg?S(E2VP(3U)Mh;3?2=@6%W92jDjrOCU?>0azJDHxIJRjX*W-2aC<`i!vK1W|>Q0q$ktUI|pP`0cSxKJ0lB-ksec|RJs+vn*xXE-!7fSfYz~nhXkU$VjH#_pBS30K`7rs$(9fwB6 z{(Gu!2G~y0>pnvIV&z2qJftsl4DPH^$-}K?&zn34njwK8SUSioOO;p@m}!+!y2V_aS|uvyf{;@iFMEQPPv={(K2ggam?M=`zf8#+-+LJJy{Q_p(w+ zrP*rtPBPcN@V7zC8pJa@9nXoW_&wPpoYO-EPqieNo>|zCSrBU*!f@fI|YoEM>|n zPSIwHzK3s{ZT~a5YF%eAdh8g>e$U-)X1jk5--xkYwL@Ph;U763PoC?HgiCi(6(uZG zq9CJSb1EuXz5b$H@^Ccz-uNWB6-t)7Tg?V;H%98+mOLE4FN&^unyfTq&~sl z1tmf(yq*;`W3Npt3XQlm0(WyM3ZzOb-I_Ft&==@HH4+E_AViH4762d!2?PKTgaiTr z2ton@00bd{004rJKmY(iScwh*)v^2`>Vy9Q*Vy#8=R%=B00000NkvXXu0mjflsBGC literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini index 56564776b3..eaa50d1a61 100644 --- a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini +++ b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini @@ -1,6 +1,13 @@ [General] -Version: 2.4 +Version: 2.5 [Mania] Keys: 4 -ColumnLineWidth: 3,1,3,1,1 \ No newline at end of file +ColumnLineWidth: 3,1,3,1,1 +Hit0: mania/hit0 +Hit50: mania/hit50 +Hit100: mania/hit100 +Hit200: mania/hit200 +Hit300: mania/hit300 +Hit300g: mania/hit300g +BottomStageImage: mania/stage-bottom \ No newline at end of file From 586e3d405c8d7863137b542b914b044ffbe4fde2 Mon Sep 17 00:00:00 2001 From: mcendu Date: Fri, 12 Jun 2020 22:48:18 +0800 Subject: [PATCH 48/98] add proper decoding support? --- osu.Game/Skinning/LegacyManiaSkinDecoder.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Skinning/LegacyManiaSkinDecoder.cs b/osu.Game/Skinning/LegacyManiaSkinDecoder.cs index a988bd589f..cbd6aa17dc 100644 --- a/osu.Game/Skinning/LegacyManiaSkinDecoder.cs +++ b/osu.Game/Skinning/LegacyManiaSkinDecoder.cs @@ -111,11 +111,11 @@ namespace osu.Game.Skinning HandleColours(currentConfig, line); break; + // Custom sprite paths case string _ when pair.Key.StartsWith("NoteImage"): - currentConfig.ImageLookups[pair.Key] = pair.Value; - break; - case string _ when pair.Key.StartsWith("KeyImage"): + case string _ when pair.Key.StartsWith("Hit"): + case "BottomStageImage": currentConfig.ImageLookups[pair.Key] = pair.Value; break; } From 7def6a91812670529b671b5e89abf243d8a8c30b Mon Sep 17 00:00:00 2001 From: mcendu Date: Fri, 12 Jun 2020 23:06:19 +0800 Subject: [PATCH 49/98] fix tests incorrectly showing judgements not present in mania --- .../Skinning/TestSceneDrawableJudgement.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs b/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs index 497b80950a..540bf82e1f 100644 --- a/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs +++ b/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs @@ -6,6 +6,7 @@ using System.Linq; using osu.Framework.Extensions; using osu.Framework.Graphics; using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Mania.Scoring; using osu.Game.Rulesets.Mania.UI; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Scoring; @@ -16,14 +17,17 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning { public TestSceneDrawableJudgement() { + var HitWindows = new ManiaHitWindows(); + foreach (HitResult result in Enum.GetValues(typeof(HitResult)).OfType().Skip(1)) { - AddStep("Show " + result.GetDescription(), () => SetContents(() => - new DrawableManiaJudgement(new JudgementResult(new HitObject(), new Judgement()) { Type = result }, null) - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - })); + if (HitWindows.IsHitResultAllowed(result)) + AddStep("Show " + result.GetDescription(), () => SetContents(() => + new DrawableManiaJudgement(new JudgementResult(new HitObject(), new Judgement()) { Type = result }, null) + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + })); } } } From c6e087b9947aa46a8bed3abe3928ebd1d2a0ba04 Mon Sep 17 00:00:00 2001 From: mcendu Date: Fri, 12 Jun 2020 23:11:50 +0800 Subject: [PATCH 50/98] remove incorrectly added key --- osu.Game/Skinning/LegacyManiaSkinDecoder.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game/Skinning/LegacyManiaSkinDecoder.cs b/osu.Game/Skinning/LegacyManiaSkinDecoder.cs index cbd6aa17dc..0806676fde 100644 --- a/osu.Game/Skinning/LegacyManiaSkinDecoder.cs +++ b/osu.Game/Skinning/LegacyManiaSkinDecoder.cs @@ -115,7 +115,6 @@ namespace osu.Game.Skinning case string _ when pair.Key.StartsWith("NoteImage"): case string _ when pair.Key.StartsWith("KeyImage"): case string _ when pair.Key.StartsWith("Hit"): - case "BottomStageImage": currentConfig.ImageLookups[pair.Key] = pair.Value; break; } From da46288ef09489d5d98a163f5ada7e292aed091b Mon Sep 17 00:00:00 2001 From: mcendu Date: Fri, 12 Jun 2020 23:20:04 +0800 Subject: [PATCH 51/98] remove stage bottom image --- .../special-skin/mania/stage-bottom@2x.png | Bin 1965 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/stage-bottom@2x.png diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/stage-bottom@2x.png b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/mania/stage-bottom@2x.png deleted file mode 100644 index ca590eaf08e65dc1ae40bce9f9f74e69c3a0f8a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1965 zcmV;e2U7TnP)3L?K*_rKGQL~x> z08mZsB?AB;00{&D5QGE*00=??0RRLcfdBx4kU#(cK}a9~fFL9g06-8D2ml}m2?PKT zgaiTr2ton@00ep2fXKN$&0jO!YxaDt*~2%@9=&BYwcLXAPMQr~G21k5w&6kJxjb8A z_D|IAZ~bOB28!G08;c&-tz|}co88}PcJ#Q}%BR*6wH~u$-xc>$EBeCeshNF!$ZXkE z{4@Pc`rGCr-6ySR6WyVQ-FPAY_E=?Chs?hHsuAqU`YZ}YpPY$;++^|Vo<)i3z{N(e z%4_H7h_!?Q{lQCS*LIoxvfXU+xV41Z-S{|4x@)q3->SZFltBJiXSV8T{Ikhd%-($* zp6p+HV)pyGz&!{aR!1JHReDt%hW5g z1K;zRuk~Pe(Cp;lMj{afL)Gwe%S|Ve0rQ)YM(Ha}HGe(sZ;8)r6ciOiZ}ulkWz);! zV4G#u@vkXPAZ6QC-xPgLGxO0G&FJ%#jMQEgnrBKU55PwW3zcakeCk+SS65)``!)Nu zs-X{Fj-OxMlN~U98rf^a?Aq5z_{3rBc&+M-vwN)+|NrxT#S0Gfo_*)y=MO6;A1nFH7I=uowik4k0!)k7a$v5vLSeW3((Z%h21DwFB;V?Aq$W35s$!_q+l zK`=jQWYyQ}lkPL4SOv73A6O*{ewqUi1+`6gtYa-kU+8n(nTy`@@i{9+$LiMDsEw{LB_v=Mv^2@D zpOsnbgQbVdcrlBv6w-umnnt|}B>sf?4^fHa%hTEItb7)KKOGP-B|T4|1QxogdNKKZ zQT5W_y!R=IG;6D#1dhe?A3AfqFr43q>B;kZTMWoW0>LZ_Hk(VlE^iIPd|K9_31l(p z3`BkA7K7^ln_eg?S(E2VP(3U)Mh;3?2=@6%W92jDjrOCU?>0azJDHxIJRjX*W-2aC<`i!vK1W|>Q0q$ktUI|pP`0cSxKJ0lB-ksec|RJs+vn*xXE-!7fSfYz~nhXkU$VjH#_pBS30K`7rs$(9fwB6 z{(Gu!2G~y0>pnvIV&z2qJftsl4DPH^$-}K?&zn34njwK8SUSioOO;p@m}!+!y2V_aS|uvyf{;@iFMEQPPv={(K2ggam?M=`zf8#+-+LJJy{Q_p(w+ zrP*rtPBPcN@V7zC8pJa@9nXoW_&wPpoYO-EPqieNo>|zCSrBU*!f@fI|YoEM>|n zPSIwHzK3s{ZT~a5YF%eAdh8g>e$U-)X1jk5--xkYwL@Ph;U763PoC?HgiCi(6(uZG zq9CJSb1EuXz5b$H@^Ccz-uNWB6-t)7Tg?V;H%98+mOLE4FN&^unyfTq&~sl z1tmf(yq*;`W3Npt3XQlm0(WyM3ZzOb-I_Ft&==@HH4+E_AViH4762d!2?PKTgaiTr z2ton@00bd{004rJKmY(iScwh*)v^2`>Vy9Q*Vy#8=R%=B00000NkvXXu0mjflsBGC From a42bfcb5aba1910cc975fed0d420864917d9069f Mon Sep 17 00:00:00 2001 From: mcendu Date: Fri, 12 Jun 2020 23:23:57 +0800 Subject: [PATCH 52/98] remove reference to stage bottom from skin ini --- osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini index eaa50d1a61..941abac1da 100644 --- a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini +++ b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini @@ -9,5 +9,4 @@ Hit50: mania/hit50 Hit100: mania/hit100 Hit200: mania/hit200 Hit300: mania/hit300 -Hit300g: mania/hit300g -BottomStageImage: mania/stage-bottom \ No newline at end of file +Hit300g: mania/hit300g \ No newline at end of file From aa476835e7b657b414093fb3dcf6b19c3d935d9d Mon Sep 17 00:00:00 2001 From: mcendu Date: Sat, 13 Jun 2020 11:31:34 +0800 Subject: [PATCH 53/98] tidy up code --- .../Skinning/TestSceneDrawableJudgement.cs | 6 ++- .../Skinning/ManiaLegacySkinTransformer.cs | 40 +++++++++---------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs b/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs index 540bf82e1f..a4d4ec50f8 100644 --- a/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs +++ b/osu.Game.Rulesets.Mania.Tests/Skinning/TestSceneDrawableJudgement.cs @@ -17,17 +17,19 @@ namespace osu.Game.Rulesets.Mania.Tests.Skinning { public TestSceneDrawableJudgement() { - var HitWindows = new ManiaHitWindows(); + var hitWindows = new ManiaHitWindows(); foreach (HitResult result in Enum.GetValues(typeof(HitResult)).OfType().Skip(1)) { - if (HitWindows.IsHitResultAllowed(result)) + if (hitWindows.IsHitResultAllowed(result)) + { AddStep("Show " + result.GetDescription(), () => SetContents(() => new DrawableManiaJudgement(new JudgementResult(new HitObject(), new Judgement()) { Type = result }, null) { Anchor = Anchor.Centre, Origin = Anchor.Centre, })); + } } } } diff --git a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs index 9ba544ed59..3304330233 100644 --- a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs @@ -24,31 +24,31 @@ namespace osu.Game.Rulesets.Mania.Skinning /// Mapping of to ther corresponding /// value. ///

- private static readonly IReadOnlyDictionary componentMapping + private static readonly IReadOnlyDictionary hitresult_mapping = new Dictionary - { - { HitResult.Perfect, LegacyManiaSkinConfigurationLookups.Hit300g }, - { HitResult.Great, LegacyManiaSkinConfigurationLookups.Hit300 }, - { HitResult.Good, LegacyManiaSkinConfigurationLookups.Hit200 }, - { HitResult.Ok, LegacyManiaSkinConfigurationLookups.Hit100 }, - { HitResult.Meh, LegacyManiaSkinConfigurationLookups.Hit50 }, - { HitResult.Miss, LegacyManiaSkinConfigurationLookups.Hit0 } - }; + { + { HitResult.Perfect, LegacyManiaSkinConfigurationLookups.Hit300g }, + { HitResult.Great, LegacyManiaSkinConfigurationLookups.Hit300 }, + { HitResult.Good, LegacyManiaSkinConfigurationLookups.Hit200 }, + { HitResult.Ok, LegacyManiaSkinConfigurationLookups.Hit100 }, + { HitResult.Meh, LegacyManiaSkinConfigurationLookups.Hit50 }, + { HitResult.Miss, LegacyManiaSkinConfigurationLookups.Hit0 } + }; /// /// Mapping of to their corresponding /// default filenames. /// - private static readonly IReadOnlyDictionary defaultName + private static readonly IReadOnlyDictionary default_hitresult_skin_filenames = new Dictionary - { - { HitResult.Perfect, "mania-hit300g" }, - { HitResult.Great, "mania-hit300" }, - { HitResult.Good, "mania-hit200" }, - { HitResult.Ok, "mania-hit100" }, - { HitResult.Meh, "mania-hit50" }, - { HitResult.Miss, "mania-hit0" } - }; + { + { HitResult.Perfect, "mania-hit300g" }, + { HitResult.Great, "mania-hit300" }, + { HitResult.Good, "mania-hit200" }, + { HitResult.Ok, "mania-hit100" }, + { HitResult.Meh, "mania-hit50" }, + { HitResult.Miss, "mania-hit0" } + }; private Lazy isLegacySkin; @@ -129,8 +129,8 @@ namespace osu.Game.Rulesets.Mania.Skinning private Drawable getResult(HitResult result) { string image = GetConfig( - new ManiaSkinConfigurationLookup(componentMapping[result]) - )?.Value ?? defaultName[result]; + new ManiaSkinConfigurationLookup(hitresult_mapping[result]) + )?.Value ?? default_hitresult_skin_filenames[result]; return this.GetAnimation(image, true, true); } From 7212ab3a1afe56a5ae0654811d8ce535cf1e24c6 Mon Sep 17 00:00:00 2001 From: clayton Date: Fri, 12 Jun 2020 23:48:30 -0700 Subject: [PATCH 54/98] Add new beatmap genres and languages --- osu.Game/Overlays/BeatmapListing/SearchGenre.cs | 6 +++++- osu.Game/Overlays/BeatmapListing/SearchLanguage.cs | 12 +++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/BeatmapListing/SearchGenre.cs b/osu.Game/Overlays/BeatmapListing/SearchGenre.cs index b12bba6249..de437fac3e 100644 --- a/osu.Game/Overlays/BeatmapListing/SearchGenre.cs +++ b/osu.Game/Overlays/BeatmapListing/SearchGenre.cs @@ -20,6 +20,10 @@ namespace osu.Game.Overlays.BeatmapListing [Description("Hip Hop")] HipHop = 9, - Electronic = 10 + Electronic = 10, + Metal = 11, + Classical = 12, + Folk = 13, + Jazz = 14 } } diff --git a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs index dac7e4f1a2..ef7576344a 100644 --- a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs +++ b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs @@ -11,7 +11,7 @@ namespace osu.Game.Overlays.BeatmapListing [Order(0)] Any, - [Order(11)] + [Order(13)] Other, [Order(1)] @@ -23,7 +23,7 @@ namespace osu.Game.Overlays.BeatmapListing [Order(2)] Chinese, - [Order(10)] + [Order(12)] Instrumental, [Order(7)] @@ -42,6 +42,12 @@ namespace osu.Game.Overlays.BeatmapListing Spanish, [Order(5)] - Italian + Italian, + + [Order(10)] + Russian, + + [Order(11)] + Polish } } From 9d98adee1e0b0b806f4d678e3310a5fb3cc3edc3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 13 Jun 2020 16:10:41 +0900 Subject: [PATCH 55/98] Update fastlane to fix upload failure for iOS releases --- Gemfile.lock | 72 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e3954c2681..bf971d2c22 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,22 @@ GEM addressable (2.7.0) public_suffix (>= 2.0.2, < 5.0) atomos (0.1.3) + aws-eventstream (1.1.0) + aws-partitions (1.329.0) + aws-sdk-core (3.99.2) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.239.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.34.1) + aws-sdk-core (~> 3, >= 3.99.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.68.1) + aws-sdk-core (~> 3, >= 3.99.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.1.4) + aws-eventstream (~> 1.0, >= 1.0.2) babosa (1.0.3) claide (1.0.3) colored (1.2) @@ -13,23 +29,24 @@ GEM highline (~> 1.7.2) declarative (0.0.10) declarative-option (0.1.0) - digest-crc (0.4.1) + digest-crc (0.5.1) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) dotenv (2.7.5) emoji_regex (1.0.1) - excon (0.71.1) - faraday (0.17.3) + excon (0.74.0) + faraday (1.0.1) multipart-post (>= 1.2, < 3) faraday-cookie_jar (0.0.6) faraday (>= 0.7.4) http-cookie (~> 1.0.0) - faraday_middleware (0.13.1) - faraday (>= 0.7.4, < 1.0) + faraday_middleware (1.0.0) + faraday (~> 1.0) fastimage (2.1.7) - fastlane (2.140.0) + fastlane (2.149.1) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) + aws-sdk-s3 (~> 1.0) babosa (>= 1.0.2, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) colored @@ -37,12 +54,12 @@ GEM dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 2.0) excon (>= 0.71.0, < 1.0.0) - faraday (~> 0.17) + faraday (>= 0.17, < 2.0) faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 0.13.1) + faraday_middleware (>= 0.13.1, < 2.0) fastimage (>= 2.1.0, < 3.0.0) gh_inspector (>= 1.1.2, < 2.0.0) - google-api-client (>= 0.29.2, < 0.37.0) + google-api-client (>= 0.37.0, < 0.39.0) google-cloud-storage (>= 1.15.0, < 2.0.0) highline (>= 1.7.2, < 2.0.0) json (< 3.0.0) @@ -69,7 +86,7 @@ GEM souyuz (= 0.9.1) fastlane-plugin-xamarin (0.6.3) gh_inspector (1.1.3) - google-api-client (0.36.4) + google-api-client (0.38.0) addressable (~> 2.5, >= 2.5.1) googleauth (~> 0.9) httpclient (>= 2.8.1, < 3.0) @@ -80,27 +97,28 @@ GEM google-cloud-core (1.5.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) - google-cloud-env (1.3.0) - faraday (~> 0.11) - google-cloud-errors (1.0.0) - google-cloud-storage (1.25.1) + google-cloud-env (1.3.2) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.0.1) + google-cloud-storage (1.26.2) addressable (~> 2.5) digest-crc (~> 0.4) google-api-client (~> 0.33) google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.10.0) - faraday (~> 0.12) + googleauth (0.12.0) + faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.12) + signet (~> 0.14) highline (1.7.10) http-cookie (1.0.3) domain_name (~> 0.5) httpclient (2.8.3) + jmespath (1.4.0) json (2.3.0) jwt (2.1.0) memoist (0.16.2) @@ -114,7 +132,7 @@ GEM naturally (2.2.0) nokogiri (1.10.7) mini_portile2 (~> 2.4.0) - os (1.0.1) + os (1.1.0) plist (3.5.0) public_suffix (2.0.5) representable (3.0.4) @@ -125,12 +143,12 @@ GEM rouge (2.0.7) rubyzip (1.3.0) security (0.1.3) - signet (0.12.0) + signet (0.14.0) addressable (~> 2.3) - faraday (~> 0.9) + faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simctl (1.6.7) + simctl (1.6.8) CFPropertyList naturally slack-notifier (2.3.2) @@ -141,17 +159,17 @@ GEM terminal-notifier (2.0.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - tty-cursor (0.7.0) - tty-screen (0.7.0) - tty-spinner (0.9.2) + tty-cursor (0.7.1) + tty-screen (0.8.0) + tty-spinner (0.9.3) tty-cursor (~> 0.7) uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.6) - unicode-display_width (1.6.1) + unf_ext (0.0.7.7) + unicode-display_width (1.7.0) word_wrap (1.0.0) - xcodeproj (1.14.0) + xcodeproj (1.16.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) From 7bc70e644a56a76b9d2be063262e6de378853bc3 Mon Sep 17 00:00:00 2001 From: clayton Date: Sat, 13 Jun 2020 00:20:34 -0700 Subject: [PATCH 56/98] Add Unspecified language --- osu.Game/Overlays/BeatmapListing/SearchLanguage.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs index ef7576344a..43f16059e9 100644 --- a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs +++ b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs @@ -48,6 +48,9 @@ namespace osu.Game.Overlays.BeatmapListing Russian, [Order(11)] - Polish + Polish, + + [Order(14)] + Unspecified } } From c490dba7b3e0e22202ab861e0132a5779d818f0f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 13 Jun 2020 18:18:46 +0900 Subject: [PATCH 57/98] Fix crash on local score display --- osu.Game/Scoring/ScoreStore.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game/Scoring/ScoreStore.cs b/osu.Game/Scoring/ScoreStore.cs index 9627481f4d..f5c5cd5dad 100644 --- a/osu.Game/Scoring/ScoreStore.cs +++ b/osu.Game/Scoring/ScoreStore.cs @@ -18,6 +18,8 @@ namespace osu.Game.Scoring protected override IQueryable AddIncludesForConsumption(IQueryable query) => base.AddIncludesForConsumption(query) .Include(s => s.Beatmap) + .Include(s => s.Beatmap).ThenInclude(b => b.Metadata) + .Include(s => s.Beatmap).ThenInclude(b => b.BeatmapSet).ThenInclude(s => s.Metadata) .Include(s => s.Ruleset); } } From 619c541cf559f546c5718673c4acf279f98ce320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 13 Jun 2020 12:41:00 +0200 Subject: [PATCH 58/98] Rewrite test to use dummy API --- .../Online/TestSceneCommentsContainer.cs | 117 +++++++++++++----- 1 file changed, 89 insertions(+), 28 deletions(-) diff --git a/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs b/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs index 42e6b9087c..26ad0b0d3f 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs @@ -1,52 +1,113 @@ // 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 System.Collections.Generic; +using System.Linq; using NUnit.Framework; -using osu.Game.Online.API.Requests; -using osu.Framework.Graphics.Containers; -using osu.Framework.Graphics; -using osu.Game.Overlays.Comments; using osu.Game.Overlays; using osu.Framework.Allocation; -using osu.Framework.Bindables; -using osu.Game.Users; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Testing; +using osu.Game.Online.API; +using osu.Game.Online.API.Requests; +using osu.Game.Online.API.Requests.Responses; +using osu.Game.Overlays.Comments; namespace osu.Game.Tests.Visual.Online { [TestFixture] public class TestSceneCommentsContainer : OsuTestScene { - protected override bool UseOnlineAPI => true; - [Cached] private readonly OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Purple); - public TestSceneCommentsContainer() - { - BasicScrollContainer scroll; - TestCommentsContainer comments; + private DummyAPIAccess dummyAPI => (DummyAPIAccess)API; - Add(scroll = new BasicScrollContainer + private CommentsContainer commentsContainer; + + [SetUp] + public void SetUp() => Schedule(() => + Child = new BasicScrollContainer { RelativeSizeAxes = Axes.Both, - Child = comments = new TestCommentsContainer() + Child = commentsContainer = new CommentsContainer() }); - AddStep("Big Black comments", () => comments.ShowComments(CommentableType.Beatmapset, 41823)); - AddStep("Airman comments", () => comments.ShowComments(CommentableType.Beatmapset, 24313)); - AddStep("Lazer build comments", () => comments.ShowComments(CommentableType.Build, 4772)); - AddStep("News comments", () => comments.ShowComments(CommentableType.NewsPost, 715)); - AddStep("Trigger user change", comments.User.TriggerChange); - AddStep("Idle state", () => - { - scroll.Clear(); - scroll.Add(comments = new TestCommentsContainer()); - }); - } - - private class TestCommentsContainer : CommentsContainer + [Test] + public void TestIdleState() { - public new Bindable User => base.User; + AddUntilStep("loading spinner shown", + () => commentsContainer.ChildrenOfType().Single().IsLoading); } + + [Test] + public void TestSingleCommentsPage() + { + setUpCommentsResponse(exampleComments); + AddStep("show comments", () => commentsContainer.ShowComments(CommentableType.Beatmapset, 123)); + AddUntilStep("show more button hidden", + () => commentsContainer.ChildrenOfType().Single().Alpha == 0); + } + + [Test] + public void TestMultipleCommentPages() + { + var comments = exampleComments; + comments.HasMore = true; + comments.TopLevelCount = 10; + + setUpCommentsResponse(comments); + AddStep("show comments", () => commentsContainer.ShowComments(CommentableType.Beatmapset, 123)); + AddUntilStep("show more button visible", + () => commentsContainer.ChildrenOfType().Single().Alpha == 1); + } + + private void setUpCommentsResponse(CommentBundle commentBundle) + => AddStep("set up response", () => + { + dummyAPI.HandleRequest = request => + { + if (!(request is GetCommentsRequest getCommentsRequest)) + return; + + getCommentsRequest.TriggerSuccess(commentBundle); + }; + }); + + private CommentBundle exampleComments => new CommentBundle + { + Comments = new List + { + new Comment + { + Id = 1, + Message = "This is a comment", + LegacyName = "FirstUser", + CreatedAt = DateTimeOffset.Now, + VotesCount = 19, + RepliesCount = 1 + }, + new Comment + { + Id = 5, + ParentId = 1, + Message = "This is a child comment", + LegacyName = "SecondUser", + CreatedAt = DateTimeOffset.Now, + VotesCount = 4, + }, + new Comment + { + Id = 10, + Message = "This is another comment", + LegacyName = "ThirdUser", + CreatedAt = DateTimeOffset.Now, + VotesCount = 0 + }, + }, + IncludedComments = new List(), + }; } } From 5655e090d1e1102aea9c82b461ffec7402538c65 Mon Sep 17 00:00:00 2001 From: mcendu Date: Sat, 13 Jun 2020 18:45:06 +0800 Subject: [PATCH 59/98] revert movement of is mania skin check statements --- .../Skinning/ManiaLegacySkinTransformer.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs index 3304330233..f386712222 100644 --- a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs @@ -78,8 +78,6 @@ namespace osu.Game.Rulesets.Mania.Skinning public Drawable GetDrawableComponent(ISkinComponent component) { - if (!isLegacySkin.Value || !hasKeyTexture.Value) - return null; switch (component) { @@ -87,6 +85,9 @@ namespace osu.Game.Rulesets.Mania.Skinning return getResult(resultComponent.Component); case ManiaSkinComponent maniaComponent: + if (!isLegacySkin.Value || !hasKeyTexture.Value) + return null; + switch (maniaComponent.Component) { case ManiaSkinComponents.ColumnBackground: From 4eeb22ca18e4598ab693c7beb0fd5309188f8ee8 Mon Sep 17 00:00:00 2001 From: mcendu Date: Sat, 13 Jun 2020 18:47:40 +0800 Subject: [PATCH 60/98] rename a few variables and fix typo --- .../Skinning/ManiaLegacySkinTransformer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs index f386712222..07d0ce66e2 100644 --- a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs @@ -21,7 +21,7 @@ namespace osu.Game.Rulesets.Mania.Skinning private readonly ManiaBeatmap beatmap; /// - /// Mapping of to ther corresponding + /// Mapping of to their corresponding /// value. /// private static readonly IReadOnlyDictionary hitresult_mapping @@ -129,11 +129,11 @@ namespace osu.Game.Rulesets.Mania.Skinning private Drawable getResult(HitResult result) { - string image = GetConfig( + string filename = GetConfig( new ManiaSkinConfigurationLookup(hitresult_mapping[result]) )?.Value ?? default_hitresult_skin_filenames[result]; - return this.GetAnimation(image, true, true); + return this.GetAnimation(filename, true, true); } public Texture GetTexture(string componentName) => source.GetTexture(componentName); From e8046654c8da91496a72c341e8f2f68bd4be66da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 13 Jun 2020 12:48:16 +0200 Subject: [PATCH 61/98] Add failing test case --- .../Visual/Online/TestSceneCommentsContainer.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs b/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs index 26ad0b0d3f..08130e60db 100644 --- a/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs +++ b/osu.Game.Tests/Visual/Online/TestSceneCommentsContainer.cs @@ -64,6 +64,21 @@ namespace osu.Game.Tests.Visual.Online () => commentsContainer.ChildrenOfType().Single().Alpha == 1); } + [Test] + public void TestMultipleLoads() + { + var comments = exampleComments; + int topLevelCommentCount = exampleComments.Comments.Count(comment => comment.IsTopLevel); + + AddStep("hide container", () => commentsContainer.Hide()); + setUpCommentsResponse(comments); + AddRepeatStep("show comments multiple times", + () => commentsContainer.ShowComments(CommentableType.Beatmapset, 456), 2); + AddStep("show container", () => commentsContainer.Show()); + AddUntilStep("comment count is correct", + () => commentsContainer.ChildrenOfType().Count() == topLevelCommentCount); + } + private void setUpCommentsResponse(CommentBundle commentBundle) => AddStep("set up response", () => { From aab606b237953d1d9844fd36245fe8b7e42fca08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 13 Jun 2020 13:00:05 +0200 Subject: [PATCH 62/98] Cancel scheduled asynchronous load of comments --- osu.Game/Overlays/Comments/CommentsContainer.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Comments/CommentsContainer.cs b/osu.Game/Overlays/Comments/CommentsContainer.cs index e7bfeaf968..f71808ba89 100644 --- a/osu.Game/Overlays/Comments/CommentsContainer.cs +++ b/osu.Game/Overlays/Comments/CommentsContainer.cs @@ -12,6 +12,7 @@ using osu.Game.Online.API.Requests.Responses; using System.Threading; using System.Linq; using osu.Framework.Extensions.IEnumerableExtensions; +using osu.Framework.Threading; using osu.Game.Users; namespace osu.Game.Overlays.Comments @@ -30,6 +31,7 @@ namespace osu.Game.Overlays.Comments private IAPIProvider api { get; set; } private GetCommentsRequest request; + private ScheduledDelegate scheduledCommentsLoad; private CancellationTokenSource loadCancellation; private int currentPage; @@ -152,8 +154,9 @@ namespace osu.Game.Overlays.Comments request?.Cancel(); loadCancellation?.Cancel(); + scheduledCommentsLoad?.Cancel(); request = new GetCommentsRequest(id.Value, type.Value, Sort.Value, currentPage++, 0); - request.Success += res => Schedule(() => onSuccess(res)); + request.Success += res => scheduledCommentsLoad = Schedule(() => onSuccess(res)); api.PerformAsync(request); } From 8402d4a5f3c2e2cac8e9b5c4948a961f0e5d1b50 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 13 Jun 2020 21:18:56 +0900 Subject: [PATCH 63/98] Remove newline --- osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs index 07d0ce66e2..74a983fac8 100644 --- a/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs +++ b/osu.Game.Rulesets.Mania/Skinning/ManiaLegacySkinTransformer.cs @@ -78,7 +78,6 @@ namespace osu.Game.Rulesets.Mania.Skinning public Drawable GetDrawableComponent(ISkinComponent component) { - switch (component) { case GameplaySkinComponent resultComponent: From b9e247da8f3d4eeccf3448bda6d0c4554666cd55 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sat, 13 Jun 2020 21:19:06 +0900 Subject: [PATCH 64/98] Simplify lookup code --- osu.Game/Skinning/LegacySkin.cs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs index 390dc871e4..0b2b723440 100644 --- a/osu.Game/Skinning/LegacySkin.cs +++ b/osu.Game/Skinning/LegacySkin.cs @@ -259,22 +259,12 @@ namespace osu.Game.Skinning return SkinUtils.As(new Bindable(existing.ColumnLineWidth[maniaLookup.TargetColumn.Value + 1])); case LegacyManiaSkinConfigurationLookups.Hit0: - return SkinUtils.As(getManiaImage(existing, "Hit0")); - case LegacyManiaSkinConfigurationLookups.Hit50: - return SkinUtils.As(getManiaImage(existing, "Hit50")); - case LegacyManiaSkinConfigurationLookups.Hit100: - return SkinUtils.As(getManiaImage(existing, "Hit100")); - case LegacyManiaSkinConfigurationLookups.Hit200: - return SkinUtils.As(getManiaImage(existing, "Hit200")); - case LegacyManiaSkinConfigurationLookups.Hit300: - return SkinUtils.As(getManiaImage(existing, "Hit300")); - case LegacyManiaSkinConfigurationLookups.Hit300g: - return SkinUtils.As(getManiaImage(existing, "Hit300g")); + return SkinUtils.As(getManiaImage(existing, maniaLookup.Lookup.ToString())); } return null; From 201bfda3382931077cc8acc26082ce740004f123 Mon Sep 17 00:00:00 2001 From: Ronnie Moir <7267697+H2n9@users.noreply.github.com> Date: Sat, 13 Jun 2020 15:16:27 +0100 Subject: [PATCH 65/98] Give ModTimeRamp an adjust pitch setting. Implement in ModWindDown and ModWindUp --- osu.Game/Rulesets/Mods/ModTimeRamp.cs | 16 +++++++++++++++- osu.Game/Rulesets/Mods/ModWindDown.cs | 7 +++++++ osu.Game/Rulesets/Mods/ModWindUp.cs | 7 +++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/Mods/ModTimeRamp.cs b/osu.Game/Rulesets/Mods/ModTimeRamp.cs index c1f3e357a1..a38aa2bac6 100644 --- a/osu.Game/Rulesets/Mods/ModTimeRamp.cs +++ b/osu.Game/Rulesets/Mods/ModTimeRamp.cs @@ -26,6 +26,9 @@ namespace osu.Game.Rulesets.Mods [SettingSource("Final rate", "The final speed to ramp to")] public abstract BindableNumber FinalRate { get; } + [SettingSource("Adjust Pitch", "Should pitch be adjusted with speed")] + public abstract BindableBool AdjustPitch { get; } + public override string SettingDescription => $"{InitialRate.Value:N2}x to {FinalRate.Value:N2}x"; private double finalRateTime; @@ -44,12 +47,15 @@ namespace osu.Game.Rulesets.Mods { // for preview purpose at song select. eventually we'll want to be able to update every frame. FinalRate.BindValueChanged(val => applyAdjustment(1), true); + + AdjustPitch.BindValueChanged(updatePitchAdjustment, false); } public void ApplyToTrack(Track track) { this.track = track; - track.AddAdjustment(AdjustableProperty.Frequency, SpeedChange); + + track.AddAdjustment(AdjustPitch.Value ? AdjustableProperty.Frequency : AdjustableProperty.Tempo, SpeedChange); FinalRate.TriggerChange(); } @@ -75,5 +81,13 @@ namespace osu.Game.Rulesets.Mods /// The amount of adjustment to apply (from 0..1). private void applyAdjustment(double amount) => SpeedChange.Value = InitialRate.Value + (FinalRate.Value - InitialRate.Value) * Math.Clamp(amount, 0, 1); + + private void updatePitchAdjustment(ValueChangedEvent value) + { + // remove existing old adjustment + track.RemoveAdjustment(value.OldValue ? AdjustableProperty.Frequency : AdjustableProperty.Tempo, SpeedChange); + + track.AddAdjustment(value.NewValue ? AdjustableProperty.Frequency : AdjustableProperty.Tempo, SpeedChange); + } } } diff --git a/osu.Game/Rulesets/Mods/ModWindDown.cs b/osu.Game/Rulesets/Mods/ModWindDown.cs index 5e634ac434..e46b4eff2e 100644 --- a/osu.Game/Rulesets/Mods/ModWindDown.cs +++ b/osu.Game/Rulesets/Mods/ModWindDown.cs @@ -37,6 +37,13 @@ namespace osu.Game.Rulesets.Mods Precision = 0.01, }; + [SettingSource("Adjust Pitch", "Should pitch be adjusted with speed")] + public override BindableBool AdjustPitch { get; } = new BindableBool + { + Default = true, + Value = true + }; + public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModWindUp)).ToArray(); } } diff --git a/osu.Game/Rulesets/Mods/ModWindUp.cs b/osu.Game/Rulesets/Mods/ModWindUp.cs index 74c6fc22d3..02203a474d 100644 --- a/osu.Game/Rulesets/Mods/ModWindUp.cs +++ b/osu.Game/Rulesets/Mods/ModWindUp.cs @@ -37,6 +37,13 @@ namespace osu.Game.Rulesets.Mods Precision = 0.01, }; + [SettingSource("Adjust Pitch", "Should pitch be adjusted with speed")] + public override BindableBool AdjustPitch { get; } = new BindableBool + { + Default = true, + Value = true + }; + public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModWindDown)).ToArray(); } } From 77eb428184473b09e0cb370adaf11e45e0b9ed9e Mon Sep 17 00:00:00 2001 From: Ronnie Moir <7267697+H2n9@users.noreply.github.com> Date: Sat, 13 Jun 2020 16:30:21 +0100 Subject: [PATCH 66/98] Use consistent setting casing --- osu.Game/Rulesets/Mods/ModWindDown.cs | 2 +- osu.Game/Rulesets/Mods/ModWindUp.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game/Rulesets/Mods/ModWindDown.cs b/osu.Game/Rulesets/Mods/ModWindDown.cs index e46b4eff2e..679b50057b 100644 --- a/osu.Game/Rulesets/Mods/ModWindDown.cs +++ b/osu.Game/Rulesets/Mods/ModWindDown.cs @@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Mods Precision = 0.01, }; - [SettingSource("Adjust Pitch", "Should pitch be adjusted with speed")] + [SettingSource("Adjust pitch", "Should pitch be adjusted with speed")] public override BindableBool AdjustPitch { get; } = new BindableBool { Default = true, diff --git a/osu.Game/Rulesets/Mods/ModWindUp.cs b/osu.Game/Rulesets/Mods/ModWindUp.cs index 02203a474d..b733bf423e 100644 --- a/osu.Game/Rulesets/Mods/ModWindUp.cs +++ b/osu.Game/Rulesets/Mods/ModWindUp.cs @@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Mods Precision = 0.01, }; - [SettingSource("Adjust Pitch", "Should pitch be adjusted with speed")] + [SettingSource("Adjust pitch", "Should pitch be adjusted with speed")] public override BindableBool AdjustPitch { get; } = new BindableBool { Default = true, From dc5bb12fa8e9f6f47c14c57b8242b24f24aa37c3 Mon Sep 17 00:00:00 2001 From: Ronnie Moir <7267697+H2n9@users.noreply.github.com> Date: Sat, 13 Jun 2020 16:32:43 +0100 Subject: [PATCH 67/98] Use local helper for selecting adjusted property --- osu.Game/Rulesets/Mods/ModTimeRamp.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/osu.Game/Rulesets/Mods/ModTimeRamp.cs b/osu.Game/Rulesets/Mods/ModTimeRamp.cs index a38aa2bac6..9f30f340fd 100644 --- a/osu.Game/Rulesets/Mods/ModTimeRamp.cs +++ b/osu.Game/Rulesets/Mods/ModTimeRamp.cs @@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.Mods [SettingSource("Final rate", "The final speed to ramp to")] public abstract BindableNumber FinalRate { get; } - [SettingSource("Adjust Pitch", "Should pitch be adjusted with speed")] + [SettingSource("Adjust pitch", "Should pitch be adjusted with speed")] public abstract BindableBool AdjustPitch { get; } public override string SettingDescription => $"{InitialRate.Value:N2}x to {FinalRate.Value:N2}x"; @@ -55,9 +55,8 @@ namespace osu.Game.Rulesets.Mods { this.track = track; - track.AddAdjustment(AdjustPitch.Value ? AdjustableProperty.Frequency : AdjustableProperty.Tempo, SpeedChange); - FinalRate.TriggerChange(); + AdjustPitch.TriggerChange(); } public virtual void ApplyToBeatmap(IBeatmap beatmap) @@ -85,9 +84,12 @@ namespace osu.Game.Rulesets.Mods private void updatePitchAdjustment(ValueChangedEvent value) { // remove existing old adjustment - track.RemoveAdjustment(value.OldValue ? AdjustableProperty.Frequency : AdjustableProperty.Tempo, SpeedChange); + track.RemoveAdjustment(adjustmentForPitchSetting(value.OldValue), SpeedChange); - track.AddAdjustment(value.NewValue ? AdjustableProperty.Frequency : AdjustableProperty.Tempo, SpeedChange); + track.AddAdjustment(adjustmentForPitchSetting(value.NewValue), SpeedChange); } + + private AdjustableProperty adjustmentForPitchSetting(bool value) + => value ? AdjustableProperty.Frequency : AdjustableProperty.Tempo; } } From 7b95c55afb17429a8eb1b253c62767c11f3792c9 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 14 Jun 2020 11:33:59 +0900 Subject: [PATCH 68/98] Fix HardwareCorrectionOffsetClock breaking ElapsedTime readings --- osu.Game/Screens/Play/GameplayClockContainer.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Play/GameplayClockContainer.cs b/osu.Game/Screens/Play/GameplayClockContainer.cs index 2f85d6ad1e..fe1d22e987 100644 --- a/osu.Game/Screens/Play/GameplayClockContainer.cs +++ b/osu.Game/Screens/Play/GameplayClockContainer.cs @@ -251,8 +251,9 @@ namespace osu.Game.Screens.Play private class HardwareCorrectionOffsetClock : FramedOffsetClock { - // we always want to apply the same real-time offset, so it should be adjusted by the playback rate to achieve this. - public override double CurrentTime => SourceTime + Offset * Rate; + // we always want to apply the same real-time offset, so it should be adjusted by the difference in playback rate (from realtime) to achieve this. + // base implementation already adds offset at 1.0 rate, so we only add the difference from that here. + public override double CurrentTime => base.CurrentTime + Offset * (1 - Rate); public HardwareCorrectionOffsetClock(IClock source, bool processSource = true) : base(source, processSource) From 1164a1048330211410a9f050176bf868c56a023d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 14 Jun 2020 11:34:07 +0900 Subject: [PATCH 69/98] Add test coverage --- .../TestSceneGameplayClockContainer.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 osu.Game.Tests/Gameplay/TestSceneGameplayClockContainer.cs diff --git a/osu.Game.Tests/Gameplay/TestSceneGameplayClockContainer.cs b/osu.Game.Tests/Gameplay/TestSceneGameplayClockContainer.cs new file mode 100644 index 0000000000..a97566ba7b --- /dev/null +++ b/osu.Game.Tests/Gameplay/TestSceneGameplayClockContainer.cs @@ -0,0 +1,25 @@ +// 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 NUnit.Framework; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Osu; +using osu.Game.Screens.Play; +using osu.Game.Tests.Visual; + +namespace osu.Game.Tests.Gameplay +{ + public class TestSceneGameplayClockContainer : OsuTestScene + { + [Test] + public void TestStartThenElapsedTime() + { + GameplayClockContainer gcc = null; + + AddStep("create container", () => Add(gcc = new GameplayClockContainer(CreateWorkingBeatmap(new OsuRuleset().RulesetInfo), Array.Empty(), 0))); + AddStep("start track", () => gcc.Start()); + AddUntilStep("elapsed greater than zero", () => gcc.GameplayClock.ElapsedFrameTime > 0); + } + } +} From abe07b742ebb16190fe0a4601f1fbbc8094748c7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Sun, 14 Jun 2020 13:20:58 +0900 Subject: [PATCH 70/98] Fix drag scroll in editor timeline no longer working correctly --- osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs | 2 -- .../Edit/Compose/Components/ComposeBlueprintContainer.cs | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs index d07cffff0c..cc417bbb10 100644 --- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs +++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs @@ -44,8 +44,6 @@ namespace osu.Game.Screens.Edit.Compose.Components private readonly BindableList selectedHitObjects = new BindableList(); - public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true; - [Resolved(canBeNull: true)] private IPositionSnapProvider snapProvider { get; set; } diff --git a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs index 0b5d8262fd..e1f311f1b8 100644 --- a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs +++ b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs @@ -11,6 +11,7 @@ using osu.Game.Rulesets.Edit; using osu.Game.Rulesets.Edit.Tools; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Drawables; +using osuTK; namespace osu.Game.Screens.Edit.Compose.Components { @@ -26,6 +27,8 @@ namespace osu.Game.Screens.Edit.Compose.Components private readonly Container placementBlueprintContainer; + public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => true; + private InputManager inputManager; private readonly IEnumerable drawableHitObjects; From 0d53d0ffc8f361576a60ebda3ae1e5dece2c6144 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 00:46:20 +0900 Subject: [PATCH 71/98] Fix back-to-front math --- osu.Game/Screens/Play/GameplayClockContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Play/GameplayClockContainer.cs b/osu.Game/Screens/Play/GameplayClockContainer.cs index fe1d22e987..0653373c91 100644 --- a/osu.Game/Screens/Play/GameplayClockContainer.cs +++ b/osu.Game/Screens/Play/GameplayClockContainer.cs @@ -253,7 +253,7 @@ namespace osu.Game.Screens.Play { // we always want to apply the same real-time offset, so it should be adjusted by the difference in playback rate (from realtime) to achieve this. // base implementation already adds offset at 1.0 rate, so we only add the difference from that here. - public override double CurrentTime => base.CurrentTime + Offset * (1 - Rate); + public override double CurrentTime => base.CurrentTime + Offset * (Rate - 1); public HardwareCorrectionOffsetClock(IClock source, bool processSource = true) : base(source, processSource) From 9907b4763bb76963eee9d652640559f07e5fce1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jun 2020 18:39:41 +0200 Subject: [PATCH 72/98] Remove redundant default argument value --- osu.Game/Rulesets/Mods/ModTimeRamp.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/Mods/ModTimeRamp.cs b/osu.Game/Rulesets/Mods/ModTimeRamp.cs index 9f30f340fd..09c50ce115 100644 --- a/osu.Game/Rulesets/Mods/ModTimeRamp.cs +++ b/osu.Game/Rulesets/Mods/ModTimeRamp.cs @@ -48,7 +48,7 @@ namespace osu.Game.Rulesets.Mods // for preview purpose at song select. eventually we'll want to be able to update every frame. FinalRate.BindValueChanged(val => applyAdjustment(1), true); - AdjustPitch.BindValueChanged(updatePitchAdjustment, false); + AdjustPitch.BindValueChanged(updatePitchAdjustment); } public void ApplyToTrack(Track track) From 5f0a345eebd0410364a79b69aa0465490b48712a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jun 2020 18:48:49 +0200 Subject: [PATCH 73/98] Unify method naming --- osu.Game/Rulesets/Mods/ModTimeRamp.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/osu.Game/Rulesets/Mods/ModTimeRamp.cs b/osu.Game/Rulesets/Mods/ModTimeRamp.cs index 09c50ce115..edca3edf46 100644 --- a/osu.Game/Rulesets/Mods/ModTimeRamp.cs +++ b/osu.Game/Rulesets/Mods/ModTimeRamp.cs @@ -46,9 +46,8 @@ namespace osu.Game.Rulesets.Mods protected ModTimeRamp() { // for preview purpose at song select. eventually we'll want to be able to update every frame. - FinalRate.BindValueChanged(val => applyAdjustment(1), true); - - AdjustPitch.BindValueChanged(updatePitchAdjustment); + FinalRate.BindValueChanged(val => applyRateAdjustment(1), true); + AdjustPitch.BindValueChanged(applyPitchAdjustment); } public void ApplyToTrack(Track track) @@ -71,17 +70,17 @@ namespace osu.Game.Rulesets.Mods public virtual void Update(Playfield playfield) { - applyAdjustment((track.CurrentTime - beginRampTime) / finalRateTime); + applyRateAdjustment((track.CurrentTime - beginRampTime) / finalRateTime); } /// /// Adjust the rate along the specified ramp /// /// The amount of adjustment to apply (from 0..1). - private void applyAdjustment(double amount) => + private void applyRateAdjustment(double amount) => SpeedChange.Value = InitialRate.Value + (FinalRate.Value - InitialRate.Value) * Math.Clamp(amount, 0, 1); - private void updatePitchAdjustment(ValueChangedEvent value) + private void applyPitchAdjustment(ValueChangedEvent value) { // remove existing old adjustment track.RemoveAdjustment(adjustmentForPitchSetting(value.OldValue), SpeedChange); From e6ddd0380e2ee3b12aacd5a2fdf009ede4605672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sun, 14 Jun 2020 18:50:07 +0200 Subject: [PATCH 74/98] Rename bool arguments for readability --- osu.Game/Rulesets/Mods/ModTimeRamp.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game/Rulesets/Mods/ModTimeRamp.cs b/osu.Game/Rulesets/Mods/ModTimeRamp.cs index edca3edf46..df059eef7d 100644 --- a/osu.Game/Rulesets/Mods/ModTimeRamp.cs +++ b/osu.Game/Rulesets/Mods/ModTimeRamp.cs @@ -80,15 +80,15 @@ namespace osu.Game.Rulesets.Mods private void applyRateAdjustment(double amount) => SpeedChange.Value = InitialRate.Value + (FinalRate.Value - InitialRate.Value) * Math.Clamp(amount, 0, 1); - private void applyPitchAdjustment(ValueChangedEvent value) + private void applyPitchAdjustment(ValueChangedEvent adjustPitchSetting) { // remove existing old adjustment - track.RemoveAdjustment(adjustmentForPitchSetting(value.OldValue), SpeedChange); + track.RemoveAdjustment(adjustmentForPitchSetting(adjustPitchSetting.OldValue), SpeedChange); - track.AddAdjustment(adjustmentForPitchSetting(value.NewValue), SpeedChange); + track.AddAdjustment(adjustmentForPitchSetting(adjustPitchSetting.NewValue), SpeedChange); } - private AdjustableProperty adjustmentForPitchSetting(bool value) - => value ? AdjustableProperty.Frequency : AdjustableProperty.Tempo; + private AdjustableProperty adjustmentForPitchSetting(bool adjustPitchSettingValue) + => adjustPitchSettingValue ? AdjustableProperty.Frequency : AdjustableProperty.Tempo; } } From b8fa1a2c41445264c0835d0600ddf378bd42948a Mon Sep 17 00:00:00 2001 From: Joehu Date: Sun, 14 Jun 2020 11:22:38 -0700 Subject: [PATCH 75/98] Add shortcut to go home --- .../Input/Bindings/GlobalActionContainer.cs | 5 +++++ .../Overlays/Toolbar/ToolbarHomeButton.cs | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/osu.Game/Input/Bindings/GlobalActionContainer.cs b/osu.Game/Input/Bindings/GlobalActionContainer.cs index 71771abede..618798a6d8 100644 --- a/osu.Game/Input/Bindings/GlobalActionContainer.cs +++ b/osu.Game/Input/Bindings/GlobalActionContainer.cs @@ -39,6 +39,8 @@ namespace osu.Game.Input.Bindings new KeyBinding(InputKey.Escape, GlobalAction.Back), new KeyBinding(InputKey.ExtraMouseButton1, GlobalAction.Back), + new KeyBinding(new[] { InputKey.Alt, InputKey.Home }, GlobalAction.Home), + new KeyBinding(InputKey.Up, GlobalAction.SelectPrevious), new KeyBinding(InputKey.Down, GlobalAction.SelectNext), @@ -152,5 +154,8 @@ namespace osu.Game.Input.Bindings [Description("Next Selection")] SelectNext, + + [Description("Home")] + Home, } } diff --git a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs index 6f5e703a66..e642f0c453 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarHomeButton.cs @@ -2,10 +2,12 @@ // See the LICENCE file in the repository root for full licence text. using osu.Framework.Graphics.Sprites; +using osu.Framework.Input.Bindings; +using osu.Game.Input.Bindings; namespace osu.Game.Overlays.Toolbar { - public class ToolbarHomeButton : ToolbarButton + public class ToolbarHomeButton : ToolbarButton, IKeyBindingHandler { public ToolbarHomeButton() { @@ -13,5 +15,20 @@ namespace osu.Game.Overlays.Toolbar TooltipMain = "Home"; TooltipSub = "Return to the main menu"; } + + public bool OnPressed(GlobalAction action) + { + if (action == GlobalAction.Home) + { + Click(); + return true; + } + + return false; + } + + public void OnReleased(GlobalAction action) + { + } } } From 1f7679e829bb39c4bbc88a6599faa527e93a805d Mon Sep 17 00:00:00 2001 From: Joehu Date: Sun, 14 Jun 2020 11:24:23 -0700 Subject: [PATCH 76/98] Fix home button not flashing when pressing shortcut --- osu.Game/Overlays/Toolbar/ToolbarButton.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index 3d66d3c28e..e0ea88fcf3 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -78,9 +78,8 @@ namespace osu.Game.Overlays.Toolbar HoverBackground = new Box { RelativeSizeAxes = Axes.Both, - Colour = OsuColour.Gray(80).Opacity(180), + Colour = OsuColour.Gray(80).Opacity(0), Blending = BlendingParameters.Additive, - Alpha = 0, }, Flow = new FillFlowContainer { @@ -146,14 +145,14 @@ namespace osu.Game.Overlays.Toolbar protected override bool OnHover(HoverEvent e) { - HoverBackground.FadeIn(200); + HoverBackground.FadeColour(OsuColour.Gray(80).Opacity(180), 200); tooltipContainer.FadeIn(100); return base.OnHover(e); } protected override void OnHoverLost(HoverLostEvent e) { - HoverBackground.FadeOut(200); + HoverBackground.FadeColour(OsuColour.Gray(80).Opacity(0), 200); tooltipContainer.FadeOut(100); } } From 978636b90c5f1f1ff943cbe4027543c595e52201 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 09:38:33 +0900 Subject: [PATCH 77/98] Fix storyboard sample playback failing when expected to play at 0ms --- osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs b/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs index f3f8308964..8292b02068 100644 --- a/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs +++ b/osu.Game/Storyboards/Drawables/DrawableStoryboardSample.cs @@ -51,7 +51,7 @@ namespace osu.Game.Storyboards.Drawables LifetimeStart = sampleInfo.StartTime; LifetimeEnd = double.MaxValue; } - else if (Time.Current - Time.Elapsed < sampleInfo.StartTime) + else if (Time.Current - Time.Elapsed <= sampleInfo.StartTime) { // We've passed the start time of the sample. We only play the sample if we're within an allowable range // from the sample's start, to reduce layering if we've been fast-forwarded far into the future From fdf7c56ba28db7165d1651dcdfb2e69520866e35 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 11:18:12 +0900 Subject: [PATCH 78/98] Add test coverage --- .../Gameplay/TestSceneStoryboardSamples.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs b/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs index 84506739ab..2c85c4809b 100644 --- a/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs +++ b/osu.Game.Tests/Gameplay/TestSceneStoryboardSamples.cs @@ -1,6 +1,7 @@ // 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 System.Collections.Generic; using System.IO; using System.Threading.Tasks; @@ -10,7 +11,12 @@ using osu.Framework.Audio.Sample; using osu.Framework.IO.Stores; using osu.Framework.Testing; using osu.Game.Audio; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Osu; +using osu.Game.Screens.Play; using osu.Game.Skinning; +using osu.Game.Storyboards; +using osu.Game.Storyboards.Drawables; using osu.Game.Tests.Resources; using osu.Game.Tests.Visual; @@ -43,6 +49,27 @@ namespace osu.Game.Tests.Gameplay AddAssert("sample is non-null", () => channel != null); } + [Test] + public void TestSamplePlaybackAtZero() + { + GameplayClockContainer gameplayContainer = null; + DrawableStoryboardSample sample = null; + + AddStep("create container", () => + { + Add(gameplayContainer = new GameplayClockContainer(CreateWorkingBeatmap(new OsuRuleset().RulesetInfo), Array.Empty(), 0)); + + gameplayContainer.Add(sample = new DrawableStoryboardSample(new StoryboardSampleInfo(string.Empty, 0, 1)) + { + Clock = gameplayContainer.GameplayClock + }); + }); + + AddStep("start time", () => gameplayContainer.Start()); + + AddUntilStep("sample playback succeeded", () => sample.LifetimeEnd < double.MaxValue); + } + private class TestSkin : LegacySkin { public TestSkin(string resourceName, AudioManager audioManager) From b41567c66c48f2fc679cb91518e70e7ee7799b88 Mon Sep 17 00:00:00 2001 From: Joehu Date: Sun, 14 Jun 2020 22:02:21 -0700 Subject: [PATCH 79/98] Split hover and flash to separate boxes --- osu.Game/Overlays/Toolbar/ToolbarButton.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index e0ea88fcf3..cbcb4060a3 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -62,6 +62,7 @@ namespace osu.Game.Overlays.Toolbar protected ConstrainedIconContainer IconContainer; protected SpriteText DrawableText; protected Box HoverBackground; + private readonly Box FlashBackground; private readonly FillFlowContainer tooltipContainer; private readonly SpriteText tooltip1; private readonly SpriteText tooltip2; @@ -78,7 +79,14 @@ namespace osu.Game.Overlays.Toolbar HoverBackground = new Box { RelativeSizeAxes = Axes.Both, - Colour = OsuColour.Gray(80).Opacity(0), + Colour = OsuColour.Gray(80).Opacity(180), + Blending = BlendingParameters.Additive, + Alpha = 0, + }, + FlashBackground = new Box + { + RelativeSizeAxes = Axes.Both, + Colour = Color4.Transparent, Blending = BlendingParameters.Additive, }, Flow = new FillFlowContainer @@ -138,21 +146,21 @@ namespace osu.Game.Overlays.Toolbar protected override bool OnClick(ClickEvent e) { - HoverBackground.FlashColour(Color4.White.Opacity(100), 500, Easing.OutQuint); + FlashBackground.FlashColour(Color4.White.Opacity(100), 500, Easing.OutQuint); tooltipContainer.FadeOut(100); return base.OnClick(e); } protected override bool OnHover(HoverEvent e) { - HoverBackground.FadeColour(OsuColour.Gray(80).Opacity(180), 200); + HoverBackground.FadeIn(200); tooltipContainer.FadeIn(100); return base.OnHover(e); } protected override void OnHoverLost(HoverLostEvent e) { - HoverBackground.FadeColour(OsuColour.Gray(80).Opacity(0), 200); + HoverBackground.FadeOut(200); tooltipContainer.FadeOut(100); } } From 941fdf5e76a40d6d3400ab3b75a4869414c55aa6 Mon Sep 17 00:00:00 2001 From: Joehu Date: Sun, 14 Jun 2020 22:16:17 -0700 Subject: [PATCH 80/98] Fix flash background naming --- osu.Game/Overlays/Toolbar/ToolbarButton.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index cbcb4060a3..e752516baf 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -62,7 +62,7 @@ namespace osu.Game.Overlays.Toolbar protected ConstrainedIconContainer IconContainer; protected SpriteText DrawableText; protected Box HoverBackground; - private readonly Box FlashBackground; + private readonly Box flashBackground; private readonly FillFlowContainer tooltipContainer; private readonly SpriteText tooltip1; private readonly SpriteText tooltip2; @@ -83,7 +83,7 @@ namespace osu.Game.Overlays.Toolbar Blending = BlendingParameters.Additive, Alpha = 0, }, - FlashBackground = new Box + flashBackground = new Box { RelativeSizeAxes = Axes.Both, Colour = Color4.Transparent, @@ -146,7 +146,7 @@ namespace osu.Game.Overlays.Toolbar protected override bool OnClick(ClickEvent e) { - FlashBackground.FlashColour(Color4.White.Opacity(100), 500, Easing.OutQuint); + flashBackground.FlashColour(Color4.White.Opacity(100), 500, Easing.OutQuint); tooltipContainer.FadeOut(100); return base.OnClick(e); } From 1770b70b8164442d21f79ea4b0e9116a91552403 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 16:14:35 +0900 Subject: [PATCH 81/98] Change implementation to ensure flashBackground is not present by default --- osu.Game/Overlays/Toolbar/ToolbarButton.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game/Overlays/Toolbar/ToolbarButton.cs b/osu.Game/Overlays/Toolbar/ToolbarButton.cs index e752516baf..86a3f5d8aa 100644 --- a/osu.Game/Overlays/Toolbar/ToolbarButton.cs +++ b/osu.Game/Overlays/Toolbar/ToolbarButton.cs @@ -86,7 +86,8 @@ namespace osu.Game.Overlays.Toolbar flashBackground = new Box { RelativeSizeAxes = Axes.Both, - Colour = Color4.Transparent, + Alpha = 0, + Colour = Color4.White.Opacity(100), Blending = BlendingParameters.Additive, }, Flow = new FillFlowContainer @@ -146,7 +147,7 @@ namespace osu.Game.Overlays.Toolbar protected override bool OnClick(ClickEvent e) { - flashBackground.FlashColour(Color4.White.Opacity(100), 500, Easing.OutQuint); + flashBackground.FadeOutFromOne(800, Easing.OutQuint); tooltipContainer.FadeOut(100); return base.OnClick(e); } From 60381d581718dad2d92dfef6b0da3ff8026fa9fe Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Fri, 17 Apr 2020 03:38:12 +0300 Subject: [PATCH 82/98] Remove IRulesetTestScene and use OsuTestScene.CreateRuleset() instead --- .../Rulesets/Testing/IRulesetTestScene.cs | 20 ------------------- osu.Game/Tests/Visual/OsuTestScene.cs | 6 +++--- 2 files changed, 3 insertions(+), 23 deletions(-) delete mode 100644 osu.Game/Rulesets/Testing/IRulesetTestScene.cs diff --git a/osu.Game/Rulesets/Testing/IRulesetTestScene.cs b/osu.Game/Rulesets/Testing/IRulesetTestScene.cs deleted file mode 100644 index e8b8a79eb5..0000000000 --- a/osu.Game/Rulesets/Testing/IRulesetTestScene.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. -// See the LICENCE file in the repository root for full licence text. - -namespace osu.Game.Rulesets.Testing -{ - /// - /// An interface that can be assigned to test scenes to indicate - /// that the test scene is testing ruleset-specific components. - /// This is to cache required ruleset dependencies for the components. - /// - public interface IRulesetTestScene - { - /// - /// Retrieves the ruleset that is going - /// to be tested by this test scene. - /// - /// The . - Ruleset CreateRuleset(); - } -} diff --git a/osu.Game/Tests/Visual/OsuTestScene.cs b/osu.Game/Tests/Visual/OsuTestScene.cs index eb1905cbe1..82ba989306 100644 --- a/osu.Game/Tests/Visual/OsuTestScene.cs +++ b/osu.Game/Tests/Visual/OsuTestScene.cs @@ -20,7 +20,6 @@ using osu.Game.Database; using osu.Game.Online.API; using osu.Game.Rulesets; using osu.Game.Rulesets.Mods; -using osu.Game.Rulesets.Testing; using osu.Game.Rulesets.UI; using osu.Game.Screens; using osu.Game.Storyboards; @@ -70,8 +69,9 @@ namespace osu.Game.Tests.Visual { var baseDependencies = base.CreateChildDependencies(parent); - if (this is IRulesetTestScene rts) - baseDependencies = rulesetDependencies = new DrawableRulesetDependencies(rts.CreateRuleset(), baseDependencies); + var providedRuleset = CreateRuleset(); + if (providedRuleset != null) + baseDependencies = rulesetDependencies = new DrawableRulesetDependencies(providedRuleset, baseDependencies); Dependencies = new OsuScreenDependencies(false, baseDependencies); From f14774e795ab68f593008346a43c1c70401681e7 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Mon, 15 Jun 2020 11:47:31 +0300 Subject: [PATCH 83/98] Rename to TestSceneRulesetDependencies, mark as headless and avoid throwing Avoid throw not implemented exceptions from TestRuleset since it's now set as the global ruleset bindable automatically by base, throwing to innocent components is probably not needed. --- ...ene.cs => TestSceneRulesetDependencies.cs} | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) rename osu.Game.Tests/Testing/{TestSceneRulesetTestScene.cs => TestSceneRulesetDependencies.cs} (73%) diff --git a/osu.Game.Tests/Testing/TestSceneRulesetTestScene.cs b/osu.Game.Tests/Testing/TestSceneRulesetDependencies.cs similarity index 73% rename from osu.Game.Tests/Testing/TestSceneRulesetTestScene.cs rename to osu.Game.Tests/Testing/TestSceneRulesetDependencies.cs index 6d8502e651..80f1b02794 100644 --- a/osu.Game.Tests/Testing/TestSceneRulesetTestScene.cs +++ b/osu.Game.Tests/Testing/TestSceneRulesetDependencies.cs @@ -9,21 +9,28 @@ using osu.Framework.Audio.Track; using osu.Framework.Configuration.Tracking; using osu.Framework.Graphics.Textures; using osu.Framework.IO.Stores; +using osu.Framework.Testing; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Rulesets; using osu.Game.Rulesets.Configuration; using osu.Game.Rulesets.Difficulty; using osu.Game.Rulesets.Mods; -using osu.Game.Rulesets.Testing; using osu.Game.Rulesets.UI; using osu.Game.Tests.Resources; using osu.Game.Tests.Visual; namespace osu.Game.Tests.Testing { - public class TestSceneRulesetTestScene : OsuTestScene, IRulesetTestScene + /// + /// A test scene ensuring the dependencies for the + /// provided ruleset below are cached at the base implementation. + /// + [HeadlessTest] + public class TestSceneRulesetDependencies : OsuTestScene { + protected override Ruleset CreateRuleset() => new TestRuleset(); + [Test] public void TestRetrieveTexture() { @@ -45,8 +52,6 @@ namespace osu.Game.Tests.Testing Dependencies.Get() != null); } - public Ruleset CreateRuleset() => new TestRuleset(); - private class TestRuleset : Ruleset { public override string Description => string.Empty; @@ -62,19 +67,29 @@ namespace osu.Game.Tests.Testing public override IResourceStore CreateResourceStore() => new NamespacedResourceStore(TestResources.GetStore(), @"Resources"); public override IRulesetConfigManager CreateConfig(SettingsStore settings) => new TestRulesetConfigManager(); - public override IEnumerable GetModsFor(ModType type) => throw new NotImplementedException(); - public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => throw new NotImplementedException(); - public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => throw new NotImplementedException(); - public override DifficultyCalculator CreateDifficultyCalculator(WorkingBeatmap beatmap) => throw new NotImplementedException(); + public override IEnumerable GetModsFor(ModType type) => Array.Empty(); + public override DrawableRuleset CreateDrawableRulesetWith(IBeatmap beatmap, IReadOnlyList mods = null) => null; + public override IBeatmapConverter CreateBeatmapConverter(IBeatmap beatmap) => null; + public override DifficultyCalculator CreateDifficultyCalculator(WorkingBeatmap beatmap) => null; } private class TestRulesetConfigManager : IRulesetConfigManager { - public void Load() => throw new NotImplementedException(); - public bool Save() => throw new NotImplementedException(); - public TrackedSettings CreateTrackedSettings() => throw new NotImplementedException(); - public void LoadInto(TrackedSettings settings) => throw new NotImplementedException(); - public void Dispose() => throw new NotImplementedException(); + public void Load() + { + } + + public bool Save() => true; + + public TrackedSettings CreateTrackedSettings() => new TrackedSettings(); + + public void LoadInto(TrackedSettings settings) + { + } + + public void Dispose() + { + } } } } From f4b57933c347b99eb4f6238f6dbb9729fae51176 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2020 08:54:34 +0000 Subject: [PATCH 84/98] Bump Microsoft.Build.Traversal from 2.0.48 to 2.0.50 Bumps [Microsoft.Build.Traversal](https://github.com/Microsoft/MSBuildSdks) from 2.0.48 to 2.0.50. - [Release notes](https://github.com/Microsoft/MSBuildSdks/releases) - [Changelog](https://github.com/microsoft/MSBuildSdks/blob/master/RELEASE.md) - [Commits](https://github.com/Microsoft/MSBuildSdks/compare/Microsoft.Build.Traversal.2.0.48...Microsoft.Build.Traversal.2.0.50) Signed-off-by: dependabot-preview[bot] --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index bdb90eb0e9..9aa5b6192b 100644 --- a/global.json +++ b/global.json @@ -5,6 +5,6 @@ "version": "3.1.100" }, "msbuild-sdks": { - "Microsoft.Build.Traversal": "2.0.48" + "Microsoft.Build.Traversal": "2.0.50" } } \ No newline at end of file From ad5bd1f0c00ae10c0c857759e38b1f588d2f4b45 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 18:45:50 +0900 Subject: [PATCH 85/98] Update in line with other/unspecified switch See https://github.com/ppy/osu-web/commit/289f0f0a209f1f840270db07794a7bfd52439db1. --- osu.Game/Overlays/BeatmapListing/SearchLanguage.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs index 43f16059e9..eee5d8f7e1 100644 --- a/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs +++ b/osu.Game/Overlays/BeatmapListing/SearchLanguage.cs @@ -11,8 +11,8 @@ namespace osu.Game.Overlays.BeatmapListing [Order(0)] Any, - [Order(13)] - Other, + [Order(14)] + Unspecified, [Order(1)] English, @@ -50,7 +50,7 @@ namespace osu.Game.Overlays.BeatmapListing [Order(11)] Polish, - [Order(14)] - Unspecified + [Order(13)] + Other } } From d57b58a7dd6a8429cd684cf8d6e2fbd0f2f643ad Mon Sep 17 00:00:00 2001 From: smoogipoo Date: Mon, 15 Jun 2020 18:42:16 +0900 Subject: [PATCH 86/98] Add temporary fix for tournament song bar disappearance --- osu.Game.Tournament/Components/SongBar.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game.Tournament/Components/SongBar.cs b/osu.Game.Tournament/Components/SongBar.cs index e86fd890c1..fc7fcef892 100644 --- a/osu.Game.Tournament/Components/SongBar.cs +++ b/osu.Game.Tournament/Components/SongBar.cs @@ -77,6 +77,8 @@ namespace osu.Game.Tournament.Components flow = new FillFlowContainer { RelativeSizeAxes = Axes.X, + // Todo: This is a hack for https://github.com/ppy/osu-framework/issues/3617 since this container is at the very edge of the screen and potentially initially masked away. + Height = 1, AutoSizeAxes = Axes.Y, LayoutDuration = 500, LayoutEasing = Easing.OutQuint, From c3c5a99a2288819f7c95bbf64069cd21838d54c8 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 20:23:35 +0900 Subject: [PATCH 87/98] Load imported scores to results screen rather than gameplay --- osu.Game/OsuGame.cs | 23 ++++++++++++++++--- .../Screens/Ranking/ReplayDownloadButton.cs | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs index 7ecd7851d7..7c5e4b8d94 100644 --- a/osu.Game/OsuGame.cs +++ b/osu.Game/OsuGame.cs @@ -35,7 +35,6 @@ using osu.Game.Graphics.Containers; using osu.Game.Graphics.UserInterface; using osu.Game.Input; using osu.Game.Overlays.Notifications; -using osu.Game.Screens.Play; using osu.Game.Input.Bindings; using osu.Game.Online.Chat; using osu.Game.Skinning; @@ -43,6 +42,8 @@ using osuTK.Graphics; using osu.Game.Overlays.Volume; using osu.Game.Rulesets.Mods; using osu.Game.Scoring; +using osu.Game.Screens.Play; +using osu.Game.Screens.Ranking; using osu.Game.Screens.Select; using osu.Game.Updater; using osu.Game.Utils; @@ -360,7 +361,7 @@ namespace osu.Game /// Present a score's replay immediately. /// The user should have already requested this interactively. /// - public void PresentScore(ScoreInfo score) + public void PresentScore(ScoreInfo score, ScorePresentType presentType = ScorePresentType.Results) { // The given ScoreInfo may have missing properties if it was retrieved from online data. Re-retrieve it from the database // to ensure all the required data for presenting a replay are present. @@ -392,9 +393,19 @@ namespace osu.Game PerformFromScreen(screen => { + Ruleset.Value = databasedScore.ScoreInfo.Ruleset; Beatmap.Value = BeatmapManager.GetWorkingBeatmap(databasedBeatmap); - screen.Push(new ReplayPlayerLoader(databasedScore)); + switch (presentType) + { + case ScorePresentType.Gameplay: + screen.Push(new ReplayPlayerLoader(databasedScore)); + break; + + case ScorePresentType.Results: + screen.Push(new SoloResultsScreen(databasedScore.ScoreInfo)); + break; + } }, validScreens: new[] { typeof(PlaySongSelect) }); } @@ -1000,4 +1011,10 @@ namespace osu.Game Exit(); } } + + public enum ScorePresentType + { + Results, + Gameplay + } } diff --git a/osu.Game/Screens/Ranking/ReplayDownloadButton.cs b/osu.Game/Screens/Ranking/ReplayDownloadButton.cs index 9d4e3af230..d0142e57fe 100644 --- a/osu.Game/Screens/Ranking/ReplayDownloadButton.cs +++ b/osu.Game/Screens/Ranking/ReplayDownloadButton.cs @@ -56,7 +56,7 @@ namespace osu.Game.Screens.Ranking switch (State.Value) { case DownloadState.LocallyAvailable: - game?.PresentScore(Model.Value); + game?.PresentScore(Model.Value, ScorePresentType.Gameplay); break; case DownloadState.NotDownloaded: From 90d69c121625ddc69e88b5a232e7c4f6afa51076 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 20:31:47 +0900 Subject: [PATCH 88/98] Allow legacy score to be constructed even if replay file is missing --- osu.Game/Scoring/LegacyDatabasedScore.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/osu.Game/Scoring/LegacyDatabasedScore.cs b/osu.Game/Scoring/LegacyDatabasedScore.cs index bd673eaa29..8908775472 100644 --- a/osu.Game/Scoring/LegacyDatabasedScore.cs +++ b/osu.Game/Scoring/LegacyDatabasedScore.cs @@ -16,7 +16,10 @@ namespace osu.Game.Scoring { ScoreInfo = score; - var replayFilename = score.Files.First(f => f.Filename.EndsWith(".osr", StringComparison.InvariantCultureIgnoreCase)).FileInfo.StoragePath; + var replayFilename = score.Files.FirstOrDefault(f => f.Filename.EndsWith(".osr", StringComparison.InvariantCultureIgnoreCase))?.FileInfo.StoragePath; + + if (replayFilename == null) + return; using (var stream = store.GetStream(replayFilename)) Replay = new DatabasedLegacyScoreDecoder(rulesets, beatmaps).Parse(stream).Replay; From 17a70bf6ee241a0e26b064de1bc51cb04b0140a7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 20:32:27 +0900 Subject: [PATCH 89/98] Add test coverage --- .../Visual/Navigation/OsuGameTestScene.cs | 3 + .../Navigation/TestScenePresentScore.cs | 155 ++++++++++++++++++ osu.Game/Screens/Play/ReplayPlayerLoader.cs | 8 +- 3 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs diff --git a/osu.Game.Tests/Visual/Navigation/OsuGameTestScene.cs b/osu.Game.Tests/Visual/Navigation/OsuGameTestScene.cs index 31afce86ae..c4acf4f7da 100644 --- a/osu.Game.Tests/Visual/Navigation/OsuGameTestScene.cs +++ b/osu.Game.Tests/Visual/Navigation/OsuGameTestScene.cs @@ -17,6 +17,7 @@ using osu.Game.Graphics.UserInterface; using osu.Game.Online.API; using osu.Game.Overlays; using osu.Game.Rulesets; +using osu.Game.Scoring; using osu.Game.Screens; using osu.Game.Screens.Menu; using osuTK.Graphics; @@ -100,6 +101,8 @@ namespace osu.Game.Tests.Visual.Navigation public new BeatmapManager BeatmapManager => base.BeatmapManager; + public new ScoreManager ScoreManager => base.ScoreManager; + public new SettingsPanel Settings => base.Settings; public new MusicController MusicController => base.MusicController; diff --git a/osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs b/osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs new file mode 100644 index 0000000000..b2e18849c9 --- /dev/null +++ b/osu.Game.Tests/Visual/Navigation/TestScenePresentScore.cs @@ -0,0 +1,155 @@ +// 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 System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using osu.Framework.Screens; +using osu.Framework.Testing; +using osu.Game.Beatmaps; +using osu.Game.Rulesets; +using osu.Game.Rulesets.Mania; +using osu.Game.Rulesets.Osu; +using osu.Game.Scoring; +using osu.Game.Screens.Menu; +using osu.Game.Screens.Play; +using osu.Game.Screens.Ranking; + +namespace osu.Game.Tests.Visual.Navigation +{ + public class TestScenePresentScore : OsuGameTestScene + { + private BeatmapSetInfo beatmap; + + [SetUpSteps] + public new void SetUpSteps() + { + AddStep("import beatmap", () => + { + var difficulty = new BeatmapDifficulty(); + var metadata = new BeatmapMetadata + { + Artist = "SomeArtist", + AuthorString = "SomeAuthor", + Title = "import" + }; + + beatmap = Game.BeatmapManager.Import(new BeatmapSetInfo + { + Hash = Guid.NewGuid().ToString(), + OnlineBeatmapSetID = 1, + Metadata = metadata, + Beatmaps = new List + { + new BeatmapInfo + { + OnlineBeatmapID = 1 * 1024, + Metadata = metadata, + BaseDifficulty = difficulty, + Ruleset = new OsuRuleset().RulesetInfo + }, + new BeatmapInfo + { + OnlineBeatmapID = 1 * 2048, + Metadata = metadata, + BaseDifficulty = difficulty, + Ruleset = new OsuRuleset().RulesetInfo + }, + } + }).Result; + }); + } + + [Test] + public void TestFromMainMenu([Values] ScorePresentType type) + { + var firstImport = importScore(1); + var secondimport = importScore(3); + + presentAndConfirm(firstImport, type); + returnToMenu(); + presentAndConfirm(secondimport, type); + returnToMenu(); + returnToMenu(); + } + + [Test] + public void TestFromMainMenuDifferentRuleset([Values] ScorePresentType type) + { + var firstImport = importScore(1); + var secondimport = importScore(3, new ManiaRuleset().RulesetInfo); + + presentAndConfirm(firstImport, type); + returnToMenu(); + presentAndConfirm(secondimport, type); + returnToMenu(); + returnToMenu(); + } + + [Test] + public void TestFromSongSelect([Values] ScorePresentType type) + { + var firstImport = importScore(1); + presentAndConfirm(firstImport, type); + + var secondimport = importScore(3); + presentAndConfirm(secondimport, type); + } + + [Test] + public void TestFromSongSelectDifferentRuleset([Values] ScorePresentType type) + { + var firstImport = importScore(1); + presentAndConfirm(firstImport, type); + + var secondimport = importScore(3, new ManiaRuleset().RulesetInfo); + presentAndConfirm(secondimport, type); + } + + private void returnToMenu() + { + AddStep("return to menu", () => Game.ScreenStack.CurrentScreen.Exit()); + AddUntilStep("wait for menu", () => Game.ScreenStack.CurrentScreen is MainMenu); + } + + private Func importScore(int i, RulesetInfo ruleset = null) + { + ScoreInfo imported = null; + AddStep($"import score {i}", () => + { + imported = Game.ScoreManager.Import(new ScoreInfo + { + Hash = Guid.NewGuid().ToString(), + OnlineScoreID = i, + Beatmap = beatmap.Beatmaps.First(), + Ruleset = ruleset ?? new OsuRuleset().RulesetInfo + }).Result; + }); + + AddAssert($"import {i} succeeded", () => imported != null); + + return () => imported; + } + + private void presentAndConfirm(Func getImport, ScorePresentType type) + { + AddStep("present score", () => Game.PresentScore(getImport(), type)); + + switch (type) + { + case ScorePresentType.Results: + AddUntilStep("wait for results", () => Game.ScreenStack.CurrentScreen is ResultsScreen); + AddUntilStep("correct score displayed", () => ((ResultsScreen)Game.ScreenStack.CurrentScreen).Score.ID == getImport().ID); + AddAssert("correct ruleset selected", () => Game.Ruleset.Value.ID == getImport().Ruleset.ID); + break; + + case ScorePresentType.Gameplay: + AddUntilStep("wait for player loader", () => Game.ScreenStack.CurrentScreen is ReplayPlayerLoader); + AddUntilStep("correct score displayed", () => ((ReplayPlayerLoader)Game.ScreenStack.CurrentScreen).Score.ID == getImport().ID); + AddAssert("correct ruleset selected", () => Game.Ruleset.Value.ID == getImport().Ruleset.ID); + break; + } + } + } +} diff --git a/osu.Game/Screens/Play/ReplayPlayerLoader.cs b/osu.Game/Screens/Play/ReplayPlayerLoader.cs index 4572570437..9eff4cb8fc 100644 --- a/osu.Game/Screens/Play/ReplayPlayerLoader.cs +++ b/osu.Game/Screens/Play/ReplayPlayerLoader.cs @@ -9,7 +9,7 @@ namespace osu.Game.Screens.Play { public class ReplayPlayerLoader : PlayerLoader { - private readonly ScoreInfo scoreInfo; + public readonly ScoreInfo Score; public ReplayPlayerLoader(Score score) : base(() => new ReplayPlayer(score)) @@ -17,14 +17,14 @@ namespace osu.Game.Screens.Play if (score.Replay == null) throw new ArgumentException($"{nameof(score)} must have a non-null {nameof(score.Replay)}.", nameof(score)); - scoreInfo = score.ScoreInfo; + Score = score.ScoreInfo; } public override void OnEntering(IScreen last) { // these will be reverted thanks to PlayerLoader's lease. - Mods.Value = scoreInfo.Mods; - Ruleset.Value = scoreInfo.Ruleset; + Mods.Value = Score.Mods; + Ruleset.Value = Score.Ruleset; base.OnEntering(last); } From 1ce374ae2f640c7adcfb16146769e4ad7d030ba3 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 20:34:46 +0900 Subject: [PATCH 90/98] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index 596e5bfa8b..6387356686 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -52,6 +52,6 @@ - + diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 1d3bafbfd6..8c098b79c6 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -24,7 +24,7 @@ - + diff --git a/osu.iOS.props b/osu.iOS.props index ad7850599b..373ad09597 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -70,7 +70,7 @@ - + @@ -80,7 +80,7 @@ - + From d2155c3da3c01e54636a5ce4876618f68acb855f Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 22:19:02 +0900 Subject: [PATCH 91/98] Fix thread safety --- osu.Game/Updater/UpdateManager.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/osu.Game/Updater/UpdateManager.cs b/osu.Game/Updater/UpdateManager.cs index 5da366bde9..61775a26b7 100644 --- a/osu.Game/Updater/UpdateManager.cs +++ b/osu.Game/Updater/UpdateManager.cs @@ -64,10 +64,12 @@ namespace osu.Game.Updater if (!CanCheckForUpdate) return; - lock (updateTaskLock) - updateCheckTask ??= PerformUpdateCheck(); + Task waitTask; - await updateCheckTask; + lock (updateTaskLock) + waitTask = (updateCheckTask ??= PerformUpdateCheck()); + + await waitTask; lock (updateTaskLock) updateCheckTask = null; From 53b7057ee05a3551c07ac7e0d2a00f15f13b4c29 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 22:19:11 +0900 Subject: [PATCH 92/98] Don't show update button when updates are not feasible --- .../Sections/General/UpdateSettings.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 869e6c9c51..9fca820cac 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -30,16 +30,18 @@ namespace osu.Game.Overlays.Settings.Sections.General Bindable = config.GetBindable(OsuSetting.ReleaseStream), }); - // We should only display the button for UpdateManagers that do check for updates - Add(checkForUpdatesButton = new SettingsButton + if (updateManager.CanCheckForUpdate) { - Text = "Check for updates", - Action = () => + Add(checkForUpdatesButton = new SettingsButton { - checkForUpdatesButton.Enabled.Value = false; - Task.Run(updateManager.CheckForUpdateAsync).ContinueWith(t => Schedule(() => checkForUpdatesButton.Enabled.Value = true)); - } - }); + Text = "Check for updates", + Action = () => + { + checkForUpdatesButton.Enabled.Value = false; + Task.Run(updateManager.CheckForUpdateAsync).ContinueWith(t => Schedule(() => checkForUpdatesButton.Enabled.Value = true)); + } + }); + } if (RuntimeInfo.IsDesktop) { From 97067976f75a416dd8adc290aed8841ab51740ad Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Mon, 15 Jun 2020 22:23:06 +0900 Subject: [PATCH 93/98] Add null check --- osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs index 9fca820cac..9c7d0b0be4 100644 --- a/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs +++ b/osu.Game/Overlays/Settings/Sections/General/UpdateSettings.cs @@ -30,7 +30,7 @@ namespace osu.Game.Overlays.Settings.Sections.General Bindable = config.GetBindable(OsuSetting.ReleaseStream), }); - if (updateManager.CanCheckForUpdate) + if (updateManager?.CanCheckForUpdate == true) { Add(checkForUpdatesButton = new SettingsButton { From c79d8a425178de9326d3bdb19d96e93bf002ca44 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jun 2020 00:12:32 +0900 Subject: [PATCH 94/98] Update ChannelTabControl in line with TabControl changes --- osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs b/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs index cb6abb7cc6..19c6f437b6 100644 --- a/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs +++ b/osu.Game/Overlays/Chat/Tabs/ChannelTabControl.cs @@ -78,19 +78,10 @@ namespace osu.Game.Overlays.Chat.Tabs /// The channel that is going to be removed. public void RemoveChannel(Channel channel) { - if (Current.Value == channel) - { - var allChannels = TabContainer.AllTabItems.Select(tab => tab.Value).ToList(); - var isNextTabSelector = allChannels[allChannels.IndexOf(channel) + 1] == selectorTab.Value; - - // selectorTab is not switchable, so we have to explicitly select it if it's the only tab left - if (isNextTabSelector && allChannels.Count == 2) - SelectTab(selectorTab); - else - SwitchTab(isNextTabSelector ? -1 : 1); - } - RemoveItem(channel); + + if (SelectedTab == null) + SelectTab(selectorTab); } protected override void SelectTab(TabItem tab) From c3d4ffed00655912d207ba0606bbeec4f7106cb1 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jun 2020 16:46:33 +0900 Subject: [PATCH 95/98] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index 6387356686..b95b794004 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -52,6 +52,6 @@ - + diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 8c098b79c6..6ec57e5100 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -24,7 +24,7 @@ - + diff --git a/osu.iOS.props b/osu.iOS.props index 373ad09597..0bfff24805 100644 --- a/osu.iOS.props +++ b/osu.iOS.props @@ -70,7 +70,7 @@ - + @@ -80,7 +80,7 @@ - + From 3f1b9edabe20478578e05f85476d8acaf06eb62d Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jun 2020 20:16:04 +0900 Subject: [PATCH 96/98] Fix regression in android build parsing behaviour --- osu.Android/OsuGameAndroid.cs | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/osu.Android/OsuGameAndroid.cs b/osu.Android/OsuGameAndroid.cs index 19ed7ffcf5..5f936ffce4 100644 --- a/osu.Android/OsuGameAndroid.cs +++ b/osu.Android/OsuGameAndroid.cs @@ -3,6 +3,7 @@ using System; using Android.App; +using Android.OS; using osu.Game; using osu.Game.Updater; @@ -18,9 +19,32 @@ namespace osu.Android try { - // todo: needs checking before play store redeploy. - string versionName = packageInfo.VersionName; - // undo play store version garbling + // We store the osu! build number in the "VersionCode" field to better support google play releases. + // If we were to use the main build number, it would require a new submission each time (similar to TestFlight). + // In order to do this, we should split it up and pad the numbers to still ensure sequential increase over time. + // + // We also need to be aware that older SDK versions store this as a 32bit int. + // + // Basic conversion format (as done in Fastfile): 2020.606.0 -> 202006060 + + // https://stackoverflow.com/questions/52977079/android-sdk-28-versioncode-in-packageinfo-has-been-deprecated + string versionName = string.Empty; + + if (Build.VERSION.SdkInt >= BuildVersionCodes.P) + { + versionName = packageInfo.LongVersionCode.ToString(); + versionName = versionName.Substring(versionName.Length - 9); + } + else + { + +#pragma warning disable CS0618 // Type or member is obsolete + // this is required else older SDKs will report missing method exception. + versionName = packageInfo.VersionCode.ToString(); +#pragma warning restore CS0618 // Type or member is obsolete + } + + // undo play store version garbling (as mentioned above). return new Version(int.Parse(versionName.Substring(0, 4)), int.Parse(versionName.Substring(4, 4)), int.Parse(versionName.Substring(8, 1))); } catch From 115ea244beb9953c4e189e1cfa426c0f705e1c79 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 16 Jun 2020 20:20:46 +0900 Subject: [PATCH 97/98] Add note about substring usage --- osu.Android/OsuGameAndroid.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/osu.Android/OsuGameAndroid.cs b/osu.Android/OsuGameAndroid.cs index 5f936ffce4..136b85699a 100644 --- a/osu.Android/OsuGameAndroid.cs +++ b/osu.Android/OsuGameAndroid.cs @@ -33,6 +33,7 @@ namespace osu.Android if (Build.VERSION.SdkInt >= BuildVersionCodes.P) { versionName = packageInfo.LongVersionCode.ToString(); + // ensure we only read the trailing portion of long (the part we are interested in). versionName = versionName.Substring(versionName.Length - 9); } else From c5358cbb6b22d3167efe2a21868d23fc91b523b0 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Tue, 16 Jun 2020 21:01:10 +0900 Subject: [PATCH 98/98] Remove blank line --- osu.Android/OsuGameAndroid.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osu.Android/OsuGameAndroid.cs b/osu.Android/OsuGameAndroid.cs index 136b85699a..7542a2b997 100644 --- a/osu.Android/OsuGameAndroid.cs +++ b/osu.Android/OsuGameAndroid.cs @@ -38,7 +38,6 @@ namespace osu.Android } else { - #pragma warning disable CS0618 // Type or member is obsolete // this is required else older SDKs will report missing method exception. versionName = packageInfo.VersionCode.ToString(); @@ -58,4 +57,4 @@ namespace osu.Android protected override UpdateManager CreateUpdateManager() => new SimpleUpdateManager(); } -} \ No newline at end of file +}