Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
dmg_player.c File Reference

Go to the source code of this file.

Macros

#define INFLICT_STATUS(STATUS_TYPE)
 

Functions

b32 dispatch_damage_event_player (s32 damageAmount, s32 event, b32 noHitSound)
 
b32 dispatch_hazard_event_player (s32 damageAmount, s32 event)
 
void dispatch_event_player (s32 eventType)
 
void dispatch_event_player_continue_turn (s32 eventType)
 
HitResult calc_player_test_enemy (void)
 
HitResult calc_player_damage_enemy (void)
 
b32 dispatch_damage_tick_event_player (s32 damageAmount, s32 event)
 

Variables

EvtScript EVS_PlaySleepHitFX
 
EvtScript EVS_PlayDizzyHitFX
 
EvtScript EVS_PlayParalyzeHitFX
 
EvtScript EVS_PlayPoisonHitFX
 
EvtScript EVS_PlayStopHitFX
 
EvtScript EVS_PlayFreezeHitFX
 
EvtScript EVS_PlayShrinkHitFX
 

Macro Definition Documentation

◆ INFLICT_STATUS

#define INFLICT_STATUS ( STATUS_TYPE)
Value:
if ((battleStatus->curAttackStatus & STATUS_FLAG_##STATUS_TYPE) && \
wasStatusInflicted = TRUE; \
} \
BSS s32 PopupMenu_SelectedIndex
s32 try_inflict_status(Actor *, s32, s32)
Definition 190B20.c:2264

Function Documentation

◆ dispatch_damage_event_player()

b32 dispatch_damage_event_player ( s32 damageAmount,
s32 event,
b32 noHitSound )

Definition at line 1055 of file dmg_player.c.

1055 {
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}
ActorState state
s16 damageCounter
s16 hpChangeCounter
s8 flags
Definition demo_api.c:15
void dispatch_event_player(s32 eventType)
Definition dmg_player.c:131
#define sfx_play_sound_at_position
@ BS_FLAGS1_SUPER_HIT
Definition enums.h:3612
@ BS_FLAGS1_NICE_HIT
Definition enums.h:3609
@ SOUND_HIT_NORMAL
Definition enums.h:727
@ ACTOR_PLAYER
Definition enums.h:2118
@ SOUND_SPACE_DEFAULT
Definition enums.h:1740
@ EVENT_HIT
Definition enums.h:2165
@ EVENT_SPIKE_DEATH
Definition enums.h:2193
@ EVENT_SPIKE_CONTACT
Definition enums.h:2196
@ EVENT_IMMUNE
Definition enums.h:2179
@ EVENT_BURN_DEATH
Definition enums.h:2190
@ EVENT_ZERO_DAMAGE
Definition enums.h:2177
@ EVENT_SHOCK_DEATH
Definition enums.h:2192
@ EVENT_HIT_COMBO
Definition enums.h:2164
@ EVENT_DEATH
Definition enums.h:2186
@ EVENT_SHOCK_HIT
Definition enums.h:2198
@ EVENT_BURN_CONTACT
Definition enums.h:2197
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 show_next_damage_popup(f32 x, f32 y, f32 z, s32 damageAmount, s32 angle)
Definition 190B20.c:2027
void set_goal_pos_to_part(ActorState *state, s32 actorID, s32 partID)
Definition actor_api.c:44
PlayerData gPlayerData
Definition 77480.c:39
BattleStatus gBattleStatus
Definition battle.cpp:14

Referenced by dispatch_damage_tick_event_player(), and dispatch_hazard_event_player().

◆ dispatch_hazard_event_player()

b32 dispatch_hazard_event_player ( s32 damageAmount,
s32 event )

Definition at line 1136 of file dmg_player.c.

1136 {
1138}
b32 dispatch_damage_event_player(s32 damageAmount, s32 event, b32 noHitSound)

Referenced by calc_player_damage_enemy(), and calc_player_test_enemy().

◆ dispatch_event_player()

void dispatch_event_player ( s32 eventType)

Definition at line 131 of file dmg_player.c.

131 {
136
137 player->lastEventType = eventType;
138
141
144 player->handleEventScriptID = eventScript->id;
145 eventScript->owner1.actor = NULL;
146
147 if (player->takeTurnScript != NULL) {
149 player->takeTurnScript = NULL;
150 }
151
152 if (oldOnHitScript != NULL) {
154 }
155}
struct Evt * takeTurnScript
struct Evt * handleEventScript
s32 takeTurnScriptID
s32 handleEventScriptID
@ EVT_PRIORITY_A
Definition evt.h:154
@ EVT_FLAG_RUN_IMMEDIATELY
don't wait for next update_scripts call
Definition evt.h:162
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
void kill_script_by_ID(s32 id)
EvtScript EVS_Player_HandleEvent
struct Actor * playerActor

Referenced by btl_state_update_end_training_battle(), btl_state_update_victory(), calc_enemy_damage_target(), dispatch_damage_event_player(), dispatch_event_general(), and update_status_damage().

◆ dispatch_event_player_continue_turn()

void dispatch_event_player_continue_turn ( s32 eventType)

Definition at line 157 of file dmg_player.c.

◆ calc_player_test_enemy()

HitResult calc_player_test_enemy ( void )

Definition at line 179 of file dmg_player.c.

179 {
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}
b32 dispatch_hazard_event_player(s32 damageAmount, s32 event)
#define ASSERT(condition)
@ ACTOR_EVENT_FLAG_SPIKY_FRONT
Player takes spike damage from hammer attacks.
Definition enums.h:3418
@ ACTOR_EVENT_FLAG_BURIED
Actor can only by hit by quake-element attacks.
Definition enums.h:3413
@ 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
@ STATUS_KEY_TRANSPARENT
Definition enums.h:2815
@ STATUS_KEY_STATIC
Definition enums.h:2812
@ STATUS_KEY_STONE
Definition enums.h:2813
@ 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_HIT
Definition enums.h:1976
@ HIT_RESULT_IMMUNE
Definition enums.h:1984
@ HIT_RESULT_MISS
Definition enums.h:1982
@ SUPPRESS_EVENT_SPIKY_FRONT
Definition enums.h:2936
@ ABILITY_SPIKE_SHIELD
Definition enums.h:438
@ SOUND_IMMUNE
Definition enums.h:748
@ SOUND_HIT_SPIKE
Definition enums.h:746
@ EVENT_SPIKE_TAUNT
Definition enums.h:2181
@ DAMAGE_TYPE_QUAKE
Definition enums.h:2896
@ DAMAGE_TYPE_JUMP
Definition enums.h:2892
@ DAMAGE_TYPE_NO_CONTACT
Definition enums.h:2912
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2497
void dispatch_event_actor(Actor *, s32)
Definition 1A5830.c:102
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:923
Actor * get_actor(s32 actorID)
Definition actor_api.c:155

◆ calc_player_damage_enemy()

HitResult calc_player_damage_enemy ( void )

Definition at line 240 of file dmg_player.c.

240 {
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}
s32 actorTypeData1[6]
EvtScript EVS_PlayStopHitFX
Definition dmg_player.c:109
#define INFLICT_STATUS(STATUS_TYPE)
EvtScript EVS_PlayFreezeHitFX
Definition dmg_player.c:115
EvtScript EVS_PlayShrinkHitFX
Definition dmg_player.c:125
EvtScript EVS_PlayParalyzeHitFX
Definition dmg_player.c:97
EvtScript EVS_PlayPoisonHitFX
Definition dmg_player.c:103
EvtScript EVS_PlaySleepHitFX
Definition dmg_player.c:85
EvtScript EVS_PlayDizzyHitFX
Definition dmg_player.c:91
#define rand_int
@ 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
@ 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_TRIGGER_EVENTS
Definition enums.h:3608
@ BS_FLAGS1_INCLUDE_POWER_UPS
Definition enums.h:3604
@ 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_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_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_ENCHANTED
Actor glows and listens for the Star Beam event.
Definition enums.h:3419
@ ACTOR_PART_TARGET_NO_DAMAGE
Definition enums.h:1903
@ 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_SLEEP
Definition enums.h:2807
@ STATUS_KEY_UNUSED
Definition enums.h:2804
@ STATUS_KEY_STOP
Definition enums.h:2809
@ STATUS_KEY_SHRINK
Definition enums.h:2811
@ STATUS_KEY_DIZZY
Definition enums.h:2805
@ HIT_RESULT_NO_DAMAGE
Definition enums.h:1978
@ HIT_RESULT_NICE_NO_DAMAGE
Definition enums.h:1979
@ HIT_RESULT_NICE
Definition enums.h:1977
@ SUPPRESS_EVENT_ALT_SPIKY
Definition enums.h:2939
@ SUPPRESS_EVENT_SHOCK_CONTACT
Definition enums.h:2937
@ 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
@ 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_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_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_PLAYER_SHOCK
Definition enums.h:1197
@ SOUND_SLIDE_WHISTLE_OUT
Definition enums.h:718
@ SOUND_HIT_PLAYER_FIRE
Definition enums.h:723
@ 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_YOSHI
Definition enums.h:1414
@ SOUND_INFLICT_SLEEP
Definition enums.h:1357
@ ACTOR_FLAG_NO_DMG_POPUP
Hide damage popup.
Definition enums.h:3375
@ ACTOR_FLAG_FLIPPED
Actor has been flipped over.
Definition enums.h:3364
@ EVENT_SCARE_AWAY
Definition enums.h:2207
@ EVENT_BURN_HIT
Definition enums.h:2169
@ EVENT_POWER_BOUNCE_DEATH
Definition enums.h:2194
@ EVENT_FALL_TRIGGER
Definition enums.h:2167
@ EVENT_SPIN_SMASH_HIT
Definition enums.h:2166
@ EVENT_EXPLODE_TRIGGER
Definition enums.h:2188
@ EVENT_SPIN_SMASH_DEATH
Definition enums.h:2187
@ EVENT_SHELL_CRACK_HIT
Definition enums.h:2172
@ EVENT_POWER_BOUNCE_HIT
Definition enums.h:2175
@ EVENT_FLIP_TRIGGER
Definition enums.h:2168
@ 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_FEAR
Definition enums.h:2897
@ DAMAGE_TYPE_MULTIPLE_POPUPS
Definition enums.h:2913
@ DAMAGE_TYPE_WATER
Definition enums.h:2887
void show_primary_damage_popup(f32 x, f32 y, f32 z, s32 attack, s32 a)
Definition 190B20.c:2001
s32 is_ability_active(s32 arg0)
Definition inventory.c:1735
void show_immune_bonk(f32 x, f32 y, f32 z, s32, s32, s32)
s32 count_power_plus(s32)
Definition 190B20.c:671
void show_actor_health_bar(Actor *)
Definition 190B20.c:2237
void clear_part_pal_adjustment(ActorPart *)
Definition 190B20.c:2350
void cancel_action_rating_combo(Actor *)
Definition 190B20.c:2171
s32 get_defense(Actor *actor, s32 *defenseTable, s32 elementFlags)
Definition 190B20.c:1951
void apply_shock_effect(Actor *)
void show_action_rating(s32, Actor *, f32, f32, f32)
Definition 190B20.c:2092
void sfx_play_sound(s32 soundID)

◆ dispatch_damage_tick_event_player()

b32 dispatch_damage_tick_event_player ( s32 damageAmount,
s32 event )

Definition at line 1127 of file dmg_player.c.

1127 {
1129
1131 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
1133}
@ ELEMENT_END
Definition enums.h:2147
@ DMG_SRC_DEFAULT
Definition enums.h:2014

Referenced by update_status_damage().

Variable Documentation

◆ EVS_PlaySleepHitFX

EvtScript EVS_PlaySleepHitFX
Initial value:
= {
}
#define End
Signals the end of EVT script data. A script missing this will likely crash on load.
Definition macros.h:214
#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

Definition at line 85 of file dmg_player.c.

85 {
87 Return
88 End
89};

Referenced by calc_enemy_damage_target(), calc_item_damage_enemy(), calc_partner_damage_enemy(), and calc_player_damage_enemy().

◆ EVS_PlayDizzyHitFX

EvtScript EVS_PlayDizzyHitFX

◆ EVS_PlayParalyzeHitFX

EvtScript EVS_PlayParalyzeHitFX

◆ EVS_PlayPoisonHitFX

EvtScript EVS_PlayPoisonHitFX

◆ EVS_PlayStopHitFX

EvtScript EVS_PlayStopHitFX

◆ EVS_PlayFreezeHitFX

EvtScript EVS_PlayFreezeHitFX
Initial value:
= {
Wait(8)
Wait(15)
}
#define Wait(NUM_FRAMES)
Blocks for the given number of frames.
Definition macros.h:255

Definition at line 115 of file dmg_player.c.

Referenced by calc_enemy_damage_target(), calc_item_damage_enemy(), calc_partner_damage_enemy(), and calc_player_damage_enemy().

◆ EVS_PlayShrinkHitFX

EvtScript EVS_PlayShrinkHitFX