// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Threading; using osu.Framework.Bindables; using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Taiko.Scoring; namespace osu.Game.Rulesets.Taiko.Objects { public abstract class TaikoHitObject : HitObject { /// /// Default size of a drawable taiko hit object. /// public const float DEFAULT_SIZE = 0.45f; /// /// Scale multiplier for a strong drawable taiko hit object. /// public const float STRONG_SCALE = 1.4f; /// /// Default size of a strong drawable taiko hit object. /// public const float DEFAULT_STRONG_SIZE = DEFAULT_SIZE * STRONG_SCALE; public readonly Bindable IsStrongBindable = new BindableBool(); /// /// Whether this can be made a "strong" (large) hit. /// public virtual bool CanBeStrong => true; /// /// Whether this HitObject is a "strong" type. /// Strong hit objects give more points for hitting the hit object with both keys. /// public bool IsStrong { get => IsStrongBindable.Value; set { if (value && !CanBeStrong) throw new InvalidOperationException($"Object of type {GetType()} cannot be strong"); IsStrongBindable.Value = value; } } protected override void CreateNestedHitObjects(CancellationToken cancellationToken) { base.CreateNestedHitObjects(cancellationToken); if (IsStrong) AddNested(new StrongHitObject { StartTime = this.GetEndTime() }); } public override Judgement CreateJudgement() => new TaikoJudgement(); protected override HitWindows CreateHitWindows() => new TaikoHitWindows(); } }