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

Go to the source code of this file.

Functions

s32 has_enchanted_part (Actor *actor)
 
void dispatch_event_general (Actor *actor, s32 event)
 
void play_hit_sound (Actor *actor, f32 x, f32 y, f32 z, u32 hitSound)
 
void dispatch_event_actor (Actor *actor, s32 event)
 
HitResult calc_enemy_test_target (Actor *actor)
 
HitResult calc_enemy_damage_target (Actor *attacker)
 
s32 dispatch_damage_event_actor (Actor *actor, s32 damageAmount, s32 originalEvent, s32 stopMotion)
 
s32 dispatch_damage_event_actor_0 (Actor *actor, s32 damageAmount, s32 event)
 
s32 dispatch_damage_event_actor_1 (Actor *actor, s32 damageAmount, s32 event)
 
f32 update_lerp_battle (s32 easing, f32 start, f32 end, s32 elapsed, s32 duration)
 

Variables

s32 StarPointMultiplier []
 Star Point multiplier, indexed by actor count.
 

Function Documentation

◆ has_enchanted_part()

s32 has_enchanted_part ( Actor * actor)

Definition at line 7 of file 1A5830.c.

7 {
9 s32 ret = FALSE;
10
11 while (partIt != NULL) {
13 ret = TRUE;
14 break;
15 } else {
17 }
18 }
19
20 return ret;
21}
BSS s32 PopupMenu_SelectedIndex
struct ActorPart * partsTable
struct ActorPart * nextPart
@ ACTOR_EVENT_FLAG_STAR_ROD_ENCHANTED
Actor glows and listens for Star Beam and Peach Beam events.
Definition enums.h:3420
@ ACTOR_EVENT_FLAG_ENCHANTED
Actor glows and listens for the Star Beam event.
Definition enums.h:3419

Referenced by calc_enemy_damage_target().

◆ dispatch_event_general()

void dispatch_event_general ( Actor * actor,
s32 event )

Definition at line 23 of file 1A5830.c.

23 {
24 switch (actor->actorID & ACTOR_CLASS_MASK) {
27 break;
30 break;
33 break;
34 }
35}
void dispatch_event_actor(Actor *actor, s32 event)
Definition 1A5830.c:102
@ ACTOR_CLASS_ENEMY
Definition enums.h:2112
@ ACTOR_CLASS_PLAYER
Definition enums.h:2110
@ ACTOR_CLASS_PARTNER
Definition enums.h:2111
@ ACTOR_CLASS_MASK
Definition enums.h:2113
void dispatch_event_player(s32)
Definition dmg_player.c:131
void dispatch_event_partner(s32)
Definition dmg_partner.c:7

Referenced by calc_enemy_damage_target(), and calc_enemy_test_target().

◆ play_hit_sound()

void play_hit_sound ( Actor * actor,
f32 x,
f32 y,
f32 z,
u32 hitSound )

Definition at line 37 of file 1A5830.c.

37 {
39
40 switch (hitSound) {
41 case HIT_SOUND_MISS:
43 break;
44 case HIT_SOUND_BONES:
46 break;
48 switch (actorClass) {
51 break;
54 break;
57 break;
58 }
59 break;
60 case HIT_SOUND_FIRE:
61 switch (actorClass) {
64 break;
67 break;
70 break;
71 }
72 break;
73 case HIT_SOUND_ICE:
74 switch (actorClass) {
77 break;
80 break;
83 break;
84 }
85 break;
86 case HIT_SOUND_SHOCK:
87 switch (actorClass) {
90 break;
93 break;
96 break;
97 }
98 break;
99 }
100}
#define sfx_play_sound_at_position
@ HIT_SOUND_NORMAL
Definition enums.h:2220
@ HIT_SOUND_FIRE
Definition enums.h:2221
@ HIT_SOUND_SHOCK
Definition enums.h:2223
@ HIT_SOUND_BONES
Definition enums.h:2219
@ HIT_SOUND_ICE
Definition enums.h:2222
@ HIT_SOUND_MISS
Definition enums.h:2218
@ SOUND_IMMUNE
Definition enums.h:748
@ SOUND_HIT_PLAYER_ICE
Definition enums.h:724
@ SOUND_HIT_PLAYER_SHOCK
Definition enums.h:1197
@ SOUND_HIT_PLAYER_FIRE
Definition enums.h:723
@ SOUND_HIT_NORMAL
Definition enums.h:727
@ SOUND_HIT_SHOCK
Definition enums.h:1198
@ SOUND_HIT_ICE
Definition enums.h:729
@ SOUND_HIT_FIRE
Definition enums.h:728
@ SOUND_HIT_BONES
Definition enums.h:749
@ SOUND_HIT_PLAYER_NORMAL
Definition enums.h:722
@ SOUND_SPACE_DEFAULT
Definition enums.h:1740

Referenced by calc_enemy_damage_target().

◆ dispatch_event_actor()

void dispatch_event_actor ( Actor * actor,
s32 event )

Definition at line 102 of file 1A5830.c.

