protected override void CheckForResult(bool userTriggered, double timeOffset) { if (userTriggered) { DrawableMiniBossTick nextTick = null; foreach (var t in ticks) { if (!t.IsHit) { nextTick = t; break; } } nextTick?.TriggerResult(HitResult.Great); var numHits = ticks.Count(r => r.IsHit); var completion = (float)numHits / HitObject.RequiredHits; normalAnimation.Hide(); hitAnimation.Show(); hitAnimation.ScaleTo(base_sprite_scale + Math.Min(target_sprite_scale - base_sprite_scale, (target_sprite_scale - base_sprite_scale) * completion), 260, Easing.OutQuint); // TODO: update bonus score somehow? if (HitObject.HitWindows.CanBeHit(timeOffset)) { OnAttacked(this, timeOffset); } } else { if (timeOffset < 0) { return; } int numHits = 0; foreach (var tick in ticks) { if (tick.IsHit) { numHits++; continue; } tick.TriggerResult(HitResult.Miss); } var hitResult = numHits == HitObject.RequiredHits ? HitResult.Great : numHits > HitObject.RequiredHits / 2 ? HitResult.Good : HitResult.Miss; ApplyResult(r => r.Type = hitResult); } }
protected override void CheckForResult(bool userTriggered, double timeOffset) { if (Time.Current < HitObject.StartTime || AllJudged) { return; } if (userTriggered && timeOffset < 0) { var nextTick = ticks.FirstOrDefault(t => !t.IsHit); nextTick?.TriggerResult(HitResult.Perfect); var numHits = ticks.Count(r => r.IsHit); var completion = (float)numHits / HitObject.RequiredHits; normalAnimation.Hide(); hitAnimation.Show(); hitAnimation.ScaleTo(base_sprite_scale + Math.Min(target_sprite_scale - base_sprite_scale, (target_sprite_scale - base_sprite_scale) * completion), 260, Easing.OutQuint); OnAttacked(this, timeOffset); } else if (!userTriggered && timeOffset >= 0) { int numHits = 0; foreach (var tick in ticks) { if (tick.IsHit) { numHits++; continue; } tick.TriggerResult(HitResult.Miss); } var hitResult = numHits == HitObject.RequiredHits ? HitResult.Perfect : numHits > HitObject.RequiredHits / 2 ? HitResult.Great : HitResult.Miss; ApplyResult(r => r.Type = hitResult); } }