make speed bonuses additive, scale distanceBonus

This commit is contained in:
tsunyoku 2024-09-24 10:06:07 +01:00
parent f08134f443
commit 4da78a8c00
1 changed files with 5 additions and 4 deletions

View File

@ -13,6 +13,7 @@ public static class SpeedEvaluator
private const double single_spacing_threshold = 125; // 1.25 circles distance between centers
private const double min_speed_bonus = 75; // ~200BPM
private const double speed_balancing_factor = 40;
private const double distance_multiplier = 0.95;
/// <summary>
/// Evaluates the difficulty of tapping the current object, based on:
@ -51,11 +52,11 @@ public static double EvaluateDifficultyOf(DifficultyHitObject current)
strainTime /= Math.Clamp((strainTime / osuCurrObj.HitWindowGreat) / 0.93, 0.92, 1);
// speedBonus will be 1.0 for BPM < 200
double speedBonus = 1.0;
double speedBonus = 0.0;
// Add additional scaling bonus for streams/bursts higher than 200bpm
if (strainTime < min_speed_bonus)
speedBonus = 1 + 0.75 * Math.Pow((min_speed_bonus - strainTime) / speed_balancing_factor, 2);
speedBonus = 0.75 * Math.Pow((min_speed_bonus - strainTime) / speed_balancing_factor, 2);
double travelDistance = osuPrevObj?.TravelDistance ?? 0;
double distance = travelDistance + osuCurrObj.MinimumJumpDistance;
@ -64,10 +65,10 @@ public static double EvaluateDifficultyOf(DifficultyHitObject current)
distance = Math.Min(distance, single_spacing_threshold);
// Max distance bonus is 2 at single_spacing_threshold
double distanceBonus = 1 + Math.Pow(distance / single_spacing_threshold, 3.5);
double distanceBonus = Math.Pow(distance / single_spacing_threshold, 3.75) * distance_multiplier;
// Base difficulty with all bonuses
double difficulty = speedBonus * distanceBonus * 1000 / strainTime;
double difficulty = (1 + speedBonus + distanceBonus) * 1000 / strainTime;
// Apply penalty if there's doubletappable doubles
return difficulty * doubletapness;