1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-21 17:27:24 +08:00

Only track if in slider ball after any ticks missed

This commit is contained in:
Dan Balasescu 2023-12-17 20:12:02 +09:00
parent fbe48d7be8
commit 9b02bd712b
No known key found for this signature in database
2 changed files with 35 additions and 2 deletions

View File

@ -280,6 +280,37 @@ namespace osu.Game.Rulesets.Osu.Tests
assertSliderJudgement(HitResult.IgnoreHit);
}
/// <summary>
/// Same as <see cref="TestHitLateInRangeDoesNotHitOutOfRangeTick"/> except the tracking is limited to the ball
/// because the tick was missed.
/// </summary>
[Test]
public void TestHitLateInRangeDoesNotHitOutOfRangeTickAndTrackingLimitedToBall()
{
performTest(new List<ReplayFrame>
{
new OsuReplayFrame(time_slider_start + 150, slider_start_position, OsuAction.LeftButton),
new OsuReplayFrame(time_slider_end + 150, slider_start_position, OsuAction.LeftButton),
}, s =>
{
s.Path = new SliderPath(PathType.PERFECT_CURVE, new[]
{
Vector2.Zero,
new Vector2(50, 50),
new Vector2(20, 0),
});
s.TickDistanceMultiplier = 0.25f;
s.SliderVelocityMultiplier = 3;
});
assertHeadJudgement(HitResult.Meh);
assertTickJudgement(0, HitResult.LargeTickMiss);
assertTickJudgement(1, HitResult.LargeTickMiss);
assertTailJudgement(HitResult.LargeTickHit);
assertSliderJudgement(HitResult.IgnoreHit);
}
/// <summary>
/// If the head circle is hit and the mouse is in range of the follow circle,
/// then a tick not within the follow radius from the cursor position should not be hit.

View File

@ -126,8 +126,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
nested.MissForcefully();
}
// Enable tracking, since the mouse is within the follow area (if it were expanded).
updateTracking(true);
// If all ticks were hit so far, enable tracking the full extent.
// If any ticks were missed, assume tracking would've broken at some point, and should only activate if the cursor is within the slider ball.
// For the second case, this may be the last chance we have to enable tracking before other objects get judged, otherwise the same would normally happen via Update().
updateTracking(allTicksInRange || isMouseInFollowArea(false));
}
public void TryJudgeNestedObject(DrawableOsuHitObject nestedObject, double timeOffset)