private void FillTable() //Uses SignedUp to fill the GameTable with Matches -> NOTE: Shuffle before calling
		{
			for(int i = 0; i < GameTable.Length; ++i)
			{
				int defender = GameTable.Length + i;

				GameTable[i] = new Match((List<Mobile>)(i > m_SignedUp.Count - 1 ? null : m_SignedUp[i]), (List<Mobile>)(defender > m_SignedUp.Count - 1 ? null : m_SignedUp[defender]), (m_AllowTeams ? MatchType.Multi : MatchType.Single));
			}
		}
		private void RefactorTable()
		{
			if(GameTable.Length % 2 != 0)
				Console.WriteLine("GameTable has uneven amount of matches. Matches: {0}", GameTable.Length); //Debugging purposes

			//Take the first half of the Game Table, and load the winners into Attacker slots
			for(int i = 0; i < (GameTable.Length / 2); i++)
			{
				Match current = GameTable[i];

				current.Attackers = current.Winners;

				current.Defenders = null;
				current.Winners = null;
				current.MatchStatus = MatchStatus.Waiting;
			}

			//Take second half of the Game Table, and load all winners into Defender slots
			for(int i = (GameTable.Length / 2); i < GameTable.Length; i++)
			{
				Match current = GameTable[i];
				Match toSwitch = GameTable[i - (GameTable.Length / 2)];

				toSwitch.Defenders = current.Winners;
			}

			//Make a temp array half sized
			Match[] temp = new Match[GameTable.Length / 2];

			//Move first half of GameTable to temp
			for(int i = 0; i < temp.Length; ++i)
			{
				temp[i] = GameTable[i];
			}

			//Reassign GameTable
			GameTable = temp;
		}
		private Match[] GetCurrentMatches()
		{
			List<Match> temp = new List<Match>();

			for(int i = 0; i < GameTable.Length; ++i)
			{
				Match current = GameTable[i];

				if(current != null && current.MatchStatus == MatchStatus.Fighting)
					temp.Add(current);
			}

			if(temp.Count != 0)
			{
				Match[] fighting = new Match[temp.Count];

				for(int i = 0; i < fighting.Length; ++i)
					fighting[i] = temp[i];

				return fighting;
			}

			return null;
		}
		private bool ArenaContainsMatch(Rectangle3D arena, Match match)
		{
			for(int i = 0; i < match.Attackers.Count; ++i) //Loop through attackers
			{
				if(arena.Contains(match.Attackers[i].Location))
					return true;
			}

			for(int i = 0; i < match.Defenders.Count; ++i) //Loop through defenders
			{
				if(arena.Contains(match.Defenders[i].Location))
					return true;
			}

			return false;
		}
		private bool CheckFight(Match m)
		{
			if(m.Attackers == null && m.Defenders != null)
			{
				m.Winners = m.Defenders;
				return false;
			}
			if(m.Attackers != null && m.Defenders == null)
			{
				m.Winners = m.Attackers;
				return false;
			}
			if(m.Attackers == null && m.Defenders == null)
			{
				m.Winners = null;
				return false;
			}

			return true;
		}
		private void PrepMatch(Match m, Rectangle3D arena)
		{
			if(!CheckFight(m)) //Checks for nulls in Matches
			{
				Match_OnEnd(m);
				return;
			}

			m.MatchStatus = MatchStatus.Fighting;

			//Prepare attackers
			for(int i = 0; i < m.Attackers.Count; ++i)
			{
				PrepFighter(m.Attackers[i]); //Res -> Unmount -> AntiCheat
				m.Attackers[i].Location = GetLocation(arena, true);
			}
			//Prepare defenders
			for(int i = 0; i < m.Defenders.Count; ++i)
			{
				PrepFighter(m.Defenders[i]); //Res -> Unmount -> AntiCheat
				m.Defenders[i].Location = GetLocation(arena, false);
			}

			Item wall = new WallOfStoneEast();
			wall.MoveToWorld(Middle(arena), this.Map);

			Timer.DelayCall(TimeSpan.FromSeconds(10.0),new TimerStateCallback( Start_CallBack ), new object[]{ m, wall });

			Round_NewMatch(); //Check to see if any more matches can take place
		}
		private void Match_OnEnd(Match match) //Called by "PrepMatch()" when there is a null fight or a "bye"
		{
			List<Mobile> losers;

			//Find the losers
			if(match.Winners == match.Attackers)
				losers = match.Defenders;
			else
				losers = match.Attackers;

			Match_OnEnd(match, losers);
		}
		private void Match_OnEnd(Match match, List<Mobile> losers)
		{
			if(losers == match.Attackers)
				match.Winners = match.Defenders;
			else
				match.Winners = match.Attackers;

			match.MatchStatus = MatchStatus.Over;

			if(match.Attackers != null && match.Defenders != null)
			{
				//Prepare attackers
				for(int i = 0; i < match.Attackers.Count; ++i)
					HandleMatchEnd(match.Attackers[i], true);

				//Prepare defenders
				for(int i = 0; i < match.Defenders.Count; ++i)
					HandleMatchEnd(match.Defenders[i], true);
			}

			NullifyEmptyTeams();

			if(Round_IsOver())
			{
				if(GameTable.Length > 1)
					RefactorTable();
				else //FINAL ROUND
				{
					Tournament_OnEnd(match);
					return;
				}
			}

			Round_NewMatch();
		}
		private void Tournament_OnEnd(Match match)
		{
			string names = "";
			bool multi = match.Winners.Count > 1;

			for(int i = 0; i < match.Winners.Count; ++i)
				names += match.Winners[i].Name + (i == match.Winners.Count - 1 ? "" : ", ");

			World.Broadcast( 1154, true, String.Format("The tournament is now over. The winner{0} {1}: {2}", multi ? "s" : "", multi ? "were" : "was", names) );

			GameTable = null;
			m_SignedUp = new List<List<Mobile>>();
			m_Started = false;
		}