mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 20:13:21 +08:00
Port the old stacking algorithm
This commit is contained in:
parent
0c4403ef16
commit
72c8ae8705
@ -10,6 +10,8 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
{
|
{
|
||||||
public class OsuBeatmapProcessor : BeatmapProcessor
|
public class OsuBeatmapProcessor : BeatmapProcessor
|
||||||
{
|
{
|
||||||
|
private const int stack_distance = 3;
|
||||||
|
|
||||||
public OsuBeatmapProcessor(IBeatmap beatmap)
|
public OsuBeatmapProcessor(IBeatmap beatmap)
|
||||||
: base(beatmap)
|
: base(beatmap)
|
||||||
{
|
{
|
||||||
@ -18,17 +20,21 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
public override void PostProcess()
|
public override void PostProcess()
|
||||||
{
|
{
|
||||||
base.PostProcess();
|
base.PostProcess();
|
||||||
applyStacking((Beatmap<OsuHitObject>)Beatmap);
|
|
||||||
|
var osuBeatmap = (Beatmap<OsuHitObject>)Beatmap;
|
||||||
|
|
||||||
|
// Reset stacking
|
||||||
|
foreach (var h in osuBeatmap.HitObjects)
|
||||||
|
h.StackHeight = 0;
|
||||||
|
|
||||||
|
if (Beatmap.BeatmapInfo.BeatmapVersion >= 6)
|
||||||
|
applyStacking(osuBeatmap);
|
||||||
|
else
|
||||||
|
applyStackingOld(osuBeatmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyStacking(Beatmap<OsuHitObject> beatmap)
|
private void applyStacking(Beatmap<OsuHitObject> beatmap)
|
||||||
{
|
{
|
||||||
const int stack_distance = 3;
|
|
||||||
|
|
||||||
// Reset stacking
|
|
||||||
for (int i = 0; i <= beatmap.HitObjects.Count - 1; i++)
|
|
||||||
beatmap.HitObjects[i].StackHeight = 0;
|
|
||||||
|
|
||||||
// Extend the end index to include objects they are stacked on
|
// Extend the end index to include objects they are stacked on
|
||||||
int extendedEndIndex = beatmap.HitObjects.Count - 1;
|
int extendedEndIndex = beatmap.HitObjects.Count - 1;
|
||||||
for (int i = beatmap.HitObjects.Count - 1; i >= 0; i--)
|
for (int i = beatmap.HitObjects.Count - 1; i >= 0; i--)
|
||||||
@ -167,5 +173,40 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applyStackingOld(Beatmap<OsuHitObject> beatmap)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < beatmap.HitObjects.Count; i++)
|
||||||
|
{
|
||||||
|
OsuHitObject currHitObject = beatmap.HitObjects[i];
|
||||||
|
|
||||||
|
if (currHitObject.StackHeight != 0 && !(currHitObject is Slider))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
double startTime = (currHitObject as IHasEndTime)?.EndTime ?? currHitObject.StartTime;
|
||||||
|
int sliderStack = 0;
|
||||||
|
|
||||||
|
for (int j = i + 1; j < beatmap.HitObjects.Count; j++)
|
||||||
|
{
|
||||||
|
double stackThreshold = beatmap.HitObjects[i].TimePreempt * beatmap.BeatmapInfo.StackLeniency;
|
||||||
|
|
||||||
|
if (beatmap.HitObjects[j].StartTime - stackThreshold > startTime)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (Vector2Extensions.Distance(beatmap.HitObjects[j].Position, currHitObject.Position) < stack_distance)
|
||||||
|
{
|
||||||
|
currHitObject.StackHeight++;
|
||||||
|
startTime = (beatmap.HitObjects[j] as IHasEndTime)?.EndTime ?? beatmap.HitObjects[i].StartTime;
|
||||||
|
}
|
||||||
|
else if (Vector2Extensions.Distance(beatmap.HitObjects[j].Position, currHitObject.EndPosition) < stack_distance)
|
||||||
|
{
|
||||||
|
//Case for sliders - bump notes down and right, rather than up and left.
|
||||||
|
sliderStack++;
|
||||||
|
beatmap.HitObjects[j].StackHeight -= sliderStack;
|
||||||
|
startTime = (beatmap.HitObjects[j] as IHasEndTime)?.EndTime ?? beatmap.HitObjects[i].StartTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user