osu
osu copied to clipboard
Improve computation of failed scores to not require increasing "miss" count
- [x] Depends on #19379
In order to display failed scores with a sane total score and an accuracy that matches the one at the point of fail, ScoringValues
is now included in local/online score models (as proposed by @smoogipoo).
To explain how this fixes the issues seen with failed scores:
- https://github.com/ppy/osu/commit/583dbb0168eee9f64c4297ab30d3a7bdfbf72059:
ScoreProcessor
will use the score's scoring values and the maximum achievable scoring values to determine the total score in theComputeScore
methods. - https://github.com/ppy/osu/commit/071b94f8fa1040b7984c9a4966a5bf9c14e27b30:
ScoreManager.GetMaximumAchievableComboAsync
will use the score's maximum achievable scoring values to determine the max combo, rather than counting the statistics. - https://github.com/ppy/osu/commit/0cb0b4beb0b5f09e2e0e6eef9094a03e7dbcd03d:
ScoreInfo.GetStatisticsForDisplay
will use the score's maximum achievable scoring values to determine the total small/large ticks in the beatmap, rather than counting the statistics.
I'm not 101% sure about the inclusion of {Large/Small}TicksCount
in ScoringValues
, but it's required to display them properly in results screen. Open for suggestions, but I found this to be the least worst way to achieve it.
failed | perfect |
---|---|
![]() |
![]() |
@smoogipoo Requesting your review in case I missed something here.
As discussed in Discord, store base_score
/bonus_score
directly in ScoreInfo
/SoloScoreInfo
instead.
I've applied the changes as discussed. Until all scores are reprocessed to provide the newly added properties, I've kept all of them nullable and fall back to the current way of retrieving it (via diffcalc or otherwise), so that no immediate breakage is incurred from this PR. I've also added a TODO comment for TotalScore
since we don't want this PR to get any larger in diff.
In addition, I've added the new properties to FrameHeader
as well so that we can remove the underlying extraction method in ScoreProcessor
altogether.
I'm not sure about the tick stuff. Also not sure how that's going to work with stable yet. Because the goal at the end of the day is for these to never be null inside
ScoreInfo
/SoloScoreInfo
.
I had thought lazer scores are now in a completely separate table with a different row structure from stable? Unless somewhere down the line lazer and stable scores are both processed by one central component?
Thanks for this PR.
I've analysed the path forward for if this or other alternatives existed https://github.com/ppy/osu/pull/19939. The conclusion is that while it simplifies calculations it makes it extremely difficult to recalculate scores. It seems like the better solution is, after all, to just store the maximum statistics. The raw JSON size is also smaller doing it that way too.