diff --git a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/AimEvaluator.cs b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/AimEvaluator.cs index 3d1939acac..118468cce6 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/AimEvaluator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/AimEvaluator.cs @@ -24,7 +24,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators /// and slider difficulty. /// /// - public static double EvaluateDifficultyOf(DifficultyHitObject current, bool withSliderTravelDistance) + public static double EvaluateDifficultyOf(DifficultyHitObject current, bool withSliderTravelDistance, double clampPreemptTime = 0) { if (current.BaseObject is Spinner || current.Index <= 1 || current.Previous(0).BaseObject is Spinner) return 0; @@ -121,6 +121,17 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators // Add in acute angle bonus or wide angle bonus + velocity change bonus, whichever is larger. aimStrain += Math.Max(acuteAngleBonus * acute_angle_multiplier, wideAngleBonus * wide_angle_multiplier + velocityChangeBonus * velocity_change_multiplier); + if (clampPreemptTime > 0) + { + // Scale if AR is too high for high AR calc + double multiplier = osuCurrObj.StrainTime / Math.Min(osuCurrObj.StrainTime, clampPreemptTime - 150); // 150ms is considered as reaction time + double multiplierIfAR11 = osuCurrObj.StrainTime / Math.Min(osuCurrObj.StrainTime, 150); + + multiplier = Math.Min(multiplier, multiplierIfAR11); + + aimStrain *= multiplier; + } + // Add in additional slider velocity bonus. if (withSliderTravelDistance) aimStrain += sliderBonus * slider_multiplier; diff --git a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs index ea415ff5cd..468b9adc91 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Evaluators/ReadingEvaluator.cs @@ -15,7 +15,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Evaluators { private const double reading_window_size = 3000; - private const double overlap_multiplier = 0.5; + private const double overlap_multiplier = 1; public static double EvaluateDensityDifficultyOf(DifficultyHitObject current) { diff --git a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs index 414e95097a..bdafcd19b1 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs @@ -69,7 +69,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty if (mods.Any(h => h is OsuModFlashlight)) baseFlashlightPerformance = Math.Pow(flashlightRating, 2.0) * 25.0; - double baseReadingLowARPerformance = Math.Pow(readingLowARRating, 2.0) * 25.0; + double baseReadingLowARPerformance = Math.Pow(readingLowARRating, 2.5) * 17.0; double baseReadingHighARPerformance = Math.Pow(5 * Math.Max(1, readingHighARRating / 0.0675) - 4, 3) / 100000; double baseReadingHiddenPerformance = Math.Pow(readingHiddenRating, 2.0) * 25.0; diff --git a/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs b/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs index 1da3e11318..aa6428a1bd 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/OsuPerformanceCalculator.cs @@ -257,7 +257,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty private double computeReadingValue(ScoreInfo score, OsuDifficultyAttributes attributes) { - // Taking the highest value + // Taking the highest value for AR reading double readingARValue = Math.Max(computeReadingLowARValue(score, attributes), computeReadingHighARValue(score, attributes)); double readingHDValue = computeReadingHiddenValue(score, attributes); // Here would be also readingSliderValue @@ -277,8 +277,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty if (score.Mods.Any(m => m is OsuModTouchDevice)) rawReading = Math.Pow(rawReading, 0.8); - // double readingValue = Math.Pow(rawReading, 2.0) * 25.0; - double readingValue = Math.Pow(rawReading, 2.0) * 25.0; // I need to change the curve + double readingValue = Math.Pow(rawReading, 2.5) * 17.0; // Penalize misses by assessing # of misses relative to the total # of objects. Default a 3% reduction for any # of misses. if (effectiveMissCount > 0) @@ -310,8 +309,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty highARValue *= getComboScalingFactor(attributes); - // Same as Aim - highARValue *= accuracy; + highARValue *= accuracy * accuracy; // It is important to consider accuracy difficulty when scaling with accuracy. highARValue *= 0.98 + Math.Pow(attributes.OverallDifficulty, 2) / 2500; diff --git a/osu.Game.Rulesets.Osu/Difficulty/Skills/Reading.cs b/osu.Game.Rulesets.Osu/Difficulty/Skills/Reading.cs index e48c72ce69..0a97b0f0be 100644 --- a/osu.Game.Rulesets.Osu/Difficulty/Skills/Reading.cs +++ b/osu.Game.Rulesets.Osu/Difficulty/Skills/Reading.cs @@ -9,7 +9,6 @@ using osu.Game.Rulesets.Difficulty.Skills; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu.Difficulty.Evaluators; using osu.Game.Rulesets.Osu.Difficulty.Preprocessing; -using osu.Game.Rulesets.Osu.Mods; namespace osu.Game.Rulesets.Osu.Difficulty.Skills { @@ -17,7 +16,8 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills public class ReadingLowAR : GraphSkill { private readonly List difficulties = new List(); - private const double skill_multiplier = 2.4; + //private double skillMultiplier => 5.5; + private double skillMultiplier => 2.3; public ReadingLowAR(Mod[] mods) : base(mods) @@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills public override void Process(DifficultyHitObject current) { - double currentDifficulty = ReadingEvaluator.EvaluateDensityDifficultyOf(current) * skill_multiplier; + double currentDifficulty = ReadingEvaluator.EvaluateDensityDifficultyOf(current) * skillMultiplier; difficulties.Add(currentDifficulty); @@ -132,7 +132,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills { currentStrain *= strainDecay(current.DeltaTime); - double aimDifficulty = AimEvaluator.EvaluateDifficultyOf(current, true); + double aimDifficulty = AimEvaluator.EvaluateDifficultyOf(current, true, ((OsuDifficultyHitObject)current).Preempt); aimDifficulty *= ReadingEvaluator.EvaluateHighARDifficultyOf(current); currentStrain += aimDifficulty * skillMultiplier;