Dawn/src/poker/poker.c
2021-10-15 10:20:31 -07:00

96 lines
2.5 KiB
C

/**
* Copyright (c) 2021 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#include "poker.h"
void pokerInit(poker_t *poker) {
poker->playerCount = 0;
poker->playerDealer = 0;
poker->playerSmallBlind = 0;
poker->playerBigBlind = 0;
pokerResetRound(poker);
pokerSetBlinds(poker, 0, 0);
}
void pokerSetBlinds(poker_t *poker, int32_t blindSmall, int32_t blindBig) {
poker->blindSmall = blindSmall;
poker->blindBig = blindBig;
}
void pokerResetRound(poker_t *poker) {
uint8_t i;
pokerplayer_t *player;
poker->deckSize = cardWriteDeck(poker->deck);
poker->graveSize = 0;
poker->communitySize = 0;
poker->potCount = 0;
pokerPotAdd(poker);
pokerResetBettingRound(poker);
for(i = 0; i < poker->playerCount; i++) {
player = poker->players + i;
player->cardCount = 0;
player->currentBet = 0;
player->timesRaised = 0;
player->state &= ~(
POKER_PLAYER_STATE_FOLDED |
POKER_PLAYER_STATE_HAS_BET_THIS_ROUND |
POKER_PLAYER_STATE_SHOWING
);
}
}
void pokerResetBettingRound(poker_t *poker) {
uint8_t i;
pokerplayer_t *player;
// Reset the round betting state.
for(i = 0; i < poker->playerCount; i++) {
player = poker->players + i;
player->state =flagOff(player->state,POKER_PLAYER_STATE_HAS_BET_THIS_ROUND);
player->timesRaised = 0;
}
// Now reset to the first player that needs to bet.
if(poker->playerCount > 0) {
poker->better = poker->playerBigBlind;
} else {
poker->better = 0x00;
}
// Then we check who's remaining. We do this because the default better may
// have folded already.
poker->better = pokerBetGetNextPlayer(poker);
}
void pokerTakeBlinds(poker_t *poker) {
pokerplayer_t *player;
pokerBetForPlayer(poker, poker->playerSmallBlind, poker->blindSmall);
player = poker->players + poker->playerSmallBlind;
player->state = flagOff(player->state, POKER_PLAYER_STATE_HAS_BET_THIS_ROUND);
pokerBetForPlayer(poker, poker->playerBigBlind, poker->blindBig);
player = poker->players + poker->playerBigBlind;
player->state = flagOff(player->state, POKER_PLAYER_STATE_HAS_BET_THIS_ROUND);
}
uint8_t pokerInRoundGetCount(poker_t *poker) {
uint8_t i, count;
pokerplayer_t *player;
count = 0;
for(i = 0; i < poker->playerCount; i++) {
player = poker->players + i;
if(player->state & (POKER_PLAYER_STATE_FOLDED | POKER_PLAYER_STATE_OUT)) {
continue;
}
count++;
}
return count;
}