diff --git a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
index b83e504a7a..fdcc6f44a6 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
@@ -32,8 +32,8 @@ namespace osu.Game.Rulesets.Osu.Difficulty
if (beatmap.HitObjects.Count == 0)
return new OsuDifficultyAttributes { Mods = mods, Skills = skills };
- double aimRating = Math.Sqrt((skills[0] as OsuSkill).OsuDifficultyValue()) * difficulty_multiplier;
- double speedRating = Math.Sqrt((skills[1] as OsuSkill).OsuDifficultyValue()) * difficulty_multiplier;
+ double aimRating = Math.Sqrt((skills[0] as OsuStrainSkill).OsuDifficultyValue()) * difficulty_multiplier;
+ double speedRating = Math.Sqrt((skills[1] as OsuStrainSkill).OsuDifficultyValue()) * difficulty_multiplier;
double starRating = aimRating + speedRating + Math.Abs(aimRating - speedRating) / 2;
HitWindows hitWindows = new OsuHitWindows();
diff --git a/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs b/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
index b7bb10a87e..a95bf4fa94 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/Skills/Aim.cs
@@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
///
/// Represents the skill required to correctly aim at every object in the map with a uniform CircleSize and normalized distances.
///
- public class Aim : OsuSkill
+ public class Aim : OsuStrainSkill
{
private const double angle_bonus_begin = Math.PI / 3;
private const double timing_threshold = 107;
diff --git a/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuSkill.cs b/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs
similarity index 64%
rename from osu.Game.Rulesets.Osu/Difficulty/Skills/OsuSkill.cs
rename to osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs
index d52b95d3ec..f1c7ae3403 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuSkill.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/Skills/OsuStrainSkill.cs
@@ -8,9 +8,13 @@ using System.Linq;
namespace osu.Game.Rulesets.Osu.Difficulty.Skills
{
- public abstract class OsuSkill : StrainSkill
+ public abstract class OsuStrainSkill : StrainSkill
{
- public OsuSkill(Mod[] mods) : base(mods)
+ protected virtual int ReducedSectionCount => 9;
+ protected virtual double ReducedStrainBaseline => 0.68;
+ protected virtual double DifficultyMultiplier => 1.06;
+
+ public OsuStrainSkill(Mod[] mods) : base(mods)
{
}
@@ -22,11 +26,9 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
double strainMultiplier;
List strains = GetCurrentStrainPeaks().OrderByDescending(d => d).ToList();
- double baseLine = 0.68;
-
- for (int i = 0; i <= 9; i++)
+ for (int i = 0; i < ReducedSectionCount; i++)
{
- strainMultiplier = baseLine + Math.Log10(i+1) * (1.0 - baseLine);
+ strainMultiplier = ReducedStrainBaseline + Math.Log10(i * 9.0 / ReducedSectionCount + 1) * (1.0 - ReducedStrainBaseline);
strains[i] = strains[i] * strainMultiplier;
}
@@ -38,7 +40,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
weight *= DecayWeight;
}
- return difficulty * 1.06;
+ return difficulty * DifficultyMultiplier;
}
}
}
diff --git a/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs b/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs
index 975a633bad..0d8400badc 100644
--- a/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs
+++ b/osu.Game.Rulesets.Osu/Difficulty/Skills/Speed.cs
@@ -13,7 +13,7 @@ namespace osu.Game.Rulesets.Osu.Difficulty.Skills
///
/// Represents the skill required to press keys with regards to keeping up with the speed at which objects need to be hit.
///
- public class Speed : OsuSkill
+ public class Speed : OsuStrainSkill
{
private const double single_spacing_threshold = 125;