From 5623e0865d34109c024e465c305136d8a119419e Mon Sep 17 00:00:00 2001 From: lotodore Date: Thu, 25 Dec 2008 21:12:59 +0000 Subject: [PATCH] Console client: Now functional, but several features are still missing. --- console/src/ConsoleCallback.cs | 26 ++++++- console/src/Program.cs | 73 ++++++++++++++++--- console/src/lib/GameInfoList.cs | 13 ++-- console/src/lib/ICallback.cs | 3 + console/src/lib/PokerTHData.cs | 22 ++++++ console/src/lib/net/Client.cs | 31 +++++++- console/src/lib/net/INetPacketVisitor.cs | 4 + console/src/lib/net/NetPacket.cs | 16 +++- .../lib/net/NetPacketEndOfHandShowCards.cs | 2 +- console/src/lib/net/NetPacketPlayersAction.cs | 2 +- console/src/lib/net/NetParser.cs | 47 +++++++++++- 11 files changed, 216 insertions(+), 23 deletions(-) diff --git a/console/src/ConsoleCallback.cs b/console/src/ConsoleCallback.cs index 877e285c..48d6405e 100644 --- a/console/src/ConsoleCallback.cs +++ b/console/src/ConsoleCallback.cs @@ -28,7 +28,8 @@ namespace pokerth_console { public void InitDone() { - Console.WriteLine("Init successful."); + Console.WriteLine("Connection established."); + Console.WriteLine("Retrieving list of games..."); } public void JoinedGame(string name) @@ -69,6 +70,7 @@ namespace pokerth_console { Console.WriteLine("\n--> {0}: Your turn. Highest set: ${1}. Minimum raise: ${2}. Cash: ${3}.", Log.StateToString(state), highestSet, minimumRaise, money); + Console.WriteLine("Enter: (f)old, (c)heck, ca(l)l, (b)et, (r)aise, (a)ll in"); } public void PlayersTurn(Hand.State state, string player) @@ -110,9 +112,22 @@ namespace pokerth_console Log.CardToString(cards[4])); } + public void AllInState() + { + Console.WriteLine(); // simply print a newline + } + + public void ShowCards(string name, int[] cards) + { + Console.WriteLine("{0} shows [{1}, {2}].", + name, + Log.CardToString(cards[0]), + Log.CardToString(cards[1])); + } + public void EndOfHandShowCards(string name, int[] cards, int cardsValue, bool allIn) { - Console.WriteLine("{0} {1} [{2}, {3}] - {4}", + Console.WriteLine("{0} {1} [{2}, {3}] - {4}.", name, allIn ? "has" : "shows", Log.CardToString(cards[0]), @@ -120,6 +135,11 @@ namespace pokerth_console Log.CardsValueToString(cardsValue)); } + public void HandResult() + { + Console.WriteLine(); + } + public void PlayerWins(string name, uint moneyWon) { Console.WriteLine("{0} wins ${1}.", name, moneyWon); @@ -128,6 +148,8 @@ namespace pokerth_console public void Error(string message) { Console.WriteLine("Error: " + message); + Console.WriteLine("Hint: Try using a different nickname."); + System.Environment.Exit(1); } } } diff --git a/console/src/Program.cs b/console/src/Program.cs index eb357e53..3cd7c982 100644 --- a/console/src/Program.cs +++ b/console/src/Program.cs @@ -29,21 +29,76 @@ namespace pokerth_console { static int Main(string[] args) { + Console.WriteLine("pokerth_console V0.1 - Copyright (C) 2008 by Lothar May"); + Console.WriteLine("See license.txt for license terms."); + Console.WriteLine(); + Console.WriteLine("Enter your nickname:"); + string name = Console.ReadLine(); + Console.WriteLine("Connecting to server..."); Settings settings = new Settings(); - PokerTHData data = new PokerTHData("Testuser1"); + PokerTHData data = new PokerTHData(name); ConsoleCallback callback = new ConsoleCallback(); Client client = new Client(settings, data, callback); client.Connect(); client.Start(); Thread.Sleep(2000); - Console.WriteLine("Open Games:"); - Console.Write(data.GameList.ToString()); - Console.WriteLine(); - Console.WriteLine("Enter game id"); - string input = Console.ReadLine(); - uint gameId = Convert.ToUInt32(input); - client.JoinGame(gameId); - input = Console.ReadLine(); + string input; + bool joined = false; + do + { + do + { + Console.WriteLine("Open Games:"); + Console.Write(data.GameList.GetOpenGamesString()); + Console.WriteLine(); + Console.WriteLine("Enter game id (or press enter to refresh)"); + input = Console.ReadLine(); + } while (input == "" || !Char.IsDigit(input[0])); + Console.WriteLine("Joining game..."); + uint gameId = Convert.ToUInt32(input); + client.JoinGame(gameId); + if (client.WaitJoinGame(5000)) + joined = true; + else + Console.WriteLine("Could not join game."); + } while (!joined); + Console.WriteLine("Waiting for admin to start the game..."); + client.WaitStartGame(); + + do + { + do + { + input = Console.ReadLine(); + } while (input == ""); + Hand.Action action = Hand.Action.None; + uint bet = 0; + switch (input[0]) + { + case 'f': + action = Hand.Action.Fold; + break; + case 'c': + action = Hand.Action.Check; + break; + case 'l': + action = Hand.Action.Call; + break; + case 'b': + action = Hand.Action.Bet; + bet = Convert.ToUInt32(input.Substring(1)); + break; + case 'r': + action = Hand.Action.Raise; + bet = Convert.ToUInt32(input.Substring(1)); + break; + case 'a': + action = Hand.Action.AllIn; + break; + } + if (action != Hand.Action.None) + client.MyAction(action, bet); + } while (true); client.SetTerminateFlag(); client.WaitTermination(); return 0; diff --git a/console/src/lib/GameInfoList.cs b/console/src/lib/GameInfoList.cs index dbf7776d..e5f989c6 100644 --- a/console/src/lib/GameInfoList.cs +++ b/console/src/lib/GameInfoList.cs @@ -66,17 +66,20 @@ namespace pokerth_lib } } - public override string ToString() + public string GetOpenGamesString() { string outString = ""; lock (m_list) { foreach (KeyValuePair i in m_list) { - outString += i.Key; - outString += " "; - outString += i.Value.Name; - outString += '\n'; + if (i.Value.CurrentMode == GameInfo.Mode.Created) + { + outString += i.Key; + outString += " "; + outString += i.Value.Name; + outString += '\n'; + } } } return outString; diff --git a/console/src/lib/ICallback.cs b/console/src/lib/ICallback.cs index 9c9ad84f..04cda2e5 100644 --- a/console/src/lib/ICallback.cs +++ b/console/src/lib/ICallback.cs @@ -37,7 +37,10 @@ namespace pokerth_lib void ShowFlopCards(int[] cards); void ShowTurnCards(int[] cards); void ShowRiverCards(int[] cards); + void AllInState(); + void ShowCards(string name, int[] cards); void EndOfHandShowCards(string name, int[] cards, int cardsValue, bool allIn); + void HandResult(); void PlayerWins(string name, uint moneyWon); void Error(string message); } diff --git a/console/src/lib/PokerTHData.cs b/console/src/lib/PokerTHData.cs index 8b56dbca..6f19c33f 100644 --- a/console/src/lib/PokerTHData.cs +++ b/console/src/lib/PokerTHData.cs @@ -20,6 +20,8 @@ using System; using System.Collections.Generic; using System.Text; +using System.Threading; + namespace pokerth_lib { @@ -33,6 +35,8 @@ namespace pokerth_lib m_myPlayerId = 0; m_myGameId = 0; m_myName = name; + m_joinGameEvent = new AutoResetEvent(false); + m_startGameEvent = new AutoResetEvent(false); } public GameInfoList GameList @@ -113,6 +117,22 @@ namespace pokerth_lib } } + public EventWaitHandle JoinGameEvent + { + get + { + return m_joinGameEvent; + } + } + + public EventWaitHandle StartGameEvent + { + get + { + return m_startGameEvent; + } + } + private GameInfoList m_gameInfoList; private PlayerInfoList m_playerInfoList; private Hand m_curHand; @@ -120,5 +140,7 @@ namespace pokerth_lib private uint m_myPlayerId; private uint m_myGameId; private string m_myName; + private EventWaitHandle m_joinGameEvent; + private EventWaitHandle m_startGameEvent; } } diff --git a/console/src/lib/net/Client.cs b/console/src/lib/net/Client.cs index ddc03346..b621963f 100644 --- a/console/src/lib/net/Client.cs +++ b/console/src/lib/net/Client.cs @@ -39,11 +39,11 @@ namespace pokerth_lib { // Connect to the server. // Try IPv6 first. - /*IPAddress[] addresses = new IPAddress[2]; + IPAddress[] addresses = new IPAddress[2]; addresses[0] = IPAddress.Parse(m_settings.ServerSettings.IPv6Address); addresses[1] = IPAddress.Parse(m_settings.ServerSettings.IPv4Address); - m_tcpClient.Connect(addresses, m_settings.ServerSettings.Port);*/ - m_tcpClient.Connect("localhost", 7234); + m_tcpClient.Connect(addresses, m_settings.ServerSettings.Port); + //m_tcpClient.Connect("localhost", 7234); } public void Start() @@ -58,6 +58,31 @@ namespace pokerth_lib SendJoinGame(gameId); } + public bool WaitJoinGame(int timeout) + { + return m_data.JoinGameEvent.WaitOne(timeout); + } + + public bool WaitStartGame() + { + return m_data.StartGameEvent.WaitOne(); + } + + public void MyAction(Hand.Action action, uint bet) + { + NetPacket a = new NetPacketPlayersAction(); + a.Properties.Add( + NetPacket.PropType.GameState, + Convert.ToString((int)m_data.CurHand.CurState)); + a.Properties.Add( + NetPacket.PropType.PlayerAction, + Convert.ToString((int)action)); + a.Properties.Add( + NetPacket.PropType.PlayerBet, + Convert.ToString(bet)); + m_sender.Send(a); + } + public void SetTerminateFlag() { m_sender.SetTerminateFlag(); diff --git a/console/src/lib/net/INetPacketVisitor.cs b/console/src/lib/net/INetPacketVisitor.cs index 6908be00..39facad7 100644 --- a/console/src/lib/net/INetPacketVisitor.cs +++ b/console/src/lib/net/INetPacketVisitor.cs @@ -29,6 +29,8 @@ namespace pokerth_lib void VisitInitAck(NetPacket p); void VisitGameListNew(NetPacket p); void VisitGameListUpdate(NetPacket p); + void VisitGameListPlayerJoined(NetPacket p); + void VisitGameListPlayerLeft(NetPacket p); void VisitRetrievePlayerInfo(NetPacket p); void VisitPlayerInfo(NetPacket p); void VisitCreateGame(NetPacket p); @@ -45,7 +47,9 @@ namespace pokerth_lib void VisitDealFlopCards(NetPacket p); void VisitDealTurnCard(NetPacket p); void VisitDealRiverCard(NetPacket p); + void VisitAllInShowCards(NetPacket p); void VisitEndOfHandShowCards(NetPacket p); void VisitEndOfHandHideCards(NetPacket p); + void VisitError(NetPacket p); } } diff --git a/console/src/lib/net/NetPacket.cs b/console/src/lib/net/NetPacket.cs index 82e60267..afeee147 100644 --- a/console/src/lib/net/NetPacket.cs +++ b/console/src/lib/net/NetPacket.cs @@ -91,6 +91,7 @@ namespace pokerth_lib public enum PropType { + ErrorReason, RequestedVersionMajor, RequestedVersionMinor, PlayerId, @@ -153,7 +154,8 @@ namespace pokerth_lib public enum RecordPropType { - PlayerResult, + PlayerResults, + PlayerCards, } public static NetPacket Create(int type, int size, BinaryReader reader) @@ -171,6 +173,12 @@ namespace pokerth_lib case NetTypeGameListUpdate : tmpPacket = new NetPacketGameListUpdate(size, reader); break; + case NetTypeGameListPlayerJoined : + tmpPacket = new NetPacketGameListPlayerJoined(size, reader); + break; + case NetTypeGameListPlayerLeft : + tmpPacket = new NetPacketGameListPlayerLeft(size, reader); + break; case NetTypeJoinGameAck : tmpPacket = new NetPacketJoinGameAck(size, reader); break; @@ -201,12 +209,18 @@ namespace pokerth_lib case NetTypeDealRiverCard : tmpPacket = new NetPacketDealRiverCard(size, reader); break; + case NetTypeAllInShowCards : + tmpPacket = new NetPacketAllInShowCards(size, reader); + break; case NetTypeEndOfHandShowCards : tmpPacket = new NetPacketEndOfHandShowCards(size, reader); break; case NetTypeEndOfHandHideCards : tmpPacket = new NetPacketEndOfHandHideCards(size, reader); break; + case NetTypeError : + tmpPacket = new NetPacketError(size, reader); + break; default: break; } diff --git a/console/src/lib/net/NetPacketEndOfHandShowCards.cs b/console/src/lib/net/NetPacketEndOfHandShowCards.cs index af8df0b9..167fb576 100644 --- a/console/src/lib/net/NetPacketEndOfHandShowCards.cs +++ b/console/src/lib/net/NetPacketEndOfHandShowCards.cs @@ -72,7 +72,7 @@ namespace pokerth_lib tmpRecordList.Add(tmpList); } - RecordProperties.Add(RecordPropType.PlayerResult, tmpRecordList); + RecordProperties.Add(RecordPropType.PlayerResults, tmpRecordList); } public override void Accept(INetPacketVisitor visitor) diff --git a/console/src/lib/net/NetPacketPlayersAction.cs b/console/src/lib/net/NetPacketPlayersAction.cs index c3fdbc38..2d088454 100644 --- a/console/src/lib/net/NetPacketPlayersAction.cs +++ b/console/src/lib/net/NetPacketPlayersAction.cs @@ -45,7 +45,7 @@ namespace pokerth_lib BinaryWriter w = new BinaryWriter(memStream); w.Write(IPAddress.HostToNetworkOrder((short)Type)); - w.Write(IPAddress.HostToNetworkOrder((short)8)); + w.Write(IPAddress.HostToNetworkOrder((short)12)); w.Write(IPAddress.HostToNetworkOrder((short) Convert.ToUInt16(Properties[PropType.GameState]))); w.Write(IPAddress.HostToNetworkOrder((short) diff --git a/console/src/lib/net/NetParser.cs b/console/src/lib/net/NetParser.cs index 19bdc0c0..5f6aeef4 100644 --- a/console/src/lib/net/NetParser.cs +++ b/console/src/lib/net/NetParser.cs @@ -71,6 +71,26 @@ namespace pokerth_lib m_data.GameList.GetGameInfo(id).CurrentMode = mode; } + public void VisitGameListPlayerJoined(NetPacket p) + { + GameInfo info = m_data.GameList.GetGameInfo( + Convert.ToUInt32(p.Properties[NetPacket.PropType.GameId])); + List playerSlots = info.PlayerSlots; + playerSlots.Add( + Convert.ToUInt32(p.Properties[NetPacket.PropType.PlayerId])); + info.PlayerSlots = playerSlots; + } + + public void VisitGameListPlayerLeft(NetPacket p) + { + GameInfo info = m_data.GameList.GetGameInfo( + Convert.ToUInt32(p.Properties[NetPacket.PropType.GameId])); + List playerSlots = info.PlayerSlots; + playerSlots.Remove( + Convert.ToUInt32(p.Properties[NetPacket.PropType.PlayerId])); + info.PlayerSlots = playerSlots; + } + public void VisitRetrievePlayerInfo(NetPacket p) { throw new NotImplementedException(); @@ -99,6 +119,7 @@ namespace pokerth_lib m_data.MyGameId = Convert.ToUInt32(p.Properties[NetPacket.PropType.GameId]); m_callback.JoinedGame(m_data.GameList.GetGameInfo(m_data.MyGameId).Name); + m_data.JoinGameEvent.Set(); } public void VisitStartEvent(NetPacket p) @@ -146,6 +167,7 @@ namespace pokerth_lib } m_callback.GameStarted(strPlayers); + m_data.StartGameEvent.Set(); } public void VisitHandStart(NetPacket p) @@ -250,10 +272,28 @@ namespace pokerth_lib m_callback.ShowRiverCards(tmpCards); } + public void VisitAllInShowCards(NetPacket p) + { + List> tmpList + = p.RecordProperties[NetPacket.RecordPropType.PlayerCards]; + foreach (Dictionary i in tmpList) + { + uint playerId = Convert.ToUInt32(i[NetPacket.PropType.PlayerId]); + string name = m_data.PlayerList.GetPlayerInfo(playerId).Name; + Player curPlayer = m_data.CurHand.Players[playerId]; + int[] tmpCards = new int[2]; + tmpCards[0] = Convert.ToInt32(i[NetPacket.PropType.FirstCard]); + tmpCards[1] = Convert.ToInt32(i[NetPacket.PropType.SecondCard]); + curPlayer.Cards = tmpCards; + + m_callback.ShowCards(name, tmpCards); + } + } + public void VisitEndOfHandShowCards(NetPacket p) { List> tmpList - = p.RecordProperties[NetPacket.RecordPropType.PlayerResult]; + = p.RecordProperties[NetPacket.RecordPropType.PlayerResults]; foreach (Dictionary i in tmpList) { uint playerId = Convert.ToUInt32(i[NetPacket.PropType.PlayerId]); @@ -299,6 +339,11 @@ namespace pokerth_lib Convert.ToUInt32(p.Properties[NetPacket.PropType.MoneyWon])); } + public void VisitError(NetPacket p) + { + m_callback.Error(p.Properties[NetPacket.PropType.ErrorReason]); + } + private PokerTHData m_data; private SenderThread m_sender; private ICallback m_callback;