public override List <MobSpawn> ChooseSpawns(IRandom rand) { List <MobSpawn> chosenSpawns = new List <MobSpawn>(); if (!TeamSizes.CanPick) { return(chosenSpawns); } int teamSize = TeamSizes.Pick(rand); bool selectedLeader = false; bool selectedNonSupport = false; //pick first team member SpawnList <TeamMemberSpawn> eligibleSpawns = new SpawnList <TeamMemberSpawn>(); for (int ii = 0; ii < Spawns.Count; ii++) { TeamMemberSpawn spawn = Spawns.GetSpawn(ii); bool add = false; switch (spawn.Role) { case TeamMemberSpawn.MemberRole.Normal: case TeamMemberSpawn.MemberRole.Leader: add = true; break; case TeamMemberSpawn.MemberRole.Support: add = (teamSize > 1); break; case TeamMemberSpawn.MemberRole.Loner: add = (teamSize == 1); break; } if (add) { eligibleSpawns.Add(spawn, Spawns.GetSpawnRate(ii)); } } if (!eligibleSpawns.CanPick) { return(chosenSpawns); } TeamMemberSpawn chosenSpawn = eligibleSpawns.Pick(rand); if (chosenSpawn.Role == TeamMemberSpawn.MemberRole.Leader) { selectedLeader = true; } if (chosenSpawn.Role != TeamMemberSpawn.MemberRole.Support) { selectedNonSupport = true; } chosenSpawns.Add(chosenSpawn.Spawn); //pick remaining team members for (int jj = 1; jj < teamSize; jj++) { eligibleSpawns.Clear(); for (int ii = 0; ii < Spawns.Count; ii++) { TeamMemberSpawn spawn = Spawns.GetSpawn(ii); bool add = false; switch (spawn.Role) { case TeamMemberSpawn.MemberRole.Normal: add = true; break; case TeamMemberSpawn.MemberRole.Leader: add = !selectedLeader; break; case TeamMemberSpawn.MemberRole.Support: add = selectedNonSupport; break; } if (add) { eligibleSpawns.Add(spawn, Spawns.GetSpawnRate(ii)); } } if (!eligibleSpawns.CanPick) { return(chosenSpawns); } chosenSpawn = eligibleSpawns.Pick(rand); if (chosenSpawn.Role == TeamMemberSpawn.MemberRole.Leader) { selectedLeader = true; } if (chosenSpawn.Role != TeamMemberSpawn.MemberRole.Support) { selectedNonSupport = true; } chosenSpawns.Add(chosenSpawn.Spawn); } return(chosenSpawns); }