Merge remote-tracking branch 'upstream/main'

And add NULL Acrobat Joker effect
This commit is contained in:
MonteCrysto
2025-10-07 20:18:41 +02:00
7 changed files with 232 additions and 15 deletions
+15 -2
View File
@@ -878,8 +878,21 @@ void card_draw()
void hand_set_focus(int index)
{
if (index < 0 || index > hand_top || hand_state != HAND_SELECT) return;
selection_x = index;
if (hand_state != HAND_SELECT) return;
// Wrap around to the other side of the hand when going out of bounds on either side
if (index < 0)
{
selection_x = hand_top;
}
else if (index > hand_top)
{
selection_x = 0;
}
else
{
selection_x = index;
}
play_sfx(SFX_CARD_FOCUS, MM_BASE_PITCH_RATE + rand() % 512);
}
+1 -1
View File
@@ -157,7 +157,7 @@ void joker_destroy(Joker **joker)
JokerEffect joker_get_score_effect(Joker *joker, Card *scored_card)
{
const JokerInfo *jinfo = get_joker_registry_entry(joker->id);
if (!jinfo) return (JokerEffect){0};
if (!jinfo || jinfo->effect == NULL) return (JokerEffect){0};
return jinfo->effect(joker, scored_card);
}
+143 -1
View File
@@ -464,6 +464,140 @@ static JokerEffect acrobat_joker_effect(Joker *joker, Card *scored_card) {
return effect;
}
__attribute__((unused))
static JokerEffect the_duo_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card != NULL)
return effect; // if card != null, we are not at the end-phase of scoring yet
// This is really inefficient but the only way at the moment to check for whole-hand conditions
u8 suits[NUM_SUITS];
u8 ranks[NUM_RANKS];
get_played_distribution(ranks, suits);
if (hand_contains_n_of_a_kind(ranks) >= 2)
effect.xmult = 2;
return effect;
}
// graphics available from @MathisMartin31
__attribute__((unused))
static JokerEffect the_trio_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card != NULL)
return effect; // if card != null, we are not at the end-phase of scoring yet
// This is really inefficient but the only way at the moment to check for whole-hand conditions
u8 suits[NUM_SUITS];
u8 ranks[NUM_RANKS];
get_played_distribution(ranks, suits);
if (hand_contains_n_of_a_kind(ranks) >= 3)
effect.xmult = 3;
return effect;
}
// graphics available from @MathisMartin31
__attribute__((unused))
static JokerEffect the_family_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card != NULL)
return effect; // if card != null, we are not at the end-phase of scoring yet
// This is really inefficient but the only way at the moment to check for whole-hand conditions
u8 suits[NUM_SUITS];
u8 ranks[NUM_RANKS];
get_played_distribution(ranks, suits);
if (hand_contains_n_of_a_kind(ranks) >= 4)
effect.xmult = 4;
return effect;
}
// graphics available from @MathisMartin31
__attribute__((unused))
static JokerEffect the_order_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card != NULL)
return effect; // if card != null, we are not at the end-phase of scoring yet
u8 suits[NUM_SUITS];
u8 ranks[NUM_RANKS];
get_played_distribution(ranks, suits);
if (hand_contains_straight(ranks))
effect.xmult = 3;
return effect;
}
// graphics available from @MathisMartin31
__attribute__((unused))
static JokerEffect the_tribe_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card != NULL)
return effect; // if card != null, we are not at the end-phase of scoring yet
u8 suits[NUM_SUITS];
u8 ranks[NUM_RANKS];
get_played_distribution(ranks, suits);
if (hand_contains_flush(suits))
effect.xmult = 2;
return effect;
}
// graphics available from @MathisMartin31
__attribute__((unused))
static JokerEffect bootstraps_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card != NULL)
return effect; // if card != null, we are not at the end-phase of scoring yet
effect.mult = (get_money() / 5) * 2;
return effect;
}
// no graphics available but ready to be used if wanted when graphics available
__attribute__((unused))
static JokerEffect shoot_the_moon_joker_effect(Joker *joker, Card *scored_card) {
JokerEffect effect = {0};
if (scored_card != NULL)
return effect; // if card != null, we are not at the end-phase of scoring yet
CardObject** hand = get_hand_array();
int hand_size = hand_get_size();
for (int i = 0; i < hand_size; i++ )
{
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;
}
/* 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.
@@ -508,13 +642,21 @@ 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},
{ UNCOMMON_JOKER, 6, acrobat_joker_effect },
{ RARE_JOKER, 8, the_duo_joker_effect},
{ RARE_JOKER, 8, the_trio_joker_effect},
{ RARE_JOKER, 8, the_family_joker_effect},
{ RARE_JOKER, 8, the_order_joker_effect},
{ RARE_JOKER, 8, the_tribe_joker_effect},
{ UNCOMMON_JOKER, 7, bootstraps_joker_effect},
{ COMMON_JOKER, 5, shoot_the_moon_joker_effect},
#endif
};
+10
View File
@@ -0,0 +1,10 @@
#ifndef GIT_HASH
#define GIT_HASH "undef"
#endif
#ifndef GIT_DIRTY
#define GIT_DIRTY "-dirty"
#endif
__attribute__((section(".version"), used))
const char balatro_version[] = "GBALATRO_VERSION:" GIT_HASH GIT_DIRTY;