mirror of
https://github.com/ppy/osu.git
synced 2025-03-22 19:47:22 +08:00
Merge branch 'fix-catch-clamp' of https://github.com/Drison64/osu into fix-catch-clamp
This commit is contained in:
commit
981a73d9f8
@ -2,6 +2,7 @@
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using osu.Game.Beatmaps;
|
||||
using osu.Game.Beatmaps.Timing;
|
||||
@ -125,7 +126,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
|
||||
/// Ensures alternation is reset before the first hitobject after a break.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestInputSingularWithBreak() => CreateModTest(new ModTestData
|
||||
public void TestInputSingularWithBreak([Values] bool pressBeforeSecondObject) => CreateModTest(new ModTestData
|
||||
{
|
||||
Mod = new OsuModAlternate(),
|
||||
PassCondition = () => Player.ScoreProcessor.Combo.Value == 0 && Player.ScoreProcessor.HighestCombo.Value == 2,
|
||||
@ -155,21 +156,26 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
|
||||
},
|
||||
}
|
||||
},
|
||||
ReplayFrames = new List<ReplayFrame>
|
||||
ReplayFrames = new ReplayFrame[]
|
||||
{
|
||||
// first press to start alternate lock.
|
||||
new OsuReplayFrame(500, new Vector2(100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(501, new Vector2(100)),
|
||||
// press same key after break but before hit object.
|
||||
new OsuReplayFrame(2250, new Vector2(300, 100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(2251, new Vector2(300, 100)),
|
||||
new OsuReplayFrame(450, new Vector2(100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(451, new Vector2(100)),
|
||||
// press same key at second hitobject and ensure it has been hit.
|
||||
new OsuReplayFrame(2500, new Vector2(500, 100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(2501, new Vector2(500, 100)),
|
||||
new OsuReplayFrame(2450, new Vector2(500, 100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(2451, new Vector2(500, 100)),
|
||||
// press same key at third hitobject and ensure it has been missed.
|
||||
new OsuReplayFrame(3000, new Vector2(500, 100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(3001, new Vector2(500, 100)),
|
||||
}
|
||||
new OsuReplayFrame(2950, new Vector2(500, 100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(2951, new Vector2(500, 100)),
|
||||
}.Concat(!pressBeforeSecondObject
|
||||
? Enumerable.Empty<ReplayFrame>()
|
||||
: new ReplayFrame[]
|
||||
{
|
||||
// press same key after break but before hit object.
|
||||
new OsuReplayFrame(2250, new Vector2(300, 100), OsuAction.LeftButton),
|
||||
new OsuReplayFrame(2251, new Vector2(300, 100)),
|
||||
}
|
||||
).ToList()
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ using osu.Game.Utils;
|
||||
|
||||
namespace osu.Game.Rulesets.Osu.Mods
|
||||
{
|
||||
public abstract class InputBlockingMod : Mod, IApplicableToDrawableRuleset<OsuHitObject>
|
||||
public abstract class InputBlockingMod : Mod, IApplicableToDrawableRuleset<OsuHitObject>, IUpdatableByPlayfield
|
||||
{
|
||||
public override double ScoreMultiplier => 1.0;
|
||||
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModRelax), typeof(OsuModCinema) };
|
||||
@ -62,15 +62,18 @@ namespace osu.Game.Rulesets.Osu.Mods
|
||||
gameplayClock = drawableRuleset.FrameStableClock;
|
||||
}
|
||||
|
||||
public void Update(Playfield playfield)
|
||||
{
|
||||
if (LastAcceptedAction != null && nonGameplayPeriods.IsInAny(gameplayClock.CurrentTime))
|
||||
LastAcceptedAction = null;
|
||||
}
|
||||
|
||||
protected abstract bool CheckValidNewAction(OsuAction action);
|
||||
|
||||
private bool checkCorrectAction(OsuAction action)
|
||||
{
|
||||
if (nonGameplayPeriods.IsInAny(gameplayClock.CurrentTime))
|
||||
{
|
||||
LastAcceptedAction = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (action)
|
||||
{
|
||||
|
@ -45,7 +45,7 @@ namespace osu.Game.Tests.Visual.UserInterface
|
||||
displayedCount = new OsuSpriteText()
|
||||
};
|
||||
|
||||
notificationOverlay.UnreadCount.ValueChanged += count => { displayedCount.Text = $"displayed count: {count.NewValue}"; };
|
||||
notificationOverlay.UnreadCount.ValueChanged += count => { displayedCount.Text = $"unread count: {count.NewValue}"; };
|
||||
});
|
||||
|
||||
[Test]
|
||||
@ -270,6 +270,8 @@ namespace osu.Game.Tests.Visual.UserInterface
|
||||
AddUntilStep("wait completion", () => notification.State == ProgressNotificationState.Completed);
|
||||
|
||||
AddAssert("Completion toast shown", () => notificationOverlay.ToastCount == 1);
|
||||
AddUntilStep("wait forwarded", () => notificationOverlay.ToastCount == 0);
|
||||
AddAssert("only one unread", () => notificationOverlay.UnreadCount.Value == 1);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
@ -210,14 +210,14 @@ namespace osu.Game.Overlays
|
||||
mainContent.FadeTo(0, TRANSITION_LENGTH, Easing.OutQuint);
|
||||
}
|
||||
|
||||
private void notificationClosed()
|
||||
private void notificationClosed() => Schedule(() =>
|
||||
{
|
||||
updateCounts();
|
||||
|
||||
// this debounce is currently shared between popin/popout sounds, which means one could potentially not play when the user is expecting it.
|
||||
// popout is constant across all notification types, and should therefore be handled using playback concurrency instead, but seems broken at the moment.
|
||||
playDebouncedSample("UI/overlay-pop-out");
|
||||
}
|
||||
});
|
||||
|
||||
private void playDebouncedSample(string sampleName)
|
||||
{
|
||||
|
@ -26,7 +26,8 @@ namespace osu.Game.Overlays.Notifications
|
||||
public abstract class Notification : Container
|
||||
{
|
||||
/// <summary>
|
||||
/// User requested close.
|
||||
/// Notification was closed, either by user or otherwise.
|
||||
/// Importantly, this event may be fired from a non-update thread.
|
||||
/// </summary>
|
||||
public event Action? Closed;
|
||||
|
||||
@ -55,6 +56,8 @@ namespace osu.Game.Overlays.Notifications
|
||||
|
||||
protected Container IconContent;
|
||||
|
||||
public bool WasClosed { get; private set; }
|
||||
|
||||
private readonly Container content;
|
||||
|
||||
protected override Container<Drawable> Content => content;
|
||||
@ -245,21 +248,23 @@ namespace osu.Game.Overlays.Notifications
|
||||
initialFlash.FadeOutFromOne(2000, Easing.OutQuart);
|
||||
}
|
||||
|
||||
public bool WasClosed;
|
||||
|
||||
public virtual void Close(bool runFlingAnimation)
|
||||
{
|
||||
if (WasClosed) return;
|
||||
|
||||
WasClosed = true;
|
||||
|
||||
if (runFlingAnimation && dragContainer.FlingLeft())
|
||||
this.FadeOut(600, Easing.In);
|
||||
else
|
||||
this.FadeOut(100);
|
||||
|
||||
Closed?.Invoke();
|
||||
Expire();
|
||||
|
||||
Schedule(() =>
|
||||
{
|
||||
if (runFlingAnimation && dragContainer.FlingLeft())
|
||||
this.FadeOut(600, Easing.In);
|
||||
else
|
||||
this.FadeOut(100);
|
||||
|
||||
Expire();
|
||||
});
|
||||
}
|
||||
|
||||
private class DragContainer : Container
|
||||
|
@ -142,7 +142,6 @@ namespace osu.Game.Overlays.Notifications
|
||||
case ProgressNotificationState.Completed:
|
||||
loadingSpinner.Hide();
|
||||
attemptPostCompletion();
|
||||
base.Close(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -166,6 +165,8 @@ namespace osu.Game.Overlays.Notifications
|
||||
|
||||
CompletionTarget.Invoke(CreateCompletionNotification());
|
||||
completionSent = true;
|
||||
|
||||
Close(false);
|
||||
}
|
||||
|
||||
private ProgressNotificationState state;
|
||||
@ -239,6 +240,7 @@ namespace osu.Game.Overlays.Notifications
|
||||
{
|
||||
switch (State)
|
||||
{
|
||||
case ProgressNotificationState.Completed:
|
||||
case ProgressNotificationState.Cancelled:
|
||||
base.Close(runFlingAnimation);
|
||||
break;
|
||||
|
@ -150,9 +150,9 @@ namespace osu.Game.Rulesets.Mods
|
||||
|
||||
if (comboBasedSize)
|
||||
{
|
||||
if (combo > 200)
|
||||
if (combo >= 200)
|
||||
size *= 0.8f;
|
||||
else if (combo > 100)
|
||||
else if (combo >= 100)
|
||||
size *= 0.9f;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user