mirror of
https://github.com/ppy/osu.git
synced 2026-05-13 19:54:15 +08:00
53f945b7ac
The "Key Count" metric in mania is very useless since you are already expected to play maps with a specific Key Count when you are queueing. This PR inserts the proportion of LNs (Long Notes) in the place of that metric since it is one of the ways players can gudge their skillsets (This idea comes from reddit) Also improved the test suite for other skillsets by making the architecture more minor ruleset friendly Addresses https://github.com/ppy/osu/discussions/37568. --------- Co-authored-by: Dan Balasescu <smoogipoo@smgi.me> Co-authored-by: Dean Herbert <pe@ppy.sh>
259 lines
12 KiB
C#
259 lines
12 KiB
C#
// 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.
|
|
|
|
using System.Linq;
|
|
using NUnit.Framework;
|
|
using osu.Framework.Extensions;
|
|
using osu.Framework.Testing;
|
|
using osu.Game.Graphics.UserInterface;
|
|
using osu.Game.Online.API;
|
|
using osu.Game.Online.API.Requests.Responses;
|
|
using osu.Game.Online.Multiplayer;
|
|
using osu.Game.Online.Multiplayer.MatchTypes.RankedPlay;
|
|
using osu.Game.Online.Rooms;
|
|
using osu.Game.Rulesets.Osu;
|
|
using osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay;
|
|
using osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay.Card;
|
|
using osu.Game.Screens.OnlinePlay.Matchmaking.RankedPlay.Hand;
|
|
using osuTK.Input;
|
|
|
|
namespace osu.Game.Tests.Visual.RankedPlay
|
|
{
|
|
public partial class TestSceneRankedPlayScreen : RankedPlayTestScene
|
|
{
|
|
private RankedPlayScreen screen = null!;
|
|
|
|
public override void SetUpSteps()
|
|
{
|
|
base.SetUpSteps();
|
|
|
|
AddStep("join room", () => JoinRoom(CreateDefaultRoom(MatchType.RankedPlay)));
|
|
WaitForJoined();
|
|
}
|
|
|
|
[Test]
|
|
public void TestIntroStage()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set round warmup phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.RoundWarmup, s => s.StarRating = 6.3f).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestUnresolvedUser()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = TestUserLookupCache.UNRESOLVED_USER_ID }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set round warmup phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.RoundWarmup, s => s.StarRating = 6.3f).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestDiscardCardsStage()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set discard phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardDiscard).WaitSafely());
|
|
|
|
AddWaitStep("wait", 3);
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
int i2 = i;
|
|
AddStep($"click card {i2}", () =>
|
|
{
|
|
InputManager.MoveMouseTo(this.ChildrenOfType<PlayerHandOfCards.PlayerHandCard>().ElementAt(i2));
|
|
InputManager.Click(MouseButton.Left);
|
|
});
|
|
}
|
|
|
|
AddWaitStep("wait", 3);
|
|
|
|
AddStep("click discard button", () =>
|
|
{
|
|
var button = screen.ChildrenOfType<ShearedButton>().Single(it => it.Name == "Discard Button");
|
|
|
|
InputManager.MoveMouseTo(button);
|
|
InputManager.Click(MouseButton.Left);
|
|
});
|
|
|
|
AddWaitStep("wait", 13);
|
|
AddStep("set finish discard phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.FinishCardDiscard).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestAddRemoveCards()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set discard phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardDiscard).WaitSafely());
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
AddStep("add card", () => MultiplayerClient.RankedPlayAddCards([new RankedPlayCardItem()]).WaitSafely());
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
AddStep("remove card", () => MultiplayerClient.RankedPlayRemoveCards(hand => [hand[0]]).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestRevealCards()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
var requestHandler = new BeatmapRequestHandler(Ruleset.Value);
|
|
|
|
AddStep("setup request handler", () => ((DummyAPIAccess)API).HandleRequest = requestHandler.HandleRequest);
|
|
|
|
AddStep("set discard phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardDiscard).WaitSafely());
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
int i2 = i;
|
|
AddStep("reveal card", () => MultiplayerClient.RankedPlayRevealCard(hand => hand[i2], new MultiplayerPlaylistItem
|
|
{
|
|
ID = i2,
|
|
BeatmapID = requestHandler.Beatmaps[i2].OnlineID
|
|
}).WaitSafely());
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void TestPlayCardDirect()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set play phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardPlay, state => state.ActiveUserId = API.LocalUser.Value.OnlineID).WaitSafely());
|
|
AddWaitStep("wait", 3);
|
|
AddStep("play card", () => MultiplayerClient.PlayCard(hand => hand[0]).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestDiscardCardsDirect()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set discard phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardDiscard).WaitSafely());
|
|
AddWaitStep("wait", 3);
|
|
AddStep("discard cards", () => MultiplayerClient.DiscardCards(hand => hand.Take(3)).WaitSafely());
|
|
AddWaitStep("wait", 13);
|
|
AddStep("set finish discard phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.FinishCardDiscard).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestPlayStage()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set play phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardPlay, state => state.ActiveUserId = API.LocalUser.Value.OnlineID).WaitSafely());
|
|
AddUntilStep("wait until cards are present", () => this.ChildrenOfType<PlayerHandOfCards.PlayerHandCard>().Count() == 5);
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
int i2 = i;
|
|
AddStep($"click card {i2}", () =>
|
|
{
|
|
InputManager.MoveMouseTo(this.ChildrenOfType<PlayerHandOfCards.PlayerHandCard>().ElementAt(i2));
|
|
InputManager.Click(MouseButton.Left);
|
|
});
|
|
}
|
|
|
|
AddWaitStep("wait", 3);
|
|
|
|
AddStep("click play button", () =>
|
|
{
|
|
var button = screen
|
|
.ChildrenOfType<PlayerHandOfCards.PlayerHandCard>()
|
|
.First(it => it.Selected)
|
|
.ChildrenOfType<ShearedButton>()
|
|
.First();
|
|
|
|
InputManager.MoveMouseTo(button);
|
|
InputManager.Click(MouseButton.Left);
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void TestOtherPlaysCard()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set play phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardPlay, state => state.ActiveUserId = 2).WaitSafely());
|
|
AddWaitStep("wait", 5);
|
|
AddStep("play beatmap", () => MultiplayerClient.PlayUserCard(2, hand => hand[0]).WaitSafely());
|
|
AddStep("reveal card", () => MultiplayerClient.RankedPlayRevealUserCard(2, hand => hand[0], new MultiplayerPlaylistItem
|
|
{
|
|
ID = 0,
|
|
BeatmapID = 0
|
|
}).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestHealthChange()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
AddStep("set play phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardPlay, state => state.ActiveUserId = 2).WaitSafely());
|
|
AddWaitStep("wait", 5);
|
|
AddStep("change player 1 health", () => MultiplayerClient.RankedPlayChangeUserState(MultiplayerClient.LocalUser!.UserID, state => state.Life = 250_000).WaitSafely());
|
|
AddWaitStep("wait", 5);
|
|
AddStep("change player 2 health", () => MultiplayerClient.RankedPlayChangeUserState(2, state => state.Life = 250_000).WaitSafely());
|
|
}
|
|
|
|
[Test]
|
|
public void TestPreviewStopsOnEnteringGameplay()
|
|
{
|
|
AddStep("join other user", () => MultiplayerClient.AddUser(new APIUser { Id = 2 }));
|
|
|
|
AddStep("load screen", () => LoadScreen(screen = new RankedPlayScreen(MultiplayerClient.ClientRoom!)));
|
|
|
|
BeatmapRequestHandler requestHandler = null!;
|
|
AddStep("setup ruleset", () => requestHandler = new BeatmapRequestHandler(new OsuRuleset().RulesetInfo));
|
|
|
|
AddStep("setup request handler", () => ((DummyAPIAccess)API).HandleRequest = requestHandler.HandleRequest);
|
|
|
|
AddStep("set play phase", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.CardPlay, state => state.ActiveUserId = 1001).WaitSafely());
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
int i2 = i;
|
|
AddStep("reveal card", () => MultiplayerClient.RankedPlayRevealCard(hand => hand[i2], new MultiplayerPlaylistItem
|
|
{
|
|
ID = i2,
|
|
BeatmapID = requestHandler.Beatmaps[i2].OnlineID
|
|
}).WaitSafely());
|
|
}
|
|
|
|
AddStep("hover first card", () => InputManager.MoveMouseTo(this.ChildrenOfType<PlayerHandOfCards>().Single().Cards.First()));
|
|
AddUntilStep("preview playing", () => this.ChildrenOfType<RankedPlayCard.SongPreviewContainer>().Any(p => p.IsRunning), () => Is.True);
|
|
|
|
AddWaitStep("wait", 1);
|
|
AddStep("play beatmap", () => MultiplayerClient.PlayUserCard(1001, hand => hand[0]).WaitSafely());
|
|
|
|
AddStep("set warmup", () => MultiplayerClient.RankedPlayChangeStage(RankedPlayStage.GameplayWarmup).WaitSafely());
|
|
AddUntilStep("preview running", () => this.ChildrenOfType<RankedPlayCard.SongPreviewContainer>().Any(p => p.IsRunning), () => Is.True);
|
|
|
|
AddStep("load requested", () => ((IMultiplayerClient)MultiplayerClient).LoadRequested());
|
|
AddUntilStep("preview stopped", () => this.ChildrenOfType<RankedPlayCard.SongPreviewContainer>().Any(p => p.IsRunning), () => Is.False);
|
|
}
|
|
}
|
|
}
|