mirror of
https://github.com/osukey/osukey.git
synced 2025-04-29 02:37:25 +09:00
The rationale is the same as in 6d325651dcca275091d51bbfbad3e59fa4ce4dc8. 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
|
|
{
|
|
}
|
|
}
|
|
}
|