105 lines
2.6 KiB
C
105 lines
2.6 KiB
C
/**
|
|
* Copyright (c) 2021 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "bet.h"
|
|
|
|
// Done
|
|
void pokerBetInit(pokerbet_t *bet) {
|
|
bet->blindBig = POKER_BET_BLIND_BIG_DEFAULT;
|
|
bet->blindSmall = POKER_BET_BLIND_SMALL_DEFAULT;
|
|
}
|
|
|
|
// Done
|
|
void pokerBetReset(pokerbet_t *bet) {
|
|
bet->pot = 0;
|
|
bet->currentBet = 0;
|
|
}
|
|
|
|
// Not needed
|
|
uint8_t pokerBetGetRoundPlayerDefault(uint8_t roundSmallBlind) {
|
|
return (roundSmallBlind + 1) % POKER_PLAYER_COUNT;
|
|
}
|
|
|
|
// Done
|
|
void pokerBetPlayer(pokerbet_t *bet, pokerplayer_t *player, int32_t chips) {
|
|
bet->pot += chips;
|
|
player->chips -= chips;
|
|
player->currentBet += chips;
|
|
bet->currentBet = mathMax(bet->currentBet, player->currentBet);
|
|
}
|
|
|
|
// Doneish
|
|
void pokerBetResetBetter(
|
|
pokerbet_t *bet, pokerplayer_t *players, uint8_t roundSmallBlind
|
|
) {
|
|
uint8_t i;
|
|
pokerplayer_t *player;
|
|
|
|
// Reset the round betting state.
|
|
for(i = 0; i < POKER_PLAYER_COUNT; i++) {
|
|
player = players + i;
|
|
player->state = flagOff(player->state, POKER_PLAYER_STATE_ROUND_MOVE);
|
|
}
|
|
|
|
// Now reset to the first player that needs to bet.
|
|
|
|
// We do this step first to reset the better
|
|
bet->better = pokerBetGetRoundPlayerDefault(roundSmallBlind);
|
|
|
|
// Then we check who's remaining. We do this because the default better may
|
|
// have folded already.
|
|
bet->better = pokerBetGetRemainingPlayer(bet, players, roundSmallBlind);
|
|
}
|
|
|
|
// Doneish
|
|
bool pokerBetPlayerCanBet(pokerbet_t *bet, pokerplayer_t *player) {
|
|
// Is the player out?
|
|
if(!pokerPlayerIsInRound(player)) return false;
|
|
|
|
// Is the player broke?
|
|
if(player->chips <= 0) return false;
|
|
|
|
// Does the player still need to act yet?
|
|
if(player->state & POKER_PLAYER_STATE_ROUND_MOVE) {
|
|
if(player->currentBet >= bet->currentBet) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
uint8_t pokerBetGetRemainingPlayer(
|
|
pokerbet_t *bet, pokerplayer_t *players, uint8_t roundSmallBlind
|
|
) {
|
|
uint8_t def, j, pi;
|
|
def = bet->better;
|
|
|
|
// Now check for any remaining players
|
|
for(j = 0; j < POKER_PLAYER_COUNT; j++) {
|
|
pi = ((def + j) % POKER_PLAYER_COUNT);
|
|
if(!pokerBetPlayerCanBet(bet, players + pi)) continue;
|
|
return pi;
|
|
}
|
|
return 0xFF;
|
|
}
|
|
|
|
uint8_t pokerBetGetRemainingPlayerCount(pokerbet_t *bet,pokerplayer_t *players){
|
|
uint8_t i, c;
|
|
c = 0;
|
|
for(i = 0; i < POKER_PLAYER_COUNT; i++) {
|
|
if(!pokerBetPlayerCanBet(bet, players + i)) continue;
|
|
c++;
|
|
}
|
|
return c;
|
|
}
|
|
|
|
void pokerBetTakeBlinds(
|
|
pokerbet_t *bet, pokerplayer_t *players,
|
|
uint8_t roundSmallBlind, uint8_t roundBigBlind
|
|
) {
|
|
pokerBetPlayer(bet, players + roundSmallBlind, bet->blindSmall);
|
|
pokerBetPlayer(bet, players + roundBigBlind, bet->blindBig);
|
|
} |