diff --git a/osu.Game/Screens/Play/GameplayState.cs b/osu.Game/Screens/Play/GameplayState.cs
index 60fbfa6644..64e873b3bb 100644
--- a/osu.Game/Screens/Play/GameplayState.cs
+++ b/osu.Game/Screens/Play/GameplayState.cs
@@ -49,6 +49,11 @@ namespace osu.Game.Screens.Play
///
public bool HasFailed { get; set; }
+ ///
+ /// Whether the user quit gameplay without either having either passed or failed.
+ ///
+ public bool HasQuit { get; set; }
+
///
/// A bindable tracking the last judgement result applied to any hit object.
///
diff --git a/osu.Game/Screens/Play/Player.cs b/osu.Game/Screens/Play/Player.cs
index 814aacd2fa..f6a2310826 100644
--- a/osu.Game/Screens/Play/Player.cs
+++ b/osu.Game/Screens/Play/Player.cs
@@ -983,6 +983,9 @@ namespace osu.Game.Screens.Play
public override bool OnExiting(IScreen next)
{
+ if (!GameplayState.HasPassed && !GameplayState.HasFailed)
+ GameplayState.HasQuit = true;
+
screenSuspension?.RemoveAndDisposeImmediately();
failAnimationLayer?.RemoveFilters();