private void AnalyzeTeams(out int maxDiff, out int[] ascendingSize, out int[] descendingTickets, out int biggestTeam, out int smallestTeam, out int winningTeam, out int losingTeam)
{
biggestTeam = 0;
smallestTeam = 0;
winningTeam = 0;
losingTeam = 0;
maxDiff = 0;
bool isSQDM = IsSQDM();
ascendingSize = new int[4]{0,0,0,0};
descendingTickets = new int[4]{0,0,0,0};
if (fServerInfo == null) return;
// special case, server is empty, always pick teamId 1
if (TotalPlayerCount() == 0) {
biggestTeam = 2;
smallestTeam = 1;
winningTeam = 2;
losingTeam = 1;
ascendingSize[0] = 1;
ascendingSize[1] = 2;
descendingTickets[0] = 2;
descendingTickets[1] = 1;
return;
}
List<TeamRoster> teams = new List<TeamRoster>();
teams.Add(new TeamRoster(1, fTeam1));
teams.Add(new TeamRoster(2, fTeam2));
if (isSQDM) {
teams.Add(new TeamRoster(3, fTeam3));
teams.Add(new TeamRoster(4, fTeam4));
}
teams.Sort(delegate(TeamRoster lhs, TeamRoster rhs) {
// Sort ascending order by count
if (lhs == null || rhs == null) return 0;
if (lhs.Roster.Count < rhs.Roster.Count) return -1;
if (lhs.Roster.Count > rhs.Roster.Count) return 1;
return 0;
});
for (int i = 0; i < ascendingSize.Length; ++i) {
if (i < teams.Count) {
ascendingSize[i] = teams[i].Team;
} else {
ascendingSize[i] = 0;
}
}
TeamRoster small = teams[0];
TeamRoster big = teams[teams.Count-1];
smallestTeam = small.Team;
biggestTeam = big.Team;
maxDiff = big.Roster.Count - small.Roster.Count;
List<TeamScore> byScore = new List<TeamScore>();
if (fServerInfo.TeamScores == null) return;
bool isCTF = IsCTF();
bool isCarrierAssault = IsCarrierAssault();
bool isObliteration = IsObliteration();
if (!isCTF && !isCarrierAssault && !isObliteration && fServerInfo.TeamScores.Count < 2) return;
if (IsRush()) {
// Normalize scores
TeamScore attackers = null;
TeamScore defenders = null;
foreach (TeamScore ts in fServerInfo.TeamScores) {
if (ts.TeamID == 1) {
attackers = ts;
} else if (ts.TeamID == 2) {
defenders = ts;
}
}
//TeamScore attackers = fServerInfo.TeamScores[0];
//TeamScore defenders = fServerInfo.TeamScores[1];
double normalized = fMaxTickets - (fRushMaxTickets - defenders.Score);
normalized = Math.Max(normalized, Convert.ToDouble(attackers.Score)/2);
byScore.Add(attackers); // attackers
byScore.Add(new TeamScore(defenders.TeamID, Convert.ToInt32(normalized), defenders.WinningScore));
} else if (isCTF || isCarrierAssault || isObliteration) {
// Base sort on team points rather than tickets
int usPoints = Convert.ToInt32(GetTeamPoints(1));
int ruPoints = Convert.ToInt32(GetTeamPoints(2));
DebugWrite("^9Score analysis: US/RU points = " + usPoints + "/" + ruPoints, 8);
byScore.Add(new TeamScore(1, usPoints, 0));
byScore.Add(new TeamScore(2, ruPoints, 0));
} else {
byScore.AddRange(fServerInfo.TeamScores);
}
byScore.Sort(delegate(TeamScore lhs, TeamScore rhs) {
// Sort descending order by score
if (lhs == null || rhs == null) return 0;
if (lhs.Score < rhs.Score) return 1;
if (lhs.Score > rhs.Score) return -1;
return 0;
});
for (int i = 0; i < descendingTickets.Length; ++i) {
if (isSQDM || i < 2) {
descendingTickets[i] = byScore[i].TeamID;
} else {
descendingTickets[i] = 0;
}
}
winningTeam = byScore[0].TeamID;
int iloser = (isSQDM) ? 3 : 1;
if (iloser >= byScore.Count) iloser = byScore.Count - 1;
losingTeam = byScore[iloser].TeamID;
DebugWrite("^9AnalyzeTeams: biggest/smallest/winning/losing = " + biggestTeam + "/" + smallestTeam + "/" + winningTeam + "/" + losingTeam, 8);
}