102 {
103 Evt* handleEventScript = actor->handleEventScript;
105
106 if (actor->handleEventSource != NULL) {
107 Evt* newScript;
108
109 actor->lastEventType = event;
112 actor->handleEventScriptID = newScript->id;
113 newScript->owner1.actorID = actor->actorID;
114 }
115
116 if (actor->takeTurnScript != NULL) {
119 actor->takeTurnScript = NULL;
120 }
121
122 if (handleEventScript != NULL) {
124 }
125}
struct Evt * takeTurnScript
EvtScript * handleEventSource
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 * get_script_by_index(s32 index)
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
void kill_script_by_ID(s32 id)

Referenced by btl_state_update_transfer_turn(), calc_enemy_damage_target(), calc_item_damage_enemy(), calc_partner_damage_enemy(), calc_partner_test_enemy(), calc_player_damage_enemy(), calc_player_test_enemy(), dispatch_damage_event_actor(), and dispatch_event_general().

◆ calc_enemy_test_target()

HitResult calc_enemy_test_target ( Actor * actor)

Definition at line 127 of file 1A5830.c.

127 {
131 s32 targetPartIdx = battleStatus->curTargetPart;
132 Actor* target;
133 Actor* target2;
137
138 battleStatus->curTargetID2 = battleStatus->curTargetID;
139 battleStatus->curTargetPart2 = battleStatus->curTargetPart;
140
142 if (target == NULL) {
143 return HIT_RESULT_HIT;
144 }
145
148
150 switch (actorClass) {
152 target->curHP = playerData->curHP;
153 break;
155 target->curHP = 127;
156 break;
158 break;
159 }
160
161 if (battleStatus->curAttackElement & DAMAGE_TYPE_TRIGGER_LUCKY) {
163 return HIT_RESULT_HIT;
164 }
165
167 target2 = target;
168 if (targetPart->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY || battleStatus->outtaSightActive || target2->transparentStatus == STATUS_KEY_TRANSPARENT) {
169 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_MAGIC)) {
171 }
172 }
173
174 if (hitResult == HIT_RESULT_MISS) {
175 return HIT_RESULT_MISS;
176 }
178 switch (actorClass) {
180 if (battleStatus->cloudNineTurnsLeft) {
181 if (rand_int(100) < battleStatus->cloudNineDodgeChance) {
183 break;
184 }
185 } else {
187 if (rand_int(100) < 10) {
189 break;
190 }
191 }
193 if (rand_int(100) < 30) {
195 break;
196 }
197 }
199 if (rand_int(100) < 20) {
201 break;
202 }
203 }
204 }
205 break;
207 break;
209 break;
210 }
211
212 if (hitResult == HIT_RESULT_MISS) {
213 return HIT_RESULT_MISS;
214 }
215
217 return HIT_RESULT_LUCKY;
218 }
219
220 if (target2->stoneStatus == STATUS_KEY_STONE) {
221 return HIT_RESULT_IMMUNE;
222 }
223
224 if (target2->staticStatus == STATUS_KEY_STATIC) {
226 }
227
228 return HIT_RESULT_HIT;
229}
void dispatch_event_general(Actor *actor, s32 event)
Definition 1A5830.c:23
#define rand_int
#define ASSERT(condition)
@ ACTOR_EVENT_FLAG_ILLUSORY
Player attacks pass through and miss.
Definition enums.h:3408
@ STATUS_KEY_TRANSPARENT
Definition enums.h:2815
@ STATUS_KEY_STATIC
Definition enums.h:2812
@ STATUS_KEY_STONE
Definition enums.h:2813
@ HIT_RESULT_HIT_STATIC
Definition enums.h:1983
@ HIT_RESULT_HIT
Definition enums.h:1976
@ HIT_RESULT_LUCKY
Definition enums.h:1981
@ HIT_RESULT_IMMUNE
Definition enums.h:1984
@ HIT_RESULT_MISS
Definition enums.h:1982
@ ABILITY_CLOSE_CALL
Definition enums.h:469
@ ABILITY_LUCKY_DAY
Definition enums.h:471
@ ABILITY_PRETTY_LUCKY
Definition enums.h:444
@ EVENT_LUCKY
Definition enums.h:2205
@ DAMAGE_TYPE_MAGIC
Definition enums.h:2889
@ DAMAGE_TYPE_TRIGGER_LUCKY
Definition enums.h:2915
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2497
ActorPart * get_actor_part(Actor *actor, s32 partID)
Definition 190B20.c:923
Actor * get_actor(s32 actorID)
Definition actor_api.c:155
PlayerData gPlayerData
Definition 77480.c:39
BattleStatus gBattleStatus
Definition battle.cpp:14

◆ calc_enemy_damage_target()

HitResult calc_enemy_damage_target ( Actor * attacker)

Definition at line 231 of file 1A5830.c.

