From d2bfe8c615d3339c8a99d4f853c108ed7fa1f0d6 Mon Sep 17 00:00:00 2001 From: Ben Zeng <38169671+BenZeng04@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:59:35 -0500 Subject: [PATCH] Fix incorrectly merged SpeedEvaluator --- .../Difficulty/Evaluators/SpeedEvaluator.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/SpeedEvaluator.cs b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/SpeedEvaluator.cs index a5f6468f17..ede15cf3d2 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/SpeedEvaluator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/SpeedEvaluator.cs @@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators /// and how easily they can be cheesed. /// /// - public static double EvaluateDifficultyOf(DifficultyHitObject current) + public static double EvaluateDifficultyOf(DifficultyHitObject current, bool tappedWithTouch) { if (current.BaseObject is Spinner) return 0; @@ -40,12 +40,15 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators // 0.93 is derived from making sure 260bpm OD8 streams aren't nerfed harshly, whilst 0.92 limits the effect of the cap. strainTime /= Math.Clamp((strainTime / osuCurrObj.HitWindowGreat) / 0.93, 0.92, 1); + // Single-tapping the object with a touch device means the assumption that the object is pressed in an alternate fashion is incorrect. + double effectiveStrainTime = tappedWithTouch ? strainTime / 2 : strainTime; + // speedBonus will be 0.0 for BPM < 200 double speedBonus = 0.0; // Add additional scaling bonus for streams/bursts higher than 200bpm - if (DifficultyCalculationUtils.MillisecondsToBPM(strainTime) > min_speed_bonus) - speedBonus = 0.75 * Math.Pow((DifficultyCalculationUtils.BPMToMilliseconds(min_speed_bonus) - strainTime) / speed_balancing_factor, 2); + if (DifficultyCalculationUtils.MillisecondsToBPM(effectiveStrainTime) > min_speed_bonus) + speedBonus = 0.75 * Math.Pow((DifficultyCalculationUtils.BPMToMilliseconds(min_speed_bonus) - effectiveStrainTime) / speed_balancing_factor, 2); double travelDistance = osuPrevObj?.TravelDistance ?? 0; double distance = travelDistance + osuCurrObj.MinimumJumpDistance; @@ -57,7 +60,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators double distanceBonus = Math.Pow(distance / single_spacing_threshold, 3.95) * distance_multiplier; // Base difficulty with all bonuses - double difficulty = (1 + speedBonus + distanceBonus) * 1000 / strainTime; + double difficulty = (1 + speedBonus + distanceBonus) * 1000 / effectiveStrainTime; // Apply penalty if there's doubletappable doubles return difficulty * doubletapness;