From b246249be7916522c6dae6d28b78dfc85474b61f Mon Sep 17 00:00:00 2001 From: cellos51 Date: Wed, 9 Jul 2025 20:00:03 -0400 Subject: [PATCH 1/3] Updated shop state to have rough functionality to switch to the next state --- graphics/background_blind_select_gfx.grit | 1 + graphics/background_blind_select_gfx.png | Bin 0 -> 3673 bytes graphics/background_shop_gfx.png | Bin 3471 -> 3428 bytes source/game.c | 193 ++++++++++++++++++---- 4 files changed, 163 insertions(+), 31 deletions(-) create mode 100644 graphics/background_blind_select_gfx.grit create mode 100644 graphics/background_blind_select_gfx.png diff --git a/graphics/background_blind_select_gfx.grit b/graphics/background_blind_select_gfx.grit new file mode 100644 index 0000000..f57bef6 --- /dev/null +++ b/graphics/background_blind_select_gfx.grit @@ -0,0 +1 @@ +-gB8 -mR8 -mLs -mRtf \ No newline at end of file diff --git a/graphics/background_blind_select_gfx.png b/graphics/background_blind_select_gfx.png new file mode 100644 index 0000000000000000000000000000000000000000..6901ea5a00d440e7d8a106a7a452e70f735f59e9 GIT binary patch literal 3673 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 delta 3205 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 7) - { - int timer_offset = timer - 6; - - for (int y = 0; y < timer_offset; y++) + 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 + { + case 0: // Intro sequence (menu and shop icon coming into frame) + { + for (int y = 7; y < 40; y++) // Shift the shop panel { - int y_from = 26 + y - timer_offset; - int y_to = 0 + y; - memcpy16(&se_mem[MAIN_BG_SBB][32 * y_to], &se_mem[MAIN_BG_SBB][32 * y_from], 9); + int x = 9; + memcpy16(&se_mem[MAIN_BG_SBB][x + 32 * (y - 1)], &se_mem[MAIN_BG_SBB][x + 32 * y], 16); } + + if (timer >= 7) // Shift the shop icon + { + int timer_offset = timer - 6; + + for (int y = 0; y < timer_offset; y++) + { + int y_from = 26 + y - timer_offset; + int y_to = 0 + y; + memcpy16(&se_mem[MAIN_BG_SBB][32 * y_to], &se_mem[MAIN_BG_SBB][32 * y_from], 9); + } + } + + if (timer == 12) + { + state = 1; + timer = 0; // Reset the timer + } + + break; + } + case 1: // Shop menu input and selection + { + // Shop input logic + if (key_hit(KEY_UP)) + { + top_row = true; + + if (selection_x > max_items_top) + { + selection_x = max_items_top; + } + } + else if (key_hit(KEY_DOWN)) + { + top_row = false; + + if (selection_x > max_items_bottom) + { + selection_x = max_items_bottom; + } + } + else if (key_hit(KEY_LEFT)) + { + if (selection_x > 0) + { + selection_x--; + } + } + else if (key_hit(KEY_RIGHT)) + { + if (top_row && selection_x < max_items_top) + { + selection_x++; + } + else if (!top_row && selection_x < max_items_bottom) + { + selection_x++; + } + } + + // Shop selection logic + if (selection_x == 0 && top_row) + { + memcpy16(&pal_bg_mem[7], &pal_bg_mem[3], 1); + memset16(&pal_bg_mem[5], 0xFFFF, 1); + + if (key_hit(KEY_A)) + { + // Go to next blind selection game state + state = 2; // Go to the outro sequence state + timer = 0; // Reset the timer + + memcpy16(&pal_bg_mem[5], &pal_bg_mem[6], 1); + + // memcpy16(&pal_bg_mem[16], &pal_bg_mem[6], 1); + // This changes the color of the button to a dark red. + // However, it shares a palette with the shop icon, so it will change the color of the shop icon as well. + // And I don't care enough to fix it right now. + } + } + else if (selection_x == 0 && !top_row) + { + memset16(&pal_bg_mem[7], 0xFFFF, 1); + memcpy16(&pal_bg_mem[5], &pal_bg_mem[16], 1); + + if (key_hit(KEY_A)) + { + // Do shop re-roll for money + } + } + + break; } - - // if (timer == 8) - // { - // int y_from = 26; - // int y_to = 0; - // memcpy16(&se_mem[MAIN_BG_SE_BASE][32 * y_to], &se_mem[MAIN_BG_SE_BASE][32 * y_from], 9); - // } + case 2: // Outro sequence (menu and shop icon going out of frame) + { + // This is reused from game_round_end() + // Shift the shop panel + int x = 9; + for (int y = 19; y > 5; y--) + { + memcpy16(&se_mem[MAIN_BG_SBB][x + 32 * (y + 1)], &se_mem[MAIN_BG_SBB][x + 32 * y], 16); + } + + // Shift the shop icon + for (int y = 0; y < 5; y++) + { + memcpy16(&se_mem[MAIN_BG_SBB][32 * (y - 1)], &se_mem[MAIN_BG_SBB][32 * y], 9); + } + + if (timer == 1) + { + int y = 6; + memset16(&se_mem[MAIN_BG_SBB][32 * (y - 1)], 0x0006, 1); + memset16(&se_mem[MAIN_BG_SBB][1 + 32 * (y - 1)], 0x0007, 2); + memset16(&se_mem[MAIN_BG_SBB][3 + 32 * (y - 1)], 0x0008, 1); + memset16(&se_mem[MAIN_BG_SBB][4 + 32 * (y - 1)], 0x0009, 4); + memset16(&se_mem[MAIN_BG_SBB][7 + 32 * (y - 1)], 0x0408, 1); + memset16(&se_mem[MAIN_BG_SBB][8 + 32 * (y - 1)], 0x0406, 1); + } + else if (timer == 2) + { + int y = 5; + memset16(&se_mem[MAIN_BG_SBB][32 * (y - 1)], 0x0001, 1); + memset16(&se_mem[MAIN_BG_SBB][1 + 32 * (y - 1)], 0x0002, 7); + memset16(&se_mem[MAIN_BG_SBB][8 + 32 * (y - 1)], 0x0401, 1); + } + + if (timer >= 20) + { + state = 3; // Go to the next state + timer = 0; // Reset the timer + } + + break; + } + default: + break; } } From e1c1d68694fb0ef2c1de3ef3d4ac0a4920dc368b Mon Sep 17 00:00:00 2001 From: cellos51 Date: Wed, 9 Jul 2025 21:37:49 -0400 Subject: [PATCH 2/3] basic implementation of blind select screen --- graphics/background_blind_select_gfx.png | Bin 3673 -> 3675 bytes include/blind.h | 21 +++-- include/game.h | 1 + source/blind.c | 6 +- source/game.c | 106 ++++++++++++++++++++++- 5 files changed, 120 insertions(+), 14 deletions(-) diff --git a/graphics/background_blind_select_gfx.png b/graphics/background_blind_select_gfx.png index 6901ea5a00d440e7d8a106a7a452e70f735f59e9..e901bfd7b7ad85e16b9c4b94df1f3d15fd3ec534 100644 GIT binary patch delta 3499 zcmYk9c|2768^>p1ER8IaqLfKpg)2)LB9SFRlyxjIh#8?#WY3w&TGy>6ca%Mq$ToIa z#!S|bp(HVg$}(5eRMx@F{HE^jzJ9;+dY#uf&v~9d&iQ;l&+~nsF(szb-D_fYAk!0Z zXL?BSNI((E@!hzWjvFeUyTlne$&tzD(T6p6q>^4_R^O{TxQEsKpaYFUPl$fhZjP;0 z%iK$|W+~;OGa*ES8)kL87;44Cd0$BpQG?-8+8+k@O!mGpzQf*R0fUpQBL`4pAq|

mse=L?(@ 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 MAX_ANTE) { @@ -34,7 +34,7 @@ int blind_get_requirement(enum BlindType type, int ante) } } -int blind_get_reward(enum BlindType type) +int blind_get_reward(int type) { switch (type) { @@ -49,7 +49,7 @@ int blind_get_reward(enum BlindType type) } } -Sprite *blind_token_new(enum BlindType type, int x, int y, int sprite_index) +Sprite *blind_token_new(int type, int x, int y, int sprite_index) { Sprite *sprite = NULL; diff --git a/source/game.c b/source/game.c index 6c2f7b9..cc12141 100644 --- a/source/game.c +++ b/source/game.c @@ -15,6 +15,7 @@ #include "background_play_gfx.h" #include "background_round_end_gfx.h" #include "background_shop_gfx.h" +#include "background_blind_select_gfx.h" #include "soundbank.h" @@ -22,7 +23,7 @@ static int timer = 0; // This might already exist in libtonc but idk so i'm just static int game_speed = 1; static int background = 0; -static enum GameState game_state = GAME_ROUND_END; // The current game state, this is used to determine what the game is doing at any given time +static enum GameState game_state = GAME_PLAYING; // 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 PlayState play_state = PLAY_PLAYING; @@ -31,7 +32,8 @@ static enum HandType hand_type = NONE; static Sprite *playing_blind_token = NULL; // The sprite that displays the blind when in "GAME_PLAYING/GAME_ROUND_END" state static Sprite *round_end_blind_token = NULL; // The sprite that displays the blind when in "GAME_ROUND_END" state -static enum BlindType current_blind = SMALL_BLIND; +static int current_blind = SMALL_BLIND; +static enum BlindState blinds[MAX_BLINDS] = {BLIND_CURRENT, BLIND_UPCOMING, BLIND_UPCOMING}; // The current state of the blinds, this is used to determine what the game is doing at any given time static int hands = 4; static int discards = 4; @@ -387,6 +389,67 @@ void change_background(int id) memcpy16(&pal_bg_mem[7], &pal_bg_mem[3], 1); // Disable the button highlight colors memcpy16(&pal_bg_mem[5], &pal_bg_mem[16], 1); } + else if (id == BG_ID_BLIND_SELECT) + { + memcpy(pal_bg_mem, background_blind_select_gfxPal, 64); + GRIT_CPY(&tile_mem[MAIN_BG_CBB], background_blind_select_gfxTiles); + GRIT_CPY(&se_mem[MAIN_BG_SBB], background_blind_select_gfxMap); + + for (int i = 0; i < MAX_BLINDS; i++) + { + if (blinds[i] != BLIND_CURRENT && (i == SMALL_BLIND || i == BIG_BLIND)) + { + int x_from = 0; + int y_from = 24 + (i * 4); + + int x_to = 9 + (i * 5); + int y_to = 29; + + for (int j = 0; j < 3; j++) + { + memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * y_to], &se_mem[MAIN_BG_SBB][x_from + 32 * y_from], 5); + y_from++; + y_to++; + } + } + + if (blinds[i] == BLIND_CURRENT) + { + int x_from = 0; + int y_from = 27; + + int x_to = 9 + (i * 5); + int y_to = 31; + + for (int y = 7; y < 40; y++) // Shift the shop panel + { + memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * (y - 1)], &se_mem[MAIN_BG_SBB][x_to + 32 * y], 5); + } + + if (i == BIG_BLIND) + { + y_from = 31; + } + else if (i == BOSS_BLIND) + { + x_from = x_to; + y_from = 30; + } + + memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * y_to], &se_mem[MAIN_BG_SBB][x_from + 32 * y_from], 5); + } + else if (blinds[i] == BLIND_UPCOMING) + { + int x_from = 0; + int y_from = 20; + + int x_to = 10 + (i * 5); + int y_to = 20; + + memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * y_to], &se_mem[MAIN_BG_SBB][x_from + 32 * y_from], 3); + } + } + } else { return; // Invalid background ID @@ -1873,7 +1936,7 @@ void game_shop() memset16(&se_mem[MAIN_BG_SBB][1 + 32 * (y - 1)], 0x0007, 2); memset16(&se_mem[MAIN_BG_SBB][3 + 32 * (y - 1)], 0x0008, 1); memset16(&se_mem[MAIN_BG_SBB][4 + 32 * (y - 1)], 0x0009, 4); - memset16(&se_mem[MAIN_BG_SBB][7 + 32 * (y - 1)], 0x0408, 1); + memset16(&se_mem[MAIN_BG_SBB][7 + 32 * (y - 1)], 0x000A, 1); memset16(&se_mem[MAIN_BG_SBB][8 + 32 * (y - 1)], 0x0406, 1); } else if (timer == 2) @@ -1892,6 +1955,41 @@ void game_shop() break; } + default: + game_state = GAME_BLIND_SELECT; // If we reach here, we should go to the blind select state + state = 0; // Reset the state + timer = 0; // Reset the timer + + selection_x = 0; // Reset the selection + top_row = true; // Reset the top row selection + break; + } +} + +void game_blind_select() +{ + change_background(BG_ID_BLIND_SELECT); + + static int state = 0; + + 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 + { + case 0: // Intro sequence (menu and shop icon coming into frame) + { + for (int y = 7; y < 40; y++) // Shift the shop panel + { + int x = 9; + memcpy16(&se_mem[MAIN_BG_SBB][x + 32 * (y - 1)], &se_mem[MAIN_BG_SBB][x + 32 * y], 16); + } + + if (timer == 12) + { + state = 1; + timer = 0; // Reset the timer + } + + break; + } default: break; } @@ -1913,7 +2011,7 @@ void game_update() game_shop(); break; case GAME_BLIND_SELECT: - // Handle blind select logic here + game_blind_select(); break; case GAME_LOSE: // Handle lose logic here From f027c7bea0bcdf72439da88b73e9c2cdf9a53e82 Mon Sep 17 00:00:00 2001 From: cellos51 Date: Wed, 9 Jul 2025 22:06:49 -0400 Subject: [PATCH 3/3] Added the ability to skip blinds in the blind select state --- source/game.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/source/game.c b/source/game.c index cc12141..3f9d50d 100644 --- a/source/game.c +++ b/source/game.c @@ -174,7 +174,6 @@ void sort_hand_by_rank() } } - void sort_cards() { if (sort_by_suit) @@ -395,9 +394,15 @@ void change_background(int id) GRIT_CPY(&tile_mem[MAIN_BG_CBB], background_blind_select_gfxTiles); GRIT_CPY(&se_mem[MAIN_BG_SBB], background_blind_select_gfxMap); + // Disable the button highlight colors + // Select button PID is 15 and the outline is 18 + memcpy16(&pal_bg_mem[18], &pal_bg_mem[15], 1); + // Skip button PID is 10 and the outline is 5 + memcpy16(&pal_bg_mem[10 ], &pal_bg_mem[5], 1); + for (int i = 0; i < MAX_BLINDS; i++) { - if (blinds[i] != BLIND_CURRENT && (i == SMALL_BLIND || i == BIG_BLIND)) + if (blinds[i] != BLIND_CURRENT && (i == SMALL_BLIND || i == BIG_BLIND)) // Make the skip button gray { int x_from = 0; int y_from = 24 + (i * 4); @@ -413,7 +418,7 @@ void change_background(int id) } } - if (blinds[i] == BLIND_CURRENT) + if (blinds[i] == BLIND_CURRENT) // Raise the blind panel up a bit { int x_from = 0; int y_from = 27; @@ -421,7 +426,7 @@ void change_background(int id) int x_to = 9 + (i * 5); int y_to = 31; - for (int y = 7; y < 40; y++) // Shift the shop panel + for (int y = 7; y < 40; y++) { memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * (y - 1)], &se_mem[MAIN_BG_SBB][x_to + 32 * y], 5); } @@ -438,7 +443,7 @@ void change_background(int id) memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * y_to], &se_mem[MAIN_BG_SBB][x_from + 32 * y_from], 5); } - else if (blinds[i] == BLIND_UPCOMING) + else if (blinds[i] == BLIND_UPCOMING) // Change the select icon to "NEXT" { int x_from = 0; int y_from = 20; @@ -446,6 +451,26 @@ void change_background(int id) int x_to = 10 + (i * 5); int y_to = 20; + memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * y_to], &se_mem[MAIN_BG_SBB][x_from + 32 * y_from], 3); + } + else if (blinds[i] == BLIND_SKIPPED) // Change the select icon to "SKIP" + { + int x_from = 3; + int y_from = 20; + + int x_to = 10 + (i * 5); + int y_to = 20; + + memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * y_to], &se_mem[MAIN_BG_SBB][x_from + 32 * y_from], 3); + } + else if (blinds[i] == BLIND_DEFEATED) // Change the select icon to "DEFEATED" + { + int x_from = 6; + int y_from = 20; + + int x_to = 10 + (i * 5); + int y_to = 20; + memcpy16(&se_mem[MAIN_BG_SBB][x_to + 32 * y_to], &se_mem[MAIN_BG_SBB][x_from + 32 * y_from], 3); } } @@ -686,6 +711,23 @@ void deck_shuffle() card_focused = 0; } +void increment_blind(enum BlindState increment_reason) +{ + current_blind++; + if (current_blind >= MAX_BLINDS) + { + current_blind = 0; + blinds[0] = BLIND_CURRENT; // Reset the blinds to the first one + blinds[1] = BLIND_UPCOMING; // Set the next blind to upcoming + blinds[2] = BLIND_UPCOMING; // Set the next blind to upcoming + } + else + { + blinds[current_blind] = BLIND_CURRENT; + blinds[current_blind - 1] = increment_reason; + } +} + // Game functions void game_init() { @@ -1962,6 +2004,9 @@ void game_shop() selection_x = 0; // Reset the selection top_row = true; // Reset the top row selection + + increment_blind(BLIND_DEFEATED); + break; } } @@ -1972,11 +2017,13 @@ void game_blind_select() static int state = 0; + static bool top_row = true; // There's only one row in this game state, but this is here for consistency with the shop state if we make these variables global or something + 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 { case 0: // Intro sequence (menu and shop icon coming into frame) { - for (int y = 7; y < 40; y++) // Shift the shop panel + for (int y = 7; y < 40; y++) { int x = 9; memcpy16(&se_mem[MAIN_BG_SBB][x + 32 * (y - 1)], &se_mem[MAIN_BG_SBB][x + 32 * y], 16); @@ -1990,6 +2037,45 @@ void game_blind_select() break; } + case 1: // Blind select input and selection + { + // Blind select input logic + if (key_hit(KEY_UP)) + { + top_row = true; + } + else if (key_hit(KEY_DOWN)) + { + top_row = false; + } + else if (key_hit(KEY_A)) + { + if (top_row) + { + state = 2; + } + else if (current_blind != BOSS_BLIND) + { + increment_blind(BLIND_SKIPPED); + state = 0; + background = -1; // Force refresh of the background + timer = 0; + } + } + + if (top_row) + { + memset16(&pal_bg_mem[18], 0xFFFF, 1); + memcpy16(&pal_bg_mem[10], &pal_bg_mem[5], 1); + } + else + { + memcpy16(&pal_bg_mem[18], &pal_bg_mem[15], 1); + memset16(&pal_bg_mem[10], 0xFFFF, 1); + } + + break; + } default: break; }