231 {
233 ActorState* state = &attacker->state;
234 s32 targetID = battleStatus->curTargetID;
235 s32 targetPartIdx = battleStatus->curTargetPart;
237 Actor* target;
242 b32 isFire = FALSE;
243 b32 isWater = FALSE;
244 b32 isIce = FALSE;
248 s32 defense;
249 s32 event;
250 s32 damage;
251 Evt* script;
252
253 battleStatus->wasStatusInflicted = FALSE;
254 battleStatus->lastAttackDamage = 0;
255
256 battleStatus->attackerActorID = attacker->actorID;
257 battleStatus->curTargetID2 = targetID;
258 battleStatus->curTargetPart2 = targetPartIdx;
259
261 if (target == NULL) {
262 return HIT_RESULT_HIT;
263 }
264
267
269 target->lastDamageTaken = 0;
270
271 switch (actorClass) {
273 target->curHP = gPlayerData.curHP;
274 break;
276 target->curHP = 127;
277 break;
279 break;
280 }
281
282 // handle defender status
283
284 if (targetPart->eventFlags & ACTOR_EVENT_FLAG_ILLUSORY) {
285 return HIT_RESULT_MISS;
286 }
287
288 if (target->transparentStatus == STATUS_KEY_TRANSPARENT
289 || (targetPart->eventFlags & ACTOR_EVENT_FLAG_BURIED && !(battleStatus->curAttackElement & DAMAGE_TYPE_QUAKE))
290 ) {
291 return HIT_RESULT_MISS;
292 }
293
294 if (target->stoneStatus == STATUS_KEY_STONE) {
295 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, -1);
296 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 0);
297 play_hit_sound(attacker, state->goalPos.x, state->goalPos.y, state->goalPos.z, 0);
299 return HIT_RESULT_HIT;
300 }
301
302 // handle attack element
303
304 if (battleStatus->curAttackElement & DAMAGE_TYPE_BLAST) {
305 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
307 ) {
308 play_hit_sound(attacker, state->goalPos.x, state->goalPos.y, state->goalPos.z, 3);
310 return HIT_RESULT_BACKFIRE;
311 }
312 }
313 if ((battleStatus->curAttackElement & DAMAGE_TYPE_QUAKE) && (target->flags & ACTOR_FLAG_FLYING)) {
314 play_hit_sound(attacker, state->goalPos.x, state->goalPos.y, state->goalPos.z, 1);
316 }
317 if (battleStatus->curAttackElement & DAMAGE_TYPE_FIRE) {
318 fx_ring_blast(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f, 1.0f, 24);
319 isFire = TRUE;
320 }
321 if (battleStatus->curAttackElement & DAMAGE_TYPE_SHOCK) {
324 }
325 if (battleStatus->curAttackElement & DAMAGE_TYPE_WATER) {
326 fx_water_splash(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f, 1.0f, 24);
327 isWater = TRUE;
328 }
329 if (battleStatus->curAttackElement & DAMAGE_TYPE_ICE) {
330 fx_big_snowflakes(0, state->goalPos.x, state->goalPos.y, state->goalPos.z + 5.0f);
331 isIce = TRUE;
332 }
333
334 if (!(attacker->staticStatus == STATUS_KEY_STATIC)
335 && ((target->staticStatus == STATUS_KEY_STATIC) || (targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED))
336 && !(battleStatus->curAttackElement & (DAMAGE_TYPE_SHOCK | DAMAGE_TYPE_NO_CONTACT))
337 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)
338 && !has_enchanted_part(attacker)) // enchanted attacks ignore electrified defenders
339 {
342 }
343
344 // ------------------------------------------------------------------------
345 // damage calculation
346
348
349 // determine target defense
350
351 defense = get_defense(target, targetPart->defenseTable, battleStatus->curAttackElement);
352
353 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_IGNORE_DEFENSE)) {
354 defense += target->defenseBoost;
355
357 if (battleStatus->waterBlockTurnsLeft > 0) {
358 if ((battleStatus->curAttackElement & (DAMAGE_TYPE_BLAST | DAMAGE_TYPE_FIRE))) {
359 defense += 2;
360 } else {
361 defense += 1;
362 }
363 }
364
366 defense += 1;
367 }
368 }
369 }
370
371 // apply attacker damage modifiers
372
373 damage = battleStatus->curAttackDamage;
374
375 switch (actorClass) {
377 damage -= battleStatus->merleeDefenseBoost;
378 break;
381 break;
382 }
383
384 damage += attacker->attackBoost;
385
386 if (attacker->chillOutTurns != 0) {
387 damage -= attacker->chillOutAmount;
388 }
389
390 if (attacker->debuff == STATUS_KEY_SHRINK) {
391 if (damage > 0) {
392 damage /= 2;
393 }
394 }
395
396 if (damage > 99) {
397 damage = 99;
398 }
399 if (damage < 1) {
400 defense = 0;
401 }
402
403 target->hpChangeCounter = 0;
404 damage -= defense;
405
406 // apply damage mitigation from defensive badges
407
409 if (isPlayer) {
411 if (battleStatus->curAttackElement & DAMAGE_TYPE_FIRE) {
412 damage--;
413 }
414 }
415
419
420 if (target->curHP <= 5) {
422 damage /= 2;
423 }
424 }
425 }
426
427 // apply damage mitigation from blocking
428
429 switch (actorClass) {
431 // TODO figure out how to better write target->debuff >= STATUS_KEY_POISON
432 if ((target->debuff == 0 || target->debuff >= STATUS_KEY_POISON)
433 && (target->stoneStatus == 0)
434 && !(battleStatus->curAttackElement & DAMAGE_TYPE_UNBLOCKABLE)
435 ) {
436 s32 blocked;
437
439 blocked = rand_int(1);
440 } else {
441 blocked = check_block_input(BUTTON_A);
442 }
443
444 if (blocked) {
445 damage--;
450 break;
451 }
453 }
454 break;
456 if (target->stoneStatus == 0) {
457 if (target->koStatus == 0 && !(battleStatus->curAttackElement & DAMAGE_TYPE_UNBLOCKABLE)) {
459 damage = 0;
463 break;
464 }
466 }
467 }
468 break;
469 }
470
473 }
474
475 // deal damage and determine resulting battle event
476
477 event = EVENT_HIT_COMBO;
478 if (damage < 1) {
479 target->hpChangeCounter = 0;
480 if (!(battleStatus->curAttackElement & DAMAGE_TYPE_STATUS_ALWAYS_HITS)) {
482 event = EVENT_ZERO_DAMAGE;
483 } else {
485 event = EVENT_ZERO_DAMAGE;
486 if (target->curHP < 1) {
487 event = EVENT_DEATH;
488 }
489 }
490 battleStatus->lastAttackDamage = 0;
491 } else {
492 target->damageCounter += damage;
493 target->hpChangeCounter -= damage;
494 battleStatus->lastAttackDamage = 0;
498 ) {
499 if (!(target->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
500 target->curHP -= damage;
501 }
502
503 if (target->curHP < 1) {
504 target->curHP = 0;
505 event = EVENT_DEATH;
506 }
507 }
508 battleStatus->lastAttackDamage += damage;
509 target->lastDamageTaken = battleStatus->lastAttackDamage;
510 target->hpChangeCounter = 0;
511
513 battleStatus->damageTaken += damage;
514 gPlayerData.curHP = target->curHP;
515 }
516 }
517
519 if (event == EVENT_HIT_COMBO) {
520 event = EVENT_HIT;
521 }
522 if (event == EVENT_ZERO_DAMAGE) {
523 event = EVENT_IMMUNE;
524 }
525 if (target->curHP < 1 && event == EVENT_IMMUNE) {
526 event = EVENT_DEATH;
527 }
528 } else if (event == EVENT_DEATH) {
529 event = EVENT_HIT_COMBO;
530 }
531
534 }
535
538 && (targetPart->eventFlags & ACTOR_EVENT_FLAG_FLIPABLE)
539 ) {
540 if (event == EVENT_HIT) {
541 event = EVENT_FLIP_TRIGGER;
542 }
543 if (event == EVENT_IMMUNE) {
544 event = EVENT_FLIP_TRIGGER;
545 }
546 }
547
550 && (targetPart->eventFlags & ACTOR_EVENT_FLAG_FLIPABLE)
551 ) {
552 if (event == EVENT_HIT_COMBO) {
553 event = EVENT_FLIP_TRIGGER;
554 }
555 if (event == EVENT_ZERO_DAMAGE) {
556 event = EVENT_FLIP_TRIGGER;
557 }
558 }
559
562 ) {
563 if (event == EVENT_HIT) {
564 event = EVENT_BURN_HIT;
565 }
566 if (event == EVENT_DEATH) {
567 event = EVENT_FIRE_DEATH;
568 }
569 isFire = TRUE;
570 }
571
573 if (event == EVENT_HIT_COMBO) {
574 event = EVENT_18;
575 }
576 if (event == EVENT_HIT) {
577 event = EVENT_BLOCK;
578 }
579 if (event == EVENT_ZERO_DAMAGE) {
580 event = EVENT_18;
581 }
582 if (event == EVENT_IMMUNE) {
583 event = EVENT_BLOCK;
584 }
585 if (event == EVENT_BURN_HIT) {
586 event = EVENT_BLOCK;
587 }
588 }
589
590 // try inflicting status effect
591
593 && battleStatus->lastAttackDamage >= 0
594 && event != EVENT_DEATH
600 {
604 }
608 }
612 }
616 }
620 }
624 }
628 }
632 }
636 }
640 }
641
642 if (statusInflicted) {
643 if (event == EVENT_ZERO_DAMAGE) {
644 event = EVENT_HIT_COMBO;
645 }
646 if (event == EVENT_IMMUNE) {
647 event = EVENT_HIT;
648 }
649 }
650 }
651
652 // dispatch events and play damage effects
653
654 battleStatus->wasStatusInflicted = statusInflicted;
655
656 switch (actorClass) {
659 break;
662 break;
665 break;
666 }
667
669 && battleStatus->lastAttackDamage > 0
671 && !(target->flags & ACTOR_FLAG_NO_DMG_APPLY))
672 {
674 }
675
676 if (!(target->flags & ACTOR_FLAG_NO_DMG_POPUP)) {
677 switch (actorClass) {
680 if (battleStatus->lastAttackDamage == 0) {
682 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, -3);
683 }
684 } else if (battleStatus->curAttackElement & (DAMAGE_TYPE_MULTIPLE_POPUPS | DAMAGE_TYPE_SMASH)) {
685 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 1);
686 show_damage_fx(target, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
687 } else {
688 show_primary_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 1);
689 show_damage_fx(target, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
690 break;
691 }
692 break;
694 if (battleStatus->lastAttackDamage == 0) {
696 show_immune_bonk(state->goalPos.x, state->goalPos.y, state->goalPos.z, 0, 1, 3);
697 }
698 } else if (battleStatus->curAttackElement & (DAMAGE_TYPE_MULTIPLE_POPUPS | DAMAGE_TYPE_SMASH)) {
699 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 0);
700 show_damage_fx(target, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
701 } else {
702 show_primary_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 0);
703 show_damage_fx(target, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
704 }
705 break;
706 }
707 }
708
709 if (battleStatus->lastAttackDamage > 0) {
711
713
714 if (attacker->actorTypeData1[5] != SOUND_NONE) {
715 sfx_play_sound_at_position(attacker->actorTypeData1[5], SOUND_SPACE_DEFAULT, state->goalPos.x, state->goalPos.y, state->goalPos.z);
716 }
717
718 if (isFire) {
720 } else if (!isElectric) {
722 } else {
724 }
725
726 play_hit_sound(target, state->goalPos.x, state->goalPos.y, state->goalPos.z, hitSound);
727 }
728
729 if ((battleStatus->lastAttackDamage < 1 && !wasSpecialHit && !madeElectricContact) || targetPart->flags & ACTOR_PART_FLAG_DAMAGE_IMMUNE) {
731 }
732
733 if ((battleStatus->curAttackStatus & STATUS_FLAG_SLEEP) && statusInflicted) {
735 script->varTable[0] = state->goalPos.x;
736 script->varTable[1] = state->goalPos.y;
737 script->varTable[2] = state->goalPos.z;
739 }
740 if ((battleStatus->curAttackStatus & STATUS_FLAG_DIZZY) && statusInflicted) {
742 script->varTable[0] = state->goalPos.x;
743 script->varTable[1] = state->goalPos.y;
744 script->varTable[2] = state->goalPos.z;
746 }
747 if ((battleStatus->curAttackStatus & STATUS_FLAG_PARALYZE) && statusInflicted) {
749 script->varTable[0] = state->goalPos.x;
750 script->varTable[1] = state->goalPos.y;
751 script->varTable[2] = state->goalPos.z;
753 }
754 if ((battleStatus->curAttackStatus & STATUS_FLAG_POISON) && statusInflicted) {
756 script->varTable[0] = state->goalPos.x;
757 script->varTable[1] = state->goalPos.y;
758 script->varTable[2] = state->goalPos.z;
760 }
761 if ((battleStatus->curAttackStatus & STATUS_FLAG_STOP) && statusInflicted) {
763 script->varTable[0] = state->goalPos.x;
764 script->varTable[1] = state->goalPos.y;
765 script->varTable[2] = state->goalPos.z;
767 }
768 if ((battleStatus->curAttackStatus & STATUS_FLAG_FROZEN) && statusInflicted) {
770 script->varTable[0] = state->goalPos.x;
771 script->varTable[1] = state->goalPos.y;
772 script->varTable[2] = state->goalPos.z;
773 script->varTablePtr[3] = target;
775 }
776 if ((battleStatus->curAttackStatus & STATUS_FLAG_SHRINK) && statusInflicted) {
778 script->varTable[0] = state->goalPos.x;
779 script->varTable[1] = state->goalPos.y;
780 script->varTable[2] = state->goalPos.z;
781 script->varTablePtr[3] = target;
783 }
784
785 if ((battleStatus->curAttackElement & DAMAGE_TYPE_SMASH) && target->actorType == ACTOR_TYPE_GOOMNUT_TREE) {
787 }
788
790
791 if (attacker->staticStatus != STATUS_KEY_STATIC
792 && (target->staticStatus == STATUS_KEY_STATIC || targetPart->eventFlags & ACTOR_EVENT_FLAG_ELECTRIFIED)
793 && !(battleStatus->curAttackElement & DAMAGE_TYPE_NO_CONTACT)
794 && !(battleStatus->curAttackEventSuppression & SUPPRESS_EVENT_SHOCK_CONTACT)
795 && (attacker->transparentStatus != STATUS_KEY_TRANSPARENT)
797 {
801 return HIT_RESULT_BACKFIRE;
802 }
803
804 return hitResult;
805}
s32 dispatch_damage_event_actor_1(Actor *actor, s32 damageAmount, s32 event)
Definition 1A5830.c:879
void play_hit_sound(Actor *actor, f32 x, f32 y, f32 z, u32 hitSound)
Definition 1A5830.c:37
s32 has_enchanted_part(Actor *actor)
Definition 1A5830.c:7
s32 check_block_input(s32 buttonMask)
Definition action_cmd.c:537
s32 b32
@ 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_PLAYER_DEFENDING
Definition enums.h:3624
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3608
@ BS_FLAGS1_ATK_BLOCKED
Definition enums.h:3633
@ ACTOR_EVENT_FLAG_ELECTRIFIED
Player takes shock damage upon contact.
Definition enums.h:3409
@ ACTOR_EVENT_FLAG_BURIED
Actor can only by hit by quake-element attacks.
Definition enums.h:3413
@ 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
@ BS_FLAGS2_IS_FIRST_STRIKE
Definition enums.h:3651
@ STATUS_KEY_PARALYZE
Definition enums.h:2806
@ STATUS_TURN_MOD_PARALYZE
Definition enums.h:2839
@ STATUS_KEY_FROZEN
Definition enums.h:2808
@ STATUS_TURN_MOD_SLEEP
Definition enums.h:2833
@ STATUS_TURN_MOD_DIZZY
Definition enums.h:2837
@ STATUS_TURN_MOD_UNUSED
Definition enums.h:2836
@ STATUS_KEY_KO
Definition enums.h:2814
@ STATUS_TURN_MOD_POISON
Definition enums.h:2838
@ STATUS_TURN_MOD_STOP
Definition enums.h:2842
@ STATUS_KEY_SLEEP
Definition enums.h:2807
@ STATUS_KEY_UNUSED
Definition enums.h:2804
@ STATUS_KEY_STOP
Definition enums.h:2809
@ STATUS_TURN_MOD_STONE
Definition enums.h:2841
@ STATUS_TURN_MOD_FROZEN
Definition enums.h:2835
@ STATUS_KEY_SHRINK
Definition enums.h:2811
@ STATUS_KEY_DIZZY
Definition enums.h:2805
@ STATUS_KEY_POISON
Definition enums.h:2810
@ STATUS_TURN_MOD_STATIC
Definition enums.h:2834
@ STATUS_TURN_MOD_SHRINK
Definition enums.h:2840
@ HIT_RESULT_BACKFIRE
Definition enums.h:1975
@ HIT_RESULT_NO_DAMAGE
Definition enums.h:1978
@ SUPPRESS_EVENT_SHOCK_CONTACT
Definition enums.h:2937
@ STATUS_FLAG_STOP
Definition enums.h:2855
@ STATUS_FLAG_FROZEN
Definition enums.h:2848
@ STATUS_FLAG_STATIC
Definition enums.h:2847
@ STATUS_FLAG_SHRINK
Definition enums.h:2853
@ STATUS_FLAG_PARALYZE
Definition enums.h:2850
@ STATUS_FLAG_STONE
Definition enums.h:2854
@ 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_P_DOWN_D_UP
Definition enums.h:473
@ ABILITY_HEALTHY_HEALTHY
Definition enums.h:491
@ ABILITY_DEFEND_PLUS
Definition enums.h:463
@ ABILITY_DAMAGE_DODGE
Definition enums.h:487
@ ABILITY_LAST_STAND
Definition enums.h:468
@ ABILITY_P_UP_D_DOWN
Definition enums.h:470
@ ABILITY_FIRE_SHIELD
Definition enums.h:443
@ SOUND_DAMAGE_STARS
Definition enums.h:953
@ SOUND_INFLICT_STATUS
Definition enums.h:1358
@ SOUND_NONE
Definition enums.h:550
@ SOUND_SMACK_TREE
Definition enums.h:790
@ SOUND_INFLICT_SLEEP
Definition enums.h:1357
@ ACTOR_PLAYER
Definition enums.h:2118
@ ACTOR_FLAG_FLYING
Quake Hammer can't hit.
Definition enums.h:3363
@ ACTOR_FLAG_NO_DMG_POPUP
Hide damage popup.
Definition enums.h:3375
@ ACTOR_FLAG_NO_DMG_APPLY
Damage is not applied to actor HP.
Definition enums.h:3374
@ EVENT_HIT
Definition enums.h:2165
@ EVENT_BURN_HIT
Definition enums.h:2169
@ EVENT_FIRE_DEATH
Definition enums.h:2195
@ EVENT_IMMUNE
Definition enums.h:2179
@ EVENT_ZERO_DAMAGE
Definition enums.h:2177
@ EVENT_EXPLODE_TRIGGER
Definition enums.h:2188
@ EVENT_BLOCK
Definition enums.h:2180
@ EVENT_SPIN_SMASH_DEATH
Definition enums.h:2187
@ EVENT_18
Definition enums.h:2178
@ EVENT_HIT_COMBO
Definition enums.h:2164
@ EVENT_DEATH
Definition enums.h:2186
@ EVENT_FLIP_TRIGGER
Definition enums.h:2168
@ EVENT_SHOCK_HIT
Definition enums.h:2198
@ ACTOR_PART_FLAG_DAMAGE_IMMUNE
electrified Plays extra hurt SFX?
Definition enums.h:3392
@ DAMAGE_TYPE_POW
Definition enums.h:2895
@ DAMAGE_TYPE_4000
Definition enums.h:2899
@ DAMAGE_TYPE_ICE
Definition enums.h:2888
@ DAMAGE_TYPE_STATUS_ALWAYS_HITS
Definition enums.h:2914
@ DAMAGE_TYPE_SMASH
Definition enums.h:2891
@ DAMAGE_TYPE_UNBLOCKABLE
Definition enums.h:2909
@ 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
Definition enums.h:2896
@ DAMAGE_TYPE_JUMP
Definition enums.h:2892
@ DAMAGE_TYPE_NO_CONTACT
Definition enums.h:2912
@ 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)
void show_actor_health_bar(Actor *)
Definition 190B20.c:2237
void clear_part_pal_adjustment(ActorPart *)
Definition 190B20.c:2350
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 cancel_action_rating_combo(Actor *)
Definition 190B20.c:2171
void show_next_damage_popup(f32 x, f32 y, f32 z, s32 damageAmount, s32 angle)
Definition 190B20.c:2027
s32 get_defense(Actor *actor, s32 *defenseTable, s32 elementFlags)
Definition 190B20.c:1951
void apply_shock_effect(Actor *)
void show_action_rating(s32, Actor *, f32, f32, f32)
Definition 190B20.c:2092
s32 try_inflict_status(Actor *, s32, s32)
Definition 190B20.c:2264
s32 inflict_partner_ko(Actor *target, s32 statusTypeKey, s32 duration)
Definition 190B20.c:1935
EvtScript EVS_PlayStopHitFX
Definition dmg_player.c:109
EvtScript EVS_PlayFreezeHitFX
Definition dmg_player.c:115
EvtScript EVS_PlayShrinkHitFX
Definition dmg_player.c:125
EvtScript EVS_PlayParalyzeHitFX
Definition dmg_player.c:97
EvtScript EVS_PlayPoisonHitFX
Definition dmg_player.c:103
EvtScript EVS_PlaySleepHitFX
Definition dmg_player.c:85
EvtScript EVS_PlayDizzyHitFX
Definition dmg_player.c:91

