A little bit of scope creep here.

Renamed some of the state functions to include the word 'on'. Also
replaced the switch statement in set_hand() with a lookup table
access. This lookup table contains the chips, mult and display name
for a given hand. Some may not like these changes, so we can easily
roll back if need be.
This commit is contained in:
Drew
2025-10-14 10:20:43 -05:00
parent 121bbc01d5
commit 04ffb0d4dd
5 changed files with 77 additions and 131 deletions
+8 -8
View File
@@ -1,9 +1,9 @@
// (stateEnum, on_init, on_update, on_exit) // (stateEnum, on_init, on_update, on_exit)
DEF_STATE_INFO(GAME_STATE_SPLASH_SCREEN, splash_screen_init, splash_screen_update, _noop) DEF_STATE_INFO(GAME_STATE_SPLASH_SCREEN, splash_screen_on_init, splash_screen_on_update, _noop)
DEF_STATE_INFO(GAME_STATE_MAIN_MENU, game_main_menu_init, game_main_menu_update, _noop) DEF_STATE_INFO(GAME_STATE_MAIN_MENU, game_main_menu_on_init, game_main_menu_on_update, _noop)
DEF_STATE_INFO(GAME_STATE_PLAYING, game_round_init, game_playing_update, _noop) DEF_STATE_INFO(GAME_STATE_PLAYING, game_round_on_init, game_playing_on_update, _noop)
DEF_STATE_INFO(GAME_STATE_ROUND_END, _noop, game_round_end_update, game_round_end_exit) DEF_STATE_INFO(GAME_STATE_ROUND_END, _noop, game_round_end_on_update, game_round_end_on_exit)
DEF_STATE_INFO(GAME_STATE_SHOP, _noop, game_shop_update, game_state_shop_exit) DEF_STATE_INFO(GAME_STATE_SHOP, _noop, game_shop_on_update, game_shop_on_exit)
DEF_STATE_INFO(GAME_STATE_BLIND_SELECT, _noop, game_blind_select_update, game_blind_select_exit) DEF_STATE_INFO(GAME_STATE_BLIND_SELECT, _noop, game_blind_select_on_update, game_blind_select_on_exit)
DEF_STATE_INFO(GAME_STATE_LOSE, game_lose_init, game_lose_update, _noop) DEF_STATE_INFO(GAME_STATE_LOSE, game_lose_on_init, game_lose_on_update, _noop)
DEF_STATE_INFO(GAME_STATE_WIN, game_win_init, game_win_update, _noop) DEF_STATE_INFO(GAME_STATE_WIN, game_win_on_init, game_win_on_update, _noop)
-15
View File
@@ -1,15 +0,0 @@
DEF_JOKER_GFX(0)
DEF_JOKER_GFX(1)
DEF_JOKER_GFX(2)
DEF_JOKER_GFX(3)
DEF_JOKER_GFX(4)
DEF_JOKER_GFX(5)
DEF_JOKER_GFX(6)
DEF_JOKER_GFX(7)
DEF_JOKER_GFX(8)
DEF_JOKER_GFX(9)
DEF_JOKER_GFX(10)
DEF_JOKER_GFX(11)
DEF_JOKER_GFX(12)
DEF_JOKER_GFX(13)
DEF_JOKER_GFX(14)
+2 -2
View File
@@ -7,7 +7,7 @@
#define SPLASH_DURATION_SECONDS 10 #define SPLASH_DURATION_SECONDS 10
#define SPLASH_DURATION_FRAMES (SPLASH_FPS * SPLASH_DURATION_SECONDS) #define SPLASH_DURATION_FRAMES (SPLASH_FPS * SPLASH_DURATION_SECONDS)
void splash_screen_init(); void splash_screen_on_init();
void splash_screen_update(); void splash_screen_on_update();
#endif // SPLASH_SCREEN_H #endif // SPLASH_SCREEN_H
+65 -104
View File
@@ -57,26 +57,35 @@ typedef enum
DISPLAY_BLIND_PANEL DISPLAY_BLIND_PANEL
} _BlindSelectStates; } _BlindSelectStates;
typedef struct
{
int chips;
int mult;
char *display_name;
} HandValues;
// Used as a No Operation for game states that have no init and/or exit function. // Used as a No Operation for game states that have no init and/or exit function.
// ricfehr3 did the work of determining whether a noop or a NULL check was more // ricfehr3 did the work of determining whether a noop or a NULL check was more
// efficient. Well, this is the answer. // efficient. Well, this is the answer.
// Thanks! // Thanks!
static void _noop() {} static void _noop() {}
static void game_main_menu_init(); // These functions need to be forward declared
static void game_main_menu_update(); // so they're visible to the state_info array.
static void game_lose_init(); static void game_main_menu_on_init();
static void game_win_init(); static void game_main_menu_on_update();
static void game_playing_update(); static void game_round_on_init();
static void game_round_end_update(); static void game_playing_on_update();
static void game_shop_update(); static void game_round_end_on_update();
static void game_blind_select_update(); static void game_round_end_on_exit();
static void game_lose_update(); static void game_shop_on_update();
static void game_win_update(); static void game_shop_on_exit();
static void game_round_init(); static void game_blind_select_on_update();
static void game_state_shop_exit(); static void game_blind_select_on_exit();
static void game_blind_select_exit(); static void game_lose_on_init();
static void game_round_end_exit(); static void game_lose_on_update();
static void game_win_on_init();
static void game_win_on_update();
static uint rng_seed = 0; static uint rng_seed = 0;
@@ -84,7 +93,7 @@ static uint timer = 0; // This might already exist in libtonc but idk so i'm jus
static int game_speed = 1; // BY DEFAULT IS SET TO 1, but if changed to 2 or more, should speed up all (or most) of the game aspects that should be sped up by speed, as in the original game. static int game_speed = 1; // BY DEFAULT IS SET TO 1, but if changed to 2 or more, should speed up all (or most) of the game aspects that should be sped up by speed, as in the original game.
static int background = 0; static int background = 0;
StateInfo states[GAME_STATE_MAX] = static const StateInfo state_info[GAME_STATE_MAX] =
{ {
#define DEF_STATE_INFO(stateEnum, init_fn, update_fn, exit_fn) \ #define DEF_STATE_INFO(stateEnum, init_fn, update_fn, exit_fn) \
{ .state = stateEnum, .on_init = init_fn, .on_update = update_fn, .on_exit = exit_fn }, { .state = stateEnum, .on_init = init_fn, .on_update = update_fn, .on_exit = exit_fn },
@@ -92,6 +101,24 @@ StateInfo states[GAME_STATE_MAX] =
#undef DEF_STATE_INFO #undef DEF_STATE_INFO
}; };
static const HandValues hand_values[] =
{
{ .chips = 0, .mult = 0, .display_name = NULL }, // NONE
{ .chips = 5, .mult = 1, .display_name = "HIGH C" }, // HIGH_CARD
{ .chips = 10, .mult = 2, .display_name = "PAIR" }, // PAIR
{ .chips = 20, .mult = 2, .display_name = "2 PAIR" }, // TWO_PAIR
{ .chips = 30, .mult = 3, .display_name = "3 OAK" }, // THREE_OF_A_KIND
{ .chips = 60, .mult = 7, .display_name = "4 OAK" }, // FOUR_OF_A_KIND
{ .chips = 30, .mult = 4, .display_name = "STRT" }, // STRAIGHT
{ .chips = 35, .mult = 4, .display_name = "FLUSH" }, // FLUSH
{ .chips = 40, .mult = 4, .display_name = "FULL H" }, // FULL_HOUSE
{ .chips = 100, .mult = 8, .display_name = "STRT F" }, // STRAIGHT_FLUSH
{ .chips = 100, .mult = 8, .display_name = "ROYAL F" }, // ROYAL_FLUSH
{ .chips = 120, .mult = 12, .display_name = "5 OAK" }, // FIVE_OF_A_KIND
{ .chips = 140, .mult = 14, .display_name = "FLUSH H" }, // FLUSH_HOUSE
{ .chips = 160, .mult = 16, .display_name = "FLUSH 5" } // FLUSH_FIVE
};
static enum GameState game_state = GAME_STATE_SPLASH_SCREEN; // The current game state, this is used to determine what the game is doing at any given time static enum GameState game_state = GAME_STATE_SPLASH_SCREEN; // The current game state, this is used to determine what the game is doing at any given time
static enum HandState hand_state = HAND_DRAW; static enum HandState hand_state = HAND_DRAW;
static enum PlayState play_state = PLAY_PLAYING; static enum PlayState play_state = PLAY_PLAYING;
@@ -935,79 +962,13 @@ void set_hand()
{ {
tte_erase_rect_wrapper(HAND_TYPE_RECT); tte_erase_rect_wrapper(HAND_TYPE_RECT);
hand_type = hand_get_type(); hand_type = hand_get_type();
switch (hand_type)
{
case HIGH_CARD:
print_hand_type("HIGH C");
chips = 5;
mult = 1;
break;
case PAIR:
print_hand_type("PAIR");
chips = 10;
mult = 2;
break;
case TWO_PAIR:
print_hand_type("2 PAIR");
chips = 20;
mult = 2;
break;
case THREE_OF_A_KIND:
print_hand_type("3 OAK");
chips = 30;
mult = 3;
break;
case STRAIGHT:
print_hand_type("STRT");
chips = 30;
mult = 4;
break;
case FLUSH:
print_hand_type("FLUSH");
chips = 35;
mult = 4;
break;
case FULL_HOUSE:
print_hand_type("FULL H");
chips = 40;
mult = 4;
break;
case FOUR_OF_A_KIND:
print_hand_type("4 OAK");
chips = 60;
mult = 7;
break;
case STRAIGHT_FLUSH:
print_hand_type("STRT F");
chips = 100;
mult = 8;
break;
case ROYAL_FLUSH:
print_hand_type("ROYAL F");
chips = 100;
mult = 8;
break;
case FIVE_OF_A_KIND:
print_hand_type("5 OAK");
chips = 120;
mult = 12;
break;
case FLUSH_HOUSE:
print_hand_type("FLUSH H");
chips = 140;
mult = 14;
break;
case FLUSH_FIVE:
print_hand_type("FLUSH 5");
chips = 160;
mult = 16;
break;
case NONE:
chips = 0;
mult = 0;
break;
}
HandValues hand = hand_values[hand_type];
chips = hand.chips;
mult = hand.mult;
print_hand_type(hand.display_name);
display_chips(chips); display_chips(chips);
display_mult(mult); display_mult(mult);
} }
@@ -1151,7 +1112,7 @@ void increment_blind(enum BlindState increment_reason)
} }
} }
static void game_round_init() static void game_round_on_init()
{ {
hand_state = HAND_DRAW; hand_state = HAND_DRAW;
cards_drawn = 0; cards_drawn = 0;
@@ -1200,7 +1161,7 @@ static void game_round_init()
deck_shuffle(); // Shuffle the deck at the start of the round deck_shuffle(); // Shuffle the deck at the start of the round
} }
static void game_main_menu_init() static void game_main_menu_on_init()
{ {
affine_background_change_background(AFFINE_BG_MAIN_MENU); affine_background_change_background(AFFINE_BG_MAIN_MENU);
change_background(BG_ID_MAIN_MENU); change_background(BG_ID_MAIN_MENU);
@@ -1221,7 +1182,7 @@ static void game_over_init()
main_bg_se_copy_expand_3x3_rect(GAME_OVER_DIALOG_DEST_RECT, GAME_OVER_SRC_RECT_3X3_POS); main_bg_se_copy_expand_3x3_rect(GAME_OVER_DIALOG_DEST_RECT, GAME_OVER_SRC_RECT_3X3_POS);
} }
static void game_lose_init() static void game_lose_on_init()
{ {
game_over_init(); game_over_init();
// Using the text color to match the "Game Over" text // Using the text color to match the "Game Over" text
@@ -1229,7 +1190,7 @@ static void game_lose_init()
} }
static void game_win_init() static void game_win_on_init()
{ {
game_over_init(); game_over_init();
// Using the text color to match the "You Win" text // Using the text color to match the "You Win" text
@@ -1241,8 +1202,8 @@ void game_change_state(enum GameState new_game_state)
{ {
timer = TM_ZERO; // Reset the timer timer = TM_ZERO; // Reset the timer
states[game_state].on_exit(); state_info[game_state].on_exit();
states[new_game_state].on_init(); state_info[new_game_state].on_init();
game_state = new_game_state; game_state = new_game_state;
} }
@@ -2124,7 +2085,7 @@ static void game_round_end_cashout()
display_score(score); // Set the score display display_score(score); // Set the score display
} }
static void game_playing_update() static void game_playing_on_update()
{ {
// Background logic (thissss might be moved to the card'ssss logic later. I'm a sssssnake) // Background logic (thissss might be moved to the card'ssss logic later. I'm a sssssnake)
if (hand_state == HAND_DRAW || hand_state == HAND_DISCARD || hand_state == HAND_SELECT) if (hand_state == HAND_DRAW || hand_state == HAND_DISCARD || hand_state == HAND_SELECT)
@@ -2154,7 +2115,7 @@ static void game_playing_update()
game_playing_ui_text_update(); game_playing_ui_text_update();
} }
static void game_round_end_exit() static void game_round_end_on_exit()
{ {
// Cleanup blind tokens from this round to avoid accumulating // Cleanup blind tokens from this round to avoid accumulating
// allocated blind sprites each round // allocated blind sprites each round
@@ -2165,7 +2126,7 @@ static void game_round_end_exit()
// TODO: Reuse sprites for blind selection? // TODO: Reuse sprites for blind selection?
} }
static void game_round_end_update() static void game_round_end_on_update()
{ {
static int blind_reward = 0; static int blind_reward = 0;
static int hand_reward = 0; static int hand_reward = 0;
@@ -2842,7 +2803,7 @@ static void game_shop_outro()
} }
} }
static void game_shop_update() static void game_shop_on_update()
{ {
change_background(BG_ID_SHOP); change_background(BG_ID_SHOP);
@@ -2886,7 +2847,7 @@ static void game_shop_update()
} }
} }
static void game_state_shop_exit() static void game_shop_on_exit()
{ {
state = 0; // Reset the state state = 0; // Reset the state
@@ -2906,7 +2867,7 @@ static void game_state_shop_exit()
increment_blind(BLIND_DEFEATED); // TODO: Move to game_round_end()? increment_blind(BLIND_DEFEATED); // TODO: Move to game_round_end()?
} }
static void game_blind_select_update() static void game_blind_select_on_update()
{ {
switch (state) // I'm only using magic numbers here for the sake of simplicity since it's just sequential, but you can replace them with named constants or enums if it makes it clearer switch (state) // I'm only using magic numbers here for the sake of simplicity since it's just sequential, but you can replace them with named constants or enums if it makes it clearer
{ {
@@ -3066,7 +3027,7 @@ static void game_blind_select_update()
} }
} }
static void game_blind_select_exit() static void game_blind_select_on_exit()
{ {
state = 0; state = 0;
timer = 0; timer = 0;
@@ -3074,7 +3035,7 @@ static void game_blind_select_exit()
background = UNDEFINED; background = UNDEFINED;
} }
static void game_main_menu_update() static void game_main_menu_on_update()
{ {
change_background(BG_ID_MAIN_MENU); change_background(BG_ID_MAIN_MENU);
@@ -3175,7 +3136,7 @@ static void game_over_anim_frame()
main_bg_se_move_rect_1_tile_vert(GAME_OVER_ANIM_RECT, SE_UP); main_bg_se_move_rect_1_tile_vert(GAME_OVER_ANIM_RECT, SE_UP);
} }
static void game_lose_update() static void game_lose_on_update()
{ {
if (timer < GAME_OVER_ANIM_FRAMES) if (timer < GAME_OVER_ANIM_FRAMES)
{ {
@@ -3187,7 +3148,7 @@ static void game_lose_update()
} }
} }
static void game_win_update() static void game_win_on_update()
{ {
if (timer < GAME_OVER_ANIM_FRAMES) if (timer < GAME_OVER_ANIM_FRAMES)
{ {
@@ -3205,5 +3166,5 @@ void game_update()
jokers_update_loop(); jokers_update_loop();
states[game_state].on_update(); state_info[game_state].on_update();
} }
+2 -2
View File
@@ -8,14 +8,14 @@
static const Rect COUNTDOWN_TIMER_RECT = {208, 144, 240, 152}; static const Rect COUNTDOWN_TIMER_RECT = {208, 144, 240, 152};
static uint timer = 0; static uint timer = 0;
void splash_screen_init() void splash_screen_on_init()
{ {
tte_printf("#{P:72,8; cx:0xF000}DISCLAIMER"); tte_printf("#{P:72,8; cx:0xF000}DISCLAIMER");
tte_printf("#{P:8,24; cx:0xF000}This project is NOT endorsed \n by or affiliated with \n Playstack or LocalThunk.\n\n If you have paid for this, \n you have been scammed \n and should request a refund \n IMMEDIATELY. \n\n The only official place \n to obtain this is from: \n\n 'github.com/\n cellos51/balatro-gba'"); tte_printf("#{P:8,24; cx:0xF000}This project is NOT endorsed \n by or affiliated with \n Playstack or LocalThunk.\n\n If you have paid for this, \n you have been scammed \n and should request a refund \n IMMEDIATELY. \n\n The only official place \n to obtain this is from: \n\n 'github.com/\n cellos51/balatro-gba'");
tte_printf("#{P:8,144; cx:0xF000}(Press any key to skip)"); tte_printf("#{P:8,144; cx:0xF000}(Press any key to skip)");
} }
void splash_screen_update() void splash_screen_on_update()
{ {
timer++; timer++;