#include "PlayerAreaModel.h" #include PlayerAreaModel::PlayerAreaModel(QObject *parent) { Player defaultValues; Bet defaultBets; for(int i = 0; i < 8; i++){ players.append(defaultValues); for (int ii = 0; ii < 2; ii++) { players[i].bets.append(defaultBets); } } /* This is set to avoid segfaults if the starting value is out of bounds */ focusedPlayer_ = 1; } uint PlayerAreaModel::focusedPlayer() { return focusedPlayer_; } void PlayerAreaModel::setFocusedPlayer(int n) { focusedPlayer_ = n; Player player = players.at(n); BetType b1 = player.bets[0].betType; BetType b2 = player.bets[1].betType; uint n1 = player.bets[0].betSpot; uint n2 = player.bets[1].betSpot; emit focusedPlayerChanged(b1, n1, b2, n2); } QString PlayerAreaModel::getPlayerName(int n) { return players.at(n).playerName; } void PlayerAreaModel::setPlayerName(QString s, int n) { players[n].playerName = s; } void PlayerAreaModel::bet(BetType b, int n, int bet) { Player *player = &players[focusedPlayer_]; for (int i = 0; i < 2; i++) { if (player->bets[i].betType == NONE) { player->bets[i].betType = b; player->bets[i].betValue = bet; player->bets[i].betSpot = n; /* * This is needed because the visual roulette board is inverted from the * actual QML grid we use to represent it. * Here we use 35 because the grid is 0-indexed, but later we use 36 when it is 1-indexed. */ if (b == SINGLE && n <= 35) { n = 35 - n; } emit betChanged(b, n, bet); break; } } } void PlayerAreaModel::removeBet(BetType b, int n) { Player *player = &players[focusedPlayer_]; for (int i = 0; i < 2; i++) { if (player->bets[i].betType == b && player->bets[i].betSpot == n) { player->bets[i].betType = NONE; if (b == SINGLE && n <= 35) { n = 35 - n; } emit betRemoved(b, n); } } } void PlayerAreaModel::cancelBet(BetType b, int n) { emit betCanceled(b, n); } void PlayerAreaModel::payout() { if (players.at(0).bets[0].betType == NONE) { fprintf(stderr, "Select where the ball landed\n"); } else { int rollSpot = 36 - players.at(0).bets[0].betSpot; for (int i = 1; i < 8; i++) { players[i].payout = 0; for (int ii = 0; ii < 2; ii++) { int betType = players.at(i).bets[ii].betType; int betSpot; if (betType != NONE) { betSpot = players.at(i).bets[ii].betSpot; if (betType == SINGLE && betSpot <= 35) { betSpot = 36 - betSpot; } else { betSpot += 1; } if (betType == SINGLE && betSpot == rollSpot) { players[i].payout += players.at(i).bets[ii].betValue * 21; } else if (betType == RED && (((int64_t)1 << (rollSpot - 1)) & redNumbers)) { players[i].payout += players.at(i).bets[ii].betValue * 2; } else if (betType == BLACK && !(((int64_t)1 << (rollSpot - 1)) & redNumbers)) { players[i].payout += players.at(i).bets[ii].betValue * 2; } else if (betType == ODD && (rollSpot % 2)) { players[i].payout += players.at(i).bets[ii].betValue * 2; } else if (betType == EVEN && !(rollSpot % 2)) { players[i].payout += players.at(i).bets[ii].betValue * 2; } else if (betType == LOW && rollSpot <= 18 ) { players[i].payout += players.at(i).bets[ii].betValue * 2; } else if (betType == HIGH && rollSpot >= 19 && rollSpot < 37) { players[i].payout += players.at(i).bets[ii].betValue * 2; } else if (betType == DOZEN) { printf("CHECK %d %d\n", betSpot, rollSpot); if (rollSpot <= 12 * betSpot && rollSpot >= (12 * (betSpot - 1)) + 1) { players[i].payout += players.at(i).bets[ii].betValue * 3; } } else if (betType == STREET) { if (rollSpot <= 3 * betSpot && rollSpot >= (3 * (betSpot - 1)) + 1) { players[i].payout += players.at(i).bets[ii].betValue * 6; } } else if (betType == COLUMN) { if (betSpot == 1 && (((int64_t)1 << (rollSpot - 1)) & column1)) { players[i].payout += players.at(i).bets[ii].betValue * 3; } else if (betSpot == 2 && (((int64_t)1 << (rollSpot - 1)) & column2)) { players[i].payout += players.at(i).bets[ii].betValue * 3; } else if (betSpot == 3 && (((int64_t)1 << (rollSpot - 1)) & column3)) { players[i].payout += players.at(i).bets[ii].betValue * 3; } } } } emit results(players.at(i).playerName, i, players.at(i).payout); } } }