From b4d41a449f7e31431b63c56af196258e0ebbf060 Mon Sep 17 00:00:00 2001 From: Eveldee Date: Tue, 10 Jan 2023 09:42:29 +0100 Subject: [PATCH] [Raid] Add max player count check --- Cocotte/Modules/Raids/RaidModuleDebug.cs | 2 +- Cocotte/Modules/Raids/RosterAssigner.cs | 19 +++++++++++-------- Cocotte/Modules/Raids/RosterExtensions.cs | 6 ++++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Cocotte/Modules/Raids/RaidModuleDebug.cs b/Cocotte/Modules/Raids/RaidModuleDebug.cs index 9965e54..d9cf09e 100644 --- a/Cocotte/Modules/Raids/RaidModuleDebug.cs +++ b/Cocotte/Modules/Raids/RaidModuleDebug.cs @@ -83,7 +83,7 @@ public partial class RaidModule } await RespondAsync( - embed: EmbedUtils.SuccessEmbed($"Successfully filled the roster").Build(), + embed: EmbedUtils.SuccessEmbed("Successfully filled the roster").Build(), ephemeral: true ); } diff --git a/Cocotte/Modules/Raids/RosterAssigner.cs b/Cocotte/Modules/Raids/RosterAssigner.cs index 90cdeca..7faaedc 100644 --- a/Cocotte/Modules/Raids/RosterAssigner.cs +++ b/Cocotte/Modules/Raids/RosterAssigner.cs @@ -11,7 +11,7 @@ public class RosterAssigner // Create rosters var neededRosters = (int)Math.Ceiling(players.Count(p => !p.Substitute) / (double)playersPerRoster); - var rosters = Enumerable.Range(0, neededRosters).Select(_ => new RosterInfo()).ToList(); + var rosters = Enumerable.Range(0, neededRosters).Select(_ => new RosterInfo(playersPerRoster)).ToList(); // Todo Check when there's more than max players per roster @@ -23,13 +23,13 @@ public class RosterAssigner { if (group.Players.AnyHealer()) { - var nextHealerRoster = rosters.MinBy(r => r.RealHealerCount(), (x, y) => x.TotalRealFc > y.TotalRealFc ? y : x); + var nextHealerRoster = rosters.NonFull(group.Players.Count()).MinBy(r => r.RealHealerCount(), (x, y) => x.TotalRealFc > y.TotalRealFc ? y : x); nextHealerRoster.AddGroup(group); } else if (group.Players.AnyTank()) { - var nextTankRoster = rosters.MinBy(r => r.RealTankCount(), (x, y) => x.TotalRealFc < y.TotalRealFc ? x : y); + var nextTankRoster = rosters.NonFull(group.Players.Count()).MinBy(r => r.RealTankCount(), (x, y) => x.TotalRealFc < y.TotalRealFc ? x : y); nextTankRoster.AddGroup(group); } @@ -43,7 +43,7 @@ public class RosterAssigner // Third pass: assign dps foreach (var group in dpsGroup) { - var nextDpsRoster = rosters.MinBy(r => r.TotalRealFc); + var nextDpsRoster = rosters.NonFull(group.Players.Count()).MinBy(r => r.TotalRealFc); nextDpsRoster!.AddGroup(group); } @@ -74,7 +74,7 @@ public class RosterAssigner // Third pass: assign dps foreach (var group in dpsGroup) { - var nextDpsRoster = rosters.MinBy(r => r.TotalFc); + var nextDpsRoster = rosters.NonFull(group.Substitutes.Count()).MinBy(r => r.TotalFc); nextDpsRoster!.AddGroup(group); } @@ -109,11 +109,14 @@ public class RosterInfo public IEnumerable PlayerGroups => _groups.Where(g => !g.AllSubstitutes); public IEnumerable SubstituteGroups => _groups.Where(g => g.AllSubstitutes); + + public uint MaxPlayerCount { get; } private readonly IList _groups; - public RosterInfo() + public RosterInfo(uint maxPlayerCount) { + MaxPlayerCount = maxPlayerCount; _groups = new List(); } @@ -126,7 +129,7 @@ public class RosterInfo { foreach (var group in _groups) { - group.AssignRosterNumer(rosterNumber); + group.AssignRosterNumber(rosterNumber); } } } @@ -157,7 +160,7 @@ public class PlayerGroup _players.Add(player); } - public void AssignRosterNumer(int rosterNumber) + public void AssignRosterNumber(int rosterNumber) { foreach (var rosterPlayer in _players) { diff --git a/Cocotte/Modules/Raids/RosterExtensions.cs b/Cocotte/Modules/Raids/RosterExtensions.cs index 8e76c37..9c6939c 100644 --- a/Cocotte/Modules/Raids/RosterExtensions.cs +++ b/Cocotte/Modules/Raids/RosterExtensions.cs @@ -46,4 +46,10 @@ public static class RosterExtensions { return rosterInfo.PlayerGroups.Concat(rosterInfo.SubstituteGroups).Sum(g => g.Players.Concat(g.Substitutes).TankCount()); } + + public static int TotalPlayerCount(this RosterInfo rosterInfo) => + rosterInfo.PlayerGroups.Sum(group => group.Players.Count()); + + public static IEnumerable NonFull(this IEnumerable rosters, int addedPlayersCount) => + rosters.Where(roster => roster.TotalPlayerCount() + addedPlayersCount <= roster.MaxPlayerCount); } \ No newline at end of file