diff --git a/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs b/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs
index bb666eb528..473c205293 100644
--- a/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs
+++ b/osu.Game.Rulesets.Taiko/Difficulty/TaikoDifficultyCalculator.cs
@@ -27,54 +27,33 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
///
private const double decay_weight = 0.9;
- ///
- /// HitObjects are stored as a member variable.
- ///
- private readonly List difficultyHitObjects = new List();
-
- public TaikoDifficultyCalculator(IBeatmap beatmap)
- : base(beatmap)
+ public TaikoDifficultyCalculator(Ruleset ruleset, WorkingBeatmap beatmap)
+ : base(ruleset, beatmap)
{
}
- public TaikoDifficultyCalculator(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();
-
- foreach (var hitObject in Beatmap.HitObjects)
+ foreach (var hitObject in beatmap.HitObjects)
difficultyHitObjects.Add(new TaikoHitObjectDifficulty((TaikoHitObject)hitObject));
// Sort DifficultyHitObjects by StartTime of the HitObjects - just to make sure.
difficultyHitObjects.Sort((a, b) => a.BaseHitObject.StartTime.CompareTo(b.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);
}
- protected override Mod[] DifficultyAdjustmentMods => new Mod[]
- {
- new TaikoModDoubleTime(),
- new TaikoModHalfTime(),
- new TaikoModEasy(),
- new TaikoModHardRock(),
- };
-
- 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;
@@ -84,7 +63,7 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
while (hitObjectsEnumerator.MoveNext())
{
var next = hitObjectsEnumerator.Current;
- next?.CalculateStrains(current, TimeRate);
+ next?.CalculateStrains(current, timeRate);
current = next;
}
@@ -92,9 +71,9 @@ namespace osu.Game.Rulesets.Taiko.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();
@@ -102,7 +81,7 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
double maximumStrain = 0; // We need to keep track of the maximum strain in the current interval
TaikoHitObjectDifficulty 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)
@@ -144,5 +123,13 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
return difficulty;
}
+
+ protected override Mod[] DifficultyAdjustmentMods => new Mod[]
+ {
+ new TaikoModDoubleTime(),
+ new TaikoModHalfTime(),
+ new TaikoModEasy(),
+ new TaikoModHardRock(),
+ };
}
}
diff --git a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs
index 225461fd6f..1b34ab68bd 100644
--- a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs
+++ b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs
@@ -114,7 +114,7 @@ namespace osu.Game.Rulesets.Taiko
public override Drawable CreateIcon() => new SpriteIcon { Icon = FontAwesome.fa_osu_taiko_o };
- public override DifficultyCalculator CreateDifficultyCalculator(IBeatmap beatmap, Mod[] mods = null) => new TaikoDifficultyCalculator(beatmap, mods);
+ public override DifficultyCalculator CreateDifficultyCalculator(WorkingBeatmap beatmap) => new TaikoDifficultyCalculator(this, beatmap);
public override PerformanceCalculator CreatePerformanceCalculator(IBeatmap beatmap, Score score) => new TaikoPerformanceCalculator(this, beatmap, score);