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;