From ee8f8cb2ccd4bac0f68ae87f3e2de8548273b0de Mon Sep 17 00:00:00 2001 From: cawtds Date: Fri, 10 May 2024 10:09:22 +0200 Subject: [PATCH] updated battle_controller_player up to CONTROLLER_DRAWPARTYSTATUSSUMMARY --- include/battle_controllers.h | 16 +- src/battle_controller_link_partner.c | 2 +- src/battle_controller_oak_old_man.c | 2 +- src/battle_controller_player.c | 299 ++++--------------------- src/battle_controller_pokedude.c | 2 +- src/battle_controllers.c | 317 +++++++++++++++++++++++++++ 6 files changed, 375 insertions(+), 263 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 59729206d..8e39ea1da 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -280,11 +280,25 @@ void BtlController_HandleMoveAnimation(u32 battler); void BtlController_HandlePrintString(u32 battler); void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText); void BtlController_HandleStatusIconUpdate(u32 battler); +void BtlController_HandleStatusAnimation(u32 battler); +void BtlController_HandleClearUnkVar(u32 battler); +void BtlController_HandleSetUnkVar(u32 battler); +void BtlController_HandleClearUnkFlag(u32 battler); +void BtlController_HandleToggleUnkFlag(u32 battler); +void BtlController_HandleHitAnimation(u32 battler); +void BtlController_HandlePlaySE(u32 battler); +void BtlController_HandlePlayFanfareOrBGM(u32 battler); +void BtlController_HandleFaintingCry(u32 battler); +void BtlController_HandleIntroSlide(u32 battler); +bool32 TwoPlayerIntroMons(u32 battlerId); // Double battle with both player pokemon active. +bool32 TwoOpponentIntroMons(u32 battlerId); // Double battle with both opponent pokemon active. +void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u32 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler), void (*spriteCallback)(struct Sprite *sprite)); +void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay); // player controller void BattleControllerDummy(u32 battler); void SetControllerToPlayer(u32 battler); -void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite); +void SpriteCB_FreePlayerSpriteLoadMonSpriteOld(struct Sprite *sprite); void SetCB2ToReshowScreenAfterMenu(void); void SetCB2ToReshowScreenAfterMenu2(void); void Task_PlayerController_RestoreBgmAfterCry(u8 taskId); diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 82e42c976..5dc5b0b89 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -1498,7 +1498,7 @@ static void LinkPartnerHandleIntroTrainerBallThrow(u32 battler) gSprites[gBattlerSpriteIds[battler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[battler]].data[5] = battler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSprite); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSpriteOld); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 1); paletteNum = AllocSpritePalette(0xD6F9); diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c index 5fe4b1c98..d669b0ae0 100644 --- a/src/battle_controller_oak_old_man.c +++ b/src/battle_controller_oak_old_man.c @@ -1493,7 +1493,7 @@ static void OakOldManHandleIntroTrainerBallThrow(u32 battler) gSprites[gBattlerSpriteIds[battler]].data[4] = gSprites[gBattlerSpriteIds[battler]].y; gSprites[gBattlerSpriteIds[battler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[battler]].data[5] = battler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSprite); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSpriteOld); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 59e979e8a..caaf46494 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -45,26 +45,13 @@ static void PlayerHandleChoosePokemon(u32 battler); static void PlayerHandleCmd23(u32 battler); static void PlayerHandleHealthBarUpdate(u32 battler); static void PlayerHandleExpUpdate(u32 battler); -static void PlayerHandleStatusAnimation(u32 battler); static void PlayerHandleStatusXor(u32 battler); -static void PlayerHandleDataTransfer(u32 battler); static void PlayerHandleDMA3Transfer(u32 battler); static void PlayerHandlePlayBGM(u32 battler); -static void PlayerHandleCmd32(u32 battler); static void PlayerHandleTwoReturnValues(u32 battler); static void PlayerHandleChosenMonReturnValue(u32 battler); static void PlayerHandleOneReturnValue(u32 battler); static void PlayerHandleOneReturnValue_Duplicate(u32 battler); -static void PlayerHandleCmd37(u32 battler); -static void PlayerHandleCmd38(u32 battler); -static void PlayerHandleCmd39(u32 battler); -static void PlayerHandleCmd40(u32 battler); -static void PlayerHandleHitAnimation(u32 battler); -static void PlayerHandleCmd42(u32 battler); -static void PlayerHandlePlaySE(u32 battler); -static void PlayerHandlePlayFanfare(u32 battler); -static void PlayerHandleFaintingCry(u32 battler); -static void PlayerHandleIntroSlide(u32 battler); static void PlayerHandleIntroTrainerBallThrow(u32 battler); static void PlayerHandleDrawPartyStatusSummary(u32 battler); static void PlayerHandleHidePartyStatusSummary(u32 battler); @@ -90,12 +77,10 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId); static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId); static void Task_UpdateLvlInHealthbox(u8 taskId); static void PrintLinkStandbyMsg(void); -static void Task_StartSendOutAnim(u8 taskId); static void PreviewDeterminativeMoveTargets(u32 battler); static void SwitchIn_HandleSoundAndEnd(u32 battler); static void Task_GiveExpWithExpBar(u8 taskId); static void Task_CreateLevelUpVerticalStripes(u8 taskId); -static void EndDrawPartyStatusSummary(u32 battler); static void ReloadMoveNames(u32 battler); @@ -128,28 +113,28 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) = [CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate, // done [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, // done [CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate, // done - [CONTROLLER_STATUSANIMATION] = PlayerHandleStatusAnimation, - [CONTROLLER_STATUSXOR] = PlayerHandleStatusXor, - [CONTROLLER_DATATRANSFER] = PlayerHandleDataTransfer, - [CONTROLLER_DMA3TRANSFER] = PlayerHandleDMA3Transfer, - [CONTROLLER_PLAYBGM] = PlayerHandlePlayBGM, - [CONTROLLER_32] = PlayerHandleCmd32, - [CONTROLLER_CHOSENMONRETURNVALUE] = PlayerHandleChosenMonReturnValue, - [CONTROLLER_TWORETURNVALUES] = PlayerHandleTwoReturnValues, - [CONTROLLER_ONERETURNVALUE] = PlayerHandleOneReturnValue, - [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerHandleOneReturnValue_Duplicate, - [CONTROLLER_CLEARUNKVAR] = PlayerHandleCmd37, - [CONTROLLER_SETUNKVAR] = PlayerHandleCmd38, - [CONTROLLER_CLEARUNKFLAG] = PlayerHandleCmd39, - [CONTROLLER_TOGGLEUNKFLAG] = PlayerHandleCmd40, - [CONTROLLER_HITANIMATION] = PlayerHandleHitAnimation, - [CONTROLLER_CANTSWITCH] = PlayerHandleCmd42, - [CONTROLLER_PLAYSE] = PlayerHandlePlaySE, - [CONTROLLER_PLAYFANFAREORBGM] = PlayerHandlePlayFanfare, - [CONTROLLER_FAINTINGCRY] = PlayerHandleFaintingCry, - [CONTROLLER_INTROSLIDE] = PlayerHandleIntroSlide, - [CONTROLLER_INTROTRAINERBALLTHROW] = PlayerHandleIntroTrainerBallThrow, - [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PlayerHandleDrawPartyStatusSummary, + [CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation, // done + [CONTROLLER_STATUSXOR] = PlayerHandleStatusXor, // done + [CONTROLLER_DATATRANSFER] = BtlController_Empty, // done + [CONTROLLER_DMA3TRANSFER] = PlayerHandleDMA3Transfer, // done + [CONTROLLER_PLAYBGM] = PlayerHandlePlayBGM, // done + [CONTROLLER_32] = BtlController_Empty, // done + [CONTROLLER_TWORETURNVALUES] = PlayerHandleTwoReturnValues, // done + [CONTROLLER_CHOSENMONRETURNVALUE] = PlayerHandleChosenMonReturnValue, // done + [CONTROLLER_ONERETURNVALUE] = PlayerHandleOneReturnValue, // done + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerHandleOneReturnValue_Duplicate, // done + [CONTROLLER_CLEARUNKVAR] = BtlController_HandleClearUnkVar, // done + [CONTROLLER_SETUNKVAR] = BtlController_HandleSetUnkVar, // done + [CONTROLLER_CLEARUNKFLAG] = BtlController_HandleClearUnkFlag, // done + [CONTROLLER_TOGGLEUNKFLAG] = BtlController_HandleToggleUnkFlag, // done + [CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation, // done + [CONTROLLER_CANTSWITCH] = BtlController_Empty, // done + [CONTROLLER_PLAYSE] = BtlController_HandlePlaySE, // done + [CONTROLLER_PLAYFANFAREORBGM] = BtlController_HandlePlayFanfareOrBGM, // done + [CONTROLLER_FAINTINGCRY] = BtlController_HandleFaintingCry, // done + [CONTROLLER_INTROSLIDE] = BtlController_HandleIntroSlide, // done + [CONTROLLER_INTROTRAINERBALLTHROW] = PlayerHandleIntroTrainerBallThrow, // done + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PlayerHandleDrawPartyStatusSummary, // done [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = PlayerHandleHidePartyStatusSummary, [CONTROLLER_ENDBOUNCE] = PlayerHandleEndBounceEffect, [CONTROLLER_SPRITEINVISIBILITY] = PlayerHandleSpriteInvisibility, @@ -1010,29 +995,6 @@ void SetBattleEndCallbacks(u32 battler) } } -static void CompleteOnBattlerSpriteCallbackDummy(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - PlayerBufferExecCompleted(battler); -} - -static void CompleteOnBattlerSpriteCallbackDummy2(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - PlayerBufferExecCompleted(battler); -} - -static void FreeTrainerSpriteAfterSlide(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { - BattleGfxSfxDummy3(gSaveBlock2Ptr->playerGender); - FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[battler]]); - DestroySprite(&gSprites[gBattlerSpriteIds[battler]]); - PlayerBufferExecCompleted(battler); - } -} - static void Intro_DelayAndEnd(u32 battler) { if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1) @@ -1483,25 +1445,6 @@ static void CompleteOnSpecialAnimDone(u32 battler) PlayerBufferExecCompleted(battler); } -static void DoHitAnimBlinkSpriteEffect(u32 battler) -{ - u8 spriteId = gBattlerSpriteIds[battler]; - - if (gSprites[spriteId].data[1] == 32) - { - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].invisible = FALSE; - gDoingBattleAnim = FALSE; - PlayerBufferExecCompleted(battler); - } - else - { - if ((gSprites[spriteId].data[1] % 4) == 0) - gSprites[spriteId].invisible ^= 1; - ++gSprites[spriteId].data[1]; - } -} - static void MoveSelectionDisplayMoveNames(u32 battler) { s32 i; @@ -1604,12 +1547,6 @@ void SetCB2ToReshowScreenAfterMenu2(void) SetMainCallback2(ReshowBattleScreenAfterMenu); } -static void CompleteOnFinishedStatusAnimation(u32 battler) -{ - if (!gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive) - PlayerBufferExecCompleted(battler); -} - static void CompleteOnFinishedBattleAnimation(u32 battler) { if (!gBattleSpritesDataPtr->healthBoxesData[battler].animFromTableActive) @@ -1897,15 +1834,11 @@ static void PlayerHandleExpUpdate(u32 battler) } } -static void PlayerHandleStatusAnimation(u32 battler) -{ - if (!IsBattleSEPlaying(battler)) - { - InitAndLaunchChosenStatusAnimation(battler, gBattleResources->bufferA[battler][1], - gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8) | (gBattleResources->bufferA[battler][4] << 16) | (gBattleResources->bufferA[battler][5] << 24)); - gBattlerControllerFuncs[battler] = CompleteOnFinishedStatusAnimation; - } -} +#undef tExpTask_monId +#undef tExpTask_battler +#undef tExpTask_gainedExp_1 +#undef tExpTask_gainedExp_2 +#undef tExpTask_frames static void PlayerHandleStatusXor(u32 battler) { @@ -1915,18 +1848,14 @@ static void PlayerHandleStatusXor(u32 battler) PlayerBufferExecCompleted(battler); } -static void PlayerHandleDataTransfer(u32 battler) -{ - PlayerBufferExecCompleted(battler); -} - static void PlayerHandleDMA3Transfer(u32 battler) { u32 dstArg = gBattleResources->bufferA[battler][1] - | (gBattleResources->bufferA[battler][2] << 8) - | (gBattleResources->bufferA[battler][3] << 16) - | (gBattleResources->bufferA[battler][4] << 24); + | (gBattleResources->bufferA[battler][2] << 8) + | (gBattleResources->bufferA[battler][3] << 16) + | (gBattleResources->bufferA[battler][4] << 24); u16 sizeArg = gBattleResources->bufferA[battler][5] | (gBattleResources->bufferA[battler][6] << 8); + const u8 *src = &gBattleResources->bufferA[battler][7]; u8 *dst = (u8 *)(dstArg); u32 size = sizeArg; @@ -1952,135 +1881,37 @@ static void PlayerHandlePlayBGM(u32 battler) PlayerBufferExecCompleted(battler); } -static void PlayerHandleCmd32(u32 battler) -{ - PlayerBufferExecCompleted(battler); -} - static void PlayerHandleTwoReturnValues(u32 battler) { - BtlController_EmitTwoReturnValues(battler, 1, 0, 0); + BtlController_EmitTwoReturnValues(battler, BUFFER_B, 0, 0); PlayerBufferExecCompleted(battler); } static void PlayerHandleChosenMonReturnValue(u32 battler) { - BtlController_EmitChosenMonReturnValue(battler, 1, 0, NULL); + BtlController_EmitChosenMonReturnValue(battler, BUFFER_B, 0, NULL); PlayerBufferExecCompleted(battler); } static void PlayerHandleOneReturnValue(u32 battler) { - BtlController_EmitOneReturnValue(battler, 1, 0); + BtlController_EmitOneReturnValue(battler, BUFFER_B, 0); PlayerBufferExecCompleted(battler); } static void PlayerHandleOneReturnValue_Duplicate(u32 battler) { - BtlController_EmitOneReturnValue_Duplicate(battler, 1, 0); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleCmd37(u32 battler) -{ - gUnusedControllerStruct.unk = 0; - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleCmd38(u32 battler) -{ - gUnusedControllerStruct.unk = gBattleResources->bufferA[battler][1]; - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleCmd39(u32 battler) -{ - gUnusedControllerStruct.flag = 0; - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleCmd40(u32 battler) -{ - gUnusedControllerStruct.flag ^= 1; - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleHitAnimation(u32 battler) -{ - if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE) - { - PlayerBufferExecCompleted(battler); - } - else - { - gDoingBattleAnim = TRUE; - gSprites[gBattlerSpriteIds[battler]].data[1] = 0; - DoHitAnimHealthboxEffect(battler); - gBattlerControllerFuncs[battler] = DoHitAnimBlinkSpriteEffect; - } -} - -static void PlayerHandleCmd42(u32 battler) -{ - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandlePlaySE(u32 battler) -{ - s8 pan; - - if (GetBattlerSide(battler) == B_SIDE_PLAYER) - pan = SOUND_PAN_ATTACKER; - else - pan = SOUND_PAN_TARGET; - PlaySE12WithPanning(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8), pan); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandlePlayFanfare(u32 battler) -{ - PlayFanfare(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleFaintingCry(u32 battler) -{ - PlayCry_ByMode(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), -25, CRY_MODE_FAINT); - PlayerBufferExecCompleted(battler); -} - -static void PlayerHandleIntroSlide(u32 battler) -{ - HandleIntroSlide(gBattleResources->bufferA[battler][1]); - gIntroSlideFlags |= 1; + BtlController_EmitOneReturnValue_Duplicate(battler, BUFFER_B, 0); PlayerBufferExecCompleted(battler); } static void PlayerHandleIntroTrainerBallThrow(u32 battler) { - u8 paletteNum; - u8 taskId; - - SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[battler]]); - gSprites[gBattlerSpriteIds[battler]].data[0] = 50; - gSprites[gBattlerSpriteIds[battler]].data[2] = -40; - gSprites[gBattlerSpriteIds[battler]].data[4] = gSprites[gBattlerSpriteIds[battler]].y; - gSprites[gBattlerSpriteIds[battler]].callback = PlayerThrowBall_StartAnimLinearTranslation; - gSprites[gBattlerSpriteIds[battler]].data[5] = battler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSprite); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 1); - paletteNum = AllocSpritePalette(0xD6F8); - LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); - gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = paletteNum; - taskId = CreateTask(Task_StartSendOutAnim, 5); - gTasks[taskId].data[0] = battler; - if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown) - gTasks[gBattlerStatusSummaryTaskId[battler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; - gBattlerControllerFuncs[battler] = BattleControllerDummy; + const u32 *trainerPal = gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data; + BtlController_HandleIntroTrainerBallThrow(battler, 0xD6F8, trainerPal, 31, Intro_TryShinyAnimShowHealthbox, PlayerThrowBall_StartAnimLinearTranslation); } -void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) +void SpriteCB_FreePlayerSpriteLoadMonSpriteOld(struct Sprite *sprite) { u8 battlerId = sprite->data[5]; @@ -2091,59 +1922,9 @@ void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0); } -static void Task_StartSendOutAnim(u8 taskId) -{ - if (gTasks[taskId].data[1] < 31) - { - ++gTasks[taskId].data[1]; - } - else - { - u32 battler = gTasks[taskId].data[0]; - if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) - { - gBattleResources->bufferA[battler][1] = gBattlerPartyIndexes[battler]; - StartSendOutAnim(battler, FALSE); - } - else - { - u32 battlerPartner = BATTLE_PARTNER(battler); - gBattleResources->bufferA[battler][1] = gBattlerPartyIndexes[battler]; - StartSendOutAnim(battler, FALSE); - - gBattleResources->bufferA[battlerPartner][1] = gBattlerPartyIndexes[battlerPartner]; - BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerPartner]], battlerPartner); - StartSendOutAnim(battlerPartner, FALSE); - } - gBattlerControllerFuncs[battler] = Intro_TryShinyAnimShowHealthbox; - DestroyTask(taskId); - } -} - static void PlayerHandleDrawPartyStatusSummary(u32 battler) -{ - if (gBattleResources->bufferA[battler][1] && GetBattlerSide(battler) == B_SIDE_PLAYER) - { - PlayerBufferExecCompleted(battler); - } - else - { - gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown = TRUE; - gBattlerStatusSummaryTaskId[battler] = CreatePartyStatusSummarySprites(battler, (struct HpAndStatus *)&gBattleResources->bufferA[battler][4], gBattleResources->bufferA[battler][1], gBattleResources->bufferA[battler][2]); - gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 0; - if (gBattleResources->bufferA[battler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[battler] = EndDrawPartyStatusSummary; - } -} - -static void EndDrawPartyStatusSummary(u32 battler) -{ - if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer++ > 0x5C) - { - gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 0; - PlayerBufferExecCompleted(battler); - } +{ + BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE); } static void PlayerHandleHidePartyStatusSummary(u32 battler) diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c index 0ffc06713..9b10a786e 100644 --- a/src/battle_controller_pokedude.c +++ b/src/battle_controller_pokedude.c @@ -1244,7 +1244,7 @@ static void PokedudeHandleIntroTrainerBallThrow(u32 battler) gSprites[gBattlerSpriteIds[battler]].data[4] = gSprites[gBattlerSpriteIds[battler]].y; gSprites[gBattlerSpriteIds[battler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[battler]].data[5] = battler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSprite); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSpriteOld); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_POKEDUDE].data, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 568ec2171..b5acc0d58 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -8,6 +8,7 @@ #include "cable_club.h" #include "link.h" #include "link_rfu.h" +#include "palette.h" #include "party_menu.h" #include "pokeball.h" #include "sound.h" @@ -16,6 +17,7 @@ #include "text.h" #include "util.h" #include "constants/songs.h" +#include "constants/sound.h" #include "constants/abilities.h" static EWRAM_DATA u8 sLinkSendTaskId = 0; @@ -33,6 +35,9 @@ static void InitSinglePlayerBtlControllers(void); static void SetBattlePartyIds(void); static void Task_HandleSendLinkBuffersData(u8 taskId); static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId); +static void Task_StartSendOutAnim(u8 taskId); +static void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite); +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); void HandleLinkBattleSetup(void) { @@ -1875,6 +1880,34 @@ void Controller_WaitForString(u32 battler) BattleControllerComplete(battler); } +static void Controller_WaitForPartyStatusSummary(u32 battler) +{ + if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer++ > 92) + { + gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 0; + BattleControllerComplete(battler); + } +} + +static void Controller_HitAnimation(u32 battler) +{ + u32 spriteId = gBattlerSpriteIds[battler]; + + if (gSprites[spriteId].data[1] == 32) + { + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].invisible = FALSE; + gDoingBattleAnim = FALSE; + BattleControllerComplete(battler); + } + else + { + if ((gSprites[spriteId].data[1] % 4) == 0) + gSprites[spriteId].invisible ^= 1; + gSprites[spriteId].data[1]++; + } +} + // Used for all the commands which do nothing. void BtlController_Empty(u32 battler) { @@ -2238,5 +2271,289 @@ void BtlController_HandleStatusIconUpdate(u32 battler) } } +void BtlController_HandleStatusAnimation(u32 battler) +{ + if (!IsBattleSEPlaying(battler)) + { + InitAndLaunchChosenStatusAnimation(battler, gBattleResources->bufferA[battler][1], + gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8) | (gBattleResources->bufferA[battler][4] << 16) | (gBattleResources->bufferA[battler][5] << 24)); + gBattlerControllerFuncs[battler] = Controller_WaitForStatusAnimation; + } +} + +void BtlController_HandleClearUnkVar(u32 battler) +{ + gUnusedControllerStruct.unk = 0; + BattleControllerComplete(battler); +} + +void BtlController_HandleSetUnkVar(u32 battler) +{ + gUnusedControllerStruct.unk = gBattleResources->bufferA[battler][1]; + BattleControllerComplete(battler); +} + +void BtlController_HandleClearUnkFlag(u32 battler) +{ + gUnusedControllerStruct.flag = 0; + BattleControllerComplete(battler); +} + +void BtlController_HandleToggleUnkFlag(u32 battler) +{ + gUnusedControllerStruct.flag ^= 1; + BattleControllerComplete(battler); +} + +void BtlController_HandleHitAnimation(u32 battler) +{ + if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE) + { + BattleControllerComplete(battler); + } + else + { + gDoingBattleAnim = TRUE; + gSprites[gBattlerSpriteIds[battler]].data[1] = 0; + DoHitAnimHealthboxEffect(battler); + gBattlerControllerFuncs[battler] = Controller_HitAnimation; + } +} + +void BtlController_HandlePlaySE(u32 battler) +{ + s8 pan = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET; + + PlaySE12WithPanning(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8), pan); + BattleControllerComplete(battler); +} + +void BtlController_HandlePlayFanfareOrBGM(u32 battler) +{ + if (gBattleResources->bufferA[battler][3]) + { + BattleStopLowHpSound(); + PlayBGM(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); + } + else + { + PlayFanfare(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8)); + } + + BattleControllerComplete(battler); +} + +void BtlController_HandleFaintingCry(u32 battler) +{ + struct Pokemon *party; + s8 pan; + + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + { + party = gPlayerParty; + pan = -25; + } + else + { + party = gEnemyParty; + pan = 25; + } + + PlayCry_ByMode(GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), pan, CRY_MODE_FAINT); + BattleControllerComplete(battler); +} + +void BtlController_HandleIntroSlide(u32 battler) +{ + HandleIntroSlide(gBattleResources->bufferA[battler][1]); + gIntroSlideFlags |= 1; + BattleControllerComplete(battler); +} + +bool32 TwoPlayerIntroMons(u32 battler) // Double battle with both player pokemon active. +{ + return (IsDoubleBattle() && IsValidForBattle(&gPlayerParty[gBattlerPartyIndexes[battler ^ BIT_FLANK]])); +} + +bool32 TwoOpponentIntroMons(u32 battler) // Double battle with both opponent pokemon active. +{ + return (IsDoubleBattle() + && IsValidForBattle(&gEnemyParty[gBattlerPartyIndexes[battler]]) + && IsValidForBattle(&gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(battler)]])); +} + +// Task data for Task_StartSendOutAnim +#define tBattlerId data[0] +#define tStartTimer data[1] +#define tFramesToWait data[2] +#define tControllerFunc_1 3 // Stored as two halfwords +#define tControllerFunc_2 4 + +// Sprite data for SpriteCB_FreePlayerSpriteLoadMonSprite +#define sBattlerId data[5] + +void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u32 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler), void (*spriteCallback)(struct Sprite *sprite)) +{ + u8 paletteNum, taskId; + u32 side = GetBattlerSide(battler); + + SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[battler]]); + if (side == B_SIDE_PLAYER) + { + gSprites[gBattlerSpriteIds[battler]].data[0] = 50; + gSprites[gBattlerSpriteIds[battler]].data[2] = -40; + } + else + { + gSprites[gBattlerSpriteIds[battler]].data[0] = 35; + gSprites[gBattlerSpriteIds[battler]].data[2] = 280; + } + + gSprites[gBattlerSpriteIds[battler]].data[4] = gSprites[gBattlerSpriteIds[battler]].y; + gSprites[gBattlerSpriteIds[battler]].callback = spriteCallback; + gSprites[gBattlerSpriteIds[battler]].sBattlerId = battler; + + if (side == B_SIDE_PLAYER) + { + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreePlayerSpriteLoadMonSprite); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 1); + + paletteNum = AllocSpritePalette(tagTrainerPal); + LoadCompressedPalette(trainerPal, OBJ_PLTT_ID(paletteNum), PLTT_SIZE_4BPP); + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = paletteNum; + } + else + { + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[battler]], SpriteCB_FreeOpponentSprite); + } + + taskId = CreateTask(Task_StartSendOutAnim, 5); + gTasks[taskId].tBattlerId = battler; + gTasks[taskId].tFramesToWait = framesToWait; + SetWordTaskArg(taskId, tControllerFunc_1, (uint32_t)(controllerCallback)); + + if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[battler]].func = Task_HidePartyStatusSummary; + + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[battler] = BattleControllerDummy; +} + +static bool32 TwoMonsAtSendOut(u32 battler) +{ + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + { + if (TwoPlayerIntroMons(battler) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + return TRUE; + else + return FALSE; + } + else + { + if ((!TwoOpponentIntroMons(battler) || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) && !BATTLE_TWO_VS_ONE_OPPONENT) + return FALSE; + else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) || (BATTLE_TWO_VS_ONE_OPPONENT && !TwoOpponentIntroMons(battler))) + return FALSE; + else + return TRUE; + } + return FALSE; +} + +// Send out at start of battle +static void Task_StartSendOutAnim(u8 taskId) +{ + if (gTasks[taskId].tFramesToWait != 0 && gTasks[taskId].tStartTimer < gTasks[taskId].tFramesToWait) + { + gTasks[taskId].tStartTimer++; + } + else + { + u32 battlerPartner; + u32 battler = gTasks[taskId].tBattlerId; + + if (TwoMonsAtSendOut(battler)) + { + gBattleResources->bufferA[battler][1] = gBattlerPartyIndexes[battler]; + StartSendOutAnim(battler, FALSE); + + battlerPartner = BATTLE_PARTNER(battler); + gBattleResources->bufferA[battlerPartner][1] = gBattlerPartyIndexes[battlerPartner]; + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerPartner]], battlerPartner); + StartSendOutAnim(battlerPartner, FALSE); + } + else + { + gBattleResources->bufferA[battler][1] = gBattlerPartyIndexes[battler]; + StartSendOutAnim(battler, FALSE); + } + gBattlerControllerFuncs[battler] = (void*)(GetWordTaskArg(taskId, tControllerFunc_1)); + DestroyTask(taskId); + } +} + +#undef tBattlerId +#undef tStartTimer +#undef tFramesToWait +#undef tControllerFunc_1 +#undef tControllerFunc_2 + +static void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) +{ + u8 battler = sprite->sBattlerId; + + // Free player trainer sprite + FreeSpriteOamMatrix(sprite); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + DestroySprite(sprite); + + // Load mon sprite + BattleLoadMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); +} + +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) +{ + FreeTrainerFrontPicPalette(sprite->oam.affineParam); + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); +} + +#undef sBattlerId + +void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay) +{ + if (gBattleResources->bufferA[battler][1] != 0 && GetBattlerSide(battler) == B_SIDE_PLAYER) + { + BattleControllerComplete(battler); + } + else + { + gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown = TRUE; + + if (side == B_SIDE_OPPONENT && gBattleResources->bufferA[battler][2] != 0) + { + if (gBattleSpritesDataPtr->healthBoxesData[battler].opponentDrawPartyStatusSummaryDelay < 2) + { + gBattleSpritesDataPtr->healthBoxesData[battler].opponentDrawPartyStatusSummaryDelay++; + return; + } + else + { + gBattleSpritesDataPtr->healthBoxesData[battler].opponentDrawPartyStatusSummaryDelay = 0; + } + } + + gBattlerStatusSummaryTaskId[battler] = CreatePartyStatusSummarySprites(battler, (struct HpAndStatus *)&gBattleResources->bufferA[battler][4], gBattleResources->bufferA[battler][1], gBattleResources->bufferA[battler][2]); + gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 0; + + // If intro, skip the delay after drawing + if (considerDelay && gBattleResources->bufferA[battler][2] != 0) + gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 93; + + gBattlerControllerFuncs[battler] = Controller_WaitForPartyStatusSummary; + } +} +