Merge pull request #64 from theturtlemafia/ttm/joker-struct-refactor

Refactor jokers to use struct and function pointer for joker effects and added Lusty, Wrathful, and Gluttonous jokers
This commit is contained in:
MeirGavish
2025-07-29 00:56:04 +03:00
committed by GitHub
5 changed files with 75 additions and 31 deletions
+1 -1
View File
@@ -1830,7 +1830,7 @@ static void game_shop_create_items(JokerObject *shop_jokers[], bool first_time)
joker_object_destroy(&shop_jokers[i]); // Destroy the joker object if it exists
}
u8 joker_id = random() % MAX_JOKERS;
u8 joker_id = random() % get_joker_registry_size();
shop_jokers[i] = joker_object_new(joker_new(joker_id));
shop_jokers[i]->sprite_object->x = int2fx(120 + i * 32);
+10 -29
View File
@@ -12,13 +12,6 @@
#define JOKER_SCORE_TEXT_Y 48
const static u8 joker_data_lut[MAX_JOKERS][2] = // Rarity, Value
{
// TODO: Change to struct
{COMMON_JOKER, 2}, // Default Joker
{COMMON_JOKER, 5}, // Greedy Joker
};
const static u8 edition_price_lut[MAX_EDITIONS] =
{
0, // BASE_EDITION
@@ -45,12 +38,15 @@ void joker_init()
Joker *joker_new(u8 id)
{
Joker *joker = malloc(sizeof(Joker));
if (id >= get_joker_registry_size()) return NULL;
joker->id = id; // TODO: Make this random later
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->value = joker_data_lut[id][1] + edition_price_lut[joker->modifier]; // Base value + edition price
joker->rarity = joker_data_lut[id][0];
joker->value = jinfo->base_value + edition_price_lut[joker->modifier]; // Base value + edition price
joker->rarity = jinfo->rarity;
joker->processed = false;
return joker;
@@ -65,25 +61,10 @@ void joker_destroy(Joker **joker)
JokerEffect joker_get_score_effect(Joker *joker, Card *scored_card)
{
JokerEffect effect = {0};
const JokerInfo *jinfo = get_joker_registry_entry(joker->id);
if (!jinfo) return (JokerEffect){0};
switch (joker->id)
{
case DEFAULT_JOKER_ID: // Default Joker
if (scored_card != NULL) break; // Joker is independent, no effect
effect.mult = 4;
break;
case GREEDY_JOKER_ID: // Greedy Joker
if (scored_card != NULL && scored_card->suit == DIAMONDS) // If the scored card is a diamond
{
effect.mult = 3;
}
break;
default:
break;
}
return effect;
return jinfo->effect(joker, scored_card);
}
// JokerObject methods
+53
View File
@@ -0,0 +1,53 @@
#include "joker.h"
#include "util.h"
static JokerEffect default_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card == NULL) effect.mult = 4;
return effect;
}
static JokerEffect sinful_joker_effect(Card *scored_card, u8 sinful_suit) {
JokerEffect effect = {0};
if (scored_card != NULL && scored_card->suit == sinful_suit)
effect.mult = 3;
return effect;
}
static JokerEffect greedy_joker_effect(Joker *joker, Card *scored_card) {
return sinful_joker_effect(scored_card, DIAMONDS);
}
static JokerEffect lusty_joker_effect(Joker *joker, Card *scored_card) {
return sinful_joker_effect(scored_card, HEARTS);
}
static JokerEffect wrathful_joker_effect(Joker *joker, Card *scored_card) {
return sinful_joker_effect(scored_card, SPADES);
}
static JokerEffect gluttonous_joker_effect(Joker *joker, Card *scored_card) {
return sinful_joker_effect(scored_card, CLUBS);
}
const JokerInfo joker_registry[] = {
{ 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...
{ COMMON_JOKER, 5, wrathful_joker_effect },
{ COMMON_JOKER, 5, gluttonous_joker_effect },
};
static const size_t joker_registry_size = NUM_ELEM_IN_ARR(joker_registry);
const JokerInfo* get_joker_registry_entry(int joker_id) {
if (joker_id < 0 || (size_t)joker_id >= joker_registry_size) {
return NULL;
}
return &joker_registry[joker_id];
}
size_t get_joker_registry_size(void) {
return joker_registry_size;
}