1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-21 16:42:55 +08:00
osu-lazer/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

137 lines
4.3 KiB
C#
Raw Normal View History

// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2018-04-13 17:19:50 +08:00
2017-04-18 15:05:58 +08:00
using osu.Game.Rulesets.Objects.Types;
using System.Threading;
using osu.Framework.Bindables;
2017-07-26 12:22:46 +08:00
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Beatmaps.Formats;
2018-11-29 09:56:19 +08:00
using osu.Game.Rulesets.Judgements;
2020-04-21 15:45:01 +08:00
using osu.Game.Rulesets.Objects;
2019-09-06 14:24:00 +08:00
using osu.Game.Rulesets.Scoring;
2020-04-21 15:45:01 +08:00
using osuTK;
2018-04-13 17:19:50 +08:00
2017-04-18 15:05:58 +08:00
namespace osu.Game.Rulesets.Taiko.Objects
2017-03-17 12:56:14 +08:00
{
public class DrumRoll : TaikoStrongableHitObject, IHasPath, IHasSliderVelocity
2017-03-17 12:56:14 +08:00
{
/// <summary>
/// Drum roll distance that results in a duration of 1 speed-adjusted beat length.
/// </summary>
private const float base_distance = 100;
2018-04-13 17:19:50 +08:00
2020-02-05 16:12:26 +08:00
public double EndTime
{
get => StartTime + Duration;
set => Duration = value - StartTime;
}
2018-04-13 17:19:50 +08:00
2017-04-05 12:52:53 +08:00
public double Duration { get; set; }
2018-04-13 17:19:50 +08:00
2020-04-21 15:45:01 +08:00
/// <summary>
/// Velocity of this <see cref="DrumRoll"/>.
/// </summary>
public double Velocity { get; private set; }
public BindableNumber<double> SliderVelocityBindable { get; } = new BindableDouble(1)
{
Precision = 0.01,
MinValue = 0.1,
MaxValue = 10
};
public double SliderVelocity
{
get => SliderVelocityBindable.Value;
set => SliderVelocityBindable.Value = value;
}
2017-03-17 12:56:14 +08:00
/// <summary>
/// Numer of ticks per beat length.
2017-03-17 12:56:14 +08:00
/// </summary>
public int TickRate = 1;
2018-04-13 17:19:50 +08:00
/// <summary>
/// The length (in milliseconds) between ticks of this drumroll.
/// <para>Half of this value is the hit window of the ticks.</para>
/// </summary>
private double tickSpacing = 100;
2018-04-13 17:19:50 +08:00
protected override void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, IBeatmapDifficultyInfo difficulty)
2017-03-17 12:56:14 +08:00
{
base.ApplyDefaultsToSelf(controlPointInfo, difficulty);
2018-04-13 17:19:50 +08:00
TimingControlPoint timingPoint = controlPointInfo.TimingPointAt(StartTime);
2020-04-21 15:45:01 +08:00
double scoringDistance = base_distance * difficulty.SliderMultiplier * SliderVelocity;
2020-04-21 15:45:01 +08:00
Velocity = scoringDistance / timingPoint.BeatLength;
2018-04-13 17:19:50 +08:00
TickRate = difficulty.SliderTickRate == 3 ? 3 : 4;
tickSpacing = timingPoint.BeatLength / TickRate;
2017-03-17 12:56:14 +08:00
}
2018-04-13 17:19:50 +08:00
protected override void CreateNestedHitObjects(CancellationToken cancellationToken)
2017-03-17 12:56:14 +08:00
{
createTicks(cancellationToken);
base.CreateNestedHitObjects(cancellationToken);
}
2018-04-13 17:19:50 +08:00
private void createTicks(CancellationToken cancellationToken)
{
if (tickSpacing == 0)
return;
2018-04-13 17:19:50 +08:00
2017-03-17 12:56:14 +08:00
bool first = true;
2019-04-01 11:16:05 +08:00
for (double t = StartTime; t < EndTime + tickSpacing / 2; t += tickSpacing)
2017-03-17 12:56:14 +08:00
{
cancellationToken.ThrowIfCancellationRequested();
AddNested(new DrumRollTick(this)
2017-03-17 12:56:14 +08:00
{
FirstTick = first,
TickSpacing = tickSpacing,
2017-03-17 12:56:14 +08:00
StartTime = t,
IsStrong = IsStrong,
Propagate samples to drum roll/swell ticks for correct playback In d97daee96be2c10f90709cc30beceb1f369ae225, `DrumSampleTriggerSource` was changed such that in order to play sounds for the user's inputs, the bank of the normal sound would always be used. The problem is that in the case of taiko objects which have nested objects (swells and drum rolls), the samples were not propagated fully (drum rolls, where only the finish sample was kept, for the purposes of determining strongability), or not propagated at all (swells) to ticks. As ticks of both objects are valid return values of `GetMostValidHitObject()`, this would lead to the drum making no sounds if the next object was a drum roll or swell, until that drum roll or swell was completed. To fix, propagate the full set of samples, so that `DrumSampleTriggerSource` can retrieve the normal sound to copy the bank from. Note that this may not necessarily reproduce prior behaviour. This is because it is not guaranteed that all realised samples for a given hitobject have the same bank - some may have been overriden locally on a given hitobject. Previously, the bank would have been retrieved from the sample control point, wherein there is only one possible bank to use; however, when deciding the sound to play on the basis of a constructed hitobject, it is possible that there are cases wherein the hitnormal sample was overridden on that given hitobject, and in such cases, this PR would make samples _play_, but not necessarily the _same_ samples as prior to #23308. If that turns out to be the case, this will have to be revisited.
2023-05-21 22:49:17 +08:00
Samples = Samples
});
2018-04-13 17:19:50 +08:00
2017-03-17 12:56:14 +08:00
first = false;
}
}
2018-12-06 16:09:42 +08:00
2022-08-30 20:44:44 +08:00
public override Judgement CreateJudgement() => new IgnoreJudgement();
2019-10-09 18:08:31 +08:00
protected override HitWindows CreateHitWindows() => HitWindows.Empty;
2020-04-21 15:45:01 +08:00
2023-05-23 18:07:54 +08:00
protected override StrongNestedHitObject CreateStrongNestedHit(double startTime) => new StrongNestedHit(this)
{
StartTime = startTime,
Samples = Samples
};
2020-12-13 19:59:46 +08:00
public class StrongNestedHit : StrongNestedHitObject
{
2022-09-06 16:27:29 +08:00
// The strong hit of the drum roll doesn't actually provide any score.
public override Judgement CreateJudgement() => new IgnoreJudgement();
2023-05-09 18:30:54 +08:00
public StrongNestedHit(TaikoHitObject parent)
: base(parent)
{
}
2020-12-13 19:59:46 +08:00
}
2020-04-21 15:45:01 +08:00
#region LegacyBeatmapEncoder
double IHasDistance.Distance => Duration * Velocity;
SliderPath IHasPath.Path
=> new SliderPath(PathType.Linear, new[] { Vector2.Zero, new Vector2(1) }, ((IHasDistance)this).Distance / LegacyBeatmapEncoder.LEGACY_TAIKO_VELOCITY_MULTIPLIER);
2020-04-21 15:45:01 +08:00
#endregion
2017-03-17 12:56:14 +08:00
}
}