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/Skinning/Argon/ArgonJudgementPiece.cs b/osu.Game.Rulesets.Osu/Skinning/Argon/ArgonJudgementPiece.cs
index 6f55d93efff8..edeece029396 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.IsMiss())
{
- 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);
+ }
+ 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.Osu/UI/OsuPlayfield.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
index 15ca0a90de91..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);
@@ -170,7 +182,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..0d11d2d4ef70 100644
--- a/osu.Game/Graphics/OsuColour.cs
+++ b/osu.Game/Graphics/OsuColour.cs
@@ -75,9 +75,12 @@ public Color4 ForHitResult(HitResult result)
{
switch (result)
{
+ case HitResult.IgnoreMiss:
case HitResult.SmallTickMiss:
- case HitResult.LargeTickMiss:
+ return Orange1;
+
case HitResult.Miss:
+ case HitResult.LargeTickMiss:
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..bdb2a9db2335 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,
@@ -267,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 9b1ff9b22f0c..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 != HitResult.Miss)
+ 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 082d0e4a6702..39697090d10c 100644
--- a/osu.Game/Skinning/LegacyJudgementPieceOld.cs
+++ b/osu.Game/Skinning/LegacyJudgementPieceOld.cs
@@ -52,9 +52,17 @@ public virtual void PlayAnimation()
if (animation?.FrameCount > 1 && !forceTransforms)
return;
- switch (result)
+ if (result.IsMiss())
{
- case HitResult.Miss:
+ bool isTick = result != HitResult.Miss;
+
+ if (isTick)
+ {
+ this.ScaleTo(0.6f);
+ this.ScaleTo(0.3f, 100, Easing.In);
+ }
+ else
+ {
this.ScaleTo(1.6f);
this.ScaleTo(1, 100, Easing.In);
@@ -71,20 +79,18 @@ public virtual void PlayAnimation()
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;
-
- default:
-
- 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
- break;
+ }
+ }
+ 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
}
}
diff --git a/osu.Game/Skinning/LegacySkin.cs b/osu.Game/Skinning/LegacySkin.cs
index 91022319130f..a37a38688963 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.IsMiss())
+ 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);