◆ dispatch_damage_event_actor()

s32 dispatch_damage_event_actor ( Actor * actor,
s32 damageAmount,
s32 originalEvent,
s32 stopMotion )

Definition at line 807 of file 1A5830.c.

807 {
809 ActorState* state = &actor->state;
812 s32 hpChangeCounter;
815 s32 new_var;
816
817 battleStatus->curAttackDamage = damageAmount;
819 actor->hpChangeCounter += hpChange;
820 new_var = actor->hpChangeCounter;
822 actor->damageCounter += hpChange;
823 actor->hpChangeCounter -= hpChange;
824 battleStatus->lastAttackDamage = 0;
825 actor->curHP -= hpChange;
826
827 if (actor->curHP <= 0) {
829 battleStatus->lastAttackDamage += actor->curHP;
830 actor->curHP = 0;
831 }
832
833 battleStatus->lastAttackDamage += hpChange;
834 actor->lastDamageTaken = battleStatus->lastAttackDamage;
835 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
839 }
842 }
843 }
844 if (dispatchEvent == EVENT_DEATH) {
847 }
850 }
851 }
852
853 if (!stopMotion) {
855
856 if (func_80263230(actor, actor) != 0) {
857 show_next_damage_popup(actor->targetData[0].truePos.x, actor->targetData[0].truePos.y, actor->targetData[0].truePos.z, battleStatus->lastAttackDamage, 0);
858 show_damage_fx(actor, actor->targetData[0].truePos.x, actor->targetData[0].truePos.y, actor->targetData[0].truePos.z, battleStatus->lastAttackDamage);
859 }
861
862 } else {
863 show_next_damage_popup(state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage, 0);
864 show_damage_fx(actor, state->goalPos.x, state->goalPos.y, state->goalPos.z, battleStatus->lastAttackDamage);
865 }
866
867 if (battleStatus->lastAttackDamage > 0) {
868 set_actor_flash_mode(actor, 1);
869 }
872 return 0;
873}
s16 lastDamageTaken
ActorState state
s16 damageCounter
struct SelectableTarget targetData[24]
s16 targetActorID
s16 hpChangeCounter
@ DMG_SRC_DEFAULT
Definition enums.h:2014
@ ACTOR_FLAG_HEALTH_BAR_HIDDEN
Definition enums.h:3372
@ EVENT_SPIN_SMASH_LAUNCH_HIT
Definition enums.h:2171
@ EVENT_SHOCK_DEATH
Definition enums.h:2192
@ EVENT_SPIN_SMASH_LAUNCH_DEATH
Definition enums.h:2191
s32 func_80263230(Actor *, Actor *)
Definition 190B20.c:558

