Fix type-to-sample mapping being applied too late

This commit is contained in:
Dean Herbert 2021-05-21 14:37:22 +09:00
parent c00e6e29a6
commit 40c8378d81
2 changed files with 31 additions and 28 deletions

View File

@ -55,16 +55,8 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
type.BindValueChanged(_ => type.BindValueChanged(_ =>
{ {
updateActionsFromType(); updateActionsFromType();
// will overwrite samples, should only be called on subsequent changes
// after the initial application.
updateSamplesFromTypeChange();
RecreatePieces(); RecreatePieces();
}); }, true);
// action update also has to happen immediately on application.
updateActionsFromType();
base.OnApply(); base.OnApply();
} }
@ -92,24 +84,6 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
type.Value = getRimSamples().Any() ? HitType.Rim : HitType.Centre; type.Value = getRimSamples().Any() ? HitType.Rim : HitType.Centre;
} }
private void updateSamplesFromTypeChange()
{
var rimSamples = getRimSamples();
bool isRimType = HitObject.Type == HitType.Rim;
if (isRimType != rimSamples.Any())
{
if (isRimType)
HitObject.Samples.Add(new HitSampleInfo(HitSampleInfo.HIT_CLAP));
else
{
foreach (var sample in rimSamples)
HitObject.Samples.Remove(sample);
}
}
}
private void updateActionsFromType() private void updateActionsFromType()
{ {
HitActions = HitActions =

View File

@ -1,7 +1,9 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence. // 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. // See the LICENCE file in the repository root for full licence text.
using System.Linq;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Game.Audio;
namespace osu.Game.Rulesets.Taiko.Objects namespace osu.Game.Rulesets.Taiko.Objects
{ {
@ -15,9 +17,36 @@ namespace osu.Game.Rulesets.Taiko.Objects
public HitType Type public HitType Type
{ {
get => TypeBindable.Value; get => TypeBindable.Value;
set => TypeBindable.Value = value; set
{
TypeBindable.Value = value;
updateSamplesFromType();
}
} }
private void updateSamplesFromType()
{
var rimSamples = getRimSamples();
bool isRimType = Type == HitType.Rim;
if (isRimType != rimSamples.Any())
{
if (isRimType)
Samples.Add(new HitSampleInfo(HitSampleInfo.HIT_CLAP));
else
{
foreach (var sample in rimSamples)
Samples.Remove(sample);
}
}
}
/// <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();
protected override StrongNestedHitObject CreateStrongNestedHit(double startTime) => new StrongNestedHit { StartTime = startTime }; protected override StrongNestedHitObject CreateStrongNestedHit(double startTime) => new StrongNestedHit { StartTime = startTime };
public class StrongNestedHit : StrongNestedHitObject public class StrongNestedHit : StrongNestedHitObject