Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
btl_states_actions.c
Go to the documentation of this file.
1#include "common.h"
2#include "script_api/battle.h"
3#include "ld_addrs.h"
4#include "effects.h"
5#include "hud_element.h"
6#include "battle/battle.h"
7#include "model.h"
8#include "game_modes.h"
9#include "dx/debug_menu.h"
10
11#if VERSION_JP
12extern Addr btl_states_menus_ROM_START;
13extern Addr btl_states_menus_ROM_END;
14extern Addr btl_states_menus_VRAM;
15#endif
16
18
19extern s16 D_802809F6;
20extern s16 DemoBattleBeginDelay;
21extern s32 BattleScreenFadeAmt;
23extern s32 bActorsIgnoreDuringCount[];
26
29BSS s32 BattleSubStateDelay; // generic delay time usable for various substates
37
38b32 dispatch_damage_tick_event_player(s32 damageAmount, s32 event);
39
41
43 BattleStatus* battleStatus = &gBattleStatus;
44 EncounterStatus* currentEncounter = &gCurrentEncounter;
45 PlayerData* playerData = &gPlayerData;
46
50 && playerData->merleeCastsLeft > 0
51 ) {
52 if (playerData->merleeTurnCount <= 0) {
53 s32 temp = rand_int(100);
54
55 if (currentEncounter->curEnemy != NULL) {
56 if (currentEncounter->curEnemy->flags & ACTOR_FLAG_NO_HEALTH_BAR) {
57 // 46/101 ≈ 45.5%
58 if (temp <= 45) {
60 } else if (temp <= 90) { // 45/101 ≈ 44.6%
62 } else { // 10/101 ≈ 9.9%
64 }
65 } else if (temp <= 30) { // 31/101 ≈ 30.7%
67 } else if (temp <= 60) { // 30/101 ≈ 29.7%
69 } else if (temp <= 80) { // 20/101 ≈ 19.8%
71 } else { // 20/101 ≈ 19.8%
73 }
74 } else if (temp <= 30) { // 31/101 ≈ 30.7%
76 } else if (temp <= 60) { // 30/101 ≈ 29.7%
78 } else if (temp <= 80) { // 20/101 ≈ 19.8%
80 } else { // 20/101 ≈ 19.8%
82 }
83
84 temp = rand_int(10) + 6;
85 playerData->merleeTurnCount = temp;
86 }
87
88 if (playerData->merleeTurnCount >= 2) {
89 playerData->merleeTurnCount--;
90 } else {
91 playerData->merleeTurnCount = 0;
92 battleStatus->nextMerleeSpellType = playerData->merleeSpellType;
93 playerData->merleeCastsLeft--;
94 }
95 }
96}
97
99 BattleStatus* battleStatus = &gBattleStatus;
100 EncounterStatus* currentEncounter = &gCurrentEncounter;
101 PlayerData* playerData = &gPlayerData;
102
106 && playerData->merleeCastsLeft > 0)
107 {
108 if (playerData->merleeTurnCount <= 0) {
109 s32 temp = rand_int(100);
110
111 if (currentEncounter->curEnemy != NULL) {
112 if (currentEncounter->curEnemy->flags & ACTOR_FLAG_NO_HEALTH_BAR) {
113 // 46/101 ≈ 45.5%
114 if (temp <= 45) {
116 } else if (temp <= 90) { // 45/101 ≈ 44.6%
118 } else { // 10/101 ≈ 9.9%
120 }
121 } else if (temp <= 30) { // 31/101 ≈ 30.7%
123 } else if (temp <= 60) { // 30/101 ≈ 29.7%
125 } else if (temp <= 80) { // 20/101 ≈ 19.8%
127 } else { // 20/101 ≈ 19.8%
129 }
130 } else if (temp <= 30) { // 31/101 ≈ 30.7%
132 } else if (temp <= 60) { // 30/101 ≈ 29.7%
134 } else if (temp <= 80) { // 20/101 ≈ 19.8%
136 } else { // 20/101 ≈ 19.8%
138 }
139
140 if (playerData->merleeSpellType != MERLEE_SPELL_COIN_BOOST) {
141 // same outcome either way. has to be written like this, and the check does exist in the code. bug?
142 if (playerData->merleeTurnCount == -1) {
143 temp = rand_int(5) + 5;
144 } else {
145 temp = rand_int(5) + 5;
146
147 }
148 } else {
149 temp = rand_int(8) + 5;
150 }
151 playerData->merleeTurnCount = temp;
152 }
153
155 if (playerData->merleeTurnCount >= 2) {
156 playerData->merleeTurnCount--;
157 } else {
158 battleStatus->nextMerleeSpellType = playerData->merleeSpellType;
159 playerData->merleeTurnCount = 0;
160 playerData->merleeCastsLeft--;
161 }
162 }
163 }
164}
165
166void btl_set_state(s32 battleState) {
168 gBattleState = battleState;
170
172 if (flags) {
173 switch (battleState) {
175 battleState = BATTLE_STATE_TWINK_MENU;
176 break;
178 battleState = BATTLE_STATE_PEACH_MENU;
179 break;
182 break;
184 battleState = BATTLE_STATE_BEGIN_PLAYER_TURN;
185 break;
186 }
187 gBattleState = battleState;
188 }
189}
190
192 BattleStatus* battleStatus = &gBattleStatus;
193 EncounterStatus* currentEncounter = &gCurrentEncounter;
194 Battle* battle;
195 Stage* stage;
196 s32 size;
197 StatusBar* statusBar;
198 void* compressedAsset;
199 ModelNode* rootModel;
200 s32 texturesOffset;
201 Actor* actor;
202 Evt* script;
203 s32 enemyNotDone;
204 s32 type;
205 s32 i;
206 s32 j;
207
208 s32* types;
209
210 battle = gCurrentBattlePtr;
211 if (gOverrideBattlePtr != NULL) {
212 battle = gOverrideBattlePtr;
213 }
214
215 if (gCurrentStagePtr == NULL) {
216 stage = battle->stage;
217 } else {
218 stage = gCurrentStagePtr->stage;
219 }
220
221 battleStatus->curStage = stage;
222 switch (gBattleSubState) {
224 #if DX_DEBUG_MENU
225 dx_debug_set_battle_info(gCurrentBattleID << 16 | (gCurrentStageID & 0xFFFF), stage->shape);
226 #endif
227
230 compressedAsset = load_asset_by_name(stage->shape, &size);
231 decode_yay0(compressedAsset, &gMapShapeData);
232 general_heap_free(compressedAsset);
233
234 ASSERT(size <= 0x8000);
235
236 rootModel = gMapShapeData.header.root;
237 texturesOffset = get_asset_offset(stage->texture, &size);
238 if (rootModel != NULL) {
239 load_data_for_models(rootModel, texturesOffset, size);
240 }
242
243 if (stage->bg != NULL) {
244 load_map_bg(stage->bg);
246 }
247
250 }
251
252 battleStatus->controlScript = NULL;
253 battleStatus->camMovementScript = NULL;
254 battleStatus->unk_90 = 0;
255 battleStatus->preUpdateCallback = NULL;
256 battleStatus->initBattleCallback = NULL;
257 battleStatus->curSubmenu = 0;
258 battleStatus->unk_49 = 0;
259 battleStatus->curPartnerSubmenu = 0;
260 battleStatus->unk_4B = 0;
261 battleStatus->totalStarPoints = 0;
262 battleStatus->pendingStarPoints = 0;
263 battleStatus->incrementStarPointDelay = 0;
264 battleStatus->damageTaken = 0;
271 battleStatus->actionCommandMode = AC_MODE_LEARNED;
272 }
273 battleStatus->actionQuality = 0;
274 battleStatus->maxActionQuality = 0;
275 battleStatus->enabledMenusFlags = -1;
276 battleStatus->enabledStarPowersFlags = -1;
277 battleStatus->itemUsesLeft = 0;
278 battleStatus->hammerCharge = 0;
279 battleStatus->jumpCharge = 0;
280 battleStatus->unk_98 = 0;
281 battleStatus->hpDrainCount = 0;
283 if (currentEncounter->forbidFleeing) {
284 gBattleStatus.flags2 &= ~BS_FLAGS2_CAN_FLEE;
285 }
286 battleStatus->endBattleFadeOutRate = 10;
287 battleStatus->waitForState = BATTLE_STATE_0;
288 battleStatus->hammerLossTurns = -1;
289 battleStatus->jumpLossTurns = -1;
290 battleStatus->itemLossTurns = -1;
291 battleStatus->outtaSightActive = 0;
292 battleStatus->waterBlockTurnsLeft = 0;
293 battleStatus->waterBlockAmount = 0;
294 battleStatus->waterBlockEffect = NULL;
295 battleStatus->cloudNineTurnsLeft = 0;
296 battleStatus->cloudNineDodgeChance = 0;
297 battleStatus->cloudNineEffect = NULL;
298 battleStatus->reflectFlags = 0;
299 battleStatus->turboChargeTurnsLeft = 0;
300 battleStatus->turboChargeAmount = 0;
301 battleStatus->stateFreezeCount = 0;
302 battleStatus->merleeAttackBoost = 0;
303 battleStatus->merleeDefenseBoost = 0;
305 battleStatus->unk_433 = -1;
306 battleStatus->hustleTurns = 0;
307 battleStatus->unk_93 = 0;
308 battleStatus->unk_94 = 0;
309 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
310 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
311 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
312 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
313 gBattleStatus.flags2 &= ~BS_FLAGS2_STORED_TURBO_CHARGE_TURN;
314 gBattleStatus.flags2 &= ~BS_FLAGS2_DOING_JUMP_TUTORIAL;
315
316 for (i = 0; i < ARRAY_COUNT(battleStatus->varTable); i++) {
317 battleStatus->varTable[i] = 0;
318 }
319
321 battleStatus->inputBitmask = 0xFFFFF & ~(BUTTON_START | 0xC0);
322 battleStatus->buffEffect = fx_partner_buff(0, 0.0f, 0.0f, 0.0f, 0.0f, 0);
326 battleStatus->camMovementScript = script;
327 battleStatus->camMovementScriptID = script->id;
329 break;
331 statusBar = &gStatusBar;
332 if (does_script_exist(battleStatus->camMovementScriptID)) {
333 break;
334 }
335
336 if (stage->preBattle != NULL) {
337 script = start_script(stage->preBattle, EVT_PRIORITY_A, 0);
338 battleStatus->controlScript = script;
339 battleStatus->controlScriptID = script->id;
340 }
341
342 statusBar->hidden = FALSE;
344
345 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
346 battleStatus->enemyActors[i] = NULL;
347 }
348 battleStatus->initialEnemyCount = 0;
349
350 for (i = 0; i < BattleEnemiesCreated; i++) {
351 create_actor(&(*battle->formation)[i]);
353 actor = battleStatus->enemyActors[i];
354
355 while (TRUE) {
356 type = *types;
357 if (type == -1) {
358 battleStatus->initialEnemyCount++;
359 break;
360 } else if (actor->actorType == type) {
361 break;
362 }
363 types++;
364 }
365
366 actor->instigatorValue = 0;
367 if (i == 0) {
368 actor->instigatorValue = currentEncounter->instigatorValue;
369 if (currentEncounter->dizzyAttack.status == STATUS_KEY_DIZZY) {
371 }
372 }
373 }
374
375 if (stage->stageEnemyCount != 0) {
376 if (stage->stageEnemyChance == 0 || (stage->stageEnemyChance > 0 && (rand_int(stage->stageEnemyChance) == 0))) {
378 for (j = 0; i < BattleEnemiesCreated; i++, j++) {
379 create_actor(&(*stage->stageFormation)[j]);
380 actor = battleStatus->enemyActors[i];
381 actor->instigatorValue = 0;
382 if (i == 0) {
383 actor->instigatorValue = 0;
384 if (currentEncounter->dizzyAttack.status == STATUS_KEY_DIZZY) {
386 }
387 }
388
389 }
390 }
391 }
392
394 actor = battleStatus->playerActor;
397 } else {
399 }
400 actor->takeTurnScript = script;
401 actor->takeTurnScriptID = script->id;
402 script->owner1.actorID = ACTOR_PLAYER;
405 break;
407 enemyNotDone = FALSE;
408 for (i = 0; i < BattleEnemiesCreated; i++) {
409 actor = battleStatus->enemyActors[i];
411 enemyNotDone = TRUE;
412 break;
413 } else {
414 actor->takeTurnScript = NULL;
415 }
416 }
417 if (enemyNotDone) {
418 break;
419 }
420
421 actor = battleStatus->playerActor;
423 break;
424 }
425 actor->takeTurnScript = NULL;
426
427 actor = battleStatus->partnerActor;
428 if (actor != NULL) {
430 break;
431 }
432 actor->takeTurnScript = NULL;
433 }
434
435 if (battle->onBattleStart != NULL) {
436 script = start_script(battle->onBattleStart, EVT_PRIORITY_A, 0);
437 battleStatus->controlScript = script;
438 battleStatus->controlScriptID = script->id;
439 }
440 if (battleStatus->darknessMode > BTL_DARKNESS_STATE_NONE) {
443 }
445 currentEncounter->firstStrikeType = FIRST_STRIKE_NONE;
446 }
447
448 switch (currentEncounter->firstStrikeType) {
451 break;
454 break;
455 default:
457 actor = battleStatus->playerActor;
460 } else {
462 }
463 actor->takeTurnScript = script;
464 actor->takeTurnScriptID = script->id;
465 script->owner1.actorID = ACTOR_PLAYER;
466 }
467
468 if (currentEncounter->curEnemy != NULL
469 && currentEncounter->curEnemy->encountered == ENCOUNTER_TRIGGER_SPIN
471 ) {
472 actor = battleStatus->enemyActors[0];
474 actor->takeTurnScript = script;
475 actor->takeTurnScriptID = script->id;
476 script->owner1.enemyID = ACTOR_ENEMY0;
477 }
478
482 break;
483 }
484 break;
486 if (BattleScreenFadeAmt == 0) {
488 break;
489 }
490
492 if (BattleSubStateDelay == 15) {
494 }
495
498 } else {
500 }
501
502 if (BattleScreenFadeAmt < 0) {
504 }
505 break;
507 if (battleStatus->stateFreezeCount == 0) {
510 }
511 break;
512 }
513}
514
524
526 BattleStatus* battleStatus = &gBattleStatus;
527 PlayerData* playerData = &gPlayerData;
528 Actor* partner = battleStatus->partnerActor;
529 Actor* player = battleStatus->playerActor;
530 Actor* enemy;
531 Actor* enemy1;
532 Actor* enemy2;
533 Evt* script;
534 Evt* script2;
535 s32 cond;
536 u16 id1;
537 u16 id2;
538 s32 numEnemyActors;
539 s32 i;
540 s32 j;
541 s16* enemyIDs;
542
544 battleStatus->flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
545 battleStatus->flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
546 battleStatus->flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
547 battleStatus->flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
548 battleStatus->merleeAttackBoost = 0;
549 battleStatus->merleeDefenseBoost = 0;
550 battleStatus->flags2 &= ~BS_FLAGS2_IS_FIRST_STRIKE;
551
553 player->disableDismissTimer = 0;
554 if (partner != NULL) {
556 partner->disableDismissTimer = 0;
557 }
558
559 if (battleStatus->hustleTurns != 0) {
561 }
562
563 numEnemyActors = 0;
564 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
565 enemy = battleStatus->enemyActors[i];
566 if (enemy != NULL) {
567 battleStatus->enemyIDs[numEnemyActors] = i | ACTOR_ENEMY0;
568 numEnemyActors++;
569 }
570 }
571 battleStatus->numEnemyActors = numEnemyActors;
572
573 // sort enemies by x-position or turn priority
574 enemyIDs = battleStatus->enemyIDs;
575 for (i = 0; i < numEnemyActors - 1; i++) {
576 for (j = i + 1; j < numEnemyActors; j++) {
577 id1 = enemyIDs[i];
578 id2 = enemyIDs[j];
579 enemy1 = battleStatus->enemyActors[id1 & 0xFF];
580 enemy2 = battleStatus->enemyActors[id2 & 0xFF];
582 if (enemy1->homePos.x > enemy2->homePos.x) {
583 enemyIDs[i] = id2;
584 enemyIDs[j] = id1;
585 }
586 } else if (enemy1->turnPriority < enemy2->turnPriority) {
587 enemyIDs[i] = id2;
588 enemyIDs[j] = id1;
589 }
590 }
591 }
592 battleStatus->nextEnemyIndex = 0;
593
595
596 // clear rush flags to initialize
597 battleStatus->rushFlags = RUSH_FLAG_NONE;
598 gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_RUSH;
599
600 // set rush flags based on danger/peril status
604 battleStatus->rushFlags |= RUSH_FLAG_MEGA;
605 }
607 if (!(battleStatus->rushFlags & RUSH_FLAG_MEGA)) {
609 battleStatus->rushFlags |= RUSH_FLAG_POWER;
610 }
611 }
612 }
613
615 battleStatus->jumpCharge = 0;
616 }
617
619 battleStatus->hammerCharge = 0;
620 }
621
624 return;
625 }
626
628 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
629 enemy = battleStatus->enemyActors[i];
630 if (enemy != NULL && enemy->handleEventSource != NULL) {
631 Evt* script = start_script(enemy->handleEventSource, EVT_PRIORITY_A, 0);
632
633 enemy->handleEventScript = script;
634 script->owner1.actorID = i | ACTOR_ENEMY0;
635 enemy->handleEventScriptID = script->id;
636 enemy->lastEventType = EVENT_DEATH;
637 }
638 }
640 } else {
641 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
642 enemy = battleStatus->enemyActors[i];
643 if (enemy != NULL && enemy->handlePhaseSource != NULL) {
644 battleStatus->battlePhase = PHASE_PLAYER_BEGIN;
645 script = start_script(enemy->handlePhaseSource, EVT_PRIORITY_A, 0);
646 enemy->handlePhaseScript = script;
647 enemy->handleBatttlePhaseScriptID = script->id;
648 script->owner1.actorID = i | ACTOR_ENEMY0;
649 }
650 }
651
652 partner = battleStatus->partnerActor;
653 if (partner != NULL) {
654 if (partner->handlePhaseSource != NULL) {
655 battleStatus->battlePhase = PHASE_PLAYER_BEGIN;
656 script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
657 partner->handlePhaseScript = script;
658 partner->handleBatttlePhaseScriptID = script->id;
659 script->owner1.actorID = ACTOR_PARTNER;
660 }
661 }
663 }
664 }
665
667 cond = FALSE;
668 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
669 enemy = battleStatus->enemyActors[i];
670 if (enemy != NULL && enemy->handlePhaseSource != NULL && does_script_exist(enemy->handleBatttlePhaseScriptID)) {
671 cond = TRUE;
672 }
673 }
674 if (partner != NULL && partner->handlePhaseSource != NULL && does_script_exist(partner->handleBatttlePhaseScriptID)) {
675 cond = TRUE;
676 }
677
678 if (!cond) {
681 }
682 return;
683 }
684 }
685
687 cond = FALSE;
688 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
689 enemy = battleStatus->enemyActors[i];
690 if (enemy != NULL && enemy->handleEventSource != NULL && does_script_exist(enemy->handleEventScriptID)) {
691 cond = TRUE;
692 }
693 }
694
695 if (!cond) {
698 }
699 }
700 }
701}
702
705
707 BattleStatus* battleStatus = &gBattleStatus;
708 PlayerData* playerData = &gPlayerData;
709 Actor* player = battleStatus->playerActor;
710 Actor* partner = battleStatus->partnerActor;
711 ActorPart* part = &player->partsTable[0];
712 Evt* script;
713 s32 i;
714
715 s8 debuffDuration;
716 s32 koDuration;
717 s32 temp;
718
721 btl_cam_move(5);
723 }
724
725 switch (gBattleSubState) {
728 gBattleStatus.flags1 &= ~BS_FLAGS1_PARTNER_ACTING;
730 battleStatus->actionResult = ACTION_RESULT_NONE;
731 battleStatus->blockResult = BLOCK_RESULT_NONE;
732 battleStatus->selectedMoveID = 0;
734 gBattleStatus.flags2 &= ~BS_FLAGS2_IS_FIRST_STRIKE;
735 player->disableDismissTimer = 0;
737
738 if (partner != NULL) {
740 partner->disableDismissTimer = 0;
741 }
742
743 battleStatus->stateFreezeCount = 0;
744 D_8029F254 = FALSE;
745 D_8029F258 = 0;
746
747 if (battleStatus->outtaSightActive == 0) {
749 } else {
750 battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
751 script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
752 partner->handlePhaseScript = script;
754 partner->handleBatttlePhaseScriptID = script->id;
755 script->owner1.actorID = ACTOR_PARTNER;
756 }
757 }
758 break;
761 battleStatus->outtaSightActive = 0;
764 }
765 break;
766 }
767
768 switch (gBattleSubState) {
770 if (battleStatus->stateFreezeCount == 0) {
771 if (battleStatus->waterBlockTurnsLeft != 0) {
772 battleStatus->waterBlockTurnsLeft--;
774 if (battleStatus->waterBlockTurnsLeft <= 0) {
776 fx_water_block(FX_WATER_BLOCK_DESTROY, player->curPos.x, player->curPos.y + 18.0f, player->curPos.z + 5.0f, 1.5f, 10);
777 fx_water_splash(0, player->curPos.x - 10.0f, player->curPos.y + 5.0f, player->curPos.z + 5.0f, 1.0f, 24);
778 fx_water_splash(0, player->curPos.x - 15.0f, player->curPos.y + 32.0f, player->curPos.z + 5.0f, 1.0f, 24);
779 fx_water_splash(1, player->curPos.x + 15.0f, player->curPos.y + 22.0f, player->curPos.z + 5.0f, 1.0f, 24);
780 battleStatus->waterBlockEffect = NULL;
784 } else {
786 }
787 } else {
789 }
790 }
791 break;
793 if (!btl_is_popup_displayed()) {
795 }
796 break;
797 }
798
799 switch (gBattleSubState) {
801 if (battleStatus->cloudNineTurnsLeft != 0) {
802 battleStatus->cloudNineTurnsLeft--;
804
805 if (battleStatus->cloudNineTurnsLeft <= 0) {
806 remove_effect(battleStatus->cloudNineEffect);
807 battleStatus->cloudNineEffect = NULL;
810 } else {
812 }
813 } else {
815 }
816 break;
818 if (!btl_is_popup_displayed()) {
820 }
821 break;
822 }
823
824 switch (gBattleSubState) {
826 if (battleStatus->turboChargeTurnsLeft != 0) {
828 gBattleStatus.flags2 &= ~BS_FLAGS2_STORED_TURBO_CHARGE_TURN;
830 } else {
831 battleStatus->turboChargeTurnsLeft--;
833 if (battleStatus->turboChargeTurnsLeft <= 0) {
836 } else {
838 }
839 }
840 } else {
842 }
843 break;
845 if (!btl_is_popup_displayed()) {
847 }
848 break;
849 }
850
852 if (player->debuff == STATUS_KEY_POISON && player->stoneStatus == 0) {
855 }
856
857 // clear rush flags to initialize
858 battleStatus->rushFlags = RUSH_FLAG_NONE;
859 gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_RUSH;
860
861 // set rush flags based on danger/peril status
865 battleStatus->rushFlags |= RUSH_FLAG_MEGA;
866 }
868 if (!(battleStatus->rushFlags & RUSH_FLAG_MEGA)) {
870 battleStatus->rushFlags |= RUSH_FLAG_POWER;
871 }
872 }
873 }
875 }
876
878 if (player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
879 player->handleEventScript = NULL;
881 return;
882 }
883
884 D_8029F254 = FALSE;
885 player->disableDismissTimer = 0;
887
889 if (player->debuff != 0) {
890 player->debuffDuration = 1;
891 }
892 if (player->staticStatus != 0) {
893 player->staticDuration = 1;
894 }
895 if (player->stoneStatus != 0) {
896 player->stoneDuration = 1;
897 }
898 if (player->koStatus != 0) {
899 player->koDuration = 1;
900 }
901 if (player->transparentStatus != 0) {
902 player->transparentDuration = 1;
903 }
904 }
905
906 if (player->stoneStatus != 0) {
907 player->stoneDuration--;
908 if (player->stoneDuration <= 0) {
909 player->stoneStatus = 0;
911 }
912 } else {
913 if (!is_ability_active(ABILITY_ZAP_TAP) && player->staticStatus != 0) {
914 player->staticDuration--;
915 if (player->staticDuration <= 0) {
916 player->staticStatus = 0;
918 }
919 }
920 if (player->transparentStatus != 0) {
921 player->transparentDuration--;
923 if (player->transparentDuration <= 0) {
924 player->transparentStatus = 0;
925 part->flags &= ~ACTOR_PART_FLAG_TRANSPARENT;
927 }
928 }
929
930 if (player->debuff != 0) {
931 if (player->debuff < 9) {
932 D_8029F254 = TRUE;
933 }
934 D_8029F258 = 20;
935 player->debuffDuration--;
936 if (player->debuffDuration <= 0) {
937 if (player->debuff == STATUS_KEY_FROZEN) {
940 player->icePillarEffect = NULL;
942 } else {
944 }
945 player->debuff = 0;
946 player->debuffDuration = 0;
948 }
949 }
950
951 debuffDuration = player->debuffDuration;
952 temp = player->koDuration;
953 player->koDuration = debuffDuration;
954 if (debuffDuration > 0) {
955 player->koStatus = STATUS_KEY_DAZE;
956 player->disableEffect->data.disableX->koDuration = player->koDuration;
957 } else if (temp != debuffDuration) {
958 player->koStatus = 0;
959 player->koDuration = 0;
961 }
962 }
963
964 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
965 Actor* enemy = battleStatus->enemyActors[i];
966
967 if (enemy != NULL) {
969 if (enemy->chillOutTurns != 0) {
970 enemy->chillOutTurns--;
971 if (enemy->chillOutTurns == 0) {
972 enemy->chillOutAmount = 0;
974 D_8029F258 = 20;
975 }
976 }
977 }
978 }
980 }
981 }
982
985 return;
986 }
987 temp = 1;
988 battleStatus->stateFreezeCount = 0;
989 if (battleStatus->hammerLossTurns >= 0) {
990 battleStatus->hammerLossTurns--;
991 if (battleStatus->hammerLossTurns == -1) {
993 player->takeTurnScript = script;
994 player->takeTurnScriptID = script->id;
995 script->owner1.actorID = ACTOR_PLAYER;
996 script->varTable[0] = temp;
997 temp += 8; // temp here should be named itemSpawnOffsetX
998 script->varTable[10] = BTL_MENU_TYPE_SMASH;
999 battleStatus->stateFreezeCount = 1;
1000 }
1001 }
1002
1003 if (battleStatus->jumpLossTurns >= 0) {
1004 battleStatus->jumpLossTurns--;
1005 if (battleStatus->jumpLossTurns == -1) {
1007 player->takeTurnScript = script;
1008 player->takeTurnScriptID = script->id;
1009 script->owner1.actorID = ACTOR_PLAYER;
1010 script->varTable[0] = temp;
1011 temp += 8;
1012 script->varTable[10] = BTL_MENU_TYPE_JUMP;
1013 battleStatus->stateFreezeCount = 1;
1014 }
1015 }
1016
1017 if (battleStatus->itemLossTurns >= 0) {
1018 battleStatus->itemLossTurns--;
1019 if (battleStatus->itemLossTurns == -1) {
1021 player->takeTurnScript = script;
1022 player->takeTurnScriptID = script->id;
1023 script->owner1.actorID = ACTOR_PLAYER;
1024 script->varTable[0] = temp;
1025 temp += 8;
1026 script->varTable[10] = BTL_MENU_TYPE_ITEMS;
1027 battleStatus->stateFreezeCount = 1;
1028 }
1029 }
1031 }
1032
1034 if (player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
1035 player->handleEventScript = NULL;
1036
1038 return;
1039 }
1040
1041 if (D_8029F258 != 0) {
1042 D_8029F258--;
1043 return;
1044 }
1045
1046 if (!D_8029F254) {
1048 } else{
1051 }
1052 }
1053 }
1054}
1055
1058
1061 Actor* partner = gBattleStatus.partnerActor;
1062 s32 i;
1063
1065 gBattleStatus.flags1 &= ~BS_FLAGS1_PARTNER_ACTING;
1067 gBattleStatus.selectedMoveID = MOVE_NONE;
1072 if (partner != NULL) {
1074 }
1075
1076 for (i = 0; i < ARRAY_COUNT(gBattleStatus.enemyActors); i++) {
1077 Actor* enemy = gBattleStatus.enemyActors[i];
1078
1079 if (enemy != NULL) {
1082 }
1083 }
1084
1086 }
1087}
1088
1091
1093 BattleStatus* battleStatus = &gBattleStatus;
1094 Actor* partner = battleStatus->partnerActor;
1095 Actor* enemy;
1096 Evt* script;
1097 s32 i;
1098
1100 if (partner == NULL) {
1101 D_8029F254 = TRUE;
1104 if (!(partner->flags & ACTOR_FLAG_NO_ATTACK)) {
1106 btl_cam_move(5);
1108 } else {
1110 return;
1111 }
1112 } else {
1114 return;
1115 }
1116 }
1117
1119 if (btl_cam_is_moving_done()) {
1120 D_8029F258 = 0;
1122 partner = battleStatus->partnerActor;
1123 battleStatus->actionResult = ACTION_RESULT_NONE;
1124 battleStatus->blockResult = BLOCK_RESULT_NONE;
1125 D_8029F254 = FALSE;
1129
1130 if (partner->koStatus != 0) {
1131 partner->koDuration--;
1132 D_8029F254 = TRUE;
1133 D_8029F258 = 20;
1134 if (partner->koDuration > 0) {
1135 partner->disableEffect->data.disableX->koDuration = partner->koDuration;
1136 } else {
1137 partner->koStatus = 0;
1139 partner->disableEffect->data.disableX->koDuration = 0;
1141 }
1142 }
1143
1144 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1145 enemy = battleStatus->enemyActors[i];
1146 if (enemy != NULL) {
1148 }
1149 }
1151 }
1152 }
1153
1155 if (partner != NULL) {
1156 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
1157 goto WAITING;
1158 }
1159 partner->handleEventScript = NULL;
1160 }
1161
1162 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
1164 return;
1165 }
1167 }
1168 WAITING:
1169
1171 if (partner->handlePhaseSource != NULL) {
1172 battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
1173 script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
1174 partner->handlePhaseScript = script;
1175 partner->handleBatttlePhaseScriptID = script->id;
1176 script->owner1.actorID = ACTOR_PARTNER;
1177 }
1179 }
1180
1182 if (partner->handlePhaseSource == NULL || !does_script_exist(partner->handleBatttlePhaseScriptID)) {
1184 }
1185 }
1186
1188 if (D_8029F258 != 0) {
1189 D_8029F258--;
1190 return;
1191 }
1192 gBattleStatus.flags2 &= ~BS_FLAGS2_NO_PLAYER_PAL_ADJUST;
1193 if (!D_8029F254) {
1195 } else {
1198 }
1199 }
1200}
1201
1204
1231
1234
1236 BattleStatus* battleStatus = &gBattleStatus;
1237 Actor* player = battleStatus->playerActor;
1238 Actor* partner = battleStatus->partnerActor;
1239 Actor* actor;
1240 ActorState* state;
1241 Evt* script;
1242 s32 waitingForScript;
1243 s32 i;
1244
1245 s32 oldKoDuration;
1246
1250 return;
1251 }
1252
1253 if (partner != NULL) {
1256 return;
1257 }
1258 }
1259
1260 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1262 if (partner != NULL) {
1263 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1265 }
1266
1268 D_8029F258 = 0;
1269 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
1270 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
1271 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
1272 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
1273 }
1274
1276 waitingForScript = FALSE;
1277 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1278 actor = battleStatus->enemyActors[i];
1279 if (actor != NULL && actor->handleEventScript != NULL) {
1281 waitingForScript = TRUE;
1282 } else {
1283 actor->handleEventScript = NULL;
1284 }
1285 }
1286 }
1287
1288 if (!waitingForScript) {
1290
1291 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1292 actor = battleStatus->enemyActors[i];
1293 if (actor != NULL) {
1295 actor->flags &= ~ACTOR_FLAG_SKIP_TURN;
1296
1297 if (actor->debuff != 0) {
1298 if (actor->debuff == STATUS_KEY_FEAR
1299 || actor->debuff == STATUS_KEY_DIZZY
1300 || actor->debuff == STATUS_KEY_PARALYZE
1301 || actor->debuff == STATUS_KEY_SLEEP
1302 || actor->debuff == STATUS_KEY_FROZEN
1303 || actor->debuff == STATUS_KEY_STOP
1304 ) {
1305 actor->flags |= ACTOR_FLAG_SKIP_TURN;
1306 }
1307 actor->debuffDuration--;
1308 if (actor->debuffDuration <= 0) {
1309 actor->debuff = 0;
1312 D_8029F258 = 20;
1313 }
1314 }
1315
1316 if (actor->staticStatus != 0) {
1317 actor->staticDuration--;
1318 if (actor->staticDuration <= 0) {
1319 actor->staticStatus = 0;
1321 D_8029F258 = 20;
1322 }
1323 }
1324
1325 if (actor->transparentStatus != 0) {
1326 actor->transparentDuration--;
1327 if (actor->transparentDuration <= 0) {
1328 actor->transparentStatus = 0;
1330 D_8029F258 = 20;
1331 }
1332 }
1333
1334 if (actor->stoneStatus != 0) {
1335 actor->stoneDuration--;
1336 if (actor->stoneDuration <= 0) {
1337 actor->stoneStatus = 0;
1338 D_8029F258 = 20;
1339 }
1340 }
1341
1342 oldKoDuration = actor->koDuration;
1343 actor->koDuration = actor->debuffDuration;
1344 if (actor->koDuration > 0) {
1345 actor->koStatus = STATUS_KEY_DAZE;
1347 } else if (oldKoDuration != actor->koDuration) {
1348 actor->koStatus = 0;
1350 }
1351 if (actor->debuff == STATUS_KEY_POISON) {
1354 D_8029F258 = 20;
1355 }
1356 }
1357 }
1359 }
1360 }
1361
1363 // wait for player HandleEvent script to finish
1364 if(player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
1365 goto WAITING;
1366 }
1367 player->handleEventScript = NULL;
1368
1369 // wait for partner HandleEvent script to finish
1370 if (partner != NULL) {
1371 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
1372 goto WAITING;
1373 }
1374 partner->handleEventScript = NULL;
1375 }
1376
1377 // wait for all enemy HandleEvent scripts to finish
1378 waitingForScript = FALSE;
1379
1380 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1381 actor = battleStatus->enemyActors[i];
1382 if (actor != NULL && actor->handleEventScript != NULL) {
1384 waitingForScript = TRUE;
1385 } else {
1386 actor->handleEventScript = NULL;
1387 }
1388 }
1389 }
1390
1391 if (waitingForScript) {
1392 goto WAITING;
1393 }
1394
1396 return;
1397 }
1398
1400 if (partner == NULL || !(gBattleStatus.flags1 & BS_FLAGS1_PLAYER_IN_BACK)) {
1404 } else {
1405 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1406 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1409 state = &partner->state;
1410 if (!battleStatus->outtaSightActive) {
1411 partner->state.curPos.x = partner->homePos.x;
1412 partner->state.curPos.z = partner->homePos.z;
1413 partner->state.goalPos.x = player->homePos.x;
1414 partner->state.goalPos.z = player->homePos.z;
1415 } else {
1416 partner->state.curPos.x = partner->homePos.x;
1417 partner->state.curPos.z = partner->homePos.z;
1418 partner->state.goalPos.x = partner->homePos.x;
1419 partner->state.goalPos.z = partner->homePos.z + 5.0f;
1420 partner->homePos.x = player->homePos.x;
1421 partner->homePos.z = player->homePos.z;
1422 }
1423 state->moveTime = 4;
1424 state->angle = 0.0f;
1426 }
1427 }
1428 WAITING:
1429
1431 if (partner->state.moveTime != 0) {
1432 partner->curPos.x += (partner->state.goalPos.x - partner->curPos.x) / partner->state.moveTime;
1433 partner->curPos.z += (partner->state.goalPos.z - partner->curPos.z) / partner->state.moveTime;
1434 player->curPos.x += (partner->state.curPos.x - player->curPos.x) / partner->state.moveTime;
1435 player->curPos.z += (partner->state.curPos.z - player->curPos.z) / partner->state.moveTime;
1436 }
1437 partner->curPos.z -= sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
1438 partner->yaw = clamp_angle(partner->state.angle);
1439 player->curPos.z += sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
1440 player->yaw = clamp_angle(partner->state.angle);
1441 partner->state.angle += 90.0f;
1442
1443 if (partner->state.moveTime != 0) {
1444 partner->state.moveTime--;
1445 } else {
1446 partner->curPos.x = partner->state.goalPos.x;
1447 partner->curPos.z = partner->state.goalPos.z;
1448 player->curPos.x = partner->state.curPos.x;
1449 player->curPos.z = partner->state.curPos.z;
1450 if (!battleStatus->outtaSightActive) {
1451 partner->homePos.x = partner->curPos.x;
1452 partner->homePos.z = partner->curPos.z;
1453 player->homePos.x = player->curPos.x;
1454 player->homePos.z = player->curPos.z;
1455 } else {
1456 player->homePos.x = player->curPos.x;
1457 player->homePos.z = player->curPos.z;
1458 }
1460 gBattleStatus.flags1 &= ~BS_FLAGS1_PLAYER_IN_BACK;
1461 }
1462 }
1463
1465 if (D_8029F258 != 0) {
1466 D_8029F258--;
1467 } else {
1468 if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_DEF_BOOST) {
1469 battleStatus->merleeDefenseBoost = 3;
1470 battleStatus->nextMerleeSpellType = MERLEE_SPELL_NONE;
1473 player->takeTurnScript = script;
1474 player->takeTurnScriptID = script->id;
1475 script->owner1.actorID = ACTOR_PLAYER;
1476 }
1477 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
1478 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1480 if (partner != NULL) {
1481 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1483 }
1485 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
1486 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
1487 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
1488 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
1489 }
1490 }
1491
1493 if (player->takeTurnScript == NULL || (does_script_exist(player->takeTurnScriptID) == 0)) {
1494 player->takeTurnScript = NULL;
1495
1496 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1497 actor = battleStatus->enemyActors[i];
1498 if (actor != NULL && actor->handlePhaseSource != NULL) {
1499 battleStatus->battlePhase = PHASE_PLAYER_END;
1500 script = start_script(actor->handlePhaseSource, EVT_PRIORITY_A, 0);
1501 actor->handlePhaseScript = script;
1502 actor->handleBatttlePhaseScriptID = script->id;
1503 script->owner1.enemyID = i | ACTOR_CLASS_ENEMY;
1504 }
1505 }
1507 }
1508 }
1509
1510 waitingForScript = FALSE;
1512 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1513 actor = battleStatus->enemyActors[i];
1514 if (actor != NULL && actor->handlePhaseSource != NULL && does_script_exist(actor->handleBatttlePhaseScriptID)) {
1515 waitingForScript = TRUE;
1516 }
1517 }
1518 if (!waitingForScript) {
1520 }
1521 }
1522
1525 }
1526}
1527
1529}
1530
1556
1559
1561 BattleStatus* battleStatus = &gBattleStatus;
1562 PlayerData* playerData = &gPlayerData;
1563 Actor* player = battleStatus->playerActor;
1564 Actor* partner = battleStatus->partnerActor;
1565 Actor* actor;
1566 Evt* script;
1567 s32 i;
1568
1570 s32 cond = FALSE;
1571
1572 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1573 actor = battleStatus->enemyActors[i];
1574 if (actor != NULL && actor->handleEventScript != NULL) {
1576 cond = TRUE;
1577 } else {
1578 actor->handleEventScript = NULL;
1579 }
1580 }
1581 }
1582
1583 if (!cond) {
1584 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1585 actor = battleStatus->enemyActors[i];
1586 if (actor != NULL && actor->takeTurnScript != NULL) {
1587 if (does_script_exist(actor->takeTurnScriptID)) {
1588 cond = TRUE;
1589 } else {
1590 actor->takeTurnScript = NULL;
1591 }
1592 }
1593 }
1594
1595 if (!cond) {
1598 }
1599 }
1600 }
1601
1607 } else {
1608 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1609 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
1612 partner->state.curPos.x = partner->homePos.x;
1613 partner->state.curPos.z = partner->homePos.z;
1614 partner->state.goalPos.x = player->homePos.x;
1615 partner->state.goalPos.z = player->homePos.z;
1616 partner->state.moveTime = 4;
1617 partner->state.angle = 0.0f;
1619 }
1620 }
1621
1623 if (partner->state.moveTime != 0) {
1624 partner->curPos.x += (partner->state.goalPos.x - partner->curPos.x) / partner->state.moveTime;
1625 partner->curPos.z += (partner->state.goalPos.z - partner->curPos.z) / partner->state.moveTime;
1626 player->curPos.x += (partner->state.curPos.x - player->curPos.x) / partner->state.moveTime;
1627 player->curPos.z += (partner->state.curPos.z - player->curPos.z) / partner->state.moveTime;
1628 }
1629 partner->curPos.z -= sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
1630 partner->yaw = clamp_angle(partner->state.angle);
1631 player->curPos.z += sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
1632 player->yaw = clamp_angle(partner->state.angle);
1633 partner->state.angle += 90.0f;
1634 if (partner->state.moveTime != 0) {
1635 partner->state.moveTime--;
1636 } else {
1637 partner->curPos.x = partner->state.goalPos.x;
1638 partner->curPos.z = partner->state.goalPos.z;
1639 player->curPos.x = partner->state.curPos.x;
1640 player->curPos.z = partner->state.curPos.z;
1641 partner->homePos.x = partner->curPos.x;
1642 partner->homePos.z = partner->curPos.z;
1643 player->homePos.x = player->curPos.x;
1644 player->homePos.z = player->curPos.z;
1649 } else {
1650 gBattleStatus.flags1 &= ~BS_FLAGS1_PLAYER_IN_BACK;
1651 }
1653 }
1654 }
1655
1657 gBattleStatus.flags2 &= ~BS_FLAGS2_HIDE_BUFF_COUNTERS;
1658 player->disableDismissTimer = 0;
1660 if (partner != NULL) {
1662 partner->disableDismissTimer = 0;
1663 }
1664
1666 gBattleStatus.flags1 &= ~BS_FLAGS1_PLAYER_DEFENDING;
1667 playerData->starPower += SP_PER_SEG;
1668 if (playerData->starPower > playerData->maxStarPower * SP_PER_BAR) {
1669 playerData->starPower = playerData->maxStarPower * SP_PER_BAR;
1670 }
1671
1672 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1673 actor = battleStatus->enemyActors[i];
1674 if (actor != NULL && actor->handlePhaseSource != NULL) {
1675 battleStatus->battlePhase = PHASE_ENEMY_END;
1676 script = start_script(actor->handlePhaseSource, EVT_PRIORITY_A, 0);
1677 actor->handlePhaseScript = script;
1678 actor->handleBatttlePhaseScriptID = script->id;
1679 script->owner1.enemyID = i | ACTOR_ENEMY0;
1680 }
1681 }
1682
1683 if (partner != NULL && partner->handlePhaseSource != NULL) {
1684 battleStatus->battlePhase = PHASE_ENEMY_END;
1685 script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
1686 partner->handlePhaseScript = script;
1687 partner->handleBatttlePhaseScriptID = script->id;
1688 script->owner1.actorID = ACTOR_PARTNER;
1689 }
1691 }
1692
1693 // wait for all end turn scripts to finish executing
1695 s32 cond = FALSE;
1696
1697 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
1698 actor = battleStatus->enemyActors[i];
1699 if (actor != NULL && actor->handlePhaseSource != NULL && does_script_exist(actor->handleBatttlePhaseScriptID)) {
1700 cond = TRUE;
1701 }
1702 }
1703
1704 if (partner != NULL && partner->handlePhaseSource != NULL && does_script_exist(partner->handleBatttlePhaseScriptID)) {
1705 cond = TRUE;
1706 }
1707
1708 if (!cond) {
1711 }
1712 }
1713
1714 // proceed to next turn
1715 switch (gBattleSubState) {
1719 break;
1720 }
1721}
1722
1724}
1725
1730
1732}
1733
1735 BattleStatus* battleStatus = &gBattleStatus;
1736 EncounterStatus* currentEncounter = &gCurrentEncounter;
1737 PlayerData* playerData = &gPlayerData;
1738 Actor* player = battleStatus->playerActor;
1739 Actor* partner = battleStatus->partnerActor;
1740 Evt* script;
1741
1742 switch (gBattleSubState) {
1745 if (partner != NULL) {
1747 }
1748
1749 battleStatus->stateFreezeCount = 0;
1750 if (battleStatus->outtaSightActive == 0) {
1752 } else {
1753 if (battleStatus->outtaSightActive > 0) {
1754 D_8029F254 = TRUE;
1755 }
1756 battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
1757 script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
1758 partner->handlePhaseScript = script;
1759 partner->handleBatttlePhaseScriptID = script->id;
1760 script->owner1.actorID = ACTOR_PARTNER;
1762 }
1763
1764 break;
1767 battleStatus->outtaSightActive = 0;
1769 }
1770 break;
1771 }
1772
1773 switch (gBattleSubState) {
1776 if (partner != NULL) {
1778 }
1780 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
1781 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
1782 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
1783 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
1784
1785 gBattleStatus.flags1 &= ~BS_FLAGS1_SHOW_PLAYER_DECORATIONS;
1786 if (player->koStatus == STATUS_KEY_DAZE) {
1789 }
1790 player->debuff = 0;
1791 player->staticStatus = 0;
1792 player->stoneStatus = 0;
1793 player->transparentStatus = 0;
1794 player->koStatus = 0;
1795 player->koDuration = 0;
1796 player->disableEffect->data.disableX->koDuration = 0;
1797
1798 if (partner != NULL) {
1799 if (partner->koStatus == STATUS_KEY_DAZE) {
1802 }
1803 partner->debuff = 0;
1804 partner->staticStatus = 0;
1805 partner->stoneStatus = 0;
1806 partner->transparentStatus = 0;
1807 partner->koStatus = 0;
1808 partner->koDuration = 0;
1809 partner->disableEffect->data.disableX->koDuration = 0;
1810 }
1811 break;
1813 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
1814 break;
1815 }
1816 player->handleEventScript = NULL;
1817
1818 if (partner != NULL) {
1819 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
1820 break;
1821 }
1822 partner->handleEventScript = NULL;
1823 }
1825 break;
1826 }
1827
1829 if (partner == NULL || !(gBattleStatus.flags1 & BS_FLAGS1_PLAYER_IN_BACK)) {
1831 } else {
1832 partner->state.curPos.x = partner->curPos.x;
1833 partner->state.curPos.z = partner->curPos.z;
1834 partner->state.goalPos.x = player->curPos.x;
1835 partner->state.goalPos.z = player->curPos.z;
1836 partner->state.moveTime = 4;
1837 partner->state.angle = 0.0f;
1839 }
1840 }
1841
1843 if (partner->state.moveTime != 0) {
1844 partner->curPos.x += (partner->state.goalPos.x - partner->curPos.x) / partner->state.moveTime;
1845 partner->curPos.z += (partner->state.goalPos.z - partner->curPos.z) / partner->state.moveTime;
1846 player->curPos.x += (partner->state.curPos.x - player->curPos.x) / partner->state.moveTime;
1847 player->curPos.z += (partner->state.curPos.z - player->curPos.z) / partner->state.moveTime;
1848 }
1849 partner->curPos.z += sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
1850 partner->yaw = clamp_angle(-partner->state.angle);
1851 player->curPos.z -= sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
1852 player->yaw = clamp_angle(-partner->state.angle);
1853 partner->state.angle += 90.0f;
1854
1855 if (partner->state.moveTime != 0) {
1856 partner->state.moveTime--;
1857 } else {
1858 partner->curPos.x = partner->state.goalPos.x;
1859 partner->curPos.z = partner->state.goalPos.z;
1860 player->curPos.x = partner->state.curPos.x;
1861 player->curPos.z = partner->state.curPos.z;
1862 partner->homePos.x = partner->curPos.x;
1863 partner->homePos.z = partner->curPos.z;
1864 player->homePos.x = player->curPos.x;
1865 player->homePos.z = player->curPos.z;
1867 gBattleStatus.flags1 &= ~BS_FLAGS1_PLAYER_IN_BACK;
1868 }
1869 }
1870
1873 if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_EXP_BOOST) {
1874 if (battleStatus->totalStarPoints == 0) {
1875 battleStatus->nextMerleeSpellType = MERLEE_SPELL_NONE;
1876 playerData->merleeTurnCount = 0;
1877 playerData->merleeCastsLeft++;
1878 } else {
1879 battleStatus->battlePhase = PHASE_MERLEE_EXP_BONUS;
1881 player->takeTurnScript = script;
1882 player->takeTurnScriptID = script->id;
1883 script->owner1.actorID = ACTOR_PLAYER;
1884 }
1885 }
1888 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
1889 }
1890
1892 if (BattleSubStateDelay != 0) {
1894 } else {
1895 if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnScriptID)) {
1896 player->takeTurnScript = NULL;
1897 if (battleStatus->nextMerleeSpellType != MERLEE_SPELL_EXP_BOOST) {
1899 } else {
1900 battleStatus->incrementStarPointDelay = 20;
1901 battleStatus->nextMerleeSpellType = MERLEE_SPELL_NONE;
1903 battleStatus->pendingStarPoints = battleStatus->totalStarPoints
1904 + battleStatus->pendingStarPoints + battleStatus->pendingStarPoints;
1905 }
1906 }
1907 }
1908 }
1909
1911 if (battleStatus->pendingStarPoints <= 0) {
1913 gBattleStatus.flags1 &= ~BS_FLAGS1_BATTLE_FLED;
1914 }
1915 if (playerData->battlesWon < 9999) {
1916 playerData->battlesWon++;
1917 }
1919 currentEncounter->battleOutcome = OUTCOME_ENEMY_FLED;
1920 } else {
1921 currentEncounter->battleOutcome = OUTCOME_PLAYER_WON;
1922 }
1925 bgm_set_song(0, -1, 0, 1500, 8);
1926 }
1928 } else {
1930 }
1931 }
1932 }
1933}
1934
1936}
1937
1939 BattleStatus* battleStatus = &gBattleStatus;
1940 PlayerData* playerData = &gPlayerData;
1941 EncounterStatus* encounterStatus = &gCurrentEncounter;
1943 Actor* partner = gBattleStatus.partnerActor;
1944 Evt* script;
1945
1946 switch (gBattleSubState) {
1949 if (partner != NULL) {
1951 }
1953 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
1954 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
1955 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
1956 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
1957
1958 if (player->koStatus == STATUS_KEY_DAZE) {
1961 }
1962 player->debuff = 0;
1963 player->staticStatus = 0;
1964 player->stoneStatus = 0;
1965 player->transparentStatus = 0;
1966 player->koStatus = 0;
1967 player->koDuration = 0;
1968 player->disableEffect->data.disableX->koDuration = 0;
1969 if (partner != NULL) {
1970 if (partner->koStatus == STATUS_KEY_DAZE) {
1973 }
1974 partner->debuff = 0;
1975 partner->staticStatus = 0;
1976 partner->stoneStatus = 0;
1977 partner->transparentStatus = 0;
1978 partner->koStatus = 0;
1979 partner->koDuration = 0;
1980 partner->disableEffect->data.disableX->koDuration = 0;
1981 }
1982 break;
1984 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
1985 break;
1986 }
1987 player->handleEventScript = NULL;
1988
1989 if (partner != NULL) {
1990 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
1991 break;
1992 }
1993 partner->handleEventScript = NULL;
1994 }
1995
1997 break;
1998 }
1999
2000 switch (gBattleSubState) {
2002 battleStatus->stateFreezeCount = 0;
2003 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
2004 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
2005 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
2006 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
2007
2008 if (!battleStatus->outtaSightActive) {
2010 } else {
2011 battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
2012 script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
2013 partner->handlePhaseScript = script;
2014 partner->handleBatttlePhaseScriptID = script->id;
2015 script->owner1.actorID = ACTOR_PARTNER;
2017 }
2018 break;
2021 battleStatus->outtaSightActive = FALSE;
2023 }
2024 break;
2025 }
2026
2027 switch (gBattleSubState) {
2032 break;
2034 if (BattleSubStateDelay != 0) {
2036 return;
2037 }
2038 if (playerData->trainingsDone < 9999) {
2039 playerData->trainingsDone++;
2040 }
2041 encounterStatus->battleOutcome = OUTCOME_ENEMY_FLED;
2043 bgm_set_song(0, -1, 0, 1500, 8);
2044 }
2046 break;
2047 }
2048}
2049
2052
2054 EncounterStatus* encounterStatus = &gCurrentEncounter;
2055 BattleStatus* battleStatus = &gBattleStatus;
2056 Battle* battle = gCurrentBattlePtr;
2057 Stage* stage;
2058 Evt* script;
2059 s32 i;
2060
2061 switch (gBattleSubState) {
2065 BattleScreenFadeAmt = 255;
2066 }
2072 }
2074 break;
2076 if (BattleScreenFadeAmt == 255) {
2078 break;
2079 }
2081 if (BattleScreenFadeAmt > 255) {
2082 BattleScreenFadeAmt = 255;
2083 }
2084 break;
2086 BattleScreenFadeAmt = 255;
2087 gBattleStatus.flags1 &= ~BS_FLAGS1_ACTORS_VISIBLE;
2088 if (gCurrentStagePtr == NULL) {
2089 stage = battle->stage;
2090 } else {
2091 stage = gCurrentStagePtr->stage;
2092 }
2093 if (stage->postBattle == NULL) {
2095 return;
2096 }
2097 script = start_script(stage->postBattle, EVT_PRIORITY_A, 0);
2098 battleStatus->controlScript = script;
2099 battleStatus->controlScriptID = script->id;
2101 break;
2103 if (does_script_exist(battleStatus->controlScriptID)) {
2104 break;
2105 }
2107 // fallthrough
2110 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2111 if (battleStatus->enemyActors[i] != NULL) {
2112 btl_delete_actor(battleStatus->enemyActors[i]);
2113 }
2114 }
2115 if (battleStatus->partnerActor != NULL) {
2116 btl_delete_actor(battleStatus->partnerActor);
2117 }
2118
2119 btl_delete_player_actor(battleStatus->playerActor);
2120
2121 if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_COIN_BOOST) {
2122 encounterStatus->hasMerleeCoinBonus = TRUE;
2123 battleStatus->nextMerleeSpellType = MERLEE_SPELL_NONE;
2124 }
2125
2126 encounterStatus->damageTaken = battleStatus->damageTaken;
2127
2129 encounterStatus->dropWhackaBump = TRUE;
2130 }
2131
2134
2137 }
2138
2139 if (encounterStatus->battleOutcome == OUTCOME_PLAYER_LOST &&
2141 {
2142 s16 areaID;
2143 s16 mapID;
2144
2147 get_map_IDs_by_name_checked("gv_01", &areaID, &mapID);
2148 gGameStatusPtr->areaID = areaID;
2149 gGameStatusPtr->mapID = mapID;
2152 } else {
2155 func_8003E514(1);
2157 }
2158 break;
2159 }
2160}
2161
2172
2175 Evt* script;
2176
2177 switch (gBattleSubState) {
2182 player->takeTurnScriptID = script->id;
2184 script->owner1.actorID = ACTOR_PLAYER;
2185 break;
2189 }
2190 break;
2191 }
2192}
2193
2195}
2196
2198 BattleStatus* battleStatus = &gBattleStatus;
2199 PlayerData* playerData = &gPlayerData;
2200 EncounterStatus* currentEncounter = &gCurrentEncounter;
2201 Actor* player = battleStatus->playerActor;
2202 Actor* partner = battleStatus->partnerActor;
2203 Actor* enemy;
2204 s32 enemyCount;
2205 f32 totalEscapeChance;
2206 Evt* script;
2207 s32 i;
2208
2209 switch (gBattleSubState) {
2211 battleStatus->stateFreezeCount = 0;
2212 gBattleStatus.flags1 &= ~BS_FLAGS1_BATTLE_FLED;
2217
2218 playerData->fleeAttempts++;
2221
2222 // calculate average escape chance
2223 enemyCount = 0;
2224 totalEscapeChance = 0.0f;
2225
2226 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2227 enemy = battleStatus->enemyActors[i];
2228 if (enemy != NULL) {
2229 if (!(enemy->flags & ACTOR_FLAG_TARGET_ONLY)) {
2230 if (!(enemy->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
2231 f32 escapeChance = enemy->actorBlueprint->escapeChance;
2232
2233 if (enemy->debuff == STATUS_KEY_FEAR ||
2234 enemy->debuff == STATUS_KEY_DIZZY ||
2235 enemy->debuff == STATUS_KEY_PARALYZE ||
2236 enemy->debuff == STATUS_KEY_SLEEP ||
2237 enemy->debuff == STATUS_KEY_FROZEN ||
2238 enemy->debuff == STATUS_KEY_STOP)
2239 {
2240 escapeChance = 100.0f;
2241 }
2242 totalEscapeChance += escapeChance;
2243 enemyCount++;
2244 }
2245 }
2246 }
2247 }
2248 player->state.varTable[0] = totalEscapeChance / enemyCount;
2249
2251 player->state.varTable[0] = 100;
2252 }
2253
2254 battleStatus->battlePhase = PHASE_RUN_AWAY_START;
2256 player->takeTurnScript = script;
2257 player->takeTurnScriptID = script->id;
2258 script->owner1.actorID = ACTOR_PLAYER;
2259 if (partner != NULL && partner->koStatus == 0) {
2260 script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
2261 partner->takeTurnScript = script;
2262 partner->takeTurnScriptID = script->id;
2263 script->owner1.actorID = ACTOR_PARTNER;
2264 }
2266 break;
2268 if (does_script_exist(player->takeTurnScriptID) || battleStatus->stateFreezeCount != 0) {
2269 break;
2270 }
2273 } else {
2274 currentEncounter->battleOutcome = OUTCOME_PLAYER_FLED;
2277 } else {
2279 func_8023E104();
2280 D_8029F264 = 0;
2281 D_8029F24C = 0;
2283 // divide reward into 20 increments
2284 RunAwayRewardTotal = battleStatus->totalStarPoints * 100;
2285 RunAwayRewardStep = 20;
2288 }
2289 }
2290 break;
2291 }
2292
2294 if (battleStatus->totalStarPoints != 0) {
2295 s32 deltaSP;
2296 s32 prevSP;
2297
2299 prevSP = battleStatus->totalStarPoints;
2300 battleStatus->totalStarPoints = RunAwayRewardTotal / 100;
2301 deltaSP = prevSP - battleStatus->totalStarPoints;
2302
2303 if (deltaSP > 0) {
2305 }
2306 playerData->starPoints += deltaSP;
2308 if (RunAwayRewardStep == 0 && battleStatus->totalStarPoints != 0) {
2309 playerData->starPoints++;
2310 }
2311 }
2312 if (playerData->starPoints >= 99) {
2313 playerData->starPoints = 99;
2314 }
2315 if (battleStatus->totalStarPoints == 0) {
2316 if (RunAwayRewardStep != 0) {
2318 } else {
2320 func_8023E11C();
2322 }
2323 }
2324 }
2325
2327 playerData->battlesFled++;
2329 bgm_set_song(0, -1, 0, 1500, 8);
2330 }
2332 }
2333
2334 switch (gBattleSubState) {
2336 battleStatus->battlePhase = PHASE_RUN_AWAY_FAIL;
2338 player->takeTurnScript = script;
2339 player->takeTurnScriptID = script->id;
2340 script->owner1.actorID = ACTOR_PLAYER;
2341 if (partner != NULL && partner->koStatus == 0) {
2342 script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
2343 partner->takeTurnScript = script;
2344 partner->takeTurnScriptID = script->id;
2345 script->owner1.actorID = ACTOR_PARTNER;
2346 }
2348 break;
2350 if (BattleSubStateDelay != 0) {
2352 return;
2353 }
2355 && (partner == NULL || !does_script_exist(partner->takeTurnScriptID))
2356 && battleStatus->stateFreezeCount == 0
2357 ) {
2359 }
2360 break;
2361 }
2362}
2363
2365}
2366
2368 BattleStatus* battleStatus = &gBattleStatus;
2369 EncounterStatus* currentEncounter = &gCurrentEncounter;
2370 Actor* player = battleStatus->playerActor;
2371 Actor* partner = battleStatus->partnerActor;
2372 Evt* script;
2373
2374 switch (gBattleSubState) {
2376 battleStatus->flags1 &= ~BS_FLAGS1_SHOW_PLAYER_DECORATIONS;
2377 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
2378 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
2379 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
2380 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
2381 battleStatus->stateFreezeCount = 0;
2382
2383 if (player->debuff != 0) {
2384 if (player->debuff == STATUS_KEY_FROZEN) {
2387 player->icePillarEffect = NULL;
2388 }
2389 player->debuff = 0;
2390 player->debuffDuration = 0;
2392 player->koStatus = 0;
2393 player->koDuration = 0;
2394 player->disableEffect->data.disableX->koDuration = 0;
2395 }
2396
2399 battleStatus->battlePhase = PHASE_DEATH;
2401 player->takeTurnScript = script;
2402 player->takeTurnScriptID = script->id;
2403 script->owner1.actorID = ACTOR_PLAYER;
2404
2405 if (partner != NULL) {
2406 script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
2407 partner->takeTurnScript = script;
2408 partner->takeTurnScriptID = script->id;
2409 script->owner1.actorID = ACTOR_PARTNER;
2410 }
2412 break;
2414 if (does_script_exist(player->takeTurnScriptID) || battleStatus->stateFreezeCount != 0) {
2415 break;
2416 }
2417 if (find_item(ITEM_LIFE_SHROOM) >= 0) {
2418 battleStatus->battlePhase = PHASE_USE_LIFE_SHROOM;
2420 player->takeTurnScript = script;
2421 player->takeTurnScriptID = script->id;
2422 script->owner1.actorID = ACTOR_PLAYER;
2424 } else {
2426 }
2427 break;
2429 if (does_script_exist(player->takeTurnScriptID) || battleStatus->stateFreezeCount != 0) {
2430 break;
2431 }
2432 // never reached if life shroom is successful. its item script calls RestorePreDefeatState,
2433 // resetting the state to BATTLE_STATE_ENEMY_MOVE (based on the value of gDefeatedBattleState)
2435 break;
2436 }
2437
2439 currentEncounter->battleOutcome = OUTCOME_PLAYER_LOST;
2441 bgm_set_song(0, -1, 0, 1500, 8);
2442 }
2444 }
2445}
2446
2448}
2449
2450API_CALLABLE(EnablePartnerBlur) {
2452 return ApiStatus_DONE2;
2453}
2454
2455API_CALLABLE(DisablePartnerBlur) {
2457 return ApiStatus_DONE2;
2458}
2459
2461 BattleStatus* battleStatus = &gBattleStatus;
2462 Actor* player = battleStatus->playerActor;
2463 Actor* partner = battleStatus->partnerActor;
2464 ActorState* state = &player->state;
2465 PlayerData* playerData = &gPlayerData;
2466 Actor* enemyActor;
2467 Evt* script;
2468 s32 i;
2469
2470 switch (gBattleSubState) {
2472 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2473 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2474 battleStatus->stateFreezeCount = 0;
2477 btl_cam_set_target_pos(-89.0, 40.0, -99.0);
2478 btl_cam_set_zoom(372);
2480 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
2481
2482 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2483 enemyActor = battleStatus->enemyActors[i];
2484 if (enemyActor != NULL) {
2485 enemyActor->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
2486 enemyActor->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2487 }
2488 }
2489
2490 battleStatus->lastPartnerMenuSelection[BTL_MENU_IDX_MAIN] = -1;
2493
2495 if (BattleSubStateDelay != 0) {
2497 break;
2498 }
2501 battleStatus->controlScript = script;
2502 battleStatus->controlScriptID = script->id;
2503 script->owner1.actorID = ACTOR_PARTNER;
2504 state->unk_18.x = partner->curPos.x;
2505 state->unk_18.y = 0.0f;
2506 state->unk_18.z = partner->curPos.z;
2508 break;
2510 if (does_script_exist(battleStatus->controlScriptID)) {
2511 break;
2512 }
2513 btl_delete_actor(partner);
2514 playerData->curPartner = battleStatus->unk_1AC;
2516 partner = battleStatus->partnerActor;
2517 partner->scale.x = 0.1f;
2518 partner->scale.y = 0.1f;
2519 partner->scale.z = 0.1f;
2520 partner->state.goalPos.x = state->unk_18.x;
2521 partner->state.goalPos.y = partner->curPos.y;
2522 partner->state.goalPos.z = state->unk_18.z;
2523 partner->curPos.x = player->curPos.x;
2524 partner->curPos.y = player->curPos.y + 25.0f;
2525 partner->curPos.z = player->curPos.z;
2527 break;
2529 partner = battleStatus->partnerActor;
2530 if (partner != NULL) {
2531 if (does_script_exist(partner->takeTurnScriptID)) {
2532 break;
2533 }
2534 partner->takeTurnScript = NULL;
2535 }
2536
2538 battleStatus->controlScript = script;
2539 battleStatus->controlScriptID = script->id;
2540 script->owner1.actorID = ACTOR_PARTNER;
2542 break;
2544 if (does_script_exist(battleStatus->controlScriptID)) {
2545 break;
2546 }
2547 partner = battleStatus->partnerActor;
2548 if (partner != NULL) {
2549 if (partner->handlePhaseSource != NULL) {
2550 battleStatus->battlePhase = PHASE_PLAYER_BEGIN;
2551 script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
2552 partner->handlePhaseScript = script;
2553 partner->handleBatttlePhaseScriptID = script->id;
2554 script->owner1.actorID = ACTOR_PARTNER;
2555 }
2556 }
2558 break;
2560 partner = battleStatus->partnerActor;
2561 if (partner != NULL) {
2562 if (partner->handlePhaseSource != NULL && does_script_exist(partner->handleBatttlePhaseScriptID)) {
2563 break;
2564 }
2565 }
2568 break;
2570 if (battleStatus->stateFreezeCount != 0) {
2571 break;
2572 }
2573 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
2577 } else {
2579 }
2580 } else {
2583 } else {
2585 }
2586 }
2587 break;
2588 }
2589}
2590
2593
2595 BattleStatus* battleStatus = &gBattleStatus;
2596 Actor* player = battleStatus->playerActor;
2597 Actor* partner = battleStatus->partnerActor;
2598 s32 messageIndex;
2599 Actor* actor;
2600 Evt* script;
2601 s32 enemyNotDone;
2602 s8 tipIndex;
2603 s32 i;
2604
2606 battleStatus->stateFreezeCount = 0;
2607 battleStatus->actionResult = ACTION_RESULT_NONE;
2608 battleStatus->blockResult = BLOCK_RESULT_NONE;
2609 battleStatus->lastAttackDamage = 0;
2610 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
2611 gBattleStatus.flags1 &= ~BS_FLAGS1_AUTO_SUCCEED_ACTION;
2612 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
2614 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2615 if (partner != NULL) {
2616 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2617 }
2619 gBattleStatus.flags1 &= ~BS_FLAGS1_SHOW_PLAYER_DECORATIONS;
2620 player->statusAfflicted = 0;
2622 gBattleStatus.flags1 &= ~BS_FLAGS1_YIELD_TURN;
2623
2624 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2625 actor = battleStatus->enemyActors[i];
2626 if (actor != NULL) {
2627 actor->statusAfflicted = 0;
2628 }
2629 }
2630
2631 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2632 actor = battleStatus->enemyActors[i];
2633 if (actor != NULL) {
2634 actor->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
2635 actor->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
2636 }
2637 }
2638
2639 if (battleStatus->moveCategory == BTL_MENU_TYPE_JUMP || battleStatus->moveCategory == BTL_MENU_TYPE_SMASH) {
2640 if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_ATK_BOOST) {
2641 battleStatus->merleeAttackBoost = 3;
2642 battleStatus->nextMerleeSpellType = MERLEE_SPELL_NONE;
2643 battleStatus->battlePhase = PHASE_MERLEE_ATTACK_BONUS;
2645 player->takeTurnScript = script;
2646 player->takeTurnScriptID = script->id;
2647 script->owner1.actorID = ACTOR_PLAYER;
2651 } else {
2653 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
2654 }
2655 } else {
2657 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
2658 }
2659 }
2660
2661 switch (gBattleSubState) {
2663 if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
2664 break;
2665 }
2666 player->takeTurnScript = NULL;
2668 if (battleStatus->selectedMoveID != MOVE_NONE) {
2669 tipIndex = gMoveTable[battleStatus->selectedMoveID].actionTip;
2670 if (tipIndex >= 0) {
2672 }
2673 }
2674 }
2677 break;
2679 if (BattleSubStateDelay != 0) {
2681 } else {
2683 }
2684 break;
2685 }
2686
2687 switch (gBattleSubState) {
2689 gBattleStatus.flags1 &= ~BS_FLAGS1_4000;
2690 gBattleStatus.flags1 &= ~BS_FLAGS1_10000;
2693 reset_all_actor_sounds(player);
2694 battleStatus->battlePhase = PHASE_EXECUTE_ACTION;
2697 } else {
2699 }
2700 player->takeTurnScript = script;
2702 player->takeTurnScriptID = script->id;
2703 script->owner1.actorID = ACTOR_PLAYER;
2704 break;
2706 // wait for player battle phase script to finish
2708 if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
2709 break;
2710 }
2711 player->takeTurnScript = NULL;
2712 }
2713
2714 gBattleStatus.flags1 &= ~BS_FLAGS1_EXECUTING_MOVE;
2715
2716 // wait for player battle event script to finish
2717 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
2718 break;
2719 }
2720 player->handleEventScript = NULL;
2721
2722 // wait for partner battle event script to finish
2723 if (partner != NULL) {
2724 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
2725 break;
2726 }
2727 partner->handleEventScript = NULL;
2728 }
2729
2730 // wait for all enemy battle phase scripts to finish
2731 enemyNotDone = FALSE;
2732 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2733 actor = battleStatus->enemyActors[i];
2734 if (actor != NULL && actor->takeTurnScript != NULL) {
2735 if (does_script_exist(actor->takeTurnScriptID)) {
2736 enemyNotDone = TRUE;
2737 } else {
2738 actor->takeTurnScript = NULL;
2739 }
2740 }
2741 }
2742 if (enemyNotDone) {
2743 break;
2744 }
2745
2746 // wait for all enemy battle event scripts to finish
2747 enemyNotDone = FALSE;
2748 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2749 actor = battleStatus->enemyActors[i];
2750 if (actor != NULL && actor->handleEventScript != NULL) {
2752 enemyNotDone = TRUE;
2753 } else {
2754 actor->handleEventScript = NULL;
2755 }
2756 }
2757 }
2758 if (enemyNotDone) {
2759 break;
2760 }
2761
2762 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2763 actor = battleStatus->enemyActors[i];
2764 if (actor != NULL) {
2765 actor->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
2766 }
2767 }
2768
2769 if (battleStatus->stateFreezeCount != 0) {
2770 break;
2771 }
2772
2775 break;
2776 }
2777
2780 gBattleStatus.flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER;
2782 return;
2783 }
2784
2785 if ((battleStatus->moveCategory == BTL_MENU_TYPE_SMASH)
2786 && (battleStatus->selectedMoveID != MOVE_SMASH_CHARGE0)
2787 && (battleStatus->selectedMoveID != MOVE_SMASH_CHARGE)
2788 && (battleStatus->selectedMoveID != MOVE_SUPER_SMASH_CHARGE)
2789 ) {
2790 gBattleStatus.flags1 &= ~BS_FLAGS1_HAMMER_CHARGED;
2791 }
2792
2793 if ((battleStatus->moveCategory == BTL_MENU_TYPE_JUMP)
2794 && (battleStatus->selectedMoveID != MOVE_JUMP_CHARGE0)
2795 && (battleStatus->selectedMoveID != MOVE_JUMP_CHARGE)
2796 && (battleStatus->selectedMoveID != MOVE_SUPER_JUMP_CHARGE)
2797 ) {
2798 gBattleStatus.flags1 &= ~BS_FLAGS1_JUMP_CHARGED;
2799 }
2800
2802 battleStatus->jumpCharge = 0;
2803 }
2805 battleStatus->hammerCharge = 0;
2806 }
2807
2808 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2809 actor = battleStatus->enemyActors[i];
2810 if (actor != NULL && !(actor->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
2812 }
2813 }
2814
2816
2817 enemyNotDone = FALSE;
2818 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2819 actor = battleStatus->enemyActors[i];
2820 if (actor != NULL) {
2821 if (actor->statusAfflicted != 0) {
2822 enemyNotDone = TRUE;
2823 break;
2824 }
2825 }
2826 }
2827
2828 if (!enemyNotDone) {
2830 } else {
2832 switch (actor->statusAfflicted) {
2833 case 4:
2834 messageIndex = BTL_MSG_ENEMY_DAZED;
2835 break;
2836 case 6:
2837 messageIndex = BTL_MSG_ENEMY_ASLEEP;
2838 break;
2839 case 7:
2840 messageIndex = BTL_MSG_ENEMY_FROZEN;
2841 break;
2842 case 9:
2843 messageIndex = BTL_MSG_ENEMY_POISONED;
2844 break;
2845 case 10:
2846 messageIndex = BTL_MSG_ENEMY_SHRUNK;
2847 break;
2848 case 5:
2849 messageIndex = BTL_MSG_ENEMY_PARALYZED;
2850 break;
2851 case 11:
2852 messageIndex = BTL_MSG_ENEMY_ELECTRIFIED;
2853 break;
2854 case 8:
2855 messageIndex = BTL_MSG_ENEMY_CANT_MOVE;
2856 break;
2857 default:
2858 messageIndex = 0;
2860 break;
2861 }
2863 btl_show_battle_message(messageIndex, 60);
2864 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
2865 actor = battleStatus->enemyActors[i];
2866 if (actor != NULL) {
2867 actor->statusAfflicted = 0;
2868 }
2869 }
2871 }
2872 break;
2874 if (!btl_is_popup_displayed()) {
2876 btl_cam_move(15);
2879 }
2880 break;
2882 if (BattleSubStateDelay != 0) {
2884 } else {
2886 }
2887 break;
2888 }
2889
2890 switch (gBattleSubState) {
2892 if (player->statusAfflicted != 0) {
2894 switch (player->statusAfflicted) {
2895 case 4:
2896 messageIndex = BTL_MSG_PLAYER_DAZED;
2897 break;
2898 case 6:
2899 messageIndex = BTL_MSG_PLAYER_ASLEEP;
2900 break;
2901 case 7:
2902 messageIndex = BTL_MSG_PLAYER_FROZEN;
2903 break;
2904 case 9:
2905 messageIndex = BTL_MSG_PLAYER_POISONED;
2906 break;
2907 case 10:
2908 messageIndex = BTL_MSG_PLAYER_SHRUNK;
2909 break;
2910 case 5:
2911 messageIndex = BTL_MSG_PLAYER_PARALYZED;
2912 break;
2913 case 11:
2914 messageIndex = BTL_MSG_PLAYER_CHARGED;
2915 break;
2916 default:
2917 messageIndex = 0;
2919 break;
2920 }
2921 btl_show_battle_message(messageIndex, 60);
2922 player->statusAfflicted = 0;
2923 player->disableDismissTimer = 0;
2926
2927 } else {
2929 }
2930 break;
2932 if (!btl_is_popup_displayed()) {
2934 btl_cam_move(15);
2937 }
2938 break;
2940 if (BattleSubStateDelay != 0) {
2942 } else {
2944 }
2945 break;
2946 }
2947
2949 if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnScriptID)) {
2950 player->takeTurnScript = NULL;
2952 }
2953 }
2954}
2955
2958
2960 BattleStatus* battleStatus = &gBattleStatus;
2961 Actor* player = battleStatus->playerActor;
2962 Actor* partner = battleStatus->partnerActor;
2963 Evt* script;
2964
2966 if (battleStatus->moveCategory == BTL_MENU_TYPE_ITEMS && battleStatus->itemUsesLeft >= 2) {
2968 } else if (
2973 ) {
2975 } else if (player->stoneStatus == STATUS_KEY_STONE || battleStatus->outtaSightActive) {
2977 } else {
2978 s32 prevHPDrainCount = 0;
2979 s32 hpRecovery = 0;
2980 s32 fpRecovery = 0;
2981
2983 prevHPDrainCount = battleStatus->hpDrainCount;
2984 battleStatus->hpDrainCount = 0;
2985 }
2986
2987 if (rand_int(100) < 50) {
2988 hpRecovery = is_ability_active(ABILITY_CRAZY_HEART) * 3;
2989 }
2990 if (rand_int(100) < 50) {
2992 }
2993 if (rand_int(100) < 50) {
2995 }
2996
2997 if (prevHPDrainCount + hpRecovery + fpRecovery == 0) {
2999 } else {
3000 battleStatus->battlePhase = PHASE_PLAYER_HAPPY;
3002 player->takeTurnScript = script;
3003 player->takeTurnScriptID = script->id;
3004 script->owner1.actorID = ACTOR_PLAYER;
3006 script->varTable[10] += battleStatus->hpDrainCount;
3007 battleStatus->hpDrainCount = 0;
3008 }
3009 script->varTable[10] = prevHPDrainCount;
3010 script->varTable[11] = hpRecovery;
3011 script->varTable[12] = fpRecovery;
3012
3013 if (script->varTable[10] > 99) {
3014 script->varTable[10] = 99;
3015 }
3016 if (script->varTable[11] > 99) {
3017 script->varTable[11] = 99;
3018 }
3019 if (script->varTable[12] > 99) {
3020 script->varTable[12] = 99;
3021 }
3022
3023 gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_DRAINED_HP;
3025 }
3026 }
3027 }
3028
3029 switch (gBattleSubState) {
3031 if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
3032 break;
3033 }
3034 player->takeTurnScript = NULL;
3035
3038 } else {
3039 player->state.curPos.x = player->homePos.x;
3040 player->state.curPos.z = player->homePos.z;
3041 player->state.goalPos.x = partner->homePos.x;
3042 player->state.goalPos.z = partner->homePos.z;
3043 player->state.moveTime = 4;
3044 player->state.angle = 0.0f;
3046 }
3047 break;
3048 }
3049
3051 if (player->state.moveTime != 0) {
3052 player->curPos.x += (player->state.goalPos.x - player->curPos.x) / player->state.moveTime;
3053 player->curPos.z += (player->state.goalPos.z - player->curPos.z) / player->state.moveTime;
3054 partner->curPos.x += (player->state.curPos.x - partner->curPos.x) / player->state.moveTime;
3055 partner->curPos.z += (player->state.curPos.z - partner->curPos.z) / player->state.moveTime;
3056 }
3057 player->curPos.z += sin_rad(DEG_TO_RAD(player->state.angle)) * 16.0f;
3058 player->yaw = clamp_angle(-player->state.angle);
3059 partner->curPos.z -= sin_rad(DEG_TO_RAD(player->state.angle)) * 16.0f;
3060 partner->yaw = clamp_angle(-player->state.angle);
3061 player->state.angle += 90.0f;
3062
3063 if (player->state.moveTime != 0) {
3064 player->state.moveTime--;
3065 } else {
3066 player->curPos.x = player->state.goalPos.x;
3067 player->curPos.z = player->state.goalPos.z;
3068 partner->curPos.x = player->state.curPos.x;
3069 partner->curPos.z = player->state.curPos.z;
3070 player->homePos.x = player->curPos.x;
3071 player->homePos.z = player->curPos.z;
3072 partner->homePos.x = partner->curPos.x;
3073 partner->homePos.z = partner->curPos.z;
3076 }
3077 }
3078
3081 if (battleStatus->moveCategory == BTL_MENU_TYPE_ITEMS && battleStatus->itemUsesLeft >= 2) {
3083 btl_cam_move(10);
3084 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
3085 } else {
3087 }
3088
3089 if (battleStatus->unk_94 < 0) {
3090 battleStatus->unk_94 = 0;
3091 battleStatus->itemUsesLeft = 0;
3093 return;
3094 }
3095
3096 if (battleStatus->itemUsesLeft != 0) {
3097 battleStatus->itemUsesLeft--;
3098 if (battleStatus->itemUsesLeft != 0) {
3099 // double or triple dip has not run out yet, let the player choose another item
3102 return;
3103 }
3104
3106 if (battleStatus->hustleTurns != 0) {
3107 battleStatus->hustleTurns--;
3108 }
3109 }
3110
3111 if (battleStatus->hustleTurns != 0 && (gBattleStatus.flags1 & BS_FLAGS1_HUSTLED)) {
3112 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
3114 return;
3115 } else {
3116 gBattleStatus.flags1 &= ~BS_FLAGS1_HUSTLED;
3118 return;
3119 }
3120 }
3121
3123 if (battleStatus->hustleTurns != 0) {
3124 battleStatus->hustleTurns--;
3125 }
3126 }
3127
3128 if (battleStatus->hustleTurns != 0 && (gBattleStatus.flags1 & BS_FLAGS1_HUSTLED)) {
3129 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
3131 } else {
3132 gBattleStatus.flags1 &= ~BS_FLAGS2_HAS_DRAINED_HP;
3135 } else {
3137 }
3138 }
3139 }
3140 }
3141}
3142
3145
3147 BattleStatus* battleStatus = &gBattleStatus;
3148 PlayerData* playerData = &gPlayerData;
3149 Actor* player = battleStatus->playerActor;
3150 Actor* partner = battleStatus->partnerActor;
3151 Actor* enemyActor;
3152 Evt* script;
3153 s8 switchCondition;
3154 s32 enemyFound;
3155 s32 messageIndex;
3156 s32 i;
3157
3158 switch (gBattleSubState) {
3160 if (partner == NULL) {
3162 break;
3163 }
3164 battleStatus->stateFreezeCount = 0;
3165 battleStatus->actionResult = ACTION_RESULT_NONE;
3166 battleStatus->blockResult = BLOCK_RESULT_NONE;
3167 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
3168 gBattleStatus.flags1 &= ~BS_FLAGS1_AUTO_SUCCEED_ACTION;
3169 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
3171 partner->statusAfflicted = 0;
3172 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3173 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3177 gBattleStatus.flags1 &= ~BS_FLAGS1_YIELD_TURN;
3178
3179 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3180 enemyActor = battleStatus->enemyActors[i];
3181 if (enemyActor != NULL) {
3182 enemyActor->statusAfflicted = 0;
3183 }
3184 }
3187 break;
3189 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3190 enemyActor = battleStatus->enemyActors[i];
3191 if (enemyActor != NULL) {
3192 enemyActor->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
3193 enemyActor->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3194 }
3195 }
3196
3200 reset_all_actor_sounds(partner);
3201 battleStatus->battlePhase = PHASE_EXECUTE_ACTION;
3202 script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
3203 partner->takeTurnScript = script;
3204 partner->takeTurnScriptID = script->id;
3205 script->owner1.actorID = ACTOR_PARTNER;
3207 break;
3210 if (partner->takeTurnScript != NULL && does_script_exist(partner->takeTurnScriptID)) {
3211 break;
3212 }
3213 partner->takeTurnScript = NULL;
3214 }
3215 gBattleStatus.flags1 &= ~BS_FLAGS1_EXECUTING_MOVE;
3216
3217 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
3218 break;
3219 }
3220 partner->handleEventScript = NULL;
3221
3222 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
3223 break;
3224 }
3225 player->handleEventScript = NULL;
3226
3227 enemyFound = FALSE;
3228 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3229 enemyActor = battleStatus->enemyActors[i];
3230 if (enemyActor != NULL && enemyActor->takeTurnScript != NULL) {
3231 if (does_script_exist(enemyActor->takeTurnScriptID)) {
3232 enemyFound = TRUE;
3233 } else {
3234 enemyActor->takeTurnScript = NULL;
3235 }
3236 }
3237 }
3238 if (enemyFound) {
3239 break;
3240 }
3241
3242 enemyFound = FALSE;
3243 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3244 enemyActor = battleStatus->enemyActors[i];
3245 if (enemyActor != NULL && enemyActor->handleEventScript != NULL) {
3246 if (does_script_exist(enemyActor->handleEventScriptID)) {
3247 enemyFound = TRUE;
3248 } else {
3249 enemyActor->handleEventScript = NULL;
3250 }
3251 }
3252 }
3253 if (enemyFound) {
3254 break;
3255 }
3256
3257 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3258 enemyActor = battleStatus->enemyActors[i];
3259 if (enemyActor != NULL) {
3260 enemyActor->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
3261 }
3262 }
3263
3264 if (battleStatus->stateFreezeCount != 0) {
3265 break;
3266 }
3267
3270 break;
3271 }
3273 if (playerData->curPartner == PARTNER_GOOMBARIO
3274 && battleStatus->moveCategory == BTL_MENU_TYPE_CHANGE_PARTNER
3275 && battleStatus->selectedMoveID != MOVE_CHARGE) {
3276 partner->isGlowing = FALSE;
3277 gBattleStatus.flags1 &= ~BS_FLAGS1_GOOMBARIO_CHARGED;
3278 }
3280 return;
3281 }
3282
3283 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3284 enemyActor = battleStatus->enemyActors[i];
3285 if (enemyActor != NULL) {
3286 if (!(enemyActor->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
3288 }
3289 }
3290 }
3291
3293
3297 partner->statusAfflicted = 0;
3298 partner->disableDismissTimer = 0;
3301 } else {
3303 }
3304 break;
3306 if (btl_is_popup_displayed()) {
3307 break;
3308 }
3310 btl_cam_move(15);
3313 break;
3315 if (BattleSubStateDelay != 0) {
3317 } else {
3319 }
3320 break;
3321 }
3322
3323 switch (gBattleSubState) {
3325 enemyFound = FALSE;
3326 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3327 enemyActor = battleStatus->enemyActors[i];
3328 if (enemyActor != NULL) {
3329 if (enemyActor->statusAfflicted != 0) {
3330 enemyFound = TRUE;
3331 break;
3332 }
3333 }
3334 }
3335
3336 if (!enemyFound) {
3338 } else {
3340 switchCondition = enemyActor->statusAfflicted - 4;
3341 switch (switchCondition) {
3342 case 0:
3343 messageIndex = BTL_MSG_ENEMY_DAZED;
3344 break;
3345 case 2:
3346 messageIndex = BTL_MSG_ENEMY_ASLEEP;
3347 break;
3348 case 3:
3349 messageIndex = BTL_MSG_ENEMY_FROZEN;
3350 break;
3351 case 5:
3352 messageIndex = BTL_MSG_ENEMY_POISONED;
3353 break;
3354 case 6:
3355 messageIndex = BTL_MSG_ENEMY_SHRUNK;
3356 break;
3357 case 1:
3358 messageIndex = BTL_MSG_ENEMY_PARALYZED;
3359 break;
3360 case 7:
3361 messageIndex = BTL_MSG_ENEMY_ELECTRIFIED;
3362 break;
3363 case 4:
3364 messageIndex = BTL_MSG_ENEMY_CANT_MOVE;
3365 break;
3366 default:
3367 messageIndex = 0;
3369 break;
3370 }
3371
3373 btl_show_battle_message(messageIndex, 60);
3374
3375 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3376 enemyActor = battleStatus->enemyActors[i];
3377 if (enemyActor != NULL) {
3378 enemyActor->statusAfflicted = 0;
3379 }
3380 }
3382 }
3383 break;
3385 if (btl_is_popup_displayed() == FALSE) {
3387 btl_cam_move(15);
3390 }
3391 break;
3393 if (BattleSubStateDelay != 0) {
3395 } else {
3397 }
3398 break;
3399 }
3400
3402 if (partner->takeTurnScript != NULL && does_script_exist(partner->takeTurnScriptID)) {
3403 return;
3404 }
3405 partner->takeTurnScript = NULL;
3407 }
3408}
3409
3412
3414 BattleStatus* battleStatus = &gBattleStatus;
3415
3417 battleStatus->flags2 |= BS_FLAGS2_PARTNER_TURN_USED;
3419 return;
3420 }
3421 battleStatus->flags1 &= ~BS_FLAGS1_PARTNER_ACTING;
3422 battleStatus->flags2 &= ~BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER;
3423
3424 if (battleStatus->unk_94 < 0) {
3425 battleStatus->unk_94 = 0;
3427 } else {
3429 }
3430 }
3431}
3432
3435
3437 BattleStatus* battleStatus = &gBattleStatus;
3439 Actor* partner = gBattleStatus.partnerActor;
3440 Actor* enemy;
3441 s32 skipEnemy;
3442 s32 i;
3443
3444 switch (gBattleSubState) {
3447 i = battleStatus->nextEnemyIndex;
3448 if (i >= battleStatus->numEnemyActors) {
3449 // all enemies have been exhausted
3450 battleStatus->nextEnemyIndex = 0;
3452 return;
3453 }
3454
3455 // find the next eligible enemy
3456 while (TRUE) {
3457 if (battleStatus->enemyIDs[i] >= 0) {
3458 u16 enemyID = battleStatus->enemyIDs[i];
3459
3460 enemy = battleStatus->enemyActors[enemyID & 0xFF];
3461 if (enemy != NULL) {
3463 break;
3464 }
3465 }
3466 }
3467 i++;
3468 if (i >= battleStatus->numEnemyActors) {
3469 i = 0;
3470 }
3471 if (i == 0) {
3472 battleStatus->nextEnemyIndex = 0;
3474 return;
3475 }
3476 }
3477
3478 battleStatus->activeEnemyActorID = battleStatus->enemyIDs[i++];
3479 battleStatus->curTurnEnemy = enemy;
3480 battleStatus->nextEnemyIndex = i;
3481
3482 skipEnemy = FALSE;
3483
3484 if (enemy->debuff == STATUS_KEY_SLEEP) {
3485 skipEnemy = TRUE;
3486 }
3487 if (enemy->debuff == STATUS_KEY_FEAR) {
3488 skipEnemy = TRUE;
3489 }
3490 if (enemy->debuff == STATUS_KEY_DIZZY) {
3491 skipEnemy = TRUE;
3492 }
3493 if (enemy->debuff == STATUS_KEY_PARALYZE) {
3494 skipEnemy = TRUE;
3495 }
3496 if (enemy->debuff == STATUS_KEY_FROZEN) {
3497 skipEnemy = TRUE;
3498 }
3499 if (enemy->debuff == STATUS_KEY_STOP) {
3500 skipEnemy = TRUE;
3501 }
3502 if (enemy->stoneStatus == STATUS_KEY_STONE) {
3503 skipEnemy = TRUE;
3504 }
3505 if (enemy->flags & ACTOR_FLAG_SKIP_TURN) {
3506 skipEnemy = TRUE;
3507 }
3508
3509 if (skipEnemy) {
3510 // reset state to fetch next enemy
3512 return;
3513 }
3514
3515 battleStatus->stateFreezeCount = 0;
3516 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
3517 gBattleStatus.flags1 &= ~BS_FLAGS1_BATTLE_FLED;
3518 gBattleStatus.flags1 &= ~BS_FLAGS1_AUTO_SUCCEED_ACTION;
3519 gBattleStatus.flags1 &= ~BS_FLAGS1_PARTNER_ACTING;
3520
3521 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3523
3524 if (partner != NULL) {
3525 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3527 }
3528
3529 gBattleStatus.flags2 &= ~BS_FLAGS2_PLAYER_TURN_USED;
3530 gBattleStatus.flags2 &= ~BS_FLAGS2_PARTNER_TURN_USED;
3532
3533 D_8029F244 = enemy->unk_134;
3534 if (enemy->handlePhaseSource != NULL) {
3535 Evt* onTurnChanceScript;
3536
3537 battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
3538 onTurnChanceScript = start_script(enemy->handlePhaseSource, EVT_PRIORITY_A, 0);
3539 enemy->handlePhaseScript = onTurnChanceScript;
3540 enemy->handleBatttlePhaseScriptID = onTurnChanceScript->id;
3541 onTurnChanceScript->owner1.actorID = battleStatus->activeEnemyActorID;
3542 }
3544 break;
3546 if (battleStatus->stateFreezeCount == 0) {
3547 enemy = get_actor(battleStatus->activeEnemyActorID);
3548
3549 if (enemy == NULL || enemy->unk_134 != D_8029F244) {
3551 } else {
3552 if (enemy->handlePhaseSource == NULL || !does_script_exist(enemy->handleBatttlePhaseScriptID)) {
3553 if (battleStatus->unk_94 < 0) {
3554 battleStatus->unk_94 = 0;
3556 } else {
3558 }
3559 }
3560 }
3561 }
3562 break;
3563 }
3564}
3565
3567}
3568
3570 BattleStatus* battleStatus = &gBattleStatus;
3572 Actor* partner = gBattleStatus.partnerActor;
3573 Actor* enemy;
3574 s32 i;
3575
3576 Evt* script;
3577 s32 messageIndex;
3578 s32 waitingForEnemyScript;
3579
3580 switch (gBattleSubState) {
3583 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
3584 gBattleStatus.flags1 &= ~BS_FLAGS1_YIELD_TURN;
3585 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3586 if (partner != NULL) {
3587 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3588 }
3589 battleStatus->stateFreezeCount = 0;
3590 battleStatus->lastAttackDamage = 0;
3591 battleStatus->actionQuality = 0;
3592 battleStatus->actionResult = ACTION_RESULT_NONE;
3593 battleStatus->blockResult = BLOCK_RESULT_NONE;
3594 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
3597 player->statusAfflicted = 0;
3598 if (partner != NULL) {
3599 partner->statusAfflicted = 0;
3600 }
3601
3603 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3604 enemy = battleStatus->enemyActors[i];
3605 if (enemy != NULL) {
3606 enemy->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
3607 }
3608 }
3609
3610 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3611 enemy = battleStatus->enemyActors[i];
3612 if (enemy != NULL) {
3613 if (!(enemy->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
3614 enemy->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
3615 }
3616 }
3617 }
3618
3619 enemy = battleStatus->curTurnEnemy;
3620 if (!(enemy->flags & ACTOR_FLAG_NO_ATTACK)) {
3622 battleStatus->battlePhase = PHASE_EXECUTE_ACTION;
3623 script = start_script(enemy->takeTurnSource, EVT_PRIORITY_A, 0);
3624 enemy->takeTurnScript = script;
3625 enemy->takeTurnScriptID = script->id;
3626 script->owner1.actorID = battleStatus->activeEnemyActorID;
3627 }
3629 break;
3631 if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
3632 break;
3633 }
3634 player->takeTurnScript = NULL;
3635
3636 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
3637 break;
3638 }
3639 player->handleEventScript = NULL;
3640
3641 if (partner != NULL) {
3642 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
3643 break;
3644 }
3645 partner->handleEventScript = NULL;
3646 }
3647
3648 waitingForEnemyScript = FALSE;
3649 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3650 enemy = battleStatus->enemyActors[i];
3651 if (enemy != NULL && enemy->handleEventScript != NULL) {
3653 waitingForEnemyScript = TRUE;
3654 } else {
3655 enemy->handleEventScript = NULL;
3656 }
3657 }
3658 }
3659
3660 if (waitingForEnemyScript) {
3661 break;
3662 }
3663
3665 return;
3666 }
3667
3668 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3669 enemy = battleStatus->enemyActors[i];
3670 if (enemy != NULL && enemy->takeTurnScript != NULL) {
3671 if (does_script_exist(enemy->takeTurnScriptID)) {
3672 waitingForEnemyScript = TRUE;
3673 } else {
3674 enemy->takeTurnScript = NULL;
3675 }
3676 }
3677 }
3678
3679 if (waitingForEnemyScript && !(gBattleStatus.flags1 & BS_FLAGS1_YIELD_TURN)) {
3680 break;
3681 }
3682
3683 gBattleStatus.flags1 &= ~BS_FLAGS1_EXECUTING_MOVE;
3684 gBattleStatus.flags2 &= ~BS_FLAGS2_IGNORE_DARKNESS;
3686 return;
3687 }
3688
3689 if (battleStatus->stateFreezeCount != 0) {
3690 break;
3691 }
3692
3695 } else {
3697 if (player->statusAfflicted != 0) {
3699 if (partner != NULL) {
3701 }
3703
3704 switch (player->statusAfflicted) {
3705 case STATUS_KEY_DIZZY:
3706 messageIndex = BTL_MSG_PLAYER_DAZED;
3707 break;
3708 case STATUS_KEY_SLEEP:
3709 messageIndex = BTL_MSG_PLAYER_ASLEEP;
3710 break;
3711 case STATUS_KEY_FROZEN:
3712 messageIndex = BTL_MSG_PLAYER_FROZEN;
3713 break;
3714 case STATUS_KEY_POISON:
3715 messageIndex = BTL_MSG_PLAYER_POISONED;
3716 break;
3717 case STATUS_KEY_SHRINK:
3718 messageIndex = BTL_MSG_PLAYER_SHRUNK;
3719 break;
3721 messageIndex = BTL_MSG_PLAYER_PARALYZED;
3722 break;
3723 default:
3724 messageIndex = 0;
3726 break;
3727 }
3728 btl_show_battle_message(messageIndex, 60);
3729 player->statusAfflicted = 0;
3731 break;
3732 } else {
3734 break;
3735 }
3736 }
3737 break;
3739 if (!btl_is_popup_displayed()) {
3741 btl_cam_move(15);
3744 }
3745 break;
3747 if (BattleSubStateDelay != 0) {
3749 } else {
3751 break;
3752 }
3753 break;
3754 }
3755
3756 switch (gBattleSubState) {
3758 if (partner != NULL) {
3759 if (partner->statusAfflicted == STATUS_KEY_DAZE) {
3764 partner->statusAfflicted = 0;
3766 } else {
3768 }
3769 } else {
3771 }
3772 break;
3774 if (!btl_is_popup_displayed()) {
3776 btl_cam_move(15);
3779 }
3780 break;
3782 if (BattleSubStateDelay != 0) {
3784 } else {
3786 }
3787 break;
3788 }
3789
3792 }
3793}
3794
3796}
3797
3799 PlayerData* playerData = &gPlayerData;
3800 BattleStatus* battleStatus = &gBattleStatus;
3801 EncounterStatus* encounterStatus = &gCurrentEncounter;
3803 Actor* partner = gBattleStatus.partnerActor;
3804 Evt* script;
3805 Actor* enemy;
3806 s32 enemyNotDone;
3807 s32 i;
3808
3809 switch (gBattleSubState) {
3811 D_8029F254 = FALSE;
3813 if (playerData->playerFirstStrikes < 9999) {
3814 playerData->playerFirstStrikes++;
3815 }
3816
3817 // clear rush flags to initialize
3818 battleStatus->rushFlags = RUSH_FLAG_NONE;
3819 gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_RUSH;
3820
3821 // set rush flags based on danger/peril status
3825 battleStatus->rushFlags |= RUSH_FLAG_MEGA;
3826 }
3828 if (!(battleStatus->rushFlags & RUSH_FLAG_MEGA)) {
3830 battleStatus->rushFlags |= RUSH_FLAG_POWER;
3831 }
3832 }
3833 }
3834
3835 // setup dummy 'menu selection' for player move
3836 switch (encounterStatus->hitType) {
3838 battleStatus->moveCategory = BTL_MENU_TYPE_JUMP;
3839 battleStatus->selectedMoveID = MOVE_FIRST_STRIKE_JUMP;
3840 battleStatus->moveArgument = encounterStatus->hitTier;
3841 battleStatus->curTargetListFlags = gMoveTable[MOVE_FIRST_STRIKE_JUMP].flags;
3842 break;
3844 battleStatus->moveCategory = BTL_MENU_TYPE_SMASH;
3845 battleStatus->selectedMoveID = MOVE_FIRST_STRIKE_HAMMER;
3846 battleStatus->moveArgument = encounterStatus->hitTier;
3847 battleStatus->curTargetListFlags = gMoveTable[MOVE_FIRST_STRIKE_HAMMER].flags;
3848 break;
3851 return;
3852 }
3853 // let the enemy know a first strike is coming
3854 enemy = get_actor(ACTOR_ENEMY0);
3855 if (enemy->handleEventSource != NULL) {
3858 enemy->handleEventScript = script;
3859 enemy->handleEventScriptID = script->id;
3860 script->owner1.actorID = enemy->actorID;
3861 }
3863 break;
3865 enemy = get_actor(ACTOR_ENEMY0);
3866 if (enemy->handleEventSource != NULL) {
3868 break;
3869 } else {
3870 enemy->handleEventScript = NULL;
3871 }
3872 }
3873
3874 func_80263230(player, enemy);
3875 battleStatus->stateFreezeCount = 0;
3876 battleStatus->lastAttackDamage = 0;
3877 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
3878 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
3880 gBattleStatus.flags1 &= ~BS_FLAGS1_PARTNER_ACTING;
3885 // begin the partner turn script
3886 battleStatus->battlePhase = PHASE_FIRST_STRIKE;
3888 player->takeTurnScript = script;
3889 player->takeTurnScriptID = script->id;
3890 script->owner1.actorID = ACTOR_PLAYER;
3893 break;
3895 if (BattleSubStateDelay != 0) {
3897 } else {
3898 D_8029F254 = TRUE;
3899 }
3900
3901 // wait for player move script
3903 if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
3904 break;
3905 }
3906 player->takeTurnScript = NULL;
3907 }
3908
3909 gBattleStatus.flags1 &= ~BS_FLAGS1_EXECUTING_MOVE;
3910
3911 // wait for player handle event script
3912 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
3913 break;
3914 }
3915 player->handleEventScript = NULL;
3916
3917 // wait for partner handle event script
3918 if (partner != NULL) {
3919 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
3920 break;
3921 }
3922 partner->handleEventScript = NULL;
3923 }
3924
3925 // wait for all enemy turn scripts
3926 enemyNotDone = FALSE;
3927 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3928 enemy = battleStatus->enemyActors[i];
3929 if (enemy != NULL && enemy->takeTurnScript != NULL) {
3930 if (does_script_exist(enemy->takeTurnScriptID)) {
3931 enemyNotDone = TRUE;
3932 } else {
3933 enemy->takeTurnScript = NULL;
3934 }
3935 }
3936 }
3937 if (enemyNotDone) {
3938 break;
3939 }
3940
3941 // wait for all enemy handle event scripts
3942 enemyNotDone = FALSE;
3943 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3944 enemy = battleStatus->enemyActors[i];
3945 if (enemy != NULL && enemy->handleEventScript != NULL) {
3947 enemyNotDone = TRUE;
3948 } else {
3949 enemy->handleEventScript = NULL;
3950 }
3951 }
3952 }
3953 if (enemyNotDone) {
3954 break;
3955 }
3956
3957 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3958 enemy = battleStatus->enemyActors[i];
3959 if (enemy != NULL) {
3960 enemy->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
3961 }
3962 }
3963
3964 if (battleStatus->stateFreezeCount == 0) {
3967 Actor* target;
3968
3970 return;
3971 }
3972
3973 target = get_actor(player->targetActorID);
3974 if (target != NULL) {
3975 if (target->handleEventSource != NULL) {
3978 target->handleEventScript = script;
3979 target->handleEventScriptID = script->id;
3980 script->owner1.actorID = target->actorID;
3981 }
3982 }
3984 } else {
3986 }
3987 }
3988 break;
3990 enemyNotDone = FALSE;
3991 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
3992 enemy = battleStatus->enemyActors[i];
3993 if (enemy != NULL && enemy->handleEventScript != NULL) {
3995 enemyNotDone = TRUE;
3996 } else {
3997 enemy->handleEventScript = NULL;
3998 }
3999 }
4000 }
4001 if (enemyNotDone) {
4002 break;
4003 }
4004 if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnScriptID)) {
4005 player->takeTurnScript = NULL;
4007 }
4008 break;
4009 }
4010}
4011
4013 if (D_802809F6 == -1 && D_8029F254) {
4014 if (BattleScreenFadeAmt == 0) {
4016 } else {
4018 BattleScreenFadeAmt -= 20;
4019 } else {
4020 BattleScreenFadeAmt -= 50;
4021 }
4022
4023 if (BattleScreenFadeAmt < 0) {
4025 }
4027 }
4028 }
4029}
4030
4032 PlayerData* playerData = &gPlayerData;
4033 BattleStatus* battleStatus = &gBattleStatus;
4034 Actor* player = battleStatus->playerActor;
4035 Actor* partner = battleStatus->partnerActor;
4036 Actor* actor;
4037 s32 enemyNotDone;
4038 SelectableTarget* target;
4039 Evt* script;
4040 s32 level;
4041 s32 i;
4042
4043 switch (gBattleSubState) {
4045 D_8029F254 = FALSE;
4046 // setup dummy 'menu selection' for partner move
4047 level = partner->actorBlueprint->level;
4048 switch (playerData->curPartner) {
4049 case PARTNER_KOOPER:
4051 battleStatus->moveArgument = 0;
4052 battleStatus->selectedMoveID = level + MOVE_SHELL_TOSS1;
4053 battleStatus->curTargetListFlags = gMoveTable[battleStatus->selectedMoveID].flags;
4054 break;
4055 case PARTNER_BOMBETTE:
4057 battleStatus->moveArgument = 0;
4058 battleStatus->selectedMoveID = level + MOVE_BODY_SLAM1;
4059 battleStatus->curTargetListFlags = gMoveTable[battleStatus->selectedMoveID].flags;
4060 break;
4061 }
4062 // let the enemy know a first strike is coming
4063 actor = get_actor(ACTOR_ENEMY0);
4064 if (actor->handleEventSource != NULL) {
4067 actor->handleEventScript = script;
4068 actor->handleEventScriptID = script->id;
4069 script->owner1.actorID = actor->actorID;
4070 }
4072 break;
4075 target = &partner->targetData[partner->targetIndexList[0]];
4076 partner->targetActorID = target->actorID;
4077 partner->targetPartID = target->partID;
4078 battleStatus->stateFreezeCount = 0;
4079 battleStatus->lastAttackDamage = 0;
4080 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
4081 gBattleStatus.flags1 &= ~BS_FLAGS1_MENU_OPEN;
4088 // begin the partner turn script
4089 battleStatus->battlePhase = PHASE_FIRST_STRIKE;
4090 script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
4091 partner->takeTurnScript = script;
4092 partner->takeTurnScriptID = script->id;
4093 script->owner1.actorID = ACTOR_PARTNER;
4096 break;
4098 if (BattleSubStateDelay != 0) {
4100 } else {
4101 D_8029F254 = TRUE;
4102 }
4103 // wait for partner move script
4104 if (partner->takeTurnScript != NULL && does_script_exist(partner->takeTurnScriptID)) {
4105 break;
4106 }
4107 partner->takeTurnScript = NULL;
4108 // wait for partner handle event script
4109 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
4110 break;
4111 }
4112 partner->handleEventScript = NULL;
4113 // wait for player handle event script
4114 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
4115 break;
4116 }
4117 player->handleEventScript = NULL;
4118
4119 // wait for all enemy turn scripts
4120 enemyNotDone = FALSE;
4121 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4122 actor = battleStatus->enemyActors[i];
4123 if (actor != NULL && actor->takeTurnScript != NULL) {
4124 if (does_script_exist(actor->takeTurnScriptID)) {
4125 enemyNotDone = TRUE;
4126 } else {
4127 actor->takeTurnScript = NULL;
4128 }
4129 }
4130 }
4131 if (enemyNotDone) {
4132 break;
4133 }
4134
4135 // wait for all enemy handle event scripts
4136 enemyNotDone = FALSE;
4137 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4138 actor = battleStatus->enemyActors[i];
4139 if (actor != NULL && actor->handleEventScript != NULL) {
4141 enemyNotDone = TRUE;
4142 } else {
4143 actor->handleEventScript = NULL;
4144 }
4145 }
4146 }
4147 if (enemyNotDone) {
4148 break;
4149 }
4150
4151 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4152 actor = battleStatus->enemyActors[i];
4153 if (actor != NULL) {
4154 actor->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
4155 }
4156 }
4157
4158 if (battleStatus->stateFreezeCount == 0) {
4161 return;
4162 }
4163
4164 actor = get_actor(partner->targetActorID);
4165 if (actor != NULL) {
4166 if (actor->handleEventSource != NULL) {
4169 actor->handleEventScript = script;
4170 actor->handleEventScriptID = script->id;
4171 script->owner1.actorID = actor->actorID;
4172 }
4173 }
4175 }
4176 break;
4178 enemyNotDone = FALSE;
4179 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4180 actor = battleStatus->enemyActors[i];
4181 if (actor != NULL && actor->handleEventScript != NULL) {
4183 enemyNotDone = TRUE;
4184 } else {
4185 actor->handleEventScript = NULL;
4186 }
4187 }
4188 }
4189 if (!enemyNotDone) {
4191 }
4192 break;
4193 }
4194}
4195
4210
4212 PlayerData* playerData = &gPlayerData;
4213 BattleStatus* battleStatus = &gBattleStatus;
4214 Actor* player = battleStatus->playerActor;
4215 Actor* partner = battleStatus->partnerActor;
4216 Evt* script;
4217 Actor* actor;
4218 u16* enemyIDs;
4219 s16 activeEnemyActorID;
4220 s32 nextEnemyIdx;
4221 s32 count;
4222 s32 flags;
4223 s32 waitingForScript;
4224 s32 i;
4225 s32 j;
4226
4227 switch (gBattleSubState) {
4229 battleStatus->stateFreezeCount = 0;
4230 battleStatus->lastAttackDamage = 0;
4231 battleStatus->curDamageSource = DMG_SRC_DEFAULT;
4232 playerData->enemyFirstStrikes++;
4233 battleStatus->flags1 &= ~BS_FLAGS1_MENU_OPEN;
4234 D_8029F254 = FALSE;
4235 player->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
4236 if (partner != NULL) {
4237 partner->flags &= ~ACTOR_FLAG_SHOW_STATUS_ICONS;
4238 }
4239 battleStatus->flags2 |= BS_FLAGS2_IS_FIRST_STRIKE;
4240 battleStatus->flags2 |= BS_FLAGS2_IGNORE_DARKNESS;
4241 count = 0;
4242
4243 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4244 actor = battleStatus->enemyActors[i];
4245 if (actor != NULL) {
4246 battleStatus->enemyIDs[count] = i | ACTOR_ENEMY0;
4247 count++;
4248 }
4249 }
4250
4251 battleStatus->numEnemyActors = count;
4252
4253 enemyIDs = battleStatus->enemyIDs;
4254 for (i = 0; i < count - 1; i++) {
4255 for (j = i + 1; j < count; j++) {
4256 s32 iVal = enemyIDs[i];
4257 s32 jVal = enemyIDs[j];
4258
4259 if (battleStatus->enemyActors[iVal & 0xFF]->turnPriority <
4260 battleStatus->enemyActors[jVal & 0xFF]->turnPriority)
4261 {
4262 enemyIDs[i] = jVal;
4263 enemyIDs[j] = iVal;
4264 }
4265 }
4266 }
4267
4268 battleStatus->nextEnemyIndex = 0;
4269 nextEnemyIdx = 0;
4271
4272 while (TRUE) {
4273 actor = battleStatus->enemyActors[battleStatus->enemyIDs[nextEnemyIdx] & 0xFF];
4274 if (actor == NULL || (actor->flags & flags)) {
4275 nextEnemyIdx++;
4276 if (nextEnemyIdx >= battleStatus->numEnemyActors) {
4277 nextEnemyIdx = 0;
4278 }
4279 } else {
4280 break;
4281 }
4282 }
4283
4284 activeEnemyActorID = battleStatus->enemyIDs[nextEnemyIdx];
4285 nextEnemyIdx++;
4286 battleStatus->curTurnEnemy = actor;
4287 battleStatus->activeEnemyActorID = activeEnemyActorID;
4288 if (nextEnemyIdx >= battleStatus->numEnemyActors) {
4289 nextEnemyIdx = 0;
4290 }
4291 battleStatus->nextEnemyIndex = nextEnemyIdx;
4293 actor = battleStatus->curTurnEnemy;
4295 battleStatus->battlePhase = PHASE_FIRST_STRIKE;
4296 script = start_script(actor->takeTurnSource, EVT_PRIORITY_A, 0);
4297 actor->takeTurnScript = script;
4299 actor->takeTurnScriptID = script->id;
4301 script->owner1.actorID = battleStatus->activeEnemyActorID;
4302 break;
4304 if (BattleSubStateDelay != 0) {
4306 } else {
4307 D_8029F254 = TRUE;
4308 }
4309
4310 // wait for current enemy TakeTurn script to finish
4311 actor = battleStatus->curTurnEnemy;
4312 if (actor->takeTurnScript != NULL && does_script_exist(actor->takeTurnScriptID)) {
4313 break;
4314 }
4315 actor->takeTurnScript = NULL;
4316
4317 // wait for player HandleEvent script to finish (may have been triggered by enemy Take Turn)
4318 if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
4319 break;
4320 }
4321 player->handleEventScript = NULL;
4322
4323 // wait for partner HandleEvent script to finish (may have been triggered by enemy Take Turn)
4324 if (partner != NULL) {
4325 if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
4326 break;
4327 }
4328 partner->handleEventScript = NULL;
4329 }
4330
4331 // wait for all enemy TakeTurn scripts to finish
4332 waitingForScript = FALSE;
4333
4334 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4335 actor = battleStatus->enemyActors[i];
4336 if (actor != NULL && actor->takeTurnScript != NULL) {
4337 if (does_script_exist(actor->takeTurnScriptID)) {
4338 waitingForScript = TRUE;
4339 } else {
4340 actor->takeTurnScript = NULL;
4341 }
4342 }
4343 }
4344
4345 if (waitingForScript) {
4346 break;
4347 }
4348
4349 // wait for all enemy HandleEvent scripts to finish
4350 waitingForScript = FALSE;
4351
4352 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4353 actor = battleStatus->enemyActors[i];
4354 if (actor != NULL && actor->handleEventScript != NULL) {
4356 waitingForScript = TRUE;
4357 } else {
4358 actor->handleEventScript = NULL;
4359 }
4360 }
4361 }
4362
4363 if (waitingForScript) {
4364 break;
4365 }
4366
4367 // reset state
4368 gBattleStatus.flags2 &= ~BS_FLAGS2_IGNORE_DARKNESS;
4369 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4370 actor = battleStatus->enemyActors[i];
4371 if (actor != NULL) {
4372 actor->flags &= ~ACTOR_FLAG_HEALTH_BAR_HIDDEN;
4373 }
4374 }
4375
4376 if (battleStatus->stateFreezeCount == 0) {
4378 return;
4379 }
4381 }
4382 break;
4383 }
4384}
4385
4400
4402 BattleStatus* battleStatus = &gBattleStatus;
4403 Battle* battle = gCurrentBattlePtr;
4404 Stage* stage;
4405 s32 i;
4406
4407 switch (gBattleSubState) {
4410 if (D_802809F6 == -1) {
4411 if (DemoBattleBeginDelay != 0) {
4413 break;
4414 }
4415 }
4417 break;
4419 switch (D_802809F6) {
4420 case 255:
4422 return;
4423 case -1:
4424 if (BattleScreenFadeAmt == 255) {
4426 return;
4427 }
4428 BattleScreenFadeAmt += 50;
4429 if (BattleScreenFadeAmt > 255) {
4430 BattleScreenFadeAmt = 255;
4431 }
4432 return;
4433 }
4434 break;
4436 BattleScreenFadeAmt = 255;
4437 gBattleStatus.flags1 &= ~BS_FLAGS1_ACTORS_VISIBLE;
4438 if (gCurrentStagePtr == NULL) {
4439 stage = battle->stage;
4440 } else {
4441 stage = gCurrentStagePtr->stage;
4442 }
4443
4444 if (stage->postBattle == NULL) {
4446 } else {
4447 battleStatus->controlScript = start_script(stage->postBattle, EVT_PRIORITY_A, 0);
4448 battleStatus->controlScriptID = battleStatus->controlScript->id;
4450 }
4451 break;
4453 if (does_script_exist(battleStatus->controlScriptID)) {
4454 break;
4455 }
4457 //fallthrough
4460
4461 for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
4462 Actor* enemy = battleStatus->enemyActors[i];
4463
4464 if (enemy != NULL) {
4465 btl_delete_actor(enemy);
4466 }
4467 }
4468
4469 if (battleStatus->partnerActor != NULL) {
4470 btl_delete_actor(battleStatus->partnerActor);
4471 }
4472
4473 btl_delete_player_actor(battleStatus->playerActor);
4476
4479 }
4480
4481 if (D_802809F6 != -1) {
4483 }
4484
4488 break;
4489 }
4490}
4491
Actor * create_actor(Formation formation)
Definition 190B20.c:1676
@ AC_MODE_NOT_LEARNED
Definition action_cmd.h:60
@ AC_MODE_LEARNED
Definition action_cmd.h:61
BSS Battle * gCurrentBattlePtr
Definition battle.c:19
void btl_state_draw_switch_to_partner(void)
void btl_state_update_end_battle(void)
s32 BattleScreenFadeAmt
Definition 16C8E0.c:49
void btl_state_update_end_turn(void)
void btl_state_draw_9(void)
void btl_state_update_end_training_battle(void)
BSS s32 BattleEnemiesCreated
void btl_state_update_prepare_menu(void)
b32 dispatch_damage_tick_event_player(s32 damageAmount, s32 event)
void btl_state_update_end_player_turn(void)
void btl_state_update_enemy_move(void)
BSS s32 RunAwayRewardStep
void btl_state_update_first_strike(void)
BSS s32 RunAwayRewardIncrement
void btl_state_draw_partner_striking_first(void)
void btl_state_update_enemy_striking_first(void)
void btl_state_draw_prepare_menu(void)
void btl_state_draw_1C(void)
void btl_state_update_normal_start(void)
void btl_state_draw_begin_player_turn(void)
void btl_state_update_begin_player_turn(void)
void btl_state_draw_defend(void)
void btl_state_update_defeat(void)
void btl_state_update_next_enemy(void)
void btl_state_update_1C(void)
void btl_state_draw_end_player_turn(void)
void btl_state_draw_victory(void)
void btl_state_update_victory(void)
s16 DemoBattleBeginDelay
Definition 16C8E0.c:13
BSS s32 D_8029F258
void btl_state_draw_end_demo_battle(void)
void btl_state_update_9(void)
void btl_state_update_partner_striking_first(void)
void btl_state_draw_end_turn(void)
void btl_state_draw_partner_move(void)
ShapeFile gMapShapeData
Definition heaps.c:16
void btl_state_update_change_partner(void)
void btl_state_update_partner_move(void)
void btl_state_update_begin_partner_turn(void)
void btl_merlee_on_first_strike(void)
EvtScript EVS_Peach_OnActorCreate
void btl_state_update_switch_to_player(void)
StageListRow * gCurrentStagePtr
Definition battle.c:9
BSS s32 BattleSubStateDelay
BSS s32 RunAwayRewardTotal
void btl_state_update_begin_turn(void)
BSS u8 D_8029F244
void btl_state_draw_begin_partner_turn(void)
void btl_state_draw_player_move(void)
BSS s32 D_8029F264
BSS s32 D_8029F24C
void btl_state_draw_end_partner_turn(void)
void btl_state_draw_begin_turn(void)
void btl_state_update_defend(void)
s16 D_802809F6
Definition 16C8E0.c:12
void btl_state_draw_enemy_move(void)
s32 bActorsIgnoreDuringCount[]
void btl_state_draw_switch_to_player(void)
EvtScript EVS_OnBattleInit
Definition camera.c:1171
void btl_state_draw_next_enemy(void)
void btl_set_state(s32 battleState)
void btl_state_draw_normal_start(void)
EvtScript EVS_Mario_OnActorCreate
void btl_state_draw_run_away(void)
void btl_state_update_end_partner_turn(void)
void btl_merlee_on_start_turn(void)
void btl_state_draw_end_training_battle(void)
void btl_state_draw_defeat(void)
void btl_state_draw_end_battle(void)
void btl_state_update_end_demo_battle(void)
void btl_state_update_player_move(void)
void btl_state_draw_change_partner(void)
void btl_state_draw_enemy_striking_first(void)
void btl_state_draw_first_stike(void)
void btl_state_update_run_away(void)
BSS b32 D_8029F254
void btl_state_update_switch_to_partner(void)
struct EffectInstance * disableEffect
struct Evt * handlePhaseScript
struct Evt * takeTurnScript
s8 transparentStatus
EvtScript * handleEventSource
s8 disableDismissTimer
struct ActorBlueprint * actorBlueprint
ActorState state
struct Evt * handleEventScript
struct ActorPart * partsTable
s32 takeTurnScriptID
struct SelectableTarget targetData[24]
EvtScript * handlePhaseSource
s16 targetActorID
struct EffectInstance * icePillarEffect
s8 chillOutAmount
s32 b32
Vec3f homePos
s32 handleEventScriptID
s16 hudElementDataIndex
EvtScript * takeTurnSource
Vec3f curPos
s8 targetIndexList[24]
s8 instigatorValue
Bytecode EvtScript[]
s8 statusAfflicted
s8 staticDuration
s8 debuffDuration
s8 transparentDuration
union Evt::@10 owner1
Initially -1.
s32 handleBatttlePhaseScriptID
Vec3f scale
s8 flags
Definition demo_api.c:15
#define remove_effect
#define rand_int
#define clamp_angle
struct DisableXFXData * disableX
Definition effects.h:2529
s16 turnsLeft
Definition effects.h:2326
EffectInstanceDataPtr data
Definition effects.h:2605
@ FX_WATER_BLOCK_DESTROY
Definition effects.h:1540
struct PartnerBuffFXData * partnerBuff
Definition effects.h:2591
BuffData unk_0C[3]
Definition effects.h:2336
@ FX_BUFF_DATA_TURBO_CHARGE
Definition effects.h:2320
@ FX_BUFF_DATA_CLOUD_NINE
Definition effects.h:2319
@ FX_BUFF_DATA_WATER_BLOCK
Definition effects.h:2318
#define ASSERT(condition)
@ gv_01_ENTRY_0
Definition entrances.h:1286
@ FX_INSTANCE_FLAG_DISMISS
Definition enums.h:3517
@ MERLEE_SPELL_COIN_BOOST
Definition enums.h:1914
@ MERLEE_SPELL_EXP_BOOST
Definition enums.h:1913
@ MERLEE_SPELL_ATK_BOOST
Definition enums.h:1911
@ MERLEE_SPELL_DEF_BOOST
Definition enums.h:1912
@ MERLEE_SPELL_NONE
Definition enums.h:1910
@ OVERLAY_NONE
Definition enums.h:2387
@ OVERLAY_SCREEN_MARIO
Definition enums.h:2395
@ OVERLAY_SCREEN_COLOR
Definition enums.h:2388
@ ACTOR_CLASS_ENEMY
Definition enums.h:2079
@ BUTTON_START
Definition enums.h:2787
@ BS_FLAGS1_10000
Definition enums.h:3584
@ BS_FLAGS1_PLAYER_IN_BACK
Definition enums.h:3588
@ BS_FLAGS1_DISABLE_CELEBRATION
Definition enums.h:3585
@ BS_FLAGS1_BATTLE_FLED
Definition enums.h:3586
@ BS_FLAGS1_HUSTLED
Definition enums.h:3594
@ BS_FLAGS1_STAR_POINTS_DROPPED
Definition enums.h:3592
@ BS_FLAGS1_SORT_ENEMIES_BY_POSX
Definition enums.h:3595
@ BS_FLAGS1_NO_GAME_OVER
Definition enums.h:3591
@ BS_FLAGS1_PARTNER_ACTING
Definition enums.h:3587
@ BS_FLAGS1_YIELD_TURN
Definition enums.h:3589
@ BS_FLAGS1_TRIGGER_EVENTS
Definition enums.h:3574
@ BS_FLAGS1_JUMP_CHARGED
Definition enums.h:3597
@ BS_FLAGS1_HAMMER_CHARGED
Definition enums.h:3596
@ BS_FLAGS1_SHOW_PLAYER_DECORATIONS
Definition enums.h:3567
@ BS_FLAGS1_ACTORS_VISIBLE
Definition enums.h:3564
@ BS_FLAGS1_EXECUTING_MOVE
Definition enums.h:3577
@ BTL_MSG_PLAYER_FROZEN
Definition enums.h:4069
@ BTL_MSG_PLAYER_POISONED
Definition enums.h:4070
@ BTL_MSG_TURBO_CHARGE_END
Definition enums.h:4100
@ BTL_MSG_PLAYER_PARALYZED
Definition enums.h:4072
@ BTL_MSG_ENEMY_ASLEEP
Definition enums.h:4076
@ BTL_MSG_PLAYER_CHARGED
Definition enums.h:4073
@ BTL_MSG_PLAYER_ASLEEP
Definition enums.h:4068
@ BTL_MSG_ENEMY_POISONED
Definition enums.h:4078
@ BTL_MSG_PLAYER_SHRUNK
Definition enums.h:4071
@ BTL_MSG_ENEMY_CANT_MOVE
Definition enums.h:4082
@ BTL_MSG_ENEMY_PARALYZED
Definition enums.h:4080
@ BTL_MSG_CLOUD_NINE_END
Definition enums.h:4098
@ BTL_MSG_ENEMY_FROZEN
Definition enums.h:4077
@ BTL_MSG_ENEMY_DAZED
Definition enums.h:4075
@ BTL_MSG_WATER_BLOCK_END
Definition enums.h:4096
@ BTL_MSG_FIRST_ACTION_TIP
Definition enums.h:4103
@ BTL_MSG_PARTNER_INJURED
Definition enums.h:4092
@ BTL_MSG_ENEMY_ELECTRIFIED
Definition enums.h:4081
@ BTL_MSG_ENEMY_SHRUNK
Definition enums.h:4079
@ BTL_MSG_PLAYER_DAZED
Definition enums.h:4067
@ DEBUG_CONTACT_DIE_IN_BATTLE
Definition enums.h:4269
@ DEBUG_CONTACT_DIE_ON_TOUCH
Definition enums.h:4268
@ DEBUG_CONTACT_AUTO_FLEE
Definition enums.h:4270
@ SCREEN_LAYER_FRONT
Definition enums.h:2382
@ SCREEN_LAYER_BACK
Definition enums.h:2383
@ DEMO_BTL_FLAG_ENABLED
Definition enums.h:3542
@ CAMERA_FLAG_DISABLED
Definition enums.h:4720
@ RUSH_FLAG_NONE
Definition enums.h:5329
@ RUSH_FLAG_MEGA
Definition enums.h:5330
@ RUSH_FLAG_POWER
Definition enums.h:5331
@ PHASE_PLAYER_HAPPY
Definition enums.h:2073
@ PHASE_MERLEE_ATTACK_BONUS
Definition enums.h:2070
@ PHASE_USE_DEFEND
Definition enums.h:2063
@ PHASE_RUN_AWAY_START
Definition enums.h:2060
@ PHASE_EXECUTE_ACTION
Definition enums.h:2058
@ PHASE_MERLEE_EXP_BONUS
Definition enums.h:2072
@ PHASE_ENEMY_BEGIN
Definition enums.h:2068
@ PHASE_USE_LIFE_SHROOM
Definition enums.h:2065
@ PHASE_PLAYER_BEGIN
Definition enums.h:2066
@ PHASE_MERLEE_DEFENSE_BONUS
Definition enums.h:2071
@ PHASE_ENEMY_END
Definition enums.h:2067
@ PHASE_PLAYER_END
Definition enums.h:2069
@ PHASE_DEATH
Definition enums.h:2061
@ PHASE_RUN_AWAY_FAIL
Definition enums.h:2064
@ PHASE_FIRST_STRIKE
Definition enums.h:2059
@ BTL_MENU_TYPE_SMASH
Definition enums.h:4227
@ BTL_MENU_TYPE_JUMP
Definition enums.h:4226
@ BTL_MENU_TYPE_CHANGE_PARTNER
Definition enums.h:4231
@ BTL_MENU_TYPE_ITEMS
Definition enums.h:4228
@ BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER
Definition enums.h:3607
@ BS_FLAGS2_STORED_TURBO_CHARGE_TURN
Definition enums.h:3610
@ BS_FLAGS2_IS_FIRST_STRIKE
Definition enums.h:3617
@ BS_FLAGS2_PLAYER_TURN_USED
Definition enums.h:3604
@ BS_FLAGS2_HAS_DRAINED_HP
Definition enums.h:3619
@ BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER
Definition enums.h:3606
@ BS_FLAGS2_HAS_RUSH
Definition enums.h:3620
@ BS_FLAGS2_CAN_FLEE
Definition enums.h:3608
@ BS_FLAGS2_PARTNER_TURN_USED
Definition enums.h:3605
@ BS_FLAGS2_DONT_STOP_MUSIC
Definition enums.h:3618
@ BS_FLAGS2_IGNORE_DARKNESS
Definition enums.h:3614
@ BS_FLAGS2_PEACH_BATTLE
Definition enums.h:3609
@ BS_FLAGS2_HIDE_BUFF_COUNTERS
Definition enums.h:3615
@ BS_FLAGS2_DROP_WHACKA_BUMP
Definition enums.h:3621
@ ENCOUNTER_TRIGGER_JUMP
Definition enums.h:269
@ ENCOUNTER_TRIGGER_HAMMER
Definition enums.h:271
@ ENCOUNTER_TRIGGER_PARTNER
Definition enums.h:273
@ ENCOUNTER_TRIGGER_SPIN
Definition enums.h:270
@ STATUS_KEY_PARALYZE
Definition enums.h:2201
@ STATUS_KEY_FROZEN
Definition enums.h:2203
@ STATUS_TURN_MOD_DIZZY
Definition enums.h:2232
@ STATUS_KEY_FEAR
Definition enums.h:2199
@ STATUS_KEY_SLEEP
Definition enums.h:2202
@ STATUS_KEY_STONE
Definition enums.h:2208
@ STATUS_KEY_STOP
Definition enums.h:2204
@ STATUS_KEY_SHRINK
Definition enums.h:2206
@ STATUS_KEY_DIZZY
Definition enums.h:2200
@ STATUS_KEY_POISON
Definition enums.h:2205
@ STATUS_KEY_DAZE
Definition enums.h:2209
@ BTL_CAM_MIDPOINT_CLOSE
Definition enums.h:4831
@ BTL_CAM_PARTNER_INJURED
Definition enums.h:4875
@ BTL_CAM_DEFAULT
Definition enums.h:4823
@ BTL_CAM_INTERRUPT
Definition enums.h:4822
@ BTL_CAM_PLAYER_FLEE
Definition enums.h:4846
@ BTL_CAM_REPOSITION
Definition enums.h:4840
@ BTL_CAM_VIEW_ENEMIES
Definition enums.h:4824
@ BTL_CAM_PLAYER_STATUS_AFFLICTED
Definition enums.h:4854
@ BTL_SUBSTATE_FIRST_STRIKE_AWAIT_ENEMY_READY
Definition enums.h:3681
@ BTL_SUBSTATE_PARTNER_MOVE_EXECUTE_MOVE
Definition enums.h:3800
@ BTL_SUBSTATE_END_TRAINING_DONE
Definition enums.h:3879
@ BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_ENEMY_DONE
Definition enums.h:3689
@ BTL_SUBSTATE_PLAYER_MOVE_EXECUTE_MOVE
Definition enums.h:3789
@ BTL_SUBSTATE_FIRST_STRIKE_AWAIT_SCRIPTS
Definition enums.h:3682
@ BTL_SUBSTATE_CHANGE_PARTNER_EXEC_PUT_AWAY
Definition enums.h:3866
@ BTL_SUBSTATE_END_TURN_PERFORM_SWAP
Definition enums.h:3706
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_CLOUD_NINE
Definition enums.h:3714
@ BTL_SUBSTATE_BEGIN_PARTNER_TURN_AWAIT_TURN_SCRIPT
Definition enums.h:3728
@ BTL_SUBSTATE_DEFEAT_INIT
Definition enums.h:3857
@ BTL_SUBSTATE_DEFEAT_CHECK_LIFE_SHROOM
Definition enums.h:3858
@ BTL_SUBSTATE_INIT
Definition enums.h:3670
@ BTL_SUBSTATE_END_DEMO_BATTLE_EXEC_STAGE_SCRIPT
Definition enums.h:3914
@ BTL_SUBSTATE_END_BATTLE_CLEANUP
Definition enums.h:3888
@ BTL_SUBSTATE_NORMAL_START_FADE_IN
Definition enums.h:3676
@ BTL_SUBSTATE_VICTORY_DONE
Definition enums.h:3850
@ BTL_SUBSTATE_BEGIN_PARTNER_TURN_EXEC_TURN_SCRIPT
Definition enums.h:3727
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_RESET_STATE
Definition enums.h:3722
@ BTL_SUBSTATE_9_3
Definition enums.h:3736
@ BTL_SUBSTATE_NEXT_ENEMY_DONE
Definition enums.h:3812
@ BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_ENEMY_READY
Definition enums.h:3687
@ BTL_SUBSTATE_NORMAL_START_CREATE_ENEMIES
Definition enums.h:3674
@ BTL_SUBSTATE_END_BATTLE_INIT
Definition enums.h:3884
@ BTL_SUBSTATE_9_1
Definition enums.h:3734
@ BTL_SUBSTATE_9_4
Definition enums.h:3737
@ BTL_SUBSTATE_BEGIN_PARTNER_TURN_INIT
Definition enums.h:3725
@ BTL_SUBSTATE_PARTNER_MOVE_AWAIT_ENEMY_STATUS_POPUP
Definition enums.h:3805
@ BTL_SUBSTATE_RUN_AWAY_EXEC_SCRIPT
Definition enums.h:3834
@ BTL_SUBSTATE_ENEMY_FIRST_STRIKE_INIT
Definition enums.h:3692
@ BTL_SUBSTATE_CHANGE_PARTNER_EXEC_PHASE
Definition enums.h:3869
@ BTL_SUBSTATE_PLAYER_MOVE_POST_PLAYER_STATUS_POPUP
Definition enums.h:3795
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_WATER_BLOCK
Definition enums.h:3712
@ BTL_SUBSTATE_BEGIN_PARTNER_TURN_END_DELAY
Definition enums.h:3729
@ BTL_SUBSTATE_END_TURN_CHECK_FOR_SWAP
Definition enums.h:3702
@ BTL_SUBSTATE_PARTNER_MOVE_AWAIT_PARTNER_STATUS_POPUP
Definition enums.h:3802
@ BTL_SUBSTATE_RUN_AWAY_GIVE_STAR_POINTS
Definition enums.h:3838
@ BTL_SUBSTATE_NEXT_ENEMY_UNUSED_1
Definition enums.h:3811
@ BTL_SUBSTATE_FIRST_STRIKE_AWAIT_ENEMY_DONE
Definition enums.h:3683
@ BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_SCRIPTS
Definition enums.h:3688
@ BTL_SUBSTATE_RUN_AWAY_AWAIT_SCRIPT
Definition enums.h:3835
@ BTL_SUBSTATE_END_TRAINING_CHECK_OUTTA_SIGHT
Definition enums.h:3876
@ BTL_SUBSTATE_ENEMY_MOVE_AWAIT_PLAYER_POPUP_DONE
Definition enums.h:3818
@ BTL_SUBSTATE_VICTORY_AWAIT_SWAP
Definition enums.h:3854
@ BTL_SUBSTATE_ENEMY_MOVE_EXECUTE
Definition enums.h:3815
@ BTL_SUBSTATE_9_INIT
Definition enums.h:3733
@ BTL_SUBSTATE_END_DEMO_BATTLE_CLEANUP
Definition enums.h:3916
@ BTL_SUBSTATE_PARTNER_FIRST_STRIKE_INIT
Definition enums.h:3686
@ BTL_SUBSTATE_ENEMY_MOVE_POST_PARTNER_POPUP_DELAY
Definition enums.h:3822
@ BTL_SUBSTATE_ENEMY_MOVE_UNUSED_1
Definition enums.h:3816
@ BTL_SUBSTATE_PARTNER_MOVE_DONE
Definition enums.h:3807
@ BTL_SUBSTATE_BEGIN_PARTNER_TURN_AWAIT_RECOVER_DONE
Definition enums.h:3726
@ BTL_SUBSTATE_9_2
Definition enums.h:3735
@ BTL_SUBSTATE_CHANGE_PARTNER_INIT
Definition enums.h:3865
@ BTL_SUBSTATE_END_TRAINING_AWAIT_OUTTA_SIGHT
Definition enums.h:3877
@ BTL_SUBSTATE_END_BATTLE_EXEC_STAGE_SCRIPT
Definition enums.h:3886
@ BTL_SUBSTATE_END_PLAYER_TURN_AWAIT_HAPPY
Definition enums.h:3827
@ BTL_SUBSTATE_VICTORY_AWAIT_RECOVER_KO
Definition enums.h:3852
@ BTL_SUBSTATE_ENEMY_MOVE_AWAIT_PARTNER_POPUP_DONE
Definition enums.h:3821
@ BTL_SUBSTATE_END_TRAINING_INIT
Definition enums.h:3874
@ BTL_SUBSTATE_PARTNER_MOVE_POST_ENEMY_STATUS_POPUP
Definition enums.h:3806
@ BTL_SUBSTATE_BEGIN_TURN_INIT
Definition enums.h:3696
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_RECOVER
Definition enums.h:3720
@ BTL_SUBSTATE_END_TURN_AWAIT_SCRIPTS
Definition enums.h:3703
@ BTL_SUBSTATE_END_TURN_INIT
Definition enums.h:3701
@ BTL_SUBSTATE_END_DEMO_BATTLE_FADE_OUT
Definition enums.h:3913
@ BTL_SUBSTATE_END_BATTLE_FADE_OUT
Definition enums.h:3885
@ BTL_SUBSTATE_PLAYER_MOVE_SHOW_TIP_DELAY
Definition enums.h:3788
@ BTL_SUBSTATE_9_7
Definition enums.h:3740
@ BTL_SUBSTATE_END_PLAYER_TURN_AWAIT_SWAP
Definition enums.h:3828
@ BTL_SUBSTATE_DEFEND_AWAIT_SCRIPT
Definition enums.h:3843
@ BTL_SUBSTATE_PARTNER_MOVE_POST_PARTNER_STATUS_POPUP
Definition enums.h:3803
@ BATTLE_SUBSTATE_PREPARE_MENU_DIPPING
Definition enums.h:3746
@ BTL_SUBSTATE_VICTORY_CHECK_SWAP
Definition enums.h:3853
@ BTL_SUBSTATE_PLAYER_MOVE_AWAIT_PLAYER_STATUS_POPUP
Definition enums.h:3794
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_COMMAND_RECOVER
Definition enums.h:3711
@ BTL_SUBSTATE_CHANGE_PARTNER_DONE
Definition enums.h:3871
@ BTL_SUBSTATE_RUN_AWAY_DONE
Definition enums.h:3839
@ BTL_SUBSTATE_PLAYER_MOVE_AWAIT_DONE
Definition enums.h:3796
@ BTL_SUBSTATE_END_TRAINING_RESET_CAM
Definition enums.h:3878
@ BTL_SUBSTATE_NORMAL_START_CHECK_FIRST_STRIKE
Definition enums.h:3675
@ BTL_SUBSTATE_END_TURN_UNUSED_4
Definition enums.h:3705
@ BTL_SUBSTATE_FIRST_STRIKE_INIT
Definition enums.h:3680
@ BTL_SUBSTATE_END_TURN_START_SCRIPTS
Definition enums.h:3707
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_END_DELAY
Definition enums.h:3721
@ BTL_SUBSTATE_RUN_AWAY_AWAIT_POST_FAILURE
Definition enums.h:3837
@ BTL_SUBSTATE_VICTORY_CHECK_OUTTA_SIGHT
Definition enums.h:3846
@ BTL_SUBSTATE_PARTNER_MOVE_HANDLE_RESULTS
Definition enums.h:3801
@ BTL_SUBSTATE_END_TRAINING_AWAIT_RECOVERING
Definition enums.h:3875
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_INIT
Definition enums.h:3710
@ BTL_SUBSTATE_END_BATTLE_AWAIT_STAGE_SCRIPT
Definition enums.h:3887
@ BTL_SUBSTATE_9_6
Definition enums.h:3739
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_DAMAGE
Definition enums.h:3719
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_TURBO_CHARGE
Definition enums.h:3716
@ BTL_SUBSTATE_NORMAL_START_INIT
Definition enums.h:3673
@ BTL_SUBSTATE_PLAYER_MOVE_CHECK_PLAYER_STATUS
Definition enums.h:3793
@ BTL_SUBSTATE_VICTORY_CHECK_MERLEE
Definition enums.h:3848
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_WATER_BLOCK
Definition enums.h:3713
@ BTL_SUBSTATE_CHANGE_PARTNER_LOAD_NEW_PARTNER
Definition enums.h:3867
@ BTL_SUBSTATE_9_5
Definition enums.h:3738
@ BTL_SUBSTATE_PARTNER_MOVE_CHECK_ENEMY_STATUS
Definition enums.h:3804
@ BTL_SUBSTATE_NEXT_ENEMY_INIT
Definition enums.h:3810
@ BTL_SUBSTATE_END_DEMO_BATTLE_AWAIT_STAGE_SCRIPT
Definition enums.h:3915
@ BTL_SUBSTATE_PARTNER_MOVE_INIT
Definition enums.h:3799
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_TURBO_CHARGE
Definition enums.h:3717
@ BTL_SUBSTATE_VICTORY_AWAIT_OUTTA_SIGHT
Definition enums.h:3847
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_OUTTA_SIGHT
Definition enums.h:3718
@ BTL_SUBSTATE_BEGIN_PARTNER_TURN_RESET_STATE
Definition enums.h:3730
@ BTL_SUBSTATE_CHANGE_PARTNER_EXEC_BRING_OUT
Definition enums.h:3868
@ BTL_SUBSTATE_END_PLAYER_TURN_DONE
Definition enums.h:3829
@ BTL_SUBSTATE_END_TURN_BEGIN_NEXT
Definition enums.h:3704
@ BTL_SUBSTATE_VICTORY_RECOVER_STATUS
Definition enums.h:3851
@ BTL_SUBSTATE_BEGIN_TURN_AWAIT_ENEMY_DEATH
Definition enums.h:3698
@ BTL_SUBSTATE_ENEMY_MOVE_POST_PLAYER_POPUP_DELAY
Definition enums.h:3819
@ BTL_SUBSTATE_PLAYER_MOVE_POST_ENEMY_STATUS_POPUP
Definition enums.h:3792
@ BTL_SUBSTATE_BEGIN_TURN_AWAIT_ENEMY_SCRIPTS
Definition enums.h:3697
@ BTL_SUBSTATE_ENEMY_MOVE_AWAIT_SCRIPTS
Definition enums.h:3817
@ BTL_SUBSTATE_PLAYER_MOVE_INIT
Definition enums.h:3786
@ BTL_SUBSTATE_DEFEAT_DONE
Definition enums.h:3860
@ BTL_SUBSTATE_ENEMY_MOVE_DONE
Definition enums.h:3823
@ BTL_SUBSTATE_RUN_AWAY_EXEC_POST_FAILURE
Definition enums.h:3836
@ BTL_SUBSTATE_END_PLAYER_TURN_CHECK_HAPPY
Definition enums.h:3826
@ BTL_SUBSTATE_ENEMY_MOVE_CHECK_PARTNER
Definition enums.h:3820
@ BTL_SUBSTATE_NORMAL_START_DONE
Definition enums.h:3677
@ BTL_SUBSTATE_DEFEND_INIT
Definition enums.h:3842
@ BTL_SUBSTATE_ENEMY_FIRST_STRIKE_AWAIT_SCRIPTS
Definition enums.h:3693
@ BTL_SUBSTATE_VICTORY_AWAIT_MERLEE
Definition enums.h:3849
@ BTL_SUBSTATE_END_DEMO_BATTLE_INIT
Definition enums.h:3912
@ BTL_SUBSTATE_PLAYER_MOVE_BEGIN_SHOW_TIP
Definition enums.h:3787
@ BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_CLOUD_NINE
Definition enums.h:3715
@ BTL_SUBSTATE_DEFEAT_AWAIT_LIFE_SHROOM
Definition enums.h:3859
@ BTL_SUBSTATE_PLAYER_MOVE_AWAIT_ENEMY_STATUS_POPUP
Definition enums.h:3791
@ BTL_SUBSTATE_CHANGE_PARTNER_AWAIT_PHASE
Definition enums.h:3870
@ BTL_SUBSTATE_PLAYER_MOVE_HANDLE_RESULTS
Definition enums.h:3790
@ BATTLE_STATE_BEGIN_PARTNER_TURN
Definition enums.h:3638
@ BATTLE_STATE_ENEMY_MOVE
Definition enums.h:3651
@ BATTLE_STATE_NEXT_ENEMY
Definition enums.h:3650
@ BATTLE_STATE_0
Definition enums.h:3630
@ BATTLE_STATE_ENEMY_FIRST_STRIKE
Definition enums.h:3634
@ BATTLE_STATE_RUN_AWAY
Definition enums.h:3654
@ BATTLE_STATE_FIRST_STRIKE
Definition enums.h:3632
@ BATTLE_STATE_PREPARE_MENU
Definition enums.h:3642
@ BATTLE_STATE_SWITCH_TO_PARTNER
Definition enums.h:3641
@ BATTLE_STATE_PLAYER_MENU
Definition enums.h:3643
@ BATTLE_STATE_END_DEMO_BATTLE
Definition enums.h:3665
@ BATTLE_STATE_CELEBRATION
Definition enums.h:3663
@ BATTLE_STATE_SWITCH_TO_PLAYER
Definition enums.h:3640
@ BATTLE_STATE_BEGIN_TURN
Definition enums.h:3635
@ BATTLE_STATE_PARTNER_FIRST_STRIKE
Definition enums.h:3633
@ BATTLE_STATE_END_PARTNER_TURN
Definition enums.h:3653
@ BATTLE_STATE_END_PLAYER_TURN
Definition enums.h:3652
@ BATTLE_STATE_PEACH_MENU
Definition enums.h:3645
@ BATTLE_STATE_PARTNER_MENU
Definition enums.h:3644
@ BATTLE_STATE_BEGIN_PLAYER_TURN
Definition enums.h:3637
@ BATTLE_STATE_9
Definition enums.h:3639
@ BATTLE_STATE_TWINK_MENU
Definition enums.h:3646
@ BATTLE_STATE_END_BATTLE
Definition enums.h:3662
@ BATTLE_STATE_END_TURN
Definition enums.h:3636
@ WINDOW_GROUP_ALL
Definition enums.h:5322
@ DMG_SRC_DEFAULT
Definition enums.h:1988
@ ABILITY_BERSERKER
Definition enums.h:457
@ ABILITY_QUICK_CHANGE
Definition enums.h:462
@ ABILITY_FEELING_FINE
Definition enums.h:450
@ ABILITY_POWER_RUSH
Definition enums.h:466
@ ABILITY_CHILL_OUT
Definition enums.h:453
@ ABILITY_MEGA_RUSH
Definition enums.h:456
@ ABILITY_DIZZY_ATTACK
Definition enums.h:481
@ ABILITY_ZAP_TAP
Definition enums.h:455
@ ABILITY_HAPPY_HEART
Definition enums.h:454
@ ABILITY_CRAZY_HEART
Definition enums.h:467
@ ABILITY_HAPPY_FLOWER
Definition enums.h:488
@ ABILITY_RUNAWAY_PAY
Definition enums.h:459
@ SOUND_INFLICT_KO
Definition enums.h:1545
@ SOUND_FROZEN_SHATTER
Definition enums.h:722
@ SOUND_DESTROY_WATER_BLOCK
Definition enums.h:1015
@ SOUND_COIN_PICKUP
Definition enums.h:922
@ ACTOR_PLAYER
Definition enums.h:2085
@ ACTOR_PARTNER
Definition enums.h:2086
@ ACTOR_ENEMY0
Definition enums.h:2087
@ ACTOR_FLAG_SKIP_TURN
Definition enums.h:3336
@ ACTOR_FLAG_HEALTH_BAR_HIDDEN
Definition enums.h:3338
@ ACTOR_FLAG_SHOW_STATUS_ICONS
Definition enums.h:3343
@ ACTOR_FLAG_TARGET_ONLY
Battle ends even if undefeated. No turn.
Definition enums.h:3334
@ ACTOR_FLAG_NO_HEALTH_BAR
Definition enums.h:3337
@ ACTOR_FLAG_NO_DMG_APPLY
Damage is not applied to actor HP.
Definition enums.h:3340
@ ACTOR_FLAG_NO_ATTACK
Skip attack turn.
Definition enums.h:3339
@ ACTOR_FLAG_USING_IDLE_ANIM
Definition enums.h:3342
@ OUTCOME_ENEMY_FLED
Definition enums.h:1905
@ OUTCOME_PLAYER_WON
Definition enums.h:1902
@ OUTCOME_PLAYER_LOST
Definition enums.h:1903
@ OUTCOME_PLAYER_FLED
Definition enums.h:1904
@ PARTNER_BOMBETTE
Definition enums.h:2888
@ PARTNER_KOOPER
Definition enums.h:2887
@ PARTNER_GOOMBARIO
Definition enums.h:2886
@ BLOCK_RESULT_NONE
Definition enums.h:1972
@ FIRST_STRIKE_NONE
Definition enums.h:3458
@ FIRST_STRIKE_ENEMY
Definition enums.h:3460
@ FIRST_STRIKE_PLAYER
Definition enums.h:3459
@ ACTION_RESULT_NONE
Definition enums.h:1963
@ BTL_MENU_IDX_PARTNER
Definition enums.h:4216
@ BTL_MENU_IDX_STRATEGY
Definition enums.h:4218
@ BTL_MENU_IDX_SMASH
Definition enums.h:4213
@ BTL_MENU_IDX_STAR_POWER
Definition enums.h:4217
@ BTL_MENU_IDX_MAIN
Definition enums.h:4211
@ BTL_MENU_IDX_JUMP
Definition enums.h:4212
@ BTL_MENU_IDX_DIP
Definition enums.h:4215
@ BTL_MENU_IDX_ABILITY
Definition enums.h:4220
@ BTL_MENU_IDX_ITEMS
Definition enums.h:4214
@ EVENT_HIT
Definition enums.h:2132
@ EVENT_BEGIN_FIRST_STRIKE
Definition enums.h:2173
@ EVENT_END_FIRST_STRIKE
Definition enums.h:2171
@ EVENT_DEATH
Definition enums.h:2153
@ EVENT_RECOVER_FROM_KO
Definition enums.h:2170
@ EVENT_32
Definition enums.h:2168
@ EVENT_RECOVER_STATUS
Definition enums.h:2167
@ ACTOR_PART_FLAG_TRANSPARENT
Definition enums.h:3357
@ BTL_SUBSTATE_PLAYER_MENU_DIPPING_1
Definition enums.h:3968
@ BTL_DARKNESS_STATE_NONE
Definition enums.h:6364
@ CAM_TATTLE
Definition enums.h:1802
@ CAM_DEFAULT
Definition enums.h:1800
@ CAM_BATTLE
Definition enums.h:1801
@ EVT_PRIORITY_A
Definition evt.h:153
#define ApiStatus_DONE2
Definition evt.h:118
@ EVT_FLAG_RUN_IMMEDIATELY
don't wait for next update_scripts call
Definition evt.h:161
void load_partner_actor(void)
Definition 190B20.c:1422
void disable_partner_blur(void)
void set_screen_overlay_params_back(u8, f32)
s32 btl_are_all_enemies_defeated(void)
Definition 190B20.c:636
s32 is_ability_active(s32 arg0)
Definition inventory.c:1736
s32 player_team_is_ability_active(Actor *actor, s32 ability)
Definition 190B20.c:2765
void kill_all_scripts(void)
void get_map_IDs_by_name_checked(const char *mapName, s16 *areaID, s16 *mapID)
Same as get_map_IDs_by_name, but will panic if the map doesn't exist.
Definition world.c:247
s32 bgm_set_song(s32 playerIndex, s32 songID, s32 variation, s32 fadeOutTime, s16 volume)
void setup_status_bar_for_battle(void)
Definition inventory.c:1472
void * load_asset_by_name(const char *assetName, u32 *decompressedSize)
Definition world.c:251
void remove_status_debuff(s32)
void reset_all_actor_sounds(Actor *)
Definition 190B20.c:2938
s32 btl_check_player_defeated(void)
Definition 190B20.c:661
void set_background(BackgroundHeader *)
Definition background.c:40
void decrement_status_bar_disabled(void)
Definition inventory.c:1657
void btl_cam_set_zoom(s16)
Definition camera.c:1984
void dispatch_event_actor(Actor *, s32)
Definition 1A5830.c:103
void load_battle_hit_asset(const char *hitName)
Definition collision.c:166
void load_data_for_models(struct ModelNode *model, s32 romOffset, s32 size)
Definition model.c:3318
void btl_update_ko_status(void)
Definition 190B20.c:2869
void remove_status_static(s32)
void func_8023E104(void)
Definition 16C8E0.c:150
void enable_partner_blur(void)
void reset_actor_turn_info(void)
Definition 190B20.c:978
void btl_cam_set_target_pos(f32, f32, f32)
Definition camera.c:1962
void set_screen_overlay_params_front(u8, f32)
void close_action_command_instruction_popup(void)
void load_map_bg(char *optAssetName)
Definition background.c:14
s32 get_asset_offset(char *, s32 *)
Definition world.c:273
void remove_all_effects(void)
Definition effects.c:278
void remove_status_transparent(s32)
void dispatch_event_player(s32)
Definition dmg_player.c:131
void btl_set_player_idle_anims(void)
void status_bar_stop_blinking_starpoints(void)
Definition inventory.c:1648
void btl_cam_use_preset(s32)
Definition camera.c:1919
void btl_cam_target_actor(s32)
Definition camera.c:1926
Evt * start_script(EvtScript *source, s32 priority, s32 initialState)
s32 find_item(s32)
Search player inventory for itemID and return first matching array index.
Definition inventory.c:264
void btl_cam_set_zoffset(s16)
Definition camera.c:1996
s32 func_80263230(Actor *, Actor *)
Definition 190B20.c:558
void status_bar_start_blinking_starpoints(void)
Definition inventory.c:1639
void set_screen_overlay_center(s32, s32, s32, s32)
Actor * get_actor(s32 actorID)
Definition actor_api.c:155
void set_screen_overlay_color(s32, u8, u8, u8)
void btl_show_battle_message(s32 messageIndex, s32 duration)
void func_8023E11C(void)
Definition 16C8E0.c:155
void btl_cam_move(s16)
Definition camera.c:1953
s32 general_heap_free(void *data)
Definition heap.c:18
void deduct_current_move_fp(void)
Definition 190B20.c:961
void btl_delete_player_actor(Actor *player)
Definition 16C8E0.c:1175
s32 btl_cam_is_moving_done(void)
Definition camera.c:1980
void decode_yay0(void *src, void *dst)
void set_windows_visible(s32 groupIdx)
Definition windows.c:445
s32 dispatch_damage_event_actor_0(Actor *actor, s32 damageAmount, s32 event)
Definition 1A5830.c:889
s32 inflict_status_set_duration(Actor *actor, s32 statusTypeKey, s32 statusDurationKey, s32 duration)
Definition 190B20.c:2581
s32 does_script_exist(s32 id)
void load_player_actor(void)
Definition 190B20.c:1208
void btl_delete_actor(Actor *actor)
Definition 16C8E0.c:1110
f32 sin_rad(f32 x)
Definition 43F0.c:712
s32 btl_is_popup_displayed(void)
void create_current_pos_target_list(Actor *actor)
Definition 190B20.c:472
void btl_cam_unfreeze(void)
Definition camera.c:2002
s32 btl_check_enemies_defeated(void)
Definition 190B20.c:653
void set_curtain_scale_goal(f32 scale)
Definition curtains.c:285
void remove_status_chill_out(s32)
void increment_status_bar_disabled(void)
Definition inventory.c:1665
void dispatch_event_partner(s32)
Definition dmg_partner.c:7
void set_game_mode(s32 modeID)
Definition game_modes.c:127
@ GAME_MODE_END_BATTLE
Definition game_modes.h:16
@ GAME_MODE_GAME_OVER
Definition game_modes.h:14
EvtScript BtlPutPartnerAway
Definition 16C8E0.c:51
EvtScript EVS_PeachEnterStage
EvtScript EVS_ApplyDizzyAttack
EvtScript EVS_PlayerRegainAbility
EvtScript EVS_Peach_HandlePhase
EvtScript BtlBringPartnerOut
Definition 16C8E0.c:77
EvtScript EVS_Mario_HandlePhase
EvtScript EVS_MarioEnterStage
ModelNode * root
Definition model.h:174
ShapeFileHeader header
Definition model.h:183
s32 flags
Definition npc.h:295
u8 damageTaken
Definition npc.h:375
Enemy * curEnemy
Definition npc.h:394
void func_8003E514(s8 arg0)
Definition npc.c:2265
b8 hasMerleeCoinBonus
Definition npc.h:374
FieldStatus dizzyAttack
Definition npc.h:399
s8 forbidFleeing
Definition npc.h:379
s16 duration
Definition npc.h:362
s8 status
Definition npc.h:360
EncounterStatus gCurrentEncounter
Definition encounter.c:176
s8 instigatorValue
Definition npc.h:378
s8 battleOutcome
Definition npc.h:372
s8 dropWhackaBump
Definition npc.h:381
s8 encountered
Definition npc.h:297
s8 firstStrikeType
Definition npc.h:367
void sfx_play_sound(s32 soundID)
Definition sfx.c:517
#define DMA_COPY_SEGMENT(segment)
Definition macros.h:529
#define BSS
Definition macros.h:7
#define ARRAY_COUNT(arr)
Definition macros.h:40
#define DEG_TO_RAD(deg)
Definition macros.h:138
#define SP_PER_SEG
Definition macros.h:103
#define SP_PER_BAR
Definition macros.h:102
#define LAST_DEMO_SCENE_IDX
Definition macros.h:112
EvtScript * preBattle
Definition battle.h:185
char * texture
Definition battle.h:182
const char * shape
Definition battle.h:183
#define PERIL_THRESHOLD
Definition battle.h:267
Stage * stage
Definition battle.h:199
Formation * stageFormation
Definition battle.h:190
Formation * formation
Definition battle.h:198
s32 formationSize
Definition battle.h:197
s32 stageEnemyChance
Definition battle.h:191
Stage * stage
Definition battle.h:208
EvtScript * postBattle
Definition battle.h:186
EvtScript * onBattleStart
Definition battle.h:200
s32 stageEnemyCount
Definition battle.h:189
const char * hit
Definition battle.h:184
char * bg
Definition battle.h:187
#define DANGER_THRESHOLD
Definition battle.h:266
Zero-terminated.
Definition battle.h:195
Zero-terminated.
Definition battle.h:206
void(* initBattleCallback)(void)
struct Stage * curStage
struct Evt * camMovementScript
s8 moveCategory
0 = jump, 1 = hammer, 5 = partner, ...
s8 lastPlayerMenuSelection[16]
struct EffectInstance * waterBlockEffect
void(* preUpdateCallback)(void)
struct EffectInstance * cloudNineEffect
struct Actor * curTurnEnemy
struct Actor * partnerActor
struct Evt * controlScript
struct Actor * playerActor
s8 lastPartnerMenuSelection[16]
struct Actor * enemyActors[24]
struct EffectInstance * buffEffect
union Camera::@17 params
u8 Addr[]
Linker symbol address, as in ld_addrs.h.
Definition types.h:16
s32 gBattleState
Definition battle.c:10
s32 gCurrentBattleID
Definition battle.c:16
BackgroundHeader gBackgroundImage
GameStatus * gGameStatusPtr
Definition main_loop.c:32
struct Battle * gOverrideBattlePtr
Definition battle.c:18
Camera gCameras[4]
Definition cam_main.c:17
PlayerData gPlayerData
Definition 77480.c:40
BattleStatus gBattleStatus
Definition battle.c:11
s32 gCurrentCameraID
Definition cam_math.c:4
s32 gCurrentStageID
Definition battle.c:17
s32 gBattleSubState
Definition battle.c:14
MoveData gMoveTable[]
StatusBar gStatusBar
Definition inventory.c:23
s32 gLastDrawBattleState
Definition battle.c:12