From 35c0d383c55207786e57c4296373660d6b80c56c Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Sat, 13 Sep 2025 22:18:31 +0200 Subject: [PATCH 01/17] Add blueprint and brainstorm jokers Implements blueprint and brainstorm to the game, but leaves the implementations commented out as they are still missing assets. --- include/joker.h | 2 ++ source/joker_effects.c | 44 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/joker.h b/include/joker.h index 3ee358b..66edc16 100644 --- a/include/joker.h +++ b/include/joker.h @@ -36,6 +36,8 @@ #define DEFAULT_JOKER_ID 0 #define GREEDY_JOKER_ID 1 // This is just an example to show the patern of making joker IDs #define JOKER_STENCIL_ID 16 +#define JOKER_BLUEPRINT_ID 99 // This needs to be changed +#define JOKER_BRAINSTORM_ID 99 // This needs to be changed typedef struct { diff --git a/source/joker_effects.c b/source/joker_effects.c index 1382ea2..512a77e 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -464,6 +464,47 @@ static JokerEffect odd_todd_joker_effect(Joker *joker, Card *scored_card) { return effect; } +__attribute__((unused)) +static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { + JokerEffect effect = {0}; + List* jokers = get_jokers(); + bool trigger_next_joker = false; + + for (int i = 0; i < list_get_size(jokers); i++ ) { + JokerObject* joker_object = list_get(jokers, i); + if (trigger_next_joker) { + effect = joker_get_score_effect(joker_object->joker, scored_card); + break; + } + + // JOKER_BLUEPRINT_ID (joker.h) will need to be updated + if (joker_object->joker->id == JOKER_BLUEPRINT_ID) + trigger_next_joker = true; + } + + return effect; +} + +__attribute__((unused)) +static JokerEffect brainstorm_joker_effect(Joker *joker, Card *scored_card) { + JokerEffect effect = {0}; + if (joker->processed) + return effect; + + List* jokers = get_jokers(); + JokerObject* first_joker = list_get(jokers, 0); + + // JOKER_BRAINSTORM_ID (joker.h) will need to be updated + if (first_joker->joker->id != JOKER_BRAINSTORM_ID) { + // manually flip this to avoid infinite blueprint + brainstorm loops + joker->processed = true; + effect = joker_get_score_effect(first_joker->joker, scored_card); + joker->processed = false; + } + + return effect; +} + /* The index of a joker in the registry matches its ID. * The joker sprites are matched by ID so the position in the registry * determines the joker's sprite. @@ -514,6 +555,9 @@ const JokerInfo joker_registry[] = { { COMMON_JOKER, 4, abstract_joker_effect }, { UNCOMMON_JOKER, 6, bull_joker_effect}, + + { RARE_JOKER, 10, blueprint_joker_effect }, + { RARE_JOKER, 10, brainstorm_joker_effect }, #endif }; From e58208e13d0240f7a320a000eb2539e7c06723ad Mon Sep 17 00:00:00 2001 From: Rickey Fehr Date: Sun, 21 Sep 2025 18:44:46 -0700 Subject: [PATCH 02/17] Add uploading ROM on tag push --- .github/workflows/build_ci_workflow.yml | 10 +++++++++- docker-compose.yml | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_ci_workflow.yml b/.github/workflows/build_ci_workflow.yml index cf270ee..a1dfd05 100644 --- a/.github/workflows/build_ci_workflow.yml +++ b/.github/workflows/build_ci_workflow.yml @@ -4,6 +4,8 @@ on: push: branches: - main + tags: + - "v*" pull_request: branches: - main @@ -19,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Get docker image cache uses: actions/cache@v4 @@ -53,3 +55,9 @@ jobs: - name: Build the project run: docker compose -f docker-compose.yml run --rm balatro sh -c "make -j$(nproc)" + + - uses: softprops/action-gh-release@v2 + if: ${{ startsWith(github.ref, 'refs/tags/') }} + with: + files: | + build/balatro-gba.gba diff --git a/docker-compose.yml b/docker-compose.yml index 9adc15c..8e68514 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,8 @@ services: balatro: image: devkitpro/devkitarm:latest - working_dir: /balatro + working_dir: /balatro-gba volumes: - - ./:/balatro + - ./:/balatro-gba user: "${UID-1000}:${GID-1000}" command: ["sh", "-c", "make -j$(nproc)"] From 46936c1878dc9acaa26a49a3fa4ab0e4d96d15c5 Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Tue, 7 Oct 2025 21:13:31 +0300 Subject: [PATCH 03/17] Added art for jokers Raised Fist by @MathisMartin31 and Reserved Parking by @NoWhammies10 --- graphics/joker_gfx15.grit | 1 + graphics/joker_gfx15.png | Bin 0 -> 877 bytes include/def_joker_gfx_table.h | 1 + include/joker_gfx.h | 1 + source/joker_effects.c | 6 ++---- 5 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 graphics/joker_gfx15.grit create mode 100644 graphics/joker_gfx15.png diff --git a/graphics/joker_gfx15.grit b/graphics/joker_gfx15.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx15.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx15.png b/graphics/joker_gfx15.png new file mode 100644 index 0000000000000000000000000000000000000000..56dcc60c3ff4774b2dc057cb26e4192c7456a599 GIT binary patch literal 877 zcmV-z1CsoSP)Ws(|xO*;Yd0K=p>{LJHUhMxokwm*NJsPC6z`SC;IB6rLFM<00S_rJgPA2!*z zrLv`aFv#xip0$G@`+s>fiFsqUej@u%DPgXBx@1T731SHF#zP*k1+G9 za#TKaNf<}hca#kZ)yb5UV{HQfXA&xaJ-pr2>_g!+!n|4xN&-NQnVpPk0fvT@@qupk zUH@$`Mgib#`XX4{pq|Wze4R`OLUhFZtDp(cczsbhl?0uft#m)pa7E zPNpbMhyK?dkZ1F=@~6X4F3QJ%Zd>cyhKU5403m!a^l`sv&kAx=FS`9md0jgIfVJPi zW5Gm%H41Quvs#=EU~My4g(@fcfI!4NfB0K~0>1l0*XLDp=lR$n&~+W_;8NGw0@%ab z5cbrVFYN;+vnbAwBlM)_N}QblA&hYnRI{g+LX7ao5gG+t;JgpOCL1|5C+8QDh--lM z0Wr?}vB z2z57LtD7#_O>UKKOGSsP-dSp*I@yLAk`U&?hk5Qc`e;idozSRCt&*Ogpen02PdRz?s00000NkvXXu0mjf DUL}{| literal 0 HcmV?d00001 diff --git a/include/def_joker_gfx_table.h b/include/def_joker_gfx_table.h index 480f7ed..dd1e762 100644 --- a/include/def_joker_gfx_table.h +++ b/include/def_joker_gfx_table.h @@ -13,3 +13,4 @@ DEF_JOKER_GFX(11) DEF_JOKER_GFX(12) DEF_JOKER_GFX(13) DEF_JOKER_GFX(14) +DEF_JOKER_GFX(15) \ No newline at end of file diff --git a/include/joker_gfx.h b/include/joker_gfx.h index bcb1ad2..f1202ba 100644 --- a/include/joker_gfx.h +++ b/include/joker_gfx.h @@ -16,5 +16,6 @@ #include "joker_gfx12.h" #include "joker_gfx13.h" #include "joker_gfx14.h" +#include "joker_gfx15.h" #endif \ No newline at end of file diff --git a/source/joker_effects.c b/source/joker_effects.c index fec1273..84d36f2 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -639,14 +639,12 @@ const JokerInfo joker_registry[] = { // Business card should be paired with Shortcut for palette optimization when it's added { COMMON_JOKER, 4, scary_face_joker_effect }, // 28 { COMMON_JOKER, 4, smiley_face_joker_effect }, // 29 + { COMMON_JOKER, 5, raised_fist_joker_effect }, // 30 + { COMMON_JOKER, 6, reserved_parking_joker_effect }, // 31 // The following jokers don't have sprites yet, // uncomment them when their sprites are added. - #if 0 - { COMMON_JOKER, 5, raised_fist_joker_effect }, - { COMMON_JOKER, 6, reserved_parking_joker_effect }, - { COMMON_JOKER, 4, abstract_joker_effect }, { UNCOMMON_JOKER, 6, bull_joker_effect}, { RARE_JOKER, 8, the_duo_joker_effect}, From c529c4be6966440ed02a168abfe62e69422fd73a Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Tue, 7 Oct 2025 21:26:43 +0300 Subject: [PATCH 04/17] Added art for jokers Abstract Joker by @MathisMartin31 and Bull by @NoWhammies10 and @GreenNinja2525 --- graphics/joker_gfx16.grit | 1 + graphics/joker_gfx16.png | Bin 0 -> 1230 bytes include/def_joker_gfx_table.h | 3 ++- include/joker_gfx.h | 1 + source/joker_effects.c | 4 ++-- 5 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 graphics/joker_gfx16.grit create mode 100644 graphics/joker_gfx16.png diff --git a/graphics/joker_gfx16.grit b/graphics/joker_gfx16.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx16.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx16.png b/graphics/joker_gfx16.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5ae2a1b6606ee1f7d92e81c99f56a9d433fbda GIT binary patch literal 1230 zcmV;<1Tp)GP)rf~ZpNw;AatPE1U4mLx zhoD1CMU6skfl%3p;-pujJv34ZZUqueb@HL6JKMu}Rv`{)jn+ZijUa;3e-i9HvsvFh|EA3NtjVkT)Y%e3P$-qXUs9<2O9eO& zFijJ?-#!2UPv9s*#1$)%0NJ@YRQ|A)PLs}@X^w_hD3!6ho!9mm#U|h*s$tWrVrA-5 zpj;(FQu3eW6tL`e<5JtlYH$1V!M6T>h#gO4+3RIjlif8JbHWkOvOmNd^tpc& z+IAd-E%C4r(IK(`BKhvpFSO#6yeGnmgR2)h^m*8WGnWOa8!*?$Ki)I4Oa%6qPq4DO zCTeVjciqeDJqd=S-*2Jcx~Lx z42&89jHgX42_^eb{aw6~IS)*n?X%;Y_D!V!PEqc5NTz(~kg9;#Yp2 zM|N%BOO)&fj2Hhh3 zG)H9#!Dd!WdVE;KnSDT&1O@V`{t?{GjL*b(u#qG@UL@A`^j_{B50!p&{*~_nD&@p7 z@%C1H1r_Vh0<2GV7SJU=LWuACLMU1XZFf?L^3gSp|K;L_yIkDR)-4w|T*q;g{sZ?^ sx{sqtzz#uSA4mUd|I)$ypFWTO3*iiB4+y;$0000007*qoM6N<$g2+ouKL7v# literal 0 HcmV?d00001 diff --git a/include/def_joker_gfx_table.h b/include/def_joker_gfx_table.h index dd1e762..796940f 100644 --- a/include/def_joker_gfx_table.h +++ b/include/def_joker_gfx_table.h @@ -13,4 +13,5 @@ DEF_JOKER_GFX(11) DEF_JOKER_GFX(12) DEF_JOKER_GFX(13) DEF_JOKER_GFX(14) -DEF_JOKER_GFX(15) \ No newline at end of file +DEF_JOKER_GFX(15) +DEF_JOKER_GFX(16) \ No newline at end of file diff --git a/include/joker_gfx.h b/include/joker_gfx.h index f1202ba..bab5633 100644 --- a/include/joker_gfx.h +++ b/include/joker_gfx.h @@ -17,5 +17,6 @@ #include "joker_gfx13.h" #include "joker_gfx14.h" #include "joker_gfx15.h" +#include "joker_gfx16.h" #endif \ No newline at end of file diff --git a/source/joker_effects.c b/source/joker_effects.c index 84d36f2..3f1bb9e 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -641,12 +641,12 @@ const JokerInfo joker_registry[] = { { COMMON_JOKER, 4, smiley_face_joker_effect }, // 29 { COMMON_JOKER, 5, raised_fist_joker_effect }, // 30 { COMMON_JOKER, 6, reserved_parking_joker_effect }, // 31 + { COMMON_JOKER, 4, abstract_joker_effect }, // 32 + { UNCOMMON_JOKER, 6, bull_joker_effect}, // 33 // The following jokers don't have sprites yet, // uncomment them when their sprites are added. #if 0 - { COMMON_JOKER, 4, abstract_joker_effect }, - { UNCOMMON_JOKER, 6, bull_joker_effect}, { RARE_JOKER, 8, the_duo_joker_effect}, { RARE_JOKER, 8, the_trio_joker_effect}, { RARE_JOKER, 8, the_family_joker_effect}, From a0f1ef7780999b17cd62b9189a2d6d376b6150d4 Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Tue, 7 Oct 2025 23:52:49 +0300 Subject: [PATCH 05/17] Added art for xmult hand jokers The Duo The Trio, The Family, The Order, and The Tribe by @MathisMartin31 --- graphics/joker_gfx17.grit | 1 + graphics/joker_gfx17.png | Bin 0 -> 1510 bytes graphics/joker_gfx18.grit | 1 + graphics/joker_gfx18.png | Bin 0 -> 1596 bytes graphics/joker_gfx19.grit | 1 + graphics/joker_gfx19.png | Bin 0 -> 888 bytes include/def_joker_gfx_table.h | 5 ++++- include/joker_gfx.h | 3 +++ source/joker_effects.c | 22 ++++++---------------- 9 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 graphics/joker_gfx17.grit create mode 100644 graphics/joker_gfx17.png create mode 100644 graphics/joker_gfx18.grit create mode 100644 graphics/joker_gfx18.png create mode 100644 graphics/joker_gfx19.grit create mode 100644 graphics/joker_gfx19.png diff --git a/graphics/joker_gfx17.grit b/graphics/joker_gfx17.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx17.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx17.png b/graphics/joker_gfx17.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea05f02388019621fdbce91349b2bb58b0e9ec4 GIT binary patch literal 1510 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 u{vd}jK(7I+xvh@!D literal 0 HcmV?d00001 diff --git a/graphics/joker_gfx19.grit b/graphics/joker_gfx19.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx19.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx19.png b/graphics/joker_gfx19.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f9eef80ff9b82bd2cfeffd3936d9daaab6c3ef GIT binary patch literal 888 zcmV-;1Bd*HP)%pVUEyBuJ&uc^z46JhI`N8uB0P{q+rwtPMu-oCW zd9$7%4=jig$u!(nJ0Z;F)qq7X38kWkj_32QB%X#8;lar(07h$cLi zjs==4Nc5*;W61+c#(;rUW)X-mSpfjt2FGw)?Tkeb@tbW6H`~_Q7QIfWX)v9_fJJn7 z5$|+d4@l7bJc}4uWgM())oX-m0crmxLDHncZU@yJ8@q4bCf-fIZ*pK%Eda=hKv`kl ztOEc_y&)XWXG;isL(H3XlzPL&yrTNS1S}N;syj9u&u4;p{!F6KyissrbN~bjEPz1d z3G-$hyYVikk)BuW4dK`owxl0lzpc97wWH7isyjA-WKkqdns!mIk!q_EpjrBCM&=M%j*NH%)*e{02`bJ9na@L)}M|!CQwN% zMUbVkd=EgTp)w7*X|NGZaDBMXDbMkIE`e*ah-(27qBe^FEJ|j_^AX1GVlsIkCkUp` z12v=z9GMD7!3C#1*$~}-@p3bQpa!kUx!JZd@n95O;PJ^3`tg4fMz+)@p-=$X6{fpA zoE&B5687v0pAJ(tFtr<8+5!l-!SR9^?pkCZ+dNTV+}JEYpo0##)lQuG0}C;vOK4{R zCRc$#fdJCy&(BVI=Ot>hDEE92xJ!X1i?Gy*5JhrIbrQ>%xXGzd6+r9UG@>%H7u^z> zjNiT(0kTJ3GESF$<>+xR}?Z4f@%6|?3 O0000 Date: Wed, 8 Oct 2025 00:05:37 +0300 Subject: [PATCH 06/17] Removed "unused" attribute from integrated jokers --- source/joker_effects.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index ae04f43..9994cfb 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -304,9 +304,6 @@ static JokerEffect blue_joker_effect(Joker *joker, Card *scored_card) { return effect; } -// Using __attribute__((unused)) for jokers with no sprites yet to avoid warning -// Remove the attribute once they have sprites -__attribute__((unused)) static JokerEffect raised_fist_joker_effect(Joker *joker, Card *scored_card) { JokerEffect effect = {0}; @@ -331,7 +328,6 @@ static JokerEffect raised_fist_joker_effect(Joker *joker, Card *scored_card) return effect; } -__attribute__((unused)) static JokerEffect reserved_parking_joker_effect(Joker *joker, Card *scored_card) { JokerEffect effect = {0}; if (scored_card != NULL) @@ -397,7 +393,6 @@ static JokerEffect scary_face_joker_effect(Joker *joker, Card *scored_card) { return effect; } - __attribute__((unused)) static JokerEffect abstract_joker_effect(Joker *joker, Card *scored_card) { JokerEffect effect = {0}; if (scored_card != NULL) @@ -410,7 +405,6 @@ static JokerEffect abstract_joker_effect(Joker *joker, Card *scored_card) { return effect; } -__attribute__((unused)) static JokerEffect bull_joker_effect(Joker *joker, Card *scored_card) { JokerEffect effect = {0}; if (scored_card != NULL) @@ -537,7 +531,8 @@ static JokerEffect odd_todd_joker_effect(Joker *joker, Card *scored_card) { return effect; } - +// Using __attribute__((unused)) for jokers with no sprites yet to avoid warning +// Remove the attribute once they have sprites // graphics available from @MathisMartin31 __attribute__((unused)) static JokerEffect bootstraps_joker_effect(Joker *joker, Card *scored_card) { From ae4094900872092aa4bfbb3c4cbbaf93f9e1d1c9 Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Wed, 8 Oct 2025 00:18:30 +0300 Subject: [PATCH 07/17] Fixed Bull border corner transparency --- graphics/joker_gfx16.png | Bin 1230 -> 1199 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/graphics/joker_gfx16.png b/graphics/joker_gfx16.png index ed5ae2a1b6606ee1f7d92e81c99f56a9d433fbda..4398b146414ed74027f498f5b56e55dceb68295b 100644 GIT binary patch delta 1146 zcmV-=1cm#~39ku|BqDZ6L_t(&f#q32Xd6cqeYLr!2A(f~CE>y%^6ie5-!snvX_A;o#B_zvECj?!iMzn&B$yO3d3lw^-2vEtiC`sw zZqNsB-iy^a4Fab@@Zj~WQx!+I#bpspVVwg=)4|U5FL_KzpT0GVsw(1u~3mIsGp`%Z#!TYOxIB*9n!nSAf+FSOx=JQv|Oz-t$} zv^?x1n9GAS9k^?gU+)=NCIb6^D<)V~n+c{&9JjqX+_ex+g8&x*4Ey-?rE3VwE`S^W z!1>~L+G*GaE?z<~mj^%vp?3CQ{uhd))!q7TR6gi*BJEh~&k#Kc7F3+3S!f03)6`4rs-&k6`~Z z91aF}6;z;Zw~KC9$wLOg5_xfthSJWk9@m@Owb&MC`CxOq z27rc4`g?$aJV3X&e5_@TgAw_Y^Pdq9%kHQyCD_W!Nly$5o7D$&Nl+r685|Au$TP52ACZldKkrZqU_u^%lIU5H7mr0b2e4z(_kFAQ2Q&h( zhnghvFB+e(d>AQzf4%?nMB^xzE8NH-+{ndVORLKA-z59AV5h;&#Vcq%e8lTp4Lrn}A(f~C4pheH)IEd*kwzqc zP}zs#q*tRoG*Sv~1rkkl@}Z_X+rxNPv$Hd^yIQL;^ntK<=Fj|jZ|47*oi!jq>!9t* z%9G;e(t;6Y(>iDaz(o85Fm5g__zI>Z18@Q0#yj~y>q4oF-GBb_l^yl__~OkxnpRco zdGDEx)HbYrp)+%tjVkT)Y%e3P$-qXUs9<2O9eO&FijJ?-#!2U zPv9s*#1$)%0NJ@YRQ|A)PLs}@X^w_hD3!6ho!9mm#U|h*s$tWrVrA-5pj;(FQu3eW6tL`e<5JtlYH$1V!MfN+=o8_poB@?0I3^zQN0p-AW`vJlOUu`%EfD8b@`1*I+XxIZTUWPN51waL%cJaadFXTtFyZz(n zxoz9NdcIB^zY4KN#uJ$@zw}}r0A76Xw^!#(r_epld8@?}Ck6_oGG@|$Y45ph+rA$_ z$?{@|^#CxFPHR_#b_Foy`1p0E0UWLZ_yH?>8`N%{*8TSMV`SI%(LK)5FgOG7B8YL8n8>GV=4~mq3kpZQRWaj2b~} zF?2j0*h!EPTFB>pGe0|jI~xcA{+V9|u|t3@?bL}gA};|W4ggc1e+Gbt20+8bEt($r zaUdS2n^qMw>9jHgX42_^eb{aw6~IS)*n?X%;Y_D!V!PEqc5NTz(~kg9;#Yp2M|N%B zOO)&fj2Hhh33Sl>`Oyss0h%&5X~)cd(HpJYFQ$_VixvTtO;87m#y3^5-2= z0iuuxASF5}^8B`cDCPjRO%4WwSn&@i1Yj>UI`Xd@U#))Pd;ae5`B?o(r_0^Uz}?IQ zuBBzq;$NM8Qn20N_Tn`(9zXHQ8;_sh_Tn|)>=QzKV^cx9Uitetu`EivsP;Oj-XT}t ze^2^9gK3)HouW_(c6S;Nm40;omG1&7<-{`a z_Evla73H3BT-?ysEf+Uj$8nVY1NT(A rkE2Pz4nbibNB?X8(!u Date: Tue, 16 Sep 2025 15:21:34 -0700 Subject: [PATCH 08/17] Update docs for docker --- README.md | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 25c2a2c..288eab3 100644 --- a/README.md +++ b/README.md @@ -41,15 +41,36 @@ This **tech-demo/proof of concept** is strictly limited in content to a minimal # **Build Instructions:** ## **-Docker-** -A docker compose file is provided to build this project. +A docker compose file is provided to build this project. It provides a standard build environment for this projects CI/CD and can also be used to build the ROM locally. -1.) Install [docker desktop](https://docs.docker.com/compose/install/). +_Some users may find this option to be the easiest way to build locally._ +- _This option **avoids** setting up the development environment as described below._ +- _No additional software besides **docker desktop** is required._ -2.) Open a terminal to this projects directory: +### Step-by-Step + +1.) Install [docker desktop](https://docs.docker.com/desktop/) for your operating system. + +2.) Open a terminal to this project's directory: - On **Linux** run `UID=$(id -u) GID=$(id -g) docker compose up` - On **Windows** run `docker compose up` -Docker will build the project and the ROM will be in the same location as how Step 7 describes below. +
+ How do I open a terminal in windows? + +--- + +From the file explorer, you can open a folder in **powershell** (_a modern windows terminal_): + +- **hold 'Shift'** and **Right Click** on the folder. + +- Select **"Open PowerShell window here"** from the popup menu. + +--- + +
+ +3.) Docker will build the project and the ROM will be in the same location as step 7 describes below. ## **-Windows-** Video Tutorial: https://youtu.be/72Zzo1VDYzQ?si=UDmEdbST1Cx1zZV2 From bc44de0493f7982f1f77192c3630b0c19d95dac9 Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:57:20 +0200 Subject: [PATCH 09/17] Update include/joker.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- include/joker.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/joker.h b/include/joker.h index 66edc16..8362445 100644 --- a/include/joker.h +++ b/include/joker.h @@ -37,7 +37,7 @@ #define GREEDY_JOKER_ID 1 // This is just an example to show the patern of making joker IDs #define JOKER_STENCIL_ID 16 #define JOKER_BLUEPRINT_ID 99 // This needs to be changed -#define JOKER_BRAINSTORM_ID 99 // This needs to be changed +#define JOKER_BRAINSTORM_ID 100 // This needs to be changed typedef struct { From 0dbde481d5f9001165630fd13b28d5cb8d76609f Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:57:50 +0200 Subject: [PATCH 10/17] Update source/joker_effects.c Co-authored-by: MeirGavish --- source/joker_effects.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index 512a77e..90373f3 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -471,7 +471,7 @@ static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { bool trigger_next_joker = false; for (int i = 0; i < list_get_size(jokers); i++ ) { - JokerObject* joker_object = list_get(jokers, i); + JokerObject* curr_joker_object = list_get(jokers, i); if (trigger_next_joker) { effect = joker_get_score_effect(joker_object->joker, scored_card); break; From 324478845d57d76aa4226f8f9f1f97b19fcff380 Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:58:11 +0200 Subject: [PATCH 11/17] Update source/joker_effects.c Co-authored-by: MeirGavish --- source/joker_effects.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index 90373f3..05d21e2 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -478,7 +478,7 @@ static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { } // JOKER_BLUEPRINT_ID (joker.h) will need to be updated - if (joker_object->joker->id == JOKER_BLUEPRINT_ID) + if (curr_joker_object->joke == joker) trigger_next_joker = true; } From fec243b4825389d3f979059658beb604ef46744c Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:59:27 +0200 Subject: [PATCH 12/17] Update source/joker_effects.c Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- source/joker_effects.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index 05d21e2..ac7d7de 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -495,7 +495,7 @@ static JokerEffect brainstorm_joker_effect(Joker *joker, Card *scored_card) { JokerObject* first_joker = list_get(jokers, 0); // JOKER_BRAINSTORM_ID (joker.h) will need to be updated - if (first_joker->joker->id != JOKER_BRAINSTORM_ID) { + if (first_joker != NULL && first_joker->joker->id != JOKER_BRAINSTORM_ID) { // manually flip this to avoid infinite blueprint + brainstorm loops joker->processed = true; effect = joker_get_score_effect(first_joker->joker, scored_card); From af72fe574946f2c711536a977facb960cf96e19e Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 18:21:55 +0200 Subject: [PATCH 13/17] Fix conflicts Attempt 1 --- source/joker_effects.c | 71 ++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index 76c57b3..7694dff 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -458,22 +458,6 @@ static JokerEffect odd_todd_joker_effect(Joker *joker, Card *scored_card) { return effect; } -__attribute__((unused)) -static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { - JokerEffect effect = {0}; - List* jokers = get_jokers(); - bool trigger_next_joker = false; - - for (int i = 0; i < list_get_size(jokers); i++ ) { - JokerObject* curr_joker_object = list_get(jokers, i); - if (trigger_next_joker) { - effect = joker_get_score_effect(joker_object->joker, scored_card); - break; - } - - // JOKER_BLUEPRINT_ID (joker.h) will need to be updated - if (curr_joker_object->joke == joker) - trigger_next_joker = true; static JokerEffect the_duo_joker_effect(Joker *joker, Card *scored_card) { JokerEffect effect = {0}; if (scored_card != NULL) @@ -575,7 +559,45 @@ static JokerEffect shoot_the_moon_joker_effect(Joker *joker, Card *scored_card) if (hand[i]->card->rank == QUEEN) { effect.mult += 13; - } + } + } + + return effect; +} + +// no graphics available but ready to be used if wanted when graphics available +__attribute__((unused)) +static JokerEffect triboulet_joker_effect(Joker *joker, Card *scored_card) { + JokerEffect effect = {0}; + if (scored_card == NULL) + return effect; + + switch (scored_card->rank) { + case KING: case QUEEN: + effect.xmult = 2; + default: + break; + } + + return effect; +} + +__attribute__((unused)) +static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { + JokerEffect effect = {0}; + List* jokers = get_jokers(); + bool trigger_next_joker = false; + + for (int i = 0; i < list_get_size(jokers); i++ ) { + JokerObject* curr_joker_object = list_get(jokers, i); + if (trigger_next_joker) { + effect = joker_get_score_effect(joker_object->joker, scored_card); + break; + } + + // JOKER_BLUEPRINT_ID (joker.h) will need to be updated + if (curr_joker_object->joke == joker) + trigger_next_joker = true; } return effect; @@ -596,24 +618,11 @@ static JokerEffect brainstorm_joker_effect(Joker *joker, Card *scored_card) { joker->processed = true; effect = joker_get_score_effect(first_joker->joker, scored_card); joker->processed = false; -// no graphics available but ready to be used if wanted when graphics available -__attribute__((unused)) -static JokerEffect triboulet_joker_effect(Joker *joker, Card *scored_card) { - JokerEffect effect = {0}; - if (scored_card == NULL) - return effect; - - switch (scored_card->rank) { - case KING: case QUEEN: - effect.xmult = 2; - default: - break; } return effect; } - /* The index of a joker in the registry matches its ID. * The joker sprites are matched by ID so the position in the registry * determines the joker's sprite. @@ -692,4 +701,4 @@ const JokerInfo* get_joker_registry_entry(int joker_id) { size_t get_joker_registry_size(void) { return joker_registry_size; -} +} \ No newline at end of file From 9ae53bddb81d1b94b7438b05d05af4dd9acb2824 Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 18:39:49 +0200 Subject: [PATCH 14/17] Fix errors introduced by latest commits --- source/joker_effects.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index 7694dff..2eabe2b 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -591,12 +591,12 @@ static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { for (int i = 0; i < list_get_size(jokers); i++ ) { JokerObject* curr_joker_object = list_get(jokers, i); if (trigger_next_joker) { - effect = joker_get_score_effect(joker_object->joker, scored_card); + effect = joker_get_score_effect(curr_joker_object->joker, scored_card); break; } // JOKER_BLUEPRINT_ID (joker.h) will need to be updated - if (curr_joker_object->joke == joker) + if (curr_joker_object->joker == joker) trigger_next_joker = true; } @@ -606,7 +606,8 @@ static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { __attribute__((unused)) static JokerEffect brainstorm_joker_effect(Joker *joker, Card *scored_card) { JokerEffect effect = {0}; - if (joker->processed) + static bool in_brainstorm = false; + if (in_brainstorm) return effect; List* jokers = get_jokers(); @@ -615,9 +616,9 @@ static JokerEffect brainstorm_joker_effect(Joker *joker, Card *scored_card) { // JOKER_BRAINSTORM_ID (joker.h) will need to be updated if (first_joker != NULL && first_joker->joker->id != JOKER_BRAINSTORM_ID) { // manually flip this to avoid infinite blueprint + brainstorm loops - joker->processed = true; + in_brainstorm = true; effect = joker_get_score_effect(first_joker->joker, scored_card); - joker->processed = false; + in_brainstorm = false; } return effect; From 8ae496853923701843ebebf4f02c4a80543fe4ff Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 18:52:10 +0200 Subject: [PATCH 15/17] Remove duplicated entries --- source/joker_effects.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index 2eabe2b..7fc8e6e 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -678,12 +678,6 @@ const JokerInfo joker_registry[] = { // The following jokers don't have sprites yet, // uncomment them when their sprites are added. #if 0 - { COMMON_JOKER, 5, raised_fist_joker_effect }, - { COMMON_JOKER, 6, reserved_parking_joker_effect }, - - { COMMON_JOKER, 4, abstract_joker_effect }, - { UNCOMMON_JOKER, 6, bull_joker_effect}, - { RARE_JOKER, 10, blueprint_joker_effect }, { RARE_JOKER, 10, brainstorm_joker_effect }, { UNCOMMON_JOKER, 7, bootstraps_joker_effect}, From 23a14cb76eda58d0972c74bb55a5f9134c401a40 Mon Sep 17 00:00:00 2001 From: Nan <88463477+Nanrech@users.noreply.github.com> Date: Wed, 8 Oct 2025 20:41:09 +0200 Subject: [PATCH 16/17] Update source/joker_effects.c Co-authored-by: MeirGavish --- source/joker_effects.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/source/joker_effects.c b/source/joker_effects.c index 7fc8e6e..3297ee4 100644 --- a/source/joker_effects.c +++ b/source/joker_effects.c @@ -586,18 +586,15 @@ __attribute__((unused)) static JokerEffect blueprint_joker_effect(Joker *joker, Card *scored_card) { JokerEffect effect = {0}; List* jokers = get_jokers(); - bool trigger_next_joker = false; - - for (int i = 0; i < list_get_size(jokers); i++ ) { + int list_size = list_get_size(jokers); + + for (int i = 0; i < list_size - 1; i++ ) { JokerObject* curr_joker_object = list_get(jokers, i); - if (trigger_next_joker) { - effect = joker_get_score_effect(curr_joker_object->joker, scored_card); + if (curr_joker_object->joker == joker) { + JokerObject* next_joker_object = list_get(jokers, i + 1); + effect = joker_get_score_effect(next_joker_object->joker, scored_card); break; } - - // JOKER_BLUEPRINT_ID (joker.h) will need to be updated - if (curr_joker_object->joker == joker) - trigger_next_joker = true; } return effect; From 4b35b2f7d8f0ac402b8a0439a4f00cb5e8d47116 Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Wed, 8 Oct 2025 22:40:15 +0300 Subject: [PATCH 17/17] Added art for jokers Blueprint and Brainstorm by @NoWhammies10 and @GreenNinja2525 --- graphics/joker_gfx19.png | Bin 888 -> 1514 bytes graphics/joker_gfx20.grit | 1 + graphics/joker_gfx20.png | Bin 0 -> 955 bytes include/def_joker_gfx_table.h | 3 ++- include/joker.h | 3 +-- include/joker_gfx.h | 1 + source/joker_effects.c | 9 +++------ 7 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 graphics/joker_gfx20.grit create mode 100644 graphics/joker_gfx20.png diff --git a/graphics/joker_gfx19.png b/graphics/joker_gfx19.png index e6f9eef80ff9b82bd2cfeffd3936d9daaab6c3ef..a93051e1a7c0007386e96f201fc9ca0cc9b5c968 100644 GIT binary patch delta 1497 zcmV;~1t$9V2I>otBYy?4NklXSl=D--OSWFzW(amgX25Zqjx zLy8ZT1&Rr-50(u+2xFNXid>ALh9o|?p~MT)UQBaPE~zM#`cjqLQ$!RWL$I>MwGSr6 zLFz$zPj6>uR)40Kejs+|?d-0;Z{B%4!4D|9x zPx3B%u3AANJjO==NG&Y`03JTL&;4dkkB|=yd#=ylo;Cgn-TUwD);!l@ks*{19X_gd z*#_XUeYX(MzWRYb$?g{39m&Up3d-55?3Kb_;~$$0B*176+~K+CzKBz{%x+ru(=ZJ=^efT z_(A9XsikEcXV-dtWKY;!iD7lSjMeQjHdkUi;%Zo!U=%>QzeKKD(b`E6ivNBg-QNTv zPv@`Seqa$gArJTn5Km`dZ*6cG0N^mlRV&)~_j7xbaDOITzw-hIdlR16CrI)Du)1Bw z$S0RvHhG`S84}tgNFeeuv(rpK(1n6Tx5OpX*q3px5~XXZFn~ymH@ZxMgnVciv!_P@ zT7=090N^;ghSbus$0LY*aWI79V5pN<8L_z%!{evt{8J&XNuk>10<8zAQy9?5?kO}! zTJZv)<$nPtkI09HG4DfALUq^VtsyOG6G#NB&^{MvJwT0b5=13sZ*5?5G>n_OKe_Hz z@9#D-$|+7q{^hGf&poQ`@zZl8Z#9H8#XsPa15^?;E7X!R0DyqCk9a!6o?u)1s3m6* zu=ZX3{OX5pF*hA_iIGY~8~-);%GgI1L%=)FGk-hE0h6O)#M2ojXo_bNh59|u?(~%e zX=j$FvEu6Ica@ zr#6|{5B4VTOR2S9`ufX{Fcyt)oBErkMG0R4CP%{n+(nUeX&PNwAMk^lpkrpKltkN0TfGh6ian(t7u0a@W}!8)`lzIB{?dROh|;sU^n~asukGH(C8Gp zsf!ZXcr@aQc>s9XY|5~Z&+(fIwH`nfAdRd{Zgd@J2otdOxlR4m3bK}*@fA#kjy!q8 z+;otM9_&qU$(%|=wJuM>byW$)iEB8 zU_2T@u~f&efBenYNhmq`CJ*pk43XRCsuj)&R1!-OWT`Cg1H9qT4|xE%Iuyj!p?@F( z^%IO-Im5`6GX&}K9OA&y^`eAju?A{;L<&I#Uqr6iCSfQ%Rtb)T;p0rI}yX?8w555A(RiV1t!}_A9FCh^g<2?kL4Z2wkN)UOu^8>U- zm~6U!(gPakA_Po0&aO3xp|wN?yo)DFj2E#OQg?oIyFoe|pd`OuLO_xt@_%YuhKDLb zKeK=dR>8Z)C2f+lx~-7u;&jW zfOo4)&J^VKy|}+0+&esalu{2JcKaXKhkd^jXgy&5_AJi!e&A`$1i4*KAWu-;zMF;6 zH#gql-l2Oxzta&Xe49PeejHVy{ZjjX`aJ$G=TOFzR)^s!00000NkvXXu0mjfO83i| delta 866 zcmV-o1D*Wp3-|_*BYy)wNkl>%Ry!fg<<)>iFbSoihmPm- zuOyy^6yd?iD*#EWFd2mc6hSk8x7EgNaJ>4e{vvV(kmfJZpN`dW5`_GJQ;;iw<0bmSbz2ZBD2pE?q6f67|@6&JeH0Hnkz{3r(I%$s$Tdc(xLqWZxE zEENN)J2o88XM%bDOrp@dQE*{&00aswfI#F4^JX2p@h+#4o>%P+;n)?nq#s|ut-9W| zqtF7XJ2rr1Q6x>8c30L1{NY%nu-j4Nhbbtm1n12<`?4e_cUl7pLhg`PRhj^`9e(=c zA(JHHrGGfc?b(%FLiCQTAm#fXK7HAYc376dw3{IoBtih!hx_WsLXi$->rBCM&=M%j*NH%)*e{02`bJ9na@L)}M|!CQwN%MUbVkd=EgTp)w7*X|NGZaDBMXDbMkI zE`e*ah-(27qBe^FEJ|j_^AX1GVlsIkCkUp`1AjH73mlmWN5KWBJ=qZ5fAMlNf}jSi z$+_9KGVx#(T;TD^5&H3e5=OSvCZSLO*%hX{J)9h6<`VYo3ZD*BHZZjtT-pK%x54p( z817nRAlp1qVBFX&K%j#Tx7ALZ`2!0vq)TXL047&~K!E_#=g-ehdFLf+vncm`5V%W$ zCR>ZJ)QJ#9a!Pd)%b2*ysZbR_>)bS=GO`!l5}AzOz8C?rM_n>gklCAT{y@Ry==XQ8 sIgJ7N7NGS7+M%kcm!s-p{-^8lUl#4Z-NDL#4gdfE07*qoM6N<$f=3gfd;kCd diff --git a/graphics/joker_gfx20.grit b/graphics/joker_gfx20.grit new file mode 100644 index 0000000..a8ac3f6 --- /dev/null +++ b/graphics/joker_gfx20.grit @@ -0,0 +1 @@ +-gB4 -Mw4 -Mh4 -m! -pn 16 \ No newline at end of file diff --git a/graphics/joker_gfx20.png b/graphics/joker_gfx20.png new file mode 100644 index 0000000000000000000000000000000000000000..4031b3d98bd3546dd8e531c96daf7f4ed302717c GIT binary patch literal 955 zcmV;s14R6ZP);=dK zbzvSkPmt|QBS0yH#wqJm7$+yV#7njXZ+|>TRsgp%71}zW+i7EQWl4wuz}R{Ig*mwM zoG9OMjg1Adb%0#F$bpVX;3UZkAQDVgL97CJCCI;~yvEC3fJ-Y6017#}tY8|ZR)8Gc zsg-OCnV_za#CwwwyBh>XWXN)+sLsi-S%9RuJYJN&02_DV&2L~r78pU6wci{$`tJ32 zl)dMXV|2W0(T10(^GQ z(^tAy!NGh18_k{Qiyq7ufIbw-lP&Ea{~KJLABNNhy;eBrwZe<_weVtnExP}(+Z6h^ zF|y_TefuZl)+`{GvT`Lz0Z&ei+}30TX!iocY6FR4PC4?T-Cu7u4*=MHBd+h=qcJ%* zeR2I08K&(8Vt0eS;|k{imsTE`ppM>bK60Ep3_uy@B$!Ho_B^25X(Lh031x03sAHjZ zEjYRT#u6GiPII0-Hoq8BvVgt0#STTp9pUkE0jrLSjoker->id != JOKER_BRAINSTORM_ID) { - // manually flip this to avoid infinite blueprint + brainstorm loops + // Static var to avoid infinite blueprint + brainstorm loops in_brainstorm = true; effect = joker_get_score_effect(first_joker->joker, scored_card); in_brainstorm = false; @@ -671,12 +668,12 @@ const JokerInfo joker_registry[] = { { RARE_JOKER, 8, the_family_joker_effect}, // 36 { RARE_JOKER, 8, the_order_joker_effect}, // 37 { RARE_JOKER, 8, the_tribe_joker_effect}, // 38 + { RARE_JOKER, 10, blueprint_joker_effect }, // 39 + { RARE_JOKER, 10, brainstorm_joker_effect }, // 40 // The following jokers don't have sprites yet, // uncomment them when their sprites are added. #if 0 - { RARE_JOKER, 10, blueprint_joker_effect }, - { RARE_JOKER, 10, brainstorm_joker_effect }, { UNCOMMON_JOKER, 7, bootstraps_joker_effect}, { COMMON_JOKER, 5, shoot_the_moon_joker_effect}, #endif