diff --git a/osu.Game.Rulesets.Taiko/Judgements/TaikoIntermediateSwellJudgement.cs b/osu.Game.Rulesets.Taiko/Judgements/TaikoIntermediateSwellJudgement.cs index 608f1f9be2..adcf4572c5 100644 --- a/osu.Game.Rulesets.Taiko/Judgements/TaikoIntermediateSwellJudgement.cs +++ b/osu.Game.Rulesets.Taiko/Judgements/TaikoIntermediateSwellJudgement.cs @@ -11,11 +11,6 @@ namespace osu.Game.Rulesets.Taiko.Judgements public override bool AffectsCombo => false; - public TaikoIntermediateSwellJudgement() - { - Final = false; - } - /// /// Computes the numeric result value for the combo portion of the score. /// diff --git a/osu.Game.Rulesets.Taiko/Judgements/TaikoStrongHitJudgement.cs b/osu.Game.Rulesets.Taiko/Judgements/TaikoStrongHitJudgement.cs index 288ad236aa..b69bbd4fd8 100644 --- a/osu.Game.Rulesets.Taiko/Judgements/TaikoStrongHitJudgement.cs +++ b/osu.Game.Rulesets.Taiko/Judgements/TaikoStrongHitJudgement.cs @@ -6,10 +6,5 @@ namespace osu.Game.Rulesets.Taiko.Judgements public class TaikoStrongHitJudgement : TaikoJudgement { public override bool AffectsCombo => false; - - public TaikoStrongHitJudgement() - { - Final = true; - } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs index 00eac4adca..57c0f55a59 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRoll.cs @@ -6,7 +6,6 @@ using osu.Framework.Allocation; using osu.Framework.MathUtils; using osu.Game.Graphics; using osu.Game.Rulesets.Objects.Drawables; -using osu.Game.Rulesets.Taiko.Judgements; using OpenTK; using OpenTK.Graphics; using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces; @@ -85,12 +84,16 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables int countHit = NestedHitObjects.Count(o => o.IsHit); if (countHit >= HitObject.RequiredGoodHits) { - AddJudgement(new TaikoJudgement { Result = countHit >= HitObject.RequiredGreatHits ? HitResult.Great : HitResult.Good }); + ApplyJudgement(HitObject.Judgement, j => j.Result = countHit >= HitObject.RequiredGreatHits ? HitResult.Great : HitResult.Good); if (HitObject.IsStrong) - AddJudgement(new TaikoStrongHitJudgement()); + ApplyJudgement(HitObject.StrongJudgement, j => j.Result = HitResult.Great); } else - AddJudgement(new TaikoJudgement { Result = HitResult.Miss }); + { + ApplyJudgement(HitObject.Judgement, j => j.Result = HitResult.Miss); + if (HitObject.IsStrong) + ApplyJudgement(HitObject.StrongJudgement, j => j.Result = HitResult.Miss); + } } protected override void UpdateState(ArmedState state) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs index 7a57cf77b4..86853afc35 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableDrumRollTick.cs @@ -5,7 +5,6 @@ using System; using osu.Framework.Graphics; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; -using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces; namespace osu.Game.Rulesets.Taiko.Objects.Drawables @@ -28,14 +27,23 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables protected override void CheckForJudgements(bool userTriggered, double timeOffset) { if (!userTriggered) + { + if (timeOffset > HitObject.HitWindow) + { + ApplyJudgement(HitObject.Judgement, j => j.Result = HitResult.Miss); + if (HitObject.IsStrong) + ApplyJudgement(HitObject.StrongJudgement, j => j.Result = HitResult.Miss); + } + + return; + } + + if (Math.Abs(timeOffset) > HitObject.HitWindow) return; - if (!(Math.Abs(timeOffset) < HitObject.HitWindow)) - return; - - AddJudgement(new TaikoDrumRollTickJudgement { Result = HitResult.Great }); + ApplyJudgement(HitObject.Judgement, j => j.Result = HitResult.Great); if (HitObject.IsStrong) - AddJudgement(new TaikoStrongHitJudgement()); + ApplyJudgement(HitObject.StrongJudgement, j => j.Result = HitResult.Great); } protected override void UpdateState(ArmedState state) diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs index bb9cd02b14..f7a170d838 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHit.cs @@ -5,7 +5,6 @@ using System.Linq; using osu.Framework.Graphics; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; -using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces; namespace osu.Game.Rulesets.Taiko.Objects.Drawables @@ -17,11 +16,6 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables /// protected abstract TaikoAction[] HitActions { get; } - /// - /// Whether a second hit is allowed to be processed. This occurs once this hit object has been hit successfully. - /// - protected bool SecondHitAllowed { get; private set; } - /// /// Whether the last key pressed is a valid hit key. /// @@ -38,7 +32,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables if (!userTriggered) { if (!HitObject.HitWindows.CanBeHit(timeOffset)) - AddJudgement(new TaikoJudgement { Result = HitResult.Miss }); + ApplyJudgement(HitObject.Judgement, j => j.Result = HitResult.Miss); return; } @@ -47,17 +41,9 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables return; if (!validKeyPressed || result == HitResult.Miss) - AddJudgement(new TaikoJudgement { Result = HitResult.Miss }); + ApplyJudgement(HitObject.Judgement, j => j.Result = HitResult.Miss); else - { - AddJudgement(new TaikoJudgement - { - Result = result, - Final = !HitObject.IsStrong - }); - - SecondHitAllowed = true; - } + ApplyJudgement(HitObject.Judgement, j => j.Result = result); } public override bool OnPressed(TaikoAction action) @@ -86,7 +72,6 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables switch (State.Value) { case ArmedState.Idle: - SecondHitAllowed = false; validKeyPressed = false; UnproxyContent(); diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs index b431d35e16..ede13aadce 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableHitStrong.cs @@ -5,7 +5,6 @@ using System; using System.Linq; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; -using osu.Game.Rulesets.Taiko.Judgements; namespace osu.Game.Rulesets.Taiko.Objects.Drawables { @@ -28,23 +27,27 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables protected override void CheckForJudgements(bool userTriggered, double timeOffset) { - if (!SecondHitAllowed) + if (!HitObject.Judgement.HasResult) { base.CheckForJudgements(userTriggered, timeOffset); return; } + if (!HitObject.Judgement.IsHit) + { + ApplyJudgement(HitObject.StrongJudgement, j => j.Result = HitResult.Miss); + return; + } + if (!userTriggered) { if (timeOffset > second_hit_window) - AddJudgement(new TaikoStrongHitJudgement { Result = HitResult.None }); + ApplyJudgement(HitObject.StrongJudgement, j => j.Result = HitResult.Miss); return; } - // If we get here, we're assured that the key pressed is the correct secondary key - if (Math.Abs(firstHitTime - Time.Current) < second_hit_window) - AddJudgement(new TaikoStrongHitJudgement { Result = HitResult.Great }); + ApplyJudgement(HitObject.StrongJudgement, j => j.Result = HitResult.Great); } protected override void UpdateState(ArmedState state) @@ -73,7 +76,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables return false; // Check if we've handled the first key - if (!SecondHitAllowed) + if (!HitObject.Judgement.HasResult) { // First key hasn't been handled yet, attempt to handle it bool handled = base.OnPressed(action); diff --git a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs index 408b37e377..f44e70d11d 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Drawables/DrawableSwell.cs @@ -2,6 +2,7 @@ // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE using System; +using System.Linq; using osu.Framework.Allocation; using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Graphics; @@ -12,7 +13,6 @@ using osu.Game.Rulesets.Taiko.Objects.Drawables.Pieces; using OpenTK; using OpenTK.Graphics; using osu.Framework.Graphics.Shapes; -using osu.Game.Rulesets.Taiko.Judgements; using osu.Game.Rulesets.Scoring; namespace osu.Game.Rulesets.Taiko.Objects.Drawables @@ -128,9 +128,14 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables { if (userTriggered) { - AddJudgement(new TaikoIntermediateSwellJudgement()); + var nextIntermediate = HitObject.IntermediateJudgements.FirstOrDefault(j => !j.HasResult); - var completion = (float)Judgements.Count / HitObject.RequiredHits; + if (nextIntermediate != null) + ApplyJudgement(nextIntermediate, j => j.Result = HitResult.Great); + + var numHits = HitObject.IntermediateJudgements.Count(j => j.HasResult); + + var completion = (float)numHits / HitObject.RequiredHits; expandingRing .FadeTo(expandingRing.Alpha + MathHelper.Clamp(completion / 16, 0.1f, 0.6f), 50) @@ -141,18 +146,28 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables expandingRing.ScaleTo(1f + Math.Min(target_ring_scale - 1f, (target_ring_scale - 1f) * completion * 1.3f), 260, Easing.OutQuint); - if (Judgements.Count == HitObject.RequiredHits) - AddJudgement(new TaikoJudgement { Result = HitResult.Great }); + if (numHits == HitObject.RequiredHits) + ApplyJudgement(HitObject.Judgement, j => j.Result = HitResult.Great); } else { if (timeOffset < 0) return; - //TODO: THIS IS SHIT AND CAN'T EXIST POST-TAIKO WORLD CUP - AddJudgement(Judgements.Count > HitObject.RequiredHits / 2 - ? new TaikoJudgement { Result = HitResult.Good } - : new TaikoJudgement { Result = HitResult.Miss }); + int numHits = 0; + + foreach (var intermediate in HitObject.IntermediateJudgements) + { + if (intermediate.HasResult) + { + numHits++; + continue; + } + + ApplyJudgement(intermediate, j => j.Result = HitResult.Miss); + } + + ApplyJudgement(HitObject.Judgement, j => j.Result = numHits > HitObject.RequiredHits / 2 ? HitResult.Good : HitResult.Miss); } } diff --git a/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs b/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs index 4c9ec5473b..b6b1efee16 100644 --- a/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs +++ b/osu.Game.Rulesets.Taiko/Objects/DrumRoll.cs @@ -3,8 +3,11 @@ using osu.Game.Rulesets.Objects.Types; using System; +using System.Collections.Generic; using osu.Game.Beatmaps; using osu.Game.Beatmaps.ControlPoints; +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Taiko.Judgements; namespace osu.Game.Rulesets.Taiko.Objects { @@ -81,5 +84,16 @@ namespace osu.Game.Rulesets.Taiko.Objects first = false; } } + + public TaikoJudgement Judgement { get; private set; } + public TaikoStrongHitJudgement StrongJudgement { get; private set; } + + protected override IEnumerable CreateJudgements() + { + yield return Judgement = new TaikoJudgement(); + + if (IsStrong) + yield return StrongJudgement = new TaikoStrongHitJudgement(); + } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs b/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs index e546d6427f..58f6a2840a 100644 --- a/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs +++ b/osu.Game.Rulesets.Taiko/Objects/DrumRollTick.cs @@ -1,6 +1,10 @@ // Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System.Collections.Generic; +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Taiko.Judgements; + namespace osu.Game.Rulesets.Taiko.Objects { public class DrumRollTick : TaikoHitObject @@ -20,5 +24,16 @@ namespace osu.Game.Rulesets.Taiko.Objects /// The time allowed to hit this tick. /// public double HitWindow => TickSpacing / 2; + + public TaikoDrumRollTickJudgement Judgement { get; private set; } + public TaikoStrongHitJudgement StrongJudgement { get; private set; } + + protected override IEnumerable CreateJudgements() + { + yield return Judgement = new TaikoDrumRollTickJudgement(); + + if (IsStrong) + yield return StrongJudgement = new TaikoStrongHitJudgement(); + } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Hit.cs b/osu.Game.Rulesets.Taiko/Objects/Hit.cs index 0b47aa490b..94fc1ab20f 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Hit.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Hit.cs @@ -1,9 +1,23 @@ // Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System.Collections.Generic; +using osu.Game.Rulesets.Judgements; +using osu.Game.Rulesets.Taiko.Judgements; + namespace osu.Game.Rulesets.Taiko.Objects { public class Hit : TaikoHitObject { + public TaikoJudgement Judgement { get; private set; } + public TaikoStrongHitJudgement StrongJudgement { get; private set; } + + protected override IEnumerable CreateJudgements() + { + yield return Judgement = new TaikoJudgement(); + + if (IsStrong) + yield return StrongJudgement = new TaikoStrongHitJudgement(); + } } } diff --git a/osu.Game.Rulesets.Taiko/Objects/Swell.cs b/osu.Game.Rulesets.Taiko/Objects/Swell.cs index eb6f931af4..0985853dd6 100644 --- a/osu.Game.Rulesets.Taiko/Objects/Swell.cs +++ b/osu.Game.Rulesets.Taiko/Objects/Swell.cs @@ -1,7 +1,10 @@ // Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using System.Collections.Generic; +using osu.Game.Rulesets.Judgements; using osu.Game.Rulesets.Objects.Types; +using osu.Game.Rulesets.Taiko.Judgements; namespace osu.Game.Rulesets.Taiko.Objects { @@ -15,5 +18,23 @@ namespace osu.Game.Rulesets.Taiko.Objects /// The number of hits required to complete the swell successfully. /// public int RequiredHits = 10; + + public TaikoJudgement Judgement { get; private set; } + + private readonly List intermediateJudgements = new List(); + public IReadOnlyList IntermediateJudgements => intermediateJudgements; + + protected override IEnumerable CreateJudgements() + { + yield return Judgement = new TaikoJudgement(); + + for (int i = 0; i < RequiredHits; i++) + { + var intermediate = new TaikoIntermediateSwellJudgement(); + intermediateJudgements.Add(intermediate); + + yield return intermediate; + } + } } }