mirror of
https://github.com/osukey/osukey.git
synced 2025-08-06 16:13:57 +09:00
Merge branch 'master' into fix-music-controller-skipping-more-than-once
This commit is contained in:
@ -11,7 +11,6 @@ using System.Collections.Generic;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Game.Rulesets.Catch.Objects;
|
|
||||||
using osu.Game.Rulesets.Catch.Replays;
|
using osu.Game.Rulesets.Catch.Replays;
|
||||||
using osu.Game.Rulesets.Replays.Types;
|
using osu.Game.Rulesets.Replays.Types;
|
||||||
using osu.Game.Beatmaps.Legacy;
|
using osu.Game.Beatmaps.Legacy;
|
||||||
@ -108,7 +107,7 @@ namespace osu.Game.Rulesets.Catch
|
|||||||
case ModType.Fun:
|
case ModType.Fun:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new MultiMod(new ModWindUp<CatchHitObject>(), new ModWindDown<CatchHitObject>())
|
new MultiMod(new ModWindUp(), new ModWindDown())
|
||||||
};
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -13,7 +13,6 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Rulesets.Mania.Objects;
|
|
||||||
using osu.Game.Rulesets.Mania.Replays;
|
using osu.Game.Rulesets.Mania.Replays;
|
||||||
using osu.Game.Rulesets.Replays.Types;
|
using osu.Game.Rulesets.Replays.Types;
|
||||||
using osu.Game.Beatmaps.Legacy;
|
using osu.Game.Beatmaps.Legacy;
|
||||||
@ -154,7 +153,7 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
case ModType.Fun:
|
case ModType.Fun:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new MultiMod(new ModWindUp<ManiaHitObject>(), new ModWindDown<ManiaHitObject>())
|
new MultiMod(new ModWindUp(), new ModWindDown())
|
||||||
};
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -10,7 +10,7 @@ using osu.Game.Rulesets.Mania.Beatmaps;
|
|||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
public class ManiaModMirror : Mod, IApplicableToBeatmap<ManiaHitObject>
|
public class ManiaModMirror : Mod, IApplicableToBeatmap
|
||||||
{
|
{
|
||||||
public override string Name => "Mirror";
|
public override string Name => "Mirror";
|
||||||
public override string Acronym => "MR";
|
public override string Acronym => "MR";
|
||||||
@ -18,7 +18,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override bool Ranked => true;
|
public override bool Ranked => true;
|
||||||
|
|
||||||
public void ApplyToBeatmap(Beatmap<ManiaHitObject> beatmap)
|
public void ApplyToBeatmap(IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
var availableColumns = ((ManiaBeatmap)beatmap).TotalColumns;
|
var availableColumns = ((ManiaBeatmap)beatmap).TotalColumns;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ using osu.Game.Rulesets.Mods;
|
|||||||
|
|
||||||
namespace osu.Game.Rulesets.Mania.Mods
|
namespace osu.Game.Rulesets.Mania.Mods
|
||||||
{
|
{
|
||||||
public class ManiaModRandom : Mod, IApplicableToBeatmap<ManiaHitObject>
|
public class ManiaModRandom : Mod, IApplicableToBeatmap
|
||||||
{
|
{
|
||||||
public override string Name => "Random";
|
public override string Name => "Random";
|
||||||
public override string Acronym => "RD";
|
public override string Acronym => "RD";
|
||||||
@ -22,7 +22,7 @@ namespace osu.Game.Rulesets.Mania.Mods
|
|||||||
public override string Description => @"Shuffle around the keys!";
|
public override string Description => @"Shuffle around the keys!";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
|
|
||||||
public void ApplyToBeatmap(Beatmap<ManiaHitObject> beatmap)
|
public void ApplyToBeatmap(IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
var availableColumns = ((ManiaBeatmap)beatmap).TotalColumns;
|
var availableColumns = ((ManiaBeatmap)beatmap).TotalColumns;
|
||||||
var shuffledColumns = Enumerable.Range(0, availableColumns).OrderBy(item => RNG.Next()).ToList();
|
var shuffledColumns = Enumerable.Range(0, availableColumns).OrderBy(item => RNG.Next()).ToList();
|
||||||
|
@ -21,6 +21,8 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
[TestCase("basic")]
|
[TestCase("basic")]
|
||||||
[TestCase("colinear-perfect-curve")]
|
[TestCase("colinear-perfect-curve")]
|
||||||
[TestCase("slider-ticks")]
|
[TestCase("slider-ticks")]
|
||||||
|
[TestCase("repeat-slider")]
|
||||||
|
[TestCase("uneven-repeat-slider")]
|
||||||
public new void Test(string name)
|
public new void Test(string name)
|
||||||
{
|
{
|
||||||
base.Test(name);
|
base.Test(name);
|
||||||
|
@ -14,7 +14,6 @@ using osu.Game.Overlays.Settings;
|
|||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Game.Rulesets.Osu.Edit;
|
using osu.Game.Rulesets.Osu.Edit;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
|
||||||
using osu.Game.Rulesets.Osu.Replays;
|
using osu.Game.Rulesets.Osu.Replays;
|
||||||
using osu.Game.Rulesets.Replays.Types;
|
using osu.Game.Rulesets.Replays.Types;
|
||||||
using osu.Game.Beatmaps.Legacy;
|
using osu.Game.Beatmaps.Legacy;
|
||||||
@ -136,7 +135,7 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
new OsuModWiggle(),
|
new OsuModWiggle(),
|
||||||
new OsuModSpinIn(),
|
new OsuModSpinIn(),
|
||||||
new MultiMod(new OsuModGrow(), new OsuModDeflate()),
|
new MultiMod(new OsuModGrow(), new OsuModDeflate()),
|
||||||
new MultiMod(new ModWindUp<OsuHitObject>(), new ModWindDown<OsuHitObject>()),
|
new MultiMod(new ModWindUp(), new ModWindDown()),
|
||||||
};
|
};
|
||||||
|
|
||||||
case ModType.System:
|
case ModType.System:
|
||||||
|
@ -0,0 +1,222 @@
|
|||||||
|
{
|
||||||
|
"Mappings": [{
|
||||||
|
"StartTime": 369,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 369,
|
||||||
|
"EndTime": 369,
|
||||||
|
"X": 177,
|
||||||
|
"Y": 191
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 450,
|
||||||
|
"EndTime": 450,
|
||||||
|
"X": 216.539276,
|
||||||
|
"Y": 191.192871
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 532,
|
||||||
|
"EndTime": 532,
|
||||||
|
"X": 256.5667,
|
||||||
|
"Y": 191.388138
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 614,
|
||||||
|
"EndTime": 614,
|
||||||
|
"X": 296.594116,
|
||||||
|
"Y": 191.583389
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 696,
|
||||||
|
"EndTime": 696,
|
||||||
|
"X": 336.621521,
|
||||||
|
"Y": 191.778641
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 778,
|
||||||
|
"EndTime": 778,
|
||||||
|
"X": 376.648926,
|
||||||
|
"Y": 191.9739
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 860,
|
||||||
|
"EndTime": 860,
|
||||||
|
"X": 337.318878,
|
||||||
|
"Y": 191.782043
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 942,
|
||||||
|
"EndTime": 942,
|
||||||
|
"X": 297.291443,
|
||||||
|
"Y": 191.586792
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1024,
|
||||||
|
"EndTime": 1024,
|
||||||
|
"X": 257.264038,
|
||||||
|
"Y": 191.391541
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1106,
|
||||||
|
"EndTime": 1106,
|
||||||
|
"X": 217.2366,
|
||||||
|
"Y": 191.196274
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1188,
|
||||||
|
"EndTime": 1188,
|
||||||
|
"X": 177.209213,
|
||||||
|
"Y": 191.001022
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1270,
|
||||||
|
"EndTime": 1270,
|
||||||
|
"X": 216.818192,
|
||||||
|
"Y": 191.194229
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1352,
|
||||||
|
"EndTime": 1352,
|
||||||
|
"X": 256.8456,
|
||||||
|
"Y": 191.3895
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1434,
|
||||||
|
"EndTime": 1434,
|
||||||
|
"X": 296.873047,
|
||||||
|
"Y": 191.584747
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1516,
|
||||||
|
"EndTime": 1516,
|
||||||
|
"X": 336.900452,
|
||||||
|
"Y": 191.78
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1598,
|
||||||
|
"EndTime": 1598,
|
||||||
|
"X": 376.927917,
|
||||||
|
"Y": 191.975266
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1680,
|
||||||
|
"EndTime": 1680,
|
||||||
|
"X": 337.039948,
|
||||||
|
"Y": 191.780685
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1762,
|
||||||
|
"EndTime": 1762,
|
||||||
|
"X": 297.0125,
|
||||||
|
"Y": 191.585434
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1844,
|
||||||
|
"EndTime": 1844,
|
||||||
|
"X": 256.9851,
|
||||||
|
"Y": 191.390167
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1926,
|
||||||
|
"EndTime": 1926,
|
||||||
|
"X": 216.957672,
|
||||||
|
"Y": 191.194916
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2008,
|
||||||
|
"EndTime": 2008,
|
||||||
|
"X": 177.069717,
|
||||||
|
"Y": 191.000336
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2090,
|
||||||
|
"EndTime": 2090,
|
||||||
|
"X": 217.097137,
|
||||||
|
"Y": 191.1956
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2172,
|
||||||
|
"EndTime": 2172,
|
||||||
|
"X": 257.124573,
|
||||||
|
"Y": 191.390854
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2254,
|
||||||
|
"EndTime": 2254,
|
||||||
|
"X": 297.152,
|
||||||
|
"Y": 191.5861
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2336,
|
||||||
|
"EndTime": 2336,
|
||||||
|
"X": 337.179443,
|
||||||
|
"Y": 191.781372
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2418,
|
||||||
|
"EndTime": 2418,
|
||||||
|
"X": 376.7884,
|
||||||
|
"Y": 191.974579
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2500,
|
||||||
|
"EndTime": 2500,
|
||||||
|
"X": 336.760956,
|
||||||
|
"Y": 191.779327
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2582,
|
||||||
|
"EndTime": 2582,
|
||||||
|
"X": 296.733643,
|
||||||
|
"Y": 191.584076
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2664,
|
||||||
|
"EndTime": 2664,
|
||||||
|
"X": 256.7062,
|
||||||
|
"Y": 191.388809
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2746,
|
||||||
|
"EndTime": 2746,
|
||||||
|
"X": 216.678772,
|
||||||
|
"Y": 191.193558
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2828,
|
||||||
|
"EndTime": 2828,
|
||||||
|
"X": 177.348663,
|
||||||
|
"Y": 191.0017
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2909,
|
||||||
|
"EndTime": 2909,
|
||||||
|
"X": 216.887909,
|
||||||
|
"Y": 191.19458
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2991,
|
||||||
|
"EndTime": 2991,
|
||||||
|
"X": 256.915344,
|
||||||
|
"Y": 191.389832
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3073,
|
||||||
|
"EndTime": 3073,
|
||||||
|
"X": 296.942749,
|
||||||
|
"Y": 191.585083
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3155,
|
||||||
|
"EndTime": 3155,
|
||||||
|
"X": 336.970184,
|
||||||
|
"Y": 191.78035
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3201,
|
||||||
|
"EndTime": 3201,
|
||||||
|
"X": 376.99762,
|
||||||
|
"Y": 191.9756
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
osu file format v14
|
||||||
|
|
||||||
|
[General]
|
||||||
|
StackLeniency: 0.4
|
||||||
|
Mode: 0
|
||||||
|
|
||||||
|
[Difficulty]
|
||||||
|
CircleSize:4
|
||||||
|
OverallDifficulty:7
|
||||||
|
ApproachRate:8
|
||||||
|
SliderMultiplier:1.6
|
||||||
|
SliderTickRate:4
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
369,327.868852459016,4,2,2,32,1,0
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
177,191,369,6,0,L|382:192,7,200
|
@ -0,0 +1,348 @@
|
|||||||
|
{
|
||||||
|
"Mappings": [{
|
||||||
|
"StartTime": 369,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 369,
|
||||||
|
"EndTime": 369,
|
||||||
|
"X": 127,
|
||||||
|
"Y": 194
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 450,
|
||||||
|
"EndTime": 450,
|
||||||
|
"X": 166.53389,
|
||||||
|
"Y": 193.8691
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 532,
|
||||||
|
"EndTime": 532,
|
||||||
|
"X": 206.555847,
|
||||||
|
"Y": 193.736572
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 614,
|
||||||
|
"EndTime": 614,
|
||||||
|
"X": 246.57782,
|
||||||
|
"Y": 193.60405
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 696,
|
||||||
|
"EndTime": 696,
|
||||||
|
"X": 286.5998,
|
||||||
|
"Y": 193.471527
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 778,
|
||||||
|
"EndTime": 778,
|
||||||
|
"X": 326.621765,
|
||||||
|
"Y": 193.339
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 860,
|
||||||
|
"EndTime": 860,
|
||||||
|
"X": 366.6437,
|
||||||
|
"Y": 193.206482
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 942,
|
||||||
|
"EndTime": 942,
|
||||||
|
"X": 406.66568,
|
||||||
|
"Y": 193.073959
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 970,
|
||||||
|
"EndTime": 970,
|
||||||
|
"X": 420.331726,
|
||||||
|
"Y": 193.0287
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 997,
|
||||||
|
"EndTime": 997,
|
||||||
|
"X": 407.153748,
|
||||||
|
"Y": 193.072342
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1079,
|
||||||
|
"EndTime": 1079,
|
||||||
|
"X": 367.131775,
|
||||||
|
"Y": 193.204865
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1161,
|
||||||
|
"EndTime": 1161,
|
||||||
|
"X": 327.1098,
|
||||||
|
"Y": 193.337387
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1243,
|
||||||
|
"EndTime": 1243,
|
||||||
|
"X": 287.08783,
|
||||||
|
"Y": 193.46991
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1325,
|
||||||
|
"EndTime": 1325,
|
||||||
|
"X": 247.0659,
|
||||||
|
"Y": 193.602432
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1407,
|
||||||
|
"EndTime": 1407,
|
||||||
|
"X": 207.043915,
|
||||||
|
"Y": 193.734955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1489,
|
||||||
|
"EndTime": 1489,
|
||||||
|
"X": 167.021988,
|
||||||
|
"Y": 193.867477
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1571,
|
||||||
|
"EndTime": 1571,
|
||||||
|
"X": 127,
|
||||||
|
"Y": 194
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1653,
|
||||||
|
"EndTime": 1653,
|
||||||
|
"X": 167.021988,
|
||||||
|
"Y": 193.867477
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1735,
|
||||||
|
"EndTime": 1735,
|
||||||
|
"X": 207.043976,
|
||||||
|
"Y": 193.734955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1817,
|
||||||
|
"EndTime": 1817,
|
||||||
|
"X": 247.065887,
|
||||||
|
"Y": 193.602432
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1899,
|
||||||
|
"EndTime": 1899,
|
||||||
|
"X": 287.08783,
|
||||||
|
"Y": 193.46991
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 1981,
|
||||||
|
"EndTime": 1981,
|
||||||
|
"X": 327.1098,
|
||||||
|
"Y": 193.337387
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2062,
|
||||||
|
"EndTime": 2062,
|
||||||
|
"X": 366.643738,
|
||||||
|
"Y": 193.206482
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2144,
|
||||||
|
"EndTime": 2144,
|
||||||
|
"X": 406.665649,
|
||||||
|
"Y": 193.073959
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2172,
|
||||||
|
"EndTime": 2172,
|
||||||
|
"X": 420.331726,
|
||||||
|
"Y": 193.0287
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2199,
|
||||||
|
"EndTime": 2199,
|
||||||
|
"X": 407.153748,
|
||||||
|
"Y": 193.072342
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2281,
|
||||||
|
"EndTime": 2281,
|
||||||
|
"X": 367.1318,
|
||||||
|
"Y": 193.204865
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2363,
|
||||||
|
"EndTime": 2363,
|
||||||
|
"X": 327.1098,
|
||||||
|
"Y": 193.337387
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2445,
|
||||||
|
"EndTime": 2445,
|
||||||
|
"X": 287.08783,
|
||||||
|
"Y": 193.46991
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2527,
|
||||||
|
"EndTime": 2527,
|
||||||
|
"X": 247.065887,
|
||||||
|
"Y": 193.602432
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2609,
|
||||||
|
"EndTime": 2609,
|
||||||
|
"X": 207.043976,
|
||||||
|
"Y": 193.734955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2691,
|
||||||
|
"EndTime": 2691,
|
||||||
|
"X": 167.021988,
|
||||||
|
"Y": 193.867477
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2773,
|
||||||
|
"EndTime": 2773,
|
||||||
|
"X": 127,
|
||||||
|
"Y": 194
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2855,
|
||||||
|
"EndTime": 2855,
|
||||||
|
"X": 167.021988,
|
||||||
|
"Y": 193.867477
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 2937,
|
||||||
|
"EndTime": 2937,
|
||||||
|
"X": 207.043976,
|
||||||
|
"Y": 193.734955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3019,
|
||||||
|
"EndTime": 3019,
|
||||||
|
"X": 247.065948,
|
||||||
|
"Y": 193.602432
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3101,
|
||||||
|
"EndTime": 3101,
|
||||||
|
"X": 287.087952,
|
||||||
|
"Y": 193.46991
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3183,
|
||||||
|
"EndTime": 3183,
|
||||||
|
"X": 327.109772,
|
||||||
|
"Y": 193.337387
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3265,
|
||||||
|
"EndTime": 3265,
|
||||||
|
"X": 367.131775,
|
||||||
|
"Y": 193.204865
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3347,
|
||||||
|
"EndTime": 3347,
|
||||||
|
"X": 407.153748,
|
||||||
|
"Y": 193.072342
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3374,
|
||||||
|
"EndTime": 3374,
|
||||||
|
"X": 420.331726,
|
||||||
|
"Y": 193.0287
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3401,
|
||||||
|
"EndTime": 3401,
|
||||||
|
"X": 407.153748,
|
||||||
|
"Y": 193.072342
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3483,
|
||||||
|
"EndTime": 3483,
|
||||||
|
"X": 367.131775,
|
||||||
|
"Y": 193.204865
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3565,
|
||||||
|
"EndTime": 3565,
|
||||||
|
"X": 327.109772,
|
||||||
|
"Y": 193.337387
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3647,
|
||||||
|
"EndTime": 3647,
|
||||||
|
"X": 287.087952,
|
||||||
|
"Y": 193.46991
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3729,
|
||||||
|
"EndTime": 3729,
|
||||||
|
"X": 247.065948,
|
||||||
|
"Y": 193.602432
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3811,
|
||||||
|
"EndTime": 3811,
|
||||||
|
"X": 207.043976,
|
||||||
|
"Y": 193.734955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3893,
|
||||||
|
"EndTime": 3893,
|
||||||
|
"X": 167.021988,
|
||||||
|
"Y": 193.867477
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 3975,
|
||||||
|
"EndTime": 3975,
|
||||||
|
"X": 127,
|
||||||
|
"Y": 194
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4057,
|
||||||
|
"EndTime": 4057,
|
||||||
|
"X": 167.021988,
|
||||||
|
"Y": 193.867477
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4139,
|
||||||
|
"EndTime": 4139,
|
||||||
|
"X": 207.043976,
|
||||||
|
"Y": 193.734955
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4221,
|
||||||
|
"EndTime": 4221,
|
||||||
|
"X": 247.065948,
|
||||||
|
"Y": 193.602432
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4303,
|
||||||
|
"EndTime": 4303,
|
||||||
|
"X": 287.087952,
|
||||||
|
"Y": 193.46991
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4385,
|
||||||
|
"EndTime": 4385,
|
||||||
|
"X": 327.109772,
|
||||||
|
"Y": 193.337387
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4467,
|
||||||
|
"EndTime": 4467,
|
||||||
|
"X": 367.131775,
|
||||||
|
"Y": 193.204865
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4540,
|
||||||
|
"EndTime": 4540,
|
||||||
|
"X": 420.331726,
|
||||||
|
"Y": 193.0287
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"StartTime": 4549,
|
||||||
|
"EndTime": 4549,
|
||||||
|
"X": 407.153748,
|
||||||
|
"Y": 193.072342
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
osu file format v14
|
||||||
|
|
||||||
|
[General]
|
||||||
|
StackLeniency: 0.4
|
||||||
|
Mode: 0
|
||||||
|
|
||||||
|
[Difficulty]
|
||||||
|
CircleSize:4
|
||||||
|
OverallDifficulty:7
|
||||||
|
ApproachRate:8
|
||||||
|
SliderMultiplier:1.6
|
||||||
|
SliderTickRate:4
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
369,327.868852459016,4,2,2,32,1,0
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
// A slider with an un-even amount of ticks
|
||||||
|
127,194,369,6,0,L|429:193,7,293.333333333333
|
@ -12,7 +12,6 @@ using osu.Framework.Graphics;
|
|||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Game.Rulesets.Replays.Types;
|
using osu.Game.Rulesets.Replays.Types;
|
||||||
using osu.Game.Rulesets.Taiko.Objects;
|
|
||||||
using osu.Game.Rulesets.Taiko.Replays;
|
using osu.Game.Rulesets.Taiko.Replays;
|
||||||
using osu.Game.Beatmaps.Legacy;
|
using osu.Game.Beatmaps.Legacy;
|
||||||
using osu.Game.Rulesets.Difficulty;
|
using osu.Game.Rulesets.Difficulty;
|
||||||
@ -107,7 +106,7 @@ namespace osu.Game.Rulesets.Taiko
|
|||||||
case ModType.Fun:
|
case ModType.Fun:
|
||||||
return new Mod[]
|
return new Mod[]
|
||||||
{
|
{
|
||||||
new MultiMod(new ModWindUp<TaikoHitObject>(), new ModWindDown<TaikoHitObject>())
|
new MultiMod(new ModWindUp(), new ModWindDown())
|
||||||
};
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
116
osu.Game.Tests/Beatmaps/SliderEventGenerationTest.cs
Normal file
116
osu.Game.Tests/Beatmaps/SliderEventGenerationTest.cs
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Beatmaps
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class SliderEventGenerationTest
|
||||||
|
{
|
||||||
|
private const double start_time = 0;
|
||||||
|
private const double span_duration = 1000;
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSingleSpan()
|
||||||
|
{
|
||||||
|
var events = SliderEventGenerator.Generate(start_time, span_duration, 1, span_duration / 2, span_duration, 1, null).ToArray();
|
||||||
|
|
||||||
|
Assert.That(events[0].Type, Is.EqualTo(SliderEventType.Head));
|
||||||
|
Assert.That(events[0].Time, Is.EqualTo(start_time));
|
||||||
|
|
||||||
|
Assert.That(events[1].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[1].Time, Is.EqualTo(span_duration / 2));
|
||||||
|
|
||||||
|
Assert.That(events[3].Type, Is.EqualTo(SliderEventType.Tail));
|
||||||
|
Assert.That(events[3].Time, Is.EqualTo(span_duration));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestRepeat()
|
||||||
|
{
|
||||||
|
var events = SliderEventGenerator.Generate(start_time, span_duration, 1, span_duration / 2, span_duration, 2, null).ToArray();
|
||||||
|
|
||||||
|
Assert.That(events[0].Type, Is.EqualTo(SliderEventType.Head));
|
||||||
|
Assert.That(events[0].Time, Is.EqualTo(start_time));
|
||||||
|
|
||||||
|
Assert.That(events[1].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[1].Time, Is.EqualTo(span_duration / 2));
|
||||||
|
|
||||||
|
Assert.That(events[2].Type, Is.EqualTo(SliderEventType.Repeat));
|
||||||
|
Assert.That(events[2].Time, Is.EqualTo(span_duration));
|
||||||
|
|
||||||
|
Assert.That(events[3].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[3].Time, Is.EqualTo(span_duration + span_duration / 2));
|
||||||
|
|
||||||
|
Assert.That(events[5].Type, Is.EqualTo(SliderEventType.Tail));
|
||||||
|
Assert.That(events[5].Time, Is.EqualTo(2 * span_duration));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestNonEvenTicks()
|
||||||
|
{
|
||||||
|
var events = SliderEventGenerator.Generate(start_time, span_duration, 1, 300, span_duration, 2, null).ToArray();
|
||||||
|
|
||||||
|
Assert.That(events[0].Type, Is.EqualTo(SliderEventType.Head));
|
||||||
|
Assert.That(events[0].Time, Is.EqualTo(start_time));
|
||||||
|
|
||||||
|
Assert.That(events[1].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[1].Time, Is.EqualTo(300));
|
||||||
|
|
||||||
|
Assert.That(events[2].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[2].Time, Is.EqualTo(600));
|
||||||
|
|
||||||
|
Assert.That(events[3].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[3].Time, Is.EqualTo(900));
|
||||||
|
|
||||||
|
Assert.That(events[4].Type, Is.EqualTo(SliderEventType.Repeat));
|
||||||
|
Assert.That(events[4].Time, Is.EqualTo(span_duration));
|
||||||
|
|
||||||
|
Assert.That(events[5].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[5].Time, Is.EqualTo(1100));
|
||||||
|
|
||||||
|
Assert.That(events[6].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[6].Time, Is.EqualTo(1400));
|
||||||
|
|
||||||
|
Assert.That(events[7].Type, Is.EqualTo(SliderEventType.Tick));
|
||||||
|
Assert.That(events[7].Time, Is.EqualTo(1700));
|
||||||
|
|
||||||
|
Assert.That(events[9].Type, Is.EqualTo(SliderEventType.Tail));
|
||||||
|
Assert.That(events[9].Time, Is.EqualTo(2 * span_duration));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestLegacyLastTickOffset()
|
||||||
|
{
|
||||||
|
var events = SliderEventGenerator.Generate(start_time, span_duration, 1, span_duration / 2, span_duration, 1, 100).ToArray();
|
||||||
|
|
||||||
|
Assert.That(events[2].Type, Is.EqualTo(SliderEventType.LegacyLastTick));
|
||||||
|
Assert.That(events[2].Time, Is.EqualTo(900));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestMinimumTickDistance()
|
||||||
|
{
|
||||||
|
const double velocity = 5;
|
||||||
|
const double min_distance = velocity * 10;
|
||||||
|
|
||||||
|
var events = SliderEventGenerator.Generate(start_time, span_duration, velocity, velocity, span_duration, 2, 0).ToArray();
|
||||||
|
|
||||||
|
Assert.Multiple(() =>
|
||||||
|
{
|
||||||
|
int tickIndex = -1;
|
||||||
|
|
||||||
|
while (++tickIndex < events.Length)
|
||||||
|
{
|
||||||
|
if (events[tickIndex].Type != SliderEventType.Tick)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Assert.That(events[tickIndex].Time, Is.LessThan(span_duration - min_distance).Or.GreaterThan(span_duration + min_distance));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -141,6 +141,9 @@ namespace osu.Game.Beatmaps
|
|||||||
|
|
||||||
processor?.PostProcess();
|
processor?.PostProcess();
|
||||||
|
|
||||||
|
foreach (var mod in mods.OfType<IApplicableToBeatmap>())
|
||||||
|
mod.ApplyToBeatmap(converted);
|
||||||
|
|
||||||
return converted;
|
return converted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +92,8 @@ namespace osu.Game.Graphics
|
|||||||
|
|
||||||
using (var image = await host.TakeScreenshotAsync())
|
using (var image = await host.TakeScreenshotAsync())
|
||||||
{
|
{
|
||||||
Interlocked.Decrement(ref screenShotTasks);
|
if (Interlocked.Decrement(ref screenShotTasks) == 0 && cursorVisibility.Value == false)
|
||||||
|
cursorVisibility.Value = true;
|
||||||
|
|
||||||
var fileName = getFileName();
|
var fileName = getFileName();
|
||||||
if (fileName == null) return;
|
if (fileName == null) return;
|
||||||
@ -125,14 +126,6 @@ namespace osu.Game.Graphics
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
protected override void Update()
|
|
||||||
{
|
|
||||||
base.Update();
|
|
||||||
|
|
||||||
if (cursorVisibility.Value == false && Interlocked.CompareExchange(ref screenShotTasks, 0, 0) == 0)
|
|
||||||
cursorVisibility.Value = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private string getFileName()
|
private string getFileName()
|
||||||
{
|
{
|
||||||
var dt = DateTime.Now;
|
var dt = DateTime.Now;
|
||||||
|
@ -27,6 +27,7 @@ namespace osu.Game.Online.API.Requests
|
|||||||
{
|
{
|
||||||
Favourite,
|
Favourite,
|
||||||
RankedAndApproved,
|
RankedAndApproved,
|
||||||
|
Loved,
|
||||||
Unranked,
|
Unranked,
|
||||||
Graveyard
|
Graveyard
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ namespace osu.Game.Overlays.Profile.Sections
|
|||||||
{
|
{
|
||||||
new PaginatedBeatmapContainer(BeatmapSetType.Favourite, User, "Favourite Beatmaps"),
|
new PaginatedBeatmapContainer(BeatmapSetType.Favourite, User, "Favourite Beatmaps"),
|
||||||
new PaginatedBeatmapContainer(BeatmapSetType.RankedAndApproved, User, "Ranked & Approved Beatmaps"),
|
new PaginatedBeatmapContainer(BeatmapSetType.RankedAndApproved, User, "Ranked & Approved Beatmaps"),
|
||||||
|
new PaginatedBeatmapContainer(BeatmapSetType.Loved, User, "Loved Beatmaps"),
|
||||||
new PaginatedBeatmapContainer(BeatmapSetType.Unranked, User, "Pending Beatmaps"),
|
new PaginatedBeatmapContainer(BeatmapSetType.Unranked, User, "Pending Beatmaps"),
|
||||||
new PaginatedBeatmapContainer(BeatmapSetType.Graveyard, User, "Graveyarded Beatmaps"),
|
new PaginatedBeatmapContainer(BeatmapSetType.Graveyard, User, "Graveyarded Beatmaps"),
|
||||||
};
|
};
|
||||||
|
@ -2,21 +2,18 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mods
|
namespace osu.Game.Rulesets.Mods
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for a <see cref="Mod"/> that applies changes to a <see cref="Beatmap"/>
|
/// Interface for a <see cref="Mod"/> that applies changes to a <see cref="Beatmap"/> after conversion and post-processing has completed.
|
||||||
/// after conversion and post-processing has completed.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IApplicableToBeatmap<TObject> : IApplicableMod
|
public interface IApplicableToBeatmap : IApplicableMod
|
||||||
where TObject : HitObject
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Applies this <see cref="IApplicableToBeatmap{TObject}"/> to a <see cref="Beatmap{TObject}"/>.
|
/// Applies this <see cref="IApplicableToBeatmap"/> to an <see cref="IBeatmap"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="beatmap">The <see cref="Beatmap{TObject}"/> to apply to.</param>
|
/// <param name="beatmap">The <see cref="IBeatmap"/> to apply to.</param>
|
||||||
void ApplyToBeatmap(Beatmap<TObject> beatmap);
|
void ApplyToBeatmap(IBeatmap beatmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,27 +13,21 @@ using osuTK;
|
|||||||
|
|
||||||
namespace osu.Game.Rulesets.Mods
|
namespace osu.Game.Rulesets.Mods
|
||||||
{
|
{
|
||||||
public abstract class ModTimeRamp : Mod
|
public abstract class ModTimeRamp : Mod, IUpdatableByPlayfield, IApplicableToClock, IApplicableToBeatmap
|
||||||
{
|
{
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModTimeAdjust) };
|
|
||||||
|
|
||||||
protected abstract double FinalRateAdjustment { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class ModTimeRamp<T> : ModTimeRamp, IUpdatableByPlayfield, IApplicableToClock, IApplicableToBeatmap<T>
|
|
||||||
where T : HitObject
|
|
||||||
{
|
|
||||||
private double finalRateTime;
|
|
||||||
|
|
||||||
private double beginRampTime;
|
|
||||||
|
|
||||||
private IAdjustableClock clock;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The point in the beatmap at which the final ramping rate should be reached.
|
/// The point in the beatmap at which the final ramping rate should be reached.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const double final_rate_progress = 0.75f;
|
private const double final_rate_progress = 0.75f;
|
||||||
|
|
||||||
|
public override Type[] IncompatibleMods => new[] { typeof(ModTimeAdjust) };
|
||||||
|
|
||||||
|
protected abstract double FinalRateAdjustment { get; }
|
||||||
|
|
||||||
|
private double finalRateTime;
|
||||||
|
private double beginRampTime;
|
||||||
|
private IAdjustableClock clock;
|
||||||
|
|
||||||
public virtual void ApplyToClock(IAdjustableClock clock)
|
public virtual void ApplyToClock(IAdjustableClock clock)
|
||||||
{
|
{
|
||||||
this.clock = clock;
|
this.clock = clock;
|
||||||
@ -44,7 +38,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
applyAdjustment(1);
|
applyAdjustment(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void ApplyToBeatmap(Beatmap<T> beatmap)
|
public virtual void ApplyToBeatmap(IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
HitObject lastObject = beatmap.HitObjects.LastOrDefault();
|
HitObject lastObject = beatmap.HitObjects.LastOrDefault();
|
||||||
|
|
||||||
|
@ -4,12 +4,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mods
|
namespace osu.Game.Rulesets.Mods
|
||||||
{
|
{
|
||||||
public class ModWindDown<T> : ModTimeRamp<T>
|
public class ModWindDown : ModTimeRamp
|
||||||
where T : HitObject
|
|
||||||
{
|
{
|
||||||
public override string Name => "Wind Down";
|
public override string Name => "Wind Down";
|
||||||
public override string Acronym => "WD";
|
public override string Acronym => "WD";
|
||||||
@ -19,6 +17,6 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
|
|
||||||
protected override double FinalRateAdjustment => -0.25;
|
protected override double FinalRateAdjustment => -0.25;
|
||||||
|
|
||||||
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModWindUp<T>)).ToArray();
|
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModWindUp)).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,12 +4,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Game.Rulesets.Objects;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Mods
|
namespace osu.Game.Rulesets.Mods
|
||||||
{
|
{
|
||||||
public class ModWindUp<T> : ModTimeRamp<T>
|
public class ModWindUp : ModTimeRamp
|
||||||
where T : HitObject
|
|
||||||
{
|
{
|
||||||
public override string Name => "Wind Up";
|
public override string Name => "Wind Up";
|
||||||
public override string Acronym => "WU";
|
public override string Acronym => "WU";
|
||||||
@ -19,6 +17,6 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
|
|
||||||
protected override double FinalRateAdjustment => 0.5;
|
protected override double FinalRateAdjustment => 0.5;
|
||||||
|
|
||||||
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModWindDown<T>)).ToArray();
|
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModWindDown)).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,13 +3,15 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Objects
|
namespace osu.Game.Rulesets.Objects
|
||||||
{
|
{
|
||||||
public static class SliderEventGenerator
|
public static class SliderEventGenerator
|
||||||
{
|
{
|
||||||
public static IEnumerable<SliderEventDescriptor> Generate(double startTime, double spanDuration, double velocity, double tickDistance, double totalDistance, int spanCount, double? legacyLastTickOffset)
|
public static IEnumerable<SliderEventDescriptor> Generate(double startTime, double spanDuration, double velocity, double tickDistance, double totalDistance, int spanCount,
|
||||||
|
double? legacyLastTickOffset)
|
||||||
{
|
{
|
||||||
// A very lenient maximum length of a slider for ticks to be generated.
|
// A very lenient maximum length of a slider for ticks to be generated.
|
||||||
// This exists for edge cases such as /b/1573664 where the beatmap has been edited by the user, and should never be reached in normal usage.
|
// This exists for edge cases such as /b/1573664 where the beatmap has been edited by the user, and should never be reached in normal usage.
|
||||||
@ -36,24 +38,17 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
var spanStartTime = startTime + span * spanDuration;
|
var spanStartTime = startTime + span * spanDuration;
|
||||||
var reversed = span % 2 == 1;
|
var reversed = span % 2 == 1;
|
||||||
|
|
||||||
for (var d = tickDistance; d <= length; d += tickDistance)
|
var ticks = generateTicks(span, spanStartTime, spanDuration, reversed, length, tickDistance, minDistanceFromEnd);
|
||||||
{
|
|
||||||
if (d >= length - minDistanceFromEnd)
|
|
||||||
break;
|
|
||||||
|
|
||||||
var pathProgress = d / length;
|
if (reversed)
|
||||||
var timeProgress = reversed ? 1 - pathProgress : pathProgress;
|
|
||||||
|
|
||||||
yield return new SliderEventDescriptor
|
|
||||||
{
|
{
|
||||||
Type = SliderEventType.Tick,
|
// For repeat spans, ticks are returned in reverse-StartTime order, which is undesirable for some rulesets
|
||||||
SpanIndex = span,
|
ticks = ticks.Reverse();
|
||||||
SpanStartTime = spanStartTime,
|
|
||||||
Time = spanStartTime + timeProgress * spanDuration,
|
|
||||||
PathProgress = pathProgress,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var e in ticks)
|
||||||
|
yield return e;
|
||||||
|
|
||||||
if (span < spanCount - 1)
|
if (span < spanCount - 1)
|
||||||
{
|
{
|
||||||
yield return new SliderEventDescriptor
|
yield return new SliderEventDescriptor
|
||||||
@ -103,6 +98,40 @@ namespace osu.Game.Rulesets.Objects
|
|||||||
PathProgress = spanCount % 2,
|
PathProgress = spanCount % 2,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generates the ticks for a span of the slider.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="spanIndex">The span index.</param>
|
||||||
|
/// <param name="spanStartTime">The start time of the span.</param>
|
||||||
|
/// <param name="spanDuration">The duration of the span.</param>
|
||||||
|
/// <param name="reversed">Whether the span is reversed.</param>
|
||||||
|
/// <param name="length">The length of the path.</param>
|
||||||
|
/// <param name="tickDistance">The distance between each tick.</param>
|
||||||
|
/// <param name="minDistanceFromEnd">The distance from the end of the path at which ticks are not allowed to be added.</param>
|
||||||
|
/// <returns>A <see cref="SliderEventDescriptor"/> for each tick. If <paramref name="reversed"/> is true, the ticks will be returned in reverse-StartTime order.</returns>
|
||||||
|
private static IEnumerable<SliderEventDescriptor> generateTicks(int spanIndex, double spanStartTime, double spanDuration, bool reversed, double length, double tickDistance,
|
||||||
|
double minDistanceFromEnd)
|
||||||
|
{
|
||||||
|
for (var d = tickDistance; d <= length; d += tickDistance)
|
||||||
|
{
|
||||||
|
if (d >= length - minDistanceFromEnd)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Always generate ticks from the start of the path rather than the span to ensure that ticks in repeat spans are positioned identically to those in non-repeat spans
|
||||||
|
var pathProgress = d / length;
|
||||||
|
var timeProgress = reversed ? 1 - pathProgress : pathProgress;
|
||||||
|
|
||||||
|
yield return new SliderEventDescriptor
|
||||||
|
{
|
||||||
|
Type = SliderEventType.Tick,
|
||||||
|
SpanIndex = spanIndex,
|
||||||
|
SpanStartTime = spanStartTime,
|
||||||
|
Time = spanStartTime + timeProgress * spanDuration,
|
||||||
|
PathProgress = pathProgress,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -109,8 +109,6 @@ namespace osu.Game.Rulesets.UI
|
|||||||
|
|
||||||
Beatmap = (Beatmap<TObject>)workingBeatmap.GetPlayableBeatmap(ruleset.RulesetInfo, mods);
|
Beatmap = (Beatmap<TObject>)workingBeatmap.GetPlayableBeatmap(ruleset.RulesetInfo, mods);
|
||||||
|
|
||||||
applyBeatmapMods(mods);
|
|
||||||
|
|
||||||
KeyBindingInputManager = CreateInputManager();
|
KeyBindingInputManager = CreateInputManager();
|
||||||
playfield = new Lazy<Playfield>(CreatePlayfield);
|
playfield = new Lazy<Playfield>(CreatePlayfield);
|
||||||
|
|
||||||
@ -269,19 +267,6 @@ namespace osu.Game.Rulesets.UI
|
|||||||
|
|
||||||
public override ScoreProcessor CreateScoreProcessor() => new ScoreProcessor<TObject>(this);
|
public override ScoreProcessor CreateScoreProcessor() => new ScoreProcessor<TObject>(this);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Applies the active mods to the Beatmap.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="mods"></param>
|
|
||||||
private void applyBeatmapMods(IReadOnlyList<Mod> mods)
|
|
||||||
{
|
|
||||||
if (mods == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
foreach (var mod in mods.OfType<IApplicableToBeatmap<TObject>>())
|
|
||||||
mod.ApplyToBeatmap(Beatmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Applies the active mods to this DrawableRuleset.
|
/// Applies the active mods to this DrawableRuleset.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
Reference in New Issue
Block a user