Example #1
0
        public Tournament(GenericReader reader)
        {
            int version = reader.ReadEncodedInt();

            switch ( version )
            {
                case 4:
                    {
                        this.m_EventController = reader.ReadItem() as EventController;

                        goto case 3;
                    }
                case 3:
                    {
                        this.m_SuddenDeathRounds = reader.ReadEncodedInt();

                        goto case 2;
                    }
                case 2:
                    {
                        this.m_TournyType = (TournyType)reader.ReadEncodedInt();

                        goto case 1;
                    }
                case 1:
                    {
                        this.m_GroupType = (GroupingType)reader.ReadEncodedInt();
                        this.m_TieType = (TieType)reader.ReadEncodedInt();
                        this.m_SignupPeriod = reader.ReadTimeSpan();

                        goto case 0;
                    }
                case 0:
                    {
                        if (version < 3)
                            this.m_SuddenDeathRounds = 3;

                        this.m_ParticipantsPerMatch = reader.ReadEncodedInt();
                        this.m_PlayersPerParticipant = reader.ReadEncodedInt();
                        this.m_SignupPeriod = reader.ReadTimeSpan();
                        this.m_Stage = TournamentStage.Inactive;
                        this.m_Pyramid = new TournyPyramid();
                        this.m_Ruleset = new Ruleset(RulesetLayout.Root);
                        this.m_Ruleset.ApplyDefault(this.m_Ruleset.Layout.Defaults[0]);
                        this.m_Participants = new ArrayList();
                        this.m_Undefeated = new ArrayList();
                        this.m_Arenas = new ArrayList();

                        break;
                    }
            }

            Timer.DelayCall(SliceInterval, SliceInterval, new TimerCallback(Slice));
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }