CChips operator + (const CChips& lhs, const CChips& rhs) { CChips::chip_amount_t dollars = lhs.getDollars() + rhs.getDollars(); assert(dollars <= CChips::Max_Dollars); CChips::chip_amount_t cents = lhs.getCents() + rhs.getCents(); if (cents >= 100) { dollars += 1; cents -= 100; } return CChips(dollars, cents); }
CChips operator * (const CChips& lhs, int d) { CChips::chip_amount_t dollars = d * lhs.getDollars(); assert(dollars <= CChips::Max_Dollars); CChips::chip_amount_t cents = d * lhs.getCents(); while (cents >= 100) { dollars += 1; cents -= 100; } return CChips(dollars, cents); }
bool CdbInterface::getChips(CPlayer* player, CChips& chips) { SingleLock l(&dbMutex_); if (!l.lock()) return false; ReadLockSQLTable sqlLock(dbase_, "pokeruser"); if (!sqlLock.success_) return false; char query[MAXQUERYSIZE]; char *dbFetched = NULL; memset(query, 0x0, MAXQUERYSIZE); string name = sqlfy(player->getUsername()); sprintf(query, "SELECT chips FROM pokeruser WHERE username='******'", name.c_str()); if (!dbase_->dbQuery(query)) { if (DEBUG & DEBUG_DATABASE) { printf("Query to get %s's chips failed!\n", player->getUsername()); } return false; } dbFetched = dbase_->dbFetchRow(); if (dbFetched == NULL) { if (DEBUG & DEBUG_DATABASE) { printf("User %s does not exist in database!\n", player->getUsername()); } return (u_int16_t)0; } double c = atof(dbFetched); chips = CChips(c); return true; };
CChips operator - (const CChips& lhs, const CChips& rhs) { assert(lhs >= rhs); CChips::chip_amount_t dollars = lhs.getDollars() - rhs.getDollars(); assert(dollars <= CChips::Max_Dollars); int cents = lhs.getCents() - rhs.getCents(); assert(cents <= 100); if (cents < 0) { dollars -= 1; cents = 100 + cents; } return CChips(dollars, cents); }
bool CdbInterface::getChips(const CPlayer* player, CChips& chips) { CStrOut query; char* dbFetched = NULL; string name = sqlfy(player->getUsername()); query << "SELECT chips FROM pokeruser WHERE username='******'\''; if (!dbase_->dbQuery(query.str())) { if (DEBUG & DEBUG_DATABASE) { printf("Query to get %s's chips failed!\n", player->getUsername()); } return false; } dbFetched = dbase_->dbFetchRow(); if (dbFetched == NULL) { if (DEBUG & DEBUG_DATABASE) { printf("User %s does not exist in database!\n", player->getUsername()); } return false; } double c = atof(dbFetched); chips = CChips(c); return true; };
bool CdbInterface::getTournament(int index, int& number, CChips& buyin, CChips& chips, CChips& startLo, u_int32_t& startTime, int& maxPlayers, string& description, string& script) { CStrOut query; const char* result = NULL; query << "SELECT number FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(1)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { return false; } number = atoi(result); // get buyin query << CStrOut::Clear << "SELECT buyin FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(5)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { return false; } buyin = CChips(atof(result)); // get start chips query << CStrOut::Clear << "SELECT start_chips FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(5,5)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { return false; } chips = CChips(atof(result)); // get start low limit query << CStrOut::Clear << "SELECT start_lo FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(5,6)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { return false; } startLo = CChips(atof(result)); // get start time query << CStrOut::Clear << "SELECT start_time FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(2)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { return false; } startTime = atol(result); // get max number of players query << CStrOut::Clear << "SELECT max_players FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(max_players)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { // use whatever is default } else { maxPlayers = atoi(result); } // get description query << CStrOut::Clear << "SELECT description FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(3)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { return false; } description = result; // get script query << CStrOut::Clear << "SELECT script FROM tournament where tournament_index=" << index; if (!dbase_->dbQuery(query.str())) { char s[200]; sprintf(s, "getTournament: Query failed(4)!\n"); Sys_LogError(s); return false; } result = dbase_->dbFetchRow(); if (result == NULL) { return false; } script = result; return true; }
void CTable::tableLogin(SOCKET sd, CpduLogin* loginPdu) { bool loginOk = true; u_int32_t ipaddr = 0; // Is there a valid login entry for the player? If not, // he could be trying to log in directly and not via lounge LoginEntries::iterator pos = loginEntries_.find(loginPdu->getUsername()); if (pos == loginEntries_.end()) { #ifdef ALLOW_DIRECT_LOGINS_ #pragma message("Allowing direct logins!!!") // WILL ALLOW DIRECT LOGINS #else char s[200]; sprintf(s, "Login rejected: no login entry for user %s", loginPdu->getUsername()); Sys_LogError(s); loginOk = false; #endif } else { ipaddr = (*pos).second.ipaddr_; // player is logging in, remove his entry loginEntries_.erase(pos); } // In theory we didn't need to do these checks here // because they're done when the lounge server asks // whether the login is ok. Do the check just in case // someone finds a way to log in to table without // the lounge server. if (loginOk) loginOk = checkLogin(ipaddr, loginPdu->getUsername()); if (!loginOk || !dbase_->authenticate(loginPdu->getUsername(), loginPdu->getPassword())) { // Send Table Reject PDU CpduLoginReject pdu; pdu.sendReject(sd); // Terminate the connection CPoller::Instance()->removeClient(sd); } else { CPlayer* newPlayer = NULL; // Add player to table SingleLock l(&tableMutex_); if (l.lock()) { newPlayer = getUnusedPlayer(loginPdu->getUsername()); if (newPlayer) { // In tournaments there is a small window during which a // player may succeed logging in twice because the first // login does not "reanimate the zombie" immediately. // This check prevents it from happening. if (CTournament::Inst()->isTournament() && checkDoubleLogin(loginPdu->getUsername(), newPlayer)) { // Send Table Reject PDU CpduLoginReject pdu; pdu.sendReject(sd); // Terminate the connection CPoller::Instance()->removeClient(sd); return; } newPlayer->setPlayer(sd, loginPdu->getUsername(), loginPdu->getPassword(), CChips(), // 0 chips until he buys in ipaddr); newPlayer->setIsFreeSeat(false); newPlayer->setReanimate(true); string city; if (dbase_->getCity(loginPdu->getUsername(), city)) { newPlayer->setCity(city.c_str()); } if (countPlayers(PLAYER_STATE_PLAYING|PLAYER_STATE_WAITING) >= 1 && countPlayersRaw(false) > 2 && !CTournament::Inst()->isTournament()) // XXX Fix tournament double big blind bug { // a game is in progress - must charge 'new player's blind' newPlayer->setMissedBlind(getLo()); } CpduPlayerInfo myPlayerInfoPdu(this); CpduBuyinQuery myBuyinQueryPdu(this); // Send Player Info PDU myPlayerInfoPdu.sendPlayerInfo(newPlayer); if (CTournament::Inst()->isTournament()) { char buf[100]; sprintf(buf, "Player %s logged in", newPlayer->getUsername()); Sys_LogTournament(buf); CTournament* t = CTournament::Inst(); CChips lo(DEFAULT_LOW), hi(DEFAULT_HI); t->getLimits(lo, hi); // Send current game type & limits CpduTournamentParams params; params.sendParams(newPlayer, TF_GameType, t->getGameType(), t->isHiLo() ? 1 : 0); params.sendParams(newPlayer, TF_Limit, lo.getRep(), hi.getRep()); // In tournament there is automatic buy-in when // players are seated if (newPlayer->matchState(PLAYER_STATE_UNUSED|PLAYER_STATE_LOGGEDIN)) newPlayer->stateChange(PLAYER_STATE_BOUGHTIN); } else { // Send buy in query myBuyinQueryPdu.sendBuyinQuery(newPlayer); } // Send table update to lounge server if (CLoungeServer* ls = CLoungeServer::Inst()) { ls->sendPlayerSeated(newPlayer->getUsername()); ls->sendTableUpdate(countPlayersRaw()); } } } if (!newPlayer) { // no room for player! CPoller::Instance()->removeClient(sd); } } }
void Cplm_7Stud::doRake() { if (lowRake_ == 0 && hiRake_ == 0) resetRake(); // set the rake limits Cpot* pot = table_->getMainPot(); bool secondUpCard = false; // RULE: // $1 at the second upcard if (upCards_ >= 2) { // // Take second up card rake // rake_ = 1; secondUpCard = true; } // RULE: // $1 when the pot reaches certain low limit if (secondUpCard && lowRake_ != 0) { if (pot->getTotalChips() >= lowRake_) { // // Take low limit rake // rake_ += 1; } } // RULE: // $1 when the pot reaches certain higher limit if (secondUpCard && hiRake_ != 0) { if (pot->getTotalChips() >= hiRake_) { // // Take hi limit rake // rake_ += 1; } } // RULE // If there are only 2-3 players playing (that is, // has been dealt cards), the rake is 1 if pot reaches // 20, otherwise rake is 0. const int NoRakeLimit = 20; // Players in these states have been dealt cards int state = PLAYER_STATE_PLAYING | PLAYER_STATE_FOLDED | PLAYER_STATE_ALLIN | PLAYER_STATE_ALLIN_RAISE; if (table_->countPlayers(state) < 4) { if (pot->getTotalChips() < NoRakeLimit) { // NoRakeLimit not reached, no rake rake_ = 0; } else { // NoRakeLimit reached if (secondUpCard) rake_ = minimum(CChips(1, 0), rake_); } } saveRake(); }