diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 328c964976..20e343ac0a 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -925,6 +925,8 @@ namespace osu.Game
{
OverlayActivationMode.Value = newOsuScreen.InitialOverlayActivationMode;
+ musicController.AllowRateAdjustments = newOsuScreen.AllowRateAdjustments;
+
if (newOsuScreen.HideOverlaysOnEnter)
CloseAllOverlays();
else
diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index 9ec0364420..0db05ae6f7 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -47,7 +47,7 @@ namespace osu.Game.Overlays
private OnScreenDisplay onScreenDisplay { get; set; }
[BackgroundDependencyLoader]
- private void load()
+ private void load(OsuGame game)
{
beatmapSets.AddRange(beatmaps.GetAllUsableBeatmapSets().OrderBy(_ => RNG.Next()));
beatmaps.ItemAdded += handleBeatmapAdded;
@@ -233,6 +233,24 @@ namespace osu.Game.Overlays
queuedDirection = null;
}
+ private bool allowRateAdjustments;
+
+ ///
+ /// Whether mod rate adjustments are allowed to be applied.
+ ///
+ public bool AllowRateAdjustments
+ {
+ get => allowRateAdjustments;
+ set
+ {
+ if (allowRateAdjustments == value)
+ return;
+
+ allowRateAdjustments = value;
+ ResetTrackAdjustments();
+ }
+ }
+
public void ResetTrackAdjustments()
{
var track = current?.Track;
@@ -241,8 +259,11 @@ namespace osu.Game.Overlays
track.ResetSpeedAdjustments();
- foreach (var mod in mods.Value.OfType())
- mod.ApplyToClock(track);
+ if (allowRateAdjustments)
+ {
+ foreach (var mod in mods.Value.OfType())
+ mod.ApplyToClock(track);
+ }
}
protected override void Dispose(bool isDisposing)
diff --git a/osu.Game/Screens/IOsuScreen.cs b/osu.Game/Screens/IOsuScreen.cs
index 9fc907c2a4..22fe0ad816 100644
--- a/osu.Game/Screens/IOsuScreen.cs
+++ b/osu.Game/Screens/IOsuScreen.cs
@@ -51,5 +51,10 @@ namespace osu.Game.Screens
Bindable Beatmap { get; }
Bindable Ruleset { get; }
+
+ ///
+ /// Whether mod rate adjustments are allowed to be applied.
+ ///
+ bool AllowRateAdjustments { get; }
}
}
diff --git a/osu.Game/Screens/Menu/MainMenu.cs b/osu.Game/Screens/Menu/MainMenu.cs
index c195ed6cb6..08338845e6 100644
--- a/osu.Game/Screens/Menu/MainMenu.cs
+++ b/osu.Game/Screens/Menu/MainMenu.cs
@@ -37,6 +37,8 @@ namespace osu.Game.Screens.Menu
public override bool AllowExternalScreenChange => true;
+ public override bool AllowRateAdjustments => false;
+
private Screen songSelect;
private MenuSideFlashes sideFlashes;
diff --git a/osu.Game/Screens/OsuScreen.cs b/osu.Game/Screens/OsuScreen.cs
index 328631ff9c..94165fe4b7 100644
--- a/osu.Game/Screens/OsuScreen.cs
+++ b/osu.Game/Screens/OsuScreen.cs
@@ -91,6 +91,8 @@ namespace osu.Game.Screens
public Bindable Ruleset { get; private set; }
+ public virtual bool AllowRateAdjustments => true;
+
public Bindable> Mods { get; private set; }
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
diff --git a/osu.Game/Screens/StartupScreen.cs b/osu.Game/Screens/StartupScreen.cs
index 797f185a37..c3e36c8e9d 100644
--- a/osu.Game/Screens/StartupScreen.cs
+++ b/osu.Game/Screens/StartupScreen.cs
@@ -16,6 +16,8 @@ namespace osu.Game.Screens
public override bool CursorVisible => false;
+ public override bool AllowRateAdjustments => false;
+
public override OverlayActivation InitialOverlayActivationMode => OverlayActivation.Disabled;
}
}