1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 10:12:54 +08:00

removed acc changes to put in seperate PR

This commit is contained in:
Xexxar 2021-10-03 17:42:49 +00:00
parent bc3ae4c4f8
commit 94f8692b00

View File

@ -160,28 +160,25 @@ namespace osu.Game.Rulesets.Osu.Difficulty
private double computeAccuracyValue()
{
// This percentage only considers HitCircles of any value - in this part of the calculation we focus on hitting the timing hit window.
double betterAccuracyPercentage;
int amountHitObjectsWithAccuracy = Attributes.HitCircleCount;
// This section should be documented by Tr3, but effectively we're calculating the exact same way as before, but
// we calculate a variance based on the object count and # of 50s, 100s, etc. This prevents us from having cases
// where an SS on lower OD is actually worth more than a 95% on OD11, even though the OD11 requires a greater
// window of precision.
if (amountHitObjectsWithAccuracy > 0)
betterAccuracyPercentage = ((countGreat - (totalHits - amountHitObjectsWithAccuracy)) * 6 + countOk * 2 + countMeh) / (double)(amountHitObjectsWithAccuracy * 6);
else
betterAccuracyPercentage = 0;
double p100 = (2 * (double)countOk) / amountHitObjectsWithAccuracy; // this is multiplied by two to encourage better accuracy. (scales better)
double p50 = (1 * (double)countMeh) / amountHitObjectsWithAccuracy;
double pm = (1 * (double)countMiss) / amountHitObjectsWithAccuracy;
double p300 = Math.Max(0, 1.0 - pm - p100 - p50);
// It is possible to reach a negative accuracy with this formula. Cap it at zero - zero points.
if (betterAccuracyPercentage < 0)
betterAccuracyPercentage = 0;
double m300 = 79.5 - 6.0 * Attributes.OverallDifficulty;
double m100 = 139.5 - 8.0 * Attributes.OverallDifficulty;
double m50 = 199.5 - 10.0 * Attributes.OverallDifficulty;
// Lots of arbitrary values from testing.
// Considering to use derivation from perfect accuracy in a probabilistic manner - assume normal distribution.
double accuracyValue = Math.Pow(1.52163, Attributes.OverallDifficulty) * Math.Pow(betterAccuracyPercentage, 24) * 2.83;
double variance = p300 * Math.Pow(m300 / 2.0, 2.0) +
p100 * Math.Pow((m300 + m100) / 2.0, 2.0) +
p50 * Math.Pow((m100 + m50) / 2.0, 2.0);
double accuracyValue = 2.83 * Math.Pow(1.52163, (79.5 - 2 * Math.Sqrt(variance)) / 6.0)
* Math.Pow(Math.Log(1.0 + (Math.E - 1.0) * (Math.Min(amountHitObjectsWithAccuracy, 1600) / 1000.0)), 0.5);
// Bonus for many hitcircles - it's harder to keep good accuracy up for longer.
accuracyValue *= Math.Min(1.15, Math.Pow(amountHitObjectsWithAccuracy / 1000.0, 0.3));
if (mods.Any(m => m is OsuModHidden))
accuracyValue *= 1.08;