public void AddLevel(int partsPerMatch, ArrayList participants, GroupingType groupType, TournyType tournyType) { ArrayList copy = new ArrayList(participants); if (groupType == GroupingType.Nearest || groupType == GroupingType.HighVsLow) copy.Sort(); PyramidLevel level = new PyramidLevel(); switch ( tournyType ) { case TournyType.RedVsBlue: { TournyParticipant[] parts = new TournyParticipant[2]; for (int i = 0; i < parts.Length; ++i) parts[i] = new TournyParticipant(new ArrayList()); for (int i = 0; i < copy.Count; ++i) { ArrayList players = ((TournyParticipant)copy[i]).Players; for (int j = 0; j < players.Count; ++j) { Mobile mob = (Mobile)players[j]; if (mob.Kills >= 5) parts[0].Players.Add(mob); else parts[1].Players.Add(mob); } } level.Matches.Add(new TournyMatch(new ArrayList(parts))); break; } case TournyType.RandomTeam: { TournyParticipant[] parts = new TournyParticipant[partsPerMatch]; for (int i = 0; i < partsPerMatch; ++i) parts[i] = new TournyParticipant(new ArrayList()); for (int i = 0; i < copy.Count; ++i) parts[i % parts.Length].Players.AddRange(((TournyParticipant)copy[i]).Players); level.Matches.Add(new TournyMatch(new ArrayList(parts))); break; } case TournyType.FreeForAll: { level.Matches.Add(new TournyMatch(copy)); break; } case TournyType.Standard: { if (partsPerMatch == 2 && (participants.Count % 2) == 1) { int lowAdvances = int.MaxValue; for (int i = 0; i < participants.Count; ++i) { TournyParticipant p = (TournyParticipant)participants[i]; if (p.FreeAdvances < lowAdvances) lowAdvances = p.FreeAdvances; } ArrayList toAdvance = new ArrayList(); for (int i = 0; i < participants.Count; ++i) { TournyParticipant p = (TournyParticipant)participants[i]; if (p.FreeAdvances == lowAdvances) toAdvance.Add(p); } if (toAdvance.Count == 0) toAdvance = copy; // sanity int idx = Utility.Random(toAdvance.Count); ((TournyParticipant)toAdvance[idx]).AddLog("Advanced automatically due to an odd number of challengers."); level.FreeAdvance = (TournyParticipant)toAdvance[idx]; ++level.FreeAdvance.FreeAdvances; copy.Remove(toAdvance[idx]); } while (copy.Count >= partsPerMatch) { ArrayList thisMatch = new ArrayList(); for (int i = 0; i < partsPerMatch; ++i) { int idx = 0; switch ( groupType ) { case GroupingType.HighVsLow: idx = (i * (copy.Count - 1)) / (partsPerMatch - 1); break; case GroupingType.Nearest: idx = 0; break; case GroupingType.Random: idx = Utility.Random(copy.Count); break; } thisMatch.Add(copy[idx]); copy.RemoveAt(idx); } level.Matches.Add(new TournyMatch(thisMatch)); } if (copy.Count > 1) level.Matches.Add(new TournyMatch(copy)); break; } } this.m_Levels.Add(level); }
public void AddLevel(int partsPerMatch, List<TournyParticipant> participants, GroupingType groupType, TournyType tournyType) { var copy = new List<TournyParticipant>(participants); if (groupType == GroupingType.Nearest || groupType == GroupingType.HighVsLow) { copy.Sort(); } var level = new PyramidLevel(); switch (tournyType) { case TournyType.RedVsBlue: { var parts = new TournyParticipant[2]; for (int i = 0; i < parts.Length; ++i) { parts[i] = new TournyParticipant(new List<Mobile>()); } for (int i = 0; i < copy.Count; ++i) { List<Mobile> players = copy[i].Players; for (int j = 0; j < players.Count; ++j) { Mobile mob = players[j]; if (mob.Kills >= 5) { parts[0].Players.Add(mob); } else { parts[1].Players.Add(mob); } } } level.Matches.Add(new TournyMatch(new List<TournyParticipant>(parts))); break; } case TournyType.RandomTeam: { var parts = new TournyParticipant[partsPerMatch]; for (int i = 0; i < partsPerMatch; ++i) { parts[i] = new TournyParticipant(new List<Mobile>()); } for (int i = 0; i < copy.Count; ++i) { parts[i % parts.Length].Players.AddRange(copy[i].Players); } level.Matches.Add(new TournyMatch(new List<TournyParticipant>(parts))); break; } case TournyType.FreeForAll: { level.Matches.Add(new TournyMatch(copy)); break; } case TournyType.Standard: { if (partsPerMatch >= 2 && participants.Count % partsPerMatch == 1) { int lowAdvances = int.MaxValue; for (int i = 0; i < participants.Count; ++i) { TournyParticipant p = participants[i]; if (p.FreeAdvances < lowAdvances) { lowAdvances = p.FreeAdvances; } } var toAdvance = new List<TournyParticipant>(); for (int i = 0; i < participants.Count; ++i) { TournyParticipant p = participants[i]; if (p.FreeAdvances == lowAdvances) { toAdvance.Add(p); } } if (toAdvance.Count == 0) { toAdvance = copy; // sanity } int idx = Utility.Random(toAdvance.Count); toAdvance[idx].AddLog("Advanced automatically due to an odd number of challengers."); level.FreeAdvance = toAdvance[idx]; ++level.FreeAdvance.FreeAdvances; copy.Remove(toAdvance[idx]); } while (copy.Count >= partsPerMatch) { var thisMatch = new List<TournyParticipant>(); for (int i = 0; i < partsPerMatch; ++i) { int idx = 0; switch (groupType) { case GroupingType.HighVsLow: idx = (i * (copy.Count - 1)) / (partsPerMatch - 1); break; case GroupingType.Nearest: idx = 0; break; case GroupingType.Random: idx = Utility.Random(copy.Count); break; } thisMatch.Add(copy[idx]); copy.RemoveAt(idx); } level.Matches.Add(new TournyMatch(thisMatch)); } if (copy.Count > 1) { level.Matches.Add(new TournyMatch(copy)); } break; } } m_Levels.Add(level); }