Compare commits

...

2 Commits

Author SHA1 Message Date
066ac52199 [Raid] Resolve conflicts based on role FC instead of total HP 2023-01-10 09:59:49 +01:00
b4d41a449f [Raid] Add max player count check 2023-01-10 09:47:39 +01:00
3 changed files with 38 additions and 9 deletions

View File

@@ -83,7 +83,7 @@ public partial class RaidModule
} }
await RespondAsync( await RespondAsync(
embed: EmbedUtils.SuccessEmbed($"Successfully filled the roster").Build(), embed: EmbedUtils.SuccessEmbed("Successfully filled the roster").Build(),
ephemeral: true ephemeral: true
); );
} }

View File

@@ -11,7 +11,7 @@ public class RosterAssigner
// Create rosters // Create rosters
var neededRosters = (int)Math.Ceiling(players.Count(p => !p.Substitute) / (double)playersPerRoster); 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 // Todo Check when there's more than max players per roster
@@ -23,13 +23,13 @@ public class RosterAssigner
{ {
if (group.Players.AnyHealer()) 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.RealHealerFc() > y.RealHealerFc() ? y : x);
nextHealerRoster.AddGroup(group); nextHealerRoster.AddGroup(group);
} }
else if (group.Players.AnyTank()) 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.RealTankFc() < y.RealTankFc() ? x : y);
nextTankRoster.AddGroup(group); nextTankRoster.AddGroup(group);
} }
@@ -43,7 +43,7 @@ public class RosterAssigner
// Third pass: assign dps // Third pass: assign dps
foreach (var group in dpsGroup) 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); nextDpsRoster!.AddGroup(group);
} }
@@ -74,7 +74,7 @@ public class RosterAssigner
// Third pass: assign dps // Third pass: assign dps
foreach (var group in dpsGroup) 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); nextDpsRoster!.AddGroup(group);
} }
@@ -109,11 +109,14 @@ public class RosterInfo
public IEnumerable<PlayerGroup> PlayerGroups => _groups.Where(g => !g.AllSubstitutes); public IEnumerable<PlayerGroup> PlayerGroups => _groups.Where(g => !g.AllSubstitutes);
public IEnumerable<PlayerGroup> SubstituteGroups => _groups.Where(g => g.AllSubstitutes); public IEnumerable<PlayerGroup> SubstituteGroups => _groups.Where(g => g.AllSubstitutes);
public uint MaxPlayerCount { get; }
private readonly IList<PlayerGroup> _groups; private readonly IList<PlayerGroup> _groups;
public RosterInfo() public RosterInfo(uint maxPlayerCount)
{ {
MaxPlayerCount = maxPlayerCount;
_groups = new List<PlayerGroup>(); _groups = new List<PlayerGroup>();
} }
@@ -126,7 +129,7 @@ public class RosterInfo
{ {
foreach (var group in _groups) foreach (var group in _groups)
{ {
group.AssignRosterNumer(rosterNumber); group.AssignRosterNumber(rosterNumber);
} }
} }
} }
@@ -157,7 +160,7 @@ public class PlayerGroup
_players.Add(player); _players.Add(player);
} }
public void AssignRosterNumer(int rosterNumber) public void AssignRosterNumber(int rosterNumber)
{ {
foreach (var rosterPlayer in _players) foreach (var rosterPlayer in _players)
{ {

View File

@@ -27,6 +27,26 @@ public static class RosterExtensions
return players.Sum(p => p.Fc); return players.Sum(p => p.Fc);
} }
public static long HealerFc(this IEnumerable<RosterPlayer> players)
{
return players.Where(p => p.Role == PlayerRole.Healer).Sum(p => p.Fc);
}
public static long TankFc(this IEnumerable<RosterPlayer> players)
{
return players.Where(p => p.Role == PlayerRole.Tank).Sum(p => p.Fc);
}
public static long RealHealerFc(this RosterInfo roster)
{
return roster.PlayerGroups.Sum(group => group.Players.HealerFc());
}
public static long RealTankFc(this RosterInfo roster)
{
return roster.PlayerGroups.Sum(group => group.Players.TankFc());
}
public static int RealHealerCount(this RosterInfo rosterInfo) public static int RealHealerCount(this RosterInfo rosterInfo)
{ {
return rosterInfo.PlayerGroups.Sum(g => g.Players.HealerCount()); return rosterInfo.PlayerGroups.Sum(g => g.Players.HealerCount());
@@ -46,4 +66,10 @@ public static class RosterExtensions
{ {
return rosterInfo.PlayerGroups.Concat(rosterInfo.SubstituteGroups).Sum(g => g.Players.Concat(g.Substitutes).TankCount()); 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<RosterInfo> NonFull(this IEnumerable<RosterInfo> rosters, int addedPlayersCount) =>
rosters.Where(roster => roster.TotalPlayerCount() + addedPlayersCount <= roster.MaxPlayerCount);
} }