114 lines
2.6 KiB
C
114 lines
2.6 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(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
|
|
);
|
|
} |