| @@ -74,7 +74,7 @@ namespace Libreblackjack { | |||
| enum class Info { | |||
| None, | |||
| InvalidBet, | |||
| BetInvalid, | |||
| NewHand, | |||
| Shuffle, | |||
| CardPlayer, | |||
| @@ -83,6 +83,9 @@ namespace Libreblackjack { | |||
| DealerBlackjack, | |||
| PlayerWinsInsurance, | |||
| PlayerBlackjackAlso, | |||
| PlayerSplitInvalid, | |||
| PlayerSplitOk, | |||
| PlayerSplitIds, | |||
| PlayerNextHand, | |||
| PlayerPushes, | |||
| PlayerLosses, | |||
| @@ -183,6 +186,7 @@ class Hand { | |||
| class PlayerHand : public Hand { | |||
| public: | |||
| PlayerHand(std::size_t i = 0) : id(i) { }; | |||
| std::size_t id; | |||
| unsigned int bet = 0; | |||
| bool insured = false; | |||
| @@ -430,13 +430,13 @@ int Blackjack::process(void) { | |||
| case Libreblackjack::PlayerActionTaken::Bet: | |||
| // TODO: bet = 0 -> wonging | |||
| if (player->currentBet == 0) { | |||
| info(Libreblackjack::Info::InvalidBet, player->currentBet); | |||
| info(Libreblackjack::Info::BetInvalid, player->currentBet); | |||
| return 0; | |||
| } else if (player->currentBet < 0) { | |||
| info(Libreblackjack::Info::InvalidBet, player->currentBet); | |||
| info(Libreblackjack::Info::BetInvalid, player->currentBet); | |||
| return 0; | |||
| } else if (max_bet != 0 && player->currentBet > max_bet) { | |||
| info(Libreblackjack::Info::InvalidBet, player->currentBet); | |||
| info(Libreblackjack::Info::BetInvalid, player->currentBet); | |||
| return 0; | |||
| } else { | |||
| // ok, valid bet, copy the player's bet and use the local copy | |||
| @@ -526,6 +526,7 @@ int Blackjack::process(void) { | |||
| ///ip+split+detail This command can be abbreviated as `p` (for pair). | |||
| case Libreblackjack::PlayerActionTaken::Split: | |||
| // TODO: front() and front()+1 | |||
| firstCard = *(playerInfo.currentHand->cards.begin()); | |||
| secondCard = *(++playerInfo.currentHand->cards.begin()); | |||
| @@ -93,7 +93,7 @@ void Tty::info(Libreblackjack::Info msg, int p1, int p2) { | |||
| switch (msg) { | |||
| case Libreblackjack::Info::InvalidBet: | |||
| case Libreblackjack::Info::BetInvalid: | |||
| if (p1 < 0) { | |||
| // s = "bet_negative"; | |||
| s = "Your bet is negative (" + std::to_string(p1) + ")"; | |||
| @@ -185,6 +185,40 @@ void Tty::info(Libreblackjack::Info msg, int p1, int p2) { | |||
| render = true; | |||
| 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: | |||
| // s = "player_next_hand"; | |||
| s = "Playing next hand #" + std::to_string(p1); | |||
| @@ -56,6 +56,9 @@ class Tty : public Player { | |||
| std::string input_buffer; | |||
| #endif | |||
| std::size_t handToSplit; | |||
| unsigned int cardToSplit; | |||
| std::string arrow; | |||
| std::string prompt; | |||