diff --git a/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs b/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs index 20e2f955df..6deb2fdb04 100644 --- a/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Taiko/Difficulty/TaikoPerformanceCalculator.cs @@ -56,9 +56,12 @@ namespace osu.Game.Rulesets.Taiko.Difficulty estimatedUnstableRate = computeDeviationUpperBound() * 10; - // The effectiveMissCount is calculated by gaining a ratio for totalSuccessfulHits and increasing the miss penalty for shorter object counts lower than 1000. - if (totalSuccessfulHits > 0) - effectiveMissCount = Math.Max(1.0, 1000.0 / totalSuccessfulHits) * countMiss; + // Effective miss count is calculated by raising the fraction of hits missed to a power based on the map's consistency factor. + // This is because in less consistently difficult maps, each miss removes more of the map's total difficulty. + effectiveMissCount = totalHits * Math.Pow( + (double)countMiss / totalHits, + Math.Pow(taikoAttributes.ConsistencyFactor, 0.2) + ); // Converts are detected and omitted from mod-specific bonuses due to the scope of current difficulty calculation. bool isConvert = score.BeatmapInfo!.Ruleset.OnlineID != 1; @@ -86,7 +89,9 @@ namespace osu.Game.Rulesets.Taiko.Difficulty double lengthBonus = 1 + 0.1 * Math.Min(1.0, totalHits / 1500.0); difficultyValue *= lengthBonus; - difficultyValue *= Math.Pow(0.986, effectiveMissCount); + // Scales miss penalty by the total hits of a map, making misses more punishing on maps with fewer objects. + double missPenalty = Math.Pow(0.5, 30.0 / totalHits); + difficultyValue *= Math.Pow(missPenalty, effectiveMissCount); if (score.Mods.Any(m => m is ModHidden)) difficultyValue *= (isConvert) ? 1.025 : 1.1;