// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Game.Rulesets.Difficulty.Preprocessing; using osu.Game.Rulesets.Difficulty.Skills; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Taiko.Difficulty.Preprocessing; using osu.Game.Rulesets.Taiko.Objects; namespace osu.Game.Rulesets.Taiko.Difficulty.Skills { /// /// Calculates the stamina coefficient of taiko difficulty. /// /// /// The reference play style chosen uses two hands, with full alternating (the hand changes after every hit). /// public class Stamina : StrainDecaySkill { protected override double SkillMultiplier => 1; protected override double StrainDecayBase => 0.4; /// /// Stamina of each individual keys, calculated based on repetition speed. /// private readonly SingleKeyStamina[] keyStamina = { new SingleKeyStamina(), new SingleKeyStamina(), new SingleKeyStamina(), new SingleKeyStamina() }; /// /// Current index to for a don hit. /// private int donIndex = 1; /// /// Current index to for a kat hit. /// private int katIndex = 3; /// /// Creates a skill. /// /// Mods for use in skill calculations. public Stamina(Mod[] mods) : base(mods) { } /// /// Get the next to use for the given . /// /// The current . private SingleKeyStamina getNextSingleKeyStamina(TaikoDifficultyHitObject current) { // Alternate key for the same color. if (current.HitType == HitType.Centre) { donIndex = donIndex == 0 ? 1 : 0; return keyStamina[donIndex]; } katIndex = katIndex == 2 ? 3 : 2; return keyStamina[katIndex]; } protected override double StrainValueOf(DifficultyHitObject current) { if (!(current.BaseObject is Hit)) { return 0.0; } TaikoDifficultyHitObject hitObject = (TaikoDifficultyHitObject)current; return getNextSingleKeyStamina(hitObject).StrainValueOf(hitObject); } } }