diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_2.c | 4 | ||||
-rw-r--r-- | src/battle_7.c | 284 | ||||
-rw-r--r-- | src/battle_controller_link_opponent.c | 28 | ||||
-rw-r--r-- | src/battle_controller_link_partner.c | 32 | ||||
-rw-r--r-- | src/battle_controller_opponent.c | 28 | ||||
-rw-r--r-- | src/battle_controller_player.c | 42 | ||||
-rw-r--r-- | src/battle_controller_player_partner.c | 34 | ||||
-rw-r--r-- | src/battle_controller_recorded_opponent.c | 28 | ||||
-rw-r--r-- | src/battle_controller_recorded_player.c | 36 | ||||
-rw-r--r-- | src/battle_controller_safari.c | 8 | ||||
-rw-r--r-- | src/battle_controller_wally.c | 24 | ||||
-rw-r--r-- | src/battle_dome_cards.c | 4 | ||||
-rw-r--r-- | src/battle_gfx_sfx_util.c | 1299 | ||||
-rw-r--r-- | src/battle_interface.c | 10 | ||||
-rw-r--r-- | src/battle_script_commands.c | 47 | ||||
-rw-r--r-- | src/pokemon_3.c | 6 | ||||
-rw-r--r-- | src/reshow_battle_screen.c | 14 |
17 files changed, 1477 insertions, 451 deletions
diff --git a/src/battle_2.c b/src/battle_2.c index 24b43bdbd..e4ee624fb 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -4767,7 +4767,7 @@ static void HandleEndTurn_BattleWon(void) else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_x4000000 | BATTLE_TYPE_EREADER_TRAINER)) { - BattleMusicStop(); + BattleStopLowHpSound(); gBattlescriptCurrInstr = BattleScript_FrontierTrainerBattleWon; if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE) @@ -4777,7 +4777,7 @@ static void HandleEndTurn_BattleWon(void) } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) { - BattleMusicStop(); + BattleStopLowHpSound(); gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon; switch (gTrainers[gTrainerBattleOpponent_A].trainerClass) diff --git a/src/battle_7.c b/src/battle_7.c deleted file mode 100644 index 8e21f9df5..000000000 --- a/src/battle_7.c +++ /dev/null @@ -1,284 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_controllers.h" -#include "battle_ai_script_commands.h" -#include "malloc.h" -#include "rng.h" -#include "util.h" -#include "pokemon.h" -#include "moves.h" - -extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200]; -extern u8 gActiveBank; -extern u16 gUnknown_020243FC; -extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; - -extern const struct BattleMove gBattleMoves[]; -extern const u8 gUnknown_0831C604[]; - -// this file's functions -u8 sub_805D4A8(u16 move); -u16 BattlePalaceGetTargetRetValue(void); -void sub_805D7EC(struct Sprite *sprite); - -void AllocateBattleSpritesData(void) -{ - gBattleSpritesDataPtr = AllocZeroed(sizeof(struct BattleSpriteData)); - gBattleSpritesDataPtr->bankData = AllocZeroed(sizeof(struct BattleSpriteInfo) * BATTLE_BANKS_COUNT); - gBattleSpritesDataPtr->healthBoxesData = AllocZeroed(sizeof(struct BattleHealthboxInfo) * BATTLE_BANKS_COUNT); - gBattleSpritesDataPtr->animationData = AllocZeroed(sizeof(struct BattleAnimationInfo)); - gBattleSpritesDataPtr->battleBars = AllocZeroed(sizeof(struct BattleBarInfo) * BATTLE_BANKS_COUNT); -} - -void FreeBattleSpritesData(void) -{ - if (gBattleSpritesDataPtr == NULL) - return; - - FREE_AND_SET_NULL(gBattleSpritesDataPtr->battleBars); - FREE_AND_SET_NULL(gBattleSpritesDataPtr->animationData); - FREE_AND_SET_NULL(gBattleSpritesDataPtr->healthBoxesData); - FREE_AND_SET_NULL(gBattleSpritesDataPtr->bankData); - FREE_AND_SET_NULL(gBattleSpritesDataPtr); -} - -u16 ChooseMoveAndTargetInBattlePalace(void) -{ - s32 i, var1, var2; - s32 chosenMoveId = -1; - struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]); - u8 unusableMovesBits = CheckMoveLimitations(gActiveBank, 0, 0xFF); - s32 percent = Random() % 100; - - i = (gBattleStruct->field_92 & gBitTable[gActiveBank]) ? 2 : 0; - var2 = i; - var1 = i + 2; - - for (; i < var1; i++) - { - if (gUnknown_0831C494[GetNatureFromPersonality(gBattleMons[gActiveBank].personality)][i] > percent) - break; - } - - percent = i - var2; - if (i == var1) - percent = 2; - - for (var2 = 0, i = 0; i < 4; i++) - { - if (moveInfo->moves[i] == MOVE_NONE) - break; - if (percent == sub_805D4A8(moveInfo->moves[i]) && moveInfo->currentPp[i] != 0) - var2 |= gBitTable[i]; - } - - if (var2 != 0) - { - gBattleStruct->field_92 &= 0xF; - gBattleStruct->field_92 |= (var2 << 4); - BattleAI_SetupAIData(var2); - chosenMoveId = BattleAI_ChooseMoveOrAction(); - } - - if (chosenMoveId == -1) - { - if (unusableMovesBits != 0xF) - { - var1 = 0, var2 = 0; - - for (i = 0; i < 4; i++) - { - if (sub_805D4A8(moveInfo->moves[i]) == 0 && !(gBitTable[i] & unusableMovesBits)) - var1 += 0x1; - if (sub_805D4A8(moveInfo->moves[i]) == 1 && !(gBitTable[i] & unusableMovesBits)) - var1 += 0x10; - if (sub_805D4A8(moveInfo->moves[i]) == 2 && !(gBitTable[i] & unusableMovesBits)) - var1 += 0x100; - } - - if ((var1 & 0xF) > 1) - var2++; - if ((var1 & 0xF0) > 0x1F) - var2++; - if ((var1 & 0xF0) > 0x1FF) - var2++; - - if (var2 > 1 || var2 == 0) - { - do - { - i = Random() % 4; - if (!(gBitTable[i] & unusableMovesBits)) - chosenMoveId = i; - } while (chosenMoveId == -1); - } - else - { - if ((var1 & 0xF) > 1) - var2 = 0; - if ((var1 & 0xF0) > 0x1F) - var2 = 1; - if ((var1 & 0xF0) > 0x1FF) - var2 = 2; - - do - { - i = Random() % 4; - if (!(gBitTable[i] & unusableMovesBits) && var2 == sub_805D4A8(moveInfo->moves[i])) - chosenMoveId = i; - } while (chosenMoveId == -1); - } - - if (Random() % 100 > 49) - { - gProtectStructs[gActiveBank].flag_x10 = 1; - return 0; - } - } - else - { - gProtectStructs[gActiveBank].flag_x10 = 1; - return 0; - } - } - - if (moveInfo->moves[chosenMoveId] == MOVE_CURSE) - { - if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST) - var1 = MOVE_TARGET_x10; - else - var1 = MOVE_TARGET_SELECTED; - } - else - { - var1 = gBattleMoves[moveInfo->moves[chosenMoveId]].target; - } - - if (var1 & MOVE_TARGET_x10) - chosenMoveId |= (gActiveBank << 8); - else if (var1 == MOVE_TARGET_SELECTED) - chosenMoveId |= (BattlePalaceGetTargetRetValue()); - else - chosenMoveId |= (GetBankByIdentity((GetBankIdentity(gActiveBank) & BIT_SIDE) ^ BIT_SIDE) << 8); - - return chosenMoveId; -} - -u8 sub_805D4A8(u16 move) -{ - switch (gBattleMoves[move].target) - { - case MOVE_TARGET_SELECTED: - case MOVE_TARGET_USER: - case MOVE_TARGET_RANDOM: - case MOVE_TARGET_BOTH: - case MOVE_TARGET_FOES_AND_ALLY: - if (gBattleMoves[move].power == 0) - return 2; - else - return 0; - break; - case MOVE_TARGET_DEPENDS: - case MOVE_TARGET_OPPONENTS_FIELD: - return 2; - case MOVE_TARGET_x10: - return 1; - default: - return 0; - } -} - -u16 BattlePalaceGetTargetRetValue(void) -{ - if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { - u8 opposing1, opposing2; - - if (GetBankSide(gActiveBank) == SIDE_PLAYER) - { - opposing1 = GetBankByIdentity(IDENTITY_OPPONENT_MON1); - opposing2 = GetBankByIdentity(IDENTITY_OPPONENT_MON2); - } - else - { - opposing1 = GetBankByIdentity(IDENTITY_PLAYER_MON1); - opposing2 = GetBankByIdentity(IDENTITY_PLAYER_MON2); - } - - if (gBattleMons[opposing1].hp == gBattleMons[opposing2].hp) - return (((gActiveBank & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8; - - switch (gUnknown_0831C604[GetNatureFromPersonality(gBattleMons[gActiveBank].personality)]) - { - case 0: - if (gBattleMons[opposing1].hp > gBattleMons[opposing2].hp) - return opposing1 << 8; - else - return opposing2 << 8; - case 1: - if (gBattleMons[opposing1].hp < gBattleMons[opposing2].hp) - return opposing1 << 8; - else - return opposing2 << 8; - case 2: - return (((gActiveBank & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8; - } - } - - return (gActiveBank ^ BIT_SIDE) << 8; -} - -void sub_805D714(struct Sprite *sprite) -{ - u8 spriteId = sprite->data1; - - if (!gSprites[spriteId].affineAnimEnded) - return; - if (gSprites[spriteId].invisible) - return; - - if (gSprites[spriteId].animPaused) - { - gSprites[spriteId].animPaused = 0; - } - else - { - if (gSprites[spriteId].animEnded) - sprite->callback = SpriteCallbackDummy; - } -} - -void sub_805D770(struct Sprite *sprite, bool8 arg1) -{ - sprite->animPaused = 1; - sprite->callback = SpriteCallbackDummy; - - if (!arg1) - StartSpriteAffineAnim(sprite, 1); - else - StartSpriteAffineAnim(sprite, 1); - - AnimateSprite(sprite); -} - -void sub_805D7AC(struct Sprite *sprite) -{ - if (!(gUnknown_020243FC & 1)) - { - sprite->pos2.x += sprite->data0; - if (sprite->pos2.x == 0) - { - if (sprite->pos2.y != 0) - sprite->callback = sub_805D7EC; - else - sprite->callback = SpriteCallbackDummy; - } - } -} - -void sub_805D7EC(struct Sprite *sprite) -{ - sprite->pos2.y -= 2; - if (sprite->pos2.y == 0) - sprite->callback = SpriteCallbackDummy; -} diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 968f6d49f..cb2ca0a4c 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -449,7 +449,7 @@ static void sub_8064C58(void) { FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); - sub_805EEE0(gActiveBank); + EnemyShadowCallbackToSetInvisible(gActiveBank); SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]); LinkOpponentBufferExecCompleted(); } @@ -485,7 +485,7 @@ static void sub_8064D60(void) if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleBankFunc[gActiveBank] = sub_8064DD0; } @@ -1164,7 +1164,7 @@ static void LinkOpponentHandleLoadMonSprite(void) gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(gActiveBank, 2), - sub_80A6138(gActiveBank), + GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; @@ -1198,7 +1198,7 @@ static void sub_8066494(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; @@ -1227,7 +1227,7 @@ static void LinkOpponentHandleReturnMonToBall(void) { FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); - sub_805EEE0(gActiveBank); + EnemyShadowCallbackToSetInvisible(gActiveBank); SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]); LinkOpponentBufferExecCompleted(); } @@ -1239,7 +1239,7 @@ static void DoSwitchOutAnimation(void) { case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1247,7 +1247,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON); gBattleBankFunc[gActiveBank] = sub_8064C58; } break; @@ -1382,7 +1382,7 @@ static void LinkOpponentHandleFaintAnimation(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++; } else @@ -1455,7 +1455,7 @@ static void LinkOpponentDoMoveAnimation(void) && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8) { gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1474,7 +1474,7 @@ static void LinkOpponentDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; @@ -1483,7 +1483,7 @@ static void LinkOpponentDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; LinkOpponentBufferExecCompleted(); @@ -1586,7 +1586,7 @@ static void LinkOpponentHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBank)) { - DoStatusAnimation(gBattleBufferA[gActiveBank][1], + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation; } @@ -1698,7 +1698,7 @@ static void LinkOpponentHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -1850,7 +1850,7 @@ static void LinkOpponentHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) LinkOpponentBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 4a70a4dc1..79776c15d 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -312,7 +312,7 @@ static void CompleteOnHealthbarDone(void) } else { - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); LinkPartnerBufferExecCompleted(); } } @@ -373,7 +373,7 @@ static void sub_814B4E0(void) { CopyBattleSpriteInvisibility(gActiveBank); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleBankFunc[gActiveBank] = sub_814B554; } @@ -399,7 +399,7 @@ static void sub_814B5A8(void) FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0); UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL); sub_8076918(gActiveBank); @@ -1026,7 +1026,7 @@ static void SetLinkPartnerMonData(u8 monId) break; } - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } static void LinkPartnerHandleSetRawMonData(void) @@ -1050,7 +1050,7 @@ static void LinkPartnerHandleLoadMonSprite(void) gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(gActiveBank, 2), - sub_80A6138(gActiveBank), + GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; @@ -1081,7 +1081,7 @@ static void sub_814CC98(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; @@ -1121,7 +1121,7 @@ static void DoSwitchOutAnimation(void) { case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1129,7 +1129,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattleBankFunc[gActiveBank] = sub_814B3DC; } break; @@ -1201,7 +1201,7 @@ static void LinkPartnerHandleFaintAnimation(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++; } else @@ -1209,7 +1209,7 @@ static void LinkPartnerHandleFaintAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER); gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; @@ -1277,7 +1277,7 @@ static void LinkPartnerDoMoveAnimation(void) && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8) { gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1296,7 +1296,7 @@ static void LinkPartnerDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; @@ -1305,7 +1305,7 @@ static void LinkPartnerDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; LinkPartnerBufferExecCompleted(); @@ -1408,7 +1408,7 @@ static void LinkPartnerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBank)) { - DoStatusAnimation(gBattleBufferA[gActiveBank][1], + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation; } @@ -1520,7 +1520,7 @@ static void LinkPartnerHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -1683,7 +1683,7 @@ static void LinkPartnerHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) LinkPartnerBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 7ffd9d64b..831f434b0 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -437,7 +437,7 @@ static void sub_805FB08(void) { FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); - sub_805EEE0(gActiveBank); + EnemyShadowCallbackToSetInvisible(gActiveBank); SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]); OpponentBufferExecCompleted(); } @@ -473,7 +473,7 @@ static void sub_805FC10(void) if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleBankFunc[gActiveBank] = sub_805FC80; } } @@ -1152,7 +1152,7 @@ static void OpponentHandleLoadMonSprite(void) gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(gActiveBank, 2), - sub_80A6138(gActiveBank), + GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; @@ -1187,7 +1187,7 @@ static void sub_80613DC(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gBankSpriteIds[bank]].data0 = bank; @@ -1217,7 +1217,7 @@ static void OpponentHandleReturnMonToBall(void) { FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); - sub_805EEE0(gActiveBank); + EnemyShadowCallbackToSetInvisible(gActiveBank); SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]); OpponentBufferExecCompleted(); } @@ -1229,7 +1229,7 @@ static void DoSwitchOutAnimation(void) { case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1237,7 +1237,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON); gBattleBankFunc[gActiveBank] = sub_805FB08; } break; @@ -1415,7 +1415,7 @@ static void OpponentHandleFaintAnimation(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++; } else @@ -1487,7 +1487,7 @@ static void OpponentDoMoveAnimation(void) && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8) { gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1506,7 +1506,7 @@ static void OpponentDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; @@ -1515,7 +1515,7 @@ static void OpponentDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; OpponentBufferExecCompleted(); @@ -1731,7 +1731,7 @@ static void OpponentHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBank)) { - DoStatusAnimation(gBattleBufferA[gActiveBank][1], + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation; } @@ -1843,7 +1843,7 @@ static void OpponentHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -2000,7 +2000,7 @@ static void OpponentHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) OpponentBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 10d361cb9..91d3d55eb 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1008,10 +1008,10 @@ static void sub_805896C(void) FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); if (IsDoubleBattle()) - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], gActiveBank ^ BIT_MON); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], gActiveBank ^ BIT_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3; gBattleBankFunc[gActiveBank] = sub_8058924; @@ -1107,7 +1107,7 @@ static void sub_8058EDC(void) FreeSpritePaletteByTag(0x27F9); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleBankFunc[gActiveBank] = sub_8058FC0; } @@ -1119,7 +1119,7 @@ static void sub_8058FC0(void) && !IsCryPlayingOrClearCrySongs()) { m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlayerBufferExecCompleted(); } } @@ -1164,7 +1164,7 @@ static void CompleteOnHealthbarDone(void) } else { - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlayerBufferExecCompleted(); } } @@ -1305,7 +1305,7 @@ static void sub_8059544(u8 taskId) if (IsDoubleBattle() == TRUE && monIndex == gBattlePartyID[bank ^ BIT_MON]) bank ^= BIT_MON; - DoSpecialBattleAnimation(bank, bank, bank, B_ANIM_LVL_UP); + InitAndLaunchSpecialAnimation(bank, bank, bank, B_ANIM_LVL_UP); gTasks[taskId].func = sub_80595A4; } @@ -2193,7 +2193,7 @@ static void SetPlayerMonData(u8 monId) break; } - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } static void PlayerHandleSetRawMonData(void) @@ -2238,7 +2238,7 @@ static void sub_805B258(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; @@ -2278,7 +2278,7 @@ static void DoSwitchOutAnimation(void) { case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -2286,7 +2286,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattleBankFunc[gActiveBank] = sub_8059744; } break; @@ -2434,7 +2434,7 @@ static void PlayerHandleFaintAnimation(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++; } else @@ -2442,7 +2442,7 @@ static void PlayerHandleFaintAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER); gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; @@ -2462,7 +2462,7 @@ static void PlayerHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_BALL_THROW); gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone; } @@ -2472,7 +2472,7 @@ static void PlayerHandleBallThrowAnim(void) gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_BALL_THROW); gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone; } @@ -2525,7 +2525,7 @@ static void PlayerDoMoveAnimation(void) && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8) { gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -2544,7 +2544,7 @@ static void PlayerDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; @@ -2553,7 +2553,7 @@ static void PlayerDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; PlayerBufferExecCompleted(); @@ -2709,7 +2709,7 @@ static void PlayerHandleChoosePokemon(void) static void PlayerHandleCmd23(void) { - BattleMusicStop(); + BattleStopLowHpSound(); BeginNormalPaletteFade(-1, 2, 0, 16, 0); PlayerBufferExecCompleted(); } @@ -2788,7 +2788,7 @@ static void PlayerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBank)) { - DoStatusAnimation(gBattleBufferA[gActiveBank][1], + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation; } @@ -2930,7 +2930,7 @@ static void PlayerHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -3088,7 +3088,7 @@ static void PlayerHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) PlayerBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 34fd8a3eb..6ace9121c 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -327,7 +327,7 @@ static void CompleteOnHealthbarDone(void) } else { - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlayerPartnerBufferExecCompleted(); } } @@ -469,7 +469,7 @@ static void sub_81BB628(u8 taskId) if (IsDoubleBattle() == TRUE && monIndex == gBattlePartyID[bank ^ BIT_MON]) bank ^= BIT_MON; - DoSpecialBattleAnimation(bank, bank, bank, B_ANIM_LVL_UP); + InitAndLaunchSpecialAnimation(bank, bank, bank, B_ANIM_LVL_UP); gTasks[taskId].func = sub_81BB688; } @@ -560,7 +560,7 @@ static void sub_81BB92C(void) { CopyBattleSpriteInvisibility(gActiveBank); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleBankFunc[gActiveBank] = sub_81BB9A0; } @@ -586,7 +586,7 @@ static void sub_81BB9F4(void) FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0); UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL); sub_8076918(gActiveBank); @@ -1213,7 +1213,7 @@ static void SetPlayerPartnerMonData(u8 monId) break; } - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } static void PlayerPartnerHandleSetRawMonData(void) @@ -1237,7 +1237,7 @@ static void PlayerPartnerHandleLoadMonSprite(void) gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(gActiveBank, 2), - sub_80A6138(gActiveBank), + GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; @@ -1268,7 +1268,7 @@ static void sub_81BD0E4(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; @@ -1308,7 +1308,7 @@ static void DoSwitchOutAnimation(void) { case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1316,7 +1316,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattleBankFunc[gActiveBank] = sub_81BB828; } break; @@ -1395,7 +1395,7 @@ static void PlayerPartnerHandleFaintAnimation(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++; } else @@ -1403,7 +1403,7 @@ static void PlayerPartnerHandleFaintAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_PLAYER); gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; @@ -1470,7 +1470,7 @@ static void PlayerPartnerDoMoveAnimation(void) && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8) { gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1489,7 +1489,7 @@ static void PlayerPartnerDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; @@ -1498,7 +1498,7 @@ static void PlayerPartnerDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; PlayerPartnerBufferExecCompleted(); @@ -1661,7 +1661,7 @@ static void PlayerPartnerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBank)) { - DoStatusAnimation(gBattleBufferA[gActiveBank][1], + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation; } @@ -1773,7 +1773,7 @@ static void PlayerPartnerHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -1929,7 +1929,7 @@ static void PlayerPartnerHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) PlayerPartnerBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 0dc7631ce..914ad9c43 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -433,7 +433,7 @@ static void sub_8186D9C(void) { FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); - sub_805EEE0(gActiveBank); + EnemyShadowCallbackToSetInvisible(gActiveBank); SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]); RecordedOpponentBufferExecCompleted(); } @@ -469,7 +469,7 @@ static void sub_8186EA4(void) if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleBankFunc[gActiveBank] = sub_8186F14; } @@ -1149,7 +1149,7 @@ static void RecordedOpponentHandleLoadMonSprite(void) gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(gActiveBank, 2), - sub_80A6138(gActiveBank), + GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); @@ -1184,7 +1184,7 @@ static void sub_81885D8(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; @@ -1213,7 +1213,7 @@ static void RecordedOpponentHandleReturnMonToBall(void) { FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]); DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]); - sub_805EEE0(gActiveBank); + EnemyShadowCallbackToSetInvisible(gActiveBank); SetHealthboxSpriteInvisible(gHealthBoxesIds[gActiveBank]); RecordedOpponentBufferExecCompleted(); } @@ -1225,7 +1225,7 @@ static void DoSwitchOutAnimation(void) { case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1233,7 +1233,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_OPPONENT_MON); gBattleBankFunc[gActiveBank] = sub_8186D9C; } break; @@ -1314,7 +1314,7 @@ static void RecordedOpponentHandleFaintAnimation(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++; } else @@ -1386,7 +1386,7 @@ static void RecordedOpponentDoMoveAnimation(void) && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8) { gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1405,7 +1405,7 @@ static void RecordedOpponentDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; @@ -1414,7 +1414,7 @@ static void RecordedOpponentDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; RecordedOpponentBufferExecCompleted(); @@ -1530,7 +1530,7 @@ static void RecordedOpponentHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBank)) { - DoStatusAnimation(gBattleBufferA[gActiveBank][1], + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation; } @@ -1642,7 +1642,7 @@ static void RecordedOpponentHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -1794,7 +1794,7 @@ static void RecordedOpponentHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) RecordedOpponentBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index a3343a391..8db7b5626 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -272,9 +272,9 @@ static void sub_8189AA0(void) FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); if (IsDoubleBattle()) - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], gActiveBank ^ BIT_MON); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank ^ BIT_MON]], gActiveBank ^ BIT_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_9 = 3; gBattleBankFunc[gActiveBank] = sub_8189A58; @@ -397,7 +397,7 @@ static void CompleteOnHealthbarDone(void) } else { - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); RecordedPlayerBufferExecCompleted(); } } @@ -458,7 +458,7 @@ static void sub_818A2B4(void) { CopyBattleSpriteInvisibility(gActiveBank); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleBankFunc[gActiveBank] = sub_818A328; } @@ -484,7 +484,7 @@ static void sub_818A37C(void) FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0); UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_ALL); sub_8076918(gActiveBank); @@ -1111,7 +1111,7 @@ static void SetRecordedPlayerMonData(u8 monId) break; } - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } static void RecordedPlayerHandleSetRawMonData(void) @@ -1135,7 +1135,7 @@ static void RecordedPlayerHandleLoadMonSprite(void) gBankSpriteIds[gActiveBank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(gActiveBank, 2), - sub_80A6138(gActiveBank), + GetBankSpriteDefault_Y(gActiveBank), sub_80A82E4(gActiveBank)); gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240; gSprites[gBankSpriteIds[gActiveBank]].data0 = gActiveBank; @@ -1166,7 +1166,7 @@ static void sub_818BA6C(u8 bank, bool8 dontClearSubstituteBit) gBankSpriteIds[bank] = CreateSprite( &gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; @@ -1206,7 +1206,7 @@ static void DoSwitchOutAnimation(void) { case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1214,7 +1214,7 @@ static void DoSwitchOutAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattleBankFunc[gActiveBank] = sub_818A1B0; } break; @@ -1313,7 +1313,7 @@ static void RecordedPlayerHandleFaintAnimation(void) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState == 0) { if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState++; } else @@ -1321,7 +1321,7 @@ static void RecordedPlayerHandleFaintAnimation(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PlaySE12WithPanning(SE_POKE_DEAD, -64); gSprites[gBankSpriteIds[gActiveBank]].data1 = 0; gSprites[gBankSpriteIds[gActiveBank]].data2 = 5; @@ -1388,7 +1388,7 @@ static void RecordedPlayerDoMoveAnimation(void) && !gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8) { gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 1; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1407,7 +1407,7 @@ static void RecordedPlayerDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute && multihit < 2) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); gBattleSpritesDataPtr->bankData[gActiveBank].flag_x8 = 0; } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; @@ -1416,7 +1416,7 @@ static void RecordedPlayerDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; RecordedPlayerBufferExecCompleted(); @@ -1549,7 +1549,7 @@ static void RecordedPlayerHandleStatusAnimation(void) { if (!mplay_80342A4(gActiveBank)) { - DoStatusAnimation(gBattleBufferA[gActiveBank][1], + InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); gBattleBankFunc[gActiveBank] = CompleteOnFinishedStatusAnimation; } @@ -1661,7 +1661,7 @@ static void RecordedPlayerHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -1813,7 +1813,7 @@ static void RecordedPlayerHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) RecordedPlayerBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 0c5b698cf..468a92610 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -413,7 +413,7 @@ static void SafariHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone; } @@ -423,7 +423,7 @@ static void SafariHandleBallThrowAnim(void) gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone; } @@ -624,7 +624,7 @@ static void SafariHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -683,7 +683,7 @@ static void SafariHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) SafariBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index c2addd30c..ec052555a 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -369,7 +369,7 @@ static void sub_8168818(void) FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); WallyBufferExecCompleted(); } @@ -387,7 +387,7 @@ static void CompleteOnHealthbarDone(void) } else { - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); WallyBufferExecCompleted(); } } @@ -1029,7 +1029,7 @@ static void SetWallyMonData(u8 monId) break; } - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); } static void WallyHandleSetRawMonData(void) @@ -1051,7 +1051,7 @@ static void WallyHandleReturnMonToBall(void) { if (gBattleBufferA[gActiveBank][1] == 0) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SWITCH_OUT_PLAYER_MON); gBattleBankFunc[gActiveBank] = sub_8168A20; } else @@ -1112,7 +1112,7 @@ static void WallyHandleSuccessBallThrowAnim(void) { gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS; gDoingBattleAnim = TRUE; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); gBattleBankFunc[gActiveBank] = CompleteOnFinishedAnimation; } @@ -1122,7 +1122,7 @@ static void WallyHandleBallThrowAnim(void) gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId; gDoingBattleAnim = TRUE; - DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW); gBattleBankFunc[gActiveBank] = CompleteOnFinishedAnimation; } @@ -1163,7 +1163,7 @@ static void WallyDoMoveAnimation(void) case 0: if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_SUBSTITUTE_TO_MON); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 1; break; @@ -1182,7 +1182,7 @@ static void WallyDoMoveAnimation(void) sub_805EB9C(1); if (gBattleSpritesDataPtr->bankData[gActiveBank].behindSubstitute) { - DoSpecialBattleAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); + InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, gActiveBank, B_ANIM_MON_TO_SUBSTITUTE); } gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 3; } @@ -1190,7 +1190,7 @@ static void WallyDoMoveAnimation(void) case 3: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive) { - sub_805E394(); + CopyAllBattleSpritesInvisibilities(); TrySetBehindSubstituteSpriteBit(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animationState = 0; WallyBufferExecCompleted(); @@ -1429,7 +1429,7 @@ static void WallyHandlePlayFanfareOrBGM(void) { if (gBattleBufferA[gActiveBank][3]) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); } else @@ -1496,7 +1496,7 @@ static void sub_816AA80(u8 bank) sub_806A068(species, GetBankIdentity(bank)); gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, sub_80A5C6C(bank, 2), - sub_80A6138(bank), + GetBankSpriteDefault_Y(bank), sub_80A82E4(bank)); gSprites[gUnknown_03005D7C[bank]].data1 = gBankSpriteIds[bank]; @@ -1565,7 +1565,7 @@ static void WallyHandleBattleAnimation(void) u8 animationId = gBattleBufferA[gActiveBank][1]; u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); - if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) + if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument)) WallyBufferExecCompleted(); else gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation; diff --git a/src/battle_dome_cards.c b/src/battle_dome_cards.c index e6c67b20e..9385417b4 100644 --- a/src/battle_dome_cards.c +++ b/src/battle_dome_cards.c @@ -119,7 +119,7 @@ static void sub_818D0C4(u16 species, u32 otId, u32 personality, u8 paletteSlot, if (paletteTag == 0xFFFF) { gUnknown_0203CCEC.paletteTag |= 0xFFFF; - LoadCompressedPalette(species_and_otid_get_pal(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20); + LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20); } else { @@ -146,7 +146,7 @@ static void sub_818D180(u16 species, u32 otId, u32 personality, u8 paletteSlot, { if (!isTrainer) { - LoadCompressedPalette(species_and_otid_get_pal(species, otId, personality), paletteSlot * 0x10, 0x20); + LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), paletteSlot * 0x10, 0x20); } else { diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c new file mode 100644 index 000000000..99a82f3ca --- /dev/null +++ b/src/battle_gfx_sfx_util.c @@ -0,0 +1,1299 @@ +#include "global.h" +#include "battle.h" +#include "battle_controllers.h" +#include "battle_ai_script_commands.h" +#include "battle_anim.h" +#include "battle_interface.h" +#include "main.h" +#include "malloc.h" +#include "rng.h" +#include "util.h" +#include "pokemon.h" +#include "moves.h" +#include "task.h" +#include "sprite.h" +#include "sound.h" +#include "m4a.h" +#include "species.h" +#include "decompress.h" +#include "data2.h" +#include "palette.h" +#include "blend_palette.h" +#include "contest.h" +#include "songs.h" + +extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200]; +extern u8 gActiveBank; +extern u8 gNoOfAllBanks; +extern u16 gUnknown_020243FC; +extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; +extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; +extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; +extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT]; +extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT]; +extern u8 gBattleMonForms[BATTLE_BANKS_COUNT]; +extern u32 gTransformedPersonalities[BATTLE_BANKS_COUNT]; +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; +extern struct MusicPlayerInfo gMPlay_BGM; + +extern const struct BattleMove gBattleMoves[]; +extern const u8 gUnknown_0831C604[]; +extern const u8 * const gUnknown_082C9320[]; +extern const u8 * const gUnknown_082C937C[]; +extern const struct CompressedSpriteSheet gMonFrontPicTable[]; +extern const struct CompressedSpriteSheet gMonBackPicTable[]; +extern const struct CompressedSpriteSheet gTrainerFrontPicTable[]; +extern const struct CompressedSpriteSheet gTrainerBackPicTable[]; +extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; +extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; +extern const union AnimCmd* const * const gMonAnimationsSpriteAnimsPtrTable[]; +extern const struct SpriteTemplate gUnknown_08329D98[4]; +extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; +extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; +extern const u8 gEnemyMonElevation[]; + +// graphics +extern const u32 gUnknown_08C093F0[]; +extern const u32 gSubstituteDollTilemap[]; +extern const u32 gSubstituteDollGfx[]; +extern const u16 gSubstituteDollPal[]; +extern const u8 gUnknown_08C1F1C8[]; +extern const u8 gUnknown_08C1F46C[]; +extern const u8 gUnknown_08C1F5E8[]; +extern const u8 gUnknown_08C1F76C[]; +extern const u8 gUnknown_08C1F8E8[]; +extern const u8 gUnknown_08C0237C[]; +extern const u16 gBattleInterface_BallStatusBarPal[]; +extern const u16 gBattleInterface_BallDisplayPal[]; + +extern u8 sub_80688F8(u8, u8 bank); +extern u8 pokemon_order_func(u8); // party menu +extern void sub_81B8C68(void); + +// this file's functions +static u8 sub_805D4A8(u16 move); +static u16 BattlePalaceGetTargetRetValue(void); +static void sub_805D7EC(struct Sprite *sprite); +static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId); +static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId); +static void Task_ClearBitWhenSpecialAnimDone(u8 taskId); +static void ClearSpritesBankHealthboxAnimData(void); + +// const rom data +static const struct CompressedSpriteSheet gUnknown_0832C0D0 = +{ + gUnknown_08C1F1C8, 0x1000, TAG_HEALTHBOX_PLAYER1_TILE +}; + +static const struct CompressedSpriteSheet gUnknown_0832C0D8 = +{ + gUnknown_08C1F46C, 0x1000, TAG_HEALTHBOX_OPPONENT1_TILE +}; + +static const struct CompressedSpriteSheet gUnknown_0832C0E0[2] = +{ + {gUnknown_08C1F5E8, 0x800, TAG_HEALTHBOX_PLAYER1_TILE}, + {gUnknown_08C1F5E8, 0x800, TAG_HEALTHBOX_PLAYER2_TILE} +}; + +static const struct CompressedSpriteSheet gUnknown_0832C0F0[2] = +{ + {gUnknown_08C1F76C, 0x800, TAG_HEALTHBOX_OPPONENT1_TILE}, + {gUnknown_08C1F76C, 0x800, TAG_HEALTHBOX_OPPONENT2_TILE} +}; + +static const struct CompressedSpriteSheet gUnknown_0832C100 = +{ + gUnknown_08C1F8E8, 0x1000, TAG_HEALTHBOX_SAFARI_TILE +}; + +static const struct CompressedSpriteSheet gUnknown_0832C108[BATTLE_BANKS_COUNT] = +{ + {gUnknown_08C0237C, 0x0100, 0xd704}, + {gUnknown_08C0237C, 0x0120, 0xd705}, + {gUnknown_08C0237C, 0x0100, 0xd706}, + {gUnknown_08C0237C, 0x0120, 0xd707} +}; + +static const struct SpritePalette gUnknown_0832C128[2] = +{ + {gBattleInterface_BallStatusBarPal, TAG_HEALTHBOX_PAL}, + {gBattleInterface_BallDisplayPal, 0xd704} +}; + +// code +void AllocateBattleSpritesData(void) +{ + gBattleSpritesDataPtr = AllocZeroed(sizeof(struct BattleSpriteData)); + gBattleSpritesDataPtr->bankData = AllocZeroed(sizeof(struct BattleSpriteInfo) * BATTLE_BANKS_COUNT); + gBattleSpritesDataPtr->healthBoxesData = AllocZeroed(sizeof(struct BattleHealthboxInfo) * BATTLE_BANKS_COUNT); + gBattleSpritesDataPtr->animationData = AllocZeroed(sizeof(struct BattleAnimationInfo)); + gBattleSpritesDataPtr->battleBars = AllocZeroed(sizeof(struct BattleBarInfo) * BATTLE_BANKS_COUNT); +} + +void FreeBattleSpritesData(void) +{ + if (gBattleSpritesDataPtr == NULL) + return; + + FREE_AND_SET_NULL(gBattleSpritesDataPtr->battleBars); + FREE_AND_SET_NULL(gBattleSpritesDataPtr->animationData); + FREE_AND_SET_NULL(gBattleSpritesDataPtr->healthBoxesData); + FREE_AND_SET_NULL(gBattleSpritesDataPtr->bankData); + FREE_AND_SET_NULL(gBattleSpritesDataPtr); +} + +u16 ChooseMoveAndTargetInBattlePalace(void) +{ + s32 i, var1, var2; + s32 chosenMoveId = -1; + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]); + u8 unusableMovesBits = CheckMoveLimitations(gActiveBank, 0, 0xFF); + s32 percent = Random() % 100; + + i = (gBattleStruct->field_92 & gBitTable[gActiveBank]) ? 2 : 0; + var2 = i; + var1 = i + 2; + + for (; i < var1; i++) + { + if (gUnknown_0831C494[GetNatureFromPersonality(gBattleMons[gActiveBank].personality)][i] > percent) + break; + } + + percent = i - var2; + if (i == var1) + percent = 2; + + for (var2 = 0, i = 0; i < 4; i++) + { + if (moveInfo->moves[i] == MOVE_NONE) + break; + if (percent == sub_805D4A8(moveInfo->moves[i]) && moveInfo->currentPp[i] != 0) + var2 |= gBitTable[i]; + } + + if (var2 != 0) + { + gBattleStruct->field_92 &= 0xF; + gBattleStruct->field_92 |= (var2 << 4); + BattleAI_SetupAIData(var2); + chosenMoveId = BattleAI_ChooseMoveOrAction(); + } + + if (chosenMoveId == -1) + { + if (unusableMovesBits != 0xF) + { + var1 = 0, var2 = 0; + + for (i = 0; i < 4; i++) + { + if (sub_805D4A8(moveInfo->moves[i]) == 0 && !(gBitTable[i] & unusableMovesBits)) + var1 += 0x1; + if (sub_805D4A8(moveInfo->moves[i]) == 1 && !(gBitTable[i] & unusableMovesBits)) + var1 += 0x10; + if (sub_805D4A8(moveInfo->moves[i]) == 2 && !(gBitTable[i] & unusableMovesBits)) + var1 += 0x100; + } + + if ((var1 & 0xF) > 1) + var2++; + if ((var1 & 0xF0) > 0x1F) + var2++; + if ((var1 & 0xF0) > 0x1FF) + var2++; + + if (var2 > 1 || var2 == 0) + { + do + { + i = Random() % 4; + if (!(gBitTable[i] & unusableMovesBits)) + chosenMoveId = i; + } while (chosenMoveId == -1); + } + else + { + if ((var1 & 0xF) > 1) + var2 = 0; + if ((var1 & 0xF0) > 0x1F) + var2 = 1; + if ((var1 & 0xF0) > 0x1FF) + var2 = 2; + + do + { + i = Random() % 4; + if (!(gBitTable[i] & unusableMovesBits) && var2 == sub_805D4A8(moveInfo->moves[i])) + chosenMoveId = i; + } while (chosenMoveId == -1); + } + + if (Random() % 100 > 49) + { + gProtectStructs[gActiveBank].flag_x10 = 1; + return 0; + } + } + else + { + gProtectStructs[gActiveBank].flag_x10 = 1; + return 0; + } + } + + if (moveInfo->moves[chosenMoveId] == MOVE_CURSE) + { + if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST) + var1 = MOVE_TARGET_x10; + else + var1 = MOVE_TARGET_SELECTED; + } + else + { + var1 = gBattleMoves[moveInfo->moves[chosenMoveId]].target; + } + + if (var1 & MOVE_TARGET_x10) + chosenMoveId |= (gActiveBank << 8); + else if (var1 == MOVE_TARGET_SELECTED) + chosenMoveId |= (BattlePalaceGetTargetRetValue()); + else + chosenMoveId |= (GetBankByIdentity((GetBankIdentity(gActiveBank) & BIT_SIDE) ^ BIT_SIDE) << 8); + + return chosenMoveId; +} + +static u8 sub_805D4A8(u16 move) +{ + switch (gBattleMoves[move].target) + { + case MOVE_TARGET_SELECTED: + case MOVE_TARGET_USER: + case MOVE_TARGET_RANDOM: + case MOVE_TARGET_BOTH: + case MOVE_TARGET_FOES_AND_ALLY: + if (gBattleMoves[move].power == 0) + return 2; + else + return 0; + break; + case MOVE_TARGET_DEPENDS: + case MOVE_TARGET_OPPONENTS_FIELD: + return 2; + case MOVE_TARGET_x10: + return 1; + default: + return 0; + } +} + +static u16 BattlePalaceGetTargetRetValue(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + u8 opposing1, opposing2; + + if (GetBankSide(gActiveBank) == SIDE_PLAYER) + { + opposing1 = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + opposing2 = GetBankByIdentity(IDENTITY_OPPONENT_MON2); + } + else + { + opposing1 = GetBankByIdentity(IDENTITY_PLAYER_MON1); + opposing2 = GetBankByIdentity(IDENTITY_PLAYER_MON2); + } + + if (gBattleMons[opposing1].hp == gBattleMons[opposing2].hp) + return (((gActiveBank & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8; + + switch (gUnknown_0831C604[GetNatureFromPersonality(gBattleMons[gActiveBank].personality)]) + { + case 0: + if (gBattleMons[opposing1].hp > gBattleMons[opposing2].hp) + return opposing1 << 8; + else + return opposing2 << 8; + case 1: + if (gBattleMons[opposing1].hp < gBattleMons[opposing2].hp) + return opposing1 << 8; + else + return opposing2 << 8; + case 2: + return (((gActiveBank & BIT_SIDE) ^ BIT_SIDE) + (Random() & 2)) << 8; + } + } + + return (gActiveBank ^ BIT_SIDE) << 8; +} + +void sub_805D714(struct Sprite *sprite) +{ + u8 spriteId = sprite->data1; + + if (!gSprites[spriteId].affineAnimEnded) + return; + if (gSprites[spriteId].invisible) + return; + + if (gSprites[spriteId].animPaused) + { + gSprites[spriteId].animPaused = 0; + } + else + { + if (gSprites[spriteId].animEnded) + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_805D770(struct Sprite *sprite, bool8 arg1) +{ + sprite->animPaused = 1; + sprite->callback = SpriteCallbackDummy; + + if (!arg1) + StartSpriteAffineAnim(sprite, 1); + else + StartSpriteAffineAnim(sprite, 1); + + AnimateSprite(sprite); +} + +void sub_805D7AC(struct Sprite *sprite) +{ + if (!(gUnknown_020243FC & 1)) + { + sprite->pos2.x += sprite->data0; + if (sprite->pos2.x == 0) + { + if (sprite->pos2.y != 0) + sprite->callback = sub_805D7EC; + else + sprite->callback = SpriteCallbackDummy; + } + } +} + +static void sub_805D7EC(struct Sprite *sprite) +{ + sprite->pos2.y -= 2; + if (sprite->pos2.y == 0) + sprite->callback = SpriteCallbackDummy; +} + +void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status) +{ + gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive = 1; + if (!isStatus2) + { + if (status == STATUS_FREEZE) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_FRZ); + else if (status == STATUS_POISON || status & STATUS_TOXIC_POISON) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_PSN); + else if (status == STATUS_BURN) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_BRN); + else if (status & STATUS_SLEEP) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_SLP); + else if (status == STATUS_PARALYSIS) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_PRZ); + else // no animation + gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive = 0; + } + else + { + if (status & STATUS2_INFATUATION) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_INFATUATION); + else if (status & STATUS2_CONFUSION) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_CONFUSION); + else if (status & STATUS2_CURSED) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_CURSED); + else if (status & STATUS2_NIGHTMARE) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_NIGHTMARE); + else if (status & STATUS2_WRAPPED) + LaunchStatusAnimation(gActiveBank, B_ANIM_STATUS_WRAPPED); + else // no animation + gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive = 0; + } +} + +#define tBank data[0] + +bool8 TryHandleLaunchBattleTableAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId, u16 argument) +{ + u8 taskId; + + if (tableId == B_ANIM_CASTFORM_CHANGE && (argument & 0x80)) + { + gBattleMonForms[activeBank] = (argument & ~(0x80)); + return TRUE; + } + if (gBattleSpritesDataPtr->bankData[activeBank].behindSubstitute + && !ShouldAnimBeDoneRegardlessOfSubsitute(tableId)) + { + return TRUE; + } + if (gBattleSpritesDataPtr->bankData[activeBank].behindSubstitute + && tableId == B_ANIM_SUBSTITUTE_FADE + && gSprites[gBankSpriteIds[activeBank]].invisible) + { + LoadBattleMonGfxAndAnimate(activeBank, TRUE, gBankSpriteIds[activeBank]); + ClearBehindSubstituteBit(activeBank); + return TRUE; + } + + gAnimBankAttacker = atkBank; + gAnimBankTarget = defBank; + gBattleSpritesDataPtr->animationData->animArg = argument; + LaunchBattleAnimation(gUnknown_082C9320, tableId, FALSE); + taskId = CreateTask(Task_ClearBitWhenBattleTableAnimDone, 10); + gTasks[taskId].tBank = activeBank; + gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].animFromTableActive = 1; + + return FALSE; +} + +static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId) +{ + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].animFromTableActive = 0; + DestroyTask(taskId); + } +} + +#undef tBank + +static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId) +{ + switch (animId) + { + case B_ANIM_SUBSTITUTE_FADE: + case B_ANIM_RAIN_CONTINUES: + case B_ANIM_SUN_CONTINUES: + case B_ANIM_SANDSTORM_CONTINUES: + case B_ANIM_HAIL_CONTINUES: + case B_ANIM_SNATCH_MOVE: + return TRUE; + default: + return FALSE; + } +} + +#define tBank data[0] + +void InitAndLaunchSpecialAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId) +{ + u8 taskId; + + gAnimBankAttacker = atkBank; + gAnimBankTarget = defBank; + LaunchBattleAnimation(gUnknown_082C937C, tableId, FALSE); + taskId = CreateTask(Task_ClearBitWhenSpecialAnimDone, 10); + gTasks[taskId].tBank = activeBank; + gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].specialAnimActive = 1; +} + +static void Task_ClearBitWhenSpecialAnimDone(u8 taskId) +{ + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBank].specialAnimActive = 0; + DestroyTask(taskId); + } +} + +#undef tBank + +// great function to include newly added moves that don't have animation yet +bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) +{ + return FALSE; +} + +bool8 mplay_80342A4(u8 bank) +{ + u8 zero = 0; + + if (IsSEPlaying()) + { + gBattleSpritesDataPtr->healthBoxesData[bank].field_8++; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBank].field_8 < 30) + return TRUE; + + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + } + if (zero == 0) + { + gBattleSpritesDataPtr->healthBoxesData[bank].field_8 = 0; + return FALSE; + } + + return TRUE; +} + +void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 bank) +{ + u32 monsPersonality, currentPersonality, otId; + u16 species; + u8 identity; + u16 paletteOffset; + const void *lzPaletteData; + + monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); + + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE) + { + species = GetMonData(mon, MON_DATA_SPECIES); + currentPersonality = monsPersonality; + } + else + { + species = gBattleSpritesDataPtr->bankData[bank].transformSpecies; + currentPersonality = gTransformedPersonalities[bank]; + } + + otId = GetMonData(mon, MON_DATA_OT_ID); + identity = GetBankIdentity(bank); + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], + gMonSpritesGfxPtr->sprites[identity], + species, currentPersonality); + + paletteOffset = 0x100 + bank * 16; + + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE) + lzPaletteData = GetMonFrontSpritePal(mon); + else + lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality); + + LZDecompressWram(lzPaletteData, gDecompressionBuffer); + LoadPalette(gDecompressionBuffer, paletteOffset, 0x20); + LoadPalette(gDecompressionBuffer, 0x80 + bank * 16, 0x20); + + if (species == SPECIES_CASTFORM) + { + paletteOffset = 0x100 + bank * 16; + LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); + LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[bank]], paletteOffset, 0x20); + } + + // transform's pink color + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE) + { + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } +} + +void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 bank) +{ + u32 monsPersonality, currentPersonality, otId; + u16 species; + u8 identity; + u16 paletteOffset; + const void *lzPaletteData; + + monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); + + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE) + { + species = GetMonData(mon, MON_DATA_SPECIES); + currentPersonality = monsPersonality; + } + else + { + species = gBattleSpritesDataPtr->bankData[bank].transformSpecies; + currentPersonality = gTransformedPersonalities[bank]; + } + + otId = GetMonData(mon, MON_DATA_OT_ID); + identity = GetBankIdentity(bank); + + if (sub_80688F8(1, bank) == 1 || gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE) + { + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], + gMonSpritesGfxPtr->sprites[identity], + species, currentPersonality); + } + else + { + HandleLoadSpecialPokePic(&gMonBackPicTable[species], + gMonSpritesGfxPtr->sprites[identity], + species, currentPersonality); + } + + paletteOffset = 0x100 + bank * 16; + + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_NONE) + lzPaletteData = GetMonFrontSpritePal(mon); + else + lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality); + + LZDecompressWram(lzPaletteData, gDecompressionBuffer); + LoadPalette(gDecompressionBuffer, paletteOffset, 0x20); + LoadPalette(gDecompressionBuffer, 0x80 + bank * 16, 0x20); + + if (species == SPECIES_CASTFORM) + { + paletteOffset = 0x100 + bank * 16; + LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); + LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[bank]], paletteOffset, 0x20); + } + + // transform's pink color + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE) + { + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } +} + +void nullsub_23(void) +{ +} + +void nullsub_24(u16 species) +{ +} + +void DecompressTrainerFrontPic(u16 frontPicId, u8 bank) +{ + u8 identity = GetBankIdentity(bank); + DecompressPicFromTable_2(&gTrainerFrontPicTable[frontPicId], + gMonSpritesGfxPtr->sprites[identity], + SPECIES_NONE); + LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[frontPicId]); +} + +void DecompressTrainerBackPic(u16 backPicId, u8 bank) +{ + u8 identity = GetBankIdentity(bank); + DecompressPicFromTable_2(&gTrainerBackPicTable[backPicId], + gMonSpritesGfxPtr->sprites[identity], + SPECIES_NONE); + LoadCompressedPalette(gTrainerBackPicPaletteTable[backPicId].data, + 0x100 + 16 * bank, 0x20); +} + +void nullsub_25(u8 arg0) +{ +} + +void FreeTrainerFrontPicPalette(u16 frontPicId) +{ + FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[frontPicId].tag); +} + +void sub_805DFFC(void) +{ + u8 numberOfBanks = 0; + u8 i; + + LoadSpritePalette(&gUnknown_0832C128[0]); + LoadSpritePalette(&gUnknown_0832C128[1]); + if (!IsDoubleBattle()) + { + LoadCompressedObjectPic(&gUnknown_0832C0D0); + LoadCompressedObjectPic(&gUnknown_0832C0D8); + numberOfBanks = 2; + } + else + { + LoadCompressedObjectPic(&gUnknown_0832C0E0[0]); + LoadCompressedObjectPic(&gUnknown_0832C0E0[1]); + LoadCompressedObjectPic(&gUnknown_0832C0F0[0]); + LoadCompressedObjectPic(&gUnknown_0832C0F0[1]); + numberOfBanks = 4; + } + for (i = 0; i < numberOfBanks; i++) + LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[i]]); +} + +bool8 BattleLoadAllHealthBoxesGfx(u8 state) +{ + bool8 retVal = FALSE; + + if (state != 0) + { + if (state == 1) + { + LoadSpritePalette(&gUnknown_0832C128[0]); + LoadSpritePalette(&gUnknown_0832C128[1]); + } + else if (!IsDoubleBattle()) + { + if (state == 2) + { + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + LoadCompressedObjectPic(&gUnknown_0832C100); + else + LoadCompressedObjectPic(&gUnknown_0832C0D0); + } + else if (state == 3) + LoadCompressedObjectPic(&gUnknown_0832C0D8); + else if (state == 4) + LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[0]]); + else if (state == 5) + LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[1]]); + else + retVal = TRUE; + } + else + { + if (state == 2) + LoadCompressedObjectPic(&gUnknown_0832C0E0[0]); + else if (state == 3) + LoadCompressedObjectPic(&gUnknown_0832C0E0[1]); + else if (state == 4) + LoadCompressedObjectPic(&gUnknown_0832C0F0[0]); + else if (state == 5) + LoadCompressedObjectPic(&gUnknown_0832C0F0[1]); + else if (state == 6) + LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[0]]); + else if (state == 7) + LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[1]]); + else if (state == 8) + LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[2]]); + else if (state == 9) + LoadCompressedObjectPic(&gUnknown_0832C108[gBanksByIdentity[3]]); + else + retVal = TRUE; + } + } + + return retVal; +} + +void LoadBattleBarGfx(u8 arg0) +{ + LZDecompressWram(gUnknown_08C093F0, gMonSpritesGfxPtr->barFontGfx); +} + +bool8 BattleInitAllSprites(u8 *state1, u8 *bank) +{ + bool8 retVal = FALSE; + + switch (*state1) + { + case 0: + ClearSpritesBankHealthboxAnimData(); + (*state1)++; + break; + case 1: + if (!BattleLoadAllHealthBoxesGfx(*bank)) + { + (*bank)++; + } + else + { + *bank = 0; + (*state1)++; + } + break; + case 2: + (*state1)++; + break; + case 3: + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && *bank == 0) + gHealthBoxesIds[*bank] = CreateSafariPlayerHealthboxSprites(); + else + gHealthBoxesIds[*bank] = CreateBankHealthboxSprites(*bank); + + (*bank)++; + if (*bank == gNoOfAllBanks) + { + *bank = 0; + (*state1)++; + } + break; + case 4: + SetBankHealthboxSpritePos(*bank); + if (gBanksByIdentity[*bank] <= 1) + DummyBattleInterfaceFunc(gHealthBoxesIds[*bank], FALSE); + else + DummyBattleInterfaceFunc(gHealthBoxesIds[*bank], TRUE); + + (*bank)++; + if (*bank == gNoOfAllBanks) + { + *bank = 0; + (*state1)++; + } + break; + case 5: + if (GetBankSide(*bank) == SIDE_PLAYER) + { + if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) + UpdateHealthboxAttribute(gHealthBoxesIds[*bank], &gPlayerParty[gBattlePartyID[*bank]], HEALTHBOX_ALL); + } + else + { + UpdateHealthboxAttribute(gHealthBoxesIds[*bank], &gEnemyParty[gBattlePartyID[*bank]], HEALTHBOX_ALL); + } + SetHealthboxSpriteInvisible(gHealthBoxesIds[*bank]); + (*bank)++; + if (*bank == gNoOfAllBanks) + { + *bank = 0; + (*state1)++; + } + break; + case 6: + LoadAndCreateEnemyShadowSprites(); + sub_81B8C68(); + retVal = TRUE; + break; + } + + return retVal; +} + +void ClearSpritesHealthboxAnimData(void) +{ + memset(gBattleSpritesDataPtr->healthBoxesData, 0, sizeof(struct BattleHealthboxInfo) * BATTLE_BANKS_COUNT); + memset(gBattleSpritesDataPtr->animationData, 0, sizeof(struct BattleAnimationInfo)); +} + +static void ClearSpritesBankHealthboxAnimData(void) +{ + ClearSpritesHealthboxAnimData(); + memset(gBattleSpritesDataPtr->bankData, 0, sizeof(struct BattleSpriteInfo) * BATTLE_BANKS_COUNT); +} + +void CopyAllBattleSpritesInvisibilities(void) +{ + s32 i; + + for (i = 0; i < gNoOfAllBanks; i++) + gBattleSpritesDataPtr->bankData[i].invisible = gSprites[gBankSpriteIds[i]].invisible; +} + +void CopyBattleSpriteInvisibility(u8 bank) +{ + gBattleSpritesDataPtr->bankData[bank].invisible = gSprites[gBankSpriteIds[bank]].invisible; +} + +void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform) +{ + u16 paletteOffset; + u32 personalityValue; + u32 otId; + u8 identity; + const u8 *lzPaletteData; + + if (notTransform) + { + StartSpriteAnim(&gSprites[gBankSpriteIds[bankAtk]], gBattleSpritesDataPtr->animationData->animArg); + paletteOffset = 0x100 + bankAtk * 16; + LoadPalette(gBattleStruct->castformPalette[gBattleSpritesDataPtr->animationData->animArg], paletteOffset, 32); + gBattleMonForms[bankAtk] = gBattleSpritesDataPtr->animationData->animArg; + if (gBattleSpritesDataPtr->bankData[bankAtk].transformSpecies != SPECIES_NONE) + { + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + } + gSprites[gBankSpriteIds[bankAtk]].pos1.y = GetBankSpriteDefault_Y(bankAtk); + } + else + { + const void *src; + void *dst; + u16 targetSpecies; + + if (IsContest()) + { + identity = 0; + targetSpecies = gContestResources->field_18->field_2; + personalityValue = gContestResources->field_18->field_8; + otId = gContestResources->field_18->field_C; + + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], + gMonSpritesGfxPtr->sprites[0], + targetSpecies, + gContestResources->field_18->field_10); + } + else + { + identity = GetBankIdentity(bankAtk); + + if (GetBankSide(bankDef) == SIDE_OPPONENT) + targetSpecies = GetMonData(&gEnemyParty[gBattlePartyID[bankDef]], MON_DATA_SPECIES); + else + targetSpecies = GetMonData(&gPlayerParty[gBattlePartyID[bankDef]], MON_DATA_SPECIES); + + if (GetBankSide(bankAtk) == SIDE_PLAYER) + { + personalityValue = GetMonData(&gPlayerParty[gBattlePartyID[bankAtk]], MON_DATA_PERSONALITY); + otId = GetMonData(&gPlayerParty[gBattlePartyID[bankAtk]], MON_DATA_OT_ID); + + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], + gMonSpritesGfxPtr->sprites[identity], + targetSpecies, + gTransformedPersonalities[bankAtk]); + } + else + { + personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[bankAtk]], MON_DATA_PERSONALITY); + otId = GetMonData(&gEnemyParty[gBattlePartyID[bankAtk]], MON_DATA_OT_ID); + + HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies], + gMonSpritesGfxPtr->sprites[identity], + targetSpecies, + gTransformedPersonalities[bankAtk]); + } + } + + src = gMonSpritesGfxPtr->sprites[identity]; + dst = (void *)(VRAM + 0x10000 + gSprites[gBankSpriteIds[bankAtk]].oam.tileNum * 32); + DmaCopy32(3, src, dst, 0x800); + paletteOffset = 0x100 + bankAtk * 16; + lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue); + LZDecompressWram(lzPaletteData, gDecompressionBuffer); + LoadPalette(gDecompressionBuffer, paletteOffset, 32); + + if (targetSpecies == SPECIES_CASTFORM) + { + gSprites[gBankSpriteIds[bankAtk]].anims = gMonAnimationsSpriteAnimsPtrTable[targetSpecies]; + LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); + LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[bankDef] * 16, paletteOffset, 32); + } + + BlendPalette(paletteOffset, 16, 6, 0x7FFF); + CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); + + if (!IsContest()) + { + gBattleSpritesDataPtr->bankData[bankAtk].transformSpecies = targetSpecies; + gBattleMonForms[bankAtk] = gBattleMonForms[bankDef]; + } + + gSprites[gBankSpriteIds[bankAtk]].pos1.y = GetBankSpriteDefault_Y(bankAtk); + StartSpriteAnim(&gSprites[gBankSpriteIds[bankAtk]], gBattleMonForms[bankAtk]); + } +} + +void BattleLoadSubstituteOrMonSpriteGfx(u8 bank, bool8 loadMonSprite) +{ + u8 identity; + s32 i; + u32 var; + const void *substitutePal; + + if (!loadMonSprite) + { + if (IsContest()) + identity = 0; + else + identity = GetBankIdentity(bank); + + if (IsContest()) + LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[identity]); + else if (GetBankSide(bank) != SIDE_PLAYER) + LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites[identity]); + else + LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites[identity]); + + i = 1; + var = bank * 16; + substitutePal = gSubstituteDollPal; + for (; i < 4; i++) + { + register void *dmaSrc asm("r0") = gMonSpritesGfxPtr->sprites[identity]; + void *dmaDst = (i * 0x800) + dmaSrc; + u32 dmaSize = 0x800; + DmaCopy32(3, dmaSrc, dmaDst, dmaSize); + i++;i--; + } + + LoadCompressedPalette(substitutePal, 0x100 + var, 32); + } + else + { + if (!IsContest()) + { + if (GetBankSide(bank) != SIDE_PLAYER) + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank); + else + BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank); + } + } +} + +void LoadBattleMonGfxAndAnimate(u8 bank, bool8 loadMonSprite, u8 spriteId) +{ + BattleLoadSubstituteOrMonSpriteGfx(bank, loadMonSprite); + StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[bank]); + + if (!loadMonSprite) + gSprites[spriteId].pos1.y = GetSubstituteSpriteDefault_Y(bank); + else + gSprites[spriteId].pos1.y = GetBankSpriteDefault_Y(bank); +} + +void TrySetBehindSubstituteSpriteBit(u8 bank, u16 move) +{ + if (move == MOVE_SUBSTITUTE) + gBattleSpritesDataPtr->bankData[bank].behindSubstitute = 1; +} + +void ClearBehindSubstituteBit(u8 bank) +{ + gBattleSpritesDataPtr->bankData[bank].behindSubstitute = 0; +} + +void HandleLowHpMusicChange(struct Pokemon *mon, u8 bank) +{ + u16 hp = GetMonData(mon, MON_DATA_HP); + u16 maxHP = GetMonData(mon, MON_DATA_MAX_HP); + + if (GetHPBarLevel(hp, maxHP) == HP_BAR_RED) + { + if (!gBattleSpritesDataPtr->bankData[bank].lowHpSong) + { + if (!gBattleSpritesDataPtr->bankData[bank ^ BIT_MON].lowHpSong) + PlaySE(SE_HINSI); + gBattleSpritesDataPtr->bankData[bank].lowHpSong = 1; + } + } + else + { + gBattleSpritesDataPtr->bankData[bank].lowHpSong = 0; + if (!IsDoubleBattle()) + { + m4aSongNumStop(SE_HINSI); + return; + } + if (IsDoubleBattle() && !gBattleSpritesDataPtr->bankData[bank ^ BIT_MON].lowHpSong) + { + m4aSongNumStop(SE_HINSI); + return; + } + } +} + +void BattleStopLowHpSound(void) +{ + u8 playerBank = GetBankByIdentity(IDENTITY_PLAYER_MON1); + + gBattleSpritesDataPtr->bankData[playerBank].lowHpSong = 0; + if (IsDoubleBattle()) + gBattleSpritesDataPtr->bankData[playerBank ^ BIT_MON].lowHpSong = 0; + + m4aSongNumStop(SE_HINSI); +} + +u8 GetMonHPBarLevel(struct Pokemon *mon) +{ + u16 hp = GetMonData(mon, MON_DATA_HP); + u16 maxHP = GetMonData(mon, MON_DATA_MAX_HP); + + return GetHPBarLevel(hp, maxHP); +} + +void sub_805EAE8(void) +{ + if (gMain.inBattle) + { + u8 playerBank1 = GetBankByIdentity(IDENTITY_PLAYER_MON1); + u8 playerBank2 = GetBankByIdentity(IDENTITY_PLAYER_MON2); + u8 bank1PartyId = pokemon_order_func(gBattlePartyID[playerBank1]); + u8 bank2PartyId = pokemon_order_func(gBattlePartyID[playerBank2]); + + if (GetMonData(&gPlayerParty[bank1PartyId], MON_DATA_HP) != 0) + HandleLowHpMusicChange(&gPlayerParty[bank1PartyId], playerBank1); + if (IsDoubleBattle() && GetMonData(&gPlayerParty[bank2PartyId], MON_DATA_HP) != 0) + HandleLowHpMusicChange(&gPlayerParty[bank2PartyId], playerBank2); + } +} + +void sub_805EB9C(u8 affineMode) +{ + s32 i; + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (IsBankSpritePresent(i)) + { + gSprites[gBankSpriteIds[i]].oam.affineMode = affineMode; + if (affineMode == 0) + { + gBattleSpritesDataPtr->healthBoxesData[i].field_6 = gSprites[gBankSpriteIds[i]].oam.matrixNum; + gSprites[gBankSpriteIds[i]].oam.matrixNum = 0; + } + else + { + gSprites[gBankSpriteIds[i]].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[i].field_6; + } + } + } +} + +#define tBank data0 + +void LoadAndCreateEnemyShadowSprites(void) +{ + u8 bank; + + LoadCompressedObjectPic(&gSpriteSheet_EnemyShadow); + + bank = GetBankByIdentity(IDENTITY_OPPONENT_MON1); + gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, sub_80A5C6C(bank, 0), sub_80A5C6C(bank, 1) + 29, 0xC8); + gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data0 = bank; + + if (IsDoubleBattle()) + { + bank = GetBankByIdentity(IDENTITY_OPPONENT_MON2); + gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, sub_80A5C6C(bank, 0), sub_80A5C6C(bank, 1) + 29, 0xC8); + gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].data0 = bank; + } +} + +void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) +{ + bool8 invisible = FALSE; + u8 bank = shadowSprite->tBank; + struct Sprite *bankSprite = &gSprites[gBankSpriteIds[bank]]; + + if (!bankSprite->inUse || !IsBankSpritePresent(bank)) + { + shadowSprite->callback = SpriteCB_SetInvisible; + return; + } + if (gAnimScriptActive || bankSprite->invisible) + invisible = TRUE; + else if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE + && gEnemyMonElevation[gBattleSpritesDataPtr->bankData[bank].transformSpecies] == 0) + invisible = TRUE; + + if (gBattleSpritesDataPtr->bankData[bank].behindSubstitute) + invisible = TRUE; + + shadowSprite->pos1.x = bankSprite->pos1.x; + shadowSprite->pos2.x = bankSprite->pos2.x; + shadowSprite->invisible = invisible; +} + +#undef tBank + +void SpriteCB_SetInvisible(struct Sprite *sprite) +{ + sprite->invisible = 1; +} + +void SetBankEnemyShadowSpriteCallback(u8 bank, u16 species) +{ + if (GetBankSide(bank) == SIDE_PLAYER) + return; + + if (gBattleSpritesDataPtr->bankData[bank].transformSpecies != SPECIES_NONE) + species = gBattleSpritesDataPtr->bankData[bank].transformSpecies; + + if (gEnemyMonElevation[species] != 0) + gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].callback = SpriteCB_EnemyShadow; + else + gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].callback = SpriteCB_SetInvisible; +} + +void EnemyShadowCallbackToSetInvisible(u8 bank) +{ + gSprites[gBattleSpritesDataPtr->healthBoxesData[bank].shadowSpriteId].callback = SpriteCB_SetInvisible; +} + +void sub_805EF14(void) +{ + u16 *vramPtr = (u16*)(VRAM + 0x240); + s32 i; + s32 j; + + for (i = 0; i < 9; i++) + { + for (j = 0; j < 16; j++) + { + if (!(*vramPtr & 0xF000)) + *vramPtr |= 0xF000; + if (!(*vramPtr & 0x0F00)) + *vramPtr |= 0x0F00; + if (!(*vramPtr & 0x00F0)) + *vramPtr |= 0x00F0; + if (!(*vramPtr & 0x000F)) + *vramPtr |= 0x000F; + vramPtr++; + } + } +} + +void ClearTemporarySpeciesSpriteData(u8 bank, bool8 dontClearSubstitute) +{ + gBattleSpritesDataPtr->bankData[bank].transformSpecies = SPECIES_NONE; + gBattleMonForms[bank] = 0; + if (!dontClearSubstitute) + ClearBehindSubstituteBit(bank); +} + +void AllocateMonSpritesGfx(void) +{ + u8 i = 0, j; + + gMonSpritesGfxPtr = NULL; + gMonSpritesGfxPtr = AllocZeroed(sizeof(*gMonSpritesGfxPtr)); + gMonSpritesGfxPtr->firstDecompressed = AllocZeroed(0x8000); + + for (i = 0; i < BATTLE_BANKS_COUNT; i++) + { + gMonSpritesGfxPtr->sprites[i] = gMonSpritesGfxPtr->firstDecompressed + (i * 0x2000); + *(gMonSpritesGfxPtr->templates + i) = gUnknown_08329D98[i]; + + for (j = 0; j < 4; j++) + { + gMonSpritesGfxPtr->field_74[i][j].data = gMonSpritesGfxPtr->sprites[i] + (j * 0x800); + gMonSpritesGfxPtr->field_74[i][j].size = 0x800; + } + + gMonSpritesGfxPtr->templates[i].images = gMonSpritesGfxPtr->field_74[i]; + } + + gMonSpritesGfxPtr->barFontGfx = AllocZeroed(0x1000); +} + +void FreeMonSpritesGfx(void) +{ + if (gMonSpritesGfxPtr == NULL) + return; + + if (gMonSpritesGfxPtr->field_17C != NULL) + FREE_AND_SET_NULL(gMonSpritesGfxPtr->field_17C); + if (gMonSpritesGfxPtr->field_178 != NULL) + FREE_AND_SET_NULL(gMonSpritesGfxPtr->field_178); + + FREE_AND_SET_NULL(gMonSpritesGfxPtr->barFontGfx); + FREE_AND_SET_NULL(gMonSpritesGfxPtr->firstDecompressed); + gMonSpritesGfxPtr->sprites[0] = NULL; + gMonSpritesGfxPtr->sprites[1] = NULL; + gMonSpritesGfxPtr->sprites[2] = NULL; + gMonSpritesGfxPtr->sprites[3] = NULL; + FREE_AND_SET_NULL(gMonSpritesGfxPtr); +} + +bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon) +{ + s16 hp, maxHP; + s32 barLevel; + + if (GetMonData(mon, MON_DATA_STATUS) & (STATUS_ANY | STATUS_TOXIC_COUNTER)) + return FALSE; + + hp = GetMonData(mon, MON_DATA_HP); + maxHP = GetMonData(mon, MON_DATA_MAX_HP); + + barLevel = GetHPBarLevel(hp, maxHP); + if (barLevel <= HP_BAR_YELLOW) + return FALSE; + + return TRUE; +} diff --git a/src/battle_interface.c b/src/battle_interface.c index 5f582a366..811751ca3 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2545,19 +2545,19 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp) if (hp == maxhp) { - result = 4; + result = HP_BAR_FULL; } else { u8 fraction = GetScaledHPFraction(hp, maxhp, 48); if (fraction > 24) - result = 3; + result = HP_BAR_GREEN; else if (fraction > 9) - result = 2; + result = HP_BAR_YELLOW; else if (fraction > 0) - result = 1; + result = HP_BAR_RED; else - result = 0; + result = HP_BAR_EMPTY; } return result; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c6cec7f0d..91be4fd9d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1068,22 +1068,33 @@ static const u8 sBallCatchBonuses[] = 20, 15, 10, 15 // Ultra, Great, Poke, Safari }; -// could be a 2d array or a struct -const ALIGNED(4) u8 gUnknown_0831C494[] = -{ - 0x3d, 0x44, 0x3d, 0x44, 0x14, 0x2d, 0x54, 0x5c, - 0x46, 0x55, 0x20, 0x5c, 0x26, 0x45, 0x46, 0x55, - 0x14, 0x5a, 0x46, 0x5c, 0x1e, 0x32, 0x20, 0x5a, - 0x38, 0x4e, 0x38, 0x4e, 0x19, 0x28, 0x4b, 0x5a, - 0x45, 0x4b, 0x1c, 0x53, 0x23, 0x2d, 0x1d, 0x23, - 0x3e, 0x48, 0x1e, 0x32, 0x3a, 0x5f, 0x58, 0x5e, - 0x22, 0x2d, 0x1d, 0x28, 0x23, 0x28, 0x23, 0x5f, - 0x38, 0x4e, 0x38, 0x4e, 0x23, 0x50, 0x22, 0x5e, - 0x2c, 0x5e, 0x22, 0x28, 0x38, 0x4e, 0x38, 0x4e, - 0x1e, 0x58, 0x1e, 0x58, 0x1e, 0x2b, 0x1b, 0x21, - 0x28, 0x5a, 0x19, 0x57, 0x12, 0x58, 0x5a, 0x5f, - 0x58, 0x5e, 0x16, 0x2a, 0x2a, 0x5c, 0x2a, 0x2f, - 0x38, 0x4e, 0x38, 0x4e +const ALIGNED(4) u8 gUnknown_0831C494[][4] = +{ + {0x3d, 0x44, 0x3d, 0x44}, + {0x14, 0x2d, 0x54, 0x5c}, + {0x46, 0x55, 0x20, 0x5c}, + {0x26, 0x45, 0x46, 0x55}, + {0x14, 0x5a, 0x46, 0x5c}, + {0x1e, 0x32, 0x20, 0x5a}, + {0x38, 0x4e, 0x38, 0x4e}, + {0x19, 0x28, 0x4b, 0x5a}, + {0x45, 0x4b, 0x1c, 0x53}, + {0x23, 0x2d, 0x1d, 0x23}, + {0x3e, 0x48, 0x1e, 0x32}, + {0x3a, 0x5f, 0x58, 0x5e}, + {0x22, 0x2d, 0x1d, 0x28}, + {0x23, 0x28, 0x23, 0x5f}, + {0x38, 0x4e, 0x38, 0x4e}, + {0x23, 0x50, 0x22, 0x5e}, + {0x2c, 0x5e, 0x22, 0x28}, + {0x38, 0x4e, 0x38, 0x4e}, + {0x1e, 0x58, 0x1e, 0x58}, + {0x1e, 0x2b, 0x1b, 0x21}, + {0x28, 0x5a, 0x19, 0x57}, + {0x12, 0x58, 0x5a, 0x5f}, + {0x58, 0x5e, 0x16, 0x2a}, + {0x2a, 0x5c, 0x2a, 0x2f}, + {0x38, 0x4e, 0x38, 0x4e} }; static const u8 sUnknown_0831C4F8[] = @@ -3533,7 +3544,7 @@ static void atk23_getexp(void) // music change in wild battle after fainting a poke if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong) { - BattleMusicStop(); + BattleStopLowHpSound(); PlayBGM(0x161); gBattleStruct->wildVictorySong++; } @@ -3628,7 +3639,7 @@ static void atk23_getexp(void) if (gBattleBufferB[gActiveBank][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBank][1] == RET_VALUE_LEVELLED_UP) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == gBattleStruct->expGetterId) - sub_805E990(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBank, gBattleStruct->expGetterId) diff --git a/src/pokemon_3.c b/src/pokemon_3.c index 27da8b18e..01dfc954a 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -1234,12 +1234,12 @@ static void sub_806E6CC(u8 taskId) DestroyTask(taskId); } -const u8 *pokemon_get_pal(struct Pokemon *mon) +const u8 *GetMonFrontSpritePal(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return species_and_otid_get_pal(species, otId, personality); + return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality); } // Extracts the upper 16 bits of a 32-bit number @@ -1248,7 +1248,7 @@ const u8 *pokemon_get_pal(struct Pokemon *mon) // Extracts the lower 16 bits of a 32-bit number #define LOHALF(n) ((n) & 0xFFFF) -const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality) +const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality) { u32 shinyValue; diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 002f4f069..3177a8946 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -37,8 +37,8 @@ extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[]; extern void dp12_8087EA4(void); extern void trs_config(void); extern bool8 IsDoubleBattle(void); -extern u8 sub_80A614C(u8 bank); -extern u8 sub_80A6138(u8 bank); +extern u8 GetSubstituteSpriteDefault_Y(u8 bank); +extern u8 GetBankSpriteDefault_Y(u8 bank); extern u8 sub_80A82E4(u8 bank); extern void sub_806A068(u16 species, u8 bankIdentity); extern void sub_806A12C(u16 backPicId, u8 bankIdentity); @@ -104,7 +104,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void) gReservedSpritePaletteCount = 4; break; case 5: - sub_805E350(); + ClearSpritesHealthboxAnimData(); break; case 6: if (BattleLoadAllHealthBoxesGfx(gBattleScripting.reshowHelperState)) @@ -217,7 +217,7 @@ static bool8 LoadBankSpriteGfx(u8 bank) if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute) BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank); else - BattleLoadSubstituteSpriteGfx(bank, FALSE); + BattleLoadSubstituteOrMonSpriteGfx(bank, FALSE); } else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0) DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, bank); @@ -226,7 +226,7 @@ static bool8 LoadBankSpriteGfx(u8 bank) else if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute) BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank); else - BattleLoadSubstituteSpriteGfx(bank, FALSE); + BattleLoadSubstituteOrMonSpriteGfx(bank, FALSE); gBattleScripting.reshowHelperState = 0; } @@ -250,9 +250,9 @@ static void CreateBankSprite(u8 bank) u8 posY; if (gBattleSpritesDataPtr->bankData[bank].behindSubstitute) - posY = sub_80A614C(bank); + posY = GetSubstituteSpriteDefault_Y(bank); else - posY = sub_80A6138(bank); + posY = GetBankSpriteDefault_Y(bank); if (GetBankSide(bank) != SIDE_PLAYER) { |