diff --git a/osu.Android.props b/osu.Android.props
index c428cd2546..5b700224db 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -52,6 +52,6 @@
-
+
diff --git a/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs b/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs
index e58aacd86e..9f77175398 100644
--- a/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs
+++ b/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs
@@ -38,6 +38,11 @@ namespace osu.Game.Rulesets.Osu.Judgements
///
public float RateAdjustedRotation;
+ ///
+ /// Time instant at which the spin was started (the first user input which caused an increase in spin).
+ ///
+ public double? TimeStarted;
+
///
/// Time instant at which the spinner has been completed (the user has executed all required spins).
/// Will be null if all required spins haven't been completed.
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index d02376b6c3..3d614c2dbd 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -158,6 +158,17 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
}
}
+ protected override void UpdateStartTimeStateTransforms()
+ {
+ base.UpdateStartTimeStateTransforms();
+
+ if (Result?.TimeStarted is double startTime)
+ {
+ using (BeginAbsoluteSequence(startTime))
+ fadeInCounter();
+ }
+ }
+
protected override void UpdateHitStateTransforms(ArmedState state)
{
base.UpdateHitStateTransforms(state);
@@ -262,13 +273,21 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
base.UpdateAfterChildren();
if (!SpmCounter.IsPresent && RotationTracker.Tracking)
- SpmCounter.FadeIn(HitObject.TimeFadeIn);
+ {
+ Result.TimeStarted ??= Time.Current;
+ fadeInCounter();
+ }
- SpmCounter.SetRotation(Result.RateAdjustedRotation);
+ // don't update after end time to avoid the rate display dropping during fade out.
+ // this shouldn't be limited to StartTime as it causes weirdness with the underlying calculation, which is expecting updates during that period.
+ if (Time.Current <= HitObject.EndTime)
+ SpmCounter.SetRotation(Result.RateAdjustedRotation);
updateBonusScore();
}
+ private void fadeInCounter() => SpmCounter.FadeIn(HitObject.TimeFadeIn);
+
private int wholeSpins;
private void updateBonusScore()
diff --git a/osu.Game/Updater/SimpleUpdateManager.cs b/osu.Game/Updater/SimpleUpdateManager.cs
index 6eded7ce53..50572a7867 100644
--- a/osu.Game/Updater/SimpleUpdateManager.cs
+++ b/osu.Game/Updater/SimpleUpdateManager.cs
@@ -77,7 +77,7 @@ namespace osu.Game.Updater
bestAsset = release.Assets?.Find(f => f.Name.EndsWith(".exe", StringComparison.Ordinal));
break;
- case RuntimeInfo.Platform.MacOsx:
+ case RuntimeInfo.Platform.macOS:
bestAsset = release.Assets?.Find(f => f.Name.EndsWith(".app.zip", StringComparison.Ordinal));
break;
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index c7aa6a8e11..90c8b98f42 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -29,7 +29,7 @@
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 729d692e0e..ccd33bf88c 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -70,7 +70,7 @@
-
+
@@ -93,7 +93,7 @@
-
+