1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-23 21:00:27 +08:00

osu!taiko new miss penalty using consistency factor (#33409)

* New formulas for effective miss count and penalty

* More elaborate comments

* More comment stuff
This commit is contained in:
Eloise
2025-06-08 23:47:26 +01:00
committed by GitHub
Unverified
parent c4b07413b1
commit 5df41c08f4
@@ -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;