From afec7941ffc9915fd99ba3e4fb680b0868edadee Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Fri, 15 Jul 2022 17:24:40 +0900
Subject: [PATCH 1/2] Adjust default follow circle animations to feel nicer

---
 .../Skinning/Default/DefaultFollowCircle.cs   | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs
index 254e220996..07b99560e5 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs
@@ -5,6 +5,7 @@ using osu.Framework.Bindables;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
+using osu.Framework.Utils;
 using osu.Game.Rulesets.Osu.Objects.Drawables;
 using osuTK.Graphics;
 
@@ -32,11 +33,21 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default
 
         protected override void OnTrackingChanged(ValueChangedEvent<bool> tracking)
         {
-            const float scale_duration = 300f;
-            const float fade_duration = 300f;
+            const float duration = 300f;
 
-            this.ScaleTo(tracking.NewValue ? DrawableSliderBall.FOLLOW_AREA : 1f, scale_duration, Easing.OutQuint)
-                .FadeTo(tracking.NewValue ? 1f : 0, fade_duration, Easing.OutQuint);
+            if (tracking.NewValue)
+            {
+                if (Precision.AlmostEquals(0, Alpha))
+                    this.ScaleTo(1);
+
+                this.ScaleTo(DrawableSliderBall.FOLLOW_AREA, duration, Easing.OutQuint)
+                    .FadeTo(1f, duration, Easing.OutQuint);
+            }
+            else
+            {
+                this.ScaleTo(DrawableSliderBall.FOLLOW_AREA * 1.2f, duration / 2, Easing.OutQuint)
+                    .FadeTo(0, duration / 2, Easing.OutQuint);
+            }
         }
 
         protected override void OnSliderEnd()

From e346624b14e78d4165618e3536de904001941aeb Mon Sep 17 00:00:00 2001
From: Dean Herbert <pe@ppy.sh>
Date: Tue, 19 Jul 2022 15:51:02 +0900
Subject: [PATCH 2/2] Fix animation changes incorrectly applying to successful
 completion of sliders

---
 .../Skinning/Default/DefaultFollowCircle.cs           | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs
index 07b99560e5..b77d4addee 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Default/DefaultFollowCircle.cs
@@ -1,6 +1,7 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
+using System.Diagnostics;
 using osu.Framework.Bindables;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
@@ -33,8 +34,13 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default
 
         protected override void OnTrackingChanged(ValueChangedEvent<bool> tracking)
         {
+            Debug.Assert(ParentObject != null);
+
             const float duration = 300f;
 
+            if (ParentObject.Judged)
+                return;
+
             if (tracking.NewValue)
             {
                 if (Precision.AlmostEquals(0, Alpha))
@@ -52,10 +58,11 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default
 
         protected override void OnSliderEnd()
         {
-            const float fade_duration = 450f;
+            const float fade_duration = 300;
 
             // intentionally pile on an extra FadeOut to make it happen much faster
-            this.FadeOut(fade_duration / 4, Easing.Out);
+            this.ScaleTo(1, fade_duration, Easing.OutQuint);
+            this.FadeOut(fade_duration / 2, Easing.OutQuint);
         }
     }
 }