/// <summary>
        /// This is the function that starts the game.
        /// </summary>
        /// <param name="lenght">Lenght of the game.</param>
        /// <param name="draw">If this is a draw game.</param>
        public static void StartGame(TimeSpan lenght, bool draw)
        {
            if( draw )
            {
                CTFMessage( string.Format( "A Draw! Game will continue for {0}", MiscUtility.FormatTimeSpan( lenght ) ) );
            }
            else
            {
                if (Spawn != null)
                    Spawn.StartTimer();

                Teams = Stone.Teams;
                if (Teams == 0) {
                    int number = PlayerJoinList.Count;
                    if ( number < 20 ) // Silver edit, old: (number < 16) || (number == 18)
                        Teams = 2;
                    else
                        Teams = 4;
                }

                Item wall;
                if (Teams == 3) {
                    wall = new Item(578);
                    wall.Hue = 1150;
                    wall.Movable = false;
                    wall.MoveToWorld(new Point3D(5943, 451, 22), Map.Felucca);
                    walls[0] = wall;
                    wall = new Item(578);
                    wall.Hue = 1150;
                    wall.Movable = false;
                    wall.MoveToWorld(new Point3D(5943, 452, 22), Map.Felucca);
                    walls[1] = wall;
                } else if (Teams == 2) {
                    wall = new Item(578);
                    wall.Hue = 1150;
                    wall.Movable = false;
                    wall.MoveToWorld(new Point3D(5943, 451, 22), Map.Felucca);
                    walls[0] = wall;
                    wall = new Item(578);
                    wall.Hue = 1150;
                    wall.Movable = false;
                    wall.MoveToWorld(new Point3D(5943, 452, 22), Map.Felucca);
                    walls[1] = wall;
                    wall = new Item(577);
                    wall.Hue = 33;
                    wall.Movable = false;
                    wall.MoveToWorld(new Point3D(5955, 455, 22), Map.Felucca);
                    walls[2] = wall;
                    wall = new Item(577);
                    wall.Hue = 33;
                    wall.Movable = false;
                    wall.MoveToWorld(new Point3D(5956, 455, 22), Map.Felucca);
                    walls[3] = wall;
                }

                for (int i = 0; i < Teams; i++)
                    GameData.TeamList.Add(new CTFTeamGameData(TeamArray[i]));

                List<CTFPlayerData> playerlist = new List<CTFPlayerData>();

                foreach (Mobile m in PlayerJoinList)
                {
                    CTFPlayerData pd = CTFData.GetPlayerData(m);

                    if (pd != null)
                        playerlist.Add(pd);

                    else
                    {
                        pd = new CTFPlayerData(m);
                        CTFData.PlayerDictionary[m] = pd;
                        CTFData.PlayerList.Add(pd);
                        playerlist.Add(pd);
                    }
                }

                playerlist.Sort();

                // Selection System by Silver

                int idx = 0;
                int max = playerlist.Count;

                if( Stone.CTFLeagueGame )
                {
                    int CTFLeagueTeam = -1;

                    while( idx < max )
                    {
                        CTFLeagueTeam = -1;

                        CTFPlayerData pd = playerlist[idx];

                        if( pd.Mob.SolidHueOverride == 1109 )
                            CTFLeagueTeam = 0;
                        else if( pd.Mob.SolidHueOverride == 1266 )
                            CTFLeagueTeam = 1;
                        else
                            LeaveGame( pd.Mob );

                        if( CTFLeagueTeam != -1 )
                        {
                            CTFPlayerGameData pgd = new CTFPlayerGameData(pd.Mob, TeamArray[CTFLeagueTeam]);
                            GameData.PlayerDictionary[pd.Mob] = pgd;
                            GameData.PlayerList.Add(pgd);
                            GameData.TeamList[CTFLeagueTeam].PlayerList.Add(pgd);
                            ArmPlayer(pgd);
                            pd.Mob.SendGump(new CTFRewardGump(pd.Mob, 0));
                        }

                        pd.Mob.SolidHueOverride = -1;
                        idx++;
                    }
                }
                else
                {
                    int startTeam = Utility.Random(Teams);
                    bool revert = false;

                    while( idx < max )
                    {
                        for( int team = 0; team < Teams && idx < max; team++ )
                        {
                            CTFPlayerData pd = playerlist[idx];
                            CTFPlayerGameData pgd = new CTFPlayerGameData(pd.Mob, TeamArray[((revert ? (Teams - team - 1) : team) + startTeam)%Teams]);
                            GameData.PlayerDictionary[pd.Mob] = pgd;
                            GameData.PlayerList.Add(pgd);
                            GameData.TeamList[((revert ? (Teams - team - 1) : team) + startTeam)%Teams].PlayerList.Add(pgd);
                            ArmPlayer(pgd);
                            pd.Mob.SendGump(new CTFRewardGump(pd.Mob, 0));

                            idx++;
                        }
                        revert = !revert;
                    }
                }

                PlayerJoinList.Clear();
                ResetTeams();
                CTFMessage( "The game has started." );
            }

            // Set idle check 4 min after game starts
            NextIdleCheck = DateTime.Now + CTFGame.IdleTime;

            StartTime = DateTime.Now;
            CurLength = lenght;

            GameTimer = new CtfGameTimer(lenght, TimeSpan.FromMinutes(1.0));
            GameTimer.Start();
        }
 public CTFPlayerGameDataGump(CTFPlayerData pd)
     : base(pd)
 {
     SetData();
 }