1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-18 19:43:03 +08:00
Commit Graph

55 Commits

Author SHA1 Message Date
Dan Balasescu
655b0f5343
Merge branch 'master' into negative-frame-handling 2024-05-29 13:14:59 +09:00
Bartłomiej Dach
c9414da5d4
Merge branch 'master' into pre-mod-multiplier-score 2024-05-08 13:39:44 +02:00
Bartłomiej Dach
554ead0d9d
Decode user ID from score if available 2024-05-06 12:28:13 +02:00
Salman Ahmed
0106f1fe3e Preserve score rank on encode/decode 2024-05-01 23:31:23 +03:00
Bartłomiej Dach
2f1a4cdaa4
Export and import TotalScoreWithoutMods to replays (or recalculate if it missing) 2024-04-17 09:08:15 +02:00
Bartłomiej Dach
990a07af0e
Rewrite handling of legacy replay frame quirks to match stable closer 2024-03-21 21:11:29 +01:00
Bartłomiej Dach
c47463ee0e
Merge branch 'master' into negative-frame-handling 2024-03-21 16:45:35 +01:00
Bartłomiej Dach
6888cda02c
Make LegacyScoreDecoder.PopulateMaximumStatistics() public
For `osu-tools` consumption.
2024-01-29 21:42:38 +01:00
Bartłomiej Dach
cb87d6ce50
Move transferal of LegacyTotalScore back to original spot
This subtle detail was messing with server-side score import flows.
Server-side, legacy total score will *already* be in `LegacyTotalScore`
from the start, and `TotalScore` will be zero until recomputed via
`StandardisedScoreMigrationTools.UpdateFromLegacy()` - so in that
context, attempting to move it across is incorrect.
2024-01-23 12:42:57 +01:00
Bartłomiej Dach
4d253ebf3c
Remove redundant assertion
It does look pretty dumb to be checking if something is `null` *after
calling an instance method on it*...
2024-01-22 22:01:03 +01:00
Bartłomiej Dach
cdd6e71d01
Remove legacy computation of accuracy & ranks 2024-01-22 20:52:54 +01:00
Bartłomiej Dach
db4849442e
Unify legacy total score / accuracy / rank recomputation flows 2024-01-22 20:52:51 +01:00
Bartłomiej Dach
2958631c5d
Use lazer accuracy & rank implementations across the board 2024-01-22 20:30:16 +01:00
Bartłomiej Dach
aa8eee0796
Move maximum statistics population to LegacyScoreDecoder 2024-01-22 20:01:24 +01:00
Dean Herbert
c8521b49cd
Change S rank to require no miss 2024-01-22 21:43:32 +09:00
Bartłomiej Dach
17b9d842ab
Fix incorrect accuracy and rank population when decoding lazer replays
Closes https://github.com/ppy/osu/issues/24061.

The gist of this change is that if the `LegacyReplaySoloScoreInfo`
bolt-on is present in the replay, then it can (and is) used to recompute
the accuracy, and rank is computed based on that.

This was the missing part of
https://github.com/ppy/osu/issues/24061#issuecomment-1888438151.
The accuracy would change on import before that because the encode
process is _lossy_ if the `LegacyReplaySoloScoreInfo` bolt-on is not
used, as the legacy format only has 6 fields for encoding judgement
counts, and some judgements that affect accuracy in lazer do not fit
into that.

Note that this _only_ fixes _relatively_ new lazer scores looking wrong
after reimport.

- Very old lazer scores, i.e. ones that don't have the
  `LegacyReplaySoloScoreInfo` bolt-on, obviously can't use it
  to repopulate. There's really not much good that can be done there,
  so the stable pathways are used as a fallback that always works.

- For stable replays, `ScoreImporter` recalculates the accuracy of
  the score _again_ in

  15a5fd7e4c/osu.Game/Scoring/ScoreImporter.cs (L106-L110)

  as `StandardisedScoreMigrationTools.UpdateFromLegacy()` recomputes
  _both_ total score and accuracy.

  This makes a _semblance_ of sense as it attempts to make the accuracy
  of stable and lazer replays comparable. In most cases it also won't
  matter, as the only ruleset where accuracy changed between the legacy
  implementation and current lazer accuracy is mania.

  But it is also an inaccurate process (as, again, some of the required
  data is not in the replay, namely judgement counts of ticks
  and so on).

  For whatever's worth, a similar thing happens server-side in

  106c2948db/osu.Server.Queues.ScoreStatisticsProcessor/Commands/Queue/BatchInserter.cs (L319)

