Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scrolling through replay can cause sliderticks and sliderends to show as misses #27177

Closed
ssz7-ch2 opened this issue Feb 15, 2024 · 3 comments
Closed
Labels
area:replay priority:1 Very important. Feels bad without fix. Affects the majority of users.

Comments

@ssz7-ch2
Copy link
Contributor

Type

Game behaviour

Bug description

As seen here #27171
Slidertickmiss and sliderendmiss appear even though the cursor is clearly within the slider followcircle. And somehow combo isn't breaking?

mili_cut.mp4

Scrolling frame by frame

February.15.2024.01-09-26.mp4

Note: I could only get this to happen by scrolling backwards through the replay.

Screenshots or videos

No response

Version

2024.131.0.0

Logs

N/A

@peppy
Copy link
Sponsor Member

peppy commented Feb 15, 2024

This is probably worth investigating since it looks to be easily reproducible over a single frame.

@peppy peppy added area:replay priority:1 Very important. Feels bad without fix. Affects the majority of users. labels Feb 15, 2024
@bdach
Copy link
Collaborator

bdach commented Feb 29, 2024

There are at least 2 disparate bugs associated with this.

The first one is that SliderInputManager just does not handle rewind correctly with respect of the value of Tracking, period. What happens is that the slider begins tracking in the forward run correctly, and completes correctly. After that, if you rewind before the first tick, Tracking never becomes true again, because the whole update of Tracking has a self-feedback cycle, because the valid tracking radius in frame N+1 depends on the value of Tracking in frame N:

updateTracking(IsMouseInFollowArea(Tracking));

In this particular user initially hit the head using the slider ball radius (because you have to), making Tracking = true happen, and then continued tracking using the extended radius. Rewind effectively inverts this order and the slider will become tracking only if you're in the slider ball radius at the end of the slider.

This can be seen by rewinding past the slider's end and playing it in its entirety start-to-end - but if you do this you will see the red miss dot showing again (but with no combo break this time). This is the second bug.

JudgementContainer is supposed to be handling this via

// remove any existing judgements for the judged object.
// this can be the case when rewinding.
RemoveAll(c => c.JudgedObject == judgement.JudgedObject, false);

but it does so via hooking onto Add(). The issue is that a tick hit doesn't actually add a judgement to the container:

AddInternal(judgementPooler = new JudgementPooler<DrawableOsuJudgement>(new[]
{
HitResult.Great,
HitResult.Ok,
HitResult.Meh,
HitResult.Miss,
HitResult.LargeTickMiss,
HitResult.IgnoreMiss,
}, onJudgementLoaded));

var explosion = judgementPooler.Get(result.Type, doj => doj.Apply(result, judgedObject));
if (explosion == null)
return;
judgementLayer.Add(explosion);

so none of this ever fires. I'm not sure this actually needs to be addressed, because the primary issue is way more serious, but it seems worth mentioning.

Not sure how to fix right now. Maybe by storing historical Tracking values and reapplying them during rewind.

@bdach
Copy link
Collaborator

bdach commented Mar 13, 2024

This is mostly fixed by #27429.

@bdach bdach closed this as completed Mar 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:replay priority:1 Very important. Feels bad without fix. Affects the majority of users.
Projects
None yet
Development

No branches or pull requests

3 participants