diff --git a/osu.Desktop/osu.Desktop.csproj b/osu.Desktop/osu.Desktop.csproj
index 29d3b0e394..0289db20f0 100644
--- a/osu.Desktop/osu.Desktop.csproj
+++ b/osu.Desktop/osu.Desktop.csproj
@@ -29,7 +29,7 @@
-
+
diff --git a/osu.Game.Rulesets.Catch.Tests/CatchBeatmapConversionTest.cs b/osu.Game.Rulesets.Catch.Tests/CatchBeatmapConversionTest.cs
index 5b34e46247..89e8361a72 100644
--- a/osu.Game.Rulesets.Catch.Tests/CatchBeatmapConversionTest.cs
+++ b/osu.Game.Rulesets.Catch.Tests/CatchBeatmapConversionTest.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using Newtonsoft.Json;
using NUnit.Framework;
using osu.Framework.MathUtils;
using osu.Game.Rulesets.Catch.Objects;
@@ -17,6 +18,8 @@ namespace osu.Game.Rulesets.Catch.Tests
protected override string ResourceAssembly => "osu.Game.Rulesets.Catch";
[TestCase("basic"), Ignore("See: https://github.com/ppy/osu/issues/2232")]
+ [TestCase("spinner")]
+ [TestCase("spinner-and-circles")]
public new void Test(string name)
{
base.Test(name);
@@ -27,22 +30,15 @@ namespace osu.Game.Rulesets.Catch.Tests
if (hitObject is JuiceStream stream)
{
foreach (var nested in stream.NestedHitObjects)
- {
- yield return new ConvertValue
- {
- StartTime = nested.StartTime,
- Position = ((CatchHitObject)nested).X * CatchPlayfield.BASE_WIDTH
- };
- }
+ yield return new ConvertValue((CatchHitObject)nested);
+ }
+ else if (hitObject is BananaShower shower)
+ {
+ foreach (var nested in shower.NestedHitObjects)
+ yield return new ConvertValue((CatchHitObject)nested);
}
else
- {
- yield return new ConvertValue
- {
- StartTime = hitObject.StartTime,
- Position = ((CatchHitObject)hitObject).X * CatchPlayfield.BASE_WIDTH
- };
- }
+ yield return new ConvertValue((CatchHitObject)hitObject);
}
protected override Ruleset CreateRuleset() => new CatchRuleset();
@@ -55,8 +51,31 @@ namespace osu.Game.Rulesets.Catch.Tests
///
private const float conversion_lenience = 2;
- public double StartTime;
- public float Position;
+ [JsonIgnore]
+ public readonly CatchHitObject HitObject;
+
+ public ConvertValue(CatchHitObject hitObject)
+ {
+ HitObject = hitObject;
+ startTime = 0;
+ position = 0;
+ }
+
+ private double startTime;
+
+ public double StartTime
+ {
+ get => HitObject?.StartTime ?? startTime;
+ set => startTime = value;
+ }
+
+ private float position;
+
+ public float Position
+ {
+ get => HitObject?.X * CatchPlayfield.BASE_WIDTH ?? position;
+ set => position = value;
+ }
public bool Equals(ConvertValue other)
=> Precision.AlmostEquals(StartTime, other.StartTime, conversion_lenience)
diff --git a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs
index ad500606ed..46fe8454dc 100644
--- a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs
+++ b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapConverter.cs
@@ -27,22 +27,6 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
var comboData = obj as IHasCombo;
var endTime = obj as IHasEndTime;
- if (positionData == null)
- {
- if (endTime != null)
- {
- yield return new BananaShower
- {
- StartTime = obj.StartTime,
- Samples = obj.Samples,
- Duration = endTime.Duration,
- NewCombo = comboData?.NewCombo ?? false
- };
- }
-
- yield break;
- }
-
if (curveData != null)
{
yield return new JuiceStream
@@ -54,20 +38,30 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
Distance = curveData.Distance,
RepeatSamples = curveData.RepeatSamples,
RepeatCount = curveData.RepeatCount,
- X = positionData.X / CatchPlayfield.BASE_WIDTH,
+ X = (positionData?.X ?? 0) / CatchPlayfield.BASE_WIDTH,
NewCombo = comboData?.NewCombo ?? false
};
-
- yield break;
}
-
- yield return new Fruit
+ else if (endTime != null)
{
- StartTime = obj.StartTime,
- Samples = obj.Samples,
- NewCombo = comboData?.NewCombo ?? false,
- X = positionData.X / CatchPlayfield.BASE_WIDTH
- };
+ yield return new BananaShower
+ {
+ StartTime = obj.StartTime,
+ Samples = obj.Samples,
+ Duration = endTime.Duration,
+ NewCombo = comboData?.NewCombo ?? false
+ };
+ }
+ else
+ {
+ yield return new Fruit
+ {
+ StartTime = obj.StartTime,
+ Samples = obj.Samples,
+ NewCombo = comboData?.NewCombo ?? false,
+ X = (positionData?.X ?? 0) / CatchPlayfield.BASE_WIDTH
+ };
+ }
}
protected override Beatmap CreateBeatmap() => new CatchBeatmap();
diff --git a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
index e16f5fcb60..8473f5a36c 100644
--- a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
+++ b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
@@ -9,6 +9,7 @@ using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.UI;
using osu.Game.Rulesets.Objects.Types;
using OpenTK;
+using osu.Game.Rulesets.Catch.MathUtils;
namespace osu.Game.Rulesets.Catch.Beatmaps
{
@@ -21,13 +22,54 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
public override void PostProcess()
{
+ applyPositionOffsets();
+
initialiseHyperDash((List)Beatmap.HitObjects);
base.PostProcess();
int index = 0;
foreach (var obj in Beatmap.HitObjects.OfType())
+ {
obj.IndexInBeatmap = index++;
+ if (obj.LastInCombo && obj.NestedHitObjects.LastOrDefault() is IHasComboInformation lastNested)
+ lastNested.LastInCombo = true;
+ }
+ }
+
+ public const int RNG_SEED = 1337;
+
+ private void applyPositionOffsets()
+ {
+ var rng = new FastRandom(RNG_SEED);
+ // todo: HardRock displacement should be applied here
+
+ foreach (var obj in Beatmap.HitObjects)
+ {
+ switch (obj)
+ {
+ case BananaShower bananaShower:
+ foreach (var nested in bananaShower.NestedHitObjects)
+ {
+ ((BananaShower.Banana)nested).X = (float)rng.NextDouble();
+ rng.Next(); // osu!stable retrieved a random banana type
+ rng.Next(); // osu!stable retrieved a random banana rotation
+ rng.Next(); // osu!stable retrieved a random banana colour
+ }
+ break;
+ case JuiceStream juiceStream:
+ foreach (var nested in juiceStream.NestedHitObjects)
+ {
+ var hitObject = (CatchHitObject)nested;
+ if (hitObject is TinyDroplet)
+ hitObject.X += rng.Next(-20, 20) / CatchPlayfield.BASE_WIDTH;
+ else if (hitObject is Droplet)
+ rng.Next(); // osu!stable retrieved a random droplet rotation
+ hitObject.X = MathHelper.Clamp(hitObject.X, 0, 1);
+ }
+ break;
+ }
+ }
}
private void initialiseHyperDash(List objects)
diff --git a/osu.Game.Rulesets.Catch/MathUtils/FastRandom.cs b/osu.Game.Rulesets.Catch/MathUtils/FastRandom.cs
new file mode 100644
index 0000000000..5b3835755a
--- /dev/null
+++ b/osu.Game.Rulesets.Catch/MathUtils/FastRandom.cs
@@ -0,0 +1,91 @@
+// Copyright (c) 2007-2018 ppy Pty Ltd .
+// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+
+using System;
+
+namespace osu.Game.Rulesets.Catch.MathUtils
+{
+ ///
+ /// A PRNG specified in http://heliosphan.org/fastrandom.html.
+ ///
+ public class FastRandom
+ {
+ private const double int_to_real = 1.0 / (int.MaxValue + 1.0);
+ private const uint int_mask = 0x7FFFFFFF;
+ private const uint y = 842502087;
+ private const uint z = 3579807591;
+ private const uint w = 273326509;
+ private uint _x, _y = y, _z = z, _w = w;
+
+ public FastRandom(int seed)
+ {
+ _x = (uint)seed;
+ }
+
+ public FastRandom()
+ : this(Environment.TickCount)
+ {
+ }
+
+ ///
+ /// Generates a random unsigned integer within the range [, ).
+ ///
+ /// The random value.
+ public uint NextUInt()
+ {
+ uint t = _x ^ _x << 11;
+ _x = _y;
+ _y = _z;
+ _z = _w;
+ return _w = _w ^ _w >> 19 ^ t ^ t >> 8;
+ }
+
+ ///
+ /// Generates a random integer value within the range [0, ).
+ ///
+ /// The random value.
+ public int Next() => (int)(int_mask & NextUInt());
+
+ ///
+ /// Generates a random integer value within the range [0, ).
+ ///
+ /// The upper bound.
+ /// The random value.
+ public int Next(int upperBound) => (int)(NextDouble() * upperBound);
+
+ ///
+ /// Generates a random integer value within the range [, ).
+ ///
+ /// The lower bound of the range.
+ /// The upper bound of the range.
+ /// The random value.
+ public int Next(int lowerBound, int upperBound) => (int)(lowerBound + NextDouble() * (upperBound - lowerBound));
+
+ ///
+ /// Generates a random double value within the range [0, 1).
+ ///
+ /// The random value.
+ public double NextDouble() => int_to_real * Next();
+
+ private uint bitBuffer;
+ private int bitIndex = 32;
+
+ ///
+ /// Generates a reandom boolean value. Cached such that a random value is only generated once in every 32 calls.
+ ///
+ /// The random value.
+ public bool NextBool()
+ {
+ if (bitIndex == 32)
+ {
+ bitBuffer = NextUInt();
+ bitIndex = 1;
+
+ return (bitBuffer & 1) == 1;
+ }
+
+ bitIndex++;
+ return ((bitBuffer >>= 1) & 1) == 1;
+ }
+ }
+}
diff --git a/osu.Game.Rulesets.Catch/Objects/BananaShower.cs b/osu.Game.Rulesets.Catch/Objects/BananaShower.cs
index a6aba42f03..4dd491966c 100644
--- a/osu.Game.Rulesets.Catch/Objects/BananaShower.cs
+++ b/osu.Game.Rulesets.Catch/Objects/BananaShower.cs
@@ -1,7 +1,6 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
-using osu.Framework.MathUtils;
using osu.Game.Rulesets.Objects.Types;
namespace osu.Game.Rulesets.Catch.Objects
@@ -31,8 +30,7 @@ namespace osu.Game.Rulesets.Catch.Objects
AddNested(new Banana
{
Samples = Samples,
- StartTime = i,
- X = RNG.NextSingle()
+ StartTime = i
});
}
diff --git a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs
index b2d8e3f8a5..6fe9692c26 100644
--- a/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs
+++ b/osu.Game.Rulesets.Catch/Objects/JuiceStream.cs
@@ -42,7 +42,6 @@ namespace osu.Game.Rulesets.Catch.Objects
protected override void CreateNestedHitObjects()
{
base.CreateNestedHitObjects();
-
createTicks();
}
@@ -124,9 +123,6 @@ namespace osu.Game.Rulesets.Catch.Objects
X = X + Curve.PositionAt(reversed ? 0 : 1).X / CatchPlayfield.BASE_WIDTH
});
}
-
- if (NestedHitObjects.LastOrDefault() is IHasComboInformation lastNested)
- lastNested.LastInCombo = LastInCombo;
}
public double EndTime => StartTime + this.SpanCount() * Curve.Distance / Velocity;
diff --git a/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/basic-expected-conversion.json b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/basic-expected-conversion.json
index 9357d3b75c..b65d54a565 100644
--- a/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/basic-expected-conversion.json
+++ b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/basic-expected-conversion.json
@@ -1,957 +1,1275 @@
{
"Mappings": [{
- "StartTime": 500.0,
- "Objects": [{
- "StartTime": 500.0,
- "Position": 96.0
- }, {
- "StartTime": 562.0,
- "Position": 100.84
- }, {
- "StartTime": 625.0,
- "Position": 125.0
- }, {
- "StartTime": 687.0,
- "Position": 152.84
- }, {
- "StartTime": 750.0,
- "Position": 191.0
- }, {
- "StartTime": 812.0,
- "Position": 212.84
- }, {
- "StartTime": 875.0,
- "Position": 217.0
- }, {
- "StartTime": 937.0,
- "Position": 234.84
- }, {
- "StartTime": 1000.0,
- "Position": 256.0
- }, {
- "StartTime": 1062.0,
- "Position": 267.84
- }, {
- "StartTime": 1125.0,
- "Position": 284.0
- }, {
- "StartTime": 1187.0,
- "Position": 311.84
- }, {
- "StartTime": 1250.0,
- "Position": 350.0
- }, {
- "StartTime": 1312.0,
- "Position": 359.84
- }, {
- "StartTime": 1375.0,
- "Position": 367.0
- }, {
- "StartTime": 1437.0,
- "Position": 400.84
- }, {
- "StartTime": 1500.0,
- "Position": 416.0
- }, {
- "StartTime": 1562.0,
- "Position": 377.159973
- }, {
- "StartTime": 1625.0,
- "Position": 367.0
- }, {
- "StartTime": 1687.0,
- "Position": 374.159973
- }, {
- "StartTime": 1750.0,
- "Position": 353.0
- }, {
- "StartTime": 1812.0,
- "Position": 329.159973
- }, {
- "StartTime": 1875.0,
- "Position": 288.0
- }, {
- "StartTime": 1937.0,
- "Position": 259.159973
- }, {
- "StartTime": 2000.0,
- "Position": 256.0
- }, {
- "StartTime": 2058.0,
- "Position": 232.44
- }, {
- "StartTime": 2116.0,
- "Position": 222.879974
- }, {
- "StartTime": 2174.0,
- "Position": 185.319992
- }, {
- "StartTime": 2232.0,
- "Position": 177.76001
- }, {
- "StartTime": 2290.0,
- "Position": 162.200012
- }, {
- "StartTime": 2348.0,
- "Position": 158.639984
- }, {
- "StartTime": 2406.0,
- "Position": 111.079994
- }, {
- "StartTime": 2500.0,
- "Position": 96.0
- }]
- }, {
- "StartTime": 3000.0,
- "Objects": [{
- "StartTime": 3000.0,
- "Position": 18.0
- }, {
- "StartTime": 3062.0,
- "Position": 482.0
- }, {
- "StartTime": 3125.0,
- "Position": 243.0
- }, {
- "StartTime": 3187.0,
- "Position": 332.0
- }, {
- "StartTime": 3250.0,
- "Position": 477.0
- }, {
- "StartTime": 3312.0,
- "Position": 376.0
- }, {
- "StartTime": 3375.0,
- "Position": 104.0
- }, {
- "StartTime": 3437.0,
- "Position": 156.0
- }, {
- "StartTime": 3500.0,
- "Position": 135.0
- }, {
- "StartTime": 3562.0,
- "Position": 256.0
- }, {
- "StartTime": 3625.0,
- "Position": 360.0
- }, {
- "StartTime": 3687.0,
- "Position": 199.0
- }, {
- "StartTime": 3750.0,
- "Position": 239.0
- }, {
- "StartTime": 3812.0,
- "Position": 326.0
- }, {
- "StartTime": 3875.0,
- "Position": 393.0
- }, {
- "StartTime": 3937.0,
- "Position": 470.0
- }, {
- "StartTime": 4000.0,
- "Position": 136.0
- }]
- }, {
- "StartTime": 4500.0,
- "Objects": [{
- "StartTime": 4500.0,
- "Position": 317.0
- }, {
- "StartTime": 4562.0,
- "Position": 354.0
- }, {
- "StartTime": 4625.0,
- "Position": 414.0
- }, {
- "StartTime": 4687.0,
- "Position": 39.0
- }, {
- "StartTime": 4750.0,
- "Position": 172.0
- }, {
- "StartTime": 4812.0,
- "Position": 479.0
- }, {
- "StartTime": 4875.0,
- "Position": 18.0
- }, {
- "StartTime": 4937.0,
- "Position": 151.0
- }, {
- "StartTime": 5000.0,
- "Position": 342.0
- }, {
- "StartTime": 5062.0,
- "Position": 400.0
- }, {
- "StartTime": 5125.0,
- "Position": 420.0
- }, {
- "StartTime": 5187.0,
- "Position": 90.0
- }, {
- "StartTime": 5250.0,
- "Position": 220.0
- }, {
- "StartTime": 5312.0,
- "Position": 80.0
- }, {
- "StartTime": 5375.0,
- "Position": 421.0
- }, {
- "StartTime": 5437.0,
- "Position": 473.0
- }, {
- "StartTime": 5500.0,
- "Position": 97.0
- }]
- }, {
- "StartTime": 6000.0,
- "Objects": [{
- "StartTime": 6000.0,
- "Position": 105.0
- }, {
- "StartTime": 6062.0,
- "Position": 249.0
- }, {
- "StartTime": 6125.0,
- "Position": 163.0
- }, {
- "StartTime": 6187.0,
- "Position": 194.0
- }, {
- "StartTime": 6250.0,
- "Position": 106.0
- }, {
- "StartTime": 6312.0,
- "Position": 212.0
- }, {
- "StartTime": 6375.0,
- "Position": 257.0
- }, {
- "StartTime": 6437.0,
- "Position": 461.0
- }, {
- "StartTime": 6500.0,
- "Position": 79.0
- }]
- }, {
- "StartTime": 7000.0,
- "Objects": [{
- "StartTime": 7000.0,
- "Position": 256.0
- }, {
- "StartTime": 7062.0,
- "Position": 294.84
- }, {
- "StartTime": 7125.0,
- "Position": 279.0
- }, {
- "StartTime": 7187.0,
- "Position": 309.84
- }, {
- "StartTime": 7250.0,
- "Position": 336.0
- }, {
- "StartTime": 7312.0,
- "Position": 322.16
- }, {
- "StartTime": 7375.0,
- "Position": 308.0
- }, {
- "StartTime": 7437.0,
- "Position": 263.16
- }, {
- "StartTime": 7500.0,
- "Position": 256.0
- }, {
- "StartTime": 7562.0,
- "Position": 261.84
- }, {
- "StartTime": 7625.0,
- "Position": 277.0
- }, {
- "StartTime": 7687.0,
- "Position": 318.84
- }, {
- "StartTime": 7750.0,
- "Position": 336.0
- }, {
- "StartTime": 7803.0,
- "Position": 305.04
- }, {
- "StartTime": 7857.0,
- "Position": 307.76
- }, {
- "StartTime": 7910.0,
- "Position": 297.8
- }, {
- "StartTime": 8000.0,
- "Position": 256.0
- }]
- }, {
- "StartTime": 8500.0,
- "Objects": [{
- "StartTime": 8500.0,
- "Position": 32.0
- }, {
- "StartTime": 8562.0,
- "Position": 22.8515015
- }, {
- "StartTime": 8625.0,
- "Position": 28.5659637
- }, {
- "StartTime": 8687.0,
- "Position": 50.3433228
- }, {
- "StartTime": 8750.0,
- "Position": 56.58974
- }, {
- "StartTime": 8812.0,
- "Position": 64.23422
- }, {
- "StartTime": 8875.0,
- "Position": 67.7117844
- }, {
- "StartTime": 8937.0,
- "Position": 90.52607
- }, {
- "StartTime": 9000.0,
- "Position": 101.81015
- }, {
- "StartTime": 9062.0,
- "Position": 113.478188
- }, {
- "StartTime": 9125.0,
- "Position": 159.414444
- }, {
- "StartTime": 9187.0,
- "Position": 155.1861
- }, {
- "StartTime": 9250.0,
- "Position": 179.600418
- }, {
- "StartTime": 9312.0,
- "Position": 212.293015
- }, {
- "StartTime": 9375.0,
- "Position": 197.2076
- }, {
- "StartTime": 9437.0,
- "Position": 243.438324
- }, {
- "StartTime": 9500.0,
- "Position": 237.2304
- }, {
- "StartTime": 9562.0,
- "Position": 241.253983
- }, {
- "StartTime": 9625.0,
- "Position": 258.950623
- }, {
- "StartTime": 9687.0,
- "Position": 253.3786
- }, {
- "StartTime": 9750.0,
- "Position": 270.8865
- }, {
- "StartTime": 9812.0,
- "Position": 244.38974
- }, {
- "StartTime": 9875.0,
- "Position": 242.701874
- }, {
- "StartTime": 9937.0,
- "Position": 256.2331
- }, {
- "StartTime": 10000.0,
- "Position": 270.339874
- }, {
- "StartTime": 10062.0,
- "Position": 275.9349
- }, {
- "StartTime": 10125.0,
- "Position": 297.2969
- }, {
- "StartTime": 10187.0,
- "Position": 307.834137
- }, {
- "StartTime": 10250.0,
- "Position": 321.6449
- }, {
- "StartTime": 10312.0,
- "Position": 357.746338
- }, {
- "StartTime": 10375.0,
- "Position": 358.21875
- }, {
- "StartTime": 10437.0,
- "Position": 394.943
- }, {
- "StartTime": 10500.0,
- "Position": 401.0588
- }, {
- "StartTime": 10558.0,
- "Position": 418.21347
- }, {
- "StartTime": 10616.0,
- "Position": 424.6034
- }, {
- "StartTime": 10674.0,
- "Position": 455.835754
- }, {
- "StartTime": 10732.0,
- "Position": 477.5042
- }, {
- "StartTime": 10790.0,
- "Position": 476.290955
- }, {
- "StartTime": 10848.0,
- "Position": 470.943237
- }, {
- "StartTime": 10906.0,
- "Position": 503.3372
- }, {
- "StartTime": 10999.0,
- "Position": 508.166229
- }]
- }, {
- "StartTime": 11500.0,
- "Objects": [{
- "StartTime": 11500.0,
- "Position": 321.0
- }, {
- "StartTime": 11562.0,
- "Position": 17.0
- }, {
- "StartTime": 11625.0,
- "Position": 173.0
- }, {
- "StartTime": 11687.0,
- "Position": 170.0
- }, {
- "StartTime": 11750.0,
- "Position": 447.0
- }, {
- "StartTime": 11812.0,
- "Position": 218.0
- }, {
- "StartTime": 11875.0,
- "Position": 394.0
- }, {
- "StartTime": 11937.0,
- "Position": 46.0
- }, {
- "StartTime": 12000.0,
- "Position": 480.0
- }]
- }, {
- "StartTime": 12500.0,
- "Objects": [{
- "StartTime": 12500.0,
- "Position": 512.0
- }, {
- "StartTime": 12562.0,
- "Position": 491.3132
- }, {
- "StartTime": 12625.0,
- "Position": 484.3089
- }, {
- "StartTime": 12687.0,
- "Position": 454.6221
- }, {
- "StartTime": 12750.0,
- "Position": 433.617767
- }, {
- "StartTime": 12812.0,
- "Position": 399.930969
- }, {
- "StartTime": 12875.0,
- "Position": 395.926666
- }, {
- "StartTime": 12937.0,
- "Position": 361.239868
- }, {
- "StartTime": 13000.0,
- "Position": 353.235535
- }, {
- "StartTime": 13062.0,
- "Position": 314.548767
- }, {
- "StartTime": 13125.0,
- "Position": 315.544434
- }, {
- "StartTime": 13187.0,
- "Position": 288.857635
- }, {
- "StartTime": 13250.0,
- "Position": 254.853333
- }, {
- "StartTime": 13312.0,
- "Position": 239.166534
- }, {
- "StartTime": 13375.0,
- "Position": 240.1622
- }, {
- "StartTime": 13437.0,
- "Position": 212.4754
- }, {
- "StartTime": 13500.0,
- "Position": 194.471069
- }, {
- "StartTime": 13562.0,
- "Position": 161.784271
- }, {
- "StartTime": 13625.0,
- "Position": 145.779968
- }, {
- "StartTime": 13687.0,
- "Position": 129.09314
- }, {
- "StartTime": 13750.0,
- "Position": 104.088837
- }, {
- "StartTime": 13812.0,
- "Position": 95.40204
- }, {
- "StartTime": 13875.0,
- "Position": 61.3977356
- }, {
- "StartTime": 13937.0,
- "Position": 56.710907
- }, {
- "StartTime": 14000.0,
- "Position": 35.7066345
- }, {
- "StartTime": 14062.0,
- "Position": 5.019806
- }, {
- "StartTime": 14125.0,
- "Position": 0.0
- }, {
- "StartTime": 14187.0,
- "Position": 39.7696266
- }, {
- "StartTime": 14250.0,
- "Position": 23.0119171
- }, {
- "StartTime": 14312.0,
- "Position": 75.94882
- }, {
- "StartTime": 14375.0,
- "Position": 98.19112
- }, {
- "StartTime": 14437.0,
- "Position": 82.12803
- }, {
- "StartTime": 14500.0,
- "Position": 118.370323
- }, {
- "StartTime": 14562.0,
- "Position": 149.307236
- }, {
- "StartTime": 14625.0,
- "Position": 168.549515
- }, {
- "StartTime": 14687.0,
- "Position": 190.486435
- }, {
- "StartTime": 14750.0,
- "Position": 186.728714
- }, {
- "StartTime": 14812.0,
- "Position": 199.665634
- }, {
- "StartTime": 14875.0,
- "Position": 228.907928
- }, {
- "StartTime": 14937.0,
- "Position": 264.844849
- }, {
- "StartTime": 15000.0,
- "Position": 271.087128
- }, {
- "StartTime": 15062.0,
- "Position": 290.024017
- }, {
- "StartTime": 15125.0,
- "Position": 302.266327
- }, {
- "StartTime": 15187.0,
- "Position": 344.203247
- }, {
- "StartTime": 15250.0,
- "Position": 356.445526
- }, {
- "StartTime": 15312.0,
- "Position": 359.382446
- }, {
- "StartTime": 15375.0,
- "Position": 401.624725
- }, {
- "StartTime": 15437.0,
- "Position": 388.561646
- }, {
- "StartTime": 15500.0,
- "Position": 423.803925
- }, {
- "StartTime": 15562.0,
- "Position": 425.740845
- }, {
- "StartTime": 15625.0,
- "Position": 449.983124
- }, {
- "StartTime": 15687.0,
- "Position": 468.920044
- }, {
- "StartTime": 15750.0,
- "Position": 492.162323
- }, {
- "StartTime": 15812.0,
- "Position": 506.784332
- }, {
- "StartTime": 15875.0,
- "Position": 474.226227
- }, {
- "StartTime": 15937.0,
- "Position": 482.978638
- }, {
- "StartTime": 16000.0,
- "Position": 446.420532
- }, {
- "StartTime": 16058.0,
- "Position": 418.4146
- }, {
- "StartTime": 16116.0,
- "Position": 425.408844
- }, {
- "StartTime": 16174.0,
- "Position": 383.402924
- }, {
- "StartTime": 16232.0,
- "Position": 363.397156
- }, {
- "StartTime": 16290.0,
- "Position": 343.391235
- }, {
- "StartTime": 16348.0,
- "Position": 328.385468
- }, {
- "StartTime": 16406.0,
- "Position": 322.3797
- }, {
- "StartTime": 16500.0,
- "Position": 291.1977
- }]
- }, {
- "StartTime": 17000.0,
- "Objects": [{
- "StartTime": 17000.0,
- "Position": 256.0
- }, {
- "StartTime": 17062.0,
- "Position": 228.16
- }, {
- "StartTime": 17125.0,
- "Position": 234.0
- }, {
- "StartTime": 17187.0,
- "Position": 202.16
- }, {
- "StartTime": 17250.0,
- "Position": 176.0
- }, {
- "StartTime": 17312.0,
- "Position": 210.84
- }, {
- "StartTime": 17375.0,
- "Position": 221.0
- }, {
- "StartTime": 17437.0,
- "Position": 219.84
- }, {
- "StartTime": 17500.0,
- "Position": 256.0
- }, {
- "StartTime": 17562.0,
- "Position": 219.16
- }, {
- "StartTime": 17625.0,
- "Position": 228.0
- }, {
- "StartTime": 17687.0,
- "Position": 203.16
- }, {
- "StartTime": 17750.0,
- "Position": 176.0
- }, {
- "StartTime": 17803.0,
- "Position": 174.959991
- }, {
- "StartTime": 17857.0,
- "Position": 214.23999
- }, {
- "StartTime": 17910.0,
- "Position": 228.200012
- }, {
- "StartTime": 18000.0,
- "Position": 256.0
- }]
- }, {
- "StartTime": 18500.0,
- "Objects": [{
- "StartTime": 18500.0,
- "Position": 362.0
- }, {
- "StartTime": 18559.0,
- "Position": 249.0
- }, {
- "StartTime": 18618.0,
- "Position": 357.0
- }, {
- "StartTime": 18678.0,
- "Position": 167.0
- }, {
- "StartTime": 18737.0,
- "Position": 477.0
- }, {
- "StartTime": 18796.0,
- "Position": 411.0
- }, {
- "StartTime": 18856.0,
- "Position": 254.0
- }, {
- "StartTime": 18915.0,
- "Position": 308.0
- }, {
- "StartTime": 18975.0,
- "Position": 399.0
- }, {
- "StartTime": 19034.0,
- "Position": 176.0
- }, {
- "StartTime": 19093.0,
- "Position": 14.0
- }, {
- "StartTime": 19153.0,
- "Position": 258.0
- }, {
- "StartTime": 19212.0,
- "Position": 221.0
- }, {
- "StartTime": 19271.0,
- "Position": 481.0
- }, {
- "StartTime": 19331.0,
- "Position": 92.0
- }, {
- "StartTime": 19390.0,
- "Position": 211.0
- }, {
- "StartTime": 19450.0,
- "Position": 135.0
- }]
- }, {
- "StartTime": 19875.0,
- "Objects": [{
- "StartTime": 19875.0,
- "Position": 216.0
- }, {
- "StartTime": 19937.0,
- "Position": 215.307053
- }, {
- "StartTime": 20000.0,
- "Position": 236.036865
- }, {
- "StartTime": 20062.0,
- "Position": 236.312088
- }, {
- "StartTime": 20125.0,
- "Position": 235.838928
- }, {
- "StartTime": 20187.0,
- "Position": 269.9743
- }, {
- "StartTime": 20250.0,
- "Position": 285.999146
- }, {
- "StartTime": 20312.0,
- "Position": 283.669067
- }, {
- "StartTime": 20375.0,
- "Position": 317.446747
- }, {
- "StartTime": 20437.0,
- "Position": 330.750275
- }, {
- "StartTime": 20500.0,
- "Position": 344.0156
- }, {
- "StartTime": 20562.0,
- "Position": 318.472168
- }, {
- "StartTime": 20625.0,
- "Position": 309.165466
- }, {
- "StartTime": 20687.0,
- "Position": 317.044617
- }, {
- "StartTime": 20750.0,
- "Position": 280.457367
- }, {
- "StartTime": 20812.0,
- "Position": 272.220581
- }, {
- "StartTime": 20875.0,
- "Position": 270.3294
- }, {
- "StartTime": 20937.0,
- "Position": 262.57605
- }, {
- "StartTime": 21000.0,
- "Position": 244.803329
- }, {
- "StartTime": 21062.0,
- "Position": 215.958359
- }, {
- "StartTime": 21125.0,
- "Position": 177.79332
- }, {
- "StartTime": 21187.0,
- "Position": 190.948349
- }, {
- "StartTime": 21250.0,
- "Position": 158.78334
- }, {
- "StartTime": 21312.0,
- "Position": 136.93837
- }, {
- "StartTime": 21375.0,
- "Position": 119.121056
- }, {
- "StartTime": 21437.0,
- "Position": 132.387573
- }, {
- "StartTime": 21500.0,
- "Position": 124.503014
- }, {
- "StartTime": 21562.0,
- "Position": 118.749374
- }, {
- "StartTime": 21625.0,
- "Position": 123.165535
- }, {
- "StartTime": 21687.0,
- "Position": 96.02999
- }, {
- "StartTime": 21750.0,
- "Position": 118.547928
- }, {
- "StartTime": 21812.0,
- "Position": 128.856232
- }, {
- "StartTime": 21875.0,
- "Position": 124.28746
- }, {
- "StartTime": 21937.0,
- "Position": 150.754929
- }, {
- "StartTime": 22000.0,
- "Position": 149.528732
- }, {
- "StartTime": 22062.0,
- "Position": 145.1691
- }, {
- "StartTime": 22125.0,
- "Position": 182.802155
- }, {
- "StartTime": 22187.0,
- "Position": 178.6452
- }, {
- "StartTime": 22250.0,
- "Position": 213.892181
- }, {
- "StartTime": 22312.0,
- "Position": 218.713028
- }, {
- "StartTime": 22375.0,
- "Position": 240.4715
- }, {
- "StartTime": 22437.0,
- "Position": 239.371887
- }, {
- "StartTime": 22500.0,
- "Position": 261.907257
- }, {
- "StartTime": 22562.0,
- "Position": 314.353119
- }, {
- "StartTime": 22625.0,
- "Position": 299.273376
- }, {
- "StartTime": 22687.0,
- "Position": 356.98288
- }, {
- "StartTime": 22750.0,
- "Position": 339.078552
- }, {
- "StartTime": 22812.0,
- "Position": 377.8958
- }, {
- "StartTime": 22875.0,
- "Position": 398.054047
- }, {
- "StartTime": 22937.0,
- "Position": 398.739441
- }, {
- "StartTime": 23000.0,
- "Position": 407.178467
- }, {
- "StartTime": 23062.0,
- "Position": 444.8687
- }, {
- "StartTime": 23125.0,
- "Position": 417.069977
- }, {
- "StartTime": 23187.0,
- "Position": 454.688477
- }, {
- "StartTime": 23250.0,
- "Position": 428.9612
- }, {
- "StartTime": 23312.0,
- "Position": 441.92807
- }, {
- "StartTime": 23375.0,
- "Position": 439.749878
- }, {
- "StartTime": 23433.0,
- "Position": 455.644684
- }, {
- "StartTime": 23491.0,
- "Position": 440.7359
- }, {
- "StartTime": 23549.0,
- "Position": 430.0944
- }, {
- "StartTime": 23607.0,
- "Position": 420.796173
- }, {
- "StartTime": 23665.0,
- "Position": 435.897461
- }, {
- "StartTime": 23723.0,
- "Position": 418.462555
- }, {
- "StartTime": 23781.0,
- "Position": 405.53775
- }, {
- "StartTime": 23874.0,
- "Position": 408.720825
- }]
- }]
+ "StartTime": 500,
+ "Objects": [{
+ "StartTime": 500,
+ "Position": 96
+ },
+ {
+ "StartTime": 562,
+ "Position": 100.84
+ },
+ {
+ "StartTime": 625,
+ "Position": 125
+ },
+ {
+ "StartTime": 687,
+ "Position": 152.84
+ },
+ {
+ "StartTime": 750,
+ "Position": 191
+ },
+ {
+ "StartTime": 812,
+ "Position": 212.84
+ },
+ {
+ "StartTime": 875,
+ "Position": 217
+ },
+ {
+ "StartTime": 937,
+ "Position": 234.84
+ },
+ {
+ "StartTime": 1000,
+ "Position": 256
+ },
+ {
+ "StartTime": 1062,
+ "Position": 267.84
+ },
+ {
+ "StartTime": 1125,
+ "Position": 284
+ },
+ {
+ "StartTime": 1187,
+ "Position": 311.84
+ },
+ {
+ "StartTime": 1250,
+ "Position": 350
+ },
+ {
+ "StartTime": 1312,
+ "Position": 359.84
+ },
+ {
+ "StartTime": 1375,
+ "Position": 367
+ },
+ {
+ "StartTime": 1437,
+ "Position": 400.84
+ },
+ {
+ "StartTime": 1500,
+ "Position": 416
+ },
+ {
+ "StartTime": 1562,
+ "Position": 377.159973
+ },
+ {
+ "StartTime": 1625,
+ "Position": 367
+ },
+ {
+ "StartTime": 1687,
+ "Position": 374.159973
+ },
+ {
+ "StartTime": 1750,
+ "Position": 353
+ },
+ {
+ "StartTime": 1812,
+ "Position": 329.159973
+ },
+ {
+ "StartTime": 1875,
+ "Position": 288
+ },
+ {
+ "StartTime": 1937,
+ "Position": 259.159973
+ },
+ {
+ "StartTime": 2000,
+ "Position": 256
+ },
+ {
+ "StartTime": 2058,
+ "Position": 232.44
+ },
+ {
+ "StartTime": 2116,
+ "Position": 222.879974
+ },
+ {
+ "StartTime": 2174,
+ "Position": 185.319992
+ },
+ {
+ "StartTime": 2232,
+ "Position": 177.76001
+ },
+ {
+ "StartTime": 2290,
+ "Position": 162.200012
+ },
+ {
+ "StartTime": 2348,
+ "Position": 158.639984
+ },
+ {
+ "StartTime": 2406,
+ "Position": 111.079994
+ },
+ {
+ "StartTime": 2500,
+ "Position": 96
+ }
+ ]
+ },
+ {
+ "StartTime": 3000,
+ "Objects": [{
+ "StartTime": 3000,
+ "Position": 18
+ },
+ {
+ "StartTime": 3062,
+ "Position": 249
+ },
+ {
+ "StartTime": 3125,
+ "Position": 184
+ },
+ {
+ "StartTime": 3187,
+ "Position": 477
+ },
+ {
+ "StartTime": 3250,
+ "Position": 43
+ },
+ {
+ "StartTime": 3312,
+ "Position": 494
+ },
+ {
+ "StartTime": 3375,
+ "Position": 135
+ },
+ {
+ "StartTime": 3437,
+ "Position": 30
+ },
+ {
+ "StartTime": 3500,
+ "Position": 11
+ },
+ {
+ "StartTime": 3562,
+ "Position": 239
+ },
+ {
+ "StartTime": 3625,
+ "Position": 505
+ },
+ {
+ "StartTime": 3687,
+ "Position": 353
+ },
+ {
+ "StartTime": 3750,
+ "Position": 136
+ },
+ {
+ "StartTime": 3812,
+ "Position": 135
+ },
+ {
+ "StartTime": 3875,
+ "Position": 346
+ },
+ {
+ "StartTime": 3937,
+ "Position": 39
+ },
+ {
+ "StartTime": 4000,
+ "Position": 300
+ }
+ ]
+ },
+ {
+ "StartTime": 4500,
+ "Objects": [{
+ "StartTime": 4500,
+ "Position": 398
+ },
+ {
+ "StartTime": 4562,
+ "Position": 151
+ },
+ {
+ "StartTime": 4625,
+ "Position": 73
+ },
+ {
+ "StartTime": 4687,
+ "Position": 311
+ },
+ {
+ "StartTime": 4750,
+ "Position": 90
+ },
+ {
+ "StartTime": 4812,
+ "Position": 264
+ },
+ {
+ "StartTime": 4875,
+ "Position": 477
+ },
+ {
+ "StartTime": 4937,
+ "Position": 473
+ },
+ {
+ "StartTime": 5000,
+ "Position": 120
+ },
+ {
+ "StartTime": 5062,
+ "Position": 115
+ },
+ {
+ "StartTime": 5125,
+ "Position": 163
+ },
+ {
+ "StartTime": 5187,
+ "Position": 447
+ },
+ {
+ "StartTime": 5250,
+ "Position": 72
+ },
+ {
+ "StartTime": 5312,
+ "Position": 257
+ },
+ {
+ "StartTime": 5375,
+ "Position": 153
+ },
+ {
+ "StartTime": 5437,
+ "Position": 388
+ },
+ {
+ "StartTime": 5500,
+ "Position": 336
+ }
+ ]
+ },
+ {
+ "StartTime": 6000,
+ "Objects": [{
+ "StartTime": 6000,
+ "Position": 13
+ },
+ {
+ "StartTime": 6062,
+ "Position": 429
+ },
+ {
+ "StartTime": 6125,
+ "Position": 381
+ },
+ {
+ "StartTime": 6187,
+ "Position": 186
+ },
+ {
+ "StartTime": 6250,
+ "Position": 267
+ },
+ {
+ "StartTime": 6312,
+ "Position": 305
+ },
+ {
+ "StartTime": 6375,
+ "Position": 456
+ },
+ {
+ "StartTime": 6437,
+ "Position": 26
+ },
+ {
+ "StartTime": 6500,
+ "Position": 238
+ }
+ ]
+ },
+ {
+ "StartTime": 7000,
+ "Objects": [{
+ "StartTime": 7000,
+ "Position": 256
+ },
+ {
+ "StartTime": 7062,
+ "Position": 262.84
+ },
+ {
+ "StartTime": 7125,
+ "Position": 295
+ },
+ {
+ "StartTime": 7187,
+ "Position": 303.84
+ },
+ {
+ "StartTime": 7250,
+ "Position": 336
+ },
+ {
+ "StartTime": 7312,
+ "Position": 319.16
+ },
+ {
+ "StartTime": 7375,
+ "Position": 306
+ },
+ {
+ "StartTime": 7437,
+ "Position": 272.16
+ },
+ {
+ "StartTime": 7500,
+ "Position": 256
+ },
+ {
+ "StartTime": 7562,
+ "Position": 255.84
+ },
+ {
+ "StartTime": 7625,
+ "Position": 300
+ },
+ {
+ "StartTime": 7687,
+ "Position": 320.84
+ },
+ {
+ "StartTime": 7750,
+ "Position": 336
+ },
+ {
+ "StartTime": 7803,
+ "Position": 319.04
+ },
+ {
+ "StartTime": 7857,
+ "Position": 283.76
+ },
+ {
+ "StartTime": 7910,
+ "Position": 265.8
+ },
+ {
+ "StartTime": 8000,
+ "Position": 256
+ }
+ ]
+ },
+ {
+ "StartTime": 8500,
+ "Objects": [{
+ "StartTime": 8500,
+ "Position": 32
+ },
+ {
+ "StartTime": 8562,
+ "Position": 21.8515015
+ },
+ {
+ "StartTime": 8625,
+ "Position": 44.5659637
+ },
+ {
+ "StartTime": 8687,
+ "Position": 33.3433228
+ },
+ {
+ "StartTime": 8750,
+ "Position": 63.58974
+ },
+ {
+ "StartTime": 8812,
+ "Position": 71.23422
+ },
+ {
+ "StartTime": 8875,
+ "Position": 62.7117844
+ },
+ {
+ "StartTime": 8937,
+ "Position": 65.52607
+ },
+ {
+ "StartTime": 9000,
+ "Position": 101.81015
+ },
+ {
+ "StartTime": 9062,
+ "Position": 134.47818
+ },
+ {
+ "StartTime": 9125,
+ "Position": 141.414444
+ },
+ {
+ "StartTime": 9187,
+ "Position": 164.1861
+ },
+ {
+ "StartTime": 9250,
+ "Position": 176.600418
+ },
+ {
+ "StartTime": 9312,
+ "Position": 184.293015
+ },
+ {
+ "StartTime": 9375,
+ "Position": 212.2076
+ },
+ {
+ "StartTime": 9437,
+ "Position": 236.438324
+ },
+ {
+ "StartTime": 9500,
+ "Position": 237.2304
+ },
+ {
+ "StartTime": 9562,
+ "Position": 241.253983
+ },
+ {
+ "StartTime": 9625,
+ "Position": 233.950623
+ },
+ {
+ "StartTime": 9687,
+ "Position": 265.3786
+ },
+ {
+ "StartTime": 9750,
+ "Position": 236.8865
+ },
+ {
+ "StartTime": 9812,
+ "Position": 273.38974
+ },
+ {
+ "StartTime": 9875,
+ "Position": 267.701874
+ },
+ {
+ "StartTime": 9937,
+ "Position": 263.2331
+ },
+ {
+ "StartTime": 10000,
+ "Position": 270.339874
+ },
+ {
+ "StartTime": 10062,
+ "Position": 291.9349
+ },
+ {
+ "StartTime": 10125,
+ "Position": 294.2969
+ },
+ {
+ "StartTime": 10187,
+ "Position": 307.834137
+ },
+ {
+ "StartTime": 10250,
+ "Position": 310.6449
+ },
+ {
+ "StartTime": 10312,
+ "Position": 344.746338
+ },
+ {
+ "StartTime": 10375,
+ "Position": 349.21875
+ },
+ {
+ "StartTime": 10437,
+ "Position": 373.943
+ },
+ {
+ "StartTime": 10500,
+ "Position": 401.0588
+ },
+ {
+ "StartTime": 10558,
+ "Position": 421.21347
+ },
+ {
+ "StartTime": 10616,
+ "Position": 431.6034
+ },
+ {
+ "StartTime": 10674,
+ "Position": 433.835754
+ },
+ {
+ "StartTime": 10732,
+ "Position": 452.5042
+ },
+ {
+ "StartTime": 10790,
+ "Position": 486.290955
+ },
+ {
+ "StartTime": 10848,
+ "Position": 488.943237
+ },
+ {
+ "StartTime": 10906,
+ "Position": 493.3372
+ },
+ {
+ "StartTime": 10999,
+ "Position": 508.166229
+ }
+ ]
+ },
+ {
+ "StartTime": 11500,
+ "Objects": [{
+ "StartTime": 11500,
+ "Position": 97
+ },
+ {
+ "StartTime": 11562,
+ "Position": 267
+ },
+ {
+ "StartTime": 11625,
+ "Position": 116
+ },
+ {
+ "StartTime": 11687,
+ "Position": 451
+ },
+ {
+ "StartTime": 11750,
+ "Position": 414
+ },
+ {
+ "StartTime": 11812,
+ "Position": 88
+ },
+ {
+ "StartTime": 11875,
+ "Position": 257
+ },
+ {
+ "StartTime": 11937,
+ "Position": 175
+ },
+ {
+ "StartTime": 12000,
+ "Position": 38
+ }
+ ]
+ },
+ {
+ "StartTime": 12500,
+ "Objects": [{
+ "StartTime": 12500,
+ "Position": 512
+ },
+ {
+ "StartTime": 12562,
+ "Position": 494.3132
+ },
+ {
+ "StartTime": 12625,
+ "Position": 461.3089
+ },
+ {
+ "StartTime": 12687,
+ "Position": 469.6221
+ },
+ {
+ "StartTime": 12750,
+ "Position": 441.617767
+ },
+ {
+ "StartTime": 12812,
+ "Position": 402.930969
+ },
+ {
+ "StartTime": 12875,
+ "Position": 407.926666
+ },
+ {
+ "StartTime": 12937,
+ "Position": 364.239868
+ },
+ {
+ "StartTime": 13000,
+ "Position": 353.235535
+ },
+ {
+ "StartTime": 13062,
+ "Position": 320.548767
+ },
+ {
+ "StartTime": 13125,
+ "Position": 303.544434
+ },
+ {
+ "StartTime": 13187,
+ "Position": 295.857635
+ },
+ {
+ "StartTime": 13250,
+ "Position": 265.853333
+ },
+ {
+ "StartTime": 13312,
+ "Position": 272.166534
+ },
+ {
+ "StartTime": 13375,
+ "Position": 240.1622
+ },
+ {
+ "StartTime": 13437,
+ "Position": 229.4754
+ },
+ {
+ "StartTime": 13500,
+ "Position": 194.471069
+ },
+ {
+ "StartTime": 13562,
+ "Position": 158.784271
+ },
+ {
+ "StartTime": 13625,
+ "Position": 137.779968
+ },
+ {
+ "StartTime": 13687,
+ "Position": 147.09314
+ },
+ {
+ "StartTime": 13750,
+ "Position": 122.088837
+ },
+ {
+ "StartTime": 13812,
+ "Position": 77.40204
+ },
+ {
+ "StartTime": 13875,
+ "Position": 79.3977356
+ },
+ {
+ "StartTime": 13937,
+ "Position": 56.710907
+ },
+ {
+ "StartTime": 14000,
+ "Position": 35.7066345
+ },
+ {
+ "StartTime": 14062,
+ "Position": 1.01980591
+ },
+ {
+ "StartTime": 14125,
+ "Position": 0
+ },
+ {
+ "StartTime": 14187,
+ "Position": 21.7696266
+ },
+ {
+ "StartTime": 14250,
+ "Position": 49.0119171
+ },
+ {
+ "StartTime": 14312,
+ "Position": 48.9488258
+ },
+ {
+ "StartTime": 14375,
+ "Position": 87.19112
+ },
+ {
+ "StartTime": 14437,
+ "Position": 97.12803
+ },
+ {
+ "StartTime": 14500,
+ "Position": 118.370323
+ },
+ {
+ "StartTime": 14562,
+ "Position": 130.307236
+ },
+ {
+ "StartTime": 14625,
+ "Position": 154.549515
+ },
+ {
+ "StartTime": 14687,
+ "Position": 190.486435
+ },
+ {
+ "StartTime": 14750,
+ "Position": 211.728714
+ },
+ {
+ "StartTime": 14812,
+ "Position": 197.665634
+ },
+ {
+ "StartTime": 14875,
+ "Position": 214.907928
+ },
+ {
+ "StartTime": 14937,
+ "Position": 263.844849
+ },
+ {
+ "StartTime": 15000,
+ "Position": 271.087128
+ },
+ {
+ "StartTime": 15062,
+ "Position": 270.024017
+ },
+ {
+ "StartTime": 15125,
+ "Position": 308.266327
+ },
+ {
+ "StartTime": 15187,
+ "Position": 313.203247
+ },
+ {
+ "StartTime": 15250,
+ "Position": 328.445526
+ },
+ {
+ "StartTime": 15312,
+ "Position": 370.382446
+ },
+ {
+ "StartTime": 15375,
+ "Position": 387.624725
+ },
+ {
+ "StartTime": 15437,
+ "Position": 421.561646
+ },
+ {
+ "StartTime": 15500,
+ "Position": 423.803925
+ },
+ {
+ "StartTime": 15562,
+ "Position": 444.740845
+ },
+ {
+ "StartTime": 15625,
+ "Position": 469.983124
+ },
+ {
+ "StartTime": 15687,
+ "Position": 473.920044
+ },
+ {
+ "StartTime": 15750,
+ "Position": 501.162323
+ },
+ {
+ "StartTime": 15812,
+ "Position": 488.784332
+ },
+ {
+ "StartTime": 15875,
+ "Position": 466.226227
+ },
+ {
+ "StartTime": 15937,
+ "Position": 445.978638
+ },
+ {
+ "StartTime": 16000,
+ "Position": 446.420532
+ },
+ {
+ "StartTime": 16058,
+ "Position": 428.4146
+ },
+ {
+ "StartTime": 16116,
+ "Position": 420.408844
+ },
+ {
+ "StartTime": 16174,
+ "Position": 374.402924
+ },
+ {
+ "StartTime": 16232,
+ "Position": 371.397156
+ },
+ {
+ "StartTime": 16290,
+ "Position": 350.391235
+ },
+ {
+ "StartTime": 16348,
+ "Position": 340.385468
+ },
+ {
+ "StartTime": 16406,
+ "Position": 337.3797
+ },
+ {
+ "StartTime": 16500,
+ "Position": 291.1977
+ }
+ ]
+ },
+ {
+ "StartTime": 17000,
+ "Objects": [{
+ "StartTime": 17000,
+ "Position": 256
+ },
+ {
+ "StartTime": 17062,
+ "Position": 247.16
+ },
+ {
+ "StartTime": 17125,
+ "Position": 211
+ },
+ {
+ "StartTime": 17187,
+ "Position": 183.16
+ },
+ {
+ "StartTime": 17250,
+ "Position": 176
+ },
+ {
+ "StartTime": 17312,
+ "Position": 204.84
+ },
+ {
+ "StartTime": 17375,
+ "Position": 218
+ },
+ {
+ "StartTime": 17437,
+ "Position": 231.84
+ },
+ {
+ "StartTime": 17500,
+ "Position": 256
+ },
+ {
+ "StartTime": 17562,
+ "Position": 229.16
+ },
+ {
+ "StartTime": 17625,
+ "Position": 227
+ },
+ {
+ "StartTime": 17687,
+ "Position": 186.16
+ },
+ {
+ "StartTime": 17750,
+ "Position": 176
+ },
+ {
+ "StartTime": 17803,
+ "Position": 211.959991
+ },
+ {
+ "StartTime": 17857,
+ "Position": 197.23999
+ },
+ {
+ "StartTime": 17910,
+ "Position": 225.200012
+ },
+ {
+ "StartTime": 18000,
+ "Position": 256
+ }
+ ]
+ },
+ {
+ "StartTime": 18500,
+ "Objects": [{
+ "StartTime": 18500,
+ "Position": 437
+ },
+ {
+ "StartTime": 18559,
+ "Position": 289
+ },
+ {
+ "StartTime": 18618,
+ "Position": 464
+ },
+ {
+ "StartTime": 18678,
+ "Position": 36
+ },
+ {
+ "StartTime": 18737,
+ "Position": 378
+ },
+ {
+ "StartTime": 18796,
+ "Position": 297
+ },
+ {
+ "StartTime": 18856,
+ "Position": 418
+ },
+ {
+ "StartTime": 18915,
+ "Position": 329
+ },
+ {
+ "StartTime": 18975,
+ "Position": 338
+ },
+ {
+ "StartTime": 19034,
+ "Position": 394
+ },
+ {
+ "StartTime": 19093,
+ "Position": 40
+ },
+ {
+ "StartTime": 19153,
+ "Position": 13
+ },
+ {
+ "StartTime": 19212,
+ "Position": 80
+ },
+ {
+ "StartTime": 19271,
+ "Position": 138
+ },
+ {
+ "StartTime": 19331,
+ "Position": 311
+ },
+ {
+ "StartTime": 19390,
+ "Position": 216
+ },
+ {
+ "StartTime": 19450,
+ "Position": 310
+ }
+ ]
+ },
+ {
+ "StartTime": 19875,
+ "Objects": [{
+ "StartTime": 19875,
+ "Position": 216
+ },
+ {
+ "StartTime": 19937,
+ "Position": 228.307053
+ },
+ {
+ "StartTime": 20000,
+ "Position": 214.036865
+ },
+ {
+ "StartTime": 20062,
+ "Position": 224.312088
+ },
+ {
+ "StartTime": 20125,
+ "Position": 253.838928
+ },
+ {
+ "StartTime": 20187,
+ "Position": 259.9743
+ },
+ {
+ "StartTime": 20250,
+ "Position": 299.999146
+ },
+ {
+ "StartTime": 20312,
+ "Position": 289.669067
+ },
+ {
+ "StartTime": 20375,
+ "Position": 317.446747
+ },
+ {
+ "StartTime": 20437,
+ "Position": 344.750275
+ },
+ {
+ "StartTime": 20500,
+ "Position": 328.0156
+ },
+ {
+ "StartTime": 20562,
+ "Position": 331.472168
+ },
+ {
+ "StartTime": 20625,
+ "Position": 302.165466
+ },
+ {
+ "StartTime": 20687,
+ "Position": 303.044617
+ },
+ {
+ "StartTime": 20750,
+ "Position": 306.457367
+ },
+ {
+ "StartTime": 20812,
+ "Position": 265.220581
+ },
+ {
+ "StartTime": 20875,
+ "Position": 270.3294
+ },
+ {
+ "StartTime": 20937,
+ "Position": 257.57605
+ },
+ {
+ "StartTime": 21000,
+ "Position": 247.803329
+ },
+ {
+ "StartTime": 21062,
+ "Position": 225.958359
+ },
+ {
+ "StartTime": 21125,
+ "Position": 201.79332
+ },
+ {
+ "StartTime": 21187,
+ "Position": 170.948349
+ },
+ {
+ "StartTime": 21250,
+ "Position": 146.78334
+ },
+ {
+ "StartTime": 21312,
+ "Position": 149.93837
+ },
+ {
+ "StartTime": 21375,
+ "Position": 119.121056
+ },
+ {
+ "StartTime": 21437,
+ "Position": 133.387573
+ },
+ {
+ "StartTime": 21500,
+ "Position": 117.503014
+ },
+ {
+ "StartTime": 21562,
+ "Position": 103.749374
+ },
+ {
+ "StartTime": 21625,
+ "Position": 127.165535
+ },
+ {
+ "StartTime": 21687,
+ "Position": 113.029991
+ },
+ {
+ "StartTime": 21750,
+ "Position": 101.547928
+ },
+ {
+ "StartTime": 21812,
+ "Position": 133.856232
+ },
+ {
+ "StartTime": 21875,
+ "Position": 124.28746
+ },
+ {
+ "StartTime": 21937,
+ "Position": 121.754929
+ },
+ {
+ "StartTime": 22000,
+ "Position": 155.528732
+ },
+ {
+ "StartTime": 22062,
+ "Position": 142.1691
+ },
+ {
+ "StartTime": 22125,
+ "Position": 186.802155
+ },
+ {
+ "StartTime": 22187,
+ "Position": 198.6452
+ },
+ {
+ "StartTime": 22250,
+ "Position": 191.892181
+ },
+ {
+ "StartTime": 22312,
+ "Position": 232.713028
+ },
+ {
+ "StartTime": 22375,
+ "Position": 240.4715
+ },
+ {
+ "StartTime": 22437,
+ "Position": 278.3719
+ },
+ {
+ "StartTime": 22500,
+ "Position": 288.907257
+ },
+ {
+ "StartTime": 22562,
+ "Position": 297.353119
+ },
+ {
+ "StartTime": 22625,
+ "Position": 301.273376
+ },
+ {
+ "StartTime": 22687,
+ "Position": 339.98288
+ },
+ {
+ "StartTime": 22750,
+ "Position": 353.078552
+ },
+ {
+ "StartTime": 22812,
+ "Position": 363.8958
+ },
+ {
+ "StartTime": 22875,
+ "Position": 398.054047
+ },
+ {
+ "StartTime": 22937,
+ "Position": 419.739441
+ },
+ {
+ "StartTime": 23000,
+ "Position": 435.178467
+ },
+ {
+ "StartTime": 23062,
+ "Position": 420.8687
+ },
+ {
+ "StartTime": 23125,
+ "Position": 448.069977
+ },
+ {
+ "StartTime": 23187,
+ "Position": 425.688477
+ },
+ {
+ "StartTime": 23250,
+ "Position": 426.9612
+ },
+ {
+ "StartTime": 23312,
+ "Position": 454.92807
+ },
+ {
+ "StartTime": 23375,
+ "Position": 439.749878
+ },
+ {
+ "StartTime": 23433,
+ "Position": 440.644684
+ },
+ {
+ "StartTime": 23491,
+ "Position": 445.7359
+ },
+ {
+ "StartTime": 23549,
+ "Position": 432.0944
+ },
+ {
+ "StartTime": 23607,
+ "Position": 415.796173
+ },
+ {
+ "StartTime": 23665,
+ "Position": 407.897461
+ },
+ {
+ "StartTime": 23723,
+ "Position": 409.462555
+ },
+ {
+ "StartTime": 23781,
+ "Position": 406.53775
+ },
+ {
+ "StartTime": 23874,
+ "Position": 408.720825
+ }
+ ]
+ }
+ ]
}
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-and-circles-expected-conversion.json b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-and-circles-expected-conversion.json
new file mode 100644
index 0000000000..dd81947f1c
--- /dev/null
+++ b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-and-circles-expected-conversion.json
@@ -0,0 +1,65 @@
+{
+ "Mappings": [{
+ "StartTime": 2589,
+ "Objects": [{
+ "StartTime": 2589,
+ "Position": 256
+ }]
+ },
+ {
+ "StartTime": 2915,
+ "Objects": [{
+ "StartTime": 2915,
+ "Position": 65
+ },
+ {
+ "StartTime": 2916,
+ "Position": 482
+ }
+ ]
+ },
+ {
+ "StartTime": 3078,
+ "Objects": [{
+ "StartTime": 3078,
+ "Position": 164
+ },
+ {
+ "StartTime": 3079,
+ "Position": 315
+ }
+ ]
+ },
+ {
+ "StartTime": 3241,
+ "Objects": [{
+ "StartTime": 3241,
+ "Position": 145
+ },
+ {
+ "StartTime": 3242,
+ "Position": 159
+ }
+ ]
+ },
+ {
+ "StartTime": 3404,
+ "Objects": [{
+ "StartTime": 3404,
+ "Position": 310
+ },
+ {
+ "StartTime": 3405,
+ "Position": 441
+ }
+ ]
+ },
+ {
+ "StartTime": 5197,
+ "Objects": [{
+ "StartTime": 5197,
+ "Position": 256
+ }]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-and-circles.osu b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-and-circles.osu
new file mode 100644
index 0000000000..9a90768428
--- /dev/null
+++ b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-and-circles.osu
@@ -0,0 +1,24 @@
+osu file format v14
+
+[General]
+StackLeniency: 0.7
+Mode: 2
+
+[Difficulty]
+HPDrainRate:5
+CircleSize:2
+OverallDifficulty:5
+ApproachRate:8
+SliderMultiplier:1.4
+SliderTickRate:4
+
+[TimingPoints]
+2589,326.086956521739,4,2,1,70,1,0
+
+[HitObjects]
+256,192,2589,5,0,0:0:0:0:
+256,192,2915,12,0,2916,0:0:0:0:
+256,192,3078,12,0,3079,0:0:0:0:
+256,192,3241,12,0,3242,0:0:0:0:
+256,192,3404,12,0,3405,0:0:0:0:
+256,192,5197,5,0,0:0:0:0:
diff --git a/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-expected-conversion.json b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-expected-conversion.json
new file mode 100644
index 0000000000..b69b1ae056
--- /dev/null
+++ b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner-expected-conversion.json
@@ -0,0 +1,74 @@
+{
+ "Mappings": [{
+ "StartTime": 18500,
+ "Objects": [{
+ "StartTime": 18500,
+ "Position": 65
+ },
+ {
+ "StartTime": 18559,
+ "Position": 482
+ },
+ {
+ "StartTime": 18618,
+ "Position": 164
+ },
+ {
+ "StartTime": 18678,
+ "Position": 315
+ },
+ {
+ "StartTime": 18737,
+ "Position": 145
+ },
+ {
+ "StartTime": 18796,
+ "Position": 159
+ },
+ {
+ "StartTime": 18856,
+ "Position": 310
+ },
+ {
+ "StartTime": 18915,
+ "Position": 441
+ },
+ {
+ "StartTime": 18975,
+ "Position": 428
+ },
+ {
+ "StartTime": 19034,
+ "Position": 243
+ },
+ {
+ "StartTime": 19093,
+ "Position": 422
+ },
+ {
+ "StartTime": 19153,
+ "Position": 481
+ },
+ {
+ "StartTime": 19212,
+ "Position": 104
+ },
+ {
+ "StartTime": 19271,
+ "Position": 473
+ },
+ {
+ "StartTime": 19331,
+ "Position": 135
+ },
+ {
+ "StartTime": 19390,
+ "Position": 360
+ },
+ {
+ "StartTime": 19450,
+ "Position": 123
+ }
+ ]
+ }]
+}
\ No newline at end of file
diff --git a/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner.osu b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner.osu
new file mode 100644
index 0000000000..0fbd4dbf42
--- /dev/null
+++ b/osu.Game.Rulesets.Catch/Resources/Testing/Beatmaps/spinner.osu
@@ -0,0 +1,20 @@
+osu file format v14
+
+[General]
+Mode: 2
+
+[Difficulty]
+HPDrainRate:6
+CircleSize:4
+OverallDifficulty:7
+ApproachRate:8.3
+SliderMultiplier:1.6
+SliderTickRate:1
+
+[TimingPoints]
+500,500,4,2,1,50,1,0
+13426,-100,4,3,1,45,0,0
+14884,-100,4,2,1,50,0,0
+
+[HitObjects]
+256,192,18500,12,0,19450,0:0:0:0:
diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs
index 4310d9b7df..9b50aed077 100644
--- a/osu.Game/Beatmaps/WorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/WorkingBeatmap.cs
@@ -116,9 +116,6 @@ namespace osu.Game.Beatmaps
mod.ApplyToDifficulty(converted.BeatmapInfo.BaseDifficulty);
}
- // Post-process
- rulesetInstance.CreateBeatmapProcessor(converted)?.PostProcess();
-
// Compute default values for hitobjects, including creating nested hitobjects in-case they're needed
foreach (var obj in converted.HitObjects)
obj.ApplyDefaults(converted.ControlPointInfo, converted.BeatmapInfo.BaseDifficulty);
@@ -127,6 +124,9 @@ namespace osu.Game.Beatmaps
foreach (var obj in converted.HitObjects)
mod.ApplyToHitObject(obj);
+ // Post-process
+ rulesetInstance.CreateBeatmapProcessor(converted)?.PostProcess();
+
return converted;
}
diff --git a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs b/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
index ffe1560627..a12f9dee7e 100644
--- a/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
+++ b/osu.Game/Overlays/KeyBinding/KeyBindingRow.cs
@@ -186,7 +186,7 @@ namespace osu.Game.Overlays.KeyBinding
{
if (bindTarget.IsHovered)
{
- bindTarget.UpdateKeyCombination(KeyCombination.FromInputState(state));
+ bindTarget.UpdateKeyCombination(new KeyCombination(KeyCombination.FromInputState(state).Keys.Append(state.Mouse.ScrollDelta.Y > 0 ? InputKey.MouseWheelUp : InputKey.MouseWheelDown)));
finalise();
return true;
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 9cc538f70f..9668d40fd5 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -14,12 +14,12 @@
-
-
-
+
+
+
-
-
+
+
diff --git a/osu.TestProject.props b/osu.TestProject.props
index 8f7128f8b7..c2e6048a60 100644
--- a/osu.TestProject.props
+++ b/osu.TestProject.props
@@ -11,7 +11,7 @@
-
+