From b23c0167a7161fffd024ea86d9d4dc743f509726 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:22:47 -0500 Subject: [PATCH 01/37] Create new macros SetMonData16 and SetMonData32 This is so that the values will be aligned and assigned appropriately by SetMonData. --- include/battle_controllers.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 064c080f6181..a7498c667230 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -99,6 +99,26 @@ enum { // Special return values in gBattleBufferB from Battle Controller functions. #define RET_VALUE_LEVELED_UP 11 +#ifndef UBFIX +#define SetMonData16(mon, type, arg) SetMonData(mon, type, arg) +#define SetMonData32(mon, type, arg) SetMonData(mon, type, arg) +#else +#define SetMonData16(mon, type, arg) \ +{ \ + u8 *data = arg; \ + u16 value = (data[0]) | (data[1] << 8); \ + SetMonData(mon, type, &value); \ +} + +#define SetMonData32(mon, type, arg) \ +{\ + u8 *data = arg; \ + u16 value = (data[0]) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); \ + SetMonData(mon, type, &value); \ +} + +#endif + struct UnusedControllerStruct { u8 unk:7; From db28ae12cff571334294fd7a11df69879b77d211 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:24:40 -0500 Subject: [PATCH 02/37] Use SetMonData macros Use these macros where appropriate --- src/battle_controller_link_opponent.c | 55 +++++++++++++++++++-------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 2104298775a5..6cabece8e818 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -23,6 +23,31 @@ #include "task.h" #include "text.h" #include "util.h" +#includ#include "global.h" +#include "battle.h" +#include "battle_ai_script_commands.h" +#include "battle_anim.h" +#include "battle_controllers.h" +#include "battle_interface.h" +#include "battle_message.h" +#include "battle_setup.h" +#include "battle_tower.h" +#include "battle_tv.h" +#include "bg.h" +#include "data.h" +#include "link.h" +#include "main.h" +#include "m4a.h" +#include "palette.h" +#include "pokeball.h" +#include "pokemon.h" +#include "recorded_battle.h" +#include "reshow_battle_screen.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "util.h" #include "window.h" #include "constants/battle_anim.h" #include "constants/songs.h" @@ -932,10 +957,10 @@ static void SetLinkOpponentMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -949,7 +974,7 @@ static void SetLinkOpponentMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -965,10 +990,10 @@ static void SetLinkOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); @@ -1033,37 +1058,37 @@ static void SetLinkOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); From e8a72d7465ce46b7a8fd5c8e535e866ddcfdcc08 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:25:35 -0500 Subject: [PATCH 03/37] Use SetMonData macros Use them appropriately --- src/battle_controller_link_partner.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 054563ad3a8e..82ed9291576e 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -826,10 +826,10 @@ static void SetLinkPartnerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -843,7 +843,7 @@ static void SetLinkPartnerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -927,37 +927,37 @@ static void SetLinkPartnerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); @@ -1695,3 +1695,4 @@ static void LinkPartnerHandleEndLinkBattle(void) static void LinkPartnerCmdEnd(void) { } + From ef5a758edd14590ff781524dc71473bbed71bbc7 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:26:41 -0500 Subject: [PATCH 04/37] Use SetMonData macros --- src/battle_controller_opponent.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index e434e3ee6237..d912bed81755 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -946,10 +946,10 @@ static void SetOpponentMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -963,7 +963,7 @@ static void SetOpponentMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -1047,37 +1047,37 @@ static void SetOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); From b20fc0ff399afcc30a5d9c9ea066367e6a80978e Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:48:34 -0500 Subject: [PATCH 05/37] Use SetMonData macros --- src/battle_controller_player.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 357912d4b63d..a24ba82890a0 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1993,10 +1993,10 @@ static void SetPlayerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -2010,7 +2010,7 @@ static void SetPlayerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -2094,37 +2094,37 @@ static void SetPlayerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); From cab16486984d95ab0d30182974d7714401f7540b Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:49:39 -0500 Subject: [PATCH 06/37] Use SetMonData macro --- src/battle_controller_player_partner.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 236a66ce83df..72c24e7d8537 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -1010,10 +1010,10 @@ static void SetPlayerPartnerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -1027,7 +1027,7 @@ static void SetPlayerPartnerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -1111,37 +1111,37 @@ static void SetPlayerPartnerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); From af79bea65026224e364870fd43fcafa33d8a8b7e Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:50:34 -0500 Subject: [PATCH 07/37] SetMonData macro --- src/battle_controller_recorded_opponent.c | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 9c37cd0a92bd..845d31885f67 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -918,10 +918,10 @@ static void SetRecordedOpponentMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -935,7 +935,7 @@ static void SetRecordedOpponentMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -951,10 +951,10 @@ static void SetRecordedOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); @@ -1019,37 +1019,37 @@ static void SetRecordedOpponentMonData(u8 monId) SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); From 8391f3e0513413f2fa7d601534cb4b195e54fb43 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:51:21 -0500 Subject: [PATCH 08/37] SetMonData --- src/battle_controller_recorded_opponent.c | 1338 +++++++++++---------- 1 file changed, 681 insertions(+), 657 deletions(-) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 845d31885f67..8921846161c1 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -3,11 +3,8 @@ #include "battle_ai_script_commands.h" #include "battle_anim.h" #include "battle_controllers.h" -#include "battle_interface.h" #include "battle_message.h" -#include "battle_setup.h" -#include "battle_tower.h" -#include "battle_tv.h" +#include "battle_interface.h" #include "bg.h" #include "data.h" #include "item_use.h" @@ -27,179 +24,171 @@ #include "window.h" #include "constants/battle_anim.h" #include "constants/songs.h" -#include "constants/trainers.h" - -static void RecordedOpponentHandleGetMonData(void); -static void RecordedOpponentHandleGetRawMonData(void); -static void RecordedOpponentHandleSetMonData(void); -static void RecordedOpponentHandleSetRawMonData(void); -static void RecordedOpponentHandleLoadMonSprite(void); -static void RecordedOpponentHandleSwitchInAnim(void); -static void RecordedOpponentHandleReturnMonToBall(void); -static void RecordedOpponentHandleDrawTrainerPic(void); -static void RecordedOpponentHandleTrainerSlide(void); -static void RecordedOpponentHandleTrainerSlideBack(void); -static void RecordedOpponentHandleFaintAnimation(void); -static void RecordedOpponentHandlePaletteFade(void); -static void RecordedOpponentHandleSuccessBallThrowAnim(void); -static void RecordedOpponentHandleBallThrowAnim(void); -static void RecordedOpponentHandlePause(void); -static void RecordedOpponentHandleMoveAnimation(void); -static void RecordedOpponentHandlePrintString(void); -static void RecordedOpponentHandlePrintSelectionString(void); -static void RecordedOpponentHandleChooseAction(void); -static void RecordedOpponentHandleYesNoBox(void); -static void RecordedOpponentHandleChooseMove(void); -static void RecordedOpponentHandleChooseItem(void); -static void RecordedOpponentHandleChoosePokemon(void); -static void RecordedOpponentHandleCmd23(void); -static void RecordedOpponentHandleHealthBarUpdate(void); -static void RecordedOpponentHandleExpUpdate(void); -static void RecordedOpponentHandleStatusIconUpdate(void); -static void RecordedOpponentHandleStatusAnimation(void); -static void RecordedOpponentHandleStatusXor(void); -static void RecordedOpponentHandleDataTransfer(void); -static void RecordedOpponentHandleDMA3Transfer(void); -static void RecordedOpponentHandlePlayBGM(void); -static void RecordedOpponentHandleCmd32(void); -static void RecordedOpponentHandleTwoReturnValues(void); -static void RecordedOpponentHandleChosenMonReturnValue(void); -static void RecordedOpponentHandleOneReturnValue(void); -static void RecordedOpponentHandleOneReturnValue_Duplicate(void); -static void RecordedOpponentHandleClearUnkVar(void); -static void RecordedOpponentHandleSetUnkVar(void); -static void RecordedOpponentHandleClearUnkFlag(void); -static void RecordedOpponentHandleToggleUnkFlag(void); -static void RecordedOpponentHandleHitAnimation(void); -static void RecordedOpponentHandleCantSwitch(void); -static void RecordedOpponentHandlePlaySE(void); -static void RecordedOpponentHandlePlayFanfareOrBGM(void); -static void RecordedOpponentHandleFaintingCry(void); -static void RecordedOpponentHandleIntroSlide(void); -static void RecordedOpponentHandleIntroTrainerBallThrow(void); -static void RecordedOpponentHandleDrawPartyStatusSummary(void); -static void RecordedOpponentHandleHidePartyStatusSummary(void); -static void RecordedOpponentHandleEndBounceEffect(void); -static void RecordedOpponentHandleSpriteInvisibility(void); -static void RecordedOpponentHandleBattleAnimation(void); -static void RecordedOpponentHandleLinkStandbyMsg(void); -static void RecordedOpponentHandleResetActionMoveSelection(void); -static void RecordedOpponentHandleEndLinkBattle(void); -static void RecordedOpponentCmdEnd(void); - -static void RecordedOpponentBufferRunCommand(void); -static void RecordedOpponentBufferExecCompleted(void); -static void SwitchIn_HandleSoundAndEnd(void); -static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst); -static void SetRecordedOpponentMonData(u8 monId); + +static void RecordedPlayerHandleGetMonData(void); +static void RecordedPlayerHandleGetRawMonData(void); +static void RecordedPlayerHandleSetMonData(void); +static void RecordedPlayerHandleSetRawMonData(void); +static void RecordedPlayerHandleLoadMonSprite(void); +static void RecordedPlayerHandleSwitchInAnim(void); +static void RecordedPlayerHandleReturnMonToBall(void); +static void RecordedPlayerHandleDrawTrainerPic(void); +static void RecordedPlayerHandleTrainerSlide(void); +static void RecordedPlayerHandleTrainerSlideBack(void); +static void RecordedPlayerHandleFaintAnimation(void); +static void RecordedPlayerHandlePaletteFade(void); +static void RecordedPlayerHandleSuccessBallThrowAnim(void); +static void RecordedPlayerHandleBallThrowAnim(void); +static void RecordedPlayerHandlePause(void); +static void RecordedPlayerHandleMoveAnimation(void); +static void RecordedPlayerHandlePrintString(void); +static void RecordedPlayerHandlePrintSelectionString(void); +static void RecordedPlayerHandleChooseAction(void); +static void RecordedPlayerHandleYesNoBox(void); +static void RecordedPlayerHandleChooseMove(void); +static void RecordedPlayerHandleChooseItem(void); +static void RecordedPlayerHandleChoosePokemon(void); +static void RecordedPlayerHandleCmd23(void); +static void RecordedPlayerHandleHealthBarUpdate(void); +static void RecordedPlayerHandleExpUpdate(void); +static void RecordedPlayerHandleStatusIconUpdate(void); +static void RecordedPlayerHandleStatusAnimation(void); +static void RecordedPlayerHandleStatusXor(void); +static void RecordedPlayerHandleDataTransfer(void); +static void RecordedPlayerHandleDMA3Transfer(void); +static void RecordedPlayerHandlePlayBGM(void); +static void RecordedPlayerHandleCmd32(void); +static void RecordedPlayerHandleTwoReturnValues(void); +static void RecordedPlayerHandleChosenMonReturnValue(void); +static void RecordedPlayerHandleOneReturnValue(void); +static void RecordedPlayerHandleOneReturnValue_Duplicate(void); +static void RecordedPlayerHandleClearUnkVar(void); +static void RecordedPlayerHandleSetUnkVar(void); +static void RecordedPlayerHandleClearUnkFlag(void); +static void RecordedPlayerHandleToggleUnkFlag(void); +static void RecordedPlayerHandleHitAnimation(void); +static void RecordedPlayerHandleCantSwitch(void); +static void RecordedPlayerHandlePlaySE(void); +static void RecordedPlayerHandlePlayFanfareOrBGM(void); +static void RecordedPlayerHandleFaintingCry(void); +static void RecordedPlayerHandleIntroSlide(void); +static void RecordedPlayerHandleIntroTrainerBallThrow(void); +static void RecordedPlayerHandleDrawPartyStatusSummary(void); +static void RecordedPlayerHandleHidePartyStatusSummary(void); +static void RecordedPlayerHandleEndBounceEffect(void); +static void RecordedPlayerHandleSpriteInvisibility(void); +static void RecordedPlayerHandleBattleAnimation(void); +static void RecordedPlayerHandleLinkStandbyMsg(void); +static void RecordedPlayerHandleResetActionMoveSelection(void); +static void RecordedPlayerHandleEndLinkBattle(void); +static void RecordedPlayerCmdEnd(void); + +static void RecordedPlayerBufferRunCommand(void); +static void RecordedPlayerBufferExecCompleted(void); +static void SwitchIn_WaitAndEnd(void); +static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst); +static void SetRecordedPlayerMonData(u8 monId); static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); -static void RecordedOpponentDoMoveAnimation(void); +static void RecordedPlayerDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); -static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); static void EndDrawPartyStatusSummary(void); -static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = -{ - [CONTROLLER_GETMONDATA] = RecordedOpponentHandleGetMonData, - [CONTROLLER_GETRAWMONDATA] = RecordedOpponentHandleGetRawMonData, - [CONTROLLER_SETMONDATA] = RecordedOpponentHandleSetMonData, - [CONTROLLER_SETRAWMONDATA] = RecordedOpponentHandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = RecordedOpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = RecordedOpponentHandleSwitchInAnim, - [CONTROLLER_RETURNMONTOBALL] = RecordedOpponentHandleReturnMonToBall, - [CONTROLLER_DRAWTRAINERPIC] = RecordedOpponentHandleDrawTrainerPic, - [CONTROLLER_TRAINERSLIDE] = RecordedOpponentHandleTrainerSlide, - [CONTROLLER_TRAINERSLIDEBACK] = RecordedOpponentHandleTrainerSlideBack, - [CONTROLLER_FAINTANIMATION] = RecordedOpponentHandleFaintAnimation, - [CONTROLLER_PALETTEFADE] = RecordedOpponentHandlePaletteFade, - [CONTROLLER_SUCCESSBALLTHROWANIM] = RecordedOpponentHandleSuccessBallThrowAnim, - [CONTROLLER_BALLTHROWANIM] = RecordedOpponentHandleBallThrowAnim, - [CONTROLLER_PAUSE] = RecordedOpponentHandlePause, - [CONTROLLER_MOVEANIMATION] = RecordedOpponentHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = RecordedOpponentHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = RecordedOpponentHandlePrintSelectionString, - [CONTROLLER_CHOOSEACTION] = RecordedOpponentHandleChooseAction, - [CONTROLLER_YESNOBOX] = RecordedOpponentHandleYesNoBox, - [CONTROLLER_CHOOSEMOVE] = RecordedOpponentHandleChooseMove, - [CONTROLLER_OPENBAG] = RecordedOpponentHandleChooseItem, - [CONTROLLER_CHOOSEPOKEMON] = RecordedOpponentHandleChoosePokemon, - [CONTROLLER_23] = RecordedOpponentHandleCmd23, - [CONTROLLER_HEALTHBARUPDATE] = RecordedOpponentHandleHealthBarUpdate, - [CONTROLLER_EXPUPDATE] = RecordedOpponentHandleExpUpdate, - [CONTROLLER_STATUSICONUPDATE] = RecordedOpponentHandleStatusIconUpdate, - [CONTROLLER_STATUSANIMATION] = RecordedOpponentHandleStatusAnimation, - [CONTROLLER_STATUSXOR] = RecordedOpponentHandleStatusXor, - [CONTROLLER_DATATRANSFER] = RecordedOpponentHandleDataTransfer, - [CONTROLLER_DMA3TRANSFER] = RecordedOpponentHandleDMA3Transfer, - [CONTROLLER_PLAYBGM] = RecordedOpponentHandlePlayBGM, - [CONTROLLER_32] = RecordedOpponentHandleCmd32, - [CONTROLLER_TWORETURNVALUES] = RecordedOpponentHandleTwoReturnValues, - [CONTROLLER_CHOSENMONRETURNVALUE] = RecordedOpponentHandleChosenMonReturnValue, - [CONTROLLER_ONERETURNVALUE] = RecordedOpponentHandleOneReturnValue, - [CONTROLLER_ONERETURNVALUE_DUPLICATE] = RecordedOpponentHandleOneReturnValue_Duplicate, - [CONTROLLER_CLEARUNKVAR] = RecordedOpponentHandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = RecordedOpponentHandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = RecordedOpponentHandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = RecordedOpponentHandleToggleUnkFlag, - [CONTROLLER_HITANIMATION] = RecordedOpponentHandleHitAnimation, - [CONTROLLER_CANTSWITCH] = RecordedOpponentHandleCantSwitch, - [CONTROLLER_PLAYSE] = RecordedOpponentHandlePlaySE, - [CONTROLLER_PLAYFANFAREORBGM] = RecordedOpponentHandlePlayFanfareOrBGM, - [CONTROLLER_FAINTINGCRY] = RecordedOpponentHandleFaintingCry, - [CONTROLLER_INTROSLIDE] = RecordedOpponentHandleIntroSlide, - [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedOpponentHandleIntroTrainerBallThrow, - [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedOpponentHandleDrawPartyStatusSummary, - [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = RecordedOpponentHandleHidePartyStatusSummary, - [CONTROLLER_ENDBOUNCE] = RecordedOpponentHandleEndBounceEffect, - [CONTROLLER_SPRITEINVISIBILITY] = RecordedOpponentHandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = RecordedOpponentHandleBattleAnimation, - [CONTROLLER_LINKSTANDBYMSG] = RecordedOpponentHandleLinkStandbyMsg, - [CONTROLLER_RESETACTIONMOVESELECTION] = RecordedOpponentHandleResetActionMoveSelection, - [CONTROLLER_ENDLINKBATTLE] = RecordedOpponentHandleEndLinkBattle, - [CONTROLLER_TERMINATOR_NOP] = RecordedOpponentCmdEnd +static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = +{ + [CONTROLLER_GETMONDATA] = RecordedPlayerHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = RecordedPlayerHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = RecordedPlayerHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = RecordedPlayerHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = RecordedPlayerHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = RecordedPlayerHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = RecordedPlayerHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = RecordedPlayerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = RecordedPlayerHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = RecordedPlayerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = RecordedPlayerHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = RecordedPlayerHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = RecordedPlayerHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = RecordedPlayerHandleBallThrowAnim, + [CONTROLLER_PAUSE] = RecordedPlayerHandlePause, + [CONTROLLER_MOVEANIMATION] = RecordedPlayerHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = RecordedPlayerHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = RecordedPlayerHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = RecordedPlayerHandleChooseAction, + [CONTROLLER_YESNOBOX] = RecordedPlayerHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = RecordedPlayerHandleChooseMove, + [CONTROLLER_OPENBAG] = RecordedPlayerHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = RecordedPlayerHandleChoosePokemon, + [CONTROLLER_23] = RecordedPlayerHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = RecordedPlayerHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = RecordedPlayerHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = RecordedPlayerHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = RecordedPlayerHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = RecordedPlayerHandleStatusXor, + [CONTROLLER_DATATRANSFER] = RecordedPlayerHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = RecordedPlayerHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = RecordedPlayerHandlePlayBGM, + [CONTROLLER_32] = RecordedPlayerHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = RecordedPlayerHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = RecordedPlayerHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = RecordedPlayerHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = RecordedPlayerHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = RecordedPlayerHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = RecordedPlayerHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = RecordedPlayerHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = RecordedPlayerHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = RecordedPlayerHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = RecordedPlayerHandleCantSwitch, + [CONTROLLER_PLAYSE] = RecordedPlayerHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = RecordedPlayerHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = RecordedPlayerHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = RecordedPlayerHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedPlayerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedPlayerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = RecordedPlayerHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = RecordedPlayerHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = RecordedPlayerHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = RecordedPlayerHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = RecordedPlayerHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = RecordedPlayerHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = RecordedPlayerHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = RecordedPlayerCmdEnd }; -static void RecordedOpponentDummy(void) +static void RecordedPlayerDummy(void) { } -void SetControllerToRecordedOpponent(void) +void SetControllerToRecordedPlayer(void) { - gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentBufferRunCommand; + gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerBufferRunCommand; } -static void RecordedOpponentBufferRunCommand(void) +static void RecordedPlayerBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) - sRecordedOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) + sRecordedPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]](); else - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - RecordedOpponentBufferExecCompleted(); -} - -static void UNUSED CompleteOnBankSpriteCallbackDummy2(void) -{ - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - FreeTrainerFrontPicPalette(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam); + BattleGfxSfxDummy3(MALE); FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } } @@ -208,162 +197,150 @@ static void Intro_DelayAndEnd(void) if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } } static void Intro_WaitForShinyAnimAndHealthbox(void) { - bool8 healthboxAnimDone = FALSE; - - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) - { - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded) - healthboxAnimDone = TRUE; + bool32 healthboxAnimDone = FALSE; - } - else + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded - && gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gActiveBattler)]].animEnded) - healthboxAnimDone = TRUE; - } - - if (healthboxAnimDone) - { - if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) + if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + { + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + healthboxAnimDone = TRUE; + } + else { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) - return; - if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) - return; + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy) + { + healthboxAnimDone = TRUE; + } + } + if (healthboxAnimDone && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) + { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + + HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + if (IsDoubleBattle()) + HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], BATTLE_PARTNER(gActiveBattler)); + + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; + } + } + else + { + if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + { + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + healthboxAnimDone = TRUE; + } + else + { + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy) + { + healthboxAnimDone = TRUE; + } } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; - gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; + if (IsCryPlayingOrClearCrySongs()) + healthboxAnimDone = FALSE; + + if (healthboxAnimDone) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; + } } } static void Intro_TryShinyAnimShowHealthbox(void) { bool32 bgmRestored = FALSE; - bool32 battlerAnimsDone = FALSE; - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) + { + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) - TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); + if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) + TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); + } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL); StartHealthboxSlideIn(BATTLE_PARTNER(gActiveBattler)); SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]); } - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].waitForCry && !IsCryPlayingOrClearCrySongs()) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) + if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) + if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) m4aMPlayContinue(&gMPlayInfo_BGM); } else { m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); } + } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; bgmRestored = TRUE; } - if (!IsDoubleBattle()) - { - if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - { - battlerAnimsDone = TRUE; - } - } - else - { - if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gBattleControllerData[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy) - { - battlerAnimsDone = TRUE; - } - } - - if (bgmRestored && battlerAnimsDone) + if (bgmRestored && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { DestroySprite(&gSprites[gBattleControllerData[BATTLE_PARTNER(gActiveBattler)]]); - SetBattlerShadowSpriteCallback(BATTLE_PARTNER(gActiveBattler), GetMonData(&gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], MON_DATA_SPECIES)); - } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); - SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; - gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } -static void TryShinyAnimAfterMonAnim(void) +static void WaitForMonAnimAfterLoad(void) { - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) - { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) - { - TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - } - else - { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - RecordedOpponentBufferExecCompleted(); - } - } - } + if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) + RecordedPlayerBufferExecCompleted(); } static void CompleteOnHealthbarDone(void) @@ -373,17 +350,27 @@ static void CompleteOnHealthbarDone(void) SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) + { UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); + } else - RecordedOpponentBufferExecCompleted(); + { + HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + RecordedPlayerBufferExecCompleted(); + } } -static void HideHealthboxAfterMonFaint(void) +static void FreeMonSpriteAfterFaintAnim(void) { - if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) + if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT) { + u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); + + BattleGfxSfxDummy2(species); + FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); + DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } } @@ -393,16 +380,15 @@ static void FreeMonSpriteAfterSwitchOutAnim(void) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - HideBattlerShadowSprite(gActiveBattler); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } } static void CompleteOnInactiveTextPrinter(void) { if (!IsTextPrinterActive(B_WIN_MSG)) - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } static void DoHitAnimBlinkSpriteEffect(void) @@ -414,7 +400,7 @@ static void DoHitAnimBlinkSpriteEffect(void) gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } else { @@ -428,31 +414,26 @@ static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { + CopyBattleSpriteInvisibility(gActiveBattler); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_WaitAndEnd; } } -static void SwitchIn_HandleSoundAndEnd(void) +static void SwitchIn_WaitAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive - && !IsCryPlayingOrClearCrySongs()) + && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - || gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy_2) - { - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - RecordedOpponentBufferExecCompleted(); - } + RecordedPlayerBufferExecCompleted(); } } static void SwitchIn_ShowHealthbox(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim - && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; @@ -460,46 +441,36 @@ static void SwitchIn_ShowHealthbox(void) FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); + HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); - - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - CopyBattleSpriteInvisibility(gActiveBattler); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } static void SwitchIn_TryShinyAnim(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) - TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + { + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + } if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); - SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } -static void CompleteOnFinishedStatusAnimation(void) -{ - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) - RecordedOpponentBufferExecCompleted(); -} - -static void CompleteOnFinishedBattleAnimation(void) -{ - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) - RecordedOpponentBufferExecCompleted(); -} - -static void RecordedOpponentBufferExecCompleted(void) +static void RecordedPlayerBufferExecCompleted(void) { - gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentBufferRunCommand; + gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); @@ -513,7 +484,19 @@ static void RecordedOpponentBufferExecCompleted(void) } } -static void RecordedOpponentHandleGetMonData(void) +static void CompleteOnFinishedStatusAnimation(void) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) + RecordedPlayerBufferExecCompleted(); +} + +static void CompleteOnFinishedBattleAnimation(void) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) + RecordedPlayerBufferExecCompleted(); +} + +static void RecordedPlayerHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; @@ -522,7 +505,7 @@ static void RecordedOpponentHandleGetMonData(void) if (gBattleBufferA[gActiveBattler][2] == 0) { - size += CopyRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData); + size += CopyRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { @@ -530,15 +513,15 @@ static void RecordedOpponentHandleGetMonData(void) for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) - size += CopyRecordedOpponentMonData(i, monData + size); + size += CopyRecordedPlayerMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) +static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; @@ -551,50 +534,50 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: - battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); - battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); + battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); + battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; size++) { - battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); - battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); + battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); + battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } - battleMon.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); - battleMon.friendship = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); - battleMon.experience = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); - battleMon.hpIV = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); - battleMon.attackIV = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); - battleMon.defenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); - battleMon.speedIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); - battleMon.spAttackIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); - battleMon.spDefenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); - battleMon.personality = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); - battleMon.status1 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); - battleMon.level = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); - battleMon.hp = GetMonData(&gEnemyParty[monId], MON_DATA_HP); - battleMon.maxHP = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); - battleMon.attack = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); - battleMon.defense = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); - battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); - battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); - battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG); - battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM); - battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); - GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname); + battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); + battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); + battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); + battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); + battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); + battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); + battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); + battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); + battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); + battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); + battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); + battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); + battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP); + battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); + battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); + battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); + battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); + battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); + battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); + battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); + battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); + battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); + GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); - GetMonData(&gEnemyParty[monId], MON_DATA_OT_NAME, battleMon.otName); + GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); size++) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -602,10 +585,10 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) { - moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); + moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); } - moveData.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); + moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); size++) dst[size] = src[size]; @@ -614,121 +597,121 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) - dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); - dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); + dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); + dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); size++; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: - data32 = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); + data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: - data32 = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); + data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_EV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKERUS); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); - dst[1] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); - dst[2] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); - dst[3] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); - dst[4] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); - dst[5] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); + dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); + dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); + dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); + dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); + dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: - data32 = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); + data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; @@ -736,13 +719,13 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) size = 4; break; case REQUEST_CHECKSUM_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: - data32 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); + data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; @@ -750,93 +733,93 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) size = 4; break; case REQUEST_LEVEL_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HP); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); + data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SHEEN); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON); + dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON); size = 1; break; } @@ -844,19 +827,19 @@ static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) return size; } -static void RecordedOpponentHandleGetRawMonData(void) +static void RecordedPlayerHandleGetRawMonData(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleSetMonData(void) +static void RecordedPlayerHandleSetMonData(void) { u8 monToCheck; u8 i; if (gBattleBufferA[gActiveBattler][2] == 0) { - SetRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler]); + SetRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler]); } else { @@ -864,14 +847,14 @@ static void RecordedOpponentHandleSetMonData(void) for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) - SetRecordedOpponentMonData(i); + SetRecordedPlayerMonData(i); monToCheck >>= 1; } } - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void SetRecordedOpponentMonData(u8 monId) +static void SetRecordedPlayerMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; @@ -883,246 +866,247 @@ static void SetRecordedOpponentMonData(u8 monId) { u8 iv; - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species); - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); + SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); + SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; i++) { - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); + SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } - SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); - SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); - SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &battlePokemon->experience); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &iv); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &iv); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &iv); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &iv); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &iv); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &iv); - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &battlePokemon->status1); - SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &battlePokemon->level); - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &battlePokemon->hp); - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &battlePokemon->attack); - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &battlePokemon->defense); - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &battlePokemon->speed); - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv); + SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); + SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1); + SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level); + SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp); + SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) { - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); + SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); } - SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData16(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } + + HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); } -static void RecordedOpponentHandleSetRawMonData(void) +static void RecordedPlayerHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; u8 i; for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = gBattleBufferA[gActiveBattler][3 + i]; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleLoadMonSprite(void) +static void RecordedPlayerHandleLoadMonSprite(void) { - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); + u16 species; - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2), GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - - SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - - gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim; + gBattlerControllerFuncs[gActiveBattler] = WaitForMonAnimAfterLoad; } -static void RecordedOpponentHandleSwitchInAnim(void) +static void RecordedPlayerHandleSwitchInAnim(void) { + ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; + BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } @@ -1133,15 +1117,15 @@ static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); - gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + gBattlerSpriteIds[battlerId] = CreateSprite( + &gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battlerId), + GetBattlerSpriteSubpriority(battlerId)); gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; @@ -1155,10 +1139,10 @@ static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } -static void RecordedOpponentHandleReturnMonToBall(void) +static void RecordedPlayerHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { @@ -1169,9 +1153,8 @@ static void RecordedOpponentHandleReturnMonToBall(void) { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - HideBattlerShadowSprite(gActiveBattler); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } } @@ -1189,7 +1172,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON); + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; @@ -1198,78 +1181,99 @@ static void DoSwitchOutAnimation(void) #define sSpeedX data[0] -static void RecordedOpponentHandleDrawTrainerPic(void) +static void RecordedPlayerHandleDrawTrainerPic(void) { - s16 xPos; + s16 xPos, yPos; u32 trainerPicId; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + trainerPicId = GetActiveBattlerLinkPlayerGender(); + else + trainerPicId = gLinkPlayers[gRecordedBattleMultiplayerId].gender; + } + else + { + trainerPicId = gLinkPlayers[0].gender; + } + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon - xPos = 152; + xPos = 90; else // first mon - xPos = 200; + xPos = 32; - if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - if (gActiveBattler == 1) - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); - else - trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + xPos = 90; + yPos = (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 80; } else { - trainerPicId = PlayerGenderToFrontTrainerPicId(GetActiveBattlerLinkPlayerGender()); + yPos = (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80; } + } else { - xPos = 176; - if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) - { - trainerPicId = GetUnionRoomTrainerPic(); - } - else - { - trainerPicId = PlayerGenderToFrontTrainerPicId(gLinkPlayers[gRecordedBattleMultiplayerId ^ BIT_SIDE].gender); - } + xPos = 80; + yPos = (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80; } - DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, - xPos, - (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, - GetBattlerSpriteSubpriority(gActiveBattler)); - - gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; - gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + { + trainerPicId = PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender); + DecompressTrainerFrontPic(trainerPicId, gActiveBattler); + SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); + + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); + gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 = 48; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1; + } + else + { + DecompressTrainerBackPic(trainerPicId, gActiveBattler); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); + + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; + gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; + } gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } #undef sSpeedX -static void RecordedOpponentHandleTrainerSlide(void) +static void RecordedPlayerHandleTrainerSlide(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleTrainerSlideBack(void) +static void RecordedPlayerHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } -static void RecordedOpponentHandleFaintAnimation(void) +#define sSpeedX data[1] +#define sSpeedY data[2] + +static void RecordedPlayerHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) { @@ -1282,34 +1286,40 @@ static void RecordedOpponentHandleFaintAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; - gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint; + HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + PlaySE12WithPanning(SE_FAINT, -64); + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } -static void RecordedOpponentHandlePaletteFade(void) +#undef sSpeedX +#undef sSpeedY + +static void RecordedPlayerHandlePaletteFade(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleSuccessBallThrowAnim(void) +static void RecordedPlayerHandleSuccessBallThrowAnim(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleBallThrowAnim(void) +static void RecordedPlayerHandleBallThrowAnim(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandlePause(void) +static void RecordedPlayerHandlePause(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleMoveAnimation(void) +static void RecordedPlayerHandleMoveAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { @@ -1324,17 +1334,17 @@ static void RecordedOpponentHandleMoveAnimation(void) gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentDoMoveAnimation; + gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerDoMoveAnimation; } } } -static void RecordedOpponentDoMoveAnimation(void) +static void RecordedPlayerDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); u8 multihit = gBattleBufferA[gActiveBattler][11]; @@ -1377,13 +1387,13 @@ static void RecordedOpponentDoMoveAnimation(void) CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } break; } } -static void RecordedOpponentHandlePrintString(void) +static void RecordedPlayerHandlePrintString(void) { u16 *stringId; @@ -1395,23 +1405,39 @@ static void RecordedOpponentHandlePrintString(void) gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } -static void RecordedOpponentHandlePrintSelectionString(void) +static void RecordedPlayerHandlePrintSelectionString(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleChooseAction(void) +static void ChooseActionInBattlePalace(void) { - BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); - RecordedOpponentBufferExecCompleted(); + if (gBattleCommunication[4] >= gBattlersCount / 2) + { + BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + RecordedPlayerBufferExecCompleted(); + } +} + +static void RecordedPlayerHandleChooseAction(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) + { + gBattlerControllerFuncs[gActiveBattler] = ChooseActionInBattlePalace; + } + else + { + BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + RecordedPlayerBufferExecCompleted(); + } } -static void RecordedOpponentHandleYesNoBox(void) +static void RecordedPlayerHandleYesNoBox(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleChooseMove(void) +static void RecordedPlayerHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { @@ -1424,27 +1450,27 @@ static void RecordedOpponentHandleChooseMove(void) BtlController_EmitTwoReturnValues(BUFFER_B, 10, moveId | (target << 8)); } - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleChooseItem(void) +static void RecordedPlayerHandleChooseItem(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleChoosePokemon(void) +static void RecordedPlayerHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); BtlController_EmitChosenMonReturnValue(BUFFER_B, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleCmd23(void) +static void RecordedPlayerHandleCmd23(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleHealthBarUpdate(void) +static void RecordedPlayerHandleHealthBarUpdate(void) { s16 hpVal; @@ -1453,40 +1479,41 @@ static void RecordedOpponentHandleHealthBarUpdate(void) if (hpVal != INSTANT_HP_BAR_DROP) { - u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); + u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); + u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { - u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); + u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); + UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } -static void RecordedOpponentHandleExpUpdate(void) +static void RecordedPlayerHandleExpUpdate(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleStatusIconUpdate(void) +static void RecordedPlayerHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); battlerId = gActiveBattler; gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } -static void RecordedOpponentHandleStatusAnimation(void) +static void RecordedPlayerHandleStatusAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { @@ -1496,80 +1523,80 @@ static void RecordedOpponentHandleStatusAnimation(void) } } -static void RecordedOpponentHandleStatusXor(void) +static void RecordedPlayerHandleStatusXor(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleDataTransfer(void) +static void RecordedPlayerHandleDataTransfer(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleDMA3Transfer(void) +static void RecordedPlayerHandleDMA3Transfer(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandlePlayBGM(void) +static void RecordedPlayerHandlePlayBGM(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleCmd32(void) +static void RecordedPlayerHandleCmd32(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleTwoReturnValues(void) +static void RecordedPlayerHandleTwoReturnValues(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleChosenMonReturnValue(void) +static void RecordedPlayerHandleChosenMonReturnValue(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleOneReturnValue(void) +static void RecordedPlayerHandleOneReturnValue(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleOneReturnValue_Duplicate(void) +static void RecordedPlayerHandleOneReturnValue_Duplicate(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleClearUnkVar(void) +static void RecordedPlayerHandleClearUnkVar(void) { gUnusedControllerStruct.unk = 0; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleSetUnkVar(void) +static void RecordedPlayerHandleSetUnkVar(void) { gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleClearUnkFlag(void) +static void RecordedPlayerHandleClearUnkFlag(void) { gUnusedControllerStruct.flag = 0; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleToggleUnkFlag(void) +static void RecordedPlayerHandleToggleUnkFlag(void) { gUnusedControllerStruct.flag ^= 1; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleHitAnimation(void) +static void RecordedPlayerHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } else { @@ -1580,12 +1607,12 @@ static void RecordedOpponentHandleHitAnimation(void) } } -static void RecordedOpponentHandleCantSwitch(void) +static void RecordedPlayerHandleCantSwitch(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandlePlaySE(void) +static void RecordedPlayerHandlePlaySE(void) { s8 pan; @@ -1595,10 +1622,10 @@ static void RecordedOpponentHandlePlaySE(void) pan = SOUND_PAN_TARGET; PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandlePlayFanfareOrBGM(void) +static void RecordedPlayerHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBattler][3]) { @@ -1610,36 +1637,50 @@ static void RecordedOpponentHandlePlayFanfareOrBGM(void) PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); } - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleFaintingCry(void) +static void RecordedPlayerHandleFaintingCry(void) { - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); + u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - PlayCry_ByMode(species, 25, CRY_MODE_FAINT); - RecordedOpponentBufferExecCompleted(); + PlayCry_ByMode(species, -25, CRY_MODE_FAINT); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleIntroSlide(void) +static void RecordedPlayerHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleIntroTrainerBallThrow(void) +static void RecordedPlayerHandleIntroTrainerBallThrow(void) { + u8 paletteNum; u8 taskId; + u32 trainerPicId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; + + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); + + paletteNum = AllocSpritePalette(0xD6F9); + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender; + else + trainerPicId = gSaveBlock2Ptr->playerGender; + + LoadCompressedPalette(gTrainerBackPicPaletteTable[trainerPicId].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite); + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; @@ -1648,63 +1689,50 @@ static void RecordedOpponentHandleIntroTrainerBallThrow(void) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; - gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentDummy; + gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerDummy; } static void Task_StartSendOutAnim(u8 taskId) { - u8 savedActiveBank = gActiveBattler; - - gActiveBattler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + if (gTasks[taskId].data[1] < 24) { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - StartSendOutAnim(gActiveBattler, FALSE); + gTasks[taskId].data[1]++; } else { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - StartSendOutAnim(gActiveBattler, FALSE); - gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - StartSendOutAnim(gActiveBattler, FALSE); - gActiveBattler ^= BIT_FLANK; - } - gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; - gActiveBattler = savedActiveBank; - DestroyTask(taskId); -} + u8 savedActiveBank = gActiveBattler; -static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) -{ - FreeTrainerFrontPicPalette(sprite->oam.affineParam); - FreeSpriteOamMatrix(sprite); - DestroySprite(sprite); + gActiveBattler = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + StartSendOutAnim(gActiveBattler, FALSE); + } + else + { + gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + StartSendOutAnim(gActiveBattler, FALSE); + gActiveBattler ^= BIT_FLANK; + gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + StartSendOutAnim(gActiveBattler, FALSE); + gActiveBattler ^= BIT_FLANK; + } + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; + gActiveBattler = savedActiveBank; + DestroyTask(taskId); + } } -static void RecordedOpponentHandleDrawPartyStatusSummary(void) +static void RecordedPlayerHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; - - if (gBattleBufferA[gActiveBattler][2] != 0) - { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay < 2) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay++; - return; - } - else - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay = 0; - } - } - gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; @@ -1720,33 +1748,33 @@ static void EndDrawPartyStatusSummary(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } } -static void RecordedOpponentHandleHidePartyStatusSummary(void) +static void RecordedPlayerHandleHidePartyStatusSummary(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleEndBounceEffect(void) +static void RecordedPlayerHandleEndBounceEffect(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleSpriteInvisibility(void) +static void RecordedPlayerHandleSpriteInvisibility(void) { if (IsBattlerSpritePresent(gActiveBattler)) { gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; CopyBattleSpriteInvisibility(gActiveBattler); } - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleBattleAnimation(void) +static void RecordedPlayerHandleBattleAnimation(void) { if (!IsBattleSEPlaying(gActiveBattler)) { @@ -1754,35 +1782,31 @@ static void RecordedOpponentHandleBattleAnimation(void) u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); else gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } } -static void RecordedOpponentHandleLinkStandbyMsg(void) +static void RecordedPlayerHandleLinkStandbyMsg(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleResetActionMoveSelection(void) +static void RecordedPlayerHandleResetActionMoveSelection(void) { - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); } -static void RecordedOpponentHandleEndLinkBattle(void) +static void RecordedPlayerHandleEndLinkBattle(void) { - if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW) - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - else - gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; - + gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - RecordedOpponentBufferExecCompleted(); + RecordedPlayerBufferExecCompleted(); gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } -static void RecordedOpponentCmdEnd(void) +static void RecordedPlayerCmdEnd(void) { } From 8f34dedcb69b3b67133024480a628820ea23db8e Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:52:01 -0500 Subject: [PATCH 09/37] SetMonData --- src/battle_controller_recorded_opponent.c | 1318 +++++++++------------ 1 file changed, 538 insertions(+), 780 deletions(-) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 8921846161c1..685a05a4ed5d 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -1,20 +1,23 @@ #include "global.h" #include "battle.h" -#include "battle_ai_script_commands.h" #include "battle_anim.h" #include "battle_controllers.h" -#include "battle_message.h" #include "battle_interface.h" +#include "battle_message.h" +#include "battle_setup.h" +#include "battle_tv.h" #include "bg.h" #include "data.h" -#include "item_use.h" +#include "item.h" +#include "item_menu.h" #include "link.h" #include "main.h" #include "m4a.h" #include "palette.h" +#include "party_menu.h" #include "pokeball.h" #include "pokemon.h" -#include "recorded_battle.h" +#include "random.h" #include "reshow_battle_screen.h" #include "sound.h" #include "string_util.h" @@ -23,324 +26,320 @@ #include "util.h" #include "window.h" #include "constants/battle_anim.h" +#include "constants/items.h" +#include "constants/moves.h" #include "constants/songs.h" - -static void RecordedPlayerHandleGetMonData(void); -static void RecordedPlayerHandleGetRawMonData(void); -static void RecordedPlayerHandleSetMonData(void); -static void RecordedPlayerHandleSetRawMonData(void); -static void RecordedPlayerHandleLoadMonSprite(void); -static void RecordedPlayerHandleSwitchInAnim(void); -static void RecordedPlayerHandleReturnMonToBall(void); -static void RecordedPlayerHandleDrawTrainerPic(void); -static void RecordedPlayerHandleTrainerSlide(void); -static void RecordedPlayerHandleTrainerSlideBack(void); -static void RecordedPlayerHandleFaintAnimation(void); -static void RecordedPlayerHandlePaletteFade(void); -static void RecordedPlayerHandleSuccessBallThrowAnim(void); -static void RecordedPlayerHandleBallThrowAnim(void); -static void RecordedPlayerHandlePause(void); -static void RecordedPlayerHandleMoveAnimation(void); -static void RecordedPlayerHandlePrintString(void); -static void RecordedPlayerHandlePrintSelectionString(void); -static void RecordedPlayerHandleChooseAction(void); -static void RecordedPlayerHandleYesNoBox(void); -static void RecordedPlayerHandleChooseMove(void); -static void RecordedPlayerHandleChooseItem(void); -static void RecordedPlayerHandleChoosePokemon(void); -static void RecordedPlayerHandleCmd23(void); -static void RecordedPlayerHandleHealthBarUpdate(void); -static void RecordedPlayerHandleExpUpdate(void); -static void RecordedPlayerHandleStatusIconUpdate(void); -static void RecordedPlayerHandleStatusAnimation(void); -static void RecordedPlayerHandleStatusXor(void); -static void RecordedPlayerHandleDataTransfer(void); -static void RecordedPlayerHandleDMA3Transfer(void); -static void RecordedPlayerHandlePlayBGM(void); -static void RecordedPlayerHandleCmd32(void); -static void RecordedPlayerHandleTwoReturnValues(void); -static void RecordedPlayerHandleChosenMonReturnValue(void); -static void RecordedPlayerHandleOneReturnValue(void); -static void RecordedPlayerHandleOneReturnValue_Duplicate(void); -static void RecordedPlayerHandleClearUnkVar(void); -static void RecordedPlayerHandleSetUnkVar(void); -static void RecordedPlayerHandleClearUnkFlag(void); -static void RecordedPlayerHandleToggleUnkFlag(void); -static void RecordedPlayerHandleHitAnimation(void); -static void RecordedPlayerHandleCantSwitch(void); -static void RecordedPlayerHandlePlaySE(void); -static void RecordedPlayerHandlePlayFanfareOrBGM(void); -static void RecordedPlayerHandleFaintingCry(void); -static void RecordedPlayerHandleIntroSlide(void); -static void RecordedPlayerHandleIntroTrainerBallThrow(void); -static void RecordedPlayerHandleDrawPartyStatusSummary(void); -static void RecordedPlayerHandleHidePartyStatusSummary(void); -static void RecordedPlayerHandleEndBounceEffect(void); -static void RecordedPlayerHandleSpriteInvisibility(void); -static void RecordedPlayerHandleBattleAnimation(void); -static void RecordedPlayerHandleLinkStandbyMsg(void); -static void RecordedPlayerHandleResetActionMoveSelection(void); -static void RecordedPlayerHandleEndLinkBattle(void); -static void RecordedPlayerCmdEnd(void); - -static void RecordedPlayerBufferRunCommand(void); -static void RecordedPlayerBufferExecCompleted(void); -static void SwitchIn_WaitAndEnd(void); -static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst); -static void SetRecordedPlayerMonData(u8 monId); -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); -static void DoSwitchOutAnimation(void); -static void RecordedPlayerDoMoveAnimation(void); +#include "constants/trainers.h" +#include "constants/rgb.h" + +// this file's functions +static void WallyHandleGetMonData(void); +static void WallyHandleGetRawMonData(void); +static void WallyHandleSetMonData(void); +static void WallyHandleSetRawMonData(void); +static void WallyHandleLoadMonSprite(void); +static void WallyHandleSwitchInAnim(void); +static void WallyHandleReturnMonToBall(void); +static void WallyHandleDrawTrainerPic(void); +static void WallyHandleTrainerSlide(void); +static void WallyHandleTrainerSlideBack(void); +static void WallyHandleFaintAnimation(void); +static void WallyHandlePaletteFade(void); +static void WallyHandleSuccessBallThrowAnim(void); +static void WallyHandleBallThrowAnim(void); +static void WallyHandlePause(void); +static void WallyHandleMoveAnimation(void); +static void WallyHandlePrintString(void); +static void WallyHandlePrintSelectionString(void); +static void WallyHandleChooseAction(void); +static void WallyHandleYesNoBox(void); +static void WallyHandleChooseMove(void); +static void WallyHandleChooseItem(void); +static void WallyHandleChoosePokemon(void); +static void WallyHandleCmd23(void); +static void WallyHandleHealthBarUpdate(void); +static void WallyHandleExpUpdate(void); +static void WallyHandleStatusIconUpdate(void); +static void WallyHandleStatusAnimation(void); +static void WallyHandleStatusXor(void); +static void WallyHandleDataTransfer(void); +static void WallyHandleDMA3Transfer(void); +static void WallyHandlePlayBGM(void); +static void WallyHandleCmd32(void); +static void WallyHandleTwoReturnValues(void); +static void WallyHandleChosenMonReturnValue(void); +static void WallyHandleOneReturnValue(void); +static void WallyHandleOneReturnValue_Duplicate(void); +static void WallyHandleClearUnkVar(void); +static void WallyHandleSetUnkVar(void); +static void WallyHandleClearUnkFlag(void); +static void WallyHandleToggleUnkFlag(void); +static void WallyHandleHitAnimation(void); +static void WallyHandleCantSwitch(void); +static void WallyHandlePlaySE(void); +static void WallyHandlePlayFanfareOrBGM(void); +static void WallyHandleFaintingCry(void); +static void WallyHandleIntroSlide(void); +static void WallyHandleIntroTrainerBallThrow(void); +static void WallyHandleDrawPartyStatusSummary(void); +static void WallyHandleHidePartyStatusSummary(void); +static void WallyHandleEndBounceEffect(void); +static void WallyHandleSpriteInvisibility(void); +static void WallyHandleBattleAnimation(void); +static void WallyHandleLinkStandbyMsg(void); +static void WallyHandleResetActionMoveSelection(void); +static void WallyHandleEndLinkBattle(void); +static void WallyCmdEnd(void); + +static void WallyBufferRunCommand(void); +static void WallyBufferExecCompleted(void); +static void CompleteOnChosenItem(void); +static void Intro_WaitForShinyAnimAndHealthbox(void); +static u32 CopyWallyMonData(u8 monId, u8 *dst); +static void SetWallyMonData(u8 monId); +static void WallyDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); -static void EndDrawPartyStatusSummary(void); - -static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = -{ - [CONTROLLER_GETMONDATA] = RecordedPlayerHandleGetMonData, - [CONTROLLER_GETRAWMONDATA] = RecordedPlayerHandleGetRawMonData, - [CONTROLLER_SETMONDATA] = RecordedPlayerHandleSetMonData, - [CONTROLLER_SETRAWMONDATA] = RecordedPlayerHandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = RecordedPlayerHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = RecordedPlayerHandleSwitchInAnim, - [CONTROLLER_RETURNMONTOBALL] = RecordedPlayerHandleReturnMonToBall, - [CONTROLLER_DRAWTRAINERPIC] = RecordedPlayerHandleDrawTrainerPic, - [CONTROLLER_TRAINERSLIDE] = RecordedPlayerHandleTrainerSlide, - [CONTROLLER_TRAINERSLIDEBACK] = RecordedPlayerHandleTrainerSlideBack, - [CONTROLLER_FAINTANIMATION] = RecordedPlayerHandleFaintAnimation, - [CONTROLLER_PALETTEFADE] = RecordedPlayerHandlePaletteFade, - [CONTROLLER_SUCCESSBALLTHROWANIM] = RecordedPlayerHandleSuccessBallThrowAnim, - [CONTROLLER_BALLTHROWANIM] = RecordedPlayerHandleBallThrowAnim, - [CONTROLLER_PAUSE] = RecordedPlayerHandlePause, - [CONTROLLER_MOVEANIMATION] = RecordedPlayerHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = RecordedPlayerHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = RecordedPlayerHandlePrintSelectionString, - [CONTROLLER_CHOOSEACTION] = RecordedPlayerHandleChooseAction, - [CONTROLLER_YESNOBOX] = RecordedPlayerHandleYesNoBox, - [CONTROLLER_CHOOSEMOVE] = RecordedPlayerHandleChooseMove, - [CONTROLLER_OPENBAG] = RecordedPlayerHandleChooseItem, - [CONTROLLER_CHOOSEPOKEMON] = RecordedPlayerHandleChoosePokemon, - [CONTROLLER_23] = RecordedPlayerHandleCmd23, - [CONTROLLER_HEALTHBARUPDATE] = RecordedPlayerHandleHealthBarUpdate, - [CONTROLLER_EXPUPDATE] = RecordedPlayerHandleExpUpdate, - [CONTROLLER_STATUSICONUPDATE] = RecordedPlayerHandleStatusIconUpdate, - [CONTROLLER_STATUSANIMATION] = RecordedPlayerHandleStatusAnimation, - [CONTROLLER_STATUSXOR] = RecordedPlayerHandleStatusXor, - [CONTROLLER_DATATRANSFER] = RecordedPlayerHandleDataTransfer, - [CONTROLLER_DMA3TRANSFER] = RecordedPlayerHandleDMA3Transfer, - [CONTROLLER_PLAYBGM] = RecordedPlayerHandlePlayBGM, - [CONTROLLER_32] = RecordedPlayerHandleCmd32, - [CONTROLLER_TWORETURNVALUES] = RecordedPlayerHandleTwoReturnValues, - [CONTROLLER_CHOSENMONRETURNVALUE] = RecordedPlayerHandleChosenMonReturnValue, - [CONTROLLER_ONERETURNVALUE] = RecordedPlayerHandleOneReturnValue, - [CONTROLLER_ONERETURNVALUE_DUPLICATE] = RecordedPlayerHandleOneReturnValue_Duplicate, - [CONTROLLER_CLEARUNKVAR] = RecordedPlayerHandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = RecordedPlayerHandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = RecordedPlayerHandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = RecordedPlayerHandleToggleUnkFlag, - [CONTROLLER_HITANIMATION] = RecordedPlayerHandleHitAnimation, - [CONTROLLER_CANTSWITCH] = RecordedPlayerHandleCantSwitch, - [CONTROLLER_PLAYSE] = RecordedPlayerHandlePlaySE, - [CONTROLLER_PLAYFANFAREORBGM] = RecordedPlayerHandlePlayFanfareOrBGM, - [CONTROLLER_FAINTINGCRY] = RecordedPlayerHandleFaintingCry, - [CONTROLLER_INTROSLIDE] = RecordedPlayerHandleIntroSlide, - [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedPlayerHandleIntroTrainerBallThrow, - [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedPlayerHandleDrawPartyStatusSummary, - [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = RecordedPlayerHandleHidePartyStatusSummary, - [CONTROLLER_ENDBOUNCE] = RecordedPlayerHandleEndBounceEffect, - [CONTROLLER_SPRITEINVISIBILITY] = RecordedPlayerHandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = RecordedPlayerHandleBattleAnimation, - [CONTROLLER_LINKSTANDBYMSG] = RecordedPlayerHandleLinkStandbyMsg, - [CONTROLLER_RESETACTIONMOVESELECTION] = RecordedPlayerHandleResetActionMoveSelection, - [CONTROLLER_ENDLINKBATTLE] = RecordedPlayerHandleEndLinkBattle, - [CONTROLLER_TERMINATOR_NOP] = RecordedPlayerCmdEnd + +static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = +{ + [CONTROLLER_GETMONDATA] = WallyHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = WallyHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = WallyHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = WallyHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = WallyHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = WallyHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = WallyHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = WallyHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = WallyHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = WallyHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = WallyHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = WallyHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = WallyHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = WallyHandleBallThrowAnim, + [CONTROLLER_PAUSE] = WallyHandlePause, + [CONTROLLER_MOVEANIMATION] = WallyHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = WallyHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = WallyHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = WallyHandleChooseAction, + [CONTROLLER_YESNOBOX] = WallyHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = WallyHandleChooseMove, + [CONTROLLER_OPENBAG] = WallyHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = WallyHandleChoosePokemon, + [CONTROLLER_23] = WallyHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = WallyHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = WallyHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = WallyHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = WallyHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = WallyHandleStatusXor, + [CONTROLLER_DATATRANSFER] = WallyHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = WallyHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = WallyHandlePlayBGM, + [CONTROLLER_32] = WallyHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = WallyHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = WallyHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = WallyHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = WallyHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = WallyHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = WallyHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = WallyHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = WallyHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = WallyHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = WallyHandleCantSwitch, + [CONTROLLER_PLAYSE] = WallyHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = WallyHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = WallyHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = WallyHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = WallyHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = WallyHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = WallyHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = WallyHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = WallyHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = WallyHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = WallyHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = WallyHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = WallyHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = WallyCmdEnd }; -static void RecordedPlayerDummy(void) +static void UNUSED SpriteCB_Null7(void) { } -void SetControllerToRecordedPlayer(void) +void SetControllerToWally(void) { - gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerBufferRunCommand; + gBattlerControllerFuncs[gActiveBattler] = WallyBufferRunCommand; + gBattleStruct->wallyBattleState = 0; + gBattleStruct->wallyMovesState = 0; + gBattleStruct->wallyWaitFrames = 0; + gBattleStruct->wallyMoveFrames = 0; } -static void RecordedPlayerBufferRunCommand(void) +static void WallyBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) - sRecordedPlayerBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sWallyBufferCommands)) + sWallyBufferCommands[gBattleBufferA[gActiveBattler][0]](); else - RecordedPlayerBufferExecCompleted(); - } -} - -static void CompleteOnBattlerSpriteCallbackDummy(void) -{ - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - RecordedPlayerBufferExecCompleted(); -} - -static void FreeTrainerSpriteAfterSlide(void) -{ - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - { - BattleGfxSfxDummy3(MALE); - FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - RecordedPlayerBufferExecCompleted(); - } -} - -static void Intro_DelayAndEnd(void) -{ - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } } -static void Intro_WaitForShinyAnimAndHealthbox(void) +static void WallyHandleActions(void) { - bool32 healthboxAnimDone = FALSE; - - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) + switch (gBattleStruct->wallyBattleState) { - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + case 0: + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; + gBattleStruct->wallyBattleState++; + case 1: + if (--gBattleStruct->wallyWaitFrames == 0) { - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - healthboxAnimDone = TRUE; + PlaySE(SE_SELECT); + BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, 0); + WallyBufferExecCompleted(); + gBattleStruct->wallyBattleState++; + gBattleStruct->wallyMovesState = 0; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; } - else + break; + case 2: + if (--gBattleStruct->wallyWaitFrames == 0) { - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy) - { - healthboxAnimDone = TRUE; - } + PlaySE(SE_SELECT); + BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, 0); + WallyBufferExecCompleted(); + gBattleStruct->wallyBattleState++; + gBattleStruct->wallyMovesState = 0; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; } - - if (healthboxAnimDone && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim - && gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) + break; + case 3: + if (--gBattleStruct->wallyWaitFrames == 0) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - - gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - if (IsDoubleBattle()) - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], BATTLE_PARTNER(gActiveBattler)); - - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; - gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; + BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_WALLY_THROW, 0); + WallyBufferExecCompleted(); + gBattleStruct->wallyBattleState++; + gBattleStruct->wallyMovesState = 0; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; } - } - else - { - if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + break; + case 4: + if (--gBattleStruct->wallyWaitFrames == 0) { - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - healthboxAnimDone = TRUE; + PlaySE(SE_SELECT); + ActionSelectionDestroyCursorAt(0); + ActionSelectionCreateCursorAt(1, 0); + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; + gBattleStruct->wallyBattleState++; } - else + break; + case 5: + if (--gBattleStruct->wallyWaitFrames == 0) { - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy) - { - healthboxAnimDone = TRUE; - } + PlaySE(SE_SELECT); + BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_ITEM, 0); + WallyBufferExecCompleted(); } + break; + } +} - if (IsCryPlayingOrClearCrySongs()) - healthboxAnimDone = FALSE; +static void CompleteOnBattlerSpriteCallbackDummy(void) +{ + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + WallyBufferExecCompleted(); +} - if (healthboxAnimDone) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; - gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; - } - } +static void CompleteOnInactiveTextPrinter(void) +{ + if (!IsTextPrinterActive(B_WIN_MSG)) + WallyBufferExecCompleted(); } -static void Intro_TryShinyAnimShowHealthbox(void) +static void CompleteOnFinishedAnimation(void) { - bool32 bgmRestored = FALSE; + if (!gDoingBattleAnim) + WallyBufferExecCompleted(); +} - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) +static void OpenBagAfterPaletteFade(void) +{ + if (!gPaletteFade.active) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - - if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) - TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); + gBattlerControllerFuncs[gActiveBattler] = CompleteOnChosenItem; + ReshowBattleScreenDummy(); + FreeAllWindowBuffers(); + DoWallyTutorialBagMenu(); } +} - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) +static void CompleteOnChosenItem(void) +{ + if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) - { - if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL); - StartHealthboxSlideIn(BATTLE_PARTNER(gActiveBattler)); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]); - } - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - StartHealthboxSlideIn(gActiveBattler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; + BtlController_EmitOneReturnValue(BUFFER_B, gSpecialVar_ItemId); + WallyBufferExecCompleted(); } +} - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].waitForCry - && !IsCryPlayingOrClearCrySongs()) - { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) - { - if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) - m4aMPlayContinue(&gMPlayInfo_BGM); - } - else - { - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - } +static void Intro_TryShinyAnimShowHealthbox(void) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; - bgmRestored = TRUE; - } + if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) + TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); - if (bgmRestored && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive + && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { DestroySprite(&gSprites[gBattleControllerData[BATTLE_PARTNER(gActiveBattler)]]); - + UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL); + StartHealthboxSlideIn(BATTLE_PARTNER(gActiveBattler)); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]); + } DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); + StartHealthboxSlideIn(gActiveBattler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } + } -static void WaitForMonAnimAfterLoad(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) - RecordedPlayerBufferExecCompleted(); + bool32 healthboxAnimDone = FALSE; + + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + healthboxAnimDone = TRUE; + + if (healthboxAnimDone && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + + gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim = FALSE; + + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); + HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + + WallyBufferExecCompleted(); + } } static void CompleteOnHealthbarDone(void) @@ -356,41 +355,10 @@ static void CompleteOnHealthbarDone(void) else { HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - RecordedPlayerBufferExecCompleted(); - } -} - -static void FreeMonSpriteAfterFaintAnim(void) -{ - if (gSprites[gBattlerSpriteIds[gActiveBattler]].y + gSprites[gBattlerSpriteIds[gActiveBattler]].y2 > DISPLAY_HEIGHT) - { - u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - - BattleGfxSfxDummy2(species); - FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); - DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } } -static void FreeMonSpriteAfterSwitchOutAnim(void) -{ - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) - { - FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - RecordedPlayerBufferExecCompleted(); - } -} - -static void CompleteOnInactiveTextPrinter(void) -{ - if (!IsTextPrinterActive(B_WIN_MSG)) - RecordedPlayerBufferExecCompleted(); -} - static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; @@ -400,7 +368,7 @@ static void DoHitAnimBlinkSpriteEffect(void) gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } else { @@ -410,67 +378,32 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void SwitchIn_ShowSubstitute(void) -{ - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - { - CopyBattleSpriteInvisibility(gActiveBattler); - if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - - gBattlerControllerFuncs[gActiveBattler] = SwitchIn_WaitAndEnd; - } -} - -static void SwitchIn_WaitAndEnd(void) +static void DoSwitchOutAnimation(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive - && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - RecordedPlayerBufferExecCompleted(); + FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); + WallyBufferExecCompleted(); } } -static void SwitchIn_ShowHealthbox(void) +static void CompleteOnBankSpriteCallbackDummy2(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - StartHealthboxSlideIn(gActiveBattler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - - gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; - } + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + WallyBufferExecCompleted(); } -static void SwitchIn_TryShinyAnim(void) +static void CompleteOnFinishedBattleAnimation(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - { - TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - } - - if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - { - DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); - gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; - } + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) + WallyBufferExecCompleted(); } -static void RecordedPlayerBufferExecCompleted(void) +static void WallyBufferExecCompleted(void) { - gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerBufferRunCommand; + gBattlerControllerFuncs[gActiveBattler] = WallyBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); @@ -484,19 +417,13 @@ static void RecordedPlayerBufferExecCompleted(void) } } -static void CompleteOnFinishedStatusAnimation(void) +static void UNUSED CompleteOnFinishedStatusAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void CompleteOnFinishedBattleAnimation(void) -{ - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) - RecordedPlayerBufferExecCompleted(); -} - -static void RecordedPlayerHandleGetMonData(void) +static void WallyHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; @@ -505,7 +432,7 @@ static void RecordedPlayerHandleGetMonData(void) if (gBattleBufferA[gActiveBattler][2] == 0) { - size += CopyRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler], monData); + size += CopyWallyMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { @@ -513,15 +440,15 @@ static void RecordedPlayerHandleGetMonData(void) for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) - size += CopyRecordedPlayerMonData(i, monData + size); + size += CopyWallyMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) +static u32 CopyWallyMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; @@ -827,19 +754,19 @@ static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst) return size; } -static void RecordedPlayerHandleGetRawMonData(void) +static void WallyHandleGetRawMonData(void) { - RecordedPlayerBufferExecCompleted(); + PlayerHandleGetRawMonData(); } -static void RecordedPlayerHandleSetMonData(void) +static void WallyHandleSetMonData(void) { u8 monToCheck; u8 i; if (gBattleBufferA[gActiveBattler][2] == 0) { - SetRecordedPlayerMonData(gBattlerPartyIndexes[gActiveBattler]); + SetWallyMonData(gBattlerPartyIndexes[gActiveBattler]); } else { @@ -847,14 +774,14 @@ static void RecordedPlayerHandleSetMonData(void) for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) - SetRecordedPlayerMonData(i); + SetWallyMonData(i); monToCheck >>= 1; } } - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void SetRecordedPlayerMonData(u8 monId) +static void SetWallyMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; @@ -1072,81 +999,26 @@ static void SetRecordedPlayerMonData(u8 monId) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); } -static void RecordedPlayerHandleSetRawMonData(void) +static void WallyHandleSetRawMonData(void) { - u8 *dst = (u8 *)&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; - u8 i; - - for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) - dst[i] = gBattleBufferA[gActiveBattler][3 + i]; - - RecordedPlayerBufferExecCompleted(); -} - -static void RecordedPlayerHandleLoadMonSprite(void) -{ - u16 species; - - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); - - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(gActiveBattler), - GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = WaitForMonAnimAfterLoad; + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleSwitchInAnim(void) +static void WallyHandleLoadMonSprite(void) { - ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; + WallyBufferExecCompleted(); } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void WallyHandleSwitchInAnim(void) { - u16 species; - - ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); - SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); - - gBattlerSpriteIds[battlerId] = CreateSprite( - &gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); - - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; - - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; - - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); - - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleReturnMonToBall(void) +static void WallyHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else @@ -1154,208 +1026,114 @@ static void RecordedPlayerHandleReturnMonToBall(void) FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - RecordedPlayerBufferExecCompleted(); - } -} - -static void DoSwitchOutAnimation(void) -{ - switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) - { - case 0: - if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); - - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; - break; - case 1: - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); - gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; - } - break; + WallyBufferExecCompleted(); } } #define sSpeedX data[0] -static void RecordedPlayerHandleDrawTrainerPic(void) +static void WallyHandleDrawTrainerPic(void) { - s16 xPos, yPos; - u32 trainerPicId; - - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - { - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - trainerPicId = GetActiveBattlerLinkPlayerGender(); - else - trainerPicId = gLinkPlayers[gRecordedBattleMultiplayerId].gender; - } - else - { - trainerPicId = gLinkPlayers[0].gender; - } - - if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { - if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon - xPos = 90; - else // first mon - xPos = 32; - - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - { - xPos = 90; - yPos = (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 80; - } - else - { - yPos = (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80; - } - - } - else - { - xPos = 80; - yPos = (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80; - } - - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - { - trainerPicId = PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender); - DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); - - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); - gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; - gSprites[gBattlerSpriteIds[gActiveBattler]].y2 = 48; - gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = ST_OAM_AFFINE_OFF; - gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1; - } - else - { - DecompressTrainerBackPic(trainerPicId, gActiveBattler); - SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); - - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; - gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; - } - + DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler); + SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, + 80, + 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].size), + 30); + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; + gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } -#undef sSpeedX - -static void RecordedPlayerHandleTrainerSlide(void) +static void WallyHandleTrainerSlide(void) { - RecordedPlayerBufferExecCompleted(); + DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler); + SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, + 80, + 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].size), + 30); + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; + gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; } -static void RecordedPlayerHandleTrainerSlideBack(void) +#undef sSpeedX + +static void WallyHandleTrainerSlideBack(void) { - SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; + WallyBufferExecCompleted(); } -#define sSpeedX data[1] -#define sSpeedY data[2] - -static void RecordedPlayerHandleFaintAnimation(void) +static void WallyHandleFaintAnimation(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) - { - if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++; - } - else - { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - PlaySE12WithPanning(SE_FAINT, -64); - gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0; - gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; - gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; - } - } + WallyBufferExecCompleted(); } -#undef sSpeedX -#undef sSpeedY - -static void RecordedPlayerHandlePaletteFade(void) +static void WallyHandlePaletteFade(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleSuccessBallThrowAnim(void) +static void WallyHandleSuccessBallThrowAnim(void) { - RecordedPlayerBufferExecCompleted(); + gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; + gDoingBattleAnim = TRUE; + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); + gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation; } -static void RecordedPlayerHandleBallThrowAnim(void) +static void WallyHandleBallThrowAnim(void) { - RecordedPlayerBufferExecCompleted(); + u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; + + gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; + gDoingBattleAnim = TRUE; + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); + gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation; } -static void RecordedPlayerHandlePause(void) +static void WallyHandlePause(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleMoveAnimation(void) +static void WallyHandleMoveAnimation(void) { - if (!IsBattleSEPlaying(gActiveBattler)) + u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + + gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; + gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleBufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; + if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; - gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE - { - RecordedPlayerBufferExecCompleted(); - } - else - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerDoMoveAnimation; - } + WallyBufferExecCompleted(); + } + else + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; + gBattlerControllerFuncs[gActiveBattler] = WallyDoMoveAnimation; } + } -static void RecordedPlayerDoMoveAnimation(void) +static void WallyDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); - u8 multihit = gBattleBufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: - if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute - && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8) + if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) { - gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; @@ -1373,10 +1151,9 @@ static void RecordedPlayerDoMoveAnimation(void) if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); - if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) + if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } @@ -1387,13 +1164,13 @@ static void RecordedPlayerDoMoveAnimation(void) CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } break; } } -static void RecordedPlayerHandlePrintString(void) +static void WallyHandlePrintString(void) { u16 *stringId; @@ -1405,72 +1182,90 @@ static void RecordedPlayerHandlePrintString(void) gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } -static void RecordedPlayerHandlePrintSelectionString(void) +static void WallyHandlePrintSelectionString(void) { - RecordedPlayerBufferExecCompleted(); + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + WallyHandlePrintString(); + else + WallyBufferExecCompleted(); } -static void ChooseActionInBattlePalace(void) +static void HandleChooseActionAfterDma3(void) { - if (gBattleCommunication[4] >= gBattlersCount / 2) + if (!IsDma3ManagerBusyWithBgCopy()) { - BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); - RecordedPlayerBufferExecCompleted(); + gBattle_BG0_X = 0; + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattlerControllerFuncs[gActiveBattler] = WallyHandleActions; } } -static void RecordedPlayerHandleChooseAction(void) +static void WallyHandleChooseAction(void) { - if (gBattleTypeFlags & BATTLE_TYPE_PALACE) - { - gBattlerControllerFuncs[gActiveBattler] = ChooseActionInBattlePalace; - } - else - { - BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); - RecordedPlayerBufferExecCompleted(); - } + s32 i; + + gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; + BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU); + + for (i = 0; i < 4; i++) + ActionSelectionDestroyCursorAt(i); + + ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); + BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillWallyDo); + BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT); } -static void RecordedPlayerHandleYesNoBox(void) +static void WallyHandleYesNoBox(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleChooseMove(void) +static void WallyHandleChooseMove(void) { - if (gBattleTypeFlags & BATTLE_TYPE_PALACE) - { - BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace()); - } - else + switch (gBattleStruct->wallyMovesState) { - u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); - u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BUFFER_B, 10, moveId | (target << 8)); + case 0: + InitMoveSelectionsVarsAndStrings(); + gBattleStruct->wallyMovesState++; + gBattleStruct->wallyMoveFrames = 80; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + gBattle_BG0_X = 0; + gBattle_BG0_Y = DISPLAY_HEIGHT * 2; + gBattleStruct->wallyMovesState++; + } + break; + case 2: + if (--gBattleStruct->wallyMoveFrames == 0) + { + PlaySE(SE_SELECT); + BtlController_EmitTwoReturnValues(BUFFER_B, 10, 0x100); + WallyBufferExecCompleted(); + } + break; } - - RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleChooseItem(void) +static void WallyHandleChooseItem(void) { - RecordedPlayerBufferExecCompleted(); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + gBattlerControllerFuncs[gActiveBattler] = OpenBagAfterPaletteFade; + gBattlerInMenuId = gActiveBattler; } -static void RecordedPlayerHandleChoosePokemon(void) +static void WallyHandleChoosePokemon(void) { - *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BUFFER_B, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleCmd23(void) +static void WallyHandleCmd23(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleHealthBarUpdate(void) +static void WallyHandleHealthBarUpdate(void) { s16 hpVal; @@ -1495,108 +1290,91 @@ static void RecordedPlayerHandleHealthBarUpdate(void) gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } -static void RecordedPlayerHandleExpUpdate(void) +static void WallyHandleExpUpdate(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleStatusIconUpdate(void) +static void WallyHandleStatusIconUpdate(void) { - if (!IsBattleSEPlaying(gActiveBattler)) - { - u8 battlerId; - - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; - } + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleStatusAnimation(void) +static void WallyHandleStatusAnimation(void) { - if (!IsBattleSEPlaying(gActiveBattler)) - { - InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], - gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); - gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; - } + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleStatusXor(void) +static void WallyHandleStatusXor(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleDataTransfer(void) +static void WallyHandleDataTransfer(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleDMA3Transfer(void) +static void WallyHandleDMA3Transfer(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandlePlayBGM(void) +static void WallyHandlePlayBGM(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleCmd32(void) +static void WallyHandleCmd32(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleTwoReturnValues(void) +static void WallyHandleTwoReturnValues(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleChosenMonReturnValue(void) +static void WallyHandleChosenMonReturnValue(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleOneReturnValue(void) +static void WallyHandleOneReturnValue(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleOneReturnValue_Duplicate(void) +static void WallyHandleOneReturnValue_Duplicate(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleClearUnkVar(void) +static void WallyHandleClearUnkVar(void) { - gUnusedControllerStruct.unk = 0; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleSetUnkVar(void) +static void WallyHandleSetUnkVar(void) { - gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleClearUnkFlag(void) +static void WallyHandleClearUnkFlag(void) { - gUnusedControllerStruct.flag = 0; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleToggleUnkFlag(void) +static void WallyHandleToggleUnkFlag(void) { - gUnusedControllerStruct.flag ^= 1; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleHitAnimation(void) +static void WallyHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } else { @@ -1607,25 +1385,18 @@ static void RecordedPlayerHandleHitAnimation(void) } } -static void RecordedPlayerHandleCantSwitch(void) +static void WallyHandleCantSwitch(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandlePlaySE(void) +static void WallyHandlePlaySE(void) { - s8 pan; - - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - pan = SOUND_PAN_ATTACKER; - else - pan = SOUND_PAN_TARGET; - - PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); - RecordedPlayerBufferExecCompleted(); + PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandlePlayFanfareOrBGM(void) +static void WallyHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBattler][3]) { @@ -1637,29 +1408,30 @@ static void RecordedPlayerHandlePlayFanfareOrBGM(void) PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); } - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleFaintingCry(void) +static void WallyHandleFaintingCry(void) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - PlayCry_ByMode(species, -25, CRY_MODE_FAINT); - RecordedPlayerBufferExecCompleted(); + // Seems that it doesn't bother using CRY_MODE_FAINT because + // Wally's Pokémon during the tutorial is never intended to faint. + PlayCry_Normal(species, 25); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleIntroSlide(void) +static void WallyHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleIntroTrainerBallThrow(void) +static void WallyHandleIntroTrainerBallThrow(void) { u8 paletteNum; u8 taskId; - u32 trainerPicId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); @@ -1672,14 +1444,8 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void) StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); - paletteNum = AllocSpritePalette(0xD6F9); - if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) - trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender; - else - trainerPicId = gSaveBlock2Ptr->playerGender; - - LoadCompressedPalette(gTrainerBackPicPaletteTable[trainerPicId].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); - + paletteNum = AllocSpritePalette(0xD6F8); + LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_WALLY].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; taskId = CreateTask(Task_StartSendOutAnim, 5); @@ -1689,12 +1455,39 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; - gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerDummy; + gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; +} + +static void StartSendOutAnim(u8 battlerId) +{ + u16 species; + + gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = 0; + gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); + gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battlerId), + GetBattlerSpriteSubpriority(battlerId)); + + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + + gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; + gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; + gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void Task_StartSendOutAnim(u8 taskId) { - if (gTasks[taskId].data[1] < 24) + if (gTasks[taskId].data[1] < 31) { gTasks[taskId].data[1]++; } @@ -1703,110 +1496,75 @@ static void Task_StartSendOutAnim(u8 taskId) u8 savedActiveBank = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - StartSendOutAnim(gActiveBattler, FALSE); - } - else - { - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - StartSendOutAnim(gActiveBattler, FALSE); - gActiveBattler ^= BIT_FLANK; - gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - StartSendOutAnim(gActiveBattler, FALSE); - gActiveBattler ^= BIT_FLANK; - } + gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + StartSendOutAnim(gActiveBattler); gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } } -static void RecordedPlayerHandleDrawPartyStatusSummary(void) +static void WallyHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; - - if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - - gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; + WallyBufferExecCompleted(); } } -static void EndDrawPartyStatusSummary(void) +static void WallyHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) - { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; - RecordedPlayerBufferExecCompleted(); - } + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleHidePartyStatusSummary(void) +static void WallyHandleEndBounceEffect(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleEndBounceEffect(void) +static void WallyHandleSpriteInvisibility(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleSpriteInvisibility(void) +static void WallyHandleBattleAnimation(void) { - if (IsBattlerSpritePresent(gActiveBattler)) - { - gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; - CopyBattleSpriteInvisibility(gActiveBattler); - } - RecordedPlayerBufferExecCompleted(); -} + u8 animationId = gBattleBufferA[gActiveBattler][1]; + u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); -static void RecordedPlayerHandleBattleAnimation(void) -{ - if (!IsBattleSEPlaying(gActiveBattler)) - { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - - if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) - RecordedPlayerBufferExecCompleted(); - else - gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; - } + if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) + WallyBufferExecCompleted(); + else + gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; } -static void RecordedPlayerHandleLinkStandbyMsg(void) +static void WallyHandleLinkStandbyMsg(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleResetActionMoveSelection(void) +static void WallyHandleResetActionMoveSelection(void) { - RecordedPlayerBufferExecCompleted(); + WallyBufferExecCompleted(); } -static void RecordedPlayerHandleEndLinkBattle(void) +static void WallyHandleEndLinkBattle(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); - RecordedPlayerBufferExecCompleted(); - gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; + WallyBufferExecCompleted(); + + if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK) + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } -static void RecordedPlayerCmdEnd(void) +static void WallyCmdEnd(void) { } From aca28d8b411c2db1e7c11d51b3f7fb7fef6861cb Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:55:08 -0500 Subject: [PATCH 10/37] Update battle_controller_recorded_opponent.c --- src/battle_controller_recorded_opponent.c | 1665 ++++++++++++--------- 1 file changed, 942 insertions(+), 723 deletions(-) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 685a05a4ed5d..4daa2bf0e557 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -1,23 +1,23 @@ #include "global.h" #include "battle.h" +#include "battle_ai_script_commands.h" #include "battle_anim.h" #include "battle_controllers.h" #include "battle_interface.h" #include "battle_message.h" #include "battle_setup.h" +#include "battle_tower.h" #include "battle_tv.h" #include "bg.h" #include "data.h" -#include "item.h" -#include "item_menu.h" +#include "item_use.h" #include "link.h" #include "main.h" #include "m4a.h" #include "palette.h" -#include "party_menu.h" #include "pokeball.h" #include "pokemon.h" -#include "random.h" +#include "recorded_battle.h" #include "reshow_battle_screen.h" #include "sound.h" #include "string_util.h" @@ -26,319 +26,343 @@ #include "util.h" #include "window.h" #include "constants/battle_anim.h" -#include "constants/items.h" -#include "constants/moves.h" #include "constants/songs.h" #include "constants/trainers.h" -#include "constants/rgb.h" - -// this file's functions -static void WallyHandleGetMonData(void); -static void WallyHandleGetRawMonData(void); -static void WallyHandleSetMonData(void); -static void WallyHandleSetRawMonData(void); -static void WallyHandleLoadMonSprite(void); -static void WallyHandleSwitchInAnim(void); -static void WallyHandleReturnMonToBall(void); -static void WallyHandleDrawTrainerPic(void); -static void WallyHandleTrainerSlide(void); -static void WallyHandleTrainerSlideBack(void); -static void WallyHandleFaintAnimation(void); -static void WallyHandlePaletteFade(void); -static void WallyHandleSuccessBallThrowAnim(void); -static void WallyHandleBallThrowAnim(void); -static void WallyHandlePause(void); -static void WallyHandleMoveAnimation(void); -static void WallyHandlePrintString(void); -static void WallyHandlePrintSelectionString(void); -static void WallyHandleChooseAction(void); -static void WallyHandleYesNoBox(void); -static void WallyHandleChooseMove(void); -static void WallyHandleChooseItem(void); -static void WallyHandleChoosePokemon(void); -static void WallyHandleCmd23(void); -static void WallyHandleHealthBarUpdate(void); -static void WallyHandleExpUpdate(void); -static void WallyHandleStatusIconUpdate(void); -static void WallyHandleStatusAnimation(void); -static void WallyHandleStatusXor(void); -static void WallyHandleDataTransfer(void); -static void WallyHandleDMA3Transfer(void); -static void WallyHandlePlayBGM(void); -static void WallyHandleCmd32(void); -static void WallyHandleTwoReturnValues(void); -static void WallyHandleChosenMonReturnValue(void); -static void WallyHandleOneReturnValue(void); -static void WallyHandleOneReturnValue_Duplicate(void); -static void WallyHandleClearUnkVar(void); -static void WallyHandleSetUnkVar(void); -static void WallyHandleClearUnkFlag(void); -static void WallyHandleToggleUnkFlag(void); -static void WallyHandleHitAnimation(void); -static void WallyHandleCantSwitch(void); -static void WallyHandlePlaySE(void); -static void WallyHandlePlayFanfareOrBGM(void); -static void WallyHandleFaintingCry(void); -static void WallyHandleIntroSlide(void); -static void WallyHandleIntroTrainerBallThrow(void); -static void WallyHandleDrawPartyStatusSummary(void); -static void WallyHandleHidePartyStatusSummary(void); -static void WallyHandleEndBounceEffect(void); -static void WallyHandleSpriteInvisibility(void); -static void WallyHandleBattleAnimation(void); -static void WallyHandleLinkStandbyMsg(void); -static void WallyHandleResetActionMoveSelection(void); -static void WallyHandleEndLinkBattle(void); -static void WallyCmdEnd(void); - -static void WallyBufferRunCommand(void); -static void WallyBufferExecCompleted(void); -static void CompleteOnChosenItem(void); -static void Intro_WaitForShinyAnimAndHealthbox(void); -static u32 CopyWallyMonData(u8 monId, u8 *dst); -static void SetWallyMonData(u8 monId); -static void WallyDoMoveAnimation(void); -static void Task_StartSendOutAnim(u8 taskId); -static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = -{ - [CONTROLLER_GETMONDATA] = WallyHandleGetMonData, - [CONTROLLER_GETRAWMONDATA] = WallyHandleGetRawMonData, - [CONTROLLER_SETMONDATA] = WallyHandleSetMonData, - [CONTROLLER_SETRAWMONDATA] = WallyHandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = WallyHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = WallyHandleSwitchInAnim, - [CONTROLLER_RETURNMONTOBALL] = WallyHandleReturnMonToBall, - [CONTROLLER_DRAWTRAINERPIC] = WallyHandleDrawTrainerPic, - [CONTROLLER_TRAINERSLIDE] = WallyHandleTrainerSlide, - [CONTROLLER_TRAINERSLIDEBACK] = WallyHandleTrainerSlideBack, - [CONTROLLER_FAINTANIMATION] = WallyHandleFaintAnimation, - [CONTROLLER_PALETTEFADE] = WallyHandlePaletteFade, - [CONTROLLER_SUCCESSBALLTHROWANIM] = WallyHandleSuccessBallThrowAnim, - [CONTROLLER_BALLTHROWANIM] = WallyHandleBallThrowAnim, - [CONTROLLER_PAUSE] = WallyHandlePause, - [CONTROLLER_MOVEANIMATION] = WallyHandleMoveAnimation, - [CONTROLLER_PRINTSTRING] = WallyHandlePrintString, - [CONTROLLER_PRINTSTRINGPLAYERONLY] = WallyHandlePrintSelectionString, - [CONTROLLER_CHOOSEACTION] = WallyHandleChooseAction, - [CONTROLLER_YESNOBOX] = WallyHandleYesNoBox, - [CONTROLLER_CHOOSEMOVE] = WallyHandleChooseMove, - [CONTROLLER_OPENBAG] = WallyHandleChooseItem, - [CONTROLLER_CHOOSEPOKEMON] = WallyHandleChoosePokemon, - [CONTROLLER_23] = WallyHandleCmd23, - [CONTROLLER_HEALTHBARUPDATE] = WallyHandleHealthBarUpdate, - [CONTROLLER_EXPUPDATE] = WallyHandleExpUpdate, - [CONTROLLER_STATUSICONUPDATE] = WallyHandleStatusIconUpdate, - [CONTROLLER_STATUSANIMATION] = WallyHandleStatusAnimation, - [CONTROLLER_STATUSXOR] = WallyHandleStatusXor, - [CONTROLLER_DATATRANSFER] = WallyHandleDataTransfer, - [CONTROLLER_DMA3TRANSFER] = WallyHandleDMA3Transfer, - [CONTROLLER_PLAYBGM] = WallyHandlePlayBGM, - [CONTROLLER_32] = WallyHandleCmd32, - [CONTROLLER_TWORETURNVALUES] = WallyHandleTwoReturnValues, - [CONTROLLER_CHOSENMONRETURNVALUE] = WallyHandleChosenMonReturnValue, - [CONTROLLER_ONERETURNVALUE] = WallyHandleOneReturnValue, - [CONTROLLER_ONERETURNVALUE_DUPLICATE] = WallyHandleOneReturnValue_Duplicate, - [CONTROLLER_CLEARUNKVAR] = WallyHandleClearUnkVar, - [CONTROLLER_SETUNKVAR] = WallyHandleSetUnkVar, - [CONTROLLER_CLEARUNKFLAG] = WallyHandleClearUnkFlag, - [CONTROLLER_TOGGLEUNKFLAG] = WallyHandleToggleUnkFlag, - [CONTROLLER_HITANIMATION] = WallyHandleHitAnimation, - [CONTROLLER_CANTSWITCH] = WallyHandleCantSwitch, - [CONTROLLER_PLAYSE] = WallyHandlePlaySE, - [CONTROLLER_PLAYFANFAREORBGM] = WallyHandlePlayFanfareOrBGM, - [CONTROLLER_FAINTINGCRY] = WallyHandleFaintingCry, - [CONTROLLER_INTROSLIDE] = WallyHandleIntroSlide, - [CONTROLLER_INTROTRAINERBALLTHROW] = WallyHandleIntroTrainerBallThrow, - [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = WallyHandleDrawPartyStatusSummary, - [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = WallyHandleHidePartyStatusSummary, - [CONTROLLER_ENDBOUNCE] = WallyHandleEndBounceEffect, - [CONTROLLER_SPRITEINVISIBILITY] = WallyHandleSpriteInvisibility, - [CONTROLLER_BATTLEANIMATION] = WallyHandleBattleAnimation, - [CONTROLLER_LINKSTANDBYMSG] = WallyHandleLinkStandbyMsg, - [CONTROLLER_RESETACTIONMOVESELECTION] = WallyHandleResetActionMoveSelection, - [CONTROLLER_ENDLINKBATTLE] = WallyHandleEndLinkBattle, - [CONTROLLER_TERMINATOR_NOP] = WallyCmdEnd +static void RecordedOpponentHandleGetMonData(void); +static void RecordedOpponentHandleGetRawMonData(void); +static void RecordedOpponentHandleSetMonData(void); +static void RecordedOpponentHandleSetRawMonData(void); +static void RecordedOpponentHandleLoadMonSprite(void); +static void RecordedOpponentHandleSwitchInAnim(void); +static void RecordedOpponentHandleReturnMonToBall(void); +static void RecordedOpponentHandleDrawTrainerPic(void); +static void RecordedOpponentHandleTrainerSlide(void); +static void RecordedOpponentHandleTrainerSlideBack(void); +static void RecordedOpponentHandleFaintAnimation(void); +static void RecordedOpponentHandlePaletteFade(void); +static void RecordedOpponentHandleSuccessBallThrowAnim(void); +static void RecordedOpponentHandleBallThrowAnim(void); +static void RecordedOpponentHandlePause(void); +static void RecordedOpponentHandleMoveAnimation(void); +static void RecordedOpponentHandlePrintString(void); +static void RecordedOpponentHandlePrintSelectionString(void); +static void RecordedOpponentHandleChooseAction(void); +static void RecordedOpponentHandleYesNoBox(void); +static void RecordedOpponentHandleChooseMove(void); +static void RecordedOpponentHandleChooseItem(void); +static void RecordedOpponentHandleChoosePokemon(void); +static void RecordedOpponentHandleCmd23(void); +static void RecordedOpponentHandleHealthBarUpdate(void); +static void RecordedOpponentHandleExpUpdate(void); +static void RecordedOpponentHandleStatusIconUpdate(void); +static void RecordedOpponentHandleStatusAnimation(void); +static void RecordedOpponentHandleStatusXor(void); +static void RecordedOpponentHandleDataTransfer(void); +static void RecordedOpponentHandleDMA3Transfer(void); +static void RecordedOpponentHandlePlayBGM(void); +static void RecordedOpponentHandleCmd32(void); +static void RecordedOpponentHandleTwoReturnValues(void); +static void RecordedOpponentHandleChosenMonReturnValue(void); +static void RecordedOpponentHandleOneReturnValue(void); +static void RecordedOpponentHandleOneReturnValue_Duplicate(void); +static void RecordedOpponentHandleClearUnkVar(void); +static void RecordedOpponentHandleSetUnkVar(void); +static void RecordedOpponentHandleClearUnkFlag(void); +static void RecordedOpponentHandleToggleUnkFlag(void); +static void RecordedOpponentHandleHitAnimation(void); +static void RecordedOpponentHandleCantSwitch(void); +static void RecordedOpponentHandlePlaySE(void); +static void RecordedOpponentHandlePlayFanfareOrBGM(void); +static void RecordedOpponentHandleFaintingCry(void); +static void RecordedOpponentHandleIntroSlide(void); +static void RecordedOpponentHandleIntroTrainerBallThrow(void); +static void RecordedOpponentHandleDrawPartyStatusSummary(void); +static void RecordedOpponentHandleHidePartyStatusSummary(void); +static void RecordedOpponentHandleEndBounceEffect(void); +static void RecordedOpponentHandleSpriteInvisibility(void); +static void RecordedOpponentHandleBattleAnimation(void); +static void RecordedOpponentHandleLinkStandbyMsg(void); +static void RecordedOpponentHandleResetActionMoveSelection(void); +static void RecordedOpponentHandleEndLinkBattle(void); +static void RecordedOpponentCmdEnd(void); + +static void RecordedOpponentBufferRunCommand(void); +static void RecordedOpponentBufferExecCompleted(void); +static void SwitchIn_HandleSoundAndEnd(void); +static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst); +static void SetRecordedOpponentMonData(u8 monId); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); +static void DoSwitchOutAnimation(void); +static void RecordedOpponentDoMoveAnimation(void); +static void Task_StartSendOutAnim(u8 taskId); +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); +static void EndDrawPartyStatusSummary(void); + +static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = +{ + [CONTROLLER_GETMONDATA] = RecordedOpponentHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = RecordedOpponentHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = RecordedOpponentHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = RecordedOpponentHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = RecordedOpponentHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = RecordedOpponentHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = RecordedOpponentHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = RecordedOpponentHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = RecordedOpponentHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = RecordedOpponentHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = RecordedOpponentHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = RecordedOpponentHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = RecordedOpponentHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = RecordedOpponentHandleBallThrowAnim, + [CONTROLLER_PAUSE] = RecordedOpponentHandlePause, + [CONTROLLER_MOVEANIMATION] = RecordedOpponentHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = RecordedOpponentHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = RecordedOpponentHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = RecordedOpponentHandleChooseAction, + [CONTROLLER_YESNOBOX] = RecordedOpponentHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = RecordedOpponentHandleChooseMove, + [CONTROLLER_OPENBAG] = RecordedOpponentHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = RecordedOpponentHandleChoosePokemon, + [CONTROLLER_23] = RecordedOpponentHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = RecordedOpponentHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = RecordedOpponentHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = RecordedOpponentHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = RecordedOpponentHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = RecordedOpponentHandleStatusXor, + [CONTROLLER_DATATRANSFER] = RecordedOpponentHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = RecordedOpponentHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = RecordedOpponentHandlePlayBGM, + [CONTROLLER_32] = RecordedOpponentHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = RecordedOpponentHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = RecordedOpponentHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = RecordedOpponentHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = RecordedOpponentHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = RecordedOpponentHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = RecordedOpponentHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = RecordedOpponentHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = RecordedOpponentHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = RecordedOpponentHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = RecordedOpponentHandleCantSwitch, + [CONTROLLER_PLAYSE] = RecordedOpponentHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = RecordedOpponentHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = RecordedOpponentHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = RecordedOpponentHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedOpponentHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedOpponentHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = RecordedOpponentHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = RecordedOpponentHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = RecordedOpponentHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = RecordedOpponentHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = RecordedOpponentHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = RecordedOpponentHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = RecordedOpponentHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = RecordedOpponentCmdEnd }; -static void UNUSED SpriteCB_Null7(void) +static void RecordedOpponentDummy(void) { } -void SetControllerToWally(void) +void SetControllerToRecordedOpponent(void) { - gBattlerControllerFuncs[gActiveBattler] = WallyBufferRunCommand; - gBattleStruct->wallyBattleState = 0; - gBattleStruct->wallyMovesState = 0; - gBattleStruct->wallyWaitFrames = 0; - gBattleStruct->wallyMoveFrames = 0; + gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentBufferRunCommand; } -static void WallyBufferRunCommand(void) +static void RecordedOpponentBufferRunCommand(void) { if (gBattleControllerExecFlags & gBitTable[gActiveBattler]) { - if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sWallyBufferCommands)) - sWallyBufferCommands[gBattleBufferA[gActiveBattler][0]](); + if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) + sRecordedOpponentBufferCommands[gBattleBufferA[gActiveBattler][0]](); else - WallyBufferExecCompleted(); - } -} - -static void WallyHandleActions(void) -{ - switch (gBattleStruct->wallyBattleState) - { - case 0: - gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; - gBattleStruct->wallyBattleState++; - case 1: - if (--gBattleStruct->wallyWaitFrames == 0) - { - PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, 0); - WallyBufferExecCompleted(); - gBattleStruct->wallyBattleState++; - gBattleStruct->wallyMovesState = 0; - gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; - } - break; - case 2: - if (--gBattleStruct->wallyWaitFrames == 0) - { - PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, 0); - WallyBufferExecCompleted(); - gBattleStruct->wallyBattleState++; - gBattleStruct->wallyMovesState = 0; - gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; - } - break; - case 3: - if (--gBattleStruct->wallyWaitFrames == 0) - { - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_WALLY_THROW, 0); - WallyBufferExecCompleted(); - gBattleStruct->wallyBattleState++; - gBattleStruct->wallyMovesState = 0; - gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; - } - break; - case 4: - if (--gBattleStruct->wallyWaitFrames == 0) - { - PlaySE(SE_SELECT); - ActionSelectionDestroyCursorAt(0); - ActionSelectionCreateCursorAt(1, 0); - gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; - gBattleStruct->wallyBattleState++; - } - break; - case 5: - if (--gBattleStruct->wallyWaitFrames == 0) - { - PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_ITEM, 0); - WallyBufferExecCompleted(); - } - break; + RecordedOpponentBufferExecCompleted(); } } static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void CompleteOnInactiveTextPrinter(void) +static void UNUSED CompleteOnBankSpriteCallbackDummy2(void) { - if (!IsTextPrinterActive(B_WIN_MSG)) - WallyBufferExecCompleted(); + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + RecordedOpponentBufferExecCompleted(); } -static void CompleteOnFinishedAnimation(void) +static void FreeTrainerSpriteAfterSlide(void) { - if (!gDoingBattleAnim) - WallyBufferExecCompleted(); + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + { + FreeTrainerFrontPicPalette(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam); + FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + RecordedOpponentBufferExecCompleted(); + } } -static void OpenBagAfterPaletteFade(void) +static void Intro_DelayAndEnd(void) { - if (!gPaletteFade.active) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattlerControllerFuncs[gActiveBattler] = CompleteOnChosenItem; - ReshowBattleScreenDummy(); - FreeAllWindowBuffers(); - DoWallyTutorialBagMenu(); + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; + RecordedOpponentBufferExecCompleted(); } } -static void CompleteOnChosenItem(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) + bool8 healthboxAnimDone = FALSE; + + if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) + { + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded) + healthboxAnimDone = TRUE; + + } + else { - BtlController_EmitOneReturnValue(BUFFER_B, gSpecialVar_ItemId); - WallyBufferExecCompleted(); + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded + && gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gActiveBattler)]].animEnded) + healthboxAnimDone = TRUE; + } + + if (healthboxAnimDone) + { + if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) + { + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) + return; + if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) + return; + + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + } + + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } static void Intro_TryShinyAnimShowHealthbox(void) { + bool32 bgmRestored = FALSE; + bool32 battlerAnimsDone = FALSE; + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) - TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); if (!gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) - TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); + TryShinyAnimation(BATTLE_PARTNER(gActiveBattler), &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive - && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) + { + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) + { + if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL); + StartHealthboxSlideIn(BATTLE_PARTNER(gActiveBattler)); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]); + } + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); + StartHealthboxSlideIn(gActiveBattler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); + } + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; + } + + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].waitForCry + && !IsCryPlayingOrClearCrySongs()) + { + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) + { + if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) + m4aMPlayContinue(&gMPlayInfo_BGM); + } + else + { + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); + } + } + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; + bgmRestored = TRUE; + } + + if (!IsDoubleBattle()) + { + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + { + battlerAnimsDone = TRUE; + } + } + else + { + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattleControllerData[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy) + { + battlerAnimsDone = TRUE; + } + } + + if (bgmRestored && battlerAnimsDone) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { DestroySprite(&gSprites[gBattleControllerData[BATTLE_PARTNER(gActiveBattler)]]); - UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gPlayerParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL); - StartHealthboxSlideIn(BATTLE_PARTNER(gActiveBattler)); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]); + SetBattlerShadowSpriteCallback(BATTLE_PARTNER(gActiveBattler), GetMonData(&gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], MON_DATA_SPECIES)); } + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); - UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - StartHealthboxSlideIn(gActiveBattler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); + SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } - } -static void Intro_WaitForShinyAnimAndHealthbox(void) +static void TryShinyAnimAfterMonAnim(void) { - bool32 healthboxAnimDone = FALSE; - - if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - healthboxAnimDone = TRUE; - - if (healthboxAnimDone && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim - && gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim) + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[gActiveBattler]].x2 == 0) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - - gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - - WallyBufferExecCompleted(); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) + { + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + } + else + { + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + RecordedOpponentBufferExecCompleted(); + } + } } } @@ -349,16 +373,38 @@ static void CompleteOnHealthbarDone(void) SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) - { UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], hpValue, HP_CURRENT); - } else + RecordedOpponentBufferExecCompleted(); +} + +static void HideHealthboxAfterMonFaint(void) +{ + if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) { - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - WallyBufferExecCompleted(); + SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); + RecordedOpponentBufferExecCompleted(); } } +static void FreeMonSpriteAfterSwitchOutAnim(void) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) + { + FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + HideBattlerShadowSprite(gActiveBattler); + SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); + RecordedOpponentBufferExecCompleted(); + } +} + +static void CompleteOnInactiveTextPrinter(void) +{ + if (!IsTextPrinterActive(B_WIN_MSG)) + RecordedOpponentBufferExecCompleted(); +} + static void DoHitAnimBlinkSpriteEffect(void) { u8 spriteId = gBattlerSpriteIds[gActiveBattler]; @@ -368,7 +414,7 @@ static void DoHitAnimBlinkSpriteEffect(void) gSprites[spriteId].data[1] = 0; gSprites[spriteId].invisible = FALSE; gDoingBattleAnim = FALSE; - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } else { @@ -378,32 +424,82 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void DoSwitchOutAnimation(void) +static void SwitchIn_ShowSubstitute(void) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) + if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - WallyBufferExecCompleted(); + if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); + + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } -static void CompleteOnBankSpriteCallbackDummy2(void) +static void SwitchIn_HandleSoundAndEnd(void) { - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - WallyBufferExecCompleted(); + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive + && !IsCryPlayingOrClearCrySongs()) + { + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + || gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy_2) + { + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); + RecordedOpponentBufferExecCompleted(); + } + } +} + +static void SwitchIn_ShowHealthbox(void) +{ + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; + + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); + + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); + StartHealthboxSlideIn(gActiveBattler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); + CopyBattleSpriteInvisibility(gActiveBattler); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; + } +} + +static void SwitchIn_TryShinyAnim(void) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) + TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); + + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) + { + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); + SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; + } +} + +static void CompleteOnFinishedStatusAnimation(void) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) + RecordedOpponentBufferExecCompleted(); } static void CompleteOnFinishedBattleAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive) - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyBufferExecCompleted(void) +static void RecordedOpponentBufferExecCompleted(void) { - gBattlerControllerFuncs[gActiveBattler] = WallyBufferRunCommand; + gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentBufferRunCommand; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { u8 playerId = GetMultiplayerId(); @@ -417,13 +513,7 @@ static void WallyBufferExecCompleted(void) } } -static void UNUSED CompleteOnFinishedStatusAnimation(void) -{ - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive) - WallyBufferExecCompleted(); -} - -static void WallyHandleGetMonData(void) +static void RecordedOpponentHandleGetMonData(void) { u8 monData[sizeof(struct Pokemon) * 2 + 56]; // this allows to get full data of two pokemon, trying to get more will result in overwriting data u32 size = 0; @@ -432,7 +522,7 @@ static void WallyHandleGetMonData(void) if (gBattleBufferA[gActiveBattler][2] == 0) { - size += CopyWallyMonData(gBattlerPartyIndexes[gActiveBattler], monData); + size += CopyRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler], monData); } else { @@ -440,15 +530,15 @@ static void WallyHandleGetMonData(void) for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) - size += CopyWallyMonData(i, monData + size); + size += CopyRecordedOpponentMonData(i, monData + size); monToCheck >>= 1; } } BtlController_EmitDataTransfer(BUFFER_B, size, monData); - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static u32 CopyWallyMonData(u8 monId, u8 *dst) +static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst) { struct BattlePokemon battleMon; struct MovePpInfo moveData; @@ -461,50 +551,50 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) switch (gBattleBufferA[gActiveBattler][1]) { case REQUEST_ALL_BATTLE: - battleMon.species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); - battleMon.item = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); + battleMon.species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); + battleMon.item = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); for (size = 0; size < MAX_MON_MOVES; size++) { - battleMon.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); - battleMon.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); + battleMon.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); + battleMon.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); } - battleMon.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); - battleMon.friendship = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); - battleMon.experience = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); - battleMon.hpIV = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); - battleMon.attackIV = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); - battleMon.defenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); - battleMon.speedIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); - battleMon.spAttackIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); - battleMon.spDefenseIV = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); - battleMon.personality = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); - battleMon.status1 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); - battleMon.level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); - battleMon.hp = GetMonData(&gPlayerParty[monId], MON_DATA_HP); - battleMon.maxHP = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); - battleMon.attack = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); - battleMon.defense = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); - battleMon.speed = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); - battleMon.spAttack = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); - battleMon.spDefense = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); - battleMon.isEgg = GetMonData(&gPlayerParty[monId], MON_DATA_IS_EGG); - battleMon.abilityNum = GetMonData(&gPlayerParty[monId], MON_DATA_ABILITY_NUM); - battleMon.otId = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); - GetMonData(&gPlayerParty[monId], MON_DATA_NICKNAME, nickname); + battleMon.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); + battleMon.friendship = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); + battleMon.experience = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); + battleMon.hpIV = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); + battleMon.attackIV = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); + battleMon.defenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); + battleMon.speedIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); + battleMon.spAttackIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); + battleMon.spDefenseIV = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); + battleMon.personality = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); + battleMon.status1 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); + battleMon.level = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); + battleMon.hp = GetMonData(&gEnemyParty[monId], MON_DATA_HP); + battleMon.maxHP = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); + battleMon.attack = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); + battleMon.defense = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); + battleMon.speed = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); + battleMon.spAttack = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); + battleMon.spDefense = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); + battleMon.isEgg = GetMonData(&gEnemyParty[monId], MON_DATA_IS_EGG); + battleMon.abilityNum = GetMonData(&gEnemyParty[monId], MON_DATA_ABILITY_NUM); + battleMon.otId = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); + GetMonData(&gEnemyParty[monId], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(battleMon.nickname, nickname); - GetMonData(&gPlayerParty[monId], MON_DATA_OT_NAME, battleMon.otName); + GetMonData(&gEnemyParty[monId], MON_DATA_OT_NAME, battleMon.otName); src = (u8 *)&battleMon; for (size = 0; size < sizeof(battleMon); size++) dst[size] = src[size]; break; case REQUEST_SPECIES_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_HELDITEM_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; @@ -512,10 +602,10 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) case REQUEST_MOVES_PP_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) { - moveData.moves[size] = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + size); - moveData.pp[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); + moveData.moves[size] = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); } - moveData.ppBonuses = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); + moveData.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); src = (u8 *)(&moveData); for (size = 0; size < sizeof(moveData); size++) dst[size] = src[size]; @@ -524,121 +614,121 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_PP_DATA_BATTLE: for (size = 0; size < MAX_MON_MOVES; size++) - dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + size); - dst[size] = GetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES); + dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + size); + dst[size] = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); size++; break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE); size = 1; break; case REQUEST_OTID_BATTLE: - data32 = GetMonData(&gPlayerParty[monId], MON_DATA_OT_ID); + data32 = GetMonData(&gEnemyParty[monId], MON_DATA_OT_ID); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_EXP_BATTLE: - data32 = GetMonData(&gPlayerParty[monId], MON_DATA_EXP); + data32 = GetMonData(&gEnemyParty[monId], MON_DATA_EXP); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; size = 3; break; case REQUEST_HP_EV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_EV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_EV); size = 1; break; case REQUEST_ATK_EV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV); size = 1; break; case REQUEST_DEF_EV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV); size = 1; break; case REQUEST_SPEED_EV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV); size = 1; break; case REQUEST_SPATK_EV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV); size = 1; break; case REQUEST_SPDEF_EV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV); size = 1; break; case REQUEST_FRIENDSHIP_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); size = 1; break; case REQUEST_POKERUS_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKERUS); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKERUS); size = 1; break; case REQUEST_MET_LOCATION_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION); size = 1; break; case REQUEST_MET_LEVEL_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL); size = 1; break; case REQUEST_MET_GAME_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME); size = 1; break; case REQUEST_POKEBALL_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL); size = 1; break; case REQUEST_ALL_IVS_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); - dst[1] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); - dst[2] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); - dst[3] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); - dst[4] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); - dst[5] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); + dst[1] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); + dst[2] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); + dst[3] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); + dst[4] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); + dst[5] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); size = 6; break; case REQUEST_HP_IV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_HP_IV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); size = 1; break; case REQUEST_ATK_IV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); size = 1; break; case REQUEST_DEF_IV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); size = 1; break; case REQUEST_SPEED_IV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); size = 1; break; case REQUEST_SPATK_IV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); size = 1; break; case REQUEST_SPDEF_IV_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); size = 1; break; case REQUEST_PERSONALITY_BATTLE: - data32 = GetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY); + data32 = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; @@ -646,13 +736,13 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) size = 4; break; case REQUEST_CHECKSUM_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_STATUS_BATTLE: - data32 = GetMonData(&gPlayerParty[monId], MON_DATA_STATUS); + data32 = GetMonData(&gEnemyParty[monId], MON_DATA_STATUS); dst[0] = (data32 & 0x000000FF); dst[1] = (data32 & 0x0000FF00) >> 8; dst[2] = (data32 & 0x00FF0000) >> 16; @@ -660,93 +750,93 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) size = 4; break; case REQUEST_LEVEL_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); size = 1; break; case REQUEST_HP_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_HP); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_MAX_HP_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_ATK_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_ATK); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_ATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_DEF_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_DEF); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_DEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPEED_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPEED); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPATK_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPATK); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_SPDEF_BATTLE: - data16 = GetMonData(&gPlayerParty[monId], MON_DATA_SPDEF); + data16 = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF); dst[0] = data16; dst[1] = data16 >> 8; size = 2; break; case REQUEST_COOL_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL); size = 1; break; case REQUEST_BEAUTY_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY); size = 1; break; case REQUEST_CUTE_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE); size = 1; break; case REQUEST_SMART_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART); size = 1; break; case REQUEST_TOUGH_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH); size = 1; break; case REQUEST_SHEEN_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SHEEN); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SHEEN); size = 1; break; case REQUEST_COOL_RIBBON_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON); size = 1; break; case REQUEST_BEAUTY_RIBBON_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON); size = 1; break; case REQUEST_CUTE_RIBBON_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON); size = 1; break; case REQUEST_SMART_RIBBON_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON); size = 1; break; case REQUEST_TOUGH_RIBBON_BATTLE: - dst[0] = GetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON); + dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON); size = 1; break; } @@ -754,19 +844,19 @@ static u32 CopyWallyMonData(u8 monId, u8 *dst) return size; } -static void WallyHandleGetRawMonData(void) +static void RecordedOpponentHandleGetRawMonData(void) { - PlayerHandleGetRawMonData(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleSetMonData(void) +static void RecordedOpponentHandleSetMonData(void) { u8 monToCheck; u8 i; if (gBattleBufferA[gActiveBattler][2] == 0) { - SetWallyMonData(gBattlerPartyIndexes[gActiveBattler]); + SetRecordedOpponentMonData(gBattlerPartyIndexes[gActiveBattler]); } else { @@ -774,14 +864,14 @@ static void WallyHandleSetMonData(void) for (i = 0; i < PARTY_SIZE; i++) { if (monToCheck & 1) - SetWallyMonData(i); + SetRecordedOpponentMonData(i); monToCheck >>= 1; } } - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void SetWallyMonData(u8 monId) +static void SetRecordedOpponentMonData(u8 monId) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBattler][3]; struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBattler][3]; @@ -793,347 +883,469 @@ static void SetWallyMonData(u8 monId) { u8 iv; - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &battlePokemon->species); - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); + SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &battlePokemon->species); + SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < MAX_MON_MOVES; i++) { - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); + SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); - SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &battlePokemon->experience); + SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); + SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); + SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &iv); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &iv); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &iv); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &iv); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &iv); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &iv); - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &battlePokemon->status1); - SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &battlePokemon->level); - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &battlePokemon->hp); - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &battlePokemon->attack); - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &battlePokemon->defense); - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &battlePokemon->speed); - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &iv); + SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &battlePokemon->personality); + SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &battlePokemon->status1); + SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &battlePokemon->level); + SetMonData(&gEnemyParty[monId], MON_DATA_HP, &battlePokemon->hp); + SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &battlePokemon->maxHP); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &battlePokemon->attack); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &battlePokemon->defense); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &battlePokemon->speed); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &battlePokemon->spAttack); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case REQUEST_SPECIES_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) { - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); + SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &moveData->moves[i]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + i, &moveData->pp[i]); } - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; case REQUEST_MOVE1_BATTLE: case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleBufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleBufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleBufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBattler][7]); break; case REQUEST_PPMOVE1_BATTLE: case REQUEST_PPMOVE2_BATTLE: case REQUEST_PPMOVE3_BATTLE: case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleBufferA[gActiveBattler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_OTID_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_EXP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_EXP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKERUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MET_GAME_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_POKEBALL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][4]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][5]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][6]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][7]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][8]); break; case REQUEST_HP_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData16(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SHEEN_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); + SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBattler][3]); break; } +} + +static void RecordedOpponentHandleSetRawMonData(void) +{ + u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]] + gBattleBufferA[gActiveBattler][1]; + u8 i; + + for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) + dst[i] = gBattleBufferA[gActiveBattler][3 + i]; - HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleSetRawMonData(void) +static void RecordedOpponentHandleLoadMonSprite(void) { - WallyBufferExecCompleted(); + u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); + + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); + + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(gActiveBattler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(gActiveBattler), + GetBattlerSpriteSubpriority(gActiveBattler)); + + gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; + StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); + + SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); + + gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim; } -static void WallyHandleLoadMonSprite(void) +static void RecordedOpponentHandleSwitchInAnim(void) { - WallyBufferExecCompleted(); + gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void WallyHandleSwitchInAnim(void) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { - WallyBufferExecCompleted(); + u16 species; + + ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); + gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); + + gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battlerId), + GetBattlerSpriteSubpriority(battlerId)); + + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + + gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; + gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; + gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + + gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } -static void WallyHandleReturnMonToBall(void) +static void RecordedOpponentHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBattler][1] == 0) { - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + HideBattlerShadowSprite(gActiveBattler); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } } -#define sSpeedX data[0] - -static void WallyHandleDrawTrainerPic(void) +static void DoSwitchOutAnimation(void) { - DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler); - SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, - 80, - 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].size), - 30); - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = DISPLAY_WIDTH; - gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; + switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) + { + case 0: + if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); + + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; + break; + case 1: + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON); + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; + } + break; + } } -static void WallyHandleTrainerSlide(void) +#define sSpeedX data[0] + +static void RecordedOpponentHandleDrawTrainerPic(void) { - DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler); - SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); + s16 xPos; + u32 trainerPicId; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon + xPos = 152; + else // first mon + xPos = 200; + + if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + { + if (gActiveBattler == 1) + trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); + else + trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); + } + else + { + trainerPicId = PlayerGenderToFrontTrainerPicId(GetActiveBattlerLinkPlayerGender()); + } + } + else + { + xPos = 176; + if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) + { + trainerPicId = GetUnionRoomTrainerPic(); + } + else + { + trainerPicId = PlayerGenderToFrontTrainerPicId(gLinkPlayers[gRecordedBattleMultiplayerId ^ BIT_SIDE].gender); + } + } + + DecompressTrainerFrontPic(trainerPicId, gActiveBattler); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, - 80, - 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].size), - 30); - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -96; + xPos, + (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, + GetBattlerSpriteSubpriority(gActiveBattler)); + + gSprites[gBattlerSpriteIds[gActiveBattler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); + gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; + + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } #undef sSpeedX -static void WallyHandleTrainerSlideBack(void) +static void RecordedOpponentHandleTrainerSlide(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleFaintAnimation(void) +static void RecordedOpponentHandleTrainerSlideBack(void) { - WallyBufferExecCompleted(); + SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); + gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } -static void WallyHandlePaletteFade(void) +static void RecordedOpponentHandleFaintAnimation(void) { - WallyBufferExecCompleted(); + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) + { + if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) + InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState++; + } + else + { + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; + PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; + gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint; + } + } } -static void WallyHandleSuccessBallThrowAnim(void) +static void RecordedOpponentHandlePaletteFade(void) { - gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; - gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); - gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleBallThrowAnim(void) +static void RecordedOpponentHandleSuccessBallThrowAnim(void) { - u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1]; - - gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; - gDoingBattleAnim = TRUE; - InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER); - gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedAnimation; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandlePause(void) +static void RecordedOpponentHandleBallThrowAnim(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleMoveAnimation(void) +static void RecordedOpponentHandlePause(void) { - u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + RecordedOpponentBufferExecCompleted(); +} - gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; - gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); - gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); - gAnimFriendship = gBattleBufferA[gActiveBattler][10]; - gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); - gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; - gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE - { - WallyBufferExecCompleted(); - } - else +static void RecordedOpponentHandleMoveAnimation(void) +{ + if (!IsBattleSEPlaying(gActiveBattler)) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - gBattlerControllerFuncs[gActiveBattler] = WallyDoMoveAnimation; + u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + + gAnimMoveTurn = gBattleBufferA[gActiveBattler][3]; + gAnimMovePower = gBattleBufferA[gActiveBattler][4] | (gBattleBufferA[gActiveBattler][5] << 8); + gAnimMoveDmg = gBattleBufferA[gActiveBattler][6] | (gBattleBufferA[gActiveBattler][7] << 8) | (gBattleBufferA[gActiveBattler][8] << 16) | (gBattleBufferA[gActiveBattler][9] << 24); + gAnimFriendship = gBattleBufferA[gActiveBattler][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); + gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; + gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; + if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE + { + RecordedOpponentBufferExecCompleted(); + } + else + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; + gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentDoMoveAnimation; + } } - } -static void WallyDoMoveAnimation(void) +static void RecordedOpponentDoMoveAnimation(void) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); + u8 multihit = gBattleBufferA[gActiveBattler][11]; switch (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState) { case 0: - if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) + if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute + && !gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8) { + gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 1; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 1; @@ -1151,9 +1363,10 @@ static void WallyDoMoveAnimation(void) if (!gAnimScriptActive) { SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); - if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) + if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); + gBattleSpritesDataPtr->battlerData[gActiveBattler].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 3; } @@ -1164,13 +1377,13 @@ static void WallyDoMoveAnimation(void) CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBattler, gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } break; } } -static void WallyHandlePrintString(void) +static void RecordedOpponentHandlePrintString(void) { u16 *stringId; @@ -1182,90 +1395,56 @@ static void WallyHandlePrintString(void) gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } -static void WallyHandlePrintSelectionString(void) -{ - if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) - WallyHandlePrintString(); - else - WallyBufferExecCompleted(); -} - -static void HandleChooseActionAfterDma3(void) +static void RecordedOpponentHandlePrintSelectionString(void) { - if (!IsDma3ManagerBusyWithBgCopy()) - { - gBattle_BG0_X = 0; - gBattle_BG0_Y = DISPLAY_HEIGHT; - gBattlerControllerFuncs[gActiveBattler] = WallyHandleActions; - } + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleChooseAction(void) +static void RecordedOpponentHandleChooseAction(void) { - s32 i; - - gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; - BattlePutTextOnWindow(gText_BattleMenu, B_WIN_ACTION_MENU); - - for (i = 0; i < 4; i++) - ActionSelectionDestroyCursorAt(i); - - ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); - BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillWallyDo); - BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_ACTION_PROMPT); + BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleYesNoBox(void) +static void RecordedOpponentHandleYesNoBox(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleChooseMove(void) +static void RecordedOpponentHandleChooseMove(void) { - switch (gBattleStruct->wallyMovesState) + if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - case 0: - InitMoveSelectionsVarsAndStrings(); - gBattleStruct->wallyMovesState++; - gBattleStruct->wallyMoveFrames = 80; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - gBattle_BG0_X = 0; - gBattle_BG0_Y = DISPLAY_HEIGHT * 2; - gBattleStruct->wallyMovesState++; - } - break; - case 2: - if (--gBattleStruct->wallyMoveFrames == 0) - { - PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, 10, 0x100); - WallyBufferExecCompleted(); - } - break; + BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace()); + } + else + { + u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); + u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); + BtlController_EmitTwoReturnValues(BUFFER_B, 10, moveId | (target << 8)); } + + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleChooseItem(void) +static void RecordedOpponentHandleChooseItem(void) { - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); - gBattlerControllerFuncs[gActiveBattler] = OpenBagAfterPaletteFade; - gBattlerInMenuId = gActiveBattler; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleChoosePokemon(void) +static void RecordedOpponentHandleChoosePokemon(void) { - WallyBufferExecCompleted(); + *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); + BtlController_EmitChosenMonReturnValue(BUFFER_B, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleCmd23(void) +static void RecordedOpponentHandleCmd23(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleHealthBarUpdate(void) +static void RecordedOpponentHandleHealthBarUpdate(void) { s16 hpVal; @@ -1274,107 +1453,123 @@ static void WallyHandleHealthBarUpdate(void) if (hpVal != INSTANT_HP_BAR_DROP) { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); - u32 curHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); + u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); + u32 curHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, curHP, hpVal); } else { - u32 maxHP = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); + u32 maxHP = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MAX_HP); SetBattleBarStruct(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], maxHP, 0, hpVal); - UpdateHpTextInHealthbox(gHealthboxSpriteIds[gActiveBattler], 0, HP_CURRENT); } gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthbarDone; } -static void WallyHandleExpUpdate(void) +static void RecordedOpponentHandleExpUpdate(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleStatusIconUpdate(void) +static void RecordedOpponentHandleStatusIconUpdate(void) { - WallyBufferExecCompleted(); + if (!IsBattleSEPlaying(gActiveBattler)) + { + u8 battlerId; + + UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); + battlerId = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; + } } -static void WallyHandleStatusAnimation(void) +static void RecordedOpponentHandleStatusAnimation(void) { - WallyBufferExecCompleted(); + if (!IsBattleSEPlaying(gActiveBattler)) + { + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], + gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); + gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; + } } -static void WallyHandleStatusXor(void) +static void RecordedOpponentHandleStatusXor(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleDataTransfer(void) +static void RecordedOpponentHandleDataTransfer(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleDMA3Transfer(void) +static void RecordedOpponentHandleDMA3Transfer(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandlePlayBGM(void) +static void RecordedOpponentHandlePlayBGM(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleCmd32(void) +static void RecordedOpponentHandleCmd32(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleTwoReturnValues(void) +static void RecordedOpponentHandleTwoReturnValues(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleChosenMonReturnValue(void) +static void RecordedOpponentHandleChosenMonReturnValue(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleOneReturnValue(void) +static void RecordedOpponentHandleOneReturnValue(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleOneReturnValue_Duplicate(void) +static void RecordedOpponentHandleOneReturnValue_Duplicate(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleClearUnkVar(void) +static void RecordedOpponentHandleClearUnkVar(void) { - WallyBufferExecCompleted(); + gUnusedControllerStruct.unk = 0; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleSetUnkVar(void) +static void RecordedOpponentHandleSetUnkVar(void) { - WallyBufferExecCompleted(); + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleClearUnkFlag(void) +static void RecordedOpponentHandleClearUnkFlag(void) { - WallyBufferExecCompleted(); + gUnusedControllerStruct.flag = 0; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleToggleUnkFlag(void) +static void RecordedOpponentHandleToggleUnkFlag(void) { - WallyBufferExecCompleted(); + gUnusedControllerStruct.flag ^= 1; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleHitAnimation(void) +static void RecordedOpponentHandleHitAnimation(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].invisible == TRUE) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } else { @@ -1385,18 +1580,25 @@ static void WallyHandleHitAnimation(void) } } -static void WallyHandleCantSwitch(void) +static void RecordedOpponentHandleCantSwitch(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandlePlaySE(void) +static void RecordedOpponentHandlePlaySE(void) { - PlaySE(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); - WallyBufferExecCompleted(); + s8 pan; + + if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + pan = SOUND_PAN_ATTACKER; + else + pan = SOUND_PAN_TARGET; + + PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandlePlayFanfareOrBGM(void) +static void RecordedOpponentHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBattler][3]) { @@ -1408,45 +1610,36 @@ static void WallyHandlePlayFanfareOrBGM(void) PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8)); } - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleFaintingCry(void) +static void RecordedOpponentHandleFaintingCry(void) { - u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); + u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - // Seems that it doesn't bother using CRY_MODE_FAINT because - // Wally's Pokémon during the tutorial is never intended to faint. - PlayCry_Normal(species, 25); - WallyBufferExecCompleted(); + PlayCry_ByMode(species, 25, CRY_MODE_FAINT); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleIntroSlide(void) +static void RecordedOpponentHandleIntroSlide(void) { HandleIntroSlide(gBattleBufferA[gActiveBattler][1]); gIntroSlideFlags |= 1; - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleIntroTrainerBallThrow(void) +static void RecordedOpponentHandleIntroTrainerBallThrow(void) { - u8 paletteNum; u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 50; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 35; + gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); - paletteNum = AllocSpritePalette(0xD6F8); - LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_WALLY].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); - gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite); taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; @@ -1455,116 +1648,142 @@ static void WallyHandleIntroTrainerBallThrow(void) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; - gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; -} - -static void StartSendOutAnim(u8 battlerId) -{ - u16 species; - - gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = 0; - gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); - SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); - gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); - - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; - - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; - - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentDummy; } static void Task_StartSendOutAnim(u8 taskId) { - if (gTasks[taskId].data[1] < 31) + u8 savedActiveBank = gActiveBattler; + + gActiveBattler = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - gTasks[taskId].data[1]++; + gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + StartSendOutAnim(gActiveBattler, FALSE); } else { - u8 savedActiveBank = gActiveBattler; - - gActiveBattler = gTasks[taskId].data[0]; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - StartSendOutAnim(gActiveBattler); - gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; - gActiveBattler = savedActiveBank; - DestroyTask(taskId); + StartSendOutAnim(gActiveBattler, FALSE); + gActiveBattler ^= BIT_FLANK; + gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; + StartSendOutAnim(gActiveBattler, FALSE); + gActiveBattler ^= BIT_FLANK; } + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; + gActiveBattler = savedActiveBank; + DestroyTask(taskId); +} + +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) +{ + FreeTrainerFrontPicPalette(sprite->oam.affineParam); + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); } -static void WallyHandleDrawPartyStatusSummary(void) +static void RecordedOpponentHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } else { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; + + if (gBattleBufferA[gActiveBattler][2] != 0) + { + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay < 2) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay++; + return; + } + else + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].opponentDrawPartyStatusSummaryDelay = 0; + } + } + gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - WallyBufferExecCompleted(); + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; + + if (gBattleBufferA[gActiveBattler][2] != 0) + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; + + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void WallyHandleHidePartyStatusSummary(void) +static void EndDrawPartyStatusSummary(void) { - WallyBufferExecCompleted(); + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) + { + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; + RecordedOpponentBufferExecCompleted(); + } +} + +static void RecordedOpponentHandleHidePartyStatusSummary(void) +{ + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleEndBounceEffect(void) +static void RecordedOpponentHandleEndBounceEffect(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleSpriteInvisibility(void) +static void RecordedOpponentHandleSpriteInvisibility(void) { - WallyBufferExecCompleted(); + if (IsBattlerSpritePresent(gActiveBattler)) + { + gSprites[gBattlerSpriteIds[gActiveBattler]].invisible = gBattleBufferA[gActiveBattler][1]; + CopyBattleSpriteInvisibility(gActiveBattler); + } + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleBattleAnimation(void) +static void RecordedOpponentHandleBattleAnimation(void) { - u8 animationId = gBattleBufferA[gActiveBattler][1]; - u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + if (!IsBattleSEPlaying(gActiveBattler)) + { + u8 animationId = gBattleBufferA[gActiveBattler][1]; + u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) - WallyBufferExecCompleted(); - else - gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; + if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument)) + RecordedOpponentBufferExecCompleted(); + else + gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation; + } } -static void WallyHandleLinkStandbyMsg(void) +static void RecordedOpponentHandleLinkStandbyMsg(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleResetActionMoveSelection(void) +static void RecordedOpponentHandleResetActionMoveSelection(void) { - WallyBufferExecCompleted(); + RecordedOpponentBufferExecCompleted(); } -static void WallyHandleEndLinkBattle(void) +static void RecordedOpponentHandleEndLinkBattle(void) { - gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW) + gBattleOutcome = gBattleBufferA[gActiveBattler][1]; + else + gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; + FadeOutMapMusic(5); BeginFastPaletteFade(3); - WallyBufferExecCompleted(); - - if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; + RecordedOpponentBufferExecCompleted(); + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } -static void WallyCmdEnd(void) +static void RecordedOpponentCmdEnd(void) { } + From 4380b8b1cd22c19b0462b407f54acf3b2a13f836 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:56:30 -0500 Subject: [PATCH 11/37] Update battle_controller_recorded_player.c --- src/battle_controller_recorded_player.c | 27 +++++++++++++------------ 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 591ddb67e306..14d6573a1e95 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -901,10 +901,10 @@ static void SetRecordedPlayerMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -918,7 +918,7 @@ static void SetRecordedPlayerMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -1002,37 +1002,37 @@ static void SetRecordedPlayerMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); @@ -1810,3 +1810,4 @@ static void RecordedPlayerHandleEndLinkBattle(void) static void RecordedPlayerCmdEnd(void) { } + From e1c5e9efe0c1227eec2f17f0a9ee75802164c5d9 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:57:26 -0500 Subject: [PATCH 12/37] Update battle_controller_wally.c --- src/battle_controller_wally.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index ce357319a59e..efab026b1b01 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -828,10 +828,10 @@ static void SetWallyMonData(u8 monId) } break; case REQUEST_SPECIES_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPECIES, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HELDITEM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MOVES_PP_BATTLE: for (i = 0; i < MAX_MON_MOVES; i++) @@ -845,7 +845,7 @@ static void SetWallyMonData(u8 monId) case REQUEST_MOVE2_BATTLE: case REQUEST_MOVE3_BATTLE: case REQUEST_MOVE4_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MOVE1 + gBattleBufferA[gActiveBattler][1] - REQUEST_MOVE1_BATTLE, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PP_DATA_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_PP1, &gBattleBufferA[gActiveBattler][3]); @@ -929,37 +929,37 @@ static void SetWallyMonData(u8 monId) SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); + SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_LEVEL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_LEVEL, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_MAX_HP_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_ATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_ATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_DEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_DEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPEED_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPEED, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPATK_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPATK, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_SPDEF_BATTLE: - SetMonData(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_SPDEF, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_COOL_BATTLE: SetMonData(&gPlayerParty[monId], MON_DATA_COOL, &gBattleBufferA[gActiveBattler][3]); @@ -1568,3 +1568,4 @@ static void WallyHandleEndLinkBattle(void) static void WallyCmdEnd(void) { } + From b0da7b7bdb091387e2147cee43cea9548009d905 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:58:15 -0500 Subject: [PATCH 13/37] Update evolution_scene.c --- src/evolution_scene.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 133afe3b0dd2..ad37f1511692 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -551,6 +551,7 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE) { s32 i; +#ifndef UBFIX struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); @@ -568,6 +569,28 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data); data = MAIL_NONE; SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data); +#else + u16 data2 = 0; + u8 data3 = 0; + struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; + + CopyMon(shedinja, mon, sizeof(struct Pokemon)); + SetMonData(shedinja, MON_DATA_NICKNAME, gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); + SetMonData(shedinja, MON_DATA_HELD_ITEM, &data2); + SetMonData(shedinja, MON_DATA_MARKINGS, &data3); + SetMonData(shedinja, MON_DATA_ENCRYPT_SEPARATOR, &data); + + for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) + SetMonData(shedinja, i, &data3); + for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_UNUSED_RIBBONS; i++) + SetMonData(shedinja, i, &data3); + + SetMonData(shedinja, MON_DATA_STATUS, &data); + data2 = MAIL_NONE; + SetMonData(shedinja, MON_DATA_MAIL, &data); +#endif + + CalculateMonStats(shedinja); CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); CalculatePlayerPartyCount(); From 9819bffcf02b92bfd3d64b3a329ac2acf6ff59d4 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:59:31 -0500 Subject: [PATCH 14/37] Update field_specials.c --- src/field_specials.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/field_specials.c b/src/field_specials.c index 7d20d3571d0c..019b13ad75ee 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1423,9 +1423,19 @@ void SetShoalItemFlag(u16 unused) void LoadWallyZigzagoon(void) { u16 monData; + #ifdef UBFIX + u16 monDataU8; + #endif + CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + #ifdef UBFIX + monDataU8 = TRUE; + SetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM, &monDataU8); + #else monData = TRUE; SetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM, &monData); + #endif + monData = MOVE_TACKLE; SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, &monData); monData = MOVE_NONE; From a676e36ae3fa9b7e7a44e204549455e683c82f6c Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 17:59:53 -0500 Subject: [PATCH 15/37] Update mail_data.c --- src/mail_data.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/mail_data.c b/src/mail_data.c index ed152faf2ced..ae68962fb21f 100644 --- a/src/mail_data.c +++ b/src/mail_data.c @@ -44,13 +44,18 @@ bool8 MonHasMail(struct Pokemon *mon) u8 GiveMailToMonByItemId(struct Pokemon *mon, u16 itemId) { - u8 heldItem[2]; u8 id, i; u16 species; u32 personality; + + #ifndef UBFIX + u8 heldItem[2]; heldItem[0] = itemId; heldItem[1] = itemId >> 8; + #else + u16 *heldItem = &itemId; + #endif for (id = 0; id < PARTY_SIZE; id++) { @@ -110,7 +115,14 @@ u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer) u8 GiveMailToMon(struct Pokemon *mon, struct Mail *mail) { + +// Use a u16 pointer insted of a u8 heldItem as u16 is guaranteed to be aligned properly +#ifndef UBFIX u8 heldItem[2]; +#else + u16 *heldItem; +#endif + u16 itemId = mail->itemId; u8 mailId = GiveMailToMonByItemId(mon, itemId); @@ -121,8 +133,12 @@ u8 GiveMailToMon(struct Pokemon *mon, struct Mail *mail) SetMonData(mon, MON_DATA_MAIL, &mailId); +#ifndef UBFIX heldItem[0] = itemId; heldItem[1] = itemId >> 8; +#else + heldItem = &itemId; +#endif SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); @@ -136,16 +152,28 @@ static bool32 UNUSED DummyMailFunc(void) void TakeMailFromMon(struct Pokemon *mon) { - u8 heldItem[2]; u8 mailId; if (MonHasMail(mon)) { + #ifdef UBFIX + u16 *heldItem; + u16 heldItemVar; + #else + u8 heldItem[2]; + #endif mailId = GetMonData(mon, MON_DATA_MAIL); gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; mailId = MAIL_NONE; + + #ifdef UBFIX + heldItemVar = ITEM_NONE; + heldItem = &heldItemVar; + #else heldItem[0] = ITEM_NONE; heldItem[1] = ITEM_NONE << 8; + #endif + SetMonData(mon, MON_DATA_MAIL, &mailId); SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); } @@ -159,11 +187,18 @@ void ClearMailItemId(u8 mailId) u8 TakeMailFromMonAndSave(struct Pokemon *mon) { u8 i; - u8 newHeldItem[2]; u8 newMailId; + #ifndef UBFIX + u8 newHeldItem[2]; + newHeldItem[0] = ITEM_NONE; newHeldItem[1] = ITEM_NONE << 8; + #else + u16 heldItemVar = ITEM_NONE; + u16 *newHeldItem = &heldItemVar; + #endif + newMailId = MAIL_NONE; for (i = PARTY_SIZE; i < MAIL_COUNT; i++) @@ -203,3 +238,4 @@ bool8 ItemIsMail(u16 itemId) return FALSE; } } + From d665488587a35ff207565ceaf49f3872d907c44b Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 18:01:03 -0500 Subject: [PATCH 16/37] Update party_menu.c --- src/party_menu.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/party_menu.c b/src/party_menu.c index 9b076755c844..bfc189760c37 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -1798,15 +1798,25 @@ static void DisplaySwitchedHeldItemMessage(u16 item, u16 item2, bool8 keepOpen) static void GiveItemToMon(struct Pokemon *mon, u16 item) { + #ifndef UBFIX u8 itemBytes[2]; + #else + u16 *itemBytes; + #endif if (ItemIsMail(item) == TRUE) { if (GiveMailToMonByItemId(mon, item) == MAIL_NONE) return; } + +#ifndef UBFIX itemBytes[0] = item; itemBytes[1] = item >> 8; +#else + itemBytes = &item; +#endif + SetMonData(mon, MON_DATA_HELD_ITEM, itemBytes); } From e17111980ca1b82b7c0a488144e894a912a2f59a Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 18:02:45 -0500 Subject: [PATCH 17/37] Update pokemon.c --- src/pokemon.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 6ee052fda576..79e1eaf62c88 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2780,9 +2780,14 @@ void CreateEnemyEventMon(void) CreateEventMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); if (itemId) { +#ifndef UBFIX u8 heldItem[2]; heldItem[0] = itemId; heldItem[1] = itemId >> 8; +#else + // gSpecialVar_0x8006 is a u16 + u16 *heldItem = &gSpecialVar_0x8006; +#endif SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); } } @@ -4066,13 +4071,19 @@ u32 GetBoxMonData3(struct BoxPokemon *boxMon, s32 field, u8 *data) u32 GetBoxMonData2(struct BoxPokemon *boxMon, s32 field) __attribute__((alias("GetBoxMonData3"))); +#ifndef UBFIX #define SET8(lhs) (lhs) = *data #define SET16(lhs) (lhs) = data[0] + (data[1] << 8) #define SET32(lhs) (lhs) = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24) +#else +#define SET8(lhs) (lhs) = *(u8 *)data +#define SET16(lhs) (lhs) = *(u16 *)data +#define SET32(lhs) (lhs) = *(u32 *)data +#endif void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg) { - const u8 *data = dataArg; + const void *data = dataArg; switch (field) { @@ -4116,7 +4127,11 @@ void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg) void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) { + #ifndef UBFIX const u8 *data = dataArg; + #else + const void* data = dataArg; + #endif struct PokemonSubstruct0 *substruct0 = NULL; struct PokemonSubstruct1 *substruct1 = NULL; @@ -4152,10 +4167,14 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; case MON_DATA_NICKNAME: { + #ifndef UBFIX s32 i; for (i = 0; i < POKEMON_NAME_LENGTH; i++) boxMon->nickname[i] = data[i]; break; + #else + memcpy(boxMon->nickname, data, POKEMON_NAME_LENGTH); + #endif } case MON_DATA_LANGUAGE: SET8(boxMon->language); @@ -4171,9 +4190,13 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; case MON_DATA_OT_NAME: { + #ifndef UBFIX s32 i; for (i = 0; i < PLAYER_NAME_LENGTH; i++) boxMon->otName[i] = data[i]; + #else + memcpy(boxMon->otName, data, PLAYER_NAME_LENGTH); + #endif break; } case MON_DATA_MARKINGS: @@ -4262,8 +4285,12 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; case MON_DATA_MET_LEVEL: { + #ifndef UBFIX u8 metLevel = *data; substruct3->metLevel = metLevel; + #else + SET8(substruct3->metLevel); + #endif break; } case MON_DATA_MET_GAME: @@ -4271,8 +4298,12 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; case MON_DATA_POKEBALL: { + #ifndef UBFIX u8 pokeball = *data; substruct3->pokeball = pokeball; + #else + SET8(substruct3->pokeball); + #endif break; } case MON_DATA_OT_GENDER: @@ -4365,7 +4396,13 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; case MON_DATA_IVS: { + #ifndef UBFIX u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); + #else + u32 ivs; + SET32(ivs); + #endif + substruct3->hpIV = ivs & MAX_IV_MASK; substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; @@ -5096,10 +5133,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { dataUnsigned += itemEffect[itemEffectParam]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + //moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { - moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + //moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); } SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned); @@ -5122,10 +5159,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { dataUnsigned += itemEffect[itemEffectParam++]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant + //moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant + //moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); } SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); From d8e97a1a7a796757f07f9331cc1e307886c2a61f Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 18:03:07 -0500 Subject: [PATCH 18/37] Update script_pokemon_util.c --- src/script_pokemon_util.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index 6e5653884b23..bab2b4d330c0 100755 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -62,12 +62,22 @@ u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 u { u16 nationalDexNum; int sentToPc; - u8 heldItem[2]; struct Pokemon mon; +#ifndef UBFIX + u8 heldItem[2]; +#else + u16 *heldItem; +#endif CreateMon(&mon, species, level, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); + +#ifndef UBFIX heldItem[0] = item; heldItem[1] = item >> 8; +#else + heldItem = &item; +#endif + SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); sentToPc = GiveMonToPlayer(&mon); nationalDexNum = SpeciesToNationalPokedexNum(species); @@ -136,14 +146,17 @@ bool8 DoesPartyHaveEnigmaBerry(void) void CreateScriptedWildMon(u16 species, u8 level, u16 item) { - u8 heldItem[2]; - ZeroEnemyPartyMons(); CreateMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, 0, 0, OT_ID_PLAYER_ID, 0); if (item) { +#ifdef UBFIX + u8 heldItem[2]; heldItem[0] = item; heldItem[1] = item >> 8; +#else + u16 *heldItem = &item; +#endif SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem); } } @@ -226,3 +239,4 @@ void ReducePlayerPartyToSelectedMons(void) CalculatePlayerPartyCount(); } + From c7e333016f5d829ac18314c5f14cc7626b3900ab Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 18:04:19 -0500 Subject: [PATCH 19/37] Update battle_controller_link_opponent.c --- src/battle_controller_link_opponent.c | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 6cabece8e818..bfbad36ea3e7 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -23,31 +23,6 @@ #include "task.h" #include "text.h" #include "util.h" -#includ#include "global.h" -#include "battle.h" -#include "battle_ai_script_commands.h" -#include "battle_anim.h" -#include "battle_controllers.h" -#include "battle_interface.h" -#include "battle_message.h" -#include "battle_setup.h" -#include "battle_tower.h" -#include "battle_tv.h" -#include "bg.h" -#include "data.h" -#include "link.h" -#include "main.h" -#include "m4a.h" -#include "palette.h" -#include "pokeball.h" -#include "pokemon.h" -#include "recorded_battle.h" -#include "reshow_battle_screen.h" -#include "sound.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "util.h" #include "window.h" #include "constants/battle_anim.h" #include "constants/songs.h" From c6aa413d931fc37f839cee4da37954bc0d9cb86e Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 18:06:23 -0500 Subject: [PATCH 20/37] Update evolution_scene.c --- src/evolution_scene.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index ad37f1511692..72a7bd4b9078 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -552,8 +552,6 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) { s32 i; #ifndef UBFIX - struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; - CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); @@ -589,9 +587,6 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) data2 = MAIL_NONE; SetMonData(shedinja, MON_DATA_MAIL, &data); #endif - - CalculateMonStats(shedinja); - CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); CalculatePlayerPartyCount(); From 3b1cd921819417c7cb4da658856fa6870bd7f0de Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 18:07:52 -0500 Subject: [PATCH 21/37] Update evolution_scene.c --- src/evolution_scene.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 72a7bd4b9078..be8005f41118 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -551,6 +551,7 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE) { s32 i; + struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; #ifndef UBFIX CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies); @@ -570,7 +571,6 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) #else u16 data2 = 0; u8 data3 = 0; - struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; CopyMon(shedinja, mon, sizeof(struct Pokemon)); SetMonData(shedinja, MON_DATA_NICKNAME, gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); From 918ea90a0bc72c195321b4253f20253ecdab3bb8 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 19:00:47 -0500 Subject: [PATCH 22/37] Update script_pokemon_util.c --- src/script_pokemon_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index bab2b4d330c0..1098718c10f1 100755 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -239,4 +239,3 @@ void ReducePlayerPartyToSelectedMons(void) CalculatePlayerPartyCount(); } - From f71575592c31cfa0b055ccb517fa172d051fc351 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 19:01:52 -0500 Subject: [PATCH 23/37] Update pokemon.c --- src/pokemon.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 79e1eaf62c88..53a3948dfbee 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5133,10 +5133,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { dataUnsigned += itemEffect[itemEffectParam]; - //moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { - //moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); } SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned); @@ -5159,10 +5159,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { dataUnsigned += itemEffect[itemEffectParam++]; - //moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant + moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { - //moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant + moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); } SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); From 342846e163c2e7128f0b174d389554fa6451f32e Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sat, 2 Dec 2023 19:03:55 -0500 Subject: [PATCH 24/37] Fix formatting --- include/battle_controllers.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index a7498c667230..b683f9230602 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -103,20 +103,19 @@ enum { #define SetMonData16(mon, type, arg) SetMonData(mon, type, arg) #define SetMonData32(mon, type, arg) SetMonData(mon, type, arg) #else -#define SetMonData16(mon, type, arg) \ -{ \ - u8 *data = arg; \ +#define SetMonData16(mon, type, arg) \ +{ \ + u8 *data = arg; \ u16 value = (data[0]) | (data[1] << 8); \ - SetMonData(mon, type, &value); \ + SetMonData(mon, type, &value); \ } -#define SetMonData32(mon, type, arg) \ -{\ - u8 *data = arg; \ +#define SetMonData32(mon, type, arg) \ +{ \ + u8 *data = arg; \ u16 value = (data[0]) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); \ - SetMonData(mon, type, &value); \ + SetMonData(mon, type, &value); \ } - #endif struct UnusedControllerStruct From c20b2f116e04b9e9cafe8358f37ff9060134637c Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:05:18 -0500 Subject: [PATCH 25/37] Fix error Should be u32 --- include/battle_controllers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index b683f9230602..c367881b44b9 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -113,7 +113,7 @@ enum { #define SetMonData32(mon, type, arg) \ { \ u8 *data = arg; \ - u16 value = (data[0]) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); \ + u32 value = (data[0]) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); \ SetMonData(mon, type, &value); \ } #endif From 8d8abd8578d20dfd29a633f8d34b47a65ecdbe36 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:15:54 -0500 Subject: [PATCH 26/37] UBFix ZeroMonData --- src/pokemon.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pokemon.c b/src/pokemon.c index 53a3948dfbee..90226dd5754d 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2162,6 +2162,7 @@ void ZeroBoxMonData(struct BoxPokemon *boxMon) void ZeroMonData(struct Pokemon *mon) { +#ifndef UBFIX u32 arg; ZeroBoxMonData(&mon->box); arg = 0; @@ -2176,6 +2177,11 @@ void ZeroMonData(struct Pokemon *mon) SetMonData(mon, MON_DATA_SPDEF, &arg); arg = MAIL_NONE; SetMonData(mon, MON_DATA_MAIL, &arg); +#else + u16 mail = MAIL_NONE; + memset(mon, 0, sizeof(*mon)); + SetMonData(mon, MON_DATA_MAIL, &mail); +#endif } void ZeroPlayerPartyMons(void) From f3f6962f510fe5ee505c47263e4d46c9bf20b354 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Sun, 3 Dec 2023 11:22:42 -0500 Subject: [PATCH 27/37] Fix script_pokemon_util.c --- src/script_pokemon_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index 1098718c10f1..9f20828230ff 100755 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -150,7 +150,7 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item) CreateMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, 0, 0, OT_ID_PLAYER_ID, 0); if (item) { -#ifdef UBFIX +#ifndef UBFIX u8 heldItem[2]; heldItem[0] = item; heldItem[1] = item >> 8; From 143e758a8b4ecfa5d010228057a86c297fef8141 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 12:37:23 -0500 Subject: [PATCH 28/37] Fix u16 Typo --- src/field_specials.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field_specials.c b/src/field_specials.c index 019b13ad75ee..534cb389150e 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1424,7 +1424,7 @@ void LoadWallyZigzagoon(void) { u16 monData; #ifdef UBFIX - u16 monDataU8; + bool8 monDataU8; #endif CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); From 86382d3638a2bde2fb74078ce7e2e6945b508c13 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 12:39:15 -0500 Subject: [PATCH 29/37] Use TI_READ Macros --- include/battle_controllers.h | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index c367881b44b9..56ceb2fb3c00 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -103,18 +103,16 @@ enum { #define SetMonData16(mon, type, arg) SetMonData(mon, type, arg) #define SetMonData32(mon, type, arg) SetMonData(mon, type, arg) #else -#define SetMonData16(mon, type, arg) \ -{ \ - u8 *data = arg; \ - u16 value = (data[0]) | (data[1] << 8); \ - SetMonData(mon, type, &value); \ +#define SetMonData16(mon, type, arg) \ +{ \ + u16 value = T1_READ_16(arg); \ + SetMonData(mon, type, &value); \ } -#define SetMonData32(mon, type, arg) \ -{ \ - u8 *data = arg; \ - u32 value = (data[0]) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); \ - SetMonData(mon, type, &value); \ +#define SetMonData32(mon, type, arg) \ +{ \ + u32 value = T1_READ_32(arg); \ + SetMonData(mon, type, &value); \ } #endif From a61f7f098fcb95e0658db67a74970943915b947f Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:35:27 -0500 Subject: [PATCH 30/37] Fix assigning to checksum --- src/battle_controller_link_opponent.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index bfbad36ea3e7..3871bcef02a3 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -1036,7 +1036,7 @@ static void SetLinkOpponentMonData(u8 monId) SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); From 738e1cffa0d7b9897127a3d9a7c41b870a6214c3 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:36:14 -0500 Subject: [PATCH 31/37] Update battle_controller_link_partner.c --- src/battle_controller_link_partner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 82ed9291576e..456c60d9ad32 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -930,7 +930,7 @@ static void SetLinkPartnerMonData(u8 monId) SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); From 6fc7c4e8f645e3af5b5817f38ad4bf41980b6dbb Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:36:36 -0500 Subject: [PATCH 32/37] Update battle_controller_opponent.c --- src/battle_controller_opponent.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index d912bed81755..68a690d3a509 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -1050,7 +1050,7 @@ static void SetOpponentMonData(u8 monId) SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); From 2ef40f2dce9a4d47b6bfaaad207f5f429a3fc3d5 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:37:15 -0500 Subject: [PATCH 33/37] Update battle_controller_player.c --- src/battle_controller_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index a24ba82890a0..042349fad29e 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2097,7 +2097,7 @@ static void SetPlayerMonData(u8 monId) SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); From f595b824574be301a54d0a5cc4740ee607321e61 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:37:39 -0500 Subject: [PATCH 34/37] Update battle_controller_player_partner.c --- src/battle_controller_player_partner.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 72c24e7d8537..63ba0ea777d9 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -1114,7 +1114,7 @@ static void SetPlayerPartnerMonData(u8 monId) SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); From 24b5901a937847e75d9a01e4dbcab174cd23dcce Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:38:00 -0500 Subject: [PATCH 35/37] Update battle_controller_recorded_opponent.c --- src/battle_controller_recorded_opponent.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 4daa2bf0e557..2f31cd06c330 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -1022,7 +1022,7 @@ static void SetRecordedOpponentMonData(u8 monId) SetMonData32(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); From 0f267506537477cc011127cd7df1638479a11b30 Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:38:25 -0500 Subject: [PATCH 36/37] Update battle_controller_recorded_player.c --- src/battle_controller_recorded_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 14d6573a1e95..243bb2c52677 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -1005,7 +1005,7 @@ static void SetRecordedPlayerMonData(u8 monId) SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]); From 3fc305888becfa90f938b4382bc232d2995d901b Mon Sep 17 00:00:00 2001 From: AreaZeroArven <122058867+AreaZeroArven@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:39:02 -0500 Subject: [PATCH 37/37] Update battle_controller_wally.c --- src/battle_controller_wally.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index efab026b1b01..96c821992a63 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -932,7 +932,7 @@ static void SetWallyMonData(u8 monId) SetMonData32(&gPlayerParty[monId], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_CHECKSUM_BATTLE: - SetMonData32(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); + SetMonData16(&gPlayerParty[monId], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBattler][3]); break; case REQUEST_STATUS_BATTLE: SetMonData32(&gPlayerParty[monId], MON_DATA_STATUS, &gBattleBufferA[gActiveBattler][3]);