Commit Graph

168 Commits

Author SHA1 Message Date
Givikap120 e6fc4f6766 merged multipliers 2024-08-05 16:33:42 +03:00
Givikap120 f5d2c549cb Update CatchPerformanceCalculator.cs 2024-05-29 19:25:58 +03:00
Bartłomiej Dach b896d97a4f
Fix catch pp calculator not matching live with respect to miss handling 2024-03-04 11:53:59 +01:00
Bartłomiej Dach 7c9adc7ad3
Fix incorrect score conversion on selected beatmaps due to incorrect `difficultyPeppyStars` rounding
Fixes issue that occurs on *about* 246 beatmaps and was first described
by me on discord:

    https://discord.com/channels/188630481301012481/188630652340404224/1154367700378865715

and then rediscovered again during work on
https://github.com/ppy/osu/pull/26405:

    https://gist.github.com/bdach/414d5289f65b0399fa8f9732245a4f7c#venenog-on-ultmate-end-by-blacky-overdose-631

It so happens that in stable, due to .NET Framework internals, float
math would be performed using x87 registers and opcodes.
.NET (Core) however uses SSE instructions on 32- and 64-bit words.
x87 registers are _80 bits_ wide. Which is notably wider than _both_
float and double. Therefore, on a significant number of beatmaps,
the rounding would not produce correct values due to insufficient
precision.

See following gist for corroboration of the above:

    https://gist.github.com/bdach/dcde58d5a3607b0408faa3aa2b67bf10

Thus, to crudely - but, seemingly accurately, after checking across
all ranked maps - emulate this, use `decimal`, which is slow, but has
bigger precision than `double`. The single known exception beatmap
in whose case this results in an incorrect result is

    https://osu.ppy.sh/beatmapsets/1156087#osu/2625853

which is considered an "acceptable casualty" of sorts.

Doing this requires some fooling of the compiler / runtime (see second
inline comment in new method). To corroborate that this is required,
you can try the following code snippet:

    Console.WriteLine(string.Join(' ', BitConverter.GetBytes(1.3f).Select(x => x.ToString("X2"))));
    Console.WriteLine(string.Join(' ', BitConverter.GetBytes(1.3).Select(x => x.ToString("X2"))));
    Console.WriteLine();

    decimal d1 = (decimal)1.3f;
    decimal d2 = (decimal)1.3;
    decimal d3 = (decimal)(double)1.3f;

    Console.WriteLine(string.Join(' ', decimal.GetBits(d1).SelectMany(BitConverter.GetBytes).Select(x => x.ToString("X2"))));
    Console.WriteLine(string.Join(' ', decimal.GetBits(d2).SelectMany(BitConverter.GetBytes).Select(x => x.ToString("X2"))));
    Console.WriteLine(string.Join(' ', decimal.GetBits(d3).SelectMany(BitConverter.GetBytes).Select(x => x.ToString("X2"))));

which will print

    66 66 A6 3F
    CD CC CC CC CC CC F4 3F

    0D 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
    0D 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
    8C 5D 89 FB 3B 76 00 00 00 00 00 00 00 00 0E 00

Note that despite `d1` being converted from a less-precise floating-
-point value than `d2`, it still is represented 100% accurately as
a decimal number.

After applying this change, recomputation of legacy scoring attributes
for *all* rulesets will be required.
2024-01-10 19:30:18 +01:00
Dan Balasescu 6b4b2a57fc
Expose only as one method 2023-12-21 14:58:23 +09:00
Dan Balasescu 4e3b994142
Relocate HitResult numeric score to ScoreProcessor 2023-12-21 14:52:31 +09:00
Dan Balasescu 30116512ca
Populate MaxCombo scoring attrib for non-osu rulesets 2023-12-18 12:01:51 +09:00
Dan Balasescu c255339999
Merge branch 'master' into catch-hyperdash-stable-sort 2023-12-13 12:40:39 +09:00
Bartłomiej Dach 0652ea316d
Merge branch 'master' into catch-hyperdash-stable-sort 2023-12-04 09:05:42 +01:00
Zyf 71e5654b64 Account for legacyAccScore in score conversion 2023-11-24 23:07:27 +01:00
Dan Balasescu bbe9d95b3d
Merge branch 'master' into catch-hyperdash-stable-sort 2023-10-04 20:38:08 +09:00
Dan Balasescu da2a4681d9 Add method to retrieve legacy score multiplier 2023-10-02 16:52:01 +09:00
Dan Balasescu 4e1800860e
Merge branch 'master' into catch-hyperdash-stable-sort 2023-09-19 10:10:57 +09:00
Dan Balasescu 2334be1987 Split legacy scoring attributes into a separate object 2023-09-07 21:10:38 +09:00
Dean Herbert 1629024111 `ILegacyScoreProcessor` -> `ILegacyScoreSimulator` 2023-07-04 17:32:54 +09:00
Dan Balasescu 09bc8e45de Refactoring 2023-06-28 16:14:32 +09:00
Dan Balasescu 5f350aa66f Fix float division
Firstly, this is intended to be a float division.

