Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
dmg_partner.c
Go to the documentation of this file.
1#include "battle/battle.h"
2#include "script_api/battle.h"
3#include "effects.h"
4
6
7void dispatch_event_partner(s32 lastEventType) {
9 Actor* partnerActor = battleStatus->partnerActor;
10 Evt* handleEventScript = partnerActor->handleEventScript;
11 s32 onHitID = partnerActor->handleEventScriptID;
12 Evt* script;
13
14 partnerActor->lastEventType = lastEventType;
16 partnerActor->handleEventScript = script;
17 partnerActor->handleEventScriptID = script->id;
18 script->owner1.actorID = ACTOR_PARTNER;
19
20 if (partnerActor->takeTurnScript != nullptr) {
22 partnerActor->takeTurnScript = nullptr;
23 }
24
25 if (handleEventScript != nullptr) {
27 }
28}
29
32 Actor* partnerActor = battleStatus->partnerActor;
33 Evt* handleEventScript = partnerActor->handleEventScript;
34 s32 onHitID = partnerActor->handleEventScriptID;
35 Evt* script;
36
37 partnerActor->lastEventType = lastEventType;
39 partnerActor->handleEventScript = script;
40 partnerActor->handleEventScriptID = script->id;
41 script->owner1.actorID = ACTOR_PARTNER;
42
43 if (handleEventScript != nullptr) {
45 }
46}
47
50 Actor* partner = battleStatus->partnerActor;
51 s32 currentTargetID = battleStatus->curTargetID;
52 s32 currentTargetPart = battleStatus->curTargetPart;
54 ActorState* state;
56
57 battleStatus->curTargetID2 = battleStatus->curTargetID;
58 battleStatus->curTargetPart2 = battleStatus->curTargetPart;
60 state = &partner->state;
61
62 if (target == nullptr) {
63 return HIT_RESULT_HIT;
64 }
65
67 ASSERT(part != nullptr);
68
69 if (target->stoneStatus == STATUS_KEY_STONE) {
70 return HIT_RESULT_IMMUNE;
71 }
72
73 if ((part->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY) || target->transparentStatus == STATUS_KEY_TRANSPARENT) {
74 return HIT_RESULT_MISS;
75 }
76
77 // check partner jumping on top-spiky enemy (cannot be suppressed)
78 if ((battleStatus->curAttackElement & DAMAGE_TYPE_JUMP)
79 && (part->eventFlags & ACTOR_EVENT_FLAG_SPIKY_TOP)
80 && !(target->flags2 & ACTOR_FLAG_UPSIDE_DOWN)
81 ) {
84 }
85
86 // check partner contacting front-spiky enemy
87 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_JUMP))
88 && (part->eventFlags & ACTOR_EVENT_FLAG_SPIKY_FRONT)
89 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SPIKY_FRONT)
91 ) {
96 }
97
98 // check partner contacting fiery enemy
99 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SMASH))
100 && (part->eventFlags & ACTOR_EVENT_FLAG_FIREY)
101 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_BURN_CONTACT)
102 ) {
106 return HIT_RESULT_BACKFIRE;
107 }
108
109 // special handling for air lift
110 if (battleStatus->curAttackElement & DAMAGE_TYPE_AIR_LIFT) {
111 // check partner airlifting top-spiky enemy
112 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)) {
113 if ((part->eventFlags & ACTOR_EVENT_FLAG_SPIKY_TOP)
114 && !(target->flags & ACTOR_FLAG_UPSIDE_DOWN)
115 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SPIKY_TOP)
116 ) {
120 return HIT_RESULT_BACKFIRE;
121 }
122
123 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
124 && (part->eventFlags & ACTOR_EVENT_FLAG_ALT_SPIKY)
125 && !(target->flags & ACTOR_FLAG_UPSIDE_DOWN)
126 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_ALT_SPIKY)
127 ) {
131 return HIT_RESULT_BACKFIRE;
132 }
133 }
134
135 // check partner airlifting electrified enemy
136 if (partner->staticStatus != STATUS_KEY_STATIC
137 && (target->staticStatus == STATUS_KEY_STATIC || (part->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED))
138 && !(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
139 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT))
140 {
144 return HIT_RESULT_BACKFIRE;
145 }
146
147 // check partner airlifting fiery enemy
148 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SMASH))
149 && (part->eventFlags & ACTOR_EVENT_FLAG_FIREY)
150 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_BURN_CONTACT))
151 {
155 return HIT_RESULT_BACKFIRE;
156 }
158 }
159 return HIT_RESULT_HIT;
160}
161
164 Actor* partner = battleStatus->partnerActor;
165 s32 currentTargetID = battleStatus->curTargetID;
166 s32 currentTargetPartID = battleStatus->curTargetPart;
168 s32 partImmuneToElement = false;
169 s32 isFireDamage = false;
170 s32 isWaterDamage = false;
171 s32 isShockDamage = false;
172 s32 isIceDamage = false;
173 s32 wasSpecialHit = false;
174 s32 wasStatusInflicted = false;
175 Actor* target;
177 ActorState* state;
178 Evt* evt;
182
183 battleStatus->wasStatusInflicted = false;
184 battleStatus->lastAttackDamage = 0;
185 battleStatus->attackerActorID = partner->actorID;
186 battleStatus->curTargetID2 = battleStatus->curTargetID;
187 battleStatus->curTargetPart2 = battleStatus->curTargetPart;
189 state = &partner->state;
190
191 if (target == nullptr) {
192 return HIT_RESULT_HIT;
193 }
194
196
197 ASSERT(targetPart != nullptr);
198
199 target->lastDamageTaken = 0;
200
205 } else {
206 if ((targetPart->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY)
207 || (target->transparentStatus == STATUS_KEY_TRANSPARENT)
208 || ((targetPart->eventFlags & ACTOR_EVENT_FLAG_BURIED) && !(battleStatus->curAttackElement & DAMAGE_TYPE_QUAKE))
209 ) {
210 return HIT_RESULT_MISS;
211 }
212
213 if (target->stoneStatus == STATUS_KEY_STONE) {
215 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, 1);
216 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 0);
217
219 return HIT_RESULT_NICE;
220 } else {
221 return HIT_RESULT_HIT;
222 }
223 }
224
225 if (targetPart->elementalImmunities & battleStatus->curAttackElement) {
226 partImmuneToElement = true;
227 }
228
229 // check jumping on spiky enemy
230 if (battleStatus->curAttackElement & DAMAGE_TYPE_JUMP
232 ) {
236 return HIT_RESULT_BACKFIRE;
237 }
238
239 // check explode on contact
240 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
242 ) {
244
245 if (!(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_EXPLODE_CONTACT)) {
248 return HIT_RESULT_BACKFIRE;
249 }
250
252
254 return HIT_RESULT_NICE;
255 } else {
256 return HIT_RESULT_HIT;
257 }
258 }
259
260 // check touching fiery enemy
261 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SMASH))
262 && targetPart->eventFlags & ACTOR_EVENT_FLAG_FIREY
263 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_BURN_CONTACT)
264 ) {
268 return HIT_RESULT_BACKFIRE;
269 }
270
271 // check touching spiky-front enemy
272 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_JUMP))
274 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SPIKY_FRONT)
275 ) {
279 return HIT_RESULT_BACKFIRE;
280 }
281
282 // check explode on ignition
284 && battleStatus->curAttackElement & DAMAGE_TYPE_FIRE
286 ) {
289
291 return HIT_RESULT_NICE;
292 } else {
293 return HIT_RESULT_HIT;
294 }
295 }
296
297 // unknown alternate spiky #1
298 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
300 && !(target->flags & ACTOR_FLAG_UPSIDE_DOWN)
301 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_ALT_SPIKY)
302 ) {
306 return HIT_RESULT_BACKFIRE;
307 }
308
309 // unknown alternate spiky top
310 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
312 && !(target->flags & ACTOR_FLAG_UPSIDE_DOWN)
313 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SPIKY_TOP)
314 ) {
318 return HIT_RESULT_BACKFIRE;
319 }
320
321 // check explode on ignition (duplicate of previous check)
323 && battleStatus->curAttackElement & DAMAGE_TYPE_FIRE
325 ) {
328
330 return HIT_RESULT_NICE;
331 } else {
332 return HIT_RESULT_HIT;
333 }
334 }
335
336 // check shock contact for airlift
337 if (battleStatus->curAttackElement & DAMAGE_TYPE_AIR_LIFT) {
338 if (partner->staticStatus != STATUS_KEY_STATIC
339 && (target->staticStatus == STATUS_KEY_STATIC || targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED)
340 && !(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
341 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)
342 ) {
346 return HIT_RESULT_BACKFIRE;
347 } else {
348 return HIT_RESULT_HIT;
349 }
350 }
351
352 if (battleStatus->curAttackElement & DAMAGE_TYPE_FIRE) {
353 fx_ring_blast(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f, 1.0f, 24);
354 isFireDamage = true;
355 }
356
357 if (battleStatus->curAttackElement & DAMAGE_TYPE_SHOCK) {
359 isShockDamage = true;
360 }
361
362 if (battleStatus->curAttackElement & DAMAGE_TYPE_WATER) {
363 fx_water_splash(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f, 1.0f, 24);
364 isWaterDamage = true;
365 }
366
367 if (battleStatus->curAttackElement & DAMAGE_TYPE_ICE) {
368 fx_big_snowflakes(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f);
369 isIceDamage = true;
370 }
371
372 if (partner->staticStatus != STATUS_KEY_STATIC
373 && (target->staticStatus == STATUS_KEY_STATIC || targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED)
374 && !(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SHOCK))
375 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)
376 ) {
378 }
379
381 battleStatus->curAttackElement &= ~DAMAGE_TYPE_IGNORE_DEFENSE;
382 }
383
384 statusChanceOrDefense = get_defense(target, targetPart->defenseTable, battleStatus->curAttackElement);
385
386 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_IGNORE_DEFENSE)) {
387 statusChanceOrDefense += target->defenseBoost;
388 }
389
390 damageDealt = battleStatus->curAttackDamage + partner->attackBoost;
391
393 if (battleStatus->curAttackElement & DAMAGE_TYPE_BLAST
395 ) {
397 damageDealt = target->curHP;
398 }
399 }
400
401 if (battleStatus->curAttackElement & DAMAGE_TYPE_STATUS_ALWAYS_HITS) {
403 damageDealt = 0;
404 }
405
406 if (partner->debuff == STATUS_KEY_SHRINK) {
407 if (damageDealt != 0) {
408 damageDealt /= 2;
409
410 if (damageDealt == 0) {
411 damageDealt = 1;
412 }
413 }
414 }
415
416 if (damageDealt > 99) {
417 damageDealt = 99;
418 }
419
420 if (damageDealt < 0) {
422 }
423
425 target->hpChangeCounter = 0;
426
427 if (damageDealt < 0) {
428 damageDealt = 0;
429 }
430
431 if ((battleStatus->curAttackElement & DAMAGE_TYPE_POWER_BOUNCE) && damageDealt > 0) {
432 damageDealt += battleStatus->powerBounceCounter;
433
434 if (damageDealt < 1) {
435 damageDealt = 1;
436 }
437 }
438
439 battleStatus->lastAttackDamage = 0;
440
441 if (damageDealt < 1) {
442 target->hpChangeCounter = 0;
443
444 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_STATUS_ALWAYS_HITS)) {
448 } else {
450 if (target->curHP < 1) {
452 } else {
454 }
455 }
456
457 battleStatus->lastAttackDamage = 0;
458 } else {
459 target->damageCounter += damageDealt;
460 target->hpChangeCounter -= damageDealt;
461 battleStatus->lastAttackDamage = 0;
464
468 && !(targetPart->targetFlags & ACTOR_PART_TARGET_NO_DAMAGE)
469 ) {
470 target->curHP -= damageDealt;
471
472 if (target->curHP < 1) {
473 target->curHP = 0;
475 }
476 }
477
478 battleStatus->lastAttackDamage += damageDealt;
479 target->lastDamageTaken = battleStatus->lastAttackDamage;
480 target->hpChangeCounter = 0;
481 }
482
484 if (partner->staticStatus == STATUS_KEY_STATIC
485 || !(target->staticStatus == STATUS_KEY_STATIC || (targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED))
486 || battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT
487 || battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT
488 ) {
492 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, 3);
494 return HIT_RESULT_NICE;
495 } else {
496 return HIT_RESULT_HIT;
497 }
498 }
499
503 return HIT_RESULT_BACKFIRE;
504 }
505 }
506
510 }
511
514 }
515
516 if (target->curHP < 1) {
519 }
520 }
521 } else if (dispatchEvent == EVENT_DEATH) {
523 }
524
527 }
528
530 if (battleStatus->curAttackElement & DAMAGE_TYPE_SPIN_SMASH) {
531 if (dispatchEvent == EVENT_HIT) {
533 }
534
535 if (dispatchEvent == EVENT_DEATH) {
537 }
538
539 wasSpecialHit = true;
540 }
541
543 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT) && targetPart->eventFlags & ACTOR_EVENT_FLAG_POWER_BOUNCE) {
546 }
547
548 if (dispatchEvent == EVENT_HIT) {
550 }
551
554 }
555
558 }
559
560 if (dispatchEvent == EVENT_DEATH) {
562 }
563 }
564
566 if ((battleStatus->curAttackElement & DAMAGE_TYPE_JUMP) && (targetPart->eventFlags & ACTOR_EVENT_FLAG_GROUNDABLE)) {
567 if (dispatchEvent == EVENT_HIT) {
569 }
570
573 }
574
575 wasSpecialHit = true;
576 }
577
579 if ((battleStatus->curAttackElement & DAMAGE_TYPE_JUMP) && (targetPart->eventFlags & ACTOR_EVENT_FLAG_FLIPABLE)) {
580 if (dispatchEvent == EVENT_HIT) {
582 }
583
586 }
587
588 if (!(target->flags & ACTOR_FLAG_FLIPPED)) {
589 wasSpecialHit = true;
590 }
591 }
592 }
593 }
594 }
595 }
596
598 && battleStatus->curAttackElement & DAMAGE_TYPE_JUMP
600 ) {
603 }
604
607 }
608
609 if (!(target->flags & ACTOR_FLAG_FLIPPED)) {
610 wasSpecialHit = true;
611 }
612 }
613
615 && battleStatus->curAttackElement & DAMAGE_TYPE_BLAST
617 ) {
618 if (dispatchEvent == EVENT_DEATH) {
620 }
621
624 }
625
626 if (dispatchEvent == EVENT_HIT) {
628 }
629
630 wasSpecialHit = true;
631 isFireDamage = true;
632 }
633
635 if (battleStatus->curAttackElement & (DAMAGE_TYPE_BLAST | DAMAGE_TYPE_FIRE)) {
636 if (dispatchEvent == EVENT_HIT) {
638 }
639
640 if (dispatchEvent == EVENT_DEATH) {
642 }
643
644 isFireDamage = true;
645 }
646
648 && battleStatus->lastAttackDamage >= 0
652 && !(targetPart->targetFlags & ACTOR_PART_TARGET_NO_DAMAGE)
653 ) {
654 #define INFLICT_STATUS(STATUS_TYPE) \
655 if ((battleStatus->curAttackStatus & STATUS_FLAG_##STATUS_TYPE) && \
656 try_inflict_status(target, STATUS_KEY_##STATUS_TYPE, STATUS_TURN_MOD_##STATUS_TYPE)) { \
657 wasSpecialHit = true; \
658 wasStatusInflicted = true; \
659 } \
660
669
670 #undef INFLICT_STATUS
671
672 if ((battleStatus->curAttackStatus & STATUS_FLAG_UNUSED) &&
674 wasSpecialHit = true;
675 wasStatusInflicted = true;
676 }
677
678 statusChanceOrDefense = target->actorBlueprint->spookChance;
679
680 if (statusChanceOrDefense > 0) {
682 }
683
685
686 if (battleStatus->curAttackStatus & STATUS_FLAG_FEAR) {
688 if (!(target->debuff == STATUS_KEY_UNUSED
689 || target->debuff == STATUS_KEY_DIZZY
690 || target->debuff == STATUS_KEY_PARALYZE
691 || target->debuff == STATUS_KEY_SLEEP
692 || target->debuff == STATUS_KEY_FROZEN
693 || target->debuff == STATUS_KEY_STOP)
694 && !(target->flags & ACTOR_FLAG_FLIPPED)
695 ) {
697 wasStatusInflicted = true;
699 wasSpecialHit = true;
706 } else {
709 }
710 } else {
713 }
714 }
715
716 if (wasStatusInflicted) {
719 }
720
723 }
724 }
725 }
726 }
727
728 statusChanceOrDefense = target->actorBlueprint->spookChance;
730
732 if (battleStatus->curAttackElement & DAMAGE_TYPE_FEAR) {
734 if (!(target->debuff == STATUS_KEY_UNUSED ||
735 target->debuff == STATUS_KEY_DIZZY ||
736 target->debuff == STATUS_KEY_PARALYZE ||
737 target->debuff == STATUS_KEY_SLEEP ||
738 target->debuff == STATUS_KEY_FROZEN ||
739 target->debuff == STATUS_KEY_STOP) && !(target->flags & ACTOR_FLAG_FLIPPED)) {
741 wasStatusInflicted = true;
743 wasSpecialHit = true;
750 } else {
753 }
754 } else {
757 }
758 }
759 }
760
761 battleStatus->wasStatusInflicted = wasStatusInflicted;
763
764 if (!(target->flags & ACTOR_FLAG_NO_DMG_POPUP)) {
765 if (battleStatus->lastAttackDamage == 0) {
766 if (!wasSpecialHit && !wasStatusInflicted) {
767 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, 3);
768 }
769 } else if (!partImmuneToElement) {
770 if (battleStatus->curAttackElement & (DAMAGE_TYPE_MULTIPLE_POPUPS | DAMAGE_TYPE_SMASH)) {
771 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 0);
772 } else {
773 show_primary_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 0);
774 }
775
776 if (!(targetPart->targetFlags & ACTOR_PART_TARGET_NO_DAMAGE)) {
777 show_damage_fx(target, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
778 }
779 }
780 }
781
784 ) {
785 if (battleStatus->lastAttackDamage > 0) {
787 }
788
789 if (battleStatus->lastAttackDamage > 0 || ((battleStatus->curAttackElement & DAMAGE_TYPE_STATUS_ALWAYS_HITS) && wasSpecialHit)) {
792 } else {
794 }
795 }
796 }
797
800 }
801
802 if (battleStatus->lastAttackDamage > 0) {
803 if (partImmuneToElement == 0) {
804 if (partner->actorTypeData1[5] != 0) {
805 sfx_play_sound_at_position(partner->actorTypeData1[5], SOUND_SPACE_DEFAULT, state->goalPos.x, state->goalPos.y, state->goalPos.z);
806 }
807
809
810 if (isFireDamage) {
812 } else if (isShockDamage) {
814 } else if (isIceDamage) {
816 } else {
818 }
819 }
820 }
821
822 if ((battleStatus->lastAttackDamage < 1
823 && !(wasSpecialHit || wasStatusInflicted))
825 ) {
827 }
828
829 if ((battleStatus->curAttackStatus & STATUS_FLAG_SLEEP) && wasStatusInflicted) {
831 evt->varTable[0] = state->goalPos.x;
832 evt->varTable[1] = state->goalPos.y;
833 evt->varTable[2] = state->goalPos.z;
835 }
836
837 if ((battleStatus->curAttackStatus & STATUS_FLAG_DIZZY) && wasStatusInflicted) {
839 evt->varTable[0] = state->goalPos.x;
840 evt->varTable[1] = state->goalPos.y;
841 evt->varTable[2] = state->goalPos.z;
843 }
844
845 if ((battleStatus->curAttackStatus & STATUS_FLAG_PARALYZE) && wasStatusInflicted) {
847 evt->varTable[0] = state->goalPos.x;
848 evt->varTable[1] = state->goalPos.y;
849 evt->varTable[2] = state->goalPos.z;
851 }
852
853 if ((battleStatus->curAttackStatus & STATUS_FLAG_POISON) && wasStatusInflicted) {
855 evt->varTable[0] = state->goalPos.x;
856 evt->varTable[1] = state->goalPos.y;
857 evt->varTable[2] = state->goalPos.z;
859 }
860
861 if ((battleStatus->curAttackStatus & STATUS_FLAG_STOP) && wasStatusInflicted) {
863 evt->varTable[0] = state->goalPos.x;
864 evt->varTable[1] = state->goalPos.y;
865 evt->varTable[2] = state->goalPos.z;
867 }
868
869 if ((battleStatus->curAttackStatus & STATUS_FLAG_FROZEN) && wasStatusInflicted) {
871 evt->varTable[0] = state->goalPos.x;
872 evt->varTable[1] = state->goalPos.y;
873 evt->varTable[2] = state->goalPos.z;
874 evt->varTablePtr[3] = target;
876 }
877
878 if ((battleStatus->curAttackStatus & STATUS_FLAG_SHRINK) && wasStatusInflicted) {
880 evt->varTable[0] = state->goalPos.x;
881 evt->varTable[1] = state->goalPos.y;
882 evt->varTable[2] = state->goalPos.z;
883 evt->varTablePtr[3] = target;
885 }
886
887 if ((battleStatus->curAttackElement & DAMAGE_TYPE_SMASH) && target->actorType == ACTOR_TYPE_GOOMNUT_TREE) {
889 }
890
892
894 if (hitResult == HIT_RESULT_HIT) {
896 }
899 }
900 }
901
902 if (partner->staticStatus != STATUS_KEY_STATIC && (target->staticStatus == STATUS_KEY_STATIC ||
903 targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED) && !(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT) &&
904 !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)) {
908 return HIT_RESULT_BACKFIRE;
909 }
910
911 return hitResult;
912}
913
916 Actor* partner = battleStatus->partnerActor;
917 ActorState* state = &partner->state;
920
921 battleStatus->curAttackDamage = damageAmount;
922
924 partner->hpChangeCounter += hpChange;
925
926 hpChange = partner->hpChangeCounter;
927 partner->curHP = 127;
928 partner->damageCounter += hpChange;
929 partner->hpChangeCounter -= hpChange;
930 battleStatus->lastAttackDamage = 0;
931 partner->curHP -= hpChange;
932
933 if (partner->curHP <= 0) {
934 event = EVENT_DEATH;
935 battleStatus->lastAttackDamage += partner->curHP;
936 partner->curHP = 0;
937 }
938
939 battleStatus->lastAttackDamage += hpChange;
940 partner->lastDamageTaken = battleStatus->lastAttackDamage;
941 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
943 if (event == EVENT_HIT_COMBO) {
944 event = EVENT_HIT;
945 }
946 if (event == EVENT_ZERO_DAMAGE) {
947 event = EVENT_IMMUNE;
948 }
949 }
950
951 if (battleStatus->lastAttackDamage > 0) {
953
955 }
956
957 if (!stopMotion) {
959 }
960
961 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z,
962 battleStatus->lastAttackDamage, 1);
963 show_damage_fx(partner, state->goalPos.x, state->goalPos.y, state->goalPos.z,
964 battleStatus->lastAttackDamage);
965
966 if (battleStatus->lastAttackDamage > 0) {
968 }
969
971
974 return flagCheck;
975}
976
980
984
985API_CALLABLE(MakeOwnerTargetIndex) {
986 Bytecode* args = script->ptrReadPos;
987 Actor* actor = get_actor(script->owner1.actorID);
989 s8* targetList = actor->targetIndexList;
990 s32 arg1 = evt_get_variable(script, *args++);
991 s32 arg2 = evt_get_variable(script, *args++);
992 s32 otherArg = *args++;
994
995 if (numTargets == 0) {
996 arg2 = -1;
997 } else {
998 if (arg2 != 0) {
999 if (arg2 >= numTargets) {
1000 arg2 = numTargets - 1;
1001 } else {
1002 arg2--;
1003 }
1004 }
1005
1006 selectableTarget = &actor->targetData[targetList[arg2]];
1007 actor->targetActorID = selectableTarget->actorID;
1008 actor->targetPartID = selectableTarget->partID;
1009 }
1010
1012 return ApiStatus_DONE2;
1013}
1014
1015API_CALLABLE(func_8027FC90) {
1016 Bytecode* args = script->ptrReadPos;
1018 s32 hitResult;
1019 Actor* actor;
1020 s32 actorID = evt_get_variable(script, *args++);
1021 s32 outVar;
1022
1023 if (actorID == ACTOR_SELF) {
1024 actorID = script->owner1.enemyID;
1025 }
1026
1027 outVar = *args++;
1028 actor = get_actor(actorID);
1030
1032 show_next_damage_popup(actor->state.goalPos.x, actor->state.goalPos.y, actor->state.goalPos.z, battleStatus->lastAttackDamage,
1033 0);
1035
1036 return ApiStatus_DONE2;
1037}
1038
1039API_CALLABLE(GetActorLevel) {
1040 Bytecode* args = script->ptrReadPos;
1041 s32 actorID = evt_get_variable(script, *args++);
1043
1044 if (actorID == ACTOR_SELF) {
1045 actorID = script->owner1.enemyID;
1046 }
1047
1048 outVar = *args++;
1049 evt_set_variable(script, outVar, get_actor(actorID)->actorBlueprint->level);
1050
1051 return ApiStatus_DONE2;
1052}
1053
1054API_CALLABLE(PartnerDamageEnemy) {
1056 Bytecode* args = script->ptrReadPos;
1057 Actor* enemy = get_actor(script->owner1.enemyID);
1058 s32 retVar = *args++;
1059 s32 flags;
1061 u8 statusChance;
1062
1068 flags = *args++;
1069
1070 #if DX_DEBUG_MENU
1072 battleStatus->curAttackDamage = 99;
1073 }
1074 #endif
1075
1079 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1082 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1085 } else {
1088 }
1089
1090 if (flags & BS_FLAGS1_NICE_HIT) {
1092 } else {
1094 }
1095
1096 if (flags & BS_FLAGS1_SUPER_HIT) {
1098 } else {
1100 }
1101
1102 if (flags & BS_FLAGS1_NO_RATING) {
1104 } else {
1106 }
1107
1110 } else {
1112 }
1113
1114 statusChance = battleStatus->curAttackStatus;
1115 battleStatus->curTargetID = enemy->targetActorID;
1116 battleStatus->curTargetPart = enemy->targetPartID;
1117 battleStatus->statusChance = statusChance;
1118
1119 if (statusChance == STATUS_KEY_NEVER) {
1120 battleStatus->statusChance = 0;
1121 }
1122
1123 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1125
1126 if (damageResult < 0) {
1127 return ApiStatus_FINISH;
1128 }
1129
1131
1133 return ApiStatus_FINISH;
1134 }
1135
1136 return ApiStatus_DONE2;
1137}
1138
1139API_CALLABLE(PartnerAfflictEnemy) {
1141 Bytecode* args = script->ptrReadPos;
1142 Actor* actor = get_actor(script->owner1.enemyID);
1143 s32 returnValue = *args++;
1144 s32 flags;
1145 u8 statusChance;
1147
1148 battleStatus->curAttackElement = *args++;
1149 battleStatus->curAttackEventSuppression = *args++;
1150 battleStatus->curAttackStatus = *args++;
1151 battleStatus->curAttackStatus |= evt_get_variable(script, *args++);
1152 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1153 battleStatus->powerBounceCounter = 0;
1154 flags = *args++;
1155
1159 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1162 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1165 } else {
1168 }
1169
1170 if (flags & BS_FLAGS1_NICE_HIT) {
1172 } else {
1174 }
1175 if (flags & BS_FLAGS1_SUPER_HIT) {
1177 } else {
1179 }
1180 if (flags & BS_FLAGS1_NO_RATING) {
1182 } else {
1184 }
1187 } else {
1189 }
1190
1191 statusChance = battleStatus->curAttackStatus;
1192 battleStatus->curTargetID = actor->targetActorID;
1193 battleStatus->curTargetPart = actor->targetPartID;
1194 battleStatus->statusChance = statusChance;
1195
1196 if (statusChance == STATUS_KEY_NEVER) {
1197 battleStatus->statusChance = 0;
1198 }
1199
1200 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1202
1203 if (damageResult < 0) {
1204 return ApiStatus_FINISH;
1205 }
1206
1208
1210 return ApiStatus_FINISH;
1211 }
1212
1213 return ApiStatus_DONE2;
1214}
1215
1216API_CALLABLE(PartnerPowerBounceEnemy) {
1218 Bytecode* args = script->ptrReadPos;
1219 Actor* actor = get_actor(script->owner1.enemyID);
1220 s32 returnValue = *args++;
1221 s32 flags;
1222 u8 statusChance;
1224
1225 battleStatus->curAttackElement = *args++;
1226 battleStatus->curAttackEventSuppression = *args++;
1227 battleStatus->curAttackStatus = *args++;
1228 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1229 battleStatus->powerBounceCounter = evt_get_variable(script, *args++);
1230 flags = *args++;
1231
1235 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1238 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1241 } else {
1244 }
1245
1246 if (flags & BS_FLAGS1_NICE_HIT) {
1248 } else {
1250 }
1251 if (flags & BS_FLAGS1_SUPER_HIT) {
1253 } else {
1255 }
1256 if (flags & BS_FLAGS1_NO_RATING) {
1258 } else {
1260 }
1263 } else {
1265 }
1266
1267 statusChance = battleStatus->curAttackStatus;
1268 battleStatus->curTargetID = actor->targetActorID;
1269 battleStatus->curTargetPart = actor->targetPartID;
1270 battleStatus->statusChance = statusChance;
1271
1272 if (statusChance == STATUS_KEY_NEVER) {
1273 battleStatus->statusChance = 0;
1274 }
1275
1276 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1278
1279 if (damageResult < 0) {
1280 return ApiStatus_FINISH;
1281 }
1282
1284
1286 return ApiStatus_FINISH;
1287 }
1288
1289 return ApiStatus_DONE2;
1290}
1291
1292API_CALLABLE(PartnerTestEnemy) {
1294 Bytecode* args = script->ptrReadPos;
1295 Actor* enemy = get_actor(script->owner1.enemyID);
1296 s32 outVar;
1297 s32 flags;
1299 u8 statusChance;
1300
1301 outVar = *args++;
1307 flags = *args++;
1308
1312 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1315 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1318 } else {
1321 }
1322
1323 if (flags & BS_FLAGS1_NICE_HIT) {
1325 } else {
1327 }
1328
1329 if (flags & BS_FLAGS1_SUPER_HIT) {
1331 } else {
1333 }
1334
1335 if (flags & BS_FLAGS1_NO_RATING) {
1337 } else {
1339 }
1340
1343 } else {
1345 }
1346
1347 statusChance = battleStatus->curAttackStatus;
1348 battleStatus->curTargetID = enemy->targetActorID;
1349 battleStatus->curTargetPart = enemy->targetPartID;
1350 battleStatus->statusChance = statusChance;
1351
1352 if (statusChance == STATUS_KEY_NEVER) {
1353 battleStatus->statusChance = 0;
1354 }
1355
1356 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1358
1359 if (damageResult < 0) {
1360 return ApiStatus_FINISH;
1361 }
1362
1364
1365 return ApiStatus_DONE2;
1366}
1367
1368API_CALLABLE(func_8028070C) {
1370 Bytecode* args = script->ptrReadPos;
1371 Actor* actor = get_actor(script->owner1.actorID);
1373 s32 event = evt_get_variable(script, *args++);
1374
1375 battleStatus->curTargetID = actor->targetActorID;
1376 battleStatus->curTargetPart = actor->targetPartID;
1377
1380 }
1381
1382 return ApiStatus_BLOCK;
1383}
1384
1385API_CALLABLE(DeletePartner) {
1387
1388 btl_delete_actor(battleStatus->partnerActor);
1389 return ApiStatus_DONE2;
1390}
1391
1392API_CALLABLE(GetPartnerActionQuality) {
1393 Bytecode* args = script->ptrReadPos;
1394 s32 outVar = *args++;
1395 s32 actionQuality = gBattleStatus.actionQuality;
1396 s32 quality = 0;
1397
1398 if (actionQuality < 0) {
1399 actionQuality = 0;
1400 }
1401
1402 if (quality < actionQuality) {
1403 quality = actionQuality;
1404 }
1405
1407 return ApiStatus_DONE2;
1408}
1409
1411API_CALLABLE(PartnerYieldTurn) {
1413 return ApiStatus_DONE2;
1414}
BSS s32 PopupMenu_SelectedIndex
struct Evt * takeTurnScript
EvtScript * handleEventSource
ActorState state
struct Evt * handleEventScript
s32 takeTurnScriptID
struct SelectableTarget targetData[24]
s16 targetActorID
s32 handleEventScriptID
s8 targetIndexList[24]
Bytecode EvtScript[]
s8 targetListLength
s8 flags
Definition demo_api.c:15
HitResult calc_partner_test_enemy(void)
Definition dmg_partner.c:48
#define INFLICT_STATUS(STATUS_TYPE)
s32 dispatch_damage_event_partner_0(s32 damageAmount, s32 event, s32 stopMotion)
s32 dispatch_damage_event_partner_1(s32, s32)
HitResult calc_partner_damage_enemy(void)
s32 dispatch_damage_event_partner(s32 damageAmount, s32 event, s32 stopMotion)
void dispatch_event_partner_continue_turn(s8 lastEventType)
Definition dmg_partner.c:30
void dispatch_event_partner(s32 lastEventType)
Definition dmg_partner.c:7
#define sfx_play_sound_at_position
#define rand_int
#define ASSERT(condition)
@ ACTION_RATING_SUPER
sets nice hits = 2
Definition enums.h:2008
@ ACTION_RATING_NICE
sets nice hits = 1
Definition enums.h:2005
@ BS_FLAGS1_TUTORIAL_BATTLE
Definition enums.h:3627
@ BS_FLAGS1_NO_RATING
Definition enums.h:3610
@ BS_FLAGS1_FORCE_IMMUNE_HIT
Definition enums.h:3613
@ BS_FLAGS1_SUPER_HIT
Definition enums.h:3612
@ BS_FLAGS1_YIELD_TURN
Definition enums.h:3623
@ BS_FLAGS1_NICE_HIT
Definition enums.h:3609
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3608
@ BS_FLAGS1_SHOW_PLAYER_DECORATIONS
Definition enums.h:3601
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3604
@ BS_FLAGS1_ACTORS_VISIBLE
Definition enums.h:3598
@ ACTOR_EVENT_FLAG_STAR_ROD_ENCHANTED
Actor glows and listens for Star Beam and Peach Beam events.
Definition enums.h:3420
@ ACTOR_EVENT_FLAG_GROUNDABLE
Actor can be knocked down from flight; triggered by jump attacks.
Definition enums.h:3416
@ ACTOR_EVENT_FLAG_FIRE_EXPLODE
Fire attacks trigger an explosion, used only by bullet/bombshell bills.
Definition enums.h:3412
@ ACTOR_EVENT_FLAG_POWER_BOUNCE
Actor listens for Power Bounce events.
Definition enums.h:3421
@ ACTOR_EVENT_FLAG_ELECTRIFIED
Player takes shock damage upon contact.
Definition enums.h:3409
@ ACTOR_EVENT_FLAG_SPIKY_FRONT
Player takes spike damage from hammer attacks.
Definition enums.h:3418
@ ACTOR_EVENT_FLAG_EXPLODE_ON_CONTACT
Attacks that contact will trigger an explosion.
Definition enums.h:3417
@ ACTOR_EVENT_FLAG_FIREY
Player takes burn damage upon contact.
Definition enums.h:3405
@ ACTOR_EVENT_FLAG_BURIED
Actor can only by hit by quake-element attacks.
Definition enums.h:3413
@ ACTOR_EVENT_FLAG_ALT_SPIKY
Additional spiky quality associated with Pokeys and Spinies.
Definition enums.h:3422
@ ACTOR_EVENT_FLAG_FLIPABLE
Actor can be flipped; triggered by jump and quake attacks.
Definition enums.h:3414
@ ACTOR_EVENT_FLAG_EXPLODE_ON_IGNITION
Blast and fire attacks trigger an explosion.
Definition enums.h:3411
@ ACTOR_EVENT_FLAG_ILLUSORY
Player attacks pass through and miss.
Definition enums.h:3408
@ ACTOR_EVENT_FLAG_SPIKY_TOP
Player takes spike damage from jump attacks.
Definition enums.h:3407
@ ACTOR_EVENT_FLAG_ENCHANTED
Actor glows and listens for the Star Beam event.
Definition enums.h:3419
@ ACTOR_PART_TARGET_NO_DAMAGE
Definition enums.h:1903
@ STATUS_KEY_PARALYZE
Definition enums.h:2806
@ STATUS_KEY_FROZEN
Definition enums.h:2808
@ STATUS_TURN_MOD_UNUSED
Definition enums.h:2836
@ STATUS_KEY_TRANSPARENT
Definition enums.h:2815
@ STATUS_KEY_STATIC
Definition enums.h:2812
@ STATUS_KEY_KO
Definition enums.h:2814
@ 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_SHRINK
Definition enums.h:2811
@ STATUS_KEY_DIZZY
Definition enums.h:2805
HitResult
Definition enums.h:1974
@ HIT_RESULT_LANDED_ON_SPIKE
Definition enums.h:1980
@ HIT_RESULT_BACKFIRE
Definition enums.h:1975
@ HIT_RESULT_NO_DAMAGE
Definition enums.h:1978
@ HIT_RESULT_HIT
Definition enums.h:1976
@ HIT_RESULT_IMMUNE
Definition enums.h:1984
@ HIT_RESULT_NICE_NO_DAMAGE
Definition enums.h:1979
@ HIT_RESULT_NICE
Definition enums.h:1977
@ HIT_RESULT_MISS
Definition enums.h:1982
@ SUPPRESS_EVENT_EXPLODE_CONTACT
Definition enums.h:2935
@ SUPPRESS_EVENT_SPIKY_TOP
Definition enums.h:2934
@ SUPPRESS_EVENT_ALT_SPIKY
Definition enums.h:2939
@ SUPPRESS_EVENT_SHOCK_CONTACT
Definition enums.h:2937
@ SUPPRESS_EVENT_SPIKY_FRONT
Definition enums.h:2936
@ SUPPRESS_EVENT_BURN_CONTACT
Definition enums.h:2938
@ STATUS_FLAG_FEAR
Definition enums.h:2856
@ STATUS_FLAG_STOP
Definition enums.h:2855
@ STATUS_FLAG_FROZEN
Definition enums.h:2848
@ STATUS_FLAG_SHRINK
Definition enums.h:2853
@ STATUS_FLAG_PARALYZE
Definition enums.h:2850
@ STATUS_FLAG_DIZZY
Definition enums.h:2852
@ STATUS_FLAG_SLEEP
Definition enums.h:2846
@ STATUS_FLAG_POISON
Definition enums.h:2851
@ STATUS_FLAG_UNUSED
Definition enums.h:2849
@ DMG_SRC_DEFAULT
Definition enums.h:2014
@ ABILITY_SPIKE_SHIELD
Definition enums.h:438
@ SOUND_IMMUNE
Definition enums.h:748
@ SOUND_DAMAGE_STARS
Definition enums.h:953
@ SOUND_INFLICT_STATUS
Definition enums.h:1358
@ SOUND_HIT_SPIKE
Definition enums.h:746
@ SOUND_HIT_NORMAL
Definition enums.h:727
@ SOUND_SMACK_TREE
Definition enums.h:790
@ SOUND_HIT_SHOCK
Definition enums.h:1198
@ SOUND_HIT_ICE
Definition enums.h:729
@ SOUND_HIT_FIRE
Definition enums.h:728
@ SOUND_INFLICT_SLEEP
Definition enums.h:1357
@ ACTOR_PARTNER
Definition enums.h:2119
@ ACTOR_SELF
Definition enums.h:2117
@ ACTOR_FLAG_NO_DMG_POPUP
Hide damage popup.
Definition enums.h:3375
@ ACTOR_FLAG_HEALTH_BAR_HIDDEN
Definition enums.h:3372
@ ACTOR_FLAG_UPSIDE_DOWN
HP bar offset below actor (e.g. Swooper when upside-down).
Definition enums.h:3365
@ ACTOR_FLAG_FLIPPED
Actor has been flipped over.
Definition enums.h:3364
@ SOUND_SPACE_DEFAULT
Definition enums.h:1740
@ EVENT_HIT
Definition enums.h:2165
@ EVENT_SCARE_AWAY
Definition enums.h:2207
@ EVENT_BURN_HIT
Definition enums.h:2169
@ EVENT_SPIKE_CONTACT
Definition enums.h:2196
@ EVENT_POWER_BOUNCE_DEATH
Definition enums.h:2194
@ EVENT_IMMUNE
Definition enums.h:2179
@ EVENT_FALL_TRIGGER
Definition enums.h:2167
@ EVENT_BURN_DEATH
Definition enums.h:2190
@ EVENT_ZERO_DAMAGE
Definition enums.h:2177
@ EVENT_SPIN_SMASH_HIT
Definition enums.h:2166
@ EVENT_EXPLODE_TRIGGER
Definition enums.h:2188
@ EVENT_SPIN_SMASH_DEATH
Definition enums.h:2187
@ EVENT_HIT_COMBO
Definition enums.h:2164
@ EVENT_SPIKE_TAUNT
Definition enums.h:2181
@ EVENT_BEGIN_AIR_LIFT
Definition enums.h:2208
@ EVENT_POWER_BOUNCE_HIT
Definition enums.h:2175
@ EVENT_DEATH
Definition enums.h:2186
@ EVENT_FLIP_TRIGGER
Definition enums.h:2168
@ EVENT_SHOCK_HIT
Definition enums.h:2198
@ EVENT_BURN_CONTACT
Definition enums.h:2197
@ EVENT_BURN_TAUNT
Definition enums.h:2182
@ ACTOR_PART_FLAG_DAMAGE_IMMUNE
electrified Plays extra hurt SFX?
Definition enums.h:3392
@ DAMAGE_TYPE_SPIN_SMASH
Definition enums.h:2910
@ DAMAGE_TYPE_ICE
Definition enums.h:2888
@ DAMAGE_TYPE_STATUS_ALWAYS_HITS
Definition enums.h:2914
@ DAMAGE_TYPE_SMASH
Definition enums.h:2891
@ DAMAGE_TYPE_POWER_BOUNCE
Definition enums.h:2904
@ DAMAGE_TYPE_IGNORE_DEFENSE
Definition enums.h:2911
@ DAMAGE_TYPE_SHOCK
Definition enums.h:2890
@ DAMAGE_TYPE_BLAST
Definition enums.h:2894
@ DAMAGE_TYPE_FIRE
Definition enums.h:2886
@ DAMAGE_TYPE_AIR_LIFT
Definition enums.h:2900
@ DAMAGE_TYPE_QUAKE
Definition enums.h:2896
@ DAMAGE_TYPE_JUMP
Definition enums.h:2892
@ DAMAGE_TYPE_FEAR
Definition enums.h:2897
@ DAMAGE_TYPE_NO_CONTACT
Definition enums.h:2912
@ DAMAGE_TYPE_MULTIPLE_POPUPS
Definition enums.h:2913
@ DAMAGE_TYPE_WATER
Definition enums.h:2887
@ EVT_PRIORITY_A
Definition evt.h:154
#define ApiStatus_DONE2
Definition evt.h:119
s32 Bytecode
Definition evt.h:7
#define ApiStatus_FINISH
Definition evt.h:121
#define ApiStatus_BLOCK
Definition evt.h:117
@ EVT_FLAG_RUN_IMMEDIATELY
don't wait for next update_scripts call
Definition evt.h:162
void show_primary_damage_popup(f32 x, f32 y, f32 z, s32 attack, s32 a)
Definition 190B20.c:1999
s32 does_script_exist_by_ref(Evt *script)
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1730
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2495
void show_immune_bonk(f32 x, f32 y, f32 z, s32, s32, s32)
void dispatch_event_actor(Actor *, s32)
Definition 1A5830.c:102
void show_actor_health_bar(Actor *)
Definition 190B20.c:2235
void clear_part_pal_adjustment(ActorPart *)
Definition 190B20.c:2348
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
Definition evt.c:1887
void set_actor_flash_mode(Actor *actor, s32 arg1)
Definition 190B20.c:2426
void show_damage_fx(Actor *actor, f32 x, f32 y, f32 z, s32 damage)
Definition 190B20.c:2064
void cancel_action_rating_combo(Actor *)
Definition 190B20.c:2169
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
s32 inflict_status(Actor *, s32, s32)
Definition 190B20.c:1814
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:923
void show_next_damage_popup(f32 x, f32 y, f32 z, s32 damageAmount, s32 angle)
Definition 190B20.c:2025
s32 get_defense(Actor *actor, s32 *defenseTable, s32 elementFlags)
Definition 190B20.c:1949
Actor * get_actor(s32 actorID)
Definition actor_api.c:155
void kill_script_by_ID(s32 id)
void set_goal_pos_to_part(ActorState *state, s32 actorID, s32 partID)
Definition actor_api.c:44
void btl_delete_actor(Actor *actor)
Definition 16C8E0.c:1040
void apply_shock_effect(Actor *)
void show_action_rating(s32, Actor *, f32, f32, f32)
Definition 190B20.c:2090
s32 try_inflict_status(Actor *, s32, s32)
Definition 190B20.c:2262
EvtScript EVS_PlayStopHitFX
Definition dmg_player.c:109
EvtScript EVS_PlayFreezeHitFX
Definition dmg_player.c:115
EvtScript EVS_PlayShrinkHitFX
Definition dmg_player.c:125
EvtScript EVS_PlayParalyzeHitFX
Definition dmg_player.c:97
EvtScript EVS_PlayPoisonHitFX
Definition dmg_player.c:103
EvtScript EVS_PlaySleepHitFX
Definition dmg_player.c:85
EvtScript EVS_PlayDizzyHitFX
Definition dmg_player.c:91
#define STATUS_KEY_NEVER
Definition macros.h:234
s32 curAttackEventSuppression
BattleStatus gBattleStatus
Definition battle.cpp:14