15#define MISPRINT_MAX_MULT 23
17#define REGISTER_JOKER_DESC_FUNC(joker_desc_name) \
18 static int joker_desc_name(Joker* joker, Rect dest_rect);
20#define REGISTER_JOKER_EFFECT_FUNC(joker_effect_name) \
21 static u32 joker_effect_name( \
24 enum JokerEvent joker_event, \
25 JokerEffect** joker_effect \
28#define SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, restricted_event, checked_event) \
29 if (checked_event != restricted_event || scored_card == NULL) \
31 return JOKER_EFFECT_FLAG_NONE; \
33#define SCORE_ON_EVENT_ONLY(restricted_event, checked_event) \
34 if (checked_event != restricted_event) \
36 return JOKER_EFFECT_FLAG_NONE; \
43REGISTER_JOKER_DESC_FUNC(default_joker_desc)
44REGISTER_JOKER_DESC_FUNC(greedy_joker_desc)
45REGISTER_JOKER_DESC_FUNC(lusty_joker_desc)
46REGISTER_JOKER_DESC_FUNC(wrathful_joker_desc)
47REGISTER_JOKER_DESC_FUNC(gluttonous_joker_desc)
48REGISTER_JOKER_DESC_FUNC(jolly_joker_desc)
49REGISTER_JOKER_DESC_FUNC(zany_joker_desc)
50REGISTER_JOKER_DESC_FUNC(mad_joker_desc)
51REGISTER_JOKER_DESC_FUNC(crazy_joker_desc)
52REGISTER_JOKER_DESC_FUNC(droll_joker_desc)
53REGISTER_JOKER_DESC_FUNC(sly_joker_desc)
54REGISTER_JOKER_DESC_FUNC(wily_joker_desc)
55REGISTER_JOKER_DESC_FUNC(clever_joker_desc)
56REGISTER_JOKER_DESC_FUNC(devious_joker_desc)
57REGISTER_JOKER_DESC_FUNC(crafty_joker_desc)
58REGISTER_JOKER_DESC_FUNC(half_joker_desc)
59REGISTER_JOKER_DESC_FUNC(stencil_joker_desc)
60REGISTER_JOKER_DESC_FUNC(misprint_joker_desc)
61REGISTER_JOKER_DESC_FUNC(walkie_talkie_joker_desc)
62REGISTER_JOKER_DESC_FUNC(fibonnaci_joker_desc)
63REGISTER_JOKER_DESC_FUNC(banner_joker_desc)
64REGISTER_JOKER_DESC_FUNC(mystic_summit_joker_desc)
65REGISTER_JOKER_DESC_FUNC(blackboard_joker_desc)
66REGISTER_JOKER_DESC_FUNC(blue_joker_desc)
67REGISTER_JOKER_DESC_FUNC(raised_fist_joker_desc)
68REGISTER_JOKER_DESC_FUNC(reserved_parking_joker_desc)
69REGISTER_JOKER_DESC_FUNC(business_card_joker_desc)
70REGISTER_JOKER_DESC_FUNC(scholar_joker_desc)
71REGISTER_JOKER_DESC_FUNC(scary_face_joker_desc)
72REGISTER_JOKER_DESC_FUNC(abstract_joker_desc)
73REGISTER_JOKER_DESC_FUNC(bull_joker_desc)
74REGISTER_JOKER_DESC_FUNC(smiley_face_joker_desc)
75REGISTER_JOKER_DESC_FUNC(even_steven_joker_desc)
76REGISTER_JOKER_DESC_FUNC(odd_todd_joker_desc)
77REGISTER_JOKER_DESC_FUNC(acrobat_joker_desc)
78REGISTER_JOKER_DESC_FUNC(hanging_chad_joker_desc)
79REGISTER_JOKER_DESC_FUNC(the_duo_joker_desc)
80REGISTER_JOKER_DESC_FUNC(the_trio_joker_desc)
81REGISTER_JOKER_DESC_FUNC(the_family_joker_desc)
82REGISTER_JOKER_DESC_FUNC(the_order_joker_desc)
83REGISTER_JOKER_DESC_FUNC(the_tribe_joker_desc)
84REGISTER_JOKER_DESC_FUNC(bootstraps_joker_desc)
85REGISTER_JOKER_DESC_FUNC(shoot_the_moon_joker_desc)
86REGISTER_JOKER_DESC_FUNC(pareidolia_joker_desc)
87REGISTER_JOKER_DESC_FUNC(photograph_joker_desc)
88REGISTER_JOKER_DESC_FUNC(dusk_joker_desc)
89REGISTER_JOKER_DESC_FUNC(shortcut_joker_desc)
90REGISTER_JOKER_DESC_FUNC(blueprint_joker_desc)
91REGISTER_JOKER_DESC_FUNC(brainstorm_joker_desc)
92REGISTER_JOKER_DESC_FUNC(hack_joker_desc)
93REGISTER_JOKER_DESC_FUNC(four_fingers_joker_desc)
94REGISTER_JOKER_DESC_FUNC(seltzer_joker_desc)
95REGISTER_JOKER_DESC_FUNC(sock_and_buskin_joker_desc)
99static u32 sinful_joker_effect(
102 enum JokerEvent joker_event,
106REGISTER_JOKER_EFFECT_FUNC(joker_effect_noop)
107REGISTER_JOKER_EFFECT_FUNC(default_joker_effect)
108REGISTER_JOKER_EFFECT_FUNC(greedy_joker_effect)
109REGISTER_JOKER_EFFECT_FUNC(lusty_joker_effect)
110REGISTER_JOKER_EFFECT_FUNC(wrathful_joker_effect)
111REGISTER_JOKER_EFFECT_FUNC(gluttonous_joker_effect)
112REGISTER_JOKER_EFFECT_FUNC(jolly_joker_effect)
113REGISTER_JOKER_EFFECT_FUNC(zany_joker_effect)
114REGISTER_JOKER_EFFECT_FUNC(mad_joker_effect)
115REGISTER_JOKER_EFFECT_FUNC(crazy_joker_effect)
116REGISTER_JOKER_EFFECT_FUNC(droll_joker_effect)
117REGISTER_JOKER_EFFECT_FUNC(sly_joker_effect)
118REGISTER_JOKER_EFFECT_FUNC(wily_joker_effect)
119REGISTER_JOKER_EFFECT_FUNC(clever_joker_effect)
120REGISTER_JOKER_EFFECT_FUNC(devious_joker_effect)
121REGISTER_JOKER_EFFECT_FUNC(crafty_joker_effect)
122REGISTER_JOKER_EFFECT_FUNC(half_joker_effect)
123REGISTER_JOKER_EFFECT_FUNC(stencil_joker_effect)
124REGISTER_JOKER_EFFECT_FUNC(misprint_joker_effect)
125REGISTER_JOKER_EFFECT_FUNC(walkie_talkie_joker_effect)
126REGISTER_JOKER_EFFECT_FUNC(fibonnaci_joker_effect)
127REGISTER_JOKER_EFFECT_FUNC(banner_joker_effect)
128REGISTER_JOKER_EFFECT_FUNC(mystic_summit_joker_effect)
129REGISTER_JOKER_EFFECT_FUNC(blackboard_joker_effect)
130REGISTER_JOKER_EFFECT_FUNC(blue_joker_effect)
131REGISTER_JOKER_EFFECT_FUNC(raised_fist_joker_effect)
132REGISTER_JOKER_EFFECT_FUNC(reserved_parking_joker_effect)
133REGISTER_JOKER_EFFECT_FUNC(business_card_joker_effect)
134REGISTER_JOKER_EFFECT_FUNC(scholar_joker_effect)
135REGISTER_JOKER_EFFECT_FUNC(scary_face_joker_effect)
136REGISTER_JOKER_EFFECT_FUNC(abstract_joker_effect)
137REGISTER_JOKER_EFFECT_FUNC(bull_joker_effect)
138REGISTER_JOKER_EFFECT_FUNC(smiley_face_joker_effect)
139REGISTER_JOKER_EFFECT_FUNC(even_steven_joker_effect)
140REGISTER_JOKER_EFFECT_FUNC(odd_todd_joker_effect)
141REGISTER_JOKER_EFFECT_FUNC(acrobat_joker_effect)
142REGISTER_JOKER_EFFECT_FUNC(hanging_chad_joker_effect)
143REGISTER_JOKER_EFFECT_FUNC(the_duo_joker_effect)
144REGISTER_JOKER_EFFECT_FUNC(the_trio_joker_effect)
145REGISTER_JOKER_EFFECT_FUNC(the_family_joker_effect)
146REGISTER_JOKER_EFFECT_FUNC(the_order_joker_effect)
147REGISTER_JOKER_EFFECT_FUNC(the_tribe_joker_effect)
148REGISTER_JOKER_EFFECT_FUNC(bootstraps_joker_effect)
149REGISTER_JOKER_EFFECT_FUNC(shoot_the_moon_joker_effect)
150REGISTER_JOKER_EFFECT_FUNC(photograph_joker_effect)
151REGISTER_JOKER_EFFECT_FUNC(dusk_joker_effect)
152REGISTER_JOKER_EFFECT_FUNC(blueprint_brainstorm_joker_effect)
153REGISTER_JOKER_EFFECT_FUNC(hack_joker_effect)
154REGISTER_JOKER_EFFECT_FUNC(seltzer_joker_effect)
155REGISTER_JOKER_EFFECT_FUNC(sock_and_buskin_joker_effect)
176 {
"Joker", COMMON_JOKER, 2,
false, default_joker_desc, default_joker_effect },
177 {
"Abstract Joker", COMMON_JOKER, 4,
false, abstract_joker_desc, abstract_joker_effect },
178 {
"Half Joker", COMMON_JOKER, 5,
false, half_joker_desc, half_joker_effect },
179 {
"Misprint", COMMON_JOKER, 4,
true, misprint_joker_desc, misprint_joker_effect },
180 {
"Scary Face", COMMON_JOKER, 4,
false, scary_face_joker_desc, scary_face_joker_effect },
181 {
"Sock and Buskin", UNCOMMON_JOKER, 6,
false, sock_and_buskin_joker_desc, sock_and_buskin_joker_effect },
182 {
"Acrobat", UNCOMMON_JOKER, 6,
false, acrobat_joker_desc, acrobat_joker_effect },
183 {
"Fibonacci", UNCOMMON_JOKER, 8,
false, fibonnaci_joker_desc, fibonnaci_joker_effect },
184 {
"Scholar", COMMON_JOKER, 4,
false, scholar_joker_desc, scholar_joker_effect },
185 {
"Crafty Joker", COMMON_JOKER, 4,
false, crafty_joker_desc, crafty_joker_effect },
186 {
"Droll Joker", COMMON_JOKER, 4,
false, droll_joker_desc, droll_joker_effect },
187 {
"Raised Fist", COMMON_JOKER, 5,
false, raised_fist_joker_desc, raised_fist_joker_effect },
188 {
"Reserved Parking", COMMON_JOKER, 6,
false, reserved_parking_joker_desc, reserved_parking_joker_effect },
189 {
"Business Card", COMMON_JOKER, 4,
false, business_card_joker_desc, business_card_joker_effect },
190 {
"Hanging Chad", COMMON_JOKER, 4,
false, hanging_chad_joker_desc, hanging_chad_joker_effect },
191 {
"Joker Stencil", UNCOMMON_JOKER, 8,
false, stencil_joker_desc, stencil_joker_effect },
192 {
"Banner", COMMON_JOKER, 5,
false, banner_joker_desc, banner_joker_effect },
193 {
"Shoot the Moon", COMMON_JOKER, 5,
false, shoot_the_moon_joker_desc, shoot_the_moon_joker_effect, },
195 {
"Greedy Joker", COMMON_JOKER, 5,
false, greedy_joker_desc, greedy_joker_effect },
196 {
"Lusty Joker", COMMON_JOKER, 5,
false, lusty_joker_desc, lusty_joker_effect },
198 {
"Wrathful Joker", COMMON_JOKER, 5,
false, wrathful_joker_desc, wrathful_joker_effect },
199 {
"Gluttonous Joker", COMMON_JOKER, 5,
false, gluttonous_joker_desc, gluttonous_joker_effect },
201 {
"Crazy Joker", COMMON_JOKER, 4,
false, crazy_joker_desc, crazy_joker_effect },
202 {
"Mad Joker", COMMON_JOKER, 4,
false, mad_joker_desc, mad_joker_effect },
203 {
"Clever Joker", COMMON_JOKER, 4,
false, clever_joker_desc, clever_joker_effect },
204 {
"Devious Joker", COMMON_JOKER, 4,
false, devious_joker_desc, devious_joker_effect },
205 {
"Even Steven", COMMON_JOKER, 4,
false, even_steven_joker_desc, even_steven_joker_effect },
207 {
"Blackboard", UNCOMMON_JOKER, 6,
false, blackboard_joker_desc, blackboard_joker_effect },
208 {
"Mystic Summit", COMMON_JOKER, 5,
false, mystic_summit_joker_desc, mystic_summit_joker_effect },
209 {
"Walkie Talkie", COMMON_JOKER, 4,
false, walkie_talkie_joker_desc, walkie_talkie_joker_effect },
210 {
"Zany Joker", COMMON_JOKER, 4,
false, zany_joker_desc, zany_joker_effect },
211 {
"Wily Joker", COMMON_JOKER, 4,
false, wily_joker_desc, wily_joker_effect },
213 {
"Sly Joker", COMMON_JOKER, 3,
false, sly_joker_desc, sly_joker_effect },
214 {
"Jolly Joker", COMMON_JOKER, 3,
false, jolly_joker_desc, jolly_joker_effect },
215 {
"Blue Joker", COMMON_JOKER, 5,
false, blue_joker_desc, blue_joker_effect },
216 {
"Odd Todd", COMMON_JOKER, 4,
false, odd_todd_joker_desc, odd_todd_joker_effect },
218 {
"The Duo", RARE_JOKER, 8,
false, the_duo_joker_desc, the_duo_joker_effect },
219 {
"The Trio", RARE_JOKER, 8,
false, the_trio_joker_desc, the_trio_joker_effect },
220 {
"The Order", RARE_JOKER, 8,
false, the_order_joker_desc, the_order_joker_effect },
221 {
"The Tribe", RARE_JOKER, 8,
false, the_tribe_joker_desc, the_tribe_joker_effect },
223 {
"The Family", RARE_JOKER, 8,
false, the_family_joker_desc, the_family_joker_effect },
224 {
"Brainstorm", RARE_JOKER, 10,
false, brainstorm_joker_desc, blueprint_brainstorm_joker_effect },
226 {
"Smiley Face", COMMON_JOKER, 4,
false, smiley_face_joker_desc, smiley_face_joker_effect },
227 {
"Bull", UNCOMMON_JOKER, 6,
false, bull_joker_desc, bull_joker_effect },
229 {
"Photograph", COMMON_JOKER, 5,
false, photograph_joker_desc, photograph_joker_effect, },
230 {
"Hack", UNCOMMON_JOKER, 6,
false, hack_joker_desc, hack_joker_effect },
231 {
"Pareidolia", UNCOMMON_JOKER, 5,
false, pareidolia_joker_desc, joker_effect_noop },
232 {
"Bootstraps", UNCOMMON_JOKER, 7,
false, bootstraps_joker_desc, bootstraps_joker_effect },
233 {
"Shortcut", UNCOMMON_JOKER, 7,
false, shortcut_joker_desc, joker_effect_noop, },
234 {
"Dusk", UNCOMMON_JOKER, 5,
false, dusk_joker_desc, dusk_joker_effect },
235 {
"Four Fingers", UNCOMMON_JOKER, 7,
false, four_fingers_joker_desc, joker_effect_noop, },
236 {
"Seltzer", UNCOMMON_JOKER, 6,
false, seltzer_joker_desc, seltzer_joker_effect, },
237 {
"Blueprint", RARE_JOKER, 10,
false, blueprint_joker_desc, blueprint_brainstorm_joker_effect },
246static const size_t joker_registry_size =
NUM_ELEM_IN_ARR(joker_registry);
248const JokerInfo* get_joker_registry_entry(
int joker_id)
250 if (joker_id < 0 || (
size_t)joker_id >= joker_registry_size)
254 return &joker_registry[joker_id];
257size_t get_joker_registry_size(
void)
259 return joker_registry_size;
262#pragma region JOKER DESCRIPTIONS
264static int default_joker_desc(
Joker* joker, Rect dest_rect)
266 static const char desc[] = TTE_RED_TAG
"+4 " TTE_BLACK_TAG
"Mult";
270static int greedy_joker_desc(
Joker* joker, Rect dest_rect)
272 static const char desc[] =
273 TTE_BLACK_TAG
"Played cards with " TTE_DIAMOND_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
274 "+3 " TTE_BLACK_TAG
"Mult when scored";
278static int lusty_joker_desc(
Joker* joker, Rect dest_rect)
280 static const char desc[] =
281 TTE_BLACK_TAG
"Played cards with " TTE_HEART_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
282 "+3 " TTE_BLACK_TAG
"Mult when scored";
286static int wrathful_joker_desc(
Joker* joker, Rect dest_rect)
288 static const char desc[] =
289 TTE_BLACK_TAG
"Played cards with " TTE_SPADE_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
290 "+3 " TTE_BLACK_TAG
"Mult when scored";
294static int gluttonous_joker_desc(
Joker* joker, Rect dest_rect)
296 static const char desc[] =
297 TTE_BLACK_TAG
"Played cards with " TTE_CLUB_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
298 "+3 " TTE_BLACK_TAG
"Mult when scored";
302static int jolly_joker_desc(
Joker* joker, Rect dest_rect)
304 static const char desc[] =
305 TTE_RED_TAG
"+8 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Pair";
309static int zany_joker_desc(
Joker* joker, Rect dest_rect)
311 static const char desc[] = TTE_RED_TAG
312 "+12 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Three of a Kind";
316static int mad_joker_desc(
Joker* joker, Rect dest_rect)
318 static const char desc[] = TTE_RED_TAG
319 "+10 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Two Pair";
323static int crazy_joker_desc(
Joker* joker, Rect dest_rect)
325 static const char desc[] = TTE_RED_TAG
326 "+12 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Straight";
330static int droll_joker_desc(
Joker* joker, Rect dest_rect)
332 static const char desc[] =
333 TTE_RED_TAG
"+10 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Flush";
337static int sly_joker_desc(
Joker* joker, Rect dest_rect)
339 static const char desc[] =
340 TTE_BLUE_TAG
"+50 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Pair";
344static int wily_joker_desc(
Joker* joker, Rect dest_rect)
346 static const char desc[] = TTE_BLUE_TAG
347 "+100 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Three of a Kind";
351static int clever_joker_desc(
Joker* joker, Rect dest_rect)
353 static const char desc[] = TTE_BLUE_TAG
354 "+80 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Two Pair";
358static int devious_joker_desc(
Joker* joker, Rect dest_rect)
360 static const char desc[] = TTE_BLUE_TAG
361 "+100 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Straight";
365static int crafty_joker_desc(
Joker* joker, Rect dest_rect)
367 static const char desc[] =
368 TTE_BLUE_TAG
"+80 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Flush";
372static int half_joker_desc(
Joker* joker, Rect dest_rect)
374 static const char desc[] =
375 TTE_RED_TAG
"+20 " TTE_BLACK_TAG
"Mult if played hand contains " TTE_YELLOW_TAG
376 "3 " TTE_BLACK_TAG
"or fewer cards";
380static int stencil_joker_desc(
Joker* joker, Rect dest_rect)
382 static const char desc_format[] =
383 TTE_RED_TAG
"X1 " TTE_BLACK_TAG
384 "Mult for each empty Joker slot Joker Stencil included\n\n(Now " TTE_RED_TAG
385 "X%ld " TTE_BLACK_TAG
"Mult)";
386 const u32 desc_max_size = 130;
388 List* jokers = get_jokers_list();
389 u32 stencil_bonus = MAX_JOKERS_HELD_SIZE -
list_get_len(jokers);
395 if (joker_object->joker->id == STENCIL_JOKER_ID)
399 char desc[desc_max_size];
400 snprintf(desc, desc_max_size, desc_format, stencil_bonus);
405static int misprint_joker_desc(
Joker* joker, Rect dest_rect)
408 char desc[] = TTE_YELLOW_TAG
"Random" TTE_BLACK_TAG
" Mult between " TTE_RED_TAG
409 "+0" TTE_BLACK_TAG
" and " TTE_RED_TAG
"+23";
413static int walkie_talkie_joker_desc(
Joker* joker, Rect dest_rect)
415 static const char desc[] =
416 TTE_BLACK_TAG
"Each played " TTE_YELLOW_TAG
"10 " TTE_BLACK_TAG
"or " TTE_YELLOW_TAG
417 "4 " TTE_BLACK_TAG
"gives " TTE_BLUE_TAG
"+10 " TTE_BLACK_TAG
418 "Chips and " TTE_RED_TAG
"+4 " TTE_BLACK_TAG
"Mult when scored";
422static int fibonnaci_joker_desc(
Joker* joker, Rect dest_rect)
424 static const char desc[] =
425 TTE_BLACK_TAG
"Each played\n" TTE_YELLOW_TAG
"Ace" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
426 "2" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
"3" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
427 "5" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
"8\n" TTE_BLACK_TAG
"gives " TTE_RED_TAG
428 "+8 " TTE_BLACK_TAG
"Mult when scored";
433static int banner_joker_desc(
Joker* joker, Rect dest_rect)
435 static const char desc[] =
436 TTE_BLUE_TAG
"+30 " TTE_BLACK_TAG
"Chips for each remaining " TTE_YELLOW_TAG
"discard";
440static int mystic_summit_joker_desc(
Joker* joker, Rect dest_rect)
442 static const char desc[] = TTE_RED_TAG
"+15 " TTE_BLACK_TAG
"Mult when " TTE_YELLOW_TAG
443 "0 " TTE_BLACK_TAG
"discards remaining ";
447static int blackboard_joker_desc(
Joker* joker, Rect dest_rect)
449 static const char desc[] = TTE_RED_TAG
450 "X3 " TTE_BLACK_TAG
"Mult if all cards held in hand are " TTE_SPADE_TAG TTE_BLACK_TAG
455static int blue_joker_desc(
Joker* joker, Rect dest_rect)
457 static const char desc_format[] =
458 TTE_BLUE_TAG
"+2 " TTE_BLACK_TAG
"Chips for each remaining card in " TTE_YELLOW_TAG
459 "deck" TTE_BLACK_TAG
"\n\n(Now " TTE_BLUE_TAG
"+%ld" TTE_BLACK_TAG
" Chips)";
460 const u32 desc_max_size = 139;
462 u32 blue_bonus = (get_deck_top() + 1) * 2;
464 char desc[desc_max_size];
465 snprintf(desc, desc_max_size, desc_format, blue_bonus);
470static int raised_fist_joker_desc(
Joker* joker, Rect dest_rect)
472 static const char desc[] =
473 TTE_BLACK_TAG
"Adds " TTE_YELLOW_TAG
"double" TTE_BLACK_TAG
" the rank of " TTE_YELLOW_TAG
474 "lowest" TTE_BLACK_TAG
" ranked card held in hand to Mult";
478static int reserved_parking_joker_desc(
Joker* joker, Rect dest_rect)
480 static const char desc[] = TTE_BLACK_TAG
481 "Each " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" card held in hand has a " TTE_GREEN_TAG
482 "1 in 2" TTE_BLACK_TAG
" chance to give " TTE_YELLOW_TAG
"$1";
486static int business_card_joker_desc(
Joker* joker, Rect dest_rect)
488 static const char desc[] = TTE_BLACK_TAG
489 "Played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards have a " TTE_GREEN_TAG
490 "1 in 2" TTE_BLACK_TAG
" chance to give " TTE_YELLOW_TAG
"$2" TTE_BLACK_TAG
" when scored";
494static int scholar_joker_desc(
Joker* joker, Rect dest_rect)
496 static const char desc[] = TTE_BLACK_TAG
497 "Played " TTE_YELLOW_TAG
"Aces" TTE_BLACK_TAG
" give " TTE_BLUE_TAG
"+20" TTE_BLACK_TAG
498 " Chips and " TTE_RED_TAG
"+4" TTE_BLACK_TAG
" Mult when scored";
502static int scary_face_joker_desc(
Joker* joker, Rect dest_rect)
504 static const char desc[] =
505 TTE_BLACK_TAG
"Played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards give " TTE_BLUE_TAG
506 "+30" TTE_BLACK_TAG
" Chips when scored";
510static int abstract_joker_desc(
Joker* joker, Rect dest_rect)
512 static const char desc_format[] =
513 TTE_RED_TAG
"+3" TTE_BLACK_TAG
" Mult for each " TTE_YELLOW_TAG
"Joker" TTE_BLACK_TAG
514 " card\n\n(Now " TTE_RED_TAG
"+%ld" TTE_BLACK_TAG
" Mult)";
515 const u32 desc_max_size = 125;
517 u32 abstract_bonus =
list_get_len(get_jokers_list()) * 3;
519 char desc[desc_max_size];
520 snprintf(desc, desc_max_size, desc_format, abstract_bonus);
525static int bull_joker_desc(
Joker* joker, Rect dest_rect)
527 static const char desc_format[] =
528 TTE_BLUE_TAG
"+2" TTE_BLACK_TAG
" Chips for each " TTE_YELLOW_TAG
"$1" TTE_BLACK_TAG
529 " you have\n\n(Now " TTE_BLUE_TAG
"+%ld" TTE_BLACK_TAG
" Chips)";
530 const u32 desc_max_size = 127;
532 u32 bull_bonus = (g_game_vars.money > 0) ? g_game_vars.money * 2 : 0;
534 char desc[desc_max_size];
535 snprintf(desc, desc_max_size, desc_format, bull_bonus);
540static int smiley_face_joker_desc(
Joker* joker, Rect dest_rect)
542 static const char desc[] =
543 TTE_BLACK_TAG
"Played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards give " TTE_RED_TAG
544 "+5" TTE_BLACK_TAG
" Mult when scored";
548static int even_steven_joker_desc(
Joker* joker, Rect dest_rect)
550 static const char desc[] =
551 TTE_BLACK_TAG
"Played cards with " TTE_YELLOW_TAG
"even rank give " TTE_RED_TAG
552 "+4" TTE_BLACK_TAG
" Mult when scored\n(10, 8, 6, 4, 2)";
556static int odd_todd_joker_desc(
Joker* joker, Rect dest_rect)
558 static const char desc[] =
559 TTE_BLACK_TAG
"Played cards with " TTE_YELLOW_TAG
"odd rank give " TTE_BLUE_TAG
560 "+31" TTE_BLACK_TAG
" Chips when scored\n(A, 9, 7, 5, 3)";
564static int acrobat_joker_desc(
Joker* joker, Rect dest_rect)
566 static const char desc[] = TTE_RED_TAG
"X3" TTE_BLACK_TAG
" Mult on " TTE_YELLOW_TAG
567 "final hand" TTE_BLACK_TAG
" of round";
571static int hanging_chad_joker_desc(
Joker* joker, Rect dest_rect)
573 static const char desc[] = TTE_BLACK_TAG
"Retrigger " TTE_YELLOW_TAG
"first" TTE_BLACK_TAG
574 " played card used in scoring " TTE_YELLOW_TAG
575 "2" TTE_BLACK_TAG
" additional times ";
579static int the_duo_joker_desc(
Joker* joker, Rect dest_rect)
581 static const char desc[] =
582 TTE_RED_TAG
"X2" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Pair";
586static int the_trio_joker_desc(
Joker* joker, Rect dest_rect)
588 static const char desc[] = TTE_RED_TAG
589 "X3" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Three of a Kind";
593static int the_family_joker_desc(
Joker* joker, Rect dest_rect)
595 static const char desc[] = TTE_RED_TAG
596 "X4" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Four of a Kind";
600static int the_order_joker_desc(
Joker* joker, Rect dest_rect)
602 static const char desc[] =
603 TTE_RED_TAG
"X3" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Straight";
607static int the_tribe_joker_desc(
Joker* joker, Rect dest_rect)
609 static const char desc[] =
610 TTE_RED_TAG
"X2" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Flush";
614static int bootstraps_joker_desc(
Joker* joker, Rect dest_rect)
616 static const char desc_format[] =
617 TTE_RED_TAG
"+2" TTE_BLACK_TAG
" Mult for every " TTE_YELLOW_TAG
"$5" TTE_BLACK_TAG
618 " you have\n\n(Now " TTE_RED_TAG
"+%ld" TTE_BLACK_TAG
" Mult)";
619 const u32 desc_max_size = 125;
621 u32 bootstrap_bonus = (g_game_vars.money > 0) ? (g_game_vars.money / 5) * 2 : 0;
623 char desc[desc_max_size];
624 snprintf(desc, desc_max_size, desc_format, bootstrap_bonus);
629static int shoot_the_moon_joker_desc(
Joker* joker, Rect dest_rect)
631 static const char desc[] =
632 TTE_BLACK_TAG
"Each " TTE_YELLOW_TAG
"Queen" TTE_BLACK_TAG
633 " held in hand gives " TTE_RED_TAG
"+13" TTE_BLACK_TAG
" Mult";
637static int photograph_joker_desc(
Joker* joker, Rect dest_rect)
639 static const char desc[] =
640 TTE_BLACK_TAG
"First played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" card gives " TTE_RED_TAG
641 "X2" TTE_BLACK_TAG
" Mult when scored";
645static int dusk_joker_desc(
Joker* joker, Rect dest_rect)
647 static const char desc[] = TTE_BLACK_TAG
"Retrigger all played cards in " TTE_YELLOW_TAG
648 "final hand" TTE_BLACK_TAG
" of the round";
652static int brainstorm_joker_desc(
Joker* joker, Rect dest_rect)
654 static const char desc[] =
655 TTE_BLACK_TAG
"Copies ability of the leftmost " TTE_YELLOW_TAG
"Joker";
659static int blueprint_joker_desc(
Joker* joker, Rect dest_rect)
661 static const char desc[] =
662 TTE_BLACK_TAG
"Copies ability of " TTE_YELLOW_TAG
"Joker" TTE_BLACK_TAG
" to the right";
666static int hack_joker_desc(
Joker* joker, Rect dest_rect)
668 static const char desc[] = TTE_BLACK_TAG
669 "Retrigger each played " TTE_YELLOW_TAG
"2" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
670 "3" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
"4" TTE_BLACK_TAG
", or " TTE_YELLOW_TAG
"5";
674static int seltzer_joker_desc(
Joker* joker, Rect dest_rect)
676 static const char desc_format[] = TTE_BLACK_TAG
677 "Retrigger all cards played for the next " TTE_YELLOW_TAG
"%ld" TTE_BLACK_TAG
" hands";
678 const u32 desc_max_size = 94;
680 char desc[desc_max_size];
681 snprintf(desc, desc_max_size, desc_format, joker->persistent_state);
686static int sock_and_buskin_joker_desc(
Joker* joker, Rect dest_rect)
688 static const char desc[] =
689 TTE_BLACK_TAG
"Retrigger all played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards";
693static int pareidolia_joker_desc(
Joker* joker, Rect dest_rect)
695 static const char desc[] =
696 TTE_BLACK_TAG
"All cards are considered " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards";
700static int shortcut_joker_desc(
Joker* joker, Rect dest_rect)
702 static const char desc[] =
703 TTE_BLACK_TAG
"Allows " TTE_YELLOW_TAG
"Straights" TTE_BLACK_TAG
704 " to be made with gaps of " TTE_YELLOW_TAG
"1 rank" TTE_BLACK_TAG
705 "\n\n(ex: " TTE_YELLOW_TAG
"10 8 6 5 3" TTE_BLACK_TAG
")";
709static int four_fingers_joker_desc(
Joker* joker, Rect dest_rect)
711 static const char desc[] =
712 TTE_BLACK_TAG
"All " TTE_YELLOW_TAG
"Flushes" TTE_BLACK_TAG
" and " TTE_YELLOW_TAG
713 "Straights" TTE_BLACK_TAG
" can be made with 4 cards";
719#pragma region JOKER EFFECTS
721static u32 joker_effect_noop(
724 enum JokerEvent joker_event,
728 return JOKER_EFFECT_FLAG_NONE;
731static u32 default_joker_effect(
734 enum JokerEvent joker_event,
738 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
739 *joker_effect = &s_shared_joker_effect;
741 (*joker_effect)->mult = 4;
743 return JOKER_EFFECT_FLAG_MULT;
746static u32 sinful_joker_effect(
749 enum JokerEvent joker_event,
753 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
755 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
757 if (scored_card->suit == sinful_suit)
759 *joker_effect = &s_shared_joker_effect;
761 (*joker_effect)->mult = 3;
762 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
764 return effect_flags_ret;
767static u32 greedy_joker_effect(
770 enum JokerEvent joker_event,
774 return sinful_joker_effect(scored_card, DIAMONDS, joker_event, joker_effect);
777static u32 lusty_joker_effect(
780 enum JokerEvent joker_event,
784 return sinful_joker_effect(scored_card, HEARTS, joker_event, joker_effect);
787static u32 wrathful_joker_effect(
790 enum JokerEvent joker_event,
794 return sinful_joker_effect(scored_card, SPADES, joker_event, joker_effect);
797static u32 gluttonous_joker_effect(
800 enum JokerEvent joker_event,
804 return sinful_joker_effect(scored_card, CLUBS, joker_event, joker_effect);
807static u32 jolly_joker_effect(
810 enum JokerEvent joker_event,
814 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
816 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
820 *joker_effect = &s_shared_joker_effect;
822 (*joker_effect)->mult = 8;
823 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
826 return effect_flags_ret;
829static u32 zany_joker_effect(
832 enum JokerEvent joker_event,
836 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
838 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
842 *joker_effect = &s_shared_joker_effect;
844 (*joker_effect)->mult = 12;
845 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
848 return effect_flags_ret;
851static u32 mad_joker_effect(
854 enum JokerEvent joker_event,
858 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
860 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
864 *joker_effect = &s_shared_joker_effect;
866 (*joker_effect)->mult = 10;
867 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
870 return effect_flags_ret;
873static u32 crazy_joker_effect(
876 enum JokerEvent joker_event,
880 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
882 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
886 *joker_effect = &s_shared_joker_effect;
888 (*joker_effect)->mult = 12;
889 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
892 return effect_flags_ret;
895static u32 droll_joker_effect(
898 enum JokerEvent joker_event,
902 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
904 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
908 *joker_effect = &s_shared_joker_effect;
910 (*joker_effect)->mult = 10;
911 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
914 return effect_flags_ret;
917static u32 sly_joker_effect(
920 enum JokerEvent joker_event,
924 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
926 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
930 *joker_effect = &s_shared_joker_effect;
932 (*joker_effect)->chips = 50;
933 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
936 return effect_flags_ret;
939static u32 wily_joker_effect(
942 enum JokerEvent joker_event,
946 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
948 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
952 *joker_effect = &s_shared_joker_effect;
954 (*joker_effect)->chips = 100;
955 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
958 return effect_flags_ret;
961static u32 clever_joker_effect(
964 enum JokerEvent joker_event,
968 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
970 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
974 *joker_effect = &s_shared_joker_effect;
976 (*joker_effect)->chips = 80;
977 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
980 return effect_flags_ret;
983static u32 devious_joker_effect(
986 enum JokerEvent joker_event,
990 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
992 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
996 *joker_effect = &s_shared_joker_effect;
998 (*joker_effect)->chips = 100;
999 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1002 return effect_flags_ret;
1005static u32 crafty_joker_effect(
1008 enum JokerEvent joker_event,
1012 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1014 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1018 *joker_effect = &s_shared_joker_effect;
1020 (*joker_effect)->chips = 80;
1021 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1024 return effect_flags_ret;
1027static u32 half_joker_effect(
1030 enum JokerEvent joker_event,
1034 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1036 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1039 if (played_size <= 3)
1041 *joker_effect = &s_shared_joker_effect;
1043 (*joker_effect)->mult = 20;
1044 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1047 return effect_flags_ret;
1050static u32 stencil_joker_effect(
1053 enum JokerEvent joker_event,
1057 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1059 *joker_effect = &s_shared_joker_effect;
1061 List* jokers = get_jokers_list();
1066 (*joker_effect)->xmult = (MAX_JOKERS_HELD_SIZE)-num_jokers;
1074 if (joker_object->joker->id == STENCIL_JOKER_ID)
1075 (*joker_effect)->xmult++;
1078 return JOKER_EFFECT_FLAG_XMULT;
1081#define MISPRINT_MAX_MULT 23
1082static u32 misprint_joker_effect(
1085 enum JokerEvent joker_event,
1089 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1091 *joker_effect = &s_shared_joker_effect;
1093 (*joker_effect)->mult =
rng_get_u32(RNG_SEQ_JOKER_MISPRINT) % (MISPRINT_MAX_MULT + 1);
1095 return JOKER_EFFECT_FLAG_MULT;
1098static u32 walkie_talkie_joker_effect(
1101 enum JokerEvent joker_event,
1105 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1107 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1109 if (scored_card->rank == TEN || scored_card->rank == FOUR)
1111 *joker_effect = &s_shared_joker_effect;
1113 (*joker_effect)->chips = 10;
1114 (*joker_effect)->mult = 4;
1115 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS | JOKER_EFFECT_FLAG_MULT;
1118 return effect_flags_ret;
1121static u32 fibonnaci_joker_effect(
1124 enum JokerEvent joker_event,
1128 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1130 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1132 switch (scored_card->rank)
1139 *joker_effect = &s_shared_joker_effect;
1140 (*joker_effect)->mult = 8;
1141 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1147 return effect_flags_ret;
1150static u32 banner_joker_effect(
1153 enum JokerEvent joker_event,
1157 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1159 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1161 if (get_num_discards_remaining() > 0)
1163 *joker_effect = &s_shared_joker_effect;
1165 (*joker_effect)->chips = 30 * get_num_discards_remaining();
1166 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1169 return effect_flags_ret;
1172static u32 mystic_summit_joker_effect(
1175 enum JokerEvent joker_event,
1179 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1181 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1183 if (get_num_discards_remaining() == 0)
1185 *joker_effect = &s_shared_joker_effect;
1187 (*joker_effect)->mult = 15;
1188 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1191 return effect_flags_ret;
1194static u32 blackboard_joker_effect(
1197 enum JokerEvent joker_event,
1201 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1203 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1205 bool all_cards_are_spades_or_clubs =
true;
1207 for (
int i = 0; i < g_game_vars.hand_size; i++)
1209 u8 suit = hand[i]->card->suit;
1210 if (suit == HEARTS || suit == DIAMONDS)
1212 all_cards_are_spades_or_clubs =
false;
1217 if (all_cards_are_spades_or_clubs)
1219 *joker_effect = &s_shared_joker_effect;
1221 (*joker_effect)->xmult = 3;
1222 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1225 return effect_flags_ret;
1228static u32 blue_joker_effect(
1231 enum JokerEvent joker_event,
1235 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1237 *joker_effect = &s_shared_joker_effect;
1239 (*joker_effect)->chips = (get_deck_top() + 1) * 2;
1241 return JOKER_EFFECT_FLAG_CHIPS;
1244static u32 raised_fist_joker_effect(
1247 enum JokerEvent joker_event,
1251 s32* p_lowest_value_index = &(joker->scoring_state);
1253 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1255 switch (joker_event)
1259 case JOKER_EVENT_ON_HAND_PLAYED:
1262 *p_lowest_value_index = 0;
1263 u8 lowest_value = IMPOSSIBLY_HIGH_CARD_VALUE;
1265 for (
int i = 0; i < g_game_vars.hand_size; i++)
1267 u8 value = card_get_value(hand[i]->card);
1268 if (lowest_value > value)
1270 *p_lowest_value_index = i;
1271 lowest_value = value;
1276 case JOKER_EVENT_ON_CARD_HELD:
1279 *joker_effect = &s_shared_joker_effect;
1281 (*joker_effect)->mult = 2 * card_get_value(scored_card);
1282 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1290 return effect_flags_ret;
1293static u32 reserved_parking_joker_effect(
1296 enum JokerEvent joker_event,
1300 SCORE_ON_EVENT_ONLY(JOKER_EVENT_ON_CARD_HELD, joker_event)
1302 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1304 if (card_is_face(scored_card) && (
rng_get_u32(RNG_SEQ_JOKER_RESERVED_PARKING) % 2 == 0))
1306 *joker_effect = &s_shared_joker_effect;
1308 (*joker_effect)->money = 1;
1309 effect_flags_ret = JOKER_EFFECT_FLAG_MONEY;
1312 return effect_flags_ret;
1315static u32 business_card_joker_effect(
1318 enum JokerEvent joker_event,
1322 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1324 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1326 if (card_is_face(scored_card) && (
rng_get_u32(RNG_SEQ_JOKER_BUSINESS_CARD) % 2 == 0))
1328 *joker_effect = &s_shared_joker_effect;
1330 (*joker_effect)->money = 2;
1331 effect_flags_ret = JOKER_EFFECT_FLAG_MONEY;
1334 return effect_flags_ret;
1337static u32 scholar_joker_effect(
1340 enum JokerEvent joker_event,
1344 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1346 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1348 if (scored_card->rank == ACE)
1350 *joker_effect = &s_shared_joker_effect;
1352 (*joker_effect)->chips = 20;
1353 (*joker_effect)->mult = 4;
1354 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS | JOKER_EFFECT_FLAG_MULT;
1357 return effect_flags_ret;
1360static u32 scary_face_joker_effect(
1363 enum JokerEvent joker_event,
1367 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1369 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1371 if (card_is_face(scored_card))
1373 *joker_effect = &s_shared_joker_effect;
1375 (*joker_effect)->chips = 30;
1376 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1379 return effect_flags_ret;
1382static u32 abstract_joker_effect(
1385 enum JokerEvent joker_event,
1389 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1391 *joker_effect = &s_shared_joker_effect;
1396 (*joker_effect)->mult = num_jokers * 3;
1398 return JOKER_EFFECT_FLAG_MULT;
1401static u32 bull_joker_effect(
1404 enum JokerEvent joker_event,
1408 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1410 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1414 if (g_game_vars.money > 0)
1416 *joker_effect = &s_shared_joker_effect;
1418 (*joker_effect)->chips = g_game_vars.money * 2;
1419 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1422 return effect_flags_ret;
1425static u32 smiley_face_joker_effect(
1428 enum JokerEvent joker_event,
1432 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1434 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1436 if (card_is_face(scored_card))
1438 *joker_effect = &s_shared_joker_effect;
1440 (*joker_effect)->mult = 5;
1441 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1444 return effect_flags_ret;
1447static u32 even_steven_joker_effect(
1450 enum JokerEvent joker_event,
1454 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1456 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1458 switch (scored_card->rank)
1465 if (card_get_value(scored_card) % 2 == 0)
1467 *joker_effect = &s_shared_joker_effect;
1469 (*joker_effect)->mult = 4;
1470 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1475 return effect_flags_ret;
1478static u32 odd_todd_joker_effect(
1481 enum JokerEvent joker_event,
1485 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1487 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1489 if (card_get_value(scored_card) % 2 == 1)
1491 *joker_effect = &s_shared_joker_effect;
1493 (*joker_effect)->chips = 31;
1494 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1497 return effect_flags_ret;
1500static u32 acrobat_joker_effect(
1503 enum JokerEvent joker_event,
1507 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1509 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1512 if (get_num_hands_remaining() == 0)
1514 *joker_effect = &s_shared_joker_effect;
1516 (*joker_effect)->xmult = 3;
1517 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1520 return effect_flags_ret;
1523static u32 hanging_chad_joker_effect(
1526 enum JokerEvent joker_event,
1530 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1531 s32* p_remaining_retriggers = &(joker->scoring_state);
1533 switch (joker_event)
1535 case JOKER_EVENT_ON_HAND_PLAYED:
1536 *p_remaining_retriggers = 2;
1542 case JOKER_EVENT_ON_CARD_SCORED_END:
1543 *joker_effect = &s_shared_joker_effect;
1545 (*joker_effect)->retrigger = (*p_remaining_retriggers > 0);
1546 if ((*joker_effect)->retrigger)
1548 *p_remaining_retriggers -= 1;
1549 (*joker_effect)->message =
"Again!";
1550 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1558 return effect_flags_ret;
1561static u32 the_duo_joker_effect(
1564 enum JokerEvent joker_event,
1568 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1570 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1574 *joker_effect = &s_shared_joker_effect;
1576 (*joker_effect)->xmult = 2;
1577 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1580 return effect_flags_ret;
1583static u32 the_trio_joker_effect(
1586 enum JokerEvent joker_event,
1590 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1592 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1596 *joker_effect = &s_shared_joker_effect;
1598 (*joker_effect)->xmult = 3;
1599 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1602 return effect_flags_ret;
1605static u32 the_family_joker_effect(
1608 enum JokerEvent joker_event,
1612 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1614 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1618 *joker_effect = &s_shared_joker_effect;
1620 (*joker_effect)->xmult = 4;
1621 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1624 return effect_flags_ret;
1627static u32 the_order_joker_effect(
1630 enum JokerEvent joker_event,
1634 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1636 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1640 *joker_effect = &s_shared_joker_effect;
1642 (*joker_effect)->xmult = 3;
1643 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1646 return effect_flags_ret;
1649static u32 the_tribe_joker_effect(
1652 enum JokerEvent joker_event,
1656 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1658 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1662 *joker_effect = &s_shared_joker_effect;
1664 (*joker_effect)->xmult = 2;
1665 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1668 return effect_flags_ret;
1671static u32 bootstraps_joker_effect(
1674 enum JokerEvent joker_event,
1678 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1680 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1683 if (g_game_vars.money > 0)
1685 *joker_effect = &s_shared_joker_effect;
1687 (*joker_effect)->mult = (g_game_vars.money / 5) * 2;
1688 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1691 return effect_flags_ret;
1694static u32 shoot_the_moon_joker_effect(
1697 enum JokerEvent joker_event,
1701 SCORE_ON_EVENT_ONLY(JOKER_EVENT_ON_CARD_HELD, joker_event)
1703 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1705 if (scored_card->rank == QUEEN)
1707 *joker_effect = &s_shared_joker_effect;
1709 (*joker_effect)->mult = 13;
1710 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1713 return effect_flags_ret;
1716static u32 photograph_joker_effect(
1719 enum JokerEvent joker_event,
1723 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1725 s32* p_first_face_index = &(joker->scoring_state);
1727 switch (joker_event)
1729 case JOKER_EVENT_ON_HAND_PLAYED:
1730 *p_first_face_index = UNDEFINED;
1733 case JOKER_EVENT_ON_CARD_SCORED:
1736 if (*p_first_face_index == UNDEFINED && card_is_face(scored_card))
1745 *joker_effect = &s_shared_joker_effect;
1747 (*joker_effect)->xmult = 2;
1748 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1755 return effect_flags_ret;
1758static u32 dusk_joker_effect(
1761 enum JokerEvent joker_event,
1765 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1767 s32* p_last_retriggered_index = &(joker->scoring_state);
1769 switch (joker_event)
1771 case JOKER_EVENT_ON_HAND_PLAYED:
1773 *p_last_retriggered_index = UNDEFINED;
1776 case JOKER_EVENT_ON_CARD_SCORED_END:
1778 if (get_num_hands_remaining() == 0)
1780 *joker_effect = &s_shared_joker_effect;
1783 if ((*joker_effect)->retrigger)
1786 (*joker_effect)->message =
"Again!";
1787 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1797 return effect_flags_ret;
1800static u32 blueprint_brainstorm_joker_effect(
1803 enum JokerEvent joker_event,
1807 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1811 if (joker_event == JOKER_EVENT_ON_JOKER_CREATED ||
1812 joker_event == JOKER_EVENT_ON_HAND_SCORED_END || joker_event == JOKER_EVENT_ON_ROUND_END)
1814 return effect_flags_ret;
1818 List* jokers = get_jokers_list();
1823 if (copied_joker_object->joker == joker)
1831 if (copied_joker_object == NULL)
1833 return effect_flags_ret;
1839 u8 brainstorm_counter = 0;
1842 switch (copied_joker_object->joker->id)
1845 case BLUEPRINT_JOKER_ID:
1850 case BRAINSTORM_JOKER_ID:
1851 brainstorm_counter++;
1860 u8 copied_joker_id = copied_joker_object->joker->id;
1861 const JokerInfo* copied_joker_info = get_joker_registry_entry(copied_joker_id);
1864 joker->persistent_state = copied_joker_object->joker->persistent_state;
1870 ->joker_effect_func(joker, scored_card, joker_event, joker_effect);
1873 effect_flags_ret &= ~JOKER_EFFECT_FLAG_EXPIRE;
1876 copied_joker_object = NULL;
1880 }
while (copied_joker_object != NULL && brainstorm_counter < 2);
1882 return effect_flags_ret;
1885static u32 hack_joker_effect(
1888 enum JokerEvent joker_event,
1892 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1894 s32* p_last_retriggered_index = &(joker->scoring_state);
1896 switch (joker_event)
1898 case JOKER_EVENT_ON_HAND_PLAYED:
1899 *p_last_retriggered_index = UNDEFINED;
1902 case JOKER_EVENT_ON_CARD_SCORED_END:
1904 switch (scored_card->rank)
1910 *joker_effect = &s_shared_joker_effect;
1912 (*joker_effect)->retrigger =
1914 if ((*joker_effect)->retrigger)
1917 (*joker_effect)->message =
"Again!";
1918 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1928 return effect_flags_ret;
1931static u32 seltzer_joker_effect(
1934 enum JokerEvent joker_event,
1938 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1940 s32* p_last_retriggered_idx = &(joker->scoring_state);
1941 s32* p_hands_left_until_exp = &(joker->persistent_state);
1943 switch (joker_event)
1945 case JOKER_EVENT_ON_JOKER_CREATED:
1946 *p_hands_left_until_exp = 10;
1949 case JOKER_EVENT_ON_HAND_PLAYED:
1950 *p_last_retriggered_idx = UNDEFINED;
1953 case JOKER_EVENT_ON_CARD_SCORED_END:
1957 *joker_effect = &s_shared_joker_effect;
1960 if ((*joker_effect)->retrigger)
1963 (*joker_effect)->message =
"Again!";
1964 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1968 case JOKER_EVENT_ON_HAND_SCORED_END:
1969 *joker_effect = &s_shared_joker_effect;
1970 effect_flags_ret = JOKER_EFFECT_FLAG_MESSAGE;
1972 (*p_hands_left_until_exp)--;
1973 if (*p_hands_left_until_exp > 0)
1977 static const char* SELTZER_MESSAGES[] =
1978 {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"};
1979 (*joker_effect)->message = (
char*)SELTZER_MESSAGES[(*p_hands_left_until_exp) - 1];
1983 (*joker_effect)->message =
"Drank!";
1984 (*joker_effect)->expire =
true;
1985 effect_flags_ret |= JOKER_EFFECT_FLAG_EXPIRE;
1993 return effect_flags_ret;
1996static u32 sock_and_buskin_joker_effect(
1999 enum JokerEvent joker_event,
2003 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
2005 s32* p_last_retriggered_face_index = &(joker->scoring_state);
2007 switch (joker_event)
2009 case JOKER_EVENT_ON_HAND_PLAYED:
2010 *p_last_retriggered_face_index = UNDEFINED;
2013 case JOKER_EVENT_ON_CARD_SCORED_END:
2014 *joker_effect = &s_shared_joker_effect;
2017 (*joker_effect)->retrigger =
2019 card_is_face(scored_card));
2020 if ((*joker_effect)->retrigger)
2023 (*joker_effect)->message =
"Again!";
2024 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
2032 return effect_flags_ret;
Game global game variables struct definition.
int tte_printf_justified_in_rect(const char *raw_text, Rect dst_rect, enum TextJustifyFlag justify_direction, enum ScreenHorzDir bias_direction, bool do_print)
Justify a text with custom formatting tags according to the given justification and bias direction ta...
Functions relative to manipulating and analyzing the contents of the Hand, a.k.a. the Cards we hold a...
ContainedHandTypes * get_contained_hands(void)
Get the contained hands within the selected hand.
CardObject ** get_hand_array(void)
Get the hand array of Cards currently held in hand.
Functions relative to the handling of Jokers.
int list_get_len(const List *list)
void * list_itr_next(ListItr *itr)
ListItr list_itr_create(List *list)
Common functions to handle RNG manipulation. Using this interface has three goals:
u32 rng_get_u32(enum RngSequence key)
Get the next "randomly" generated number in the sequence corresponding to the given type.
API relative to the Rounds we play.
int get_scored_card_index(void)
Get the index of the card that is currently being scored.
int get_played_size(void)
Get the number of cards played.
Utilities relating around number string representation and protected arithmatic helper functions.
#define NUM_ELEM_IN_ARR(arr)
Get the number of elements in an array.