Referenced by dispatch_damage_event_actor_0(), and dispatch_damage_event_actor_1().

◆ dispatch_damage_event_actor_0()

s32 dispatch_damage_event_actor_0 ( Actor * actor,
s32 damageAmount,
s32 event )

Definition at line 875 of file 1A5830.c.

875 {
877}
s32 dispatch_damage_event_actor(Actor *actor, s32 damageAmount, s32 originalEvent, s32 stopMotion)
Definition 1A5830.c:807

Referenced by btl_state_update_transfer_turn().

◆ dispatch_damage_event_actor_1()

s32 dispatch_damage_event_actor_1 ( Actor * actor,
s32 damageAmount,
s32 event )

Definition at line 879 of file 1A5830.c.

879 {
881}

Referenced by calc_enemy_damage_target().

◆ update_lerp_battle()

f32 update_lerp_battle ( s32 easing,
f32 start,
f32 end,
s32 elapsed,
s32 duration )

Definition at line 2079 of file 1A5830.c.

2079 {
2080 s32 timeLeft;
2081 f32 absMag;
2082 f64 start1;
2083 f64 start2;
2084 f32 len1;
2085 f32 len2;
2086 f32 len3;
2087 f32 len4;
2088 f64 len5;
2089 f32 len6;
2090 f64 len7;
2091
2092 switch (easing) {
2093 case EASING_LINEAR:
2094 return start + (end - start) * elapsed / duration;
2096 return start + SQ(elapsed) * (end - start) / SQ(duration);
2097 case EASING_CUBIC_IN:
2098 return start + CUBE(elapsed) * (end - start) / CUBE(duration);
2099 case EASING_QUARTIC_IN:
2100 return start + QUART(elapsed) * (end - start) / QUART(duration);
2102 len1 = end - start;
2103 return end - (len1 * cos_rad(((f32)elapsed / duration) * PI_D * 4.0) * (duration - elapsed) *
2104 (duration - elapsed)) / SQ((f32)duration);
2106 len2 = end - start;
2107 return end - (len2 * cos_rad((((f32)SQ(elapsed) / duration) * PI_D * 4.0) / 15.0) * (duration - elapsed) *
2108 (duration - elapsed)) / SQ((f32)duration);
2110 timeLeft = duration - elapsed;
2111 return start + (end - start) - ((SQ(timeLeft) * (end - start))) / SQ(duration);
2112 case EASING_CUBIC_OUT:
2113 len3 = end - start;
2114 timeLeft = duration - elapsed;
2115 return start + len3 - ((CUBE(timeLeft) * len3)) / CUBE(duration);
2116 case EASING_QUARTIC_OUT:
2117 len4 = end - start;
2118 timeLeft = duration - elapsed;
2119 return start + len4 - ((QUART(timeLeft) * len4)) / QUART(duration);
2120 case EASING_COS_BOUNCE:
2121 absMag = cos_rad((((f32)SQ(elapsed) / duration) * PI_D * 4.0) / 40.0) * (duration - elapsed) *
2122 (duration - elapsed) / SQ((f32)duration);
2123 if (absMag < 0.0f) {
2124 absMag = -absMag;
2125 }
2126 return end - (end - start) * absMag;
2127 case EASING_COS_IN_OUT:
2128 len5 = end - start;
2129 start1 = start;
2130 return start1 + (len5 * (1.0 - cos_rad(((f32)elapsed * PI_D) / (f32)duration)) / 2);
2131 case EASING_SIN_OUT:
2132 len6 = end - start;
2133 return start + (len6 * sin_rad((((f32) elapsed) * (PI_D / 2)) / ((f32) duration)));
2134 case EASING_COS_IN:
2135 len7 = end - start;
2136 start2 = start;
2137 return start2 + (len7 * (1.0 - cos_rad(((f32)elapsed * (PI_D / 2)) / (f32)duration)));
2138 }
2139
2140 return 0.0f;
2141}
@ EASING_SIN_OUT
Definition enums.h:521
@ EASING_COS_IN
Definition enums.h:522
@ EASING_CUBIC_IN
Definition enums.h:512
@ EASING_CUBIC_OUT
Definition enums.h:515
@ EASING_QUARTIC_IN
Definition enums.h:513
@ EASING_COS_BOUNCE
Definition enums.h:519
@ EASING_COS_SLOW_OVERSHOOT
Definition enums.h:517
@ EASING_QUADRATIC_IN
Definition enums.h:511
@ EASING_COS_IN_OUT
Definition enums.h:520
@ EASING_QUARTIC_OUT
Definition enums.h:516
@ EASING_QUADRATIC_OUT
Definition enums.h:514
@ EASING_LINEAR
Definition enums.h:510
@ EASING_COS_FAST_OVERSHOOT
Definition enums.h:518
f32 cos_rad(f32 x)
Definition 43F0.c:715
f32 sin_rad(f32 x)
Definition 43F0.c:711
#define PI_D
Definition macros.h:139
#define QUART(x)
Definition macros.h:180
#define CUBE(x)
Definition macros.h:179
#define SQ(x)
Definition macros.h:178

Variable Documentation

◆ StarPointMultiplier

s32 StarPointMultiplier[]
Initial value:
= {
100, 100, 100,
110,
130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
}

Star Point multiplier, indexed by actor count.

+10% multiplier for three actors +30% multiplier for four or more actors

Definition at line 2690 of file 1A5830.c.

2690 {
2691 100, 100, 100,
2692 110,
2693 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130,
2694};