1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-11 09:17:51 +08:00
osu-lazer/osu.Game.Rulesets.Catch
Bartłomiej Dach e50bc59219
Truncate start time of juice stream nested objects
Intended as at least a partial solution to
https://github.com/ppy/osu/issues/26436. In testing, two of the three
replays from the issue are FCs with this change, and the third is
improved (and not fully fixed).

As it turns out, stable truncates the end time of sliders to integers:

    79addff0f5/osu!/GameplayElements/HitObjects/Osu/SliderOsu.cs#L1037

and the start time of all juice stream parts is also truncated to
integers:

    79addff0f5/osu!/GameplayElements/HitObjects/Fruits/SliderFruits.cs#L86-L166

This matters for replay playback when mappers push limits. For instance,
let's take one case from the issue. In one of the maps involved, there
was a juice-stream-ending fruit at time 7093.9655 according to lazer,
which was also a hyperfruit.

The broken replay on this map included one frame at time 7093, with the
catcher position before the hyperdash, and one frame at time 7097,
with the catcher position *after* the hyperdash. Which meant that
the replay handler moved *out of the way* of the hyperfruit at time
7093.9655, deciding that it is *after* the replay frame that was
supposed to be catching it.

(For reference, the relevant replay playback code is here:

    3da5831075/osu.Game.Rulesets.Catch/Replays/CatchFramedReplayInputHandler.cs (L20-L31)

Note the handling of `position`. Any frame with an action is important,
which means that as long as any key is held, interpolation will not
take place.)

On stable this is not a thing, because the fruit's end time was being
truncated to `int`, therefore moving it back to time 7093 and restoring
temporal integrity.

This probably doesn't matter in other rulesets that much because
the input tolerances in something like osu! or taiko are much higher.
catch is rather knife-edge, what with mappers doing the "edge dash" /
"pixel jump" stuff (tl;dr: placing a circle just barely outside of
hyperdash range, so that a perfect normal dash is required to catch it).
Thus, this is applied locally to catch for now until proven necessary
to put it elsewhere too.
2024-04-26 14:14:24 +02:00
..
Beatmaps Fix catch hit object position getting randomised when last object has pos=0 2024-03-02 03:18:59 +03:00
Difficulty Fix catch pp calculator not matching live with respect to miss handling 2024-03-04 11:53:59 +01:00
Edit Merge pull request #27723 from 64ArthurAraujo/editor-fix-reverse-selection 2024-03-28 11:25:17 +01:00
Judgements Remove #nullable disable from Catch.Judgements 2023-01-15 17:29:32 +09:00
Mods Adjust "Floating Fruits" in line with layout changes 2024-02-14 01:34:55 +03:00
Objects Truncate start time of juice stream nested objects 2024-04-26 14:14:24 +02:00
Properties Remove #nullable disable from misc Catch files 2023-01-15 17:29:35 +09:00
Replays Remove the nullable disable annotation and fix the breaking api. 2022-07-02 13:33:05 +08:00
Scoring Fix banana showers causing fails when hp is at 0 2024-03-20 17:31:33 +09:00
Skinning Remove behaviour of flipping catcher plate on direction change 2024-02-14 07:17:05 +03:00
UI Merge branch 'master' into tcm-resume 2024-03-14 12:22:46 +09:00
CatchInputManager.cs Partial everything 2022-11-27 00:00:27 +09:00
CatchRuleset.cs Extract preempt durations to shared constants 2023-12-14 20:41:12 +01:00
CatchSkinComponentLookup.cs Remove unused members from GameplaySkinComponentLookup 2024-04-19 18:03:13 +09:00
CatchSkinComponents.cs Apply nullability to osu!catch skinning classes 2022-11-09 13:58:58 +09:00
osu.Game.Rulesets.Catch.csproj Upgrade to .NET 8 SDK 2024-02-02 21:28:51 +09:00