Make original hit objects and random properties as local variable.

This commit is contained in:
andy840119 2022-07-27 22:12:52 +08:00
parent 89644a652e
commit 537f64c75e
1 changed files with 13 additions and 24 deletions

View File

@ -98,10 +98,6 @@ public class OsuModTarget : ModWithVisibilityAdjustment, IApplicableToDrawableRu
private ControlPointInfo? controlPointInfo;
private List<OsuHitObject>? originalHitObjects;
private Random? rng;
#endregion
#region Sudden Death (IApplicableFailOverride)
@ -171,16 +167,16 @@ protected override void ApplyNormalVisibilityState(DrawableHitObject drawable, A
public override void ApplyToBeatmap(IBeatmap beatmap)
{
Seed.Value ??= RNG.Next();
rng = new Random(Seed.Value.Value);
var rng = new Random(Seed.Value.Value);
var osuBeatmap = (OsuBeatmap)beatmap;
if (osuBeatmap.HitObjects.Count == 0) return;
controlPointInfo = osuBeatmap.ControlPointInfo;
originalHitObjects = osuBeatmap.HitObjects.OrderBy(x => x.StartTime).ToList();
var hitObjects = generateBeats(osuBeatmap)
var originalHitObjects = osuBeatmap.HitObjects.OrderBy(x => x.StartTime).ToList();
var hitObjects = generateBeats(osuBeatmap, originalHitObjects)
.Select(beat =>
{
var newCircle = new HitCircle();
@ -189,21 +185,19 @@ public override void ApplyToBeatmap(IBeatmap beatmap)
return (OsuHitObject)newCircle;
}).ToList();
addHitSamples(hitObjects);
addHitSamples(originalHitObjects, hitObjects);
fixComboInfo(hitObjects);
fixComboInfo(originalHitObjects, hitObjects);
randomizeCirclePos(hitObjects);
randomizeCirclePos(rng, hitObjects);
osuBeatmap.HitObjects = hitObjects;
base.ApplyToBeatmap(beatmap);
}
private IEnumerable<double> generateBeats(IBeatmap beatmap)
private IEnumerable<double> generateBeats(IBeatmap beatmap, IReadOnlyCollection<OsuHitObject> originalHitObjects)
{
Debug.Assert(originalHitObjects != null);
double startTime = originalHitObjects.First().StartTime;
double endTime = originalHitObjects.Last().GetEndTime();
@ -215,7 +209,7 @@ private IEnumerable<double> generateBeats(IBeatmap beatmap)
// Remove beats before startTime
.Where(beat => almostBigger(beat, startTime))
// Remove beats during breaks
.Where(beat => !isInsideBreakPeriod(beatmap.Breaks, beat))
.Where(beat => !isInsideBreakPeriod(originalHitObjects, beatmap.Breaks, beat))
.ToList();
// Remove beats that are too close to the next one (e.g. due to timing point changes)
@ -230,10 +224,8 @@ private IEnumerable<double> generateBeats(IBeatmap beatmap)
return beats;
}
private void addHitSamples(IEnumerable<OsuHitObject> hitObjects)
private void addHitSamples(List<OsuHitObject> originalHitObjects, IEnumerable<OsuHitObject> hitObjects)
{
Debug.Assert(originalHitObjects != null);
foreach (var obj in hitObjects)
{
var samples = getSamplesAtTime(originalHitObjects, obj.StartTime);
@ -244,10 +236,8 @@ private void addHitSamples(IEnumerable<OsuHitObject> hitObjects)
}
}
private void fixComboInfo(List<OsuHitObject> hitObjects)
private void fixComboInfo(List<OsuHitObject> originalHitObjects, List<OsuHitObject> hitObjects)
{
Debug.Assert(originalHitObjects != null);
// Copy combo indices from an original object at the same time or from the closest preceding object
// (Objects lying between two combos are assumed to belong to the preceding combo)
hitObjects.ForEach(newObj =>
@ -280,7 +270,7 @@ private void fixComboInfo(List<OsuHitObject> hitObjects)
}
}
private void randomizeCirclePos(IReadOnlyList<OsuHitObject> hitObjects)
private void randomizeCirclePos(Random rng, IReadOnlyList<OsuHitObject> hitObjects)
{
if (hitObjects.Count == 0) return;
@ -361,12 +351,11 @@ public void ApplyToDrawableRuleset(DrawableRuleset<OsuHitObject> drawableRuleset
/// The given time is also considered to be inside a break if it is earlier than the
/// start time of the first original hit object after the break.
/// </remarks>
/// <param name="originalHitObjects">Hit objects order by time.</param>
/// <param name="breaks">The breaks of the beatmap.</param>
/// <param name="time">The time to be checked.</param>=
private bool isInsideBreakPeriod(IEnumerable<BreakPeriod> breaks, double time)
private bool isInsideBreakPeriod(IReadOnlyCollection<OsuHitObject> originalHitObjects, IEnumerable<BreakPeriod> breaks, double time)
{
Debug.Assert(originalHitObjects != null);
return breaks.Any(breakPeriod =>
{
var firstObjAfterBreak = originalHitObjects.First(obj => almostBigger(obj.StartTime, breakPeriod.EndTime));