2020-10-15 05:49:49 +02:00
|
|
|
#include "common.h"
|
2021-07-21 13:43:13 +02:00
|
|
|
#include "script_api/battle.h"
|
2021-03-27 18:48:33 +01:00
|
|
|
#include "ld_addrs.h"
|
2021-11-17 15:43:50 +01:00
|
|
|
#include "effects.h"
|
|
|
|
#include "hud_element.h"
|
|
|
|
#include "battle/battle.h"
|
2022-09-08 14:21:07 +02:00
|
|
|
#include "model.h"
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-10-16 16:22:18 +02:00
|
|
|
extern StageListRow* D_800DC064;
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2021-03-19 19:17:02 +01:00
|
|
|
extern s16 D_802809F6;
|
2022-05-05 16:08:16 +02:00
|
|
|
extern s16 D_802809F8;
|
2021-03-19 19:17:02 +01:00
|
|
|
extern s32 D_80280A30;
|
2022-09-08 14:21:07 +02:00
|
|
|
extern EvtScript D_80280EB8[];
|
|
|
|
extern s32 D_80281454[];
|
|
|
|
extern EvtScript D_80284A20[];
|
|
|
|
extern EvtScript D_80284A30[];
|
|
|
|
|
2022-09-24 17:21:54 +02:00
|
|
|
BSS s32 D_8029F240;
|
|
|
|
BSS u8 D_8029F244;
|
|
|
|
BSS s32 D_8029F248;
|
|
|
|
BSS s32 D_8029F24C;
|
|
|
|
BSS s32 D_8029F250;
|
|
|
|
BSS s32 D_8029F254;
|
|
|
|
BSS s32 D_8029F258;
|
|
|
|
BSS s32 D_8029F25C;
|
|
|
|
BSS s32 D_8029F260;
|
|
|
|
BSS s32 D_8029F264;
|
2021-03-19 19:17:02 +01:00
|
|
|
|
2022-11-01 08:41:14 +01:00
|
|
|
s32 dispatch_damage_event_player_0(s32 damageAmount, s32 event);
|
|
|
|
|
2021-07-21 13:43:13 +02:00
|
|
|
void btl_merlee_on_start_turn(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
EncounterStatus* currentEncounter = &gCurrentEncounter;
|
2022-05-27 15:03:19 +02:00
|
|
|
PlayerData* playerData = &gPlayerData;
|
2021-07-21 13:43:13 +02:00
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
do {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) &&
|
|
|
|
battleStatus->nextMerleeSpellType != MERLEE_SPELL_3 &&
|
|
|
|
battleStatus->nextMerleeSpellType != MERLEE_SPELL_4 &&
|
2022-05-27 15:03:19 +02:00
|
|
|
playerData->merleeCastsLeft > 0)
|
|
|
|
{
|
|
|
|
if (playerData->merleeTurnCount <= 0) {
|
|
|
|
s32 temp = rand_int(100);
|
|
|
|
|
|
|
|
if (currentEncounter->currentEnemy != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (currentEncounter->currentEnemy->flags & ACTOR_FLAG_40000) {
|
2022-05-27 15:03:19 +02:00
|
|
|
if (temp <= 45) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_1;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 90) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_3;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
} else if (temp <= 30) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_1;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 60) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 80) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_3;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_4;
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 30) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_1;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 60) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 80) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_3;
|
2021-07-21 13:43:13 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_4;
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
|
|
|
temp = rand_int(10) + 6;
|
|
|
|
playerData->merleeTurnCount = temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (playerData->merleeTurnCount >= 2) {
|
|
|
|
playerData->merleeTurnCount--;
|
2021-07-21 13:43:13 +02:00
|
|
|
} else {
|
2022-05-27 15:03:19 +02:00
|
|
|
playerData->merleeTurnCount = 0;
|
|
|
|
battleStatus->nextMerleeSpellType = playerData->merleeSpellType;
|
|
|
|
playerData->merleeCastsLeft--;
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
} while (0); // TODO: required to match
|
|
|
|
}
|
2021-07-21 13:43:13 +02:00
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
void btl_merlee_on_first_strike(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
EncounterStatus* currentEncounter = &gCurrentEncounter;
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
|
|
|
|
do {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) &&
|
|
|
|
battleStatus->nextMerleeSpellType != MERLEE_SPELL_3 &&
|
|
|
|
battleStatus->nextMerleeSpellType != MERLEE_SPELL_4 &&
|
2022-05-27 15:03:19 +02:00
|
|
|
playerData->merleeCastsLeft > 0)
|
|
|
|
{
|
|
|
|
if (playerData->merleeTurnCount <= 0) {
|
|
|
|
s32 temp = rand_int(100);
|
|
|
|
|
|
|
|
if (currentEncounter->currentEnemy != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (currentEncounter->currentEnemy->flags & ACTOR_FLAG_40000) {
|
2022-05-27 15:03:19 +02:00
|
|
|
if (temp <= 45) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_1;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 90) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_3;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
} else if (temp <= 30) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_1;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 60) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 80) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_3;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_4;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
} else if (temp <= 30) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_1;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 60) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if (temp <= 80) {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_3;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
playerData->merleeSpellType = MERLEE_SPELL_4;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (playerData->merleeSpellType != MERLEE_SPELL_4) {
|
2022-05-27 15:03:19 +02:00
|
|
|
// same outcome either way. has to be written like this, and the check does exist in the code. bug?
|
|
|
|
if (playerData->merleeTurnCount == -1) {
|
|
|
|
temp = rand_int(5) + 5;
|
|
|
|
} else {
|
|
|
|
temp = rand_int(5) + 5;
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
temp = rand_int(8) + 5;
|
|
|
|
}
|
|
|
|
playerData->merleeTurnCount = temp;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (playerData->merleeSpellType == MERLEE_SPELL_3 || playerData->merleeSpellType == MERLEE_SPELL_4) {
|
2022-05-27 15:03:19 +02:00
|
|
|
if (playerData->merleeTurnCount >= 2) {
|
|
|
|
playerData->merleeTurnCount--;
|
|
|
|
} else {
|
|
|
|
battleStatus->nextMerleeSpellType = playerData->merleeSpellType;
|
|
|
|
playerData->merleeTurnCount = 0;
|
|
|
|
playerData->merleeCastsLeft--;
|
|
|
|
}
|
|
|
|
}
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
} while (0); // TODO: required to match
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_set_state(s32 battleState) {
|
2021-03-25 09:56:12 +01:00
|
|
|
s32 flags = gBattleStatus.flags2;
|
2021-03-19 19:17:02 +01:00
|
|
|
gBattleState = battleState;
|
2021-07-19 13:49:30 +02:00
|
|
|
D_800DC4E0 = 1;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_INIT;
|
2021-03-19 19:17:02 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
flags &= BS_FLAGS2_PEACH_BATTLE;
|
2021-03-25 09:56:12 +01:00
|
|
|
if (flags) {
|
|
|
|
switch (battleState) {
|
2022-05-05 16:08:16 +02:00
|
|
|
case BATTLE_STATE_PARTNER_MENU:
|
|
|
|
battleState = BATTLE_STATE_TWINK_MENU;
|
2021-03-19 19:17:02 +01:00
|
|
|
break;
|
2022-05-05 16:08:16 +02:00
|
|
|
case BATTLE_STATE_PLAYER_MENU:
|
|
|
|
battleState = BATTLE_STATE_PEACH_MENU;
|
2021-03-19 19:17:02 +01:00
|
|
|
break;
|
2022-05-05 16:08:16 +02:00
|
|
|
case BATTLE_STATE_BEGIN_PLAYER_TURN:
|
|
|
|
battleState = BATTLE_STATE_BEGIN_PARTNER_TURN;
|
2021-03-19 19:17:02 +01:00
|
|
|
break;
|
2022-05-05 16:08:16 +02:00
|
|
|
case BATTLE_STATE_BEGIN_PARTNER_TURN:
|
|
|
|
battleState = BATTLE_STATE_BEGIN_PLAYER_TURN;
|
2021-03-19 19:17:02 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
gBattleState = battleState;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_update_normal_start(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
EncounterStatus* currentEncounter = &gCurrentEncounter;
|
|
|
|
Battle* battle;
|
|
|
|
Stage* stage;
|
|
|
|
s32 size;
|
|
|
|
void* compressedAsset;
|
|
|
|
ModelNode* model;
|
|
|
|
s32 textureRom;
|
|
|
|
Actor* actor;
|
|
|
|
Evt* script;
|
|
|
|
s32 cond;
|
|
|
|
s32 type;
|
|
|
|
s32 i;
|
|
|
|
s32 j;
|
|
|
|
|
|
|
|
s32* types;
|
|
|
|
|
|
|
|
battle = (*D_800DC4FC);
|
|
|
|
if (D_800DC4F4 != NULL) {
|
|
|
|
battle = D_800DC4F4;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (D_800DC064 == NULL) {
|
|
|
|
stage = battle->stage;
|
|
|
|
} else {
|
2022-10-16 16:22:18 +02:00
|
|
|
stage = D_800DC064->stage;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
battleStatus->currentStage = stage;
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_NORMAL_START_UNK_0:
|
2022-09-08 14:21:07 +02:00
|
|
|
D_8029F240 = battle->formationSize;
|
2023-01-10 07:33:09 +01:00
|
|
|
set_screen_overlay_params_back(255, -1.0f);
|
2022-09-08 14:21:07 +02:00
|
|
|
compressedAsset = load_asset_by_name(stage->shape, &size);
|
|
|
|
decode_yay0(compressedAsset, &D_80210000);
|
|
|
|
general_heap_free(compressedAsset);
|
|
|
|
|
|
|
|
ASSERT(size <= 0x8000);
|
|
|
|
|
2022-12-07 09:39:22 +01:00
|
|
|
model = D_80210000.root;
|
2022-09-08 14:21:07 +02:00
|
|
|
textureRom = get_asset_offset(stage->texture, &size);
|
|
|
|
if (model != NULL) {
|
|
|
|
load_data_for_models(model, textureRom, size);
|
|
|
|
}
|
|
|
|
load_battle_hit_asset(stage->hit);
|
|
|
|
|
|
|
|
if (stage->bg != NULL) {
|
|
|
|
load_map_bg(stage->bg);
|
2022-10-13 03:16:49 +02:00
|
|
|
read_background_size(&gBackgroundImage);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (gGameStatusPtr->demoFlags & 1) {
|
|
|
|
set_curtain_scale_goal(1.0f);
|
|
|
|
}
|
|
|
|
|
|
|
|
battleStatus->controlScript = NULL;
|
|
|
|
battleStatus->camMovementScript = NULL;
|
|
|
|
battleStatus->unk_90 = 0;
|
|
|
|
battleStatus->preUpdateCallback = NULL;
|
|
|
|
battleStatus->initBattleCallback = NULL;
|
|
|
|
battleStatus->currentSubmenu = 0;
|
|
|
|
battleStatus->unk_49 = 0;
|
|
|
|
battleStatus->unk_4A = 0;
|
|
|
|
battleStatus->unk_4B = 0;
|
|
|
|
battleStatus->totalStarPoints = 0;
|
|
|
|
battleStatus->pendingStarPoints = 0;
|
|
|
|
battleStatus->incrementStarPointDelay = 0;
|
|
|
|
battleStatus->damageTaken = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->nextMerleeSpellType = MERLEE_SPELL_0;
|
2022-11-08 14:01:42 +01:00
|
|
|
battleStatus->actionCommandMode = ACTION_COMMAND_MODE_NOT_LEARNED;
|
2023-01-12 03:09:13 +01:00
|
|
|
gCameras[CAM_DEFAULT].flags |= CAMERA_FLAG_ENABLED;
|
|
|
|
gCameras[CAM_BATTLE].flags |= CAMERA_FLAG_ENABLED;
|
|
|
|
gCameras[CAM_TATTLE].flags |= CAMERA_FLAG_ENABLED;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (is_ability_active(ABILITY_MYSTERY_SCROLL)) {
|
2022-11-08 14:01:42 +01:00
|
|
|
battleStatus->actionCommandMode = ACTION_COMMAND_MODE_LEARNED;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
battleStatus->actionSuccess = 0;
|
|
|
|
battleStatus->unk_82 = 0;
|
|
|
|
battleStatus->menuDisableFlags = -1;
|
|
|
|
battleStatus->unk_74 = -1;
|
|
|
|
battleStatus->itemUsesLeft = 0;
|
|
|
|
battleStatus->hammerCharge = 0;
|
|
|
|
battleStatus->jumpCharge = 0;
|
|
|
|
battleStatus->unk_98 = 0;
|
|
|
|
battleStatus->hpDrainCount = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_CANT_FLEE;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (currentEncounter->allowFleeing) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_CANT_FLEE;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
battleStatus->unk_8D = 10;
|
|
|
|
battleStatus->unk_95 = 0;
|
|
|
|
battleStatus->hammerLossTurns = -1;
|
|
|
|
battleStatus->jumpLossTurns = -1;
|
|
|
|
battleStatus->itemLossTurns = -1;
|
|
|
|
battleStatus->outtaSightActive = 0;
|
|
|
|
battleStatus->waterBlockTurnsLeft = 0;
|
|
|
|
battleStatus->waterBlockAmount = 0;
|
|
|
|
battleStatus->waterBlockEffect = NULL;
|
|
|
|
battleStatus->cloudNineTurnsLeft = 0;
|
|
|
|
battleStatus->cloudNineDodgeChance = 0;
|
|
|
|
battleStatus->cloudNineEffect = NULL;
|
|
|
|
battleStatus->unk_92 = 0;
|
|
|
|
battleStatus->turboChargeTurnsLeft = 0;
|
|
|
|
battleStatus->turboChargeAmount = 0;
|
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
battleStatus->merleeAttackBoost = 0;
|
|
|
|
battleStatus->merleeDefenseBoost = 0;
|
2022-11-22 05:12:28 +01:00
|
|
|
battleStatus->darknessMode = BTL_DARKNESS_STATE_NONE;
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->unk_433 = -1;
|
|
|
|
battleStatus->hustleTurns = 0;
|
|
|
|
battleStatus->unk_93 = 0;
|
|
|
|
battleStatus->unk_94 = 0;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_100;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_200;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->varTable); i++) {
|
|
|
|
battleStatus->varTable[i] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
D_80280A30 = 255;
|
|
|
|
battleStatus->inputBitmask = 0xFEF3F;
|
|
|
|
battleStatus->buffEffect = fx_partner_buff(0, 0.0f, 0.0f, 0.0f, 0.0f, 0);
|
|
|
|
func_800E9810();
|
|
|
|
gCurrentCameraID = CAM_BATTLE;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(D_80280EB8, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->camMovementScript = script;
|
|
|
|
battleStatus->camMovementScriptID = script->id;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_NORMAL_START_UNK_1;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_NORMAL_START_UNK_1:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!does_script_exist(battleStatus->camMovementScriptID)) {
|
|
|
|
UiStatus* uiStatus = &gUIStatus;
|
|
|
|
|
|
|
|
if (stage->preBattle != NULL) {
|
|
|
|
script = start_script(stage->preBattle, 0xA, 0);
|
|
|
|
battleStatus->controlScript = script;
|
|
|
|
battleStatus->controlScriptID = script->id;
|
|
|
|
}
|
|
|
|
|
2022-12-07 17:12:25 +01:00
|
|
|
uiStatus->hidden = FALSE;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_ACTORS_VISIBLE;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
battleStatus->enemyActors[i] = NULL;
|
|
|
|
}
|
|
|
|
battleStatus->initialEnemyCount = 0;
|
|
|
|
|
|
|
|
for (i = 0; i < D_8029F240; i++) {
|
|
|
|
create_actor(&(*battle->formation)[i]);
|
|
|
|
types = D_80281454;
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
|
|
|
|
while (TRUE) {
|
|
|
|
type = *types;
|
|
|
|
if (type == -1) {
|
|
|
|
battleStatus->initialEnemyCount++;
|
|
|
|
break;
|
|
|
|
} else if (actor->actorType == type) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
types++;
|
|
|
|
}
|
|
|
|
|
|
|
|
actor->unk_208 = 0;
|
|
|
|
if (i == 0) {
|
|
|
|
actor->unk_208 = currentEncounter->unk_10;
|
2022-12-06 00:29:22 +01:00
|
|
|
if (currentEncounter->dizzyAttackStatus == STATUS_DIZZY) {
|
|
|
|
inflict_status_set_duration(actor, STATUS_DIZZY, STATUS_DIZZY_TURN_MOD, currentEncounter->dizzyAttackDuration);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (stage->specialFormationSize != 0 &&
|
|
|
|
(stage->unk_24 == 0 || (stage->unk_24 > 0 && (rand_int(stage->unk_24) == 0))))
|
|
|
|
{
|
|
|
|
D_8029F240 += stage->specialFormationSize;
|
|
|
|
for (j = 0; i < D_8029F240; i++, j++) {
|
|
|
|
create_actor(&(*stage->specialFormation)[j]);
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
actor->unk_208 = 0;
|
|
|
|
if (i == 0) {
|
|
|
|
actor->unk_208 = 0;
|
2022-12-06 00:29:22 +01:00
|
|
|
if (currentEncounter->dizzyAttackStatus == STATUS_DIZZY) {
|
|
|
|
inflict_status_set_duration(actor, STATUS_DIZZY, STATUS_DIZZY_TURN_MOD, currentEncounter->dizzyAttackDuration);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
load_player_actor();
|
|
|
|
actor = battleStatus->playerActor;
|
2023-01-11 09:38:04 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
2022-12-06 00:29:22 +01:00
|
|
|
script = start_script(D_80284A30, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2022-12-06 00:29:22 +01:00
|
|
|
script = start_script(D_80284A20, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
actor->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
load_partner_actor();
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_NORMAL_START_UNK_4;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_NORMAL_START_UNK_4:
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = FALSE;
|
|
|
|
for (i = 0; i < D_8029F240; i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (does_script_exist(actor->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = TRUE;
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
actor->takeTurnScript = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!cond) {
|
|
|
|
actor = battleStatus->playerActor;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!does_script_exist(actor->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor->takeTurnScript = NULL;
|
|
|
|
actor = battleStatus->partnerActor;
|
|
|
|
if (actor != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!does_script_exist(battleStatus->partnerActor->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor->takeTurnScript = NULL;
|
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (battle->unk_10 != 0) {
|
|
|
|
script = start_script(battle->unk_10, 0xA, 0);
|
|
|
|
battleStatus->controlScript = script;
|
|
|
|
battleStatus->controlScriptID = script->id;
|
|
|
|
}
|
2022-11-22 05:12:28 +01:00
|
|
|
if (battleStatus->darknessMode > BTL_DARKNESS_STATE_NONE) {
|
2022-09-08 14:21:07 +02:00
|
|
|
set_screen_overlay_color(1, 0, 0, 0);
|
|
|
|
set_screen_overlay_params_back(0, 215.0f);
|
|
|
|
}
|
|
|
|
if (is_ability_active(ABILITY_CHILL_OUT) && currentEncounter->firstStrikeType == FIRST_STRIKE_ENEMY) {
|
|
|
|
currentEncounter->firstStrikeType = FIRST_STRIKE_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (currentEncounter->firstStrikeType) {
|
|
|
|
case FIRST_STRIKE_PLAYER:
|
|
|
|
btl_set_state(BATTLE_STATE_FIRST_STRIKE);
|
|
|
|
break;
|
|
|
|
case FIRST_STRIKE_ENEMY:
|
|
|
|
btl_set_state(BATTLE_STATE_ENEMY_FIRST_STRIKE);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (!(gGameStatusPtr->demoFlags & 1)) {
|
|
|
|
actor = battleStatus->playerActor;
|
2023-01-11 09:38:04 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
|
|
|
script = start_script(&PeachEnterStage, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2023-01-11 09:38:04 +01:00
|
|
|
script = start_script(&MarioEnterStage, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
actor->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (currentEncounter->currentEnemy != NULL &&
|
|
|
|
currentEncounter->currentEnemy->encountered == 3 &&
|
|
|
|
is_ability_active(ABILITY_DIZZY_ATTACK))
|
|
|
|
{
|
|
|
|
actor = battleStatus->enemyActors[0];
|
2023-01-11 09:38:04 +01:00
|
|
|
script = start_script(&DoDizzyAttack, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
actor->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.enemyID = ACTOR_ENEMY0;
|
|
|
|
}
|
|
|
|
|
|
|
|
D_80280A30 = 305;
|
|
|
|
D_8029F248 = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_NORMAL_START_UNK_7;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_NORMAL_START_UNK_7:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_80280A30 == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_NORMAL_START_UNK_8;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
D_8029F248++;
|
|
|
|
if (D_8029F248 == 15) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(gGameStatusPtr->demoFlags & 1)) {
|
|
|
|
D_80280A30 -= 10;
|
|
|
|
} else {
|
|
|
|
D_80280A30 -= 50;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (D_80280A30 < 0) {
|
|
|
|
D_80280A30 = 0;
|
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_NORMAL_START_UNK_8:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
set_screen_overlay_params_front(255, -1.0f);
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_TURN);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_normal_start(void) {
|
|
|
|
set_screen_overlay_color(0, 0, 0, 0);
|
2021-03-19 19:17:02 +01:00
|
|
|
|
|
|
|
if (D_80280A30 > 255) {
|
2021-06-30 04:27:12 +02:00
|
|
|
set_screen_overlay_params_front(0, 255.0f);
|
2021-03-19 19:17:02 +01:00
|
|
|
} else {
|
2021-06-30 04:27:12 +02:00
|
|
|
set_screen_overlay_params_front(0, D_80280A30);
|
2021-03-19 19:17:02 +01:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-08-10 17:29:06 +02:00
|
|
|
void btl_state_update_begin_turn(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* enemy;
|
|
|
|
Actor* enemy1;
|
|
|
|
Actor* enemy2;
|
|
|
|
Evt* script;
|
|
|
|
Evt* script2;
|
|
|
|
s32 cond;
|
|
|
|
u16 id1;
|
|
|
|
u16 id2;
|
|
|
|
s32 numEnemyActors;
|
|
|
|
s32 i;
|
|
|
|
s32 j;
|
|
|
|
s16* enemyIDs;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_TURN_INIT) {
|
2022-08-10 17:29:06 +02:00
|
|
|
battleStatus->flags2 &= ~BS_FLAGS2_2;
|
|
|
|
battleStatus->flags2 &= ~BS_FLAGS2_4;
|
|
|
|
battleStatus->flags2 &= ~BS_FLAGS2_8;
|
|
|
|
battleStatus->flags2 &= ~BS_FLAGS2_10;
|
|
|
|
battleStatus->merleeAttackBoost = 0;
|
|
|
|
battleStatus->merleeDefenseBoost = 0;
|
|
|
|
battleStatus->flags2 &= ~BS_FLAGS2_1000000;
|
2023-01-10 07:33:09 +01:00
|
|
|
|
2022-08-10 17:29:06 +02:00
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->disableDismissTimer = 0;
|
2022-08-10 17:29:06 +02:00
|
|
|
if (partner != NULL) {
|
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
2022-08-26 12:13:57 +02:00
|
|
|
partner->disableDismissTimer = 0;
|
2022-08-10 17:29:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (battleStatus->hustleTurns != 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_HUSTLED;
|
2022-08-10 17:29:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
numEnemyActors = 0;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL) {
|
|
|
|
battleStatus->enemyIDs[numEnemyActors] = i | ACTOR_ENEMY0;
|
|
|
|
numEnemyActors++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
battleStatus->numEnemyActors = numEnemyActors;
|
2023-01-10 07:33:09 +01:00
|
|
|
|
|
|
|
// sort enemies by x-position or turn priority
|
2022-08-10 17:29:06 +02:00
|
|
|
enemyIDs = battleStatus->enemyIDs;
|
|
|
|
for (i = 0; i < numEnemyActors - 1; i++) {
|
|
|
|
for (j = i + 1; j < numEnemyActors; j++) {
|
|
|
|
id1 = enemyIDs[i];
|
|
|
|
id2 = enemyIDs[j];
|
|
|
|
enemy1 = battleStatus->enemyActors[id1 & 0xFF];
|
|
|
|
enemy2 = battleStatus->enemyActors[id2 & 0xFF];
|
|
|
|
if (gBattleStatus.flags1 & BS_FLAGS1_8000000) {
|
|
|
|
if (enemy1->homePos.x > enemy2->homePos.x) {
|
|
|
|
enemyIDs[i] = id2;
|
|
|
|
enemyIDs[j] = id1;
|
|
|
|
}
|
|
|
|
} else if (enemy1->turnPriority < enemy2->turnPriority) {
|
|
|
|
enemyIDs[i] = id2;
|
|
|
|
enemyIDs[j] = id1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
battleStatus->nextEnemyIndex = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
|
2022-08-10 17:29:06 +02:00
|
|
|
btl_merlee_on_start_turn();
|
2023-01-10 07:33:09 +01:00
|
|
|
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags = RUSH_FLAG_NONE;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_RUSH;
|
2022-08-10 17:29:06 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE)) {
|
2022-08-10 17:29:06 +02:00
|
|
|
if (playerData->curHP < 2 && is_ability_active(ABILITY_MEGA_RUSH)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_HAS_RUSH;
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags |= RUSH_FLAG_MEGA;
|
2022-08-10 17:29:06 +02:00
|
|
|
}
|
2022-11-01 08:41:14 +01:00
|
|
|
if (playerData->curHP < 6 && is_ability_active(ABILITY_POWER_RUSH) && !(battleStatus->rushFlags & RUSH_FLAG_MEGA)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_HAS_RUSH;
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags |= RUSH_FLAG_POWER;
|
2022-08-10 17:29:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_JUMP_CHARGED)) {
|
2022-08-10 17:29:06 +02:00
|
|
|
battleStatus->jumpCharge = 0;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_HAMMER_CHARGED)) {
|
2022-08-10 17:29:06 +02:00
|
|
|
battleStatus->hammerCharge = 0;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gGameStatusPtr->debugEnemyContact == DEBUG_CONTACT_AUTO_FLEE) {
|
2022-08-10 17:29:06 +02:00
|
|
|
btl_set_state(BATTLE_STATE_RUN_AWAY);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gGameStatusPtr->debugEnemyContact == DEBUG_CONTACT_DIE_IN_BATTLE) {
|
2022-08-10 17:29:06 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy != NULL && enemy->handleEventSource != NULL) {
|
|
|
|
Evt* script = start_script(enemy->handleEventSource, EVT_PRIORITY_A, 0);
|
2022-08-10 17:29:06 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
enemy->handleEventScript = script;
|
2022-08-10 17:29:06 +02:00
|
|
|
script->owner1.actorID = i | ACTOR_ENEMY0;
|
2023-01-10 07:33:09 +01:00
|
|
|
enemy->handleEventScriptID = script->id;
|
2022-08-10 17:29:06 +02:00
|
|
|
enemy->lastEventType = EVENT_DEATH;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_TURN_AWAIT_ENEMY_DEATH;
|
2022-08-10 17:29:06 +02:00
|
|
|
} else {
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy != NULL && enemy->handlePhaseSource != NULL) {
|
2022-08-10 17:29:06 +02:00
|
|
|
battleStatus->battlePhase = PHASE_PLAYER_BEGIN;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(enemy->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
enemy->handlePhaseScript = script;
|
|
|
|
enemy->handleBatttlePhaseScriptID = script->id;
|
2022-08-10 17:29:06 +02:00
|
|
|
script->owner1.actorID = i | ACTOR_ENEMY0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
partner = battleStatus->partnerActor;
|
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->handlePhaseSource != NULL) {
|
2022-08-10 17:29:06 +02:00
|
|
|
battleStatus->battlePhase = PHASE_PLAYER_BEGIN;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
partner->handlePhaseScript = script;
|
|
|
|
partner->handleBatttlePhaseScriptID = script->id;
|
2022-08-10 17:29:06 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_TURN_AWAIT_ENEMY_SCRIPTS;
|
2022-08-10 17:29:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_TURN_AWAIT_ENEMY_SCRIPTS) {
|
2022-08-10 17:29:06 +02:00
|
|
|
cond = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy != NULL && enemy->handlePhaseSource != NULL && does_script_exist(enemy->handleBatttlePhaseScriptID)) {
|
2022-08-10 17:29:06 +02:00
|
|
|
cond = TRUE;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner != NULL && partner->handlePhaseSource != NULL && does_script_exist(partner->handleBatttlePhaseScriptID)) {
|
2022-08-10 17:29:06 +02:00
|
|
|
cond = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!cond) {
|
|
|
|
if (!btl_check_enemies_defeated()) {
|
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_PLAYER_TURN);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_TURN_AWAIT_ENEMY_DEATH) {
|
2022-08-10 17:29:06 +02:00
|
|
|
cond = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy != NULL && enemy->handleEventSource != NULL && does_script_exist(enemy->handleEventScriptID)) {
|
2022-08-10 17:29:06 +02:00
|
|
|
cond = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!cond) {
|
|
|
|
if (!btl_check_enemies_defeated()) {
|
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_PLAYER_TURN);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_begin_turn(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-05-05 16:08:16 +02:00
|
|
|
void btl_state_update_begin_player_turn(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
ActorPart* part = &player->partsTable[0];
|
|
|
|
Evt* script;
|
|
|
|
s32 i;
|
|
|
|
|
2022-11-01 08:41:14 +01:00
|
|
|
s8 debuffDuration;
|
|
|
|
s32 koDuration;
|
|
|
|
s32 temp;
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PLAYER_TURN_INIT) {
|
2022-05-16 21:18:18 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
2022-05-05 16:08:16 +02:00
|
|
|
btl_cam_move(5);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_RESET_STATE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
switch (gBattleSubState) {
|
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_RESET_STATE:
|
|
|
|
if (btl_cam_is_moving_done()) {
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_80000;
|
|
|
|
reset_actor_turn_info();
|
|
|
|
battleStatus->unk_86 = 127;
|
|
|
|
battleStatus->blockResult = 127;
|
|
|
|
battleStatus->selectedMoveID = 0;
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_1000000;
|
|
|
|
player->disableDismissTimer = 0;
|
2022-11-01 08:41:14 +01:00
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner != NULL) {
|
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
partner->disableDismissTimer = 0;
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
D_8029F254 = 0;
|
|
|
|
D_8029F258 = 0;
|
|
|
|
|
|
|
|
if (battleStatus->outtaSightActive == 0) {
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_WATER_BLOCK;
|
2023-01-10 07:33:09 +01:00
|
|
|
} else {
|
|
|
|
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
|
|
|
|
script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
partner->handlePhaseScript = script;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_OUTTA_SIGHT;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->handleBatttlePhaseScriptID = script->id;
|
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_OUTTA_SIGHT:
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!does_script_exist(partner->handleBatttlePhaseScriptID)) {
|
|
|
|
battleStatus->outtaSightActive = 0;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_WATER_BLOCK;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_4;
|
|
|
|
}
|
|
|
|
break;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_WATER_BLOCK:
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
if (battleStatus->waterBlockTurnsLeft != 0) {
|
|
|
|
battleStatus->waterBlockTurnsLeft--;
|
|
|
|
battleStatus->buffEffect->data.partnerBuff->unk_0C[FX_BUFF_DATA_WATER_BLOCK].turnsLeft = battleStatus->waterBlockTurnsLeft;
|
|
|
|
if (battleStatus->waterBlockTurnsLeft <= 0) {
|
2023-01-12 03:09:13 +01:00
|
|
|
battleStatus->waterBlockEffect->flags |= EFFECT_INSTANCE_FLAG_10;
|
2023-01-10 07:33:09 +01:00
|
|
|
fx_water_block(1, player->currentPos.x, player->currentPos.y + 18.0f, player->currentPos.z + 5.0f, 1.5f, 10);
|
|
|
|
fx_water_splash(0, player->currentPos.x - 10.0f, player->currentPos.y + 5.0f, player->currentPos.z + 5.0f, 1.0f, 24);
|
|
|
|
fx_water_splash(0, player->currentPos.x - 15.0f, player->currentPos.y + 32.0f, player->currentPos.z + 5.0f, 1.0f, 24);
|
|
|
|
fx_water_splash(1, player->currentPos.x + 15.0f, player->currentPos.y + 22.0f, player->currentPos.z + 5.0f, 1.0f, 24);
|
|
|
|
battleStatus->waterBlockEffect = NULL;
|
|
|
|
sfx_play_sound(SOUND_299);
|
|
|
|
btl_show_battle_message(BTL_MSG_27, 60);
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_WATER_BLOCK;
|
2023-01-10 07:33:09 +01:00
|
|
|
} else {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_CLOUD_NINE;
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_CLOUD_NINE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_WATER_BLOCK:
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!btl_is_popup_displayed()) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_CLOUD_NINE;
|
|
|
|
}
|
|
|
|
break;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_CLOUD_NINE:
|
2022-05-05 16:08:16 +02:00
|
|
|
if (battleStatus->cloudNineTurnsLeft != 0) {
|
|
|
|
battleStatus->cloudNineTurnsLeft--;
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->buffEffect->data.partnerBuff->unk_0C[FX_BUFF_DATA_CLOUD_NINE].turnsLeft = battleStatus->cloudNineTurnsLeft;
|
2022-05-05 16:08:16 +02:00
|
|
|
|
|
|
|
if (battleStatus->cloudNineTurnsLeft <= 0) {
|
|
|
|
remove_effect(battleStatus->cloudNineEffect);
|
|
|
|
battleStatus->cloudNineEffect = NULL;
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_show_battle_message(BTL_MSG_29, 60);
|
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_CLOUD_NINE;
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_TURBO_CHARGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_TURBO_CHARGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_CLOUD_NINE:
|
2022-05-05 16:08:16 +02:00
|
|
|
if (!btl_is_popup_displayed()) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_TURBO_CHARGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_CHECK_TURBO_CHARGE:
|
2022-05-05 16:08:16 +02:00
|
|
|
if (battleStatus->turboChargeTurnsLeft != 0) {
|
2022-08-17 03:15:54 +02:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_100) {
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_100;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_DAMAGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
|
|
|
battleStatus->turboChargeTurnsLeft--;
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->buffEffect->data.partnerBuff->unk_0C[FX_BUFF_DATA_TURBO_CHARGE].turnsLeft = battleStatus->turboChargeTurnsLeft;
|
2022-05-05 16:08:16 +02:00
|
|
|
if (battleStatus->turboChargeTurnsLeft <= 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_show_battle_message(BTL_MSG_2B, 60);
|
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_TURBO_CHARGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_DAMAGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_DAMAGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_BEGIN_PLAYER_TURN_AWAIT_TURBO_CHARGE:
|
2022-11-01 08:41:14 +01:00
|
|
|
if (0) { // TODO relocated block - required to match
|
|
|
|
back:
|
|
|
|
player->koStatus = STATUS_DAZE;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->disableEffect->data.disableX->koDuration = player->koDuration;
|
2022-11-01 08:41:14 +01:00
|
|
|
goto later;
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
if (!btl_is_popup_displayed()) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_DAMAGE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_DAMAGE) {
|
2022-11-01 08:41:14 +01:00
|
|
|
if (player->debuff == STATUS_POISON && player->stoneStatus == 0) {
|
2022-08-17 03:15:54 +02:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_SP_EVT_ACTIVE;
|
2023-01-10 07:33:09 +01:00
|
|
|
dispatch_damage_event_player_0(1, EVENT_HIT);
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags = RUSH_FLAG_NONE;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_RUSH;
|
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE)) {
|
2022-11-01 08:41:14 +01:00
|
|
|
if (playerData->curHP <= 1 && is_ability_active(ABILITY_MEGA_RUSH)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_HAS_RUSH;
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags |= RUSH_FLAG_MEGA;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2022-11-01 08:41:14 +01:00
|
|
|
if (playerData->curHP < 6 && is_ability_active(ABILITY_POWER_RUSH) && !(battleStatus->rushFlags & RUSH_FLAG_MEGA)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_HAS_RUSH;
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags |= RUSH_FLAG_POWER;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_RECOVER;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_STATUS_RECOVER) {
|
|
|
|
if (player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
|
|
|
|
player->handleEventScript = NULL;
|
|
|
|
if (btl_check_player_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-05-05 16:08:16 +02:00
|
|
|
D_8029F254 = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
player->disableDismissTimer = 0;
|
2022-11-01 08:41:14 +01:00
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2022-11-01 08:41:14 +01:00
|
|
|
if (is_ability_active(ABILITY_FEELING_FINE)) {
|
2022-05-05 16:08:16 +02:00
|
|
|
if (player->debuff != 0) {
|
|
|
|
player->debuffDuration = 1;
|
|
|
|
}
|
|
|
|
if (player->staticStatus != 0) {
|
|
|
|
player->staticDuration = 1;
|
|
|
|
}
|
|
|
|
if (player->stoneStatus != 0) {
|
|
|
|
player->stoneDuration = 1;
|
|
|
|
}
|
|
|
|
if (player->koStatus != 0) {
|
|
|
|
player->koDuration = 1;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
if (player->transparentStatus != 0) {
|
|
|
|
player->transparentDuration = 1;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2022-05-05 16:08:16 +02:00
|
|
|
if (player->stoneStatus != 0) {
|
|
|
|
player->stoneDuration--;
|
|
|
|
if (player->stoneDuration <= 0) {
|
|
|
|
player->stoneStatus = 0;
|
2022-11-01 08:41:14 +01:00
|
|
|
dispatch_event_player(EVENT_RECOVER_STATUS);
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
} else {
|
2022-11-01 08:41:14 +01:00
|
|
|
if (!is_ability_active(ABILITY_ZAP_TAP) && player->staticStatus != 0) {
|
2022-05-05 16:08:16 +02:00
|
|
|
player->staticDuration--;
|
|
|
|
if (player->staticDuration <= 0) {
|
|
|
|
player->staticStatus = 0;
|
|
|
|
remove_status_static(player->hudElementDataIndex);
|
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
if (player->transparentStatus != 0) {
|
|
|
|
player->transparentDuration--;
|
2022-11-01 08:41:14 +01:00
|
|
|
part->flags |= ACTOR_PART_FLAG_100;
|
|
|
|
do {
|
|
|
|
if (player->transparentDuration <= 0) {
|
|
|
|
player->transparentStatus = 0;
|
|
|
|
part->flags &= ~ACTOR_PART_FLAG_100;
|
|
|
|
remove_status_transparent(player->hudElementDataIndex);
|
|
|
|
}
|
|
|
|
} while (0); // TODO required to match
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (player->debuff != 0) {
|
|
|
|
if (player->debuff < 9) {
|
|
|
|
D_8029F254 = 1;
|
|
|
|
}
|
|
|
|
D_8029F258 = 20;
|
|
|
|
player->debuffDuration--;
|
|
|
|
if (player->debuffDuration <= 0) {
|
|
|
|
if (player->debuff == STATUS_FROZEN) {
|
2022-06-10 20:06:12 +02:00
|
|
|
sfx_play_sound(SOUND_FROZEN_SHATTER);
|
2022-05-05 16:08:16 +02:00
|
|
|
player->icePillarEffect->flags |= 0x10;
|
|
|
|
player->icePillarEffect = NULL;
|
2022-11-01 08:41:14 +01:00
|
|
|
dispatch_event_player(EVENT_32);
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
2022-11-01 08:41:14 +01:00
|
|
|
dispatch_event_player(EVENT_RECOVER_STATUS);
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
player->debuff = 0;
|
|
|
|
player->debuffDuration = 0;
|
|
|
|
remove_status_debuff(player->hudElementDataIndex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
debuffDuration = player->debuffDuration;
|
2022-11-01 08:41:14 +01:00
|
|
|
temp = player->koDuration;
|
2022-05-05 16:08:16 +02:00
|
|
|
player->koDuration = debuffDuration;
|
2022-11-01 08:41:14 +01:00
|
|
|
if (debuffDuration > 0) {
|
|
|
|
goto back;
|
|
|
|
} else if (temp != debuffDuration) {
|
2022-05-05 16:08:16 +02:00
|
|
|
player->koStatus = 0;
|
|
|
|
player->koDuration = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->disableEffect->data.disableX->koDuration = 0;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
later:
|
2022-05-05 16:08:16 +02:00
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
Actor* enemy = battleStatus->enemyActors[i];
|
|
|
|
|
|
|
|
if (enemy != NULL) {
|
2022-11-01 08:41:14 +01:00
|
|
|
enemy->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
2022-05-05 16:08:16 +02:00
|
|
|
if (enemy->chillOutTurns != 0) {
|
|
|
|
enemy->chillOutTurns--;
|
|
|
|
if (enemy->chillOutTurns == 0) {
|
|
|
|
enemy->chillOutAmount = 0;
|
|
|
|
remove_status_chill_out(enemy->hudElementDataIndex);
|
|
|
|
D_8029F258 = 20;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_COMMAND_RECOVER;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PLAYER_TURN_TRY_COMMAND_RECOVER) {
|
|
|
|
if (btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
temp = 1;
|
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
if (battleStatus->hammerLossTurns >= 0) {
|
|
|
|
battleStatus->hammerLossTurns--;
|
|
|
|
if (battleStatus->hammerLossTurns == -1) {
|
|
|
|
script = start_script(&RegainAbility, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
|
|
|
player->takeTurnScriptID = script->id;
|
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
script->varTable[0] = temp;
|
|
|
|
temp += 8;
|
|
|
|
script->varTable[10] = 1; // hammer
|
|
|
|
battleStatus->unk_8C = 1;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->jumpLossTurns >= 0) {
|
|
|
|
battleStatus->jumpLossTurns--;
|
|
|
|
if (battleStatus->jumpLossTurns == -1) {
|
|
|
|
script = start_script(&RegainAbility, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
|
|
|
player->takeTurnScriptID = script->id;
|
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
script->varTable[0] = temp;
|
|
|
|
temp += 8;
|
|
|
|
script->varTable[10] = 0; // jump
|
|
|
|
battleStatus->unk_8C = 1;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->itemLossTurns >= 0) {
|
|
|
|
battleStatus->itemLossTurns--;
|
|
|
|
if (battleStatus->itemLossTurns == -1) {
|
|
|
|
script = start_script(&RegainAbility, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
|
|
|
player->takeTurnScriptID = script->id;
|
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
script->varTable[0] = temp;
|
|
|
|
temp += 8;
|
|
|
|
script->varTable[10] = 2; // item
|
|
|
|
battleStatus->unk_8C = 1;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PLAYER_TURN_END_DELAY;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PLAYER_TURN_END_DELAY) {
|
|
|
|
if (player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
|
|
|
|
player->handleEventScript = NULL;
|
|
|
|
|
|
|
|
if (btl_check_player_defeated() || btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
|
|
|
|
if (D_8029F258 != 0) {
|
|
|
|
D_8029F258--;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (D_8029F254 == 0) {
|
2022-05-27 15:03:19 +02:00
|
|
|
btl_set_state(BATTLE_STATE_SWITCH_TO_PLAYER);
|
2022-05-05 16:08:16 +02:00
|
|
|
} else{
|
2022-05-27 15:03:19 +02:00
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_PARTNER_TURN);
|
2022-08-17 03:15:54 +02:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_2;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_begin_player_turn(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2021-07-21 13:43:13 +02:00
|
|
|
void btl_state_update_switch_to_player(void) {
|
|
|
|
Actor* player = gBattleStatus.playerActor;
|
|
|
|
Actor* partner = gBattleStatus.partnerActor;
|
|
|
|
s32 i;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_INIT) {
|
2021-11-17 15:43:50 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_80000;
|
2021-07-21 13:43:13 +02:00
|
|
|
reset_actor_turn_info();
|
2021-11-17 15:43:50 +01:00
|
|
|
gBattleStatus.selectedMoveID = MOVE_NONE;
|
2022-11-08 14:01:42 +01:00
|
|
|
gBattleStatus.unk_86 = 127;
|
|
|
|
gBattleStatus.blockResult = 127;
|
2021-11-17 15:43:50 +01:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_8;
|
|
|
|
player->flags |= ACTOR_FLAG_8000000;
|
2021-07-21 13:43:13 +02:00
|
|
|
if (partner != NULL) {
|
2021-11-17 15:43:50 +01:00
|
|
|
partner->flags |= (ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(gBattleStatus.enemyActors); i++) {
|
|
|
|
Actor* enemy = gBattleStatus.enemyActors[i];
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2021-07-21 13:43:13 +02:00
|
|
|
if (enemy != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
enemy->flags |= ACTOR_FLAG_80000;
|
|
|
|
enemy->flags |= ACTOR_FLAG_8000000;
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-05 16:08:16 +02:00
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_switch_to_player(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
void btl_state_update_begin_partner_turn(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Actor* enemy;
|
2023-01-10 07:33:09 +01:00
|
|
|
Evt* script;
|
2022-05-27 15:03:19 +02:00
|
|
|
s32 i;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PARTNER_TURN_INIT) {
|
2022-05-27 15:03:19 +02:00
|
|
|
if (partner == NULL) {
|
|
|
|
D_8029F254 = 1;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PARTNER_TURN_END_DELAY;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else if ((battleStatus->flags2 & (BS_FLAGS2_4 | BS_FLAGS2_2)) != (BS_FLAGS2_4 | BS_FLAGS2_2)) {
|
|
|
|
if (!(partner->flags & ACTOR_FLAG_NO_ATTACK)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
2022-05-27 15:03:19 +02:00
|
|
|
btl_cam_move(5);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PARTNER_TURN_RESET_STATE;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_9);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_9);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PARTNER_TURN_RESET_STATE) {
|
2022-05-27 15:03:19 +02:00
|
|
|
if (btl_cam_is_moving_done()) {
|
|
|
|
D_8029F258 = 0;
|
|
|
|
reset_actor_turn_info();
|
|
|
|
partner = battleStatus->partnerActor;
|
2022-11-08 14:01:42 +01:00
|
|
|
battleStatus->unk_86 = 127;
|
|
|
|
battleStatus->blockResult = 127;
|
2022-05-27 15:03:19 +02:00
|
|
|
D_8029F254 = 0;
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_80000;
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS1_100000;
|
|
|
|
partner->flags |= ACTOR_FLAG_8000000;
|
|
|
|
|
|
|
|
if (partner->koStatus != 0) {
|
|
|
|
partner->koDuration--;
|
|
|
|
D_8029F254 = 1;
|
|
|
|
D_8029F258 = 20;
|
|
|
|
if (partner->koDuration > 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->disableEffect->data.disableX->koDuration = partner->koDuration;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
|
|
|
partner->koStatus = 0;
|
2022-08-07 14:42:54 +02:00
|
|
|
dispatch_event_partner(EVENT_RECOVER_PARTNER);
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->disableEffect->data.disableX->koDuration = 0;
|
2022-05-27 15:03:19 +02:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL) {
|
|
|
|
enemy->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PARTNER_TURN_AWAIT_RECOVER_DONE;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PARTNER_TURN_AWAIT_RECOVER_DONE) {
|
2022-05-27 15:03:19 +02:00
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->handleEventScript == NULL || !does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
partner->handleEventScript = NULL;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
|
|
|
goto block_27; // TODO find a way to remove
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
if (btl_check_player_defeated() || btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PARTNER_TURN_EXEC_TURN_SCRIPT;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
block_27:
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PARTNER_TURN_EXEC_TURN_SCRIPT) {
|
|
|
|
if (partner->handlePhaseSource != NULL) {
|
2022-08-17 03:15:54 +02:00
|
|
|
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
partner->handlePhaseScript = script;
|
|
|
|
partner->handleBatttlePhaseScriptID = script->id;
|
2022-05-27 15:03:19 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PARTNER_TURN_AWAIT_TURN_SCRIPT;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PARTNER_TURN_AWAIT_TURN_SCRIPT) {
|
|
|
|
if (partner->handlePhaseSource == NULL || !does_script_exist(partner->handleBatttlePhaseScriptID)) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_BEGIN_PARTNER_TURN_END_DELAY;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_BEGIN_PARTNER_TURN_END_DELAY) {
|
2022-05-27 15:03:19 +02:00
|
|
|
if (D_8029F258 != 0) {
|
|
|
|
D_8029F258--;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_100000;
|
|
|
|
if (D_8029F254 == 0) {
|
|
|
|
btl_set_state(BATTLE_STATE_SWITCH_TO_PARTNER);
|
|
|
|
} else {
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_4;
|
|
|
|
btl_set_state(BATTLE_STATE_9);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_begin_partner_turn(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2021-07-31 16:32:19 +02:00
|
|
|
void btl_state_update_switch_to_partner(void) {
|
2021-07-21 13:43:13 +02:00
|
|
|
Actor* player = gBattleStatus.playerActor;
|
|
|
|
Actor* partner = gBattleStatus.partnerActor;
|
|
|
|
s32 i;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_INIT) {
|
2021-07-21 13:43:13 +02:00
|
|
|
reset_actor_turn_info();
|
2021-11-17 15:43:50 +01:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_80000;
|
|
|
|
gBattleStatus.selectedMoveID = MOVE_NONE;
|
2022-11-08 14:01:42 +01:00
|
|
|
gBattleStatus.unk_86 = 127;
|
|
|
|
gBattleStatus.blockResult = 127;
|
2021-11-17 15:43:50 +01:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_8;
|
|
|
|
player->flags |= (ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
|
|
|
partner->flags |= ACTOR_FLAG_8000000;
|
2021-07-21 13:43:13 +02:00
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(gBattleStatus.enemyActors); i++) {
|
|
|
|
Actor* enemy = gBattleStatus.enemyActors[i];
|
|
|
|
if (enemy != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
enemy->flags |= ACTOR_FLAG_80000;
|
|
|
|
enemy->flags |= ACTOR_FLAG_8000000;
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-05 16:08:16 +02:00
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_switch_to_partner(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
void btl_state_update_9(void) {
|
2021-03-24 09:39:43 +01:00
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
2022-09-08 14:21:07 +02:00
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Actor* actor;
|
|
|
|
ActorState* state;
|
|
|
|
Evt* script;
|
|
|
|
s32 cond;
|
|
|
|
s32 i;
|
2021-03-19 19:17:02 +01:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
s32 oldKoDuration;
|
2021-03-19 19:17:02 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_INIT) {
|
2022-11-19 18:24:16 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_2) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner != NULL) {
|
2022-11-19 18:24:16 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_4) && !(partner->flags & ACTOR_FLAG_NO_ATTACK)) {
|
|
|
|
btl_set_state(BATTLE_STATE_SWITCH_TO_PARTNER);
|
2022-09-08 14:21:07 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2021-03-19 19:17:02 +01:00
|
|
|
|
2022-11-19 18:24:16 +01:00
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
player->flags |= ACTOR_FLAG_4000000;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner != NULL) {
|
2022-11-19 18:24:16 +01:00
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
partner->flags |= ACTOR_FLAG_4000000;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_9_1;
|
2022-09-08 14:21:07 +02:00
|
|
|
D_8029F258 = 0;
|
2022-11-19 18:24:16 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2022-11-19 18:24:16 +01:00
|
|
|
btl_set_state(BATTLE_STATE_SWITCH_TO_PLAYER);
|
2022-09-08 14:21:07 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_1) {
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(actor->handleEventScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = TRUE;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->handleEventScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!cond) {
|
|
|
|
reset_actor_turn_info();
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
2022-11-19 18:24:16 +01:00
|
|
|
actor->flags |= ACTOR_FLAG_4000000 | ACTOR_FLAG_8000000;
|
|
|
|
actor->flags &= ~ACTOR_FLAG_10000;
|
|
|
|
|
|
|
|
if (actor->debuff != STATUS_END) {
|
|
|
|
if (actor->debuff == STATUS_FEAR ||
|
|
|
|
actor->debuff == STATUS_DIZZY ||
|
|
|
|
actor->debuff == STATUS_PARALYZE ||
|
|
|
|
actor->debuff == STATUS_SLEEP ||
|
|
|
|
actor->debuff == STATUS_FROZEN ||
|
|
|
|
actor->debuff == STATUS_STOP)
|
2022-09-08 14:21:07 +02:00
|
|
|
{
|
2022-11-19 18:24:16 +01:00
|
|
|
actor->flags |= ACTOR_FLAG_10000;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
actor->debuffDuration--;
|
|
|
|
if (actor->debuffDuration <= 0) {
|
|
|
|
actor->debuff = 0;
|
|
|
|
remove_status_debuff(actor->hudElementDataIndex);
|
2022-11-19 18:24:16 +01:00
|
|
|
dispatch_event_actor(actor, EVENT_RECOVER_STATUS);
|
|
|
|
D_8029F258 = 20;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (actor->staticStatus != 0) {
|
|
|
|
actor->staticDuration--;
|
|
|
|
if (actor->staticDuration <= 0) {
|
|
|
|
actor->staticStatus = 0;
|
|
|
|
remove_status_static(actor->hudElementDataIndex);
|
2022-11-19 18:24:16 +01:00
|
|
|
D_8029F258 = 20;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (actor->transparentStatus != 0) {
|
|
|
|
actor->transparentDuration--;
|
|
|
|
if (actor->transparentDuration <= 0) {
|
|
|
|
actor->transparentStatus = 0;
|
|
|
|
remove_status_transparent(actor->hudElementDataIndex);
|
2022-11-19 18:24:16 +01:00
|
|
|
D_8029F258 = 20;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (actor->stoneStatus != 0) {
|
|
|
|
actor->stoneDuration--;
|
|
|
|
if (actor->stoneDuration <= 0) {
|
|
|
|
actor->stoneStatus = 0;
|
2022-11-19 18:24:16 +01:00
|
|
|
D_8029F258 = 20;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
oldKoDuration = actor->koDuration;
|
|
|
|
actor->koDuration = actor->debuffDuration;
|
|
|
|
if (actor->koDuration > 0) {
|
2022-11-19 18:24:16 +01:00
|
|
|
actor->koStatus = STATUS_DAZE;
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->disableEffect->data.disableX->koDuration = actor->koDuration;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else if (oldKoDuration != actor->koDuration) {
|
|
|
|
actor->koStatus = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->disableEffect->data.disableX->koDuration = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-11-19 18:24:16 +01:00
|
|
|
if (actor->debuff == STATUS_POISON) {
|
2022-10-10 13:26:32 +02:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_SP_EVT_ACTIVE;
|
2022-11-19 18:24:16 +01:00
|
|
|
dispatch_damage_event_actor_0(actor, 1, EVENT_HIT);
|
|
|
|
D_8029F258 = 20;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_9_2;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_2) {
|
|
|
|
if(player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
|
|
|
|
player->handleEventScript = NULL;
|
|
|
|
if (partner != NULL) {
|
|
|
|
if (partner->handleEventScript == NULL || !does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
partner->handleEventScript = NULL;
|
|
|
|
goto block_52; // TODO find a way to remove
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
block_52:
|
|
|
|
cond = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if ((actor != NULL) && (actor->handleEventScript != NULL)) {
|
|
|
|
if (does_script_exist(actor->handleEventScriptID)) {
|
|
|
|
cond = TRUE;
|
|
|
|
} else {
|
|
|
|
actor->handleEventScript = NULL;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!cond) {
|
|
|
|
if (btl_check_player_defeated() || btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
if (partner == NULL || !(gBattleStatus.flags1 & BS_FLAGS1_100000)) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_9_4;
|
|
|
|
} else if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_9_4;
|
2021-11-17 15:43:50 +01:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
player->flags |= ACTOR_FLAG_4000000;
|
|
|
|
partner->flags |= ACTOR_FLAG_4000000;
|
|
|
|
state = &partner->state;
|
|
|
|
if (!battleStatus->outtaSightActive) {
|
|
|
|
partner->state.currentPos.x = partner->homePos.x;
|
|
|
|
partner->state.currentPos.z = partner->homePos.z;
|
|
|
|
partner->state.goalPos.x = player->homePos.x;
|
|
|
|
partner->state.goalPos.z = player->homePos.z;
|
|
|
|
} else {
|
|
|
|
partner->state.currentPos.x = partner->homePos.x;
|
|
|
|
partner->state.currentPos.z = partner->homePos.z;
|
|
|
|
partner->state.goalPos.x = partner->homePos.x;
|
|
|
|
partner->state.goalPos.z = partner->homePos.z + 5.0f;
|
|
|
|
partner->homePos.x = player->homePos.x;
|
|
|
|
partner->homePos.z = player->homePos.z;
|
|
|
|
}
|
|
|
|
state->moveTime = 4;
|
|
|
|
state->angle = 0.0f;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_9_3;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_3) {
|
2021-11-17 15:43:50 +01:00
|
|
|
if (partner->state.moveTime != 0) {
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->currentPos.x += (partner->state.goalPos.x - partner->currentPos.x) / partner->state.moveTime;
|
|
|
|
partner->currentPos.z += (partner->state.goalPos.z - partner->currentPos.z) / partner->state.moveTime;
|
|
|
|
player->currentPos.x += (partner->state.currentPos.x - player->currentPos.x) / partner->state.moveTime;
|
|
|
|
player->currentPos.z += (partner->state.currentPos.z - player->currentPos.z) / partner->state.moveTime;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-15 21:39:16 +02:00
|
|
|
partner->currentPos.z -= sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->yaw = clamp_angle(partner->state.angle);
|
2022-09-15 21:39:16 +02:00
|
|
|
player->currentPos.z += sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
player->yaw = clamp_angle(partner->state.angle);
|
2021-11-17 15:43:50 +01:00
|
|
|
partner->state.angle += 90.0f;
|
|
|
|
|
|
|
|
if (partner->state.moveTime != 0) {
|
|
|
|
partner->state.moveTime--;
|
|
|
|
} else {
|
|
|
|
partner->currentPos.x = partner->state.goalPos.x;
|
|
|
|
partner->currentPos.z = partner->state.goalPos.z;
|
|
|
|
player->currentPos.x = partner->state.currentPos.x;
|
|
|
|
player->currentPos.z = partner->state.currentPos.z;
|
2022-11-19 18:24:16 +01:00
|
|
|
if (!battleStatus->outtaSightActive) {
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->homePos.x = partner->currentPos.x;
|
|
|
|
partner->homePos.z = partner->currentPos.z;
|
2022-11-19 18:24:16 +01:00
|
|
|
player->homePos.x = player->currentPos.x;
|
|
|
|
player->homePos.z = player->currentPos.z;
|
|
|
|
} else {
|
|
|
|
player->homePos.x = player->currentPos.x;
|
|
|
|
player->homePos.z = player->currentPos.z;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_9_4;
|
2022-11-19 18:24:16 +01:00
|
|
|
gBattleStatus.flags1 &= ~ACTOR_FLAG_100000;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_4) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F258 != 0) {
|
|
|
|
D_8029F258--;
|
|
|
|
} else {
|
2022-11-19 18:24:16 +01:00
|
|
|
if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_2) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->merleeDefenseBoost = 3;
|
2022-11-19 18:24:16 +01:00
|
|
|
battleStatus->nextMerleeSpellType = MERLEE_SPELL_0;
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_MERLEE_DEFENSE_BONUS;
|
2022-11-19 18:24:16 +01:00
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
2021-11-17 15:43:50 +01:00
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-05-05 16:08:16 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-11-19 18:24:16 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
player->flags |= ACTOR_FLAG_4000000;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner != NULL) {
|
2022-11-19 18:24:16 +01:00
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
partner->flags |= ACTOR_FLAG_4000000;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_9_5;
|
2022-11-19 18:24:16 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_5) {
|
|
|
|
if (player->takeTurnScript == NULL || (does_script_exist(player->takeTurnScriptID) == 0)) {
|
2021-11-17 15:43:50 +01:00
|
|
|
player->takeTurnScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handlePhaseSource != NULL) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_PLAYER_END;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(actor->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
actor->handlePhaseScript = script;
|
|
|
|
actor->handleBatttlePhaseScriptID = script->id;
|
2022-11-19 18:24:16 +01:00
|
|
|
script->owner1.enemyID = i | ACTOR_CLASS_ENEMY;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_9_6;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = FALSE;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_6) {
|
2022-09-08 14:21:07 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handlePhaseSource != NULL && does_script_exist(actor->handleBatttlePhaseScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = TRUE;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!cond) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_9_7;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_9_7) {
|
2022-11-19 18:24:16 +01:00
|
|
|
btl_set_state(BATTLE_STATE_NEXT_ENEMY);
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
void btl_state_draw_9(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_update_prepare_menu(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
|
|
|
|
battleStatus->unk_4C[1] = -1;
|
|
|
|
battleStatus->unk_4C[2] = -1;
|
|
|
|
battleStatus->unk_4C[3] = -1;
|
|
|
|
battleStatus->unk_4C[4] = -1;
|
|
|
|
battleStatus->unk_4C[5] = -1;
|
|
|
|
battleStatus->unk_4C[5] = -1;
|
|
|
|
battleStatus->unk_4C[6] = -1;
|
|
|
|
battleStatus->unk_4C[7] = -1;
|
|
|
|
battleStatus->unk_5C[1] = -1;
|
|
|
|
battleStatus->unk_5C[6] = -1;
|
|
|
|
battleStatus->unk_5C[7] = -1;
|
|
|
|
|
|
|
|
dma_copy(_415D90_ROM_START, _415D90_ROM_END, _415D90_VRAM);
|
|
|
|
|
|
|
|
if (battleStatus->flags1 & BS_FLAGS1_80000) {
|
|
|
|
btl_set_state(BATTLE_STATE_PARTNER_MENU);
|
2023-01-10 07:33:09 +01:00
|
|
|
} else if (gBattleSubState == BATTLE_SUBSTATE_PREPARE_MENU_UNK_70) {
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_set_state(BATTLE_STATE_PLAYER_MENU);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MENU_UNUSED_1;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_PLAYER_MENU);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_draw_prepare_menu(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_update_end_turn(void) {
|
2022-05-05 16:08:16 +02:00
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
2022-09-08 14:21:07 +02:00
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Actor* actor;
|
|
|
|
Evt* script;
|
|
|
|
s32 i;
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_TURN_INIT) {
|
2022-09-08 14:21:07 +02:00
|
|
|
s32 cond = FALSE;
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(actor->handleEventScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
do {
|
|
|
|
cond = TRUE;
|
|
|
|
} while (0); // TODO required to match
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->handleEventScript = NULL;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!cond) {
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL && actor->takeTurnScript != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (does_script_exist(actor->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor->takeTurnScript = NULL;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
if (!cond) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TURN_CHECK_FOR_SWAP;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_TURN_CHECK_FOR_SWAP) {
|
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TURN_START_SCRIPTS;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else if (!(gBattleStatus.flags1 & BS_FLAGS1_100000)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TURN_START_SCRIPTS;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
player->flags |= ACTOR_FLAG_4000000;
|
|
|
|
partner->flags |= ACTOR_FLAG_4000000;
|
|
|
|
partner->state.currentPos.x = partner->homePos.x;
|
|
|
|
partner->state.currentPos.z = partner->homePos.z;
|
|
|
|
partner->state.goalPos.x = player->homePos.x;
|
|
|
|
partner->state.goalPos.z = player->homePos.z;
|
|
|
|
partner->state.moveTime = 4;
|
|
|
|
partner->state.angle = 0.0f;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TURN_PERFORM_SWAP;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_TURN_PERFORM_SWAP) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner->state.moveTime != 0) {
|
|
|
|
partner->currentPos.x += (partner->state.goalPos.x - partner->currentPos.x) / partner->state.moveTime;
|
|
|
|
partner->currentPos.z += (partner->state.goalPos.z - partner->currentPos.z) / partner->state.moveTime;
|
|
|
|
player->currentPos.x += (partner->state.currentPos.x - player->currentPos.x) / partner->state.moveTime;
|
|
|
|
player->currentPos.z += (partner->state.currentPos.z - player->currentPos.z) / partner->state.moveTime;
|
|
|
|
}
|
2022-09-15 21:39:16 +02:00
|
|
|
partner->currentPos.z -= sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->yaw = clamp_angle(partner->state.angle);
|
2022-09-15 21:39:16 +02:00
|
|
|
player->currentPos.z += sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
player->yaw = clamp_angle(partner->state.angle);
|
|
|
|
partner->state.angle += 90.0f;
|
|
|
|
if (partner->state.moveTime != 0) {
|
|
|
|
partner->state.moveTime--;
|
|
|
|
} else {
|
|
|
|
partner->currentPos.x = partner->state.goalPos.x;
|
|
|
|
partner->currentPos.z = partner->state.goalPos.z;
|
|
|
|
player->currentPos.x = partner->state.currentPos.x;
|
|
|
|
player->currentPos.z = partner->state.currentPos.z;
|
|
|
|
partner->homePos.x = partner->currentPos.x;
|
|
|
|
partner->homePos.z = partner->currentPos.z;
|
|
|
|
player->homePos.x = player->currentPos.x;
|
|
|
|
player->homePos.z = player->currentPos.z;
|
|
|
|
player->flags |= ACTOR_FLAG_8000000;
|
|
|
|
partner->flags |= ACTOR_FLAG_8000000;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_100000;
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_100000;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TURN_START_SCRIPTS;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_TURN_START_SCRIPTS) {
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10000;
|
|
|
|
player->disableDismissTimer = 0;
|
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
if (partner != NULL) {
|
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
partner->disableDismissTimer = 0;
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
func_80260A60();
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_PLAYER_DEFENDING;
|
|
|
|
playerData->specialBarsFilled += 32;
|
|
|
|
if (playerData->specialBarsFilled > playerData->maxStarPower * 256) {
|
|
|
|
playerData->specialBarsFilled = playerData->maxStarPower * 256;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handlePhaseSource != NULL) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_ENEMY_END;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(actor->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
actor->handlePhaseScript = script;
|
|
|
|
actor->handleBatttlePhaseScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.enemyID = i | ACTOR_ENEMY0;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner != NULL && partner->handlePhaseSource != NULL) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_ENEMY_END;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
partner->handlePhaseScript = script;
|
|
|
|
partner->handleBatttlePhaseScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TURN_AWAIT_SCRIPTS;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
// wait for all end turn scripts to finish executing
|
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_TURN_AWAIT_SCRIPTS) {
|
2022-09-08 14:21:07 +02:00
|
|
|
s32 cond = FALSE;
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handlePhaseSource != NULL && does_script_exist(actor->handleBatttlePhaseScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = TRUE;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner != NULL && partner->handlePhaseSource != NULL && does_script_exist(partner->handleBatttlePhaseScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
cond = TRUE;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!cond) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TURN_BEGIN_NEXT;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
// proceed to next to
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_TURN_BEGIN_NEXT:
|
|
|
|
case BTL_SUBSTATE_END_TURN_UNK_4:
|
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_TURN);
|
2022-05-27 15:03:19 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_draw_end_turn(void) {
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_update_1C(void) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
2021-07-21 13:43:13 +02:00
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_draw_1C(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_update_victory(void) {
|
2022-05-27 15:03:19 +02:00
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
EncounterStatus* currentEncounter = &gCurrentEncounter;
|
2022-09-08 14:21:07 +02:00
|
|
|
PlayerData* playerData = &gPlayerData;
|
2022-05-27 15:03:19 +02:00
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Evt* script;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_VICTORY_UNK_0:
|
2022-09-08 14:21:07 +02:00
|
|
|
player->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
|
|
|
}
|
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
battleStatus->unk_8C = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (battleStatus->outtaSightActive == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_5;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
if (battleStatus->outtaSightActive > 0) {
|
|
|
|
D_8029F254 = 1;
|
|
|
|
}
|
|
|
|
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
partner->handlePhaseScript = script;
|
|
|
|
partner->handleBatttlePhaseScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_1;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_VICTORY_UNK_1:
|
|
|
|
if (!does_script_exist(partner->handleBatttlePhaseScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->outtaSightActive = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_5;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_VICTORY_UNK_5:
|
2022-09-08 14:21:07 +02:00
|
|
|
player->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_B;
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_8;
|
|
|
|
if (player->koStatus == STATUS_DAZE) {
|
|
|
|
dispatch_event_player(EVENT_RECOVER_PARTNER);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_A;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
player->debuff = 0;
|
|
|
|
player->staticStatus = 0;
|
|
|
|
player->stoneStatus = 0;
|
|
|
|
player->transparentStatus = 0;
|
|
|
|
player->koStatus = 0;
|
|
|
|
player->koDuration = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->disableEffect->data.disableX->koDuration = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
if (partner != NULL) {
|
|
|
|
if (partner->koStatus == STATUS_DAZE) {
|
|
|
|
dispatch_event_partner(EVENT_RECOVER_PARTNER);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_A;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
partner->debuff = 0;
|
|
|
|
partner->staticStatus = 0;
|
|
|
|
partner->stoneStatus = 0;
|
|
|
|
partner->transparentStatus = 0;
|
|
|
|
partner->koStatus = 0;
|
|
|
|
partner->koDuration = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->disableEffect->data.disableX->koDuration = 0;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_VICTORY_UNK_A:
|
|
|
|
if (player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
|
|
|
|
player->handleEventScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->handleEventScript == NULL || !does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
partner->handleEventScript = NULL;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_B;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_VICTORY_UNK_B) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner == NULL || !(gBattleStatus.flags1 & BS_FLAGS1_100000)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_2;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
partner->state.currentPos.x = partner->currentPos.x;
|
|
|
|
partner->state.currentPos.z = partner->currentPos.z;
|
|
|
|
partner->state.goalPos.x = player->currentPos.x;
|
|
|
|
partner->state.goalPos.z = player->currentPos.z;
|
|
|
|
partner->state.moveTime = 4;
|
|
|
|
partner->state.angle = 0.0f;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_C;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_VICTORY_UNK_C) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner->state.moveTime != 0) {
|
|
|
|
partner->currentPos.x += (partner->state.goalPos.x - partner->currentPos.x)
|
|
|
|
/ partner->state.moveTime;
|
|
|
|
partner->currentPos.z += (partner->state.goalPos.z - partner->currentPos.z)
|
|
|
|
/ partner->state.moveTime;
|
|
|
|
player->currentPos.x += (partner->state.currentPos.x - player->currentPos.x)
|
|
|
|
/ partner->state.moveTime;
|
|
|
|
player->currentPos.z += (partner->state.currentPos.z - player->currentPos.z)
|
|
|
|
/ partner->state.moveTime;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-15 21:39:16 +02:00
|
|
|
partner->currentPos.z += sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->yaw = clamp_angle(-partner->state.angle);
|
2022-09-15 21:39:16 +02:00
|
|
|
player->currentPos.z -= sin_rad(DEG_TO_RAD(partner->state.angle)) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
player->yaw = clamp_angle(-partner->state.angle);
|
|
|
|
partner->state.angle += 90.0f;
|
|
|
|
|
|
|
|
if (partner->state.moveTime != 0) {
|
|
|
|
partner->state.moveTime--;
|
|
|
|
} else {
|
|
|
|
partner->currentPos.x = partner->state.goalPos.x;
|
|
|
|
partner->currentPos.z = partner->state.goalPos.z;
|
|
|
|
player->currentPos.x = partner->state.currentPos.x;
|
|
|
|
player->currentPos.z = partner->state.currentPos.z;
|
|
|
|
partner->homePos.x = partner->currentPos.x;
|
|
|
|
partner->homePos.z = partner->currentPos.z;
|
|
|
|
player->homePos.x = player->currentPos.x;
|
|
|
|
player->homePos.z = player->currentPos.z;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_2;
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_100000;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_VICTORY_UNK_2) {
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_3) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (battleStatus->totalStarPoints == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->nextMerleeSpellType = MERLEE_SPELL_0;
|
2022-09-08 14:21:07 +02:00
|
|
|
playerData->merleeTurnCount = 0;
|
|
|
|
playerData->merleeCastsLeft++;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_MERLEE_EXP_BONUS;
|
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_3;
|
2022-09-08 14:21:07 +02:00
|
|
|
D_8029F248 = 0;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_VICTORY_UNK_3) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
2023-01-10 07:33:09 +01:00
|
|
|
} else if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
player->takeTurnScript = NULL;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->nextMerleeSpellType != MERLEE_SPELL_3) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_4;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->incrementStarPointDelay = 20;
|
|
|
|
battleStatus->nextMerleeSpellType = MERLEE_SPELL_0;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_VICTORY_UNK_4;
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->pendingStarPoints = battleStatus->totalStarPoints
|
|
|
|
+ battleStatus->pendingStarPoints + battleStatus->pendingStarPoints;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_VICTORY_UNK_4) {
|
|
|
|
if (battleStatus->pendingStarPoints <= 0) {
|
|
|
|
if (gBattleStatus.flags1 & BS_FLAGS1_STAR_POINTS_DROPPED) {
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_ENEMY_FLED;
|
|
|
|
}
|
|
|
|
if (playerData->battlesWon < 9999) {
|
|
|
|
playerData->battlesWon++;
|
|
|
|
}
|
|
|
|
if (gBattleStatus.flags1 & BS_FLAGS1_ENEMY_FLED) {
|
|
|
|
currentEncounter->battleOutcome = OUTCOME_ENEMY_FLED;
|
|
|
|
} else {
|
|
|
|
currentEncounter->battleOutcome = OUTCOME_PLAYER_WON;
|
|
|
|
}
|
|
|
|
if (gBattleStatus.flags1 & BS_FLAGS1_DISABLE_CELEBRATION) {
|
2023-01-11 09:38:04 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_DONT_STOP_MUSIC)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
bgm_set_song(0, -1, 0, 1500, 8);
|
|
|
|
}
|
|
|
|
btl_set_state(BATTLE_STATE_END_BATTLE);
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_CELEBRATION);
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_draw_victory(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_update_end_training_battle(void) {
|
2021-11-17 15:43:50 +01:00
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
2022-09-08 14:21:07 +02:00
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
EncounterStatus* encounterStatus = &gCurrentEncounter;
|
|
|
|
Actor* player = gBattleStatus.playerActor;
|
|
|
|
Actor* partner = gBattleStatus.partnerActor;
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_TRAINING_UNK_0:
|
2022-09-08 14:21:07 +02:00
|
|
|
player->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_B;
|
2022-05-05 16:08:16 +02:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (player->koStatus == STATUS_DAZE) {
|
|
|
|
dispatch_event_player(EVENT_RECOVER_PARTNER);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_A;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
player->debuff = 0;
|
|
|
|
player->staticStatus = 0;
|
|
|
|
player->stoneStatus = 0;
|
|
|
|
player->transparentStatus = 0;
|
|
|
|
player->koStatus = 0;
|
|
|
|
player->koDuration = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->disableEffect->data.disableX->koDuration = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner != NULL) {
|
|
|
|
if (partner->koStatus == STATUS_DAZE) {
|
|
|
|
dispatch_event_partner(EVENT_RECOVER_PARTNER);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_A;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->debuff = 0;
|
|
|
|
partner->staticStatus = 0;
|
|
|
|
partner->stoneStatus = 0;
|
|
|
|
partner->transparentStatus = 0;
|
|
|
|
partner->koStatus = 0;
|
|
|
|
partner->koDuration = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->disableEffect->data.disableX->koDuration = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_TRAINING_UNK_A:
|
|
|
|
if (player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
|
|
|
|
player->handleEventScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->handleEventScript == NULL || !does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
partner->handleEventScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_B;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_TRAINING_UNK_B:
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!battleStatus->outtaSightActive) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_D;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
Evt* script;
|
|
|
|
|
|
|
|
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
partner->handlePhaseScript = script;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_C;
|
|
|
|
partner->handleBatttlePhaseScriptID = script->id;
|
2022-05-05 16:08:16 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_TRAINING_UNK_D:
|
|
|
|
if (!does_script_exist(partner->handleBatttlePhaseScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->outtaSightActive = FALSE;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_D;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_TRAINING_UNK_D:
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
D_8029F248 = 30;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_TRAINING_UNK_E;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_TRAINING_UNK_E:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (playerData->trainingsDone < 9999) {
|
|
|
|
playerData->trainingsDone++;
|
|
|
|
}
|
2022-11-01 13:27:10 +01:00
|
|
|
encounterStatus->battleOutcome = OUTCOME_ENEMY_FLED;
|
2023-01-11 09:38:04 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_DONT_STOP_MUSIC)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
bgm_set_song(0, -1, 0, 1500, 8);
|
|
|
|
}
|
|
|
|
btl_set_state(BATTLE_STATE_END_BATTLE);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_draw_end_training_battle(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_update_end_battle(void) {
|
|
|
|
Battle* blah = (*D_800DC4FC);
|
|
|
|
EncounterStatus* encounterStatus = &gCurrentEncounter;
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Stage* stage;
|
|
|
|
Evt* script;
|
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_BATTLE_UNK_0:
|
2022-09-08 14:21:07 +02:00
|
|
|
D_80280A30 = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gGameStatusPtr->debugEnemyContact == DEBUG_CONTACT_DIE_ON_TOUCH) {
|
2022-09-08 14:21:07 +02:00
|
|
|
D_80280A30 = 255;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
if (encounterStatus->battleOutcome == OUTCOME_PLAYER_LOST && !(gBattleStatus.flags1 & BS_FLAGS1_NO_GAME_OVER)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_cam_unfreeze();
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_B);
|
|
|
|
set_screen_overlay_color(0, 0, 0, 0);
|
|
|
|
set_screen_overlay_center(0, 0, 160, 120);
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_BATTLE_UNK_1;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_BATTLE_UNK_1:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_80280A30 == 255) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_BATTLE_UNK_2;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
D_80280A30 += battleStatus->unk_8D;
|
|
|
|
if (D_80280A30 > 255) {
|
|
|
|
D_80280A30 = 255;
|
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_BATTLE_UNK_2:
|
2022-09-08 14:21:07 +02:00
|
|
|
D_80280A30 = 255;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_ACTORS_VISIBLE;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_800DC064 == NULL) {
|
|
|
|
stage = blah->stage;
|
|
|
|
} else {
|
2022-10-16 16:22:18 +02:00
|
|
|
stage = D_800DC064->stage;;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
if (stage->postBattle == NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_BATTLE_CLEANUP;
|
2022-09-08 14:21:07 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
script = start_script(stage->postBattle, EVT_PRIORITY_A, 0);
|
|
|
|
battleStatus->controlScript = script;
|
|
|
|
battleStatus->controlScriptID = script->id;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_BATTLE_AWAIT_STAGE_SCRIPT;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_BATTLE_AWAIT_STAGE_SCRIPT:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!does_script_exist(battleStatus->controlScriptID)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_BATTLE_CLEANUP;
|
2022-09-08 14:21:07 +02:00
|
|
|
// fallthrough
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_BATTLE_CLEANUP:
|
2022-09-08 14:21:07 +02:00
|
|
|
kill_all_scripts();
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
if (battleStatus->enemyActors[i] != NULL) {
|
|
|
|
btl_delete_actor(battleStatus->enemyActors[i]);
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
if (battleStatus->partnerActor != NULL) {
|
|
|
|
btl_delete_actor(battleStatus->partnerActor);
|
|
|
|
}
|
|
|
|
|
|
|
|
btl_delete_player_actor(battleStatus->playerActor);
|
|
|
|
|
2022-10-15 18:04:53 +02:00
|
|
|
if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_4) {
|
|
|
|
encounterStatus->merleeCoinBonus = TRUE;
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->nextMerleeSpellType = MERLEE_SPELL_0;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
encounterStatus->damageTaken = battleStatus->damageTaken;
|
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_DROP_WHACKA_BUMP) {
|
2022-10-15 18:04:53 +02:00
|
|
|
encounterStatus->dropWhackaBump = TRUE;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
remove_all_effects();
|
|
|
|
set_windows_visible(0);
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
2022-09-08 14:21:07 +02:00
|
|
|
decrement_status_menu_disabled();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (encounterStatus->battleOutcome == OUTCOME_PLAYER_LOST &&
|
2023-01-10 07:33:09 +01:00
|
|
|
!(gBattleStatus.flags1 & BS_FLAGS1_NO_GAME_OVER))
|
2022-09-08 14:21:07 +02:00
|
|
|
{
|
|
|
|
s16 areaID;
|
|
|
|
s16 mapID;
|
|
|
|
|
|
|
|
btl_set_state(BATTLE_STATE_0);
|
|
|
|
D_800DC4D0 = gBattleState;
|
|
|
|
get_map_IDs_by_name("gv_01", &areaID, &mapID);
|
|
|
|
gGameStatusPtr->areaID = areaID;
|
|
|
|
gGameStatusPtr->mapID = mapID;
|
2023-01-10 07:33:09 +01:00
|
|
|
gGameStatusPtr->entryID = gv_01_ENTRY_0;
|
2022-09-08 14:21:07 +02:00
|
|
|
set_game_mode(GAME_MODE_ENTER_WORLD);
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_0);
|
|
|
|
D_800DC4D0 = gBattleState;
|
|
|
|
func_8003E514(1);
|
|
|
|
set_game_mode(GAME_MODE_END_BATTLE);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_draw_end_battle(void) {
|
|
|
|
Camera* camera = &gCameras[gCurrentCameraID];
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gCurrentEncounter.battleOutcome == OUTCOME_PLAYER_LOST && !(gBattleStatus.flags1 & BS_FLAGS1_NO_GAME_OVER)) {
|
|
|
|
camera->auxBoomZOffset += 256;
|
2022-09-08 14:21:07 +02:00
|
|
|
set_screen_overlay_params_front(7, D_80280A30);
|
|
|
|
} else {
|
|
|
|
set_screen_overlay_params_front(0, D_80280A30);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_update_defend(void) {
|
|
|
|
Actor* player = gBattleStatus.playerActor;
|
|
|
|
Evt* script;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_DEFEND_INIT:
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.unk_8C = 0;
|
|
|
|
gBattleStatus.battlePhase = PHASE_USE_DEFEND;
|
|
|
|
player->takeTurnScript = script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_DEFEND_AWAIT_SCRIPT;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_DEFEND_AWAIT_SCRIPT:
|
|
|
|
if (!does_script_exist(player->takeTurnScriptID) && gBattleStatus.unk_8C == 0) {
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_set_state(BATTLE_STATE_END_PLAYER_TURN);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_draw_defend(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_update_run_away(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
EncounterStatus* currentEncounter = &gCurrentEncounter;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Actor* enemy;
|
|
|
|
s32 var_s0;
|
|
|
|
f32 var_f2;
|
|
|
|
Evt* script;
|
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_RUN_AWAY_UNK_0:
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->unk_8C = 0;
|
2022-10-10 13:26:32 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_ENEMY_FLED;
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_10 | BS_FLAGS2_8 | BS_FLAGS2_4 | BS_FLAGS2_2;
|
|
|
|
playerData->unk_2A6++;
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_25);
|
|
|
|
var_s0 = 0;
|
|
|
|
btl_cam_target_actor(ACTOR_PLAYER);
|
|
|
|
var_f2 = 0.0f;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL) {
|
|
|
|
if (!(enemy->flags & ACTOR_FLAG_TARGET_ONLY)) {
|
|
|
|
if (!(enemy->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
|
|
|
|
f32 escapeChance = enemy->actorBlueprint->escapeChance;
|
|
|
|
|
|
|
|
var_s0 += 1;
|
|
|
|
if (enemy->debuff == 3 ||
|
|
|
|
enemy->debuff == 4 ||
|
|
|
|
enemy->debuff == 5 ||
|
|
|
|
enemy->debuff == 6 ||
|
|
|
|
enemy->debuff == 7 ||
|
|
|
|
enemy->debuff == 8)
|
|
|
|
{
|
|
|
|
escapeChance = 100.0f;
|
|
|
|
}
|
|
|
|
var_f2 += escapeChance;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
player->state.varTable[0] = var_f2 / var_s0;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gGameStatusPtr->debugEnemyContact == DEBUG_CONTACT_AUTO_FLEE) {
|
2022-09-08 14:21:07 +02:00
|
|
|
player->state.varTable[0] = 100;
|
|
|
|
}
|
|
|
|
battleStatus->battlePhase = PHASE_RUN_AWAY_START;
|
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
if (partner != NULL && partner->koStatus == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_RUN_AWAY_UNK_2;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_RUN_AWAY_UNK_2:
|
|
|
|
if (!does_script_exist(player->takeTurnScriptID) && battleStatus->unk_8C == 0) {
|
2022-10-10 13:26:32 +02:00
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_ENEMY_FLED)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_RUN_AWAY_UNK_3;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2022-11-01 13:27:10 +01:00
|
|
|
currentEncounter->battleOutcome = OUTCOME_PLAYER_FLED;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (is_ability_active(ABILITY_RUNAWAY_PAY) == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_RUN_AWAY_UNK_B;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
status_menu_start_blinking_starpoints();
|
|
|
|
func_8023E104();
|
|
|
|
D_8029F264 = 0;
|
|
|
|
D_8029F24C = 0;
|
|
|
|
D_80280A30 = 0;
|
|
|
|
D_8029F25C = battleStatus->totalStarPoints * 100;
|
|
|
|
D_8029F250 = 20;
|
|
|
|
D_8029F260 = D_8029F25C / D_8029F250;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_RUN_AWAY_UNK_A;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_RUN_AWAY_UNK_A) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (battleStatus->totalStarPoints != 0) {
|
|
|
|
s8 temp_v1_4;
|
|
|
|
|
|
|
|
D_8029F25C -= D_8029F260;
|
|
|
|
temp_v1_4 = D_8029F25C / 100;
|
|
|
|
var_s0 = battleStatus->totalStarPoints - temp_v1_4;
|
|
|
|
battleStatus->totalStarPoints = temp_v1_4;
|
|
|
|
|
|
|
|
if (var_s0 > 0) {
|
|
|
|
sfx_play_sound(SOUND_211);
|
|
|
|
}
|
|
|
|
playerData->starPoints += var_s0;
|
|
|
|
D_80280A30 += 1;
|
|
|
|
if (D_8029F250 == 0 && battleStatus->totalStarPoints != 0) {
|
|
|
|
playerData->starPoints++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (playerData->starPoints >= 99) {
|
|
|
|
playerData->starPoints = 99;
|
|
|
|
}
|
|
|
|
if (battleStatus->totalStarPoints == 0) {
|
|
|
|
if (D_8029F250 != 0) {
|
|
|
|
D_8029F250--;
|
|
|
|
} else {
|
|
|
|
status_menu_stop_blinking_starpoints();
|
|
|
|
func_8023E11C();
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_RUN_AWAY_UNK_B;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_RUN_AWAY_UNK_B) {
|
2022-09-08 14:21:07 +02:00
|
|
|
playerData->battlesFled++;
|
2023-01-11 09:38:04 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_DONT_STOP_MUSIC)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
bgm_set_song(0, -1, 0, 1500, 8);
|
|
|
|
}
|
|
|
|
btl_set_state(BATTLE_STATE_END_BATTLE);
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_RUN_AWAY_UNK_3:
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_RUN_AWAY_FAIL;
|
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
if (partner != NULL && partner->koStatus == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_RUN_AWAY_UNK_4;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_RUN_AWAY_UNK_4:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
return;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!does_script_exist(player->takeTurnScriptID) &&
|
|
|
|
(partner == NULL || !does_script_exist(partner->takeTurnScriptID)) &&
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->unk_8C == 0)
|
|
|
|
{
|
|
|
|
btl_set_state(BATTLE_STATE_9);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_draw_run_away(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_update_defeat(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
EncounterStatus* currentEncounter = &gCurrentEncounter;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Evt* script;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_DEFEAT_UNK_0:
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->flags1 &= ~BS_FLAGS1_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->unk_8C = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
if (player->debuff != 0) {
|
|
|
|
if (player->debuff == 7) {
|
|
|
|
sfx_play_sound(SOUND_FROZEN_SHATTER);
|
2023-01-12 03:09:13 +01:00
|
|
|
player->icePillarEffect->flags |= EFFECT_INSTANCE_FLAG_10;
|
2022-09-08 14:21:07 +02:00
|
|
|
player->icePillarEffect = NULL;
|
|
|
|
}
|
|
|
|
player->debuff = 0;
|
|
|
|
player->debuffDuration = 0;
|
|
|
|
remove_status_debuff(player->hudElementDataIndex);
|
|
|
|
player->koStatus = 0;
|
|
|
|
player->koDuration = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->disableEffect->data.disableX->koDuration = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_25);
|
|
|
|
btl_cam_target_actor(0);
|
|
|
|
battleStatus->battlePhase = PHASE_RUN_AWAY_RESET;
|
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
|
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_DEFEAT_UNK_1;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_DEFEAT_UNK_1:
|
|
|
|
if (!does_script_exist(player->takeTurnScriptID) && battleStatus->unk_8C == 0) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (find_item(ITEM_LIFE_SHROOM) >= 0) {
|
|
|
|
battleStatus->battlePhase = PHASE_USE_LIFE_SHROOM;
|
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_DEFEAT_UNK_2;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_DEFEAT_UNK_A;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_DEFEAT_UNK_2:
|
|
|
|
if (!does_script_exist(player->takeTurnScriptID) && battleStatus->unk_8C == 0) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_DEFEAT_UNK_A;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_DEFEAT_UNK_A) {
|
2022-09-08 14:21:07 +02:00
|
|
|
currentEncounter->battleOutcome = OUTCOME_PLAYER_LOST;
|
2023-01-11 09:38:04 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_DONT_STOP_MUSIC)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
bgm_set_song(0, -1, 0, 1500, 8);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
btl_set_state(BATTLE_STATE_END_BATTLE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_draw_defeat(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
ApiStatus EnablePartnerBlur(Evt* script, s32 isInitialCall) {
|
|
|
|
enable_partner_blur();
|
|
|
|
return ApiStatus_DONE2;
|
|
|
|
}
|
|
|
|
|
|
|
|
ApiStatus DisablePartnerBlur(Evt* script, s32 isInitialCall) {
|
|
|
|
disable_partner_blur();
|
|
|
|
return ApiStatus_DONE2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_update_change_partner(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
ActorState* state = &player->state;
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
Actor* enemyActor;
|
|
|
|
Evt* script;
|
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_CHANGE_PARTNER_UNK_0:
|
2022-09-08 14:21:07 +02:00
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_10;
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_19);
|
|
|
|
btl_cam_set_target_pos(-89.0, 40.0, -99.0);
|
|
|
|
btl_cam_set_zoom(372);
|
|
|
|
btl_cam_set_zoffset(0);
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL) {
|
|
|
|
enemyActor->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
enemyActor->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
battleStatus->unk_5C[0] = -1;
|
2023-01-10 07:33:09 +01:00
|
|
|
D_8029F248 = 10;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_CHANGE_PARTNER_UNK_2;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_CHANGE_PARTNER_UNK_2:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
deduct_current_move_fp();
|
|
|
|
script = start_script(&BtlPutPartnerAway, EVT_PRIORITY_A, 0);
|
|
|
|
battleStatus->controlScript = script;
|
|
|
|
battleStatus->controlScriptID = script->id;
|
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
state->unk_18.x = partner->currentPos.x;
|
|
|
|
state->unk_18.y = 0.0f;
|
|
|
|
state->unk_18.z = partner->currentPos.z;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_CHANGE_PARTNER_UNK_3;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_CHANGE_PARTNER_UNK_3:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!does_script_exist(battleStatus->controlScriptID)) {
|
|
|
|
btl_delete_actor(partner);
|
2022-10-09 11:09:41 +02:00
|
|
|
playerData->currentPartner = battleStatus->unk_1AC;
|
2022-09-08 14:21:07 +02:00
|
|
|
load_partner_actor();
|
|
|
|
partner = battleStatus->partnerActor;
|
|
|
|
partner->scale.x = 0.1f;
|
|
|
|
partner->scale.y = 0.1f;
|
|
|
|
partner->scale.z = 0.1f;
|
|
|
|
partner->state.goalPos.x = state->unk_18.x;
|
|
|
|
partner->state.goalPos.y = partner->currentPos.y;
|
|
|
|
partner->state.goalPos.z = state->unk_18.z;
|
|
|
|
partner->currentPos.x = player->currentPos.x;
|
|
|
|
partner->currentPos.y = player->currentPos.y + 25.0f;
|
|
|
|
partner->currentPos.z = player->currentPos.z;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_CHANGE_PARTNER_UNK_4;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_CHANGE_PARTNER_UNK_4:
|
2022-09-08 14:21:07 +02:00
|
|
|
partner = battleStatus->partnerActor;
|
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!does_script_exist(partner->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->takeTurnScript = NULL;
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
script = start_script(&BtlBringPartnerOut, EVT_PRIORITY_A, 0);
|
|
|
|
battleStatus->controlScript = script;
|
|
|
|
battleStatus->controlScriptID = script->id;
|
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_CHANGE_PARTNER_UNK_5;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_CHANGE_PARTNER_UNK_5:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!does_script_exist(battleStatus->controlScriptID)) {
|
|
|
|
partner = battleStatus->partnerActor;
|
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->handlePhaseSource != NULL) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_PLAYER_BEGIN;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
partner->handlePhaseScript = script;
|
|
|
|
partner->handleBatttlePhaseScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_CHANGE_PARTNER_UNK_6;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_CHANGE_PARTNER_UNK_6:
|
2022-09-08 14:21:07 +02:00
|
|
|
partner = battleStatus->partnerActor;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner == NULL || partner->handlePhaseSource == NULL
|
|
|
|
|| !does_script_exist(partner->handleBatttlePhaseScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_CHANGE_PARTNER_UNK_7;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_CHANGE_PARTNER_UNK_7:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
|
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_80000)) {
|
|
|
|
if (player_team_is_ability_active(player, ABILITY_QUICK_CHANGE) != FALSE) {
|
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_END_PLAYER_TURN);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (player_team_is_ability_active(player, ABILITY_QUICK_CHANGE) == FALSE) {
|
|
|
|
btl_set_state(BATTLE_STATE_END_PARTNER_TURN);
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_draw_change_partner(void) {
|
|
|
|
}
|
|
|
|
|
|
|
|
void btl_state_update_player_move(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
s32 messageIndex;
|
|
|
|
Actor* actor;
|
|
|
|
Evt* script;
|
2023-01-10 07:33:09 +01:00
|
|
|
s32 foundEnemy;
|
|
|
|
s8 tipIndex;
|
2022-09-08 14:21:07 +02:00
|
|
|
s32 i;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_PLAYER_MOVE_INIT) {
|
2022-11-08 14:01:42 +01:00
|
|
|
battleStatus->unk_86 = 127;
|
|
|
|
battleStatus->blockResult = 127;
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
battleStatus->lastAttackDamage = 0;
|
|
|
|
battleStatus->unk_19A = 0;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_AUTO_SUCCEED_ACTION;
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
reset_actor_turn_info();
|
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
}
|
|
|
|
btl_cam_target_actor(0);
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_8;
|
|
|
|
player->status = 0;
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_8;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_200000;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
actor->status = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
actor->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
actor->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
if (battleStatus->moveCategory == BTL_MENU_TYPE_JUMP || battleStatus->moveCategory == BTL_MENU_TYPE_SMASH) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->nextMerleeSpellType == MERLEE_SPELL_1) {
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->merleeAttackBoost = 3;
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->nextMerleeSpellType = MERLEE_SPELL_0;
|
2022-09-08 14:21:07 +02:00
|
|
|
battleStatus->battlePhase = PHASE_MERLEE_ATTACK_BONUS;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_10000;
|
|
|
|
close_action_command_instruction_popup();
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_BEGIN_SHOW_TIP;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_EXECUTE_MOVE;
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
}
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_EXECUTE_MOVE;
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_BEGIN_SHOW_TIP:
|
|
|
|
if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
player->takeTurnScript = NULL;
|
|
|
|
if (!is_ability_active(ABILITY_BERSERKER)) {
|
|
|
|
if (battleStatus->selectedMoveID != MOVE_NONE) {
|
2023-01-10 07:33:09 +01:00
|
|
|
tipIndex = gMoveTable[battleStatus->selectedMoveID].actionTip;
|
|
|
|
if (tipIndex >= 0) {
|
|
|
|
btl_show_battle_message(BTL_MSG_2E + tipIndex, 60);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
D_8029F248 = 2;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_SHOW_TIP_DELAY;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_SHOW_TIP_DELAY:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_EXECUTE_MOVE;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_EXECUTE_MOVE:
|
2022-09-08 14:21:07 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_4000;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_10000;
|
|
|
|
increment_status_menu_disabled();
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_100;
|
|
|
|
reset_all_actor_sounds(player);
|
|
|
|
battleStatus->battlePhase = PHASE_EXECUTE_ACTION;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
|
|
|
script = start_script(&PeachScriptDispatcher, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_HANDLE_RESULTS;
|
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_HANDLE_RESULTS:
|
|
|
|
// wait for player battle phase script to finish
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_200000)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
player->takeTurnScript = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_100;
|
2023-01-10 07:33:09 +01:00
|
|
|
|
|
|
|
// wait for player battle event script to finish
|
|
|
|
if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
player->handleEventScript = NULL;
|
|
|
|
|
|
|
|
// wait for partner battle event script to finish
|
|
|
|
if (partner != NULL) {
|
|
|
|
if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
break;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->handleEventScript = NULL;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
// wait for all enemy battle phase scripts to finish
|
|
|
|
foundEnemy = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL && actor->takeTurnScript != NULL) {
|
|
|
|
if (does_script_exist(actor->takeTurnScriptID)) {
|
|
|
|
foundEnemy = TRUE;
|
|
|
|
} else {
|
|
|
|
actor->takeTurnScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
|
|
|
if (foundEnemy) {
|
|
|
|
break;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
// wait for all enemy battle event scripts to finish
|
|
|
|
foundEnemy = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL && actor->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(actor->handleEventScriptID)) {
|
|
|
|
foundEnemy = TRUE;
|
|
|
|
} else {
|
|
|
|
actor->handleEventScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (foundEnemy) {
|
|
|
|
break;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
actor->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->unk_8C != 0) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gGameStatusPtr->demoFlags & 1) {
|
|
|
|
btl_set_state(BATTLE_STATE_END_DEMO_BATTLE);
|
|
|
|
break;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
decrement_status_menu_disabled();
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_8;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
|
|
|
|
if (btl_check_player_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
if (battleStatus->moveCategory == BTL_MENU_TYPE_SMASH) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if ((battleStatus->selectedMoveID != MOVE_SMASH_CHARGE0) &&
|
|
|
|
(battleStatus->selectedMoveID != MOVE_SMASH_CHARGE) &&
|
|
|
|
(battleStatus->selectedMoveID != MOVE_SUPER_SMASH_CHARGE))
|
|
|
|
{
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_HAMMER_CHARGED;
|
|
|
|
}
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
if (battleStatus->moveCategory == BTL_MENU_TYPE_JUMP) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if ((battleStatus->selectedMoveID != MOVE_JUMP_CHARGE0) &&
|
|
|
|
(battleStatus->selectedMoveID != MOVE_JUMP_CHARGE) &&
|
|
|
|
(battleStatus->selectedMoveID != MOVE_SUPER_JUMP_CHARGE))
|
|
|
|
{
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_JUMP_CHARGED;
|
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_JUMP_CHARGED)) {
|
|
|
|
battleStatus->jumpCharge = 0;
|
|
|
|
}
|
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_HAMMER_CHARGED)) {
|
|
|
|
battleStatus->hammerCharge = 0;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL && !(actor->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
|
|
|
|
actor->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
}
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_update_ko_status();
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
foundEnemy = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
if (actor->status != 0) {
|
|
|
|
foundEnemy = TRUE;
|
|
|
|
break;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
|
|
|
|
if (!foundEnemy) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_CHECK_PLAYER_STATUS;
|
|
|
|
} else {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_D);
|
|
|
|
switch (actor->status) {
|
|
|
|
case 4:
|
|
|
|
messageIndex = BTL_MSG_12;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
messageIndex = BTL_MSG_13;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
messageIndex = BTL_MSG_14;
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
messageIndex = BTL_MSG_15;
|
|
|
|
break;
|
|
|
|
case 10:
|
|
|
|
messageIndex = BTL_MSG_16;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
messageIndex = BTL_MSG_17;
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
messageIndex = BTL_MSG_18;
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
messageIndex = BTL_MSG_19;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
messageIndex = 0;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_CHECK_PLAYER_STATUS;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
sfx_play_sound(SOUND_2107);
|
|
|
|
btl_show_battle_message(messageIndex, 60);
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
actor->status = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_AWAIT_ENEMY_STATUS_POPUP;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_AWAIT_ENEMY_STATUS_POPUP:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!btl_is_popup_displayed()) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_cam_move(15);
|
|
|
|
D_8029F248 = 10;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_POST_ENEMY_STATUS_POPUP;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_POST_ENEMY_STATUS_POPUP:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_CHECK_PLAYER_STATUS;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_CHECK_PLAYER_STATUS:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (player->status != 0) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_33);
|
|
|
|
switch (player->status) {
|
|
|
|
case 4:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_0A;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
case 6:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_0B;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
case 7:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_0C;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
case 9:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_0D;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
case 10:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_0E;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
case 5:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_0F;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
case 11:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_10;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
messageIndex = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_AWAIT_DONE;
|
2022-09-08 14:21:07 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
btl_show_battle_message(messageIndex, 60);
|
|
|
|
player->status = 0;
|
|
|
|
player->disableDismissTimer = 0;
|
|
|
|
player->flags |= ACTOR_FLAG_8000000;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_AWAIT_PLAYER_STATUS_POPUP;
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_AWAIT_DONE;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_AWAIT_PLAYER_STATUS_POPUP:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (!btl_is_popup_displayed()) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_cam_move(15);
|
|
|
|
D_8029F248 = 10;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_POST_PLAYER_STATUS_POPUP;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PLAYER_MOVE_POST_PLAYER_STATUS_POPUP:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PLAYER_MOVE_AWAIT_DONE;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_PLAYER_MOVE_AWAIT_DONE) {
|
|
|
|
if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnScriptID)) {
|
|
|
|
player->takeTurnScript = NULL;
|
|
|
|
btl_set_state(BATTLE_STATE_END_PLAYER_TURN);
|
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_draw_player_move(void) {
|
2020-11-18 06:20:28 +01:00
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
void btl_state_update_end_player_turn(void) {
|
2021-11-17 15:43:50 +01:00
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Evt* script;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_PLAYER_TURN_UNK_0) {
|
2023-01-11 09:38:04 +01:00
|
|
|
if (battleStatus->moveCategory == BTL_MENU_TYPE_ITEM && battleStatus->itemUsesLeft >= 2) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_5;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else if (
|
2023-01-11 09:38:04 +01:00
|
|
|
!(gBattleStatus.flags2 & BS_FLAGS2_HAS_DRAINED_HP) &&
|
2022-11-01 08:41:14 +01:00
|
|
|
!is_ability_active(ABILITY_HAPPY_HEART) &&
|
|
|
|
!is_ability_active(ABILITY_CRAZY_HEART) &&
|
|
|
|
!is_ability_active(ABILITY_HAPPY_FLOWER))
|
2022-09-08 14:21:07 +02:00
|
|
|
{
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_5;
|
2022-11-01 08:41:14 +01:00
|
|
|
} else if (player->stoneStatus == STATUS_STONE || battleStatus->outtaSightActive) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_5;
|
2022-11-01 08:41:14 +01:00
|
|
|
} else {
|
2022-09-08 14:21:07 +02:00
|
|
|
s32 prevHPDrainCount = 0;
|
2022-11-01 08:41:14 +01:00
|
|
|
s32 hpRecovery = 0;
|
|
|
|
s32 fpRecovery = 0;
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_HAS_DRAINED_HP) {
|
2022-09-08 14:21:07 +02:00
|
|
|
prevHPDrainCount = battleStatus->hpDrainCount;
|
|
|
|
battleStatus->hpDrainCount = 0;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
if (rand_int(100) < 50) {
|
2022-11-01 08:41:14 +01:00
|
|
|
hpRecovery = is_ability_active(ABILITY_CRAZY_HEART) * 3;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
if (rand_int(100) < 50) {
|
2022-11-01 08:41:14 +01:00
|
|
|
hpRecovery += is_ability_active(ABILITY_HAPPY_HEART);
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
if (rand_int(100) < 50) {
|
2022-11-01 08:41:14 +01:00
|
|
|
fpRecovery = is_ability_active(ABILITY_HAPPY_FLOWER);
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
|
2022-11-01 08:41:14 +01:00
|
|
|
if (prevHPDrainCount + hpRecovery + fpRecovery == 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_5;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
battleStatus->battlePhase = PHASE_PLAYER_HAPPY;
|
2022-11-01 13:27:10 +01:00
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-09-08 14:21:07 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
2023-01-11 09:38:04 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_HAS_DRAINED_HP) {
|
2022-09-08 14:21:07 +02:00
|
|
|
script->varTable[10] += battleStatus->hpDrainCount;
|
|
|
|
battleStatus->hpDrainCount = 0;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
script->varTable[10] = prevHPDrainCount;
|
2022-11-01 08:41:14 +01:00
|
|
|
script->varTable[11] = hpRecovery;
|
|
|
|
script->varTable[12] = fpRecovery;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
if (script->varTable[10] > 99) {
|
|
|
|
script->varTable[10] = 99;
|
|
|
|
}
|
|
|
|
if (script->varTable[11] > 99) {
|
|
|
|
script->varTable[11] = 99;
|
|
|
|
}
|
|
|
|
if (script->varTable[12] > 99) {
|
|
|
|
script->varTable[12] = 99;
|
|
|
|
}
|
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_DRAINED_HP;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_5;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_PLAYER_TURN_UNK_5) {
|
|
|
|
if ((player->takeTurnScript == NULL) || !does_script_exist(player->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
player->takeTurnScript = NULL;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) || (gBattleStatus.flags1 & BS_FLAGS1_100000)) {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_A;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
player->state.currentPos.x = player->homePos.x;
|
|
|
|
player->state.currentPos.z = player->homePos.z;
|
|
|
|
player->state.goalPos.x = partner->homePos.x;
|
|
|
|
player->state.goalPos.z = partner->homePos.z;
|
|
|
|
player->state.moveTime = 4;
|
|
|
|
player->state.angle = 0.0f;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_6;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_PLAYER_TURN_UNK_6) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (player->state.moveTime != 0) {
|
|
|
|
player->currentPos.x += (player->state.goalPos.x - player->currentPos.x) / player->state.moveTime;
|
|
|
|
player->currentPos.z += (player->state.goalPos.z - player->currentPos.z) / player->state.moveTime;
|
|
|
|
partner->currentPos.x += (player->state.currentPos.x - partner->currentPos.x) / player->state.moveTime;
|
|
|
|
partner->currentPos.z += (player->state.currentPos.z - partner->currentPos.z) / player->state.moveTime;
|
|
|
|
}
|
2022-11-01 13:27:10 +01:00
|
|
|
player->currentPos.z += sin_rad((player->state.angle * TAU) / 360.0f) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
player->yaw = clamp_angle(-player->state.angle);
|
2022-11-01 13:27:10 +01:00
|
|
|
partner->currentPos.z -= sin_rad((player->state.angle * TAU) / 360.0f) * 16.0f;
|
2022-09-08 14:21:07 +02:00
|
|
|
partner->yaw = clamp_angle(-player->state.angle);
|
|
|
|
player->state.angle += 90.0f;
|
|
|
|
|
|
|
|
if (player->state.moveTime != 0) {
|
|
|
|
player->state.moveTime--;
|
|
|
|
} else {
|
|
|
|
player->currentPos.x = player->state.goalPos.x;
|
|
|
|
player->currentPos.z = player->state.goalPos.z;
|
|
|
|
partner->currentPos.x = player->state.currentPos.x;
|
|
|
|
partner->currentPos.z = player->state.currentPos.z;
|
|
|
|
player->homePos.x = player->currentPos.x;
|
|
|
|
player->homePos.z = player->currentPos.z;
|
|
|
|
partner->homePos.x = partner->currentPos.x;
|
|
|
|
partner->homePos.z = partner->currentPos.z;
|
2022-11-01 08:41:14 +01:00
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_100000;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_PLAYER_TURN_UNK_A;
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_END_PLAYER_TURN_UNK_A) {
|
|
|
|
if(!btl_check_enemies_defeated()) {
|
2023-01-11 09:38:04 +01:00
|
|
|
if (battleStatus->moveCategory == BTL_MENU_TYPE_ITEM && battleStatus->itemUsesLeft >= 2) {
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_cam_move(10);
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
} else {
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_2;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->unk_94 < 0) {
|
|
|
|
battleStatus->unk_94 = 0;
|
|
|
|
battleStatus->itemUsesLeft = 0;
|
|
|
|
btl_set_state(BATTLE_STATE_END_TURN);
|
|
|
|
return;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
if (battleStatus->itemUsesLeft != 0) {
|
2023-01-10 07:33:09 +01:00
|
|
|
battleStatus->itemUsesLeft--;
|
|
|
|
if (battleStatus->itemUsesLeft != 0) {
|
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
|
|
|
gBattleSubState = BATTLE_SUBSTATE_PREPARE_MENU_UNK_70;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gBattleStatus.flags1 & BS_FLAGS1_HUSTLED) {
|
|
|
|
if (battleStatus->hustleTurns != 0) {
|
|
|
|
battleStatus->hustleTurns--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (battleStatus->hustleTurns != 0 && (gBattleStatus.flags1 & BS_FLAGS1_HUSTLED)) {
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
|
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
|
|
|
} else {
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_HUSTLED;
|
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_PARTNER_TURN);
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleStatus.flags1 & BS_FLAGS1_HUSTLED) {
|
2022-09-08 14:21:07 +02:00
|
|
|
if (battleStatus->hustleTurns != 0) {
|
|
|
|
battleStatus->hustleTurns--;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->hustleTurns != 0 && (gBattleStatus.flags1 & BS_FLAGS1_HUSTLED)) {
|
2022-11-01 08:41:14 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
btl_set_state(BATTLE_STATE_PREPARE_MENU);
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS2_HAS_DRAINED_HP;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE)) {
|
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_PARTNER_TURN);
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_9);
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-03-10 10:55:38 +01:00
|
|
|
void btl_state_draw_end_player_turn(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2021-11-17 15:43:50 +01:00
|
|
|
void btl_state_update_partner_move(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
2022-08-17 03:15:54 +02:00
|
|
|
Actor* enemyActor;
|
2021-11-17 15:43:50 +01:00
|
|
|
Evt* script;
|
|
|
|
s8 switchCondition;
|
|
|
|
s32 phi_s3;
|
2023-01-10 07:33:09 +01:00
|
|
|
s32 messageIndex;
|
2021-11-17 15:43:50 +01:00
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_0:
|
2021-11-17 15:43:50 +01:00
|
|
|
if (partner == NULL) {
|
2022-05-05 16:08:16 +02:00
|
|
|
btl_set_state(BATTLE_STATE_9);
|
2021-11-17 15:43:50 +01:00
|
|
|
} else {
|
|
|
|
battleStatus->unk_8C = 0;
|
2022-11-08 14:01:42 +01:00
|
|
|
battleStatus->unk_86 = 127;
|
|
|
|
battleStatus->blockResult = 127;
|
2021-11-17 15:43:50 +01:00
|
|
|
battleStatus->unk_19A = 0;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_AUTO_SUCCEED_ACTION;
|
2021-11-17 15:43:50 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
reset_actor_turn_info();
|
|
|
|
partner->status = 0;
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
deduct_current_move_fp();
|
2023-01-11 09:38:04 +01:00
|
|
|
btl_cam_target_actor(ACTOR_PARTNER);
|
2021-11-17 15:43:50 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_10;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_200000;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL) {
|
|
|
|
enemyActor->status = 0;
|
|
|
|
}
|
|
|
|
}
|
2022-05-16 21:18:18 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_2;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_2:
|
2021-11-17 15:43:50 +01:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL) {
|
|
|
|
enemyActor->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
enemyActor->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
increment_status_menu_disabled();
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_100;
|
|
|
|
reset_actor_turn_info();
|
|
|
|
reset_all_actor_sounds(partner);
|
|
|
|
battleStatus->battlePhase = PHASE_EXECUTE_ACTION;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
|
2021-11-17 15:43:50 +01:00
|
|
|
partner->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->takeTurnScriptID = script->id;
|
2022-05-05 16:08:16 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_3;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_3:
|
2021-11-17 15:43:50 +01:00
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_200000)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->takeTurnScript == NULL || !does_script_exist(partner->takeTurnScriptID)) {
|
2021-11-17 15:43:50 +01:00
|
|
|
partner->takeTurnScript = NULL;
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_100;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if ((partner->handleEventScript == NULL || !does_script_exist(partner->handleEventScriptID))
|
|
|
|
&& ((partner->handleEventScript = NULL, player->handleEventScript == NULL)
|
|
|
|
|| !does_script_exist(player->handleEventScriptID))) {
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
player->handleEventScript = NULL;
|
2021-11-17 15:43:50 +01:00
|
|
|
for (phi_s3 = FALSE, i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL && enemyActor->takeTurnScript != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (does_script_exist(enemyActor->takeTurnScriptID)) {
|
2021-11-17 15:43:50 +01:00
|
|
|
phi_s3 = TRUE;
|
|
|
|
} else {
|
|
|
|
enemyActor->takeTurnScript = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (phi_s3 == FALSE) {
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemyActor != NULL && enemyActor->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(enemyActor->handleEventScriptID)) {
|
2021-11-17 15:43:50 +01:00
|
|
|
phi_s3 = TRUE;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
enemyActor->handleEventScript = NULL;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (phi_s3 == FALSE) {
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL) {
|
|
|
|
enemyActor->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
if (gGameStatusPtr->demoFlags & 1) {
|
2022-05-05 16:08:16 +02:00
|
|
|
btl_set_state(BATTLE_STATE_END_DEMO_BATTLE);
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
decrement_status_menu_disabled();
|
2023-01-11 09:38:04 +01:00
|
|
|
if (playerData->currentPartner == PARTNER_GOOMBARIO && battleStatus->moveCategory == BTL_MENU_TYPE_5
|
2021-11-17 15:43:50 +01:00
|
|
|
&& battleStatus->selectedMoveID != MOVE_CHARGE) {
|
|
|
|
partner->isGlowing = 0;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_40000000;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
if (btl_check_player_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL) {
|
|
|
|
if (!(enemyActor->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
|
|
|
|
enemyActor->flags |= (ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_update_ko_status();
|
2021-11-17 15:43:50 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->status == 0xD && !btl_are_all_enemies_defeated()) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_54);
|
|
|
|
btl_show_battle_message(BTL_MSG_23, 60);
|
|
|
|
partner->status = 0;
|
|
|
|
partner->disableDismissTimer = 0;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_B;
|
|
|
|
partner->flags |= ACTOR_FLAG_8000000;
|
2021-11-17 15:43:50 +01:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_14;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_B:
|
2021-11-17 15:43:50 +01:00
|
|
|
if (btl_is_popup_displayed() == FALSE) {
|
2022-05-16 21:18:18 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_cam_move(15);
|
2022-09-08 14:21:07 +02:00
|
|
|
D_8029F248 = 10;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_C;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_C:
|
2021-11-17 15:43:50 +01:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_14;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_14:
|
2021-11-17 15:43:50 +01:00
|
|
|
for (phi_s3 = FALSE, i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL) {
|
|
|
|
if ((s8)enemyActor->status != 0) {
|
|
|
|
phi_s3 = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (phi_s3 == FALSE) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_1E;
|
2021-11-17 15:43:50 +01:00
|
|
|
} else {
|
2022-05-16 21:18:18 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_D);
|
2021-11-17 15:43:50 +01:00
|
|
|
switchCondition = enemyActor->status - 4;
|
|
|
|
switch (switchCondition) {
|
|
|
|
case 0:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_12;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
case 2:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_13;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
case 3:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_14;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
case 5:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_15;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
case 6:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_16;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
case 1:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_17;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
case 7:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_18;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
case 4:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = BTL_MSG_19;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
default:
|
2023-01-10 07:33:09 +01:00
|
|
|
messageIndex = 0;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_14;
|
2021-11-17 15:43:50 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2021-12-13 10:27:28 +01:00
|
|
|
sfx_play_sound(SOUND_2107);
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_show_battle_message(messageIndex, 60);
|
2021-11-17 15:43:50 +01:00
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemyActor = battleStatus->enemyActors[i];
|
|
|
|
if (enemyActor != NULL) {
|
|
|
|
enemyActor->status = 0;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_15;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_15:
|
2021-11-17 15:43:50 +01:00
|
|
|
if (btl_is_popup_displayed() == FALSE) {
|
2022-05-16 21:18:18 +02:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_cam_move(15);
|
2022-05-05 16:08:16 +02:00
|
|
|
D_8029F248 = 10;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_16;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_MOVE_UNK_16:
|
2021-11-17 15:43:50 +01:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_MOVE_UNK_1E;
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_PARTNER_MOVE_UNK_1E) {
|
|
|
|
if (partner->takeTurnScript != NULL && does_script_exist(partner->takeTurnScriptID)) {
|
|
|
|
return;
|
|
|
|
}
|
2021-11-17 15:43:50 +01:00
|
|
|
partner->takeTurnScript = NULL;
|
2022-05-05 16:08:16 +02:00
|
|
|
btl_set_state(BATTLE_STATE_END_PARTNER_TURN);
|
2021-11-17 15:43:50 +01:00
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_partner_move(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_update_end_partner_turn(void) {
|
2021-07-19 13:49:30 +02:00
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
2021-03-19 19:17:02 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_INIT) {
|
2021-11-17 15:43:50 +01:00
|
|
|
battleStatus->flags2 |= BS_FLAGS2_4;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
battleStatus->flags1 &= ~BS_FLAGS1_80000;
|
|
|
|
battleStatus->flags2 &= ~BS_FLAGS2_10;
|
2021-03-19 19:17:02 +01:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->unk_94 < 0) {
|
|
|
|
battleStatus->unk_94 = 0;
|
|
|
|
btl_set_state(BATTLE_STATE_END_TURN);
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_9);
|
2021-03-19 19:17:02 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_end_partner_turn(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-05-05 16:08:16 +02:00
|
|
|
void btl_state_update_next_enemy(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* player = gBattleStatus.playerActor;
|
|
|
|
Actor* partner = gBattleStatus.partnerActor;
|
|
|
|
Actor* enemy;
|
2023-01-10 07:33:09 +01:00
|
|
|
s32 skipEnemy;
|
2022-05-05 16:08:16 +02:00
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_NEXT_ENEMY_INIT:
|
|
|
|
case BTL_SUBSTATE_NEXT_ENEMY_UNK_1:
|
2022-05-05 16:08:16 +02:00
|
|
|
i = battleStatus->nextEnemyIndex;
|
|
|
|
if (i >= battleStatus->numEnemyActors) {
|
2023-01-10 07:33:09 +01:00
|
|
|
// all enemies have been exhausted
|
2022-05-05 16:08:16 +02:00
|
|
|
battleStatus->nextEnemyIndex = 0;
|
|
|
|
btl_set_state(BATTLE_STATE_END_TURN);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
// find the next eligible enemy
|
2022-05-05 16:08:16 +02:00
|
|
|
while (TRUE) {
|
|
|
|
if (battleStatus->enemyIDs[i] >= 0) {
|
|
|
|
u16 enemyID = battleStatus->enemyIDs[i];
|
|
|
|
|
|
|
|
enemy = battleStatus->enemyActors[enemyID & 0xFF];
|
|
|
|
if (enemy != NULL) {
|
|
|
|
if (!(enemy->flags & (ACTOR_FLAG_NO_ATTACK | ACTOR_FLAG_TARGET_ONLY))) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
i++;
|
|
|
|
if (i >= battleStatus->numEnemyActors) {
|
|
|
|
i = 0;
|
|
|
|
}
|
|
|
|
if (i == 0) {
|
|
|
|
battleStatus->nextEnemyIndex = 0;
|
|
|
|
btl_set_state(BATTLE_STATE_END_TURN);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
battleStatus->activeEnemyActorID = battleStatus->enemyIDs[i++];
|
|
|
|
battleStatus->currentTurnEnemy = enemy;
|
|
|
|
battleStatus->nextEnemyIndex = i;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = FALSE;
|
|
|
|
|
|
|
|
if (enemy->debuff == STATUS_SLEEP) {
|
|
|
|
skipEnemy = TRUE;
|
|
|
|
}
|
2022-05-05 16:08:16 +02:00
|
|
|
if (enemy->debuff == STATUS_FEAR) {
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
if (enemy->debuff == STATUS_DIZZY) {
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
if (enemy->debuff == STATUS_PARALYZE) {
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
if (enemy->debuff == STATUS_FROZEN) {
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
if (enemy->debuff == STATUS_STOP) {
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
if (enemy->stoneStatus == STATUS_STONE) {
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
if (enemy->flags & ACTOR_FLAG_10000) {
|
2023-01-10 07:33:09 +01:00
|
|
|
skipEnemy = TRUE;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
|
|
|
|
if (skipEnemy) {
|
|
|
|
// reset state to fetch next enemy
|
|
|
|
gBattleSubState = BTL_SUBSTATE_NEXT_ENEMY_INIT;
|
2022-05-05 16:08:16 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
2022-10-10 13:26:32 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_ENEMY_FLED;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_AUTO_SUCCEED_ACTION;
|
2022-05-05 16:08:16 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_80000;
|
|
|
|
|
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
player->flags |= ACTOR_FLAG_4000000;
|
|
|
|
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
partner->flags |= ACTOR_FLAG_4000000;
|
|
|
|
}
|
|
|
|
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_10000;
|
|
|
|
|
|
|
|
D_8029F244 = enemy->unk_134;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy->handlePhaseSource != NULL) {
|
2022-05-05 16:08:16 +02:00
|
|
|
Evt* onTurnChanceScript;
|
|
|
|
|
|
|
|
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
|
2023-01-10 07:33:09 +01:00
|
|
|
onTurnChanceScript = start_script(enemy->handlePhaseSource, EVT_PRIORITY_A, 0);
|
|
|
|
enemy->handlePhaseScript = onTurnChanceScript;
|
|
|
|
enemy->handleBatttlePhaseScriptID = onTurnChanceScript->id;
|
2022-05-05 16:08:16 +02:00
|
|
|
onTurnChanceScript->owner1.actorID = battleStatus->activeEnemyActorID;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_NEXT_ENEMY_DONE;
|
2022-05-05 16:08:16 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_NEXT_ENEMY_DONE:
|
2022-05-05 16:08:16 +02:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
enemy = get_actor(battleStatus->activeEnemyActorID);
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy == NULL || enemy->unk_134 != D_8029F244) {
|
|
|
|
btl_set_state(BATTLE_STATE_NEXT_ENEMY);
|
|
|
|
} else {
|
|
|
|
if (enemy->handlePhaseSource == NULL || !does_script_exist(enemy->handleBatttlePhaseScriptID)) {
|
2022-05-05 16:08:16 +02:00
|
|
|
if (battleStatus->unk_94 < 0) {
|
|
|
|
battleStatus->unk_94 = 0;
|
|
|
|
btl_set_state(BATTLE_STATE_END_TURN);
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_ENEMY_MOVE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_next_enemy(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-08-17 03:15:54 +02:00
|
|
|
void btl_state_update_enemy_move(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* player = gBattleStatus.playerActor;
|
|
|
|
Actor* partner = gBattleStatus.partnerActor;
|
|
|
|
Actor* enemy;
|
|
|
|
s32 i;
|
|
|
|
|
|
|
|
Evt* script;
|
|
|
|
s32 messageIndex;
|
2023-01-10 07:33:09 +01:00
|
|
|
s32 waitingForEnemyScript;
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_EXECUTE:
|
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_UNK_1:
|
2022-08-17 03:15:54 +02:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_200000;
|
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
}
|
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
battleStatus->lastAttackDamage = 0;
|
|
|
|
battleStatus->actionSuccess = 0;
|
2022-11-08 14:01:42 +01:00
|
|
|
battleStatus->unk_86 = 127;
|
|
|
|
battleStatus->blockResult = 127;
|
2022-08-17 03:15:54 +02:00
|
|
|
battleStatus->unk_19A = 0;
|
|
|
|
reset_actor_turn_info();
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_100;
|
|
|
|
player->status = 0;
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->status = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_4000;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL) {
|
|
|
|
enemy->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL) {
|
|
|
|
if (!(enemy->flags & ACTOR_FLAG_NO_DMG_APPLY)) {
|
|
|
|
enemy->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
enemy = battleStatus->currentTurnEnemy;
|
|
|
|
if (!(enemy->flags & ACTOR_FLAG_NO_ATTACK)) {
|
|
|
|
reset_all_actor_sounds(enemy);
|
|
|
|
battleStatus->battlePhase = PHASE_EXECUTE_ACTION;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(enemy->takeTurnSource, EVT_PRIORITY_A, 0);
|
2022-08-17 03:15:54 +02:00
|
|
|
enemy->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
enemy->takeTurnScriptID = script->id;
|
2022-08-17 03:15:54 +02:00
|
|
|
script->owner1.actorID = battleStatus->activeEnemyActorID;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_AWAIT_SCRIPTS;
|
2022-08-17 03:15:54 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_AWAIT_SCRIPTS:
|
|
|
|
if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
player->takeTurnScript = NULL;
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
player->handleEventScript = NULL;
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner != NULL) {
|
|
|
|
if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
partner->handleEventScript = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
waitingForEnemyScript = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL && enemy->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(enemy->handleEventScriptID)) {
|
|
|
|
waitingForEnemyScript = TRUE;
|
|
|
|
} else {
|
|
|
|
enemy->handleEventScript = NULL;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
|
|
|
}
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (waitingForEnemyScript) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (btl_check_player_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL && enemy->takeTurnScript != NULL) {
|
|
|
|
if (does_script_exist(enemy->takeTurnScriptID)) {
|
|
|
|
waitingForEnemyScript = TRUE;
|
|
|
|
} else {
|
|
|
|
enemy->takeTurnScript = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!waitingForEnemyScript || (gBattleStatus.flags1 & BS_FLAGS1_200000)) {
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_100;
|
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4000;
|
|
|
|
if (btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
if (gGameStatusPtr->demoFlags & 1) {
|
|
|
|
btl_set_state(BATTLE_STATE_END_DEMO_BATTLE);
|
|
|
|
} else {
|
|
|
|
btl_update_ko_status();
|
|
|
|
if (player->status != 0) {
|
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_33);
|
|
|
|
|
|
|
|
switch (player->status) {
|
|
|
|
case STATUS_DIZZY:
|
|
|
|
messageIndex = BTL_MSG_0A;
|
|
|
|
break;
|
|
|
|
case STATUS_SLEEP:
|
|
|
|
messageIndex = BTL_MSG_0B;
|
|
|
|
break;
|
|
|
|
case STATUS_FROZEN:
|
|
|
|
messageIndex = BTL_MSG_0C;
|
|
|
|
break;
|
|
|
|
case STATUS_POISON:
|
|
|
|
messageIndex = BTL_MSG_0D;
|
|
|
|
break;
|
|
|
|
case STATUS_SHRINK:
|
|
|
|
messageIndex = BTL_MSG_0E;
|
|
|
|
break;
|
|
|
|
case STATUS_PARALYZE:
|
|
|
|
messageIndex = BTL_MSG_0F;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
messageIndex = 0;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_CHECK_PARTNER;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
btl_show_battle_message(messageIndex, 60);
|
|
|
|
player->status = 0;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_AWAIT_PLAYER_POPUP_DONE;
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_CHECK_PARTNER;
|
|
|
|
break;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_AWAIT_PLAYER_POPUP_DONE:
|
2022-08-17 03:15:54 +02:00
|
|
|
if (!btl_is_popup_displayed()) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_cam_move(15);
|
|
|
|
D_8029F248 = 10;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_POST_PLAYER_POPUP_DELAY;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_POST_PLAYER_POPUP_DELAY:
|
2022-08-17 03:15:54 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_CHECK_PARTNER;
|
2022-08-17 03:15:54 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_CHECK_PARTNER:
|
2022-08-17 03:15:54 +02:00
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->status == STATUS_DAZE) {
|
2022-08-17 03:15:54 +02:00
|
|
|
player->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
partner->flags |= ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000;
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_54);
|
2023-01-10 07:33:09 +01:00
|
|
|
btl_show_battle_message(BTL_MSG_23, 60);
|
2022-08-17 03:15:54 +02:00
|
|
|
partner->status = 0;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_AWAIT_PARTNER_POPUP_DONE;
|
2022-08-17 03:15:54 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_DONE;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_DONE;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_AWAIT_PARTNER_POPUP_DONE:
|
2022-08-17 03:15:54 +02:00
|
|
|
if (!btl_is_popup_displayed()) {
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_C);
|
|
|
|
btl_cam_move(15);
|
|
|
|
D_8029F248 = 10;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_POST_PARTNER_POPUP_DELAY;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_MOVE_POST_PARTNER_POPUP_DELAY:
|
2022-08-17 03:15:54 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_MOVE_DONE;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleSubState == BTL_SUBSTATE_ENEMY_MOVE_DONE) {
|
2022-08-17 03:15:54 +02:00
|
|
|
btl_set_state(BATTLE_STATE_NEXT_ENEMY);
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_enemy_move(void) {
|
2020-10-15 05:49:49 +02:00
|
|
|
}
|
|
|
|
|
2022-08-17 03:15:54 +02:00
|
|
|
void btl_state_update_first_strike(void) {
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
EncounterStatus* encounterStatus = &gCurrentEncounter;
|
|
|
|
Actor* player = gBattleStatus.playerActor;
|
|
|
|
Actor* partner = gBattleStatus.partnerActor;
|
|
|
|
Evt* script;
|
|
|
|
Actor* enemy;
|
2023-01-11 09:38:04 +01:00
|
|
|
s32 enemyNotDone;
|
2022-08-17 03:15:54 +02:00
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_FIRST_STRIKE_INIT:
|
2022-08-17 03:15:54 +02:00
|
|
|
D_8029F254 = 0;
|
|
|
|
btl_merlee_on_first_strike();
|
|
|
|
if (playerData->playerFirstStrikes < 9999) {
|
|
|
|
playerData->playerFirstStrikes++;
|
|
|
|
}
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags = RUSH_FLAG_NONE;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_HAS_RUSH;
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (!(gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE)) {
|
2022-08-17 03:15:54 +02:00
|
|
|
if (playerData->curHP < 2 && is_ability_active(ABILITY_MEGA_RUSH)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_HAS_RUSH;
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags |= RUSH_FLAG_MEGA;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
if (playerData->curHP < 6 && is_ability_active(ABILITY_POWER_RUSH) &&
|
|
|
|
!(battleStatus->rushFlags & RUSH_FLAG_MEGA))
|
|
|
|
{
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_HAS_RUSH;
|
2022-11-01 08:41:14 +01:00
|
|
|
battleStatus->rushFlags |= RUSH_FLAG_POWER;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
// setup dummy 'menu selection' for player move
|
2022-08-17 03:15:54 +02:00
|
|
|
switch (encounterStatus->hitType) {
|
2022-11-01 13:27:10 +01:00
|
|
|
case ENCOUNTER_TRIGGER_JUMP:
|
2023-01-11 09:38:04 +01:00
|
|
|
battleStatus->moveCategory = BTL_MENU_TYPE_JUMP;
|
2022-08-17 03:15:54 +02:00
|
|
|
battleStatus->selectedMoveID = MOVE_UNUSED_JUMP4;
|
|
|
|
battleStatus->selectedItemID = encounterStatus->hitTier;
|
|
|
|
battleStatus->currentTargetListFlags = gMoveTable[MOVE_UNUSED_JUMP4].flags;
|
|
|
|
break;
|
2022-11-01 13:27:10 +01:00
|
|
|
case ENCOUNTER_TRIGGER_HAMMER:
|
2023-01-11 09:38:04 +01:00
|
|
|
battleStatus->moveCategory = BTL_MENU_TYPE_SMASH;
|
2022-08-17 03:15:54 +02:00
|
|
|
battleStatus->selectedMoveID = MOVE_UNUSED_HAMMER4;
|
|
|
|
battleStatus->selectedItemID = encounterStatus->hitTier;
|
|
|
|
battleStatus->currentTargetListFlags = gMoveTable[MOVE_UNUSED_HAMMER4].flags;
|
|
|
|
break;
|
2022-11-01 13:27:10 +01:00
|
|
|
case ENCOUNTER_TRIGGER_PARTNER:
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_set_state(BATTLE_STATE_PARTNER_FIRST_STRIKE);
|
2022-08-17 03:15:54 +02:00
|
|
|
return;
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
// let the enemy know a first strike is coming
|
2022-08-17 03:15:54 +02:00
|
|
|
enemy = get_actor(ACTOR_ENEMY0);
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy->handleEventSource != NULL) {
|
2022-08-17 03:15:54 +02:00
|
|
|
enemy->lastEventType = EVENT_BEGIN_FIRST_STRIKE;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(enemy->handleEventSource, EVT_PRIORITY_A, EVT_FLAG_RUN_IMMEDIATELY);
|
|
|
|
enemy->handleEventScript = script;
|
|
|
|
enemy->handleEventScriptID = script->id;
|
2022-08-17 03:15:54 +02:00
|
|
|
script->owner1.actorID = enemy->actorID;
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_FIRST_STRIKE_AWAIT_ENEMY_READY;
|
2022-08-17 03:15:54 +02:00
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_FIRST_STRIKE_AWAIT_ENEMY_READY:
|
2022-08-17 03:15:54 +02:00
|
|
|
enemy = get_actor(ACTOR_ENEMY0);
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy->handleEventSource != NULL) {
|
|
|
|
if (does_script_exist(enemy->handleEventScriptID)) {
|
2022-08-17 03:15:54 +02:00
|
|
|
break;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
enemy->handleEventScript = NULL;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func_80263230(player, enemy);
|
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
battleStatus->lastAttackDamage = 0;
|
|
|
|
battleStatus->unk_19A = 0;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_1000000;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_80000;
|
|
|
|
increment_status_menu_disabled();
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_10);
|
|
|
|
btl_cam_target_actor(0);
|
|
|
|
reset_actor_turn_info();
|
2023-01-11 09:38:04 +01:00
|
|
|
// begin the partner turn script
|
2022-08-17 03:15:54 +02:00
|
|
|
battleStatus->battlePhase = PHASE_FIRST_STRIKE;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
|
2022-08-17 03:15:54 +02:00
|
|
|
player->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScriptID = script->id;
|
2022-08-17 03:15:54 +02:00
|
|
|
script->owner1.actorID = ACTOR_PLAYER;
|
2023-01-11 09:38:04 +01:00
|
|
|
D_8029F248 = 3;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_FIRST_STRIKE_AWAIT_SCRIPTS;
|
2022-08-17 03:15:54 +02:00
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_FIRST_STRIKE_AWAIT_SCRIPTS:
|
2022-08-17 03:15:54 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
|
|
|
D_8029F254 = 1;
|
|
|
|
}
|
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
// wait for player move script
|
2022-08-17 03:15:54 +02:00
|
|
|
if (!(gBattleStatus.flags1 & BS_FLAGS1_200000)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (player->takeTurnScript != NULL && does_script_exist(player->takeTurnScriptID)) {
|
2022-08-17 03:15:54 +02:00
|
|
|
break;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
player->takeTurnScript = NULL;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_100;
|
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
// wait for player handle event script
|
|
|
|
if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
player->handleEventScript = NULL;
|
|
|
|
|
|
|
|
// wait for partner handle event script
|
|
|
|
if (partner != NULL) {
|
|
|
|
if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
|
2023-01-10 07:33:09 +01:00
|
|
|
break;
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
partner->handleEventScript = NULL;
|
|
|
|
}
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
// wait for all enemy turn scripts
|
|
|
|
enemyNotDone = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL && enemy->takeTurnScript != NULL) {
|
|
|
|
if (does_script_exist(enemy->takeTurnScriptID)) {
|
|
|
|
enemyNotDone = TRUE;
|
|
|
|
} else {
|
|
|
|
enemy->takeTurnScript = NULL;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
}
|
|
|
|
if (enemyNotDone) {
|
|
|
|
break;
|
|
|
|
}
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
// wait for all enemy handle event scripts
|
|
|
|
enemyNotDone = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL && enemy->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(enemy->handleEventScriptID)) {
|
|
|
|
enemyNotDone = TRUE;
|
|
|
|
} else {
|
|
|
|
enemy->handleEventScript = NULL;
|
2023-01-10 07:33:09 +01:00
|
|
|
}
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
}
|
|
|
|
if (enemyNotDone) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
|
|
|
if (enemy != NULL) {
|
|
|
|
enemy->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
decrement_status_menu_disabled();
|
|
|
|
if (!(gGameStatusPtr->demoFlags & 1)) {
|
|
|
|
Actor* target;
|
2023-01-10 07:33:09 +01:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
if (btl_check_player_defeated() || btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2022-08-17 03:15:54 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
target = get_actor(player->targetActorID);
|
|
|
|
if (target != NULL) {
|
|
|
|
if (target->handleEventSource != NULL) {
|
|
|
|
target->lastEventType = EVENT_END_FIRST_STRIKE;
|
|
|
|
script = start_script(target->handleEventSource, EVT_PRIORITY_A, EVT_FLAG_RUN_IMMEDIATELY);
|
|
|
|
target->handleEventScript = script;
|
|
|
|
target->handleEventScriptID = script->id;
|
|
|
|
script->owner1.actorID = target->actorID;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_FIRST_STRIKE_AWAIT_ENEMY_DONE;
|
|
|
|
} else {
|
|
|
|
btl_set_state(BATTLE_STATE_END_DEMO_BATTLE);
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_FIRST_STRIKE_AWAIT_ENEMY_DONE:
|
|
|
|
enemyNotDone = FALSE;
|
2022-08-17 03:15:54 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
enemy = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (enemy != NULL && enemy->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(enemy->handleEventScriptID)) {
|
2023-01-11 09:38:04 +01:00
|
|
|
enemyNotDone = TRUE;
|
2022-08-17 03:15:54 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
enemy->handleEventScript = NULL;
|
2022-08-17 03:15:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
if (enemyNotDone) {
|
2023-01-10 07:33:09 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnScriptID)) {
|
2022-08-17 03:15:54 +02:00
|
|
|
player->takeTurnScript = NULL;
|
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_TURN);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-07-21 13:43:13 +02:00
|
|
|
void btl_state_draw_first_stike(void) {
|
|
|
|
if (D_802809F6 == -1 && D_8029F254 != 0) {
|
|
|
|
if (D_80280A30 == 0) {
|
|
|
|
set_screen_overlay_params_front(255, -1.0f);
|
|
|
|
} else {
|
|
|
|
if (!(gGameStatusPtr->demoFlags & 1)) {
|
|
|
|
D_80280A30 -= 20;
|
|
|
|
} else {
|
|
|
|
D_80280A30 -= 50;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (D_80280A30 < 0) {
|
|
|
|
D_80280A30 = 0;
|
|
|
|
}
|
|
|
|
set_screen_overlay_params_front(0, D_80280A30);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
void btl_state_update_partner_striking_first(void) {
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Actor* actor;
|
2023-01-11 09:38:04 +01:00
|
|
|
s32 enemyNotDone;
|
2022-05-27 15:03:19 +02:00
|
|
|
SelectableTarget* target;
|
|
|
|
Evt* script;
|
|
|
|
s32 level;
|
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_FIRST_STRIKE_INIT:
|
2022-05-27 15:03:19 +02:00
|
|
|
D_8029F254 = 0;
|
2023-01-11 09:38:04 +01:00
|
|
|
// setup dummy 'menu selection' for partner move
|
2022-05-27 15:03:19 +02:00
|
|
|
level = partner->actorBlueprint->level;
|
|
|
|
switch (playerData->currentPartner) {
|
|
|
|
case PARTNER_KOOPER:
|
2023-01-11 09:38:04 +01:00
|
|
|
battleStatus->moveCategory = BTL_MENU_TYPE_5;
|
2022-05-27 15:03:19 +02:00
|
|
|
battleStatus->selectedItemID = ITEM_NONE;
|
|
|
|
battleStatus->selectedMoveID = level + MOVE_SHELL_TOSS1;
|
|
|
|
battleStatus->currentTargetListFlags = gMoveTable[battleStatus->selectedMoveID].flags;
|
|
|
|
break;
|
|
|
|
case PARTNER_BOMBETTE:
|
2023-01-11 09:38:04 +01:00
|
|
|
battleStatus->moveCategory = BTL_MENU_TYPE_5;
|
2022-05-27 15:03:19 +02:00
|
|
|
battleStatus->selectedItemID = ITEM_NONE;
|
|
|
|
battleStatus->selectedMoveID = level + MOVE_BODY_SLAM1;
|
|
|
|
battleStatus->currentTargetListFlags = gMoveTable[battleStatus->selectedMoveID].flags;
|
|
|
|
break;
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
// let the enemy know a first strike is coming
|
2022-05-27 15:03:19 +02:00
|
|
|
actor = get_actor(ACTOR_ENEMY0);
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor->handleEventSource != NULL) {
|
2022-05-27 15:03:19 +02:00
|
|
|
actor->lastEventType = EVENT_BEGIN_FIRST_STRIKE;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(actor->handleEventSource, EVT_PRIORITY_A, EVT_FLAG_RUN_IMMEDIATELY);
|
|
|
|
actor->handleEventScript = script;
|
|
|
|
actor->handleEventScriptID = script->id;
|
2022-05-27 15:03:19 +02:00
|
|
|
script->owner1.actorID = actor->actorID;
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_ENEMY_READY;
|
2022-05-27 15:03:19 +02:00
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_ENEMY_READY:
|
2022-05-27 15:03:19 +02:00
|
|
|
player_create_target_list(partner);
|
|
|
|
target = &partner->targetData[partner->targetIndexList[0]];
|
|
|
|
partner->targetActorID = target->actorID;
|
|
|
|
partner->targetPartIndex = target->partID;
|
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
battleStatus->lastAttackDamage = 0;
|
|
|
|
battleStatus->unk_19A = 0;
|
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
|
|
|
|
gBattleStatus.flags2 |= BS_FLAGS2_1000000;
|
|
|
|
gBattleStatus.flags1 |= BS_FLAGS1_80000;
|
|
|
|
increment_status_menu_disabled();
|
|
|
|
btl_cam_use_preset(BTL_CAM_PRESET_10);
|
|
|
|
btl_cam_target_actor(ACTOR_PARTNER);
|
|
|
|
reset_actor_turn_info();
|
2023-01-11 09:38:04 +01:00
|
|
|
// begin the partner turn script
|
2022-05-27 15:03:19 +02:00
|
|
|
battleStatus->battlePhase = PHASE_FIRST_STRIKE;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(partner->takeTurnSource, EVT_PRIORITY_A, 0);
|
2022-05-27 15:03:19 +02:00
|
|
|
partner->takeTurnScript = script;
|
2023-01-10 07:33:09 +01:00
|
|
|
partner->takeTurnScriptID = script->id;
|
2022-05-27 15:03:19 +02:00
|
|
|
script->owner1.actorID = ACTOR_PARTNER;
|
2023-01-11 09:38:04 +01:00
|
|
|
D_8029F248 = 3;
|
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_SCRIPTS;
|
2022-05-27 15:03:19 +02:00
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_SCRIPTS:
|
2022-05-27 15:03:19 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
|
|
|
D_8029F254 = 1;
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
// wait for partner move script
|
|
|
|
if (partner->takeTurnScript != NULL && does_script_exist(partner->takeTurnScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
partner->takeTurnScript = NULL;
|
|
|
|
// wait for partner handle event script
|
|
|
|
if (partner->handleEventScript != NULL && does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
partner->handleEventScript = NULL;
|
|
|
|
// wait for player handle event script
|
|
|
|
if (player->handleEventScript != NULL && does_script_exist(player->handleEventScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
player->handleEventScript = NULL;
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
// wait for all enemy turn scripts
|
|
|
|
enemyNotDone = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL && actor->takeTurnScript != NULL) {
|
|
|
|
if (does_script_exist(actor->takeTurnScriptID)) {
|
|
|
|
enemyNotDone = TRUE;
|
|
|
|
} else {
|
|
|
|
actor->takeTurnScript = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (enemyNotDone) {
|
|
|
|
break;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
// wait for all enemy handle event scripts
|
|
|
|
enemyNotDone = FALSE;
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL && actor->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(actor->handleEventScriptID)) {
|
|
|
|
enemyNotDone = TRUE;
|
|
|
|
} else {
|
|
|
|
actor->handleEventScript = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (enemyNotDone) {
|
|
|
|
break;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
actor->flags &= ~ACTOR_FLAG_80000;
|
|
|
|
}
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
decrement_status_menu_disabled();
|
|
|
|
if (btl_check_player_defeated() || btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
|
2023-01-11 09:38:04 +01:00
|
|
|
actor = get_actor(partner->targetActorID);
|
|
|
|
if (actor != NULL) {
|
|
|
|
if (actor->handleEventSource != NULL) {
|
|
|
|
actor->lastEventType = EVENT_END_FIRST_STRIKE;
|
|
|
|
script = start_script(actor->handleEventSource, EVT_PRIORITY_A, EVT_FLAG_RUN_IMMEDIATELY);
|
|
|
|
actor->handleEventScript = script;
|
|
|
|
actor->handleEventScriptID = script->id;
|
|
|
|
script->owner1.actorID = actor->actorID;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_ENEMY_DONE;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_PARTNER_FIRST_STRIKE_AWAIT_ENEMY_DONE:
|
|
|
|
enemyNotDone = FALSE;
|
2022-05-27 15:03:19 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(actor->handleEventScriptID)) {
|
2023-01-11 09:38:04 +01:00
|
|
|
enemyNotDone = TRUE;
|
2022-05-27 15:03:19 +02:00
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->handleEventScript = NULL;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
if (!enemyNotDone) {
|
2022-05-27 15:03:19 +02:00
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_TURN);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_partner_striking_first(void) {
|
2021-03-19 19:17:02 +01:00
|
|
|
if (D_8029F254 != 0) {
|
2021-04-23 13:55:30 +02:00
|
|
|
if (D_80280A30 == 0) {
|
2021-06-30 04:27:12 +02:00
|
|
|
set_screen_overlay_params_front(255, -1.0f);
|
2021-03-19 19:17:02 +01:00
|
|
|
} else {
|
2021-04-23 13:55:30 +02:00
|
|
|
D_80280A30 -= 20;
|
|
|
|
if (D_80280A30 < 0) {
|
|
|
|
D_80280A30 = 0;
|
2021-03-19 19:17:02 +01:00
|
|
|
}
|
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
set_screen_overlay_params_front(0, D_80280A30);
|
2021-03-19 19:17:02 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
void btl_state_update_enemy_striking_first(void) {
|
|
|
|
PlayerData* playerData = &gPlayerData;
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Actor* player = battleStatus->playerActor;
|
|
|
|
Actor* partner = battleStatus->partnerActor;
|
|
|
|
Evt* script;
|
2022-09-08 14:21:07 +02:00
|
|
|
Actor* actor;
|
|
|
|
u16* enemyIDs;
|
|
|
|
s16 activeEnemyActorID;
|
|
|
|
s32 nextEnemyIdx;
|
|
|
|
s32 count;
|
|
|
|
s32 flags;
|
2022-05-27 15:03:19 +02:00
|
|
|
s32 cond;
|
|
|
|
s32 i;
|
|
|
|
s32 j;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_FIRST_STRIKE_INIT:
|
2022-05-27 15:03:19 +02:00
|
|
|
battleStatus->unk_8C = 0;
|
|
|
|
battleStatus->lastAttackDamage = 0;
|
|
|
|
battleStatus->unk_19A = 0;
|
|
|
|
playerData->enemyFirstStrikes++;
|
2022-10-10 13:26:32 +02:00
|
|
|
battleStatus->flags1 &= ~BS_FLAGS1_2;
|
2022-05-27 15:03:19 +02:00
|
|
|
D_8029F254 = 0;
|
|
|
|
player->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
if (partner != NULL) {
|
|
|
|
partner->flags &= ~ACTOR_FLAG_8000000;
|
|
|
|
}
|
2023-01-11 09:38:04 +01:00
|
|
|
battleStatus->flags2 |= BS_FLAGS2_1000000;
|
|
|
|
battleStatus->flags2 |= BS_FLAGS2_4000;
|
2022-05-27 15:03:19 +02:00
|
|
|
count = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
battleStatus->enemyIDs[count] = i | ACTOR_ENEMY0;
|
2022-05-27 15:03:19 +02:00
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
battleStatus->numEnemyActors = count;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
enemyIDs = battleStatus->enemyIDs;
|
|
|
|
for (i = 0; i < count - 1; i++) {
|
|
|
|
for (j = i + 1; j < count; j++) {
|
|
|
|
s32 iVal = enemyIDs[i];
|
|
|
|
s32 jVal = enemyIDs[j];
|
|
|
|
|
|
|
|
if (battleStatus->enemyActors[iVal & 0xFF]->turnPriority <
|
|
|
|
battleStatus->enemyActors[jVal & 0xFF]->turnPriority)
|
|
|
|
{
|
|
|
|
enemyIDs[i] = jVal;
|
|
|
|
enemyIDs[j] = iVal;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
battleStatus->nextEnemyIndex = 0;
|
2022-09-08 14:21:07 +02:00
|
|
|
nextEnemyIdx = 0;
|
|
|
|
flags = ACTOR_FLAG_NO_ATTACK | ACTOR_FLAG_TARGET_ONLY;
|
|
|
|
|
|
|
|
while (TRUE) {
|
|
|
|
actor = battleStatus->enemyActors[battleStatus->enemyIDs[nextEnemyIdx] & 0xFF];
|
|
|
|
if (actor == NULL || (actor->flags & flags)) {
|
|
|
|
nextEnemyIdx++;
|
|
|
|
if (nextEnemyIdx >= battleStatus->numEnemyActors) {
|
|
|
|
nextEnemyIdx = 0;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
break;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
activeEnemyActorID = battleStatus->enemyIDs[nextEnemyIdx];
|
|
|
|
nextEnemyIdx++;
|
|
|
|
battleStatus->currentTurnEnemy = actor;
|
|
|
|
battleStatus->activeEnemyActorID = activeEnemyActorID;
|
2022-05-27 15:03:19 +02:00
|
|
|
if (nextEnemyIdx >= battleStatus->numEnemyActors) {
|
|
|
|
nextEnemyIdx = 0;
|
|
|
|
}
|
|
|
|
battleStatus->nextEnemyIndex = nextEnemyIdx;
|
|
|
|
btl_cam_target_actor(battleStatus->activeEnemyActorID);
|
2022-09-08 14:21:07 +02:00
|
|
|
actor = battleStatus->currentTurnEnemy;
|
2022-05-27 15:03:19 +02:00
|
|
|
reset_actor_turn_info();
|
2022-08-17 03:15:54 +02:00
|
|
|
battleStatus->battlePhase = PHASE_FIRST_STRIKE;
|
2023-01-10 07:33:09 +01:00
|
|
|
script = start_script(actor->takeTurnSource, EVT_PRIORITY_A, 0);
|
2022-09-08 14:21:07 +02:00
|
|
|
actor->takeTurnScript = script;
|
2022-05-27 15:03:19 +02:00
|
|
|
D_8029F248 = 3;
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->takeTurnScriptID = script->id;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_ENEMY_FIRST_STRIKE_AWAIT_SCRIPTS;
|
2022-08-17 03:15:54 +02:00
|
|
|
script->owner1.actorID = battleStatus->activeEnemyActorID;
|
2022-05-27 15:03:19 +02:00
|
|
|
break;
|
2023-01-11 09:38:04 +01:00
|
|
|
case BTL_SUBSTATE_ENEMY_FIRST_STRIKE_AWAIT_SCRIPTS:
|
2022-05-27 15:03:19 +02:00
|
|
|
if (D_8029F248 != 0) {
|
|
|
|
D_8029F248--;
|
|
|
|
} else {
|
|
|
|
D_8029F254 = 1;
|
|
|
|
}
|
|
|
|
|
2022-09-08 14:21:07 +02:00
|
|
|
actor = battleStatus->currentTurnEnemy;
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor->takeTurnScript == NULL || !does_script_exist(actor->takeTurnScriptID)) {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor->takeTurnScript = NULL;
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (player->handleEventScript == NULL || !does_script_exist(player->handleEventScriptID)) {
|
|
|
|
player->handleEventScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
if (partner != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (partner->handleEventScript == NULL || !does_script_exist(partner->handleEventScriptID)) {
|
|
|
|
partner->handleEventScript = NULL;
|
2022-09-08 14:21:07 +02:00
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
|
|
|
|
cond = FALSE;
|
|
|
|
|
2022-05-27 15:03:19 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL && actor->takeTurnScript != NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
if (does_script_exist(actor->takeTurnScriptID)) {
|
2022-05-27 15:03:19 +02:00
|
|
|
cond = TRUE;
|
|
|
|
} else {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor->takeTurnScript = NULL;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!cond) {
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor = battleStatus->enemyActors[i];
|
2023-01-10 07:33:09 +01:00
|
|
|
if (actor != NULL && actor->handleEventScript != NULL) {
|
|
|
|
if (does_script_exist(actor->handleEventScriptID)) {
|
2022-05-27 15:03:19 +02:00
|
|
|
cond = TRUE;
|
|
|
|
} else {
|
2023-01-10 07:33:09 +01:00
|
|
|
actor->handleEventScript = NULL;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!cond) {
|
2022-08-17 03:15:54 +02:00
|
|
|
gBattleStatus.flags2 &= ~BS_FLAGS2_4000;
|
2022-05-27 15:03:19 +02:00
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
2022-09-08 14:21:07 +02:00
|
|
|
actor = battleStatus->enemyActors[i];
|
|
|
|
if (actor != NULL) {
|
|
|
|
actor->flags &= ~ACTOR_FLAG_80000;
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (battleStatus->unk_8C == 0) {
|
|
|
|
if (btl_check_player_defeated() || btl_check_enemies_defeated()) {
|
|
|
|
return;
|
|
|
|
}
|
2022-09-08 14:21:07 +02:00
|
|
|
btl_set_state(BATTLE_STATE_BEGIN_TURN);
|
2022-05-27 15:03:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_enemy_striking_first(void) {
|
2021-03-19 19:17:02 +01:00
|
|
|
if (D_8029F254 != 0) {
|
2021-04-23 13:55:30 +02:00
|
|
|
if (D_80280A30 == 0) {
|
2021-06-30 04:27:12 +02:00
|
|
|
set_screen_overlay_params_front(255, -1.0f);
|
2021-03-19 19:17:02 +01:00
|
|
|
} else {
|
2021-04-23 13:55:30 +02:00
|
|
|
D_80280A30 -= 20;
|
|
|
|
if (D_80280A30 < 0) {
|
|
|
|
D_80280A30 = 0;
|
2021-03-19 19:17:02 +01:00
|
|
|
}
|
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
set_screen_overlay_params_front(0, D_80280A30);
|
2021-03-19 19:17:02 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2022-05-05 16:08:16 +02:00
|
|
|
void btl_state_update_end_demo_battle(void) {
|
|
|
|
BattleStatus* battleStatus = &gBattleStatus;
|
|
|
|
Battle* blah = (*D_800DC4FC);
|
|
|
|
Stage* stage;
|
|
|
|
s32 i;
|
|
|
|
|
2022-11-16 10:46:50 +01:00
|
|
|
switch (gBattleSubState) {
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_DEMO_BATTLE_UNK_0:
|
2022-05-05 16:08:16 +02:00
|
|
|
D_80280A30 = 0;
|
|
|
|
if (D_802809F6 == -1) {
|
|
|
|
if (D_802809F8 != 0) {
|
|
|
|
D_802809F8--;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_DEMO_BATTLE_UNK_1;
|
2022-05-05 16:08:16 +02:00
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_DEMO_BATTLE_UNK_1:
|
2022-05-05 16:08:16 +02:00
|
|
|
switch (D_802809F6) {
|
|
|
|
case 255:
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_DEMO_BATTLE_UNK_2;
|
2022-05-05 16:08:16 +02:00
|
|
|
return;
|
|
|
|
case -1:
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_80280A30 == 255) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_DEMO_BATTLE_UNK_2;
|
2022-05-05 16:08:16 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
D_80280A30 += 50;
|
2022-09-08 14:21:07 +02:00
|
|
|
if (D_80280A30 > 255) {
|
|
|
|
D_80280A30 = 255;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_DEMO_BATTLE_UNK_2:
|
|
|
|
D_80280A30 = 255;
|
2023-01-11 09:38:04 +01:00
|
|
|
gBattleStatus.flags1 &= ~BS_FLAGS1_ACTORS_VISIBLE;
|
2022-05-05 16:08:16 +02:00
|
|
|
if (D_800DC064 == NULL) {
|
|
|
|
stage = blah->stage;
|
|
|
|
} else {
|
2022-10-16 16:22:18 +02:00
|
|
|
stage = D_800DC064->stage;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (stage->postBattle == NULL) {
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_DEMO_BATTLE_UNK_4;
|
2022-05-05 16:08:16 +02:00
|
|
|
} else {
|
2022-08-06 14:14:04 +02:00
|
|
|
battleStatus->controlScript = start_script(stage->postBattle, EVT_PRIORITY_A, 0);
|
2022-05-05 16:08:16 +02:00
|
|
|
battleStatus->controlScriptID = battleStatus->controlScript->id;
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_DEMO_BATTLE_UNK_3;
|
2022-05-05 16:08:16 +02:00
|
|
|
}
|
|
|
|
break;
|
2023-01-10 07:33:09 +01:00
|
|
|
case BTL_SUBSTATE_END_DEMO_BATTLE_UNK_3:
|
2022-05-05 16:08:16 +02:00
|
|
|
if (does_script_exist(battleStatus->controlScriptID)) {
|
|
|
|
break;
|
|
|
|
}
|
2023-01-10 07:33:09 +01:00
|
|
|
gBattleSubState = BTL_SUBSTATE_END_DEMO_BATTLE_UNK_4;
|
|
|
|
//fallthrough
|
|
|
|
case BTL_SUBSTATE_END_DEMO_BATTLE_UNK_4:
|
2022-05-05 16:08:16 +02:00
|
|
|
kill_all_scripts();
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
|
|
|
|
Actor* enemy = battleStatus->enemyActors[i];
|
|
|
|
|
|
|
|
if (enemy != NULL) {
|
|
|
|
btl_delete_actor(enemy);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (battleStatus->partnerActor != NULL) {
|
|
|
|
btl_delete_actor(battleStatus->partnerActor);
|
|
|
|
}
|
|
|
|
|
|
|
|
btl_delete_player_actor(battleStatus->playerActor);
|
|
|
|
remove_all_effects();
|
|
|
|
set_windows_visible(WINDOW_GROUP_ALL);
|
|
|
|
|
2023-01-10 07:33:09 +01:00
|
|
|
if (gBattleStatus.flags2 & BS_FLAGS2_PEACH_BATTLE) {
|
2022-05-05 16:08:16 +02:00
|
|
|
decrement_status_menu_disabled();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (D_802809F6 != -1) {
|
|
|
|
gGameStatusPtr->nextDemoScene = 0x12;
|
|
|
|
}
|
|
|
|
|
|
|
|
btl_set_state(BATTLE_STATE_0);
|
|
|
|
D_800DC4D0 = gBattleState;
|
|
|
|
set_game_mode(GAME_MODE_END_BATTLE);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const static f32 padding[] = { 0.0f, 0.0f, 0.0f };
|
2020-10-15 05:49:49 +02:00
|
|
|
|
2021-06-30 04:27:12 +02:00
|
|
|
void btl_state_draw_end_demo_battle(void) {
|
2021-03-19 19:17:02 +01:00
|
|
|
if (D_802809F6 == -1) {
|
2021-06-30 04:27:12 +02:00
|
|
|
set_screen_overlay_color(0, 0, 0, 0);
|
|
|
|
set_screen_overlay_params_front(0, D_80280A30);
|
2021-03-19 19:17:02 +01:00
|
|
|
}
|
|
|
|
}
|