PRoConEvents.MULTIbalancer.AnalyzeTeams C# (CSharp) Method

AnalyzeTeams() private method

private AnalyzeTeams ( int &maxDiff, int &ascendingSize, int &descendingTickets, int &biggestTeam, int &smallestTeam, int &winningTeam, int &losingTeam ) : void
maxDiff int
ascendingSize int
descendingTickets int
biggestTeam int
smallestTeam int
winningTeam int
losingTeam int
return void
        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);
        }
MULTIbalancer