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
136
137 player->lastEventType = eventType;
138
141
144 player->handleEventScriptID = eventScript->id;
145 eventScript->owner1.actor = nullptr;
146
147 if (player->takeTurnScript != nullptr) {
149 player->takeTurnScript = nullptr;
150 }
151
152 if (oldOnHitScript != nullptr) {
154 }
155}
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 == nullptr) {
193 return HIT_RESULT_HIT;
194 }
195
197 ASSERT(targetPart != nullptr);
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
264 canBeShocked = false;
265 isFireDamage = false;
266 isWaterDamage = false;
267 isShockDamage = false;
268 isIceDamage = false;
269 wasSpecialHit = false;
270 partImmuneToElement = false;
271 wasStatusInflicted = false;
272 missedAllOrNothing = 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 == nullptr) {
283 return HIT_RESULT_HIT;
284 }
285
287
288 ASSERT(targetPart != nullptr);
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) {
321 partImmuneToElement = true;
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);
384 isFireDamage = true;
385 }
386
387 if (battleStatus->curAttackElement & DAMAGE_TYPE_SHOCK) {
389 isShockDamage = true;
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);
394 isWaterDamage = true;
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);
399 isIceDamage = true;
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 ) {
436 canBeShocked = true;
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
543 missedAllOrNothing = true;
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
787 wasSpecialHit = true;
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)) {
804 wasSpecialHit = true;
805 }
806 }
807 }
808
809 // try generating flip trigger events
813 ) {
816 }
817
820 }
821
822 if (!(target->flags & ACTOR_FLAG_FLIPPED)) {
823 wasSpecialHit = true;
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 }
839 wasSpecialHit = true;
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
854 isFireDamage = true;
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) &&
885 wasSpecialHit = true;
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;
1060 s32 flags;
1063 s32 temp;
1064
1065 battleStatus->curAttackDamage = damageAmount;
1066
1067 temp = (s16)damageAmount; //TODO usage of temp here required to match
1068 player->hpChangeCounter += temp;
1069
1070 temp = player->hpChangeCounter;
1071 player->curHP = playerData->curHP;
1072 player->damageCounter += temp;
1073 player->hpChangeCounter -= temp;
1074 battleStatus->lastAttackDamage = 0;
1075 player->curHP -= temp;
1076 battleStatus->damageTaken += temp;
1077
1078 oldPlayerHP = player->curHP;
1079
1081 if (player->curHP < 1) {
1082 battleStatus->lastAttackDamage += oldPlayerHP;
1083 player->curHP = 0;
1085 }
1086 battleStatus->lastAttackDamage += temp;
1087 playerData->curHP = player->curHP;
1088
1091 }
1094 }
1095
1096 if (dispatchEvent == EVENT_DEATH) {
1097 if (event == EVENT_SPIKE_CONTACT) {
1099 }
1100 if (event == EVENT_BURN_CONTACT) {
1102 }
1103 if (event == EVENT_SHOCK_HIT) {
1105 }
1106 }
1107
1108 if (!noHitSound) {
1111 }
1112
1113 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 1);
1114 show_damage_fx(player, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
1115
1116 if (battleStatus->lastAttackDamage > 0) {
1117 set_actor_flash_mode(player, 1);
1118 }
1119
1122 return flags;
1123}
1124
1125// damage received from "damage over time" effects (only used for poison)
1133
1134// damage received from contact hazards
1138
1139API_CALLABLE(GetMenuSelection) {
1141 Bytecode* args = script->ptrReadPos;
1142 s32 outVar1 = *args++;
1143 s32 outVar2 = *args++;
1144 s32 outVar3 = *args++;
1145
1148 evt_set_variable(script, outVar3, battleStatus->selectedMoveID);
1149
1150 return ApiStatus_DONE2;
1151}
1152
1153API_CALLABLE(PlayerHopToGoal) {
1155 Bytecode* args = script->ptrReadPos;
1156 Actor* player = battleStatus->playerActor;
1157 ActorState* playerState = &player->state;
1158 f32 playerVel;
1159 f32 x, y, z;
1160 f32 goalX, goalY, goalZ;
1161
1162 if (isInitialCall) {
1163 script->functionTemp[0] = false;
1164 }
1165
1166 if (script->functionTemp[0] == 0) {
1168 playerState->moveArcAmplitude = evt_get_variable(script, *args++);
1169 script->functionTemp[1] = evt_get_variable(script, *args++);
1170
1171 playerState->curPos.x = player->curPos.x;
1172 playerState->curPos.y = player->curPos.y;
1173 playerState->curPos.z = player->curPos.z;
1174
1175 x = playerState->curPos.x;
1176 y = playerState->curPos.y;
1177 z = playerState->curPos.z;
1178 goalX = playerState->goalPos.x;
1179 goalY = playerState->goalPos.y;
1180 goalZ = playerState->goalPos.z;
1181
1182 playerState->angle = atan2(x, z, goalX, goalZ);
1183 playerState->dist = dist2D(x, z, goalX, goalZ);
1184
1185 if (playerState->moveTime == 0) {
1186 playerState->moveTime = playerState->dist / playerState->speed;
1187 } else {
1188 playerState->speed = playerState->dist / playerState->moveTime;
1189 }
1190
1191 playerState->speed = playerState->dist / playerState->moveTime;
1192 playerState->vel = (playerState->acceleration * playerState->moveTime * 0.5f) + ((goalY - y) / playerState->moveTime);
1193 set_actor_anim(0, 0, playerState->animJumpRise);
1194 playerState->unk_24 = 90.0f;
1195 playerState->unk_28 = 180 / playerState->moveTime;
1196 playerState->unk_2C = playerState->goalPos.y;
1197 if (script->functionTemp[1] != 2) {
1199 }
1200 script->functionTemp[0] = true;
1201 }
1202
1203 if (playerState->vel < 0.0f) {
1204 set_actor_anim(0, 0, playerState->animJumpFall);
1205 }
1206
1207 playerVel = playerState->vel;
1208 switch (playerState->moveArcAmplitude) {
1209 case 0:
1210 break;
1211 case 1:
1212 if (playerState->curPos.y - playerState->unk_2C > 45.0f) {
1213 playerVel *= 0.25f;
1214 }
1215 break;
1216 case 2:
1217 if (playerState->curPos.y - playerState->unk_2C > 54.9) {
1218 playerVel *= 0.25f;
1219 }
1220 break;
1221 }
1222
1223 playerState->curPos.y += playerVel;
1224 playerState->vel -= playerState->acceleration;
1225 add_xz_vec3f(&playerState->curPos, playerState->speed + sin_rad(DEG_TO_RAD(playerState->unk_24)), playerState->angle);
1226 playerState->unk_24 += playerState->unk_28;
1227 playerState->unk_24 = clamp_angle(playerState->unk_24);
1228 player->curPos.x = playerState->curPos.x;
1229 player->curPos.y = playerState->curPos.y;
1230 player->curPos.z = playerState->curPos.z;
1231 playerState->moveTime--;
1232
1233 if (playerState->moveTime >= 0) {
1234 return ApiStatus_BLOCK;
1235 }
1236
1237 player->curPos.y = playerState->goalPos.y;
1238 if (script->functionTemp[1] != 1) {
1239 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1240 }
1241 if (script->functionTemp[1] != 2) {
1243 }
1244
1245 return ApiStatus_DONE1;
1246}
1247
1248API_CALLABLE(PlayerFallToGoal) {
1249 Bytecode* args = script->ptrReadPos;
1251 ActorState* state = &player->state;
1252 f32 x, y, z;
1253 f32 goalX, goalY, goalZ;
1254
1255 if (isInitialCall) {
1256 script->functionTemp[0] = false;
1257 }
1258
1259 if (!script->functionTemp[0]) {
1260 s32 moveTime = evt_get_variable(script, *args++);
1261
1262 player->state.curPos.x = player->curPos.x;
1263 player->state.curPos.y = player->curPos.y;
1264 player->state.curPos.z = player->curPos.z;
1265
1266 x = player->state.curPos.x;
1267 y = player->state.curPos.y;
1268 z = player->state.curPos.z;
1269 goalX = player->state.goalPos.x;
1270 goalY = player->state.goalPos.y;
1271 goalZ = player->state.goalPos.z;
1272
1273 state->moveTime = moveTime;
1274
1275 player->state.angle = atan2(x, z, goalX, goalZ);
1276 player->state.dist = dist2D(x, z, goalX, goalZ);
1277
1278 y = goalY - y;
1279
1280 if (state->moveTime == 0) {
1281 state->moveTime = state->dist / state->speed;
1282 } else {
1283 state->speed = state->dist / state->moveTime;
1284 }
1285
1286 state->vel = 0.0f;
1287 state->acceleration = ((y / state->moveTime) - state->vel) / (-state->moveTime * 0.5);
1289 script->functionTemp[0] = true;
1290 }
1291
1292 if (state->vel < 0.0f) {
1294 }
1295
1296 state->curPos.y += state->vel;
1297 state->vel -= state->acceleration;
1298 add_xz_vec3f(&state->curPos, state->speed, state->angle);
1299
1300 player->curPos.x = state->curPos.x;
1301 player->curPos.y = state->curPos.y;
1302 player->curPos.z = state->curPos.z;
1303 state->moveTime--;
1304
1305 if (state->moveTime < 0) {
1306 player->curPos.x = state->goalPos.x;
1307 player->curPos.y = state->goalPos.y;
1308 player->curPos.z = state->goalPos.z;
1309 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1311 return ApiStatus_DONE1;
1312 }
1313 return ApiStatus_BLOCK;
1314}
1315
1316API_CALLABLE(PlayerLandJump) {
1318 ActorState* walkMovement = &player->state;
1319
1320 if (isInitialCall) {
1321 script->functionTemp[0] = 0;
1322 }
1323
1324 if (script->functionTemp[0] == 0) {
1325 walkMovement->curPos.x = player->curPos.x;
1326 walkMovement->curPos.y = player->curPos.y;
1327 walkMovement->curPos.z = player->curPos.z;
1328 script->functionTemp[0] = 1;
1329 }
1330
1331 if (walkMovement->vel > 0.0f) {
1332 if (walkMovement->animJumpRise != 0) {
1333 set_actor_anim(0, 0, walkMovement->animJumpRise);
1334 }
1335 }
1336
1337 if (walkMovement->vel < 0.0f) {
1338 if (walkMovement->animJumpFall != 0) {
1339 set_actor_anim(0, 0, walkMovement->animJumpFall);
1340 }
1341 }
1342
1343 walkMovement->curPos.y += walkMovement->vel;
1344 walkMovement->vel -= walkMovement->acceleration;
1345
1346 add_xz_vec3f(&walkMovement->curPos, walkMovement->speed, walkMovement->angle);
1347
1348 player->curPos.x = walkMovement->curPos.x;
1349 player->curPos.y = walkMovement->curPos.y;
1350 player->curPos.z = walkMovement->curPos.z;
1351
1352 if (player->curPos.y < 0.0f) {
1353 player->curPos.y = 0.0f;
1354
1355 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1357
1358 return ApiStatus_DONE1;
1359 }
1360
1361 return ApiStatus_BLOCK;
1362}
1363
1364API_CALLABLE(PlayerRunToGoal) {
1366 Bytecode* args = script->ptrReadPos;
1367 Actor* player = battleStatus->playerActor;
1368 ActorState* playerState = &player->state;
1370
1371 if (isInitialCall) {
1372 script->functionTemp[0] = false;
1373 }
1374
1375 if (!script->functionTemp[0]) {
1376 player->state.moveTime = evt_get_variable(script, *args++);
1377 player->state.curPos.x = player->curPos.x;
1378 player->state.curPos.y = player->curPos.y;
1379 player->state.curPos.z = player->curPos.z;
1380
1381 goalX = player->state.goalPos.x;
1382 goalZ = player->state.goalPos.z;
1383 currentX = player->state.curPos.x;
1384 currentZ = player->state.curPos.z;
1385
1388 if (player->state.moveTime == 0) {
1389 player->state.moveTime = player->state.dist / player->state.speed;
1390 if (player->state.moveTime == 0) {
1391 player->state.moveTime = 1;
1392 }
1393 player->state.speed += (player->state.dist - (player->state.moveTime * player->state.speed)) / player->state.moveTime;
1394 } else {
1395 player->state.speed = player->state.dist / player->state.moveTime;
1396 }
1397 playerState->dist = player->actorTypeData1b[0] + 1;
1398 script->functionTemp[0] = true;
1399 }
1400
1401 add_xz_vec3f(&playerState->curPos, playerState->speed, playerState->angle);
1402
1403 player->curPos.x = playerState->curPos.x;
1404 player->curPos.y = playerState->curPos.y;
1405 player->curPos.z = playerState->curPos.z;
1406
1407 if (playerState->speed < 4.0f) {
1408 play_movement_dust_effects(0, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1409 } else {
1410 play_movement_dust_effects(1, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1411 }
1412
1413 playerState->dist += playerState->speed;
1414 if (playerState->dist > player->actorTypeData1b[0]) {
1415 player->footStepCounter++;
1416 playerState->dist = 0.0f;
1417 if ((player->footStepCounter % 2) != 0) {
1419 } else {
1421 }
1422 }
1423
1424 playerState->moveTime--;
1425
1426 if (playerState->moveTime <= 0) {
1427 player->curPos.x = playerState->goalPos.x;
1428 player->curPos.z = playerState->goalPos.z;
1429 return ApiStatus_DONE2;
1430 }
1431 return ApiStatus_BLOCK;
1432}
1433
1434API_CALLABLE(CancelablePlayerRunToGoal) {
1436 Bytecode* args = script->ptrReadPos;
1437 Actor* player = battleStatus->playerActor;
1438 ActorState* playerState = &player->state;
1440
1441 if (isInitialCall) {
1442 script->functionTemp[0] = false;
1443 }
1444
1445 if (!script->functionTemp[0]) {
1446 player->state.moveTime = evt_get_variable(script, *args++);
1447 script->functionTemp[1] = *args++;
1448 player->state.curPos.x = player->curPos.x;
1449 player->state.curPos.y = player->curPos.y;
1450 player->state.curPos.z = player->curPos.z;
1451
1452 goalX = player->state.goalPos.x;
1453 goalZ = player->state.goalPos.z;
1454 currentX = player->state.curPos.x;
1455 currentZ = player->state.curPos.z;
1456
1459 if (player->state.moveTime == 0) {
1460 player->state.moveTime = player->state.dist / player->state.speed;
1461 player->state.speed += (player->state.dist - (player->state.moveTime * player->state.speed)) / player->state.moveTime;
1462 } else {
1463 player->state.speed = player->state.dist / player->state.moveTime;
1464 }
1465 playerState->dist = player->actorTypeData1b[0] + 1;
1466
1467 if (playerState->moveTime == 0) {
1468 return ApiStatus_DONE2;
1469 }
1470
1471 script->functionTemp[2] = false;
1472 script->functionTemp[3] = 0;
1473 script->functionTemp[0] = true;
1474 }
1475
1476 add_xz_vec3f(&playerState->curPos, playerState->speed, playerState->angle);
1477
1478 player->curPos.x = playerState->curPos.x;
1479 player->curPos.y = playerState->curPos.y;
1480 player->curPos.z = playerState->curPos.z;
1481
1482 if (playerState->speed < 4.0f) {
1483 play_movement_dust_effects(0, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1484 } else {
1485 play_movement_dust_effects(1, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
1486 }
1487
1488 playerState->dist += playerState->speed;
1489 if (playerState->dist > player->actorTypeData1b[0]) {
1490 player->footStepCounter++;
1491 playerState->dist = 0.0f;
1492 if ((player->footStepCounter % 2) != 0) {
1494 } else {
1496 }
1497 }
1498
1499 if (script->functionTemp[3] > 12) {
1500 if (!script->functionTemp[2]) {
1501 if (!(battleStatus->curButtonsDown & BUTTON_A)) {
1502 script->functionTemp[2] = true;
1503 }
1504 }
1505
1506 if (script->functionTemp[2]) {
1507 if (battleStatus->curButtonsPressed & BUTTON_A) {
1508 evt_set_variable(script, script->functionTemp[1], 1);
1509 return ApiStatus_DONE2;
1510 }
1511 }
1512 }
1513
1514 script->functionTemp[3]++;
1515
1516 playerState->moveTime--;
1517 if (playerState->moveTime > 0) {
1518 return ApiStatus_BLOCK;
1519 }
1520
1521 player->curPos.x = playerState->goalPos.x;
1522 player->curPos.z = playerState->goalPos.z;
1523 evt_set_variable(script, script->functionTemp[1], 0);
1524 return ApiStatus_DONE2;
1525}
1526
1527API_CALLABLE(GetPlayerHP) {
1529 return ApiStatus_DONE2;
1530}
1531
1532API_CALLABLE(PlayerDamageEnemy) {
1534 Bytecode* args = script->ptrReadPos;
1535 s32 hitResultOutVar = *args++;
1536 s32 flags;
1537 Actor* target;
1539
1540 battleStatus->curAttackElement = *args++;
1541 battleStatus->curAttackEventSuppression = *args++;
1542 battleStatus->curAttackStatus = *args++;
1543 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1544 battleStatus->powerBounceCounter = 0;
1545 flags = *args++;
1546
1547 #if DX_DEBUG_MENU
1549 battleStatus->curAttackDamage = 99;
1550 }
1551 #endif
1552
1556 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1559 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1562 } else {
1565 }
1566
1567 if (flags & BS_FLAGS1_NICE_HIT) {
1569 } else {
1571 }
1572 if (flags & BS_FLAGS1_SUPER_HIT) {
1574 } else {
1576 }
1577 if (flags & BS_FLAGS1_NO_RATING) {
1579 } else {
1581 }
1584 } else {
1586 }
1587
1588 target = get_actor(script->owner1.actorID);
1589 battleStatus->curTargetID = target->targetActorID;
1590 battleStatus->curTargetPart = target->targetPartID;
1591 battleStatus->statusChance = battleStatus->curAttackStatus;
1592 if (battleStatus->statusChance == STATUS_KEY_NEVER) {
1593 battleStatus->statusChance = 0;
1594 }
1595 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1596
1598 if (hitResult < 0) {
1599 return ApiStatus_FINISH;
1600 }
1602
1604 return ApiStatus_FINISH;
1605 }
1606
1607 return ApiStatus_DONE2;
1608}
1609
1610API_CALLABLE(PlayerPowerBounceEnemy) {
1612 Bytecode* args = script->ptrReadPos;
1613 s32 hitResultOutVar = *args++;
1614 s32 flags;
1615 Actor* target;
1617
1618 battleStatus->curAttackElement = *args++;
1619 battleStatus->curAttackEventSuppression = *args++;
1620 battleStatus->curAttackStatus = *args++;
1621 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1622 battleStatus->powerBounceCounter = evt_get_variable(script, *args++);
1623 flags = *args++;
1624
1627 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1630 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1633 } else {
1636 }
1637
1638 if (flags & BS_FLAGS1_NICE_HIT) {
1640 } else {
1642 }
1643 if (flags & BS_FLAGS1_SUPER_HIT) {
1645 } else {
1647 }
1648 if (flags & BS_FLAGS1_NO_RATING) {
1650 } else {
1652 }
1655 } else {
1657 }
1658
1659 target = get_actor(script->owner1.actorID);
1660 battleStatus->curTargetID = target->targetActorID;
1661 battleStatus->curTargetPart = target->targetPartID;
1662 battleStatus->statusChance = battleStatus->curAttackStatus;
1663 if (battleStatus->statusChance == STATUS_KEY_NEVER) {
1664 battleStatus->statusChance = 0;
1665 }
1666 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1667
1669 if (hitResult < 0) {
1670 return ApiStatus_FINISH;
1671 }
1673
1675 return ApiStatus_FINISH;
1676 }
1677
1678 return ApiStatus_DONE2;
1679}
1680
1681API_CALLABLE(PlayerTestEnemy) {
1683 Bytecode* args = script->ptrReadPos;
1684 s32 hitResultOutVar = *args++;
1685 s32 flags;
1686 Actor* target;
1688
1689 battleStatus->curAttackElement = *args++;
1690 battleStatus->curAttackEventSuppression = *args++;
1691 battleStatus->curAttackStatus = *args++;
1692 battleStatus->curAttackDamage = evt_get_variable(script, *args++);
1693 battleStatus->powerBounceCounter = 0;
1694 flags = *args++;
1695
1698 } else if (flags & BS_FLAGS1_INCLUDE_POWER_UPS) {
1701 } else if (flags & BS_FLAGS1_TRIGGER_EVENTS) {
1704 } else {
1707 }
1708
1709 if (flags & BS_FLAGS1_NICE_HIT) {
1711 } else {
1713 }
1714 if (flags & BS_FLAGS1_SUPER_HIT) {
1716 } else {
1718 }
1719 if (flags & BS_FLAGS1_NO_RATING) {
1721 } else {
1723 }
1726 } else {
1728 }
1729
1730 target = get_actor(script->owner1.actorID);
1731 battleStatus->curTargetID = target->targetActorID;
1732 battleStatus->curTargetPart = target->targetPartID;
1733 battleStatus->statusChance = battleStatus->curAttackStatus;
1734 if (battleStatus->statusChance == STATUS_KEY_NEVER) {
1735 battleStatus->statusChance = 0;
1736 }
1737 battleStatus->statusDuration = (battleStatus->curAttackStatus & 0xF00) >> 8;
1738
1740 if (hitResult < 0) {
1741 return ApiStatus_FINISH;
1742 }
1744 return ApiStatus_DONE2;
1745}
1746
1747API_CALLABLE(DispatchDamagePlayerEvent) {
1748 Bytecode* args = script->ptrReadPos;
1750
1752 return ApiStatus_BLOCK;
1753 }
1754
1756 return ApiStatus_DONE2;
1757 }
1758
1759 return ApiStatus_BLOCK;
1760}
1761
1762API_CALLABLE(EnablePlayerBlur) {
1763 s32 setting = evt_get_variable(script, *script->ptrReadPos);
1764
1765 if (setting == ACTOR_BLUR_DISABLE) {
1767 } else if (setting == ACTOR_BLUR_ENABLE) {
1769 } else {
1771 }
1772
1773 return ApiStatus_DONE2;
1774}
1775
1776API_CALLABLE(ForceDisablePlayerBlur) {
1778 return ApiStatus_DONE2;
1779}
1780
1783 return ApiStatus_DONE2;
1784}
1785
1786API_CALLABLE(PlayerBasicJumpToGoal) {
1788 Bytecode* args = script->ptrReadPos;
1789 Actor* player = battleStatus->playerActor;
1790 ActorState* playerState = &player->state;
1791 f32 posX, posY, posZ;
1792 f32 goalX, goalZ;
1793 f64 accel;
1794
1795 enum {
1796 BASIC_STATE_00 = 0,
1797 BASIC_STATE_01 = 1,
1798 BASIC_STATE_02 = 2,
1799 BASIC_STATE_03 = 3,
1800 };
1801
1802 if (isInitialCall) {
1803 player->state.moveTime = evt_get_variable(script, *args++);
1804 player->state.moveArcAmplitude = evt_get_variable(script, *args++);
1805
1806 switch(player->state.moveArcAmplitude) {
1807 default:
1808 script->functionTemp[0] = BASIC_STATE_00;
1809 break;
1811 script->functionTemp[0] = BASIC_STATE_02;
1812 break;
1813 }
1814
1815 script->functionTemp[1] = 0;
1816 }
1817
1818 if (script->functionTemp[0] == BASIC_STATE_00) {
1819 playerState->curPos.x = player->curPos.x;
1820 playerState->curPos.y = player->curPos.y;
1821 playerState->curPos.z = player->curPos.z;
1822 goalX = playerState->goalPos.x;
1823 goalZ = playerState->goalPos.z;
1824 posX = playerState->curPos.x;
1825 posY = playerState->curPos.y;
1826 posZ = playerState->curPos.z;
1827 playerState->angle = atan2(posX, posZ, goalX, goalZ);
1828 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
1829 if (playerState->moveTime == 0) {
1830 playerState->moveTime = playerState->dist / playerState->speed;
1831 } else {
1832 playerState->speed = playerState->dist / playerState->moveTime;
1833 }
1834
1835 if (playerState->moveTime == 0) {
1836 return ApiStatus_DONE2;
1837 }
1838
1839 playerState->speed = playerState->dist / playerState->moveTime;
1840 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
1841 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
1842 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
1843 playerState->acceleration = PI_S / playerState->moveTime;
1844 playerState->vel = 0.0f;
1845
1846 if (playerState->moveArcAmplitude < PLAYER_BASIC_JUMP_3) {
1847 playerState->bounceDivisor = 47.0 + (playerState->dist - 20.0) / 6.0;
1848 if (playerState->moveArcAmplitude == PLAYER_BASIC_JUMP_2) {
1849 playerState->bounceDivisor *= 1.12;
1850 }
1851 playerState->unk_24 = 90.0f;
1852 playerState->unk_28 = 360 / playerState->moveTime;
1853 playerState->unk_18.x = 0.0f;
1854 playerState->unk_18.y = 0.0f;
1855 accel = playerState->acceleration;
1856 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * accel);
1857 } else {
1858 playerState->bounceDivisor = 47.0 + (playerState->dist - 20.0) / 6.0;
1859 if (playerState->moveArcAmplitude == PLAYER_BASIC_JUMP_4) {
1860 playerState->bounceDivisor *= 1.25;
1861 }
1862 playerState->unk_24 = 90.0f;
1863 playerState->unk_28 = 360 / playerState->moveTime;
1864 playerState->unk_18.x = 0.0f;
1865 playerState->unk_18.y = 0.0f;
1866 accel = playerState->acceleration;
1867 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.8 * accel);
1868 }
1869 set_actor_anim(0, 0, playerState->animJumpRise);
1871 script->functionTemp[0] = BASIC_STATE_01;
1872 }
1873
1874 switch (script->functionTemp[0]) {
1875 case BASIC_STATE_01:
1876 if (playerState->vel > PI_S / 2) {
1877 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
1878 }
1879 playerState->curPos.x += playerState->velStep.x;
1880 playerState->curPos.y += playerState->velStep.y;
1881 playerState->curPos.z += playerState->velStep.z;
1882 playerState->unk_18.x = player->curPos.y;
1883 player->curPos.x = playerState->curPos.x;
1884 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
1885 player->curPos.z = playerState->curPos.z;
1886 if (playerState->goalPos.y > player->curPos.y && playerState->moveTime < 3) {
1887 player->curPos.y = playerState->goalPos.y;
1888 }
1889 playerState->unk_18.y = player->curPos.y;
1890 if (playerState->moveArcAmplitude < PLAYER_BASIC_JUMP_3) {
1891 accel = playerState->acceleration;
1892 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * accel);
1893 } else {
1894 accel = playerState->acceleration;
1895 playerState->vel += accel + (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.8 * accel);
1896 }
1897 playerState->unk_24 += playerState->unk_28;
1898 playerState->unk_24 = clamp_angle(playerState->unk_24);
1899 playerState->moveTime--;
1900 if (playerState->moveTime == 0) {
1901 player->curPos.y = playerState->goalPos.y;
1902 playerState->acceleration = 1.8f;
1903 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
1904 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
1905 return ApiStatus_DONE1;
1906 }
1907 break;
1908 case BASIC_STATE_02:
1909 if (battleStatus->actionCommandMode == AC_MODE_NOT_LEARNED) {
1910 return ApiStatus_DONE2;
1911 }
1912 playerState->moveTime = 1;
1913 playerState->acceleration = 1.8f;
1914 playerState->unk_24 = 90.0f;
1915 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
1916 playerState->bounceDivisor = fabsf(playerState->unk_18.x - playerState->unk_18.y) / 16.5;
1917 playerState->unk_28 = 360 / playerState->moveTime;
1918 playerState->curPos.x = player->curPos.x;
1919 playerState->curPos.y = player->curPos.y;
1920 playerState->curPos.z = player->curPos.z;
1921 script->functionTemp[0] = BASIC_STATE_03;
1922 // fallthrough
1923 case BASIC_STATE_03:
1924 playerState->curPos.x += (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24))) / 33.0;
1925 playerState->curPos.y -= (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24)));
1926 playerState->unk_24 += playerState->unk_28;
1927 playerState->unk_24 = clamp_angle(playerState->unk_24);
1928 player->curPos.x = playerState->curPos.x;
1929 player->curPos.y = playerState->curPos.y;
1930 player->curPos.z = playerState->curPos.z;
1932 return ApiStatus_DONE2;
1933 }
1934 playerState->moveTime--;
1935 if (playerState->moveTime == 0) {
1936 return ApiStatus_DONE1;
1937 }
1938 break;
1939 }
1940
1941 return ApiStatus_BLOCK;
1942}
1943
1944API_CALLABLE(PlayerSuperJumpToGoal) {
1945 Bytecode* args = script->ptrReadPos;
1947 ActorState* playerState = &player->state;
1948 f32 posX, posY, posZ;
1949 f32 goalX, goalZ;
1950 f32 temp;
1951 f64 temp_f20;
1952 f64 vel1, vel2;
1953 f64 vel3, vel4;
1954 f64 vel5, vel6;
1955 f64 vel7, vel8;
1956 f64 acc1, acc2;
1957 f64 acc3, acc4;
1958 f64 acc5, acc6;
1959 f64 acc7, acc8;
1960
1961 enum {
1962 SUPER_STATE_00 = 0,
1963 SUPER_STATE_01 = 1,
1964 SUPER_STATE_02 = 2,
1965 SUPER_STATE_10 = 10,
1966 SUPER_STATE_11 = 11,
1967 SUPER_STATE_20 = 20,
1968 SUPER_STATE_21 = 21,
1969 };
1970
1971 if (isInitialCall) {
1972 player->state.moveTime = evt_get_variable(script, *args++);
1973 player->state.moveArcAmplitude = evt_get_variable(script, *args++);
1974
1975 switch(player->state.moveArcAmplitude) {
1976 default:
1977 script->functionTemp[0] = SUPER_STATE_00;
1978 break;
1982 script->functionTemp[0] = SUPER_STATE_10;
1983 break;
1985 script->functionTemp[0] = SUPER_STATE_20;
1986 break;
1987 }
1988 }
1989
1990 switch (script->functionTemp[0]) {
1991 case SUPER_STATE_00:
1992 playerState->curPos.x = player->curPos.x;
1993 playerState->curPos.y = player->curPos.y;
1994 playerState->curPos.z = player->curPos.z;
1995 goalX = playerState->goalPos.x;
1996 goalZ = playerState->goalPos.z;
1997 posX = playerState->curPos.x;
1998 posY = playerState->curPos.y;
1999 posZ = playerState->curPos.z;
2000 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2001 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2002
2003 if (playerState->moveTime == 0) {
2004 playerState->moveTime = playerState->dist / playerState->speed;
2005 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2006 } else {
2007 playerState->speed = playerState->dist / playerState->moveTime;
2008 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2009 }
2010
2011 if (playerState->moveTime == 0) {
2012 return ApiStatus_DONE2;
2013 }
2014
2015 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2016 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2017 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2018 playerState->acceleration = (PI_S / 2) / playerState->moveTime;
2019 playerState->vel = 0.0f;
2020 playerState->speed += temp / playerState->moveTime;
2021 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpRise);
2023 playerState->unk_24 = 90.0f;
2024 playerState->bounceDivisor = 45.0f;
2025 playerState->unk_28 = 360 / playerState->moveTime;
2026 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_4) {
2027 playerState->bounceDivisor = 56.25f;
2028 }
2029 playerState->unk_18.x = 0.0f;
2030 playerState->unk_18.y = 0.0f;
2031 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_0) {
2032 vel1 = playerState->vel;
2033 acc1 = playerState->acceleration;
2034 playerState->vel = (vel1 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc1) + acc1));
2035 } else {
2036 vel2 = playerState->vel;
2037 acc2 = playerState->acceleration;
2038 playerState->vel = (vel2 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc2) + acc2));
2039 }
2040 script->functionTemp[0] = SUPER_STATE_01;
2041 break;
2042 case SUPER_STATE_10:
2043 playerState->curPos.x = player->curPos.x;
2044 playerState->curPos.y = player->curPos.y;
2045 playerState->curPos.z = player->curPos.z;
2046 goalX = playerState->goalPos.x;
2047 goalZ = playerState->goalPos.z;
2048 posX = playerState->curPos.x;
2049 posY = playerState->curPos.y;
2050 posZ = playerState->curPos.z;
2051 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2052 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2053 if (playerState->moveTime == 0) {
2054 playerState->moveTime = playerState->dist / playerState->speed;
2055 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2056 } else {
2057 playerState->speed = playerState->dist / playerState->moveTime;
2058 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2059 }
2060
2061 if (playerState->moveTime == 0) {
2062 return ApiStatus_DONE2;
2063 }
2064 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2065 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2066 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2067 playerState->vel = (PI_S / 2);
2068 playerState->acceleration = (PI_S / 4) / (playerState->moveTime + 1);
2069 playerState->speed += temp / playerState->moveTime;
2070 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2071 playerState->unk_24 = 90.0f;
2072 playerState->bounceDivisor = 45.0f;
2073 playerState->unk_28 = (360 / playerState->moveTime);
2074 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_5) {
2075 playerState->bounceDivisor = 56.25f;
2076 }
2077 playerState->unk_18.x = 0.0f;
2078 playerState->unk_18.y = 0.0f;
2079 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_1) {
2080 vel3 = playerState->vel;
2081 acc3 = playerState->acceleration;
2082 playerState->vel = (vel3 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc3) + acc3));
2083 } else {
2084 vel4 = playerState->vel;
2085 acc4 = playerState->acceleration;
2086 playerState->vel = (vel4 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc4) + acc4));
2087 }
2088 playerState->curPos.y = player->curPos.y - playerState->bounceDivisor;
2089 script->functionTemp[0] = SUPER_STATE_11;
2090 break;
2091 case SUPER_STATE_20:
2092 playerState->moveTime = 1;
2093 playerState->unk_24 = 90.0f;
2094 playerState->bounceDivisor = (fabsf(playerState->unk_18.x - playerState->unk_18.y) / 16.5);
2095 playerState->unk_28 = (360 / playerState->moveTime);
2096 playerState->curPos.x = player->curPos.x;
2097 playerState->curPos.y = player->curPos.y;
2098 playerState->curPos.z = player->curPos.z;
2099 script->functionTemp[0] = SUPER_STATE_21;
2100 break;
2101 }
2102
2103 switch (script->functionTemp[0]) {
2104 case SUPER_STATE_01:
2105 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_0) {
2106 vel5 = playerState->vel;
2107 acc5 = playerState->acceleration;
2108 playerState->vel = (vel5 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc5) + acc5));
2109 } else {
2110 vel6 = playerState->vel;
2111 acc6 = playerState->acceleration;
2112 playerState->vel = (vel6 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc6) + acc6));
2113 }
2114 playerState->curPos.x += playerState->velStep.x;
2115 playerState->curPos.y += playerState->velStep.y;
2116 playerState->curPos.z += playerState->velStep.z;
2117 playerState->unk_18.x = player->curPos.y;
2118 player->curPos.x = playerState->curPos.x;
2119 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(sin_rad(sin_rad(playerState->vel) * (PI_S / 2)) * (PI_S / 2)));
2120 player->curPos.z = playerState->curPos.z;
2121 playerState->unk_18.y = player->curPos.y;
2122 playerState->unk_24 += playerState->unk_28;
2123 playerState->unk_24 = clamp_angle(playerState->unk_24);
2124 playerState->moveTime--;
2125 if (playerState->moveTime == 0) {
2127 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2128 player->rotPivotOffset.y = 14;
2129 player->rot.z -= 66.0f;
2130 playerState->moveTime = 7;
2131 script->functionTemp[0] = SUPER_STATE_02;
2132 }
2133 break;
2134 case SUPER_STATE_02:
2135 player->rotPivotOffset.y = 14;
2136 player->rot.z -= 66.0f;
2137 playerState->moveTime--;
2138 if (playerState->moveTime == 0) {
2139 player->rot.z = 0.0f;
2140 player->rotPivotOffset.y = 0;
2141 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2142 return ApiStatus_DONE1;
2143 }
2144 break;
2145 case SUPER_STATE_11:
2146 playerState->curPos.x += playerState->velStep.x;
2147 playerState->curPos.y += playerState->velStep.y;
2148 playerState->curPos.z += playerState->velStep.z;
2149 playerState->unk_18.x = player->curPos.y;
2150 player->curPos.x = playerState->curPos.x;
2151 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2152 player->curPos.z = playerState->curPos.z;
2153 if (playerState->goalPos.y > player->curPos.y) {
2154 player->curPos.y = playerState->goalPos.y;
2155 }
2156 playerState->unk_18.y = player->curPos.y;
2157
2158 if (playerState->moveArcAmplitude == PLAYER_SUPER_JUMP_1) {
2159 vel7 = playerState->vel;
2160 acc7 = playerState->acceleration;
2161 playerState->vel = (vel7 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * acc7) + acc7));
2162 } else {
2163 vel8 = playerState->vel;
2164 acc8 = playerState->acceleration;
2165 playerState->vel = (vel8 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.01 * acc8) + acc8));
2166 }
2167
2168 playerState->unk_24 += playerState->unk_28;
2169 playerState->unk_24 = clamp_angle(playerState->unk_24);
2170 playerState->moveTime--;
2171 if (playerState->moveTime == 0) {
2172 player->curPos.y = playerState->goalPos.y;
2174 return ApiStatus_DONE1;
2175 }
2176 break;
2177 case SUPER_STATE_21:
2178 temp_f20 = playerState->curPos.x;
2179 temp_f20 += (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24))) / 33.0;
2180 playerState->curPos.x = temp_f20;
2181 playerState->curPos.y -= playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24));
2182 playerState->unk_24 += playerState->unk_28;
2183 playerState->unk_24 = clamp_angle(playerState->unk_24);
2184 player->curPos.x = playerState->curPos.x;
2185 player->curPos.y = playerState->curPos.y;
2186 player->curPos.z = playerState->curPos.z;
2188 return ApiStatus_DONE2;
2189 }
2190 playerState->moveTime--;
2191 if (playerState->moveTime == 0) {
2192 return ApiStatus_DONE1;
2193 }
2194 break;
2195 }
2196
2197 return ApiStatus_BLOCK;
2198}
2199
2200API_CALLABLE(PlayerUltraJumpToGoal) {
2201 Bytecode* args = script->ptrReadPos;
2203 ActorState* playerState = &player->state;
2204 f32 posX, posY, posZ;
2205 f32 goalX, goalZ;
2206 f32 speed;
2207 f32 temp;
2208
2209 f64 temp_f20;
2214
2215 f64 temp_f22;
2220
2221 enum {
2222 ULTRA_STATE_00 = 0,
2223 ULTRA_STATE_01 = 1,
2224 ULTRA_STATE_10 = 10,
2225 ULTRA_STATE_11 = 11,
2226 ULTRA_STATE_20 = 20,
2227 ULTRA_STATE_21 = 21,
2228 ULTRA_STATE_30 = 30,
2229 ULTRA_STATE_31 = 31,
2230 };
2231
2232 if (isInitialCall) {
2233 player->state.moveTime = evt_get_variable(script, *args++);
2234 player->state.moveArcAmplitude = evt_get_variable(script, *args++);
2235
2236 switch(player->state.moveArcAmplitude) {
2237 default:
2239 script->functionTemp[0] = ULTRA_STATE_00;
2240 break;
2242 script->functionTemp[0] = ULTRA_STATE_11;
2243 break;
2245 script->functionTemp[0] = ULTRA_STATE_30;
2246 break;
2248 script->functionTemp[0] = ULTRA_STATE_20;
2249 break;
2251 script->functionTemp[0] = ULTRA_STATE_30;
2252 break;
2253 }
2254
2255 script->functionTemp[1] = 0;
2256 }
2257
2258 switch (script->functionTemp[0]) {
2259 case ULTRA_STATE_00:
2260 playerState->curPos.x = player->curPos.x;
2261 playerState->curPos.y = player->curPos.y;
2262 playerState->curPos.z = player->curPos.z;
2263 goalX = playerState->goalPos.x;
2264 goalZ = playerState->goalPos.z;
2265 posX = playerState->curPos.x;
2266 posY = playerState->curPos.y;
2267 posZ = playerState->curPos.z;
2268 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2269 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2270 if (playerState->moveTime == 0) {
2271 playerState->moveTime = playerState->dist / playerState->speed;
2272 } else {
2273 playerState->speed = playerState->dist / playerState->moveTime;
2274 }
2275 playerState->acceleration = PI_S / playerState->moveTime;
2276 playerState->vel = 0.0f;
2277 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2278 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2279 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2280 playerState->speed = playerState->dist / playerState->moveTime;
2281 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2284 playerState->unk_18.x = 0.0f;
2285 playerState->unk_18.y = 0.0f;
2286 playerState->unk_24 = 90.0f;
2287
2288 temp = playerState->dist;
2289 temp -= 20.0;
2290 temp /= 6.0;
2291 temp += 47.0;
2292 playerState->bounceDivisor = temp;
2293
2294 temp_f20 = playerState->vel;
2295 temp_f22 = playerState->acceleration;
2296 playerState->unk_28 = 360 / playerState->moveTime;
2297 playerState->vel = temp_f20 + (((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53) * temp_f22) + temp_f22);
2298 script->functionTemp[0] = ULTRA_STATE_01;
2299 break;
2300 case ULTRA_STATE_10:
2301 playerState->curPos.x = player->curPos.x;
2302 playerState->curPos.y = player->curPos.y;
2303 playerState->curPos.z = player->curPos.z;
2304 goalX = playerState->goalPos.x;
2305 goalZ = playerState->goalPos.z;
2306 posX = playerState->curPos.x;
2307 posY = playerState->curPos.y;
2308 posZ = playerState->curPos.z;
2309 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2310 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2311 if (playerState->moveTime == 0) {
2312 playerState->moveTime = playerState->dist / playerState->speed;
2313 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2314 } else {
2315 speed = playerState->dist / playerState->moveTime;
2316 playerState->speed = speed;
2317 temp = playerState->dist - (playerState->moveTime * speed);
2318 }
2319 playerState->acceleration = PI_S / playerState->moveTime;
2320 playerState->vel = 0.0f;
2321 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2322 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2323 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2324 playerState->speed += temp / playerState->moveTime;
2325 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpRise);
2328 playerState->unk_18.x = 0.0f;
2329 playerState->unk_18.y = 0.0f;
2330 playerState->unk_24 = 90.0f;
2331 temp_f20_2 = playerState->vel;
2332 temp_f22_2 = playerState->acceleration;
2333
2334 temp = playerState->dist;
2335 temp -= 20.0;
2336 temp /= 6.0;
2337 temp += 47.0;
2338 playerState->bounceDivisor = temp;
2339
2340 playerState->unk_28 = 360 / playerState->moveTime;
2341 playerState->vel = temp_f20_2 + (((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53) * temp_f22_2) + temp_f22_2);
2342 script->functionTemp[0] = ULTRA_STATE_11;
2343 break;
2344 case ULTRA_STATE_20:
2345 playerState->moveTime = 1;
2347 player->rot.y = 0.0f;
2348 playerState->unk_24 = 90.0f;
2349 playerState->bounceDivisor = fabsf(playerState->unk_18.x - playerState->unk_18.y) / 16.5;
2350 playerState->unk_28 = 360 / playerState->moveTime;
2351 playerState->curPos.x = player->curPos.x;
2352 playerState->curPos.y = player->curPos.y;
2353 playerState->curPos.z = player->curPos.z;
2354 script->functionTemp[0] = ULTRA_STATE_21;
2355 break;
2356 case ULTRA_STATE_30:
2357 playerState->curPos.x = player->curPos.x;
2358 playerState->curPos.y = player->curPos.y;
2359 playerState->curPos.z = player->curPos.z;
2360 goalX = playerState->goalPos.x;
2361 goalZ = playerState->goalPos.z;
2362 posX = playerState->curPos.x;
2363 posY = playerState->curPos.y;
2364 posZ = playerState->curPos.z;
2365 playerState->angle = atan2(posX, posZ, goalX, goalZ);
2366 playerState->dist = dist2D(posX, posZ, goalX, goalZ);
2367 if (playerState->moveTime == 0) {
2368 playerState->moveTime = playerState->dist / playerState->speed;
2369 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2370 } else {
2371 playerState->speed = playerState->dist / playerState->moveTime;
2372 temp = playerState->dist - (playerState->moveTime * playerState->speed);
2373 }
2374 playerState->acceleration = PI_S / (playerState->moveTime + 1);
2375 playerState->vel = 0.0f;
2376 playerState->velStep.x = (playerState->goalPos.x - playerState->curPos.x) / playerState->moveTime;
2377 playerState->velStep.y = (playerState->goalPos.y - playerState->curPos.y) / playerState->moveTime;
2378 playerState->velStep.z = (playerState->goalPos.z - playerState->curPos.z) / playerState->moveTime;
2379 playerState->speed += temp / playerState->moveTime;
2380 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpRise);
2382 playerState->unk_24 = 90.0f;
2383 playerState->unk_28 = 360 / playerState->moveTime;
2384 if (playerState->moveArcAmplitude == PLAYER_ULTRA_JUMP_4) {
2385 playerState->bounceDivisor = 56.25f;
2386 } else {
2387 playerState->bounceDivisor = 45.0f;
2388 }
2389 playerState->unk_18.x = 0.0f;
2390 playerState->unk_18.y = 0.0f;
2391 temp_f22_3 = playerState->acceleration;
2392 playerState->vel += ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f22_3) + temp_f22_3);
2393 script->functionTemp[0] = ULTRA_STATE_31;
2394 break;
2395 }
2396
2397 switch (script->functionTemp[0]) {
2398 case ULTRA_STATE_01:
2399 temp_f22_4 = playerState->vel;
2400 temp_f20_4 = playerState->acceleration;
2401 playerState->vel = temp_f22_4 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f20_4) + temp_f20_4);
2402 playerState->curPos.x += playerState->velStep.x;
2403 playerState->curPos.y += playerState->velStep.y;
2404 playerState->curPos.z += playerState->velStep.z;
2405 playerState->unk_18.x = player->curPos.y;
2406 player->curPos.x = playerState->curPos.x;
2407 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2408 player->curPos.z = playerState->curPos.z;
2409 playerState->unk_18.y = player->curPos.y;
2410 playerState->unk_24 += playerState->unk_28;
2411 playerState->unk_24 = clamp_angle(playerState->unk_24);
2412 player->rot.y += 133.0f;
2413 player->rot.y = clamp_angle(player->rot.y);
2415 return ApiStatus_DONE2;
2416 }
2417 playerState->moveTime--;
2418 if (playerState->moveTime == 4) {
2419 return ApiStatus_DONE1;
2420 }
2421 break;
2422 case ULTRA_STATE_11:
2423 temp_f22_6 = playerState->vel;
2424 temp_f20_7 = playerState->acceleration;
2425 playerState->vel = temp_f22_6 + ((sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f20_7) + temp_f20_7);
2426 playerState->curPos.x += playerState->velStep.x;
2427 playerState->curPos.y += playerState->velStep.y;
2428 playerState->curPos.z += playerState->velStep.z;
2429 playerState->unk_18.x = player->curPos.y;
2430 player->curPos.x = playerState->curPos.x;
2431 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2432 player->curPos.z = playerState->curPos.z;
2433 if (playerState->goalPos.y > player->curPos.y && playerState->moveTime < 3) {
2434 player->curPos.y = playerState->goalPos.y;
2435 }
2436 playerState->unk_18.y = player->curPos.y;
2437 playerState->unk_24 += playerState->unk_28;
2438 playerState->unk_24 = clamp_angle(playerState->unk_24);
2439 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2440 player->rot.y += 133.0f;
2441 player->rot.y = clamp_angle(player->rot.y);
2442 playerState->moveTime--;
2443 if (playerState->moveTime == 0) {
2444 playerState->acceleration = 1.8f;
2445 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
2446 player->curPos.y = playerState->goalPos.y;
2447 player->rot.y = 0.0f;
2448 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2449 play_movement_dust_effects(2, player->curPos.x, player->curPos.y, player->curPos.z, player->yaw);
2450 return ApiStatus_DONE1;
2451 }
2452 break;
2453 case ULTRA_STATE_21:
2454 playerState->curPos.x += (playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24))) / 33.0;
2455 playerState->curPos.y -= playerState->bounceDivisor * sin_rad(DEG_TO_RAD(playerState->unk_24));
2456 playerState->unk_24 += playerState->unk_28;
2457 playerState->unk_24 = clamp_angle(playerState->unk_24);
2458 player->curPos.x = playerState->curPos.x;
2459 player->curPos.y = playerState->curPos.y;
2460 player->curPos.z = playerState->curPos.z;
2462 return ApiStatus_DONE2;
2463 }
2464 playerState->moveTime--;
2465 if (playerState->moveTime == 0) {
2466 return ApiStatus_DONE1;
2467 }
2468 break;
2469 case ULTRA_STATE_31:
2470 temp_f20_6 = playerState->acceleration;
2471 playerState->vel += (sin_rad(DEG_TO_RAD(playerState->unk_24)) * 0.53 * temp_f20_6) + temp_f20_6;
2472 playerState->curPos.x += playerState->velStep.x;
2473 playerState->curPos.y += playerState->velStep.y;
2474 playerState->curPos.z += playerState->velStep.z;
2475 playerState->unk_18.x = player->curPos.y;
2476 player->curPos.x = playerState->curPos.x;
2477 player->curPos.y = playerState->curPos.y + (playerState->bounceDivisor * sin_rad(playerState->vel));
2478 player->curPos.z = playerState->curPos.z;
2479 if (playerState->goalPos.y > player->curPos.y && playerState->moveTime < 3) {
2480 player->curPos.y = playerState->goalPos.y;
2481 }
2482 playerState->unk_18.y = player->curPos.y;
2483 playerState->unk_24 += playerState->unk_28;
2484 playerState->unk_24 = clamp_angle(playerState->unk_24);
2485 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpFall);
2486 player->rot.y += 133.0f;
2487 player->rot.y = clamp_angle(player->rot.y);
2488 playerState->moveTime--;
2489 if (playerState->moveTime == 0) {
2490 player->curPos.y = playerState->goalPos.y;
2491 player->rot.y = 0.0f;
2492 set_actor_anim(ACTOR_PLAYER, 0, playerState->animJumpLand);
2493 playerState->acceleration = 1.8f;
2494 playerState->vel = -(playerState->unk_18.x - playerState->unk_18.y);
2495 return ApiStatus_DONE1;
2496 }
2497 break;
2498 }
2499
2500 return ApiStatus_BLOCK;
2501}
2502
2503API_CALLABLE(GetPlayerActionQuality) {
2504 Bytecode* args = script->ptrReadPos;
2505 s32 outVar = *args++;
2506 s32 actionQuality = gBattleStatus.actionQuality;
2507 s32 quality = 0;
2508
2509 if (actionQuality < 0) {
2510 actionQuality = 0;
2511 }
2512
2513 if (quality < actionQuality) {
2514 quality = actionQuality;
2515 }
2516
2518 return ApiStatus_DONE2;
2519}
2520
2521API_CALLABLE(PlayerYieldTurn) {
2523 return ApiStatus_DONE2;
2524}
2525
2526API_CALLABLE(DispatchEventPlayer) {
2528 return ApiStatus_DONE2;
2529}
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:1999
s32 does_script_exist_by_ref(Evt *script)
s32 evt_get_variable(Evt *script, Bytecode var)
Definition evt.c:1730
s32 is_ability_active(s32 arg0)
Definition inventory.c:1735
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2495
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: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 enable_player_blur(void)
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 force_disable_player_blur_immediately(void)
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
void cancel_action_rating_combo(Actor *)
Definition 190B20.c:2169
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:2025
s32 get_defense(Actor *actor, s32 *defenseTable, s32 elementFlags)
Definition 190B20.c:1949
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:713
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
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:145
#define PI_S
Definition macros.h:140
#define STATUS_KEY_NEVER
Definition macros.h:234
#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