Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
dmg_player.c
Go to the documentation of this file.
1#include "common.h"
2#include "effects.h"
3#include "battle/battle.h"
4#include "script_api/battle.h"
5#include "sprite/player.h"
6
9
10API_CALLABLE(PlaySleepHitFX) {
11 fx_debuff(0, script->varTable[0], script->varTable[1], script->varTable[2]);
12 return ApiStatus_DONE2;
13}
14
15API_CALLABLE(PlayDizzyHitFX) {
16 fx_debuff(1, script->varTable[0], script->varTable[1], script->varTable[2]);
17 return ApiStatus_DONE2;
18}
19
20API_CALLABLE(PlayParalyzeHitFX) {
21 EffectInstance* debuffEffect = fx_debuff(2, script->varTable[0], script->varTable[1], script->varTable[2]);
22
23 debuffEffect->data.debuff->primCol.r = 200;
24 debuffEffect->data.debuff->primCol.g = 120;
25 debuffEffect->data.debuff->primCol.b = 0;
26 debuffEffect->data.debuff->envCol.r = 234;
27 debuffEffect->data.debuff->envCol.g = 193;
28 debuffEffect->data.debuff->envCol.b = 0;
29 return ApiStatus_DONE2;
30}
31
32API_CALLABLE(PlayPoisonHitFX) {
33 EffectInstance* debuffEffect = fx_debuff(2, script->varTable[0], script->varTable[1], script->varTable[2]);
34
35 debuffEffect->data.debuff->primCol.r = 60;
36 debuffEffect->data.debuff->primCol.g = 160;
37 debuffEffect->data.debuff->primCol.b = 0;
38 debuffEffect->data.debuff->envCol.r = 90;
39 debuffEffect->data.debuff->envCol.g = 240;
40 debuffEffect->data.debuff->envCol.b = 0;
41 return ApiStatus_DONE2;
42}
43
44API_CALLABLE(PlayStopHitFX) {
45 EffectInstance* debuffEffect = fx_debuff(2, script->varTable[0], script->varTable[1], script->varTable[2]);
46
47 debuffEffect->data.debuff->primCol.r = 205;
48 debuffEffect->data.debuff->primCol.g = 0;
49 debuffEffect->data.debuff->primCol.b = 40;
50 debuffEffect->data.debuff->envCol.r = 205;
51 debuffEffect->data.debuff->envCol.g = 32;
52 debuffEffect->data.debuff->envCol.b = 242;
53 return ApiStatus_DONE2;
54}
55
56API_CALLABLE(PlayFreezeHitSnowflakeFX) {
57 fx_big_snowflakes(0, script->varTable[0], script->varTable[1], script->varTable[2]);
58 return ApiStatus_DONE2;
59}
60
61API_CALLABLE(PlayFreezeHitParticleFX) {
62 Actor* actor = (Actor*)script->varTable[3];
63 f32 temp1 = actor->size.y;
64 f32 temp2 = actor->size.x / 2;
65
66 fx_misc_particles(0, script->varTable[0], script->varTable[1], script->varTable[2], temp1, temp2, 1.0f, 10, 30);
67 fx_misc_particles(1, script->varTable[0], script->varTable[1], script->varTable[2], temp1, temp2, 1.0f, 10, 30);
68 return ApiStatus_DONE2;
69}
70
71API_CALLABLE(PlayShrinkHitFX) {
72 s32 i;
73
74 for (i = 0; i < 20; i++) {
76 script->varTable[0] + rand_int(30) - 15,
77 script->varTable[1] + rand_int(20) - 15,
78 script->varTable[2] + 5,
79 1.0f,
80 25);
81 }
82 return ApiStatus_DONE2;
83}
84
90
96
102
108
114
124
130
156
177
178// Determines whether an attack from the player will hit an enemy or
181 Actor* player = battleStatus->playerActor;
182 ActorState* state = &player->state;
183 s32 targetActorID = battleStatus->curTargetID;
184 s32 targetPartIdx = battleStatus->curTargetPart;
185 Actor* target;
187
188 battleStatus->curTargetID2 = battleStatus->curTargetID;
189 battleStatus->curTargetPart2 = battleStatus->curTargetPart;
190
191 target = get_actor(targetActorID);
192 if (target == NULL) {
193 return HIT_RESULT_HIT;
194 }
195
198
199 if (targetPart->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY) {
200 return HIT_RESULT_MISS;
201 }
202
203 if (target->transparentStatus == STATUS_KEY_TRANSPARENT
204 || (targetPart->eventFlags & ACTOR_EVENT_FLAG_BURIED && !(battleStatus->curAttackElement & DAMAGE_TYPE_QUAKE))
205 ) {
206 return HIT_RESULT_MISS;
207 }
208
209 if (target->stoneStatus == STATUS_KEY_STONE) {
211 return HIT_RESULT_IMMUNE;
212 }
213
214 if ((battleStatus->curAttackElement & DAMAGE_TYPE_JUMP)
215 && (targetPart->eventFlags & ACTOR_EVENT_FLAG_SPIKY_TOP)
217 {
220 }
221
222 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_JUMP))
224 && (!(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SPIKY_FRONT)
226 {
230 return HIT_RESULT_BACKFIRE;
231 }
232
233 if (player->staticStatus != STATUS_KEY_STATIC && target->staticStatus == STATUS_KEY_STATIC) {
235 }
236
237 return HIT_RESULT_HIT;
238}
239
242 Actor* player = battleStatus->playerActor;
243 s32 currentTargetID = battleStatus->curTargetID;
244 s32 currentTargetPartID = battleStatus->curTargetPart;
245 ActorState* state;
246 Evt* evt;
247 Actor* target;
261 s32 wasStatusInflicted;
263
271 wasStatusInflicted = FALSE;
273
274 battleStatus->wasStatusInflicted = FALSE;
275 battleStatus->lastAttackDamage = 0;
276 battleStatus->attackerActorID = player->actorID;
277 battleStatus->curTargetID2 = battleStatus->curTargetID;
278 battleStatus->curTargetPart2 = battleStatus->curTargetPart;
280 state = &player->state;
281
282 if (target == NULL) {
283 return HIT_RESULT_HIT;
284 }
285
287
289
290 target->lastDamageTaken = 0;
291
295 } else {
297 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)) {
298 battleStatus->curAttackElement |= DAMAGE_TYPE_ICE;
299 }
300 }
301
302 if (targetPart->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY
303 || target->transparentStatus == STATUS_KEY_TRANSPARENT
304 || (targetPart->eventFlags & ACTOR_EVENT_FLAG_BURIED && !(battleStatus->curAttackElement & DAMAGE_TYPE_QUAKE))
305 ) {
306 return HIT_RESULT_MISS;
307 }
308
309 if (target->stoneStatus == STATUS_KEY_STONE) {
311 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, 1);
312 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 0);
314 return HIT_RESULT_NICE;
315 } else {
316 return HIT_RESULT_HIT;
317 }
318 }
319
320 if (targetPart->elementalImmunities & battleStatus->curAttackElement) {
322 }
323
324 // check jumping on spiky enemy
325 if ((battleStatus->curAttackElement & DAMAGE_TYPE_JUMP)
326 && (targetPart->eventFlags & ACTOR_EVENT_FLAG_SPIKY_TOP)
328 {
332 return HIT_RESULT_BACKFIRE;
333 }
334
335 // check touching fiery enemy and explode on contact
336 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SMASH))) {
341 return HIT_RESULT_BACKFIRE;
342 }
343
344 if (targetPart->eventFlags & ACTOR_EVENT_FLAG_FIREY
345 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_BURN_CONTACT)
348 ) {
352 return HIT_RESULT_BACKFIRE;
353 }
354 }
355
356 // check explode on ignition
358 && battleStatus->curAttackElement & DAMAGE_TYPE_FIRE
360 ) {
364 return HIT_RESULT_NICE;
365 } else {
366 return HIT_RESULT_HIT;
367 }
368 }
369
370 // unknown alternate spiky #1
371 if (!(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SMASH))
373 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_ALT_SPIKY)
375 ) {
379 return HIT_RESULT_BACKFIRE;
380 }
381
382 if (battleStatus->curAttackElement & DAMAGE_TYPE_FIRE) {
383 fx_ring_blast(0, state->goalPos.x, state->goalPos.y, state->goalPos.z * 5.0f, 1.0f, 24);
385 }
386
387 if (battleStatus->curAttackElement & DAMAGE_TYPE_SHOCK) {
390 }
391
392 if (battleStatus->curAttackElement & DAMAGE_TYPE_WATER) {
393 fx_water_splash(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f, 1.0f, 24);
395 }
396
397 if (battleStatus->curAttackElement & DAMAGE_TYPE_ICE) {
398 fx_big_snowflakes(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f);
400 }
401
403
404 if (attackFxType) {
405 fx_breaking_junk(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f, 1.0f, 30);
406
407 switch (attackFxType) {
408 case 1:
410 break;
411 case 2:
413 break;
414 case 3:
416 break;
417 case 4:
419 break;
420 case 5:
422 break;
423 case 6:
425 break;
426 }
427 }
428
430 && player->staticStatus != STATUS_KEY_STATIC
431 && (target->staticStatus == STATUS_KEY_STATIC || targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED)
432 && !(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SHOCK))
433 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)
434 ) {
437 }
438
440 battleStatus->curAttackElement &= ~DAMAGE_TYPE_IGNORE_DEFENSE;
441 }
442
443 targetDefense = get_defense(target, targetPart->defenseTable, battleStatus->curAttackElement);
444
445 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_IGNORE_DEFENSE)) {
446 targetDefense += target->defenseBoost;
447 }
448
450 targetDefense += 127;
451 }
452
453 currentAttackDamage = battleStatus->curAttackDamage;
455
456 if (battleStatus->merleeAttackBoost > 0
458 ) {
459 currentAttackDamage += battleStatus->merleeAttackBoost;
460 }
461
462 if (battleStatus->jumpCharge && battleStatus->curAttackElement & DAMAGE_TYPE_JUMP) {
463 currentAttackDamage += battleStatus->jumpCharge;
465 }
466
467 if (battleStatus->hammerCharge && battleStatus->curAttackElement & (DAMAGE_TYPE_QUAKE_HAMMER | DAMAGE_TYPE_THROW | DAMAGE_TYPE_SMASH)) {
468 currentAttackDamage += battleStatus->hammerCharge;
470 }
471
472 if (battleStatus->unk_98 != 0) {
474 }
475
478 }
479
482 }
483
486 }
487
488 if (battleStatus->turboChargeTurnsLeft != 0) {
490 }
491
493
495 battleStatus->hpDrainCount++;
497
498 if (currentAttackDamage < 0) {
499 battleStatus->hpDrainCount += currentAttackDamage;
500 }
501
503
504 if (battleStatus->hpDrainCount > 5) {
505 battleStatus->hpDrainCount = 5;
506 }
507 }
508
510 battleStatus->hpDrainCount += 2;
512
513 if (currentAttackDamage < 0) {
514 battleStatus->hpDrainCount += currentAttackDamage;
515 }
516
518
519 if (battleStatus->hpDrainCount > 5) {
520 battleStatus->hpDrainCount = 5;
521 }
522 }
523
526 ) {
527 if (battleStatus->rushFlags & RUSH_FLAG_POWER) {
529 }
530
531 if (battleStatus->rushFlags & RUSH_FLAG_MEGA) {
533 }
534 fx_radial_shimmer(9, state->goalPos.x, state->goalPos.y, state->goalPos.z, 0.5f, 20);
535 }
536
539 ) {
541
545#if !VERSION_JP
546 targetDefense = 0;
547#endif
552 }
553 }
554
555 if (player->debuff == STATUS_KEY_SHRINK) {
556 if (currentAttackDamage > 0) {
558
559 if (currentAttackDamage == 0) {
561 }
562 }
563 }
564
566 && battleStatus->curAttackElement & DAMAGE_TYPE_BLAST
568 ) {
569 targetDefense = 0;
571 }
572
573 if (battleStatus->curAttackElement & DAMAGE_TYPE_STATUS_ALWAYS_HITS) {
574 targetDefense = 0;
576 }
577
578 if (currentAttackDamage > 99) {
580 }
581
582 if (currentAttackDamage < 0) {
583 targetDefense = 0;
584 }
585
586 target->hpChangeCounter = 0;
588
589 if (currentAttackDamage < 0) {
591 }
592
593 if (battleStatus->curAttackElement & DAMAGE_TYPE_POWER_BOUNCE && currentAttackDamage > 0) {
594 currentAttackDamage += battleStatus->powerBounceCounter;
595
596 if (currentAttackDamage < 1) {
598 }
599 }
600
601 battleStatus->lastAttackDamage = 0;
602
603 if (currentAttackDamage < 1) {
604 target->hpChangeCounter = 0;
606
607 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_STATUS_ALWAYS_HITS)) {
610 } else {
611 if (target->curHP < 1) {
613 } else {
615 }
616 }
617
618 battleStatus->lastAttackDamage = 0;
619 } else {
620 target->damageCounter += currentAttackDamage;
623 target->hpChangeCounter -= currentAttackDamage;
624
628 && !(targetPart->targetFlags & ACTOR_PART_TARGET_NO_DAMAGE)
629 ) {
630 target->curHP -= currentAttackDamage;
631
632 if (target->curHP < 1) {
633 target->curHP = 0;
635 }
636 }
637
638 battleStatus->lastAttackDamage += currentAttackDamage;
639 target->lastDamageTaken = battleStatus->lastAttackDamage;
640 target->hpChangeCounter = 0;
641 }
642
645 && player->staticStatus != STATUS_KEY_STATIC
646 && (target->staticStatus == STATUS_KEY_STATIC || (targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED))
647 && !(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
648 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)
649 && !(battleStatus->curAttackElement & DAMAGE_TYPE_SHOCK)
650 ) {
652 apply_shock_effect(player);
654 return HIT_RESULT_BACKFIRE;
655 } else {
658 } else {
660 }
663 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, 3);
665 return HIT_RESULT_NICE;
666 } else {
667 return HIT_RESULT_HIT;
668 }
669 }
670 }
671
673 if (battleStatus->curAttackElement & DAMAGE_TYPE_FEAR
674 && rand_int(99) < (target->actorBlueprint->escapeChance * battleStatus->statusChance) / 100
675 && (target->debuff != STATUS_KEY_UNUSED
676 && target->debuff != STATUS_KEY_DIZZY
677 && target->debuff != STATUS_KEY_PARALYZE
678 && target->debuff != STATUS_KEY_SLEEP
679 && target->debuff != STATUS_KEY_FROZEN
680 && target->debuff != STATUS_KEY_STOP)
681 && !(target->flags & ACTOR_FLAG_FLIPPED)
682 ) {
685 return HIT_RESULT_NICE;
686 } else {
687 return HIT_RESULT_HIT;
688 }
689 }
690 }
691 }
692
696 }
697
700 }
701
702 if (target->curHP < 1) {
705 }
706 }
707 } else if (dispatchEvent == EVENT_DEATH) {
709 }
710
713 }
714
715 // check for special case damage events
717 // if damage is from Spin Smash, convert generic events to Spin Smash specific events
718 if (battleStatus->curAttackElement & DAMAGE_TYPE_SPIN_SMASH) {
720
721 if (target->actorBlueprint->spinSmashReq != 255
722 && playerData->hammerLevel + 1 >= target->actorBlueprint->spinSmashReq
723 && battleStatus->lastAttackDamage > 0
725 ) {
728 }
729
730 if (dispatchEvent == EVENT_HIT) {
732 }
733
736 }
737
740 }
741
742 if (dispatchEvent == EVENT_DEATH) {
744 }
745 }
746 }
747
748 // if damage is from Power Bounce, convert generic events to Power Bounce specific events
750 && !(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
752 ) {
755 }
756
757 if (dispatchEvent == EVENT_HIT) {
759 }
760
763 }
764
767 }
768
769 if (dispatchEvent == EVENT_DEATH) {
771 }
772 }
773
774 // try generating fall trigger events
776 && (battleStatus->curAttackElement & (DAMAGE_TYPE_POW | DAMAGE_TYPE_JUMP))
778 ) {
779 if (dispatchEvent == EVENT_HIT) {
781 }
782
785 }
786
788 }
789
790 // try generating flip trigger events
794 ) {
795 if (dispatchEvent == EVENT_HIT) {
797 }
798
801 }
802
803 if (!(target->flags & ACTOR_FLAG_FLIPPED)) {
805 }
806 }
807 }
808
809 // try generating flip trigger events
813 ) {
816 }
817
820 }
821
822 if (!(target->flags & ACTOR_FLAG_FLIPPED)) {
824 }
825 }
826
827 // try generating shell crack events
829 && battleStatus->curAttackElement & DAMAGE_TYPE_SHELL_CRACK
831 ) {
832 if (dispatchEvent == EVENT_HIT) {
834 }
835
838 }
840 }
841
842 // try generating burn events
844 && (battleStatus->curAttackElement & (DAMAGE_TYPE_BLAST | DAMAGE_TYPE_FIRE))
845 ) {
846 if (dispatchEvent == EVENT_HIT) {
848 }
849
850 if (dispatchEvent == EVENT_DEATH) {
852 }
853
855 }
856
857 // try inflicting status effects
859 && battleStatus->lastAttackDamage >= 0
863 && !(targetPart->targetFlags & ACTOR_PART_TARGET_NO_DAMAGE)
864 ) {
865 #define INFLICT_STATUS(STATUS_TYPE) \
866 if ((battleStatus->curAttackStatus & STATUS_FLAG_##STATUS_TYPE) && \
867 try_inflict_status(target, STATUS_KEY_##STATUS_TYPE, STATUS_TURN_MOD_##STATUS_TYPE)) { \
868 wasSpecialHit = TRUE; \
869 wasStatusInflicted = TRUE; \
870 } \
871
880
881 #undef INFLICT_STATUS
882
883 if ((battleStatus->curAttackStatus & STATUS_FLAG_UNUSED) &&
886 wasStatusInflicted = TRUE;
887 }
888
889 if (wasStatusInflicted) {
892 }
893
896 }
897 }
898 }
899
900 battleStatus->wasStatusInflicted = wasStatusInflicted;
902
903 if (!(target->flags & ACTOR_FLAG_NO_DMG_POPUP)) {
904 if (battleStatus->lastAttackDamage == 0) {
905 if (!wasSpecialHit && !wasStatusInflicted) {
906 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, 3);
907 }
908 } else if (!partImmuneToElement) {
909 if (battleStatus->curAttackElement & (DAMAGE_TYPE_MULTIPLE_POPUPS | DAMAGE_TYPE_SMASH)) {
910 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 0);
911 } else {
912 show_primary_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 0);
913 }
914
915 if (!(targetPart->targetFlags & ACTOR_PART_TARGET_NO_DAMAGE)) {
916 show_damage_fx(target, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
917 }
918 }
919 }
920
923 if (player->actorTypeData1[5]) {
925 }
926
927 if (battleStatus->lastAttackDamage > 0) {
929 }
930
931 if (battleStatus->lastAttackDamage > 0 || ((battleStatus->curAttackElement & DAMAGE_TYPE_STATUS_ALWAYS_HITS) && wasSpecialHit)) {
932 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_MULTI_BOUNCE)) {
934 } else {
936 }
937 }
938 }
939 }
940
941 if (missedAllOrNothing) {
943 }
944
947 }
948
949 if ((battleStatus->lastAttackDamage > 0 || wasSpecialHit) && !partImmuneToElement) {
951
952 if (isFireDamage) {
954 } else if (isShockDamage) {
956 } else if (isIceDamage) {
958 } else {
960 }
961 }
962
963 if (battleStatus->lastAttackDamage < 1 && !wasSpecialHit && !canBeShocked || targetPart->flags & ACTOR_PART_FLAG_DAMAGE_IMMUNE) {
965 }
966
967 if (battleStatus->curAttackStatus & STATUS_FLAG_SLEEP && wasStatusInflicted) {
969 evt->varTable[0] = state->goalPos.x;
970 evt->varTable[1] = state->goalPos.y;
971 evt->varTable[2] = state->goalPos.z;
973 }
974
975 if (battleStatus->curAttackStatus & STATUS_FLAG_DIZZY && wasStatusInflicted) {
977 evt->varTable[0] = state->goalPos.x;
978 evt->varTable[1] = state->goalPos.y;
979 evt->varTable[2] = state->goalPos.z;
981 }
982
983 if (battleStatus->curAttackStatus & STATUS_FLAG_PARALYZE && wasStatusInflicted) {
985 evt->varTable[0] = state->goalPos.x;
986 evt->varTable[1] = state->goalPos.y;
987 evt->varTable[2] = state->goalPos.z;
989 }
990
991 if (battleStatus->curAttackStatus & STATUS_FLAG_POISON && wasStatusInflicted) {
993 evt->varTable[0] = state->goalPos.x;
994 evt->varTable[1] = state->goalPos.y;
995 evt->varTable[2] = state->goalPos.z;
997 }
998
999 if (battleStatus->curAttackStatus & STATUS_FLAG_STOP && wasStatusInflicted) {
1001 evt->varTable[0] = state->goalPos.x;
1002 evt->varTable[1] = state->goalPos.y;
1003 evt->varTable[2] = state->goalPos.z;
1005 }
1006
1007 if (battleStatus->curAttackStatus & STATUS_FLAG_FROZEN && wasStatusInflicted) {
1009 evt->varTable[0] = state->goalPos.x;
1010 evt->varTable[1] = state->goalPos.y;
1011 evt->varTable[2] = state->goalPos.z;
1012 evt->varTablePtr[3] = target;
1014 }
1015
1016 if (battleStatus->curAttackStatus & STATUS_FLAG_SHRINK && wasStatusInflicted) {
1018 evt->varTable[0] = state->goalPos.x;
1019 evt->varTable[1] = state->goalPos.y;
1020 evt->varTable[2] = state->goalPos.z;
1021 evt->varTablePtr[3] = target;
1023 }
1024
1025 if (battleStatus->curAttackElement & DAMAGE_TYPE_SMASH && target->actorType == ACTOR_TYPE_GOOMNUT_TREE) {
1027 }
1028
1030
1032 if (hitResult == HIT_RESULT_HIT) {
1034 }
1037 }
1038 }
1039
1041 && (player->staticStatus != STATUS_KEY_STATIC)
1042 && (target->staticStatus == STATUS_KEY_STATIC || targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED)
1043 && !(battleStatus->curAttackElement & (DAMAGE_TYPE_NO_CONTACT | DAMAGE_TYPE_SHOCK))
1044 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)
1045 ) {
1047 apply_shock_effect(player);
1049 return HIT_RESULT_BACKFIRE;
1050 }
1051
1052 return hitResult;
1053}
1054
1058 Actor* player = battleStatus->playerActor;
1059 ActorState* state = &player->state;
1061 s32 flags;
1064 s32 temp;
1065
1066 battleStatus->curAttackDamage = damageAmount;
1067
1068 temp = (s16)damageAmount; //TODO usage of temp here required to match
1069 player->hpChangeCounter += temp;
1070
1071 temp = player->hpChangeCounter;
1072 player->curHP = playerData->curHP;
1073 player->damageCounter += temp;
1074 player->hpChangeCounter -= temp;
1075 battleStatus->lastAttackDamage = 0;
1076 player->curHP -= temp;
1077 battleStatus->damageTaken += temp;
1078
1079 oldPlayerHP = player->curHP;
1080
1082 if (player->curHP < 1) {
1083 battleStatus->lastAttackDamage += oldPlayerHP;
1084 player->curHP = 0;
1086 }
1087 battleStatus->lastAttackDamage += temp;
1088 playerData->curHP = player->curHP;
1089
1092 }
1095 }
1096
1097 if (dispatchEvent == EVENT_DEATH) {
1098 if (event == EVENT_SPIKE_CONTACT) {
1100 }
1101 if (event == EVENT_BURN_CONTACT) {
1103 }
1104 if (event == EVENT_SHOCK_HIT) {
1106 }
1107 }
1108
1109 if (!noHitSound) {
1112 }
1113
1114 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 1);
1115 show_damage_fx(player, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
1116
1117 if (battleStatus->lastAttackDamage > 0) {
1118 set_actor_flash_mode(player, 1);
1119 }
1120
1123 return flags;
1124}
1125
1126// damage received from "damage over time" effects (only used for poison)
1134
1135// damage received from contact hazards
1139
1140API_CALLABLE(GetMenuSelection) {
1142 Bytecode* args = script->ptrReadPos;
1143 s32 outVar1 = *args++;
1144 s32 outVar2 = *args++;
1145 s32 outVar3 = *args++;
1146
1149 evt_set_variable(script, outVar3, battleStatus->selectedMoveID);
1150
1151 return ApiStatus_DONE2;
1152}
1153
1154API_CALLABLE(PlayerHopToGoal) {
1156 Bytecode* args = script->ptrReadPos;
1157 Actor* player = battleStatus->playerActor;
1158 ActorState* playerState = &player->state;
1159 f32 playerVel;
1160 f32 x, y, z;
1161 f32 goalX, goalY, goalZ;
1162
1163 if (isInitialCall) {
1164 script->functionTemp[0] = FALSE;
1165 }
1166
1167 if (script->functionTemp[0] == 0) {
1169 playerState->moveArcAmplitude = evt_get_variable(script, *args++);
1170 script->functionTemp[1] = evt_get_variable(script, *args++);
1171
1172 playerState->curPos.x = player->curPos.x;
1173 playerState->curPos.y = player->curPos.y;
1174 playerState->curPos.z = player->curPos.z;
1175
1176 x = playerState->curPos.x;
1177 y = playerState->curPos.y;
1178 z = playerState->curPos.z;
1179 goalX = playerState->goalPos.x;
1180 goalY = playerState->goalPos.y;
1181 goalZ = playerState->goalPos.z;
1182
1183 playerState->angle = atan2(x, z, goalX, goalZ);
1184 playerState->dist = dist2D(x, z, goalX, goalZ);
1185
1186 if (playerState->moveTime == 0) {
1187 playerState->moveTime = playerState->dist / playerState->speed;
1188 } else {
1189 playerState->speed = playerState->dist / playerState->moveTime;
1190 }
1191
1192 playerState->speed = playerState->dist / playerState->moveTime;
1193 playerState->vel = (playerState->acceleration * playerState->moveTime * 0.5f) + ((goalY - y) / playerState->moveTime);
1194 set_actor_anim(0, 0, playerState->animJumpRise);
1195 playerState->unk_24 = 90.0f;
1196 playerState->unk_28 = 180 / playerState->moveTime;
1197 playerState->unk_2C = playerState->goalPos.y;
1198 if (script->functionTemp[1] != 2) {
1200 }
1201 script->functionTemp[0] = TRUE;
1202 }
1203
1204 if (playerState->vel < 0.0f) {
1205 set_actor_anim(0, 0, playerState->animJumpFall);
1206 }
1207
1208 playerVel = playerState->vel;
1209 switch (playerState->moveArcAmplitude) {
1210 case 0:
1211 break;
1212 case 1:
1213 if (playerState->curPos.y - playerState->unk_2C > 45.0f) {
1214 playerVel *= 0.25f;
1215 }
1216 break;
1217 case 2:
1218 if (playerState->curPos.y - playerState->unk_2C > 54.9) {
1219 playerVel *= 0.25f;
1220 }
1221 break;
1222 }
1223
1224 playerState->curPos.y += playerVel;
1225 playerState->vel -= playerState->acceleration;
1226 add_xz_vec3f(&playerState->curPos, playerState->speed + sin_rad(DEG_TO_RAD(playerState->unk_24)), playerState->angle);
1227 playerState->unk_24 += playerState->unk_28;
1228 playerState->unk_24 = clamp_angle(playerState->unk_24);
1229 player->curPos.x = playerState->curPos.x;
1230 player->curPos.y = playerState->curPos.y;
1231 player->curPos.z = playerState->curPos.z;
1232 playerState->moveTime--;
1233
1234 if (playerState->moveTime >= 0) {
1235 return ApiStatus_BLOCK;
1236 }
1237
1238 player->curPos.y = playerState->goalPos.y;
1239 if (script->functionTemp[1] != 1) {
1240 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1241 }
1242 if (script->functionTemp[1] != 2) {
1244 }
1245
1246 return ApiStatus_DONE1;
1247}
1248
1249API_CALLABLE(PlayerFallToGoal) {
1250 Bytecode* args = script->ptrReadPos;
1252 ActorState* state = &player->state;
1253 f32 x, y, z;
1254 f32 goalX, goalY, goalZ;
1255
1256 if (isInitialCall) {
1257 script->functionTemp[0] = FALSE;
1258 }
1259
1260 if (!script->functionTemp[0]) {
1261 s32 moveTime = evt_get_variable(script, *args++);
1262
1263 player->state.curPos.x = player->curPos.x;
1264 player->state.curPos.y = player->curPos.y;
1265 player->state.curPos.z = player->curPos.z;
1266
1267 x = player->state.curPos.x;
1268 y = player->state.curPos.y;
1269 z = player->state.curPos.z;
1270 goalX = player->state.goalPos.x;
1271 goalY = player->state.goalPos.y;
1272 goalZ = player->state.goalPos.z;
1273
1274 state->moveTime = moveTime;
1275
1276 player->state.angle = atan2(x, z, goalX, goalZ);
1277 player->state.dist = dist2D(x, z, goalX, goalZ);
1278
1279 y = goalY - y;
1280
1281 if (state->moveTime == 0) {
1282 state->moveTime = state->dist / state->speed;
1283 } else {
1284 state->speed = state->dist / state->moveTime;
1285 }
1286
1287 state->vel = 0.0f;
1288 state->acceleration = ((y / state->moveTime) - state->vel) / (-state->moveTime * 0.5);
1290 script->functionTemp[0] = TRUE;
1291 }
1292
1293 if (state->vel < 0.0f) {
1295 }
1296
1297 state->curPos.y += state->vel;
1298 state->vel -= state->acceleration;
1299 add_xz_vec3f(&state->curPos, state->speed, state->angle);
1300
1301 player->curPos.x = state->curPos.x;
1302 player->curPos.y = state->curPos.y;
1303 player->curPos.z = state->curPos.z;
1304 state->moveTime--;
1305
1306 if (state->moveTime < 0) {
1307 player->curPos.x = state->goalPos.x;
1308 player->curPos.y = state->goalPos.y;
1309 player->curPos.z = state->goalPos.z;
1310 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1312 return ApiStatus_DONE1;
1313 }
1314 return ApiStatus_BLOCK;
1315}
1316
1317API_CALLABLE(PlayerLandJump) {
1319 ActorState* walkMovement = &player->state;
1320
1321 if (isInitialCall) {
1322 script->functionTemp[0] = 0;
1323 }
1324
1325 if (script->functionTemp[0] == 0) {
1326 walkMovement->curPos.x = player->curPos.x;
1327 walkMovement->curPos.y = player->curPos.y;
1328 walkMovement->curPos.z = player->curPos.z;
1329 script->functionTemp[0] = 1;
1330 }
1331
1332 if (walkMovement->vel > 0.0f) {
1333 if (walkMovement->animJumpRise != 0) {
1334 set_actor_anim(0, 0, walkMovement->animJumpRise);
1335 }
1336 }
1337
1338 if (walkMovement->vel < 0.0f) {
1339 if (walkMovement->animJumpFall != 0) {
1340 set_actor_anim(0, 0, walkMovement->animJumpFall);
1341 }
1342 }
1343
1344 walkMovement->curPos.y += walkMovement->vel;
1345 walkMovement->vel -= walkMovement->acceleration;
1346
1347 add_xz_vec3f(&walkMovement->curPos, walkMovement->speed, walkMovement->angle);
1348
1349 player->curPos.x = walkMovement->curPos.x;
1350 player->curPos.y = walkMovement->curPos.y;
1351 player->curPos.z = walkMovement->curPos.z;
1352
1353 if (player->curPos.y < 0.0f) {
1354 player->curPos.y = 0.0f;
1355
1356 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1358
1359 return ApiStatus_DONE1;
1360 }
1361
1362 return ApiStatus_BLOCK;
1363}
1364
1365API_CALLABLE(PlayerRunToGoal) {
1367 Bytecode* args = script->ptrReadPos;
1368 Actor* player = battleStatus->playerActor;
1369 ActorState* playerState = &player->state;
1371
1372 if (isInitialCall) {
1373 script->functionTemp[0] = FALSE;
1374 }
1375
1376 if (!script->functionTemp[0]) {
1377 player->state.moveTime = evt_get_variable(script, *args++);
1378 player->state.curPos.x = player->curPos.x;
1379 player->state.curPos.y = player->curPos.y;
1380 player->state.curPos.z = player->curPos.z;
1381
1382 goalX = player->state.goalPos.x;
1383 goalZ = player->state.goalPos.z;
1384 currentX = player->state.curPos.x;
1385 currentZ = player->state.curPos.z;
1386
1389 if (player->state.moveTime == 0) {
1390 player->state.moveTime = player->state.dist / player->state.speed;
1391 if (player->state.moveTime == 0) {
1392 player->state.moveTime = 1;
1393 }
1394 player->state.speed += (player->state.dist - (player->state.moveTime * player->state.speed)) / player->state.moveTime;
1395 } else {
1396 player->state.speed = player->state.dist / player->state.moveTime;
1397 }
1398 playerState->dist = player->actorTypeData1b[0] + 1;
1399 script->functionTemp[0] = TRUE;
1400 }
1401
1402 add_xz_vec3f(&playerState->curPos, playerState->speed, playerState->angle);
1403
1404 player->curPos.x = playerState->curPos.x;
1405 player->curPos.y = playerState->curPos.y;
1406 player->curPos.z = playerState->curPos.z;
1407
1408 if (playerState->speed < 4.0f) {
1409 play_movement_dust_effects(0, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1410 } else {
1411 play_movement_dust_effects(1, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1412 }
1413
1414 playerState->dist += playerState->speed;
1415 if (playerState->dist > player->actorTypeData1b[0]) {
1416 player->footStepCounter++;
1417 playerState->dist = 0.0f;
1418 if ((player->footStepCounter % 2) != 0) {
1420 } else {
1422 }
1423 }
1424
1425 playerState->moveTime--;
1426
1427 if (playerState->moveTime <= 0) {
1428 player->curPos.x = playerState->goalPos.x;
1429 player->curPos.z = playerState->goalPos.z;
1430 return ApiStatus_DONE2;
1431 }
1432 return ApiStatus_BLOCK;
1433}
1434
1435API_CALLABLE(CancelablePlayerRunToGoal) {
1437 Bytecode* args = script->ptrReadPos;
1438 Actor* player = battleStatus->playerActor;
1439 ActorState* playerState = &player->state;
1441
1442 if (isInitialCall) {
1443 script->functionTemp[0] = FALSE;
1444 }
1445
1446 if (!script->functionTemp[0]) {
1447 player->state.moveTime = evt_get_variable(script, *args++);
1448 script->functionTemp[1] = *args++;
1449 player->state.curPos.x = player->curPos.x;
1450 player->state.curPos.y = player->curPos.y;
1451 player->state.curPos.z = player->curPos.z;
1452
1453 goalX = player->state.goalPos.x;
1454 goalZ = player->state.goalPos.z;
1455 currentX = player->state.curPos.x;
1456 currentZ = player->state.curPos.z;
1457
1460 if (player->state.moveTime == 0) {
1461 player->state.moveTime = player->state.dist / player->state.speed;
1462 player->state.speed += (player->state.dist - (player->state.moveTime * player->state.speed)) / player->state.moveTime;
1463 } else {
1464 player->state.speed = player->state.dist / player->state.moveTime;
1465 }
1466 playerState->dist = player->actorTypeData1b[0] + 1;
1467
1468 if (playerState->moveTime == 0) {
1469 return ApiStatus_DONE2;
1470 }
1471
1472 script->functionTemp[2] = FALSE;
1473 script->functionTemp[3] = 0;
1474 script->functionTemp[0] = TRUE;
1475 }
1476
1477 add_xz_vec3f(&playerState->curPos, playerState->speed, playerState->angle);
1478
1479 player->curPos.x = playerState->curPos.x;
1480 player->curPos.y = playerState->curPos.y;
1481 player->curPos.z = playerState->curPos.z;
1482
1483 if (playerState->speed < 4.0f) {
1484 play_movement_dust_effects(0, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1485 } else {
1486 play_movement_dust_effects(1, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1487 }
1488
1489 playerState->dist += playerState->speed;
1490 if (playerState->dist > player->actorTypeData1b[0]) {
1491 player->footStepCounter++;
1492 playerState->dist = 0.0f;
1493 if ((player->footStepCounter % 2) != 0) {
1495 } else {
1497 }
1498 }
1499
1500 if (script->functionTemp[3] > 12) {
1501 if (!script->functionTemp[2]) {
1502 if (!(battleStatus->curButtonsDown & BUTTON_A)) {
1503 script->functionTemp[2] = TRUE;
1504 }
1505 }
1506
1507 if (script->functionTemp[2]) {
1508 if (battleStatus->curButtonsPressed & BUTTON_A) {
1509 evt_set_variable(script, script->functionTemp[1], 1);
1510 return ApiStatus_DONE2;
1511 }
1512 }
1513 }
1514
1515 script->functionTemp[3]++;
1516
1517 playerState->moveTime--;
1518 if (playerState->moveTime > 0) {
1519 return ApiStatus_BLOCK;
1520 }
1521
1522 player->curPos.x = playerState->goalPos.x;
1523 player->curPos.z = playerState->goalPos.z;
1524 evt_set_variable(script, script->functionTemp[1], 0);
1525 return ApiStatus_DONE2;
1526}
1527
1528API_CALLABLE(GetPlayerHP) {
1530 return ApiStatus_DONE2;
1531}
1532
1533API_CALLABLE(PlayerDamageEnemy) {
1535 Bytecode* args = script->ptrReadPos;
1536 s32 hitResultOutVar = *args++;
1537 s32 flags;
1538 Actor* target;
1540
1541 battleStatus->curAttackElement = *args++;
1542 battleStatus->curAttackEventSuppression = *args++;
1543 battleStatus->curAttackStatus = *args++;
1544 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1545 battleStatus->powerBounceCounter = 0;
1546 flags = *args++;
1547
1548 #if DX_DEBUG_MENU
1550 battleStatus->curAttackDamage = 99;
1551 }
1552 #endif
1553
1557 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1560 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1563 } else {
1566 }
1567
1568 if (flags & BS_FLAGS1_NICE_HIT) {
1570 } else {
1572 }
1573 if (flags & BS_FLAGS1_SUPER_HIT) {
1575 } else {
1577 }
1578 if (flags & BS_FLAGS1_NO_RATING) {
1580 } else {
1582 }
1585 } else {
1587 }
1588
1589 target = get_actor(script->owner1.actorID);
1590 battleStatus->curTargetID = target->targetActorID;
1591 battleStatus->curTargetPart = target->targetPartID;
1592 battleStatus->statusChance = battleStatus->curAttackStatus;
1593 if (battleStatus->statusChance == STATUS_KEY_NEVER) {
1594 battleStatus->statusChance = 0;
1595 }
1596 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1597
1599 if (hitResult < 0) {
1600 return ApiStatus_FINISH;
1601 }
1603
1605 return ApiStatus_FINISH;
1606 }
1607
1608 return ApiStatus_DONE2;
1609}
1610
1611API_CALLABLE(PlayerPowerBounceEnemy) {
1613 Bytecode* args = script->ptrReadPos;
1614 s32 hitResultOutVar = *args++;
1615 s32 flags;
1616 Actor* target;
1618
1619 battleStatus->curAttackElement = *args++;
1620 battleStatus->curAttackEventSuppression = *args++;
1621 battleStatus->curAttackStatus = *args++;
1622 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1623 battleStatus->powerBounceCounter = evt_get_variable(script, *args++);
1624 flags = *args++;
1625
1628 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1631 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1634 } else {
1637 }
1638
1639 if (flags & BS_FLAGS1_NICE_HIT) {
1641 } else {
1643 }
1644 if (flags & BS_FLAGS1_SUPER_HIT) {
1646 } else {
1648 }
1649 if (flags & BS_FLAGS1_NO_RATING) {
1651 } else {
1653 }
1656 } else {
1658 }
1659
1660 target = get_actor(script->owner1.actorID);
1661 battleStatus->curTargetID = target->targetActorID;
1662 battleStatus->curTargetPart = target->targetPartID;
1663 battleStatus->statusChance = battleStatus->curAttackStatus;
1664 if (battleStatus->statusChance == STATUS_KEY_NEVER) {
1665 battleStatus->statusChance = 0;
1666 }
1667 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1668
1670 if (hitResult < 0) {
1671 return ApiStatus_FINISH;
1672 }
1674
1676 return ApiStatus_FINISH;
1677 }
1678
1679 return ApiStatus_DONE2;
1680}
1681
1682API_CALLABLE(PlayerTestEnemy) {
1684 Bytecode* args = script->ptrReadPos;
1685 s32 hitResultOutVar = *args++;
1686 s32 flags;
1687 Actor* target;
1689
1690 battleStatus->curAttackElement = *args++;
1691 battleStatus->curAttackEventSuppression = *args++;
1692 battleStatus->curAttackStatus = *args++;
1693 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1694 battleStatus->powerBounceCounter = 0;
1695 flags = *args++;
1696
1699 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1702 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1705 } else {
1708 }
1709
1710 if (flags & BS_FLAGS1_NICE_HIT) {
1712 } else {
1714 }
1715 if (flags & BS_FLAGS1_SUPER_HIT) {
1717 } else {
1719 }
1720 if (flags & BS_FLAGS1_NO_RATING) {
1722 } else {
1724 }
1727 } else {
1729 }
1730
1731 target = get_actor(script->owner1.actorID);
1732 battleStatus->curTargetID = target->targetActorID;
1733 battleStatus->curTargetPart = target->targetPartID;
1734 battleStatus->statusChance = battleStatus->curAttackStatus;
1735 if (battleStatus->statusChance == STATUS_KEY_NEVER) {
1736 battleStatus->statusChance = 0;
1737 }
1738 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1739
1741 if (hitResult < 0) {
1742 return ApiStatus_FINISH;
1743 }
1745 return ApiStatus_DONE2;
1746}
1747
1748API_CALLABLE(DispatchDamagePlayerEvent) {
1749 Bytecode* args = script->ptrReadPos;
1751
1753 return ApiStatus_BLOCK;
1754 }
1755
1757 return ApiStatus_DONE2;
1758 }
1759
1760 return ApiStatus_BLOCK;
1761}
1762
1763API_CALLABLE(EnablePlayerBlur) {
1764 s32 setting = evt_get_variable(script, *script->ptrReadPos);
1765
1766 if (setting == ACTOR_BLUR_DISABLE) {
1768 } else if (setting == ACTOR_BLUR_ENABLE) {
1770 } else {
1772 }
1773
1774 return ApiStatus_DONE2;
1775}
1776
1777API_CALLABLE(ForceDisablePlayerBlur) {
1779 return ApiStatus_DONE2;
1780}
1781
1784 return ApiStatus_DONE2;
1785}
1786
1787API_CALLABLE(PlayerBasicJumpToGoal) {
1789 Bytecode* args = script->ptrReadPos;
1790 Actor* player = battleStatus->playerActor;
1791 ActorState* playerState = &player->state;
1792 f32 posX, posY, posZ;
1793 f32 goalX, goalZ;
1794 f64 accel;
1795
1796 enum {
1797 BASIC_STATE_00 = 0,
1798 BASIC_STATE_01 = 1,
1799 BASIC_STATE_02 = 2,
1800 BASIC_STATE_03 = 3,
1801 };
1802
1803 if (isInitialCall) {
1804 player->state.moveTime = evt_get_variable(script, *args++);
1805 player->state.moveArcAmplitude = evt_get_variable(script, *args++);
1806
1807 switch(player->state.moveArcAmplitude) {
1808 default:
1809 script->functionTemp[0] = BASIC_STATE_00;
1810 break;
1812 script->functionTemp[0] = BASIC_STATE_02;
1813 break;
1814 }
1815
1816 script->functionTemp[1] = 0;
1817 }
1818
1819 if (script->functionTemp[0] == BASIC_STATE_00) {
1820 playerState->curPos.x = player->curPos.x;
1821 playerState->curPos.y = player->curPos.y;
1822 playerState->curPos.z = player->curPos.z;
1823 goalX = playerState->goalPos.x;
1824 goalZ = playerState->goalPos.z;
1825 posX = playerState->curPos.x;
1826 posY = playerState->curPos.y;
1827 posZ = playerState->curPos.z;
1828 playerState->angle = atan2(posX, posZ, goalX, goalZ);
1829 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
1830 if (playerState->moveTime == 0) {
1831 playerState->moveTime = playerState->dist / playerState->speed;
1832 } else {
1833 playerState->speed = playerState->dist / playerState->moveTime;
1834 }
1835
1836 if (playerState->moveTime == 0) {
1837 return ApiStatus_DONE2;
1838 }
1839
1840 playerState->speed = playerState->dist / playerState->moveTime;
1841 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
1842 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
1843 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
1844 playerState->acceleration = PI_S / playerState->moveTime;
1845 playerState->vel = 0.0f;
1846
1847 if (playerState->moveArcAmplitude < PLAYER_BASIC_JUMP_3) {
1848 playerState->bounceDivisor = 47.0 + (playerState->dist - 20.0) / 6.0;
1849 if (playerState->moveArcAmplitude == PLAYER_BASIC_JUMP_2) {
1850 playerState->bounceDivisor *= 1.12;
1851 }
1852 playerState->unk_24 = 90.0f;
1853 playerState->unk_28 = 360 / playerState->moveTime;
1854 playerState->unk_18.x = 0.0f;
1855 playerState->unk_18.y = 0.0f;
1856 accel = playerState->acceleration;
1857 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * accel);
1858 } else {
1859 playerState->bounceDivisor = 47.0 + (playerState->dist - 20.0) / 6.0;
1860 if (playerState->moveArcAmplitude == PLAYER_BASIC_JUMP_4) {
1861 playerState->bounceDivisor *= 1.25;
1862 }
1863 playerState->unk_24 = 90.0f;
1864 playerState->unk_28 = 360 / playerState->moveTime;
1865 playerState->unk_18.x = 0.0f;
1866 playerState->unk_18.y = 0.0f;
1867 accel = playerState->acceleration;
1868 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.8 * accel);
1869 }
1870 set_actor_anim(0, 0, playerState->animJumpRise);
1872 script->functionTemp[0] = BASIC_STATE_01;
1873 }
1874
1875 switch (script->functionTemp[0]) {
1876 case BASIC_STATE_01:
1877 if (playerState->vel > PI_S / 2) {
1878 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
1879 }
1880 playerState->curPos.x += playerState->velStep.x;
1881 playerState->curPos.y += playerState->velStep.y;
1882 playerState->curPos.z += playerState->velStep.z;
1883 playerState->unk_18.x = player->curPos.y;
1884 player->curPos.x = playerState->curPos.x;
1885 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
1886 player->curPos.z = playerState->curPos.z;
1887 if (playerState->goalPos.y > player->curPos.y && playerState->moveTime < 3) {
1888 player->curPos.y = playerState->goalPos.y;
1889 }
1890 playerState->unk_18.y = player->curPos.y;
1891 if (playerState->moveArcAmplitude < PLAYER_BASIC_JUMP_3) {
1892 accel = playerState->acceleration;
1893 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * accel);
1894 } else {
1895 accel = playerState->acceleration;
1896 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.8 * accel);
1897 }
1898 playerState->unk_24 += playerState->unk_28;
1899 playerState->unk_24 = clamp_angle(playerState->unk_24);
1900 playerState->moveTime--;
1901 if (playerState->moveTime == 0) {
1902 player->curPos.y = playerState->goalPos.y;
1903 playerState->acceleration = 1.8f;
1904 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
1905 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
1906 return ApiStatus_DONE1;
1907 }
1908 break;
1909 case BASIC_STATE_02:
1910 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
1911 return ApiStatus_DONE2;
1912 }
1913 playerState->moveTime = 1;
1914 playerState->acceleration = 1.8f;
1915 playerState->unk_24 = 90.0f;
1916 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
1917 playerState->bounceDivisor = fabsf(playerState->unk_18.x - playerState->unk_18.y) / 16.5;
1918 playerState->unk_28 = 360 / playerState->moveTime;
1919 playerState->curPos.x = player->curPos.x;
1920 playerState->curPos.y = player->curPos.y;
1921 playerState->curPos.z = player->curPos.z;
1922 script->functionTemp[0] = BASIC_STATE_03;
1923 // fallthrough
1924 case BASIC_STATE_03:
1925 playerState->curPos.x += (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24))) / 33.0;
1926 playerState->curPos.y -= (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24)));
1927 playerState->unk_24 += playerState->unk_28;
1928 playerState->unk_24 = clamp_angle(playerState->unk_24);
1929 player->curPos.x = playerState->curPos.x;
1930 player->curPos.y = playerState->curPos.y;
1931 player->curPos.z = playerState->curPos.z;
1933 return ApiStatus_DONE2;
1934 }
1935 playerState->moveTime--;
1936 if (playerState->moveTime == 0) {
1937 return ApiStatus_DONE1;
1938 }
1939 break;
1940 }
1941
1942 return ApiStatus_BLOCK;
1943}
1944
1945API_CALLABLE(PlayerSuperJumpToGoal) {
1946 Bytecode* args = script->ptrReadPos;
1948 ActorState* playerState = &player->state;
1949 f32 posX, posY, posZ;
1950 f32 goalX, goalZ;
1951 f32 temp;
1952 f64 temp_f20;
1953 f64 vel1, vel2;
1954 f64 vel3, vel4;
1955 f64 vel5, vel6;
1956 f64 vel7, vel8;
1957 f64 acc1, acc2;
1958 f64 acc3, acc4;
1959 f64 acc5, acc6;
1960 f64 acc7, acc8;
1961
1962 enum {
1963 SUPER_STATE_00 = 0,
1964 SUPER_STATE_01 = 1,
1965 SUPER_STATE_02 = 2,
1966 SUPER_STATE_10 = 10,
1967 SUPER_STATE_11 = 11,
1968 SUPER_STATE_20 = 20,
1969 SUPER_STATE_21 = 21,
1970 };
1971
1972 if (isInitialCall) {
1973 player->state.moveTime = evt_get_variable(script, *args++);
1974 player->state.moveArcAmplitude = evt_get_variable(script, *args++);
1975
1976 switch(player->state.moveArcAmplitude) {
1977 default:
1978 script->functionTemp[0] = SUPER_STATE_00;
1979 break;
1983 script->functionTemp[0] = SUPER_STATE_10;
1984 break;
1986 script->functionTemp[0] = SUPER_STATE_20;
1987 break;
1988 }
1989 }
1990
1991 switch (script->functionTemp[0]) {
1992 case SUPER_STATE_00:
1993 playerState->curPos.x = player->curPos.x;
1994 playerState->curPos.y = player->curPos.y;
1995 playerState->curPos.z = player->curPos.z;
1996 goalX = playerState->goalPos.x;
1997 goalZ = playerState->goalPos.z;
1998 posX = playerState->curPos.x;
1999 posY = playerState->curPos.y;
2000 posZ = playerState->curPos.z;
2001 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2002 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2003
2004 if (playerState->moveTime == 0) {
2005 playerState->moveTime = playerState->dist / playerState->speed;
2006 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2007 } else {
2008 playerState->speed = playerState->dist / playerState->moveTime;
2009 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2010 }
2011
2012 if (playerState->moveTime == 0) {
2013 return ApiStatus_DONE2;
2014 }
2015
2016 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2017 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2018 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2019 playerState->acceleration = (PI_S / 2) / playerState->moveTime;
2020 playerState->vel = 0.0f;
2021 playerState->speed += temp / playerState->moveTime;
2022 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpRise);
2024 playerState->unk_24 = 90.0f;
2025 playerState->bounceDivisor = 45.0f;
2026 playerState->unk_28 = 360 / playerState->moveTime;
2027 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_4) {
2028 playerState->bounceDivisor = 56.25f;
2029 }
2030 playerState->unk_18.x = 0.0f;
2031 playerState->unk_18.y = 0.0f;
2032 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_0) {
2033 vel1 = playerState->vel;
2034 acc1 = playerState->acceleration;
2035 playerState->vel = (vel1 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc1) + acc1));
2036 } else {
2037 vel2 = playerState->vel;
2038 acc2 = playerState->acceleration;
2039 playerState->vel = (vel2 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc2) + acc2));
2040 }
2041 script->functionTemp[0] = SUPER_STATE_01;
2042 break;
2043 case SUPER_STATE_10:
2044 playerState->curPos.x = player->curPos.x;
2045 playerState->curPos.y = player->curPos.y;
2046 playerState->curPos.z = player->curPos.z;
2047 goalX = playerState->goalPos.x;
2048 goalZ = playerState->goalPos.z;
2049 posX = playerState->curPos.x;
2050 posY = playerState->curPos.y;
2051 posZ = playerState->curPos.z;
2052 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2053 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2054 if (playerState->moveTime == 0) {
2055 playerState->moveTime = playerState->dist / playerState->speed;
2056 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2057 } else {
2058 playerState->speed = playerState->dist / playerState->moveTime;
2059 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2060 }
2061
2062 if (playerState->moveTime == 0) {
2063 return ApiStatus_DONE2;
2064 }
2065 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2066 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2067 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2068 playerState->vel = (PI_S / 2);
2069 playerState->acceleration = (PI_S / 4) / (playerState->moveTime + 1);
2070 playerState->speed += temp / playerState->moveTime;
2071 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2072 playerState->unk_24 = 90.0f;
2073 playerState->bounceDivisor = 45.0f;
2074 playerState->unk_28 = (360 / playerState->moveTime);
2075 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_5) {
2076 playerState->bounceDivisor = 56.25f;
2077 }
2078 playerState->unk_18.x = 0.0f;
2079 playerState->unk_18.y = 0.0f;
2080 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_1) {
2081 vel3 = playerState->vel;
2082 acc3 = playerState->acceleration;
2083 playerState->vel = (vel3 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc3) + acc3));
2084 } else {
2085 vel4 = playerState->vel;
2086 acc4 = playerState->acceleration;
2087 playerState->vel = (vel4 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc4) + acc4));
2088 }
2089 playerState->curPos.y = player->curPos.y - playerState->bounceDivisor;
2090 script->functionTemp[0] = SUPER_STATE_11;
2091 break;
2092 case SUPER_STATE_20:
2093 playerState->moveTime = 1;
2094 playerState->unk_24 = 90.0f;
2095 playerState->bounceDivisor = (fabsf(playerState->unk_18.x - playerState->unk_18.y) / 16.5);
2096 playerState->unk_28 = (360 / playerState->moveTime);
2097 playerState->curPos.x = player->curPos.x;
2098 playerState->curPos.y = player->curPos.y;
2099 playerState->curPos.z = player->curPos.z;
2100 script->functionTemp[0] = SUPER_STATE_21;
2101 break;
2102 }
2103
2104 switch (script->functionTemp[0]) {
2105 case SUPER_STATE_01:
2106 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_0) {
2107 vel5 = playerState->vel;
2108 acc5 = playerState->acceleration;
2109 playerState->vel = (vel5 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc5) + acc5));
2110 } else {
2111 vel6 = playerState->vel;
2112 acc6 = playerState->acceleration;
2113 playerState->vel = (vel6 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc6) + acc6));
2114 }
2115 playerState->curPos.x += playerState->velStep.x;
2116 playerState->curPos.y += playerState->velStep.y;
2117 playerState->curPos.z += playerState->velStep.z;
2118 playerState->unk_18.x = player->curPos.y;
2119 player->curPos.x = playerState->curPos.x;
2120 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(sin_rad(sin_rad(playerState->vel) * (PI_S / 2)) * (PI_S / 2)));
2121 player->curPos.z = playerState->curPos.z;
2122 playerState->unk_18.y = player->curPos.y;
2123 playerState->unk_24 += playerState->unk_28;
2124 playerState->unk_24 = clamp_angle(playerState->unk_24);
2125 playerState->moveTime--;
2126 if (playerState->moveTime == 0) {
2128 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2129 player->rotPivotOffset.y = 14;
2130 player->rot.z -= 66.0f;
2131 playerState->moveTime = 7;
2132 script->functionTemp[0] = SUPER_STATE_02;
2133 }
2134 break;
2135 case SUPER_STATE_02:
2136 player->rotPivotOffset.y = 14;
2137 player->rot.z -= 66.0f;
2138 playerState->moveTime--;
2139 if (playerState->moveTime == 0) {
2140 player->rot.z = 0.0f;
2141 player->rotPivotOffset.y = 0;
2142 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2143 return ApiStatus_DONE1;
2144 }
2145 break;
2146 case SUPER_STATE_11:
2147 playerState->curPos.x += playerState->velStep.x;
2148 playerState->curPos.y += playerState->velStep.y;
2149 playerState->curPos.z += playerState->velStep.z;
2150 playerState->unk_18.x = player->curPos.y;
2151 player->curPos.x = playerState->curPos.x;
2152 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2153 player->curPos.z = playerState->curPos.z;
2154 if (playerState->goalPos.y > player->curPos.y) {
2155 player->curPos.y = playerState->goalPos.y;
2156 }
2157 playerState->unk_18.y = player->curPos.y;
2158
2159 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_1) {
2160 vel7 = playerState->vel;
2161 acc7 = playerState->acceleration;
2162 playerState->vel = (vel7 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc7) + acc7));
2163 } else {
2164 vel8 = playerState->vel;
2165 acc8 = playerState->acceleration;
2166 playerState->vel = (vel8 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc8) + acc8));
2167 }
2168
2169 playerState->unk_24 += playerState->unk_28;
2170 playerState->unk_24 = clamp_angle(playerState->unk_24);
2171 playerState->moveTime--;
2172 if (playerState->moveTime == 0) {
2173 player->curPos.y = playerState->goalPos.y;
2175 return ApiStatus_DONE1;
2176 }
2177 break;
2178 case SUPER_STATE_21:
2179 temp_f20 = playerState->curPos.x;
2180 temp_f20 += (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24))) / 33.0;
2181 playerState->curPos.x = temp_f20;
2182 playerState->curPos.y -= playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24));
2183 playerState->unk_24 += playerState->unk_28;
2184 playerState->unk_24 = clamp_angle(playerState->unk_24);
2185 player->curPos.x = playerState->curPos.x;
2186 player->curPos.y = playerState->curPos.y;
2187 player->curPos.z = playerState->curPos.z;
2189 return ApiStatus_DONE2;
2190 }
2191 playerState->moveTime--;
2192 if (playerState->moveTime == 0) {
2193 return ApiStatus_DONE1;
2194 }
2195 break;
2196 }
2197
2198 return ApiStatus_BLOCK;
2199}
2200
2201API_CALLABLE(PlayerUltraJumpToGoal) {
2202 Bytecode* args = script->ptrReadPos;
2204 ActorState* playerState = &player->state;
2205 f32 posX, posY, posZ;
2206 f32 goalX, goalZ;
2207 f32 speed;
2208 f32 temp;
2209
2210 f64 temp_f20;
2216
2217 f64 temp_f22;
2223
2224 enum {
2225 ULTRA_STATE_00 = 0,
2226 ULTRA_STATE_01 = 1,
2227 ULTRA_STATE_10 = 10,
2228 ULTRA_STATE_11 = 11,
2229 ULTRA_STATE_20 = 20,
2230 ULTRA_STATE_21 = 21,
2231 ULTRA_STATE_30 = 30,
2232 ULTRA_STATE_31 = 31,
2233 };
2234
2235 if (isInitialCall) {
2236 player->state.moveTime = evt_get_variable(script, *args++);
2237 player->state.moveArcAmplitude = evt_get_variable(script, *args++);
2238
2239 switch(player->state.moveArcAmplitude) {
2240 default:
2242 script->functionTemp[0] = ULTRA_STATE_00;
2243 break;
2245 script->functionTemp[0] = ULTRA_STATE_11;
2246 break;
2248 script->functionTemp[0] = ULTRA_STATE_30;
2249 break;
2251 script->functionTemp[0] = ULTRA_STATE_20;
2252 break;
2254 script->functionTemp[0] = ULTRA_STATE_30;
2255 break;
2256 }
2257
2258 script->functionTemp[1] = 0;
2259 }
2260
2261 switch (script->functionTemp[0]) {
2262 case ULTRA_STATE_00:
2263 playerState->curPos.x = player->curPos.x;
2264 playerState->curPos.y = player->curPos.y;
2265 playerState->curPos.z = player->curPos.z;
2266 goalX = playerState->goalPos.x;
2267 goalZ = playerState->goalPos.z;
2268 posX = playerState->curPos.x;
2269 posY = playerState->curPos.y;
2270 posZ = playerState->curPos.z;
2271 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2272 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2273 if (playerState->moveTime == 0) {
2274 playerState->moveTime = playerState->dist / playerState->speed;
2275 } else {
2276 playerState->speed = playerState->dist / playerState->moveTime;
2277 }
2278 playerState->acceleration = PI_S / playerState->moveTime;
2279 playerState->vel = 0.0f;
2280 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2281 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2282 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2283 playerState->speed = playerState->dist / playerState->moveTime;
2284 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2287 playerState->unk_18.x = 0.0f;
2288 playerState->unk_18.y = 0.0f;
2289 playerState->unk_24 = 90.0f;
2290
2291 temp = playerState->dist;
2292 temp -= 20.0;
2293 temp /= 6.0;
2294 temp += 47.0;
2295 playerState->bounceDivisor = temp;
2296
2297 temp_f20 = playerState->vel;
2298 temp_f22 = playerState->acceleration;
2299 playerState->unk_28 = 360 / playerState->moveTime;
2300 playerState->vel = temp_f20 + (((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53) * temp_f22) + temp_f22);
2301 script->functionTemp[0] = ULTRA_STATE_01;
2302 break;
2303 case ULTRA_STATE_10:
2304 playerState->curPos.x = player->curPos.x;
2305 playerState->curPos.y = player->curPos.y;
2306 playerState->curPos.z = player->curPos.z;
2307 goalX = playerState->goalPos.x;
2308 goalZ = playerState->goalPos.z;
2309 posX = playerState->curPos.x;
2310 posY = playerState->curPos.y;
2311 posZ = playerState->curPos.z;
2312 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2313 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2314 if (playerState->moveTime == 0) {
2315 playerState->moveTime = playerState->dist / playerState->speed;
2316 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2317 } else {
2318 speed = playerState->dist / playerState->moveTime;
2319 playerState->speed = speed;
2320 temp = playerState->dist - (playerState->moveTime * speed);
2321 }
2322 playerState->acceleration = PI_S / playerState->moveTime;
2323 playerState->vel = 0.0f;
2324 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2325 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2326 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2327 playerState->speed += temp / playerState->moveTime;
2328 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpRise);
2331 playerState->unk_18.x = 0.0f;
2332 playerState->unk_18.y = 0.0f;
2333 playerState->unk_24 = 90.0f;
2334 temp_f20_2 = playerState->vel;
2335 temp_f22_2 = playerState->acceleration;
2336
2337 temp = playerState->dist;
2338 temp -= 20.0;
2339 temp /= 6.0;
2340 temp += 47.0;
2341 playerState->bounceDivisor = temp;
2342
2343 playerState->unk_28 = 360 / playerState->moveTime;
2344 playerState->vel = temp_f20_2 + (((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53) * temp_f22_2) + temp_f22_2);
2345 script->functionTemp[0] = ULTRA_STATE_11;
2346 break;
2347 case ULTRA_STATE_20:
2348 playerState->moveTime = 1;
2350 player->rot.y = 0.0f;
2351 playerState->unk_24 = 90.0f;
2352 playerState->bounceDivisor = fabsf(playerState->unk_18.x - playerState->unk_18.y) / 16.5;
2353 playerState->unk_28 = 360 / playerState->moveTime;
2354 playerState->curPos.x = player->curPos.x;
2355 playerState->curPos.y = player->curPos.y;
2356 playerState->curPos.z = player->curPos.z;
2357 script->functionTemp[0] = ULTRA_STATE_21;
2358 break;
2359 case ULTRA_STATE_30:
2360 playerState->curPos.x = player->curPos.x;
2361 playerState->curPos.y = player->curPos.y;
2362 playerState->curPos.z = player->curPos.z;
2363 goalX = playerState->goalPos.x;
2364 goalZ = playerState->goalPos.z;
2365 posX = playerState->curPos.x;
2366 posY = playerState->curPos.y;
2367 posZ = playerState->curPos.z;
2368 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2369 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2370 if (playerState->moveTime == 0) {
2371 playerState->moveTime = playerState->dist / playerState->speed;
2372 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2373 } else {
2374 playerState->speed = playerState->dist / playerState->moveTime;
2375 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2376 }
2377 playerState->acceleration = PI_S / (playerState->moveTime + 1);
2378 playerState->vel = 0.0f;
2379 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2380 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2381 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2382 playerState->speed += temp / playerState->moveTime;
2383 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpRise);
2385 playerState->unk_24 = 90.0f;
2386 playerState->unk_28 = 360 / playerState->moveTime;
2387 if (playerState->moveArcAmplitude == PLAYER_ULTRA_JUMP_4) {
2388 playerState->bounceDivisor = 56.25f;
2389 } else {
2390 playerState->bounceDivisor = 45.0f;
2391 }
2392 playerState->unk_18.x = 0.0f;
2393 playerState->unk_18.y = 0.0f;
2394 temp_f22_3 = playerState->acceleration;
2395 playerState->vel += ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f22_3) + temp_f22_3);
2396 script->functionTemp[0] = ULTRA_STATE_31;
2397 break;
2398 }
2399
2400 switch (script->functionTemp[0]) {
2401 case ULTRA_STATE_01:
2402 temp_f22_4 = playerState->vel;
2403 temp_f20_4 = playerState->acceleration;
2404 playerState->vel = temp_f22_4 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f20_4) + temp_f20_4);
2405 playerState->curPos.x += playerState->velStep.x;
2406 playerState->curPos.y += playerState->velStep.y;
2407 playerState->curPos.z += playerState->velStep.z;
2408 playerState->unk_18.x = player->curPos.y;
2409 player->curPos.x = playerState->curPos.x;
2410 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2411 player->curPos.z = playerState->curPos.z;
2412 playerState->unk_18.y = player->curPos.y;
2413 playerState->unk_24 += playerState->unk_28;
2414 playerState->unk_24 = clamp_angle(playerState->unk_24);
2415 player->rot.y += 133.0f;
2416 player->rot.y = clamp_angle(player->rot.y);
2418 return ApiStatus_DONE2;
2419 }
2420 playerState->moveTime--;
2421 if (playerState->moveTime == 4) {
2422 return ApiStatus_DONE1;
2423 }
2424 break;
2425 case ULTRA_STATE_11:
2426 temp_f22_6 = playerState->vel;
2427 temp_f20_7 = playerState->acceleration;
2428 playerState->vel = temp_f22_6 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f20_7) + temp_f20_7);
2429 playerState->curPos.x += playerState->velStep.x;
2430 playerState->curPos.y += playerState->velStep.y;
2431 playerState->curPos.z += playerState->velStep.z;
2432 playerState->unk_18.x = player->curPos.y;
2433 player->curPos.x = playerState->curPos.x;
2434 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2435 player->curPos.z = playerState->curPos.z;
2436 if (playerState->goalPos.y > player->curPos.y && playerState->moveTime < 3) {
2437 player->curPos.y = playerState->goalPos.y;
2438 }
2439 playerState->unk_18.y = player->curPos.y;
2440 playerState->unk_24 += playerState->unk_28;
2441 playerState->unk_24 = clamp_angle(playerState->unk_24);
2442 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2443 player->rot.y += 133.0f;
2444 player->rot.y = clamp_angle(player->rot.y);
2445 playerState->moveTime--;
2446 if (playerState->moveTime == 0) {
2447 playerState->acceleration = 1.8f;
2448 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
2449 player->curPos.y = playerState->goalPos.y;
2450 player->rot.y = 0.0f;
2451 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2452 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
2453 return ApiStatus_DONE1;
2454 }
2455 break;
2456 case ULTRA_STATE_21:
2457 playerState->curPos.x += (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24))) / 33.0;
2458 playerState->curPos.y -= playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24));
2459 playerState->unk_24 += playerState->unk_28;
2460 playerState->unk_24 = clamp_angle(playerState->unk_24);
2461 player->curPos.x = playerState->curPos.x;
2462 player->curPos.y = playerState->curPos.y;
2463 player->curPos.z = playerState->curPos.z;
2465 return ApiStatus_DONE2;
2466 }
2467 playerState->moveTime--;
2468 if (playerState->moveTime == 0) {
2469 return ApiStatus_DONE1;
2470 }
2471 break;
2472 case ULTRA_STATE_31:
2473 temp_f20_6 = playerState->acceleration;
2474 playerState->vel += (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f20_6) + temp_f20_6;
2475 playerState->curPos.x += playerState->velStep.x;
2476 playerState->curPos.y += playerState->velStep.y;
2477 playerState->curPos.z += playerState->velStep.z;
2478 playerState->unk_18.x = player->curPos.y;
2479 player->curPos.x = playerState->curPos.x;
2480 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2481 player->curPos.z = playerState->curPos.z;
2482 if (playerState->goalPos.y > player->curPos.y && playerState->moveTime < 3) {
2483 player->curPos.y = playerState->goalPos.y;
2484 }
2485 playerState->unk_18.y = player->curPos.y;
2486 playerState->unk_24 += playerState->unk_28;
2487 playerState->unk_24 = clamp_angle(playerState->unk_24);
2488 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2489 player->rot.y += 133.0f;
2490 player->rot.y = clamp_angle(player->rot.y);
2491 playerState->moveTime--;
2492 if (playerState->moveTime == 0) {
2493 player->curPos.y = playerState->goalPos.y;
2494 player->rot.y = 0.0f;
2495 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2496 playerState->acceleration = 1.8f;
2497 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
2498 return ApiStatus_DONE1;
2499 }
2500 break;
2501 }
2502
2503 return ApiStatus_BLOCK;
2504}
2505
2506API_CALLABLE(GetPlayerActionQuality) {
2507 Bytecode* args = script->ptrReadPos;
2508 s32 outVar = *args++;
2509 s32 actionQuality = gBattleStatus.actionQuality;
2510 s32 quality = 0;
2511
2512 if (actionQuality < 0) {
2513 actionQuality = 0;
2514 }
2515
2516 if (quality < actionQuality) {
2517 quality = actionQuality;
2518 }
2519
2521 return ApiStatus_DONE2;
2522}
2523
2524API_CALLABLE(PlayerYieldTurn) {
2526 return ApiStatus_DONE2;
2527}
2528
2529API_CALLABLE(DispatchEventPlayer) {
2531 return ApiStatus_DONE2;
2532}
BSS s32 PopupMenu_SelectedIndex
@ AC_MODE_NOT_LEARNED
Definition action_cmd.h:60
struct Evt * takeTurnScript
s32 actorTypeData1[6]
u8 footStepCounter
ActorState state
s16 damageCounter
struct Evt * handleEventScript
s32 takeTurnScriptID
s16 actorTypeData1b[2]
Vec3s rotPivotOffset
s32 b32
s32 handleEventScriptID
Vec3f curPos
s16 hpChangeCounter
Bytecode EvtScript[]
s8 flags
Definition demo_api.c:15
HitResult calc_player_test_enemy(void)
Definition dmg_player.c:179
EvtScript EVS_PlayStopHitFX
Definition dmg_player.c:109
#define INFLICT_STATUS(STATUS_TYPE)
b32 dispatch_damage_tick_event_player(s32 damageAmount, s32 event)
void dispatch_event_player(s32 eventType)
Definition dmg_player.c:131
void dispatch_event_player_continue_turn(s32 eventType)
Definition dmg_player.c:157
EvtScript EVS_PlayFreezeHitFX
Definition dmg_player.c:115
b32 dispatch_damage_event_player(s32 damageAmount, s32 event, b32 noHitSound)
EvtScript EVS_PlayShrinkHitFX
Definition dmg_player.c:125
b32 dispatch_hazard_event_player(s32 damageAmount, s32 event)
EvtScript EVS_PlayParalyzeHitFX
Definition dmg_player.c:97
HitResult calc_player_damage_enemy(void)
Definition dmg_player.c:240
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 sfx_play_sound_at_position
#define rand_int
#define clamp_angle
#define atan2
#define ASSERT(condition)
@ ACTION_RATING_NICE_SUPER_COMBO
'Nice' but becomes 'Super' if nice hits > 2
Definition enums.h:2010
@ ACTION_RATING_MISS
clears nice hits
Definition enums.h:2006
@ ACTION_RATING_NICE
sets nice hits = 1
Definition enums.h:2005
@ BUTTON_A
Definition enums.h:2776
@ 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_2000
Definition enums.h:3615
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3604
@ ELEMENT_END
Definition enums.h:2147
@ PLAYER_ULTRA_JUMP_2
Definition enums.h:3900
@ PLAYER_ULTRA_JUMP_0
Definition enums.h:3898
@ PLAYER_ULTRA_JUMP_3
Definition enums.h:3901
@ PLAYER_ULTRA_JUMP_4
Definition enums.h:3902
@ PLAYER_ULTRA_JUMP_1
Definition enums.h:3899
@ 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_EXTREME_DEFENSE
Actor has 127 extra defense during damage calculation, unaffected by IGNORE_DEFENSE.
Definition enums.h:3415
@ 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
@ PLAYER_SUPER_JUMP_0
Definition enums.h:3888
@ PLAYER_SUPER_JUMP_4
Definition enums.h:3892
@ PLAYER_SUPER_JUMP_1
Definition enums.h:3889
@ PLAYER_SUPER_JUMP_5
Definition enums.h:3893
@ PLAYER_SUPER_JUMP_6
Definition enums.h:3894
@ PLAYER_SUPER_JUMP_2
Definition enums.h:3890
@ RUSH_FLAG_MEGA
Definition enums.h:4916
@ RUSH_FLAG_POWER
Definition enums.h:4917
@ BS_FLAGS2_IS_FIRST_STRIKE
Definition enums.h:3651
@ BS_FLAGS2_HAS_DRAINED_HP
Definition enums.h:3653
@ BS_FLAGS2_HAS_RUSH
Definition enums.h:3654
@ 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_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_HIT_STATIC
Definition enums.h:1983
@ 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
@ PLAYER_BASIC_JUMP_3
Definition enums.h:3883
@ PLAYER_BASIC_JUMP_1
Definition enums.h:3881
@ PLAYER_BASIC_JUMP_4
Definition enums.h:3884
@ PLAYER_BASIC_JUMP_2
Definition enums.h:3882
@ 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_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_BERSERKER
Definition enums.h:457
@ ABILITY_ATTACK_FX
Definition enums.h:451
@ ABILITY_P_DOWN_D_UP
Definition enums.h:473
@ ABILITY_MEGA_HP_DRAIN
Definition enums.h:472
@ ABILITY_SPIKE_SHIELD
Definition enums.h:438
@ ABILITY_ZAP_TAP
Definition enums.h:455
@ ABILITY_P_UP_D_DOWN
Definition enums.h:470
@ ABILITY_FIRE_SHIELD
Definition enums.h:443
@ ABILITY_ICE_POWER
Definition enums.h:449
@ ABILITY_ALL_OR_NOTHING
Definition enums.h:446
@ ABILITY_HP_DRAIN
Definition enums.h:445
@ SOUND_STEP_NORMAL1
Definition enums.h:762
@ SOUND_IMMUNE
Definition enums.h:748
@ SOUND_LAND_SOFTLY
Definition enums.h:768
@ SOUND_DAMAGE_STARS
Definition enums.h:953
@ SOUND_INFLICT_STATUS
Definition enums.h:1358
@ SOUND_HIT_PLAYER_ICE
Definition enums.h:724
@ SOUND_FLOWERS_LAUGH
Definition enums.h:1392
@ SOUND_HIT_SPIKE
Definition enums.h:746
@ SOUND_HIT_PLAYER_SHOCK
Definition enums.h:1197
@ SOUND_SLIDE_WHISTLE_OUT
Definition enums.h:718
@ SOUND_HIT_PLAYER_FIRE
Definition enums.h:723
@ SOUND_TORNADO_JUMP
Definition enums.h:767
@ SOUND_HIT_NORMAL
Definition enums.h:727
@ SOUND_HIT_WHACKA
Definition enums.h:1415
@ SOUND_SMACK_TREE
Definition enums.h:790
@ SOUND_HIT_SHOCK
Definition enums.h:1198
@ SOUND_PLANTS_BELL
Definition enums.h:730
@ SOUND_HIT_ICE
Definition enums.h:729
@ SOUND_HIT_FIRE
Definition enums.h:728
@ SOUND_LIFE_SHROOM_CHIME
Definition enums.h:1189
@ SOUND_LONG_PLAYER_JUMP
Definition enums.h:785
@ SOUND_YOSHI
Definition enums.h:1414
@ SOUND_INFLICT_SLEEP
Definition enums.h:1357
@ SOUND_STEP_NORMAL2
Definition enums.h:763
@ ACTOR_PLAYER
Definition enums.h:2118
@ ACTOR_FLAG_NO_DMG_POPUP
Hide damage popup.
Definition enums.h:3375
@ ACTOR_FLAG_FLIPPED
Actor has been flipped over.
Definition enums.h:3364
@ SOUND_SPACE_DEFAULT
Definition enums.h:1740
@ ACTOR_BLUR_ENABLE
Definition enums.h:6005
@ ACTOR_BLUR_DISABLE
Definition enums.h:6004
@ EVENT_HIT
Definition enums.h:2165
@ EVENT_SPIKE_DEATH
Definition enums.h:2193
@ 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_SHOCK_DEATH
Definition enums.h:2192
@ 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_SHELL_CRACK_HIT
Definition enums.h:2172
@ EVENT_SPIKE_TAUNT
Definition enums.h:2181
@ 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_POW
Definition enums.h:2895
@ DAMAGE_TYPE_MULTI_BOUNCE
Definition enums.h:2908
@ DAMAGE_TYPE_ICE
Definition enums.h:2888
@ DAMAGE_TYPE_SHELL_CRACK
Definition enums.h:2902
@ DAMAGE_TYPE_STATUS_ALWAYS_HITS
Definition enums.h:2914
@ DAMAGE_TYPE_THROW
Definition enums.h:2903
@ 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_QUAKE_HAMMER
Definition enums.h:2905
@ 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_DONE1
Definition evt.h:118
#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:2001
s32 does_script_exist_by_ref(Evt *script)
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1725
s32 is_ability_active(s32 arg0)
Definition inventory.c:1735
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2497
f32 fabsf(f32 f)
void show_immune_bonk(f32 x, f32 y, f32 z, s32, s32, s32)
s32 count_power_plus(s32)
Definition 190B20.c:671
void disable_player_blur(void)
void dispatch_event_actor(Actor *, s32)
Definition 1A5830.c:102
void show_actor_health_bar(Actor *)
Definition 190B20.c:2237
void clear_part_pal_adjustment(ActorPart *)
Definition 190B20.c:2350
s32 evt_set_variable(Evt *script, Bytecode var, s32 value)
Definition evt.c:1882
void enable_player_blur(void)
void set_actor_flash_mode(Actor *actor, s32 arg1)
Definition 190B20.c:2428
void show_damage_fx(Actor *actor, f32 x, f32 y, f32 z, s32 damage)
Definition 190B20.c:2066
void force_disable_player_blur_immediately(void)
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:668
void cancel_action_rating_combo(Actor *)
Definition 190B20.c:2171
void add_xz_vec3f(Vec3f *vector, f32 speed, f32 angleDeg)
Definition 190B20.c:871
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
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:2027
s32 get_defense(Actor *actor, s32 *defenseTable, s32 elementFlags)
Definition 190B20.c:1951
void set_actor_anim(s32 actorID, s32 partID, AnimID animID)
Definition 190B20.c:737
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 play_movement_dust_effects(s32 var0, f32 xPos, f32 yPos, f32 zPos, f32 angleDeg)
Definition 190B20.c:898
void force_disable_player_blur(void)
f32 sin_rad(f32 x)
Definition 43F0.c:711
void apply_shock_effect(Actor *)
void show_action_rating(s32, Actor *, f32, f32, f32)
Definition 190B20.c:2092
s32 try_inflict_status(Actor *, s32, s32)
Definition 190B20.c:2264
void reset_player_blur(void)
EvtScript EVS_Player_HandleEvent
void sfx_play_sound(s32 soundID)
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:214
#define DEG_TO_RAD(deg)
Definition macros.h:146
#define PI_S
Definition macros.h:141
#define STATUS_KEY_NEVER
Definition macros.h:235
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
Definition macros.h:255
#define Call(FUNC, ARGS...)
Calls a given C EVT API function with any number of arguments.
Definition macros.h:577
#define Return
Kills the current EVT thread.
Definition macros.h:218
struct Actor * playerActor
PlayerData gPlayerData
Definition 77480.c:39
BattleStatus gBattleStatus
Definition battle.cpp:14