- Closes https://github.com/ppy/osu/issues/4287
- Probably closes https://github.com/ppy/osu/issues/25405 (but not
retroactively)
Up until now, whether or not a replay frame is emitted depended solely
on the user's input, i.e. mouse movement or key presses/releases. This,
intersected with the replay playback system which is given allowance to
perform interpolation between replay frames, leads to potential
situations wherein a replay can play inaccurately when a judgement takes
place without user input meaningfully changing. One such case is slider
ends with their 36ms of judgement leniency; see
https://github.com/ppy/osu/issues/25405#issuecomment-2879031106 for
details on that.
To that end, this commit aims to counteract that issue by *forcing* an
important replay frame to be emitted on every new judgement recorded
during gameplay. This will only benefit rulesets wherein judgements can
occur that are not inherently tied to user input changing, which are
going to be osu! as mentioned above, and maybe possibly catch. I don't
foresee this doing anything relevant for taiko or mania.
Closes https://github.com/ppy/osu/issues/32289.
There are two possible choices here: either pulling the lower bound of
the clamp down to `HitObject.Path.CalculatedDistance`, or pulling the
higher bound up to `minDistance`, if it happens to be larger than the
path's calculated distance.
Both options are a bit weird; pulling down can result in unsnapped
sliders when attempting to drag a slider's end when on a lower beat
divisor than was used to place the slider, and pulling up can result in
weird sliders wherein they get extended beyond their path's definition
with a weird linear section at the end without an anchor that is tangent
to the slider shape's end. I decided the first one was less weird, but
I'm open to discuss further.
The new carousel implementation was lacking some scroll related
behaviours. This makes sure that post-filter, the selection is
re-centered *unless* the user has scrolled away manually.
This matches the old carousel's behaviour. See
https://github.com/ppy/osu/pull/16647 for original implementation.
Closes https://github.com/ppy/osu/issues/33052.
Pushing this out with zero testing as a "probably fixes"
https://github.com/ppy/osu/issues/33108.
Previous logic would mean that the start value of the fade-in may not be
zero depending on current state, leaving the final alpha state incorrect
after a rewind beyond the start time.