2007-01-13 02:40:33 +00:00
/***************************************************************************
* Copyright (C) 2006 by FThauer FHammer *
* f.thauer@web.de *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "localhand.h"
2007-05-15 20:37:37 +00:00
#include "tools.h"
#include "cardsvalue.h"
2007-04-17 07:28:32 +00:00
#include <game_defs.h>
2007-10-23 21:26:07 +00:00
#include <core/loghelper.h>
2007-01-13 02:40:33 +00:00
2007-10-14 11:01:44 +00:00
#include "localexception.h"
#include "engine_msg.h"
2007-06-07 19:37:35 +00:00
#include <iostream>
2007-01-13 02:40:33 +00:00
using namespace std ;
2007-10-19 14:03:12 +00:00
LocalHand :: LocalHand ( boost :: shared_ptr < EngineFactory > f , GuiInterface * g , BoardInterface * b , PlayerList sl , PlayerList apl , PlayerList rpl , int id , int sP , unsigned dP , int sB , int sC )
2007-10-19 20:43:53 +00:00
: myFactory ( f ), myGui ( g ), myBoard ( b ), seatsList ( sl ), activePlayerList ( apl ), runningPlayerList ( rpl ), myBeRo ( 0 ), myID ( id ), startQuantityPlayers ( sP ), dealerPosition ( dP ), currentRound ( 0 ), smallBlind ( sB ), startCash ( sC ), lastPlayersTurn ( - 1 ), allInCondition ( false ),
2007-06-06 21:16:52 +00:00
cardsShown ( false ), bettingRoundsPlayed ( 0 )
2007-01-13 02:40:33 +00:00
{
2007-01-28 00:17:49 +00:00
2007-03-05 23:25:34 +00:00
int i , j , k ;
2007-09-27 00:37:01 +00:00
PlayerListIterator it ;
2007-03-29 22:58:04 +00:00
2007-01-13 02:40:33 +00:00
CardsValue myCardsValue ;
myBoard -> setHand ( this );
2007-09-27 00:37:01 +00:00
for ( it = seatsList -> begin (); it != seatsList -> end (); it ++ ) {
( * it ) -> setHand ( this );
2007-10-19 14:03:12 +00:00
// set myFlipCards 0
2007-09-27 00:37:01 +00:00
( * it ) -> setMyCardsFlip ( 0 , 0 );
2007-03-05 23:25:34 +00:00
}
2007-01-13 02:40:33 +00:00
2007-10-19 14:03:12 +00:00
// generate cards and assign to board and player
2007-09-24 21:09:36 +00:00
int * cardsArray = new int [ 2 * activePlayerList -> size () + 5 ];
Tools :: getRandNumber ( 0 , 51 , 2 * activePlayerList -> size () + 5 , cardsArray , 1 );
2007-01-13 02:40:33 +00:00
int tempBoardArray [ 5 ];
int tempPlayerArray [ 2 ];
int tempPlayerAndBoardArray [ 7 ];
2007-09-24 10:02:17 +00:00
int bestHandPos [ 5 ];
2007-03-30 12:44:16 +00:00
int sBluff ;
2007-01-13 02:40:33 +00:00
for ( i = 0 ; i < 5 ; i ++ ) {
tempBoardArray [ i ] = cardsArray [ i ];
tempPlayerAndBoardArray [ i + 2 ] = cardsArray [ i ];
}
2007-04-03 10:55:16 +00:00
2007-03-05 23:25:34 +00:00
k = 0 ;
2007-01-13 02:40:33 +00:00
myBoard -> setMyCards ( tempBoardArray );
2007-09-27 14:17:07 +00:00
for ( it = activePlayerList -> begin (); it != activePlayerList -> end (); it ++ , k ++ ) {
2007-06-11 17:48:22 +00:00
2007-09-27 14:17:07 +00:00
( * it ) -> getMyBestHandPosition ( bestHandPos );
2007-06-11 17:48:22 +00:00
2007-09-24 10:02:17 +00:00
for ( j = 0 ; j < 2 ; j ++ ) {
tempPlayerArray [ j ] = cardsArray [ 2 * k + j + 5 ];
tempPlayerAndBoardArray [ j ] = cardsArray [ 2 * k + j + 5 ];
}
2007-09-27 14:17:07 +00:00
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , bestHandPos ));
( * it ) -> setMyBestHandPosition ( bestHandPos );
( * it ) -> setMyRoundStartCash (( * it ) -> getMyCash ());
2007-09-24 10:02:17 +00:00
2007-10-19 14:03:12 +00:00
// error-check
2007-09-24 10:02:17 +00:00
for ( j = 0 ; j < 5 ; j ++ ) {
if ( bestHandPos [ j ] == - 1 ) {
2007-10-23 21:26:07 +00:00
LOG_ERROR ( __FILE__ << " (" << __LINE__ << "): ERROR getMyBestHandPosition" );
2007-01-28 00:17:49 +00:00
}
2007-09-24 10:02:17 +00:00
}
2007-03-30 12:44:16 +00:00
2007-10-19 14:03:12 +00:00
// set sBluff for all players --> TODO for ai-player in internet
2007-09-27 14:17:07 +00:00
if (( * it ) -> getMyID () != 0 ) {
2007-09-24 10:02:17 +00:00
Tools :: getRandNumber ( 1 , 100 , 1 , & sBluff , 0 );
2007-09-27 14:17:07 +00:00
( * it ) -> setSBluff ( sBluff );
( * it ) -> setSBluffStatus ( 0 );
2007-01-28 00:17:49 +00:00
}
2007-01-13 02:40:33 +00:00
}
2007-09-24 10:02:17 +00:00
2007-05-12 22:00:59 +00:00
delete [] cardsArray ;
2007-09-24 10:02:17 +00:00
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!! DEBUGGER !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //
2007-04-30 11:53:40 +00:00
2007-08-24 15:15:01 +00:00
if ( DEBUG_MODE ) {
2010-05-29 14:05:41 +00:00
//QSqlDatabase *mySqliteLogDb;
// myGui->getMyW()->getSession();
//QSqlDatabase * test = myGui->getMyLog()->getMySqliteLogDb();
// if(!mySqliteLogDb->open()) {
// QMessageBox::critical(0, tr("ERROR"),mySqliteLogDb->lastError().text().toUtf8().data(), QMessageBox::Cancel);
// }
2007-09-27 20:36:02 +00:00
int temp5Array [ 5 ];
2007-09-01 16:32:36 +00:00
switch ( myID ) {
2007-09-27 20:36:02 +00:00
case 1 : {
2010-07-22 06:03:11 +00:00
tempBoardArray [ 0 ] = 39 ;
tempBoardArray [ 1 ] = 2 ;
tempBoardArray [ 2 ] = 3 ;
tempBoardArray [ 3 ] = 4 ;
tempBoardArray [ 4 ] = 5 ;
2007-09-27 20:36:02 +00:00
myBoard -> setMyCards ( tempBoardArray );
tempPlayerAndBoardArray [ 2 ] = tempBoardArray [ 0 ];
tempPlayerAndBoardArray [ 3 ] = tempBoardArray [ 1 ];
tempPlayerAndBoardArray [ 4 ] = tempBoardArray [ 2 ];
tempPlayerAndBoardArray [ 5 ] = tempBoardArray [ 3 ];
2007-09-29 17:08:05 +00:00
tempPlayerAndBoardArray [ 6 ] = tempBoardArray [ 4 ];
2007-09-27 20:36:02 +00:00
// player0
it = seatsList -> begin ();
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 13 ;
tempPlayerArray [ 1 ] = 14 ;
2007-10-05 12:04:38 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-28 15:04:52 +00:00
// player1
it ++ ;
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 18 ;
tempPlayerArray [ 1 ] = 17 ;
2007-09-28 15:04:52 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
2009-04-12 18:59:35 +00:00
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-01 16:32:36 +00:00
2007-09-03 15:59:55 +00:00
// player2
2007-09-27 20:36:02 +00:00
it ++ ;
2007-09-03 15:59:55 +00:00
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 26 ;
tempPlayerArray [ 1 ] = 27 ;
2007-09-29 17:08:05 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-27 20:36:02 +00:00
// player3
it ++ ;
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 31 ;
tempPlayerArray [ 1 ] = 30 ;
2010-01-02 18:10:36 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-23 17:07:52 +00:00
2007-09-28 15:04:52 +00:00
// player4
it ++ ;
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 50 ;
tempPlayerArray [ 1 ] = 51 ;
2007-10-05 12:04:38 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-28 15:04:52 +00:00
// player5
it ++ ;
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 25 ;
tempPlayerArray [ 1 ] = 24 ;
2010-01-02 18:10:36 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-28 15:04:52 +00:00
2007-09-29 17:08:05 +00:00
// player6
it ++ ;
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 38 ;
tempPlayerArray [ 1 ] = 37 ;
2009-01-15 22:11:45 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-29 17:08:05 +00:00
2010-01-02 18:10:36 +00:00
// player7
it ++ ;
2010-07-22 06:03:11 +00:00
tempPlayerArray [ 0 ] = 32 ;
tempPlayerArray [ 1 ] = 33 ;
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
// player8
it ++ ;
tempPlayerArray [ 0 ] = 19 ;
tempPlayerArray [ 1 ] = 20 ;
2010-01-02 18:10:36 +00:00
tempPlayerAndBoardArray [ 0 ] = tempPlayerArray [ 0 ];
tempPlayerAndBoardArray [ 1 ] = tempPlayerArray [ 1 ];
( * it ) -> setMyCards ( tempPlayerArray );
( * it ) -> setMyCardsValueInt ( myCardsValue . cardsValue ( tempPlayerAndBoardArray , temp5Array ));
( * it ) -> setMyBestHandPosition ( temp5Array );
2007-09-23 17:07:52 +00:00
2007-09-02 19:20:49 +00:00
} break ;
case 2 : {
2007-09-28 15:04:52 +00:00
/* tempBoardArray[0] = 48;
2007-09-28 00:16:11 +00:00
tempBoardArray[1] = 21;
tempBoardArray[2] = 4;
tempBoardArray[3] = 9;
tempBoardArray[4] = 0;
2007-09-02 19:20:49 +00:00
2007-09-27 20:36:02 +00:00
myBoard->setMyCards(tempBoardArray);
tempPlayerAndBoardArray[2] = tempBoardArray[0];
tempPlayerAndBoardArray[3] = tempBoardArray[1];
tempPlayerAndBoardArray[4] = tempBoardArray[2];
tempPlayerAndBoardArray[5] = tempBoardArray[3];
2007-09-28 15:04:52 +00:00
tempPlayerAndBoardArray[6] = tempBoardArray[4];*/
2007-09-27 20:36:02 +00:00
// player0
it = seatsList -> begin ();
2007-09-28 00:16:11 +00:00
// tempPlayerArray[0] = 9;
// tempPlayerArray[1] = 5;
// tempPlayerAndBoardArray[0] = tempPlayerArray[0];
// tempPlayerAndBoardArray[1] = tempPlayerArray[1];
//
// (*it)->setMyCards(tempPlayerArray);
// (*it)->setMyCardsValueInt(myCardsValue.cardsValue(tempPlayerAndBoardArray,temp5Array));
//
// (*it)->setMyBestHandPosition(temp5Array);
2007-09-27 20:36:02 +00:00
// player1
it ++ ;
2007-09-28 15:04:52 +00:00
// tempPlayerArray[0] = 47;
// tempPlayerArray[1] = 22;
// tempPlayerAndBoardArray[0] = tempPlayerArray[0];
// tempPlayerAndBoardArray[1] = tempPlayerArray[1];
//
// (*it)->setMyCards(tempPlayerArray);
// (*it)->setMyCardsValueInt(myCardsValue.cardsValue(tempPlayerAndBoardArray,temp5Array));
//
// (*it)->setMyBestHandPosition(temp5Array);
2007-09-27 20:36:02 +00:00
// player2
it ++ ;
2007-09-28 00:16:11 +00:00
// tempPlayerArray[0] = 33;
// tempPlayerArray[1] = 27;
// tempPlayerAndBoardArray[0] = tempPlayerArray[0];
// tempPlayerAndBoardArray[1] = tempPlayerArray[1];
//
// (*it)->setMyCards(tempPlayerArray);
// (*it)->setMyCardsValueInt(myCardsValue.cardsValue(tempPlayerAndBoardArray,temp5Array));
//
// (*it)->setMyBestHandPosition(temp5Array);
2007-09-27 20:36:02 +00:00
// player3
it ++ ;
// tempPlayerArray[0] = 38;
// tempPlayerArray[1] = 22;
2007-09-02 19:20:49 +00:00
// tempPlayerAndBoardArray[0] = tempPlayerArray[0];
// tempPlayerAndBoardArray[1] = tempPlayerArray[1];
//
2007-09-27 20:36:02 +00:00
// (*it)->setMyCards(tempPlayerArray);
// (*it)->setMyCardsValueInt(myCardsValue.cardsValue(tempPlayerAndBoardArray,temp5Array));
2007-09-02 19:20:49 +00:00
//
2007-09-27 20:36:02 +00:00
// (*it)->setMyBestHandPosition(temp5Array);
// player4
it ++ ;
// tempPlayerArray[0] = 25;
// tempPlayerArray[1] = 16;
2007-09-02 19:20:49 +00:00
// tempPlayerAndBoardArray[0] = tempPlayerArray[0];
// tempPlayerAndBoardArray[1] = tempPlayerArray[1];
//
2007-09-27 20:36:02 +00:00
// (*it)->setMyCards(tempPlayerArray);
// (*it)->setMyCardsValueInt(myCardsValue.cardsValue(tempPlayerAndBoardArray,temp5Array));
2007-09-01 16:32:36 +00:00
//
2007-09-27 20:36:02 +00:00
// (*it)->setMyBestHandPosition(temp5Array);
2007-09-28 00:16:11 +00:00
// player5
it ++ ;
2007-09-28 15:04:52 +00:00
// tempPlayerArray[0] = 27;
// tempPlayerArray[1] = 10;
// tempPlayerAndBoardArray[0] = tempPlayerArray[0];
// tempPlayerAndBoardArray[1] = tempPlayerArray[1];
//
// (*it)->setMyCards(tempPlayerArray);
// (*it)->setMyCardsValueInt(myCardsValue.cardsValue(tempPlayerAndBoardArray,temp5Array));
//
// (*it)->setMyBestHandPosition(temp5Array);
2007-09-01 16:32:36 +00:00
} break ;
default : {}
2007-08-24 15:15:01 +00:00
2007-08-25 20:09:40 +00:00
}
2007-08-11 14:36:20 +00:00
2007-09-01 16:32:36 +00:00
2007-08-11 14:36:20 +00:00
}
2007-08-10 18:44:41 +00:00
// ----------------------------------------
2007-04-30 11:53:40 +00:00
2007-10-19 14:03:12 +00:00
// determine dealer, SB, BB
2007-05-12 22:00:59 +00:00
assignButtons ();
2007-01-13 02:40:33 +00:00
2007-09-24 10:02:17 +00:00
myBeRo = myFactory -> createBeRo ( this , myID , dealerPosition , smallBlind );
2007-01-13 02:40:33 +00:00
}
LocalHand ::~ LocalHand ()
{
}
2007-05-12 22:00:59 +00:00
void LocalHand :: start () {
2007-10-03 22:42:24 +00:00
//Log blinds sets for new Hand
PlayerListConstIterator it_sB , it_bB ;
it_sB = getActivePlayerIt ( getCurrentBeRo () -> getSmallBlindPositionId ());
it_bB = getActivePlayerIt ( getCurrentBeRo () -> getBigBlindPositionId ());
if ( it_sB != getActivePlayerList () -> end () && it_bB != getActivePlayerList () -> end ()) {
2010-05-29 14:05:41 +00:00
myGui -> logNewBlindsSetsMsg (( * it_sB ) -> getMySet (), ( * it_bB ) -> getMySet (), ( * it_sB ) -> getMyName (). c_str (), ( * it_bB ) -> getMyName (). c_str ());
2007-10-03 22:42:24 +00:00
}
2007-10-23 21:26:07 +00:00
else { LOG_ERROR ( __FILE__ << " (" << __LINE__ << "): Log Error: cannot find sBID or bBID" ); }
2007-10-03 22:42:24 +00:00
myGui -> flushLogAtHand ();
2007-05-12 22:00:59 +00:00
2007-10-19 14:03:12 +00:00
// deal cards
2007-05-12 22:00:59 +00:00
myGui -> dealHoleCards ();
getBoard () -> collectSets ();
getGuiInterface () -> refreshPot ();
2007-10-19 14:03:12 +00:00
// change rounds | first start preflop
2007-05-12 22:00:59 +00:00
myGui -> nextPlayerAnimation ();
}
2007-01-13 02:40:33 +00:00
void LocalHand :: assignButtons () {
2007-09-27 09:47:02 +00:00
size_t i ;
2007-09-27 00:37:01 +00:00
PlayerListIterator it ;
2007-09-26 10:13:10 +00:00
PlayerListConstIterator it_c ;
2007-05-18 11:38:37 +00:00
2007-10-19 14:03:12 +00:00
// delete all buttons
2007-09-27 00:37:01 +00:00
for ( it = seatsList -> begin (); it != seatsList -> end (); it ++ ) {
( * it ) -> setMyButton ( BUTTON_NONE );
}
2007-01-13 02:40:33 +00:00
2007-10-19 14:03:12 +00:00
// assign dealer button
2007-09-27 00:37:01 +00:00
it = getSeatIt ( dealerPosition );
2007-10-14 11:01:44 +00:00
if ( it == seatsList -> end ()) {
2007-10-18 20:36:49 +00:00
throw LocalException ( __FILE__ , __LINE__ , ERR_SEAT_NOT_FOUND );
2007-10-14 11:01:44 +00:00
}
2007-09-27 00:37:01 +00:00
( * it ) -> setMyButton ( BUTTON_DEALER );
2007-01-13 02:40:33 +00:00
2007-09-27 00:37:01 +00:00
// assign Small Blind next to dealer. ATTENTION: in heads up it is big blind
// assign big blind next to small blind. ATTENTION: in heads up it is small blind
bool nextActivePlayerFound = false ;
PlayerListIterator dealerPositionIt = getSeatIt ( dealerPosition );
2007-10-14 11:01:44 +00:00
if ( dealerPositionIt == seatsList -> end ()) {
2007-10-18 20:36:49 +00:00
throw LocalException ( __FILE__ , __LINE__ , ERR_SEAT_NOT_FOUND );
2007-10-14 11:01:44 +00:00
}
2007-09-27 00:37:01 +00:00
for ( i = 0 ; i < seatsList -> size (); i ++ ) {
dealerPositionIt ++ ;
if ( dealerPositionIt == seatsList -> end ()) dealerPositionIt = seatsList -> begin ();
it = getActivePlayerIt ( ( * dealerPositionIt ) -> getMyUniqueID () );
if ( it != activePlayerList -> end () ) {
nextActivePlayerFound = true ;
2010-07-22 06:03:11 +00:00
if ( activePlayerList -> size () > 2 ) {
//small blind normal
( * it ) -> setMyButton ( 2 );
} else {
//big blind in heads up
( * it ) -> setMyButton ( 3 );
// lastPlayerAction for showing cards
// getCurrentBeRo()->setLastActionPlayer((*it)->getMyUniqueID());
}
2007-09-27 00:37:01 +00:00
it ++ ;
if ( it == activePlayerList -> end ()) it = activePlayerList -> begin ();
2010-07-22 06:03:11 +00:00
if ( activePlayerList -> size () > 2 ) {
//big blind normal
( * it ) -> setMyButton ( 3 );
// lastPlayerAction for showing cards
// getCurrentBeRo()->setLastActionPlayer((*it)->getMyUniqueID());
} else {
//small blind in heads up
( * it ) -> setMyButton ( 2 );
}
2007-09-27 00:37:01 +00:00
break ;
2007-05-18 11:38:37 +00:00
}
2007-09-27 00:37:01 +00:00
2007-08-08 12:54:20 +00:00
}
2007-10-14 11:01:44 +00:00
if ( ! nextActivePlayerFound ) {
2007-10-18 20:36:49 +00:00
throw LocalException ( __FILE__ , __LINE__ , ERR_NEXT_ACTIVE_PLAYER_NOT_FOUND );
2007-10-14 11:01:44 +00:00
}
2007-09-27 00:37:01 +00:00
2007-09-25 12:43:58 +00:00
//do sets --> TODO switch?
2007-09-26 10:13:10 +00:00
for ( it_c = runningPlayerList -> begin (); it_c != runningPlayerList -> end (); it_c ++ ) {
2007-05-18 11:38:37 +00:00
//small blind
2007-09-27 09:47:02 +00:00
if (( * it_c ) -> getMyButton () == BUTTON_SMALL_BLIND ) {
2007-01-13 02:40:33 +00:00
2007-09-24 10:02:17 +00:00
// All in ?
2007-09-26 10:13:10 +00:00
if (( * it_c ) -> getMyCash () <= smallBlind ) {
2007-09-24 10:02:17 +00:00
2007-09-26 10:13:10 +00:00
( * it_c ) -> setMySet (( * it_c ) -> getMyCash ());
2007-06-05 21:20:32 +00:00
// 1 to do not log this
2007-09-27 09:47:02 +00:00
( * it_c ) -> setMyAction ( PLAYER_ACTION_ALLIN , 1 );
2007-01-13 02:40:33 +00:00
}
2007-09-25 12:43:58 +00:00
else {
2007-09-26 10:13:10 +00:00
( * it_c ) -> setMySet ( smallBlind );
2007-01-13 02:40:33 +00:00
}
}
2007-06-08 19:37:21 +00:00
2007-09-26 10:13:10 +00:00
//big blind
2007-09-27 09:47:02 +00:00
if (( * it_c ) -> getMyButton () == BUTTON_BIG_BLIND ) {
2007-09-26 10:13:10 +00:00
// all in ?
if (( * it_c ) -> getMyCash () <= 2 * smallBlind ) {
( * it_c ) -> setMySet (( * it_c ) -> getMyCash ());
// 1 to do not log this
2007-09-27 09:47:02 +00:00
( * it_c ) -> setMyAction ( PLAYER_ACTION_ALLIN , 1 );
2007-09-26 10:13:10 +00:00
}
else {
( * it_c ) -> setMySet ( 2 * smallBlind );
}
}
2007-05-18 11:38:37 +00:00
}
2007-01-13 02:40:33 +00:00
}
void LocalHand :: switchRounds () {
2007-09-26 22:27:05 +00:00
PlayerListIterator it , it_1 ;
2007-09-26 10:13:10 +00:00
PlayerListConstIterator it_c ;
2007-01-13 02:40:33 +00:00
2007-09-25 09:52:58 +00:00
// refresh runningPlayerList
2007-09-25 12:43:58 +00:00
for ( it = runningPlayerList -> begin (); it != runningPlayerList -> end (); ) {
2007-09-27 09:47:02 +00:00
if (( * it ) -> getMyAction () == PLAYER_ACTION_FOLD || ( * it ) -> getMyAction () == PLAYER_ACTION_ALLIN ) {
2007-09-29 13:22:00 +00:00
2007-09-25 09:52:58 +00:00
it = runningPlayerList -> erase ( it );
2007-09-26 22:27:05 +00:00
if ( ! ( runningPlayerList -> empty ())) {
it_1 = it ;
if ( it_1 == runningPlayerList -> begin ()) it_1 = runningPlayerList -> end ();
it_1 -- ;
getCurrentBeRo () -> setCurrentPlayersTurnId (( * it_1 ) -> getMyUniqueID ());
}
2007-09-25 12:43:58 +00:00
} else {
it ++ ;
2007-09-25 09:52:58 +00:00
}
}
2007-10-19 14:03:12 +00:00
// determine number of all in players
2007-01-13 02:40:33 +00:00
int allInPlayersCounter = 0 ;
2007-09-26 10:13:10 +00:00
for ( it_c = activePlayerList -> begin (); it_c != activePlayerList -> end (); it_c ++ ) {
2007-09-27 09:47:02 +00:00
if (( * it_c ) -> getMyAction () == PLAYER_ACTION_ALLIN ) allInPlayersCounter ++ ;
2007-01-13 02:40:33 +00:00
}
2007-09-24 14:57:37 +00:00
2007-10-19 14:03:12 +00:00
// determine number of non-fold players
2007-09-24 14:57:37 +00:00
int nonFoldPlayerCounter = 0 ;
2007-09-26 10:13:10 +00:00
for ( it_c = activePlayerList -> begin (); it_c != activePlayerList -> end (); it_c ++ ) {
2007-09-27 09:47:02 +00:00
if (( * it_c ) -> getMyAction () != PLAYER_ACTION_FOLD ) nonFoldPlayerCounter ++ ;
2007-09-24 14:57:37 +00:00
}
2007-10-19 14:03:12 +00:00
// if only one player non-fold -> distribute pot
2007-09-24 14:57:37 +00:00
if ( nonFoldPlayerCounter == 1 ) {
2007-01-13 02:40:33 +00:00
myBoard -> collectPot ();
2007-01-13 14:27:56 +00:00
myGui -> refreshPot ();
2007-01-13 02:40:33 +00:00
myGui -> refreshSet ();
2007-10-18 17:40:12 +00:00
currentRound = 4 ;
2007-01-13 02:40:33 +00:00
}
2007-10-19 14:03:12 +00:00
// check for all in condition
// for all in condition at least two active players have to remain
2007-01-13 02:40:33 +00:00
else {
2007-04-03 10:55:16 +00:00
2007-10-19 14:03:12 +00:00
// 1) all players all in
2007-09-24 14:57:37 +00:00
if ( allInPlayersCounter == nonFoldPlayerCounter ) {
2007-09-24 10:02:17 +00:00
allInCondition = true ;
2007-01-13 02:40:33 +00:00
}
2007-10-19 14:03:12 +00:00
// 2) all players but one all in and he has highest set
2007-09-24 14:57:37 +00:00
if ( allInPlayersCounter + 1 == nonFoldPlayerCounter ) {
2007-09-27 09:47:02 +00:00
for ( it_c = runningPlayerList -> begin (); it_c != runningPlayerList -> end (); it_c ++ ) {
2007-10-18 17:40:12 +00:00
if (( * it_c ) -> getMySet () >= myBeRo [ currentRound ] -> getHighestSet ()) {
2007-09-28 00:16:11 +00:00
allInCondition = true ;
2007-09-24 14:57:37 +00:00
}
2007-05-23 20:03:10 +00:00
2007-09-24 10:02:17 +00:00
}
2007-05-23 20:03:10 +00:00
2007-09-28 00:16:11 +00:00
// exception
2007-09-28 15:04:52 +00:00
// no.1: if in first Preflop Round next player is small blind and only all-in-big-blind with less than smallblind amount and other all-in players with less than small blind are nonfold too -> preflop is over
2007-10-19 14:03:12 +00:00
PlayerListConstIterator smallBlindIt_c = getRunningPlayerIt ( myBeRo [ currentRound ] -> getSmallBlindPositionId ());
PlayerListConstIterator bigBlindIt_c = getActivePlayerIt ( myBeRo [ currentRound ] -> getBigBlindPositionId ());
if ( smallBlindIt_c != runningPlayerList -> end () && bigBlindIt_c != activePlayerList -> end () && currentRound == GAME_STATE_PREFLOP && myBeRo [ currentRound ] -> getFirstRound ()) {
// determine player who are all in with less than small blind amount
int tempCounter = 0 ;
for ( it_c = activePlayerList -> begin (); it_c != activePlayerList -> end (); it_c ++ ) {
if (( * it_c ) -> getMyAction () == PLAYER_ACTION_ALLIN && ( * it_c ) -> getMySet () <= smallBlind ) {
tempCounter ++ ;
}
}
if ( ( * bigBlindIt_c ) -> getMySet () <= smallBlind && tempCounter == allInPlayersCounter ) {
allInCondition = true ;
2007-09-28 15:04:52 +00:00
}
}
2007-10-19 14:03:12 +00:00
// no.2: heads up -> detect player who is all in and bb but could set less than sb
for ( it_c = activePlayerList -> begin (); it_c != activePlayerList -> end (); it_c ++ ) {
2009-04-13 17:43:40 +00:00
if ( activePlayerList -> size () == 2 && ( * it_c ) -> getMyAction () == PLAYER_ACTION_ALLIN && ( * it_c ) -> getMyButton () == BUTTON_BIG_BLIND && ( * it_c ) -> getMySet () <= smallBlind && currentRound == GAME_STATE_PREFLOP ) {
2007-10-19 14:03:12 +00:00
allInCondition = true ;
}
2007-09-28 00:16:11 +00:00
}
2007-01-13 02:40:33 +00:00
}
}
2007-10-19 14:03:12 +00:00
// special routine
2007-01-13 02:40:33 +00:00
if ( allInCondition ) {
myBoard -> collectPot ();
2007-01-13 14:27:56 +00:00
myGui -> refreshPot ();
myGui -> refreshSet ();
2007-01-29 09:11:44 +00:00
myGui -> flipHolecardsAllIn ();
2007-06-13 20:02:40 +00:00
2007-10-18 17:40:12 +00:00
if ( currentRound < 4 ) // do not increment past 4
currentRound ++ ;
2007-06-13 20:02:40 +00:00
//log board cards for allin
2007-10-18 17:40:12 +00:00
if ( currentRound >= 1 ) {
2007-06-13 20:02:40 +00:00
int tempBoardCardsArray [ 5 ];
myBoard -> getMyCards ( tempBoardCardsArray );
2007-10-18 17:40:12 +00:00
myGui -> logDealBoardCardsMsg ( currentRound , tempBoardCardsArray [ 0 ], tempBoardCardsArray [ 1 ], tempBoardCardsArray [ 2 ], tempBoardCardsArray [ 3 ], tempBoardCardsArray [ 4 ]);
2007-06-13 20:02:40 +00:00
}
2007-01-13 02:40:33 +00:00
}
2007-09-27 09:47:02 +00:00
//unhighlight current players groupbox
it_c = getActivePlayerIt ( lastPlayersTurn );
if ( it_c != activePlayerList -> end () ) {
// lastPlayersTurn is active
myGui -> refreshGroupbox ( lastPlayersTurn , 1 );
}
2007-10-18 17:40:12 +00:00
myGui -> refreshGameLabels (( GameState ) getCurrentRound ());
2007-08-05 23:57:16 +00:00
2007-10-18 17:40:12 +00:00
switch ( currentRound ) {
2007-01-13 02:40:33 +00:00
case 0 : {
2007-10-19 14:03:12 +00:00
// start preflop
2007-01-13 02:40:33 +00:00
myGui -> preflopAnimation1 ();
} break ;
case 1 : {
2007-10-19 14:03:12 +00:00
// start flop
2007-01-13 02:40:33 +00:00
myGui -> flopAnimation1 ();
} break ;
case 2 : {
2007-10-19 14:03:12 +00:00
// start turn
2007-01-13 02:40:33 +00:00
myGui -> turnAnimation1 ();
} break ;
case 3 : {
2007-10-19 14:03:12 +00:00
// start river
2007-01-13 02:40:33 +00:00
myGui -> riverAnimation1 ();
} break ;
case 4 : {
2007-10-19 14:03:12 +00:00
// start post river
2007-01-13 02:40:33 +00:00
myGui -> postRiverAnimation1 ();
} break ;
default : {}
}
}
2007-09-26 19:45:58 +00:00
2007-09-27 00:37:01 +00:00
PlayerListIterator LocalHand :: getSeatIt ( unsigned uniqueId ) const {
PlayerListIterator it ;
for ( it = seatsList -> begin (); it != seatsList -> end (); it ++ ) {
if (( * it ) -> getMyUniqueID () == uniqueId ) {
break ;
}
}
return it ;
}
2007-09-26 19:45:58 +00:00
PlayerListIterator LocalHand :: getActivePlayerIt ( unsigned uniqueId ) const {
PlayerListIterator it ;
for ( it = activePlayerList -> begin (); it != activePlayerList -> end (); it ++ ) {
if (( * it ) -> getMyUniqueID () == uniqueId ) {
break ;
}
}
return it ;
}
PlayerListIterator LocalHand :: getRunningPlayerIt ( unsigned uniqueId ) const {
PlayerListIterator it ;
for ( it = runningPlayerList -> begin (); it != runningPlayerList -> end (); it ++ ) {
2007-09-26 22:27:05 +00:00
2007-09-26 19:45:58 +00:00
if (( * it ) -> getMyUniqueID () == uniqueId ) {
break ;
}
}
return it ;
}