Populate new approach rate where required

This commit is contained in:
Dean Herbert
2021-09-01 18:19:25 +09:00
parent d4e5a612ea
commit d587dc6203
7 changed files with 19 additions and 17 deletions

View File

@ -94,7 +94,7 @@ namespace osu.Game.Rulesets.Mania.UI
// For non-mania beatmap, speed changes should only happen through timing points // For non-mania beatmap, speed changes should only happen through timing points
if (!isForCurrentRuleset) if (!isForCurrentRuleset)
p.DifficultyPoint = new DifficultyControlPoint(); p.EffectPoint = new EffectControlPoint();
} }
BarLines.ForEach(Playfield.Add); BarLines.ForEach(Playfield.Add);

View File

@ -93,9 +93,9 @@ namespace osu.Game.Tests.Visual.Gameplay
private IList<MultiplierControlPoint> testControlPoints => new List<MultiplierControlPoint> private IList<MultiplierControlPoint> testControlPoints => new List<MultiplierControlPoint>
{ {
new MultiplierControlPoint(time_range) { DifficultyPoint = { SliderVelocity = 1.25 } }, new MultiplierControlPoint(time_range) { EffectPoint = { ApproachRate = 1.25 } },
new MultiplierControlPoint(1.5 * time_range) { DifficultyPoint = { SliderVelocity = 1 } }, new MultiplierControlPoint(1.5 * time_range) { EffectPoint = { ApproachRate = 1 } },
new MultiplierControlPoint(2 * time_range) { DifficultyPoint = { SliderVelocity = 1.5 } } new MultiplierControlPoint(2 * time_range) { EffectPoint = { ApproachRate = 1.5 } }
}; };
[Test] [Test]

View File

@ -26,7 +26,7 @@ namespace osu.Game.Beatmaps
set => approachRate = value; set => approachRate = value;
} }
public double SliderMultiplier { get; set; } = 1; public double SliderMultiplier { get; set; } = 1; // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA this needs to be renamed or removed or something.
public double SliderTickRate { get; set; } = 1; public double SliderTickRate { get; set; } = 1;
/// <summary> /// <summary>

View File

@ -387,6 +387,7 @@ namespace osu.Game.Beatmaps.Formats
{ {
KiaiMode = kiaiMode, KiaiMode = kiaiMode,
OmitFirstBarLine = omitFirstBarSignature, OmitFirstBarLine = omitFirstBarSignature,
ApproachRate = speedMultiplier,
}, timingChange); }, timingChange);
addControlPoint(time, new LegacySampleControlPoint addControlPoint(time, new LegacySampleControlPoint

View File

@ -184,7 +184,7 @@ namespace osu.Game.Beatmaps.Formats
SampleControlPoint lastRelevantSamplePoint = null; SampleControlPoint lastRelevantSamplePoint = null;
DifficultyControlPoint lastRelevantDifficultyPoint = null; DifficultyControlPoint lastRelevantDifficultyPoint = null;
// iterate over hitobjects and pull out all required sample changes // iterate over hitobjects and pull out all required sample and difficulty changes
foreach (var h in beatmap.HitObjects) foreach (var h in beatmap.HitObjects)
{ {
var hSamplePoint = h.SampleControlPoint; var hSamplePoint = h.SampleControlPoint;
@ -202,6 +202,8 @@ namespace osu.Game.Beatmaps.Formats
lastRelevantSamplePoint = hSamplePoint; lastRelevantSamplePoint = hSamplePoint;
} }
} }
// TODO: we need to pull out approach rate from EffectControlPoint and shove it in with difficulty points where necessary...
} }
foreach (var group in beatmap.ControlPointInfo.Groups) foreach (var group in beatmap.ControlPointInfo.Groups)

View File

