From 9b383e3276c23ec9f070b3ab1ccd01df969c83a7 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 20 Dec 2023 20:23:19 +0900 Subject: [PATCH 1/5] Add support for showing tick misses --- .../Objects/Drawables/DrawableSliderRepeat.cs | 2 - .../Objects/Drawables/DrawableSliderTail.cs | 5 -- .../Objects/Drawables/DrawableSliderTick.cs | 2 - .../Scoring/OsuHitWindows.cs | 2 + .../Skinning/Argon/ArgonJudgementPiece.cs | 34 ++++++------ osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs | 5 +- osu.Game/Graphics/OsuColour.cs | 1 + .../Judgements/DefaultJudgementPiece.cs | 16 +++--- .../Rulesets/Judgements/DrawableJudgement.cs | 9 ++-- osu.Game/Rulesets/Scoring/HitResult.cs | 2 + osu.Game/Skinning/LegacyJudgementPieceNew.cs | 2 +- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 52 +++++++++---------- osu.Game/Skinning/LegacySkin.cs | 6 +-- 13 files changed, 64 insertions(+), 74 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderRepeat.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderRepeat.cs index 0c8e5b765fa3..c6d4f7c4cada 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderRepeat.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderRepeat.cs @@ -34,8 +34,6 @@ public partial class DrawableSliderRepeat : DrawableOsuHitObject, ITrackSnaking private Drawable scaleContainer; - public override bool DisplayResult => false; - public DrawableSliderRepeat() : base(null) { diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTail.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTail.cs index 60bad5d4a7aa..c4731118a172 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTail.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTail.cs @@ -24,11 +24,6 @@ public partial class DrawableSliderTail : DrawableOsuHitObject protected DrawableSlider DrawableSlider => (DrawableSlider)ParentHitObject; - /// - /// The judgement text is provided by the . - /// - public override bool DisplayResult => false; - /// /// Whether the hit samples only play on successful hits. /// If false, the hit samples will also play on misses. diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs index cb323f4ac79b..d64fb0bcc60b 100644 --- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs +++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSliderTick.cs @@ -20,8 +20,6 @@ public partial class DrawableSliderTick : DrawableOsuHitObject private const float default_tick_size = 16; - public override bool DisplayResult => false; - protected DrawableSlider DrawableSlider => (DrawableSlider)ParentHitObject; private SkinnableDrawable scaleContainer; diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs b/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs index fd86e0eeda22..5b2c95b536b1 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs @@ -28,6 +28,8 @@ public override bool IsHitResultAllowed(HitResult result) case HitResult.Ok: case HitResult.Meh: case HitResult.Miss: + case HitResult.LargeTickMiss: + case HitResult.IgnoreMiss: return true; } diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs index 6f55d93efff8..94766cb077e3 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs @@ -62,25 +62,23 @@ protected override SpriteText CreateJudgementText() => /// public virtual void PlayAnimation() { - switch (Result) + if (Result.IsHit()) + { + JudgementText + .FadeInFromZero(300, Easing.OutQuint) + .ScaleTo(Vector2.One) + .ScaleTo(new Vector2(1.2f), 1800, Easing.OutQuint); + } + else { - default: - JudgementText - .FadeInFromZero(300, Easing.OutQuint) - .ScaleTo(Vector2.One) - .ScaleTo(new Vector2(1.2f), 1800, Easing.OutQuint); - break; - - case HitResult.Miss: - this.ScaleTo(1.6f); - this.ScaleTo(1, 100, Easing.In); - - this.MoveTo(Vector2.Zero); - this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint); - - this.RotateTo(0); - this.RotateTo(40, 800, Easing.InQuint); - break; + this.ScaleTo(1.6f); + this.ScaleTo(1, 100, Easing.In); + + this.MoveTo(Vector2.Zero); + this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint); + + this.RotateTo(0); + this.RotateTo(40, 800, Easing.InQuint); } this.FadeOutFromOne(800); diff --git a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs index 15ca0a90de91..3f60ce3610e7 100644 --- a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs +++ b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs @@ -170,7 +170,10 @@ private void onNewResult(DrawableHitObject judgedObject, JudgementResult result) if (!judgedObject.DisplayResult || !DisplayJudgements.Value) return; - DrawableOsuJudgement explosion = poolDictionary[result.Type].Get(doj => doj.Apply(result, judgedObject)); + if (!poolDictionary.TryGetValue(result.Type, out var pool)) + return; + + DrawableOsuJudgement explosion = pool.Get(doj => doj.Apply(result, judgedObject)); judgementLayer.Add(explosion); diff --git a/osu.Game/Graphics/OsuColour.cs b/osu.Game/Graphics/OsuColour.cs index a417164e27b5..caa203769182 100644 --- a/osu.Game/Graphics/OsuColour.cs +++ b/osu.Game/Graphics/OsuColour.cs @@ -77,6 +77,7 @@ public Color4 ForHitResult(HitResult result) { case HitResult.SmallTickMiss: case HitResult.LargeTickMiss: + case HitResult.IgnoreMiss: case HitResult.Miss: case HitResult.ComboBreak: return Red; diff --git a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs index d5f586dc3515..3c5e37f91cba 100644 --- a/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs +++ b/osu.Game/Rulesets/Judgements/DefaultJudgementPiece.cs @@ -38,18 +38,16 @@ protected override SpriteText CreateJudgementText() => /// public virtual void PlayAnimation() { - switch (Result) + if (Result != HitResult.None && !Result.IsHit()) { - case HitResult.Miss: - this.ScaleTo(1.6f); - this.ScaleTo(1, 100, Easing.In); + this.ScaleTo(1.6f); + this.ScaleTo(1, 100, Easing.In); - this.MoveTo(Vector2.Zero); - this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint); + this.MoveTo(Vector2.Zero); + this.MoveToOffset(new Vector2(0, 100), 800, Easing.InQuint); - this.RotateTo(0); - this.RotateTo(40, 800, Easing.InQuint); - break; + this.RotateTo(0); + this.RotateTo(40, 800, Easing.InQuint); } this.FadeOutFromOne(800); diff --git a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs index 15434fcc0487..b4686c52f375 100644 --- a/osu.Game/Rulesets/Judgements/DrawableJudgement.cs +++ b/osu.Game/Rulesets/Judgements/DrawableJudgement.cs @@ -133,12 +133,11 @@ private void runAnimation() case HitResult.None: break; - case HitResult.Miss: - ApplyMissAnimations(); - break; - default: - ApplyHitAnimations(); + if (Result.Type.IsHit()) + ApplyHitAnimations(); + else + ApplyMissAnimations(); break; } diff --git a/osu.Game/Rulesets/Scoring/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs index 970542157151..b4905010212a 100644 --- a/osu.Game/Rulesets/Scoring/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -86,6 +86,7 @@ public enum HitResult /// Indicates a large tick miss. /// [EnumMember(Value = "large_tick_miss")] + [Description(@"x")] [Order(10)] LargeTickMiss, @@ -117,6 +118,7 @@ public enum HitResult /// Indicates a miss that should be ignored for scoring purposes. /// [EnumMember(Value = "ignore_miss")] + [Description("x")] [Order(13)] IgnoreMiss, diff --git a/osu.Game/Skinning/LegacyJudgementPieceNew.cs b/osu.Game/Skinning/LegacyJudgementPieceNew.cs index 9b1ff9b22f0c..a93c48ba63b1 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceNew.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceNew.cs @@ -50,7 +50,7 @@ public LegacyJudgementPieceNew(HitResult result, Func createMainDrawab }); } - if (result != HitResult.Miss) + if (result.IsHit()) { //new judgement shows old as a temporary effect AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f, true) diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index 082d0e4a6702..5381cfc050d7 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -52,39 +52,35 @@ public virtual void PlayAnimation() if (animation?.FrameCount > 1 && !forceTransforms) return; - switch (result) + if (result.IsHit()) { - case HitResult.Miss: - this.ScaleTo(1.6f); - this.ScaleTo(1, 100, Easing.In); - - decimal? legacyVersion = skin.GetConfig(SkinConfiguration.LegacySetting.Version)?.Value; - - if (legacyVersion >= 2.0m) - { - this.MoveTo(new Vector2(0, -5)); - this.MoveToOffset(new Vector2(0, 80), fade_out_delay + fade_out_length, Easing.In); - } - - float rotation = RNG.NextSingle(-8.6f, 8.6f); + this.ScaleTo(0.6f).Then() + .ScaleTo(1.1f, fade_in_length * 0.8f).Then() // t = 0.8 + .Delay(fade_in_length * 0.2f) // t = 1.0 + .ScaleTo(0.9f, fade_in_length * 0.2f).Then() // t = 1.2 + // stable dictates scale of 0.9->1 over time 1.0 to 1.4, but we are already at 1.2. + // so we need to force the current value to be correct at 1.2 (0.95) then complete the + // second half of the transform. + .ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4 + } + else + { + this.ScaleTo(1.6f); + this.ScaleTo(1, 100, Easing.In); - this.RotateTo(0); - this.RotateTo(rotation, fade_in_length) - .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); - break; + decimal? legacyVersion = skin.GetConfig(SkinConfiguration.LegacySetting.Version)?.Value; - default: + if (legacyVersion >= 2.0m) + { + this.MoveTo(new Vector2(0, -5)); + this.MoveToOffset(new Vector2(0, 80), fade_out_delay + fade_out_length, Easing.In); + } - this.ScaleTo(0.6f).Then() - .ScaleTo(1.1f, fade_in_length * 0.8f).Then() // t = 0.8 - .Delay(fade_in_length * 0.2f) // t = 1.0 - .ScaleTo(0.9f, fade_in_length * 0.2f).Then() // t = 1.2 + float rotation = RNG.NextSingle(-8.6f, 8.6f); - // stable dictates scale of 0.9->1 over time 1.0 to 1.4, but we are already at 1.2. - // so we need to force the current value to be correct at 1.2 (0.95) then complete the - // second half of the transform. - .ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4 - break; + this.RotateTo(0); + this.RotateTo(rotation, fade_in_length) + .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); } } diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs index 91022319130f..7516c73b689c 100644 --- a/osu.Game/Skinning/LegacySkin.cs +++ b/osu.Game/Skinning/LegacySkin.cs @@ -453,11 +453,11 @@ protected override void ParseConfigurationStream(Stream stream) private Drawable? getJudgementAnimation(HitResult result) { + if (!result.IsHit()) + return this.GetAnimation("hit0", true, false); + switch (result) { - case HitResult.Miss: - return this.GetAnimation("hit0", true, false); - case HitResult.Meh: return this.GetAnimation("hit50", true, false); From d2716d855741c7461a33aa317965486a85ecd3d2 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 20 Dec 2023 20:26:28 +0900 Subject: [PATCH 2/5] Improve animation for legacy skins --- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 32 +++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index 5381cfc050d7..6ad188bb47e9 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -65,22 +65,32 @@ public virtual void PlayAnimation() } else { - this.ScaleTo(1.6f); - this.ScaleTo(1, 100, Easing.In); + bool isTick = result != HitResult.Miss; - decimal? legacyVersion = skin.GetConfig(SkinConfiguration.LegacySetting.Version)?.Value; - - if (legacyVersion >= 2.0m) + if (isTick) { - this.MoveTo(new Vector2(0, -5)); - this.MoveToOffset(new Vector2(0, 80), fade_out_delay + fade_out_length, Easing.In); + this.ScaleTo(0.6f); + this.ScaleTo(0.3f, 100, Easing.In); } + else + { + this.ScaleTo(1.6f); + this.ScaleTo(1, 100, Easing.In); + + decimal? legacyVersion = skin.GetConfig(SkinConfiguration.LegacySetting.Version)?.Value; - float rotation = RNG.NextSingle(-8.6f, 8.6f); + if (legacyVersion >= 2.0m) + { + this.MoveTo(new Vector2(0, -5)); + this.MoveToOffset(new Vector2(0, 80), fade_out_delay + fade_out_length, Easing.In); + } - this.RotateTo(0); - this.RotateTo(rotation, fade_in_length) - .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); + float rotation = RNG.NextSingle(-8.6f, 8.6f); + + this.RotateTo(0); + this.RotateTo(rotation, fade_in_length) + .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); + } } } From d1ba2a4a64f7e5c51c5309d5366b9778b98fbdf4 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 20 Dec 2023 20:45:18 +0900 Subject: [PATCH 3/5] Use orange for non-combo-breaking miss --- osu.Game/Graphics/OsuColour.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/osu.Game/Graphics/OsuColour.cs b/osu.Game/Graphics/OsuColour.cs index caa203769182..0d11d2d4ef70 100644 --- a/osu.Game/Graphics/OsuColour.cs +++ b/osu.Game/Graphics/OsuColour.cs @@ -75,10 +75,12 @@ public Color4 ForHitResult(HitResult result) { switch (result) { - case HitResult.SmallTickMiss: - case HitResult.LargeTickMiss: case HitResult.IgnoreMiss: + case HitResult.SmallTickMiss: + return Orange1; + case HitResult.Miss: + case HitResult.LargeTickMiss: case HitResult.ComboBreak: return Red; From fcf47267fd3a38e53794ca8dadd0d6222c327b64 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 21 Dec 2023 00:48:46 +0900 Subject: [PATCH 4/5] Revert change to `OsuHitWindows` and move logic local to pooling initialisation --- osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs | 2 -- osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs | 18 +++++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs b/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs index 5b2c95b536b1..fd86e0eeda22 100644 --- a/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs +++ b/osu.Game.Rulesets.Osu/Scoring/OsuHitWindows.cs @@ -28,8 +28,6 @@ public override bool IsHitResultAllowed(HitResult result) case HitResult.Ok: case HitResult.Meh: case HitResult.Miss: - case HitResult.LargeTickMiss: - case HitResult.IgnoreMiss: return true; } diff --git a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs index 3f60ce3610e7..c94057cf6dce 100644 --- a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs +++ b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs @@ -20,7 +20,6 @@ using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Rulesets.Osu.Objects.Drawables.Connections; -using osu.Game.Rulesets.Osu.Scoring; using osu.Game.Rulesets.Osu.UI.Cursor; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.UI; @@ -66,8 +65,21 @@ public OsuPlayfield() HitPolicy = new StartTimeOrderedHitPolicy(); - var hitWindows = new OsuHitWindows(); - foreach (var result in Enum.GetValues().Where(r => r > HitResult.None && hitWindows.IsHitResultAllowed(r))) + foreach (var result in Enum.GetValues().Where(r => + { + switch (r) + { + case HitResult.Great: + case HitResult.Ok: + case HitResult.Meh: + case HitResult.Miss: + case HitResult.LargeTickMiss: + case HitResult.IgnoreMiss: + return true; + } + + return false; + })) poolDictionary.Add(result, new DrawableJudgementPool(result, onJudgementLoaded)); AddRangeInternal(poolDictionary.Values); From eb8fb8092d2effd3c4251f8247f0dcc5d8f52a93 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Thu, 21 Dec 2023 00:58:43 +0900 Subject: [PATCH 5/5] Attempt to standardise miss handling logic --- .../Skinning/Argon/ArgonJudgementPiece.cs | 16 ++++++------- osu.Game/Rulesets/Scoring/HitResult.cs | 19 +++++++++++++++ osu.Game/Skinning/LegacyJudgementPieceNew.cs | 2 +- osu.Game/Skinning/LegacyJudgementPieceOld.cs | 24 +++++++++---------- osu.Game/Skinning/LegacySkin.cs | 2 +- 5 files changed, 41 insertions(+), 22 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs index 94766cb077e3..edeece029396 100644 --- a/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs +++ b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs @@ -62,14 +62,7 @@ protected override SpriteText CreateJudgementText() => /// public virtual void PlayAnimation() { - if (Result.IsHit()) - { - JudgementText - .FadeInFromZero(300, Easing.OutQuint) - .ScaleTo(Vector2.One) - .ScaleTo(new Vector2(1.2f), 1800, Easing.OutQuint); - } - else + if (Result.IsMiss()) { this.ScaleTo(1.6f); this.ScaleTo(1, 100, Easing.In); @@ -80,6 +73,13 @@ public virtual void PlayAnimation() this.RotateTo(0); this.RotateTo(40, 800, Easing.InQuint); } + else + { + JudgementText + .FadeInFromZero(300, Easing.OutQuint) + .ScaleTo(Vector2.One) + .ScaleTo(new Vector2(1.2f), 1800, Easing.OutQuint); + } this.FadeOutFromOne(800); diff --git a/osu.Game/Rulesets/Scoring/HitResult.cs b/osu.Game/Rulesets/Scoring/HitResult.cs index b4905010212a..bdb2a9db2335 100644 --- a/osu.Game/Rulesets/Scoring/HitResult.cs +++ b/osu.Game/Rulesets/Scoring/HitResult.cs @@ -269,6 +269,25 @@ public static bool IsBonus(this HitResult result) } } + /// + /// Whether a represents a miss of any type. + /// + public static bool IsMiss(this HitResult result) + { + switch (result) + { + case HitResult.IgnoreMiss: + case HitResult.Miss: + case HitResult.SmallTickMiss: + case HitResult.LargeTickMiss: + case HitResult.ComboBreak: + return true; + + default: + return false; + } + } + /// /// Whether a represents a successful hit. /// diff --git a/osu.Game/Skinning/LegacyJudgementPieceNew.cs b/osu.Game/Skinning/LegacyJudgementPieceNew.cs index a93c48ba63b1..5ff28726c02a 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceNew.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceNew.cs @@ -50,7 +50,7 @@ public LegacyJudgementPieceNew(HitResult result, Func createMainDrawab }); } - if (result.IsHit()) + if (!result.IsMiss()) { //new judgement shows old as a temporary effect AddInternal(temporaryOldStyle = new LegacyJudgementPieceOld(result, createMainDrawable, 1.05f, true) diff --git a/osu.Game/Skinning/LegacyJudgementPieceOld.cs b/osu.Game/Skinning/LegacyJudgementPieceOld.cs index 6ad188bb47e9..39697090d10c 100644 --- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs +++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs @@ -52,18 +52,7 @@ public virtual void PlayAnimation() if (animation?.FrameCount > 1 && !forceTransforms) return; - if (result.IsHit()) - { - this.ScaleTo(0.6f).Then() - .ScaleTo(1.1f, fade_in_length * 0.8f).Then() // t = 0.8 - .Delay(fade_in_length * 0.2f) // t = 1.0 - .ScaleTo(0.9f, fade_in_length * 0.2f).Then() // t = 1.2 - // stable dictates scale of 0.9->1 over time 1.0 to 1.4, but we are already at 1.2. - // so we need to force the current value to be correct at 1.2 (0.95) then complete the - // second half of the transform. - .ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4 - } - else + if (result.IsMiss()) { bool isTick = result != HitResult.Miss; @@ -92,6 +81,17 @@ public virtual void PlayAnimation() .Then().RotateTo(rotation * 2, fade_out_delay + fade_out_length - fade_in_length, Easing.In); } } + else + { + this.ScaleTo(0.6f).Then() + .ScaleTo(1.1f, fade_in_length * 0.8f).Then() // t = 0.8 + .Delay(fade_in_length * 0.2f) // t = 1.0 + .ScaleTo(0.9f, fade_in_length * 0.2f).Then() // t = 1.2 + // stable dictates scale of 0.9->1 over time 1.0 to 1.4, but we are already at 1.2. + // so we need to force the current value to be correct at 1.2 (0.95) then complete the + // second half of the transform. + .ScaleTo(0.95f).ScaleTo(finalScale, fade_in_length * 0.2f); // t = 1.4 + } } public Drawable GetAboveHitObjectsProxiedContent() => CreateProxy(); diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs index 7516c73b689c..a37a38688963 100644 --- a/osu.Game/Skinning/LegacySkin.cs +++ b/osu.Game/Skinning/LegacySkin.cs @@ -453,7 +453,7 @@ protected override void ParseConfigurationStream(Stream stream) private Drawable? getJudgementAnimation(HitResult result) { - if (!result.IsHit()) + if (result.IsMiss()) return this.GetAnimation("hit0", true, false); switch (result)