15#define MISPRINT_MAX_MULT 23
17#define DECLARE_JOKER_DESC_FUNC(joker_desc_name) \
18 static int joker_desc_name(Joker* joker, Rect dest_rect);
20#define DECLARE_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; \
43DECLARE_JOKER_DESC_FUNC(default_joker_desc)
44DECLARE_JOKER_DESC_FUNC(greedy_joker_desc)
45DECLARE_JOKER_DESC_FUNC(lusty_joker_desc)
46DECLARE_JOKER_DESC_FUNC(wrathful_joker_desc)
47DECLARE_JOKER_DESC_FUNC(gluttonous_joker_desc)
48DECLARE_JOKER_DESC_FUNC(jolly_joker_desc)
49DECLARE_JOKER_DESC_FUNC(zany_joker_desc)
50DECLARE_JOKER_DESC_FUNC(mad_joker_desc)
51DECLARE_JOKER_DESC_FUNC(crazy_joker_desc)
52DECLARE_JOKER_DESC_FUNC(droll_joker_desc)
53DECLARE_JOKER_DESC_FUNC(sly_joker_desc)
54DECLARE_JOKER_DESC_FUNC(wily_joker_desc)
55DECLARE_JOKER_DESC_FUNC(clever_joker_desc)
56DECLARE_JOKER_DESC_FUNC(devious_joker_desc)
57DECLARE_JOKER_DESC_FUNC(crafty_joker_desc)
58DECLARE_JOKER_DESC_FUNC(half_joker_desc)
59DECLARE_JOKER_DESC_FUNC(stencil_joker_desc)
60DECLARE_JOKER_DESC_FUNC(misprint_joker_desc)
61DECLARE_JOKER_DESC_FUNC(walkie_talkie_joker_desc)
62DECLARE_JOKER_DESC_FUNC(fibonnaci_joker_desc)
63DECLARE_JOKER_DESC_FUNC(banner_joker_desc)
64DECLARE_JOKER_DESC_FUNC(mystic_summit_joker_desc)
65DECLARE_JOKER_DESC_FUNC(blackboard_joker_desc)
66DECLARE_JOKER_DESC_FUNC(blue_joker_desc)
67DECLARE_JOKER_DESC_FUNC(raised_fist_joker_desc)
68DECLARE_JOKER_DESC_FUNC(reserved_parking_joker_desc)
69DECLARE_JOKER_DESC_FUNC(business_card_joker_desc)
70DECLARE_JOKER_DESC_FUNC(scholar_joker_desc)
71DECLARE_JOKER_DESC_FUNC(scary_face_joker_desc)
72DECLARE_JOKER_DESC_FUNC(abstract_joker_desc)
73DECLARE_JOKER_DESC_FUNC(bull_joker_desc)
74DECLARE_JOKER_DESC_FUNC(smiley_face_joker_desc)
75DECLARE_JOKER_DESC_FUNC(even_steven_joker_desc)
76DECLARE_JOKER_DESC_FUNC(odd_todd_joker_desc)
77DECLARE_JOKER_DESC_FUNC(acrobat_joker_desc)
78DECLARE_JOKER_DESC_FUNC(hanging_chad_joker_desc)
79DECLARE_JOKER_DESC_FUNC(the_duo_joker_desc)
80DECLARE_JOKER_DESC_FUNC(the_trio_joker_desc)
81DECLARE_JOKER_DESC_FUNC(the_family_joker_desc)
82DECLARE_JOKER_DESC_FUNC(the_order_joker_desc)
83DECLARE_JOKER_DESC_FUNC(the_tribe_joker_desc)
84DECLARE_JOKER_DESC_FUNC(bootstraps_joker_desc)
85DECLARE_JOKER_DESC_FUNC(shoot_the_moon_joker_desc)
86DECLARE_JOKER_DESC_FUNC(pareidolia_joker_desc)
87DECLARE_JOKER_DESC_FUNC(photograph_joker_desc)
88DECLARE_JOKER_DESC_FUNC(dusk_joker_desc)
89DECLARE_JOKER_DESC_FUNC(shortcut_joker_desc)
90DECLARE_JOKER_DESC_FUNC(blueprint_joker_desc)
91DECLARE_JOKER_DESC_FUNC(brainstorm_joker_desc)
92DECLARE_JOKER_DESC_FUNC(hack_joker_desc)
93DECLARE_JOKER_DESC_FUNC(four_fingers_joker_desc)
94DECLARE_JOKER_DESC_FUNC(seltzer_joker_desc)
95DECLARE_JOKER_DESC_FUNC(sock_and_buskin_joker_desc)
99static u32 sinful_joker_effect(
102 enum JokerEvent joker_event,
106DECLARE_JOKER_EFFECT_FUNC(joker_effect_noop)
107DECLARE_JOKER_EFFECT_FUNC(default_joker_effect)
108DECLARE_JOKER_EFFECT_FUNC(greedy_joker_effect)
109DECLARE_JOKER_EFFECT_FUNC(lusty_joker_effect)
110DECLARE_JOKER_EFFECT_FUNC(wrathful_joker_effect)
111DECLARE_JOKER_EFFECT_FUNC(gluttonous_joker_effect)
112DECLARE_JOKER_EFFECT_FUNC(jolly_joker_effect)
113DECLARE_JOKER_EFFECT_FUNC(zany_joker_effect)
114DECLARE_JOKER_EFFECT_FUNC(mad_joker_effect)
115DECLARE_JOKER_EFFECT_FUNC(crazy_joker_effect)
116DECLARE_JOKER_EFFECT_FUNC(droll_joker_effect)
117DECLARE_JOKER_EFFECT_FUNC(sly_joker_effect)
118DECLARE_JOKER_EFFECT_FUNC(wily_joker_effect)
119DECLARE_JOKER_EFFECT_FUNC(clever_joker_effect)
120DECLARE_JOKER_EFFECT_FUNC(devious_joker_effect)
121DECLARE_JOKER_EFFECT_FUNC(crafty_joker_effect)
122DECLARE_JOKER_EFFECT_FUNC(half_joker_effect)
123DECLARE_JOKER_EFFECT_FUNC(stencil_joker_effect)
124DECLARE_JOKER_EFFECT_FUNC(misprint_joker_effect)
125DECLARE_JOKER_EFFECT_FUNC(walkie_talkie_joker_effect)
126DECLARE_JOKER_EFFECT_FUNC(fibonnaci_joker_effect)
127DECLARE_JOKER_EFFECT_FUNC(banner_joker_effect)
128DECLARE_JOKER_EFFECT_FUNC(mystic_summit_joker_effect)
129DECLARE_JOKER_EFFECT_FUNC(blackboard_joker_effect)
130DECLARE_JOKER_EFFECT_FUNC(blue_joker_effect)
131DECLARE_JOKER_EFFECT_FUNC(raised_fist_joker_effect)
132DECLARE_JOKER_EFFECT_FUNC(reserved_parking_joker_effect)
133DECLARE_JOKER_EFFECT_FUNC(business_card_joker_effect)
134DECLARE_JOKER_EFFECT_FUNC(scholar_joker_effect)
135DECLARE_JOKER_EFFECT_FUNC(scary_face_joker_effect)
136DECLARE_JOKER_EFFECT_FUNC(abstract_joker_effect)
137DECLARE_JOKER_EFFECT_FUNC(bull_joker_effect)
138DECLARE_JOKER_EFFECT_FUNC(smiley_face_joker_effect)
139DECLARE_JOKER_EFFECT_FUNC(even_steven_joker_effect)
140DECLARE_JOKER_EFFECT_FUNC(odd_todd_joker_effect)
141DECLARE_JOKER_EFFECT_FUNC(acrobat_joker_effect)
142DECLARE_JOKER_EFFECT_FUNC(hanging_chad_joker_effect)
143DECLARE_JOKER_EFFECT_FUNC(the_duo_joker_effect)
144DECLARE_JOKER_EFFECT_FUNC(the_trio_joker_effect)
145DECLARE_JOKER_EFFECT_FUNC(the_family_joker_effect)
146DECLARE_JOKER_EFFECT_FUNC(the_order_joker_effect)
147DECLARE_JOKER_EFFECT_FUNC(the_tribe_joker_effect)
148DECLARE_JOKER_EFFECT_FUNC(bootstraps_joker_effect)
149DECLARE_JOKER_EFFECT_FUNC(shoot_the_moon_joker_effect)
150DECLARE_JOKER_EFFECT_FUNC(photograph_joker_effect)
151DECLARE_JOKER_EFFECT_FUNC(dusk_joker_effect)
152DECLARE_JOKER_EFFECT_FUNC(blueprint_brainstorm_joker_effect)
153DECLARE_JOKER_EFFECT_FUNC(hack_joker_effect)
154DECLARE_JOKER_EFFECT_FUNC(seltzer_joker_effect)
155DECLARE_JOKER_EFFECT_FUNC(sock_and_buskin_joker_effect)
175 {
"Joker", COMMON_JOKER, 2,
false, default_joker_desc, default_joker_effect },
176 {
"Abstract Joker", COMMON_JOKER, 4,
false, abstract_joker_desc, abstract_joker_effect },
177 {
"Half Joker", COMMON_JOKER, 5,
false, half_joker_desc, half_joker_effect },
178 {
"Misprint", COMMON_JOKER, 4,
true, misprint_joker_desc, misprint_joker_effect },
179 {
"Scary Face", COMMON_JOKER, 4,
false, scary_face_joker_desc, scary_face_joker_effect },
180 {
"Sock and Buskin", UNCOMMON_JOKER, 6,
false, sock_and_buskin_joker_desc, sock_and_buskin_joker_effect },
181 {
"Acrobat", UNCOMMON_JOKER, 6,
false, acrobat_joker_desc, acrobat_joker_effect },
182 {
"Fibonacci", UNCOMMON_JOKER, 8,
false, fibonnaci_joker_desc, fibonnaci_joker_effect },
183 {
"Scholar", COMMON_JOKER, 4,
false, scholar_joker_desc, scholar_joker_effect },
184 {
"Crafty Joker", COMMON_JOKER, 4,
false, crafty_joker_desc, crafty_joker_effect },
185 {
"Droll Joker", COMMON_JOKER, 4,
false, droll_joker_desc, droll_joker_effect },
186 {
"Raised Fist", COMMON_JOKER, 5,
false, raised_fist_joker_desc, raised_fist_joker_effect },
187 {
"Reserved Parking", COMMON_JOKER, 6,
false, reserved_parking_joker_desc, reserved_parking_joker_effect },
188 {
"Business Card", COMMON_JOKER, 4,
false, business_card_joker_desc, business_card_joker_effect },
189 {
"Hanging Chad", COMMON_JOKER, 4,
false, hanging_chad_joker_desc, hanging_chad_joker_effect },
190 {
"Joker Stencil", UNCOMMON_JOKER, 8,
false, stencil_joker_desc, stencil_joker_effect },
191 {
"Banner", COMMON_JOKER, 5,
false, banner_joker_desc, banner_joker_effect },
192 {
"Shoot the Moon", COMMON_JOKER, 5,
false, shoot_the_moon_joker_desc, shoot_the_moon_joker_effect, },
194 {
"Greedy Joker", COMMON_JOKER, 5,
false, greedy_joker_desc, greedy_joker_effect },
195 {
"Lusty Joker", COMMON_JOKER, 5,
false, lusty_joker_desc, lusty_joker_effect },
197 {
"Wrathful Joker", COMMON_JOKER, 5,
false, wrathful_joker_desc, wrathful_joker_effect },
198 {
"Gluttonous Joker", COMMON_JOKER, 5,
false, gluttonous_joker_desc, gluttonous_joker_effect },
200 {
"Crazy Joker", COMMON_JOKER, 4,
false, crazy_joker_desc, crazy_joker_effect },
201 {
"Mad Joker", COMMON_JOKER, 4,
false, mad_joker_desc, mad_joker_effect },
202 {
"Clever Joker", COMMON_JOKER, 4,
false, clever_joker_desc, clever_joker_effect },
203 {
"Devious Joker", COMMON_JOKER, 4,
false, devious_joker_desc, devious_joker_effect },
204 {
"Even Steven", COMMON_JOKER, 4,
false, even_steven_joker_desc, even_steven_joker_effect },
206 {
"Blackboard", UNCOMMON_JOKER, 6,
false, blackboard_joker_desc, blackboard_joker_effect },
207 {
"Mystic Summit", COMMON_JOKER, 5,
false, mystic_summit_joker_desc, mystic_summit_joker_effect },
208 {
"Walkie Talkie", COMMON_JOKER, 4,
false, walkie_talkie_joker_desc, walkie_talkie_joker_effect },
209 {
"Zany Joker", COMMON_JOKER, 4,
false, zany_joker_desc, zany_joker_effect },
210 {
"Wily Joker", COMMON_JOKER, 4,
false, wily_joker_desc, wily_joker_effect },
212 {
"Sly Joker", COMMON_JOKER, 3,
false, sly_joker_desc, sly_joker_effect },
213 {
"Jolly Joker", COMMON_JOKER, 3,
false, jolly_joker_desc, jolly_joker_effect },
214 {
"Blue Joker", COMMON_JOKER, 5,
false, blue_joker_desc, blue_joker_effect },
215 {
"Odd Todd", COMMON_JOKER, 4,
false, odd_todd_joker_desc, odd_todd_joker_effect },
217 {
"The Duo", RARE_JOKER, 8,
false, the_duo_joker_desc, the_duo_joker_effect },
218 {
"The Trio", RARE_JOKER, 8,
false, the_trio_joker_desc, the_trio_joker_effect },
219 {
"The Order", RARE_JOKER, 8,
false, the_order_joker_desc, the_order_joker_effect },
220 {
"The Tribe", RARE_JOKER, 8,
false, the_tribe_joker_desc, the_tribe_joker_effect },
222 {
"The Family", RARE_JOKER, 8,
false, the_family_joker_desc, the_family_joker_effect },
223 {
"Brainstorm", RARE_JOKER, 10,
false, brainstorm_joker_desc, blueprint_brainstorm_joker_effect },
225 {
"Smiley Face", COMMON_JOKER, 4,
false, smiley_face_joker_desc, smiley_face_joker_effect },
226 {
"Bull", UNCOMMON_JOKER, 6,
false, bull_joker_desc, bull_joker_effect },
228 {
"Photograph", COMMON_JOKER, 5,
false, photograph_joker_desc, photograph_joker_effect, },
229 {
"Hack", UNCOMMON_JOKER, 6,
false, hack_joker_desc, hack_joker_effect },
230 {
"Pareidolia", UNCOMMON_JOKER, 5,
false, pareidolia_joker_desc, joker_effect_noop },
231 {
"Bootstraps", UNCOMMON_JOKER, 7,
false, bootstraps_joker_desc, bootstraps_joker_effect },
232 {
"Shortcut", UNCOMMON_JOKER, 7,
false, shortcut_joker_desc, joker_effect_noop, },
233 {
"Dusk", UNCOMMON_JOKER, 5,
false, dusk_joker_desc, dusk_joker_effect },
234 {
"Four Fingers", UNCOMMON_JOKER, 7,
false, four_fingers_joker_desc, joker_effect_noop, },
235 {
"Seltzer", UNCOMMON_JOKER, 6,
false, seltzer_joker_desc, seltzer_joker_effect, },
236 {
"Blueprint", RARE_JOKER, 10,
false, blueprint_joker_desc, blueprint_brainstorm_joker_effect },
245static const size_t joker_registry_size =
NUM_ELEM_IN_ARR(joker_registry);
247const JokerInfo* get_joker_registry_entry(
int joker_id)
249 if (joker_id < 0 || (
size_t)joker_id >= joker_registry_size)
253 return &joker_registry[joker_id];
256size_t get_joker_registry_size(
void)
258 return joker_registry_size;
261#pragma region JOKER DESCRIPTIONS
263static int default_joker_desc(
Joker* joker, Rect dest_rect)
265 static const char desc[] = TTE_RED_TAG
"+4 " TTE_BLACK_TAG
"Mult";
269static int greedy_joker_desc(
Joker* joker, Rect dest_rect)
271 static const char desc[] =
272 TTE_BLACK_TAG
"Played cards with " TTE_DIAMOND_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
273 "+3 " TTE_BLACK_TAG
"Mult when scored";
277static int lusty_joker_desc(
Joker* joker, Rect dest_rect)
279 static const char desc[] =
280 TTE_BLACK_TAG
"Played cards with " TTE_HEART_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
281 "+3 " TTE_BLACK_TAG
"Mult when scored";
285static int wrathful_joker_desc(
Joker* joker, Rect dest_rect)
287 static const char desc[] =
288 TTE_BLACK_TAG
"Played cards with " TTE_SPADE_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
289 "+3 " TTE_BLACK_TAG
"Mult when scored";
293static int gluttonous_joker_desc(
Joker* joker, Rect dest_rect)
295 static const char desc[] =
296 TTE_BLACK_TAG
"Played cards with " TTE_CLUB_TAG TTE_BLACK_TAG
"suit give " TTE_RED_TAG
297 "+3 " TTE_BLACK_TAG
"Mult when scored";
301static int jolly_joker_desc(
Joker* joker, Rect dest_rect)
303 static const char desc[] =
304 TTE_RED_TAG
"+8 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Pair";
308static int zany_joker_desc(
Joker* joker, Rect dest_rect)
310 static const char desc[] = TTE_RED_TAG
311 "+12 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Three of a Kind";
315static int mad_joker_desc(
Joker* joker, Rect dest_rect)
317 static const char desc[] = TTE_RED_TAG
318 "+10 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Two Pair";
322static int crazy_joker_desc(
Joker* joker, Rect dest_rect)
324 static const char desc[] = TTE_RED_TAG
325 "+12 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Straight";
329static int droll_joker_desc(
Joker* joker, Rect dest_rect)
331 static const char desc[] =
332 TTE_RED_TAG
"+10 " TTE_BLACK_TAG
"Mult if played hand contains a " TTE_YELLOW_TAG
"Flush";
336static int sly_joker_desc(
Joker* joker, Rect dest_rect)
338 static const char desc[] =
339 TTE_BLUE_TAG
"+50 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Pair";
343static int wily_joker_desc(
Joker* joker, Rect dest_rect)
345 static const char desc[] = TTE_BLUE_TAG
346 "+100 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Three of a Kind";
350static int clever_joker_desc(
Joker* joker, Rect dest_rect)
352 static const char desc[] = TTE_BLUE_TAG
353 "+80 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Two Pair";
357static int devious_joker_desc(
Joker* joker, Rect dest_rect)
359 static const char desc[] = TTE_BLUE_TAG
360 "+100 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Straight";
364static int crafty_joker_desc(
Joker* joker, Rect dest_rect)
366 static const char desc[] =
367 TTE_BLUE_TAG
"+80 " TTE_BLACK_TAG
"Chips if played hand contains a " TTE_YELLOW_TAG
"Flush";
371static int half_joker_desc(
Joker* joker, Rect dest_rect)
373 static const char desc[] =
374 TTE_RED_TAG
"+20 " TTE_BLACK_TAG
"Mult if played hand contains " TTE_YELLOW_TAG
375 "3 " TTE_BLACK_TAG
"or fewer cards";
379static int stencil_joker_desc(
Joker* joker, Rect dest_rect)
381 static const char desc_format[] =
382 TTE_RED_TAG
"X1 " TTE_BLACK_TAG
383 "Mult for each empty Joker slot Joker Stencil included\n\n(Now " TTE_RED_TAG
384 "X%ld " TTE_BLACK_TAG
"Mult)";
385 const u32 desc_max_size = 130;
387 List* jokers = get_jokers_list();
388 u32 stencil_bonus = MAX_JOKERS_HELD_SIZE -
list_get_len(jokers);
394 if (joker_object->joker->id == STENCIL_JOKER_ID)
398 char desc[desc_max_size];
399 snprintf(desc, desc_max_size, desc_format, stencil_bonus);
404static int misprint_joker_desc(
Joker* joker, Rect dest_rect)
407 char desc[] = TTE_YELLOW_TAG
"Random" TTE_BLACK_TAG
" Mult between " TTE_RED_TAG
408 "+0" TTE_BLACK_TAG
" and " TTE_RED_TAG
"+23";
412static int walkie_talkie_joker_desc(
Joker* joker, Rect dest_rect)
414 static const char desc[] =
415 TTE_BLACK_TAG
"Each played " TTE_YELLOW_TAG
"10 " TTE_BLACK_TAG
"or " TTE_YELLOW_TAG
416 "4 " TTE_BLACK_TAG
"gives " TTE_BLUE_TAG
"+10 " TTE_BLACK_TAG
417 "Chips and " TTE_RED_TAG
"+4 " TTE_BLACK_TAG
"Mult when scored";
421static int fibonnaci_joker_desc(
Joker* joker, Rect dest_rect)
423 static const char desc[] =
424 TTE_BLACK_TAG
"Each played\n" TTE_YELLOW_TAG
"Ace" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
425 "2" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
"3" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
426 "5" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
"8\n" TTE_BLACK_TAG
"gives " TTE_RED_TAG
427 "+8 " TTE_BLACK_TAG
"Mult when scored";
432static int banner_joker_desc(
Joker* joker, Rect dest_rect)
434 static const char desc[] =
435 TTE_BLUE_TAG
"+30 " TTE_BLACK_TAG
"Chips for each remaining " TTE_YELLOW_TAG
"discard";
439static int mystic_summit_joker_desc(
Joker* joker, Rect dest_rect)
441 static const char desc[] = TTE_RED_TAG
"+15 " TTE_BLACK_TAG
"Mult when " TTE_YELLOW_TAG
442 "0 " TTE_BLACK_TAG
"discards remaining ";
446static int blackboard_joker_desc(
Joker* joker, Rect dest_rect)
448 static const char desc[] = TTE_RED_TAG
449 "X3 " TTE_BLACK_TAG
"Mult if all cards held in hand are " TTE_SPADE_TAG TTE_BLACK_TAG
454static int blue_joker_desc(
Joker* joker, Rect dest_rect)
456 static const char desc_format[] =
457 TTE_BLUE_TAG
"+2 " TTE_BLACK_TAG
"Chips for each remaining card in " TTE_YELLOW_TAG
458 "deck" TTE_BLACK_TAG
"\n\n(Now " TTE_BLUE_TAG
"+%ld" TTE_BLACK_TAG
" Chips)";
459 const u32 desc_max_size = 139;
461 u32 blue_bonus = (get_deck_top() + 1) * 2;
463 char desc[desc_max_size];
464 snprintf(desc, desc_max_size, desc_format, blue_bonus);
469static int raised_fist_joker_desc(
Joker* joker, Rect dest_rect)
471 static const char desc[] =
472 TTE_BLACK_TAG
"Adds " TTE_YELLOW_TAG
"double" TTE_BLACK_TAG
" the rank of " TTE_YELLOW_TAG
473 "lowest" TTE_BLACK_TAG
" ranked card held in hand to Mult";
477static int reserved_parking_joker_desc(
Joker* joker, Rect dest_rect)
479 static const char desc[] = TTE_BLACK_TAG
480 "Each " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" card held in hand has a " TTE_GREEN_TAG
481 "1 in 2" TTE_BLACK_TAG
" chance to give " TTE_YELLOW_TAG
"$1";
485static int business_card_joker_desc(
Joker* joker, Rect dest_rect)
487 static const char desc[] = TTE_BLACK_TAG
488 "Played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards have a " TTE_GREEN_TAG
489 "1 in 2" TTE_BLACK_TAG
" chance to give " TTE_YELLOW_TAG
"$2" TTE_BLACK_TAG
" when scored";
493static int scholar_joker_desc(
Joker* joker, Rect dest_rect)
495 static const char desc[] = TTE_BLACK_TAG
496 "Played " TTE_YELLOW_TAG
"Aces" TTE_BLACK_TAG
" give " TTE_BLUE_TAG
"+20" TTE_BLACK_TAG
497 " Chips and " TTE_RED_TAG
"+4" TTE_BLACK_TAG
" Mult when scored";
501static int scary_face_joker_desc(
Joker* joker, Rect dest_rect)
503 static const char desc[] =
504 TTE_BLACK_TAG
"Played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards give " TTE_BLUE_TAG
505 "+30" TTE_BLACK_TAG
" Chips when scored";
509static int abstract_joker_desc(
Joker* joker, Rect dest_rect)
511 static const char desc_format[] =
512 TTE_RED_TAG
"+3" TTE_BLACK_TAG
" Mult for each " TTE_YELLOW_TAG
"Joker" TTE_BLACK_TAG
513 " card\n\n(Now " TTE_RED_TAG
"+%ld" TTE_BLACK_TAG
" Mult)";
514 const u32 desc_max_size = 125;
516 u32 abstract_bonus =
list_get_len(get_jokers_list()) * 3;
518 char desc[desc_max_size];
519 snprintf(desc, desc_max_size, desc_format, abstract_bonus);
524static int bull_joker_desc(
Joker* joker, Rect dest_rect)
526 static const char desc_format[] =
527 TTE_BLUE_TAG
"+2" TTE_BLACK_TAG
" Chips for each " TTE_YELLOW_TAG
"$1" TTE_BLACK_TAG
528 " you have\n\n(Now " TTE_BLUE_TAG
"+%ld" TTE_BLACK_TAG
" Chips)";
529 const u32 desc_max_size = 127;
531 u32 bull_bonus = (g_game_vars.money > 0) ? g_game_vars.money * 2 : 0;
533 char desc[desc_max_size];
534 snprintf(desc, desc_max_size, desc_format, bull_bonus);
539static int smiley_face_joker_desc(
Joker* joker, Rect dest_rect)
541 static const char desc[] =
542 TTE_BLACK_TAG
"Played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards give " TTE_RED_TAG
543 "+5" TTE_BLACK_TAG
" Mult when scored";
547static int even_steven_joker_desc(
Joker* joker, Rect dest_rect)
549 static const char desc[] =
550 TTE_BLACK_TAG
"Played cards with " TTE_YELLOW_TAG
"even rank give " TTE_RED_TAG
551 "+4" TTE_BLACK_TAG
" Mult when scored\n(10, 8, 6, 4, 2)";
555static int odd_todd_joker_desc(
Joker* joker, Rect dest_rect)
557 static const char desc[] =
558 TTE_BLACK_TAG
"Played cards with " TTE_YELLOW_TAG
"odd rank give " TTE_BLUE_TAG
559 "+31" TTE_BLACK_TAG
" Chips when scored\n(A, 9, 7, 5, 3)";
563static int acrobat_joker_desc(
Joker* joker, Rect dest_rect)
565 static const char desc[] = TTE_RED_TAG
"X3" TTE_BLACK_TAG
" Mult on " TTE_YELLOW_TAG
566 "final hand" TTE_BLACK_TAG
" of round";
570static int hanging_chad_joker_desc(
Joker* joker, Rect dest_rect)
572 static const char desc[] = TTE_BLACK_TAG
"Retrigger " TTE_YELLOW_TAG
"first" TTE_BLACK_TAG
573 " played card used in scoring " TTE_YELLOW_TAG
574 "2" TTE_BLACK_TAG
" additional times ";
578static int the_duo_joker_desc(
Joker* joker, Rect dest_rect)
580 static const char desc[] =
581 TTE_RED_TAG
"X2" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Pair";
585static int the_trio_joker_desc(
Joker* joker, Rect dest_rect)
587 static const char desc[] = TTE_RED_TAG
588 "X3" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Three of a Kind";
592static int the_family_joker_desc(
Joker* joker, Rect dest_rect)
594 static const char desc[] = TTE_RED_TAG
595 "X4" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Four of a Kind";
599static int the_order_joker_desc(
Joker* joker, Rect dest_rect)
601 static const char desc[] =
602 TTE_RED_TAG
"X3" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Straight";
606static int the_tribe_joker_desc(
Joker* joker, Rect dest_rect)
608 static const char desc[] =
609 TTE_RED_TAG
"X2" TTE_BLACK_TAG
" Mult if played hand contains a " TTE_YELLOW_TAG
"Flush";
613static int bootstraps_joker_desc(
Joker* joker, Rect dest_rect)
615 static const char desc_format[] =
616 TTE_RED_TAG
"+2" TTE_BLACK_TAG
" Mult for every " TTE_YELLOW_TAG
"$5" TTE_BLACK_TAG
617 " you have\n\n(Now " TTE_RED_TAG
"+%ld" TTE_BLACK_TAG
" Mult)";
618 const u32 desc_max_size = 125;
620 u32 bootstrap_bonus = (g_game_vars.money > 0) ? (g_game_vars.money / 5) * 2 : 0;
622 char desc[desc_max_size];
623 snprintf(desc, desc_max_size, desc_format, bootstrap_bonus);
628static int shoot_the_moon_joker_desc(
Joker* joker, Rect dest_rect)
630 static const char desc[] =
631 TTE_BLACK_TAG
"Each " TTE_YELLOW_TAG
"Queen" TTE_BLACK_TAG
632 " held in hand gives " TTE_RED_TAG
"+13" TTE_BLACK_TAG
" Mult";
636static int photograph_joker_desc(
Joker* joker, Rect dest_rect)
638 static const char desc[] =
639 TTE_BLACK_TAG
"First played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" card gives " TTE_RED_TAG
640 "X2" TTE_BLACK_TAG
" Mult when scored";
644static int dusk_joker_desc(
Joker* joker, Rect dest_rect)
646 static const char desc[] = TTE_BLACK_TAG
"Retrigger all played cards in " TTE_YELLOW_TAG
647 "final hand" TTE_BLACK_TAG
" of the round";
651static int brainstorm_joker_desc(
Joker* joker, Rect dest_rect)
653 static const char desc[] =
654 TTE_BLACK_TAG
"Copies ability of the leftmost " TTE_YELLOW_TAG
"Joker";
658static int blueprint_joker_desc(
Joker* joker, Rect dest_rect)
660 static const char desc[] =
661 TTE_BLACK_TAG
"Copies ability of " TTE_YELLOW_TAG
"Joker" TTE_BLACK_TAG
" to the right";
665static int hack_joker_desc(
Joker* joker, Rect dest_rect)
667 static const char desc[] = TTE_BLACK_TAG
668 "Retrigger each played " TTE_YELLOW_TAG
"2" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
669 "3" TTE_BLACK_TAG
", " TTE_YELLOW_TAG
"4" TTE_BLACK_TAG
", or " TTE_YELLOW_TAG
"5";
673static int seltzer_joker_desc(
Joker* joker, Rect dest_rect)
675 static const char desc_format[] = TTE_BLACK_TAG
676 "Retrigger all cards played for the next " TTE_YELLOW_TAG
"%ld" TTE_BLACK_TAG
" hands";
677 const u32 desc_max_size = 94;
679 char desc[desc_max_size];
680 snprintf(desc, desc_max_size, desc_format, joker->persistent_state);
685static int sock_and_buskin_joker_desc(
Joker* joker, Rect dest_rect)
687 static const char desc[] =
688 TTE_BLACK_TAG
"Retrigger all played " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards";
692static int pareidolia_joker_desc(
Joker* joker, Rect dest_rect)
694 static const char desc[] =
695 TTE_BLACK_TAG
"All cards are considered " TTE_YELLOW_TAG
"face" TTE_BLACK_TAG
" cards";
699static int shortcut_joker_desc(
Joker* joker, Rect dest_rect)
701 static const char desc[] =
702 TTE_BLACK_TAG
"Allows " TTE_YELLOW_TAG
"Straights" TTE_BLACK_TAG
703 " to be made with gaps of " TTE_YELLOW_TAG
"1 rank" TTE_BLACK_TAG
704 "\n\n(ex: " TTE_YELLOW_TAG
"10 8 6 5 3" TTE_BLACK_TAG
")";
708static int four_fingers_joker_desc(
Joker* joker, Rect dest_rect)
710 static const char desc[] =
711 TTE_BLACK_TAG
"All " TTE_YELLOW_TAG
"Flushes" TTE_BLACK_TAG
" and " TTE_YELLOW_TAG
712 "Straights" TTE_BLACK_TAG
" can be made with 4 cards";
718#pragma region JOKER EFFECTS
720static u32 joker_effect_noop(
723 enum JokerEvent joker_event,
727 return JOKER_EFFECT_FLAG_NONE;
730static u32 default_joker_effect(
733 enum JokerEvent joker_event,
737 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
738 *joker_effect = &s_shared_joker_effect;
740 (*joker_effect)->mult = 4;
742 return JOKER_EFFECT_FLAG_MULT;
745static u32 sinful_joker_effect(
748 enum JokerEvent joker_event,
752 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
754 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
756 if (scored_card->suit == sinful_suit)
758 *joker_effect = &s_shared_joker_effect;
760 (*joker_effect)->mult = 3;
761 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
763 return effect_flags_ret;
766static u32 greedy_joker_effect(
769 enum JokerEvent joker_event,
773 return sinful_joker_effect(scored_card, DIAMONDS, joker_event, joker_effect);
776static u32 lusty_joker_effect(
779 enum JokerEvent joker_event,
783 return sinful_joker_effect(scored_card, HEARTS, joker_event, joker_effect);
786static u32 wrathful_joker_effect(
789 enum JokerEvent joker_event,
793 return sinful_joker_effect(scored_card, SPADES, joker_event, joker_effect);
796static u32 gluttonous_joker_effect(
799 enum JokerEvent joker_event,
803 return sinful_joker_effect(scored_card, CLUBS, joker_event, joker_effect);
806static u32 jolly_joker_effect(
809 enum JokerEvent joker_event,
813 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
815 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
819 *joker_effect = &s_shared_joker_effect;
821 (*joker_effect)->mult = 8;
822 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
825 return effect_flags_ret;
828static u32 zany_joker_effect(
831 enum JokerEvent joker_event,
835 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
837 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
841 *joker_effect = &s_shared_joker_effect;
843 (*joker_effect)->mult = 12;
844 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
847 return effect_flags_ret;
850static u32 mad_joker_effect(
853 enum JokerEvent joker_event,
857 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
859 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
863 *joker_effect = &s_shared_joker_effect;
865 (*joker_effect)->mult = 10;
866 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
869 return effect_flags_ret;
872static u32 crazy_joker_effect(
875 enum JokerEvent joker_event,
879 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
881 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
885 *joker_effect = &s_shared_joker_effect;
887 (*joker_effect)->mult = 12;
888 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
891 return effect_flags_ret;
894static u32 droll_joker_effect(
897 enum JokerEvent joker_event,
901 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
903 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
907 *joker_effect = &s_shared_joker_effect;
909 (*joker_effect)->mult = 10;
910 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
913 return effect_flags_ret;
916static u32 sly_joker_effect(
919 enum JokerEvent joker_event,
923 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
925 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
929 *joker_effect = &s_shared_joker_effect;
931 (*joker_effect)->chips = 50;
932 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
935 return effect_flags_ret;
938static u32 wily_joker_effect(
941 enum JokerEvent joker_event,
945 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
947 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
951 *joker_effect = &s_shared_joker_effect;
953 (*joker_effect)->chips = 100;
954 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
957 return effect_flags_ret;
960static u32 clever_joker_effect(
963 enum JokerEvent joker_event,
967 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
969 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
973 *joker_effect = &s_shared_joker_effect;
975 (*joker_effect)->chips = 80;
976 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
979 return effect_flags_ret;
982static u32 devious_joker_effect(
985 enum JokerEvent joker_event,
989 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
991 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
995 *joker_effect = &s_shared_joker_effect;
997 (*joker_effect)->chips = 100;
998 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1001 return effect_flags_ret;
1004static u32 crafty_joker_effect(
1007 enum JokerEvent joker_event,
1011 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1013 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1017 *joker_effect = &s_shared_joker_effect;
1019 (*joker_effect)->chips = 80;
1020 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1023 return effect_flags_ret;
1026static u32 half_joker_effect(
1029 enum JokerEvent joker_event,
1033 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1035 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1038 if (played_size <= 3)
1040 *joker_effect = &s_shared_joker_effect;
1042 (*joker_effect)->mult = 20;
1043 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1046 return effect_flags_ret;
1049static u32 stencil_joker_effect(
1052 enum JokerEvent joker_event,
1056 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1058 *joker_effect = &s_shared_joker_effect;
1060 List* jokers = get_jokers_list();
1065 (*joker_effect)->xmult = (MAX_JOKERS_HELD_SIZE)-num_jokers;
1073 if (joker_object->joker->id == STENCIL_JOKER_ID)
1074 (*joker_effect)->xmult++;
1077 return JOKER_EFFECT_FLAG_XMULT;
1080#define MISPRINT_MAX_MULT 23
1081static u32 misprint_joker_effect(
1084 enum JokerEvent joker_event,
1088 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1090 *joker_effect = &s_shared_joker_effect;
1092 (*joker_effect)->mult =
rng_get_u32(RNG_SEQ_JOKER_MISPRINT) % (MISPRINT_MAX_MULT + 1);
1094 return JOKER_EFFECT_FLAG_MULT;
1097static u32 walkie_talkie_joker_effect(
1100 enum JokerEvent joker_event,
1104 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1106 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1108 if (scored_card->rank == TEN || scored_card->rank == FOUR)
1110 *joker_effect = &s_shared_joker_effect;
1112 (*joker_effect)->chips = 10;
1113 (*joker_effect)->mult = 4;
1114 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS | JOKER_EFFECT_FLAG_MULT;
1117 return effect_flags_ret;
1120static u32 fibonnaci_joker_effect(
1123 enum JokerEvent joker_event,
1127 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1129 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1131 switch (scored_card->rank)
1138 *joker_effect = &s_shared_joker_effect;
1139 (*joker_effect)->mult = 8;
1140 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1146 return effect_flags_ret;
1149static u32 banner_joker_effect(
1152 enum JokerEvent joker_event,
1156 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1158 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1160 if (get_num_discards_remaining() > 0)
1162 *joker_effect = &s_shared_joker_effect;
1164 (*joker_effect)->chips = 30 * get_num_discards_remaining();
1165 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1168 return effect_flags_ret;
1171static u32 mystic_summit_joker_effect(
1174 enum JokerEvent joker_event,
1178 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1180 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1182 if (get_num_discards_remaining() == 0)
1184 *joker_effect = &s_shared_joker_effect;
1186 (*joker_effect)->mult = 15;
1187 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1190 return effect_flags_ret;
1193static u32 blackboard_joker_effect(
1196 enum JokerEvent joker_event,
1200 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1202 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1204 bool all_cards_are_spades_or_clubs =
true;
1206 for (
int i = 0; i < g_game_vars.hand_size; i++)
1208 u8 suit = hand[i]->card->suit;
1209 if (suit == HEARTS || suit == DIAMONDS)
1211 all_cards_are_spades_or_clubs =
false;
1216 if (all_cards_are_spades_or_clubs)
1218 *joker_effect = &s_shared_joker_effect;
1220 (*joker_effect)->xmult = 3;
1221 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1224 return effect_flags_ret;
1227static u32 blue_joker_effect(
1230 enum JokerEvent joker_event,
1234 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1236 *joker_effect = &s_shared_joker_effect;
1238 (*joker_effect)->chips = (get_deck_top() + 1) * 2;
1240 return JOKER_EFFECT_FLAG_CHIPS;
1243static u32 raised_fist_joker_effect(
1246 enum JokerEvent joker_event,
1250 s32* p_lowest_value_index = &(joker->scoring_state);
1252 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1254 switch (joker_event)
1258 case JOKER_EVENT_ON_HAND_PLAYED:
1261 *p_lowest_value_index = 0;
1262 u8 lowest_value = IMPOSSIBLY_HIGH_CARD_VALUE;
1264 for (
int i = 0; i < g_game_vars.hand_size; i++)
1266 u8 value = card_get_value(hand[i]->card);
1267 if (lowest_value > value)
1269 *p_lowest_value_index = i;
1270 lowest_value = value;
1275 case JOKER_EVENT_ON_CARD_HELD:
1278 *joker_effect = &s_shared_joker_effect;
1280 (*joker_effect)->mult = 2 * card_get_value(scored_card);
1281 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1289 return effect_flags_ret;
1292static u32 reserved_parking_joker_effect(
1295 enum JokerEvent joker_event,
1299 SCORE_ON_EVENT_ONLY(JOKER_EVENT_ON_CARD_HELD, joker_event)
1301 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1303 if (card_is_face(scored_card) && (
rng_get_u32(RNG_SEQ_JOKER_RESERVED_PARKING) % 2 == 0))
1305 *joker_effect = &s_shared_joker_effect;
1307 (*joker_effect)->money = 1;
1308 effect_flags_ret = JOKER_EFFECT_FLAG_MONEY;
1311 return effect_flags_ret;
1314static u32 business_card_joker_effect(
1317 enum JokerEvent joker_event,
1321 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1323 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1325 if (card_is_face(scored_card) && (
rng_get_u32(RNG_SEQ_JOKER_BUSINESS_CARD) % 2 == 0))
1327 *joker_effect = &s_shared_joker_effect;
1329 (*joker_effect)->money = 2;
1330 effect_flags_ret = JOKER_EFFECT_FLAG_MONEY;
1333 return effect_flags_ret;
1336static u32 scholar_joker_effect(
1339 enum JokerEvent joker_event,
1343 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1345 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1347 if (scored_card->rank == ACE)
1349 *joker_effect = &s_shared_joker_effect;
1351 (*joker_effect)->chips = 20;
1352 (*joker_effect)->mult = 4;
1353 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS | JOKER_EFFECT_FLAG_MULT;
1356 return effect_flags_ret;
1359static u32 scary_face_joker_effect(
1362 enum JokerEvent joker_event,
1366 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1368 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1370 if (card_is_face(scored_card))
1372 *joker_effect = &s_shared_joker_effect;
1374 (*joker_effect)->chips = 30;
1375 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1378 return effect_flags_ret;
1381static u32 abstract_joker_effect(
1384 enum JokerEvent joker_event,
1388 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1390 *joker_effect = &s_shared_joker_effect;
1395 (*joker_effect)->mult = num_jokers * 3;
1397 return JOKER_EFFECT_FLAG_MULT;
1400static u32 bull_joker_effect(
1403 enum JokerEvent joker_event,
1407 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1409 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1413 if (g_game_vars.money > 0)
1415 *joker_effect = &s_shared_joker_effect;
1417 (*joker_effect)->chips = g_game_vars.money * 2;
1418 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1421 return effect_flags_ret;
1424static u32 smiley_face_joker_effect(
1427 enum JokerEvent joker_event,
1431 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1433 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1435 if (card_is_face(scored_card))
1437 *joker_effect = &s_shared_joker_effect;
1439 (*joker_effect)->mult = 5;
1440 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1443 return effect_flags_ret;
1446static u32 even_steven_joker_effect(
1449 enum JokerEvent joker_event,
1453 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1455 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1457 switch (scored_card->rank)
1464 if (card_get_value(scored_card) % 2 == 0)
1466 *joker_effect = &s_shared_joker_effect;
1468 (*joker_effect)->mult = 4;
1469 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1474 return effect_flags_ret;
1477static u32 odd_todd_joker_effect(
1480 enum JokerEvent joker_event,
1484 SCORE_ON_EVENT_ONLY_WITH_CARD(scored_card, JOKER_EVENT_ON_CARD_SCORED, joker_event)
1486 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1488 if (card_get_value(scored_card) % 2 == 1)
1490 *joker_effect = &s_shared_joker_effect;
1492 (*joker_effect)->chips = 31;
1493 effect_flags_ret = JOKER_EFFECT_FLAG_CHIPS;
1496 return effect_flags_ret;
1499static u32 acrobat_joker_effect(
1502 enum JokerEvent joker_event,
1506 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1508 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1511 if (get_num_hands_remaining() == 0)
1513 *joker_effect = &s_shared_joker_effect;
1515 (*joker_effect)->xmult = 3;
1516 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1519 return effect_flags_ret;
1522static u32 hanging_chad_joker_effect(
1525 enum JokerEvent joker_event,
1529 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1530 s32* p_remaining_retriggers = &(joker->scoring_state);
1532 switch (joker_event)
1534 case JOKER_EVENT_ON_HAND_PLAYED:
1535 *p_remaining_retriggers = 2;
1541 case JOKER_EVENT_ON_CARD_SCORED_END:
1542 *joker_effect = &s_shared_joker_effect;
1544 (*joker_effect)->retrigger = (*p_remaining_retriggers > 0);
1545 if ((*joker_effect)->retrigger)
1547 *p_remaining_retriggers -= 1;
1548 (*joker_effect)->message =
"Again!";
1549 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1557 return effect_flags_ret;
1560static u32 the_duo_joker_effect(
1563 enum JokerEvent joker_event,
1567 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1569 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1573 *joker_effect = &s_shared_joker_effect;
1575 (*joker_effect)->xmult = 2;
1576 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1579 return effect_flags_ret;
1582static u32 the_trio_joker_effect(
1585 enum JokerEvent joker_event,
1589 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1591 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1595 *joker_effect = &s_shared_joker_effect;
1597 (*joker_effect)->xmult = 3;
1598 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1601 return effect_flags_ret;
1604static u32 the_family_joker_effect(
1607 enum JokerEvent joker_event,
1611 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1613 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1617 *joker_effect = &s_shared_joker_effect;
1619 (*joker_effect)->xmult = 4;
1620 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1623 return effect_flags_ret;
1626static u32 the_order_joker_effect(
1629 enum JokerEvent joker_event,
1633 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1635 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1639 *joker_effect = &s_shared_joker_effect;
1641 (*joker_effect)->xmult = 3;
1642 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1645 return effect_flags_ret;
1648static u32 the_tribe_joker_effect(
1651 enum JokerEvent joker_event,
1655 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1657 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1661 *joker_effect = &s_shared_joker_effect;
1663 (*joker_effect)->xmult = 2;
1664 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1667 return effect_flags_ret;
1670static u32 bootstraps_joker_effect(
1673 enum JokerEvent joker_event,
1677 SCORE_ON_EVENT_ONLY(JOKER_EVENT_INDEPENDENT, joker_event)
1679 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1682 if (g_game_vars.money > 0)
1684 *joker_effect = &s_shared_joker_effect;
1686 (*joker_effect)->mult = (g_game_vars.money / 5) * 2;
1687 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1690 return effect_flags_ret;
1693static u32 shoot_the_moon_joker_effect(
1696 enum JokerEvent joker_event,
1700 SCORE_ON_EVENT_ONLY(JOKER_EVENT_ON_CARD_HELD, joker_event)
1702 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1704 if (scored_card->rank == QUEEN)
1706 *joker_effect = &s_shared_joker_effect;
1708 (*joker_effect)->mult = 13;
1709 effect_flags_ret = JOKER_EFFECT_FLAG_MULT;
1712 return effect_flags_ret;
1715static u32 photograph_joker_effect(
1718 enum JokerEvent joker_event,
1722 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1724 s32* p_first_face_index = &(joker->scoring_state);
1726 switch (joker_event)
1728 case JOKER_EVENT_ON_HAND_PLAYED:
1729 *p_first_face_index = UNDEFINED;
1732 case JOKER_EVENT_ON_CARD_SCORED:
1735 if (*p_first_face_index == UNDEFINED && card_is_face(scored_card))
1744 *joker_effect = &s_shared_joker_effect;
1746 (*joker_effect)->xmult = 2;
1747 effect_flags_ret = JOKER_EFFECT_FLAG_XMULT;
1754 return effect_flags_ret;
1757static u32 dusk_joker_effect(
1760 enum JokerEvent joker_event,
1764 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1766 s32* p_last_retriggered_index = &(joker->scoring_state);
1768 switch (joker_event)
1770 case JOKER_EVENT_ON_HAND_PLAYED:
1772 *p_last_retriggered_index = UNDEFINED;
1775 case JOKER_EVENT_ON_CARD_SCORED_END:
1777 if (get_num_hands_remaining() == 0)
1779 *joker_effect = &s_shared_joker_effect;
1782 if ((*joker_effect)->retrigger)
1785 (*joker_effect)->message =
"Again!";
1786 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1796 return effect_flags_ret;
1799static u32 blueprint_brainstorm_joker_effect(
1802 enum JokerEvent joker_event,
1806 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1810 if (joker_event == JOKER_EVENT_ON_JOKER_CREATED ||
1811 joker_event == JOKER_EVENT_ON_HAND_SCORED_END || joker_event == JOKER_EVENT_ON_ROUND_END)
1813 return effect_flags_ret;
1817 List* jokers = get_jokers_list();
1822 if (copied_joker_object->joker == joker)
1830 if (copied_joker_object == NULL)
1832 return effect_flags_ret;
1838 u8 brainstorm_counter = 0;
1841 switch (copied_joker_object->joker->id)
1844 case BLUEPRINT_JOKER_ID:
1849 case BRAINSTORM_JOKER_ID:
1850 brainstorm_counter++;
1859 u8 copied_joker_id = copied_joker_object->joker->id;
1860 const JokerInfo* copied_joker_info = get_joker_registry_entry(copied_joker_id);
1863 joker->persistent_state = copied_joker_object->joker->persistent_state;
1869 ->joker_effect_func(joker, scored_card, joker_event, joker_effect);
1872 effect_flags_ret &= ~JOKER_EFFECT_FLAG_EXPIRE;
1875 copied_joker_object = NULL;
1879 }
while (copied_joker_object != NULL && brainstorm_counter < 2);
1881 return effect_flags_ret;
1884static u32 hack_joker_effect(
1887 enum JokerEvent joker_event,
1891 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1893 s32* p_last_retriggered_index = &(joker->scoring_state);
1895 switch (joker_event)
1897 case JOKER_EVENT_ON_HAND_PLAYED:
1898 *p_last_retriggered_index = UNDEFINED;
1901 case JOKER_EVENT_ON_CARD_SCORED_END:
1903 switch (scored_card->rank)
1909 *joker_effect = &s_shared_joker_effect;
1911 (*joker_effect)->retrigger =
1913 if ((*joker_effect)->retrigger)
1916 (*joker_effect)->message =
"Again!";
1917 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1927 return effect_flags_ret;
1930static u32 seltzer_joker_effect(
1933 enum JokerEvent joker_event,
1937 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
1939 s32* p_last_retriggered_idx = &(joker->scoring_state);
1940 s32* p_hands_left_until_exp = &(joker->persistent_state);
1942 switch (joker_event)
1944 case JOKER_EVENT_ON_JOKER_CREATED:
1945 *p_hands_left_until_exp = 10;
1948 case JOKER_EVENT_ON_HAND_PLAYED:
1949 *p_last_retriggered_idx = UNDEFINED;
1952 case JOKER_EVENT_ON_CARD_SCORED_END:
1956 *joker_effect = &s_shared_joker_effect;
1959 if ((*joker_effect)->retrigger)
1962 (*joker_effect)->message =
"Again!";
1963 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
1967 case JOKER_EVENT_ON_HAND_SCORED_END:
1968 *joker_effect = &s_shared_joker_effect;
1969 effect_flags_ret = JOKER_EFFECT_FLAG_MESSAGE;
1971 (*p_hands_left_until_exp)--;
1972 if (*p_hands_left_until_exp > 0)
1976 static const char* SELTZER_MESSAGES[] =
1977 {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9"};
1978 (*joker_effect)->message = (
char*)SELTZER_MESSAGES[(*p_hands_left_until_exp) - 1];
1982 (*joker_effect)->message =
"Drank!";
1983 (*joker_effect)->expire =
true;
1984 effect_flags_ret |= JOKER_EFFECT_FLAG_EXPIRE;
1992 return effect_flags_ret;
1995static u32 sock_and_buskin_joker_effect(
1998 enum JokerEvent joker_event,
2002 u32 effect_flags_ret = JOKER_EFFECT_FLAG_NONE;
2004 s32* p_last_retriggered_face_index = &(joker->scoring_state);
2006 switch (joker_event)
2008 case JOKER_EVENT_ON_HAND_PLAYED:
2009 *p_last_retriggered_face_index = UNDEFINED;
2012 case JOKER_EVENT_ON_CARD_SCORED_END:
2013 *joker_effect = &s_shared_joker_effect;
2016 (*joker_effect)->retrigger =
2018 card_is_face(scored_card));
2019 if ((*joker_effect)->retrigger)
2022 (*joker_effect)->message =
"Again!";
2023 effect_flags_ret = JOKER_EFFECT_FLAG_RETRIGGER | JOKER_EFFECT_FLAG_MESSAGE;
2031 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.