// Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using OpenTK; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.MathUtils; using System; namespace osu.Game.Rulesets.Mania.Beatmaps { internal abstract class ObjectConversion { protected readonly int AvailableColumns; protected readonly int RandomStart; protected ObjectList PreviousObjects; protected readonly FastRandom Random; protected readonly Beatmap Beatmap; protected ObjectConversion(ObjectList previousObjects, FastRandom random, Beatmap beatmap) { PreviousObjects = previousObjects; Random = random; Beatmap = beatmap; AvailableColumns = (int)Math.Round(beatmap.BeatmapInfo.Difficulty.CircleSize); RandomStart = AvailableColumns == 8 ? 1 : 0; } /// /// Generates a new object list filled with converted hit objects. /// /// The containing the hit objects. public abstract ObjectList Generate(); /// /// Converts an x-position into a column. /// /// The x-position. /// Whether to treat as 7K + 1. /// The column. protected int GetColumn(float position, bool allowSpecial = false) { if (allowSpecial && AvailableColumns == 8) { const float local_x_divisor = 512f / 7; return MathHelper.Clamp((int)Math.Floor(position / local_x_divisor), 0, 6) + 1; } float localXDivisor = 512f / AvailableColumns; return MathHelper.Clamp((int)Math.Floor(position / localXDivisor), 0, AvailableColumns - 1); } /// /// Generates a count of notes to be generated from probabilities. /// /// Probability for 2 notes to be generated. /// Probability for 3 notes to be generated. /// Probability for 4 notes to be generated. /// Probability for 5 notes to be generated. /// Probability for 6 notes to be generated. /// The amount of notes to be generated. protected int GetRandomNoteCount(double p2, double p3, double p4 = 0, double p5 = 0, double p6 = 0) { double val = Random.NextDouble(); if (val >= 1 - p6) return 6; if (val >= 1 - p5) return 5; if (val >= 1 - p4) return 4; if (val >= 1 - p3) return 3; return val >= 1 - p2 ? 2 : 1; } } }