private void Place(Player player)
        {
            var firstFreeSlot = GetFirstFreeSlot(player.Role);

            if (firstFreeSlot != null)
            {
                firstFreeSlot.Player = player;
                return;
            }

            var overclaimedPlayers = GetOverclaimPlayers(player.Role);

            if (overclaimedPlayers.Count == 0)
            {
                player.IsImpossibleClaim = true;
            }
            else
            {
                overclaimedPlayers.Add(player);

                foreach (string overclaimedGroup in overclaimedPlayers.Select(p => p.Role.Group.Name).Distinct())
                {
                    foreach (var p in GetUnconfirmedPlayers(overclaimedGroup))
                    {
                        p.IsOverclaimed = true;
                    }
                }
            }

            if (player.Role.Group.Team == Team.Town)
            {
                RoleSlots.First(rs => rs.IsTemporary && rs.Player == null).Player = player;
            }
        }
 public string GetLastWill()
 {
     return(RoleSlots
            .Where(rs => rs.Team == Team.Town && !(rs.IsTemporary && rs.Player == null))
            .Select(rs => rs.LastWillLine)
            .Aggregate((i, j) => i + "\r\n" + j)
            + Environment.NewLine
            + Players.GetLastWill());
 }
 public Roster(RosterInfo rosterInfo)
 {
     RoleSlots = rosterInfo.RoleSlotInfos.Select(rsi => CreateRoleSlot(rsi)).ToList();
     RoleSlots.Add(CreateTempRTSlot());
     RoleSlots.Add(CreateTempRTSlot());
     RoleSlots.Add(CreateTempRTSlot());
     RoleSlots.Add(CreateTempRTSlot());
     RoleSlots.Add(CreateTempRTSlot());
 }
        public void DoUpdate()
        {
            Players.ResetOverclaim();
            RoleSlots.ResetPlayers();

            var claimedPlayers = Players.Where(p => p.Role != null);

            claimedPlayers.Where(p => p.IsConfirmed).ToList().ForEach(Place);
            claimedPlayers.Where(p => !p.IsConfirmed).ToList().ForEach(Place);
        }
 private List <Player> GetOverclaimPlayers(Role role) =>
 RoleSlots.Where(rs => rs.Player != null && !rs.Player.IsConfirmed && rs.CanHold(role.Group.Name)).Select(rs => rs.Player).ToList();
 private RoleSlot GetFirstFreeSlot(Role role) =>
 RoleSlots.FirstOrDefault(rs => !rs.IsTemporary && rs.Player == null && rs.CanHold(role.Group.Name));