#include #include #include #include #ifdef HAVE_LIBREADLINE #include #include #endif #include "conf.h" #include "blackjack.h" #include "tty.h" Tty::Tty(Configuration &conf) { conf.set(&flat_bet, {"flat_bet", "flatbet"}); conf.set(&no_insurance, {"no_insurance", "dont_insure"}); #ifdef HAVE_LIBREADLINE prompt = cyan + " > " + reset; #endif } void Tty::info(Info msg, int intData) { std::string s; switch (msg) { case Info::NewHand: // s = "new_hand"; s = "Starting new hand #" + std::to_string(intData); break; case Info::Shuffle: // s = "shuffle"; s = "Deck needs to be shuffled."; break; case Info::CardPlayerFirst: // s = "card_player_first"; s = "Player's first card is " + card[intData].utf8(); break; case Info::CardDealerUp: // s = "card_dealer_up"; s = "Dealer's up card " + card[intData].utf8(); break; case Info::CardPlayerSecond: // s = "card_player_second"; s = "Player's second card is " + card[intData].utf8(); break; case Info::CardDealerHoleDealt: // s = "card_dealer_hole"; s = "Dealer's hole card is dealt"; break; case Info::CardDealerHoleRevealed: // s = "card_dealer_hole"; s = "Dealer's hole card was " + card[intData].utf8(); break; case Info::DealerBlackjack: // s = "dealer_blackjack"; s = "Dealer has Blackjack"; // TODO: draw dealer's hand break; case Info::PlayerWinsInsurance: // s = "player_wins_insurance"; s = "Player wins insurance"; break; case Info::PlayerBlackjackAlso: // s = "player_blackjack_also"; s = "Player also has Blackjack"; break; case Info::PlayerPushes: // s = "player_pushes"; s = "Player pushes"; // TODO: // print_hand_art (player->current_hand); break; case Info::PlayerLosses: // s = "player_losses"; s = "Player losses"; // TODO: // print_hand_art (player->current_hand); break; case Info::PlayerBlackjack: // s = "blackjack_player"; s = "Player has Blackjack"; // TODO: // print_hand_art (player->current_hand); break; case Info::PlayerWins: // s = "player_wins"; s = "Player wins " + std::to_string(intData); break; case Info::NoBlackjacks: // s = "no_blackjacks"; s = "No blackjacks"; break; case Info::Bye: // s = "bye"; s = "Bye bye! We'll play Blackjack again next time."; break; } if (delay > 0) { std::this_thread::sleep_for(std::chrono::milliseconds(delay)); } std::cout << green << s << reset << std::endl; if (msg == Info::CardDealerHoleDealt) { // hand.render(hand.holeCardShown); currentHand->render(); } return; } int Tty::play() { #ifdef HAVE_LIBREADLINE if ((input_buffer = readline(prompt.c_str())) == nullptr) { // EOF means "quit" actionTaken = PlayerActionTaken::Quit; std::cout << std::endl; } else { add_history(input_buffer); actionTaken = PlayerActionTaken::None; // TODO: convertir a string y usar algo comun para non-readline // check common commands first if (strcmp(input_buffer, "quit") == 0 || strcmp(input_buffer, "q")== 0) { actionTaken = PlayerActionTaken::Quit; } else if (strcmp(input_buffer, "help") == 0) { actionTaken = PlayerActionTaken::Help; } else if (strcmp(input_buffer, "count") == 0 || strcmp(input_buffer, "c")== 0) { actionTaken = PlayerActionTaken::Count; } else if (strcmp(input_buffer, "upcard") == 0 || strcmp(input_buffer, "u")== 0) { actionTaken = PlayerActionTaken::UpcardValue; } else if (strcmp(input_buffer, "bankroll") == 0 || strcmp(input_buffer, "b")== 0) { actionTaken = PlayerActionTaken::Bankroll; } else if (strcmp(input_buffer, "hands") == 0) { actionTaken = PlayerActionTaken::Hands; } else if (strcmp(input_buffer, "table") == 0) { actionTaken = PlayerActionTaken::Table; } if (actionTaken == PlayerActionTaken::None) { switch (actionRequired) { case PlayerActionRequired::Bet: currentBet = std::stoi(input_buffer); actionTaken = PlayerActionTaken::Bet; break; case PlayerActionRequired::Insurance: if (strcmp(input_buffer, "y") == 0 || strcmp(input_buffer, "yes") == 0) { actionTaken = PlayerActionTaken::Insure; } else if (strcmp(input_buffer, "n") == 0 || strcmp(input_buffer, "no") == 0) { actionTaken = PlayerActionTaken::DontInsure; } else { // TODO: chosse if we allow not(yes) == no actionTaken = PlayerActionTaken::None; } break; case PlayerActionRequired::Play: // TODO: sort by higher-expected response first if (strcmp(input_buffer, "h") == 0 || strcmp(input_buffer, "hit") == 0) { actionTaken = PlayerActionTaken::Hit; } else if (strcmp(input_buffer, "s") == 0 || strcmp(input_buffer, "stand") == 0) { actionTaken = PlayerActionTaken::Stand; } else if (strcmp(input_buffer, "d") == 0 || strcmp(input_buffer, "double") == 0) { actionTaken = PlayerActionTaken::Stand; } else if (strcmp(input_buffer, "p") == 0 || strcmp(input_buffer, "pair") == 0 || strcmp(input_buffer, "split") == 0) { actionTaken = PlayerActionTaken::Split; } else { actionTaken = PlayerActionTaken::None; } break; } } free(input_buffer); } #else std::cout << prompt; std::cin >> input_buffer; // TODO: check EOF // TODO: esto puede ir en algo comun para tty y stdout if (input_buffer == "hit" || input_buffer == "h") { *command = Command::Hit; } else { *command = Command::None; } #endif return 0; }