-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
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
Fix 1 million score being unachievable on some mania beatmaps #23917
Conversation
Nobody overrides this, and with the structure given, overriders would have to rewrite half of this code anyway. The fact that the class has 2 other overridable members (`CreateResult()`, `GetSimulatedHitResult()`) which cease to have any meaning if `SimulateAutoplay()` is overridden also contributes to taking this decision.
protected virtual IEnumerable<HitObject> EnumerateHitObjects(IBeatmap beatmap) | ||
=> enumerateRecursively(beatmap.HitObjects); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Someone reported on discord that a graved osu! map also has an issue where 1M score is unachievable, and it's because this implementation is still naive (relies on no concurrent objects to work correctly). I could go and fix that case here by partially mirroring the mania implementation (flatten all objects, sort by end time) but honestly not sure it's worth the performance hit for a graved map.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wouldn't be against this since it's to guarantee correctness. The performance hit shouldn't be noticeable. But the current changeset is also fine for now.
I think this is fine for now. We're probably going to come across more cases that need addressing (aka judgements which change ordering due to how the user plays the beatmap – one of the things we solved with the old standardised scoring but alas) but small steps forwards makes sense. |
RFC. Closes #23911.
I'll level with you, I kinda hate this diff, but I'm not sure how to do better given the constraints in place. The constraints in question being:
IKeyBindingHandler<ManiaAction>.On{Pressed,Released}()
(1, 2), which is being handled by a parentingKeyBindingContainer
+InputManager
, which propagates input events to the notes earlier than they can actually be updated themselves (due to being their parent). Ticks are judged via the normalUpdateResult()
flow, inDrawableHitObject.UpdateAfterChildren()
(3).JudgementProcessor
(which I thought I may be able to do but which ended up failing) is fooling ourselves, as there is no guarantee that every ruleset ever will follow this particular judgement ordering. Which is why I opted to expose a method that mania uses exclusively to jiggle autoplay simulation order into the order that it needs things to be in to match actual gameplay.None of this is even touching the issue of inter-column judgement order dependence, as for the matters of autoplay it has no bearing on the final result (to figure out why, consider that all judgements that happen on the same time instant and receive the same score are basically interchangeable, so they can be reordered in any way among each other without influencing the end result). But that is absolutely a concern for actual gameplay where judgements may not be perfect.