diff --git a/osu.Game/Database/DatabaseWorkingBeatmap.cs b/osu.Game/Database/DatabaseWorkingBeatmap.cs index c56d6cea51..2acae9c340 100644 --- a/osu.Game/Database/DatabaseWorkingBeatmap.cs +++ b/osu.Game/Database/DatabaseWorkingBeatmap.cs @@ -69,7 +69,7 @@ namespace osu.Game.Database var trackData = getReader()?.GetStream(Metadata.AudioFile); return trackData == null ? null : new TrackBass(trackData); } - catch { return null; } + catch { return new TrackVirtual(); } } } -} \ No newline at end of file +} diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index f6190f09af..baf58ae26c 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -59,6 +59,9 @@ namespace osu.Game.Overlays { Width = 400; Margin = new MarginPadding(10); + + // required to let MusicController handle beatmap cycling. + AlwaysPresent = true; } protected override bool OnDragStart(InputState state) => true; @@ -252,12 +255,16 @@ namespace osu.Game.Overlays private void prev() { + if (beatmapBacking.Disabled) return; + queuedDirection = TransformDirection.Prev; playlist.PlayPrevious(); } private void next() { + if (beatmapBacking.Disabled) return; + queuedDirection = TransformDirection.Next; playlist.PlayNext(); } diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs index 4f8109b4e4..64223db100 100644 --- a/osu.Game/Screens/OsuScreen.cs +++ b/osu.Game/Screens/OsuScreen.cs @@ -29,7 +29,11 @@ namespace osu.Game.Screens internal virtual bool HasLocalCursorDisplayed => false; - internal virtual bool AllowRulesetChange => true; + /// + /// Whether the beatmap or ruleset should be allowed to be changed by the user or game. + /// Used to mark exclusive areas where this is strongly prohibited, like gameplay. + /// + internal virtual bool AllowBeatmapRulesetChange => true; private readonly Bindable beatmap = new Bindable(); @@ -85,7 +89,13 @@ namespace osu.Game.Screens { if (!IsCurrentScreen) return; - ruleset.Disabled = !AllowRulesetChange; + if (ParentScreen != null) + { + // we only want to apply these restrictions when we are inside a screen stack. + // the use case for not applying is in visual/unit tests. + ruleset.Disabled = !AllowBeatmapRulesetChange; + beatmap.Disabled = !AllowBeatmapRulesetChange; + } } protected override void OnResuming(Screen last) diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs index b0d3a99603..c9ca91faa0 100644 --- a/osu.Game/Screens/Play/Player.cs +++ b/osu.Game/Screens/Play/Player.cs @@ -39,7 +39,7 @@ namespace osu.Game.Screens.Play public Action RestartRequested; - internal override bool AllowRulesetChange => false; + internal override bool AllowBeatmapRulesetChange => false; public bool HasFailed { get; private set; } diff --git a/osu.Game/Screens/Play/PlayerLoader.cs b/osu.Game/Screens/Play/PlayerLoader.cs index c8ebb1f436..f2ed378e7c 100644 --- a/osu.Game/Screens/Play/PlayerLoader.cs +++ b/osu.Game/Screens/Play/PlayerLoader.cs @@ -27,7 +27,7 @@ namespace osu.Game.Screens.Play private bool showOverlays = true; internal override bool ShowOverlays => showOverlays; - internal override bool AllowRulesetChange => false; + internal override bool AllowBeatmapRulesetChange => false; protected override BackgroundScreen CreateBackground() => new BackgroundScreenBeatmap(Beatmap); diff --git a/osu.Game/Screens/Ranking/Results.cs b/osu.Game/Screens/Ranking/Results.cs index dac83536ed..636851e14d 100644 --- a/osu.Game/Screens/Ranking/Results.cs +++ b/osu.Game/Screens/Ranking/Results.cs @@ -31,7 +31,7 @@ namespace osu.Game.Screens.Ranking private ResultModeTabControl modeChangeButtons; - internal override bool AllowRulesetChange => false; + internal override bool AllowBeatmapRulesetChange => false; private Container currentPage;