updated battle_controller_player up to CONTROLLER_DRAWPARTYSTATUSSUMMARY

This commit is contained in:
cawtds 2024-05-10 10:09:22 +02:00
parent f9c73a3cd9
commit ee8f8cb2cc
6 changed files with 375 additions and 263 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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;
}
}