// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Linq; using osu.Game.Rulesets.Difficulty.Preprocessing; using osu.Game.Rulesets.Difficulty.Skills; using osu.Game.Rulesets.Mania.Difficulty.Preprocessing; using osu.Game.Rulesets.Objects; namespace osu.Game.Rulesets.Mania.Difficulty.Skills { public class Individual : Skill { protected override double SkillMultiplier => 1; protected override double StrainDecayBase => 0.125; private readonly double[] holdEndTimes; private readonly int column; public Individual(int column, int columnCount) { this.column = column; holdEndTimes = new double[columnCount]; } protected override double StrainValueOf(DifficultyHitObject current) { var maniaCurrent = (ManiaDifficultyHitObject)current; var endTime = maniaCurrent.BaseObject.GetEndTime(); try { if (maniaCurrent.BaseObject.Column != column) return 0; // We give a slight bonus if something is held meanwhile return holdEndTimes.Any(t => t > endTime) ? 2.5 : 2; } finally { holdEndTimes[maniaCurrent.BaseObject.Column] = endTime; } } } }