From a56bba2c0e56219d74ccb501909da26f409525c6 Mon Sep 17 00:00:00 2001 From: cellos51 Date: Sat, 5 Jul 2025 19:34:48 -0400 Subject: [PATCH] implemented shop screen after round end --- graphics/background_shop_gfx.png | Bin 3065 -> 3471 bytes include/game.h | 1 + include/util.h | 36 ++++++ source/game.c | 194 +++++++++++++++++++++++++------ 4 files changed, 195 insertions(+), 36 deletions(-) create mode 100644 include/util.h diff --git a/graphics/background_shop_gfx.png b/graphics/background_shop_gfx.png index 1a9aa46530d78e7006c4b4408584ecfafc8e4f74..cecb7c7371644911cab973bc60bea11d39e1deb1 100644 GIT binary patch literal 3471 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 Q-*^D@B@3epLu}0d0Kq9aw*UYD delta 2966 zcmV;H3u*L^8~GQI77GBN2nGNE05aR*WsxCL2`&IS06c*qHrtVWAb$h_As@hq*^B@H z3q46hK~#9!?VV3(9M>Jke+oLt3K+EVNCvw&ZKEhFjA;sLNpwi9(o;}Lp_mjmwlAia zCMX9R910;&FgS+>atfvpJ2f>TkYdwQ!AcLZlP)-5gj7d%Tw@z-t+fI}Y@ND2Y~OnJ z?VCTl^Y_hsKCtY(nSVF)=HGXIzu$Xr-VBI~p`oGX){%3v@7kZFj9lCIjtqTrP`0+V z1_ZzYp5YV#AYcGMzyN@N0T3_%?NcumvuQc*}OIP$CN~BC_k! z9}0Z}?#=#@y8wuR0RRC5K%6eL&fOQrtv=x0-#p-|LpcT9C4b&iuZtZ2+tc*v_e74q z|1`aDUgW?V?c{gA{ee9Dmv1v$UmZiQA|4tVYI3XOkFb5#ZM}YBj&DFeQ1vo{s+o0H zV%cteO;%V{VyR=+UuHnOcHiW-U%#N^8;r8?;iY9OPQv4vz1-=53$2T{;y6|uLw?X^F1TELnJeBD(|q<*!@N_1}FxkYO#$Gwiix8~X1Pa2?|s>d{46J>6{~O*O&p zc}mP`p4(a~VNSm`FY>`#o)*7WtF^7Z$t5>gZGQk_U>6m~G1fktnsaX7Se8A{@0Hs( zmfOuftEabhSyHz!{o>sYtE}Z!O-r_P_XNm9z)HkAK{df@9g`c}S>xQQ1l#kgLYrLMisN*N z&1;_5HiOpn1Mx!X1*}Bi9vrTh_|ud(?0>v|W8b2T!9 zQ?GZq;90H@P$YU9R<=>ETR+01J{TXv%GwRX%Jx9TajY3iHcHG4P}mq40RR*!1_prq zT427P3t*uI-oAFBG$)}<#|kB}z|TFoDgP$Ja2?@9tH-C7z;>hDh9TyrPF9MD--W4u1Kn`4J0I*cRdK~Lc z2gSI=zyLXjfmJMPns%r4e>I)gwpQAJ!FD`5ay067sW?v0O-TB`4Pt53>-5BeVhMPn z`l76@{<{<>VWRpXcLEekz}(mX1&DzGz)}kg!7y5f-Pr!JzpsEFJa|xwi+?yiKHj%@ zw~m}c1vWo`KRMX6S;T{77q2?jUPbKw3=P=JwIk=O7BMb#1k0<$OM9}NjP4k1eG|)K z5mSj35yZ>2L%;xlfB_IN09XT+STS<eVsHP5P*O|V{U)9Am{dXE_0{d{{RR$ zhk|xnWRt)F5O7ZMbCCf;LM2w3*4E24HqFO<1}rcD0*1KUl@@E<3d9e7aAgp*YvM151St#uNHXc>OFZpvsdm{cggV5vb|?Cjeg4X zg$67z0s|~?tTFKL(sJ7p+s5$kkCmcKzycSNisPg%C_bPLxe@Tr)qAqNGSZ&5Rm1@K z5%5=^iTw1}$?m~dpMQBSTDWyb4t)Q6i59rQNu#F^{=NcG|!p8N%OFaq{w{K~tM z^!FLYue|HI?Cq^*L~h+lwEVZX>=dsm6A>d|Baa%Jvb{3mE3h<(OJIIHYHarXeIyen zE}czue^1UH;?4zs0rP?HXyX0X>v06KCcC|=WlugksC09asv zqFUf)vnh>@Mk+gD`qV|%Jw#0V=jCDp*vw$R;_dZ6ily}{-)lOl{R!ga>>>I>L%sx@R4r}T*fZ<$5g1tO zLMPe85@y?3mmik7%8ydNcy!elHa1ttS246#3W+Dd0xE-mXr?%a=y42>cK!I z7C;{yJp87o@Z{oRv~(OXFaY#!HQSb039;XF90D#&-&$Nou$93u;w|b8u8xto4`N|% ze{{=xaZ%)#KM!4GrmquXc>xl#zyOf{7?@gUfPcI(5MGv8V1T^Ez;m-$U;uk*Vu1mO zfdL@bV1WVh76ZrG4h#Tkhrs{E0s{~OOR@VyGmbJ8HU>^}M2xJ7V?+*s_}YQ@M;CCK zBVuHYjROY&1jfMJ*Z`KtzyM&W1qOh8$G})%04y*70#K?L*d&A?F-65~^#O>1BM8{bnuT?Nqm*fKqr*H@dVS~s^z1^Lru#`J zDPY}2Ho44R(^16Ri+diFA0Q5{e7)NGhJR6ypF|0}?N|hy_4j#g`984PSH4bI9xg1L z6_G=dyU&ZJaY4h}>{*wO2*8W_=7u;UqjF*4tXx>gW*_Lt5u-IP>R0TGd~E%4?#!oh z@bH^b-%Q5a`t!%92N1A@HwMR+Z??9!2Glo#&z<=+u`;m0011jXFZ;sF3;-5`fO7#5 zaCvF0uX7T(c9{_v11DJn8Kz<+>+*w`n5xR!$|`EGkcp{kaRr>_sFbErA+s*OY&QZF zOu%W5N@*HAFYEFFtaqWazOfM&fIn1X0U%%iK)?WifB_IN0OX$k0n_mpXv4QaKmY&$ M07*qoM6N<$f^>hj`v3p{ diff --git a/include/game.h b/include/game.h index b18636f..7627bc8 100644 --- a/include/game.h +++ b/include/game.h @@ -10,6 +10,7 @@ #define BG_ID_CARD_SELECTING 1 #define BG_ID_CARD_PLAYING 2 #define BG_ID_ROUND_END 3 +#define BG_ID_SHOP 4 enum GameState { diff --git a/include/util.h b/include/util.h new file mode 100644 index 0000000..b34c67e --- /dev/null +++ b/include/util.h @@ -0,0 +1,36 @@ +#ifndef UTIL_H +#define UTIL_H + +static inline int get_digits(int n) // https://stackoverflow.com/questions/1068849/how-do-i-determine-the-number-of-digits-of-an-integer-in-c +{ + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + if (n < 1000000000) return 9; + return 10; +} + +static inline int get_digits_odd(int n) +{ + if (n < 100) return 1; + if (n < 10000) return 2; + if (n < 1000000) return 3; + if (n < 100000000) return 4; + return 5; +} + +static inline int get_digits_even(int n) +{ + if (n < 10) return 1; + if (n < 1000) return 2; + if (n < 100000) return 3; + if (n < 10000000) return 4; + return 5; +} + +#endif // UTIL_H \ No newline at end of file diff --git a/source/game.c b/source/game.c index 193b3f6..55c9e82 100644 --- a/source/game.c +++ b/source/game.c @@ -5,6 +5,7 @@ #include #include +#include "util.h" #include "sprite.h" #include "card.h" #include "blind.h" @@ -12,6 +13,7 @@ #include "background_gfx.h" #include "background_play_gfx.h" #include "background_round_end_gfx.h" +#include "background_shop_gfx.h" #include "soundbank.h" @@ -333,6 +335,26 @@ void change_background(int id) //tte_printf("#{P:88,72; cx:0xF000}Cash Out: $5"); // Hardcoded example } + else if (id == BG_ID_SHOP) + { + REG_DISPCNT &= ~DCNT_WIN0; + + memcpy(pal_bg_mem, background_shop_gfxPal, 64); + GRIT_CPY(&tile_mem[1], background_shop_gfxTiles); + GRIT_CPY(&se_mem[31], background_shop_gfxMap); + + // Set the outline colors for the shop background + memset16(&pal_bg_mem[27], 0x213D, 1); + memset16(&pal_bg_mem[7], 0x10B4, 1); + + memset16(&pal_bg_mem[14], 0x32BE, 1); // Reset the shop lights to correct colors + memset16(&pal_bg_mem[17], 0x4B5F, 1); + memset16(&pal_bg_mem[22], 0x5F9F, 1); + memset16(&pal_bg_mem[8], 0xFFFF, 1); + + memcpy16(&pal_bg_mem[6], &pal_bg_mem[3], 1); // Disable the button highlight colors + memcpy16(&pal_bg_mem[13], &pal_bg_mem[15], 1); + } else { return; // Invalid background ID @@ -341,28 +363,37 @@ void change_background(int id) background = id; } -void set_chips() +void set_temp_score(int value) { - tte_erase_rect(8, 80, 32, 88); - - if (chips < 10) - { - tte_printf("#{P:24,80; cx:0xF000;}%d", chips); // Chips - } - else if (chips < 100) - { - tte_printf("#{P:16,80; cx:0xF000;}%d", chips); - } - else - { - tte_printf("#{P:8,80; cx:0xF000}%d", chips); - } + int x_offset = 40 - get_digits_even(value) * 8; + tte_erase_rect(8, 64, 64, 72); + tte_printf("#{P:%d,64; cx:0xF000}%d", x_offset, value); } -void set_mult() +void set_score(int value) +{ + int x_offset = 32; + tte_printf("#{P:%d,48; cx:0xF000}%d", x_offset, value); +} + +void set_money(int value) +{ + int x_offset = 32 - get_digits_odd(value) * 8; + tte_erase_rect(8, 120, 64, 120); + tte_printf("#{P:%d,120; cx:0xC000}$%d", x_offset, value); +} + +void set_chips(int value) +{ + int x_offset = 32 - get_digits(value) * 8; // Adjust the x offset based on the number of digits in chips + tte_erase_rect(8, 80, 32, 88); + tte_printf("#{P:%d,80; cx:0xF000;}%d", x_offset, value); +} + +void set_mult(int value) { tte_erase_rect(40, 80, 64, 88); - tte_printf("#{P:40,80; cx:0xF000;}%d", mult); // Mult + tte_printf("#{P:40,80; cx:0xF000;}%d", value); // Mult } void set_hand() @@ -442,8 +473,8 @@ void set_hand() break; } - set_chips(); - set_mult(); + set_chips(chips); + set_mult(mult); } void card_draw() @@ -587,15 +618,16 @@ void game_init() tte_printf("#{P:40,24; cx:0xE000}%d", blind_get_requirement(current_blind, ante)); // Blind requirement tte_printf("#{P:40,32; cx:0xC000}$%d", blind_get_reward(current_blind)); // Blind reward - tte_printf("#{P:32,48; cx:0xF000}%d", 0); // Score + set_score(score); // Set the score display - tte_printf("#{P:24,80; cx:0xF000}%d", 0); // Chips - tte_printf("#{P:40,80; cx:0xF000}%d", 0); // Mult + set_chips(chips); // Set the chips display + set_mult(mult); // Set the multiplier display tte_printf("#{P:16,104; cx:0xD000}%d", hands); // Hand tte_printf("#{P:48,104; cx:0xE000}%d", discards); // Discard - tte_printf("#{P:24,120; cx:0xC000}$%d", money); // Money + //tte_printf("#{P:24,120; cx:0xC000}$%d", money); // Money + set_money(money); // Set the money display tte_printf("#{P:48,144; cx:0xC000}%d", 1); // Round tte_printf("#{P:8,144; cx:0xC000}%d#{cx:0xF000}/%d", ante, MAX_ANTE); // Ante @@ -646,13 +678,12 @@ static void game_playing_process_input_and_state() lerped_temp_score = int2fx(temp_score); lerped_score = int2fx(score); - tte_erase_rect(8, 64, 64, 72); - tte_printf("#{P:8,64; cx:0xF000}%d", temp_score); // Score + set_temp_score(temp_score); chips = 0; mult = 0; - set_mult(); - set_chips(); + set_mult(mult); + set_chips(chips); } } else if (play_state == PLAY_ENDED) @@ -662,11 +693,10 @@ static void game_playing_process_input_and_state() if (lerped_temp_score > 0) { - tte_erase_rect(8, 64, 64, 72); - tte_printf("#{P:8,64; cx:0xF000}%d", fx2int(lerped_temp_score)); // Temp Score + set_temp_score(fx2int(lerped_temp_score)); // We actually don't need to erase this because the score only increases - tte_printf("#{P:32,48; cx:0xF000}%d", fx2int(lerped_score)); // Score + set_score(fx2int(lerped_score)); // Set the score display if (temp_score <= 0) { @@ -682,7 +712,7 @@ static void game_playing_process_input_and_state() tte_erase_rect(8, 64, 64, 72); // Just erase the temp score - tte_printf("#{P:32,48; cx:0xF000}%d", score); // Score + set_score(score); } } } @@ -1117,7 +1147,7 @@ static void played_cards_update_loop(bool* discarded_card, int* played_selection // Relocated card scoring logic here chips += card_get_value(played[played_top - j]->card); - set_chips(); + set_chips(chips); break; } } @@ -1495,7 +1525,7 @@ void game_round_end() // Writing this kind a made me want to kms. If somewone wa if (sequence_step == 6) { - memset16(&pal_bg_mem[18], 0x1483, sizeof(pal_bg_mem)); + memset16(&pal_bg_mem[18], 0x1483, 1); state = 6; timer = 0; sequence_step = 0; @@ -1591,12 +1621,104 @@ void game_round_end() // Writing this kind a made me want to kms. If somewone wa tte_printf("#{P:88, 72; cx:0xF000}Cash Out: $%d", hands + blind_get_reward(current_blind)); // Print the cash out amount } + else if (timer > FRAMES(40) && key_hit(KEY_A)) + { + state = 8; // Go to the next state + money += hands + blind_get_reward(current_blind); // Reward the player + set_money(money); + memset16(&pal_bg_mem[6], 0x0174, 1); + + obj_hide(round_end_blind_token->obj); // Hide the blind token object + tte_erase_rect(80, 72, 200, 160); // Erase the blind token text + } break; } - default: - state = 0; + case 8: + { + sequence_step++; + int x = 9; + + for (int y = 19; y > 5; y--) + { + memcpy16(&se_mem[31][x + 32 * (y + 1)], &se_mem[31][x + 32 * y], 16); + } + + if (sequence_step >= 20) + { + sequence_step = 0; + timer = 0; + state = 9; + } + } break; + default: + timer = 0; + sequence_step = 0; + state = 0; + blind_reward = 0; + hand_reward = 0; + interest_reward = 0; + game_state = GAME_SHOP; + break; + } +} + + +void game_shop() +{ + change_background(BG_ID_SHOP); + + if (timer % 20 == 0) // Shift palette around the border of the shop icon + { + unsigned short shifted_palette[4]; + memcpy16(&shifted_palette[0], &pal_bg_mem[14], 1); + memcpy16(&shifted_palette[1], &pal_bg_mem[17], 1); + memcpy16(&shifted_palette[2], &pal_bg_mem[22], 1); + memcpy16(&shifted_palette[3], &pal_bg_mem[8], 1); + + // Circularly shift the palette + int last = shifted_palette[3]; + + for (int i = 3; i > 0; --i) { + shifted_palette[i] = shifted_palette[i - 1]; + } + + shifted_palette[0] = last; + + memcpy16(&pal_bg_mem[14], &shifted_palette[0], 1); // Copy the shifted palette to the next 4 slots + memcpy16(&pal_bg_mem[17], &shifted_palette[1], 1); + memcpy16(&pal_bg_mem[22], &shifted_palette[2], 1); + memcpy16(&pal_bg_mem[8], &shifted_palette[3], 1); + + } + + if (timer < 13) + { + for (int y = 7; y < 40; y++) + { + int x = 9; + memcpy16(&se_mem[31][x + 32 * (y - 1)], &se_mem[31][x + 32 * y], 16); + } + + if (timer >= 7) + { + 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[31][32 * y_to], &se_mem[31][32 * y_from], 9); + } + } + + // if (timer == 8) + // { + // int y_from = 26; + // int y_to = 0; + // memcpy16(&se_mem[31][32 * y_to], &se_mem[31][32 * y_from], 9); + // } } } @@ -1613,7 +1735,7 @@ void game_update() game_round_end(); break; case GAME_SHOP: - // Handle shop logic here + game_shop(); break; case GAME_BLIND_SELECT: // Handle blind select logic here