Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
190B20.c
Go to the documentation of this file.
1#include "common.h"
2#include "nu/nusys.h"
3#include "effects.h"
4#include "battle/battle.h"
5#include "script_api/battle.h"
6#include "model.h"
7#include "sprite.h"
8
10
12
21
23 0, 0, 0, 0,
24 0, 0, 0, 0,
25 0, 0, 0, 0,
26 0, 0, 0, 0,
27 0, 0, 0, 0,
28 0, 0, 0, 0,
29};
30
43
45
46// from 17D6A0
47extern s32 bMarioDefenseTable[];
48extern s32 bPlayerStatusTable[];
51
53
55
57 s32 numTargets = 0;
60 Actor* playerActor = battleStatus->playerActor;
61 Actor* partnerActor = battleStatus->partnerActor;
66 s8* targetIndexList;
67 s32 numParts;
68 s32 i, j;
69 f32 targetX, targetY, targetZ;
70 f32 f2, f12, f14;
77
78 // a target has been manually selected
79 if (battleStatus->curTargetListFlags & TARGET_FLAG_OVERRIDE) {
80 actor->targetListLength = -1;
81 return;
82 }
83
84 // ------------------------------------------------------------------------
85 // build a list of all possible targets from the appropriate actor classes
86
87 // try adding the player
88 if (battleStatus->curTargetListFlags & TARGET_FLAG_PLAYER) {
90 targetDataList->partID = 1;
91 if (!targetHomePos) {
92 targetDataList->truePos.x = playerActor->curPos.x + playerActor->size.x * 0.3 * playerActor->scalingFactor;
93 targetDataList->truePos.y = playerActor->curPos.y + playerActor->size.y * 0.9 * playerActor->scalingFactor;
94 targetDataList->truePos.z = playerActor->curPos.z;
95 } else {
96 targetDataList->truePos.x = playerActor->homePos.x + playerActor->size.x * 0.3 * playerActor->scalingFactor;
97 targetDataList->truePos.y = playerActor->homePos.y + playerActor->size.y * 0.9 * playerActor->scalingFactor;
98 targetDataList->truePos.z = playerActor->homePos.z;
99 }
100 targetDataList->priorityOffset = -100;
101 numTargets++;
103 }
104
105 // try adding the partner
106 if (battleStatus->curTargetListFlags & TARGET_FLAG_PARTNER) {
107 if (partnerActor != NULL) {
108 targetDataList->actorID = ACTOR_PARTNER;
109 targetDataList->partID = 1;
110 if (!targetHomePos) {
111 targetDataList->truePos.x = partnerActor->curPos.x + partnerActor->size.x * 0.1 * partnerActor->scalingFactor;
112 targetDataList->truePos.y = partnerActor->curPos.y + partnerActor->size.y * 0.8 * partnerActor->scalingFactor;
113 targetDataList->truePos.z = partnerActor->curPos.z;
114 } else {
115 targetDataList->truePos.x = partnerActor->homePos.x + partnerActor->size.x * 0.1 * partnerActor->scalingFactor;
116 targetDataList->truePos.y = partnerActor->homePos.y + partnerActor->size.y * 0.8 * partnerActor->scalingFactor;
117 targetDataList->truePos.z = partnerActor->homePos.z;
118 }
119 targetDataList->priorityOffset = -50;
120 numTargets++;
122 }
123 }
124
125 // try adding enemies
126 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
127 targetActor = battleStatus->enemyActors[i];
128 if (targetActor == NULL) {
129 continue;
130 }
131 if ((battleStatus->curTargetListFlags & TARGET_FLAG_PARTNER) || (battleStatus->curTargetListFlags & TARGET_FLAG_PLAYER)) {
132 // skip adding enemies if either player or partner targeting is set
133 break;
134 }
135 // check each part of the current enemy
136 targetPart = targetActor->partsTable;
137 numParts = targetActor->numParts;
138 for (j = 0; j < numParts; targetPart = targetPart->nextPart, j++) {
139 if (!(targetPart->flags & ACTOR_PART_FLAG_NO_TARGET)) {
141
143 sampleRow = !targetHomePos; // required to match
144 if (sampleRow) {
145 targetX = targetActor->curPos.x;
146 targetY = targetActor->curPos.y;
147 targetZ = targetActor->curPos.z;
148 } else {
149 targetX = targetActor->homePos.x;
150 targetY = targetActor->homePos.y;
151 targetZ = targetActor->homePos.z;
152 }
153 targetX += targetPart->partOffset.x * targetActor->scalingFactor;
154 if (!(targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
155 targetY += targetPart->partOffset.y * targetActor->scalingFactor;
156 }
157 targetZ += targetPart->partOffset.z * targetActor->scalingFactor;
158 f12 = targetX;
159 targetX = targetActor->scalingFactor;
160 targetX = f12 + targetPart->targetOffset.x * targetX;
161 f2 = targetY;
162 f14 = targetZ + 5.0f;
163 if (!(targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
164 targetY = f2 + targetPart->targetOffset.y * targetActor->scalingFactor;
165 }
166 } else {
167 targetY = targetPart->absolutePos.y;
168 targetZ = targetPart->absolutePos.z;
169 f12 = targetPart->absolutePos.x;
170 f2 = targetY;
171 f14 = targetZ + 5.0f;
172 targetX = f12 + targetPart->targetOffset.x;
173 if (!(targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
174 targetY = f2 + targetPart->targetOffset.y;
175 }
176 }
177
178 targetDataList->actorID = ACTOR_CLASS_ENEMY | i;
179 targetDataList->partID = partBlueprint->index;
180 targetDataList->truePos.x = targetX;
181 targetDataList->truePos.y = targetY;
182 targetDataList->truePos.z = targetZ;
183 targetDataList->priorityOffset = 0;
184
186 targetDataList->priorityOffset = 100;
187 }
188 targetDataList->priorityOffset += targetPart->targetPriorityOffset;
189 targetDataList->sortPos.x = f12 + targetDataList->priorityOffset * 100;
190 targetDataList->sortPos.y = f2;
191 targetDataList->sortPos.z = f14;
192
193 // determine nearest target row
194 if (targetDataList->sortPos.y < 40) {
195 targetDataList->row = 0;
196 } else if (targetDataList->sortPos.y < 85) {
197 targetDataList->row = 1;
198 } else if (targetDataList->sortPos.y < 100) {
199 targetDataList->row = 2;
200 } else {
201 targetDataList->row = 3;
202 }
203
204 // determine nearest target column
205 if (targetDataList->sortPos.x < 25) {
206 targetDataList->column = 0;
207 } else if (targetDataList->sortPos.x < 65) {
208 targetDataList->column = 1;
209 } else if (targetDataList->sortPos.x < 105) {
210 targetDataList->column = 2;
211 } else {
212 targetDataList->column = 3;
213 }
214
215 // determine nearest target layer
216 if (targetDataList->sortPos.z < -30) {
217 targetDataList->layer = 0;
218 } else {
219 targetDataList->layer = 1;
220 }
221
222 numTargets++;
224 }
225 }
226 }
227
228 // ------------------------------------------------------------------------
229 // remove targets based on simple criteria (coarse pass)
230
231 actor->selectedTargetIndex = 0;
233
234 sampleCol = battleStatus->sampleTargetHomeIndex % 4;
235 sampleRow = battleStatus->sampleTargetHomeIndex / 4;
236
237 targetDataList = actor->targetData;
239
240 // remove targets, first pass
241 for (i = 0; i < numTargets; i++) {
243 targetActor = get_actor(target->actorID);
245
246 // always keep player and partner actors
247 if (target->actorID == ACTOR_PLAYER || target->actorID == ACTOR_PARTNER) {
248 continue;
249 }
250
251 // sanity check condition -- function should never reach this point with this flag set
252 if (battleStatus->curTargetListFlags & TARGET_FLAG_OVERRIDE) {
255 }
256
257 // skip any target if the battle is dark
258 if (!(gBattleStatus.flags2 & BS_FLAGS2_IGNORE_DARKNESS) && battleStatus->darknessMode > 0) {
260 if (overlayZoom >= 215.0f) {
264 }
265 }
266
267 // skip targets not designated as the primary target for this actor
268 if (battleStatus->curTargetListFlags & TARGET_FLAG_PRIMARY_ONLY) {
272 ) {
275 }
276 }
277
278 // target passed all checks, do not remove
280
282 if (removeTarget) {
283 for (j = i; j < numTargets - 1; j++) {
284 actor->targetData[j] = actor->targetData[j + 1];
285 }
286 numTargets--;
287 i--;
288 }
289 }
290
291 // ------------------------------------------------------------------------
292 // remove targets based on target flag criteria (fine pass)
293
294 for (i = 0; i < numTargets; i++) {
296 targetActor = get_actor(target->actorID);
298
299 // always keep player and partner actors
300 if (target->actorID == ACTOR_PLAYER || target->actorID == ACTOR_PARTNER) {
301 continue;
302 }
303 if ((battleStatus->curTargetListFlags & TARGET_FLAG_JUMP_LIKE) && (targetPart->targetFlags & ACTOR_PART_TARGET_NO_JUMP)) {
306 }
307 if ((battleStatus->curTargetListFlags & TARGET_FLAG_SMASH_LIKE) && (targetPart->targetFlags & ACTOR_PART_TARGET_NO_SMASH)) {
310 }
311 if ((battleStatus->curTargetListFlags & TARGET_FLAG_TATTLE) && ((targetActor->flags & ACTOR_FLAG_NO_TATTLE) || (targetPart->flags & ACTOR_PART_FLAG_NO_TATTLE))) {
314 }
315 if ((battleStatus->curTargetListFlags & TARGET_FLAG_AIRLIFT) && (targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
318 }
319 if (!(battleStatus->curTargetListFlags & TARGET_FLAG_ALLOW_TARGET_ONLY) && (targetActor->flags & ACTOR_FLAG_TARGET_ONLY)) {
322 }
323 if ((battleStatus->curTargetListFlags & TARGET_FLAG_NO_CEILING) && (targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
326 }
327 if ((battleStatus->curTargetListFlags & TARGET_FLAG_GROUND) && target->row != 0) {
330 }
331 if ((battleStatus->curTargetListFlags & TARGET_FLAG_NOT_HIGH) && target->row >= 2) {
334 }
335 if ((battleStatus->curTargetListFlags & TARGET_FLAG_NOT_GROUND) && target->row <= 0) {
338 }
339
340 if ((battleStatus->curTargetListFlags & TARGET_FLAG_NOT_BELOW)
342 ) {
343 // search the target list for any targets below the current target (same column, higher row)
344 // skip the current target if any are found
346
347 for (j = 0; j < numTargets; j++) {
349 if (target != otherTarget) {
350 if (target->layer == otherTarget->layer
351 && target->column == otherTarget->column
352 && target->row < otherTarget->row
353 ) {
355 break;
356 }
357 }
358 }
359
360 if (foundAbove) {
363 }
364 }
365
366 if (battleStatus->curTargetListFlags & TARGET_FLAG_NOT_BEHIND) {
367 // search the target list for any targets in front of the current target (same row, lower column)
368 // skip the current target if any are found
370
371 for (j = 0; j < numTargets; j++) {
373 if (target != otherTarget) {
374 if (target->layer == otherTarget->layer
375 && target->row == otherTarget->row
376 && target->column > otherTarget->column
377 ) {
379 break;
380 }
381 }
382 }
383
384 if (foundInFront) {
387 }
388 }
389
390 if ((battleStatus->curTargetListFlags & TARGET_FLAG_NOT_FLYING) && (targetActor->flags & ACTOR_FLAG_FLYING)) {
393 }
394 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_RIGHT) && target->row == sampleRow + 1) {
397 }
398 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_LEFT) && target->row == sampleRow - 1) {
401 }
402 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_BELOW) && target->column == sampleCol - 1) {
405 }
406 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_ABOVE) && target->column == sampleCol + 1) {
409 }
410 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_RIGHT) && target->row < sampleRow) {
413 }
414 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_LEFT) && target->row > sampleRow) {
417 }
418 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_BELOW) && target->column > sampleCol) {
421 }
422 if ((battleStatus->curTargetListFlags & TARGET_FLAG_DIR_ABOVE) && target->column < sampleCol) {
425 }
426
427 // target passed all checks, do not remove
429
431 if (removeTarget) {
432 for (j = i; j < numTargets - 1; j++) {
433 actor->targetData[j] = actor->targetData[j + 1];
434 }
435 numTargets--;
436 i--;
437 }
438 }
439
441 if (numTargets == 0 && hiddenByDarkness) {
443 } else {
445 }
446
447 targetDataList = actor->targetData;
448
450 targetIndexList = actor->targetIndexList;
451 for (i = 0; i < numTargets; i++) {
452 targetIndexList[i] = i;
453 }
454
455 // sort targets by priority
456 for (i = 0; i < numTargets - 1; i++) {
457 for (j = i + 1; j < numTargets; j++) {
458 s32 index1 = targetIndexList[i];
459 s32 index2 = targetIndexList[j];
462 if (target->truePos.x + target->priorityOffset * 10 > otherTarget->truePos.x + otherTarget->priorityOffset * 10) {
463 targetIndexList[i] = targetIndexList[j];
464 targetIndexList[j] = index1;
465 }
466 }
467 }
468}
469
471
475
477 create_target_list(actor, TRUE);
478}
479
481 s32 count = 0;
484 s32 numParts;
486 f32 x, y, z;
487 s32 i;
488
489 if (targetActor == NULL) {
490 return count;
491 }
492
493 numParts = targetActor->numParts;
494 part = targetActor->partsTable;
495
496 for (i = 0; i < numParts; i++) {
497 if (part->flags & ACTOR_PART_FLAG_NO_TARGET) {
498 part = part->nextPart;
499 continue;
500 }
501
502 if (!(part->flags & ACTOR_PART_FLAG_PRIMARY_TARGET)) {
504 // nanaian: I think this is intended and should probably be a break. this flag makes multi-target attacks select this part only
505 continue;
506 }
507
509
511 x = targetActor->curPos.x;
512 y = targetActor->curPos.y;
513 z = targetActor->curPos.z;
514
515 x += part->partOffset.x;
516 if (!(targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
517 y += part->partOffset.y;
518 } else {
519 y -= part->partOffset.y;
520 }
521 z += part->partOffset.z;
522
523 x += part->targetOffset.x;
524 if (!(targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
525 y += part->targetOffset.y;
526 } else {
527 y -= part->targetOffset.y;
528 }
529 } else {
530 x = part->absolutePos.x;
531 y = part->absolutePos.y;
532 z = part->absolutePos.z;
533
534 x += part->targetOffset.x;
535 if (!(targetActor->flags & ACTOR_FLAG_UPSIDE_DOWN)) {
536 y += part->targetOffset.y;
537 } else {
538 y -= part->targetOffset.y;
539 }
540 }
541
542 actor->targetActorID = target->actorID = targetActor->actorID;
543 actor->targetPartID = target->partID = partData->index;
544 target->truePos.x = x;
545 target->truePos.y = y;
546 target->truePos.z = z;
547 target->priorityOffset = 0;
548 target++;
549 count++;
550
551 part = part->nextPart;
552 }
553
554 actor->targetListLength = count;
555 return count;
556}
557
561
563 return func_80263064(actor, targetActor, TRUE);
564}
565
569 Actor* partner = battleStatus->partnerActor;
570
571 battleStatus->changePartnerAllowed = 0;
572 if (partner != NULL) {
574 s32 i;
575
576 battleStatus->changePartnerAllowed = 1;
577 partnersEnabled = 0;
578
579 for (i = 0; i < ARRAY_COUNT(playerData->partners); i++) {
580 if (playerData->partners[i].enabled) {
582 }
583 }
584
585 if (partnersEnabled >= 2) {
586 if (partner->koStatus == STATUS_KEY_KO) {
587 battleStatus->changePartnerAllowed = 0;
588 } else if (partner->debuff == STATUS_KEY_FROZEN) {
589 battleStatus->changePartnerAllowed = 0;
590 } else if (playerData->curPartner == PARTNER_GOOMPA) {
591 battleStatus->changePartnerAllowed = -1;
592 }
593 } else {
594 battleStatus->changePartnerAllowed = -1;
595 }
596 } else {
597 battleStatus->changePartnerAllowed = -1;
598 }
599}
600
603 Actor* player = battleStatus->playerActor;
606 s32 i;
607
608 battleStatus->menuStatus[0] = 0;
610
611 for (i = 0; i < ARRAY_COUNT(playerData->invItems); i++) {
612 s16 itemID = playerData->invItems[i];
613
614 if (itemID != ITEM_NONE) {
615 ItemData* itemData = &gItemTable[itemID];
616
617 if (itemData->typeFlags & ITEM_TYPE_FLAG_BATTLE_USABLE) {
618 battleStatus->moveCategory = BTL_MENU_TYPE_ITEMS;
619 battleStatus->moveArgument = playerData->invItems[i];
620 battleStatus->curTargetListFlags = itemData->targetFlags;
622
623 if (player->targetListLength != 0) {
624 battleStatus->menuStatus[0]++;
626 }
627 }
628 }
629 }
630
631 if (!hasValidItem) {
632 battleStatus->menuStatus[0] = 0;
633 }
634}
635
638 Actor* enemy;
640 s32 i;
641
642 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
643 enemy = battleStatus->enemyActors[i];
644 if (enemy != NULL) {
647 }
648 }
649 }
650 return !enemiesStillAlive;
651}
652
656 return TRUE;
657 }
658 return FALSE;
659}
660
670
672 s32 count;
673 s32 i;
674
676 return 0;
677 }
678
679 count = 0;
680 for (i = 0; i < ARRAY_COUNT(gPlayerData.equippedBadges); i++) {
682
683 if (gMoveTable[moveID].category == MOVE_TYPE_ATTACK_UP && moveID == MOVE_POWER_PLUS) {
685 count++;
686 }
687 }
688 }
689
690 return count;
691}
692
696 Actor* actor = battleStatus->playerActor;
697 s32 fpCost = gMoveTable[battleStatus->selectedMoveID].costFP;
698
699 if (fpCost != 0) {
702 if (fpCost < 1) {
703 fpCost = 1;
704 }
705 }
706
707 playerData->curFP -= fpCost;
708}
709
712 Actor* actor;
713 s32 i;
714
715 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
716 actor = battleStatus->enemyActors[i];
717 if (actor != NULL) {
718 actor->hpChangeCounter = 0;
719 actor->damageCounter = 0;
720 actor->actionRatingCombo = 0;
721 }
722 }
723
724 actor = battleStatus->playerActor;
725 actor->hpChangeCounter = 0;
726 actor->damageCounter = 0;
727 actor->actionRatingCombo = 0;
728
729 actor = battleStatus->partnerActor;
730 if (actor != NULL) {
731 actor->hpChangeCounter = 0;
732 actor->damageCounter = 0;
733 actor->actionRatingCombo = 0;
734 }
735}
736
737void set_actor_anim(s32 actorID, s32 partID, AnimID animID) {
738 if ((s32) animID >= 0) {
739 Actor* actor = get_actor(actorID);
741
742 switch (actorID & ACTOR_CLASS_MASK) {
744 part = &actor->partsTable[0];
745 if (part->curAnimation != animID) {
746 part->curAnimation = animID;
747 spr_update_player_sprite(PLAYER_SPRITE_MAIN, animID, part->animationRate);
748 }
749 break;
751 if (partID != 0) {
752 part = get_actor_part(actor, partID);
753
754 if (part == NULL) {
755 part = &actor->partsTable[0];
756 }
757 } else {
758 part = &actor->partsTable[0];
759 }
760
761 if (part->curAnimation != animID) {
762 part->curAnimation = animID;
763 spr_update_sprite(part->spriteInstanceID, animID, part->animationRate);
764 part->animNotifyValue = spr_get_notify_value(part->spriteInstanceID);
765 }
766 break;
768 part = get_actor_part(actor, partID);
769 if (part->curAnimation != animID) {
770 part->curAnimation = animID;
771 spr_update_sprite(part->spriteInstanceID, animID, part->animationRate);
772 part->animNotifyValue = spr_get_notify_value(part->spriteInstanceID);
773 }
774 break;
775 }
776 }
777}
778
780 if ((s32) anim >= 0) {
781 switch (actor->actorID & ACTOR_CLASS_MASK) {
783 if (part->curAnimation != anim) {
784 part->curAnimation = anim;
785 spr_update_player_sprite(PLAYER_SPRITE_MAIN, anim, part->animationRate);
786 }
787 break;
790 if (part->curAnimation != anim) {
791 part->curAnimation = anim;
792 spr_update_sprite(part->spriteInstanceID, anim, part->animationRate);
793 part->animNotifyValue = spr_get_notify_value(part->spriteInstanceID);
794 }
795 break;
796 }
797 }
798}
799
800void set_actor_anim_rate(s32 actorID, s32 partID, f32 rate) {
801 Actor* actor = get_actor(actorID);
803
804 switch (actorID & ACTOR_CLASS_MASK) {
806 if (partID != 0) {
807 part = get_actor_part(actor, partID);
808 if (part != NULL) {
809 part->animationRate = rate;
810 return;
811 }
812 }
813 actor->partsTable[0].animationRate = rate;
814 break;
817 part = get_actor_part(actor, partID);
818 part->animationRate = rate;
819 break;
820 }
821}
822
823void set_actor_yaw(s32 actorID, s32 yaw) {
824 get_actor(actorID)->yaw = yaw;
825}
826
827void set_part_yaw(s32 actorID, s32 partID, s32 value) {
828 get_actor_part(get_actor(actorID), partID)->yaw = value;
829}
830
831void set_part_flag_bits(s32 actorID, s32 partID, s32 flags) {
832 Actor* actor = get_actor(actorID);
834
835 switch (actorID & ACTOR_CLASS_MASK) {
837 actor->flags |= flags;
838 break;
841 if (partID == 0) {
842 actor->flags |= flags;
843 } else {
844 part = get_actor_part(actor, partID);
845 part->flags |= flags;
846 }
847 break;
848 }
849}
850
851void clear_part_flag_bits(s32 actorID, s32 partID, s32 flags) {
852 Actor* actor = get_actor(actorID);
854
855 switch (actorID & ACTOR_CLASS_MASK) {
857 actor->flags &= ~flags;
858 break;
861 if (partID == 0) {
862 actor->flags &= ~flags;
863 } else {
864 part = get_actor_part(actor, partID);
865 part->flags &= ~flags;
866 }
867 break;
868 }
869}
870
875
876 vector->x += speed * sinAngleRad;
877 vector->z += -speed * cosAngleRad;
878}
879
888
897
899 f32 theta;
902
903 if (var0 == 2) {
905 } else if (var0 == 1) {
906 D_802938A8 = 4;
907 } else if (D_802938A8++ >= 4) {
908 D_802938A8 = 0;
913 0,
914 xPos + (sinTheta * 24.0f * 0.2f),
915 yPos + 1.5f,
916 zPos + (cosTheta * 24.0f * 0.2f),
917 sinTheta,
919 );
920 }
921}
922
924 ActorPart* part = &actor->partsTable[0];
925
926 if (partID < 0 || part->nextPart == NULL) {
927 return part;
928 }
929
930 while (part != NULL) {
931 if (part->staticData->index == partID) {
932 return part;
933 }
934 part = part->nextPart;
935 }
936
937 return NULL;
938}
939
942 Actor* player;
944 DecorationTable* decorations;
946 s32 i;
947 s32 j;
948
949 player = battleStatus->playerActor = heap_malloc(sizeof(*player));
950
951 ASSERT(player != NULL);
952
953 player->ordinal = battleStatus->nextActorOrdinal++;
954 player->footStepCounter = 0;
955 player->flags = 0;
958
960 player->homePos.x = player->curPos.x = -130.0f;
961 player->homePos.y = player->curPos.y = 0.0f;
962 player->homePos.z = player->curPos.z = -10.0f;
963 } else {
964 player->homePos.x = player->curPos.x = -95.0f;
965 player->homePos.y = player->curPos.y = 0.0f;
966 player->homePos.z = player->curPos.z = 0.0f;
967 }
968
969 player->headOffset.x = 0;
970 player->headOffset.y = 0;
971 player->headOffset.z = 0;
972 player->rot.x = 0.0f;
973 player->rot.y = 0.0f;
974 player->rot.z = 0.0f;
975 player->rotPivotOffset.x = 0;
976 player->rotPivotOffset.y = 0;
977 player->rotPivotOffset.z = 0;
978 player->verticalRenderOffset = 0;
979 player->yaw = 0.0f;
981 player->scale.x = 1.0f;
982 player->scale.y = 1.0f;
983 player->scale.z = 1.0f;
984 player->scaleModifier.x = 1.0f;
985 player->scaleModifier.y = 1.0f;
986 player->scaleModifier.z = 1.0f;
987 player->size.x = player->actorBlueprint->size.x;
988 player->size.y = player->actorBlueprint->size.y;
989 player->actorID = 0;
990 player->healthBarPos.x = player->curPos.x;
991 player->healthBarPos.y = player->curPos.y;
992 player->healthBarPos.z = player->curPos.z;
993 player->scalingFactor = 1.0f;
994 player->attackResultEffect = NULL;
995 player->actionRatingCombo = 0;
996 player->actionRatingTime = 0;
997 player->statusIconOffset.x = 0;
998 player->statusIconOffset.y = 0;
999 player->statusTextOffset.x = 0;
1000 player->statusTextOffset.y = 0;
1001 player->idleSource = NULL;
1002 player->takeTurnSource = NULL;
1003 player->handleEventSource = NULL;
1004 player->handlePhaseSource = NULL;
1005 player->idleScript = NULL;
1006 player->takeTurnScript = NULL;
1007 player->handleEventScript = NULL;
1008 player->handlePhaseScript = NULL;
1009 player->turnPriority = 0;
1011 player->debuff = 0;
1012 player->debuffDuration = 0;
1013 player->staticStatus = 0;
1014 player->staticDuration = 0;
1015 player->stoneStatus = 0;
1016 player->stoneDuration = 0;
1017 player->koStatus = 0;
1018 player->koDuration = 0;
1019 player->transparentStatus = 0;
1020 player->transparentDuration = 0;
1021 player->isGlowing = FALSE;
1022 player->unk_21E = 0;
1023 player->disableDismissTimer = 0;
1024 player->attackBoost = 0;
1025 player->defenseBoost = 0;
1026 player->chillOutAmount = 0;
1027 player->chillOutTurns = 0;
1028 player->statusAfflicted = 0;
1029 player->actorTypeData1[0] = bActorSoundTable[player->actorType].walk[0];
1030 player->actorTypeData1[1] = bActorSoundTable[player->actorType].walk[1];
1031 player->actorTypeData1[2] = bActorSoundTable[player->actorType].fly[0];
1032 player->actorTypeData1[3] = bActorSoundTable[player->actorType].fly[1];
1033 player->actorTypeData1[4] = bActorSoundTable[player->actorType].jump;
1034 player->actorTypeData1[5] = bActorSoundTable[player->actorType].hurt;
1035 player->actorTypeData1b[0] = bActorSoundTable[player->actorType].delay[0];
1036 player->actorTypeData1b[1] = bActorSoundTable[player->actorType].delay[1];
1037
1038 for (i = 0; i < ARRAY_COUNT(player->loopingSoundID); i++) {
1039 player->loopingSoundID[i] = 0;
1040 }
1041
1042 part = heap_malloc(sizeof(*part));
1043 player->partsTable = part;
1044
1045 ASSERT(part != NULL)
1046
1047 player->numParts = 1;
1048 part->staticData = bMarioParts;
1049 part->partOffset.x = 0;
1050 part->partOffset.y = 0;
1051 part->partOffset.z = 0;
1052 part->partOffset.x = 12;
1053 part->partOffset.y = 32;
1054 part->partOffset.z = 5;
1055 part->decorationTable = NULL;
1056 part->flags = 0;
1057 part->targetFlags = 0;
1058 part->partOffsetFloat.x = 0.0f;
1059 part->partOffsetFloat.y = 0.0f;
1060 part->partOffsetFloat.z = 0.0f;
1061 part->rotPivotOffset.x = 0;
1062 part->rotPivotOffset.y = 0;
1063 part->rotPivotOffset.z = 0;
1064 part->visualOffset.x = 0;
1065 part->visualOffset.y = 0;
1066 part->visualOffset.z = 0;
1067 part->absolutePos.x = 0.0f;
1068 part->absolutePos.y = 0.0f;
1069 part->absolutePos.z = 0.0f;
1070 part->defenseTable = bMarioDefenseTable;
1071
1073 part->idleAnimations = bPeachIdleAnims;
1074 } else {
1075 part->idleAnimations = bMarioIdleAnims;
1076 }
1077
1078 part->eventFlags = 0;
1079 part->elementalImmunities = 0;
1080 part->opacity = 255;
1081 part->size.y = player->size.y;
1082 part->size.x = player->size.x;
1083 part->yaw = 0.0f;
1084 part->targetOffset.x = 0;
1085 part->targetOffset.y = 0;
1086 part->targetPriorityOffset = 0;
1087 part->rot.x = 0.0f;
1088 part->rot.y = 0.0f;
1089 part->rot.z = 0.0f;
1090 part->scale.x = 1.0f;
1091 part->scale.y = 1.0f;
1092 part->scale.z = 1.0f;
1093 part->verticalStretch = 1;
1094 part->palAnimPosOffset[0] = 0;
1095 part->palAnimPosOffset[1] = 0;
1096 part->animationRate = 1.0f;
1097 part->curAnimation = get_npc_anim_for_status(part->idleAnimations, 1U);
1098 part->nextPart = NULL;
1099 part->partTypeData[0] = bActorSoundTable[player->actorType].walk[0];
1100 part->partTypeData[1] = bActorSoundTable[player->actorType].walk[1];
1101 part->partTypeData[2] = bActorSoundTable[player->actorType].fly[0];
1102 part->partTypeData[3] = bActorSoundTable[player->actorType].fly[1];
1103 part->partTypeData[4] = bActorSoundTable[player->actorType].jump;
1104 part->partTypeData[5] = bActorSoundTable[player->actorType].hurt;
1105 part->actorTypeData2b[0] = bActorSoundTable[player->actorType].delay[0];
1106 part->actorTypeData2b[1] = bActorSoundTable[player->actorType].delay[1];
1107
1108 if (part->idleAnimations != NULL) {
1109 s32 j;
1110
1111 part->decorationTable = heap_malloc(sizeof(*decorations));
1112 decorations = part->decorationTable;
1113
1114 ASSERT(decorations != NULL);
1115
1117 decorations->glowState = GLOW_PAL_OFF;
1118 decorations->flashState = 0;
1119 decorations->flashEnabled = FLASH_PAL_OFF;
1120 decorations->blurUnused = 0;
1121 decorations->blurBufferPos = 0;
1122
1123 for (j = 0; j < ARRAY_COUNT(decorations->posX); j++) {
1124 decorations->posX[j] = player->curPos.x;
1125 decorations->posY[j] = player->curPos.y;
1126 decorations->posZ[j] = player->curPos.z;
1127 }
1128
1129 decorations->blurDrawCount = 3;
1130 decorations->blurEnableCount = 0;
1131 decorations->blurDisableDelay = 0;
1132
1133 for (j = 0; j < ARRAY_COUNT(decorations->effect); j++) {
1134 decorations->effect[j] = NULL;
1135 decorations->type[j] = 0;
1136 }
1137 }
1138
1139 partMovement = part->movement = heap_malloc(sizeof(*partMovement));
1141
1142 player->shadow.id = create_shadow_type(SHADOW_VARYING_CIRCLE, player->curPos.x, player->curPos.y, player->curPos.z);
1143 player->shadowScale = player->size.x / 24.0;
1145 player->disableEffect = fx_disable_x(0, -142.0f, 34.0f, 1.0f, 0);
1146 player->icePillarEffect = NULL;
1147
1150 player->staticDuration = 127;
1151 }
1152}
1153
1157 Actor* partnerActor;
1159 Evt* takeTurnScript;
1160 s32 partCount;
1163 f32 x;
1164 f32 y;
1165 f32 z;
1166 ActorPart* part;
1167 s32 i;
1168 s32 i2;
1169
1170 currentPartner = playerData->curPartner;
1171 battleStatus->partnerActor = NULL;
1172
1176
1177 ASSERT(actorBP != NULL);
1178
1179 nuPiReadRom(partnerData->dmaStart, partnerData->dmaDest, partnerData->dmaEnd - partnerData->dmaStart);
1181 x = -95.0f;
1182 y = partnerData->y;
1183 z = 0.0f;
1185 } else {
1186 x = -130.0f;
1187 y = partnerData->y;
1188 z = -10.0f;
1189 }
1190 partCount = actorBP->partCount;
1191 battleStatus->partnerActor = heap_malloc(sizeof(*partnerActor));
1192 partnerActor = battleStatus->partnerActor;
1193
1194 ASSERT(partnerActor != NULL);
1195
1196 actorBP->level = playerData->partners[playerData->curPartner].level;
1197 partnerActor->ordinal = battleStatus->nextActorOrdinal++;
1198 partnerActor->footStepCounter = 0;
1199 partnerActor->actorBlueprint = actorBP;
1200 partnerActor->actorType = actorBP->type;
1201 partnerActor->flags = actorBP->flags;
1202 partnerActor->homePos.x = partnerActor->curPos.x = x;
1203 partnerActor->homePos.y = partnerActor->curPos.y = y;
1204 partnerActor->homePos.z = partnerActor->curPos.z = z;
1205 partnerActor->headOffset.x = 0;
1206 partnerActor->headOffset.y = 0;
1207 partnerActor->headOffset.z = 0;
1208 partnerActor->curHP = actorBP->maxHP;
1209 partnerActor->numParts = partCount;
1210 partnerActor->idleSource = NULL;
1211 partnerActor->takeTurnSource = actorBP->initScript;
1212 partnerActor->handleEventSource = NULL;
1213 partnerActor->handlePhaseSource = NULL;
1214 partnerActor->idleScript = NULL;
1215 partnerActor->takeTurnScript = NULL;
1216 partnerActor->handleEventScript = NULL;
1217 partnerActor->handlePhaseScript = NULL;
1218 partnerActor->turnPriority = 0;
1219 partnerActor->enemyIndex = 0;
1220 partnerActor->yaw = 0.0f;
1221 partnerActor->rot.x = 0.0f;
1222 partnerActor->rot.y = 0.0f;
1223 partnerActor->rot.z = 0.0f;
1224 partnerActor->rotPivotOffset.x = 0;
1225 partnerActor->rotPivotOffset.y = 0;
1226 partnerActor->rotPivotOffset.z = 0;
1227 partnerActor->scale.x = 1.0f;
1228 partnerActor->scale.y = 1.0f;
1229 partnerActor->scale.z = 1.0f;
1230 partnerActor->scaleModifier.x = 1.0f;
1231 partnerActor->scaleModifier.y = 1.0f;
1232 partnerActor->scaleModifier.z = 1.0f;
1233 partnerActor->verticalRenderOffset = 0;
1234 partnerActor->size.x = actorBP->size.x;
1235 partnerActor->size.y = actorBP->size.y;
1236 partnerActor->healthBarPos.x = partnerActor->homePos.x;
1237 partnerActor->healthBarPos.y = partnerActor->homePos.y;
1238 partnerActor->healthBarPos.z = partnerActor->homePos.z;
1239 partnerActor->scalingFactor = 1.0f;
1240 partnerActor->attackResultEffect = NULL;
1241 partnerActor->actionRatingCombo = 0;
1242 partnerActor->actionRatingTime = 0;
1243 partnerActor->statusIconOffset.x = 0;
1244 partnerActor->statusIconOffset.y = 0;
1245 partnerActor->statusTextOffset.x = 0;
1246 partnerActor->statusTextOffset.y = 0;
1247 partnerActor->renderMode = RENDER_MODE_ALPHATEST;
1248 partnerActor->actorID = ACTOR_PARTNER;
1249 partnerActor->statusTable = actorBP->statusTable;
1250 partnerActor->debuff = 0;
1251 partnerActor->debuffDuration = 0;
1252 partnerActor->staticStatus = 0;
1253 partnerActor->staticDuration = 0;
1254 partnerActor->stoneStatus = 0;
1255 partnerActor->stoneDuration = 0;
1256 partnerActor->koStatus = 0;
1257 partnerActor->koDuration = 0;
1258 partnerActor->transparentStatus = 0;
1259 partnerActor->transparentDuration = 0;
1260 partnerActor->isGlowing = FALSE;
1261 partnerActor->unk_21E = 0;
1262 partnerActor->disableDismissTimer = 0;
1263 partnerActor->attackBoost = 0;
1264 partnerActor->defenseBoost = 0;
1265 partnerActor->chillOutAmount = 0;
1266 partnerActor->chillOutTurns = 0;
1267 partnerActor->statusAfflicted = 0;
1268 partnerActor->actorTypeData1[0] = bActorSoundTable[partnerActor->actorType].walk[0];
1269 partnerActor->actorTypeData1[1] = bActorSoundTable[partnerActor->actorType].walk[1];
1270 partnerActor->actorTypeData1[2] = bActorSoundTable[partnerActor->actorType].fly[0];
1271 partnerActor->actorTypeData1[3] = bActorSoundTable[partnerActor->actorType].fly[1];
1272 partnerActor->actorTypeData1[4] = bActorSoundTable[partnerActor->actorType].jump;
1273 partnerActor->actorTypeData1[5] = bActorSoundTable[partnerActor->actorType].hurt;
1274 partnerActor->actorTypeData1b[0] = bActorSoundTable[partnerActor->actorType].delay[0];
1275 partnerActor->actorTypeData1b[1] = bActorSoundTable[partnerActor->actorType].delay[1];
1276
1277 for (i2 = 0; i2 < ARRAY_COUNT(partnerActor->loopingSoundID); i2++) {
1278 partnerActor->loopingSoundID[i2] = 0;
1279 }
1280
1281 part = heap_malloc(sizeof(*part));
1282 partnerActor->partsTable = part;
1283
1284 ASSERT(part != NULL);
1285
1286 for (i = 0; i < partCount; i++) {
1288 part->decorationTable = NULL;
1289 part->staticData = ActorPartBlueprint;
1290
1292 part->targetFlags = 0;
1293
1294 part->partOffsetFloat.x = part->partOffset.x = ActorPartBlueprint->posOffset.x;
1295 part->partOffsetFloat.y = part->partOffset.y = ActorPartBlueprint->posOffset.y;
1296 part->partOffsetFloat.z = part->partOffset.z = ActorPartBlueprint->posOffset.z;
1297
1298 part->visualOffset.x = 0;
1299 part->visualOffset.y = 0;
1300 part->visualOffset.z = 0;
1301 part->absolutePos.x = 0.0f;
1302 part->absolutePos.y = 0.0f;
1303 part->absolutePos.z = 0.0f;
1304 part->defenseTable = ActorPartBlueprint->defenseTable;
1305 part->idleAnimations = ActorPartBlueprint->idleAnimations;
1306 part->eventFlags = ActorPartBlueprint->eventFlags;
1307 part->elementalImmunities = ActorPartBlueprint->elementImmunityFlags;
1308 part->opacity = ActorPartBlueprint->opacity;
1309 part->size.y = partnerActor->size.y;
1310 part->size.x = partnerActor->size.x;
1311 part->yaw = 0.0f;
1312 part->targetOffset.x = ActorPartBlueprint->targetOffset.x;
1313 part->targetOffset.y = ActorPartBlueprint->targetOffset.y;
1314 part->targetPriorityOffset = 0;
1315 part->rotPivotOffset.x = 0;
1316 part->rotPivotOffset.y = 0;
1317 part->rotPivotOffset.z = 0;
1318 part->rot.x = 0.0f;
1319 part->rot.y = 0.0f;
1320 part->rot.z = 0.0f;
1321 part->scale.x = 1.0f;
1322 part->scale.y = 1.0f;
1323 part->scale.z = 1.0f;
1324 part->verticalStretch = 1;
1325 part->palAnimPosOffset[0] = 0;
1326 part->palAnimPosOffset[1] = 0;
1327 part->partTypeData[0] = bActorSoundTable[partnerActor->actorType].walk[0];
1328 part->partTypeData[1] = bActorSoundTable[partnerActor->actorType].walk[1];
1329 part->partTypeData[2] = bActorSoundTable[partnerActor->actorType].fly[0];
1330 part->partTypeData[3] = bActorSoundTable[partnerActor->actorType].fly[1];
1331 part->partTypeData[4] = bActorSoundTable[partnerActor->actorType].jump;
1332 part->partTypeData[5] = bActorSoundTable[partnerActor->actorType].hurt;
1333 part->actorTypeData2b[0] = bActorSoundTable[partnerActor->actorType].delay[0];
1334 part->actorTypeData2b[1] = bActorSoundTable[partnerActor->actorType].delay[1];
1335
1336 if (part->idleAnimations != NULL) {
1337 DecorationTable* decorations;
1338 s32 j;
1339
1340 part->decorationTable = heap_malloc(sizeof(*decorations));
1341 decorations = part->decorationTable;
1342
1343 ASSERT(decorations != NULL);
1344
1346 decorations->glowState = GLOW_PAL_OFF;
1347 decorations->flashState = 0;
1348 decorations->flashEnabled = FLASH_PAL_OFF;
1349 decorations->blurUnused = 0;
1350 decorations->blurBufferPos = 0;
1351
1352 for (j = 0; j < ARRAY_COUNT(decorations->posX); j++) {
1353 decorations->posX[j] = partnerActor->curPos.x;
1354 decorations->posY[j] = partnerActor->curPos.y;
1355 decorations->posZ[j] = partnerActor->curPos.z;
1356 }
1357
1358 decorations->blurDrawCount = 3;
1359 decorations->blurEnableCount = 0;
1360 decorations->blurDisableDelay = 0;
1361
1362 for (j = 0; j < ARRAY_COUNT(decorations->effect); j++) {
1363 decorations->effect[j] = NULL;
1364 decorations->type[j] = 0;
1365 }
1366 }
1367
1368 if (!(part->flags & ACTOR_PART_FLAG_SKIP_MOVEMENT_ALLOC)) {
1369 part->movement = heap_malloc(sizeof(*part->movement));
1370 ASSERT(part->movement != NULL);
1371 }
1372
1373 part->animationRate = 1.0f;
1374 part->curAnimation = 0;
1375 part->spriteInstanceID = -1;
1376
1377 if (part->idleAnimations != NULL) {
1378 part->curAnimation = get_npc_anim_for_status(part->idleAnimations, 1);
1379 part->spriteInstanceID = spr_load_npc_sprite(part->curAnimation | SPRITE_ID_TAIL_ALLOCATE, NULL);
1380 }
1381
1382 if (i + 1 >= partCount) {
1383 part->nextPart = NULL;
1384 continue;
1385 }
1386
1387 part->nextPart = heap_malloc(sizeof(*part->nextPart));
1388 part = part->nextPart;
1389 if (part == NULL) {
1390 PANIC();
1391 }
1392
1393 part->nextPart = NULL;
1394 }
1395
1396 partnerActor->shadow.id = create_shadow_type(SHADOW_VARYING_CIRCLE, partnerActor->curPos.x, partnerActor->curPos.y, partnerActor->curPos.z);
1397 partnerActor->shadowScale = partnerActor->size.x / 24.0;
1399 partnerActor->disableEffect = fx_disable_x(0, -142.0f, 34.0f, 1.0f, 0);
1400 partnerActor->icePillarEffect = NULL;
1401
1402 takeTurnScript = start_script(partnerActor->takeTurnSource, EVT_PRIORITY_A, 0);
1403 partnerActor->takeTurnScriptID = takeTurnScript->id;
1404 takeTurnScript->owner1.actorID = ACTOR_PARTNER;
1405 }
1406}
1407
1410 Actor* actor;
1412 ActorPart* part;
1414 Evt* takeTurnScript;
1415 s32 partCount;
1416 f32 x, y, z;
1417 DecorationTable* decorations;
1418 s32 i, j, k;
1419
1420 if (formation->home.index >= EVT_LIMIT) {
1421 x = StandardActorHomePositions[formation->home.index].x;
1422 y = StandardActorHomePositions[formation->home.index].y;
1423 z = StandardActorHomePositions[formation->home.index].z;
1424 } else {
1425 x = formation->home.vec->x;
1426 y = formation->home.vec->y;
1427 z = formation->home.vec->z;
1428 }
1429
1430 formationActor = formation->actor;
1431 partCount = formationActor->partCount;
1432
1433 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1434 if (battleStatus->enemyActors[i] == NULL) {
1435 break;
1436 }
1437 }
1438
1439 actor = battleStatus->enemyActors[i] = heap_malloc(sizeof(*actor));
1440
1441 ASSERT(actor != NULL);
1442
1443 actor->ordinal = battleStatus->nextActorOrdinal++;
1444 actor->footStepCounter = 0;
1446 actor->actorType = formationActor->type;
1447 actor->flags = formationActor->flags;
1448 actor->homePos.x = actor->curPos.x = x;
1449 actor->homePos.y = actor->curPos.y = y;
1450 actor->homePos.z = actor->curPos.z = z;
1451 actor->headOffset.x = 0;
1452 actor->headOffset.y = 0;
1453 actor->headOffset.z = 0;
1454 actor->maxHP = actor->curHP = formationActor->maxHP;
1455 actor->numParts = partCount;
1456 actor->idleSource = NULL;
1457 actor->takeTurnSource = formationActor->initScript;
1458 actor->handleEventSource = NULL;
1459 actor->handlePhaseSource = NULL;
1460 actor->idleScript = NULL;
1461 actor->takeTurnScript = NULL;
1462 actor->handleEventScript = NULL;
1463 actor->turnPriority = formation->priority;
1464 actor->enemyIndex = i;
1465 actor->yaw = 0.0f;
1466 actor->rot.x = 0.0f;
1467 actor->rot.y = 0.0f;
1468 actor->rot.z = 0.0f;
1469 actor->rotPivotOffset.x = 0;
1470 actor->rotPivotOffset.y = 0;
1471 actor->rotPivotOffset.z = 0;
1472 actor->scale.x = 1.0f;
1473 actor->scale.y = 1.0f;
1474 actor->scale.z = 1.0f;
1475 actor->scaleModifier.x = 1.0f;
1476 actor->scaleModifier.y = 1.0f;
1477 actor->scaleModifier.z = 1.0f;
1478 actor->verticalRenderOffset = 0;
1479 actor->extraCoinBonus = 0;
1480 actor->size.x = formationActor->size.x;
1481 actor->size.y = formationActor->size.y;
1482 actor->scalingFactor = 1.0f;
1483 actor->statusIconOffset.x = 0;
1484 actor->statusIconOffset.y = 0;
1485 actor->statusTextOffset.x = 0;
1486 actor->statusTextOffset.y = 0;
1487 actor->healthBarOffset.x = 0;
1488 actor->healthBarOffset.y = 0;
1489 actor->healthBarHideTime = 0;
1490 actor->attackResultEffect = NULL;
1491 actor->actionRatingCombo = 0;
1492 actor->actionRatingTime = 0;
1493
1494 actor->healthBarPos.x = actor->curPos.x + formationActor->healthBarOffset.x;
1495 actor->healthBarPos.y = actor->curPos.y + formationActor->healthBarOffset.y;
1496 actor->healthBarPos.z = actor->curPos.z;
1497 if (actor->flags & ACTOR_FLAG_UPSIDE_DOWN) {
1498 actor->healthBarPos.y = actor->curPos.y - actor->size.y - formationActor->healthBarOffset.y;
1499 }
1500
1501 actor->statusTable = formationActor->statusTable;
1502 actor->debuff = 0;
1503 actor->debuffDuration = 0;
1504 actor->staticStatus = 0;
1505 actor->staticDuration = 0;
1506 actor->stoneStatus = 0;
1507 actor->stoneDuration = 0;
1508 actor->koStatus = 0;
1509 actor->koDuration = 0;
1510 actor->transparentStatus = 0;
1511 actor->transparentDuration = 0;
1512 actor->isGlowing = FALSE;
1513 actor->unk_21E = 0;
1514 actor->disableDismissTimer = 0;
1515 actor->attackBoost = 0;
1516 actor->defenseBoost = 0;
1517 actor->chillOutAmount = 0;
1518 actor->chillOutTurns = 0;
1519 actor->statusAfflicted = 0;
1520 actor->actorTypeData1[0] = bActorSoundTable[actor->actorType].walk[0];
1521 actor->actorTypeData1[1] = bActorSoundTable[actor->actorType].walk[1];
1522 actor->actorTypeData1[2] = bActorSoundTable[actor->actorType].fly[0];
1523 actor->actorTypeData1[3] = bActorSoundTable[actor->actorType].fly[1];
1524 actor->actorTypeData1[4] = bActorSoundTable[actor->actorType].jump;
1525 actor->actorTypeData1[5] = bActorSoundTable[actor->actorType].hurt;
1526 actor->actorTypeData1b[0] = bActorSoundTable[actor->actorType].delay[0];
1527 actor->actorTypeData1b[1] = bActorSoundTable[actor->actorType].delay[1];
1528
1529 for (i = 0; i < ARRAY_COUNT(actor->loopingSoundID); i++) {
1530 actor->loopingSoundID[i] = 0;
1531 }
1532
1533 actor->state.varTable[0] = formation->var0;
1534 actor->state.varTable[1] = formation->var1;
1535 actor->state.varTable[2] = formation->var2;
1536 actor->state.varTable[3] = formation->var3;
1538 actor->instigatorValue = 0;
1539 part = heap_malloc(sizeof(*part));
1540 actor->partsTable = part;
1541 ASSERT(part != NULL);
1542
1543 for (j = 0; j < partCount; j++) {
1545
1546 part->decorationTable = NULL;
1547 part->staticData = actorPartBP;
1549 part->targetFlags = 0;
1550
1551 part->partOffsetFloat.x = part->partOffset.x = actorPartBP->posOffset.x;
1552 part->partOffsetFloat.y = part->partOffset.y = actorPartBP->posOffset.y;
1553 part->partOffsetFloat.z = part->partOffset.z = actorPartBP->posOffset.z;
1554
1555 part->visualOffset.x = 0;
1556 part->visualOffset.y = 0;
1557 part->visualOffset.z = 0;
1558
1559 part->absolutePos.x = actor->curPos.x;
1560 part->absolutePos.y = actor->curPos.y;
1561 part->absolutePos.z = actor->curPos.z;
1562 part->curPos.x = actor->curPos.x;
1563 part->curPos.y = actor->curPos.y;
1564 part->curPos.z = actor->curPos.z;
1565 part->defenseTable = actorPartBP->defenseTable;
1566 part->idleAnimations = actorPartBP->idleAnimations;
1567 part->eventFlags = actorPartBP->eventFlags;
1568 part->elementalImmunities = actorPartBP->elementImmunityFlags;
1569 part->opacity = actorPartBP->opacity;
1570 if (part->opacity < 255) {
1572 }
1573 part->size.y = actor->size.y;
1574 part->size.x = actor->size.x;
1575 part->yaw = 0.0f;
1576 part->targetOffset.x = actorPartBP->targetOffset.x;
1577 part->targetOffset.y = actorPartBP->targetOffset.y;
1578 part->targetPriorityOffset = 0;
1579 part->projectileTargetOffset.x = actorPartBP->projectileTargetOffset.x;
1580 part->projectileTargetOffset.y = actorPartBP->projectileTargetOffset.y;
1581 part->rot.x = 0.0f;
1582 part->rot.y = 0.0f;
1583 part->rot.z = 0.0f;
1584 part->rotPivotOffset.x = 0;
1585 part->rotPivotOffset.y = 0;
1586 part->rotPivotOffset.z = 0;
1587 part->scale.x = 1.0f;
1588 part->scale.y = 1.0f;
1589 part->scale.z = 1.0f;
1590 part->verticalStretch = 1;
1591 part->palAnimPosOffset[0] = 0;
1592 part->palAnimPosOffset[1] = 0;
1593 part->partTypeData[0] = bActorSoundTable[actor->actorType].walk[0];
1594 part->partTypeData[1] = bActorSoundTable[actor->actorType].walk[1];
1595 part->partTypeData[2] = bActorSoundTable[actor->actorType].fly[0];
1596 part->partTypeData[3] = bActorSoundTable[actor->actorType].fly[1];
1597 part->partTypeData[4] = bActorSoundTable[actor->actorType].jump;
1598 part->partTypeData[5] = bActorSoundTable[actor->actorType].hurt;
1599 part->actorTypeData2b[0] = bActorSoundTable[actor->actorType].delay[0];
1600 part->actorTypeData2b[1] = bActorSoundTable[actor->actorType].delay[1];
1601
1602 if (part->idleAnimations != NULL && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
1603 part->decorationTable = heap_malloc(sizeof(*decorations));
1604 decorations = part->decorationTable;
1605 ASSERT(decorations != NULL);
1606
1608 decorations->glowState = GLOW_PAL_OFF;
1609 decorations->flashState = 0;
1610 decorations->flashEnabled = FLASH_PAL_OFF;
1611 decorations->blurUnused = 0;
1612 decorations->blurBufferPos = 0;
1613
1614 for (k = 0; k < ARRAY_COUNT(decorations->posX); k++) {
1615 decorations->posX[k] = actor->curPos.x;
1616 decorations->posY[k] = actor->curPos.y;
1617 decorations->posZ[k] = actor->curPos.z;
1618 }
1619
1620 decorations->blurDrawCount = 3;
1621 decorations->blurEnableCount = 0;
1622 decorations->blurDisableDelay = 0;
1623
1624 for (k = 0; k < ARRAY_COUNT(decorations->effect); k++) {
1625 decorations->effect[k] = NULL;
1626 decorations->type[k] = 0;
1627 }
1628
1629 }
1630
1631 if (!(part->flags & ACTOR_PART_FLAG_SKIP_MOVEMENT_ALLOC)) {
1632 part->movement = heap_malloc(sizeof(*part->movement));
1633 ASSERT(part->movement != NULL);
1634 }
1635
1636 if (actor->flags & ACTOR_FLAG_TARGET_ONLY) {
1638 }
1639
1640 part->animationRate = 1.0f;
1641 part->curAnimation = 0;
1642 part->spriteInstanceID = -1;
1643
1644 if (part->idleAnimations != NULL) {
1645 part->curAnimation = get_npc_anim_for_status(part->idleAnimations, 1) & ~SPRITE_ID_TAIL_ALLOCATE;
1646 part->spriteInstanceID = spr_load_npc_sprite(part->curAnimation, NULL);
1647 }
1648
1649 if (j + 1 >= partCount) {
1650 part->nextPart = NULL;
1651 continue;
1652 }
1653
1654 part->nextPart = heap_malloc(sizeof(*part->nextPart));
1655 part = part->nextPart;
1656 if (part == NULL) {
1657 PANIC();
1658 }
1659
1660 part->nextPart = NULL;
1661 }
1662
1663 actor->healthFraction = 25;
1664 actor->actorID = actor->enemyIndex | ACTOR_CLASS_ENEMY;
1665 takeTurnScript = start_script(actor->takeTurnSource, EVT_PRIORITY_A, 0);
1666 actor->takeTurnScriptID = takeTurnScript->id;
1667 takeTurnScript->owner1.enemyID = actor->enemyIndex | ACTOR_CLASS_ENEMY;
1668 actor->shadow.id = create_shadow_type(SHADOW_VARYING_CIRCLE, actor->curPos.x, actor->curPos.y, actor->curPos.z);
1669 actor->shadowScale = actor->size.x / 24.0;
1670 actor->disableEffect = fx_disable_x(0, -142.0f, 34.0f, 1.0f, 0);
1671 actor->icePillarEffect = NULL;
1673 return actor;
1674}
1675
1678
1679 if (animations == NULL) {
1680 return 0;
1681 }
1682
1683 foundAnim = 0;
1684 while (animations[DICTIONARY_KEY] != NULL) {
1685 if (animations[DICTIONARY_KEY] == STATUS_KEY_NORMAL) {
1686 foundAnim = animations[DICTIONARY_VALUE];
1687 }
1688 if (animations[DICTIONARY_KEY] == statusKey) {
1689 foundAnim = animations[DICTIONARY_VALUE];
1690 break;
1691 }
1692 animations += DICTIONARY_SIZE;
1693 }
1694 return foundAnim;
1695}
1696
1700 Actor* player = battleStatus->playerActor;
1701 u32* anim = &player->partsTable->idleAnimations[0];
1702 s32 ret;
1703
1704 if (anim == NULL) {
1705 return 0;
1706 }
1707 ret = 0;
1708
1709 if (!(battleStatus->flags2 & BS_FLAGS2_PEACH_BATTLE)) {
1710 // switch to danger override animations
1711 if (playerData->curHP <= DANGER_THRESHOLD) {
1714 }
1717 }
1720 }
1721 }
1722
1723 // switch to poisoned override animations
1724 if (player->debuff == STATUS_KEY_POISON) {
1727 }
1730 }
1733 }
1734 }
1735
1736 // switch to dizzy override animations
1737 if (player->debuff == STATUS_KEY_DIZZY) {
1740 }
1741 }
1742 }
1743
1744 // search IdleAnimations to get animID for key
1745 while (*anim != NULL) {
1746 if (*anim == STATUS_KEY_NORMAL) {
1747 ret = anim[1];
1748 }
1749 if (*anim == statusKey) {
1750 ret = anim[1];
1751 break;
1752 }
1753 anim += 2;
1754 }
1755
1756 return ret;
1757}
1758
1760 s32 normalDefense = 0;
1761
1762 while (defenseTable[DICTIONARY_KEY] != ELEMENT_END) {
1763 if (defenseTable[DICTIONARY_KEY] == ELEMENT_NORMAL) {
1764 normalDefense = defenseTable[DICTIONARY_VALUE];
1765 }
1766
1767 if (defenseTable[DICTIONARY_KEY] == elementKey) {
1768 normalDefense = defenseTable[DICTIONARY_VALUE];
1769 break;
1770 }
1771 defenseTable += DICTIONARY_SIZE;
1772 }
1773
1774 // Fall back to normal defense if given element is not specified in table
1775 return normalDefense;
1776}
1777
1779 s32 defaultChance = 0;
1780
1781 while (statusTable[DICTIONARY_KEY] != STATUS_END) {
1782 if (statusTable[DICTIONARY_KEY] == STATUS_KEY_DEFAULT) {
1783 defaultChance = statusTable[DICTIONARY_VALUE];
1784 }
1785
1786 if (statusTable[DICTIONARY_KEY] == statusKey) {
1787 defaultChance = statusTable[DICTIONARY_VALUE];
1788 break;
1789 }
1790 statusTable += DICTIONARY_SIZE;
1791 }
1792
1793 // Fall back to normal chance if given element is not specified in table
1794 return defaultChance;
1795}
1796
1798 s32 defaultTurnMod = 0;
1799
1800 while (statusTable[DICTIONARY_KEY] != ELEMENT_END) {
1801 if (statusTable[DICTIONARY_KEY] == STATUS_TURN_MOD_DEFAULT) {
1802 defaultTurnMod = statusTable[DICTIONARY_VALUE];
1803 }
1804
1805 if (statusTable[DICTIONARY_KEY] == statusKey) {
1806 defaultTurnMod = statusTable[DICTIONARY_VALUE];
1807 break;
1808 }
1809 statusTable += DICTIONARY_SIZE;
1810 }
1811
1812 // Fall back to normal duration if given element is not specified in table
1813 return defaultTurnMod;
1814}
1815
1818 EffectInstance* effect;
1819
1820 switch (statusTypeKey) {
1821 case STATUS_KEY_UNUSED:
1822 case STATUS_KEY_DIZZY:
1824 case STATUS_KEY_SLEEP:
1825 case STATUS_KEY_FROZEN:
1826 case STATUS_KEY_STOP:
1827 case STATUS_KEY_POISON:
1828 case STATUS_KEY_SHRINK:
1830 !is_ability_active(ABILITY_BERSERKER) && battleStatus->hustleTurns == 0)) {
1831
1832 if (target->actorID != ACTOR_PARTNER) {
1833 if (target->debuff != statusTypeKey) {
1834 target->statusAfflicted = statusTypeKey;
1835 }
1836 target->disableEffect->data.disableX->koDuration = 0;
1837 target->debuff = statusTypeKey;
1838 target->debuffDuration = duration;
1839 if ((s8)duration > 9) {
1840 target->debuffDuration = 9;
1841 }
1842
1843 switch (statusTypeKey) {
1844 case STATUS_KEY_FROZEN:
1845 if (target->actorID != ACTOR_PARTNER) {
1846 effect = target->icePillarEffect;
1847 if (effect != NULL) {
1849 }
1850 target->icePillarEffect = fx_ice_pillar(0, target->curPos.x, target->curPos.y,
1851 target->curPos.z, 1.0f, 0);
1852 create_status_debuff(target->hudElementDataIndex, STATUS_KEY_FROZEN);
1853 }
1854 return TRUE;
1855 case STATUS_KEY_SLEEP:
1857 create_status_debuff(target->hudElementDataIndex, STATUS_KEY_SLEEP);
1858 return TRUE;
1861 create_status_debuff(target->hudElementDataIndex, STATUS_KEY_PARALYZE);
1862 return TRUE;
1863 case STATUS_KEY_DIZZY:
1864 create_status_debuff(target->hudElementDataIndex, STATUS_KEY_DIZZY);
1865 return TRUE;
1866 case STATUS_KEY_UNUSED:
1868 create_status_debuff(target->hudElementDataIndex, STATUS_KEY_UNUSED);
1869 return TRUE;
1870 case STATUS_KEY_POISON:
1872 create_status_debuff(target->hudElementDataIndex, STATUS_KEY_POISON);
1873 return TRUE;
1874 case STATUS_KEY_SHRINK:
1875 create_status_debuff(target->hudElementDataIndex, STATUS_KEY_SHRINK);
1876 return TRUE;
1877 }
1878 }
1879 return TRUE;
1880 } else {
1881 return FALSE;
1882 }
1883 break;
1884 case STATUS_KEY_STATIC:
1885 if (target->actorID != ACTOR_PARTNER) {
1886 target->staticStatus = statusTypeKey;
1887 target->staticDuration = duration;
1888 if ((s8)duration > 9) {
1889 target->staticDuration = 9;
1890 }
1891 target->statusAfflicted = STATUS_KEY_STATIC;
1893 create_status_static(target->hudElementDataIndex, STATUS_KEY_STATIC);
1894 }
1895 return TRUE;
1896 case STATUS_KEY_STONE:
1897 if (target->actorID != ACTOR_PARTNER) {
1898 target->stoneStatus = STATUS_KEY_STONE;
1899 target->stoneDuration = duration;
1900 if ((s8)duration > 9) {
1901 target->stoneDuration = 9;
1902 }
1903 target->statusAfflicted = STATUS_KEY_STONE;
1904 }
1905 return TRUE;
1906 case STATUS_KEY_KO:
1907 if (target->koStatus < statusTypeKey) {
1908 target->koStatus = STATUS_KEY_KO;
1909 target->koDuration = duration;
1910 if ((s8)duration > 9) {
1911 target->koDuration = 9;
1912 }
1913 target->statusAfflicted = STATUS_KEY_KO;
1914 }
1915 return TRUE;
1917 if (target->actorID != ACTOR_PARTNER) {
1918 target->transparentStatus = STATUS_KEY_TRANSPARENT;
1919 target->transparentDuration = duration;
1920 if ((s8)duration > 9) {
1921 target->transparentDuration = 9;
1922 }
1923 target->statusAfflicted = STATUS_KEY_TRANSPARENT;
1925 }
1926 return TRUE;
1927 case 0:
1928 case STATUS_KEY_NORMAL:
1929 case STATUS_KEY_DEFAULT:
1930 default:
1931 return TRUE;
1932 }
1933}
1934
1937 if (statusTypeKey != target->koStatus) {
1940 } else {
1941 target->koDuration += duration;
1942 if (target->koDuration > 9) {
1943 target->koDuration = 9;
1944 }
1945 }
1946 }
1947
1948 return TRUE;
1949}
1950
1951s32 get_defense(Actor* actor, s32* defenseTable, s32 elementFlags) {
1953 s32 minDefense = 255;
1954
1955 if (defenseTable != NULL) {
1956
1957 #define CHECK_DEFENSE(element) \
1958 if (elementFlags & DAMAGE_TYPE_##element) { \
1959 elemDefense = lookup_defense(defenseTable, ELEMENT_##element); \
1960 if (elemDefense < minDefense) { \
1961 minDefense = elemDefense; \
1962 } \
1963 } \
1964
1976
1977 #undef CHECK_DEFENSE
1978 }
1979
1980 // If no element flags were set, fall back to normal defense.
1981 if (minDefense == 255) {
1982 elemDefense = lookup_defense(defenseTable, ELEMENT_NORMAL);
1983 if (elemDefense < 255) {
1985 }
1986 }
1987
1989 if (minDefense == 99) {
1990 // Immune
1991 minDefense = 999;
1992 } else if (minDefense > 0) {
1993 minDefense = 0;
1994 }
1995 }
1996
1997 return minDefense;
1998}
1999
2000// refresh the first (primary) damage popup
2001void show_primary_damage_popup(f32 posX, f32 posY, f32 posZ, s32 damageAmt, b32 angle) {
2002 s32 i;
2003
2004 for (i = 0; i < 1; i++) {
2005 if (gDamageCountEffects[i] == NULL) {
2006 break;
2007 }
2008 }
2009
2010 if (i > 0) {
2011 i = 0;
2014 }
2015
2016 if (angle == 0) {
2017 angle = -55;
2018 } else {
2019 angle = 55;
2020 }
2021
2022 fx_damage_indicator(0, posX, posY, posZ, 10.0f, angle, damageAmt, &gDamageCountEffects[i]);
2023 gDamageCountTimers[i] = 40;
2024}
2025
2026// show another damage popup, if any are available
2027void show_next_damage_popup(f32 posX, f32 posY, f32 posZ, s32 damageAmt, b32 angle) {
2028 s32 i;
2029
2030 for (i = 0; i < ARRAY_COUNT(gDamageCountEffects); i++) {
2031 if (gDamageCountEffects[i] == NULL) {
2032 break;
2033 }
2034 }
2035
2036 if (i > ARRAY_COUNT(gDamageCountEffects) - 1) {
2037 i = 0;
2040 }
2041
2042 if (angle == 0) {
2043 angle = -55;
2044 } else {
2045 angle = 55;
2046 }
2047
2048 fx_damage_indicator(0, posX, posY, posZ, 10.0f, angle, damageAmt, &gDamageCountEffects[i]);
2049 gDamageCountTimers[i] = 40;
2050}
2051
2053 s32 i;
2054
2055 for (i = 0; i < ARRAY_COUNT(gDamageCountEffects); i++) {
2056 if (gDamageCountEffects[i] != NULL) {
2057 gDamageCountTimers[i]--;
2058 if (gDamageCountTimers[i] == 0) {
2061 }
2062 }
2063 };
2064}
2065
2066void show_damage_fx(Actor* actor, f32 x, f32 y, f32 z, s32 damage) {
2068 s32 intensity;
2069
2070 if (damage < 3) {
2071 intensity = DAMAGE_INTENSITY_LIGHT;
2072 } else if (damage < 5) {
2073 intensity = DAMAGE_INTENSITY_MEDIUM;
2074 } else if (damage < 9) {
2075 intensity = DAMAGE_INTENSITY_HEAVY;
2076 } else {
2077 intensity = DAMAGE_INTENSITY_EXTREME;
2078 }
2079
2080 if (battleStatus->curAttackElement & DAMAGE_TYPE_FIRE) {
2081 fx_ring_blast(0, x, y, z, 1.0f, 24);
2082 } else if (battleStatus->curAttackElement & DAMAGE_TYPE_SHOCK) {
2083 apply_shock_effect(actor);
2084 } else if (battleStatus->curAttackElement & DAMAGE_TYPE_WATER) {
2085 fx_water_splash(0, x, y, z, 1.0f, 24);
2086 } else {
2087 fx_firework(0, x, y, z, 1.0, intensity);
2088 }
2089}
2090
2091// grossness
2092void show_action_rating(s32 rating, Actor* actor, f32 x, f32 y, f32 z) {
2094 Actor* player;
2095 s32 new_var; // TODO required to match
2096 s32 type;
2097
2098 actor->attackResultEffect = actor->attackResultEffect; // TODO required to match
2099 player = battleStatus->playerActor;
2100
2101 if (actor->attackResultEffect == NULL) {
2102 type = 0;
2103 switch (rating) {
2104 case ACTION_RATING_NICE:
2105 type = 0;
2106 actor->actionRatingCombo = 1;
2107 break;
2108 case ACTION_RATING_MISS:
2109 type = 4;
2110 actor->actionRatingCombo = 0;
2111 break;
2113 type = 3;
2114 actor->actionRatingCombo = 0;
2115 break;
2117 type = 2;
2118 actor->actionRatingCombo = 2;
2119 break;
2121 type = 0;
2122 actor->actionRatingCombo = 0;
2123 break;
2125 type = player->actionRatingCombo;
2126 player->actionRatingCombo++;
2127 if (player->actionRatingCombo > 2) {
2128 player->actionRatingCombo = 2;
2129 }
2130 break;
2131 }
2132 actor->attackResultEffect = fx_attack_result_text(type, x, y, z - 10.0f, 12.0f, 90);
2133 actor->actionRatingTime = 80;
2134 new_var = 2; // TODO required to match
2135 } else {
2137 type = actor->actionRatingCombo;
2138 new_var = rating; // TODO required to match
2139 switch (new_var) { // TODO required to match
2140 case ACTION_RATING_NICE:
2141 actor->actionRatingCombo++;
2142 if (actor->actionRatingCombo > 2) {
2143 actor->actionRatingCombo = 2;
2144 }
2145 break;
2146 case ACTION_RATING_MISS:
2147 type = 4;
2148 break;
2150 type = 3;
2151 break;
2153 type = 2;
2154 break;
2156 type = 0;
2157 break;
2159 type = player->actionRatingCombo;
2160 player->actionRatingCombo++;
2161 if (player->actionRatingCombo > 2) {
2162 player->actionRatingCombo = 2;
2163 }
2164 break;
2165 }
2166 actor->attackResultEffect = fx_attack_result_text(type, x, y, z - 10.0f, 12.0f, 90);
2167 actor->actionRatingTime = 80;
2168 }
2169}
2170
2172 target->actionRatingCombo = 0;
2173}
2174
2177 Actor* actor;
2178 s32 i;
2179
2180 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2181 actor = gBattleStatus.enemyActors[i];
2182 if (actor != NULL) {
2183 if (actor->actionRatingTime == 60) {
2184 if (actor->attackResultEffect != NULL) {
2186 }
2187 }
2188 if (actor->actionRatingTime == 5) {
2189 if (actor->attackResultEffect != NULL) {
2191 actor->attackResultEffect = NULL;
2192 }
2193 }
2194 if (actor->actionRatingTime > 0) {
2195 actor->actionRatingTime--;
2196 }
2197 }
2198 }
2199
2200 actor = battleStatus->playerActor;
2201 if (actor != NULL) {
2202 if (actor->actionRatingTime == 60) {
2203 if (actor->attackResultEffect != NULL) {
2205 }
2206 }
2207 if (actor->actionRatingTime == 5) {
2208 if (actor->attackResultEffect != NULL) {
2210 actor->attackResultEffect = NULL;
2211 }
2212 }
2213 if (actor->actionRatingTime > 0) {
2214 actor->actionRatingTime--;
2215 }
2216 }
2217
2218 actor = battleStatus->partnerActor;
2219 if (actor != NULL) {
2220 if (actor->actionRatingTime == 60) {
2221 if (actor->attackResultEffect != NULL) {
2223 }
2224 }
2225 if (actor->actionRatingTime == 5) {
2226 if (actor->attackResultEffect != NULL) {
2228 actor->attackResultEffect = NULL;
2229 }
2230 }
2231 if (actor->actionRatingTime > 0) {
2232 actor->actionRatingTime--;
2233 }
2234 }
2235}
2236
2238 target->healthBarHideTime = -1;
2240}
2241
2243 target->healthBarHideTime = 0;
2245}
2246
2248 s32 i;
2249
2250 for (i = 0; i < ARRAY_COUNT(gBattleStatus.enemyActors); i++) {
2251 Actor* enemy = gBattleStatus.enemyActors[i];
2252
2253 if (enemy != NULL) {
2254 if (enemy->healthBarHideTime > 0) {
2255 enemy->healthBarHideTime--;
2256 if (enemy->healthBarHideTime == 0) {
2258 }
2259 }
2260 }
2261 }
2262}
2263
2266 s32 chance;
2267 s32 duration;
2268
2269 if (battleStatus->statusChance == STATUS_KEY_IGNORE_RES) {
2270 duration = battleStatus->statusDuration;
2273 }
2274
2275 duration = 0;
2276
2277 if (actor->statusTable != NULL) {
2278 if (!(battleStatus->curAttackStatus & STATUS_FLAG_RIGHT_ON)) {
2280 } else {
2282 if (chance != 0) {
2283 chance = 100;
2284 }
2285 }
2286
2287 if (chance > 0) {
2288 chance = (chance * battleStatus->statusChance) / 100;
2289 if (chance > 0 && chance >= rand_int(100)) {
2290 duration = 3;
2292 }
2293 }
2294 } else {
2295 duration = 3;
2296 }
2297
2298 if (duration > 0) {
2299 if (battleStatus->curAttackStatus & STATUS_FLAG_USE_DURATION) {
2300 duration = battleStatus->statusDuration;
2302 inflict_status(actor, statusTypeKey, duration);
2303 } else {
2304 inflict_status(actor, statusTypeKey, duration);
2305
2306 }
2307 } else {
2308 duration = 0;
2309 }
2310 return duration;
2311}
2312
2314 s32 statusDuration = 0;
2315
2316 if (actor->statusTable == NULL || lookup_status_chance(actor->statusTable, statusTypeKey) > 0) {
2317 statusDuration = duration;
2318 }
2319
2320 if (statusDuration > 0) {
2321 return inflict_status(actor, statusTypeKey, statusDuration);
2322 } else {
2323 return 0;
2324 }
2325}
2326
2328 if (part->idleAnimations != NULL && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
2329 DecorationTable* decorations = part->decorationTable;
2330
2331 if (decorations->paletteAdjustment != palAdjust) {
2332 decorations->paletteAdjustment = palAdjust;
2333 decorations->palAnimState = 0;
2334 decorations->resetPalAdjust = TRUE;
2335 }
2336 }
2337}
2338
2340 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2341 if (!(part->flags & ACTOR_PART_FLAG_INVISIBLE)
2342 && (part->idleAnimations != NULL)
2344 ) {
2346 }
2347 }
2348}
2349
2351 if (part->idleAnimations != NULL && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
2352 part->decorationTable->paletteAdjustment = ACTOR_PAL_ADJUST_NONE;
2353 }
2354}
2355
2357 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2358 DecorationTable* decorations = part->decorationTable;
2359
2361 && !(part->flags & ACTOR_PART_FLAG_INVISIBLE)
2362 && (part->idleAnimations != NULL)
2364 ) {
2367 ) {
2369 }
2370 }
2371 }
2372}
2373
2375 if (part->idleAnimations != NULL && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
2376 DecorationTable* decorations = part->decorationTable;
2377
2378 if (decorations->glowState != glowState) {
2379 decorations->glowState = glowState;
2380 decorations->glowUnk1 = 0;
2381 decorations->glowStateChanged = TRUE;
2382 }
2383 }
2384}
2385
2386void set_actor_glow_pal(Actor* actor, s32 glowState) {
2387 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2389 && (part->idleAnimations != NULL)
2391 ) {
2392 set_part_glow_pal(part, glowState);
2393 }
2394 }
2395}
2396
2398 if (part->idleAnimations != NULL && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
2399 part->decorationTable->glowState = GLOW_PAL_OFF;
2400 }
2401}
2402
2404 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2405 DecorationTable* decorations = part->decorationTable;
2406
2408 && part->idleAnimations != NULL
2410 ) {
2411 decorations->glowState = GLOW_PAL_OFF;
2412 }
2413 }
2414}
2415
2417 if (part->idleAnimations != NULL && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
2418 DecorationTable* decorations = part->decorationTable;
2419
2420 if (decorations->flashState != flashState) {
2421 decorations->flashState = flashState;
2422 decorations->flashMode = FLASH_MODE_LIGHT;
2423 decorations->flashStateChanged = TRUE;
2424 }
2425 }
2426}
2427
2428void set_actor_flash_mode(Actor* actor, s32 flashState) {
2429 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2431 && part->decorationTable != NULL
2433 && part->idleAnimations != NULL
2434 ) {
2435 set_part_flash_mode(part, flashState);
2436 }
2437 }
2438}
2439
2441 if (part->idleAnimations != NULL && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
2442 part->decorationTable->flashState = 0;
2443 }
2444}
2445
2447 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2448 DecorationTable* decorations = part->decorationTable;
2449
2451 && (part->idleAnimations != NULL)
2453 ) {
2454 decorations->flashState = 0;
2455 }
2456 }
2457}
2458
2460 if ((part->idleAnimations) && !(part->flags & ACTOR_PART_FLAG_NO_DECORATIONS)) {
2461 DecorationTable* decorations = part->decorationTable;
2462
2464 decorations->type[decorationIndex] = decorationType;
2465 decorations->changed[decorationIndex] = TRUE;
2466 decorations->state[decorationIndex] = 0;
2468 }
2469}
2470
2471void add_actor_decoration(Actor* actor, s32 decorationIndex, s32 decorationType) {
2472 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2474 && part->idleAnimations
2476 ) {
2477 add_part_decoration(part, decorationIndex, decorationType);
2478 }
2479 }
2480}
2481
2485
2487 for (ActorPart* part = actor->partsTable; part != NULL; part = part->nextPart) {
2489 && part->idleAnimations != NULL
2491 ) {
2493 }
2494 }
2495}
2496
2500
2501 switch (actorClass) {
2502 case ACTOR_CLASS_PLAYER:
2505 }
2506 break;
2509 break;
2510 case ACTOR_CLASS_ENEMY:
2511 break;
2512 }
2513
2514 return hasAbility;
2515}
2516
2517void create_part_shadow(s32 actorID, s32 partID) {
2518 ActorPart* part = get_actor_part(get_actor(actorID), partID);
2519
2521 part->shadowIndex = create_shadow_type(SHADOW_VARYING_CIRCLE, part->curPos.x, part->curPos.y, part->curPos.z);
2522 part->shadowScale = part->size.x / 24.0;
2523}
2524
2525void remove_part_shadow(s32 actorID, s32 partID) {
2526 ActorPart* part = get_actor_part(get_actor(actorID), partID);
2527
2529 delete_shadow(part->shadowIndex);
2530}
2531
2534 part->shadowIndex = create_shadow_type(SHADOW_VARYING_CIRCLE, part->curPos.x, part->curPos.y, part->curPos.z);
2535 part->shadowScale = part->size.x / 24.0;
2536}
2537
2540 Actor* player = battleStatus->playerActor;
2541 Actor* partner = battleStatus->partnerActor;
2543
2545 battleStatus->jumpCharge = 0;
2547 }
2549 battleStatus->hammerCharge = 0;
2551 }
2552 if (buffs & PLAYER_BUFF_STONE) {
2553 player->stoneDuration = 0;
2554 player->stoneStatus = 0;
2555 }
2556 if (buffs & PLAYER_BUFF_HUSTLE) {
2557 battleStatus->hustleTurns = 0;
2559 }
2560 if (buffs & PLAYER_BUFF_STATIC && (player->staticStatus != 0)) {
2561 player->staticDuration = 0;
2562 player->staticStatus = 0;
2564 }
2565 if (buffs & PLAYER_BUFF_TRANSPARENT && (player->transparentStatus != 0)) {
2566 player->transparentDuration = 0;
2567 player->transparentStatus = 0;
2570 }
2571 if (buffs & PLAYER_BUFF_WATER_BLOCK && (battleStatus->waterBlockTurnsLeft != 0)) {
2572 battleStatus->waterBlockTurnsLeft = 0;
2573 battleStatus->buffEffect->data.partnerBuff->unk_0C[FX_BUFF_DATA_WATER_BLOCK].turnsLeft = 0;
2574 battleStatus->waterBlockEffect->flags |= FX_INSTANCE_FLAG_DISMISS;
2575
2576 fx_water_block(FX_WATER_BLOCK_DESTROY, player->curPos.x, player->curPos.y + 18.0f, player->curPos.z + 5.0f, 1.5f, 10);
2577 fx_water_splash(0, player->curPos.x - 10.0f, player->curPos.y + 5.0f, player->curPos.z + 5.0f, 1.0f, 24);
2578 fx_water_splash(0, player->curPos.x - 15.0f, player->curPos.y + 32.0f, player->curPos.z + 5.0f, 1.0f, 24);
2579 fx_water_splash(1, player->curPos.x + 15.0f, player->curPos.y + 22.0f, player->curPos.z + 5.0f, 1.0f, 24);
2580
2581 battleStatus->waterBlockEffect = NULL;
2583 }
2584 if (buffs & PLAYER_BUFF_TURBO_CHARGE && (battleStatus->turboChargeTurnsLeft != 0)) {
2585 battleStatus->turboChargeTurnsLeft = 0;
2586 battleStatus->buffEffect->data.partnerBuff->unk_0C[FX_BUFF_DATA_TURBO_CHARGE].turnsLeft = 0;
2587 }
2588 if (buffs & PLAYER_BUFF_CLOUD_NINE && (battleStatus->cloudNineTurnsLeft != 0)) {
2589 battleStatus->cloudNineTurnsLeft = 0;
2590 battleStatus->buffEffect->data.partnerBuff->unk_0C[FX_BUFF_DATA_CLOUD_NINE].turnsLeft = 0;
2591 remove_effect(battleStatus->cloudNineEffect);
2592 battleStatus->cloudNineEffect = NULL;
2593 }
2594
2596 partner->isGlowing = FALSE;
2598 }
2599}
2600
2603 Actor* player = battleStatus->playerActor;
2604 Actor* partner = battleStatus->partnerActor;
2605 s32 koDuration = player->koDuration;
2606 s32 i;
2607
2608 player->koDuration = player->debuffDuration;
2609 if (player->koDuration > 0) {
2610 player->koStatus = STATUS_KEY_KO;
2611 player->disableEffect->data.disableX->koDuration = player->koDuration;
2612
2613 if (koDuration == 0) {
2615 }
2616 }
2617
2618 if (partner != NULL) {
2619 if (partner->koDuration < partner->debuffDuration) {
2620 partner->koStatus = STATUS_KEY_KO;
2621 partner->koDuration = partner->debuffDuration;
2622 }
2623
2624 if (partner->koDuration > 0) {
2625 partner->koStatus = STATUS_KEY_KO;
2626 partner->disableEffect->data.disableX->koDuration = partner->koDuration;
2627 }
2628 }
2629
2630 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2631 Actor* enemy = battleStatus->enemyActors[i];
2632
2633 if (enemy != NULL) {
2634 enemy->koDuration = enemy->debuffDuration;
2635 if (enemy->koDuration > 0) {
2636 enemy->koStatus = STATUS_KEY_KO;
2638 }
2639 }
2640 }
2641}
2642
2662
2664 u16 right = left + arg6;
2665 u16 bottom = top + arg7;
2666
2668}
2669
2671 ActorPart* partIt = &actor->partsTable[0];
2672
2673 actor->actorTypeData1[0] = bActorSoundTable[actor->actorType].walk[0];
2674 actor->actorTypeData1[1] = bActorSoundTable[actor->actorType].walk[1];
2675 actor->actorTypeData1[2] = bActorSoundTable[actor->actorType].fly[0];
2676 actor->actorTypeData1[3] = bActorSoundTable[actor->actorType].fly[1];
2677 actor->actorTypeData1[4] = bActorSoundTable[actor->actorType].jump;
2678 actor->actorTypeData1[5] = bActorSoundTable[actor->actorType].hurt;
2679 actor->actorTypeData1b[0] = bActorSoundTable[actor->actorType].delay[0];
2680 actor->actorTypeData1b[1] = bActorSoundTable[actor->actorType].delay[1];
2681
2682 while (partIt != NULL) {
2683 partIt->partTypeData[0] = actor->actorTypeData1[0];
2684 partIt->partTypeData[1] = actor->actorTypeData1[1];
2685 partIt->partTypeData[2] = actor->actorTypeData1[2];
2686 partIt->partTypeData[3] = actor->actorTypeData1[3];
2687 partIt->partTypeData[4] = actor->actorTypeData1[4];
2688 partIt->partTypeData[5] = actor->actorTypeData1[5];
2689 partIt->actorTypeData2b[0] = actor->actorTypeData1b[0];
2690 partIt->actorTypeData2b[1] = actor->actorTypeData1b[1];
2691 partIt = partIt->nextPart;
2692 }
2693}
2694
2696 Stage* stage = gBattleStatus.curStage;
2697
2698 if (stage != NULL && stage->foregroundModelList != NULL) {
2699 s32* idList = stage->foregroundModelList;
2700 while (*idList != STAGE_MODEL_LIST_END) {
2701 s32 id = *idList++;
2702 if (id >= 0) {
2704 model->flags |= MODEL_FLAG_HIDDEN;
2705 }
2706 }
2707 }
2708}
2709
2711 Stage* stage = gBattleStatus.curStage;
2712
2713 if (stage != NULL && stage->foregroundModelList != NULL) {
2714 s32* idList = stage->foregroundModelList;
2715 while (*idList != STAGE_MODEL_LIST_END) {
2716 s32 id = *idList++;
2717 if (id >= 0) {
2719 model->flags &= ~MODEL_FLAG_HIDDEN;
2720 }
2721 }
2722 }
2723}
2724
2726 Stage* stage = gBattleStatus.curStage;
2727
2728 if (stage != NULL && stage->foregroundModelList != NULL) {
2729 s32* idList = stage->foregroundModelList;
2730 while (*idList != STAGE_MODEL_LIST_END) {
2731 s32 id = *idList++;
2732 if (id < 0) {
2733 break;
2734 } else {
2736 model->flags |= MODEL_FLAG_HIDDEN;
2737 }
2738
2739 }
2740 }
2741}
2742
2744 Stage* stage = gBattleStatus.curStage;
2745
2746 if (stage != NULL && stage->foregroundModelList != NULL) {
2747 s32* idList = stage->foregroundModelList;
2748 while (*idList != STAGE_MODEL_LIST_END) {
2749 s32 id = *idList++;
2750 if (id < 0) {
2751 break;
2752 } else {
2754 model->flags &= ~MODEL_FLAG_HIDDEN;
2755 }
2756 }
2757 }
2758}
2759
2761
2763 Call(N(StartRumbleWithParams), 256, 30)
2764 Call(N(StartRumbleWithParams), 200, 15)
2765 Call(N(StartRumbleWithParams), 50, 15)
2766 Return
2767 End
2768};
2769
2775
2781
2787
2793
2799
2805
2811
2817
2823
2829
void set_part_flag_bits(s32 actorID, s32 partID, s32 flags)
Definition 190B20.c:831
void load_partner_actor(void)
Definition 190B20.c:1154
void reset_all_actor_sounds(Actor *actor)
Definition 190B20.c:2670
s32 btl_are_all_enemies_defeated(void)
Definition 190B20.c:636
s32 lookup_status_duration_mod(s32 *statusTable, s32 statusKey)
Definition 190B20.c:1797
void hide_foreground_models(void)
Definition 190B20.c:2725
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2497
void remove_actor_decoration(Actor *actor, s32 decorationIndex)
Definition 190B20.c:2486
f32 D_802938A4
Definition 190B20.c:9
s32 func_8026324C(Actor *actor, Actor *targetActor)
Definition 190B20.c:562
void set_actor_anim_by_ref(Actor *actor, ActorPart *part, AnimID anim)
Definition 190B20.c:779
void start_rumble_type(u32 type)
Definition 190B20.c:2830
Gfx D_80293970[]
Definition 190B20.c:31
void btl_init_menu_items(void)
Definition 190B20.c:601
void remove_player_buffs(s32 buffs)
Definition 190B20.c:2538
s32 func_80263064(Actor *actor, Actor *targetActor, b32 unused)
Definition 190B20.c:480
s32 bMarioDefenseTable[]
Definition actors.c:105
void add_xz_vec3f_copy1(Vec3f *vector, f32 speed, f32 angleDeg)
Definition 190B20.c:880
s32 btl_check_player_defeated(void)
Definition 190B20.c:661
void btl_appendGfx_prim_quad(u8 r, u8 g, u8 b, u8 a, u16 left, u16 top, u16 right, u16 bottom)
Definition 190B20.c:2643
s32 gDamageCountTimers[]
Definition 190B20.c:22
#define CHECK_DEFENSE(element)
void btl_update_ko_status(void)
Definition 190B20.c:2601
void show_next_damage_popup(f32 posX, f32 posY, f32 posZ, s32 damageAmt, b32 angle)
Definition 190B20.c:2027
void set_part_pal_adjustment(ActorPart *part, s32 palAdjust)
Definition 190B20.c:2327
s32 inflict_status(Actor *target, s32 statusTypeKey, s32 duration)
Definition 190B20.c:1816
void update_damage_popups(void)
Definition 190B20.c:2052
void add_part_decoration(ActorPart *part, s32 decorationIndex, s32 decorationType)
Definition 190B20.c:2459
void reset_actor_turn_info(void)
Definition 190B20.c:710
void clear_part_flash_mode(ActorPart *part)
Definition 190B20.c:2440
void clear_actor_static_pal_adjustments(Actor *actor)
Definition 190B20.c:2356
void show_damage_fx(Actor *actor, f32 x, f32 y, f32 z, s32 damage)
Definition 190B20.c:2066
void btl_check_can_change_partner(void)
Definition 190B20.c:566
PartnerDMAData bPartnerDmaTable[]
Definition partner_dma.c:26
void hide_foreground_models_unchecked(void)
Definition 190B20.c:2695
void create_home_target_list(Actor *actor)
Definition 190B20.c:476
s32 count_power_plus(s32 damageType)
Definition 190B20.c:671
void create_target_list(Actor *actor, b32 targetHomePos)
Definition 190B20.c:56
void add_xz_vec3f(Vec3f *vector, f32 speed, f32 angleDeg)
Definition 190B20.c:871
void clear_actor_flash_mode(Actor *actor)
Definition 190B20.c:2446
void hide_actor_health_bar(Actor *target)
Definition 190B20.c:2242
void set_part_flash_mode(ActorPart *part, s32 flashState)
Definition 190B20.c:2416
EvtScript EVS_BattleRumble_Long
Definition 190B20.c:2762
EvtScript EVS_BattleRumble_HitLight
Definition 190B20.c:2776
EvtScript EVS_BattleRumble_PlayerMin
Definition 190B20.c:2800
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:923
s16 D_802938A8
Definition 190B20.c:11
EvtScript EVS_BattleRumble_HitHeavy
Definition 190B20.c:2782
void set_actor_pal_adjustment(Actor *actor, s32 palAdjust)
Definition 190B20.c:2339
s32 get_defense(Actor *actor, s32 *defenseTable, s32 elementFlags)
Definition 190B20.c:1951
void add_xz_vec3f_copy2(Vec3f *vector, f32 speed, f32 angleDeg)
Definition 190B20.c:889
void set_actor_anim(s32 actorID, s32 partID, AnimID animID)
Definition 190B20.c:737
ActorPartBlueprint bMarioParts[]
Definition actors.c:154
EvtScript EVS_BattleRumble_HitMin
Definition 190B20.c:2770
void create_part_shadow_by_ref(UNK_TYPE arg0, ActorPart *part)
Definition 190B20.c:2532
void set_actor_anim_rate(s32 actorID, s32 partID, f32 rate)
Definition 190B20.c:800
void show_action_rating(s32 rating, Actor *actor, f32 x, f32 y, f32 z)
Definition 190B20.c:2092
EvtScript EVS_BattleRumble_PlayerMax
Definition 190B20.c:2824
void set_part_glow_pal(ActorPart *part, s32 glowState)
Definition 190B20.c:2374
void show_foreground_models_unchecked(void)
Definition 190B20.c:2710
ActorBlueprint bPlayerActorBlueprint
Definition actors.c:135
void set_actor_flash_mode(Actor *actor, s32 flashState)
Definition 190B20.c:2428
void update_health_bars(void)
Definition 190B20.c:2247
EvtScript EVS_BattleRumble_PlayerHeavy
Definition 190B20.c:2812
void deduct_current_move_fp(void)
Definition 190B20.c:693
void play_movement_dust_effects(s32 var0, f32 xPos, f32 yPos, f32 zPos, f32 angleDeg)
Definition 190B20.c:898
void clear_part_pal_adjustment(ActorPart *part)
Definition 190B20.c:2350
s32 get_player_anim_for_status(s32 statusKey)
Definition 190B20.c:1697
void btl_draw_prim_quad(u8 r, u8 g, u8 b, u8 a, u16 left, u16 top, u16 arg6, u16 arg7)
Definition 190B20.c:2663
void clear_part_flag_bits(s32 actorID, s32 partID, s32 flags)
Definition 190B20.c:851
void set_actor_glow_pal(Actor *actor, s32 glowState)
Definition 190B20.c:2386
s32 inflict_status_set_duration(Actor *actor, s32 statusTypeKey, s32 statusDurationKey, s32 duration)
Definition 190B20.c:2313
void set_part_yaw(s32 actorID, s32 partID, s32 value)
Definition 190B20.c:827
void add_actor_decoration(Actor *actor, s32 decorationIndex, s32 decorationType)
Definition 190B20.c:2471
EvtScript EVS_BattleRumble_HitMax
Definition 190B20.c:2794
EvtScript EVS_BattleRumble_PlayerLight
Definition 190B20.c:2806
void set_actor_yaw(s32 actorID, s32 yaw)
Definition 190B20.c:823
void remove_part_shadow(s32 actorID, s32 partID)
Definition 190B20.c:2525
EvtScript EVS_BattleRumble_HitExtreme
Definition 190B20.c:2788
void load_player_actor(void)
Definition 190B20.c:940
void show_actor_health_bar(Actor *target)
Definition 190B20.c:2237
void update_action_ratings(void)
Definition 190B20.c:2175
s32 bCurRumbleScript
Definition 190B20.c:44
s32 try_inflict_status(Actor *actor, s32 statusTypeKey, s32 statusTurnsKey)
Definition 190B20.c:2264
void show_primary_damage_popup(f32 posX, f32 posY, f32 posZ, s32 damageAmt, b32 angle)
Definition 190B20.c:2001
void clear_part_glow_pal(ActorPart *part)
Definition 190B20.c:2397
s32 get_npc_anim_for_status(AnimID *, s32)
Definition 190B20.c:1676
void create_current_pos_target_list(Actor *actor)
Definition 190B20.c:472
void cancel_action_rating_combo(Actor *target)
Definition 190B20.c:2171
s32 func_80263230(Actor *actor, Actor *targetActor)
Definition 190B20.c:558
EffectInstance * gDamageCountEffects[]
Definition 190B20.c:13
s32 btl_check_enemies_defeated(void)
Definition 190B20.c:653
s32 bPlayerStatusTable[]
Definition actors.c:110
s32 inflict_partner_ko(Actor *target, s32 statusTypeKey, s32 duration)
Definition 190B20.c:1935
void show_foreground_models(void)
Definition 190B20.c:2743
void remove_part_decoration(ActorPart *part, s32 decorationIndex)
Definition 190B20.c:2482
s32 lookup_defense(s32 *defenseTable, s32 elementKey)
Definition 190B20.c:1759
Actor * create_actor(Formation formation)
Definition 190B20.c:1408
void clear_actor_glow_pal(Actor *actor)
Definition 190B20.c:2403
s32 lookup_status_chance(s32 *statusTable, s32 statusKey)
Definition 190B20.c:1778
EvtScript EVS_BattleRumble_PlayerExtreme
Definition 190B20.c:2818
void create_part_shadow(s32 actorID, s32 partID)
Definition 190B20.c:2517
BSS s32 PopupMenu_SelectedIndex
s16 equippedBadges[64]
Vec2b statusIconOffset
struct EffectInstance * disableEffect
struct Evt * handlePhaseScript
struct EffectInstance * attackResultEffect
ActorPartBlueprint * staticData
struct Evt * takeTurnScript
struct EffectInstance * effect[2]
s8 actionRatingCombo
u32 * idleAnimations
s8 transparentStatus
EvtScript * handleEventSource
Vec2b statusTextOffset
EvtScript * idleSource
Vec2b healthBarOffset
s8 disableDismissTimer
f32 shadowScale
struct ActorBlueprint * actorBlueprint
s32 actorTypeData1[6]
s8 healthFraction
s8 selectedTargetIndex
s8 verticalRenderOffset
u8 footStepCounter
Vec3s headOffset
f32 scalingFactor
struct Evt * idleScript
union Actor::@38 shadow
s8 extraCoinBonus
ActorState state
s16 damageCounter
struct Evt * handleEventScript
struct ActorPart * partsTable
s32 takeTurnScriptID
s16 actorTypeData1b[2]
struct SelectableTarget targetData[24]
Vec3s rotPivotOffset
EvtScript * handlePhaseSource
s16 targetActorID
Vec3f scaleModifier
struct EffectInstance * icePillarEffect
Vec3s healthBarPos
s32 loopingSoundID[2]
s8 chillOutAmount
s32 b32
Vec3f homePos
Vec2bu size
struct ActorBlueprint * ActorBlueprint
s16 hudElementDataIndex
EvtScript * takeTurnSource
Vec3f curPos
s8 targetIndexList[24]
s8 instigatorValue
s16 hpChangeCounter
Bytecode EvtScript[]
s8 healthBarHideTime
s8 targetListLength
s8 statusAfflicted
struct ActorPart * nextPart
s8 staticDuration
s32 * statusTable
s8 debuffDuration
u32 AnimID
s8 transparentDuration
union Evt::@10 owner1
Initially -1.
s16 invItems[10]
s8 actionRatingTime
Vec3f scale
s8 flags
Definition demo_api.c:15
#define remove_effect
#define rand_int
#define clamp_angle
struct DisableXFXData * disableX
Definition effects.h:2529
@ FX_BUFF_DATA_TURBO_CHARGE
Definition effects.h:2320
@ FX_BUFF_DATA_CLOUD_NINE
Definition effects.h:2319
@ FX_BUFF_DATA_WATER_BLOCK
Definition effects.h:2318
struct AttackResultTextFXData * attackResultText
Definition effects.h:2536
struct DamageIndicatorFXData * damageIndicator
Definition effects.h:2494
EffectInstanceDataPtr data
Definition effects.h:2605
@ FX_WATER_BLOCK_DESTROY
Definition effects.h:1540
#define ASSERT(condition)
@ FX_INSTANCE_FLAG_DISMISS
Definition enums.h:3551
@ ACTION_RATING_SUPER
sets nice hits = 2
Definition enums.h:2008
@ ACTION_RATING_NICE_SUPER_COMBO
'Nice' but becomes 'Super' if nice hits > 2
Definition enums.h:2010
@ ACTION_RATING_NICE_NO_COMBO
clears nice hits
Definition enums.h:2009
@ ACTION_RATING_MISS
clears nice hits
Definition enums.h:2006
@ ACTION_RATING_LUCKY
clears nice hits
Definition enums.h:2007
@ ACTION_RATING_NICE
sets nice hits = 1
Definition enums.h:2005
@ ACTOR_CLASS_ENEMY
Definition enums.h:2112
@ ACTOR_CLASS_PLAYER
Definition enums.h:2110
@ ACTOR_CLASS_PARTNER
Definition enums.h:2111
@ ACTOR_CLASS_MASK
Definition enums.h:2113
@ PEACH_FLAG_IS_PEACH
Definition enums.h:2474
@ GLOW_PAL_OFF
Definition enums.h:2244
@ BS_FLAGS1_PLAYER_IN_BACK
Definition enums.h:3622
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3604
@ SCREEN_LAYER_BACK
Definition enums.h:2369
@ PLAYER_BUFF_PARTNER_GLOWING
Definition enums.h:2795
@ PLAYER_BUFF_JUMP_CHARGE
Definition enums.h:2786
@ PLAYER_BUFF_WATER_BLOCK
Definition enums.h:2794
@ PLAYER_BUFF_STONE
Definition enums.h:2788
@ PLAYER_BUFF_TURBO_CHARGE
Definition enums.h:2793
@ PLAYER_BUFF_CLOUD_NINE
Definition enums.h:2792
@ PLAYER_BUFF_TRANSPARENT
Definition enums.h:2791
@ PLAYER_BUFF_STATIC
Definition enums.h:2790
@ PLAYER_BUFF_HAMMER_CHARGE
Definition enums.h:2787
@ PLAYER_BUFF_HUSTLE
Definition enums.h:2789
@ ELEMENT_END
Definition enums.h:2147
@ ELEMENT_NORMAL
Definition enums.h:2148
@ DEMO_BTL_FLAG_PARTNER_ACTING
Definition enums.h:3577
@ ACTOR_PAL_ADJUST_FEAR
Definition enums.h:2230
@ ACTOR_PAL_ADJUST_BLEND_PALETTES_VARYING_INTERVALS
Definition enums.h:2239
@ ACTOR_PAL_ADJUST_POISON
Definition enums.h:2231
@ ACTOR_PAL_ADJUST_PARALYZE
Definition enums.h:2232
@ ACTOR_PAL_ADJUST_BLEND_PALETTES_UNIFORM_INTERVALS
Definition enums.h:2238
@ ACTOR_PAL_ADJUST_SLEEP
Definition enums.h:2228
@ ACTOR_PAL_ADJUST_STATIC
Definition enums.h:2229
@ ACTOR_PAL_ADJUST_NONE
Definition enums.h:2227
@ DAMAGE_INTENSITY_EXTREME
Definition enums.h:3543
@ DAMAGE_INTENSITY_LIGHT
Definition enums.h:3540
@ DAMAGE_INTENSITY_HEAVY
Definition enums.h:3542
@ DAMAGE_INTENSITY_MEDIUM
Definition enums.h:3541
@ ACTOR_PART_TARGET_NO_SMASH
Definition enums.h:1902
@ ACTOR_PART_TARGET_NO_JUMP
Definition enums.h:1901
@ SHADOW_VARYING_CIRCLE
Definition enums.h:2521
@ BTL_MENU_TYPE_ITEMS
Definition enums.h:3828
@ BS_FLAGS2_NO_TARGET_AVAILABLE
Definition enums.h:3647
@ BS_FLAGS2_IGNORE_DARKNESS
Definition enums.h:3648
@ BS_FLAGS2_PEACH_BATTLE
Definition enums.h:3643
@ STATUS_KEY_INACTIVE_DIZZY
Definition enums.h:2825
@ STATUS_KEY_THINKING
Definition enums.h:2829
@ STATUS_KEY_WEARY
Definition enums.h:2830
@ STATUS_KEY_PARALYZE
Definition enums.h:2806
@ STATUS_TURN_MOD_DEFAULT
Definition enums.h:2832
@ STATUS_KEY_FROZEN
Definition enums.h:2808
@ STATUS_KEY_INACTIVE_WEARY
Definition enums.h:2823
@ STATUS_KEY_TRANSPARENT
Definition enums.h:2815
@ STATUS_KEY_STATIC
Definition enums.h:2812
@ STATUS_END
Definition enums.h:2801
@ STATUS_KEY_KO
Definition enums.h:2814
@ STATUS_KEY_DANGER
Definition enums.h:2827
@ STATUS_KEY_SLEEP
Definition enums.h:2807
@ STATUS_KEY_UNUSED
Definition enums.h:2804
@ STATUS_KEY_STONE
Definition enums.h:2813
@ STATUS_KEY_STOP
Definition enums.h:2809
@ STATUS_KEY_INACTIVE
Definition enums.h:2819
@ STATUS_KEY_SHRINK
Definition enums.h:2811
@ STATUS_KEY_DIZZY
Definition enums.h:2805
@ STATUS_KEY_POISON
Definition enums.h:2810
@ STATUS_KEY_NORMAL
Definition enums.h:2802
@ STATUS_KEY_DEFAULT
Definition enums.h:2803
@ ITEM_TYPE_FLAG_BATTLE_USABLE
Definition enums.h:1861
@ MODEL_FLAG_HIDDEN
Definition enums.h:3943
@ TARGET_FLAG_SMASH_LIKE
Definition enums.h:1886
@ TARGET_FLAG_OVERRIDE
Definition enums.h:1897
@ TARGET_FLAG_PRIMARY_ONLY
Definition enums.h:1889
@ TARGET_FLAG_TATTLE
Definition enums.h:1891
@ TARGET_FLAG_JUMP_LIKE
Definition enums.h:1885
@ TARGET_FLAG_AIRLIFT
Definition enums.h:1884
@ TARGET_FLAG_NOT_BELOW
Definition enums.h:1888
@ TARGET_FLAG_DIR_RIGHT
Definition enums.h:1893
@ TARGET_FLAG_DIR_LEFT
Definition enums.h:1894
@ TARGET_FLAG_ALLOW_TARGET_ONLY
Definition enums.h:1890
@ TARGET_FLAG_PLAYER
Definition enums.h:1878
@ TARGET_FLAG_NOT_HIGH
Definition enums.h:1879
@ TARGET_FLAG_NOT_FLYING
Definition enums.h:1880
@ TARGET_FLAG_DIR_ABOVE
Definition enums.h:1896
@ TARGET_FLAG_NOT_BEHIND
Definition enums.h:1887
@ TARGET_FLAG_NO_CEILING
Definition enums.h:1892
@ TARGET_FLAG_PARTNER
Definition enums.h:1883
@ TARGET_FLAG_GROUND
Definition enums.h:1877
@ TARGET_FLAG_DIR_BELOW
Definition enums.h:1895
@ TARGET_FLAG_NOT_GROUND
Definition enums.h:1881
@ FLASH_MODE_LIGHT
Definition enums.h:2249
@ FLASH_PAL_OFF
Definition enums.h:2256
@ MOVE_TYPE_ATTACK_UP
Definition enums.h:4804
@ BATTLE_STATE_DEFEAT
Definition enums.h:3691
@ BATTLE_STATE_VICTORY
Definition enums.h:3690
@ STATUS_FLAG_RIGHT_ON
Definition enums.h:2863
@ STATUS_FLAG_USE_DURATION
Definition enums.h:2864
@ ABILITY_BERSERKER
Definition enums.h:457
@ ABILITY_FLOWER_SAVER
Definition enums.h:460
@ ABILITY_FEELING_FINE
Definition enums.h:450
@ ABILITY_FLOWER_FANATIC
Definition enums.h:474
@ ABILITY_ZAP_TAP
Definition enums.h:455
@ SOUND_INFLICT_KO
Definition enums.h:1548
@ SOUND_DESTROY_WATER_BLOCK
Definition enums.h:1018
@ RENDER_MODE_SURFACE_XLU_LAYER3
Definition enums.h:3333
@ RENDER_MODE_ALPHATEST
Definition enums.h:3310
@ BTL_RUMBLE_PLAYER_MIN
Definition enums.h:3858
@ BTL_RUMBLE_HIT_HEAVY
Definition enums.h:3855
@ BTL_RUMBLE_STOP
Definition enums.h:3851
@ BTL_RUMBLE_PLAYER_HEAVY
Definition enums.h:3860
@ BTL_RUMBLE_HIT_MIN
Definition enums.h:3853
@ BTL_RUMBLE_HIT_LIGHT
Definition enums.h:3854
@ BTL_RUMBLE_PLAYER_MAX
Definition enums.h:3862
@ BTL_RUMBLE_PLAYER_EXTREME
Definition enums.h:3861
@ BTL_RUMBLE_HIT_MAX
Definition enums.h:3857
@ BTL_RUMBLE_HIT_EXTREME
Definition enums.h:3856
@ BTL_RUMBLE_LONG
Definition enums.h:3852
@ BTL_RUMBLE_PLAYER_LIGHT
Definition enums.h:3859
@ ACTOR_PLAYER
Definition enums.h:2118
@ ACTOR_PARTNER
Definition enums.h:2119
@ ACTOR_FLAG_FLYING
Quake Hammer can't hit.
Definition enums.h:3363
@ ACTOR_FLAG_HEALTH_BAR_HIDDEN
Definition enums.h:3372
@ ACTOR_FLAG_MINOR_TARGET
Definition enums.h:3361
@ ACTOR_FLAG_UPSIDE_DOWN
HP bar offset below actor (e.g. Swooper when upside-down).
Definition enums.h:3365
@ ACTOR_FLAG_LOW_PRIORITY_TARGET
Definition enums.h:3360
@ ACTOR_FLAG_NO_TATTLE
Definition enums.h:3362
@ ACTOR_FLAG_TARGET_ONLY
Battle ends even if undefeated. No turn.
Definition enums.h:3368
@ ACTOR_FLAG_NO_DMG_APPLY
Damage is not applied to actor HP.
Definition enums.h:3374
@ DICTIONARY_KEY
Definition enums.h:4819
@ DICTIONARY_SIZE
Definition enums.h:4821
@ DICTIONARY_VALUE
Definition enums.h:4820
@ PARTNER_NONE
Definition enums.h:2919
@ PARTNER_GOOMPA
Definition enums.h:2924
@ ACTOR_PART_FLAG_TARGET_ONLY
Definition enums.h:3393
@ ACTOR_PART_FLAG_PRIMARY_TARGET
Definition enums.h:3396
@ ACTOR_PART_FLAG_SKIP_MOVEMENT_ALLOC
Definition enums.h:3400
@ ACTOR_PART_FLAG_NO_SHADOW
Definition enums.h:3386
@ ACTOR_PART_FLAG_USE_ABSOLUTE_POSITION
Definition enums.h:3395
@ ACTOR_PART_FLAG_NO_DECORATIONS
Definition enums.h:3385
@ ACTOR_PART_FLAG_NO_TATTLE
Definition enums.h:3390
@ ACTOR_PART_FLAG_IGNORE_BELOW_CHECK
Definition enums.h:3388
@ ACTOR_PART_FLAG_NO_TARGET
Cannot be targeted.
Definition enums.h:3394
@ ACTOR_PART_FLAG_INVISIBLE
Definition enums.h:3384
@ ACTOR_PART_FLAG_MINOR_TARGET
Definition enums.h:3389
@ DAMAGE_TYPE_IGNORE_DEFENSE
Definition enums.h:2911
@ DAMAGE_TYPE_SHOCK
Definition enums.h:2890
@ DAMAGE_TYPE_FIRE
Definition enums.h:2886
@ DAMAGE_TYPE_JUMP
Definition enums.h:2892
@ DAMAGE_TYPE_WATER
Definition enums.h:2887
@ EVT_PRIORITY_A
Definition evt.h:154
@ EVT_FLAG_RUN_IMMEDIATELY
don't wait for next update_scripts call
Definition evt.h:162
void create_status_debuff(s32, s32)
void create_status_transparent(s32, s32)
void _remove_part_decoration(ActorPart *part, s32 decorationIndex)
s32 is_ability_active(s32 arg0)
Definition inventory.c:1735
s32 get_model_list_index_from_tree_index(s32 treeIndex)
Definition model.c:3396
void create_status_static(s32, s32)
void remove_status_static(s32)
s32 create_status_icon_set(void)
f32 cos_rad(f32 x)
Definition 43F0.c:715
void remove_status_transparent(s32)
struct Model * get_model_from_list_index(s32 listIndex)
Definition model.c:3314
s32 is_partner_ability_active(s32)
Definition inventory.c:2071
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
void _add_part_decoration(ActorPart *)
Actor * get_actor(s32 actorID)
Definition actor_api.c:155
void kill_script_by_ID(s32 id)
s32 create_shadow_type(s32 type, f32 x, f32 y, f32 z)
Definition entity.c:1528
void get_screen_overlay_params(s32, u8 *type, f32 *zoom)
f32 sin_rad(f32 x)
Definition 43F0.c:711
void btl_set_state(s32 battleState)
void apply_shock_effect(Actor *)
void delete_shadow(s32)
Definition entity.c:626
void * heap_malloc(s32 size)
Definition heap.c:34
Definition model.h:59
void sfx_play_sound(s32 soundID)
#define PM_CC_PRIM_FULL_ALPHA
Definition macros.h:296
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:214
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define PANIC()
Definition macros.h:55
#define DEG_TO_RAD(deg)
Definition macros.h:146
#define STATUS_KEY_IGNORE_RES
Definition macros.h:234
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
Definition macros.h:577
#define EVT_LIMIT
Definition macros.h:48
#define Return
Kills the current EVT thread.
Definition macros.h:218
s32 spr_get_notify_value(s32 spriteInstanceID)
Definition sprite.c:1158
s32 spr_update_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale)
Definition sprite.c:1061
s32 spr_load_npc_sprite(s32 animID, u32 *extraAnimList)
Definition sprite.c:1015
s32 spr_update_player_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale)
Definition sprite.c:820
@ PLAYER_SPRITE_MAIN
Definition sprite.h:30
@ SPRITE_ID_TAIL_ALLOCATE
Definition sprite.h:18
s32 walk[2]
Definition battle.h:235
s32 * foregroundModelList
Definition battle.h:188
s16 delay[2]
Number of frames to wait between walk/fly sounds. Negative values are in distance.
Definition battle.h:239
s32 fly[2]
Definition battle.h:236
#define STAGE_MODEL_LIST_END
Definition battle.h:8
FormationRow Formation[]
Definition battle.h:167
#define DANGER_THRESHOLD
Definition battle.h:276
EXTERN_C ActorSounds bActorSoundTable[]
Definition battle.h:242
struct Stage * curStage
struct Actor * enemyActors[24]
#define UNK_TYPE
Definition types.h:6
s32 gBattleState
Definition battle.cpp:13
s32 gDefeatedBattleState
Definition battle.cpp:18
ItemData gItemTable[]
s32 bPeachIdleAnims[]
Definition actors.c:99
GameStatus * gGameStatusPtr
Definition main_loop.c:31
Gfx * gMainGfxPos
Definition cam_main.c:14
PlayerData gPlayerData
Definition 77480.c:39
BattleStatus gBattleStatus
Definition battle.cpp:14
u32 bMarioIdleAnims[]
Definition actors.c:30
s32 gBattleSubState
Definition battle.cpp:17
s32 gDefeatedBattleSubstate
Definition battle.cpp:16
MoveData gMoveTable[]
Vec3s StandardActorHomePositions[]
Definition actors.c:165