mirror of
https://github.com/ppy/osu.git
synced 2025-02-15 18:13:09 +08:00
Split ready button visual logic into button itself
This commit is contained in:
parent
af6d53ad64
commit
b76a87e6f8
@ -95,10 +95,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
protected void RunGameplay()
|
protected void RunGameplay()
|
||||||
{
|
{
|
||||||
AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
|
AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
|
AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddUntilStep("wait for player", () => multiplayerComponents.CurrentScreen is Player player && player.IsLoaded);
|
AddUntilStep("wait for player", () => multiplayerComponents.CurrentScreen is Player player && player.IsLoaded);
|
||||||
AddStep("exit player", () => multiplayerComponents.MultiplayerScreen.MakeCurrent());
|
AddStep("exit player", () => multiplayerComponents.MultiplayerScreen.MakeCurrent());
|
||||||
|
@ -102,10 +102,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
AddUntilStep("selected beatmap is initial beatmap", () => Beatmap.Value.BeatmapInfo.OnlineID == InitialBeatmap.OnlineID);
|
AddUntilStep("selected beatmap is initial beatmap", () => Beatmap.Value.BeatmapInfo.OnlineID == InitialBeatmap.OnlineID);
|
||||||
|
|
||||||
AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
|
AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
|
AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddUntilStep("wait for player", () => CurrentScreen is Player player && player.IsLoaded);
|
AddUntilStep("wait for player", () => CurrentScreen is Player player && player.IsLoaded);
|
||||||
AddAssert("ruleset is correct", () => ((Player)CurrentScreen).Ruleset.Value.Equals(new OsuRuleset().RulesetInfo));
|
AddAssert("ruleset is correct", () => ((Player)CurrentScreen).Ruleset.Value.Equals(new OsuRuleset().RulesetInfo));
|
||||||
@ -119,10 +119,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
AddUntilStep("selected beatmap is initial beatmap", () => Beatmap.Value.BeatmapInfo.OnlineID == InitialBeatmap.OnlineID);
|
AddUntilStep("selected beatmap is initial beatmap", () => Beatmap.Value.BeatmapInfo.OnlineID == InitialBeatmap.OnlineID);
|
||||||
|
|
||||||
AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
|
AddUntilStep("wait for idle", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Idle);
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
|
AddUntilStep("wait for ready", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Ready);
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddUntilStep("wait for player", () => CurrentScreen is Player player && player.IsLoaded);
|
AddUntilStep("wait for player", () => CurrentScreen is Player player && player.IsLoaded);
|
||||||
AddAssert("mods are correct", () => !((Player)CurrentScreen).Mods.Value.Any());
|
AddAssert("mods are correct", () => !((Player)CurrentScreen).Mods.Value.Any());
|
||||||
|
@ -145,7 +145,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
|
|
||||||
AddUntilStep("wait for spectating user state", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
|
AddUntilStep("wait for spectating user state", () => MultiplayerClient.LocalUser?.State == MultiplayerUserState.Spectating);
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddUntilStep("match started", () => MultiplayerClient.Room?.State == MultiplayerRoomState.WaitingForLoad);
|
AddUntilStep("match started", () => MultiplayerClient.Room?.State == MultiplayerRoomState.WaitingForLoad);
|
||||||
}
|
}
|
||||||
|
@ -92,10 +92,10 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
MultiplayerClient.TransferHost(2);
|
MultiplayerClient.TransferHost(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
AddUntilStep("user is idle", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
|
AddUntilStep("user is idle", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
|
MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
|
||||||
});
|
});
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
||||||
|
|
||||||
verifyGameplayStartFlow();
|
verifyGameplayStartFlow();
|
||||||
@ -126,7 +126,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
MultiplayerClient.TransferHost(2);
|
MultiplayerClient.TransferHost(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
AddStep("make user host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0));
|
AddStep("make user host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[0].UserID ?? 0));
|
||||||
|
|
||||||
verifyGameplayStartFlow();
|
verifyGameplayStartFlow();
|
||||||
@ -141,12 +141,12 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
|
MultiplayerClient.AddUser(new APIUser { Id = 2, Username = "Another user" });
|
||||||
});
|
});
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
||||||
|
|
||||||
AddStep("transfer host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[1].UserID ?? 0));
|
AddStep("transfer host", () => MultiplayerClient.TransferHost(MultiplayerClient.Room?.Users[1].UserID ?? 0));
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
AddUntilStep("user is idle (match not started)", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
|
AddUntilStep("user is idle (match not started)", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Idle);
|
||||||
AddAssert("ready button enabled", () => button.ChildrenOfType<OsuButton>().Single().Enabled.Value);
|
AddAssert("ready button enabled", () => button.ChildrenOfType<OsuButton>().Single().Enabled.Value);
|
||||||
}
|
}
|
||||||
@ -166,7 +166,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
if (!isHost)
|
if (!isHost)
|
||||||
AddStep("transfer host", () => MultiplayerClient.TransferHost(2));
|
AddStep("transfer host", () => MultiplayerClient.TransferHost(2));
|
||||||
|
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
|
|
||||||
AddRepeatStep("change user ready state", () =>
|
AddRepeatStep("change user ready state", () =>
|
||||||
{
|
{
|
||||||
@ -184,7 +184,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
private void verifyGameplayStartFlow()
|
private void verifyGameplayStartFlow()
|
||||||
{
|
{
|
||||||
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
AddUntilStep("user is ready", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.Ready);
|
||||||
ClickButtonWhenEnabled<MultiplayerReadyButton>();
|
ClickButtonWhenEnabled<MultiplayerReadyButton.ReadyButton>();
|
||||||
AddUntilStep("user waiting for load", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.WaitingForLoad);
|
AddUntilStep("user waiting for load", () => MultiplayerClient.Room?.Users[0].State == MultiplayerUserState.WaitingForLoad);
|
||||||
|
|
||||||
AddStep("finish gameplay", () =>
|
AddStep("finish gameplay", () =>
|
||||||
|
@ -14,16 +14,12 @@ using osu.Framework.Threading;
|
|||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osu.Game.Graphics.Backgrounds;
|
using osu.Game.Graphics.Backgrounds;
|
||||||
using osu.Game.Online.Multiplayer;
|
using osu.Game.Online.Multiplayer;
|
||||||
using osu.Game.Screens.OnlinePlay.Components;
|
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
||||||
{
|
{
|
||||||
public class MultiplayerReadyButton : MultiplayerRoomComposite
|
public class MultiplayerReadyButton : MultiplayerRoomComposite
|
||||||
{
|
{
|
||||||
[Resolved]
|
|
||||||
private OsuColour colours { get; set; }
|
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private OngoingOperationTracker ongoingOperationTracker { get; set; }
|
private OngoingOperationTracker ongoingOperationTracker { get; set; }
|
||||||
|
|
||||||
@ -34,14 +30,14 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
|||||||
private Sample sampleReadyAll;
|
private Sample sampleReadyAll;
|
||||||
private Sample sampleUnready;
|
private Sample sampleUnready;
|
||||||
|
|
||||||
private readonly ButtonWithTrianglesExposed button;
|
private readonly ReadyButton readyButton;
|
||||||
private int countReady;
|
private int countReady;
|
||||||
private ScheduledDelegate readySampleDelegate;
|
private ScheduledDelegate readySampleDelegate;
|
||||||
private IBindable<bool> operationInProgress;
|
private IBindable<bool> operationInProgress;
|
||||||
|
|
||||||
public MultiplayerReadyButton()
|
public MultiplayerReadyButton()
|
||||||
{
|
{
|
||||||
InternalChild = button = new ButtonWithTrianglesExposed
|
InternalChild = readyButton = new ReadyButton
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Size = Vector2.One,
|
Size = Vector2.One,
|
||||||
@ -123,47 +119,26 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
|||||||
|
|
||||||
private void updateState()
|
private void updateState()
|
||||||
{
|
{
|
||||||
var localUser = Client.LocalUser;
|
if (Room == null)
|
||||||
|
|
||||||
int newCountReady = Room?.Users.Count(u => u.State == MultiplayerUserState.Ready) ?? 0;
|
|
||||||
int newCountTotal = Room?.Users.Count(u => u.State != MultiplayerUserState.Spectating) ?? 0;
|
|
||||||
|
|
||||||
switch (localUser?.State)
|
|
||||||
{
|
{
|
||||||
default:
|
readyButton.Enabled.Value = false;
|
||||||
button.Text = "Ready";
|
return;
|
||||||
updateButtonColour(true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MultiplayerUserState.Spectating:
|
|
||||||
case MultiplayerUserState.Ready:
|
|
||||||
string countText = $"({newCountReady} / {newCountTotal} ready)";
|
|
||||||
|
|
||||||
if (Room?.Host?.Equals(localUser) == true)
|
|
||||||
{
|
|
||||||
button.Text = $"Start match {countText}";
|
|
||||||
updateButtonColour(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
button.Text = $"Waiting for host... {countText}";
|
|
||||||
updateButtonColour(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool enableButton =
|
var localUser = Client.LocalUser;
|
||||||
Room?.State == MultiplayerRoomState.Open
|
|
||||||
|
int newCountReady = Room.Users.Count(u => u.State == MultiplayerUserState.Ready);
|
||||||
|
int newCountTotal = Room.Users.Count(u => u.State != MultiplayerUserState.Spectating);
|
||||||
|
|
||||||
|
readyButton.Enabled.Value =
|
||||||
|
Room.State == MultiplayerRoomState.Open
|
||||||
&& CurrentPlaylistItem.Value?.ID == Room.Settings.PlaylistItemId
|
&& CurrentPlaylistItem.Value?.ID == Room.Settings.PlaylistItemId
|
||||||
&& !Room.Playlist.Single(i => i.ID == Room.Settings.PlaylistItemId).Expired
|
&& !Room.Playlist.Single(i => i.ID == Room.Settings.PlaylistItemId).Expired
|
||||||
&& !operationInProgress.Value;
|
&& !operationInProgress.Value;
|
||||||
|
|
||||||
// When the local user is the host and spectating the match, the "start match" state should be enabled if any users are ready.
|
// When the local user is the host and spectating the match, the "start match" state should be enabled if any users are ready.
|
||||||
if (localUser?.State == MultiplayerUserState.Spectating)
|
if (localUser?.State == MultiplayerUserState.Spectating)
|
||||||
enableButton &= Room?.Host?.Equals(localUser) == true && newCountReady > 0;
|
readyButton.Enabled.Value &= Room.Host?.Equals(localUser) == true && newCountReady > 0;
|
||||||
|
|
||||||
button.Enabled.Value = enableButton;
|
|
||||||
|
|
||||||
if (newCountReady == countReady)
|
if (newCountReady == countReady)
|
||||||
return;
|
return;
|
||||||
@ -187,25 +162,112 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer.Match
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateButtonColour(bool green)
|
public class ReadyButton : Components.ReadyButton
|
||||||
{
|
|
||||||
if (green)
|
|
||||||
{
|
|
||||||
button.BackgroundColour = colours.Green;
|
|
||||||
button.Triangles.ColourDark = colours.Green;
|
|
||||||
button.Triangles.ColourLight = colours.GreenLight;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
button.BackgroundColour = colours.YellowDark;
|
|
||||||
button.Triangles.ColourDark = colours.YellowDark;
|
|
||||||
button.Triangles.ColourLight = colours.Yellow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ButtonWithTrianglesExposed : ReadyButton
|
|
||||||
{
|
{
|
||||||
public new Triangles Triangles => base.Triangles;
|
public new Triangles Triangles => base.Triangles;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private MultiplayerClient multiplayerClient { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private OsuColour colours { get; set; }
|
||||||
|
|
||||||
|
[CanBeNull]
|
||||||
|
private MultiplayerRoom room => multiplayerClient.Room;
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
multiplayerClient.RoomUpdated += () => Scheduler.AddOnce(onRoomUpdated);
|
||||||
|
onRoomUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onRoomUpdated()
|
||||||
|
{
|
||||||
|
updateButtonText();
|
||||||
|
updateButtonColour();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateButtonText()
|
||||||
|
{
|
||||||
|
if (room == null)
|
||||||
|
{
|
||||||
|
Text = "Ready";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var localUser = multiplayerClient.LocalUser;
|
||||||
|
|
||||||
|
int countReady = room.Users.Count(u => u.State == MultiplayerUserState.Ready);
|
||||||
|
int countTotal = room.Users.Count(u => u.State != MultiplayerUserState.Spectating);
|
||||||
|
|
||||||
|
string countText = $"({countReady} / {countTotal} ready)";
|
||||||
|
|
||||||
|
switch (localUser?.State)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
Text = "Ready";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MultiplayerUserState.Spectating:
|
||||||
|
case MultiplayerUserState.Ready:
|
||||||
|
Text = room.Host?.Equals(localUser) == true
|
||||||
|
? $"Start match {countText}"
|
||||||
|
: $"Waiting for host... {countText}";
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateButtonColour()
|
||||||
|
{
|
||||||
|
if (room == null)
|
||||||
|
{
|
||||||
|
setGreen();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var localUser = multiplayerClient.LocalUser;
|
||||||
|
|
||||||
|
switch (localUser?.State)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
setGreen();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MultiplayerUserState.Spectating:
|
||||||
|
case MultiplayerUserState.Ready:
|
||||||
|
if (room?.Host?.Equals(localUser) == true)
|
||||||
|
setGreen();
|
||||||
|
else
|
||||||
|
setYellow();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setYellow()
|
||||||
|
{
|
||||||
|
BackgroundColour = colours.YellowDark;
|
||||||
|
Triangles.ColourDark = colours.YellowDark;
|
||||||
|
Triangles.ColourLight = colours.Yellow;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setGreen()
|
||||||
|
{
|
||||||
|
BackgroundColour = colours.Green;
|
||||||
|
Triangles.ColourDark = colours.Green;
|
||||||
|
Triangles.ColourLight = colours.GreenLight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Dispose(bool isDisposing)
|
||||||
|
{
|
||||||
|
base.Dispose(isDisposing);
|
||||||
|
|
||||||
|
if (multiplayerClient != null)
|
||||||
|
multiplayerClient.RoomUpdated -= onRoomUpdated;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user