From 0c834d17c22c09d9dc94a0ce1026e3735a65e31a Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Wed, 30 Jul 2025 15:49:35 +0300 Subject: [PATCH 1/2] Added dynamic palette loading for jokers and added new joker designs by @GreenNinja2525 --- graphics/joker_gfx.grit | 1 - graphics/joker_gfx.png | Bin 1760 -> 0 bytes graphics/joker_gfx0.grit | 1 + graphics/joker_gfx0.png | Bin 0 -> 1461 bytes graphics/joker_gfx1.grit | 1 + graphics/joker_gfx1.png | Bin 0 -> 1375 bytes graphics/joker_gfx2.grit | 1 + graphics/joker_gfx2.png | Bin 0 -> 721 bytes include/graphic_utils.h | 1 + include/joker.h | 2 +- include/joker_gfx.h | 8 ++++ include/util.h | 2 + source/joker.c | 90 ++++++++++++++++++++++++++++++++++++--- source/util.c | 16 +++++++ 14 files changed, 116 insertions(+), 7 deletions(-) delete mode 100644 graphics/joker_gfx.grit delete mode 100644 graphics/joker_gfx.png create mode 100644 graphics/joker_gfx0.grit create mode 100644 graphics/joker_gfx0.png create mode 100644 graphics/joker_gfx1.grit create mode 100644 graphics/joker_gfx1.png create mode 100644 graphics/joker_gfx2.grit create mode 100644 graphics/joker_gfx2.png create mode 100644 include/joker_gfx.h create mode 100644 source/util.c diff --git a/graphics/joker_gfx.grit b/graphics/joker_gfx.grit deleted file mode 100644 index f677be5..0000000 --- a/graphics/joker_gfx.grit +++ /dev/null @@ -1 +0,0 @@ --gB4 -Mw4 -Mh4 -m! \ No newline at end of file diff --git a/graphics/joker_gfx.png b/graphics/joker_gfx.png deleted file mode 100644 index 557c258943b85e0e304debd0ee8f41b584531b87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1760 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 P00000NkvXXu0mjfUdpZB literal 0 HcmV?d00001 diff --git a/graphics/joker_gfx1.grit b/graphics/joker_gfx1.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx1.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx1.png b/graphics/joker_gfx1.png new file mode 100644 index 0000000000000000000000000000000000000000..ad85aa5acb4dd51b14741fc35b78c0765d17d9e5 GIT binary patch literal 1375 zcmV-l1)%zgP)ZzvJ5I*q;aqvJ1hi(EuYUu#ihszbwLox4snr?D~>Zr1{oKIq)_mW z491;MQk)B8C-Gef1Vm!%Las^S!k~@fK2fD+lR|oiJ`PY_KdFmiP$j%X?&NU0?K*mVwd0+BziW^r82qO`MM zBg5-{?K)^3K(IEqr87Y#SF0SLRypu=Mo@g1Ig-v!FwG83vlHqajt)?#G}YFlH&5pJWe}*pyv`=p^a&>4Up`M96094P< zh0Upb5R`TnJY$^5Q<=>Rj)|Bbs7?qI0xE)tT#&Y&BG^8?!P)JF?*|gd31M_V6|XP~uMA36*rvaeO(%#dT=M|0&RbhWSX)KcHh!L?gC7Aal#(cv zlD?i3NCSX=+^Zu?bxxehy0)qw_yKj+G&{DDr8*~0WnEjZ@Nvuo0AOWw5!Lf^tc)&V zWpq(ox5nbAP0fjVZE6nISX|VpJ>45t1mp1`)a%!X$A=_xlheakn%@=mrTJY z8ODUT*9~vDU5us@NFxtG5wX=Q(yLiuznh|_fBmIve^M0pwNGz^(}IQo30AAs)W-J1 z%q$*eX7P3P5&-bs4<7>nUcPuH-B0(nT1`h0baa3=nW=QAd!$EHpjWrHia;+PASVnW zg1StwP)g#-=g*{eM7&T+VrjlFd|qDwAV3}fbhEtL)SQTUE`rup5w)o~q;q*&{vR|1 zoK|=7_z;%ncSX!|5$uxR4V(!&&H!CL&p(NLCU8NlRSrbl^ZkJK=?!q-vp)hff@&s6 zD3p@e+~|)yL5+L)Id^UEaSZ`Ja%Z;}NawnGfc+z2H7kDt_m9N&TIE2Loir;FxlxdNOp2UnEe0(Wr8YsPMGZU z86^AK`b_vtkjE_%ArN_MEG`|~2|!;9`168*3*TP3A?!qca(Y-gxDx<~84x-X1mtyp zt#TliynN|P&f(X{Mxq&JKY&2l;9j|5Tk`Ie8^SsKnrd@{XC9EwIGuT`V>(Mw^SDX?A=Gp|3oEXLLl6fA7<|yhwZLKE5*)Gz8RT zEQuK}8^(l`@zLjx?xpLYm&0!Rfjqxgout|$g~y?spmv&v1y^^nbBA!dy0@spb3Z_> z2eC&Ak6~?YW8~`4u>(2`y8q9~)83*JeC-De>J0V2f**t>t+T6piyWRI;I+>m)c&f$ zGY<%RrfJXrFZhMq&keuj<7yTF#Mwy)Tz`)8QR5`S*nhhJ0D%9Wqu+n?r(3hYxc9+b h?fbQzd7XZb{|hIZ$U3q2{fz(s002ovPDHLkV1oa9|A&^79Ajm${ftntA?j_(7T?+ky z6bezLFHw6)W<9$aSyJpn9|*6WNAqTPN3)|N2uObZ`YZAKB7FPi$mL1|iC;fHAkFfU z6YZ;4@vHNZ7=#$W_2UBo;QqtR@X=jda-L>6w67ZTA5Y(v0yr*Ny*L1XlgkS{UELUQ zK11y*Ba&?r06?LY#k=+r!~ohL+a&PM!fhZGLRIjp{&>2&vF_ddO|!f#&VD8PRsqoR zpIlzZ52m>h2Vlm9R#h&W2SEE3-Nk0CeFZPg&Beum?aaM2H}?G5);ZuN5;<;yY?H_d zd0Muu+ycv}g?QU%!~kg4X_kwQ+~u$0suHp`fTmcF=U9*D`?%Phgi^B6Jr}02WSec0 zok>`^1!U1q(5-+rTMi6Q%p|rQdu!mvT!{_8X0N}@$ zuK~h8S0#MyYe*=xLNMr?J?BZd9?uaB z`mHOWxB@g|o;cc9=CvY0S_z(zUYY~GU4W_*5UA+~$N@Q?O{Rt)hCS;!$_D_5mkUz~ zxu4bfs98VYf{XJ+qjA*fTI1Pdig>wbbTl`rgswOjB%WSF;%AfTVJcyv)$?p#K;luS zYh64DV7m=<*jWkb2=>oH#LGpg>4=vL6CD4KIO%A1AtvGI+sX=ts-b&0@otDJALsZA zXkUpelhJ*C^=a*^Upg8|KG#00000NkvXXu0mjf DXd+yQ literal 0 HcmV?d00001 diff --git a/include/graphic_utils.h b/include/graphic_utils.h index 8d572ba..6c169c7 100644 --- a/include/graphic_utils.h +++ b/include/graphic_utils.h @@ -22,6 +22,7 @@ #define AFFINE_BG_SBB 2 #define AFFINE_BG_CBB 2 #define PAL_ROW_LEN 16 +#define NUM_PALETTES 16 /* Dimensions for a screenblock. * A 1024 size screenblock is arranged in a grid of 32x32 screen entries diff --git a/include/joker.h b/include/joker.h index a735066..a869ed5 100644 --- a/include/joker.h +++ b/include/joker.h @@ -9,7 +9,7 @@ #define JOKER_TID (MAX_HAND_SIZE + MAX_SELECTION_SIZE) * JOKER_SPRITE_OFFSET // Tile ID for the starting index in the tile memory #define JOKER_SPRITE_OFFSET 16 // Offset for the joker sprites -#define JOKER_PB 4 // Palette bank for the default jokers +#define JOKER_BASE_PB 4 // Palette bank for the default jokers #define JOKER_STARTING_LAYER 27 #define BASE_EDITION 0 diff --git a/include/joker_gfx.h b/include/joker_gfx.h new file mode 100644 index 0000000..275cc90 --- /dev/null +++ b/include/joker_gfx.h @@ -0,0 +1,8 @@ +#ifndef JOKER_GFX_H +#define JOKER_GFX_H + +#include "joker_gfx0.h" +#include "joker_gfx1.h" +#include "joker_gfx2.h" + +#endif \ No newline at end of file diff --git a/include/util.h b/include/util.h index 54edbc1..5b3160e 100644 --- a/include/util.h +++ b/include/util.h @@ -37,4 +37,6 @@ static inline int get_digits_even(int n) #define NUM_ELEM_IN_ARR(arr) (sizeof(arr) / sizeof((arr)[0])) +int int_arr_max(int int_arr[], int size); + #endif // UTIL_H \ No newline at end of file diff --git a/source/joker.c b/source/joker.c index 233769b..2d51330 100644 --- a/source/joker.c +++ b/source/joker.c @@ -5,12 +5,17 @@ #include "graphic_utils.h" #include "card.h" #include "soundbank.h" +#include "util.h" #include #include #include #define JOKER_SCORE_TEXT_Y 48 +#define NUM_JOKERS_PER_SPRITESHEET 2 + +const unsigned int **joker_gfxTiles; +const unsigned short **joker_gfxPal; const static u8 edition_price_lut[MAX_EDITIONS] = { @@ -31,20 +36,89 @@ const static u8 edition_price_lut[MAX_EDITIONS] = static bool used_layers[MAX_JOKER_OBJECTS] = {false}; // Track used layers for joker sprites // TODO: Refactor sorting into SpriteObject? +// Maps the spritesheet index to the palette bank index allocated to it. +// Spritesheets that were not allocated are +static int* joker_spritesheet_pb_map; + +static int get_num_spritesheets() +{ + return (get_joker_registry_size() + NUM_JOKERS_PER_SPRITESHEET - 1) / NUM_JOKERS_PER_SPRITESHEET; +} + +// TODO: This should be generalized so any sprite can have dynamic swapping +static int allocate_pb_if_needed(u8 joker_id) +{ + int joker_spritesheet_idx = joker_id / NUM_JOKERS_PER_SPRITESHEET; + int joker_pb = joker_spritesheet_pb_map[joker_spritesheet_idx]; + if (joker_pb != UNDEFINED) + { + // Already allocated + return joker_pb; + } + + // Allocate a new palette + joker_pb = int_arr_max(joker_spritesheet_pb_map, get_num_spritesheets()); + + if (joker_pb == UNDEFINED) + { + // This is the first palette loaded + joker_pb = JOKER_BASE_PB; + } + else + { + // The new palette bank is a 1 increment of the last allocated one + /* TODO: This doesn't account for removal, we need to address that, + * track sprite usage and remove palettes for unused sprites + */ + joker_pb = joker_pb + 1; + } + + if (joker_pb == NUM_PALETTES) + { + // Ran out of palettes, default to base and pray + joker_pb = JOKER_BASE_PB; + } + else + { + joker_spritesheet_pb_map[joker_spritesheet_idx] = joker_pb; + memcpy16(&pal_obj_mem[PAL_ROW_LEN * joker_pb], joker_gfxPal[joker_spritesheet_idx], NUM_ELEM_IN_ARR(joker_gfx0Pal)); + } + + return joker_pb; +} + void joker_init() { - GRIT_CPY(&pal_obj_mem[PAL_ROW_LEN * JOKER_PB], joker_gfxPal); + // This should init once only so no need to free + int num_spritesheets = get_num_spritesheets(); + joker_gfxTiles = (const unsigned int**)malloc((sizeof(unsigned int*) * num_spritesheets)); + joker_gfxPal = (const unsigned short**)malloc((sizeof(unsigned int*) * num_spritesheets)); + joker_spritesheet_pb_map = (int*)malloc(sizeof(int) * num_spritesheets); + + // TODO: Automate this with the preprocessor somehow? + joker_gfxTiles[0] = joker_gfx0Tiles; + joker_gfxTiles[1] = joker_gfx1Tiles; + joker_gfxTiles[2] = joker_gfx2Tiles; + + joker_gfxPal[0] = joker_gfx0Pal; + joker_gfxPal[1] = joker_gfx1Pal; + joker_gfxPal[2] = joker_gfx2Pal; + + for (int i = 0; i < num_spritesheets; i++) + { + joker_spritesheet_pb_map[i] = UNDEFINED; + } } Joker *joker_new(u8 id) { if (id >= get_joker_registry_size()) return NULL; - Joker *joker = malloc(sizeof(Joker)); + Joker *joker = (Joker*)malloc(sizeof(Joker)); const JokerInfo *jinfo = get_joker_registry_entry(id); joker->id = id; - joker->modifier = BASE_EDITION; // TODO: Make this random later + joker->modifier = BASE_EDITION; // TODO: Make this a parameter joker->value = jinfo->base_value + edition_price_lut[joker->modifier]; // Base value + edition price joker->rarity = jinfo->rarity; joker->processed = false; @@ -87,7 +161,13 @@ JokerObject *joker_object_new(Joker *joker) joker_object->sprite_object = sprite_object_new(); int tile_index = JOKER_TID + (layer * JOKER_SPRITE_OFFSET); - memcpy32(&tile_mem[4][tile_index], &joker_gfxTiles[joker->id * TILE_SIZE * JOKER_SPRITE_OFFSET], TILE_SIZE * JOKER_SPRITE_OFFSET); + + int joker_spritesheet_idx = joker->id / NUM_JOKERS_PER_SPRITESHEET; + int joker_idx = joker->id % NUM_JOKERS_PER_SPRITESHEET; + int joker_pb = allocate_pb_if_needed(joker->id); + + memcpy32(&tile_mem[4][tile_index], &joker_gfxTiles[joker_spritesheet_idx][joker_idx * TILE_SIZE * JOKER_SPRITE_OFFSET], TILE_SIZE * JOKER_SPRITE_OFFSET); + sprite_object_set_sprite ( joker_object->sprite_object, @@ -96,7 +176,7 @@ JokerObject *joker_object_new(Joker *joker) ATTR0_SQUARE | ATTR0_4BPP | ATTR0_AFF, ATTR1_SIZE_32, tile_index, - JOKER_PB, + joker_pb, JOKER_STARTING_LAYER + layer ) ); diff --git a/source/util.c b/source/util.c new file mode 100644 index 0000000..94af7ef --- /dev/null +++ b/source/util.c @@ -0,0 +1,16 @@ +#include "util.h" +#include + +int int_arr_max(int int_arr[], int size) +{ + int max = INT_MIN; + for (int i = 0; i < size; i++) + { + if (int_arr[i] > max) + { + max = int_arr[i]; + } + } + + return max; +} From 305d093042dc786611be19ac612172654017e331 Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Fri, 1 Aug 2025 02:03:24 +0300 Subject: [PATCH 2/2] Added more joker art by for jokers 6-16, missing code implementation so they are not yet displayed. --- graphics/joker_gfx2.png | Bin 721 -> 1308 bytes graphics/joker_gfx3.grit | 1 + graphics/joker_gfx3.png | Bin 0 -> 1056 bytes graphics/joker_gfx4.grit | 1 + graphics/joker_gfx4.png | Bin 0 -> 958 bytes graphics/joker_gfx5.grit | 1 + graphics/joker_gfx5.png | Bin 0 -> 1028 bytes graphics/joker_gfx6.grit | 1 + graphics/joker_gfx6.png | Bin 0 -> 1027 bytes graphics/joker_gfx7.grit | 1 + graphics/joker_gfx7.png | Bin 0 -> 1066 bytes include/joker_gfx.h | 5 +++++ source/joker.c | 10 ++++++++++ 13 files changed, 20 insertions(+) create mode 100644 graphics/joker_gfx3.grit create mode 100644 graphics/joker_gfx3.png create mode 100644 graphics/joker_gfx4.grit create mode 100644 graphics/joker_gfx4.png create mode 100644 graphics/joker_gfx5.grit create mode 100644 graphics/joker_gfx5.png create mode 100644 graphics/joker_gfx6.grit create mode 100644 graphics/joker_gfx6.png create mode 100644 graphics/joker_gfx7.grit create mode 100644 graphics/joker_gfx7.png diff --git a/graphics/joker_gfx2.png b/graphics/joker_gfx2.png index 713e08e18b6516e80744ed5e8aaf6d4fb4d8efe4..b848ff050b5e0862ee7be521965d73530e348823 100644 GIT binary patch literal 1308 zcmV+%1>^dOP)ornc7 zDO>~@(j3U#nj;W5*In$uDXSvfKj1p66!IIrnVtP95mMv>q1m^yGyA=H@6DUH1~l-0 z`+cmF&x*=dUm98Z{hRYg1T=Z;!&?l4QDhLuwhGD5p6T*)I+_=8E)y}U~ zK0Kl7Pu8>!IUS!Z=FoI)SndL`MzRsk8^6E0eFvM1)DdazQPLm#sg=w0ieSLEq zncs{&feC?OFv8>G7XYT@Nlq(GB!hvEVBkmOYX7`1PNe(YsPcKgtws}DjV4UfjQmpP z$^B*uf`JcvqXK)Q0&_T;bvOyJ1PntEtkqpyE*;@==?JyDi!cnuFVh@xH$I-cl&;lP z90nsn9+)VC|LgkaL9Om;<%VIvGz`(_a_I;FuzA-)zw1eElLfH~czpZTrUuZe%C{-?xNrI5QZU)hZX<(VP!da0Kx*2+(n1abV7>U)t)E(*|9CL zx&S2dz;xx!;RvuTDGulYViph?as_S`oIEhG0P2$`U}_Zr$bk$%F8>Y&K0;@r1ZkWn znTLp=R(G*-I3;#@^+~$V?`<`jnU#xii4A18|o zhPb3Lw8#BRw!( zX-=Hly1v1{mtsL4P*i{asws%kN^|1WrhC+%c9J9{W`dz(Nr?`jy0D1S&bGKN?QEmE zuqdvnKLx|0F2J`!zPxq^;s3E3ZQ*_7>r`Th0H zEy}$MVF{!J>eGLH3e8DBW_$&_9stOhpxZbQ^4-e1^c=+l0Ps3(kqPo~&YtdNt_P@4 zbAKN60HE^jbJ3=QkqTWsAT(> zDT&Ke3&>m)Rl&1CBBjby!nzEyC^!*nt1{K(vsQ*u6~F@`f#>)1PvliO)fQ(7ger98 z@|MB~nYO{ApqgS*Z7~h1$>+UJLuwG5rA^?q#UfCNWO0eC$XpX7Ssr<0oPsq$HJYbI zcOC%4FiiYFGV_O#IFRr2&uc}Y)&qE(lo96&rfDXAB>Dg2Xwpl}8~?@69|A&^79Ajm${ftntA?j_(7T?+ky z6bezLFHw6)W<9$aSyJpn9|*6WNAqTPN3)|N2uObZ`YZAKB7FPi$mL1|iC;fHAkFfU z6YZ;4@vHNZ7=#$W_2UBo;QqtR@X=jda-L>6w67ZTA5Y(v0yr*Ny*L1XlgkS{UELUQ zK11y*Ba&?r06?LY#k=+r!~ohL+a&PM!fhZGLRIjp{&>2&vF_ddO|!f#&VD8PRsqoR zpIlzZ52m>h2Vlm9R#h&W2SEE3-Nk0CeFZPg&Beum?aaM2H}?G5);ZuN5;<;yY?H_d zd0Muu+ycv}g?QU%!~kg4X_kwQ+~u$0suHp`fTmcF=U9*D`?%Phgi^B6Jr}02WSec0 zok>`^1!U1q(5-+rTMi6Q%p|rQdu!mvT!{_8X0N}@$ zuK~h8S0#MyYe*=xLNMr?J?BZd9?uaB z`mHOWxB@g|o;cc9=CvY0S_z(zUYY~GU4W_*5UA+~$N@Q?O{Rt)hCS;!$_D_5mkUz~ zxu4bfs98VYf{XJ+qjA*fTI1Pdig>wbbTl`rgswOjB%WSF;%AfTVJcyv)$?p#K;luS zYh64DV7m=<*jWkb2=>oH#LGpg>4=vL6CD4KIO%A1AtvGI+sX=ts-b&0@otDJALsZA zXkUpelhJ*C^=a*^Upg8|KG#00000NkvXXu0mjf DXd+yQ diff --git a/graphics/joker_gfx3.grit b/graphics/joker_gfx3.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx3.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx3.png b/graphics/joker_gfx3.png new file mode 100644 index 0000000000000000000000000000000000000000..673aa12ab516d83966ff9043754f7b4cca3a95ad GIT binary patch literal 1056 zcmV+*1mF9KP)B~LZA_QP)hIKyvSy@hh%nVHZ!}k+0`EWVA!{B-t0H;?fiJNt3iNztK*3Daq;rS z6HUeLF8K!(lsuamPn5iIawhG>|Kv}JjI)_>5JHeE6kT2Q>zAR3bzOI#NjnjSyX4n{ z8dB0)xfDo{D-@9{6rt<-Kp7Ty#UE%PeSoI91cqthdU68SlM^sZ3xp82#DywI3;D&7+sPb2{J3ZdU@=*NJ0MyDQ7^a0t{jzLxCpYH0KB2dz7^Jaz#9REX$`$#Md4?i2fPsw zl|L{5EDY1a=Gu*Wzf$Mx*}7bzm{<^4{;GW?t!L|^@GC9Te&@rmxptG-T0r@OocE(@ zUn%p420-NeO8xnOonN=Pb|YQLqCn{UtM7w`K3&zmQsR%aQLk={a`%TzMI0^_18tH- zE;Yv8>kAI_1t-uZ41obKObb)3lg3P1TB-qw%M062~VP4f;=>rZDu7Uuu}(|sM;?p+Tn z`!Jdo;5dM$bn*>_pa1w#2h$RMz2X3knEd`BNC*)Q$?n^{tD`cl^S6mJ1#X)^bQjRz zwV?}2eN~tjG{OgC00rVWE^1;P9C)1;GQU@c>`3KJc^d0WY zxIE=#ngprvD`kRy=UIoT{@~)Av!OwV3z74j!&HBH%Go5A3D(Lb_oN4S&L3QybA=58 zAfELuBiyZYX~LHpFf(RHlX1eLngTn1v0y4XW~oWr3>v!VbtfWZQNiVNwCOOMaye z3=7o&*tQ+JsPczygX}z_i;7=I@7a3xn_g6mjEqF)X75FM8I*Pb6}_J{3Dn9ZA-{-Q z);vi4zpP}&AX1b*FZjtCJK%NH~P=+6=v?)}eEVQ22s a@9}@cS(c>uq0000m596#f$R{s40;wIesOa0}x8!R3%z-BzSadnp}I_mfb60b*zm9SoTn5d8? zv6Z^>2O69k+GiZ&Bu)tF&`+{(o}c~M&(3?!!+-+g>B3jZcg5E)pA8+oJo&c-L|!cy zGbNwQmZ6h)PyPdyaW4jB|@B>K9A8LS6zYEKDFzR=~7=!U<@%5W!MREXq2cnK^5~Sg$eo3Hog5o5A z%~2G0MI;9{J7C#PYKQe6{E-F_Vc8B!*TTS^AAxqUt#;YS%m^aCE|TzTx#_LN$Dnk5 zpP4Tp{-n_5k2Qd5@xP_rSIJ7(_o*hX;+G*G|1g;jf1*G=zYAK`bO$iqL8Q(;q2f6ToC&PPt({IO9$6<4d}BC6#szgv?I`xDD3~c(4Lz&E$ zFx>%I{S2&r7H~+G?F9Plihc7d6C$c)gk?ME)Hh!C>CrJ2OPh&xEugF^%UVJhMyMy>Hv$8 z^_z>PHow+QP+U9!JU`BPo#fAt^MFoPMvxZ|yzZoUO2lkWQX|9~VASuT=@$4iE&lm& z9w?#_fbiEKDMtM++Pw~cro~TY%RrG+USY3+46PF|^j2uP1=Lzk0Kk8nZh;#|Y$I7# zCt&EU(C&5kc=X%ub+~cFHd&Skau^cB3)QKJvbbAV+Ax?mzj6X$6Y@MSk}xX+rVvOgAo1seKQiLImP( zSUsyKpgWGNtCJen3WGY6$TA}=kE;XPZBbt*Ev6L)sYESs*W^dkxbl4B>T=(xlknmH g992%{BmF)8AM?DFA7hj_+W-In07*qoM6N<$f`JOn?EnA( literal 0 HcmV?d00001 diff --git a/graphics/joker_gfx5.grit b/graphics/joker_gfx5.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx5.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx5.png b/graphics/joker_gfx5.png new file mode 100644 index 0000000000000000000000000000000000000000..c220cf3afff0372de36aad4d4383378845ebc418 GIT binary patch literal 1028 zcmV+f1pE7mP)$`D>4|vBG)-cfW{+KEcONw0bqUb5MgYt9S~K%X8>f*d+BhZAl=CPNannkcGg=;d|%sTqsT{fV_FAU8|7>ZH`{)?^rhJ8 zC09RM%3*x0!r4B39`e8e5Zn?NRmu2AOWhx1e5``o zyCu6$gP_7!ngP{=GS^wE)#L_cWU{Ee`y;(StepK7;&VOxU%x*F;wwJ|Sf!GaNF~d5 zZf(O(?p<0%CmH|t&VOH?0U(4xV=}K)s|jsyxKrzVcN`~cqcAc62mxHOH9vCl3-LK- zxjFe20NHSSHWMR+5X-W-I?c|o`_s13GQH+(6EqVX1mANH(9mr|*IoVm+TQrIy?gFS zU}Umfo3QFPUw9xQI*c$fSuW{eH$4ET552a_jbcu?3DwW9l@3H?d^YJ}H$4E@{_))| z$4)Pm`AVB0b$)Ap#I~i69{|9%ZFcGau$3>t$YdjX5>V&!wS;Xergs6rwiVMC_O(0` z%6!iNu+DQ%&W|9~Y67h$(kH`Qa5j%0A`1fRJm+LBfkJ!^g*fo)<*p+*7s^3UPJ}kW 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 literal 0 HcmV?d00001 diff --git a/include/joker_gfx.h b/include/joker_gfx.h index 275cc90..c549405 100644 --- a/include/joker_gfx.h +++ b/include/joker_gfx.h @@ -4,5 +4,10 @@ #include "joker_gfx0.h" #include "joker_gfx1.h" #include "joker_gfx2.h" +#include "joker_gfx3.h" +#include "joker_gfx4.h" +#include "joker_gfx5.h" +#include "joker_gfx6.h" +#include "joker_gfx7.h" #endif \ No newline at end of file diff --git a/source/joker.c b/source/joker.c index 2d51330..02febc5 100644 --- a/source/joker.c +++ b/source/joker.c @@ -99,10 +99,20 @@ void joker_init() joker_gfxTiles[0] = joker_gfx0Tiles; joker_gfxTiles[1] = joker_gfx1Tiles; joker_gfxTiles[2] = joker_gfx2Tiles; + joker_gfxTiles[3] = joker_gfx3Tiles; + joker_gfxTiles[4] = joker_gfx4Tiles; + joker_gfxTiles[5] = joker_gfx5Tiles; + joker_gfxTiles[6] = joker_gfx6Tiles; + joker_gfxTiles[7] = joker_gfx7Tiles; joker_gfxPal[0] = joker_gfx0Pal; joker_gfxPal[1] = joker_gfx1Pal; joker_gfxPal[2] = joker_gfx2Pal; + joker_gfxPal[3] = joker_gfx3Pal; + joker_gfxPal[4] = joker_gfx4Pal; + joker_gfxPal[5] = joker_gfx5Pal; + joker_gfxPal[6] = joker_gfx6Pal; + joker_gfxPal[7] = joker_gfx7Pal; for (int i = 0; i < num_spritesheets; i++) {