示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
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;
};
示例#4
0
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);
}
示例#5
0
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;
};
示例#6
0
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;
}
示例#7
0
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);
    }
  }
}
示例#8
0
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();
}