Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
inventory.c
Go to the documentation of this file.
1#include "inventory.h"
2#include "hud_element.h"
3#include "dx/config.h"
4#include "dx/debug_menu.h"
5
6#define FULLY_EXTENDED_Y 18
7#define FULLY_RETRACTED_Y -100
8
12};
13
19
22
24
29
30extern HudScript* DigitHudScripts[10];
31
49
51
54
56 PlayerData* playerData = &gPlayerData;
57 s32 i;
58
59 ShowingCoinCounter = FALSE;
60 HidingCoinCounter = FALSE;
61
62 playerData->curHP = 10;
63 playerData->curMaxHP = 10;
64 playerData->hardMaxHP = 10;
65 playerData->curFP = 5;
66 playerData->curMaxFP = 5;
67 playerData->hardMaxFP = 5;
68 playerData->maxBP = 3;
69 playerData->level = 1;
70 playerData->bootsLevel = 0;
71 playerData->hammerLevel = -1;
72 playerData->hasActionCommands = FALSE;
73 playerData->coins = 0;
74 playerData->starPieces = 0;
75 playerData->starPoints = 0;
76 playerData->unused_011 = 0;
77 playerData->unused_288 = 0;
78
80 playerData->merleeCastsLeft = 0;
81 playerData->merleeTurnCount = -1;
82
83 playerData->maxStarPower = 0;
84 playerData->starPower = 0;
85 playerData->starBeamLevel = 0;
86
87 playerData->curPartner = PARTNER_NONE;
88
89 for (i = 0; i < ARRAY_COUNT(playerData->partners); i++) {
90 playerData->partners[i].enabled = FALSE;
91 playerData->partners[i].level = PARTNER_RANK_NORMAL;
92 playerData->partners[i].unk_02[0] = 0;
93 playerData->partners[i].unk_02[1] = 0;
94 playerData->partners[i].unk_02[2] = 0;
95 }
96
97 for (i = 0; i < ARRAY_COUNT(playerData->keyItems); i++) {
98 playerData->keyItems[i] = ITEM_NONE;
99 }
100
101 for (i = 0; i < ARRAY_COUNT(playerData->badges); i++) {
102 playerData->badges[i] = ITEM_NONE;
103 }
104
105 for (i = 0; i < ARRAY_COUNT(playerData->invItems); i++) {
106 playerData->invItems[i] = ITEM_NONE;
107 }
108
109 for (i = 0; i < ARRAY_COUNT(playerData->equippedBadges); i++) {
110 playerData->equippedBadges[i] = ITEM_NONE;
111 }
112
113 for (i = 0; i < ARRAY_COUNT(playerData->storedItems); i++) {
114 playerData->storedItems[i] = ITEM_NONE;
115 }
116
117 playerData->actionCommandAttempts = 0;
118 playerData->actionCommandSuccesses = 0;
119 playerData->hitsTaken = 0;
120 playerData->hitsBlocked = 0;
121 playerData->playerFirstStrikes = 0;
122 playerData->enemyFirstStrikes = 0;
123 playerData->powerBounces = 0;
124 playerData->battlesCount = 0;
125 playerData->battlesWon = 0;
126 playerData->fleeAttempts = 0;
127 playerData->battlesFled = 0;
128 playerData->trainingsDone = 0;
129 playerData->walkingStepsTaken = 0;
130 playerData->runningStepsTaken = 0;
131 playerData->idleFrameCounter = 0;
132 playerData->totalCoinsEarned = 0;
133 playerData->frameCounter = 0;
134 playerData->quizzesAnswered = 0;
135 playerData->quizzesCorrect = 0;
136
137 for (i = 0; i < ARRAY_COUNT(playerData->partnerUnlockedTime); i++) {
138 playerData->partnerUnlockedTime[i] = 0;
139 playerData->partnerUsedTime[i] = 0;
140 }
141
142 playerData->droTreeHintTime = 0;
143 playerData->starPiecesCollected = 0;
144 playerData->jumpGamePlays = 0;
145 playerData->jumpGameTotal = 0;
146 playerData->jumpGameRecord = 0;
147 playerData->smashGamePlays = 0;
148 playerData->smashGameTotal = 0;
149 playerData->smashGameRecord = 0;
150}
151
152s32 add_item(s32 itemID) {
153 s32 idx;
154
155 // handle key items
156 if (item_is_key(itemID)) {
157 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.keyItems); idx++) {
158 if (gPlayerData.keyItems[idx] == ITEM_NONE) {
159 break;
160 }
161 }
162
163 if (idx >= ARRAY_COUNT(gPlayerData.keyItems)) {
164 return -1;
165 }
166
167 gPlayerData.keyItems[idx] = itemID;
168 return idx;
169 }
170
171 // handle badges
172 if (item_is_badge(itemID)) {
173 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.badges); idx++) {
174 if (gPlayerData.badges[idx] == ITEM_NONE) {
175 break;
176 }
177 }
178
179 if (idx >= ARRAY_COUNT(gPlayerData.badges)) {
180 return -1;
181 }
182
183 gPlayerData.badges[idx] = itemID;
184 return idx;
185 }
186
187 // handle consumables
189
190 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.invItems); idx++) {
191 if (gPlayerData.invItems[idx] == ITEM_NONE) {
192 break;
193 }
194 }
195
196 if (idx == ARRAY_COUNT(gPlayerData.invItems)) {
197 return -1;
198 }
199
200 gPlayerData.invItems[idx] = itemID;
201 return idx;
202}
203
204s32 remove_item(s32 itemID) {
205 s32 idx;
206
207 // handle key items
208 if (item_is_key(itemID)) {
209 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.keyItems); idx++) {
210 if (gPlayerData.keyItems[idx] == itemID) {
211 break;
212 }
213 }
214
215 if (idx >= ARRAY_COUNT(gPlayerData.keyItems)) {
216 return -1;
217 }
218
219 gPlayerData.keyItems[idx] = ITEM_NONE;
220 return idx;
221 }
222
223 // handle badges
224 if (item_is_badge(itemID)) {
225 // unequip
226 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.equippedBadges); idx++) {
227 if (gPlayerData.equippedBadges[idx] == itemID) {
228 gPlayerData.equippedBadges[idx] = ITEM_NONE;
229 }
230 }
231
232 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.badges); idx++) {
233 if (gPlayerData.badges[idx] == itemID) {
234 break;
235 }
236 }
237
238 if (idx >= ARRAY_COUNT(gPlayerData.badges)) {
239 return -1;
240 }
241
242 gPlayerData.badges[idx] = ITEM_NONE;
243 return idx;
244 }
245
246 // handle consumables
247 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.invItems); idx++) {
248 if (gPlayerData.invItems[idx] == itemID) {
249 break;
250 }
251 }
252
253 if (idx == ARRAY_COUNT(gPlayerData.invItems)) {
254 return -1;
255 }
256
257 gPlayerData.invItems[idx] = ITEM_NONE;
259 return idx;
260}
261
264s32 find_item(s32 itemID) {
265 s32 idx;
266
267 // handle key items
268 if (item_is_key(itemID)) {
269 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.keyItems); idx++) {
270 if (gPlayerData.keyItems[idx] == itemID) {
271 break;
272 }
273 }
274
275 if (idx >= ARRAY_COUNT(gPlayerData.keyItems)) {
276 return -1;
277 }
278 return idx;
279 }
280
281 // handle badges
282 if (item_is_badge(itemID)) {
283 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.badges); idx++) {
284 if (gPlayerData.badges[idx] == itemID) {
285 break;
286 }
287 }
288
289 if (idx >= ARRAY_COUNT(gPlayerData.badges)) {
290 return -1;
291 }
292 return idx;
293 }
294
295 // handle consumables
296 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.invItems); idx++) {
297 if (gPlayerData.invItems[idx] == itemID) {
298 break;
299 }
300 }
301
302 if (idx == ARRAY_COUNT(gPlayerData.invItems)) {
303 return -1;
304 }
305 return idx;
306}
307
310s32 count_item(s32 itemID) {
311 s32 idx;
312 s32 sum = 0;
313
314 // handle key items
315 if (item_is_key(itemID)) {
316 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.keyItems); idx++) {
317 if (gPlayerData.keyItems[idx] == itemID) {
318 sum++;
319 }
320 }
321 return sum;
322 }
323
324 // handle badges
325 if (item_is_badge(itemID)) {
326 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.badges); idx++) {
327 if (gPlayerData.badges[idx] == itemID) {
328 sum++;
329 }
330 }
331 return sum;
332 }
333
334 // handle consumables
335 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.invItems); idx++) {
336 if (gPlayerData.invItems[idx] == itemID) {
337 sum++;
338 }
339 }
340 return sum;
341}
342
343b32 has_item(s32 itemID) {
344 s32 idx;
345
346 // handle key items
347 if (item_is_key(itemID)) {
348 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.keyItems); idx++) {
349 if (gPlayerData.keyItems[idx] == itemID) {
350 return TRUE;
351 }
352 }
353 return FALSE;
354 }
355
356 // handle badges
357 if (item_is_badge(itemID)) {
358 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.badges); idx++) {
359 if (gPlayerData.badges[idx] == itemID) {
360 return TRUE;
361 }
362 }
363 return FALSE;
364 }
365
366 // handle consumables
367 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.invItems); idx++) {
368 if (gPlayerData.invItems[idx] == itemID) {
369 return TRUE;
370 }
371 }
372 return FALSE;
373}
374
375s32 store_item(s32 itemID) {
376 s32 idx;
377
378 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.storedItems); idx++) {
379 if (gPlayerData.storedItems[idx] == ITEM_NONE) {
380 break;
381 }
382 }
383
384 if (idx == ARRAY_COUNT(gPlayerData.storedItems)) {
385 return -1;
386 } else {
387 gPlayerData.storedItems[idx] = itemID;
388 }
389
390 return idx;
391}
392
394 s32 idx;
395
396 if (!item_is_badge(itemID)) {
397 return FALSE;
398 }
399
400 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.equippedBadges); idx++) {
401 if (gPlayerData.equippedBadges[idx] == itemID) {
402 return TRUE;
403 }
404 }
405
406 return FALSE;
407}
408
411 s32 i, j;
412
413 for (i = ARRAY_COUNT(gPlayerData.invItems) - 2; i >= 0; i--) {
414 // leave ITEM_NONE at the end of the list alone
415 if (gPlayerData.invItems[i] == ITEM_NONE) {
416 continue;
417 }
418 // swap any other ITEM_NONE to the end of the list
419 for (j = ARRAY_COUNT(gPlayerData.invItems) - 1; i < j; j--) {
420 if (gPlayerData.invItems[j] == ITEM_NONE) {
422 gPlayerData.invItems[i] = ITEM_NONE;
423 break;
424 }
425 }
426 }
427}
428
430 s32 idx;
431 s32 sum = 0;
432
433 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.invItems); idx++) {
434 if (gPlayerData.invItems[idx] != ITEM_NONE) {
435 sum++;
436 }
437 }
438
439 return sum;
440}
441
445
447 s32 idx;
448 s32 sum = 0;
449
450 for (idx = 0; idx < ARRAY_COUNT(gPlayerData.storedItems); idx++) {
451 if (gPlayerData.storedItems[idx] != ITEM_NONE) {
452 sum++;
453 }
454 }
455
456 return sum;
457}
458
462
464 PlayerData* playerData = &gPlayerData;
465
466 playerData->curMaxHP = playerData->hardMaxHP + (is_ability_active(ABILITY_HP_PLUS) * 5);
467 if (playerData->curMaxHP > 75) {
468 playerData->curMaxHP = 75;
469 }
470 if (playerData->curHP > playerData->curMaxHP) {
471 playerData->curHP = playerData->curMaxHP;
472 }
473
474 playerData->curMaxFP = playerData->hardMaxFP + (is_ability_active(ABILITY_FP_PLUS) * 5);
475 if (playerData->curMaxFP > 75) {
476 playerData->curMaxFP = 75;
477 }
478 if (playerData->curFP > playerData->curMaxFP) {
479 playerData->curFP = playerData->curMaxFP;
480 }
481}
482
484 StatusBar* statusBar = &gStatusBar;
485 PlayerData* playerData = &gPlayerData;
486 HudElemID hid;
487
488 statusBar->drawPosX = 12;
489 ShowingCoinCounter = FALSE;
490 HidingCoinCounter = FALSE;
491 statusBar->drawPosY = FULLY_RETRACTED_Y;
492 statusBar->hidden = FALSE;
493 statusBar->showTimer = 210;
494 statusBar->unk_3B = FALSE;
495 statusBar->ignoreChanges = FALSE;
496 statusBar->openInputDisabled = FALSE;
497 statusBar->alwaysShown = FALSE;
498 statusBar->hpBlinking = BLINK_OFF;
499 statusBar->hpBlinkAnimTime = 0;
500 statusBar->hpBlinkTimeLeft = 0;
501 statusBar->fpBlinking = BLINK_OFF;
502 statusBar->fpBlinkAnimTime = 0;
503 statusBar->fpBlinkTimeLeft = 0;
504 statusBar->starPowerBlinking = BLINK_OFF;
505 statusBar->starPowerBlinkCounter = 0;
506 statusBar->coinsBlinking = BLINK_OFF;
507 statusBar->coinsBlinkAnimTime = 0;
508 statusBar->coinsBlinkTimeLeft = 0;
509 statusBar->disabled = 0;
510 statusBar->starpointsBlinking = BLINK_OFF;
511 statusBar->displayHP = playerData->curHP;
512 statusBar->displayFP = playerData->curFP;
513 statusBar->displayCoins = playerData->coins;
514 statusBar->displayStarpoints = playerData->starPoints;
515 statusBar->displayStarPower = playerData->starPower;
516 statusBar->starpointsBlinkAnimTime = 0;
517 statusBar->prevIgnoreChanges = -1;
518 statusBar->unk_3C = FALSE;
519 statusBar->shimmerState = STATUS_SHIMMER_OFF;
520 statusBar->shimmerTime = 0;
521 statusBar->shimmerLimit = 0;
522 statusBar->powBarsToBlink = 0;
523 statusBar->coinCounterHideDelay = 0;
524 statusBar->coinCountDisposeTime = 0;
525 statusBar->iconIndex12 = -1;
526
528
529#if VERSION_PAL
530 switch (gCurrentLanguage) {
531 case LANGUAGE_EN:
532 hid = statusBar->hpIconHIDs[0] = hud_element_create(&HES_StatusHP);
533 break;
534 case LANGUAGE_DE:
535 hid = statusBar->hpIconHIDs[0] = hud_element_create(&HES_StatusHP_de);
536 break;
537 case LANGUAGE_FR:
538 hid = statusBar->hpIconHIDs[0] = hud_element_create(&HES_StatusHP_fr);
539 break;
540 case LANGUAGE_ES:
541 hid = statusBar->hpIconHIDs[0] = hud_element_create(&HES_StatusHP_es);
542 break;
543 }
544
547#else
548 statusBar->hpIconHIDs[0] = hid = hud_element_create(&HES_StatusHP);
551#endif
552
553 statusBar->hpIconHIDs[1] = hid = hud_element_create(&HES_StatusHeart);
556
557#if VERSION_PAL
558 switch (gCurrentLanguage) {
559 case LANGUAGE_EN:
560 hid = statusBar->fpIconHIDs[0] = hud_element_create(&HES_StatusFP);
561 break;
562 case LANGUAGE_DE:
563 hid = statusBar->fpIconHIDs[0] = hud_element_create(&HES_StatusFP_de);
564 break;
565 case LANGUAGE_FR:
566 hid = statusBar->fpIconHIDs[0] = hud_element_create(&HES_StatusFP_fr);
567 break;
568 case LANGUAGE_ES:
569 hid = statusBar->fpIconHIDs[0] = hud_element_create(&HES_StatusFP_es);
570 break;
571 }
572
575#else
576 statusBar->fpIconHIDs[0] = hid = hud_element_create(&HES_StatusFP);
579#endif
580
581 statusBar->fpIconHIDs[1] = hid = hud_element_create(&HES_StatusFlower);
584
585 statusBar->coinIconHID = hid = hud_element_create(&HES_StatusCoin);
588
592
596
600
601 statusBar->hpTimesHID = hid = hud_element_create(&HES_StatusTimes);
604
605 statusBar->fpTimesHID = hid = hud_element_create(&HES_StatusTimes);
608
609 statusBar->spTimesHID = hid = hud_element_create(&HES_StatusTimes);
612
616
620
622}
623
624void status_bar_draw_number(s32 iconID, s32 startX, s32 startY, s32 value, s32 numDigits) {
625 s8 digits[4];
626 s32 drawX, drawY;
627 b32 keepDrawing;
628 s32 digit;
629 s32 i;
630
632 drawX = startX + 8;
633 drawY = startY + 8;
634 hud_element_set_render_pos(iconID, drawX, drawY - 1);
636 hud_element_draw_next(iconID);
637
638 // Write each digit of the input number into the digits array
639 for (i = 0; i < numDigits; i++) {
640 digit = value % 10;
641 digits[(numDigits - i) - 1] = digit;
642 value /= 10;
643 }
644
645 drawX += 13;
646 keepDrawing = FALSE;
647
648 for (i = 0; i < numDigits; i++, drawX += 8) {
649 digit = digits[i];
650
651 // Once we have encountered our first non-zero digit, we need to keep drawing the remaining digits
652 if (digit != 0 || keepDrawing || (i == numDigits - 1)) {
653 keepDrawing = TRUE;
655 hud_element_set_render_pos(iconID, drawX, drawY);
657 hud_element_draw_next(iconID);
658 }
659 }
660}
661
662void status_bar_draw_stat(s32 id, s32 startX, s32 startY, s32 currentValue, s32 maxValue) {
663 s8 digits[4];
664 b32 keepDrawing;
665 s32 digit;
666 s32 numDigits = 2;
667 s32 drawX;
668 s32 drawY;
669 s32 i = 0;
670 s32 baseX = startX + 8;
671 s32 baseY = startY + 8;
672
674 hud_element_set_render_pos(id, baseX + 14, baseY + 1);
677
678 for (i = 0; i < numDigits; i++) {
679 s32 num = currentValue % 10;
680 digits[numDigits - i - 1] = num;
681 currentValue /= 10;
682 }
683
684 drawX = baseX;
685 drawY = baseY;
686 keepDrawing = FALSE;
687 for (i = 0; i < numDigits; i++, drawX += 8) {
688 digit = digits[i];
689 if (digit != 0 || keepDrawing || i == numDigits - 1) {
690 keepDrawing = TRUE;
692 hud_element_set_render_pos(id, drawX, drawY);
695 }
696 }
697
698 for (i = 0; i < numDigits; i++) {
699 digits[numDigits - i - 1] = maxValue % 10;
700 maxValue /= 10;
701 }
702
703 drawX = baseX + 26;
704 drawY = baseY;
705 keepDrawing = FALSE;
706 for (i = 0; i < numDigits; i++, drawX += 8) {
707 digit = digits[i];
708 if (digit != 0 || keepDrawing || i == numDigits - 1) {
709 keepDrawing = TRUE;
711 hud_element_set_render_pos(id, drawX, drawY);
714 }
715 }
716}
717
719 StatusBar* statusBar = &gStatusBar;
720 PlayerData* playerData = &gPlayerData;
721 PlayerStatus* playerStatus = &gPlayerStatus;
722 s32 sp50;
723 b32 showAddedBar;
724 s32 i;
725 s32 x;
726 s32 y;
727 s32 showStat;
728 s32 id;
729 s32 limit;
730 s32 s7;
731 s32 s1;
732 s32 spBars;
733 s32 maxStarPower;
734
739 ) {
740 return;
741 }
742
743 if (gGameStatusPtr->context == CONTEXT_WORLD && playerData->coins != statusBar->displayCoins) {
745 }
746
747 // update coin counter (+1 coin per frame for each 5-coin delta)
748 i = playerData->coins - statusBar->displayCoins;
749 if (i < 0) {
750 i = (i - 4) / 5;
751 } else {
752 i = (i + 4) / 5;
753 }
754 statusBar->displayCoins += i;
755
756 // show the status bar if HP has changed
757 if (statusBar->displayHP != playerData->curHP && !statusBar->ignoreChanges) {
758 if (statusBar->hidden) {
759 statusBar->showTimer = 70;
760 statusBar->hidden = FALSE;
761 statusBar->unk_3B = FALSE;
762 } else {
763 statusBar->showTimer = 70;
764 }
765 }
766
767 // show the status bar if FP has changed
768 if (statusBar->displayFP != playerData->curFP && !statusBar->ignoreChanges) {
769 if (statusBar->hidden) {
770 statusBar->showTimer = 70;
771 statusBar->hidden = FALSE;
772 statusBar->unk_3B = FALSE;
773 } else {
774 statusBar->showTimer = 70;
775 }
776 }
777
778 // show the status bar if star power has changed
779 if (statusBar->displayStarPower != playerData->starPower && !statusBar->ignoreChanges) {
780 if (statusBar->hidden) {
781 statusBar->showTimer = 70;
782 statusBar->hidden = FALSE;
783 statusBar->unk_3B = FALSE;
784 } else {
785 statusBar->showTimer = 70;
786 }
787 }
788
789 // sync displayed HP toward true HP
790 if (statusBar->displayHP != playerData->curHP) {
791 if (gGameStatusPtr->context == CONTEXT_WORLD && playerData->curHP < statusBar->displayHP) {
793 }
794 if (statusBar->displayHP < playerData->curHP) {
795 if (statusBar->drawPosY >= FULLY_EXTENDED_Y) {
796 if (gGameStatusPtr->frameCounter % 4 == 0) {
797 statusBar->displayHP++;
799 }
800 } else if (gGameStatusPtr->frameCounter % 4 == 0) {
801 statusBar->displayHP++;
802 }
803 } else if (gGameStatusPtr->frameCounter % 4 == 0) {
804 statusBar->displayHP--;
805 }
806 }
807
808 // sync displayed FP toward true FP
809 if (statusBar->displayFP != playerData->curFP) {
810 if (gGameStatusPtr->context == CONTEXT_WORLD && playerData->curFP < statusBar->displayFP) {
812 }
813 if (statusBar->displayFP < playerData->curFP) {
814 if (statusBar->drawPosY >= FULLY_EXTENDED_Y) {
815 if (gGameStatusPtr->frameCounter % 4 == 0) {
816 statusBar->displayFP++;
818 }
819 } else if (gGameStatusPtr->frameCounter % 4 == 0) {
820 statusBar->displayFP++;
821 }
822 } else if (gGameStatusPtr->frameCounter % 4 == 0) {
823 statusBar->displayFP--;
824 }
825 }
826
827 // sync displayed star power toward true star power
828 if (statusBar->displayStarPower != playerData->starPower) {
829 if (statusBar->displayStarPower < playerData->starPower) {
830 statusBar->displayStarPower += 10;
831 if (statusBar->displayStarPower > playerData->starPower) {
832 statusBar->displayStarPower = playerData->starPower;
833 }
834 } else {
835 statusBar->displayStarPower -= 10;
836 if (statusBar->displayStarPower < playerData->starPower) {
837 statusBar->displayStarPower = playerData->starPower;
838 }
839 }
840 }
841
842 if (statusBar->disabled) {
843 return;
844 }
845
846 if (statusBar->alwaysShown && statusBar->hidden && playerStatus->inputDisabledCount == 0) {
847 statusBar->showTimer = 42;
848 statusBar->hidden = FALSE;
849 statusBar->unk_3B = FALSE;
850 }
851
852 switch (statusBar->hidden) {
853 case FALSE:
854 statusBar->drawPosY += 10;
855 if (statusBar->drawPosY >= FULLY_EXTENDED_Y) {
856 statusBar->drawPosY = FULLY_EXTENDED_Y;
857 if (statusBar->unk_3C && statusBar->unk_3B && playerStatus->actionState != ACTION_STATE_IDLE) {
858 statusBar->showTimer = 0;
859 }
860 if (statusBar->showTimer != 0) {
861 statusBar->showTimer--;
862 } else {
863 if (!statusBar->ignoreChanges) {
864 if (!statusBar->unk_3B || playerStatus->actionState != ACTION_STATE_IDLE) {
866 statusBar->hidden = TRUE;
867 statusBar->showTimer = 0;
868 statusBar->unk_3C = FALSE;
869 }
870 }
871 }
872 }
873 }
874 break;
875 case TRUE:
876 statusBar->drawPosY -= 5;
877 if (statusBar->drawPosY < FULLY_RETRACTED_Y) {
878 statusBar->drawPosY = FULLY_RETRACTED_Y;
879 if (!statusBar->ignoreChanges) {
880 if (playerStatus->actionState != ACTION_STATE_IDLE) {
881 statusBar->showTimer = 0;
882 } else if (playerStatus->flags & (PS_FLAG_NO_STATIC_COLLISION | PS_FLAG_INPUT_DISABLED)) {
883 statusBar->showTimer = 0;
884 } else {
885 statusBar->showTimer++;
886 }
887
888 if (statusBar->showTimer >= 240 && gGameStatusPtr->context == CONTEXT_WORLD) {
889 statusBar->showTimer = 210;
890 statusBar->hidden = FALSE;
891 statusBar->unk_3B = TRUE;
892 statusBar->unk_3C = TRUE;
893 }
894 }
895 }
896 break;
897 }
898
899 gDPSetScissor(gMainGfxPos++, G_SC_NON_INTERLACE, 12, 20, SCREEN_WIDTH - 12, SCREEN_HEIGHT - 20);
900 x = statusBar->drawPosX;
901 y = statusBar->drawPosY;
902 draw_box(0, WINDOW_STYLE_5, x, y, 0, 174, 35, 255, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, NULL, NULL, NULL, SCREEN_WIDTH, SCREEN_HEIGHT, NULL);
903 draw_box(0, WINDOW_STYLE_6, x + 174, y, 0, 122, 25, 255, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, NULL, NULL, NULL, SCREEN_WIDTH, SCREEN_HEIGHT, NULL);
904
905 if (statusBar->hpBlinkTimeLeft > 0) {
906 statusBar->hpBlinkTimeLeft--;
907 if (statusBar->hpBlinkTimeLeft == 0) {
909 }
910 }
911
912 showStat = TRUE;
913 if (statusBar->hpBlinking != BLINK_OFF) {
914 if (statusBar->hpBlinkAnimTime > 8) {
915 showStat = FALSE;
916 if (statusBar->hpBlinkAnimTime > 12) {
917 statusBar->hpBlinkAnimTime = 0;
918 showStat = TRUE;
919 }
920 }
921 statusBar->hpBlinkAnimTime++;
922 }
923
924 if (showStat) {
925 id = statusBar->hpIconHIDs[0];
926 x = statusBar->drawPosX + 22;
927 y = statusBar->drawPosY + 13;
930
931 id = statusBar->hpIconHIDs[1];
932 x = statusBar->drawPosX + 37;
933 y = statusBar->drawPosY + 13;
936
937 x = statusBar->drawPosX + 48;
938 y = statusBar->drawPosY + 8;
939 status_bar_draw_stat(statusBar->hpTimesHID, x, y, statusBar->displayHP, playerData->curMaxHP);
940 }
941
942 if (statusBar->fpBlinkTimeLeft > 0) {
943 statusBar->fpBlinkTimeLeft--;
944 if (statusBar->fpBlinkTimeLeft == 0) {
946 }
947 }
948
949 showStat = TRUE;
950 if (statusBar->fpBlinking != BLINK_OFF) {
951 if (statusBar->fpBlinkAnimTime > 8) {
952 showStat = FALSE;
953 if (statusBar->fpBlinkAnimTime > 12) {
954 statusBar->fpBlinkAnimTime = 0;
955 showStat = TRUE;
956 }
957 }
958 statusBar->fpBlinkAnimTime++;
959 }
960
961 if (showStat) {
962 id = statusBar->fpIconHIDs[0];
963 x = statusBar->drawPosX + 110;
964 y = statusBar->drawPosY + 13;
967
968 id = statusBar->fpIconHIDs[1];
969 x = statusBar->drawPosX + 125;
970 y = statusBar->drawPosY + 13;
973
974 x = statusBar->drawPosX + 136;
975 y = statusBar->drawPosY + 8;
976 status_bar_draw_stat(statusBar->fpTimesHID, x, y, statusBar->displayFP, playerData->curMaxFP);
977 }
978
979 if (playerData->level >= 27) {
980 playerData->starPoints = 0;
981 }
982
983 showStat = TRUE;
984 if (statusBar->starpointsBlinking != BLINK_OFF) {
985 if (statusBar->starpointsBlinkAnimTime > 8) {
986 if (statusBar->starpointsBlinkAnimTime <= 12) {
987 showStat = FALSE;
988 } else {
989 statusBar->starpointsBlinkAnimTime = 0;
990 }
991 }
992 statusBar->starpointsBlinkAnimTime++;
993 }
994
995 if (showStat) {
996 id = statusBar->spIconHID;
997 x = statusBar->drawPosX + 195;
998 y = statusBar->drawPosY + 14;
1001
1002 id = statusBar->spShineHID;
1003 x = statusBar->drawPosX + 195;
1004 y = statusBar->drawPosY + 9;
1007
1008 x = statusBar->drawPosX + 200;
1009 y = statusBar->drawPosY + 8;
1010 status_bar_draw_number(statusBar->spTimesHID, x, y, playerData->starPoints, 2);
1011 }
1012
1013 if (statusBar->coinsBlinkTimeLeft > 0) {
1014 statusBar->coinsBlinkTimeLeft--;
1015 if (statusBar->coinsBlinkTimeLeft == 0) {
1017 }
1018 }
1019
1020 showStat = TRUE;
1021 if (statusBar->coinsBlinking != BLINK_OFF) {
1022 if (statusBar->coinsBlinkAnimTime > 8) {
1023 showStat = FALSE;
1024 if (statusBar->coinsBlinkAnimTime > 12) {
1025 statusBar->coinsBlinkAnimTime = 0;
1026 showStat = TRUE;
1027 }
1028 }
1029 statusBar->coinsBlinkAnimTime++;
1030 }
1031
1032 if (showStat) {
1033 id = statusBar->coinIconHID;
1034 x = statusBar->drawPosX + 244;
1035 y = statusBar->drawPosY + 14;
1038
1039 id = statusBar->coinSparkleHID;
1040 x = statusBar->drawPosX + 244;
1041 y = statusBar->drawPosY + 14;
1044
1045 x = statusBar->drawPosX + 247;
1046 y = statusBar->drawPosY + 8;
1047 status_bar_draw_number(statusBar->coinTimesHID, x, y, statusBar->displayCoins, 3);
1048 }
1049
1050 id = statusBar->starIconHID;
1051 showStat = TRUE;
1052 if (statusBar->starPowerBlinking != BLINK_OFF) {
1053 if (statusBar->starPowerBlinkCounter > 5) {
1054 if (statusBar->starPowerBlinkCounter <= 8) {
1055 showStat = FALSE;
1056 } else {
1057 statusBar->starPowerBlinkCounter = 0;
1058 showStat = TRUE;
1059 }
1060 }
1061 statusBar->starPowerBlinkCounter++;
1062 }
1063
1064 x = statusBar->drawPosX + 20;
1065 y = statusBar->drawPosY + 28;
1066
1067 spBars = statusBar->displayStarPower / SP_PER_BAR;
1068 limit = statusBar->displayStarPower % SP_PER_BAR;
1069 limit /= 32;
1070 limit += spBars * 8;
1071 if (statusBar->shimmerState == STATUS_SHIMMER_BEGIN) {
1072 spBars = playerData->starPower / SP_PER_BAR;
1073 limit = playerData->starPower % SP_PER_BAR;
1074 limit = limit / 32;
1075 limit += spBars * 8;
1076 star_power_shimmer_start(0, x + limit * 25 / 10, y, 1.0f);
1077 statusBar->shimmerState = STATUS_SHIMMER_ON;
1078 }
1079
1080 showAddedBar = FALSE;
1081 if (statusBar->shimmerState != STATUS_SHIMMER_OFF) {
1082 if (statusBar->shimmerTime != 0) {
1083 statusBar->shimmerTime--;
1084 } else {
1085 statusBar->shimmerState = STATUS_SHIMMER_OFF;
1086 }
1087 // creates a stipple pattern repeating 5x zero, 5x one, ...
1088 if ((statusBar->shimmerTime / 5) & 1) {
1089 showAddedBar = TRUE;
1090 }
1091 maxStarPower = statusBar->shimmerLimit; // required to match
1092 // added together, these just equal shimmerLimit
1093 s7 = statusBar->shimmerLimit % 8;
1094 s7 += (statusBar->shimmerLimit / 8) * 8;
1095 } else {
1096 s7 = limit;
1097 }
1098
1099 i = 0;
1100 sp50 = 0;
1101 s1 = 0;
1102
1103 if (statusBar->starPowerBlinking != BLINK_OFF) {
1104 if (!showStat) {
1105 s32 limit = statusBar->powBarsToBlink * 8;
1106 if (sp50 < limit) {
1107 while (TRUE) {
1108 i++; s1++; if (i >= limit) { break; }
1109 i++; s1++; if (i >= limit) { break; }
1110 i++; s1++; if (i >= limit) { break; }
1111 i++; s1++; if (i >= limit) { break; }
1112 i++; s1++; if (i >= limit) { break; }
1113 i++; s1++; if (i >= limit) { break; }
1114 i++; s1++; if (i >= limit) { break; }
1115 i++;
1116 s1 = 0;
1117 sp50++;
1118 if (i >= limit) {
1119 break;
1120 }
1121 }
1122 }
1123 }
1124 }
1125
1126 while (TRUE) {
1127 if (i >= limit || i >= s7 && !showAddedBar) {
1128 break;
1129 }
1130 i++;
1131
1133 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[0], y - 2);
1135
1136 s1++;
1137 if (i >= limit || i >= s7 && !showAddedBar) {
1138 break;
1139 }
1140 i++;
1142
1143 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[1], y - 2);
1145 s1++;
1146 if (i >= limit || i >= s7 && !showAddedBar) {
1147 break;
1148 }
1149 i++;
1151 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[2], y - 2);
1153 s1++;
1154 if (i >= limit || i >= s7 && !showAddedBar) {
1155 break;
1156 }
1157 i++;
1159 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[3], y - 2);
1161 s1++;
1162 if (i >= limit || i >= s7 && !showAddedBar) {
1163 break;
1164 }
1165 i++;
1167 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[4], y - 2);
1169 s1++;
1170
1171 if (i >= limit || i >= s7 && !showAddedBar) {
1172 break;
1173 }
1174 i++;
1176 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[5], y - 2);
1178 s1++;
1179
1180 if (i >= limit || i >= s7 && !showAddedBar) {
1181 break;
1182 }
1183 i++;
1185 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[6], y - 2);
1187 s1++;
1188
1189 if (i >= limit || i >= s7 && !showAddedBar) {
1190 break;
1191 }
1192 i++;
1194 hud_element_set_render_pos(id, x + 12 + sp50 * 20, y);
1196
1197 s1 = 0;
1198 sp50++;
1199 if (i >= limit || i >= s7 && !showAddedBar) {
1200 break;
1201 }
1202 }
1203
1204 maxStarPower = playerData->maxStarPower;
1205 limit = maxStarPower * 8;
1206 while (TRUE) {
1207 if (i >= limit) {
1208 break;
1209 }
1210 if (s1 == 0) {
1211 i++;
1213 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[s1], y - 2);
1215 if (i >= limit) {
1216 break;
1217 }
1218 s1 = 1;
1219 }
1220 if (s1 == 1) {
1221 i++;
1223 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[s1], y - 2);
1225 if (i >= limit) {
1226 break;
1227 }
1228 s1 = 2;
1229 }
1230 if (s1 == 2) {
1231 i++;
1233 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[s1], y - 2);
1235 if (i >= limit) {
1236 break;
1237 }
1238 s1 = 3;
1239 }
1240 if (s1 == 3) {
1241 i++;
1243 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[s1], y - 2);
1245 if (i >= limit) {
1246 break;
1247 }
1248 s1 = 4;
1249 }
1250 if (s1 == 4) {
1251 i++;
1253 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[s1], y - 2);
1255 if (i >= limit) {
1256 break;
1257 }
1258 s1 = 5;
1259 }
1260 if (s1 == 5) {
1261 i++;
1263 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[s1], y - 2);
1265 if (i >= limit) {
1266 break;
1267 }
1268 s1 = 6;
1269 }
1270 if (s1 == 6) {
1271 i++;
1273 hud_element_set_render_pos(id, x + sp50 * 20 + StatusBarSPIncrementOffsets[s1], y - 2);
1275 if (i >= limit) {
1276 break;
1277 }
1278 s1 = 7;
1279 }
1280
1281 if (s1 == 7) {
1282 i++;
1284 hud_element_set_render_pos(id, x + 12 + sp50 * 20, y);
1286 if (i >= limit) {
1287 break;
1288 }
1289 }
1290 s1 = 0;
1291 sp50++;
1292 }
1293
1296}
1297
1298void coin_counter_draw_content(UNK_TYPE arg0, s32 posX, s32 posY) {
1299 StatusBar* statusBar = &gStatusBar;
1300 s32 iconIndex;
1301
1302 if ((gPlayerData.coins != statusBar->displayCoins) && ((gGameStatusPtr->frameCounter % 3) == 0)) {
1304 }
1305
1306 iconIndex = statusBar->coinCountTimesHID;
1307 hud_element_set_render_pos(iconIndex, posX + 27, posY + 11);
1308 hud_element_draw_clipped(iconIndex);
1309
1310 iconIndex = statusBar->coinCountIconHID;
1311 hud_element_set_render_pos(iconIndex, posX + 15, posY + 11);
1312 hud_element_draw_clipped(iconIndex);
1313
1315}
1316
1318 StatusBar* statusBar = &gStatusBar;
1319
1320 if (statusBar->coinCountDisposeTime != 0) {
1321 statusBar->coinCountDisposeTime--;
1322 if ((statusBar->coinCountDisposeTime == 0) && (statusBar->iconIndex12 > -1)) {
1323 hud_element_free(statusBar->iconIndex12);
1324 hud_element_free(statusBar->iconIndex13);
1325 statusBar->iconIndex12 = -1;
1326 }
1327 HidingCoinCounter = FALSE;
1328 }
1329
1330 if (statusBar->coinCounterHideDelay == 0) {
1331 return;
1332 }
1333
1334 if ((statusBar->displayCoins == gPlayerData.coins) && (statusBar->coinCounterHideDelay > 30)) {
1335 statusBar->coinCounterHideDelay = 30;
1336 }
1337
1338 if ((statusBar->displayCoins == gPlayerData.coins) || (statusBar->coinCounterHideDelay <= 30)) {
1339 statusBar->coinCounterHideDelay--;
1340 if (statusBar->coinCounterHideDelay != 0) {
1341 return;
1342 }
1343
1345 statusBar->coinCountDisposeTime = 15;
1346 ShowingCoinCounter = FALSE;
1347 HidingCoinCounter = TRUE;
1348 statusBar->iconIndex12 = statusBar->coinCountTimesHID;
1349 statusBar->iconIndex13 = statusBar->coinCountIconHID;
1350 statusBar->displayCoins = gPlayerData.coins;
1351 if (statusBar->prevIgnoreChanges > -1) {
1352 statusBar->ignoreChanges = statusBar->prevIgnoreChanges;
1353 statusBar->prevIgnoreChanges = -1;
1354 }
1355 }
1356}
1357
1359 StatusBar* statusBar = &gStatusBar;
1360 HudElemID hid;
1361
1362 // if a coin counter is already visible, dispose of previous counter and reset state
1365 if (statusBar->iconIndex12 > -1) {
1368 statusBar->iconIndex12 = -1;
1369 }
1370 statusBar->coinCounterHideDelay = 0;
1371 statusBar->coinCountDisposeTime = 0;
1372 ShowingCoinCounter = FALSE;
1373 HidingCoinCounter = FALSE;
1374 }
1375
1376 if (statusBar->coinCounterHideDelay == 0) {
1381 hud_element_set_tint(hid, 255, 255, 255);
1384 hud_element_set_tint(hid, 255, 255, 255);
1385 statusBar->coinCounterHideDelay = 0;
1386
1387 if (statusBar->prevIgnoreChanges < 0) {
1388 statusBar->prevIgnoreChanges = statusBar->ignoreChanges;
1389 }
1390
1391 statusBar->ignoreChanges = TRUE;
1392 ShowingCoinCounter = TRUE;
1393 }
1394}
1395
1397 StatusBar* statusBar = &gStatusBar;
1398
1399 if (ShowingCoinCounter && (statusBar->coinCounterHideDelay == 0)) {
1400 statusBar->coinCounterHideDelay = 60;
1401 }
1402}
1403
1405 StatusBar* statusBar = &gStatusBar;
1406
1407 if (ShowingCoinCounter && (statusBar->coinCounterHideDelay == 0)) {
1408 statusBar->coinCounterHideDelay = 1;
1409 }
1410}
1411
1412API_CALLABLE(ShowCoinCounter) {
1413 if (evt_get_variable(script, *script->ptrReadPos)) {
1415 } else {
1417 }
1418
1419 return ApiStatus_DONE2;
1420}
1421
1422void draw_status_ui(void) {
1425
1426 #if DX_DEBUG_MENU
1427 dx_debug_menu_main();
1428 #endif
1429}
1430
1432 StatusBar* statusBar = &gStatusBar;
1433
1434 if (statusBar->hidden) {
1435 statusBar->showTimer = 210;
1436 statusBar->hidden = FALSE;
1437 statusBar->unk_3B = TRUE;
1438 }
1439}
1440
1442 StatusBar* statusBar = &gStatusBar;
1443
1444 if (statusBar->hidden) {
1445 statusBar->showTimer = 105;
1446 statusBar->hidden = FALSE;
1447 statusBar->unk_3B = TRUE;
1448 }
1449}
1450
1452 StatusBar* statusBar = &gStatusBar;
1453
1454 if (statusBar->hidden != TRUE) {
1455 statusBar->hidden = TRUE;
1456 statusBar->showTimer = 0;
1457 statusBar->unk_3B = TRUE;
1458 }
1459}
1460
1462 StatusBar* statusBar = &gStatusBar;
1463
1464 statusBar->drawPosY = FULLY_RETRACTED_Y;
1465 statusBar->ignoreChanges = FALSE;
1466 statusBar->showTimer = 0;
1467 statusBar->hidden = TRUE;
1468 statusBar->unk_3B = FALSE;
1469 statusBar->unk_3C = FALSE;
1470}
1471
1473 StatusBar* statusBar = &gStatusBar;
1474
1475 statusBar->drawPosY = 0;
1476 statusBar->ignoreChanges = FALSE;
1477 statusBar->showTimer = 210;
1478 statusBar->hidden = FALSE;
1479 statusBar->unk_3B = TRUE;
1480 statusBar->unk_3C = FALSE;
1481}
1482
1486
1490
1491// determine whether the player can open or close the status bar via button press
1494 return FALSE;
1495 }
1496
1497 if (gStatusBar.alwaysShown) {
1498 return FALSE;
1499 }
1500
1502 return FALSE;
1503 }
1504
1505 return TRUE;
1506}
1507
1511
1513 StatusBar* statusBar = &gStatusBar;
1514
1515 statusBar->ignoreChanges = TRUE;
1516 statusBar->drawPosY = FULLY_EXTENDED_Y;
1517}
1518
1522
1524 StatusBar* statusBar = &gStatusBar;
1525
1526 return statusBar->alwaysShown + statusBar->ignoreChanges;
1527}
1528
1530 gStatusBar.alwaysShown = TRUE;
1531}
1532
1534 gStatusBar.alwaysShown = FALSE;
1535}
1536
1538 return !gStatusBar.hidden;
1539}
1540
1542 StatusBar* statusBar = &gStatusBar;
1543
1545 statusBar->hpBlinkTimeLeft = 120;
1546 }
1547
1548 if (statusBar->hpBlinking != BLINK_ON) {
1549 statusBar->hpBlinking = BLINK_ON;
1550 statusBar->hpBlinkAnimTime = 0;
1551 }
1552}
1553
1555 StatusBar* statusBar = &gStatusBar;
1556
1557 if (statusBar->hpBlinking != BLINK_OFF) {
1558 statusBar->hpBlinking = BLINK_OFF;
1559 statusBar->hpBlinkAnimTime = 0;
1560 statusBar->hpBlinkTimeLeft = 0;
1561 }
1562}
1563
1565 StatusBar* statusBar = &gStatusBar;
1566
1568 statusBar->fpBlinkTimeLeft = 120;
1569 }
1570
1571 if (statusBar->fpBlinking != BLINK_ON) {
1572 statusBar->fpBlinking = BLINK_ON;
1573 statusBar->fpBlinkAnimTime = 0;
1574 }
1575}
1576
1578 StatusBar* statusBar = &gStatusBar;
1579
1580 if (statusBar->fpBlinking != BLINK_OFF) {
1581 statusBar->fpBlinking = BLINK_OFF;
1582 statusBar->fpBlinkAnimTime = 0;
1583 }
1584}
1585
1587 StatusBar* statusBar = &gStatusBar;
1588
1590 statusBar->coinsBlinkTimeLeft = 120;
1591 }
1592
1593 if (statusBar->coinsBlinking != BLINK_ON) {
1594 statusBar->coinsBlinking = BLINK_ON;
1595 statusBar->coinsBlinkAnimTime = 0;
1596 }
1597}
1598
1600 StatusBar* statusBar = &gStatusBar;
1601
1602 if (statusBar->coinsBlinking != BLINK_OFF) {
1603 statusBar->coinsBlinking = BLINK_OFF;
1604 statusBar->coinsBlinkAnimTime = 0;
1605 statusBar->coinsBlinkTimeLeft = 0;
1606 }
1607}
1608
1610 PlayerData* playerData = &gPlayerData;
1611 StatusBar* statusBar = &gStatusBar;
1612
1613 statusBar->powBarsToBlink = playerData->maxStarPower;
1614 if (statusBar->starPowerBlinking != BLINK_ON) {
1615 statusBar->starPowerBlinking = BLINK_ON;
1616 statusBar->starPowerBlinkCounter = 0;
1617 }
1618}
1619
1621 StatusBar* statusBar = &gStatusBar;
1622
1623 if (statusBar->starPowerBlinking != BLINK_OFF) {
1624 statusBar->starPowerBlinking = BLINK_OFF;
1625 statusBar->starPowerBlinkCounter = 0;
1626 }
1627}
1628
1629void status_bar_start_blinking_sp_bars(s32 numBarsToBlink) {
1630 StatusBar* statusBar = &gStatusBar;
1631
1632 statusBar->powBarsToBlink = numBarsToBlink;
1633 if (statusBar->starPowerBlinking != BLINK_ON) {
1634 statusBar->starPowerBlinking = BLINK_ON;
1635 statusBar->starPowerBlinkCounter = 0;
1636 }
1637}
1638
1640 StatusBar* statusBar = &gStatusBar;
1641
1642 if (statusBar->starpointsBlinking != BLINK_ON) {
1643 statusBar->starpointsBlinking = BLINK_ON;
1644 statusBar->starpointsBlinkAnimTime = 0;
1645 }
1646}
1647
1649 StatusBar* statusBar = &gStatusBar;
1650
1651 if (statusBar->starpointsBlinking != BLINK_OFF) {
1652 statusBar->starpointsBlinking = BLINK_OFF;
1653 statusBar->starpointsBlinkAnimTime = 0;
1654 }
1655}
1656
1658 StatusBar* statusBar = &gStatusBar;
1659
1660 if (statusBar->disabled > 0) {
1661 statusBar->disabled--;
1662 }
1663}
1664
1666 StatusBar* statusBar = &gStatusBar;
1667
1668 statusBar->disabled++;
1669}
1670
1672 PlayerData* playerData = &gPlayerData;
1673 StatusBar* statusBar = &gStatusBar;
1674
1675 statusBar->displayHP = playerData->curHP;
1676 statusBar->displayFP = playerData->curFP;
1677 statusBar->displayStarPower = playerData->starPower;
1678 statusBar->displayCoins = playerData->coins;
1679 statusBar->displayStarpoints = playerData->starPoints;
1680}
1681
1683 PlayerData* playerData = &gPlayerData;
1684 StatusBar* statusBar = &gStatusBar;
1685 s32 i;
1686
1687 statusBar->drawPosX = 12;
1688 statusBar->drawPosY = FULLY_RETRACTED_Y;
1689 statusBar->hidden = 0;
1690 statusBar->showTimer = 210;
1691 statusBar->unk_3B = FALSE;
1692 statusBar->ignoreChanges = FALSE;
1693 statusBar->openInputDisabled = FALSE;
1694 statusBar->alwaysShown = FALSE;
1695 statusBar->hpBlinking = BLINK_OFF;
1696 statusBar->hpBlinkAnimTime = 0;
1697 statusBar->hpBlinkTimeLeft = 0;
1698 statusBar->fpBlinking = BLINK_OFF;
1699 statusBar->fpBlinkAnimTime = 0;
1700 statusBar->fpBlinkTimeLeft = 0;
1701 statusBar->coinsBlinking = BLINK_OFF;
1702 statusBar->coinsBlinkAnimTime = 0;
1703 statusBar->coinsBlinkTimeLeft = 0;
1704 statusBar->starPowerBlinking = BLINK_OFF;
1705 statusBar->starPowerBlinkCounter = 0;
1706 statusBar->disabled = 0;
1707 statusBar->starpointsBlinking = BLINK_OFF;
1708 statusBar->starpointsBlinkAnimTime = 0;
1709 statusBar->prevIgnoreChanges = -1;
1710 statusBar->displayHP = playerData->curHP;
1711 statusBar->displayFP = playerData->curFP;
1712 statusBar->displayCoins = playerData->coins;
1713 statusBar->displayStarpoints = playerData->starPoints;
1714 statusBar->displayStarPower = playerData->starPower;
1715 statusBar->unk_3C = FALSE;
1716
1717 for (i = 0; i < ARRAY_COUNT(statusBar->hpIconHIDs); i++) {
1718 copy_world_hud_element_ref_to_battle(statusBar->hpIconHIDs[i], statusBar->hpIconHIDs[i]);
1719 }
1720
1721 for (i = 0; i < ARRAY_COUNT(statusBar->fpIconHIDs); i++) {
1722 copy_world_hud_element_ref_to_battle(statusBar->fpIconHIDs[i], statusBar->fpIconHIDs[i]);
1723 }
1724
1734}
1735
1736s32 is_ability_active(s32 ability) {
1737 PlayerData* playerData = &gPlayerData;
1738 s32 attackFXArray[6];
1739 s32 attackFXIndex;
1740 s32 badgeItemID;
1741 s32 badgeMoveID;
1742 s32 ret;
1743 s32 i;
1744
1745 ret = 0;
1746 attackFXIndex = 0;
1747
1748 for (i = 0; i < ARRAY_COUNT(attackFXArray); i++) {
1749 attackFXArray[i] = 0;
1750 }
1751
1753 return 0;
1754 }
1755
1756 for (i = 0; i < ARRAY_COUNT(playerData->equippedBadges); i++) {
1757 badgeItemID = playerData->equippedBadges[i];
1758 if (badgeItemID == ITEM_NONE)
1759 continue;
1760
1761 badgeMoveID = gItemTable[badgeItemID].moveID;
1762
1763 switch (ability) {
1765 if (badgeMoveID == MOVE_DODGE_MASTER) {
1766 ret++;
1767 }
1768 break;
1770 if (badgeMoveID == MOVE_SPIKE_SHIELD) {
1771 ret++;
1772 }
1773 break;
1775 if (badgeMoveID == MOVE_FIRST_ATTACK) {
1776 ret++;
1777 }
1778 break;
1779 case ABILITY_HP_PLUS:
1780 if (badgeMoveID == MOVE_HP_PLUS) {
1781 ret++;
1782 }
1783 break;
1784 case ABILITY_DOUBLE_DIP:
1785 if (badgeMoveID == MOVE_DOUBLE_DIP) {
1786 ret++;
1787 }
1788 break;
1790 if (badgeMoveID == MOVE_MYSTERY_SCROLL) {
1791 ret++;
1792 }
1793 if (playerData->hasActionCommands) {
1794 ret++;
1795 }
1796 break;
1798 if (badgeMoveID == MOVE_FIRE_SHIELD) {
1799 ret++;
1800 }
1801 break;
1803 if (badgeMoveID == MOVE_PRETTY_LUCKY) {
1804 ret++;
1805 }
1806 break;
1807 case ABILITY_HP_DRAIN:
1808 if (badgeMoveID == MOVE_HP_DRAIN) {
1809 ret++;
1810 }
1811 break;
1813 if (badgeMoveID == MOVE_ALLOR_NOTHING) {
1814 ret++;
1815 }
1816 break;
1817 case ABILITY_SLOW_GO:
1818 if (badgeMoveID == MOVE_SLOW_GO) {
1819 ret++;
1820 }
1821 break;
1822 case ABILITY_FP_PLUS:
1823 if (badgeMoveID == MOVE_FP_PLUS) {
1824 ret++;
1825 }
1826 break;
1827 case ABILITY_ICE_POWER:
1828 if (badgeMoveID == MOVE_ICE_POWER) {
1829 ret++;
1830 }
1831 break;
1833 if (badgeMoveID == MOVE_FEELING_FINE) {
1834 ret++;
1835 }
1836 break;
1837 case ABILITY_ATTACK_FX:
1838 if (badgeMoveID == MOVE_ATTACK_FX_A) {
1839 attackFXArray[attackFXIndex++] = 1;
1840 ret = -1;
1841 }
1842 if (badgeMoveID == MOVE_ATTACK_FX_D) {
1843 attackFXArray[attackFXIndex++] = 2;
1844 ret = -1;
1845 }
1846 if (badgeMoveID == MOVE_ATTACK_FX_B) {
1847 attackFXArray[attackFXIndex++] = 3;
1848 ret = -1;
1849 }
1850 if (badgeMoveID == MOVE_ATTACK_FX_E) {
1851 attackFXArray[attackFXIndex++] = 4;
1852 ret = -1;
1853 }
1854 if (badgeMoveID == MOVE_ATTACK_FX_C) {
1855 attackFXArray[attackFXIndex++] = 5;
1856 ret = -1;
1857 }
1858 if (badgeMoveID == MOVE_ATTACK_FX_F) {
1859 attackFXArray[attackFXIndex++] = 6;
1860 ret = -1;
1861 }
1862 break;
1864 if (badgeMoveID == MOVE_MONEY_MONEY) {
1865 ret++;
1866 }
1867 break;
1868 case ABILITY_CHILL_OUT:
1869 if (badgeMoveID == MOVE_CHILL_OUT_BADGE) {
1870 ret++;
1871 }
1872 break;
1874 if (badgeMoveID == MOVE_HAPPY_HEART) {
1875 ret++;
1876 }
1877 break;
1878 case ABILITY_ZAP_TAP:
1879 if (badgeMoveID == MOVE_ZAP_TAP) {
1880 ret++;
1881 }
1882 break;
1883 case ABILITY_MEGA_RUSH:
1884 if (badgeMoveID == MOVE_MEGA_RUSH) {
1885 ret++;
1886 }
1887 break;
1888 case ABILITY_BERSERKER:
1889 if (badgeMoveID == MOVE_BERSERKER) {
1890 ret++;
1891 }
1892 break;
1893 case ABILITY_RIGHT_ON:
1894 if (badgeMoveID == MOVE_RIGHT_ON) {
1895 ret++;
1896 }
1897 break;
1899 if (badgeMoveID == MOVE_RUNAWAY_PAY) {
1900 ret++;
1901 }
1902 break;
1904 if (badgeMoveID == MOVE_FLOWER_SAVER) {
1905 ret++;
1906 }
1907 break;
1908 case ABILITY_PAY_OFF:
1909 if (badgeMoveID == MOVE_PAY_OFF) {
1910 ret++;
1911 }
1912 break;
1914 if (badgeMoveID == MOVE_DEFEND_PLUS) {
1915 ret++;
1916 }
1917 break;
1918 case ABILITY_POWER_PLUS:
1919 if (badgeMoveID == MOVE_POWER_PLUS) {
1920 ret++;
1921 }
1922 break;
1923 case ABILITY_REFUND:
1924 if (badgeMoveID == MOVE_REFUND) {
1925 ret++;
1926 }
1927 break;
1928 case ABILITY_POWER_RUSH:
1929 if (badgeMoveID == MOVE_POWER_RUSH) {
1930 ret++;
1931 }
1932 break;
1934 if (badgeMoveID == MOVE_CRAZY_HEART) {
1935 ret++;
1936 }
1937 break;
1938 case ABILITY_LAST_STAND:
1939 if (badgeMoveID == MOVE_LAST_STAND) {
1940 ret++;
1941 }
1942 break;
1943 case ABILITY_CLOSE_CALL:
1944 if (badgeMoveID == MOVE_CLOSE_CALL) {
1945 ret++;
1946 }
1947 break;
1949 if (badgeMoveID == MOVE_P_UP_D_DOWN) {
1950 ret++;
1951 }
1952 break;
1953 case ABILITY_LUCKY_DAY:
1954 if (badgeMoveID == MOVE_LUCKY_DAY) {
1955 ret++;
1956 }
1957 break;
1959 if (badgeMoveID == MOVE_MEGA_HP_DRAIN) {
1960 ret++;
1961 }
1962 break;
1964 if (badgeMoveID == MOVE_P_DOWN_D_UP) {
1965 ret++;
1966 }
1967 break;
1969 if (badgeMoveID == MOVE_FLOWER_FANATIC) {
1970 ret++;
1971 }
1972 break;
1974 if (badgeMoveID == MOVE_SPEEDY_SPIN) {
1975 ret++;
1976 }
1977 break;
1979 if (badgeMoveID == MOVE_SPIN_ATTACK) {
1980 ret++;
1981 }
1982 break;
1983 case ABILITY_I_SPY:
1984 if (badgeMoveID == MOVE_I_SPY) {
1985 ret++;
1986 }
1987 break;
1989 if (badgeMoveID == MOVE_BUMP_ATTACK) {
1990 ret++;
1991 }
1992 break;
1994 if (badgeMoveID == MOVE_QUICK_CHANGE) {
1995 ret++;
1996 }
1997 break;
1999 if (badgeMoveID == MOVE_HEART_FINDER) {
2000 ret++;
2001 }
2002 break;
2004 if (badgeMoveID == MOVE_FLOWER_FINDER) {
2005 ret++;
2006 }
2007 break;
2009 if (badgeMoveID == MOVE_DIZZY_ATTACK) {
2010 ret++;
2011 }
2012 break;
2014 if (badgeMoveID == MOVE_UNUSED_FINAL_GOOMPA) {
2015 ret++;
2016 }
2017 break;
2019 if (badgeMoveID == MOVE_UNUSED_FINAL_BOBOMB) {
2020 ret++;
2021 }
2022 break;
2023 case ABILITY_DEEP_FOCUS:
2024 if (badgeMoveID == MOVE_DEEP_FOCUS) {
2025 ret++;
2026 }
2027 break;
2029 if (badgeMoveID == MOVE_SUPER_FOCUS) {
2030 ret++;
2031 }
2032 break;
2033 case ABILITY_KAIDEN:
2034 if (badgeMoveID == MOVE_KAIDEN) {
2035 ret++;
2036 }
2037 break;
2039 if (badgeMoveID == MOVE_DAMAGE_DODGE) {
2040 ret++;
2041 }
2042 break;
2044 if (badgeMoveID == MOVE_HAPPY_FLOWER) {
2045 ret++;
2046 }
2047 break;
2049 if (badgeMoveID == MOVE_GROUP_FOCUS) {
2050 ret++;
2051 }
2052 break;
2053 case ABILITY_PEEKABOO:
2054 if (badgeMoveID == MOVE_PEEKABOO) {
2055 ret++;
2056 }
2057 break;
2059 if (badgeMoveID == MOVE_HEALTHY_HEALTHY) {
2060 ret++;
2061 }
2062 break;
2063 }
2064 }
2065
2066 if (ret < 0) {
2067 ret = attackFXArray[rand_int(attackFXIndex - 1)];
2068 }
2069 return ret;
2070}
2071
2073 return 0;
2074}
2075
2076s32 add_coins(s32 amt) {
2077 PlayerData* playerData = &gPlayerData;
2078 s16 newCoins = playerData->coins + amt;
2079
2080 playerData->coins = newCoins;
2081 if (newCoins > 999) {
2082 playerData->coins = 999;
2083 }
2084 if (playerData->coins < 0) {
2085 playerData->coins = 0;
2086 }
2087
2088 if (amt > 0) {
2089 playerData->totalCoinsEarned += amt;
2090 if (playerData->totalCoinsEarned > 99999) {
2091 playerData->totalCoinsEarned = 99999;
2092 }
2093 }
2094 return playerData->coins;
2095}
2096
2097s32 add_star_points(s32 amt) {
2098 PlayerData* playerData = &gPlayerData;
2099 s8 newSP = playerData->starPoints + amt;
2100
2101 // TODO: probably a macro!
2102 playerData->starPoints = newSP;
2103 if (newSP > 100) {
2104 playerData->starPoints = 100;
2105 }
2106
2107 // TODO: probably a macro!
2108 newSP = playerData->starPoints;
2109 if (newSP < 0) {
2110 playerData->starPoints = 0;
2111 }
2112 return gPlayerData.starPoints;
2113}
2114
2115s32 add_star_pieces(s32 amt) {
2116 PlayerData* playerData = &gPlayerData;
2117 s32 newSP = playerData->starPieces;
2118
2119 newSP += amt;
2120 if (newSP > MAX_STAR_PIECES) {
2121 newSP = MAX_STAR_PIECES;
2122 }
2123 if (newSP < 0) {
2124 newSP = 0;
2125 }
2126 playerData->starPieces = newSP;
2127
2128 if (amt > 0) {
2129 playerData->starPiecesCollected += amt;
2130 }
2131
2132 return playerData->starPieces;
2133}
2134
2139
2140void set_max_star_power(s8 newMax) {
2141 gPlayerData.maxStarPower = newMax;
2142 gPlayerData.starPower = newMax * SP_PER_BAR;
2143}
2144
2145void add_star_power(s32 amt) {
2146 PlayerData* playerData = &gPlayerData;
2147 StatusBar* statusBar = &gStatusBar;
2148 s32 maxPower;
2149 s32 newPower;
2150
2152 statusBar->shimmerTime = 60;
2153
2154 if (playerData->starPower < 0) {
2155 statusBar->shimmerLimit = (playerData->starPower + 31) / SP_PER_SEG;
2156 } else {
2157 statusBar->shimmerLimit = playerData->starPower / SP_PER_SEG;
2158 }
2159
2160 playerData->starPower += amt;
2161
2162 maxPower = playerData->maxStarPower * SP_PER_BAR;
2163 if (playerData->starPower > maxPower) {
2164 playerData->starPower = maxPower;
2165 }
2166
2168}
2169
2170s32 recover_fp(s32 amt) {
2171 if (amt == -2) {
2174 } else if (amt == -1) {
2176 } else {
2177 if (amt > 0) {
2178 gPlayerData.curFP += amt;
2179 }
2182 }
2183 }
2184 return gPlayerData.curFP;
2185}
2186
2187s32 recover_hp(s32 amt) {
2188 if (amt == -2) {
2191 } else if (amt == -1) {
2193 } else {
2194 if (amt > 0) {
2195 gPlayerData.curHP += amt;
2196 }
2199 }
2200 }
2201 return gPlayerData.curHP;
2202}
2203
2204void subtract_hp(s32 amt) {
2205 PlayerData* playerData = &gPlayerData;
2206 s32 newHP = playerData->curHP;
2207
2208 if (amt > 0) {
2209 newHP -= amt;
2210 }
2211 if (amt < 0 || newHP < 1) {
2212 newHP = 1;
2213 }
2214 playerData->curHP = newHP;
2215}
2216
2217s8 has_full_hp(void) {
2219}
2220
2221s8 has_full_fp(void) {
2223}
HudElemID spShineHID
s16 equippedBadges[64]
s16 badges[128]
HudElemID iconIndex13
HudElemID spTimesHID
HudElemID hpTimesHID
s8 starPowerBlinkCounter
s16 storedItems[32]
PartnerData partners[12]
s8 starpointsBlinkAnimTime
s16 displayStarpoints
s8 coinCountDisposeTime
HudElemID coinCountTimesHID
HudElemID hpIconHIDs[2]
s32 partnerUsedTime[12]
HudElemID coinIconHID
u16 actionCommandSuccesses
s32 HudElemID
s32 b32
HudElemID coinTimesHID
HudElemID coinCountIconHID
HudElemID coinSparkleHID
s16 b16
u16 starPiecesCollected
HudElemID starIconHID
HudElemID iconIndex12
HudElemID fpIconHIDs[2]
s32 partnerUnlockedTime[12]
u16 actionCommandAttempts
s8 coinCounterHideDelay
s16 keyItems[32]
HudElemID spIconHID
HudElemID fpTimesHID
s16 invItems[10]
#define rand_int
#define draw_box
@ MERLEE_SPELL_NONE
Definition enums.h:1910
@ WINDOW_STYLE_5
Definition enums.h:6374
@ WINDOW_STYLE_6
Definition enums.h:6375
@ DRAW_NUMBER_STYLE_ALIGN_RIGHT
drawn to the left of posX
Definition enums.h:5392
@ DRAW_NUMBER_STYLE_MONOSPACE
Definition enums.h:5393
@ PEACH_FLAG_IS_PEACH
Definition enums.h:2488
@ STORY_EPILOGUE
Definition enums.h:234
@ LANGUAGE_DE
Definition enums.h:6400
@ LANGUAGE_ES
Definition enums.h:6402
@ LANGUAGE_EN
Definition enums.h:6399
@ LANGUAGE_FR
Definition enums.h:6401
@ WINDOW_PRIORITY_21
Definition enums.h:3187
@ MSG_PAL_STANDARD
Definition enums.h:5414
@ WINDOW_UPDATE_HIDE
Definition enums.h:5311
@ PS_FLAG_NO_STATIC_COLLISION
Definition enums.h:3051
@ PS_FLAG_INPUT_DISABLED
Definition enums.h:3052
@ DRAW_NUMBER_CHARSET_THIN
Definition enums.h:5400
@ INTRO_PART_0
Definition enums.h:3551
@ PARTNER_RANK_NORMAL
Definition enums.h:2018
@ CONTEXT_WORLD
Definition enums.h:3528
@ ABILITY_BERSERKER
Definition enums.h:457
@ ABILITY_FLOWER_SAVER
Definition enums.h:460
@ ABILITY_QUICK_CHANGE
Definition enums.h:462
@ ABILITY_DEEP_FOCUS
Definition enums.h:484
@ ABILITY_BUMP_ATTACK
Definition enums.h:478
@ ABILITY_FEELING_FINE
Definition enums.h:450
@ ABILITY_ATTACK_FX
Definition enums.h:451
@ ABILITY_FLOWER_FINDER
Definition enums.h:480
@ ABILITY_P_DOWN_D_UP
Definition enums.h:473
@ ABILITY_FP_PLUS
Definition enums.h:448
@ ABILITY_MEGA_HP_DRAIN
Definition enums.h:472
@ ABILITY_DOUBLE_DIP
Definition enums.h:441
@ ABILITY_PAY_OFF
Definition enums.h:461
@ ABILITY_POWER_RUSH
Definition enums.h:466
@ ABILITY_SPIN_ATTACK
Definition enums.h:476
@ ABILITY_CHILL_OUT
Definition enums.h:453
@ ABILITY_MONEY_MONEY
Definition enums.h:452
@ ABILITY_FLOWER_FANATIC
Definition enums.h:474
@ ABILITY_REFUND
Definition enums.h:465
@ ABILITY_PEEKABOO
Definition enums.h:490
@ ABILITY_POWER_PLUS
Definition enums.h:464
@ ABILITY_CLOSE_CALL
Definition enums.h:469
@ ABILITY_HEALTHY_HEALTHY
Definition enums.h:491
@ ABILITY_MEGA_RUSH
Definition enums.h:456
@ ABILITY_HEART_FINDER
Definition enums.h:479
@ ABILITY_DIZZY_ATTACK
Definition enums.h:481
@ ABILITY_DEFEND_PLUS
Definition enums.h:463
@ ABILITY_HP_PLUS
Definition enums.h:440
@ ABILITY_FINAL_GOOMPA
Definition enums.h:482
@ ABILITY_I_SPY
Definition enums.h:477
@ ABILITY_DAMAGE_DODGE
Definition enums.h:487
@ ABILITY_SPIKE_SHIELD
Definition enums.h:438
@ ABILITY_KAIDEN
Definition enums.h:486
@ ABILITY_ZAP_TAP
Definition enums.h:455
@ ABILITY_LAST_STAND
Definition enums.h:468
@ ABILITY_P_UP_D_DOWN
Definition enums.h:470
@ ABILITY_HAPPY_HEART
Definition enums.h:454
@ ABILITY_FIRE_SHIELD
Definition enums.h:443
@ ABILITY_DODGE_MASTER
Definition enums.h:436
@ ABILITY_FINAL_BOBOMB
Definition enums.h:483
@ ABILITY_ICE_POWER
Definition enums.h:449
@ ABILITY_LUCKY_DAY
Definition enums.h:471
@ ABILITY_CRAZY_HEART
Definition enums.h:467
@ ABILITY_SUPER_FOCUS
Definition enums.h:485
@ ABILITY_ALL_OR_NOTHING
Definition enums.h:446
@ ABILITY_HAPPY_FLOWER
Definition enums.h:488
@ ABILITY_RUNAWAY_PAY
Definition enums.h:459
@ ABILITY_PRETTY_LUCKY
Definition enums.h:444
@ ABILITY_RIGHT_ON
Definition enums.h:458
@ ABILITY_HP_DRAIN
Definition enums.h:445
@ ABILITY_MYSTERY_SCROLL
Definition enums.h:442
@ ABILITY_FIRST_ATTACK
Definition enums.h:439
@ ABILITY_GROUP_FOCUS
Definition enums.h:489
@ ABILITY_SLOW_GO
Definition enums.h:447
@ ABILITY_SPEEDY_SPIN
Definition enums.h:475
@ SOUND_FLOWER_PICKUP
Definition enums.h:927
@ SOUND_COIN_PICKUP
Definition enums.h:922
@ SOUND_HEART_PICKUP
Definition enums.h:924
@ PARTNER_NONE
Definition enums.h:2885
@ ACTION_STATE_IDLE
Definition enums.h:2426
@ DEMO_STATE_NONE
Definition enums.h:3534
@ WIN_CURRENCY_COUNTER
Definition enums.h:5260
#define ApiStatus_DONE2
Definition evt.h:118
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1689
void basic_hidden_window_update(s32 windowIndex, s32 *flags, s32 *posX, s32 *posY, s32 *posZ, f32 *scaleX, f32 *scaleY, f32 *rotX, f32 *rotY, f32 *rotZ, s32 *darkening, s32 *opacity)
Definition windows.c:184
void set_window_update(s32 panelID, s32)
Definition windows.c:434
void basic_window_update(s32 windowIndex, s32 *flags, s32 *posX, s32 *posY, s32 *posZ, f32 *scaleX, f32 *scaleY, f32 *rotX, f32 *rotY, f32 *rotZ, s32 *darkening, s32 *opacity)
Definition windows.c:161
void star_power_shimmer_update(void)
void star_power_shimmer_start(s32, f32, f32, f32)
void set_window_properties(s32 panelID, s32 posX, s32 posY, s32 width, s32 height, u8, void *drawContents, void *drawContentsArg, s8 parent)
Definition windows.c:373
void star_power_shimmer_init(void)
void star_power_shimmer_draw(void)
void draw_number(s32 value, s32 x, s32 y, s32 variableWidthChars, s32 palette, s32 opacity, u16 style)
Definition msg.c:2223
HudScript HES_StatusCoin
HudScript HES_MenuTimes
void hud_element_set_script(s32 id, HudScript *anim)
void hud_element_draw_next(s32 id)
void hud_element_set_tint(s32 id, s32 r, s32 g, s32 b)
void hud_element_set_render_pos(s32 id, s32 x, s32 y)
s32 hud_element_create(HudScript *anim)
Creates a new HUD element and returns its ID.
void hud_element_set_flags(s32 id, s32 flags)
Turns on the given flags.
void hud_element_clear_flags(s32 id, s32 flags)
Turns off the given flags.
void hud_element_draw_clipped(s32 id)
void hud_element_free(s32 id)
void copy_world_hud_element_ref_to_battle(s32 worldID, s32 battleID)
@ HUD_ELEMENT_FLAG_DISABLED
Definition hud_element.h:72
@ HUD_ELEMENT_FLAG_80
Definition hud_element.h:78
@ HUD_ELEMENT_FLAG_FILTER_TEX
Definition hud_element.h:86
s32 HudScript[]
Definition hud_element.h:9
b32 can_control_status_bar(void)
Definition inventory.c:1492
void setup_status_bar_for_world(void)
Definition inventory.c:1461
void show_coin_counter(void)
Definition inventory.c:1358
s32 find_item(s32 itemID)
Search player inventory for itemID and return first matching array index.
Definition inventory.c:264
#define FULLY_RETRACTED_Y
Definition inventory.c:7
void status_bar_start_blinking_hp(void)
Definition inventory.c:1541
s32 recover_hp(s32 amt)
Recover player HP.
Definition inventory.c:2187
HudScript * TimesHudScript
Definition partners.c:146
HudScript HES_StatusHP_de
s32 add_star_pieces(s32 amt)
Definition inventory.c:2115
HudScript HES_StatusHP
HudScript * SlashHudScript
Definition partners.c:147
HudScript HES_StatusFP_de
HudScript * DigitHudScripts[10]
Definition partners.c:142
void status_bar_ignore_changes(void)
Definition inventory.c:1508
void reset_status_bar(void)
Definition inventory.c:1682
s32 store_item(s32 itemID)
Add itemID to player storage and return slot in which it was placed.
Definition inventory.c:375
void setup_status_bar_for_battle(void)
Definition inventory.c:1472
void enable_status_bar_input(void)
Definition inventory.c:1483
void status_bar_start_blinking_fp(void)
Definition inventory.c:1564
HudScript HES_StatusStar1
HudScript HES_StatusFP
s32 recover_fp(s32 amt)
Recover player FP.
Definition inventory.c:2170
s32 is_partner_ability_active(s32 ability)
Definition inventory.c:2072
void sort_consumables(void)
Bubbles up player inventory items such that all ITEM_NONE values are at the bottom.
Definition inventory.c:410
void decrement_status_bar_disabled(void)
Definition inventory.c:1657
void update_coin_counter(void)
Definition inventory.c:1317
void hide_coin_counter(void)
Definition inventory.c:1396
void sync_status_bar(void)
Definition inventory.c:1671
void status_bar_stop_blinking_hp(void)
Definition inventory.c:1554
void open_status_bar_quickly(void)
Definition inventory.c:1441
s32 get_consumables_empty(void)
Definition inventory.c:442
BlinkModes
Definition inventory.c:9
@ BLINK_ON
Definition inventory.c:11
@ BLINK_OFF
Definition inventory.c:10
HudScript * SPStarHudScripts[]
Definition partners.c:152
HudScript HES_StatusStarEmpty
s32 count_item(s32 itemID)
Search player inventory for itemID and count the number matches.
Definition inventory.c:310
HudScript * SPIncrementHudScripts[]
Definition partners.c:148
HudScript HES_StatusSPShine
s8 has_full_fp(void)
Definition inventory.c:2221
void close_status_bar(void)
Definition inventory.c:1451
HudScript HES_StatusStarPoint
HudScript HES_StatusHP_es
void status_bar_stop_blinking_sp(void)
Definition inventory.c:1620
void update_status_bar(void)
Definition inventory.c:718
void increment_max_star_power(void)
Definition inventory.c:2135
b32 is_badge_equipped(s32 itemID)
Definition inventory.c:393
void status_bar_show_and_ignore_changes(void)
Definition inventory.c:1512
s8 has_full_hp(void)
Definition inventory.c:2217
void status_bar_stop_blinking_starpoints(void)
Definition inventory.c:1648
s32 StatusBarSPIncrementOffsets[]
Definition partners.c:156
s32 add_star_points(s32 amt)
Definition inventory.c:2097
HudScript HES_StatusCoinSparkle
BSS b16 HidingCoinCounter
Definition inventory.c:21
void disable_status_bar_input(void)
Definition inventory.c:1487
s32 remove_item(s32 itemID)
Remove first instance of itemID found in player inventory.
Definition inventory.c:204
void status_bar_start_blinking_starpoints(void)
Definition inventory.c:1639
void status_bar_stop_blinking_fp(void)
Definition inventory.c:1577
void status_bar_draw_number(s32 iconID, s32 startX, s32 startY, s32 value, s32 numDigits)
Definition inventory.c:624
void status_bar_stop_blinking_coins(void)
Definition inventory.c:1599
HudScript HES_StatusFP_fr
s32 get_stored_empty(void)
Definition inventory.c:459
s32 get_stored_count(void)
Definition inventory.c:446
HudScript HES_StatusTimes
void status_bar_start_blinking_sp(void)
Definition inventory.c:1609
void set_max_star_power(s8 newMax)
Definition inventory.c:2140
void subtract_hp(s32 amt)
Definition inventory.c:2204
void status_bar_always_show_off(void)
Definition inventory.c:1533
s32 get_consumables_count(void)
Definition inventory.c:429
void clear_player_data(void)
Definition inventory.c:55
ShimmerStates
Definition inventory.c:14
@ STATUS_SHIMMER_OFF
Definition inventory.c:15
@ STATUS_SHIMMER_BEGIN
Definition inventory.c:16
@ STATUS_SHIMMER_ON
Definition inventory.c:17
void hide_coin_counter_immediately(void)
Definition inventory.c:1404
s32 status_bar_is_ignoring_changes(void)
Definition inventory.c:1523
HudScript HES_StatusHP_fr
void status_bar_draw_stat(s32 id, s32 startX, s32 startY, s32 currentValue, s32 maxValue)
Definition inventory.c:662
StatusBar gStatusBar
Definition inventory.c:23
HudScript HES_StatusFP_es
void enforce_hpfp_limits(void)
Definition inventory.c:463
s32 is_status_bar_visible(void)
Definition inventory.c:1537
s32 add_coins(s32 amt)
Definition inventory.c:2076
void open_status_bar_slowly(void)
Definition inventory.c:1431
void initialize_status_bar(void)
Definition inventory.c:483
void coin_counter_draw_content(UNK_TYPE arg0, s32 posX, s32 posY)
Definition inventory.c:1298
b32 has_item(s32 itemID)
Check whether player has itemID in their inventory.
Definition inventory.c:343
HudScript HES_StatusHeart
BSS b16 ShowingCoinCounter
Definition inventory.c:20
HudScript HES_StatusSPEmptyIncrement
HudScript HES_StatusFlower
void status_bar_start_blinking_coins(void)
Definition inventory.c:1586
s32 is_ability_active(s32 ability)
Definition inventory.c:1736
#define FULLY_EXTENDED_Y
Definition inventory.c:6
void status_bar_respond_to_changes(void)
Definition inventory.c:1519
void status_bar_always_show_on(void)
Definition inventory.c:1529
void increment_status_bar_disabled(void)
Definition inventory.c:1665
void draw_status_ui(void)
Definition inventory.c:1422
void status_bar_start_blinking_sp_bars(s32 numBarsToBlink)
Definition inventory.c:1629
void add_star_power(s32 amt)
Definition inventory.c:2145
s32 add_item(s32 itemID)
Add itemID to player inventory and return inventory slot in which it was placed.
Definition inventory.c:152
void sfx_play_sound(s32 soundID)
Definition sfx.c:517
@ GB_StoryProgress
ApiStatus ShowCoinCounter(Evt *script, b32 isInitialCall)
#define SCREEN_WIDTH
Definition macros.h:109
#define BSS
Definition macros.h:7
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define SCREEN_HEIGHT
Definition macros.h:110
#define SP_PER_SEG
Definition macros.h:103
#define MAX_STAR_PIECES
Definition macros.h:100
#define SP_PER_BAR
Definition macros.h:102
#define UNK_TYPE
Definition types.h:6
ItemData gItemTable[]
#define gCurrentLanguage
Definition variables.h:115
GameStatus * gGameStatusPtr
Definition main_loop.c:32
Gfx * gMainGfxPos
Definition cam_main.c:15
PlayerData gPlayerData
Definition 77480.c:40
PlayerStatus gPlayerStatus
Definition 77480.c:39