Weight jokers by rarity in the shop (#152)

* Added weight for the rarity of jokers in the shop

* Includes manual conflict resolution

---------

Co-authored-by: JustinL-12 <jlong30@uic.edu>
Co-authored-by: MeirGavish <meir.gavish@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
JustinL-12
2025-10-27 10:18:48 -07:00
committed by GitHub
parent 5a3e891e43
commit b38433d191
3 changed files with 71 additions and 4 deletions
+9
View File
@@ -35,6 +35,14 @@
#define RARE_JOKER 2
#define LEGENDARY_JOKER 3
// Percent chance to get a joker of each rarity
// Note that this deviates slightly from the Balatro wiki to allow legendary
// jokers to appear without spectral cards implemented
#define COMMON_JOKER_CHANCE 70
#define UNCOMMON_JOKER_CHANCE 25
#define RARE_JOKER_CHANCE 5
#define LEGENDARY_JOKER_CHANCE 0
#define MAX_JOKER_OBJECTS 32 // The maximum number of joker objects that can be created at once
#define DEFAULT_JOKER_ID 0
@@ -96,5 +104,6 @@ void joker_object_set_selected(JokerObject* joker_object, bool selected);
bool joker_object_is_selected(JokerObject* joker_object);
Sprite* joker_object_get_sprite(JokerObject* joker_object);
int joker_get_random_rarity();
#endif // JOKER_H
+38 -4
View File
@@ -2476,6 +2476,42 @@ void erase_price_under_sprite_object(SpriteObject *sprite_object)
tte_erase_rect_wrapper(price_rect);
}
static int game_shop_get_random_joker_idx()
{
// Roll for what rarity the joker will be
int joker_rarity = joker_get_random_rarity();
// Now determine how many jokers are available based on the rarity
int jokers_avail_size = list_get_size(jokers_available_to_shop);
int matching_indices[jokers_avail_size];
int match_count = 0;
for (int i = 0; i < jokers_avail_size; i++)
{
intptr_t joker_id = int_list_get(jokers_available_to_shop, i);
const JokerInfo *info = get_joker_registry_entry(joker_id);
if (info->rarity == joker_rarity)
{
matching_indices[match_count] = i;
match_count++;
}
}
int selected_joker_idx = 0;
if (match_count > 0)
{
// If we counted at least one joker with matching rarity, pick one of them randomly
selected_joker_idx = matching_indices[random() % match_count];
}
else
{
// Didn't find any jokers of matching rarity, just pick one at random instead
selected_joker_idx = random() % jokers_avail_size;
}
return selected_joker_idx;
}
static void game_shop_create_items()
{
tte_erase_rect_wrapper(SHOP_PRICES_TEXT_RECT);
@@ -2489,7 +2525,6 @@ static void game_shop_create_items()
for (int i = 0; i < MAX_SHOP_JOKERS; i++)
{
int joker_idx = 0;
intptr_t joker_id = 0;
#ifdef TEST_JOKER_ID0 // Allow defining an ID for a joker to always appear in shop and be tested
if (int_list_exists(jokers_available_to_shop, TEST_JOKER_ID0))
@@ -2508,9 +2543,8 @@ static void game_shop_create_items()
else
#endif
{
joker_idx = random() % list_get_size(jokers_available_to_shop);
joker_id = int_list_get(jokers_available_to_shop, joker_idx);
// TODO: weight the random choice by joker rarity
int joker_idx = game_shop_get_random_joker_idx();
joker_id = int_list_get(jokers_available_to_shop, joker_idx);
list_remove_by_idx(jokers_available_to_shop, joker_idx);
}
+24
View File
@@ -332,3 +332,27 @@ Sprite* joker_object_get_sprite(JokerObject* joker_object)
return NULL;
return sprite_object_get_sprite(joker_object->sprite_object);
}
int joker_get_random_rarity()
{
int joker_rarity = 0;
int rarity_roll = random() % 100;
if (rarity_roll < COMMON_JOKER_CHANCE)
{
joker_rarity = COMMON_JOKER;
}
else if (rarity_roll < COMMON_JOKER_CHANCE + UNCOMMON_JOKER_CHANCE)
{
joker_rarity = UNCOMMON_JOKER;
}
else if (rarity_roll < COMMON_JOKER_CHANCE + UNCOMMON_JOKER_CHANCE + RARE_JOKER_CHANCE)
{
joker_rarity = RARE_JOKER;
}
else if (rarity_roll < COMMON_JOKER_CHANCE + UNCOMMON_JOKER_CHANCE + RARE_JOKER_CHANCE + LEGENDARY_JOKER_CHANCE)
{
joker_rarity = LEGENDARY_JOKER;
}
return joker_rarity;
}