From 6d6bb39c970d78e3da64c3e260f3914f87c0bc3b Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Tue, 19 Aug 2025 16:31:32 +0300 Subject: [PATCH] Affine background now turns red on game over + other WIP changes for game over screen --- graphics/background_gfx.png | Bin 3845 -> 3861 bytes include/graphic_utils.h | 19 +++++++------------ source/game.c | 23 +++++++++++++++-------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/graphics/background_gfx.png b/graphics/background_gfx.png index fa7cc7bea83903c0730e59ce7849e0c8815175c6..798282f47e2b6437df8bf864e28a69cfb9430b3d 100644 GIT binary patch delta 3544 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 delta 3504 zcmZuzX*|?#_ntu_TcM0)kae=lzOV6=P()=Lg&!G1_AS1qLdlTEPL>p9H)Cha$j_3k ziOf{iQd!0_c0aH;(PJJk`J#9=2CXuns=Xn4hY|I{J3=^+{tKX{WxA_XKZJ4 zIE--+U0JkTnJv>ex%w9Pkt%k}SQg_)CyI{6Gg`L~kDM2=AmcSocMzx-BMz34iwIg| z@goJcl#zUhYO@G(Qx{+iNNCkRBI^MB`<*)ZvnIt@0gMFL6=MqK19-dA>n)ES%!rPx z7u$c0Hm*N8BEgcncWBMS4g04C)zQ)(o+X{@Y~x)y&gsrw@_ZPS1DzQS+cF=+Ph`Q` zH3II^K|%}aw1aOcPo4~qDnt6+$8n)tXdY|dc8xPN+^MQ{UUN`KjnUxZd!S#Nr)Zyt zQ$weGMNHc|SqcNhfsSk&a(fpQ4C@n~GaUK*bJHfMjMNU=3}x4~*T|LAyr!!16C}vA z;=~FHBcSsk+}t;Ys1RM_Y%R2W#duFt=exKXTV^`f z@XY7Ymj)I>V3-V!y(p8Ga+N%rvSBVDfVzc|osua{>6JaM6yt@By7H&zC1@-&x;vRSv z!k<9GlP4?te-P20%iTm-mi%-P$hB&9@NsZ_4%1CVmQTWDh5i@mH}Mofgk!i298;t8{-+}VYAK~RqM zpJTKc0Z&tP7H*hT0=W00{oPB~0U3N?UAB2xxdD38q{QqWp2D+5J55=r(tA_dNG2{u zrU>_9m*}^L1eN(pdIxM5cbd-Ty>x|eBqH?ds&{-B&L#Cd%k1Ai!QyufMqE-$eETT? zeyV&^wud+MnK{@lx%+I|b=E+a*x0gx$ z!q`OVygoYKKq=nW4EtTCZ%Ysvq88n9diiFD=icHGtL?7<^P69Lf8bV0hbQw>x%5DP z`wRiI3rZ6c?y^CyrGi*f^jO_|;O{;*TdYg?VTZZ&VnjtRYH3JIO#q}=QBjLHZ0R1~ zetQT~Hs<#R-JvCVrwVY=+yD3BmO{PNRMuG7RwuJKRz|fBAN4Cg6Y6m$!&kgGN0H(z zb@Pd6+|5B|bnL}bvms6>ZCf;X>k%s0&`8OHC=A2QD zxm8OE@!y8($vwT$Sx#ww|7S2dqavMrU2`A1vzqTeXE-@vs^ehM2-gGTGllDrPb~~; zf$v(=cqtQ8UFPH|QBgIe++3Z&CJZhg``&rn5tvi=|44j_HwQG5iW==;W2 zPEvNHEk%X8@K{!o$n(558q*XUrzsWhbZMEXB>R!{FaQf;H5F@ zZV0j(<|t&hctq*_tehz>lrg*%jB9JVu(?qY637tO+Z_n}IyIGvl)}Ki7eLSZ$p&xDRE9l!Ahbz)Xjafj$yXJQE zi@2V&rQndY5B)!gH|EXcCM_*KuH7Bsm@bkYoLQCP&Zwdy=`5lb!*csG=eFBmarE)SC%a`Zm5o7 zs}f{HTdLlHT#t__d!5JfY>DYvrGP%Do|WLN z#|eFOOe7EG5WX{Qz(M2qwi@x-Bv>v?UG3rSVSm}H^N5zoPi))%jT5rw?%DQ*7X*Lkb_R9rxn(0M^=3a@>*$+ za%gX9Z!<6CU4Q-H6S`nD%o^ZTDjtO1ou#Eb>7jyl75h*^xbMKp0%<3#yyD1>pTQ$Drym#4t{rI zBej>A4@RuR=-VXiq+t_8F?-*wHm!Q;tD|b=uL-9?+zML6(QoXz)L@nB{zt&&1@l>nwNa=6i|^4=rs$%a>YG=R zzLXErQZ#?M0E^ea`Hxj$H{^L65P1qirwxh0QOxnNv}6uYw{BpJa$6B{hN-xMrw<8? zho`+{N{i1sJ# z3bk{Xo+o>G8hHe*U8Ede{^%#*3v_&zOOvlComn31h;}?` zOaDKa3CJCnF|omaDKhEOP)p<;k1p5S%5C0ndu9^pq)U)IoW%aY)_OL!jQS?v&4Wa7 z&!UUG5^Rg!M(iqzol;Vt#?Cy=PUF5RzaS6CDF?aeAfOUH$7s`Of1{@p`i*|vx2U97 zjl9Y+szI)OzEDrM&mwb+oA$xBOqN+#ud`a<1`klU13%li)@@eS-WxIeL!Ye+;*Gqi zTH^;@hb0ma%&RdF-_CrwokOp09!|Y#5}oadIET9&G=2;Dvyd8Ta&2 zYt~SeqD=kbep22VTP%yEZ@cu+O=ARdq;)fI`%xwvOfHH?Y;!{yLtBKTw$vy#kpCAX z-9cr-Z&8@;L6P(d%y}(kOmCw~!rf;7Id9vg7apUHqcAgfpe8>#aYSWright) - ((rect)->left) + 1); + /* Extra parens to avoid issues in case compiler turns INLINE into macro + * Not sure if necessary, could be just paranoia + */ + return (((rect)->right) - ((rect)->left) + 1); } INLINE int rect_height(const Rect* rect) { - return (((rect)->bottom) - ((rect)->top) + 1); + return (((rect)->bottom) - ((rect)->top) + 1); } /* Clears a rect in the main background. diff --git a/source/game.c b/source/game.c index dd19796..14e9520 100644 --- a/source/game.c +++ b/source/game.c @@ -205,6 +205,8 @@ static const Rect TOP_LEFT_PANEL_ANIM_RECT = {0, 0, 8, 4 }; static const BG_POINT TOP_LEFT_BLIND_TITLE_POINT = {0, 21, }; static const Rect BIG_BLIND_TITLE_SRC_RECT = {0, 26, 8, 26 }; static const Rect BOSS_BLIND_TITLE_SRC_RECT = {0, 27, 8, 27 }; +// static const BG_POINT GAME_OVER_SRC_RECT_3X3_POS = {25, 29}; +// static const Rect GAME_OVER_MSG_DEST_RECT = {10, 6, 24, 10 }; // Rects for TTE (in pixels) static const Rect HAND_SIZE_RECT = {128, 128, 152, 160 }; // Seems to include both SELECT and PLAYING @@ -236,7 +238,8 @@ static const Rect ROUND_END_BLIND_REWARD_RECT = { 168, 96, UNDEFINED, UNDEF static const Rect ROUND_END_NUM_HANDS_RECT = {88, 116, UNDEFINED, UNDEFINED }; static const Rect HAND_REWARD_RECT = {168, UNDEFINED, UNDEFINED, UNDEFINED }; static const Rect CASHOUT_RECT = {88, 72, UNDEFINED, UNDEFINED }; -static const Rect SHOP_REROLL_RECT = {88, 96, UNDEFINED, UNDEFINED }; +static const Rect SHOP_REROLL_RECT = {88, 96, UNDEFINED, UNDEFINED }; +// static const Rect GAME_OVER_MSG_TEXT_RECT = {104, 56, UNDEFINED, UNDEFINED}; static const BG_POINT HELD_JOKERS_POS = {108, 10}; static const BG_POINT JOKER_DISCARD_TARGET = {240, 30}; @@ -974,6 +977,12 @@ void game_round_init() deck_shuffle(); // Shuffle the deck at the start of the round } +void game_lose_init() +{ + affine_background_set_color(CLR_RED); // TODO: Use text color? + +} + void init_game_state(enum GameState game_state_to_init) { // Switch written out, add init for states as needed @@ -989,6 +998,7 @@ void init_game_state(enum GameState game_state_to_init) case GAME_BLIND_SELECT: break; case GAME_LOSE: + game_lose_init(); break; default: break; @@ -1753,6 +1763,10 @@ static void played_cards_update_loop(bool* discarded_card, int* played_selection display_ante(++ante); } } + else if (hands <= 0) + { + game_set_state(GAME_LOSE); + } else { hand_state = HAND_DRAW; @@ -1870,13 +1884,6 @@ static void game_round_end_cashout() void game_playing() { - // TODO: Blind rect sliding into view animation... - if (hand_state == HAND_SELECT && hands == 0) - { - // TODO: Check if it's safe to change to game_set_state() without side effects - game_state = GAME_LOSE; - } - // 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) {