// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System.Collections.Generic; using System.Linq; namespace osu.Game.Rulesets.Taiko.Difficulty.Preprocessing.Rhythm.Data { /// /// Represents grouped by their 's interval. /// public class SamePatterns : SameRhythm { public SamePatterns? Previous { get; private set; } /// /// The between children within this group. /// If there is only one child, this will have the value of the first child's . /// public double ChildrenInterval => Children.Count > 1 ? Children[1].Interval : Children[0].Interval; /// /// The ratio of between this and the previous . In the /// case where there is no previous , this will have a value of 1. /// public double IntervalRatio => ChildrenInterval / Previous?.ChildrenInterval ?? 1.0d; public TaikoDifficultyHitObject FirstHitObject => Children[0].FirstHitObject; public IEnumerable AllHitObjects => Children.SelectMany(child => child.Children); private SamePatterns(SamePatterns? previous, List data, ref int i) : base(data, ref i, 5) { Previous = previous; foreach (TaikoDifficultyHitObject hitObject in AllHitObjects) { hitObject.Rhythm.SamePatterns = this; } } public static void GroupPatterns(List data) { List samePatterns = new List(); // Index does not need to be incremented, as it is handled within the SameRhythm constructor. for (int i = 0; i < data.Count;) { SamePatterns? previous = samePatterns.Count > 0 ? samePatterns[^1] : null; samePatterns.Add(new SamePatterns(previous, data, ref i)); } } } }