diff --git a/docs/net_protocol.txt b/docs/net_protocol.txt index 9fa809e3..f40a4533 100644 --- a/docs/net_protocol.txt +++ b/docs/net_protocol.txt @@ -187,7 +187,7 @@ Server Notification: Player's Action Done 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Message Type = 9 | Message Length = 28 | + | Message Type = 9 | Message Length = 20 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Game State | Player Id | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -197,8 +197,6 @@ Server Notification: Player's Action Done +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Player Money | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Current Hand Bets | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Additional Game States: 0xF0 - Preflop Small Blind (no action requested) diff --git a/src/engine/network_engine/clientboard.cpp b/src/engine/network_engine/clientboard.cpp index be841a83..7c9f5822 100644 --- a/src/engine/network_engine/clientboard.cpp +++ b/src/engine/network_engine/clientboard.cpp @@ -48,6 +48,9 @@ ClientBoard::setHand(HandInterface* br) void ClientBoard::collectSets() { + sets = 0; + int i; + for(i=0; igetMySet(); } void diff --git a/src/net/common/clientstate.cpp b/src/net/common/clientstate.cpp index cfe7a031..e6384fdb 100644 --- a/src/net/common/clientstate.cpp +++ b/src/net/common/clientstate.cpp @@ -624,7 +624,7 @@ ClientStateRunHand::InternalProcess(ClientThread &client, boost::shared_ptrsetMyAction(actionDoneData.playerAction); tmpPlayer->setMySetAbsolute(actionDoneData.totalPlayerBet); tmpPlayer->setMyCash(actionDoneData.playerMoney); - curGame->getCurrentHand()->getBoard()->setSets(actionDoneData.curHandBets); + curGame->getCurrentHand()->getBoard()->collectSets(); // Update highest set if (tmpPlayer->getMySet() > GetHighestSet(*curGame)) diff --git a/src/net/common/netpacket.cpp b/src/net/common/netpacket.cpp index 3e887126..5606d149 100644 --- a/src/net/common/netpacket.cpp +++ b/src/net/common/netpacket.cpp @@ -163,7 +163,6 @@ struct GCC_PACKED NetPacketPlayersActionDoneData u_int16_t reserved; u_int32_t totalPlayerBet; u_int32_t playerMoney; - u_int32_t curHandBets; }; struct GCC_PACKED NetPacketPlayersActionRejectedData @@ -1238,7 +1237,6 @@ NetPacketPlayersActionDone::SetData(const NetPacketPlayersActionDone::Data &inDa tmpData->playerAction = htons(inData.playerAction); tmpData->totalPlayerBet = htonl(inData.totalPlayerBet); tmpData->playerMoney = htonl(inData.playerMoney); - tmpData->curHandBets = htonl(inData.curHandBets); } void @@ -1252,7 +1250,6 @@ NetPacketPlayersActionDone::GetData(NetPacketPlayersActionDone::Data &outData) c outData.playerAction = static_cast(ntohs(tmpData->playerAction)); outData.totalPlayerBet = ntohl(tmpData->totalPlayerBet); outData.playerMoney = ntohl(tmpData->playerMoney); - outData.curHandBets = ntohl(tmpData->curHandBets); } const NetPacketPlayersActionDone * diff --git a/src/net/common/serverrecvstate.cpp b/src/net/common/serverrecvstate.cpp index e8aaf618..ef62024f 100644 --- a/src/net/common/serverrecvstate.cpp +++ b/src/net/common/serverrecvstate.cpp @@ -180,6 +180,23 @@ ServerRecvStateReceiving::Process(ServerRecvThread &server) //----------------------------------------------------------------------------- +ServerRecvStateTimer::ServerRecvStateTimer() +{ +} + +ServerRecvStateTimer::~ServerRecvStateTimer() +{ +} + +void +ServerRecvStateTimer::Init() +{ + m_timer.reset(); + m_timer.start(); +} + +//----------------------------------------------------------------------------- + ServerRecvStateInit & ServerRecvStateInit::Instance() { @@ -436,7 +453,6 @@ ServerRecvStateStartHand::Process(ServerRecvThread &server) actionDoneData.playerAction = (PlayerAction)playerArray[i]->getMyAction(); actionDoneData.totalPlayerBet = playerArray[i]->getMySet(); actionDoneData.playerMoney = playerArray[i]->getMyCash(); - actionDoneData.curHandBets = playerArray[i]->getMySet(); // first bet only static_cast(notifySmallBlind.get())->SetData(actionDoneData); server.SendToAllPlayers(notifySmallBlind); break; @@ -453,7 +469,6 @@ ServerRecvStateStartHand::Process(ServerRecvThread &server) actionDoneData.playerAction = (PlayerAction)playerArray[i]->getMyAction(); actionDoneData.totalPlayerBet = playerArray[i]->getMySet(); actionDoneData.playerMoney = playerArray[i]->getMyCash(); - actionDoneData.curHandBets = curGame.getCurrentHand()->getBoard()->getSets(); static_cast(notifyBigBlind.get())->SetData(actionDoneData); server.SendToAllPlayers(notifyBigBlind); break; @@ -530,9 +545,6 @@ ServerRecvStateStartRound::Process(ServerRecvThread &server) server.SendToAllPlayers(allIn); curGame.getCurrentHand()->setCardsShown(true); - boost::microsec_timer delayTimer; - delayTimer.start(); - ServerRecvStateShowCardsDelay::Instance().SetTimer(delayTimer); server.SetState(ServerRecvStateShowCardsDelay::Instance()); retVal = MSG_NET_GAME_SERVER_CARDS_DELAY; } @@ -540,9 +552,6 @@ ServerRecvStateStartRound::Process(ServerRecvThread &server) { SendNewRoundCards(server, curGame, newRound); - boost::microsec_timer delayTimer; - delayTimer.start(); - ServerRecvStateDealCardsDelay::Instance().SetTimer(delayTimer); server.SetState(ServerRecvStateDealCardsDelay::Instance()); retVal = MSG_NET_GAME_SERVER_CARDS_DELAY; } @@ -636,9 +645,6 @@ ServerRecvStateStartRound::Process(ServerRecvThread &server) server.SetState(ServerRecvStateFinal::Instance()); // TODO else { - boost::microsec_timer delayTimer; - delayTimer.start(); - ServerRecvStateNextHand::Instance().SetTimer(delayTimer); server.SetState(ServerRecvStateNextHand::Instance()); retVal = MSG_NET_GAME_SERVER_HAND_END; } @@ -777,7 +783,6 @@ ServerRecvStateWaitPlayerAction::PerformPlayerAction(ServerRecvThread &server, P actionDoneData.playerAction = static_cast(player->getMyAction()); actionDoneData.totalPlayerBet = player->getMySet(); actionDoneData.playerMoney = player->getMyCash(); - actionDoneData.curHandBets = curGame.getCurrentHand()->getBoard()->getSets(); static_cast(notifyActionDone.get())->SetData(actionDoneData); server.SendToAllPlayers(notifyActionDone); } @@ -849,12 +854,6 @@ ServerRecvStateDealCardsDelay::~ServerRecvStateDealCardsDelay() { } -void -ServerRecvStateDealCardsDelay::SetTimer(const boost::microsec_timer &timer) -{ - m_delayTimer = timer; -} - int ServerRecvStateDealCardsDelay::Process(ServerRecvThread &server) { @@ -863,24 +862,23 @@ ServerRecvStateDealCardsDelay::Process(ServerRecvThread &server) Game &curGame = server.GetGame(); int allInDelay = curGame.getCurrentHand()->getAllInCondition() ? SERVER_DEAL_ADD_ALL_IN_DELAY_SEC : 0; + int delay = 0; switch(curGame.getCurrentHand()->getActualRound()) { case GAME_STATE_FLOP: - if (m_delayTimer.elapsed().seconds() >= SERVER_DEAL_FLOP_CARDS_DELAY_SEC + allInDelay) - server.SetState(ServerRecvStateStartRound::Instance()); + delay = SERVER_DEAL_FLOP_CARDS_DELAY_SEC + allInDelay; break; case GAME_STATE_TURN: - if (m_delayTimer.elapsed().seconds() >= SERVER_DEAL_TURN_CARD_DELAY_SEC) - server.SetState(ServerRecvStateStartRound::Instance()); + delay = SERVER_DEAL_TURN_CARD_DELAY_SEC; break; case GAME_STATE_RIVER: - if (m_delayTimer.elapsed().seconds() >= SERVER_DEAL_RIVER_CARD_DELAY_SEC) - server.SetState(ServerRecvStateStartRound::Instance()); + delay = SERVER_DEAL_RIVER_CARD_DELAY_SEC; break; - default: - server.SetState(ServerRecvStateStartRound::Instance()); } + if (!delay || GetTimer().elapsed().seconds() >= delay) + server.SetState(ServerRecvStateStartRound::Instance()); + return retVal; } @@ -907,12 +905,6 @@ ServerRecvStateShowCardsDelay::~ServerRecvStateShowCardsDelay() { } -void -ServerRecvStateShowCardsDelay::SetTimer(const boost::microsec_timer &timer) -{ - m_delayTimer = timer; -} - int ServerRecvStateShowCardsDelay::Process(ServerRecvThread &server) { @@ -920,13 +912,10 @@ ServerRecvStateShowCardsDelay::Process(ServerRecvThread &server) Game &curGame = server.GetGame(); - if (m_delayTimer.elapsed().seconds() >= SERVER_SHOW_CARDS_DELAY_SEC) + if (GetTimer().elapsed().seconds() >= SERVER_SHOW_CARDS_DELAY_SEC) { SendNewRoundCards(server, curGame, curGame.getCurrentHand()->getActualRound()); - boost::microsec_timer delayTimer; - delayTimer.start(); - ServerRecvStateDealCardsDelay::Instance().SetTimer(delayTimer); server.SetState(ServerRecvStateDealCardsDelay::Instance()); retVal = MSG_NET_GAME_SERVER_CARDS_DELAY; } @@ -957,18 +946,12 @@ ServerRecvStateNextHand::~ServerRecvStateNextHand() { } -void -ServerRecvStateNextHand::SetTimer(const boost::microsec_timer &timer) -{ - m_delayTimer = timer; -} - int ServerRecvStateNextHand::Process(ServerRecvThread &server) { int retVal = ServerRecvStateReceiving::Process(server); - if (m_delayTimer.elapsed().seconds() >= SERVER_DELAY_NEXT_HAND_SEC) + if (GetTimer().elapsed().seconds() >= SERVER_DELAY_NEXT_HAND_SEC) server.SetState(ServerRecvStateStartHand::Instance()); return retVal; diff --git a/src/net/common/serverrecvthread.cpp b/src/net/common/serverrecvthread.cpp index ae9f5cbb..15df7e3f 100644 --- a/src/net/common/serverrecvthread.cpp +++ b/src/net/common/serverrecvthread.cpp @@ -601,6 +601,7 @@ ServerRecvThread::GetState() void ServerRecvThread::SetState(ServerRecvState &newState) { + newState.Init(); m_curState = &newState; } diff --git a/src/net/netpacket.h b/src/net/netpacket.h index 47d90178..bcea081e 100644 --- a/src/net/netpacket.h +++ b/src/net/netpacket.h @@ -316,7 +316,6 @@ public: PlayerAction playerAction; u_int32_t totalPlayerBet; u_int32_t playerMoney; - u_int32_t curHandBets; }; NetPacketPlayersActionDone(); diff --git a/src/net/serverrecvstate.h b/src/net/serverrecvstate.h index 98b1e19c..ebd516d1 100644 --- a/src/net/serverrecvstate.h +++ b/src/net/serverrecvstate.h @@ -41,6 +41,9 @@ class ServerRecvState public: virtual ~ServerRecvState(); + // Initialize after switching to this state. + virtual void Init() = 0; + // Handling of a new TCP connection. virtual void HandleNewConnection(ServerRecvThread &server, boost::shared_ptr connData) = 0; @@ -65,28 +68,22 @@ protected: virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr packet) = 0; }; -// State: Initialization. -class ServerRecvStateInit : public ServerRecvStateReceiving +// Abstract State: Timer. +class ServerRecvStateTimer : virtual public ServerRecvState { public: - // Access the state singleton. - static ServerRecvStateInit &Instance(); + virtual ~ServerRecvStateTimer(); - virtual ~ServerRecvStateInit(); + virtual void Init(); - // - virtual void HandleNewConnection(ServerRecvThread &server, boost::shared_ptr data); + const boost::microsec_timer &GetTimer() const {return m_timer;} protected: - // Protected constructor - this is a singleton. - ServerRecvStateInit(); - - virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr packet); + ServerRecvStateTimer(); private: - - u_int16_t m_curUniquePlayerId; + boost::microsec_timer m_timer; }; // Abstract State: Game is running. @@ -103,6 +100,31 @@ protected: ServerRecvStateRunning(); }; +// State: Initialization. +class ServerRecvStateInit : public ServerRecvStateReceiving +{ +public: + // Access the state singleton. + static ServerRecvStateInit &Instance(); + + virtual ~ServerRecvStateInit(); + + virtual void Init() {} + // + virtual void HandleNewConnection(ServerRecvThread &server, boost::shared_ptr data); + +protected: + + // Protected constructor - this is a singleton. + ServerRecvStateInit(); + + virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr packet); + +private: + + u_int16_t m_curUniquePlayerId; +}; + // State: Start server game. class ServerRecvStateStartGame : public ServerRecvStateRunning { @@ -112,6 +134,8 @@ public: virtual ~ServerRecvStateStartGame(); + virtual void Init() {} + // virtual int Process(ServerRecvThread &server); @@ -130,6 +154,8 @@ public: virtual ~ServerRecvStateStartHand(); + virtual void Init() {} + // virtual int Process(ServerRecvThread &server); @@ -148,6 +174,8 @@ public: virtual ~ServerRecvStateStartRound(); + virtual void Init() {} + // virtual int Process(ServerRecvThread &server); @@ -161,7 +189,7 @@ protected: }; // State: Wait for a player action. -class ServerRecvStateWaitPlayerAction : public ServerRecvStateReceiving, public ServerRecvStateRunning +class ServerRecvStateWaitPlayerAction : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer { public: // Access the state singleton. @@ -185,7 +213,7 @@ protected: }; // State: Delay after dealing cards -class ServerRecvStateDealCardsDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning +class ServerRecvStateDealCardsDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer { public: // Access the state singleton. @@ -196,22 +224,16 @@ public: // Overwrite default processing virtual int Process(ServerRecvThread &server); - void SetTimer(const boost::microsec_timer &timer); - protected: // Protected constructor - this is a singleton. ServerRecvStateDealCardsDelay(); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr packet); - -private: - - boost::microsec_timer m_delayTimer; }; // State: Delay after showing cards (all in) -class ServerRecvStateShowCardsDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning +class ServerRecvStateShowCardsDelay : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer { public: // Access the state singleton. @@ -222,22 +244,16 @@ public: // Overwrite default processing virtual int Process(ServerRecvThread &server); - void SetTimer(const boost::microsec_timer &timer); - protected: // Protected constructor - this is a singleton. ServerRecvStateShowCardsDelay(); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr packet); - -private: - - boost::microsec_timer m_delayTimer; }; // State: Delay before next hand. -class ServerRecvStateNextHand : public ServerRecvStateReceiving, public ServerRecvStateRunning +class ServerRecvStateNextHand : public ServerRecvStateReceiving, public ServerRecvStateRunning, public ServerRecvStateTimer { public: // Access the state singleton. @@ -248,18 +264,12 @@ public: // Overwrite default processing virtual int Process(ServerRecvThread &server); - void SetTimer(const boost::microsec_timer &timer); - protected: // Protected constructor - this is a singleton. ServerRecvStateNextHand(); virtual int InternalProcess(ServerRecvThread &server, SessionWrapper session, boost::shared_ptr packet); - -private: - - boost::microsec_timer m_delayTimer; }; @@ -272,6 +282,8 @@ public: virtual ~ServerRecvStateFinal(); + virtual void Init() {} + protected: // Protected constructor - this is a singleton.