mirror of
https://github.com/ppy/osu.git
synced 2024-12-13 07:43:00 +08:00
Simplified ban order logic
Implemented tests to make sure logic works as intended
This commit is contained in:
parent
ecbf07c52a
commit
cda55065e7
@ -5,6 +5,7 @@ using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using osu.Framework.Allocation;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Input.Events;
|
||||
using osu.Framework.Testing;
|
||||
using osu.Game.Tournament.Components;
|
||||
using osu.Game.Tournament.Models;
|
||||
@ -151,6 +152,105 @@ namespace osu.Game.Tournament.Tests.Screens
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestSingleTeamBan()
|
||||
{
|
||||
AddStep("set ban count", () => Ladder.CurrentMatch.Value!.Round.Value!.BanCount.Value = 1);
|
||||
|
||||
AddStep("load some maps", () =>
|
||||
{
|
||||
Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
addBeatmap();
|
||||
});
|
||||
|
||||
AddStep("update displayed maps", () => Ladder.SplitMapPoolByMods.Value = false);
|
||||
|
||||
AddStep("perform bans", () =>
|
||||
{
|
||||
var tournamentMaps = screen.ChildrenOfType<TournamentBeatmapPanel>().ToList();
|
||||
|
||||
screen.ChildrenOfType<TourneyButton>().Where(btn => btn.Text == "Red Ban").First().TriggerClick();
|
||||
|
||||
PerformMapAction(tournamentMaps[0]);
|
||||
PerformMapAction(tournamentMaps[1]);
|
||||
});
|
||||
|
||||
AddAssert("ensure 1 ban per team", () => Ladder.CurrentMatch.Value!.PicksBans.Count() == 2 && Ladder.CurrentMatch.Value!.PicksBans.Last().Team == TeamColour.Blue);
|
||||
|
||||
AddStep("reset match", () =>
|
||||
{
|
||||
InputManager.UseParentInput = true;
|
||||
Ladder.CurrentMatch.Value = new TournamentMatch();
|
||||
Ladder.CurrentMatch.Value = Ladder.Matches.First();
|
||||
Ladder.CurrentMatch.Value.PicksBans.Clear();
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestMultipleTeamBans()
|
||||
{
|
||||
AddStep("set ban count", () => Ladder.CurrentMatch.Value!.Round.Value!.BanCount.Value = 3);
|
||||
|
||||
AddStep("load some maps", () =>
|
||||
{
|
||||
Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Clear();
|
||||
|
||||
for (int i = 0; i < 12; i++)
|
||||
addBeatmap();
|
||||
});
|
||||
|
||||
AddStep("update displayed maps", () => Ladder.SplitMapPoolByMods.Value = false);
|
||||
|
||||
AddStep("red team ban", () =>
|
||||
{
|
||||
var tournamentMaps = screen.ChildrenOfType<TournamentBeatmapPanel>().ToList();
|
||||
|
||||
screen.ChildrenOfType<TourneyButton>().Where(btn => btn.Text == "Red Ban").First().TriggerClick();
|
||||
|
||||
PerformMapAction(tournamentMaps[0]);
|
||||
});
|
||||
|
||||
AddAssert("ensure red team ban", () => Ladder.CurrentMatch.Value!.PicksBans.Last().Team == TeamColour.Red);
|
||||
|
||||
AddStep("blue team bans", () =>
|
||||
{
|
||||
var tournamentMaps = screen.ChildrenOfType<TournamentBeatmapPanel>().ToList();
|
||||
|
||||
PerformMapAction(tournamentMaps[1]);
|
||||
PerformMapAction(tournamentMaps[2]);
|
||||
});
|
||||
|
||||
AddAssert("ensure blue team double ban", () => Ladder.CurrentMatch.Value!.PicksBans.Count(ban => ban.Team == TeamColour.Blue) == 2);
|
||||
|
||||
AddStep("red team bans", () =>
|
||||
{
|
||||
var tournamentMaps = screen.ChildrenOfType<TournamentBeatmapPanel>().ToList();
|
||||
|
||||
PerformMapAction(tournamentMaps[3]);
|
||||
PerformMapAction(tournamentMaps[4]);
|
||||
});
|
||||
|
||||
AddAssert("ensure red team double ban", () => Ladder.CurrentMatch.Value!.PicksBans.Count(ban => ban.Team == TeamColour.Red) == 3);
|
||||
|
||||
AddStep("blue team bans", () =>
|
||||
{
|
||||
var tournamentMaps = screen.ChildrenOfType<TournamentBeatmapPanel>().ToList();
|
||||
|
||||
PerformMapAction(tournamentMaps[5]);
|
||||
});
|
||||
|
||||
AddAssert("ensure blue team ban", () => Ladder.CurrentMatch.Value!.PicksBans.Last().Team == TeamColour.Blue);
|
||||
|
||||
AddStep("reset match", () =>
|
||||
{
|
||||
InputManager.UseParentInput = true;
|
||||
Ladder.CurrentMatch.Value = new TournamentMatch();
|
||||
Ladder.CurrentMatch.Value = Ladder.Matches.First();
|
||||
Ladder.CurrentMatch.Value.PicksBans.Clear();
|
||||
});
|
||||
}
|
||||
private void addBeatmap(string mods = "NM")
|
||||
{
|
||||
Ladder.CurrentMatch.Value!.Round.Value!.Beatmaps.Add(new RoundBeatmap
|
||||
@ -159,5 +259,12 @@ namespace osu.Game.Tournament.Tests.Screens
|
||||
Mods = mods
|
||||
});
|
||||
}
|
||||
|
||||
private void PerformMapAction(TournamentBeatmapPanel map)
|
||||
{
|
||||
InputManager.MoveMouseTo(map);
|
||||
|
||||
InputManager.Click(osuTK.Input.MouseButton.Left);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -153,23 +153,35 @@ namespace osu.Game.Tournament.Screens.MapPool
|
||||
|
||||
const TeamColour roll_winner = TeamColour.Red; //todo: draw from match
|
||||
|
||||
var previousBan = CurrentMatch.Value.PicksBans.LastOrDefault()?.Team ?? roll_winner;
|
||||
var previousColour = CurrentMatch.Value.PicksBans.LastOrDefault()?.Team ?? roll_winner;
|
||||
|
||||
var nextColour = previousBan == TeamColour.Red ? TeamColour.Blue : TeamColour.Red;
|
||||
TeamColour nextColour;
|
||||
|
||||
bool hasAllBans = CurrentMatch.Value.PicksBans.Count(p => p.Type == ChoiceType.Ban) >= totalBansRequired;
|
||||
|
||||
if (!hasAllBans)
|
||||
// If it's the third ban or later, we need to check if it's the team's first or second ban in a row
|
||||
nextColour = (CurrentMatch.Value.PicksBans.Count >= 2 ? CurrentMatch.Value.PicksBans[^2]?.Team : previousBan) == TeamColour.Red ? TeamColour.Blue : TeamColour.Red;
|
||||
|
||||
if (hasAllBans && pickType == ChoiceType.Ban)
|
||||
{
|
||||
// When switching from bans to picks, we don't rotate the team colour.
|
||||
// Ban phase.
|
||||
// Switch teams every second ban.
|
||||
nextColour = CurrentMatch.Value.PicksBans.Count % 2 == 1
|
||||
? getOppositeTeamColour(previousColour)
|
||||
: previousColour;
|
||||
}
|
||||
else if (pickType == ChoiceType.Ban)
|
||||
{
|
||||
// Switching from bans to picks - stay with the last team that was banning.
|
||||
nextColour = pickColour;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Pick phase.
|
||||
// Switch teams every pick.
|
||||
nextColour = getOppositeTeamColour(previousColour);
|
||||
}
|
||||
|
||||
setMode(nextColour, hasAllBans ? ChoiceType.Pick : ChoiceType.Ban);
|
||||
|
||||
TeamColour getOppositeTeamColour(TeamColour colour) => colour == TeamColour.Red ? TeamColour.Blue : TeamColour.Red;
|
||||
}
|
||||
|
||||
protected override bool OnMouseDown(MouseDownEvent e)
|
||||
|
Loading…
Reference in New Issue
Block a user