From 7331c111a9cc34d5dc98c2064ae1b5838f3eddb5 Mon Sep 17 00:00:00 2001 From: cawtds Date: Fri, 10 May 2024 12:52:25 +0200 Subject: [PATCH] updated battle_controller_opponent up to CONTROLLER_DRAWTRAINERPIC --- include/battle_controllers.h | 4 +- src/battle_controller_opponent.c | 770 ++----------------------------- src/battle_controllers.c | 39 ++ 3 files changed, 77 insertions(+), 736 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index fc899667d..af3dee4e9 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -4,8 +4,7 @@ #include "global.h" #include "battle.h" -enum -{ +enum { REQUEST_ALL_BATTLE, REQUEST_SPECIES_BATTLE, REQUEST_HELDITEM_BATTLE, @@ -269,6 +268,7 @@ void BtlController_HandleGetMonData(u32 battler); void BtlController_HandleGetRawMonData(u32 battler); void BtlController_HandleSetMonData(u32 battler); void BtlController_HandleSetRawMonData(u32 battler); +void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler)); void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler)); void BtlController_HandleReturnMonToBall(u32 battler); void BtlController_HandleDrawTrainerPic(u32 battlerId, u32 trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index da93bb0d3..948447c68 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -21,13 +21,8 @@ #include "constants/songs.h" #include "constants/sound.h" -static void OpponentHandleGetMonData(u32 battler); -static void OpponentHandleGetRawMonData(u32 battler); -static void OpponentHandleSetMonData(u32 battler); -static void OpponentHandleSetRawMonData(u32 battler); static void OpponentHandleLoadMonSprite(u32 battler); static void OpponentHandleSwitchInAnim(u32 battler); -static void OpponentHandleReturnMonToBall(u32 battler); static void OpponentHandleDrawTrainerPic(u32 battler); static void OpponentHandleTrainerSlide(u32 battler); static void OpponentHandleTrainerSlideBack(u32 battler); @@ -80,26 +75,22 @@ static void OpponentHandleCmd55(u32 battler); static void OpponentCmdEnd(u32 battler); static void OpponentBufferRunCommand(u32 battler); -static u32 GetOpponentMonData(u32 battler, u8 monId, u8 *dst); -static void SetOpponentMonData(u32 battler, u8 monId); -static void DoSwitchOutAnimation(u32 battler); static void OpponentDoMoveAnimation(u32 battler); static void SwitchIn_HandleSoundAndEnd(u32 battler); -// static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void Task_StartSendOutAnim(u8 taskId); static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); static void EndDrawPartyStatusSummary(u32 battler); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = { - [CONTROLLER_GETMONDATA] = OpponentHandleGetMonData, - [CONTROLLER_GETRAWMONDATA] = OpponentHandleGetRawMonData, - [CONTROLLER_SETMONDATA] = OpponentHandleSetMonData, - [CONTROLLER_SETRAWMONDATA] = OpponentHandleSetRawMonData, - [CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite, - [CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim, - [CONTROLLER_RETURNMONTOBALL] = OpponentHandleReturnMonToBall, - [CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic, + [CONTROLLER_GETMONDATA] = BtlController_HandleGetMonData, // done + [CONTROLLER_GETRAWMONDATA] = BtlController_HandleGetRawMonData, // done + [CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData, // done + [CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData, // done + [CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite, // done + [CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim, // done + [CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall, // done + [CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic, // done [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, [CONTROLLER_TRAINERSLIDEBACK] = OpponentHandleTrainerSlideBack, [CONTROLLER_FAINTANIMATION] = OpponentHandleFaintAnimation, @@ -151,15 +142,13 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) [CONTROLLER_TERMINATOR_NOP] = OpponentCmdEnd }; -// unknown unused data -static const u8 sUnused[] = { 0xB0, 0xB0, 0xC8, 0x98, 0x28, 0x28, 0x28, 0x20 }; - static void OpponentDummy(u32 battler) { } void SetControllerToOpponent(u32 battler) { + gBattlerControllerEndFuncs[battler] = OpponentBufferExecCompleted; gBattlerControllerFuncs[battler] = OpponentBufferRunCommand; } @@ -322,18 +311,6 @@ static void HideHealthboxAfterMonFaint(u32 battler) } } -static void FreeMonSpriteAfterSwitchOutAnim(u32 battler) -{ - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) - { - FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[battler]]); - DestroySprite(&gSprites[gBattlerSpriteIds[battler]]); - HideBattlerShadowSprite(battler); - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - OpponentBufferExecCompleted(battler); - } -} - static void CompleteOnInactiveTextPrinter(u32 battler) { if (!IsTextPrinterActive(0)) @@ -426,705 +403,22 @@ void OpponentBufferExecCompleted(u32 battler) gBattleControllerExecFlags &= ~gBitTable[battler]; } -static void OpponentHandleGetMonData(u32 battler) -{ - 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; - u8 monToCheck; - s32 i; - - if (!gBattleResources->bufferA[battler][2]) - { - size += GetOpponentMonData(battler, gBattlerPartyIndexes[battler], monData); - } - else - { - monToCheck = gBattleResources->bufferA[battler][2]; - for (i = 0; i < PARTY_SIZE; ++i) - { - if (monToCheck & 1) - size += GetOpponentMonData(battler, i, monData + size); - monToCheck >>= 1; - } - } - BtlController_EmitDataTransfer(battler, BUFFER_B, size, monData); - OpponentBufferExecCompleted(battler); -} - -static u32 GetOpponentMonData(u32 battler, u8 monId, u8 *dst) -{ - struct BattlePokemon battleMon; - struct MovePpInfo moveData; - u8 nickname[20]; - u8 *src; - s16 data16; - u32 data32; - s32 size = 0; - - switch (gBattleResources->bufferA[battler][1]) - { - case REQUEST_ALL_BATTLE: - 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(&gEnemyParty[monId], MON_DATA_MOVE1 + size); - battleMon.pp[size] = GetMonData(&gEnemyParty[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); - StringCopy_Nickname(battleMon.nickname, nickname); - 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(&gEnemyParty[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); - dst[0] = data16; - dst[1] = data16 >> 8; - size = 2; - break; - 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.ppBonuses = GetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES); - src = (u8 *)(&moveData); - for (size = 0; size < sizeof(moveData); ++size) - dst[size] = src[size]; - break; - case REQUEST_MOVE1_BATTLE: - case REQUEST_MOVE2_BATTLE: - case REQUEST_MOVE3_BATTLE: - case REQUEST_MOVE4_BATTLE: - data16 = GetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[battler][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); - ++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 + gBattleResources->bufferA[battler][1] - REQUEST_PPMOVE1_BATTLE); - size = 1; - break; - case REQUEST_OTID_BATTLE: - 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(&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(&gEnemyParty[monId], MON_DATA_HP_EV); - size = 1; - break; - case REQUEST_ATK_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV); - size = 1; - break; - case REQUEST_DEF_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV); - size = 1; - break; - case REQUEST_SPEED_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV); - size = 1; - break; - case REQUEST_SPATK_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV); - size = 1; - break; - case REQUEST_SPDEF_EV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV); - size = 1; - break; - case REQUEST_FRIENDSHIP_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP); - size = 1; - break; - case REQUEST_POKERUS_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_POKERUS); - size = 1; - break; - case REQUEST_MET_LOCATION_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION); - size = 1; - break; - case REQUEST_MET_LEVEL_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL); - size = 1; - break; - case REQUEST_MET_GAME_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME); - size = 1; - break; - case REQUEST_POKEBALL_BATTLE: - dst[0] = GetMonData(&gEnemyParty[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); - size = 6; - break; - case REQUEST_HP_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_HP_IV); - size = 1; - break; - case REQUEST_ATK_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV); - size = 1; - break; - case REQUEST_DEF_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV); - size = 1; - break; - case REQUEST_SPEED_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV); - size = 1; - break; - case REQUEST_SPATK_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV); - size = 1; - break; - case REQUEST_SPDEF_IV_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV); - size = 1; - break; - case REQUEST_PERSONALITY_BATTLE: - data32 = GetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY); - dst[0] = (data32 & 0x000000FF); - dst[1] = (data32 & 0x0000FF00) >> 8; - dst[2] = (data32 & 0x00FF0000) >> 16; - dst[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case REQUEST_CHECKSUM_BATTLE: - data16 = GetMonData(&gEnemyParty[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); - dst[0] = (data32 & 0x000000FF); - dst[1] = (data32 & 0x0000FF00) >> 8; - dst[2] = (data32 & 0x00FF0000) >> 16; - dst[3] = (data32 & 0xFF000000) >> 24; - size = 4; - break; - case REQUEST_LEVEL_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_LEVEL); - size = 1; - break; - case REQUEST_HP_BATTLE: - data16 = GetMonData(&gEnemyParty[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); - dst[0] = data16; - dst[1] = data16 >> 8; - size = 2; - break; - case REQUEST_ATK_BATTLE: - data16 = GetMonData(&gEnemyParty[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); - dst[0] = data16; - dst[1] = data16 >> 8; - size = 2; - break; - case REQUEST_SPEED_BATTLE: - data16 = GetMonData(&gEnemyParty[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); - dst[0] = data16; - dst[1] = data16 >> 8; - size = 2; - break; - case REQUEST_SPDEF_BATTLE: - data16 = GetMonData(&gEnemyParty[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); - size = 1; - break; - case REQUEST_BEAUTY_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY); - size = 1; - break; - case REQUEST_CUTE_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE); - size = 1; - break; - case REQUEST_SMART_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART); - size = 1; - break; - case REQUEST_TOUGH_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH); - size = 1; - break; - case REQUEST_SHEEN_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SHEEN); - size = 1; - break; - case REQUEST_COOL_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON); - size = 1; - break; - case REQUEST_BEAUTY_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON); - size = 1; - break; - case REQUEST_CUTE_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON); - size = 1; - break; - case REQUEST_SMART_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON); - size = 1; - break; - case REQUEST_TOUGH_RIBBON_BATTLE: - dst[0] = GetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON); - size = 1; - break; - } - return size; -} - -static void OpponentHandleGetRawMonData(u32 battler) -{ - struct BattlePokemon battleMon; - u8 *src = (u8 *)&gEnemyParty[gBattlerPartyIndexes[battler]] + gBattleResources->bufferA[battler][1]; - u8 *dst = (u8 *)&battleMon + gBattleResources->bufferA[battler][1]; - u8 i; - - for (i = 0; i < gBattleResources->bufferA[battler][2]; ++i) - dst[i] = src[i]; - BtlController_EmitDataTransfer(battler, BUFFER_B, gBattleResources->bufferA[battler][2], dst); - OpponentBufferExecCompleted(battler); -} - -static void OpponentHandleSetMonData(u32 battler) -{ - u8 monToCheck; - u8 i; - - if (gBattleResources->bufferA[battler][2] == 0) - { - SetOpponentMonData(battler, gBattlerPartyIndexes[battler]); - } - else - { - monToCheck = gBattleResources->bufferA[battler][2]; - for (i = 0; i < PARTY_SIZE; ++i) - { - if (monToCheck & 1) - SetOpponentMonData(battler, i); - monToCheck >>= 1; - } - } - OpponentBufferExecCompleted(battler); -} - -static void SetOpponentMonData(u32 battler, u8 monId) -{ - struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleResources->bufferA[battler][3]; - struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleResources->bufferA[battler][3]; - s32 i; - - switch (gBattleResources->bufferA[battler][1]) - { - case REQUEST_ALL_BATTLE: - { - u8 iv; - - 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(&gEnemyParty[monId], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); - SetMonData(&gEnemyParty[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); - iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &iv); - iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &iv); - iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &iv); - iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &iv); - iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[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); - } - break; - case REQUEST_SPECIES_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_HELDITEM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HELD_ITEM, &gBattleResources->bufferA[battler][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(&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: - SetMonData(&gEnemyParty[monId], MON_DATA_MOVE1 + gBattleResources->bufferA[battler][1] - REQUEST_MOVE1_BATTLE, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_PP_DATA_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1, &gBattleResources->bufferA[battler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP2, &gBattleResources->bufferA[battler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP3, &gBattleResources->bufferA[battler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP4, &gBattleResources->bufferA[battler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_PP_BONUSES, &gBattleResources->bufferA[battler][7]); - break; - case REQUEST_PPMOVE1_BATTLE: - case REQUEST_PPMOVE2_BATTLE: - case REQUEST_PPMOVE3_BATTLE: - case REQUEST_PPMOVE4_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PP1 + gBattleResources->bufferA[battler][1] - REQUEST_PPMOVE1_BATTLE, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_OTID_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_OT_ID, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_EXP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_EXP, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_HP_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_EV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_ATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_EV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_DEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_EV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPEED_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_EV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPATK_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_EV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPDEF_EV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_EV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_FRIENDSHIP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_FRIENDSHIP, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_POKERUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKERUS, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_MET_LOCATION_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LOCATION, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_MET_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_LEVEL, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_MET_GAME_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MET_GAME, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_POKEBALL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_POKEBALL, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_ALL_IVS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[battler][3]); - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[battler][4]); - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[battler][5]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[battler][6]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[battler][7]); - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[battler][8]); - break; - case REQUEST_HP_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP_IV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_ATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK_IV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_DEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF_IV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPEED_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED_IV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPATK_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK_IV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPDEF_IV_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF_IV, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_PERSONALITY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_PERSONALITY, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_CHECKSUM_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CHECKSUM, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_STATUS_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_STATUS, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_LEVEL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_LEVEL, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_HP, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_MAX_HP_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_MAX_HP, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_ATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_ATK, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_DEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_DEF, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPEED_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPEED, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPATK_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPATK, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SPDEF_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SPDEF, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_COOL_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_BEAUTY_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_CUTE_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SMART_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_TOUGH_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SHEEN_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SHEEN, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_COOL_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_COOL_RIBBON, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_BEAUTY_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_BEAUTY_RIBBON, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_CUTE_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_CUTE_RIBBON, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_SMART_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_SMART_RIBBON, &gBattleResources->bufferA[battler][3]); - break; - case REQUEST_TOUGH_RIBBON_BATTLE: - SetMonData(&gEnemyParty[monId], MON_DATA_TOUGH_RIBBON, &gBattleResources->bufferA[battler][3]); - break; - } -} - -static void OpponentHandleSetRawMonData(u32 battler) -{ - u8 *dst = (u8 *)&gEnemyParty[gBattlerPartyIndexes[battler]] + gBattleResources->bufferA[battler][1]; - u8 i; - - for (i = 0; i < gBattleResources->bufferA[battler][2]; ++i) - dst[i] = gBattleResources->bufferA[battler][3 + i]; - OpponentBufferExecCompleted(battler); -} - static void OpponentHandleLoadMonSprite(u32 battler) { - u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); - u32 y; - - if (gBattleTypeFlags & BATTLE_TYPE_GHOST) - { - DecompressGhostFrontPic(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); - y = GetGhostSpriteDefault_Y(battler); - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = TRUE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE; - } - else - { - BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); - y = GetBattlerSpriteDefault_Y(battler); - } - SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), - y, - GetBattlerSpriteSubpriority(battler)); - gSprites[gBattlerSpriteIds[battler]].x2 = -DISPLAY_WIDTH; - gSprites[gBattlerSpriteIds[battler]].data[0] = battler; - gSprites[gBattlerSpriteIds[battler]].data[2] = species; - gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - if (!(gBattleTypeFlags & BATTLE_TYPE_GHOST)) - SetBattlerShadowSpriteCallback(battler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES)); - gBattlerControllerFuncs[battler] = TryShinyAnimAfterMonAnim; + BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim); } static void OpponentHandleSwitchInAnim(u32 battler) { - *(gBattleStruct->monToSwitchIntoId + battler) = 6; - gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1]; - StartSendOutAnim(battler, gBattleResources->bufferA[battler][2]); - gBattlerControllerFuncs[battler] = SwitchIn_TryShinyAnim; + gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE; + BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim); } -// static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) -// { -// u16 species; - -// ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); -// gBattlerPartyIndexes[battlerId] = gBattleResources->bufferA[battlerId][1]; -// species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); -// gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); -// BattleLoadMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); -// SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); -// gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, -// GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), -// GetBattlerSpriteDefault_Y(battlerId), -// GetBattlerSpriteSubpriority(battlerId)); -// gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; -// gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; -// gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; -// 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(battlerId, 0, POKEBALL_OPPONENT_SENDOUT); -// } - -static void OpponentHandleReturnMonToBall(u32 battler) -{ - if (!gBattleResources->bufferA[battler][1]) - { - gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0; - gBattlerControllerFuncs[battler] = DoSwitchOutAnimation; - } - else - { - FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[battler]]); - DestroySprite(&gSprites[gBattlerSpriteIds[battler]]); - HideBattlerShadowSprite(battler); - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]); - OpponentBufferExecCompleted(battler); - } -} - -static void DoSwitchOutAnimation(u32 battler) -{ - switch (gBattleSpritesDataPtr->healthBoxesData[battler].animationState) - { - case 0: - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_SUBSTITUTE_TO_MON); - gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 1; - break; - case 1: - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) - { - gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0; - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_SWITCH_OUT_OPPONENT_MON); - gBattlerControllerFuncs[battler] = FreeMonSpriteAfterSwitchOutAnim; - } - break; - } -} - -static void OpponentHandleDrawTrainerPic(u32 battler) +static u32 OpponentGetTrainerPicId(u32 battlerId) // TODO: trainer refactoring { u32 trainerPicId; - if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) - trainerPicId = GetSecretBaseTrainerPicIndex(); - else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) trainerPicId = GetBattleTowerTrainerFrontSpriteId(); else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER) trainerPicId = GetTrainerTowerTrainerFrontSpriteId(); @@ -1132,20 +426,28 @@ static void OpponentHandleDrawTrainerPic(u32 battler) trainerPicId = GetEreaderTrainerFrontSpriteId(); else trainerPicId = gTrainers[gTrainerBattleOpponent_A].trainerPic; - DecompressTrainerFrontPic(trainerPicId, battler); - SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(battler)); - gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, - 176, - (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, - GetBattlerSpriteSubpriority(battler)); - gSprites[gBattlerSpriteIds[battler]].x2 = -DISPLAY_WIDTH; - gSprites[gBattlerSpriteIds[battler]].data[0] = 2; - gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); - gSprites[gBattlerSpriteIds[battler]].data[5] = gSprites[gBattlerSpriteIds[battler]].oam.tileNum; - gSprites[gBattlerSpriteIds[battler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag); - gSprites[gBattlerSpriteIds[battler]].oam.affineParam = trainerPicId; - gSprites[gBattlerSpriteIds[battler]].callback = SpriteCB_TrainerSlideIn; - gBattlerControllerFuncs[battler] = CompleteOnBattlerSpriteCallbackDummy; + + return trainerPicId; +} + +static void OpponentHandleDrawTrainerPic(u32 battler) +{ + s16 xPos; + u32 trainerPicId = OpponentGetTrainerPicId(battler); + + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS) && !BATTLE_TWO_VS_ONE_OPPONENT) + { + if ((GetBattlerPosition(battler) & BIT_FLANK) != 0) // second mon + xPos = 152; + else // first mon + xPos = 200; + } + else + { + xPos = 176; + } + + BtlController_HandleDrawTrainerPic(battler, trainerPicId, TRUE, xPos, 40, -1); } static void OpponentHandleTrainerSlide(u32 battler) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 4b44d9b8d..39da44367 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -2006,6 +2006,43 @@ void BtlController_HandleSetRawMonData(u32 battler) BattleControllerComplete(battler); } +void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler)) +{ + u32 y; + struct Pokemon *party = GetBattlerParty(battler); + u16 species = GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + + if (gBattleTypeFlags & BATTLE_TYPE_GHOST && GetBattlerSide(battler) == B_SIDE_OPPONENT) + { + DecompressGhostFrontPic(&party[gBattlerPartyIndexes[battler]], battler); + y = GetGhostSpriteDefault_Y(battler); + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = TRUE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = TRUE; + } + else + { + BattleLoadMonSpriteGfx(&party[gBattlerPartyIndexes[battler]], battler); + y = GetBattlerSpriteDefault_Y(battler); + } + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); + + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + y, + GetBattlerSpriteSubpriority(battler)); + + gSprites[gBattlerSpriteIds[battler]].x2 = -DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); + + if (!(gBattleTypeFlags & BATTLE_TYPE_GHOST)) + SetBattlerShadowSpriteCallback(battler, species); + + gBattlerControllerFuncs[battler] = controllerCallback; +} + void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler)) { if (isPlayerSide) @@ -2054,6 +2091,8 @@ void BtlController_HandleDrawTrainerPic(u32 battler, u32 trainerPicId, bool32 is gSprites[gBattlerSpriteIds[battler]].x2 = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[battler]].sSpeedX = 2; gSprites[gBattlerSpriteIds[battler]].oam.affineParam = trainerPicId; + gSprites[gBattlerSpriteIds[battler]].data[5] = gSprites[gBattlerSpriteIds[battler]].oam.tileNum; + gSprites[gBattlerSpriteIds[battler]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicId].tag); } else // Player's side {