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;