Skip to content

Commit e7070bd

Browse files
authored
Merge pull request #31448 from bdach/automatic-new-combo-after-break
Force new combo on objects succeeding a break
2 parents f216c22 + 7c70dc4 commit e7070bd

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

osu.Game.Tests/Editing/TestSceneEditorBeatmapProcessor.cs

+80
Original file line numberDiff line numberDiff line change
@@ -539,5 +539,85 @@ public void TestTimePreemptIsRespected()
539539
Assert.That(beatmap.Breaks[0].EndTime, Is.EqualTo(5000 - OsuHitObject.PREEMPT_MAX));
540540
});
541541
}
542+
543+
[Test]
544+
public void TestPuttingObjectBetweenBreakEndAndAnotherObjectForcesNewCombo()
545+
{
546+
var controlPoints = new ControlPointInfo();
547+
controlPoints.Add(0, new TimingControlPoint { BeatLength = 500 });
548+
var beatmap = new EditorBeatmap(new Beatmap
549+
{
550+
ControlPointInfo = controlPoints,
551+
BeatmapInfo = { Ruleset = new OsuRuleset().RulesetInfo },
552+
Difficulty =
553+
{
554+
ApproachRate = 10,
555+
},
556+
HitObjects =
557+
{
558+
new HitCircle { StartTime = 1000, NewCombo = true },
559+
new HitCircle { StartTime = 4500 },
560+
new HitCircle { StartTime = 5000, NewCombo = true },
561+
},
562+
Breaks =
563+
{
564+
new BreakPeriod(2000, 4000),
565+
}
566+
});
567+
568+
foreach (var ho in beatmap.HitObjects)
569+
ho.ApplyDefaults(beatmap.ControlPointInfo, beatmap.Difficulty);
570+
571+
var beatmapProcessor = new EditorBeatmapProcessor(beatmap, new OsuRuleset());
572+
beatmapProcessor.PreProcess();
573+
beatmapProcessor.PostProcess();
574+
575+
Assert.Multiple(() =>
576+
{
577+
Assert.That(((HitCircle)beatmap.HitObjects[1]).NewCombo, Is.True);
578+
Assert.That(((HitCircle)beatmap.HitObjects[2]).NewCombo, Is.True);
579+
580+
Assert.That(((HitCircle)beatmap.HitObjects[0]).ComboIndex, Is.EqualTo(1));
581+
Assert.That(((HitCircle)beatmap.HitObjects[1]).ComboIndex, Is.EqualTo(2));
582+
Assert.That(((HitCircle)beatmap.HitObjects[2]).ComboIndex, Is.EqualTo(3));
583+
});
584+
}
585+
586+
[Test]
587+
public void TestAutomaticallyInsertedBreakForcesNewCombo()
588+
{
589+
var controlPoints = new ControlPointInfo();
590+
controlPoints.Add(0, new TimingControlPoint { BeatLength = 500 });
591+
var beatmap = new EditorBeatmap(new Beatmap
592+
{
593+
ControlPointInfo = controlPoints,
594+
BeatmapInfo = { Ruleset = new OsuRuleset().RulesetInfo },
595+
Difficulty =
596+
{
597+
ApproachRate = 10,
598+
},
599+
HitObjects =
600+
{
601+
new HitCircle { StartTime = 1000, NewCombo = true },
602+
new HitCircle { StartTime = 5000 },
603+
},
604+
});
605+
606+
foreach (var ho in beatmap.HitObjects)
607+
ho.ApplyDefaults(beatmap.ControlPointInfo, beatmap.Difficulty);
608+
609+
var beatmapProcessor = new EditorBeatmapProcessor(beatmap, new OsuRuleset());
610+
beatmapProcessor.PreProcess();
611+
beatmapProcessor.PostProcess();
612+
613+
Assert.Multiple(() =>
614+
{
615+
Assert.That(beatmap.Breaks, Has.Count.EqualTo(1));
616+
Assert.That(((HitCircle)beatmap.HitObjects[1]).NewCombo, Is.True);
617+
618+
Assert.That(((HitCircle)beatmap.HitObjects[0]).ComboIndex, Is.EqualTo(1));
619+
Assert.That(((HitCircle)beatmap.HitObjects[1]).ComboIndex, Is.EqualTo(2));
620+
});
621+
}
542622
}
543623
}

osu.Game/Screens/Edit/EditorBeatmapProcessor.cs

+36
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public void PostProcess()
4141
rulesetBeatmapProcessor?.PostProcess();
4242

4343
autoGenerateBreaks();
44+
ensureNewComboAfterBreaks();
4445
}
4546

4647
private void autoGenerateBreaks()
@@ -100,5 +101,40 @@ private void autoGenerateBreaks()
100101
Beatmap.Breaks.Add(breakPeriod);
101102
}
102103
}
104+
105+
private void ensureNewComboAfterBreaks()
106+
{
107+
var breakEnds = Beatmap.Breaks.Select(b => b.EndTime).OrderBy(t => t).ToList();
108+
109+
if (breakEnds.Count == 0)
110+
return;
111+
112+
int currentBreak = 0;
113+
114+
IHasComboInformation? lastObj = null;
115+
bool comboInformationUpdateRequired = false;
116+
117+
foreach (var hitObject in Beatmap.HitObjects)
118+
{
119+
if (hitObject is not IHasComboInformation hasCombo)
120+
continue;
121+
122+
if (currentBreak < breakEnds.Count && hitObject.StartTime >= breakEnds[currentBreak])
123+
{
124+
if (!hasCombo.NewCombo)
125+
{
126+
hasCombo.NewCombo = true;
127+
comboInformationUpdateRequired = true;
128+
}
129+
130+
currentBreak += 1;
131+
}
132+
133+
if (comboInformationUpdateRequired)
134+
hasCombo.UpdateComboInformation(lastObj);
135+
136+
lastObj = hasCombo;
137+
}
138+
}
103139
}
104140
}

0 commit comments

Comments
 (0)