diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs
index ca2002b7c9..9c091ac31a 100644
--- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs
+++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs
@@ -29,47 +29,33 @@ namespace osu.Game.Rulesets.Mania.Difficulty
///
private const double decay_weight = 0.9;
- ///
- /// HitObjects are stored as a member variable.
- ///
- private readonly List difficultyHitObjects = new List();
-
- public ManiaDifficultyCalculator(IBeatmap beatmap)
- : base(beatmap)
+ public ManiaDifficultyCalculator(Ruleset ruleset, WorkingBeatmap beatmap)
+ : base(ruleset, beatmap)
{
}
- public ManiaDifficultyCalculator(IBeatmap beatmap, Mod[] mods)
- : base(beatmap, mods)
+ protected override DifficultyAttributes Calculate(IBeatmap beatmap, Mod[] mods, double timeRate)
{
- }
+ var difficultyHitObjects = new List();
- public override double Calculate(Dictionary categoryDifficulty = null)
- {
- // Fill our custom DifficultyHitObject class, that carries additional information
- difficultyHitObjects.Clear();
-
- int columnCount = (Beatmap as ManiaBeatmap)?.TotalColumns ?? 7;
+ int columnCount = ((ManiaBeatmap)beatmap).TotalColumns;
// Sort DifficultyHitObjects by StartTime of the HitObjects - just to make sure.
// Note: Stable sort is done so that the ordering of hitobjects with equal start times doesn't change
- difficultyHitObjects.AddRange(Beatmap.HitObjects.Select(h => new ManiaHitObjectDifficulty((ManiaHitObject)h, columnCount)).OrderBy(h => h.BaseHitObject.StartTime));
+ difficultyHitObjects.AddRange(beatmap.HitObjects.Select(h => new ManiaHitObjectDifficulty((ManiaHitObject)h, columnCount)).OrderBy(h => h.BaseHitObject.StartTime));
- if (!calculateStrainValues())
- return 0;
+ if (!calculateStrainValues(difficultyHitObjects, timeRate))
+ return new DifficultyAttributes(mods, 0);
- double starRating = calculateDifficulty() * star_scaling_factor;
+ double starRating = calculateDifficulty(difficultyHitObjects, timeRate) * star_scaling_factor;
- if (categoryDifficulty != null)
- categoryDifficulty["Strain"] = starRating;
-
- return starRating;
+ return new DifficultyAttributes(mods, starRating);
}
- private bool calculateStrainValues()
+ private bool calculateStrainValues(List objects, double timeRate)
{
// Traverse hitObjects in pairs to calculate the strain value of NextHitObject from the strain value of CurrentHitObject and environment.
- using (List.Enumerator hitObjectsEnumerator = difficultyHitObjects.GetEnumerator())
+ using (var hitObjectsEnumerator = objects.GetEnumerator())
{
if (!hitObjectsEnumerator.MoveNext())
return false;
@@ -80,7 +66,7 @@ namespace osu.Game.Rulesets.Mania.Difficulty
while (hitObjectsEnumerator.MoveNext())
{
var next = hitObjectsEnumerator.Current;
- next?.CalculateStrains(current, TimeRate);
+ next?.CalculateStrains(current, timeRate);
current = next;
}
@@ -88,9 +74,9 @@ namespace osu.Game.Rulesets.Mania.Difficulty
}
}
- private double calculateDifficulty()
+ private double calculateDifficulty(List objects, double timeRate)
{
- double actualStrainStep = strain_step * TimeRate;
+ double actualStrainStep = strain_step * timeRate;
// Find the highest strain value within each strain step
List highestStrains = new List();
@@ -98,7 +84,7 @@ namespace osu.Game.Rulesets.Mania.Difficulty
double maximumStrain = 0; // We need to keep track of the maximum strain in the current interval
ManiaHitObjectDifficulty previousHitObject = null;
- foreach (var hitObject in difficultyHitObjects)
+ foreach (var hitObject in objects)
{
// While we are beyond the current interval push the currently available maximum to our strain list
while (hitObject.BaseHitObject.StartTime > intervalEndTime)
@@ -159,5 +145,6 @@ namespace osu.Game.Rulesets.Mania.Difficulty
new ManiaModKey8(),
new ManiaModKey9(),
};
+
}
}
diff --git a/osu.Game.Rulesets.Mania/ManiaRuleset.cs b/osu.Game.Rulesets.Mania/ManiaRuleset.cs
index e671a3fb14..1b7a8f77b3 100644
--- a/osu.Game.Rulesets.Mania/ManiaRuleset.cs
+++ b/osu.Game.Rulesets.Mania/ManiaRuleset.cs
@@ -147,7 +147,7 @@ namespace osu.Game.Rulesets.Mania
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_mania_o };
- public override DifficultyCalculator CreateDifficultyCalculator(IBeatmap beatmap, Mod[] mods = null) => new ManiaDifficultyCalculator(beatmap, mods);
+ public override DifficultyCalculator CreateDifficultyCalculator(WorkingBeatmap beatmap) => new ManiaDifficultyCalculator(this, beatmap);
public override int? LegacyID => 3;