- However, _ranks_ of stable scores will still use the local stable
  reimplementation of ranks, i.e. a 1-miss stable score in osu! ruleset
  will be an A rather than an S. See importer:

  106c2948db/osu.Server.Queues.ScoreStatisticsProcessor/Commands/Queue/BatchInserter.cs (L237)

  (it's the same method which is renamed
  to `PopulateLegacyAccuracyAndRank()` in this commit).

  That is all a bit of a mess honestly, but I'm not sure where to even
  begin there...
2024-01-16 22:38:53 +01:00
Bartłomiej Dach
2baf579f7c
Serialise and deserialise ClientVersion to replays 2023-12-21 12:58:08 +01:00
Bartłomiej Dach
c53f4c144c
Encode/decode new OnlineID into/from LegacyReplaySoloScoreInfo 2023-10-16 11:20:02 +02:00
Bartłomiej Dach
fa519984df
Move legacy online ID encode/decode to legacy property 2023-10-16 11:20:02 +02:00
Liam DeVoe
04ef04b902 only ignore the first negative frame among the first 3 replay frames 2023-07-27 21:12:08 -04:00
Liam DeVoe
7d174dd8bb dont count any of first three frames towards time deficit 2023-07-27 17:20:54 -04:00
Liam DeVoe
a93561cab0 remove resolved comment 2023-07-27 02:12:43 -04:00
Liam DeVoe
217b07810f don't skip the negative break frame
investigation reveals this frame is played back by stable
2023-07-27 02:12:21 -04:00
Dean Herbert
eb81eac635 Flag decoded scores more correctly 2023-07-15 12:19:18 +09:00
Liam DeVoe
cc6646c82b properly handle negative frame before a break
this was causing replay data before the skip to be...skipped.
2023-07-06 17:13:33 -04:00
Liam DeVoe
00250972c3 skip frames after a negative frame until the negative time is "paid back" 2023-07-06 02:31:12 -04:00
Dan Balasescu
facf7de053 Parse ScoreInfo.IsLegacyScore from replays 2023-06-08 21:38:10 +09:00
PC
7e127dafe2 Update reference 2023-02-07 11:52:47 +03:00
Cootz
b00848e742 Fix realm error. Apply OriginalBeatmapHash on import 2023-02-06 13:58:41 +03:00
Salman Ahmed
e6479b73de Remove one more unused using directive 2023-01-09 23:43:35 +03:00
Salman Ahmed
f216d7264b Improve missing beatmap failure logging on score import 2023-01-09 23:06:59 +03:00
Dean Herbert
0372e38f57 Add nullability assertion to appease CI 2022-12-11 13:00:12 +09:00
Dan Balasescu
df181acffe Append lazer score data to .osr files 2022-12-07 12:12:32 +09:00
Dan Balasescu
f8830c6850 Automated #nullable processing 2022-06-17 16:37:17 +09:00
Dean Herbert
a7554dcdf7 Use a constant for the early version timing offset 2022-03-24 16:43:41 +09:00
Dean Herbert
a7d5f2281c Apply beatmap offsets to legacy replay frame handling 2022-03-24 16:16:40 +09:00
Dean Herbert
dbb08f7d46 Use OnlineID for set operations 2021-12-10 16:11:48 +09:00
Dean Herbert
bf1418bafc Use OnlineID instead of legacy IDs for equality and lookups 2021-12-10 16:11:48 +09:00
Dean Herbert
bbd3ea5b77 Update all actual usages of RulesetInfo.ID to use OnlineID instead 2021-11-24 15:50:26 +09:00
Dan Balasescu
9182eab486 Rename method + xmldoc 2021-11-17 20:45:48 +09:00
Dan Balasescu
08f129b4c8 Expose LegacyScoreDecoder.CalculateAccuracy() 2021-11-17 20:09:30 +09:00
Dean Herbert
0ecf5f201c Rename User to APIUser and move to correct namespace 2021-11-07 11:26:01 +09:00
Dean Herbert
6944151486 Apply batch fixing of built-in types using var 2021-10-27 13:04:41 +09:00
Dean Herbert
853cf6feaa Rename last remaining BeatmapInfo Beatmap usage 2021-10-04 17:35:53 +09:00
Dean Herbert
cf633973a9 Refactor exposed mod retrieval methods for better safety 2021-09-10 11:09:13 +09:00
Dean Herbert
2edb851008 Add ability to lookup mod from a type specification 2021-09-09 16:50:59 +09:00
Dean Herbert
4ee7721c51 Extract first version out to constant 2021-06-08 18:38:47 +09:00
Dean Herbert
061e3d7f26 Move legacy ScoreInfo to be completely based on presence of classic mod 2021-06-08 18:00:09 +09:00
Bartłomiej Dach
af59e2c179 Use extension methods instead of reading directly 2020-08-27 18:18:32 +02:00
Bartłomiej Dach
fc51e9d81a Fix some legacy mania replays crashing on import 2020-08-27 18:16:20 +02:00