mirror of
https://github.com/osukey/osukey.git
synced 2025-08-04 15:16:38 +09:00
Merge branch 'master' into multiplayer-force-start-2
This commit is contained in:
@ -196,11 +196,8 @@ namespace osu.Game.Screens.Menu
|
||||
|
||||
if (State == ButtonSystemState.Initial)
|
||||
{
|
||||
if (buttonsTopLevel.Any(b => e.Key == b.TriggerKey))
|
||||
{
|
||||
logo?.TriggerClick();
|
||||
return true;
|
||||
}
|
||||
logo?.TriggerClick();
|
||||
return true;
|
||||
}
|
||||
|
||||
return base.OnKeyDown(e);
|
||||
|
@ -109,7 +109,7 @@ namespace osu.Game.Screens.Menu
|
||||
AutoSizeAxes = Axes.Both,
|
||||
Children = new Drawable[]
|
||||
{
|
||||
logoBounceContainer = new Container
|
||||
logoBounceContainer = new DragContainer
|
||||
{
|
||||
AutoSizeAxes = Axes.Both,
|
||||
Children = new Drawable[]
|
||||
@ -402,5 +402,28 @@ namespace osu.Game.Screens.Menu
|
||||
impactContainer.ScaleTo(0.96f);
|
||||
impactContainer.ScaleTo(1.12f, 250);
|
||||
}
|
||||
|
||||
private class DragContainer : Container
|
||||
{
|
||||
public override bool DragBlocksClick => false;
|
||||
|
||||
protected override bool OnDragStart(DragStartEvent e) => true;
|
||||
|
||||
protected override void OnDrag(DragEvent e)
|
||||
{
|
||||
Vector2 change = e.MousePosition - e.MouseDownPosition;
|
||||
|
||||
// Diminish the drag distance as we go further to simulate "rubber band" feeling.
|
||||
change *= change.Length <= 0 ? 0 : MathF.Pow(change.Length, 0.6f) / change.Length;
|
||||
|
||||
this.MoveTo(change);
|
||||
}
|
||||
|
||||
protected override void OnDragEnd(DragEndEvent e)
|
||||
{
|
||||
this.MoveTo(Vector2.Zero, 800, Easing.OutElastic);
|
||||
base.OnDragEnd(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -43,8 +43,7 @@ namespace osu.Game.Screens.Play.Break
|
||||
Direction = FillDirection.Vertical,
|
||||
Children = new Drawable[]
|
||||
{
|
||||
AccuracyDisplay = new PercentageBreakInfoLine(BeatmapsetsStrings.ShowStatsAccuracy),
|
||||
|
||||
AccuracyDisplay = new PercentageBreakInfoLine(BeatmapsetsStrings.ShowScoreboardHeadersAccuracy),
|
||||
// See https://github.com/ppy/osu/discussions/15185
|
||||
// RankDisplay = new BreakInfoLine<int>("Rank"),
|
||||
GradeDisplay = new BreakInfoLine<ScoreRank>("Grade"),
|
||||
|
@ -66,7 +66,7 @@ namespace osu.Game.Screens.Play
|
||||
private readonly FillFlowContainer bottomRightElements;
|
||||
private readonly FillFlowContainer topRightElements;
|
||||
|
||||
internal readonly IBindable<bool> IsBreakTime = new Bindable<bool>();
|
||||
internal readonly IBindable<bool> IsPlaying = new Bindable<bool>();
|
||||
|
||||
private bool holdingForHUD;
|
||||
|
||||
@ -152,7 +152,7 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
ShowHud.BindValueChanged(visible => hideTargets.ForEach(d => d.FadeTo(visible.NewValue ? 1 : 0, FADE_DURATION, FADE_EASING)));
|
||||
|
||||
IsBreakTime.BindValueChanged(_ => updateVisibility());
|
||||
IsPlaying.BindValueChanged(_ => updateVisibility());
|
||||
configVisibilityMode.BindValueChanged(_ => updateVisibility(), true);
|
||||
|
||||
replayLoaded.BindValueChanged(replayLoadedValueChanged, true);
|
||||
@ -218,7 +218,7 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
case HUDVisibilityMode.HideDuringGameplay:
|
||||
// always show during replay as we want the seek bar to be visible.
|
||||
ShowHud.Value = replayLoaded.Value || IsBreakTime.Value;
|
||||
ShowHud.Value = replayLoaded.Value || !IsPlaying.Value;
|
||||
break;
|
||||
|
||||
case HUDVisibilityMode.Always:
|
||||
|
@ -457,7 +457,7 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
private void updateGameplayState()
|
||||
{
|
||||
bool inGameplay = !DrawableRuleset.HasReplayLoaded.Value && !DrawableRuleset.IsPaused.Value && !breakTracker.IsBreakTime.Value;
|
||||
bool inGameplay = !DrawableRuleset.HasReplayLoaded.Value && !DrawableRuleset.IsPaused.Value && !breakTracker.IsBreakTime.Value && !GameplayState.HasFailed;
|
||||
OverlayActivationMode.Value = inGameplay ? OverlayActivation.Disabled : OverlayActivation.UserTriggered;
|
||||
localUserPlaying.Value = inGameplay;
|
||||
}
|
||||
@ -812,6 +812,8 @@ namespace osu.Game.Screens.Play
|
||||
GameplayState.HasFailed = true;
|
||||
Score.ScoreInfo.Passed = false;
|
||||
|
||||
updateGameplayState();
|
||||
|
||||
// There is a chance that we could be in a paused state as the ruleset's internal clock (see FrameStabilityContainer)
|
||||
// could process an extra frame after the GameplayClock is stopped.
|
||||
// In such cases we want the fail state to precede a user triggered pause.
|
||||
@ -945,7 +947,7 @@ namespace osu.Game.Screens.Play
|
||||
failAnimationLayer.Background = b;
|
||||
});
|
||||
|
||||
HUDOverlay.IsBreakTime.BindTo(breakTracker.IsBreakTime);
|
||||
HUDOverlay.IsPlaying.BindTo(localUserPlaying);
|
||||
DimmableStoryboard.IsBreakTime.BindTo(breakTracker.IsBreakTime);
|
||||
|
||||
DimmableStoryboard.StoryboardReplacesBackground.BindTo(storyboardReplacesBackground);
|
||||
|
@ -99,8 +99,8 @@ namespace osu.Game.Screens.Play.PlayerSettings
|
||||
{
|
||||
public override LocalisableString TooltipText =>
|
||||
Current.Value == 0
|
||||
? new TranslatableString("_", @"{0} ms", base.TooltipText)
|
||||
: new TranslatableString("_", @"{0} ms {1}", base.TooltipText, getEarlyLateText(Current.Value));
|
||||
? LocalisableString.Interpolate($@"{base.TooltipText} ms")
|
||||
: LocalisableString.Interpolate($@"{base.TooltipText} ms {getEarlyLateText(Current.Value)}");
|
||||
|
||||
private LocalisableString getEarlyLateText(double value)
|
||||
{
|
||||
|
@ -212,12 +212,12 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
|
||||
Padding = new MarginPadding { Vertical = -15, Horizontal = -20 },
|
||||
Children = new[]
|
||||
{
|
||||
new RankBadge(1f, getRank(ScoreRank.X)),
|
||||
new RankBadge(0.95f, getRank(ScoreRank.S)),
|
||||
new RankBadge(0.9f, getRank(ScoreRank.A)),
|
||||
new RankBadge(0.8f, getRank(ScoreRank.B)),
|
||||
new RankBadge(0.7f, getRank(ScoreRank.C)),
|
||||
new RankBadge(0.35f, getRank(ScoreRank.D)),
|
||||
new RankBadge(1, getRank(ScoreRank.X)),
|
||||
new RankBadge(0.95, getRank(ScoreRank.S)),
|
||||
new RankBadge(0.9, getRank(ScoreRank.A)),
|
||||
new RankBadge(0.8, getRank(ScoreRank.B)),
|
||||
new RankBadge(0.7, getRank(ScoreRank.C)),
|
||||
new RankBadge(0.35, getRank(ScoreRank.D)),
|
||||
}
|
||||
},
|
||||
rankText = new RankText(score.Rank)
|
||||
|
@ -23,7 +23,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
|
||||
/// <summary>
|
||||
/// The accuracy value corresponding to the <see cref="ScoreRank"/> displayed by this badge.
|
||||
/// </summary>
|
||||
public readonly float Accuracy;
|
||||
public readonly double Accuracy;
|
||||
|
||||
private readonly ScoreRank rank;
|
||||
|
||||
@ -35,7 +35,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
|
||||
/// </summary>
|
||||
/// <param name="accuracy">The accuracy value corresponding to <paramref name="rank"/>.</param>
|
||||
/// <param name="rank">The <see cref="ScoreRank"/> to be displayed in this <see cref="RankBadge"/>.</param>
|
||||
public RankBadge(float accuracy, ScoreRank rank)
|
||||
public RankBadge(double accuracy, ScoreRank rank)
|
||||
{
|
||||
Accuracy = accuracy;
|
||||
this.rank = rank;
|
||||
@ -90,7 +90,7 @@ namespace osu.Game.Screens.Ranking.Expanded.Accuracy
|
||||
base.Update();
|
||||
|
||||
// Starts at -90deg (top) and moves counter-clockwise by the accuracy
|
||||
rankContainer.Position = circlePosition(-MathF.PI / 2 - (1 - Accuracy) * MathF.PI * 2);
|
||||
rankContainer.Position = circlePosition(-MathF.PI / 2 - (1 - (float)Accuracy) * MathF.PI * 2);
|
||||
}
|
||||
|
||||
private Vector2 circlePosition(float t)
|
||||
|
@ -244,7 +244,7 @@ namespace osu.Game.Screens.Select.Carousel
|
||||
}
|
||||
|
||||
if (hideRequested != null)
|
||||
items.Add(new OsuMenuItem(CommonStrings.ButtonsHide, MenuItemType.Destructive, () => hideRequested(beatmapInfo)));
|
||||
items.Add(new OsuMenuItem("Hide", MenuItemType.Destructive, () => hideRequested(beatmapInfo)));
|
||||
|
||||
return items.ToArray();
|
||||
}
|
||||
|
@ -27,8 +27,9 @@ namespace osu.Game.Screens.Select.Filter
|
||||
[LocalisableDescription(typeof(SortStrings), nameof(SortStrings.ArtistTracksLength))]
|
||||
Length,
|
||||
|
||||
[LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchFiltersRank))]
|
||||
RankAchieved,
|
||||
// todo: pending support (https://github.com/ppy/osu/issues/4917)
|
||||
// [LocalisableDescription(typeof(BeatmapsStrings), nameof(BeatmapsStrings.ListingSearchFiltersRank))]
|
||||
// RankAchieved,
|
||||
|
||||
[LocalisableDescription(typeof(BeatmapsetsStrings), nameof(BeatmapsetsStrings.ShowInfoSource))]
|
||||
Source,
|
||||
|
@ -50,6 +50,12 @@ namespace osu.Game.Screens.Select
|
||||
|
||||
public FilterControl FilterControl { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Whether this song select instance should take control of the global track,
|
||||
/// applying looping and preview offsets.
|
||||
/// </summary>
|
||||
protected virtual bool ControlGlobalMusic => true;
|
||||
|
||||
protected virtual bool ShowFooter => true;
|
||||
|
||||
protected virtual bool DisplayStableImportPrompt => legacyImportManager?.SupportsImportFromStable == true;
|
||||
@ -604,15 +610,18 @@ namespace osu.Game.Screens.Select
|
||||
BeatmapDetails.Refresh();
|
||||
|
||||
beginLooping();
|
||||
music.ResetTrackAdjustments();
|
||||
|
||||
if (Beatmap != null && !Beatmap.Value.BeatmapSetInfo.DeletePending)
|
||||
{
|
||||
updateComponentFromBeatmap(Beatmap.Value);
|
||||
|
||||
// restart playback on returning to song select, regardless.
|
||||
// not sure this should be a permanent thing (we may want to leave a user pause paused even on returning)
|
||||
music.Play(requestedByUser: true);
|
||||
if (ControlGlobalMusic)
|
||||
{
|
||||
// restart playback on returning to song select, regardless.
|
||||
// not sure this should be a permanent thing (we may want to leave a user pause paused even on returning)
|
||||
music.ResetTrackAdjustments();
|
||||
music.Play(requestedByUser: true);
|
||||
}
|
||||
}
|
||||
|
||||
this.FadeIn(250);
|
||||
@ -663,6 +672,9 @@ namespace osu.Game.Screens.Select
|
||||
|
||||
private void beginLooping()
|
||||
{
|
||||
if (!ControlGlobalMusic)
|
||||
return;
|
||||
|
||||
Debug.Assert(!isHandlingLooping);
|
||||
|
||||
isHandlingLooping = true;
|
||||
@ -733,6 +745,9 @@ namespace osu.Game.Screens.Select
|
||||
/// </summary>
|
||||
private void ensurePlayingSelected()
|
||||
{
|
||||
if (!ControlGlobalMusic)
|
||||
return;
|
||||
|
||||
ITrack track = music.CurrentTrack;
|
||||
|
||||
bool isNewTrack = !lastTrack.TryGetTarget(out var last) || last != track;
|
||||
|
Reference in New Issue
Block a user