Closes https://github.com/ppy/osu/issues/21732.
While the problem of multiple judgements in one frame and ordering of
`RevertResult()` calls as described in the issue is a real one, this
commit is a bit of a sidestep of the entire issue.
The idea here that while *snapshots* of instantaneous combo values are
susceptible to such ordering foibles on revert, *deltas* are not - and
such, when deltas are using to update the combo counts on revert,
ordering stops mattering so much.
As spotted in https://github.com/ppy/osu/pull/33191/checks?check_run_id=42460062656
Seems like just a bog-standard race. Could be reproduced via
diff --git a/osu.Game/Screens/Ranking/SoloResultsScreen.cs b/osu.Game/Screens/Ranking/SoloResultsScreen.cs
index d11e7db178..1a594fd21b 100644
--- a/osu.Game/Screens/Ranking/SoloResultsScreen.cs
+++ b/osu.Game/Screens/Ranking/SoloResultsScreen.cs
@@ -45,6 +45,8 @@ protected override async Task<ScoreInfo[]> FetchScores()
if (Score.BeatmapInfo!.OnlineID <= 0 || Score.BeatmapInfo.Status <= BeatmapOnlineStatus.Pending)
return [];
+ await Task.Delay(5000).ConfigureAwait(false);
+
var criteria = new LeaderboardCriteria(
Score.BeatmapInfo!,
Score.Ruleset,
Closes https://github.com/ppy/osu/issues/27589.
Follows osu! spinner precedent in storing the holding state to the
judgement result rather than attempting to keep it in the DHO (which is
prone to getting dropped on pool re-use).
This was already being done on the old carousel (see `ApplyState`
methods) but wasn't correctly on new carousel.
Importantly, `FreeAfterUse` alone is not enough due to transitions. We
want to immediately stop calculation as soon as a panel is marked
non-visible.
There's no bindable flow for this so it's performed in `Update`. I don't
see this as an issue.