// 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 JetBrains.Annotations; using Newtonsoft.Json; using osu.Framework.Bindables; using osu.Framework.Lists; using osu.Game.Beatmaps.ControlPoints; namespace osu.Game.Beatmaps.Legacy { public class LegacyControlPointInfo : ControlPointInfo { /// /// All sound points. /// [JsonProperty] public IBindableList SamplePoints => samplePoints; private readonly BindableList samplePoints = new BindableList(); /// /// Finds the sound control point that is active at . /// /// The time to find the sound control point at. /// The sound control point. [NotNull] public SampleControlPoint SamplePointAt(double time) => BinarySearchWithFallback(SamplePoints, time, SamplePoints.Count > 0 ? SamplePoints[0] : SampleControlPoint.DEFAULT); /// /// All difficulty points. /// [JsonProperty] public IReadOnlyList DifficultyPoints => difficultyPoints; private readonly SortedList difficultyPoints = new SortedList(Comparer.Default); /// /// Finds the difficulty control point that is active at . /// /// The time to find the difficulty control point at. /// The difficulty control point. [NotNull] public DifficultyControlPoint DifficultyPointAt(double time) => BinarySearchWithFallback(DifficultyPoints, time, DifficultyControlPoint.DEFAULT); public override void Clear() { base.Clear(); samplePoints.Clear(); difficultyPoints.Clear(); } protected override bool CheckAlreadyExisting(double time, ControlPoint newPoint) { switch (newPoint) { case SampleControlPoint _: // intentionally don't use SamplePointAt (we always need to consider the first sample point). var existing = BinarySearch(SamplePoints, time); return newPoint.IsRedundant(existing); case DifficultyControlPoint _: return newPoint.IsRedundant(DifficultyPointAt(time)); default: return base.CheckAlreadyExisting(time, newPoint); } } protected override void GroupItemAdded(ControlPoint controlPoint) { switch (controlPoint) { case SampleControlPoint typed: samplePoints.Add(typed); break; case DifficultyControlPoint typed: difficultyPoints.Add(typed); break; } base.GroupItemAdded(controlPoint); } protected override void GroupItemRemoved(ControlPoint controlPoint) { switch (controlPoint) { case SampleControlPoint typed: samplePoints.Remove(typed); break; case DifficultyControlPoint typed: difficultyPoints.Remove(typed); break; } base.GroupItemRemoved(controlPoint); } } }