| enum class Info { | enum class Info { | ||||
| None, | None, | ||||
| InvalidBet, | |||||
| BetInvalid, | |||||
| NewHand, | NewHand, | ||||
| Shuffle, | Shuffle, | ||||
| CardPlayer, | CardPlayer, | ||||
| DealerBlackjack, | DealerBlackjack, | ||||
| PlayerWinsInsurance, | PlayerWinsInsurance, | ||||
| PlayerBlackjackAlso, | PlayerBlackjackAlso, | ||||
| PlayerSplitInvalid, | |||||
| PlayerSplitOk, | |||||
| PlayerSplitIds, | |||||
| PlayerNextHand, | PlayerNextHand, | ||||
| PlayerPushes, | PlayerPushes, | ||||
| PlayerLosses, | PlayerLosses, | ||||
| class PlayerHand : public Hand { | class PlayerHand : public Hand { | ||||
| public: | public: | ||||
| PlayerHand(std::size_t i = 0) : id(i) { }; | |||||
| std::size_t id; | std::size_t id; | ||||
| unsigned int bet = 0; | unsigned int bet = 0; | ||||
| bool insured = false; | bool insured = false; |
| case Libreblackjack::PlayerActionTaken::Bet: | case Libreblackjack::PlayerActionTaken::Bet: | ||||
| // TODO: bet = 0 -> wonging | // TODO: bet = 0 -> wonging | ||||
| if (player->currentBet == 0) { | if (player->currentBet == 0) { | ||||
| info(Libreblackjack::Info::InvalidBet, player->currentBet); | |||||
| info(Libreblackjack::Info::BetInvalid, player->currentBet); | |||||
| return 0; | return 0; | ||||
| } else if (player->currentBet < 0) { | } else if (player->currentBet < 0) { | ||||
| info(Libreblackjack::Info::InvalidBet, player->currentBet); | |||||
| info(Libreblackjack::Info::BetInvalid, player->currentBet); | |||||
| return 0; | return 0; | ||||
| } else if (max_bet != 0 && player->currentBet > max_bet) { | } else if (max_bet != 0 && player->currentBet > max_bet) { | ||||
| info(Libreblackjack::Info::InvalidBet, player->currentBet); | |||||
| info(Libreblackjack::Info::BetInvalid, player->currentBet); | |||||
| return 0; | return 0; | ||||
| } else { | } else { | ||||
| // ok, valid bet, copy the player's bet and use the local copy | // ok, valid bet, copy the player's bet and use the local copy | ||||
| ///ip+split+detail This command can be abbreviated as `p` (for pair). | ///ip+split+detail This command can be abbreviated as `p` (for pair). | ||||
| case Libreblackjack::PlayerActionTaken::Split: | case Libreblackjack::PlayerActionTaken::Split: | ||||
| // TODO: front() and front()+1 | |||||
| firstCard = *(playerInfo.currentHand->cards.begin()); | firstCard = *(playerInfo.currentHand->cards.begin()); | ||||
| secondCard = *(++playerInfo.currentHand->cards.begin()); | secondCard = *(++playerInfo.currentHand->cards.begin()); | ||||
| switch (msg) { | switch (msg) { | ||||
| case Libreblackjack::Info::InvalidBet: | |||||
| case Libreblackjack::Info::BetInvalid: | |||||
| if (p1 < 0) { | if (p1 < 0) { | ||||
| // s = "bet_negative"; | // s = "bet_negative"; | ||||
| s = "Your bet is negative (" + std::to_string(p1) + ")"; | s = "Your bet is negative (" + std::to_string(p1) + ")"; | ||||
| render = true; | render = true; | ||||
| break; | break; | ||||
| case Libreblackjack::Info::PlayerSplitInvalid: | |||||
| // s = "player_split_invalid"; | |||||
| s = "Cannot split"; | |||||
| render = true; | |||||
| break; | |||||
| case Libreblackjack::Info::PlayerSplitOk: | |||||
| // s = "player_split_ok"; | |||||
| s = "Splitting hand" + ((p1 != 0)?(" #" + std::to_string(p1)):""); | |||||
| handToSplit = p1; | |||||
| render = true; | |||||
| break; | |||||
| case Libreblackjack::Info::PlayerSplitIds: | |||||
| // TODO: check if the hand is found | |||||
| for (auto hand = hands.begin(); hand != hands.end(); ++currentHand) { | |||||
| if (hand->id == handToSplit) { | |||||
| hand->id = p1; | |||||
| cardToSplit = hand.back(); | |||||
| hand.pop_back(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| // create a new hand | |||||
| PlayerHand newHand; | |||||
| newHand.id = playerInfo.hands.size() + 1; | |||||
| newHand.bet = playerInfo.currentHand->bet; | |||||
| render = true; | |||||
| break; | |||||
| case Libreblackjack::Info::PlayerNextHand: | case Libreblackjack::Info::PlayerNextHand: | ||||
| // s = "player_next_hand"; | // s = "player_next_hand"; | ||||
| s = "Playing next hand #" + std::to_string(p1); | s = "Playing next hand #" + std::to_string(p1); |
| std::string input_buffer; | std::string input_buffer; | ||||
| #endif | #endif | ||||
| std::size_t handToSplit; | |||||
| unsigned int cardToSplit; | |||||
| std::string arrow; | std::string arrow; | ||||
| std::string prompt; | std::string prompt; | ||||