diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs index 7b3565ed1..fff819779 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs @@ -5,6 +5,7 @@ using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Logging; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Drawables; @@ -198,6 +199,7 @@ protected override void CheckForResult(bool userTriggered, double timeOffset) break; } } + if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) @@ -216,12 +218,21 @@ protected override void CheckForResult(bool userTriggered, double timeOffset) return; } + + var result = HitObject.HitWindows.ResultFor(timeOffset); - // If the slide was completed before the early windows, just give an OK result + // Give the player an OK for extremely early completion + // This is also a safegaurd for super late hits beyond the late windows, where the input may have occured prior to the late window being exceeded due to lag. if (result == HitResult.None) result = HitResult.Ok; + // Give a perfect result if the star is intersecting with the last node + // This is to preserve the expected invariant that following the star perfectly should guarantee a perfect judgement. + if (timeOffset < 0) + if ((1 - StarProgress) * Slidepath.Path.TotalDistance <= DrawableSlideCheckpointNode.DETECTION_RADIUS) + result = HitResult.Perfect; + ApplyResult(result); } diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideCheckpointNode.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideCheckpointNode.cs index b9546f99a..e02c82bda 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideCheckpointNode.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideCheckpointNode.cs @@ -24,6 +24,8 @@ public partial class DrawableSlideCheckpointNode : DrawableSentakkiHitObject private SentakkiInputManager sentakkiActionInputManager = null!; internal SentakkiInputManager SentakkiActionInputManager => sentakkiActionInputManager ??= ((SentakkiInputManager)GetContainingInputManager()); + public const float DETECTION_RADIUS = 100; + public DrawableSlideCheckpointNode() : this(null) { @@ -35,9 +37,9 @@ public DrawableSlideCheckpointNode(SlideCheckpoint.CheckpointNode? node) Anchor = Anchor.Centre; Origin = Anchor.Centre; RelativeSizeAxes = Axes.None; - Size = new Vector2(200); + Size = new Vector2(DETECTION_RADIUS * 2); CornerExponent = 2f; - CornerRadius = 100; + CornerRadius = DETECTION_RADIUS; } protected override void OnApply()