mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 08:52:55 +08:00
Fix ticks/spinners contributing to notelock
This commit is contained in:
parent
b9277165f7
commit
0d20292992
@ -124,7 +124,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
case SliderTailCircle tail:
|
case SliderTailCircle tail:
|
||||||
return new DrawableSliderTail(slider, tail);
|
return new DrawableSliderTail(slider, tail);
|
||||||
|
|
||||||
case HitCircle head:
|
case SliderHeadCircle head:
|
||||||
return new DrawableSliderHead(slider, head) { OnShake = Shake };
|
return new DrawableSliderHead(slider, head) { OnShake = Shake };
|
||||||
|
|
||||||
case SliderTick tick:
|
case SliderTick tick:
|
||||||
|
@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
|
|||||||
|
|
||||||
private readonly Slider slider;
|
private readonly Slider slider;
|
||||||
|
|
||||||
public DrawableSliderHead(Slider slider, HitCircle h)
|
public DrawableSliderHead(Slider slider, SliderHeadCircle h)
|
||||||
: base(h)
|
: base(h)
|
||||||
{
|
{
|
||||||
this.slider = slider;
|
this.slider = slider;
|
||||||
|
@ -155,7 +155,7 @@ namespace osu.Game.Rulesets.Osu.Objects
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SliderEventType.Head:
|
case SliderEventType.Head:
|
||||||
AddNested(HeadCircle = new SliderCircle
|
AddNested(HeadCircle = new SliderHeadCircle
|
||||||
{
|
{
|
||||||
StartTime = e.Time,
|
StartTime = e.Time,
|
||||||
Position = Position,
|
Position = Position,
|
||||||
|
9
osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs
Normal file
9
osu.Game.Rulesets.Osu/Objects/SliderHeadCircle.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// 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.
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Objects
|
||||||
|
{
|
||||||
|
public class SliderHeadCircle : HitCircle
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,7 @@ using osu.Game.Rulesets.Osu.Objects.Drawables;
|
|||||||
using osu.Game.Rulesets.Osu.Objects.Drawables.Connections;
|
using osu.Game.Rulesets.Osu.Objects.Drawables.Connections;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
using osu.Game.Rulesets.Judgements;
|
using osu.Game.Rulesets.Judgements;
|
||||||
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Osu.UI.Cursor;
|
using osu.Game.Rulesets.Osu.UI.Cursor;
|
||||||
using osu.Game.Skinning;
|
using osu.Game.Skinning;
|
||||||
|
|
||||||
@ -126,10 +127,7 @@ namespace osu.Game.Rulesets.Osu.UI
|
|||||||
/// <param name="result">The <see cref="JudgementResult"/> of the judged <see cref="OsuHitObject"/>.</param>
|
/// <param name="result">The <see cref="JudgementResult"/> of the judged <see cref="OsuHitObject"/>.</param>
|
||||||
private void missAllEarlier(JudgementResult result)
|
private void missAllEarlier(JudgementResult result)
|
||||||
{
|
{
|
||||||
// Hitobjects that count as bonus should not cause other hitobjects to get missed.
|
if (!contributesToNoteLock(result.HitObject))
|
||||||
// E.g. For the sequence slider-head -> circle -> slider-tick, hitting the tick before the circle should not cause the circle to be missed.
|
|
||||||
// E.g. For the sequence spinner -> circle -> spinner-bonus, hitting the bonus before the circle should not cause the circle to be missed.
|
|
||||||
if (result.Judgement.IsBonus)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// The minimum start time required for hitobjects so that they aren't missed.
|
// The minimum start time required for hitobjects so that they aren't missed.
|
||||||
@ -140,35 +138,44 @@ namespace osu.Game.Rulesets.Osu.UI
|
|||||||
if (obj.HitObject.StartTime >= minimumTime)
|
if (obj.HitObject.StartTime >= minimumTime)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
attemptMiss(obj);
|
performMiss(obj);
|
||||||
|
|
||||||
foreach (var n in obj.NestedHitObjects)
|
foreach (var n in obj.NestedHitObjects)
|
||||||
{
|
{
|
||||||
if (n.HitObject.StartTime >= minimumTime)
|
if (n.HitObject.StartTime >= minimumTime)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
attemptMiss(n);
|
performMiss(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void attemptMiss(DrawableHitObject obj)
|
|
||||||
{
|
|
||||||
if (!(obj is DrawableOsuHitObject osuObject))
|
|
||||||
throw new InvalidOperationException($"{obj.GetType()} is not a {nameof(DrawableOsuHitObject)}.");
|
|
||||||
|
|
||||||
// Hitobjects that have already been judged cannot be missed.
|
|
||||||
if (osuObject.Judged)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Hitobjects that count as bonus should not be missed.
|
|
||||||
// For the sequence slider-head -> slider-tick -> circle, hitting the circle before the tick should not cause the tick to be missed.
|
|
||||||
if (osuObject.Result.Judgement.IsBonus)
|
|
||||||
return;
|
|
||||||
|
|
||||||
osuObject.MissForcefully();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void performMiss(DrawableHitObject obj)
|
||||||
|
{
|
||||||
|
if (!(obj is DrawableOsuHitObject osuObject))
|
||||||
|
throw new InvalidOperationException($"{obj.GetType()} is not a {nameof(DrawableOsuHitObject)}.");
|
||||||
|
|
||||||
|
// Hitobjects that have already been judged cannot be missed.
|
||||||
|
if (osuObject.Judged)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Hitobjects that count as bonus should not be missed.
|
||||||
|
// For the sequence slider-head -> slider-tick -> circle, hitting the circle before the tick should not cause the tick to be missed.
|
||||||
|
if (!contributesToNoteLock(obj.HitObject))
|
||||||
|
return;
|
||||||
|
|
||||||
|
osuObject.MissForcefully();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether a hitobject contributes to notelock.
|
||||||
|
/// Only hit circles and slider start circles contribute to notelock.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hitObject">The hitobject to test.</param>
|
||||||
|
/// <returns>Whether <paramref name="hitObject"/> contributes to notelock.</returns>
|
||||||
|
private bool contributesToNoteLock(HitObject hitObject)
|
||||||
|
=> hitObject is HitCircle && !(hitObject is SliderTailCircle);
|
||||||
|
|
||||||
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => HitObjectContainer.ReceivePositionalInputAt(screenSpacePos);
|
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => HitObjectContainer.ReceivePositionalInputAt(screenSpacePos);
|
||||||
|
|
||||||
private class ApproachCircleProxyContainer : LifetimeManagementContainer
|
private class ApproachCircleProxyContainer : LifetimeManagementContainer
|
||||||
|
Loading…
Reference in New Issue
Block a user