Track the full size of the follow circle at all times #18795
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Alternative to / closes #14832
The above PR also has further changes related to slider ticks/animations/etc, but I think those should be done in more granular PRs instead, if at all.
Abstract
The main reason for this PR is that I'm worried that the current implementation of follow circles in non-classic mode leads to an edge case where a player may hit a (kick-)slider that is not supposed to be followed (i.e. the slider path is in the opposite direction of the beatmap flow) on the very edge of the circle and lose tracking.
Changes
There are two pathways that I considered:
I chose to add a virtual follow circle area because speeding up the animation makes it a bit jarring. I think the 300ms OutQuint animation looks pretty nice, and it would need to be sped up by 2-6x most of the time, at which point we might as well remove the animation.
One workaround I considered is changing the easing mode at smaller durations, but I don't think that's a good idea. I think it looks better if the animation is consistent in both duration and easing.
This PR also removes the classic mod setting.
Extra edge case
While investigating (2), I also found out that the follow circle size is always 1 frame behind due to transforms. That's why in (2) I had to change
SliderBall
to update the tracking value inUpdateAfterChildren()
, in order to update it after the follow circle transforms updated.Using the virtual follow circle area eliminates this issue.
Testing
Aside from the provided test case, I've played a bit with the previous classic mod (instant animation), and both of the proposed changes. It's subtle, but I still find this is the best looking variant.
Data
The following is a table of the minimum slider velocity at which master (non-classic) loses tracking at varying circle sizes in the situation from the abstract. Tracking is lost at all higher slider velocity values.
Given that the above was tested at 60BPM, and SV increases as BPM increases, I think it's fair to say that the above will be the case more often than not.