Working on the poker game stuff.
This commit is contained in:
		@@ -1,8 +1,17 @@
 | 
			
		||||
const GAME_STRINGS = {
 | 
			
		||||
  'ERROR': 'An error\nhas occured',
 | 
			
		||||
  'HELLO': 'Hello World!\nHow are you today?\nThank god!',
 | 
			
		||||
 | 
			
		||||
  'POKER_GAME_START': 'Poker game started',
 | 
			
		||||
  'POKER_GAME_TAKING_BLINDS': 'Blinds taken.'
 | 
			
		||||
  'POKER_GAME_TAKING_BLINDS': 'Blinds taken.',
 | 
			
		||||
  'POKER_GAME_CARDS_DEALT': 'Cards dealt.',
 | 
			
		||||
 | 
			
		||||
  'POKER_GAME_CARDS_FLOPPED': 'Cards flopped',
 | 
			
		||||
  'POKER_GAME_CARDS_TURNED': 'Cards turned',
 | 
			
		||||
  'POKER_GAME_CARDS_RIVERED': 'Cards river',
 | 
			
		||||
 | 
			
		||||
  'DEBUG_WINNER_DECIDED': 'DEBUG WINNER',
 | 
			
		||||
  'BURNOUT': 'Burnout gey\nlmao.'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
module.exports = { GAME_STRINGS };
 | 
			
		||||
@@ -13,23 +13,179 @@
 | 
			
		||||
 | 
			
		||||
uint16_t QUEUE_ITEM;
 | 
			
		||||
 | 
			
		||||
void conversationQueueInit() {
 | 
			
		||||
  QUEUE_ITEM = QUEUE_BEGIN;
 | 
			
		||||
void conversationQueueDebug() {
 | 
			
		||||
  conversationTextboxString(ERROR);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void conversationQueueNext() {
 | 
			
		||||
	BGB_printf("Queue item: %d\n", QUEUE_ITEM);
 | 
			
		||||
void conversationQueueBegin() {
 | 
			
		||||
  QUEUE_ITEM = QUEUE_TAKE_BLINDS;
 | 
			
		||||
  conversationTextboxString(POKER_GAME_START);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  switch(QUEUE_ITEM) {
 | 
			
		||||
    case QUEUE_BEGIN:
 | 
			
		||||
      conversationTextboxString(POKER_GAME_START);
 | 
			
		||||
      QUEUE_ITEM = QUEUE_TAKE_BLINDS;
 | 
			
		||||
void conversationQueueTakeBlinds() {
 | 
			
		||||
  QUEUE_ITEM = QUEUE_DEAL_CARDS;
 | 
			
		||||
  conversationTextboxString(POKER_GAME_TAKING_BLINDS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void conversationQueueDealCards() {
 | 
			
		||||
  QUEUE_ITEM = QUEUE_BEGIN_BETTING;
 | 
			
		||||
  conversationTextboxString(POKER_GAME_CARDS_DEALT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void conversationQueueBeginBetting() {
 | 
			
		||||
  uint8_t i;
 | 
			
		||||
  // Begin the betting process. First we need to decide if the player or the
 | 
			
		||||
  // AI is betting, then based on that we decide what to do next.
 | 
			
		||||
 | 
			
		||||
  // TODO: Next better
 | 
			
		||||
  if(POKER_PLAYER_BETTER == POKER_HUMAN_INDEX) {
 | 
			
		||||
    // This is the human player.
 | 
			
		||||
    BGB_MESSAGE("Players turn to bet");
 | 
			
		||||
    POKER_PLAYERS[
 | 
			
		||||
      POKER_PLAYER_BETTER
 | 
			
		||||
    ].state |= POKER_PLAYER_STATE_HAS_BET_THIS_ROUND;
 | 
			
		||||
  } else {
 | 
			
		||||
    // This is an AI player.
 | 
			
		||||
    BGB_MESSAGE("AI turn to bet");
 | 
			
		||||
    POKER_PLAYERS[
 | 
			
		||||
      POKER_PLAYER_BETTER
 | 
			
		||||
    ].state |= POKER_PLAYER_STATE_HAS_BET_THIS_ROUND;
 | 
			
		||||
  }
 | 
			
		||||
  // TODO: Decide if we need to continue betting or decide a winner
 | 
			
		||||
  for(i = 0; i < POKER_PLAYER_COUNT_MAX; i++) {
 | 
			
		||||
    // Can the player even do anything?
 | 
			
		||||
    if(
 | 
			
		||||
      (
 | 
			
		||||
        POKER_PLAYERS[POKER_PLAYER_BETTER].state &
 | 
			
		||||
        (POKER_PLAYER_STATE_FOLDED|POKER_PLAYER_STATE_OUT)
 | 
			
		||||
      ) != 0 ||
 | 
			
		||||
      POKER_PLAYERS[POKER_PLAYER_BETTER].chips == 0
 | 
			
		||||
    ) continue;
 | 
			
		||||
 | 
			
		||||
    // Has the player bet? If so are they in the current pot?
 | 
			
		||||
    if((
 | 
			
		||||
      POKER_PLAYERS[POKER_PLAYER_BETTER].state &
 | 
			
		||||
      POKER_PLAYER_STATE_HAS_BET_THIS_ROUND
 | 
			
		||||
    ) != 0) {
 | 
			
		||||
      // TODO: confirm uh if they are up to the currently raised pot point or 
 | 
			
		||||
      // not.
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // They haven't bet yet, make them the "next better"
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // If we reach this point then we either need to begin the betting round, or
 | 
			
		||||
  // we are going to move to the winning decider. TODO: Figure out if winning
 | 
			
		||||
  // phase or turn phase.
 | 
			
		||||
 | 
			
		||||
  QUEUE_ITEM = QUEUE_FLOP;
 | 
			
		||||
  conversationQueueNext();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void conversationQueueFlopTurnRiver() {
 | 
			
		||||
  uint8_t i, count;
 | 
			
		||||
  
 | 
			
		||||
  QUEUE_ITEM = QUEUE_BEGIN_BETTING;
 | 
			
		||||
 | 
			
		||||
  switch(POKER_COMMUNITY_SIZE) {
 | 
			
		||||
    case 0:
 | 
			
		||||
      count = POKER_COUNT_FLOP;
 | 
			
		||||
      conversationTextboxString(POKER_GAME_CARDS_FLOPPED);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case QUEUE_TAKE_BLINDS:
 | 
			
		||||
      pokerTakeBlinds();
 | 
			
		||||
      conversationTextboxString(POKER_GAME_TAKING_BLINDS);
 | 
			
		||||
      QUEUE_ITEM = QUEUE_TAKE_BLINDS;
 | 
			
		||||
    case POKER_COUNT_FLOP:
 | 
			
		||||
      count = POKER_COUNT_TURN;
 | 
			
		||||
      conversationTextboxString(POKER_GAME_CARDS_TURNED);
 | 
			
		||||
      break;
 | 
			
		||||
    
 | 
			
		||||
    default:
 | 
			
		||||
      count = POKER_COUNT_RIVER;
 | 
			
		||||
      conversationTextboxString(POKER_GAME_CARDS_RIVERED);
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // In reality we'd burn the top card but that would waste some CPU I need.
 | 
			
		||||
  // Deal the top cards.
 | 
			
		||||
  for(i = 0; i < count; i++) {
 | 
			
		||||
    POKER_COMMUNITY[POKER_COMMUNITY_SIZE++] = POKER_DECK[POKER_DECK_SIZE--];
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void conversationQueueWinnerDecide() {
 | 
			
		||||
  QUEUE_ITEM = QUEUE_DEBUG;
 | 
			
		||||
 | 
			
		||||
  // TODO: Decide on a winner for real.
 | 
			
		||||
  conversationTextboxString(DEBUG_WINNER_DECIDED);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
queuecallback_t *QUEUE_CALLBACKS[] = {
 | 
			
		||||
  // 0
 | 
			
		||||
  NULL,
 | 
			
		||||
  &conversationQueueDebug,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 5
 | 
			
		||||
  &conversationQueueBegin,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 10
 | 
			
		||||
  &conversationQueueTakeBlinds,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 15
 | 
			
		||||
  &conversationQueueDealCards,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 20
 | 
			
		||||
  &conversationQueueBeginBetting,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 25
 | 
			
		||||
  &conversationQueueFlopTurnRiver,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 30
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 35
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
  NULL,
 | 
			
		||||
 | 
			
		||||
  // 40
 | 
			
		||||
  &conversationQueueWinnerDecide,
 | 
			
		||||
  // NULL,
 | 
			
		||||
  // NULL,
 | 
			
		||||
  // NULL,
 | 
			
		||||
  // NULL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void conversationQueueInit() {
 | 
			
		||||
  QUEUE_ITEM = QUEUE_BEGIN;
 | 
			
		||||
}
 | 
			
		||||
@@ -9,10 +9,19 @@
 | 
			
		||||
#include "../libs.h"
 | 
			
		||||
#include "STRINGS.h"
 | 
			
		||||
 | 
			
		||||
typedef void queuecallback_t();
 | 
			
		||||
 | 
			
		||||
extern uint16_t QUEUE_ITEM;
 | 
			
		||||
extern queuecallback_t *QUEUE_CALLBACKS[];
 | 
			
		||||
 | 
			
		||||
#define QUEUE_BEGIN 10
 | 
			
		||||
#define QUEUE_TAKE_BLINDS 20
 | 
			
		||||
#define QUEUE_DEBUG 1
 | 
			
		||||
#define QUEUE_BEGIN 5
 | 
			
		||||
#define QUEUE_TAKE_BLINDS 10
 | 
			
		||||
#define QUEUE_DEAL_CARDS 15
 | 
			
		||||
#define QUEUE_BEGIN_BETTING 20
 | 
			
		||||
#define QUEUE_FLOP 25
 | 
			
		||||
#define QUEUE_WINNER_DECIDE 40
 | 
			
		||||
 | 
			
		||||
void conversationQueueInit();
 | 
			
		||||
void conversationQueueNext();
 | 
			
		||||
#define conversationQueueNext() QUEUE_CALLBACKS[QUEUE_ITEM]()
 | 
			
		||||
 | 
			
		||||
void conversationQueueInit();
 | 
			
		||||
@@ -49,6 +49,7 @@ void main() {
 | 
			
		||||
  wait_vbl_done();
 | 
			
		||||
 | 
			
		||||
  // Alright begin the game logic here.
 | 
			
		||||
  BGB_MESSAGE("Begin.");
 | 
			
		||||
  conversationQueueNext();
 | 
			
		||||
 | 
			
		||||
  // Begin the loop
 | 
			
		||||
 
 | 
			
		||||
@@ -8,18 +8,22 @@
 | 
			
		||||
#include "poker.h"
 | 
			
		||||
 | 
			
		||||
pokerplayer_t POKER_PLAYERS[POKER_PLAYER_COUNT_MAX];
 | 
			
		||||
 | 
			
		||||
uint8_t POKER_DECK[CARD_DECK_SIZE];
 | 
			
		||||
uint8_t POKER_DECK_SIZE;
 | 
			
		||||
 | 
			
		||||
uint8_t POKER_COMMUNITY[POKER_COMMUNITY_SIZE_MAX];
 | 
			
		||||
uint8_t POKER_COMMUNITY_SIZE;
 | 
			
		||||
 | 
			
		||||
uint8_t POKER_PLAYER_DEALER;
 | 
			
		||||
uint8_t POKER_PLAYER_SMALL_BLIND;
 | 
			
		||||
uint8_t POKER_PLAYER_BIG_BLIND;
 | 
			
		||||
uint8_t POKER_PLAYER_BETTER;
 | 
			
		||||
 | 
			
		||||
uint16_t POKER_GAME_BLINDS_CURRENT;
 | 
			
		||||
uint16_t POKER_GAME_POT;
 | 
			
		||||
 | 
			
		||||
pokerpot_t POKER_POTS[POKER_POT_COUNT_MAX];
 | 
			
		||||
uint8_t POKER_POT_CURRENT;
 | 
			
		||||
uint8_t POKER_POT_COUNT;
 | 
			
		||||
 | 
			
		||||
void pokerInit() {
 | 
			
		||||
  uint8_t i;
 | 
			
		||||
@@ -33,8 +37,6 @@ void pokerInit() {
 | 
			
		||||
  // Set up the initial state.
 | 
			
		||||
  // TODO: Should this be randomized?
 | 
			
		||||
  POKER_PLAYER_DEALER = 0;
 | 
			
		||||
  POKER_GAME_POT = 0;
 | 
			
		||||
 | 
			
		||||
  POKER_GAME_BLINDS_CURRENT = 10;
 | 
			
		||||
 | 
			
		||||
  // Reset the round state (For the first round)
 | 
			
		||||
@@ -47,6 +49,15 @@ void pokerNewRound() {
 | 
			
		||||
 | 
			
		||||
  // Reset round state
 | 
			
		||||
  POKER_COMMUNITY_SIZE = 0;
 | 
			
		||||
  POKER_POT_COUNT = 0;
 | 
			
		||||
  POKER_POT_CURRENT = 0;
 | 
			
		||||
 | 
			
		||||
  // Reset the pots.
 | 
			
		||||
  for(i = 0; i < POKER_POT_COUNT_MAX; i++) {
 | 
			
		||||
    POKER_POTS[i].chips = 0;
 | 
			
		||||
    POKER_POTS[i].call = 0;
 | 
			
		||||
    POKER_POTS[i].playersCount = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Fill deck
 | 
			
		||||
  for(i = 0; i < CARD_DECK_SIZE; i++) POKER_DECK[i] = i;
 | 
			
		||||
@@ -91,11 +102,13 @@ void pokerNewRound() {
 | 
			
		||||
      POKER_PLAYERS[i].hand[j] = POKER_DECK[POKER_DECK_SIZE--];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pokerTakeBlinds() {
 | 
			
		||||
  // Take blinds
 | 
			
		||||
  // TODO: I need to make sure the blind players even have the chips to blind.
 | 
			
		||||
  POKER_PLAYERS[POKER_PLAYER_SMALL_BLIND].chips -= POKER_GAME_BLINDS_CURRENT;
 | 
			
		||||
  POKER_PLAYERS[POKER_PLAYER_BIG_BLIND].chips -= (POKER_GAME_BLINDS_CURRENT*2);
 | 
			
		||||
  POKER_GAME_POT += POKER_GAME_BLINDS_CURRENT * 3;
 | 
			
		||||
  POKER_POT_BET(POKER_PLAYER_SMALL_BLIND, POKER_GAME_BLINDS_CURRENT);
 | 
			
		||||
  POKER_POT_BET(POKER_PLAYER_BIG_BLIND, (POKER_GAME_BLINDS_CURRENT*2));
 | 
			
		||||
 | 
			
		||||
  // Set the initial better, we set this to the BIG BLIND player because we will
 | 
			
		||||
  // cycle to the "next better" as soon as the game starts.
 | 
			
		||||
  POKER_PLAYER_BETTER = POKER_PLAYER_BIG_BLIND;
 | 
			
		||||
}
 | 
			
		||||
@@ -9,24 +9,27 @@
 | 
			
		||||
#include "../libs.h"
 | 
			
		||||
#include "card.h"
 | 
			
		||||
#include "player.h"
 | 
			
		||||
#include "pot.h"
 | 
			
		||||
 | 
			
		||||
#define POKER_COMMUNITY_SIZE_MAX 5 
 | 
			
		||||
#define POKER_HUMAN_INDEX 0x00
 | 
			
		||||
 | 
			
		||||
#define POKER_COUNT_FLOP 0x03
 | 
			
		||||
#define POKER_COUNT_TURN 0x01
 | 
			
		||||
#define POKER_COUNT_RIVER 0x01
 | 
			
		||||
 | 
			
		||||
extern uint8_t POKER_DECK[];
 | 
			
		||||
extern uint8_t POKER_DECK_SIZE;
 | 
			
		||||
 | 
			
		||||
extern uint8_t POKER_COMMUNITY[];
 | 
			
		||||
extern uint8_t POKER_COMMUNITY_SIZE;
 | 
			
		||||
 | 
			
		||||
extern uint8_t POKER_PLAYER_DEALER;
 | 
			
		||||
extern uint8_t POKER_PLAYER_SMALL_BLIND;
 | 
			
		||||
extern uint8_t POKER_PLAYER_BIG_BLIND;
 | 
			
		||||
extern uint8_t POKER_PLAYER_BETTER;
 | 
			
		||||
 | 
			
		||||
extern uint16_t POKER_GAME_BLINDS_CURRENT;
 | 
			
		||||
extern uint16_t POKER_GAME_POT;
 | 
			
		||||
 | 
			
		||||
void pokerInit();
 | 
			
		||||
 | 
			
		||||
void pokerNewRound();
 | 
			
		||||
 | 
			
		||||
void pokerTakeBlinds();
 | 
			
		||||
void pokerNewRound();
 | 
			
		||||
							
								
								
									
										43
									
								
								src/poker/pot.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/poker/pot.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2022 Dominic Masters
 | 
			
		||||
 * 
 | 
			
		||||
 * This software is released under the MIT License.
 | 
			
		||||
 * https://opensource.org/licenses/MIT
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "../libs.h"
 | 
			
		||||
#include "player.h"
 | 
			
		||||
 | 
			
		||||
#define POKER_POT_COUNT_MAX POKER_PLAYER_COUNT_MAX
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  /** Current pot of chips */
 | 
			
		||||
  uint16_t chips;
 | 
			
		||||
 | 
			
		||||
  /** Current call value for this pot */
 | 
			
		||||
  uint16_t call;
 | 
			
		||||
 | 
			
		||||
  /** Players who are participating in the pot */
 | 
			
		||||
  uint8_t players[POKER_PLAYER_COUNT_MAX];
 | 
			
		||||
  uint8_t playersCount;
 | 
			
		||||
} pokerpot_t;
 | 
			
		||||
 | 
			
		||||
extern pokerpot_t POKER_POTS[];
 | 
			
		||||
extern uint8_t POKER_POT_CURRENT;
 | 
			
		||||
extern uint8_t POKER_POT_COUNT;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// TODO: This may become a function because if a player doesn't have enough
 | 
			
		||||
// chips to bet to the active pot, then the pot needs to autosplit, take those
 | 
			
		||||
// who have bet into the pot up to the amount that the player betting can bet,
 | 
			
		||||
// and push them into a new pot.
 | 
			
		||||
// There also needs to be a limit on this, for example;
 | 
			
		||||
// player 0 has $1200, and bets $1000, he can't bet more than that ever.
 | 
			
		||||
// player 1 has $1000, and bets all of it. The remanin
 | 
			
		||||
// player 2 has $700, and bets all o it. A new $300 sidepot auto creates
 | 
			
		||||
// player 3 has $500 and bets all of it, Another sidepot with $200 is auto made.
 | 
			
		||||
#define POKER_POT_BET(player, amount) \
 | 
			
		||||
  POKER_PLAYERS[player].chips -= amount;\
 | 
			
		||||
  POKER_POTS[POKER_POT_CURRENT].chips += amount;\
 | 
			
		||||
  POKER_POTS[POKER_POT_CURRENT].call = amount;
 | 
			
		||||
		Reference in New Issue
	
	Block a user