@ -7,7 +7,7 @@ using osu.Game.Beatmaps.ControlPoints;
namespace osu.Game.Rulesets.Timing namespace osu.Game.Rulesets.Timing
{ {
/// <summary> /// <summary>
/// A control point which adds an aggregated multiplier based on the provided <see cref="TimingPoint"/>'s BeatLength and <see cref="DifficultyPoint"/>'s SpeedMultiplier. /// A control point which adds an aggregated multiplier based on the provided <see cref="TimingPoint"/>'s BeatLength and <see cref="EffectPoint"/>'s SpeedMultiplier.
/// </summary> /// </summary>
public class MultiplierControlPoint : IComparable<MultiplierControlPoint> public class MultiplierControlPoint : IComparable<MultiplierControlPoint>
{ {
@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Timing
/// <summary> /// <summary>
/// The aggregate multiplier which this <see cref="MultiplierControlPoint"/> provides. /// The aggregate multiplier which this <see cref="MultiplierControlPoint"/> provides.
/// </summary> /// </summary>
public double Multiplier => Velocity * DifficultyPoint.SliderVelocity * BaseBeatLength / TimingPoint.BeatLength; public double Multiplier => Velocity * EffectPoint.ApproachRate * BaseBeatLength / TimingPoint.BeatLength;
/// <summary> /// <summary>
/// The base beat length to scale the <see cref="TimingPoint"/> provided multiplier relative to. /// The base beat length to scale the <see cref="TimingPoint"/> provided multiplier relative to.
@ -38,9 +38,9 @@ namespace osu.Game.Rulesets.Timing
public TimingControlPoint TimingPoint = new TimingControlPoint(); public TimingControlPoint TimingPoint = new TimingControlPoint();
/// <summary> /// <summary>
/// The <see cref="DifficultyControlPoint"/> that provides additional difficulty information for this <see cref="MultiplierControlPoint"/>. /// The <see cref="EffectControlPoint"/> that provides additional difficulty information for this <see cref="MultiplierControlPoint"/>.
/// </summary> /// </summary>
public DifficultyControlPoint DifficultyPoint = new DifficultyControlPoint(); public EffectControlPoint EffectPoint = new EffectControlPoint();
/// <summary> /// <summary>
/// Creates a <see cref="MultiplierControlPoint"/>. This is required for JSON serialization /// Creates a <see cref="MultiplierControlPoint"/>. This is required for JSON serialization

View File

@ -139,27 +139,26 @@ namespace osu.Game.Rulesets.UI.Scrolling
// Merge sequences of timing and difficulty control points to create the aggregate "multiplier" control point // Merge sequences of timing and difficulty control points to create the aggregate "multiplier" control point
var lastTimingPoint = new TimingControlPoint(); var lastTimingPoint = new TimingControlPoint();
var lastDifficultyPoint = new DifficultyControlPoint(); var lastEffectPoint = new EffectControlPoint();
var allPoints = new SortedList<ControlPoint>(Comparer<ControlPoint>.Default); var allPoints = new SortedList<ControlPoint>(Comparer<ControlPoint>.Default);
allPoints.AddRange(Beatmap.ControlPointInfo.TimingPoints);
// TODO: fix allPoints.AddRange(Beatmap.ControlPointInfo.TimingPoints);
//allPoints.AddRange(Beatmap.ControlPointInfo.DifficultyPoints); allPoints.AddRange(Beatmap.ControlPointInfo.EffectPoints);
// Generate the timing points, making non-timing changes use the previous timing change and vice-versa // Generate the timing points, making non-timing changes use the previous timing change and vice-versa
var timingChanges = allPoints.Select(c => var timingChanges = allPoints.Select(c =>
{ {
if (c is TimingControlPoint timingPoint) if (c is TimingControlPoint timingPoint)
lastTimingPoint = timingPoint; lastTimingPoint = timingPoint;
else if (c is DifficultyControlPoint difficultyPoint) else if (c is EffectControlPoint difficultyPoint)
lastDifficultyPoint = difficultyPoint; lastEffectPoint = difficultyPoint;
return new MultiplierControlPoint(c.Time) return new MultiplierControlPoint(c.Time)
{ {
Velocity = Beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier, Velocity = Beatmap.BeatmapInfo.BaseDifficulty.SliderMultiplier,
BaseBeatLength = baseBeatLength, BaseBeatLength = baseBeatLength,
TimingPoint = lastTimingPoint, TimingPoint = lastTimingPoint,
DifficultyPoint = lastDifficultyPoint EffectPoint = lastEffectPoint
}; };
}); });