1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-14 17:52:56 +08:00

Several requested changes

- Rename `origHitObjects` to `originalHitObjects`
- Use `Value` instead of `GetValueOrDefault()`
- Remove `endObj`
- Added comments
- Rename `closestIdx` to `precedingIndex`
- Changed an `almostEquals` call
This commit is contained in:
Henry Lin 2021-07-01 11:57:57 +08:00
parent 913f7602e4
commit 58f80abe32

View File

@ -97,7 +97,7 @@ namespace osu.Game.Rulesets.Osu.Mods
private ControlPointInfo controlPointInfo;
private List<OsuHitObject> origHitObjects;
private List<OsuHitObject> originalHitObjects;
private Random rng;
@ -168,14 +168,14 @@ namespace osu.Game.Rulesets.Osu.Mods
public override void ApplyToBeatmap(IBeatmap beatmap)
{
Seed.Value ??= RNG.Next();
rng = new Random(Seed.Value.GetValueOrDefault());
rng = new Random(Seed.Value.Value);
var osuBeatmap = (OsuBeatmap)beatmap;
if (osuBeatmap.HitObjects.Count == 0) return;
controlPointInfo = osuBeatmap.ControlPointInfo;
origHitObjects = osuBeatmap.HitObjects.OrderBy(x => x.StartTime).ToList();
originalHitObjects = osuBeatmap.HitObjects.OrderBy(x => x.StartTime).ToList();
var hitObjects = generateBeats(osuBeatmap)
.Select(beat =>
@ -199,9 +199,8 @@ namespace osu.Game.Rulesets.Osu.Mods
private IEnumerable<double> generateBeats(IBeatmap beatmap)
{
var startTime = origHitObjects.First().StartTime;
var endObj = origHitObjects.Last();
var endTime = endObj.GetEndTime();
var startTime = originalHitObjects.First().StartTime;
var endTime = originalHitObjects.Last().GetEndTime();
var beats = beatmap.ControlPointInfo.TimingPoints
// Ignore timing points after endTime
@ -230,24 +229,25 @@ namespace osu.Game.Rulesets.Osu.Mods
{
foreach (var obj in hitObjects)
{
var samples = getSamplesAtTime(origHitObjects, obj.StartTime);
var samples = getSamplesAtTime(originalHitObjects, obj.StartTime);
// If samples aren't available at the exact start time of the object,
// use samples (without additions) in the closest original hit object instead
obj.Samples = samples ?? getClosestHitObject(origHitObjects, obj.StartTime).Samples.Where(s => !HitSampleInfo.AllAdditions.Contains(s.Name)).ToList();
obj.Samples = samples ?? getClosestHitObject(originalHitObjects, obj.StartTime).Samples.Where(s => !HitSampleInfo.AllAdditions.Contains(s.Name)).ToList();
}
}
private void fixComboInfo(List<OsuHitObject> hitObjects)
{
// Copy combo indices from the closest preceding object
hitObjects.ForEach(obj =>
// 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 =>
{
var closestOrigObj = origHitObjects.FindLast(y => almostBigger(obj.StartTime, y.StartTime));
var closestOrigObj = originalHitObjects.FindLast(y => almostBigger(newObj.StartTime, y.StartTime));
// It shouldn't be possible for closestOrigObj to be null
// But if it is, obj should be in the first combo
obj.ComboIndex = closestOrigObj?.ComboIndex ?? 0;
newObj.ComboIndex = closestOrigObj?.ComboIndex ?? 0;
});
// The copied combo indices may not be continuous if the original map starts and ends a combo in between beats
@ -383,7 +383,7 @@ namespace osu.Game.Rulesets.Osu.Mods
{
return breaks.Any(breakPeriod =>
{
var firstObjAfterBreak = origHitObjects.First(obj => almostBigger(obj.StartTime, breakPeriod.EndTime));
var firstObjAfterBreak = originalHitObjects.First(obj => almostBigger(obj.StartTime, breakPeriod.EndTime));
return almostBigger(time, breakPeriod.StartTime)
&& almostBigger(firstObjAfterBreak.StartTime, time);
@ -408,14 +408,14 @@ namespace osu.Game.Rulesets.Osu.Mods
private OsuHitObject getClosestHitObject(List<OsuHitObject> hitObjects, double time)
{
var closestIdx = hitObjects.FindLastIndex(h => h.StartTime < time);
var precedingIndex = hitObjects.FindLastIndex(h => h.StartTime < time);
if (closestIdx == hitObjects.Count - 1) return hitObjects[closestIdx];
if (precedingIndex == hitObjects.Count - 1) return hitObjects[precedingIndex];
// return the closest preceding/succeeding hit object, whoever is closer in time
return hitObjects[closestIdx + 1].StartTime - time < time - hitObjects[closestIdx].StartTime
? hitObjects[closestIdx + 1]
: hitObjects[closestIdx];
return hitObjects[precedingIndex + 1].StartTime - time < time - hitObjects[precedingIndex].StartTime
? hitObjects[precedingIndex + 1]
: hitObjects[precedingIndex];
}
/// <summary>
@ -468,7 +468,7 @@ namespace osu.Game.Rulesets.Osu.Mods
double spanDuration = curve.Duration / curve.SpanCount();
double nodeIndex = timeSinceStart / spanDuration;
if (almostEquals(nodeIndex - Math.Round(nodeIndex), 0))
if (almostEquals(nodeIndex, Math.Round(nodeIndex)))
return (int)Math.Round(nodeIndex);
return -1;
@ -501,6 +501,15 @@ namespace osu.Game.Rulesets.Osu.Mods
obj.Position = position;
}
/// <summary>
/// Re-maps a number from one range to another.
/// </summary>
/// <param name="value">The number to be re-mapped.</param>
/// <param name="fromLow">Beginning of the original range.</param>
/// <param name="fromHigh">End of the original range.</param>
/// <param name="toLow">Beginning of the new range.</param>
/// <param name="toHigh">End of the new range.</param>
/// <returns>The re-mapped number.</returns>
private static float map(float value, float fromLow, float fromHigh, float toLow, float toHigh)
{
return (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow;