Implement arbitrary-sized joker spritesheets (#285)

* Convert static joker sprites indexes to maps for dynamic spritesheets size

* tmp commit

* reorder Joker spritesheets

* more reordering

* Joker maps, will test later

* More reorders and palette optimizations. Sprites now work

* Fix Joker gfx

* Format joker.c

* Fix rebase error

* Integrate Shoot the Moon art

* format

* format

* removing useless GBAL_UNUSED from photograph Joker effect func

* Tidy up joker.c variables formatting

* Fix magic number

* Add context for map in joker.c

Co-authored-by: Rickey <ric@rf3.xyz>

* Update source/joker.c

Co-authored-by: Rickey <ric@rf3.xyz>

* Apply suggestion from @ricfehr3

Co-authored-by: Rickey <ric@rf3.xyz>

* format

* reduce clutter in joker_effects.c file by defining a macro for forward static declarations of joker effect funcs

* refactored some maps in joker.c to make it more concise

* clang format

* adding back how to mark functions as unused when Jokers don't have a sprite yet

* format

* Remove comment about unused functions for Jokers without art

---------

Co-authored-by: MathisMartin31 <mathis.martin31@gmail.com>
Co-authored-by: Rickey <ric@rf3.xyz>
This commit is contained in:
Geralt
2026-03-28 17:58:05 -07:00
committed by GitHub
co-authored by Rickey MathisMartin31
parent 461584b674
commit 5cf9e2674d
40 changed files with 196 additions and 414 deletions
+122 -357
View File
@@ -23,312 +23,72 @@
static JokerEffect shared_joker_effect = {0};
// Joker Effect functions
static u32 joker_effect_noop(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 default_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
#define REGISTER_JOKER_EFFECT_FUNC(joker_effect_name) \
static u32 joker_effect_name( \
Joker* joker, \
Card* scored_card, \
enum JokerEvent joker_event, \
JokerEffect** joker_effect \
);
static u32 sinful_joker_effect(
Card* scored_card,
u8 sinful_suit,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 greedy_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 lusty_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 wrathful_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 gluttonous_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 jolly_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 zany_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 mad_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 crazy_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 droll_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 sly_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 wily_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 clever_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 devious_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 crafty_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 half_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 joker_stencil_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 misprint_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 walkie_talkie_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 fibonnaci_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 banner_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 mystic_summit_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 blackboard_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 blue_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 raised_fist_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 reserved_parking_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 business_card_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 scholar_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 scary_face_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 abstract_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 bull_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 smiley_face_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 even_steven_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 odd_todd_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 acrobat_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 hanging_chad_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 the_duo_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 the_trio_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 the_family_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 the_order_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 the_tribe_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 bootstraps_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 shoot_the_moon_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 photograph_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 dusk_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 blueprint_brainstorm_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 hack_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 seltzer_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
static u32 sock_and_buskin_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
JokerEffect** joker_effect
);
REGISTER_JOKER_EFFECT_FUNC(joker_effect_noop)
REGISTER_JOKER_EFFECT_FUNC(default_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(greedy_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(lusty_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(wrathful_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(gluttonous_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(jolly_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(zany_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(mad_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(crazy_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(droll_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(sly_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(wily_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(clever_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(devious_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(crafty_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(half_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(stencil_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(misprint_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(walkie_talkie_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(fibonnaci_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(banner_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(mystic_summit_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(blackboard_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(blue_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(raised_fist_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(reserved_parking_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(business_card_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(scholar_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(scary_face_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(abstract_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(bull_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(smiley_face_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(even_steven_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(odd_todd_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(acrobat_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(hanging_chad_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(the_duo_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(the_trio_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(the_family_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(the_order_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(the_tribe_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(bootstraps_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(shoot_the_moon_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(photograph_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(dusk_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(blueprint_brainstorm_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(hack_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(seltzer_joker_effect)
REGISTER_JOKER_EFFECT_FUNC(sock_and_buskin_joker_effect)
// clang-format off
/* The index of a joker in the registry matches its ID.
@@ -340,66 +100,76 @@ static u32 sock_and_buskin_joker_effect(
* (and put together in the matching spritesheet) to share a color palette.
* Otherwise the order is similar to the wiki.
*/
// clang-format off
const JokerInfo joker_registry[] =
{
// Spritesheet 0
{ COMMON_JOKER, 2, default_joker_effect }, // DEFAULT_JOKER_ID = 0
{ COMMON_JOKER, 5, greedy_joker_effect }, // GREEDY_JOKER_ID = 1
{ COMMON_JOKER, 5, lusty_joker_effect }, // etc... 2
{ COMMON_JOKER, 5, wrathful_joker_effect }, // 3
{ COMMON_JOKER, 5, gluttonous_joker_effect }, // 4
{ COMMON_JOKER, 3, jolly_joker_effect }, // 5
{ COMMON_JOKER, 4, zany_joker_effect }, // 6
{ COMMON_JOKER, 4, mad_joker_effect }, // 7
{ COMMON_JOKER, 4, crazy_joker_effect }, // 8
{ COMMON_JOKER, 4, abstract_joker_effect }, // 1
{ COMMON_JOKER, 5, half_joker_effect }, // 2
{ COMMON_JOKER, 4, misprint_joker_effect }, // 3
{ COMMON_JOKER, 4, scary_face_joker_effect }, // 4
{ UNCOMMON_JOKER, 6, sock_and_buskin_joker_effect }, // 5
{ UNCOMMON_JOKER, 6, acrobat_joker_effect }, // 6
{ UNCOMMON_JOKER, 8, fibonnaci_joker_effect }, // 7
{ COMMON_JOKER, 4, scholar_joker_effect }, // 8
{ COMMON_JOKER, 4, droll_joker_effect }, // 9
{ COMMON_JOKER, 3, sly_joker_effect }, // 10
{ COMMON_JOKER, 4, wily_joker_effect }, // 11
{ COMMON_JOKER, 4, clever_joker_effect }, // 12
{ COMMON_JOKER, 4, devious_joker_effect }, // 13
{ COMMON_JOKER, 4, crafty_joker_effect }, // 14
{ COMMON_JOKER, 5, half_joker_effect }, // 15
{ UNCOMMON_JOKER, 8, joker_stencil_effect }, // 16
{ COMMON_JOKER, 5, photograph_joker_effect, }, // 17
{ COMMON_JOKER, 4, walkie_talkie_joker_effect }, // 18
{ COMMON_JOKER, 5, banner_joker_effect }, // 19
{ UNCOMMON_JOKER, 6, blackboard_joker_effect }, // 20
{ COMMON_JOKER, 5, mystic_summit_joker_effect }, // 21
{ COMMON_JOKER, 4, misprint_joker_effect }, // 22
{ COMMON_JOKER, 4, even_steven_joker_effect }, // 23
{ COMMON_JOKER, 5, blue_joker_effect }, // 24
{ COMMON_JOKER, 4, odd_todd_joker_effect }, // 25
{ UNCOMMON_JOKER, 7, joker_effect_noop, }, // 26 Shortcut
{ COMMON_JOKER, 4, business_card_joker_effect }, // 27
{ COMMON_JOKER, 4, scary_face_joker_effect }, // 28
{ UNCOMMON_JOKER, 7, bootstraps_joker_effect }, // 29
{ UNCOMMON_JOKER, 5, joker_effect_noop }, // 30 Pareidolia
{ COMMON_JOKER, 6, reserved_parking_joker_effect }, // 31
{ COMMON_JOKER, 4, abstract_joker_effect }, // 32
{ UNCOMMON_JOKER, 6, bull_joker_effect }, // 33
{ RARE_JOKER, 8, the_duo_joker_effect }, // 34
{ RARE_JOKER, 8, the_trio_joker_effect }, // 35
{ 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_brainstorm_joker_effect }, // 39 Blueprint
{ RARE_JOKER, 10, blueprint_brainstorm_joker_effect }, // 40 Brainstorm
{ COMMON_JOKER, 5, raised_fist_joker_effect }, // 41
{ COMMON_JOKER, 4, crafty_joker_effect }, // 10
{ COMMON_JOKER, 5, raised_fist_joker_effect }, // 11
{ COMMON_JOKER, 6, reserved_parking_joker_effect }, // 12
{ COMMON_JOKER, 4, business_card_joker_effect }, // 13
{ COMMON_JOKER, 4, hanging_chad_joker_effect }, // 14
{ UNCOMMON_JOKER, 8, stencil_joker_effect }, // 15
{ COMMON_JOKER, 5, banner_joker_effect }, // 16
{ COMMON_JOKER, 5, shoot_the_moon_joker_effect, }, // 17
// Spritesheet 1
{ COMMON_JOKER, 5, greedy_joker_effect }, // 18
{ COMMON_JOKER, 5, lusty_joker_effect }, // 19
// Spritesheet 2
{ COMMON_JOKER, 5, wrathful_joker_effect }, // 20
{ COMMON_JOKER, 5, gluttonous_joker_effect }, // 21
// Spritesheet 3
{ COMMON_JOKER, 4, crazy_joker_effect }, // 22
{ COMMON_JOKER, 4, mad_joker_effect }, // 23
{ COMMON_JOKER, 4, clever_joker_effect }, // 24
{ COMMON_JOKER, 4, devious_joker_effect }, // 25
{ COMMON_JOKER, 4, even_steven_joker_effect }, // 26
// Spritesheet 4
{ UNCOMMON_JOKER, 6, blackboard_joker_effect }, // 27
{ COMMON_JOKER, 5, mystic_summit_joker_effect }, // 28
{ COMMON_JOKER, 4, walkie_talkie_joker_effect }, // 29
{ COMMON_JOKER, 4, zany_joker_effect }, // 30
{ COMMON_JOKER, 4, wily_joker_effect }, // 31
// Spritesheet 5
{ COMMON_JOKER, 3, sly_joker_effect }, // 32
{ COMMON_JOKER, 3, jolly_joker_effect }, // 33
{ COMMON_JOKER, 5, blue_joker_effect }, // 34
{ COMMON_JOKER, 4, odd_todd_joker_effect }, // 35
// Spritesheet 6
{ RARE_JOKER, 8, the_duo_joker_effect }, // 36
{ RARE_JOKER, 8, the_trio_joker_effect }, // 37
{ RARE_JOKER, 8, the_order_joker_effect }, // 38
{ RARE_JOKER, 8, the_tribe_joker_effect }, // 39
// Spritesheet 7
{ RARE_JOKER, 8, the_family_joker_effect }, // 40
{ RARE_JOKER, 10, blueprint_brainstorm_joker_effect }, // 41 Brainstorm
// Spritesheet 8
{ COMMON_JOKER, 4, smiley_face_joker_effect }, // 42
{ UNCOMMON_JOKER, 6, acrobat_joker_effect }, // 43
{ UNCOMMON_JOKER, 5, dusk_joker_effect }, // 44
{ UNCOMMON_JOKER, 6, sock_and_buskin_joker_effect }, // 45
{ UNCOMMON_JOKER, 6, hack_joker_effect }, // 46
{ COMMON_JOKER, 4, hanging_chad_joker_effect }, // 47
{ UNCOMMON_JOKER, 7, joker_effect_noop, }, // 48 Four Fingers
{ COMMON_JOKER, 4, scholar_joker_effect }, // 49
{ UNCOMMON_JOKER, 8, fibonnaci_joker_effect }, // 50
{ UNCOMMON_JOKER, 6, bull_joker_effect }, // 43
// Individual Jokers (for now :3)
{ COMMON_JOKER, 5, photograph_joker_effect, }, // 44
{ UNCOMMON_JOKER, 6, hack_joker_effect }, // 45
{ UNCOMMON_JOKER, 5, joker_effect_noop }, // 46 Pareidolia
{ UNCOMMON_JOKER, 7, bootstraps_joker_effect }, // 47
{ UNCOMMON_JOKER, 7, joker_effect_noop, }, // 48 Shortcut
{ UNCOMMON_JOKER, 5, dusk_joker_effect }, // 49
{ UNCOMMON_JOKER, 7, joker_effect_noop, }, // 50 Four Fingers
{ UNCOMMON_JOKER, 6, seltzer_joker_effect, }, // 51
{ RARE_JOKER, 10, blueprint_brainstorm_joker_effect }, // 52 Blueprint
// The following jokers don't have sprites yet,
// uncomment them when their sprites are added.
#if 0
{ COMMON_JOKER, 5, shoot_the_moon_joker_effect, },
#endif
};
// clang-format on
@@ -749,7 +519,7 @@ static u32 half_joker_effect(
return effect_flags_ret;
}
static u32 joker_stencil_effect(
static u32 stencil_joker_effect(
Joker* joker,
Card* scored_card,
enum JokerEvent joker_event,
@@ -1395,10 +1165,6 @@ static u32 bootstraps_joker_effect(
return effect_flags_ret;
}
// Using GBAL_UNUSED, aka __attribute__((unused)), for jokers with no sprites yet to avoid warning
// Remove the attribute once they have sprites
// no graphics available but ready to be used if wanted when graphics available
GBAL_UNUSED
static u32 shoot_the_moon_joker_effect(
Joker* joker,
Card* scored_card,
@@ -1421,7 +1187,6 @@ static u32 shoot_the_moon_joker_effect(
return effect_flags_ret;
}
GBAL_UNUSED
static u32 photograph_joker_effect(
Joker* joker,
Card* scored_card,