public static List <PersonalP3AreaAssignment> ListAssignments(PhaseThreeAreaAssignment assignments)
 {
     return(assignments.Areas.SelectMany(a => a.Value.Select(p => new PersonalP3AreaAssignment
     {
         Area = a.Key,
         Player = p
     })).ToList());
 }
        public static PhaseThreeAreaAssignment AssignPhaseThreeAreas(List <OrbAssignment> orbAssignments)
        {
            var assignments = new PhaseThreeAreaAssignment();
            var playersLeft = orbAssignments;

            playersLeft = AssignHealers(assignments, orbAssignments);
            playersLeft = AssignMelee(assignments, playersLeft);
            AssignRest(assignments, playersLeft);

            return(assignments);
        }
        private static List <OrbAssignment> AssignMelee(PhaseThreeAreaAssignment assignments, List <OrbAssignment> orbAssignments)
        {
            var area     = (PhaseThreeArea)0;
            var meleeDps = orbAssignments.Where(a => a.Player.Role == PlayerRole.MeleeDps);

            foreach (var melee in meleeDps.OrderBy(Positions))
            {
                assignments.Areas[area].Add(melee.Player);
                area = area == (PhaseThreeArea)4 ? 0 : area + 1;
            }

            return(orbAssignments.Except(meleeDps).ToList());
        }
        private static List <OrbAssignment> AssignHealers(PhaseThreeAreaAssignment assignments, List <OrbAssignment> orbAssignments)
        {
            var area    = (PhaseThreeArea)0;
            var healers = orbAssignments.Where(a => a.Player.Role == PlayerRole.Healer);

            foreach (var healer in healers.OrderBy(Positions))
            {
                assignments.Areas[area].Add(healer.Player);
                area = area == (PhaseThreeArea)4 ? 0 : area + 1;
            }

            return(orbAssignments.Except(healers).ToList());
        }
 private static void AssignRest(PhaseThreeAreaAssignment assignments, List <OrbAssignment> orbAssignments)
 {
     foreach (var orbAssignment in orbAssignments.OrderBy(Positions))
     {
         foreach (PhaseThreeArea area in Enum.GetValues(typeof(PhaseThreeArea)))
         {
             if (assignments.Areas[area].Count() < 4)
             {
                 assignments.Areas[area].Add(orbAssignment.Player);
                 break;
             }
         }
     }
 }