/** * Copyright (c) 2021 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "poker.h" void pokerInit(poker2_t *poker) { pokerResetRound(poker); poker->playerCount = 0; poker->state = 0; } void pokerResetRound(poker2_t *poker) { poker->deckSize = cardWriteDeck(poker->deck); poker->graveSize = 0; poker->communitySize = 0; poker->potCount = 0; pokerPotAdd(poker); } // Pot functions uint8_t pokerPotAdd(poker2_t *poker) { poker2pot_t *pot; uint8_t i = poker->potCount++; pot = poker->pots + i; pot->chips = 0; pot->playerCount = 0; return i; } void pokerPotAddPlayer(poker2pot_t *pot, uint8_t playerIndex) { if(arrayContains( sizeof(uint8_t), pot->players, pot->playerCount, &playerIndex )) return; pot->players[pot->playerCount++] = playerIndex; } // Dealer Functions void pokerTurn(poker2_t *poker, uint8_t count) { uint8_t i; for(i = 0; i < count; i++) { cardDeal( poker->deck, &poker->deckSize, poker->community, &poker->communitySize ); } } void pokerBurn(poker2_t *poker, uint8_t count) { uint8_t i; for(i = 0; i < count; i++) { cardDeal(poker->deck, &poker->deckSize, poker->grave, &poker->graveSize); } } // Player Functions uint8_t pokerPlayerAdd(poker2_t *poker) { poker2player_t *player; uint8_t i = poker->playerCount++; player = poker->players + i; player->cardCount = 0; player->chips = 0; player->state = 0x00; return i; } void pokerPlayerDeal(poker2_t *poker, poker2player_t *player, uint8_t count) { uint8_t i; for(i = 0; i < count; i++) { cardDeal(poker->deck, &poker->deckSize, player->cards, &player->cardCount); } } void pokerPlayerChipsAdd(poker2player_t *player, int32_t chips) { player->chips += chips; if(player->chips > 0) { flagOff(player->state, POKER_PLAYER_STATE_OUT); } } void pokerPlayerDealAll(poker2_t *poker, uint8_t count) { uint8_t i; poker2player_t *player; for(i = 0; i < poker->playerCount; i++) { player = poker->players + i; // Can't deal to a player who is folded or out if(player->state & (POKER_PLAYER_STATE_FOLDED|POKER_PLAYER_STATE_OUT)) { continue; } pokerPlayerDeal(poker, player, count); } } // Betting void pokerPlayerBetPot( poker2_t *poker, poker2pot_t *pot, uint8_t playerIndex, int32_t chips ) { poker2player_t *player; player = poker->players + playerIndex; player->chips -= chips; pot->chips += chips; pokerPotAddPlayer(pot, playerIndex); } void pokerPlayerBet(poker2_t *poker, uint8_t playerIndex, int32_t chips) { pokerPlayerBetPot( poker, poker->pots + (poker->potCount - 1), playerIndex, chips ); }