From 2b55e05b10857a09c3162fec5ef965da3034e775 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Fri, 27 Jan 2023 13:31:21 +0900 Subject: [PATCH 01/14] Adjust argon hit lighting further --- .../Skinning/Argon/ArgonMainCirclePiece.cs | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonMainCirclePiece.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonMainCirclePiece.cs index 2a53122cc1..9e86e1e411 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonMainCirclePiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonMainCirclePiece.cs @@ -151,10 +151,6 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon const float shrink_size = 0.8f; - // When the user has hit lighting disabled, we won't be showing the bright white flash. - // To make things look good, the surrounding animations are also slightly adjusted. - bool showFlash = configHitLighting.Value; - // Animating with the number present is distracting. // The number disappearing is hidden by the bright flash. number.FadeOut(flash_in_duration / 2); @@ -186,25 +182,28 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon { outerGradient.ResizeTo(OUTER_GRADIENT_SIZE * shrink_size, resize_duration, Easing.OutElasticHalf); - if (showFlash) - { - outerGradient - .FadeColour(Color4.White, 80) - .Then() - .FadeOut(flash_in_duration); - } - else - { - outerGradient - .FadeColour(Color4.White, flash_in_duration * 8) - .FadeOut(flash_in_duration * 2); - } + outerGradient + .FadeColour(Color4.White, 80) + .Then() + .FadeOut(flash_in_duration); } - if (showFlash) + if (configHitLighting.Value) + { + flash.HitLighting = true; flash.FadeTo(1, flash_in_duration, Easing.OutQuint); - this.FadeOut(showFlash ? fade_out_time : fade_out_time / 2, Easing.OutQuad); + this.FadeOut(fade_out_time, Easing.OutQuad); + } + else + { + flash.HitLighting = false; + flash.FadeTo(1, flash_in_duration, Easing.OutQuint) + .Then() + .FadeOut(flash_in_duration, Easing.OutQuint); + + this.FadeOut(fade_out_time * 0.8f, Easing.OutQuad); + } break; } @@ -236,6 +235,8 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon Child.AlwaysPresent = true; } + public bool HitLighting { get; set; } + protected override void Update() { base.Update(); @@ -244,7 +245,7 @@ namespace osu.Game.Rulesets.Osu.Skinning.Argon { Type = EdgeEffectType.Glow, Colour = Colour, - Radius = OsuHitObject.OBJECT_RADIUS * 1.2f, + Radius = OsuHitObject.OBJECT_RADIUS * (HitLighting ? 1.2f : 0.6f), }; } } From a126c72a4fbf150c59fba9e65bafe77ff02c5ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 28 Jan 2023 15:17:35 +0100 Subject: [PATCH 02/14] Adjust skin resources test to facilitate loading many --- .../Skins/TestSceneSkinResources.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/osu.Game.Tests/Skins/TestSceneSkinResources.cs b/osu.Game.Tests/Skins/TestSceneSkinResources.cs index 748668b6ca..b29211f442 100644 --- a/osu.Game.Tests/Skins/TestSceneSkinResources.cs +++ b/osu.Game.Tests/Skins/TestSceneSkinResources.cs @@ -31,17 +31,14 @@ namespace osu.Game.Tests.Skins [Resolved] private SkinManager skins { get; set; } = null!; - private ISkin skin = null!; - - [BackgroundDependencyLoader] - private void load() - { - var imported = skins.Import(new ImportTask(TestResources.OpenResource("Archives/ogg-skin.osk"), "ogg-skin.osk")).GetResultSafely(); - skin = imported.PerformRead(skinInfo => skins.GetSkin(skinInfo)); - } - [Test] - public void TestRetrieveOggSample() => AddAssert("sample is non-null", () => skin.GetSample(new SampleInfo("sample")) != null); + public void TestRetrieveOggSample() + { + ISkin skin = null!; + + AddStep("import skin", () => skin = importSkinFromArchives(@"ogg-skin.osk")); + AddAssert("sample is non-null", () => skin.GetSample(new SampleInfo(@"sample")) != null); + } [Test] public void TestSampleRetrievalOrder() @@ -78,6 +75,12 @@ namespace osu.Game.Tests.Skins }); } + private Skin importSkinFromArchives(string filename) + { + var imported = skins.Import(new ImportTask(TestResources.OpenResource($@"Archives/{filename}"), filename)).GetResultSafely(); + return imported.PerformRead(skinInfo => skins.GetSkin(skinInfo)); + } + private class TestSkin : Skin { public const string SAMPLE_NAME = "test-sample"; From 9bdb78791f0bab12c70c7f3ef6159a6720b33338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 28 Jan 2023 15:23:15 +0100 Subject: [PATCH 03/14] Add failing test case --- .../Archives/conflicting-filenames-skin.osk | Bin 0 -> 3665 bytes osu.Game.Tests/Skins/TestSceneSkinResources.cs | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 osu.Game.Tests/Resources/Archives/conflicting-filenames-skin.osk diff --git a/osu.Game.Tests/Resources/Archives/conflicting-filenames-skin.osk b/osu.Game.Tests/Resources/Archives/conflicting-filenames-skin.osk new file mode 100644 index 0000000000000000000000000000000000000000..73576f3e22dd29c4c6a99ca62cf5e842f1760f33 GIT binary patch literal 3665 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 Q^%a4Fbl;F-BK_6tU*i>nr2qf` literal 0 HcmV?d00001 diff --git a/osu.Game.Tests/Skins/TestSceneSkinResources.cs b/osu.Game.Tests/Skins/TestSceneSkinResources.cs index b29211f442..aaec319b57 100644 --- a/osu.Game.Tests/Skins/TestSceneSkinResources.cs +++ b/osu.Game.Tests/Skins/TestSceneSkinResources.cs @@ -40,6 +40,16 @@ namespace osu.Game.Tests.Skins AddAssert("sample is non-null", () => skin.GetSample(new SampleInfo(@"sample")) != null); } + [Test] + public void TestRetrievalWithConflictingFilenames() + { + ISkin skin = null!; + + AddStep("import skin", () => skin = importSkinFromArchives(@"conflicting-filenames-skin.osk")); + AddAssert("texture is non-null", () => skin.GetTexture(@"spinner-osu") != null); + AddAssert("sample is non-null", () => skin.GetSample(new SampleInfo(@"spinner-osu")) != null); + } + [Test] public void TestSampleRetrievalOrder() { From 20f4061e303774455802bfbae69313645e19fc8c Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Sun, 29 Jan 2023 00:24:05 +0300 Subject: [PATCH 04/14] Move ongoing operation wait step to proper place --- .../Visual/Multiplayer/QueueModeTestScene.cs | 2 ++ .../Multiplayer/TestSceneAllPlayersQueueMode.cs | 15 --------------- .../Multiplayer/TestSceneHostOnlyQueueMode.cs | 13 ------------- 3 files changed, 2 insertions(+), 28 deletions(-) diff --git a/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs b/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs index 0e9863a9f5..0f1ba9ba75 100644 --- a/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs +++ b/osu.Game.Tests/Visual/Multiplayer/QueueModeTestScene.cs @@ -16,6 +16,7 @@ using osu.Game.Online.Multiplayer; using osu.Game.Online.Rooms; using osu.Game.Rulesets; using osu.Game.Rulesets.Osu; +using osu.Game.Screens.OnlinePlay; using osu.Game.Screens.OnlinePlay.Lounge; using osu.Game.Screens.OnlinePlay.Multiplayer; using osu.Game.Screens.OnlinePlay.Multiplayer.Match; @@ -85,6 +86,7 @@ namespace osu.Game.Tests.Visual.Multiplayer ClickButtonWhenEnabled(); AddUntilStep("wait for join", () => MultiplayerClient.RoomJoined); + AddUntilStep("wait for ongoing operation to complete", () => !(CurrentScreen as OnlinePlayScreen).ChildrenOfType().Single().InProgress.Value); } [Test] diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs index 6da9d37648..869b8bb328 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneAllPlayersQueueMode.cs @@ -15,7 +15,6 @@ using osu.Game.Rulesets.Catch; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Mods; -using osu.Game.Screens.OnlinePlay; using osu.Game.Screens.OnlinePlay.Multiplayer; using osu.Game.Screens.OnlinePlay.Multiplayer.Match; using osu.Game.Screens.Play; @@ -44,14 +43,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] - /* - * TearDown : System.TimeoutException : "wait for ongoing operation to complete" timed out - * --TearDown - * at osu.Framework.Testing.Drawables.Steps.UntilStepButton.<>c__DisplayClass11_0.<.ctor>b__0() - * at osu.Framework.Testing.Drawables.Steps.StepButton.PerformStep(Boolean userTriggered) - * at osu.Framework.Testing.TestScene.runNextStep(Action onCompletion, Action`1 onError, Func`2 stopCondition) - */ public void TestItemAddedToTheEndOfQueue() { addItem(() => OtherBeatmap); @@ -64,7 +55,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestNextItemSelectedAfterGameplayFinish() { addItem(() => OtherBeatmap); @@ -82,7 +72,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestItemsNotClearedWhenSwitchToHostOnlyMode() { addItem(() => OtherBeatmap); @@ -98,7 +87,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestCorrectItemSelectedAfterNewItemAdded() { addItem(() => OtherBeatmap); @@ -106,7 +94,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestCorrectRulesetSelectedAfterNewItemAdded() { addItem(() => OtherBeatmap, new CatchRuleset().RulesetInfo); @@ -124,7 +111,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestCorrectModsSelectedAfterNewItemAdded() { addItem(() => OtherBeatmap, mods: new Mod[] { new OsuModDoubleTime() }); @@ -153,7 +139,6 @@ namespace osu.Game.Tests.Visual.Multiplayer AddUntilStep("wait for song select", () => (songSelect = CurrentSubScreen as Screens.Select.SongSelect) != null); AddUntilStep("wait for loaded", () => songSelect.AsNonNull().BeatmapSetsLoaded); - AddUntilStep("wait for ongoing operation to complete", () => !(CurrentScreen as OnlinePlayScreen).ChildrenOfType().Single().InProgress.Value); if (ruleset != null) AddStep($"set {ruleset.Name} ruleset", () => songSelect.AsNonNull().Ruleset.Value = ruleset); diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs index dc36f539e3..78baa4a39b 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneHostOnlyQueueMode.cs @@ -50,14 +50,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] - /* - * TearDown : System.TimeoutException : "wait for ongoing operation to complete" timed out - * --TearDown - * at osu.Framework.Testing.Drawables.Steps.UntilStepButton.<>c__DisplayClass11_0.<.ctor>b__0() - * at osu.Framework.Testing.Drawables.Steps.StepButton.PerformStep(Boolean userTriggered) - * at osu.Framework.Testing.TestScene.runNextStep(Action onCompletion, Action`1 onError, Func`2 stopCondition) - */ public void TestItemStillSelectedAfterChangeToSameBeatmap() { selectNewItem(() => InitialBeatmap); @@ -66,7 +58,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestItemStillSelectedAfterChangeToOtherBeatmap() { selectNewItem(() => OtherBeatmap); @@ -75,7 +66,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestOnlyLastItemChangedAfterGameplayFinished() { RunGameplay(); @@ -90,7 +80,6 @@ namespace osu.Game.Tests.Visual.Multiplayer } [Test] - [FlakyTest] // See above public void TestAddItemsAsHost() { addItem(() => OtherBeatmap); @@ -115,7 +104,6 @@ namespace osu.Game.Tests.Visual.Multiplayer AddUntilStep("wait for song select", () => CurrentSubScreen is Screens.Select.SongSelect select && select.BeatmapSetsLoaded); BeatmapInfo otherBeatmap = null; - AddUntilStep("wait for ongoing operation to complete", () => !(CurrentScreen as OnlinePlayScreen).ChildrenOfType().Single().InProgress.Value); AddStep("select other beatmap", () => ((Screens.Select.SongSelect)CurrentSubScreen).FinaliseSelection(otherBeatmap = beatmap())); AddUntilStep("wait for return to match", () => CurrentSubScreen is MultiplayerMatchSubScreen); @@ -131,7 +119,6 @@ namespace osu.Game.Tests.Visual.Multiplayer }); AddUntilStep("wait for song select", () => CurrentSubScreen is Screens.Select.SongSelect select && select.BeatmapSetsLoaded); - AddUntilStep("wait for ongoing operation to complete", () => !(CurrentScreen as OnlinePlayScreen).ChildrenOfType().Single().InProgress.Value); AddStep("select other beatmap", () => ((Screens.Select.SongSelect)CurrentSubScreen).FinaliseSelection(beatmap())); AddUntilStep("wait for return to match", () => CurrentSubScreen is MultiplayerMatchSubScreen); } From 55a045b2b24443b4fef1e0e343dfe85d37ee91b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 28 Jan 2023 15:59:50 +0100 Subject: [PATCH 05/14] Adjust beatmap skin resources test to facilitate loading many --- .../Skins/TestSceneBeatmapSkinResources.cs | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs b/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs index 5256bcb3af..0bcaf217ab 100644 --- a/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs +++ b/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs @@ -1,12 +1,11 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -#nullable disable - using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Audio.Track; using osu.Framework.Extensions; +using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Testing; using osu.Game.Audio; using osu.Game.Beatmaps; @@ -20,29 +19,26 @@ namespace osu.Game.Tests.Skins public partial class TestSceneBeatmapSkinResources : OsuTestScene { [Resolved] - private BeatmapManager beatmaps { get; set; } + private BeatmapManager beatmaps { get; set; } = null!; - private IWorkingBeatmap beatmap; - - [BackgroundDependencyLoader] - private void load() + [Test] + public void TestRetrieveOggAudio() { - var imported = beatmaps.Import(new ImportTask(TestResources.OpenResource("Archives/ogg-beatmap.osz"), "ogg-beatmap.osz")).GetResultSafely(); + IWorkingBeatmap beatmap = null!; - imported?.PerformRead(s => + AddStep("import beatmap", () => beatmap = importBeatmapFromArchives(@"ogg-beatmap.osz")); + AddAssert("sample is non-null", () => beatmap.Skin.GetSample(new SampleInfo(@"sample")) != null); + AddAssert("track is non-null", () => { - beatmap = beatmaps.GetWorkingBeatmap(s.Beatmaps[0]); + using (var track = beatmap.LoadTrack()) + return track is not TrackVirtual; }); } - [Test] - public void TestRetrieveOggSample() => AddAssert("sample is non-null", () => beatmap.Skin.GetSample(new SampleInfo("sample")) != null); - - [Test] - public void TestRetrieveOggTrack() => AddAssert("track is non-null", () => + private IWorkingBeatmap importBeatmapFromArchives(string filename) { - using (var track = beatmap.LoadTrack()) - return track is not TrackVirtual; - }); + var imported = beatmaps.Import(new ImportTask(TestResources.OpenResource($@"Archives/{filename}"), filename)).GetResultSafely(); + return imported.AsNonNull().PerformRead(s => beatmaps.GetWorkingBeatmap(s.Beatmaps[0])); + } } } From a8f828d203f8efab41d9ce23e2e34cc76825db3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 28 Jan 2023 16:02:11 +0100 Subject: [PATCH 06/14] Add another failing test case --- .../Archives/conflicting-filenames-beatmap.osz | Bin 0 -> 6604 bytes .../Skins/TestSceneBeatmapSkinResources.cs | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 osu.Game.Tests/Resources/Archives/conflicting-filenames-beatmap.osz diff --git a/osu.Game.Tests/Resources/Archives/conflicting-filenames-beatmap.osz b/osu.Game.Tests/Resources/Archives/conflicting-filenames-beatmap.osz new file mode 100644 index 0000000000000000000000000000000000000000..c6b5f083ff6e5f17cb632ae21a29d2ebe58eb963 GIT binary patch literal 6604 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 literal 0 HcmV?d00001 diff --git a/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs b/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs index 0bcaf217ab..d9212386c3 100644 --- a/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs +++ b/osu.Game.Tests/Skins/TestSceneBeatmapSkinResources.cs @@ -35,6 +35,16 @@ namespace osu.Game.Tests.Skins }); } + [Test] + public void TestRetrievalWithConflictingFilenames() + { + IWorkingBeatmap beatmap = null!; + + AddStep("import beatmap", () => beatmap = importBeatmapFromArchives(@"conflicting-filenames-beatmap.osz")); + AddAssert("texture is non-null", () => beatmap.Skin.GetTexture(@"spinner-osu") != null); + AddAssert("sample is non-null", () => beatmap.Skin.GetSample(new SampleInfo(@"spinner-osu")) != null); + } + private IWorkingBeatmap importBeatmapFromArchives(string filename) { var imported = beatmaps.Import(new ImportTask(TestResources.OpenResource($@"Archives/{filename}"), filename)).GetResultSafely(); From c5e1f54185b6ad3391f61b409035d06f79aaca46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 28 Jan 2023 21:16:22 +0100 Subject: [PATCH 07/14] Fix sample store creation mutating shared resource store --- .../Rulesets/TestSceneDrawableRulesetDependencies.cs | 2 ++ osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs | 2 ++ osu.Game/Skinning/Skin.cs | 9 ++++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/osu.Game.Tests/Rulesets/TestSceneDrawableRulesetDependencies.cs b/osu.Game.Tests/Rulesets/TestSceneDrawableRulesetDependencies.cs index 3fba21050e..5cfcca303f 100644 --- a/osu.Game.Tests/Rulesets/TestSceneDrawableRulesetDependencies.cs +++ b/osu.Game.Tests/Rulesets/TestSceneDrawableRulesetDependencies.cs @@ -150,6 +150,8 @@ namespace osu.Game.Tests.Rulesets public IBindable AggregateTempo => throw new NotImplementedException(); public int PlaybackConcurrency { get; set; } + + public void AddExtension(string extension) => throw new NotImplementedException(); } private class TestShaderManager : ShaderManager diff --git a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs index c50f63c3b2..96b02ee4dc 100644 --- a/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs +++ b/osu.Game/Rulesets/UI/DrawableRulesetDependencies.cs @@ -157,6 +157,8 @@ namespace osu.Game.Rulesets.UI set => throw new NotSupportedException(); } + public void AddExtension(string extension) => throw new NotSupportedException(); + public void Dispose() { if (primary.IsNotNull()) primary.Dispose(); diff --git a/osu.Game/Skinning/Skin.cs b/osu.Game/Skinning/Skin.cs index 419dacadfd..37e98946c9 100644 --- a/osu.Game/Skinning/Skin.cs +++ b/osu.Game/Skinning/Skin.cs @@ -69,12 +69,15 @@ namespace osu.Game.Skinning storage ??= realmBackedStorage = new RealmBackedResourceStore(SkinInfo, resources.Files, resources.RealmAccess); var samples = resources.AudioManager?.GetSampleStore(storage); + if (samples != null) + { samples.PlaybackConcurrency = OsuGameBase.SAMPLE_CONCURRENCY; - // osu-stable performs audio lookups in order of wav -> mp3 -> ogg. - // The GetSampleStore() call above internally adds wav and mp3, so ogg is added at the end to ensure expected ordering. - (storage as ResourceStore)?.AddExtension("ogg"); + // osu-stable performs audio lookups in order of wav -> mp3 -> ogg. + // The GetSampleStore() call above internally adds wav and mp3, so ogg is added at the end to ensure expected ordering. + samples.AddExtension(@"ogg"); + } Samples = samples; Textures = new TextureStore(resources.Renderer, new MaxDimensionLimitedTextureLoaderStore(resources.CreateTextureLoaderStore(storage))); From b1cbe20cd82e93533b73ccfeeac17986129824a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 28 Jan 2023 21:16:37 +0100 Subject: [PATCH 08/14] Adjust markdown text flow to framework-side changes --- .../Containers/Markdown/OsuMarkdownTextFlowContainer.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/osu.Game/Graphics/Containers/Markdown/OsuMarkdownTextFlowContainer.cs b/osu.Game/Graphics/Containers/Markdown/OsuMarkdownTextFlowContainer.cs index 5f5b9acf56..dbc358882c 100644 --- a/osu.Game/Graphics/Containers/Markdown/OsuMarkdownTextFlowContainer.cs +++ b/osu.Game/Graphics/Containers/Markdown/OsuMarkdownTextFlowContainer.cs @@ -42,8 +42,12 @@ namespace osu.Game.Graphics.Containers.Markdown protected override void AddFootnoteBacklink(FootnoteLink footnoteBacklink) => AddDrawable(new OsuMarkdownFootnoteBacklink(footnoteBacklink)); - protected override SpriteText CreateEmphasisedSpriteText(bool bold, bool italic) - => CreateSpriteText().With(t => t.Font = t.Font.With(weight: bold ? FontWeight.Bold : FontWeight.Regular, italics: italic)); + protected override void ApplyEmphasisedCreationParameters(SpriteText spriteText, bool bold, bool italic) + { + base.ApplyEmphasisedCreationParameters(spriteText, bold, italic); + + spriteText.Font = spriteText.Font.With(weight: bold ? FontWeight.Bold : FontWeight.Regular, italics: italic); + } protected override void AddCustomComponent(CustomContainerInline inline) { From 54d5d4e7c6a96fb4cd1d48d8b89ad6d508e181b0 Mon Sep 17 00:00:00 2001 From: Cootz Date: Tue, 31 Jan 2023 07:06:26 +0300 Subject: [PATCH 09/14] Fix for the issue --- .../Settings/Sections/Maintenance/MigrationSelectScreen.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs b/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs index 80bf292057..57eb5ce60e 100644 --- a/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs +++ b/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs @@ -47,6 +47,7 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance var directoryInfos = target.GetDirectories(); var fileInfos = target.GetFiles(); + //With an empty disk (mb flash drive), this if could be false if (directoryInfos.Length > 0 || fileInfos.Length > 0) { // Quick test for whether there's already an osu! install at the target path. @@ -65,7 +66,11 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance return; } - target = target.CreateSubdirectory("osu-lazer"); + //Check for a root directory + if (target.Parent == null) + target = Directory.CreateDirectory(Path.Combine(target.FullName, "osu-lazer")); + else + target = target.CreateSubdirectory("osu-lazer"); } } catch (Exception e) From b18652b25fa366ea9191db55af53b43fc02fcb30 Mon Sep 17 00:00:00 2001 From: Cootz Date: Tue, 31 Jan 2023 10:14:21 +0300 Subject: [PATCH 10/14] CreateSubDirectory removed. Fixes the empty root issue --- .../Sections/Maintenance/MigrationSelectScreen.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs b/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs index 57eb5ce60e..159a99809d 100644 --- a/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs +++ b/osu.Game/Overlays/Settings/Sections/Maintenance/MigrationSelectScreen.cs @@ -47,8 +47,7 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance var directoryInfos = target.GetDirectories(); var fileInfos = target.GetFiles(); - //With an empty disk (mb flash drive), this if could be false - if (directoryInfos.Length > 0 || fileInfos.Length > 0) + if (directoryInfos.Length > 0 || fileInfos.Length > 0 || target.Parent == null) { // Quick test for whether there's already an osu! install at the target path. if (fileInfos.Any(f => f.Name == OsuGameBase.CLIENT_DATABASE_FILENAME)) @@ -66,11 +65,8 @@ namespace osu.Game.Overlays.Settings.Sections.Maintenance return; } - //Check for a root directory - if (target.Parent == null) - target = Directory.CreateDirectory(Path.Combine(target.FullName, "osu-lazer")); - else - target = target.CreateSubdirectory("osu-lazer"); + //We aren't using CreateSubDirectory due to the flaw with a root of a drive + target = Directory.CreateDirectory(Path.Combine(target.FullName, "osu-lazer")); } } catch (Exception e) From 3d8b35184fe2edf3dd8a4d0a8ad52a9b6f833999 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 31 Jan 2023 16:24:06 +0900 Subject: [PATCH 11/14] Update framework --- osu.Android.props | 2 +- osu.Game/osu.Game.csproj | 2 +- osu.iOS.props | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Android.props b/osu.Android.props index 71944065bf..4bdf5d68c5 100644 --- a/osu.Android.props +++ b/osu.Android.props @@ -10,7 +10,7 @@ true - +