Secondly, dividing integers by 0 results in an exception, but dividing
non-zero floats by 0 results in +/- infinity which will be clamped to
the upper range.
In particular, this occurs when the beatmap has 1 hitobject (0 drain
length).
2023-06-27 17:14:35 +09:00
Dan Balasescu a9c65d200a Initial conversion of scores 2023-06-26 22:19:01 +09:00
Dan Balasescu 06565871d6 Add flag to disable computing legacy scoring values 2023-06-24 01:03:18 +09:00
Dan Balasescu 87447f41d0 Fix incorrect calculation of difficulty 2023-06-24 00:58:45 +09:00
Dan Balasescu bfa449e47a Adjust attribute data 2023-06-19 21:38:13 +09:00
Dan Balasescu 3ec97121e1 Add ScoreV1 calculation for CatchRuleset 2023-06-13 19:41:39 +09:00
Dan Balasescu e402c6d2b4 Write max combo attribute from base class 2023-06-02 21:53:25 +09:00
ekrctb 491ba13b6f Factor out palpable obejct enumeration logic 2023-02-03 14:07:21 +09:00
ekrctb 3ab3f556ae Remove #nullable disable from Catch.Difficulty 2023-01-15 17:29:32 +09:00
Dean Herbert aca19a005e Add versioning to difficulty calculators 2022-07-21 18:15:25 +09:00
Dan Balasescu 0fd2c010e5 Remove NRT disables from attributes classes 2022-06-27 16:07:15 +09:00
Dan Balasescu 0579780bb8 Add IBeatmapOnlineInfo parameter and use to extract more data 2022-06-27 16:07:15 +09:00
Dan Balasescu f8830c6850 Automated #nullable processing 2022-06-17 16:37:17 +09:00
Dan Balasescu 6d2a2ba7d6 Rename Position -> Index 2022-06-09 18:49:11 +09:00
apollo-dw 66a6467403 Pass object position to the object 2022-05-26 19:26:14 +01:00
apollo-dw 30b9e0e7ab Use object list size for object position 2022-05-24 16:30:25 +01:00
apollo-dw 26985ca8af Store hitobject history in the hitobject 2022-05-22 16:26:22 +01:00
Dan Balasescu 523f668c8c Remove unnecessary ctor argument 2022-03-15 12:37:39 +09:00
Dan Balasescu 4a3e3aba65 Restructure PerformanceCalculator to not require ScoreInfo argument 2022-03-14 14:25:28 +09:00
Dan Balasescu 84e82ef5e4 Add XMLDocs to difficulty attribute properties 2022-02-16 14:09:19 +09:00
StanR 40b3ce0ade Clean up comments 2021-12-21 14:03:24 +03:00
StanR cca02a8016 Create PerformanceAttributes 2021-12-21 13:08:31 +03:00
StanR 2f2006715e Slightly refactor difficulty and pp calculators 2021-12-17 23:40:23 +03:00
Dean Herbert 9f688f6291 Stop persisting `Skill`s in `DifficultyAttributes` 2021-11-21 12:15:32 +09:00
Dean Herbert fd0cae2bfb
Merge branch 'master' into difficulty-attribute-helpers 2021-11-17 20:49:31 +09:00
Dan Balasescu 815179f713 Use consts for attribute IDs 2021-11-17 20:31:18 +09:00
Dean Herbert 369b4ba789 Update `DifficultyCalculator` to take an `IRulesetInfo` 2021-11-15 19:16:48 +09:00
Dean Herbert 62d670a3ca Update `DifficultyCalculator` to take an `IWorkingBeatmap` 2021-11-15 19:16:48 +09:00
Dan Balasescu c8a01c35f7 Remove extra members from FromDatabaseAttributes 2021-11-15 18:11:07 +09:00
Dan Balasescu 0cfd6fdf04 Add to/from database mapping functions to difficulty attributes 2021-11-15 16:06:50 +09:00
Dan Balasescu 907499f73a Add json properties to difficulty attributes 2021-11-15 16:06:29 +09:00
Dean Herbert 6944151486 Apply batch fixing of built-in types using `var` 2021-10-27 13:04:41 +09:00
Dean Herbert b339c149d8 Copy `BaseDifficulty` to `Beatmap<T>` and move all write operations across 2021-10-06 15:10:45 +09:00
Dean Herbert 05996cc2e9 Add changes that got forgotted in branch surgery 2021-10-01 17:04:53 +09:00