diff --git a/osu.Game.Rulesets.Mania/Beatmaps/LegacyBeatmapConverter.cs b/osu.Game.Rulesets.Mania/Beatmaps/LegacyBeatmapConverter.cs
index 3aa88af62d..a69145ba75 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/LegacyBeatmapConverter.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/LegacyBeatmapConverter.cs
@@ -9,6 +9,7 @@ using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
using osu.Game.Rulesets.Mania.Beatmaps.Patterns;
using osu.Game.Rulesets.Mania.MathUtils;
+using osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy;
namespace osu.Game.Rulesets.Mania.Beatmaps
{
@@ -74,10 +75,11 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
var distanceData = original as IHasDistance;
var positionData = original as IHasPosition;
- PatternGenerator conversion = null;
+ Patterns.PatternGenerator conversion = null;
if (distanceData != null)
{
+ conversion = new DistanceObjectPatternGenerator(random, original, beatmap, lastPattern);
// Slider
}
else if (endTimeData != null)
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs
index b2a9de4b54..238e25f0c4 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs
@@ -24,6 +24,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
private const float osu_base_scoring_distance = 100;
private readonly double endTime;
+ private readonly double segmentDuration;
private readonly int repeatCount;
private PatternType convertType;
@@ -55,37 +56,36 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
double osuDuration = distance / osuVelocity;
endTime = hitObject.StartTime + osuDuration;
+ segmentDuration = (endTime - HitObject.StartTime) / repeatCount;
}
public override Pattern Generate()
{
- double segmentDuration = endTime / repeatCount;
-
if (repeatCount > 1)
{
if (segmentDuration <= 90)
- return generateRandomHoldNotes(HitObject.StartTime, endTime, 1);
+ return generateRandomHoldNotes(HitObject.StartTime, 1);
if (segmentDuration <= 120)
{
convertType |= PatternType.ForceNotStack;
- return generateRandomNotes(HitObject.StartTime, segmentDuration, repeatCount);
+ return generateRandomNotes(HitObject.StartTime, repeatCount + 1);
}
if (segmentDuration <= 160)
- return generateStair(HitObject.StartTime, segmentDuration);
+ return generateStair(HitObject.StartTime);
if (segmentDuration <= 200 && ConversionDifficulty > 3)
- return generateRandomMultipleNotes(HitObject.StartTime, segmentDuration, repeatCount);
+ return generateRandomMultipleNotes(HitObject.StartTime);
double duration = endTime - HitObject.StartTime;
if (duration >= 4000)
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.23, 0, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.23, 0, 0);
if (segmentDuration > 400 && duration < 4000 && repeatCount < AvailableColumns - 1 - RandomStart)
- return generateTiledHoldNotes(HitObject.StartTime, segmentDuration, repeatCount);
+ return generateTiledHoldNotes(HitObject.StartTime);
- return generateHoldAndNormalNotes(HitObject.StartTime, segmentDuration);
+ return generateHoldAndNormalNotes(HitObject.StartTime);
}
if (segmentDuration <= 110)
@@ -94,43 +94,42 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
convertType |= PatternType.ForceNotStack;
else
convertType &= ~PatternType.ForceNotStack;
- return generateRandomNotes(HitObject.StartTime, segmentDuration, segmentDuration < 80 ? 0 : 1);
+ return generateRandomNotes(HitObject.StartTime, segmentDuration < 80 ? 1 : 2);
}
if (ConversionDifficulty > 6.5)
{
if ((convertType & PatternType.LowProbability) > 0)
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.78, 0.3, 0);
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.85, 0.36, 0.03);
+ return generateNRandomNotes(HitObject.StartTime, 0.78, 0.3, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.85, 0.36, 0.03);
}
if (ConversionDifficulty > 4)
{
if ((convertType & PatternType.LowProbability) > 0)
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.43, 0.08, 0);
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.56, 0.18, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.43, 0.08, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.56, 0.18, 0);
}
if (ConversionDifficulty > 2.5)
{
if ((convertType & PatternType.LowProbability) > 0)
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.3, 0, 0);
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.37, 0.08, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.3, 0, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.37, 0.08, 0);
}
if ((convertType & PatternType.LowProbability) > 0)
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.17, 0, 0);
- return generateNRandomNotes(HitObject.StartTime, endTime, 0.27, 0, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.17, 0, 0);
+ return generateNRandomNotes(HitObject.StartTime, 0.27, 0, 0);
}
///
/// Generates random hold notes that start at an span the same amount of rows.
///
/// Start time of each hold note.
- /// End time of the hold notes.
/// Number of hold notes.
/// The containing the hit objects.
- private Pattern generateRandomHoldNotes(double startTime, double endTime, int noteCount)
+ private Pattern generateRandomHoldNotes(double startTime, int noteCount)
{
// - - - -
// ■ - ■ ■
@@ -163,10 +162,9 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
/// Generates random notes, with one note per row and no stacking.
///
/// The start time.
- /// The separation of notes between rows.
- /// The number of rows.
+ /// The number of notes.
/// The containing the hit objects.
- private Pattern generateRandomNotes(double startTime, double separationTime, int repeatCount)
+ private Pattern generateRandomNotes(double startTime, int noteCount)
{
// - - - -
// x - - -
@@ -184,14 +182,14 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
}
int lastColumn = nextColumn;
- for (int i = 0; i <= repeatCount; i++)
+ for (int i = 0; i < noteCount; i++)
{
addToPattern(pattern, HitObject, nextColumn, startTime, startTime);
while (nextColumn == lastColumn)
nextColumn = Random.Next(RandomStart, AvailableColumns);
lastColumn = nextColumn;
- startTime += separationTime;
+ startTime += segmentDuration;
}
return pattern;
@@ -201,9 +199,8 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
/// Generates a stair of notes, with one note per row.
///
/// The start time.
- /// The separation of notes between rows.
/// The containing the hit objects.
- private Pattern generateStair(double startTime, double separationTime)
+ private Pattern generateStair(double startTime)
{
// - - - -
// x - - -
@@ -222,7 +219,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
for (int i = 0; i <= repeatCount; i++)
{
addToPattern(pattern, HitObject, column, startTime, startTime);
- startTime += separationTime;
+ startTime += segmentDuration;
// Check if we're at the borders of the stage, and invert the pattern if so
if (increasing)
@@ -254,10 +251,8 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
/// Generates random notes with 1-2 notes per row and no stacking.
///
/// The start time.
- /// The separation of notes between rows.
- /// The number of rows.
/// The containing the hit objects.
- private Pattern generateRandomMultipleNotes(double startTime, double separationTime, int repeatCount)
+ private Pattern generateRandomMultipleNotes(double startTime)
{
// - - - -
// x - -
@@ -285,7 +280,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
addToPattern(pattern, HitObject, nextColumn, startTime, startTime, 2);
nextColumn = Random.Next(RandomStart, AvailableColumns);
- startTime += separationTime;
+ startTime += segmentDuration;
}
return pattern;
@@ -295,12 +290,11 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
/// Generates random hold notes. The amount of hold notes generated is determined by probabilities.
///
/// The hold note start time.
- /// The hold note end time.
/// The probability required for 2 hold notes to be generated.
/// The probability required for 3 hold notes to be generated.
/// The probability required for 4 hold notes to be generated.
/// The containing the hit objects.
- private Pattern generateNRandomNotes(double startTime, double endTime, double p2, double p3, double p4)
+ private Pattern generateNRandomNotes(double startTime, double p2, double p3, double p4)
{
// - - - -
// ■ - ■ ■
@@ -339,17 +333,15 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
if (canGenerateTwoNotes)
p2 = 1;
- return generateRandomHoldNotes(startTime, endTime, GetRandomNoteCount(p2, p3, p4));
+ return generateRandomHoldNotes(startTime, GetRandomNoteCount(p2, p3, p4));
}
///
/// Generates tiled hold notes. You can think of this as a stair of hold notes.
///
/// The first hold note start time.
- /// The separation time between hold notes.
- /// The amount of hold notes.
/// The containing the hit objects.
- private Pattern generateTiledHoldNotes(double startTime, double separationTime, int noteCount)
+ private Pattern generateTiledHoldNotes(double startTime)
{
// - - - -
// ■ ■ ■ ■
@@ -362,7 +354,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
var pattern = new Pattern();
- int columnRepeat = Math.Min(noteCount, AvailableColumns);
+ int columnRepeat = Math.Min(repeatCount, AvailableColumns);
int nextColumn = GetColumn((HitObject as IHasXPosition)?.X ?? 0, true);
if ((convertType & PatternType.ForceNotStack) > 0 && PreviousPattern.ColumnsFilled < AvailableColumns)
@@ -376,8 +368,8 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
while (pattern.IsFilled(nextColumn))
nextColumn = Random.Next(RandomStart, AvailableColumns);
- addToPattern(pattern, HitObject, nextColumn, startTime, endTime, noteCount);
- startTime += separationTime;
+ addToPattern(pattern, HitObject, nextColumn, startTime, endTime, repeatCount);
+ startTime += segmentDuration;
}
return pattern;
@@ -387,9 +379,8 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
/// Generates a hold note alongside normal notes.
///
/// The start time of notes.
- /// The separation time between notes.
/// The containing the hit objects.
- private Pattern generateHoldAndNormalNotes(double startTime, double separationTime)
+ private Pattern generateHoldAndNormalNotes(double startTime)
{
// - - - -
// ■ x x -
@@ -407,7 +398,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
}
// Create the hold note
- addToPattern(pattern, HitObject, holdColumn, startTime, separationTime * repeatCount);
+ addToPattern(pattern, HitObject, holdColumn, startTime, endTime);
int noteCount = 1;
if (ConversionDifficulty > 6.5)
@@ -437,7 +428,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
pattern.Add(rowPattern);
rowPattern.Clear();
- startTime += separationTime;
+ startTime += segmentDuration;
}
return pattern;
@@ -455,7 +446,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
if (curveData == null)
return HitObject.Samples;
- double segmentTime = (curveData.EndTime - HitObject.StartTime) / repeatCount;
+ double segmentTime = (endTime - HitObject.StartTime) / repeatCount;
int index = (int)(segmentTime == 0 ? 0 : (time - HitObject.StartTime) / segmentTime);
return curveData.RepeatSamples[index];