diff --git a/osu.Game.Rulesets.Taiko/Difficulty/Skills/Colour.cs b/osu.Game.Rulesets.Taiko/Difficulty/Skills/Colour.cs
index a348c25331..db445c7d27 100644
--- a/osu.Game.Rulesets.Taiko/Difficulty/Skills/Colour.cs
+++ b/osu.Game.Rulesets.Taiko/Difficulty/Skills/Colour.cs
@@ -19,7 +19,14 @@ namespace osu.Game.Rulesets.Taiko.Difficulty.Skills
private HitType? previousHitType;
+ ///
+ /// Length of the current mono pattern.
+ ///
private int currentMonoLength = 1;
+
+ ///
+ /// List of the last most recent mono patterns, with the most recent at the end of the list.
+ ///
private readonly List monoHistory = new List();
protected override double StrainValueOf(DifficultyHitObject current)
@@ -36,12 +43,20 @@ namespace osu.Game.Rulesets.Taiko.Difficulty.Skills
if (taikoCurrent.HitType != null && previousHitType != null && taikoCurrent.HitType != previousHitType)
{
+ // The colour has changed.
objectStrain = 1.0;
if (monoHistory.Count < 2)
+ {
+ // There needs to be at least two streaks to determine a strain.
objectStrain = 0.0;
+ }
else if ((monoHistory[^1] + currentMonoLength) % 2 == 0)
+ {
+ // The last streak in the history is guaranteed to be a different type to the current streak.
+ // If the total number of notes in the two streaks is even, apply a penalty.
objectStrain *= sameParityPenalty();
+ }
objectStrain *= repetitionPenalties();
currentMonoLength = 1;
@@ -55,11 +70,14 @@ namespace osu.Game.Rulesets.Taiko.Difficulty.Skills
return objectStrain;
}
- private double sameParityPenalty()
- {
- return 0.0;
- }
+ ///
+ /// The penalty to apply when the total number of notes in the two most recent colour streaks is even.
+ ///
+ private double sameParityPenalty() => 0.0;
+ ///
+ /// The penalty to apply due to the length of repetition in colour streaks.
+ ///
private double repetitionPenalties()
{
double penalty = 1.0;
@@ -96,10 +114,6 @@ namespace osu.Game.Rulesets.Taiko.Difficulty.Skills
return penalty;
}
- private double repetitionPenalty(int notesSince)
- {
- double n = notesSince;
- return Math.Min(1.0, 0.032 * n);
- }
+ private double repetitionPenalty(int notesSince) => Math.Min(1.0, 0.032 * notesSince);
}
}