papermario/src/16F740.c
Ethan Roseman 021592d219
Misc decomp 70 (#716)
* aura_appendGfx

* 3 more action commands

* fire_shell

* hammer, hurricane

* spiny_surge

* data stuff, cleanup, whirlwind

* warnings

* water_block data and func

* water_block

* effect stuff cleanup

* big_snowflakes effect

* data cleanup, fpr abi regs

* 2 battle item funcs + data

* 2 mo

* shooting_star func

* 3 16F740 funcs

* btl_state_update_end_battle

* map funcs

* more dedupe

* cleanin

* draw_entity_model_C/D

* effect butterflies, btl state funcs

* it is done

* it is done

* PR comments, some cleanup
2022-05-27 22:03:19 +09:00

2510 lines
92 KiB
C

#include "common.h"
#include "script_api/battle.h"
#include "ld_addrs.h"
#include "effects.h"
#include "hud_element.h"
#include "battle/battle.h"
extern s32* D_800DC064;
extern s16 D_802809F6;
extern s16 D_802809F8;
extern s32 D_80280A30;
extern u8 D_8029F244;
extern s32 D_8029F248;
extern s32 D_8029F24C;
extern s32 D_8029F250;
extern s32 D_8029F254;
extern s32 D_8029F258;
extern s32 D_8029F25C;
extern s32 D_8029F260;
extern s32 D_8029F264;
void btl_merlee_on_start_turn(void) {
BattleStatus* battleStatus = &gBattleStatus;
EncounterStatus* currentEncounter = &gCurrentEncounter;
PlayerData* playerData = &gPlayerData;
do {
if (!(gBattleStatus.flags2 & BS_FLAGS2_40) &&
battleStatus->nextMerleeSpellType != 3 &&
battleStatus->nextMerleeSpellType != 4 &&
playerData->merleeCastsLeft > 0)
{
if (playerData->merleeTurnCount <= 0) {
s32 temp = rand_int(100);
if (currentEncounter->currentEnemy != NULL) {
if (currentEncounter->currentEnemy->flags & ENEMY_FLAGS_40000) {
if (temp <= 45) {
playerData->merleeSpellType = 1;
} else if (temp <= 90) {
playerData->merleeSpellType = 2;
} else {
playerData->merleeSpellType = 3;
}
} else if (temp <= 30) {
playerData->merleeSpellType = 1;
} else if (temp <= 60) {
playerData->merleeSpellType = 2;
} else if (temp <= 80) {
playerData->merleeSpellType = 3;
} else {
playerData->merleeSpellType = 4;
}
} else if (temp <= 30) {
playerData->merleeSpellType = 1;
} else if (temp <= 60) {
playerData->merleeSpellType = 2;
} else if (temp <= 80) {
playerData->merleeSpellType = 3;
} else {
playerData->merleeSpellType = 4;
}
temp = rand_int(10) + 6;
playerData->merleeTurnCount = temp;
}
if (playerData->merleeTurnCount >= 2) {
playerData->merleeTurnCount--;
} else {
playerData->merleeTurnCount = 0;
battleStatus->nextMerleeSpellType = playerData->merleeSpellType;
playerData->merleeCastsLeft--;
}
}
} while (0); // TODO: required to match
}
void btl_merlee_on_first_strike(void) {
BattleStatus* battleStatus = &gBattleStatus;
EncounterStatus* currentEncounter = &gCurrentEncounter;
PlayerData* playerData = &gPlayerData;
do {
if (!(gBattleStatus.flags2 & BS_FLAGS2_40) &&
battleStatus->nextMerleeSpellType != 3 &&
battleStatus->nextMerleeSpellType != 4 &&
playerData->merleeCastsLeft > 0)
{
if (playerData->merleeTurnCount <= 0) {
s32 temp = rand_int(100);
if (currentEncounter->currentEnemy != NULL) {
if (currentEncounter->currentEnemy->flags & ENEMY_FLAGS_40000) {
if (temp <= 45) {
playerData->merleeSpellType = 1;
} else if (temp <= 90) {
playerData->merleeSpellType = 2;
} else {
playerData->merleeSpellType = 3;
}
} else if (temp <= 30) {
playerData->merleeSpellType = 1;
} else if (temp <= 60) {
playerData->merleeSpellType = 2;
} else if (temp <= 80) {
playerData->merleeSpellType = 3;
} else {
playerData->merleeSpellType = 4;
}
} else if (temp <= 30) {
playerData->merleeSpellType = 1;
} else if (temp <= 60) {
playerData->merleeSpellType = 2;
} else if (temp <= 80) {
playerData->merleeSpellType = 3;
} else {
playerData->merleeSpellType = 4;
}
if (playerData->merleeSpellType != 4) {
// 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;
}
if (playerData->merleeSpellType == 3 || playerData->merleeSpellType == 4) {
if (playerData->merleeTurnCount >= 2) {
playerData->merleeTurnCount--;
} else {
battleStatus->nextMerleeSpellType = playerData->merleeSpellType;
playerData->merleeTurnCount = 0;
playerData->merleeCastsLeft--;
}
}
}
} while (0); // TODO: required to match
}
void btl_set_state(s32 battleState) {
s32 flags = gBattleStatus.flags2;
gBattleState = battleState;
D_800DC4E0 = 1;
gBattleState2 = BATTLE_STATE2_UNK_0;
flags &= BS_FLAGS2_40;
if (flags) {
switch (battleState) {
case BATTLE_STATE_PARTNER_MENU:
battleState = BATTLE_STATE_TWINK_MENU;
break;
case BATTLE_STATE_PLAYER_MENU:
battleState = BATTLE_STATE_PEACH_MENU;
break;
case BATTLE_STATE_BEGIN_PLAYER_TURN:
battleState = BATTLE_STATE_BEGIN_PARTNER_TURN;
break;
case BATTLE_STATE_BEGIN_PARTNER_TURN:
battleState = BATTLE_STATE_BEGIN_PLAYER_TURN;
break;
}
gBattleState = battleState;
}
}
INCLUDE_ASM(s32, "16F740", btl_state_update_normal_start);
void btl_state_draw_normal_start(void) {
set_screen_overlay_color(0, 0, 0, 0);
if (D_80280A30 > 255) {
set_screen_overlay_params_front(0, 255.0f);
} else {
set_screen_overlay_params_front(0, D_80280A30);
}
}
INCLUDE_ASM(s32, "16F740", btl_state_update_begin_turn);
void btl_state_draw_begin_turn(void) {
}
// tail merging
#ifdef NON_MATCHING
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;
s32 phi_v0;
s32 phi_v1;
s32 phi_a0;
s32 phi_v0_2;
if (gBattleState2 == BATTLE_STATE2_UNK_0) {
btl_cam_use_preset(BTL_CAM_PRESET_C);
btl_cam_move(5);
gBattleState2 = BATTLE_STATE2_UNK_64;
}
if (gBattleState2 != BATTLE_STATE2_UNK_14) {
if (gBattleState2 == BATTLE_STATE2_UNK_64 && btl_cam_is_moving_done()) {
gBattleStatus.flags1 &= ~0x80000;
reset_actor_turn_info();
battleStatus->unk_86 = 0x7F;
battleStatus->blockResult = 0x7F;
battleStatus->selectedMoveID = 0;
gBattleStatus.flags1 |= 8;
gBattleStatus.flags2 &= ~0x1000000;
player->unk_21D = 0;
player->flags |= 0x0C000000;
if (partner != NULL) {
player->flags |= 0x0C000000;
partner->unk_21D = 0;
}
battleStatus->unk_8C = 0;
D_8029F254 = 0;
D_8029F258 = 0;
if (battleStatus->outtaSightActive == 0) {
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
} else {
battleStatus->battlePhase = 0xC;
script = start_script(partner->onTurnChanceScriptSource, 0xA, 0);
partner->onTurnChangeScript = script;
gBattleState2 = BATTLE_STATE2_UNK_14;
partner->onTurnChangeID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
}
}
} else if (!does_script_exist(partner->onTurnChangeID)) {
battleStatus->outtaSightActive = 0;
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
gBattleStatus.flags2 |= 4;
}
if (gBattleState2 != BATTLE_STATE2_UNK_2) {
if (gBattleState2 == BATTLE_STATE2_PLAYER_DEFEATED && (battleStatus->unk_8C == 0)) {
if (battleStatus->waterBlockTurnsLeft != 0) {
battleStatus->waterBlockTurnsLeft--;
battleStatus->unk_43C->unk_0C->unk_10 = battleStatus->waterBlockTurnsLeft;
if (battleStatus->waterBlockTurnsLeft <= 0) {
battleStatus->waterBlockEffect->flags |= 0x10;
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, 0x18);
fx_water_splash(0, player->currentPos.x - 15.0f, player->currentPos.y + 32.0f, player->currentPos.z + 5.0f, 1.0f, 0x18);
fx_water_splash(1, player->currentPos.x + 15.0f, player->currentPos.y + 22.0f, player->currentPos.z + 5.0f, 1.0f, 0x18);
battleStatus->waterBlockEffect = NULL;
sfx_play_sound(0x299);
btl_show_battle_message(0x27, 0x3C);
gBattleState2 = BATTLE_STATE2_UNK_2;
} else {
gBattleState2 = BATTLE_STATE2_UNK_B;
}
} else {
gBattleState2 = BATTLE_STATE2_UNK_B;
}
}
} else if (!btl_is_popup_displayed()) {
gBattleState2 = BATTLE_STATE2_UNK_B;
}
switch (gBattleState2) {
case BATTLE_STATE2_UNK_B:
if (battleStatus->cloudNineTurnsLeft != 0) {
battleStatus->cloudNineTurnsLeft--;
battleStatus->unk_43C->unk_0C->unk_1A = battleStatus->cloudNineTurnsLeft;
if (battleStatus->cloudNineTurnsLeft <= 0) {
remove_effect(battleStatus->cloudNineEffect);
battleStatus->cloudNineEffect = NULL;
btl_show_battle_message(0x29, 0x3C);
gBattleState2 = BATTLE_STATE2_UNK_C;
} else {
gBattleState2 = BATTLE_STATE2_UNK_F;
}
} else {
gBattleState2 = BATTLE_STATE2_UNK_F;
}
break;
case BATTLE_STATE2_UNK_C:
if (!btl_is_popup_displayed()) {
gBattleState2 = BATTLE_STATE2_UNK_F;
}
break;
}
switch (gBattleState2) {
case BATTLE_STATE2_UNK_F:
if (battleStatus->turboChargeTurnsLeft != 0) {
if (gBattleStatus.flags2 & 0x100) {
gBattleStatus.flags2 &= ~0x100;
gBattleState2 = BATTLE_STATE2_UNK_15;
} else {
battleStatus->turboChargeTurnsLeft--;
battleStatus->unk_43C->unk_0C->unk_24 = battleStatus->turboChargeTurnsLeft;
if (battleStatus->turboChargeTurnsLeft <= 0) {
btl_show_battle_message(0x2B, 0x3C);
gBattleState2 = BATTLE_STATE2_UNK_10;
} else {
gBattleState2 = BATTLE_STATE2_UNK_15;
}
}
} else {
gBattleState2 = BATTLE_STATE2_UNK_15;
}
break;
case BATTLE_STATE2_UNK_10:
if (!btl_is_popup_displayed()) {
gBattleState2 = BATTLE_STATE2_UNK_15;
}
break;
}
if (gBattleState2 == BATTLE_STATE2_UNK_15) {
if ((player->debuff == 9) && (player->stoneStatus == 0)) {
gBattleStatus.flags1 |= 0x20;
dispatch_damage_event_player_0(1, 0xA);
}
battleStatus->rushFlags = 0;
gBattleStatus.flags2 &= ~0x8000000;
if (!(gBattleStatus.flags2 & 0x40)) {
if (playerData->curHP <= 1 && is_ability_active(0x14)) {
gBattleStatus.flags2 |= 0x08000000;
battleStatus->rushFlags |= 1;
}
if (playerData->curHP < 6 && is_ability_active(0x1E) && !(battleStatus->rushFlags & 1)) {
gBattleStatus.flags2 |= 0x08000000;
battleStatus->rushFlags |= 2;
}
}
gBattleState2 = BATTLE_STATE2_UNK_16;
}
if ((gBattleState2 == BATTLE_STATE2_UNK_16) && (player->onHitScript == NULL || !does_script_exist(player->onHitID))) {
player->onHitScript = NULL;
if (!btl_check_player_defeated()) {
D_8029F254 = 0;
player->unk_21D = 0;
player->flags |= 0x0C000000;
if (is_ability_active(0xE)) {
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;
}
if (player->transStatus != 0) {
player->transDuration = 1;
}
}
if (player->stoneStatus != 0) {
player->stoneDuration--;
if (player->stoneDuration <= 0) {
player->stoneStatus = 0;
dispatch_event_player(0x31);
}
} else {
s32 debuffDuration;
s32 koDuration;
if (!is_ability_active(0x13) && (player->staticStatus != 0)) {
player->staticDuration--;
if (player->staticDuration <= 0) {
player->staticStatus = 0;
remove_status_static(player->hudElementDataIndex);
}
}
if (player->transStatus != 0) {
player->transDuration--;
part->flags |= 0x100;
if (player->transDuration <= 0) {
player->transStatus = 0;
part->flags &= ~0x100;
remove_status_transparent(player->hudElementDataIndex);
}
}
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) {
sfx_play_sound(0xE7);
player->icePillarEffect->flags |= 0x10;
player->icePillarEffect = NULL;
dispatch_event_player(0x32);
} else {
dispatch_event_player(0x31);
}
player->debuff = 0;
player->debuffDuration = 0;
remove_status_debuff(player->hudElementDataIndex);
}
}
debuffDuration = (u8) player->debuffDuration;
koDuration = player->koDuration;
player->koDuration = debuffDuration;
if ((s8) debuffDuration > 0) {
player->koStatus = 0xD;
((DisableXFXData*)player->debuffEffect->data)->unk_3C = player->koDuration;
} else if (koDuration != (s8) debuffDuration) {
player->koStatus = 0;
player->koDuration = 0;
((DisableXFXData*)player->debuffEffect->data)->unk_3C = 0;
}
}
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
Actor* enemy = battleStatus->enemyActors[i];
if (enemy != NULL) {
enemy->flags |= 0x0C000000;
if (enemy->chillOutTurns != 0) {
enemy->chillOutTurns--;
if (enemy->chillOutTurns == 0) {
enemy->chillOutAmount = 0;
remove_status_chill_out(enemy->hudElementDataIndex);
D_8029F258 = 20;
}
}
}
}
gBattleState2 = BATTLE_STATE2_UNK_1;
} else {
return;
}
}
if (gBattleState2 == BATTLE_STATE2_UNK_1) {
s32 phi_s0_2 = 1;
s32 phi_s0_3;
if (!btl_check_enemies_defeated()) {
battleStatus->unk_8C = 0;
if (battleStatus->hammerLossTurns >= 0) {
battleStatus->hammerLossTurns--;
if (battleStatus->hammerLossTurns == -1) {
script = start_script(RegainAbility, 0xA, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->varTable[0] = 1;
phi_s0_2 = 9;
script->owner1.actorID = ACTOR_PLAYER;
script->varTable[10] = 1;
battleStatus->unk_8C = 1;
}
}
phi_s0_3 = phi_s0_2;
if (battleStatus->jumpLossTurns >= 0) {
battleStatus->jumpLossTurns--;
if (battleStatus->jumpLossTurns == -1) {
script = start_script(RegainAbility, 0xA, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->varTable[0] = phi_s0_3;
script->owner1.actorID = ACTOR_PLAYER;
script->varTable[10] = 0;
battleStatus->unk_8C = 1;
phi_s0_3 += 8;
}
}
if (battleStatus->itemLossTurns >= 0) {
battleStatus->itemLossTurns--;
if (battleStatus->itemLossTurns == -1) {
script = start_script(RegainAbility, 0xA, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->varTable[10] = 2;
script->owner1.actorID = ACTOR_PLAYER;
script->varTable[0] = phi_s0_3;
battleStatus->unk_8C = 1;
}
}
gBattleState2 = BATTLE_STATE2_UNK_1E;
}
} else {
return;
}
if (gBattleState2 == BATTLE_STATE2_UNK_1E && (player->onHitScript == NULL || !does_script_exist(player->onHitID))) {
player->onHitScript = NULL;
if (!btl_check_player_defeated() && !btl_check_enemies_defeated()) {
if (D_8029F258 != 0) {
D_8029F258--;
return;
}
if (D_8029F254 == 0) {
btl_set_state(BATTLE_STATE_SWITCH_TO_PLAYER);
} else{
btl_set_state(BATTLE_STATE_BEGIN_PARTNER_TURN);
gBattleStatus.flags2 |= 2;
}
}
}
}
#else
INCLUDE_ASM(s32, "16F740", btl_state_update_begin_player_turn);
#endif
void btl_state_draw_begin_player_turn(void) {
}
void btl_state_update_switch_to_player(void) {
Actor* player = gBattleStatus.playerActor;
Actor* partner = gBattleStatus.partnerActor;
s32 i;
if (gBattleState2 == BATTLE_STATE2_UNK_0) {
gBattleStatus.flags1 &= ~BS_FLAGS1_80000;
reset_actor_turn_info();
gBattleStatus.selectedMoveID = MOVE_NONE;
gBattleStatus.unk_86 = 0x7F;
gBattleStatus.blockResult = 0x7F;
gBattleStatus.flags1 |= BS_FLAGS1_8;
player->flags |= ACTOR_FLAG_8000000;
if (partner != NULL) {
partner->flags |= (ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
}
for (i = 0; i < ARRAY_COUNT(gBattleStatus.enemyActors); i++) {
Actor* enemy = gBattleStatus.enemyActors[i];
if (enemy != NULL) {
enemy->flags |= ENEMY_FLAGS_80000;
enemy->flags |= ENEMY_FLAGS_8000000;
}
}
btl_set_state(BATTLE_STATE_PREPARE_MENU);
}
}
void btl_state_draw_switch_to_player(void) {
}
void btl_state_update_begin_partner_turn(void) {
BattleStatus* battleStatus = &gBattleStatus;
Actor* partner = battleStatus->partnerActor;
Actor* enemy;
s32 i;
if (gBattleState2 == BATTLE_STATE2_UNK_0) {
if (partner == NULL) {
D_8029F254 = 1;
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
} else if ((battleStatus->flags2 & (BS_FLAGS2_4 | BS_FLAGS2_2)) != (BS_FLAGS2_4 | BS_FLAGS2_2)) {
if (!(partner->flags & ACTOR_FLAG_NO_ATTACK)) {
btl_cam_use_preset(2);
btl_cam_move(5);
gBattleState2 = BATTLE_STATE2_UNK_64;
} else {
btl_set_state(BATTLE_STATE_9);
return;
}
} else {
btl_set_state(BATTLE_STATE_9);
return;
}
}
if (gBattleState2 == BATTLE_STATE2_UNK_64) {
if (btl_cam_is_moving_done()) {
D_8029F258 = 0;
reset_actor_turn_info();
partner = battleStatus->partnerActor;
battleStatus->unk_86 = 0x7F;
battleStatus->blockResult = 0x7F;
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) {
// TODO: We believe these are DebuffFXData*,
// but unk_3C is a u8 for these and we need it to be an s32...
((s32*)(partner->debuffEffect->data))[15] = partner->koDuration;
} else {
partner->koStatus = 0;
dispatch_event_partner(EVENT_34);
// TODO: We believe these are DebuffFXData*,
// but unk_3C is a u8 for these and we need it to be an s32...
((s32*)(partner->debuffEffect->data))[15] = 0;
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;
}
}
gBattleState2 = BATTLE_STATE2_UNK_1;
}
}
if (gBattleState2 == BATTLE_STATE2_UNK_1) {
if (partner != NULL) {
if (partner->onHitScript == NULL || !does_script_exist(partner->onHitID)) {
partner->onHitScript = NULL;
} 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;
}
gBattleState2 = BATTLE_STATE2_UNK_8;
}
block_27:
if (gBattleState2 == BATTLE_STATE2_UNK_8) {
if (partner->onTurnChanceScriptSource != NULL) {
Evt* script;
battleStatus->battlePhase = 0xC;
script = start_script(partner->onTurnChanceScriptSource, 0xA, 0);
partner->onTurnChangeScript = script;
partner->onTurnChangeID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
}
gBattleState2 = BATTLE_STATE2_UNK_9;
}
if (gBattleState2 == BATTLE_STATE2_UNK_9 &&
(partner->onTurnChanceScriptSource == NULL || !does_script_exist(partner->onTurnChangeID)))
{
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
if (gBattleState2 == BATTLE_STATE2_PLAYER_DEFEATED) {
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);
}
}
}
void btl_state_draw_begin_partner_turn(void) {
}
void btl_state_update_switch_to_partner(void) {
Actor* player = gBattleStatus.playerActor;
Actor* partner = gBattleStatus.partnerActor;
s32 i;
if (gBattleState2 == BATTLE_STATE2_UNK_0) {
reset_actor_turn_info();
gBattleStatus.flags1 |= BS_FLAGS1_80000;
gBattleStatus.selectedMoveID = MOVE_NONE;
gBattleStatus.unk_86 = 0x7F;
gBattleStatus.blockResult = 0x7F;
gBattleStatus.flags1 |= BS_FLAGS1_8;
player->flags |= (ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
partner->flags |= ACTOR_FLAG_8000000;
for (i = 0; i < ARRAY_COUNT(gBattleStatus.enemyActors); i++) {
Actor* enemy = gBattleStatus.enemyActors[i];
if (enemy != NULL) {
enemy->flags |= ENEMY_FLAGS_80000;
enemy->flags |= ENEMY_FLAGS_8000000;
}
}
btl_set_state(BATTLE_STATE_PREPARE_MENU);
}
}
void btl_state_draw_switch_to_partner(void) {
}
INCLUDE_ASM(s32, "16F740", func_80242FE0);
void func_80243910(void) {
}
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);
} else if (gBattleState2 == BATTLE_STATE2_UNK_46) {
btl_set_state(BATTLE_STATE_PLAYER_MENU);
gBattleState2 = BATTLE_STATE2_UNK_46;
} else {
btl_set_state(BATTLE_STATE_PLAYER_MENU);
}
}
void btl_state_draw_prepare_menu(void) {
}
INCLUDE_ASM(s32, "16F740", btl_state_update_end_turn);
void btl_state_draw_end_turn(void) {
}
void btl_state_update_1C(void) {
btl_cam_use_preset(BTL_CAM_PRESET_C);
btl_set_state(BATTLE_STATE_PREPARE_MENU);
}
void btl_state_draw_1C(void) {
}
void btl_state_update_victory(void) {
BattleStatus* battleStatus = &gBattleStatus;
EncounterStatus* currentEncounter = &gCurrentEncounter;
PlayerData* playerData = &gPlayerData;
Actor* player = battleStatus->playerActor;
Actor* partner = battleStatus->partnerActor;
Evt* script;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
player->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
if (partner != NULL) {
partner->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
}
battleStatus->unk_8C = 0;
if (battleStatus->outtaSightActive == 0) {
gBattleState2 = BATTLE_STATE2_UNK_5;
} else {
if (battleStatus->outtaSightActive > 0) {
D_8029F254 = 1;
}
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
script = start_script(partner->onTurnChanceScriptSource, EVT_PRIORITY_A, 0);
partner->onTurnChangeScript = script;
partner->onTurnChangeID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
gBattleState2 = BATTLE_STATE2_UNK_1;
}
break;
case BATTLE_STATE2_UNK_1:
if (!does_script_exist(partner->onTurnChangeID)) {
battleStatus->outtaSightActive = 0;
gBattleState2 = BATTLE_STATE2_UNK_5;
}
break;
}
switch (gBattleState2) {
case BATTLE_STATE2_UNK_5:
player->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
if (partner != NULL) {
partner->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
}
gBattleState2 = BATTLE_STATE2_UNK_B;
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
gBattleStatus.flags1 &= ~BS_FLAGS1_8;
if (player->koStatus == STATUS_DAZE) {
dispatch_event_player(EVENT_34);
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
player->debuff = 0;
player->staticStatus = 0;
player->stoneStatus = 0;
player->transStatus = 0;
player->koStatus = 0;
player->koDuration = 0;
((DisableXFXData*)player->debuffEffect->data)->unk_3C = 0;
if (partner != NULL) {
if (partner->koStatus == STATUS_DAZE) {
dispatch_event_partner(EVENT_34);
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
partner->debuff = 0;
partner->staticStatus = 0;
partner->stoneStatus = 0;
partner->transStatus = 0;
partner->koStatus = 0;
partner->koDuration = 0;
((DisableXFXData*)partner->debuffEffect->data)->unk_3C = 0;
}
break;
case BATTLE_STATE2_PLAYER_DEFEATED:
if (player->onHitScript == NULL || !does_script_exist(player->onHitID)) {
player->onHitScript = NULL;
if (partner != NULL) {
if (partner->onHitScript == NULL || !does_script_exist(partner->onHitID)) {
partner->onHitScript = NULL;
} else {
break;
}
}
gBattleState2 = BATTLE_STATE2_UNK_B;
}
break;
}
if (gBattleState2 == BATTLE_STATE2_UNK_B) {
if (partner == NULL || !(gBattleStatus.flags1 & BS_FLAGS1_100000)) {
gBattleState2 = BATTLE_STATE2_UNK_2;
} 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;
gBattleState2 = BATTLE_STATE2_UNK_C;
}
}
if (gBattleState2 == BATTLE_STATE2_UNK_C) {
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;
}
partner->currentPos.z += sin_rad((partner->state.angle * TAU) / 360.0f) * 16.0f;
partner->yaw = clamp_angle(-partner->state.angle);
player->currentPos.z -= sin_rad((partner->state.angle * TAU) / 360.0f) * 16.0f;
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;
gBattleState2 = BATTLE_STATE2_UNK_2;
gBattleStatus.flags1 &= ~BS_FLAGS1_100000;
}
}
if (gBattleState2 == BATTLE_STATE2_UNK_2) {
btl_cam_use_preset(BTL_CAM_PRESET_C);
if (battleStatus->nextMerleeSpellType == 3) {
if (battleStatus->totalStarPoints == 0) {
battleStatus->nextMerleeSpellType = 0;
playerData->merleeTurnCount = 0;
playerData->merleeCastsLeft++;
} else {
battleStatus->battlePhase = PHASE_MERLEE_EXP_BONUS;
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PLAYER;
}
}
gBattleState2 = BATTLE_STATE2_UNK_3;
D_8029F248 = 0;
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
}
if (gBattleState2 == BATTLE_STATE2_UNK_3) {
if (D_8029F248 != 0) {
D_8029F248--;
} else if (player->takeTurnScript == NULL || !does_script_exist(player->takeTurnID)) {
player->takeTurnScript = NULL;
if (battleStatus->nextMerleeSpellType != 3) {
gBattleState2 = BATTLE_STATE2_UNK_4;
} else {
battleStatus->incrementStarPointDelay = 0x14;
battleStatus->nextMerleeSpellType = 0;
gBattleState2 = BATTLE_STATE2_UNK_4;
battleStatus->pendingStarPoints = battleStatus->totalStarPoints
+ battleStatus->pendingStarPoints + battleStatus->pendingStarPoints;
}
}
}
if (gBattleState2 == BATTLE_STATE2_UNK_4 && (s8) battleStatus->pendingStarPoints <= 0) {
if (gBattleStatus.flags1 & BS_FLAGS1_1000000) {
gBattleStatus.flags1 &= ~BS_FLAGS1_40000;
}
if (playerData->battlesWon < 9999) {
playerData->battlesWon++;
}
if (gBattleStatus.flags1 & BS_FLAGS1_40000) {
currentEncounter->battleOutcome = OUTCOME_ENEMY_FLED;
} else {
currentEncounter->battleOutcome = OUTCOME_PLAYER_WON;
}
if (gBattleStatus.flags1 & BS_FLAGS1_20000) {
if (!(gBattleStatus.flags2 & BS_FLAGS2_2000000)) {
bgm_set_song(0, -1, 0, 1500, 8);
}
btl_set_state(BATTLE_STATE_END_BATTLE);
} else {
btl_set_state(BATTLE_STATE_CELEBRATION);
}
}
}
void btl_state_draw_victory(void) {
}
void btl_state_update_end_training_battle(void) {
BattleStatus* battleStatus = &gBattleStatus;
PlayerData* playerData = &gPlayerData;
EncounterStatus* encounterStatus = &gCurrentEncounter;
Actor* player = gBattleStatus.playerActor;
Actor* partner = gBattleStatus.partnerActor;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
player->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
if (partner != NULL) {
partner->flags &= ~(ACTOR_FLAG_8000000 | ACTOR_FLAG_4000000);
}
gBattleState2 = 0xB;
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
if (player->koStatus == STATUS_DAZE) {
dispatch_event_player(EVENT_34);
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
player->debuff = 0;
player->staticStatus = 0;
player->stoneStatus = 0;
player->transStatus = 0;
player->koStatus = 0;
player->koDuration = 0;
((DisableXFXData*)player->debuffEffect->data)->unk_3C = 0;
if (partner != NULL) {
if (partner->koStatus == STATUS_DAZE) {
dispatch_event_partner(EVENT_34);
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
partner->debuff = 0;
partner->staticStatus = 0;
partner->stoneStatus = 0;
partner->transStatus = 0;
partner->koStatus = 0;
partner->koDuration = 0;
((DisableXFXData*)partner->debuffEffect->data)->unk_3C = 0;
}
break;
case BATTLE_STATE2_PLAYER_DEFEATED:
if (player->onHitScript == NULL || !does_script_exist(player->onHitID)) {
player->onHitScript = NULL;
if (partner != NULL) {
if (partner->onHitScript == NULL || !does_script_exist(partner->onHitID)) {
partner->onHitScript = NULL;
} else {
break;
}
}
gBattleState2 = BATTLE_STATE2_UNK_B;
}
break;
}
switch (gBattleState2) {
case BATTLE_STATE2_UNK_B:
battleStatus->unk_8C = 0;
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
if (!battleStatus->outtaSightActive) {
gBattleState2 = BATTLE_STATE2_UNK_D;
} else {
Evt* script;
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
script = start_script(partner->onTurnChanceScriptSource, 0xA, 0);
partner->onTurnChangeScript = script;
gBattleState2 = BATTLE_STATE2_UNK_C;
partner->onTurnChangeID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
}
break;
case BATTLE_STATE2_UNK_D:
if (!does_script_exist(partner->onTurnChangeID)) {
battleStatus->outtaSightActive = FALSE;
gBattleState2 = BATTLE_STATE2_UNK_D;
}
break;
}
switch (gBattleState2) {
case BATTLE_STATE2_UNK_D:
btl_cam_use_preset(BTL_CAM_PRESET_C);
D_8029F248 = 30;
gBattleState2 = BATTLE_STATE2_UNK_E;
break;
case BATTLE_STATE2_UNK_E:
if (D_8029F248 != 0) {
D_8029F248--;
return;
}
if (playerData->trainingsDone < 9999) {
playerData->trainingsDone++;
}
encounterStatus->battleOutcome = 3;
if (!(gBattleStatus.flags2 & BS_FLAGS2_2000000)) {
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;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
D_80280A30 = 0;
if (gGameStatusPtr->debugEnemyContact == 2) {
D_80280A30 = 255;
}
if (encounterStatus->battleOutcome == 1 && !(gBattleStatus.flags1 & BS_FLAGS1_800000)) {
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);
}
gBattleState2 = BATTLE_STATE2_UNK_1;
break;
case BATTLE_STATE2_UNK_1:
if (D_80280A30 == 255) {
gBattleState2 = BATTLE_STATE2_UNK_2;
break;
}
D_80280A30 += battleStatus->unk_8D;
if (D_80280A30 > 255) {
D_80280A30 = 255;
}
break;
case BATTLE_STATE2_UNK_2:
D_80280A30 = 255;
gBattleStatus.flags1 &= ~BS_FLAGS1_1;
if (D_800DC064 == NULL) {
stage = blah->stage;
} else {
stage = D_800DC064[1];
}
if (stage->postBattle == NULL) {
gBattleState2 = BATTLE_STATE2_UNK_4;
return;
}
script = start_script(stage->postBattle, 0xA, 0);
battleStatus->controlScript = script;
gBattleState2 = BATTLE_STATE2_UNK_3;
battleStatus->controlScriptID = script->id;
break;
case BATTLE_STATE2_UNK_3:
if (!does_script_exist(battleStatus->controlScriptID)) {
gBattleState2 = BATTLE_STATE2_UNK_4;
// fallthrough
} else {
break;
}
case BATTLE_STATE2_UNK_4:
kill_all_scripts();
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
if (battleStatus->enemyActors[i] != NULL) {
btl_delete_actor(battleStatus->enemyActors[i]);
}
}
if (battleStatus->partnerActor != NULL) {
btl_delete_actor(battleStatus->partnerActor);
}
btl_delete_player_actor(battleStatus->playerActor);
if (battleStatus->nextMerleeSpellType == 4) {
encounterStatus->merleeCoinBonus = 1;
battleStatus->nextMerleeSpellType = 0;
}
encounterStatus->damageTaken = battleStatus->damageTaken;
if (gBattleStatus.flags2 & BS_FLAGS2_10000000) {
encounterStatus->dropWhackaBump = 1;
}
remove_all_effects();
set_windows_visible(0);
if (gBattleStatus.flags2 & BS_FLAGS2_40) {
decrement_status_menu_disabled();
}
if (encounterStatus->battleOutcome == OUTCOME_PLAYER_LOST &&
!(gBattleStatus.flags1 & BS_FLAGS1_800000))
{
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;
gGameStatusPtr->entryID = 0;
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];
if (gCurrentEncounter.battleOutcome == 1 && !(gBattleStatus.flags1 & BS_FLAGS1_800000)) {
camera->auxBoomZOffset += 0x100;
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;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
gBattleStatus.unk_8C = 0;
gBattleStatus.battlePhase = PHASE_USE_DEFEND;
player->takeTurnScript = script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
player->takeTurnID = script->id;
gBattleState2 = BATTLE_STATE2_UNK_1;
script->owner1.actorID = ACTOR_PLAYER;
break;
case BATTLE_STATE2_UNK_1:
if (!does_script_exist(player->takeTurnID) && gBattleStatus.unk_8C == 0) {
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;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
battleStatus->unk_8C = 0;
gBattleStatus.flags1 &= ~BS_FLAGS1_40000;
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;
if (gGameStatusPtr->debugEnemyContact == 4) {
player->state.varTable[0] = 100;
}
battleStatus->battlePhase = 3;
script = start_script(PlayerScriptDispatcher, 0xA, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PLAYER;
if (partner != NULL && partner->koStatus == 0) {
script = start_script(partner->takeTurnScriptSource, 0xA, 0);
partner->takeTurnScript = script;
partner->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
}
gBattleState2 = BATTLE_STATE2_UNK_2;
break;
case 2:
if (!does_script_exist(player->takeTurnID) && battleStatus->unk_8C == 0) {
if (!(gBattleStatus.flags1 & BS_FLAGS1_40000)) {
gBattleState2 = BATTLE_STATE2_UNK_3;
} else {
currentEncounter->battleOutcome = 2;
if (is_ability_active(ABILITY_RUNAWAY_PAY) == 0) {
gBattleState2 = BATTLE_STATE2_UNK_B;
} 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;
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
}
}
break;
}
if (gBattleState2 == BATTLE_STATE2_PLAYER_DEFEATED) {
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();
gBattleState2 = BATTLE_STATE2_UNK_B;
}
}
}
if (gBattleState2 == BATTLE_STATE2_UNK_B) {
playerData->battlesFled++;
if (!(gBattleStatus.flags2 & 0x02000000)) {
bgm_set_song(0, -1, 0, 1500, 8);
}
btl_set_state(BATTLE_STATE_END_BATTLE);
}
switch (gBattleState2) {
case BATTLE_STATE2_UNK_3:
battleStatus->battlePhase = 7;
script = start_script(PlayerScriptDispatcher, 0xA, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PLAYER;
if (partner != NULL && partner->koStatus == 0) {
script = start_script(partner->takeTurnScriptSource, 0xA, 0);
partner->takeTurnScript = script;
partner->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
}
gBattleState2 = BATTLE_STATE2_UNK_4;
break;
case BATTLE_STATE2_UNK_4:
if (D_8029F248 != 0) {
D_8029F248--;
return;
}
if (!does_script_exist(player->takeTurnID) &&
(partner == NULL || !does_script_exist(partner->takeTurnID)) &&
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;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
battleStatus->flags1 &= ~BS_FLAGS1_8;
battleStatus->unk_8C = 0;
gBattleStatus.flags2 &= ~BS_FLAGS2_2;
gBattleStatus.flags2 &= ~BS_FLAGS2_4;
gBattleStatus.flags2 &= ~BS_FLAGS2_8;
gBattleStatus.flags2 &= ~BS_FLAGS2_10;
if (player->debuff != 0) {
if (player->debuff == 7) {
sfx_play_sound(SOUND_FROZEN_SHATTER);
player->icePillarEffect->flags |= EFFECT_INSTANCE_FLAGS_10;
player->icePillarEffect = NULL;
}
player->debuff = 0;
player->debuffDuration = 0;
remove_status_debuff(player->hudElementDataIndex);
player->koStatus = 0;
player->koDuration = 0;
((DisableXFXData*)player->debuffEffect->data)->unk_3C = 0;
}
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;
player->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PLAYER;
if (partner != NULL) {
script = start_script(partner->takeTurnScriptSource, EVT_PRIORITY_A, 0);
partner->takeTurnScript = script;
partner->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
}
gBattleState2 = BATTLE_STATE2_UNK_1;
break;
case BATTLE_STATE2_UNK_1:
if (!does_script_exist(player->takeTurnID) && battleStatus->unk_8C == 0) {
if (find_item(ITEM_LIFE_SHROOM) >= 0) {
battleStatus->battlePhase = PHASE_USE_LIFE_SHROOM;
script = start_script(&PlayerScriptDispatcher, EVT_PRIORITY_A, 0);
player->takeTurnScript = script;
player->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PLAYER;
gBattleState2 = BATTLE_STATE2_UNK_2;
} else {
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
}
break;
case BATTLE_STATE2_UNK_2:
if (!does_script_exist(player->takeTurnID) && battleStatus->unk_8C == 0) {
gBattleState2 = BATTLE_STATE2_PLAYER_DEFEATED;
}
break;
}
if (gBattleState2 == BATTLE_STATE2_PLAYER_DEFEATED) {
currentEncounter->battleOutcome = OUTCOME_PLAYER_LOST;
if (!(gBattleStatus.flags2 & BS_FLAGS2_2000000)) {
bgm_set_song(0, -1, 0, 0x5DC, 8);
}
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;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
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;
D_8029F248 = 0xA;
gBattleState2 = BATTLE_STATE2_UNK_2;
case BATTLE_STATE2_UNK_2:
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;
gBattleState2 = BATTLE_STATE2_UNK_3;
break;
case BATTLE_STATE2_UNK_3:
if (!does_script_exist(battleStatus->controlScriptID)) {
btl_delete_actor(partner);
playerData->currentPartner = battleStatus->unk_1AA[2];
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;
gBattleState2 = BATTLE_STATE2_UNK_4;
}
break;
case BATTLE_STATE2_UNK_4:
partner = battleStatus->partnerActor;
if (partner != NULL) {
if (!does_script_exist(partner->takeTurnID)) {
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;
gBattleState2 = BATTLE_STATE2_UNK_5;
break;
case BATTLE_STATE2_UNK_5:
if (!does_script_exist(battleStatus->controlScriptID)) {
partner = battleStatus->partnerActor;
if (partner != NULL) {
if (partner->onTurnChanceScriptSource != NULL) {
battleStatus->battlePhase = PHASE_PLAYER_BEGIN;
script = start_script(partner->onTurnChanceScriptSource, EVT_PRIORITY_A, 0);
partner->onTurnChangeScript = script;
partner->onTurnChangeID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
}
}
gBattleState2 = BATTLE_STATE2_UNK_6;
}
break;
case BATTLE_STATE2_UNK_6:
partner = battleStatus->partnerActor;
if (partner == NULL || partner->onTurnChanceScriptSource == NULL
|| !does_script_exist(partner->onTurnChangeID)) {
btl_cam_use_preset(BTL_CAM_PRESET_C);
gBattleState2 = BATTLE_STATE2_UNK_7;
}
break;
case BATTLE_STATE2_UNK_7:
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) {
}
INCLUDE_ASM(s32, "16F740", btl_state_update_player_move);
void btl_state_draw_player_move(void) {
}
INCLUDE_ASM(s32, "16F740", btl_state_update_end_player_turn);
void btl_state_draw_end_player_turn(void) {
}
void btl_state_update_partner_move(void) {
BattleStatus* battleStatus = &gBattleStatus;
PlayerData* playerData = &gPlayerData;
Actor* enemyActor;
Actor* player = battleStatus->playerActor;
Actor* partner = battleStatus->partnerActor;
Evt* script;
s8 switchCondition;
s32 phi_s3;
s32 phi_s0;
s32 i;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
if (partner == NULL) {
btl_set_state(BATTLE_STATE_9);
} else {
battleStatus->unk_8C = 0;
battleStatus->unk_86 = 0x7F;
battleStatus->blockResult = 0x7F;
battleStatus->unk_19A = 0;
gBattleStatus.flags1 &= ~BS_FLAGS1_1000;
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();
btl_cam_target_actor(0x100);
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;
}
}
btl_cam_use_preset(BTL_CAM_PRESET_C);
gBattleState2 = BATTLE_STATE2_UNK_2;
}
break;
case BATTLE_STATE2_UNK_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;
}
}
increment_status_menu_disabled();
gBattleStatus.flags1 |= BS_FLAGS1_100;
reset_actor_turn_info();
reset_all_actor_sounds(partner);
battleStatus->battlePhase = PHASE_EXECUTE_ACTION;
script = start_script(partner->takeTurnScriptSource, EVT_PRIORITY_A, 0);
partner->takeTurnScript = script;
partner->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
gBattleState2 = BATTLE_STATE2_UNK_3;
break;
case BATTLE_STATE2_UNK_3:
if (!(gBattleStatus.flags1 & BS_FLAGS1_200000)) {
if (partner->takeTurnScript == NULL || !does_script_exist(partner->takeTurnID)) {
partner->takeTurnScript = NULL;
} else {
break;
}
}
gBattleStatus.flags1 &= ~BS_FLAGS1_100;
if ((partner->onHitScript == NULL || !does_script_exist(partner->onHitID))
&& ((partner->onHitScript = NULL, player->onHitScript == NULL)
|| !does_script_exist(player->onHitID))) {
player->onHitScript = NULL;
for (phi_s3 = FALSE, i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
enemyActor = battleStatus->enemyActors[i];
if (enemyActor != NULL && enemyActor->takeTurnScript != NULL) {
if (does_script_exist(enemyActor->takeTurnID)) {
phi_s3 = TRUE;
} else {
enemyActor->takeTurnScript = NULL;
}
}
}
if (phi_s3 == FALSE) {
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
enemyActor = battleStatus->enemyActors[i];
if (enemyActor != NULL && enemyActor->onHitScript != NULL) {
if (does_script_exist(enemyActor->onHitID)) {
phi_s3 = TRUE;
} else {
enemyActor->onHitScript = NULL;
}
}
}
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) {
btl_set_state(BATTLE_STATE_END_DEMO_BATTLE);
break;
}
decrement_status_menu_disabled();
if (playerData->currentPartner == PARTNER_GOOMBARIO && battleStatus->moveCategory == 5
&& battleStatus->selectedMoveID != MOVE_CHARGE) {
partner->isGlowing = 0;
gBattleStatus.flags1 &= ~BS_FLAGS1_40000000;
}
if (btl_check_player_defeated() == FALSE) {
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);
}
}
}
btl_update_ko_status();
if ((s8) partner->status == 0xD && btl_are_all_enemies_defeated() == FALSE) {
btl_cam_use_preset(BTL_CAM_PRESET_54);
btl_show_battle_message(0x23, 0x3C);
partner->status = 0;
partner->unk_21D = 0;
gBattleState2 = BATTLE_STATE2_UNK_B;
partner->flags |= ACTOR_FLAG_8000000;
} else {
gBattleState2 = BATTLE_STATE2_UNK_14;
}
} else {
return;
}
}
}
}
}
break;
case BATTLE_STATE2_UNK_B:
if (btl_is_popup_displayed() == FALSE) {
btl_cam_use_preset(BTL_CAM_PRESET_C);
btl_cam_move(15);
D_8029F248 = 0xA;
gBattleState2 = BATTLE_STATE2_UNK_C;
}
break;
case BATTLE_STATE2_UNK_C:
if (D_8029F248 != 0) {
D_8029F248--;
} else {
gBattleState2 = BATTLE_STATE2_UNK_14;
}
break;
}
switch (gBattleState2) {
case BATTLE_STATE2_UNK_14:
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) {
gBattleState2 = BATTLE_STATE2_UNK_1E;
} else {
btl_cam_use_preset(BTL_CAM_PRESET_D);
switchCondition = enemyActor->status - 4;
switch (switchCondition) {
case 0:
phi_s0 = 0x12;
break;
case 2:
phi_s0 = 0x13;
break;
case 3:
phi_s0 = 0x14;
break;
case 5:
phi_s0 = 0x15;
break;
case 6:
phi_s0 = 0x16;
break;
case 1:
phi_s0 = 0x17;
break;
case 7:
phi_s0 = 0x18;
break;
case 4:
phi_s0 = 0x19;
break;
default:
phi_s0 = 0;
gBattleState2 = BATTLE_STATE2_UNK_14;
break;
}
sfx_play_sound(SOUND_2107);
btl_show_battle_message(phi_s0, 0x3C);
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
enemyActor = battleStatus->enemyActors[i];
if (enemyActor != NULL) {
enemyActor->status = 0;
}
}
gBattleState2 = BATTLE_STATE2_UNK_15;
}
break;
case BATTLE_STATE2_UNK_15:
if (btl_is_popup_displayed() == FALSE) {
btl_cam_use_preset(BTL_CAM_PRESET_C);
btl_cam_move(15);
D_8029F248 = 10;
gBattleState2 = BATTLE_STATE2_UNK_16;
}
break;
case BATTLE_STATE2_UNK_16:
if (D_8029F248 != 0) {
D_8029F248--;
} else {
gBattleState2 = BATTLE_STATE2_UNK_1E;
}
break;
}
if (gBattleState2 == BATTLE_STATE2_UNK_1E && (partner->takeTurnScript == NULL ||
!does_script_exist(partner->takeTurnID))) {
partner->takeTurnScript = NULL;
btl_set_state(BATTLE_STATE_END_PARTNER_TURN);
}
}
void btl_state_draw_partner_move(void) {
}
void btl_state_update_end_partner_turn(void) {
BattleStatus* battleStatus = &gBattleStatus;
if (gBattleState2 == BATTLE_STATE2_UNK_0) {
battleStatus->flags2 |= BS_FLAGS2_4;
if (!btl_check_enemies_defeated()) {
battleStatus->flags1 &= ~BS_FLAGS1_80000;
battleStatus->flags2 &= ~BS_FLAGS2_10;
if (battleStatus->unk_94 < 0) {
battleStatus->unk_94 = 0;
btl_set_state(BATTLE_STATE_END_TURN);
} else {
btl_set_state(BATTLE_STATE_9);
}
}
}
}
void btl_state_draw_end_partner_turn(void) {
}
void btl_state_update_next_enemy(void) {
BattleStatus* battleStatus = &gBattleStatus;
Actor* player = gBattleStatus.playerActor;
Actor* partner = gBattleStatus.partnerActor;
Actor* enemy;
s32 cond;
s32 i;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
case BATTLE_STATE2_UNK_1:
i = battleStatus->nextEnemyIndex;
if (i >= battleStatus->numEnemyActors) {
battleStatus->nextEnemyIndex = 0;
btl_set_state(BATTLE_STATE_END_TURN);
return;
}
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;
cond = enemy->debuff == STATUS_SLEEP;
if (enemy->debuff == STATUS_FEAR) {
cond = TRUE;
}
if (enemy->debuff == STATUS_DIZZY) {
cond = TRUE;
}
if (enemy->debuff == STATUS_PARALYZE) {
cond = TRUE;
}
if (enemy->debuff == STATUS_FROZEN) {
cond = TRUE;
}
if (enemy->debuff == STATUS_STOP) {
cond = TRUE;
}
if (enemy->stoneStatus == STATUS_STONE) {
cond = TRUE;
}
if (enemy->flags & ACTOR_FLAG_10000) {
cond = TRUE;
}
if (cond) {
gBattleState2 = BATTLE_STATE2_UNK_0;
return;
}
battleStatus->unk_8C = 0;
gBattleStatus.flags1 &= ~BS_FLAGS1_2;
gBattleStatus.flags1 &= ~BS_FLAGS1_40000;
gBattleStatus.flags1 &= ~BS_FLAGS1_1000;
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;
if (enemy->onTurnChanceScriptSource != NULL) {
Evt* onTurnChanceScript;
battleStatus->battlePhase = PHASE_ENEMY_BEGIN;
onTurnChanceScript = start_script(enemy->onTurnChanceScriptSource, 0xA, 0);
enemy->onTurnChangeScript = onTurnChanceScript;
enemy->onTurnChangeID = onTurnChanceScript->id;
onTurnChanceScript->owner1.actorID = battleStatus->activeEnemyActorID;
}
gBattleState2 = BATTLE_STATE2_UNK_2;
break;
case BATTLE_STATE2_UNK_2:
if (battleStatus->unk_8C == 0) {
enemy = get_actor(battleStatus->activeEnemyActorID);
if (enemy != NULL && enemy->unk_134 == D_8029F244) {
if (enemy->onTurnChanceScriptSource == NULL || !does_script_exist(enemy->onTurnChangeID)) {
if (battleStatus->unk_94 < 0) {
battleStatus->unk_94 = 0;
btl_set_state(BATTLE_STATE_END_TURN);
} else {
btl_set_state(BATTLE_STATE_ENEMY_MOVE);
}
}
} else {
btl_set_state(BATTLE_STATE_NEXT_ENEMY);
}
}
break;
}
}
void btl_state_draw_next_enemy(void) {
}
INCLUDE_ASM(s32, "16F740", btl_state_update_enemy_move);
void btl_state_draw_enemy_move(void) {
}
INCLUDE_ASM(s32, "16F740", btl_state_update_first_strike);
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);
}
}
}
void btl_state_update_partner_striking_first(void) {
PlayerData* playerData = &gPlayerData;
BattleStatus* battleStatus = &gBattleStatus;
Actor* player = battleStatus->playerActor;
Actor* partner = battleStatus->partnerActor;
Actor* actor;
s32 found;
SelectableTarget* target;
Evt* script;
s32 level;
s32 i;
switch (gBattleState2) {
case BATTLE_STATE2_UNK_0:
D_8029F254 = 0;
level = partner->actorBlueprint->level;
switch (playerData->currentPartner) {
case PARTNER_KOOPER:
battleStatus->moveCategory = 5;
battleStatus->selectedItemID = ITEM_NONE;
battleStatus->selectedMoveID = level + MOVE_SHELL_TOSS1;
battleStatus->currentTargetListFlags = gMoveTable[battleStatus->selectedMoveID].flags;
break;
case PARTNER_BOMBETTE:
battleStatus->moveCategory = 5;
battleStatus->selectedItemID = ITEM_NONE;
battleStatus->selectedMoveID = level + MOVE_BODY_SLAM1;
battleStatus->currentTargetListFlags = gMoveTable[battleStatus->selectedMoveID].flags;
break;
}
actor = get_actor(ACTOR_ENEMY0);
if (actor->onHitScriptSource != NULL) {
actor->lastEventType = EVENT_BEGIN_FIRST_STRIKE;
script = start_script(actor->onHitScriptSource, 0xA, 0x20);
actor->onHitScript = script;
actor->onHitID = script->id;
script->owner1.actorID = actor->actorID;
}
gBattleState2 = BATTLE_STATE2_UNK_1;
break;
case BATTLE_STATE2_UNK_1:
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();
battleStatus->battlePhase = PHASE_FIRST_STRIKE;
script = start_script(partner->takeTurnScriptSource, 0xA, 0);
partner->takeTurnScript = script;
D_8029F248 = 3;
gBattleState2 = BATTLE_STATE2_UNK_2;
partner->takeTurnID = script->id;
script->owner1.actorID = ACTOR_PARTNER;
break;
case BATTLE_STATE2_UNK_2:
if (D_8029F248 != 0) {
D_8029F248--;
} else {
D_8029F254 = 1;
}
if (partner->takeTurnScript == NULL || !does_script_exist(partner->takeTurnID)) {
partner->takeTurnScript = NULL;
if (partner->onHitScript == NULL || !does_script_exist(partner->onHitID)) {
partner->onHitScript = NULL;
if (player->onHitScript == NULL || !does_script_exist(player->onHitID)) {
player->onHitScript = NULL;
found = 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->takeTurnID)) {
found = TRUE;
} else {
actor->takeTurnScript = NULL;
}
}
}
if (!found) {
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
actor = battleStatus->enemyActors[i];
if (actor != NULL && actor->onHitScript != NULL) {
if (does_script_exist(actor->onHitID)) {
found = TRUE;
} else {
actor->onHitScript = NULL;
}
}
}
if (!found) {
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
actor = battleStatus->enemyActors[i];
if (actor != NULL) {
actor->flags &= ~ACTOR_FLAG_80000;
}
}
if (battleStatus->unk_8C == 0) {
decrement_status_menu_disabled();
if (!btl_check_player_defeated() && !btl_check_enemies_defeated()) {
actor = get_actor(partner->targetActorID);
if (actor != NULL) {
if (actor->onHitScriptSource != NULL) {
actor->lastEventType = EVENT_END_FIRST_STRIKE;
script = start_script(actor->onHitScriptSource, 0xA, 0x20);
actor->onHitScript = script;
actor->onHitID = script->id;
script->owner1.actorID = actor->actorID;
}
}
gBattleState2 = BATTLE_STATE2_UNK_3;
}
}
}
}
}
}
}
break;
case BATTLE_STATE2_UNK_3:
found = FALSE;
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
actor = battleStatus->enemyActors[i];
if (actor != NULL && actor->onHitScript != NULL) {
if (does_script_exist(actor->onHitID)) {
found = TRUE;
} else {
actor->onHitScript = NULL;
}
}
}
if (!found) {
btl_set_state(BATTLE_STATE_BEGIN_TURN);
}
break;
}
}
void btl_state_draw_partner_striking_first(void) {
if (D_8029F254 != 0) {
if (D_80280A30 == 0) {
set_screen_overlay_params_front(255, -1.0f);
} else {
D_80280A30 -= 20;
if (D_80280A30 < 0) {
D_80280A30 = 0;
}
set_screen_overlay_params_front(0, D_80280A30);
}
}
}
// ugly loops and such
#ifdef NON_EQUIVALENT
void btl_state_update_enemy_striking_first(void) {
PlayerData* playerData = &gPlayerData;
BattleStatus* battleStatus = &gBattleStatus;
Actor* player = battleStatus->playerActor;
Actor* partner = battleStatus->partnerActor;
Evt* script;
Actor* enemy;
s32 cond;
s32 i;
s32 j;
Actor* temp_s0;
s32 temp_t0;
s32 temp_a1;
s16* temp_t4;
s16* var_a2;
s16* var_t3;
s32 temp_v0;
s32 var_a3;
s32 var_t2;
s32 nextEnemyIdx;
s32 count;
switch (gBattleState2) {
case 0:
battleStatus->unk_8C = 0;
battleStatus->lastAttackDamage = 0;
battleStatus->unk_19A = 0;
playerData->enemyFirstStrikes++;
battleStatus->flags1 &= ~2;
D_8029F254 = 0;
player->flags &= ~ACTOR_FLAG_8000000;
if (partner != NULL) {
partner->flags &= ~ACTOR_FLAG_8000000;
}
battleStatus->flags2 |= 0x01000000 | 0x4000;
count = 0;
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
if (battleStatus->enemyActors[i] != NULL) {
battleStatus->enemyIDs[i] = i | 0x200;
count++;
}
}
battleStatus->numEnemyActors = count;
// for (i = 0; i < count - 1; i++) {
// for (j = i + 1; j < count; j++) {
// s32 temp_t0;
// s32 temp_a1;
// temp_t0 = battleStatus->enemyActors[battleStatus->enemyIDs[i]]->turnPriority;
// temp_a1 = battleStatus->enemyActors[battleStatus->enemyIDs[j]]->turnPriority;
// if (temp_t0 < temp_a1) {
// battleStatus->enemyActors[battleStatus->enemyIDs[i]]->turnPriority = temp_a1;
// battleStatus->enemyActors[battleStatus->enemyIDs[j]]->turnPriority = temp_t0;
// }
// }
// }
i = 0;
temp_v0 = var_t2 - 1;
temp_t4 = battleStatus->enemyIDs;
if (temp_v0 > 0) {
var_t3 = temp_t4;
do {
var_a3 = i + 1;
if (var_a3 < var_t2) {
var_a2 = &temp_t4[var_a3];
do {
temp_t0 = (u16) *var_t3;
temp_a1 = (u16) *var_a2;
var_a3 += 1;
if (battleStatus->enemyActors[temp_t0 & 0xFF]->turnPriority < battleStatus->enemyActors[temp_a1 & 0xFF]->turnPriority) {
*var_t3 = temp_a1;
*var_a2 = temp_t0;
}
var_a2 += 2;
} while (var_a3 < var_t2);
}
i++;
var_t3 += 2;
} while (i < temp_v0);
}
battleStatus->nextEnemyIndex = 0;
i = 0;
loop_18:
loop_19:
temp_s0 = battleStatus->enemyActors[battleStatus->enemyIDs[i]];
if (temp_s0 == NULL) {
block_21:
i++;
if (i >= battleStatus->numEnemyActors) {
i = 0;
goto loop_18;
}
goto loop_19;
}
if (temp_s0->flags & 0x204000) {
goto block_21;
}
nextEnemyIdx = i + 1;
battleStatus->currentTurnEnemy = enemy;
battleStatus->activeEnemyActorID = battleStatus->enemyIDs[i];
if (nextEnemyIdx >= battleStatus->numEnemyActors) {
nextEnemyIdx = 0;
}
battleStatus->nextEnemyIndex = nextEnemyIdx;
btl_cam_target_actor(battleStatus->activeEnemyActorID);
enemy = battleStatus->currentTurnEnemy;
reset_actor_turn_info();
battleStatus->battlePhase = 1;
script = start_script(enemy->takeTurnScriptSource, 0xA, 0);
enemy->takeTurnScript = script;
D_8029F248 = 3;
enemy->takeTurnID = script->id;
gBattleState2 = 2;
script->owner1.enemyID = battleStatus->activeEnemyActorID;
break;
case 2:
if (D_8029F248 != 0) {
D_8029F248--;
} else {
D_8029F254 = 1;
}
enemy = battleStatus->currentTurnEnemy;
if ((enemy->takeTurnScript == NULL || !does_script_exist(enemy->takeTurnID)) &&
((enemy->takeTurnScript = NULL, (player->onHitScript == NULL)) || !does_script_exist(player->onHitID))) {
player->onHitScript = NULL;
if (partner != NULL) {
if (partner->onHitScript == NULL || !does_script_exist(partner->onHitID)) {
partner->onHitScript = NULL;
goto block_39;
}
} else {
block_39:
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
enemy = battleStatus->enemyActors[i];
if (enemy != NULL && enemy->takeTurnScript != NULL) {
if (does_script_exist(enemy->takeTurnID)) {
cond = TRUE;
} else {
enemy->takeTurnScript = NULL;
}
}
}
if (!cond) {
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
enemy = battleStatus->enemyActors[i];
if (enemy != NULL && enemy->onHitScript != NULL) {
if (does_script_exist(enemy->onHitID)) {
cond = TRUE;
} else {
enemy->onHitScript = NULL;
}
}
}
if (!cond) {
gBattleStatus.flags2 &= ~0x4000;
for (i = 0; i < ARRAY_COUNT(battleStatus->enemyActors); i++) {
enemy = battleStatus->enemyActors[i];
if (enemy != NULL) {
enemy->flags &= 0xFFF7FFFF;
}
}
if (battleStatus->unk_8C == 0 &&
!btl_check_player_defeated() &&
!btl_check_enemies_defeated())
{
btl_set_state(5);
}
}
}
}
}
break;
}
}
#else
INCLUDE_ASM(s32, "16F740", btl_state_update_enemy_striking_first);
#endif
void btl_state_draw_enemy_striking_first(void) {
if (D_8029F254 != 0) {
if (D_80280A30 == 0) {
set_screen_overlay_params_front(255, -1.0f);
} else {
D_80280A30 -= 20;
if (D_80280A30 < 0) {
D_80280A30 = 0;
}
set_screen_overlay_params_front(0, D_80280A30);
}
}
}
void btl_state_update_end_demo_battle(void) {
BattleStatus* battleStatus = &gBattleStatus;
Battle* blah = (*D_800DC4FC);
Stage* stage;
s32 i;
switch (gBattleState2) {
case 0:
D_80280A30 = 0;
if (D_802809F6 == -1) {
if (D_802809F8 != 0) {
D_802809F8--;
break;
}
}
gBattleState2 = BATTLE_STATE2_UNK_1;
break;
case 1:
switch (D_802809F6) {
case 255:
gBattleState2 = BATTLE_STATE2_UNK_2;
return;
case -1:
if (D_80280A30 == 0xFF) {
gBattleState2 = BATTLE_STATE2_UNK_2;
return;
}
D_80280A30 += 50;
if (D_80280A30 > 0xFF) {
D_80280A30 = 0xFF;
}
return;
}
break;
case 2:
D_80280A30 = 0xFF;
gBattleStatus.flags1 &= ~BS_FLAGS1_1;
if (D_800DC064 == NULL) {
stage = blah->stage;
} else {
stage = D_800DC064[1]; // TODO cleanup
}
if (stage->postBattle == NULL) {
gBattleState2 = BATTLE_STATE2_UNK_4;
} else {
battleStatus->controlScript = start_script(stage->postBattle, 0xA, 0);
gBattleState2 = BATTLE_STATE2_UNK_3;
battleStatus->controlScriptID = battleStatus->controlScript->id;
}
break;
case 3:
if (does_script_exist(battleStatus->controlScriptID)) {
break;
}
gBattleState2 = BATTLE_STATE2_UNK_4;
case 4:
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);
if (gBattleStatus.flags2 & BS_FLAGS2_40) {
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 };
void btl_state_draw_end_demo_battle(void) {
if (D_802809F6 == -1) {
set_screen_overlay_color(0, 0, 0, 0);
set_screen_overlay_params_front(0, D_80280A30);
}
}