public void AllIn(PokerPlayer player, bool call, bool isblind)
		{
			player.Status = Status.AllIn;
			if (isblind)
				if (m_HighestBet == 0)
					m_HighestBet = BlindSmall;
				else
					m_HighestBet += BlindSmall;

			if (call)
				saymsg(String.Format("I call all-in!"), player.Mobile, false);
			else
				saymsg(String.Format("All-in for {0:0,0}!", (double)player.Bankroll), player.Mobile, false);
			Bet(player, player.Bankroll);
		}
		public bool Raise(PokerPlayer player, int amount)
		{
			return Raise(player, amount, false);
		}
		public bool Raise(PokerPlayer player, int amount, bool isblind)
		{
			int realamount = m_HighestBet - player.RoundBet + amount;
			if (player.Bankroll <= realamount)
				AllIn(player, false, isblind);
			else
			{
				m_MovesSinceDeal++;
				if (isblind)
					saymsg(String.Format("I post a blind of {0:0,0}.", (double)realamount), player.Mobile, false);
				else
					if (HighestBet == 0)
						saymsg(String.Format("I bet {0:0,0}.", (double)amount), player.Mobile, false);
					else
						saymsg(String.Format("I raise by {0:0,0}.", (double)amount), player.Mobile, false);
				Bet(player, realamount);
			}
			return true;
		}
        public BettingGump(PokerDealer dealer, PokerPlayer player, bool gump) : base(400, 385)
        {
            m_Dealer = dealer;
            m_Player = player;

            Closable = false;
            Disposable = false;
            Dragable = true;
            Resizable = false;

            if (m_Dealer == null || m_Player == null)
                return;

            AddPage(0);
            AddBackground(120, 95, 200, 118, 9270);
            AddBackground(228, 175, 75, 20, 9300);
            AddAlphaRegion(125, 100, 190, 108);
            AddButton(225, 145, 247, 248, 4, GumpButtonType.Reply, 0);

            AddRadio(135, 110, 9720, 9723, false, 1);
            if (m_Dealer.HighestBet == player.RoundBet)
                AddLabel(170, 115, 1071, "Check");
            else if (player.Bankroll > m_Dealer.HighestBet - player.RoundBet)
            {
                AddLabel(170, 115, 1071, "Call");
                AddLabel(230, 115, 50, String.Format("{0:0,0}", (double)(m_Dealer.HighestBet - player.RoundBet)));
            }
            else
                AddLabel(170, 115, 50, "All-in");

            AddRadio(135, 140, 9720, 9723, false, 2);
            AddLabel(170, 145, 1071, "Fold");

            if (gump)
            {
                AddRadio(135, 170, 9720, 9723, true, 3);
                AddTextEntry(230, 175, 102, 20, 50, 5, String.Format("{0}", (double)(m_Dealer.BlindSmall * 2)));
            }
            else
                AddButton(135, 170, 9720, 9723, 5, GumpButtonType.Reply, 0);

            if (m_Dealer.HighestBet == 0)
                AddLabel(170, 175, 1071, "Bet");
            else
                AddLabel(170, 175, 1071, "Raise");

        }
		public void KickPlayer(PokerPlayer player)
		{
			for (int i = 0; i < Players.Length; i++)
				if (player == (PokerPlayer)Players[i])
				{
					if (player.Status >= Status.Playing && m_GameProgress > PokerProgress.None && m_GameProgress < PokerProgress.End)
						ActionTaken(player, PokerAction.Fold);

					if (player.Status == Status.GettingGold)
						player.EndGetGold();

					if (player.Bankroll == 0)
						player.Mobile.SendMessage("Thou'rt leaving the poker table broke.");
					else if (PTActive || m_DealerSetup == DealerSetup.FinalTable)
					{
						player.Mobile.SendMessage("No winnings have been deposited as you left during a tournament.");
						player.Bankroll = 0;
					}
					else
					{
						switch (m_DealerAccept)
						{
							case DealerAccept.GoldOnly:
								Payout(player, player.Bankroll);
								player.Bankroll = 0;
								player.Mobile.PlaySound(0x32);
								player.Mobile.SendMessage("Your winnings have been deposited in your bank box.");
								break;
							case DealerAccept.LowRollerTicketsOnly:
								player.Mobile.SendMessage("Your low-roller poker ticket has been placed in your backpack.");
								player.Mobile.Backpack.DropItem(new PokerLowRollerTicket());
								break;
							case DealerAccept.HighRollerTicketsOnly:
								player.Mobile.SendMessage("Your high-roller poker ticket has been placed in your backpack.");
								player.Mobile.Backpack.DropItem(new PokerHighRollerTicket());
								break;
						}
					}
					player.Mobile.MoveToWorld(m_ExitPoint, Map);
					CloseAllGumps(player.Mobile);
					Players[i] = null;
					return;
				}
		}
		private void AddWinnerAmount(ArrayList list, PokerPlayer player, int amount)
		{
			foreach (WinnerEntry entry in list)
				if (entry.m_Player == player)
				{
					entry.m_Amount += amount;
					return;
				}
			list.Add(new WinnerEntry(player, amount));
		}
		public void VerifyJoin(Mobile from, int buyin, bool check, bool ticket)
		{
			if (check)
				if (!CanJoin(from))
					return;

			int index = GetSitLoc();
			if (index == -1)
				from.SendMessage(33, "There are no open seats. Try to join the poker table later.");
			else
			{
				if (Players[index] == null)
					Players[index] = new PokerPlayer(from);
				else
					return;
				if (m_DealerAccept == DealerAccept.GoldOnly && !ticket)
				{
					Banker.Withdraw(from, buyin);
					m_TotalGoldDrained += (buyin * DrainFromBuyIn) / 100;
				}
				Players[index].Bankroll = buyin - ((buyin * DrainFromBuyIn) / 100);
				from.SendMessage("Thou'rt taking a place at the poker table with {0:0,0}gp.", (double)buyin);
				IMount mount = from.Mount;
				if (mount != null)
					mount.Rider = null;
				if (from.Spell != null)
					from.Spell = null;
				from.RevealingAction();
				from.MoveToWorld(m_Seat[index], Map);
				from.CantWalk = true;
				Players[index].Status = Status.WaitingForRound;
				m_PlayerAmount++;
				RefreshGump();
				if (m_DealerSetup == DealerSetup.Regular && ReadyPlayers.Length >= 2 && m_GameProgress == PokerProgress.None)
					PrepareForRound();
				else if (m_DealerSetup > DealerSetup.Regular && ReadyPlayers.Length == MaxPlayers && m_GameProgress == PokerProgress.None)
				{
					PTActive = true;
					m_memblind = BlindSmall;
					m_RoundRaise = 0;

					AwardList.Clear();
					m_TotalMoneyAtStart = 0;
					for (int i = 0; i < Players.Length; ++i)
						if (Players[i] != null)
							m_TotalMoneyAtStart += Players[i].Bankroll;

					Say("Let's play poker!");
					if (m_DealerSetup == DealerSetup.FinalTable)
						Say("The total amount of chips at the final table is {0:0,0}gp", (double)m_TotalMoneyAtStart);
					PlaySound(491);
					PrepareForRound();
				}
			}
		}
		public void ActionTaken(PokerPlayer player, PokerAction action, bool forced)
		{
			ActionTaken(player, action, 0, forced);
		}
		public void ActionTaken(PokerPlayer player, PokerAction action, int val)
		{
			ActionTaken(player, action, val, false);
		}
		public void SendBettingGump(PokerPlayer player, bool gump)
		{
			if (GameProgress > PokerProgress.None && GameProgress < PokerProgress.End)
				if (player.AutoFold)
					ActionTaken(player, PokerAction.Fold);
				else
					player.Mobile.SendGump(new BettingGump(this, player, gump));
		}
		public void ActionTaken(PokerPlayer player, PokerAction action)
		{
			ActionTaken(player, action, 0);
		}
		public void StartGettingGold(PokerPlayer player)
		{
		}
		public void ConfirmedPayment(PokerPlayer player, int gold)
		{
			if (player != null)
			{
				player.EndGetGold();
				player.Bankroll = gold;
				player.Status = Status.WaitingForRound;
			}
			RefreshGump();
			if (ReadyPlayers.Length >= 2 && m_GameProgress == PokerProgress.None)
				PrepareForRound();
		}
		public void Payout(PokerPlayer player, int bankroll)
		{
			if (player.Mobile == null)
				return;

			while (bankroll > 1000000)
			{
				player.Mobile.BankBox.DropItem(new BankCheck(1000000));
				bankroll -= 1000000;
			}
			if (bankroll > 5000)
				player.Mobile.BankBox.DropItem(new BankCheck(bankroll));
			else if (bankroll > 0)
				player.Mobile.BankBox.DropItem(new Gold(bankroll));
		}
		public void Bet(PokerPlayer player, int amount)
		{
			player.RoundBet += amount;
			player.TotalBet += amount;
			player.Bankroll -= amount;
			if (player.RoundBet > m_HighestBet)
				m_HighestBet = player.RoundBet;
			m_PotWorth += amount;
		}
		public void ActionTaken(PokerPlayer player, PokerAction action, int val, bool forced)
		{
			if (!forced)
				player.EndAction();

			if (GameProgress == PokerProgress.None || GameProgress == PokerProgress.End || Players[m_PlayerTurn] != player && !forced)
				return;

			bool done = false;
			switch (action)
			{
				case PokerAction.Check:
					{
						done = Check(player);
						break;
					}
				case PokerAction.Fold:
					{
						done = Fold(player);
						break;
					}
				case PokerAction.Raise:
					{
						done = Raise(player, val);
						break;
					}
				case PokerAction.Call:
					{
						done = Call(player);
						break;
					}
				default:
					{
						player.Mobile.SendMessage(33, "Invalid action.");
						SendBettingGump(Players[m_PlayerTurn], false);
						return;
					}
			}
			if (done)
				CalculateAction();
		}
			public WinnerEntry(PokerPlayer player, int amount)
			{
				m_Player = player;
				m_Amount = amount;
			}
		public bool Check(PokerPlayer player)
		{
			m_MovesSinceDeal++;
			saymsg(String.Format("Check."), player.Mobile, false);
			return true;
		}
		public PokerPlayer[] PlayersWithStatus(Status status)
		{
			ArrayList list = new ArrayList();
			for (int i = 0; i < Players.Length; i++)
			{
				if (Players[i] != null && Players[i].Status == status)
					list.Add(Players[i]);
			}
			PokerPlayer[] players = new PokerPlayer[list.Count];
			for (int i = 0; i < list.Count; i++)
				players[i] = (PokerPlayer)list[i];
			return players;
		}
		public bool Call(PokerPlayer player)
		{
			int amount = m_HighestBet - player.RoundBet;
			if (player.Bankroll <= amount)
				AllIn(player, true, false);
			else
			{
				m_MovesSinceDeal++;
				saymsg(String.Format("I call."), player.Mobile, false);
				Bet(player, amount);
			}
			return true;
		}
        public GetGoldGump(PokerDealer dealer, PokerPlayer player) : base(150, 150)
        {
            m_Dealer = dealer;
            m_Player = player;

            if (m_Dealer == null || m_Player == null)
                return;

            Closable = true;
            Disposable = false;
            Dragable = true;
            Resizable = false;

            AddPage(0);
            AddBackground(0, 0, 300, 160, 9270);
            AddBackground(113, 122, 100, 20, 9300);
            AddAlphaRegion(10, 10, 280, 140);
            AddLabel(116, 20, 1071, "Need more chips?");
            AddLabel(18, 36, 1071, "===========================================");
            AddLabel(22, 50, 1071, "Your chips:");
            AddLabel(22, 74, 1071, "Max buy-in:");
            AddLabel(22, 98, 1071, "Bank balance:");
            AddLabel(22, 122, 1071, "Buy-in amount:");
            if (m_Player.Bankroll == 0)
                AddLabel(115, 50, 50, "0");
            else
                AddLabel(115, 50, 50, String.Format("{0:0,0}", (double)m_Player.Bankroll));
            AddLabel(115, 74, 50, String.Format("{0:0,0}", (double)m_Dealer.BuyinMaximum));
            int balance = Server.Mobiles.Banker.GetBalance(m_Player.Mobile);
            AddLabel(115, 98, balance < m_Dealer.BuyinMinimum - m_Player.Bankroll ? 33 : balance < m_Dealer.BuyinMinimum * 2 ? 50 : 1071, String.Format("{0:0,0}", (double)balance));
            AddTextEntry(115, 122, 120, 20, 50, 0, String.Format("{0}", m_Dealer.BuyinMinimum - m_Player.Bankroll));
            AddButton(220, 90, 247, 248, 1, GumpButtonType.Reply, 0);
            AddButton(220, 120, 243, 241, 2, GumpButtonType.Reply, 0);
        }
		public bool Fold(PokerPlayer player)
		{
			saymsg(String.Format("I fold."), player.Mobile, false);
			player.Status = Status.WaitingForRound;
			player.RoundBet = 0;
			return true;
		}
 public GetGoldTimer(PokerDealer dealer, PokerPlayer player) : base(TimeSpan.FromSeconds(1.0), TimeSpan.FromSeconds(1.0))
 {
     m_Dealer = dealer;
     m_Player = player;
     m_TimeLeft = m_Dealer.Timer_GetGold;
     Start();
 }
		public int GetIndex(PokerPlayer player)
		{
			for (int i = 0; i < Players.Length; i++)
				if (player == (PokerPlayer)Players[i])
					return i;
			return -1;
		}