mirror of
https://github.com/ppy/osu.git
synced 2024-11-15 23:47:25 +08:00
4a7b011a53
The rationale is the same as in
6d325651dc
. Due to the recursive nature of
`GameplaySampleTriggerSource.GetMostValidObject()`, in the case of
nested hits, drum rolls and drum roll ticks, the nested strong hits
would become the most valid object, and so without propagating
the samples down to that level too, nothing would play.
86 lines
2.6 KiB
C#
86 lines
2.6 KiB
C#
// 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.
|
|
|
|
#nullable disable
|
|
|
|
using System.Linq;
|
|
using osu.Framework.Bindables;
|
|
using osu.Framework.Extensions.Color4Extensions;
|
|
using osu.Game.Audio;
|
|
using osu.Game.Rulesets.Objects;
|
|
using osu.Game.Rulesets.Objects.Types;
|
|
using osuTK.Graphics;
|
|
|
|
namespace osu.Game.Rulesets.Taiko.Objects
|
|
{
|
|
public class Hit : TaikoStrongableHitObject, IHasDisplayColour
|
|
{
|
|
private HitObjectProperty<HitType> type;
|
|
|
|
public Bindable<HitType> TypeBindable => type.Bindable;
|
|
|
|
/// <summary>
|
|
/// The <see cref="HitType"/> that actuates this <see cref="Hit"/>.
|
|
/// </summary>
|
|
public HitType Type
|
|
{
|
|
get => type.Value;
|
|
set => type.Value = value;
|
|
}
|
|
|
|
public Bindable<Color4> DisplayColour { get; } = new Bindable<Color4>(COLOUR_CENTRE);
|
|
|
|
public static readonly Color4 COLOUR_CENTRE = Color4Extensions.FromHex(@"bb1177");
|
|
public static readonly Color4 COLOUR_RIM = Color4Extensions.FromHex(@"2299bb");
|
|
|
|
public Hit()
|
|
{
|
|
TypeBindable.BindValueChanged(_ =>
|
|
{
|
|
updateSamplesFromType();
|
|
DisplayColour.Value = Type == HitType.Centre ? COLOUR_CENTRE : COLOUR_RIM;
|
|
});
|
|
|
|
SamplesBindable.BindCollectionChanged((_, _) => updateTypeFromSamples());
|
|
}
|
|
|
|
private void updateTypeFromSamples()
|
|
{
|
|
Type = getRimSamples().Any() ? HitType.Rim : HitType.Centre;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns an array of any samples which would cause this object to be a "rim" type hit.
|
|
/// </summary>
|
|
private HitSampleInfo[] getRimSamples() => Samples.Where(s => s.Name == HitSampleInfo.HIT_CLAP || s.Name == HitSampleInfo.HIT_WHISTLE).ToArray();
|
|
|
|
private void updateSamplesFromType()
|
|
{
|
|
var rimSamples = getRimSamples();
|
|
|
|
bool isRimType = Type == HitType.Rim;
|
|
|
|
if (isRimType != rimSamples.Any())
|
|
{
|
|
if (isRimType)
|
|
Samples.Add(CreateHitSampleInfo(HitSampleInfo.HIT_CLAP));
|
|
else
|
|
{
|
|
foreach (var sample in rimSamples)
|
|
Samples.Remove(sample);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override StrongNestedHitObject CreateStrongNestedHit(double startTime) => new StrongNestedHit
|
|
{
|
|
StartTime = startTime,
|
|
Samples = Samples
|
|
};
|
|
|
|
public class StrongNestedHit : StrongNestedHitObject
|
|
{
|
|
}
|
|
}
|
|
}
|