diff --git a/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs b/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs index a9c6ce3dd729..90fe4a05c76b 100644 --- a/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Catch/Difficulty/CatchPerformanceCalculator.cs @@ -35,7 +35,9 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s num100 = score.GetCount100() ?? 0; // HitResult.LargeTickHit num50 = score.GetCount50() ?? 0; // HitResult.SmallTickHit numKatu = score.GetCountKatu() ?? 0; // HitResult.SmallTickMiss - numMiss = score.GetCountMiss() ?? 0; // HitResult.Miss PLUS HitResult.LargeTickMiss + numMiss = Math.Max(0, score.GetCountMiss() ?? 0); // HitResult.Miss PLUS HitResult.LargeTickMiss + + double scoreMaxCombo = Math.Clamp(score.MaxCombo, 0, catchAttributes.MaxCombo); // We are heavily relying on aim in catch the beat double value = DiffUtils.Pow(5.0 * Math.Max(1.0, catchAttributes.StarRating / 0.0049) - 4.0, 2.0) / 100000.0; @@ -52,7 +54,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s // Combo scaling if (catchAttributes.MaxCombo > 0) - value *= Math.Min(DiffUtils.Pow(score.MaxCombo, 0.35) / DiffUtils.Pow(catchAttributes.MaxCombo, 0.35), 1.0); + value *= Math.Min(DiffUtils.Pow(scoreMaxCombo, 0.35) / DiffUtils.Pow(catchAttributes.MaxCombo, 0.35), 1.0); var difficulty = score.BeatmapInfo!.Difficulty.Clone(); diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 778d569cf259..6d6b4db99222 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -35,8 +35,8 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countGood = score.Statistics.GetValueOrDefault(HitResult.Good); countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); - countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - scoreAccuracy = calculateCustomAccuracy(); + countMiss = Math.Max(0, score.Statistics.GetValueOrDefault(HitResult.Miss)); + scoreAccuracy = Math.Clamp(calculateCustomAccuracy(), 0, 1); double multiplier = 1.0; diff --git a/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs b/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs index eb721be5c070..c1ae239a1ecd 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs @@ -78,8 +78,8 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s usingClassicSliderAccuracy = score.Mods.OfType().Any(m => m.NoSliderHeadAccuracy.Value); usingScoreV2 = score.Mods.Any(m => m is ModScoreV2); - accuracy = score.Accuracy; - scoreMaxCombo = score.MaxCombo; + accuracy = Math.Clamp(score.Accuracy, 0, 1); + scoreMaxCombo = Math.Clamp(score.MaxCombo, 0, osuAttributes.MaxCombo); countGreat = score.Statistics.GetValueOrDefault(HitResult.Great); countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); @@ -123,6 +123,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s effectiveMissCount = Math.Max(countMiss, effectiveMissCount); effectiveMissCount = Math.Min(totalHits, effectiveMissCount); + effectiveMissCount = Math.Max(0, effectiveMissCount); if (effectiveMissCount > 0) { diff --git a/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs b/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs index bbb24ff732de..b15cadddef3d 100644 --- a/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs @@ -41,7 +41,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countGreat = score.Statistics.GetValueOrDefault(HitResult.Great); countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); - countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); + countMiss = Math.Max(0, score.Statistics.GetValueOrDefault(HitResult.Miss)); clockRate = ModUtils.CalculateRateWithMods(score.Mods);