More battle controller function consolidation. (#6877)

This commit is contained in:
Eduardo Quezada 2025-06-21 04:59:41 -04:00 committed by GitHub
parent bca28b40bb
commit b094b70dc5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 426 additions and 909 deletions

View File

@ -323,7 +323,7 @@ void BtlController_EmitResetActionMoveSelection(u32 battler, u32 bufferId, u8 ca
void BtlController_EmitEndLinkBattle(u32 battler, u32 bufferId, u8 battleOutcome);
void BtlController_EmitDebugMenu(u32 battler, u32 bufferId);
void BattleControllerComplete(u32 battler); // Can be used for all the controllers.
void BtlController_Complete(u32 battler); // Can be used for all the controllers.
void BtlController_Empty(u32 battler); // Empty command, does nothing, only completes the execution.
void BtlController_TerminatorNop(u32 battler); // Dummy function at the end of the table.
void BattleControllerDummy(u32 battler);
@ -336,8 +336,8 @@ void BtlController_HandleGetMonData(u32 battler);
void BtlController_HandleGetRawMonData(u32 battler);
void BtlController_HandleSetMonData(u32 battler);
void BtlController_HandleSetRawMonData(u32 battler);
void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler));
void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler));
void BtlController_HandleLoadMonSprite(u32 battler);
void BtlController_HandleSwitchInAnim(u32 battler);
void BtlController_HandleReturnMonToBall(u32 battler);
void BtlController_HandleDrawTrainerPic(u32 battlerId, u32 trainerPicId, bool32 isFrontPic, s16 xPos, s16 yPos, s32 subpriority);
void BtlController_HandleTrainerSlide(u32 battler, u32 trainerPicId);
@ -345,9 +345,10 @@ void BtlController_HandleTrainerSlideBack(u32 battlerId, s16 data0, bool32 start
void BtlController_HandleFaintAnimation(u32 battler);
void BtlController_HandleSuccessBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture);
void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool32 allowCriticalCapture);
void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData);
void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 arenaPtsDeduct);
void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText);
void BtlController_HandleMoveAnimation(u32 battler);
void BtlController_HandlePrintString(u32 battler);
void BtlController_HandlePrintStringPlayerOnly(u32 battler);
void BtlController_HandleHealthBarUpdate(u32 battler);
void DoStatusIconUpdate(u32 battler);
void BtlController_HandleStatusIconUpdate(u32 battler);
void BtlController_HandleStatusAnimation(u32 battler);
@ -362,10 +363,11 @@ bool32 TwoOpponentIntroMons(u32 battlerId); // Double battle with both opponent
void BtlController_HandleIntroTrainerBallThrow(u32 battler, u16 tagTrainerPal, const u16 *trainerPal, s16 framesToWait, void (*controllerCallback)(u32 battler));
void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 considerDelay);
void BtlController_HandleHidePartyStatusSummary(u32 battler);
void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 updateTvData);
void BtlController_HandleBattleAnimation(u32 battler);
// player controller
void SetControllerToPlayer(u32 battler);
void PlayerBufferExecCompleted(u32 battler);
void SetBattleEndCallbacks(u32 battler);
void PlayerHandleBallThrowAnim(u32 battler);
void PlayerHandleExpUpdate(u32 battler);
@ -388,37 +390,47 @@ void HandleChooseMoveAfterDma3(u32 battler);
// recorded player controller
void SetControllerToRecordedPlayer(u32 battler);
void RecordedPlayerBufferExecCompleted(u32 battler);
// opponent controller
void SetControllerToOpponent(u32 battler);
void OpponentBufferExecCompleted(u32 battler);
void OpponentHandleTrainerSlide(u32 battler);
// player partner controller
void Controller_PlayerPartnerShowIntroHealthbox(u32 battler); // Also used by the link partner.
void SetControllerToPlayerPartner(u32 battler);
void PlayerPartnerBufferExecCompleted(u32 battler);
// safari controller
void SetControllerToSafari(u32 battler);
void SafariBufferExecCompleted(u32 battler);
// wally controller
void SetControllerToWally(u32 battler);
void WallyBufferExecCompleted(u32 battler);
// recorded opponent controller
void SetControllerToRecordedOpponent(u32 battler);
void RecordedOpponentBufferExecCompleted(u32 battler);
// link opponent
void SetControllerToLinkOpponent(u32 battler);
void LinkOpponentBufferExecCompleted(u32 battler);
// link partner
void SetControllerToLinkPartner(u32 battler);
void LinkPartnerBufferExecCompleted(u32 battler);
void TrySetBattlerShadowSpriteCallback(u32 battler);
bool32 TryShinyAnimAfterMonAnimUtil(u32 battler);
bool32 SwitchIn_ShowSubstituteUtil(u32 battler);
bool32 SwitchIn_WaitAndEndUtil(u32 battler);
bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler);
bool32 SwitchIn_ShowHealthboxUtil(u32 battler);
bool32 SwitchIn_TryShinyAnimUtil(u32 battler);
void TryShinyAnimAfterMonAnim(u32 battler);
void WaitForMonAnimAfterLoad(u32 battler);
void BtlController_HandleSwitchInWaitAndEnd(u32 battler);
void BtlController_Intro_DelayAndEnd(u32 battler);
void BtlController_HandleSwitchInShowHealthbox(u32 battler);
void BtlController_HandleSwitchInTryShinyAnim(u32 battler);
void BtlController_HandleSwitchInSoundAndEnd(u32 battler);
void BtlController_HandleSwitchInShowSubstitute(u32 battler);
#endif // GUARD_BATTLE_CONTROLLERS_H

View File

@ -30,23 +30,15 @@
#include "recorded_battle.h"
#include "random.h"
static void LinkOpponentHandleLoadMonSprite(u32 battler);
static void LinkOpponentHandleSwitchInAnim(u32 battler);
static void LinkOpponentHandleDrawTrainerPic(u32 battler);
static void LinkOpponentHandleTrainerSlide(u32 battler);
static void LinkOpponentHandleTrainerSlideBack(u32 battler);
static void LinkOpponentHandleMoveAnimation(u32 battler);
static void LinkOpponentHandlePrintString(u32 battler);
static void LinkOpponentHandleHealthBarUpdate(u32 battler);
static void LinkOpponentHandleIntroTrainerBallThrow(u32 battler);
static void LinkOpponentHandleDrawPartyStatusSummary(u32 battler);
static void LinkOpponentHandleBattleAnimation(u32 battler);
static void LinkOpponentHandleLinkStandbyMsg(u32 battler);
static void LinkOpponentHandleEndLinkBattle(u32 battler);
static void LinkOpponentBufferRunCommand(u32 battler);
static void LinkOpponentBufferExecCompleted(u32 battler);
static void SwitchIn_HandleSoundAndEnd(u32 battler);
static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
{
@ -54,8 +46,8 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt
[CONTROLLER_GETRAWMONDATA] = BtlController_Empty,
[CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData,
[CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData,
[CONTROLLER_LOADMONSPRITE] = LinkOpponentHandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = LinkOpponentHandleSwitchInAnim,
[CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim,
[CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall,
[CONTROLLER_DRAWTRAINERPIC] = LinkOpponentHandleDrawTrainerPic,
[CONTROLLER_TRAINERSLIDE] = LinkOpponentHandleTrainerSlide,
@ -65,8 +57,8 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt
[CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_BALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = LinkOpponentHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = LinkOpponentHandlePrintString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty,
[CONTROLLER_CHOOSEACTION] = BtlController_Empty,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
@ -74,7 +66,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt
[CONTROLLER_OPENBAG] = BtlController_Empty,
[CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty,
[CONTROLLER_23] = BtlController_Empty,
[CONTROLLER_HEALTHBARUPDATE] = LinkOpponentHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = BtlController_Empty,
[CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate,
[CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation,
@ -98,7 +90,7 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 batt
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility,
[CONTROLLER_BATTLEANIMATION] = LinkOpponentHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = LinkOpponentHandleLinkStandbyMsg,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = LinkOpponentHandleEndLinkBattle,
@ -119,16 +111,7 @@ static void LinkOpponentBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands))
sLinkOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
LinkOpponentBufferExecCompleted(battler);
}
}
static void Intro_DelayAndEnd(u32 battler)
{
if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0;
LinkOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -186,7 +169,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
}
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;
gBattlerControllerFuncs[battler] = Intro_DelayAndEnd;
gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd;
}
}
@ -278,37 +261,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler)
}
}
static void TryShinyAnimAfterMonAnim(u32 battler)
{
if (TryShinyAnimAfterMonAnimUtil(battler))
LinkOpponentBufferExecCompleted(battler);
}
static void SwitchIn_ShowSubstitute(u32 battler)
{
if (SwitchIn_ShowSubstituteUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd;
}
static void SwitchIn_HandleSoundAndEnd(u32 battler)
{
if (SwitchIn_HandleSoundAndEndUtil(battler))
LinkOpponentBufferExecCompleted(battler);
}
static void SwitchIn_ShowHealthbox(u32 battler)
{
if (SwitchIn_ShowHealthboxUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute;
}
static void SwitchIn_TryShinyAnim(u32 battler)
{
if (SwitchIn_TryShinyAnimUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox;
}
static void LinkOpponentBufferExecCompleted(u32 battler)
void LinkOpponentBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = LinkOpponentBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -324,16 +277,6 @@ static void LinkOpponentBufferExecCompleted(u32 battler)
}
}
static void LinkOpponentHandleLoadMonSprite(u32 battler)
{
BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim);
}
static void LinkOpponentHandleSwitchInAnim(u32 battler)
{
BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim);
}
static void LinkOpponentHandleDrawTrainerPic(u32 battler)
{
s16 xPos;
@ -419,7 +362,7 @@ static void LinkOpponentHandleTrainerSlide(u32 battler)
trainerPicId = GetFrontierTrainerFrontSpriteId(TRAINER_BATTLE_PARAM.opponentB);
BtlController_HandleTrainerSlide(battler, trainerPicId);
LinkOpponentBufferExecCompleted(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic.
BtlController_Complete(battler); // Possibly a bug, because execution should be completed after the slide in finishes. See Controller_WaitForTrainerPic.
}
static void LinkOpponentHandleTrainerSlideBack(u32 battler)
@ -427,21 +370,6 @@ static void LinkOpponentHandleTrainerSlideBack(u32 battler)
BtlController_HandleTrainerSlideBack(battler, 35, FALSE);
}
static void LinkOpponentHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, TRUE);
}
static void LinkOpponentHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, TRUE, FALSE);
}
static void LinkOpponentHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, FALSE);
}
static void LinkOpponentHandleIntroTrainerBallThrow(u32 battler)
{
BtlController_HandleIntroTrainerBallThrow(battler, 0, NULL, 0, Intro_TryShinyAnimShowHealthbox);
@ -452,15 +380,10 @@ static void LinkOpponentHandleDrawPartyStatusSummary(u32 battler)
BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE);
}
static void LinkOpponentHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, FALSE, TRUE);
}
static void LinkOpponentHandleLinkStandbyMsg(u32 battler)
{
RecordedBattle_RecordAllBattlerData(&gBattleResources->bufferA[battler][2]);
LinkOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void LinkOpponentHandleEndLinkBattle(u32 battler)
@ -475,6 +398,6 @@ static void LinkOpponentHandleEndLinkBattle(u32 battler)
gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
LinkOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattlerControllerFuncs[battler] = SetBattleEndCallbacks;
}

View File

@ -30,22 +30,14 @@
#include "recorded_battle.h"
#include "random.h"
static void LinkPartnerHandleLoadMonSprite(u32 battler);
static void LinkPartnerHandleSwitchInAnim(u32 battler);
static void LinkPartnerHandleDrawTrainerPic(u32 battler);
static void LinkPartnerHandleTrainerSlideBack(u32 battler);
static void LinkPartnerHandleMoveAnimation(u32 battler);
static void LinkPartnerHandlePrintString(u32 battler);
static void LinkPartnerHandleHealthBarUpdate(u32 battler);
static void LinkPartnerHandleIntroTrainerBallThrow(u32 battler);
static void LinkPartnerHandleDrawPartyStatusSummary(u32 battler);
static void LinkPartnerHandleBattleAnimation(u32 battler);
static void LinkPartnerHandleLinkStandbyMsg(u32 battler);
static void LinkPartnerHandleEndLinkBattle(u32 battler);
static void LinkPartnerBufferRunCommand(u32 battler);
static void LinkPartnerBufferExecCompleted(u32 battler);
static void SwitchIn_WaitAndEnd(u32 battler);
static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
{
@ -53,8 +45,8 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl
[CONTROLLER_GETRAWMONDATA] = BtlController_Empty,
[CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData,
[CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData,
[CONTROLLER_LOADMONSPRITE] = LinkPartnerHandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = LinkPartnerHandleSwitchInAnim,
[CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim,
[CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall,
[CONTROLLER_DRAWTRAINERPIC] = LinkPartnerHandleDrawTrainerPic,
[CONTROLLER_TRAINERSLIDE] = BtlController_Empty,
@ -64,8 +56,8 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl
[CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_BALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = LinkPartnerHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = LinkPartnerHandlePrintString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty,
[CONTROLLER_CHOOSEACTION] = BtlController_Empty,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
@ -73,7 +65,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl
[CONTROLLER_OPENBAG] = BtlController_Empty,
[CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty,
[CONTROLLER_23] = BtlController_Empty,
[CONTROLLER_HEALTHBARUPDATE] = LinkPartnerHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = BtlController_Empty,
[CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate,
[CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation,
@ -97,7 +89,7 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battl
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility,
[CONTROLLER_BATTLEANIMATION] = LinkPartnerHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = LinkPartnerHandleLinkStandbyMsg,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = LinkPartnerHandleEndLinkBattle,
@ -118,41 +110,11 @@ static void LinkPartnerBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands))
sLinkPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
LinkPartnerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
static void WaitForMonAnimAfterLoad(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0)
LinkPartnerBufferExecCompleted(battler);
}
static void SwitchIn_ShowSubstitute(u32 battler)
{
if (SwitchIn_ShowSubstituteUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd;
}
static void SwitchIn_WaitAndEnd(u32 battler)
{
if (SwitchIn_WaitAndEndUtil(battler))
LinkPartnerBufferExecCompleted(battler);
}
static void SwitchIn_ShowHealthbox(u32 battler)
{
if (SwitchIn_ShowHealthboxUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute;
}
static void SwitchIn_TryShinyAnim(u32 battler)
{
if (SwitchIn_TryShinyAnimUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox;
}
static void LinkPartnerBufferExecCompleted(u32 battler)
void LinkPartnerBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = LinkPartnerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -168,16 +130,6 @@ static void LinkPartnerBufferExecCompleted(u32 battler)
}
}
static void LinkPartnerHandleLoadMonSprite(u32 battler)
{
BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad);
}
static void LinkPartnerHandleSwitchInAnim(u32 battler)
{
BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim);
}
static void LinkPartnerHandleDrawTrainerPic(u32 battler)
{
s16 xPos;
@ -206,21 +158,6 @@ static void LinkPartnerHandleTrainerSlideBack(u32 battler)
BtlController_HandleTrainerSlideBack(battler, 35, FALSE);
}
static void LinkPartnerHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, TRUE);
}
static void LinkPartnerHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, TRUE, FALSE);
}
static void LinkPartnerHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, FALSE);
}
static void LinkPartnerHandleIntroTrainerBallThrow(u32 battler)
{
u32 trainerPicId = LinkPlayerGetTrainerPicId(GetBattlerMultiplayerId(battler));
@ -234,15 +171,10 @@ static void LinkPartnerHandleDrawPartyStatusSummary(u32 battler)
BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE);
}
static void LinkPartnerHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, FALSE, TRUE);
}
static void LinkPartnerHandleLinkStandbyMsg(u32 battler)
{
RecordedBattle_RecordAllBattlerData(&gBattleResources->bufferA[battler][2]);
LinkPartnerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void LinkPartnerHandleEndLinkBattle(u32 battler)
@ -252,6 +184,6 @@ static void LinkPartnerHandleEndLinkBattle(u32 battler)
gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
LinkPartnerBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattlerControllerFuncs[battler] = SetBattleEndCallbacks;
}

View File

@ -40,26 +40,18 @@
#include "trainer_hill.h"
#include "test_runner.h"
static void OpponentHandleLoadMonSprite(u32 battler);
static void OpponentHandleSwitchInAnim(u32 battler);
static void OpponentHandleDrawTrainerPic(u32 battler);
static void OpponentHandleTrainerSlideBack(u32 battler);
static void OpponentHandleMoveAnimation(u32 battler);
static void OpponentHandlePrintString(u32 battler);
static void OpponentHandleChooseAction(u32 battler);
static void OpponentHandleChooseMove(u32 battler);
static void OpponentHandleChooseItem(u32 battler);
static void OpponentHandleChoosePokemon(u32 battler);
static void OpponentHandleHealthBarUpdate(u32 battler);
static void OpponentHandleIntroTrainerBallThrow(u32 battler);
static void OpponentHandleDrawPartyStatusSummary(u32 battler);
static void OpponentHandleBattleAnimation(u32 battler);
static void OpponentHandleEndLinkBattle(u32 battler);
static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore);
static void OpponentBufferRunCommand(u32 battler);
static void OpponentBufferExecCompleted(u32 battler);
static void SwitchIn_HandleSoundAndEnd(u32 battler);
static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
{
@ -67,8 +59,8 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler)
[CONTROLLER_GETRAWMONDATA] = BtlController_HandleGetRawMonData,
[CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData,
[CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData,
[CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim,
[CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim,
[CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall,
[CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic,
[CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide,
@ -78,8 +70,8 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler)
[CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_BALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = OpponentHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = OpponentHandlePrintString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty,
[CONTROLLER_CHOOSEACTION] = OpponentHandleChooseAction,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
@ -87,7 +79,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler)
[CONTROLLER_OPENBAG] = OpponentHandleChooseItem,
[CONTROLLER_CHOOSEPOKEMON] = OpponentHandleChoosePokemon,
[CONTROLLER_23] = BtlController_Empty,
[CONTROLLER_HEALTHBARUPDATE] = OpponentHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = BtlController_Empty,
[CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate,
[CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation,
@ -111,7 +103,7 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler)
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility,
[CONTROLLER_BATTLEANIMATION] = OpponentHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = OpponentHandleEndLinkBattle,
@ -132,16 +124,7 @@ static void OpponentBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sOpponentBufferCommands))
sOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
OpponentBufferExecCompleted(battler);
}
}
static void Intro_DelayAndEnd(u32 battler)
{
if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0;
OpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -208,7 +191,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
}
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;
gBattlerControllerFuncs[battler] = Intro_DelayAndEnd;
gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd;
}
}
@ -310,49 +293,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler)
}
}
static void TryShinyAnimAfterMonAnim(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].x2 == 0
&& !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim
&& !gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim)
TryShinyAnimation(battler, GetBattlerMon(battler));
if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy
&& gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim)
{
gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);
FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);
OpponentBufferExecCompleted(battler);
}
}
static void SwitchIn_ShowSubstitute(u32 battler)
{
if (SwitchIn_ShowSubstituteUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd;
}
static void SwitchIn_HandleSoundAndEnd(u32 battler)
{
if (SwitchIn_HandleSoundAndEndUtil(battler))
OpponentBufferExecCompleted(battler);
}
static void SwitchIn_ShowHealthbox(u32 battler)
{
if (SwitchIn_ShowHealthboxUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute;
}
static void SwitchIn_TryShinyAnim(u32 battler)
{
if (SwitchIn_TryShinyAnimUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox;
}
static void OpponentBufferExecCompleted(u32 battler)
void OpponentBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = OpponentBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -368,17 +309,6 @@ static void OpponentBufferExecCompleted(u32 battler)
}
}
static void OpponentHandleLoadMonSprite(u32 battler)
{
BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim);
}
static void OpponentHandleSwitchInAnim(u32 battler)
{
gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE;
BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim);
}
static u32 OpponentGetTrainerPicId(u32 battlerId)
{
u32 trainerPicId;
@ -469,20 +399,10 @@ static void OpponentHandleTrainerSlideBack(u32 battler)
BtlController_HandleTrainerSlideBack(battler, 35, FALSE);
}
static void OpponentHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, FALSE);
}
static void OpponentHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, FALSE, TRUE);
}
static void OpponentHandleChooseAction(u32 battler)
{
AI_TrySwitchOrUseItem(battler);
OpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void OpponentHandleChooseMove(u32 battler)
@ -531,7 +451,7 @@ static void OpponentHandleChooseMove(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8));
}
}
OpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else // Wild pokemon - use random move
{
@ -591,14 +511,14 @@ static void OpponentHandleChooseMove(u32 battler)
else
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8));
OpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
static void OpponentHandleChooseItem(u32 battler)
{
BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]);
OpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler)
@ -671,7 +591,7 @@ static void OpponentHandleChoosePokemon(u32 battler)
TestRunner_Battle_CheckSwitch(battler, chosenMonId);
#endif // TESTING
BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL);
OpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore)
@ -690,11 +610,6 @@ static u8 CountAIAliveNonEggMonsExcept(u8 slotToIgnore)
return count;
}
static void OpponentHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, FALSE);
}
static void OpponentHandleIntroTrainerBallThrow(u32 battler)
{
BtlController_HandleIntroTrainerBallThrow(battler, 0, NULL, 0, Intro_TryShinyAnimShowHealthbox);
@ -705,11 +620,6 @@ static void OpponentHandleDrawPartyStatusSummary(u32 battler)
BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE);
}
static void OpponentHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, FALSE, FALSE);
}
static void OpponentHandleEndLinkBattle(u32 battler)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER))
@ -718,5 +628,5 @@ static void OpponentHandleEndLinkBattle(u32 battler)
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(gMain.savedCallback);
}
OpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}

View File

@ -48,24 +48,18 @@
#include "type_icons.h"
#include "pokedex.h"
static void PlayerBufferExecCompleted(u32 battler);
static void PlayerHandleLoadMonSprite(u32 battler);
static void PlayerHandleSwitchInAnim(u32 battler);
static void PlayerHandleDrawTrainerPic(u32 battler);
static void PlayerHandleTrainerSlide(u32 battler);
static void PlayerHandleTrainerSlideBack(u32 battler);
static void PlayerHandlePaletteFade(u32 battler);
static void PlayerHandleSuccessBallThrowAnim(u32 battler);
static void PlayerHandlePause(u32 battler);
static void PlayerHandleMoveAnimation(u32 battler);
static void PlayerHandlePrintString(u32 battler);
static void PlayerHandlePrintSelectionString(u32 battler);
static void PlayerHandleChooseAction(u32 battler);
static void PlayerHandleYesNoBox(u32 battler);
static void PlayerHandleChooseItem(u32 battler);
static void PlayerHandleChoosePokemon(u32 battler);
static void PlayerHandleCmd23(u32 battler);
static void PlayerHandleHealthBarUpdate(u32 battler);
static void PlayerHandleStatusXor(u32 battler);
static void PlayerHandleDMA3Transfer(u32 battler);
static void PlayerHandlePlayBGM(u32 battler);
@ -76,7 +70,6 @@ static void PlayerHandleOneReturnValue_Duplicate(u32 battler);
static void PlayerHandleIntroTrainerBallThrow(u32 battler);
static void PlayerHandleDrawPartyStatusSummary(u32 battler);
static void PlayerHandleEndBounceEffect(u32 battler);
static void PlayerHandleBattleAnimation(u32 battler);
static void PlayerHandleLinkStandbyMsg(u32 battler);
static void PlayerHandleResetActionMoveSelection(u32 battler);
static void PlayerHandleEndLinkBattle(u32 battler);
@ -89,7 +82,6 @@ static void MoveSelectionDisplayMoveType(u32 battler);
static void MoveSelectionDisplayMoveNames(u32 battler);
static void TryMoveSelectionDisplayMoveDescription(u32 battler);
static void MoveSelectionDisplayMoveDescription(u32 battler);
static void SwitchIn_HandleSoundAndEnd(u32 battler);
static void WaitForMonSelection(u32 battler);
static void CompleteWhenChoseItem(u32 battler);
static void Task_LaunchLvlUpAnim(u8);
@ -111,7 +103,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData,
[CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData,
[CONTROLLER_LOADMONSPRITE] = PlayerHandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = PlayerHandleSwitchInAnim,
[CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim,
[CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall,
[CONTROLLER_DRAWTRAINERPIC] = PlayerHandleDrawTrainerPic,
[CONTROLLER_TRAINERSLIDE] = PlayerHandleTrainerSlide,
@ -121,16 +113,16 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim,
[CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim,
[CONTROLLER_PAUSE] = PlayerHandlePause,
[CONTROLLER_MOVEANIMATION] = PlayerHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = PlayerHandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly,
[CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction,
[CONTROLLER_YESNOBOX] = PlayerHandleYesNoBox,
[CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove,
[CONTROLLER_OPENBAG] = PlayerHandleChooseItem,
[CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon,
[CONTROLLER_23] = PlayerHandleCmd23,
[CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate,
[CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate,
[CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation,
@ -154,7 +146,7 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary,
[CONTROLLER_ENDBOUNCE] = PlayerHandleEndBounceEffect,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility,
[CONTROLLER_BATTLEANIMATION] = PlayerHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = PlayerHandleLinkStandbyMsg,
[CONTROLLER_RESETACTIONMOVESELECTION] = PlayerHandleResetActionMoveSelection,
[CONTROLLER_ENDLINKBATTLE] = PlayerHandleEndLinkBattle,
@ -170,7 +162,7 @@ void SetControllerToPlayer(u32 battler)
gPlayerDpadHoldFrames = 0;
}
static void PlayerBufferExecCompleted(u32 battler)
void PlayerBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = PlayerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -193,14 +185,14 @@ static void PlayerBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerBufferCommands))
sPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
static void CompleteOnBattlerSpritePosX_0(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].x2 == 0)
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static u16 GetPrevBall(u16 ballId)
@ -311,7 +303,7 @@ static void HandleInputChooseAction(u32 battler)
ArrowsChangeColorLastBallCycle(FALSE);
TryHideLastUsedBall();
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_THROW_BALL, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
return;
}
@ -337,7 +329,7 @@ static void HandleInputChooseAction(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_RUN, 0);
break;
}
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else if (JOY_NEW(DPAD_LEFT))
{
@ -393,7 +385,7 @@ static void HandleInputChooseAction(u32 battler)
}
PlaySE(SE_SELECT);
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else if (B_QUICK_MOVE_CURSOR_TO_RUN)
{
@ -413,7 +405,7 @@ static void HandleInputChooseAction(u32 battler)
else if (DEBUG_BATTLE_MENU == TRUE && JOY_NEW(SELECT_BUTTON))
{
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_DEBUG, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else if (B_LAST_USED_BALL == TRUE && B_LAST_USED_BALL_CYCLE == FALSE
&& JOY_NEW(B_LAST_USED_BALL_BUTTON) && CanThrowLastUsedBall())
@ -421,7 +413,7 @@ static void HandleInputChooseAction(u32 battler)
PlaySE(SE_SELECT);
TryHideLastUsedBall();
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_THROW_BALL, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -455,7 +447,7 @@ void HandleInputChooseTarget(u32 battler)
EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX);
TryHideLastUsedBall();
HideGimmickTriggerSprite();
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59)
{
@ -613,7 +605,7 @@ void HandleInputShowEntireFieldTargets(u32 battler)
else
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8));
HideGimmickTriggerSprite();
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59)
{
@ -642,7 +634,7 @@ void HandleInputShowTargets(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8));
HideGimmickTriggerSprite();
TryHideLastUsedBall();
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59)
{
@ -746,7 +738,7 @@ void HandleInputChooseMove(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, gMoveSelectionCursor[battler] | (gMultiUsePlayerCursor << 8));
HideGimmickTriggerSprite();
TryHideLastUsedBall();
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
break;
case 1:
gBattlerControllerFuncs[battler] = HandleInputChooseTarget;
@ -783,7 +775,7 @@ void HandleInputChooseMove(u32 battler)
{
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0xFFFF);
HideGimmickTriggerSprite();
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
TryToHideMoveInfoWindow();
}
}
@ -1226,15 +1218,6 @@ void SetBattleEndCallbacks(u32 battler)
}
}
static void Intro_DelayAndEnd(u32 battler)
{
if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0;
PlayerBufferExecCompleted(battler);
}
}
static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
{
bool8 healthboxAnimDone = FALSE;
@ -1270,7 +1253,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
HandleLowHpMusicChange(GetBattlerMon(BATTLE_PARTNER(battler)), BATTLE_PARTNER(battler));
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;
gBattlerControllerFuncs[battler] = Intro_DelayAndEnd;
gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd;
}
}
@ -1360,48 +1343,6 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler)
}
}
static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler)
{
if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy
&& gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim
&& gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)
{
CopyBattleSpriteInvisibility(battler);
// Reset shiny anim (even if it didn't occur)
gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);
FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);
// Check if Substitute should be shown
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE);
gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd;
}
}
static void SwitchIn_HandleSoundAndEnd(u32 battler)
{
if (SwitchIn_HandleSoundAndEndUtil(battler))
{
HandleLowHpMusicChange(GetBattlerMon(battler), battler);
PlayerBufferExecCompleted(battler);
}
}
static void SwitchIn_TryShinyAnimShowHealthbox(u32 battler)
{
if (SwitchIn_TryShinyAnimUtil(battler))
{
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL);
StartHealthboxSlideIn(battler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]);
gBattlerControllerFuncs[battler] = SwitchIn_CleanShinyAnimShowSubstitute;
}
}
void Task_PlayerController_RestoreBgmAfterCry(u8 taskId)
{
if (!IsCryPlayingOrClearCrySongs())
@ -1619,7 +1560,7 @@ static void WaitForMonSelection(u32 battler)
if ((gBattleResources->bufferA[battler][1] & 0xF) == 1)
PrintLinkStandbyMsg();
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -1639,7 +1580,7 @@ static void CompleteWhenChoseItem(u32 battler)
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -1669,13 +1610,13 @@ static void PlayerHandleYesNoInput(u32 battler)
else
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_NOTHING_FAINTED, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
if (JOY_NEW(B_BUTTON))
{
HandleBattleWindow(YESNOBOX_X_Y, WINDOW_CLEAR);
PlaySE(SE_SELECT);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -1886,13 +1827,6 @@ static void PlayerHandleLoadMonSprite(u32 battler)
gBattlerControllerFuncs[battler] = CompleteOnBattlerSpritePosX_0;
}
static void PlayerHandleSwitchInAnim(u32 battler)
{
gActionSelectionCursor[battler] = 0;
gMoveSelectionCursor[battler] = 0;
BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnimShowHealthbox);
}
u32 LinkPlayerGetTrainerPicId(u32 multiplayerId)
{
u32 trainerPicId;
@ -1984,7 +1918,7 @@ static void PlayerHandleTrainerSlideBack(u32 battler)
static void PlayerHandlePaletteFade(u32 battler)
{
BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleSuccessBallThrowAnim(u32 battler)
@ -2004,25 +1938,7 @@ static void PlayerHandlePause(u32 battler)
while (timer != 0)
timer--;
PlayerBufferExecCompleted(battler);
}
static void PlayerHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, TRUE);
}
static void PlayerHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, TRUE, TRUE);
}
static void PlayerHandlePrintSelectionString(u32 battler)
{
if (IsOnPlayerSide(battler))
PlayerHandlePrintString(battler);
else
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void HandleChooseActionAfterDma3(u32 battler)
@ -2117,7 +2033,7 @@ static void PlayerHandleYesNoBox(u32 battler)
}
else
{
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -2139,7 +2055,7 @@ static void PlayerChooseMoveInBattlePalace(u32 battler)
{
gBattlePalaceMoveSelectionRngValue = gRngValue;
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, ChooseMoveAndTargetInBattlePalace(battler));
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -2208,7 +2124,7 @@ static void PlayerHandleChoosePokemon(u32 battler)
&& (gBattleResources->bufferA[battler][1] & 0xF) != PARTY_ACTION_SEND_MON_TO_BOX)
{
BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattlerPartyIndexes[battler] + 1, gBattlePartyCurrentOrder);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else
{
@ -2227,12 +2143,7 @@ static void PlayerHandleCmd23(u32 battler)
{
BattleStopLowHpSound();
BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK);
PlayerBufferExecCompleted(battler);
}
static void PlayerHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, TRUE);
BtlController_Complete(battler);
}
void PlayerHandleExpUpdate(u32 battler)
@ -2242,7 +2153,7 @@ void PlayerHandleExpUpdate(u32 battler)
if (GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL) >= MAX_LEVEL)
{
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else
{
@ -2268,7 +2179,7 @@ static void PlayerHandleStatusXor(u32 battler)
u32 val = GetMonData(GetBattlerMon(battler), MON_DATA_STATUS) ^ gBattleResources->bufferA[battler][1];
SetMonData(GetBattlerMon(battler), MON_DATA_STATUS, &val);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleDMA3Transfer(u32 battler)
@ -2295,37 +2206,37 @@ static void PlayerHandleDMA3Transfer(u32 battler)
dst += 0x1000;
size -= 0x1000;
}
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandlePlayBGM(u32 battler)
{
PlayBGM(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8));
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleTwoReturnValues(u32 battler)
{
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleChosenMonReturnValue(u32 battler)
{
BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, 0, NULL);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleOneReturnValue(u32 battler)
{
BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleOneReturnValue_Duplicate(u32 battler)
{
BtlController_EmitOneReturnValue_Duplicate(battler, B_COMM_TO_ENGINE, 0);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleIntroTrainerBallThrow(u32 battler)
@ -2343,12 +2254,7 @@ static void PlayerHandleEndBounceEffect(u32 battler)
{
EndBounceEffect(battler, BOUNCE_HEALTHBOX);
EndBounceEffect(battler, BOUNCE_MON);
PlayerBufferExecCompleted(battler);
}
static void PlayerHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, FALSE, TRUE);
BtlController_Complete(battler);
}
static void PlayerHandleLinkStandbyMsg(u32 battler)
@ -2367,7 +2273,7 @@ static void PlayerHandleLinkStandbyMsg(u32 battler)
PrintLinkStandbyMsg();
break;
}
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleResetActionMoveSelection(u32 battler)
@ -2385,7 +2291,7 @@ static void PlayerHandleResetActionMoveSelection(u32 battler)
gMoveSelectionCursor[battler] = 0;
break;
}
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerHandleEndLinkBattle(u32 battler)
@ -2395,7 +2301,7 @@ static void PlayerHandleEndLinkBattle(u32 battler)
gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleResources->bufferA[battler][2];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattlerControllerFuncs[battler] = SetBattleEndCallbacks;
}
@ -2403,7 +2309,7 @@ static void Controller_WaitForDebug(u32 battler)
{
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
PlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}

View File

@ -32,24 +32,16 @@
#include "constants/party_menu.h"
#include "constants/trainers.h"
static void PlayerPartnerHandleLoadMonSprite(u32 battler);
static void PlayerPartnerHandleSwitchInAnim(u32 battler);
static void PlayerPartnerHandleDrawTrainerPic(u32 battler);
static void PlayerPartnerHandleTrainerSlideBack(u32 battler);
static void PlayerPartnerHandleMoveAnimation(u32 battler);
static void PlayerPartnerHandlePrintString(u32 battler);
static void PlayerPartnerHandleChooseAction(u32 battler);
static void PlayerPartnerHandleChooseMove(u32 battler);
static void PlayerPartnerHandleChoosePokemon(u32 battler);
static void PlayerPartnerHandleHealthBarUpdate(u32 battler);
static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler);
static void PlayerPartnerHandleDrawPartyStatusSummary(u32 battler);
static void PlayerPartnerHandleBattleAnimation(u32 battler);
static void PlayerPartnerHandleEndLinkBattle(u32 battler);
static void PlayerPartnerBufferRunCommand(u32 battler);
static void PlayerPartnerBufferExecCompleted(u32 battler);
static void SwitchIn_WaitAndEnd(u32 battler);
static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
{
@ -57,8 +49,8 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat
[CONTROLLER_GETRAWMONDATA] = BtlController_Empty,
[CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData,
[CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData,
[CONTROLLER_LOADMONSPRITE] = PlayerPartnerHandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = PlayerPartnerHandleSwitchInAnim,
[CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim,
[CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall,
[CONTROLLER_DRAWTRAINERPIC] = PlayerPartnerHandleDrawTrainerPic,
[CONTROLLER_TRAINERSLIDE] = BtlController_Empty,
@ -68,8 +60,8 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat
[CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_BALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = PlayerPartnerHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = PlayerPartnerHandlePrintString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty,
[CONTROLLER_CHOOSEACTION] = PlayerPartnerHandleChooseAction,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
@ -77,7 +69,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat
[CONTROLLER_OPENBAG] = BtlController_Empty,
[CONTROLLER_CHOOSEPOKEMON] = PlayerPartnerHandleChoosePokemon,
[CONTROLLER_23] = BtlController_Empty,
[CONTROLLER_HEALTHBARUPDATE] = PlayerPartnerHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, // Partner's player gets experience the same way as the player.
[CONTROLLER_STATUSICONUPDATE] = BtlController_HandleStatusIconUpdate,
[CONTROLLER_STATUSANIMATION] = BtlController_HandleStatusAnimation,
@ -101,7 +93,7 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 bat
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility,
[CONTROLLER_BATTLEANIMATION] = PlayerPartnerHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = PlayerPartnerHandleEndLinkBattle,
@ -122,16 +114,7 @@ static void PlayerPartnerBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands))
sPlayerPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
PlayerPartnerBufferExecCompleted(battler);
}
}
static void Intro_DelayAndEnd(u32 battler)
{
if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0;
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
@ -159,7 +142,7 @@ static void Intro_WaitForHealthbox(u32 battler)
if (finished)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;
gBattlerControllerFuncs[battler] = Intro_DelayAndEnd;
gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd;
}
}
@ -194,37 +177,7 @@ void Controller_PlayerPartnerShowIntroHealthbox(u32 battler)
}
}
static void WaitForMonAnimAfterLoad(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0)
PlayerPartnerBufferExecCompleted(battler);
}
static void SwitchIn_ShowSubstitute(u32 battler)
{
if (SwitchIn_ShowSubstituteUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd;
}
static void SwitchIn_WaitAndEnd(u32 battler)
{
if (SwitchIn_WaitAndEndUtil(battler))
PlayerPartnerBufferExecCompleted(battler);
}
static void SwitchIn_ShowHealthbox(u32 battler)
{
if (SwitchIn_ShowHealthboxUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute;
}
static void SwitchIn_TryShinyAnim(u32 battler)
{
if (SwitchIn_TryShinyAnimUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox;
}
static void PlayerPartnerBufferExecCompleted(u32 battler)
void PlayerPartnerBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = PlayerPartnerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -240,16 +193,6 @@ static void PlayerPartnerBufferExecCompleted(u32 battler)
}
}
static void PlayerPartnerHandleLoadMonSprite(u32 battler)
{
BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad);
}
static void PlayerPartnerHandleSwitchInAnim(u32 battler)
{
BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim);
}
// some explanation here
// in emerald it's possible to have a tag battle in the battle frontier facilities with AI
// which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it
@ -294,20 +237,10 @@ static void PlayerPartnerHandleTrainerSlideBack(u32 battler)
BtlController_HandleTrainerSlideBack(battler, 35, FALSE);
}
static void PlayerPartnerHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, FALSE);
}
static void PlayerPartnerHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, FALSE, FALSE);
}
static void PlayerPartnerHandleChooseAction(u32 battler)
{
AI_TrySwitchOrUseItem(battler);
PlayerPartnerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerPartnerHandleChooseMove(u32 battler)
@ -337,7 +270,7 @@ static void PlayerPartnerHandleChooseMove(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, (chosenMoveIndex) | (gBattlerTarget << 8));
}
PlayerPartnerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void PlayerPartnerHandleChoosePokemon(u32 battler)
@ -378,12 +311,7 @@ static void PlayerPartnerHandleChoosePokemon(u32 battler)
gBattleStruct->monToSwitchIntoId[battler] = chosenMonId;
}
BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, chosenMonId, NULL);
PlayerPartnerBufferExecCompleted(battler);
}
static void PlayerPartnerHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, FALSE);
BtlController_Complete(battler);
}
static void PlayerPartnerHandleIntroTrainerBallThrow(u32 battler)
@ -406,16 +334,11 @@ static void PlayerPartnerHandleDrawPartyStatusSummary(u32 battler)
BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE);
}
static void PlayerPartnerHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, FALSE, FALSE);
}
static void PlayerPartnerHandleEndLinkBattle(u32 battler)
{
gBattleOutcome = gBattleResources->bufferA[battler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
PlayerPartnerBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattlerControllerFuncs[battler] = SetBattleEndCallbacks;
}

View File

@ -32,27 +32,19 @@
#include "constants/songs.h"
#include "constants/trainers.h"
static void RecordedOpponentHandleLoadMonSprite(u32 battler);
static void RecordedOpponentHandleSwitchInAnim(u32 battler);
static void RecordedOpponentHandleDrawTrainerPic(u32 battler);
static void RecordedOpponentHandleTrainerSlideBack(u32 battler);
static void RecordedOpponentHandleMoveAnimation(u32 battler);
static void RecordedOpponentHandlePrintString(u32 battler);
static void RecordedOpponentHandleChooseAction(u32 battler);
static void RecordedOpponentHandleChooseMove(u32 battler);
static void RecordedOpponentHandleChooseItem(u32 battler);
static void RecordedOpponentHandleChoosePokemon(u32 battler);
static void RecordedOpponentHandleHealthBarUpdate(u32 battler);
static void RecordedOpponentHandleStatusIconUpdate(u32 battler);
static void RecordedOpponentHandleStatusAnimation(u32 battler);
static void RecordedOpponentHandleIntroTrainerBallThrow(u32 battler);
static void RecordedOpponentHandleDrawPartyStatusSummary(u32 battler);
static void RecordedOpponentHandleBattleAnimation(u32 battler);
static void RecordedOpponentHandleEndLinkBattle(u32 battler);
static void RecordedOpponentBufferRunCommand(u32 battler);
static void RecordedOpponentBufferExecCompleted(u32 battler);
static void SwitchIn_HandleSoundAndEnd(u32 battler);
static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
{
@ -60,8 +52,8 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32
[CONTROLLER_GETRAWMONDATA] = BtlController_Empty,
[CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData,
[CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData,
[CONTROLLER_LOADMONSPRITE] = RecordedOpponentHandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = RecordedOpponentHandleSwitchInAnim,
[CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim,
[CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall,
[CONTROLLER_DRAWTRAINERPIC] = RecordedOpponentHandleDrawTrainerPic,
[CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide,
@ -71,8 +63,8 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32
[CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_BALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = RecordedOpponentHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = RecordedOpponentHandlePrintString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty,
[CONTROLLER_CHOOSEACTION] = RecordedOpponentHandleChooseAction,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
@ -80,7 +72,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32
[CONTROLLER_OPENBAG] = RecordedOpponentHandleChooseItem,
[CONTROLLER_CHOOSEPOKEMON] = RecordedOpponentHandleChoosePokemon,
[CONTROLLER_23] = BtlController_Empty,
[CONTROLLER_HEALTHBARUPDATE] = RecordedOpponentHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = BtlController_Empty,
[CONTROLLER_STATUSICONUPDATE] = RecordedOpponentHandleStatusIconUpdate,
[CONTROLLER_STATUSANIMATION] = RecordedOpponentHandleStatusAnimation,
@ -104,7 +96,7 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(u32
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility,
[CONTROLLER_BATTLEANIMATION] = RecordedOpponentHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = RecordedOpponentHandleEndLinkBattle,
@ -125,11 +117,11 @@ static void RecordedOpponentBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands))
sRecordedOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
RecordedOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
static void RecordedOpponentBufferExecCompleted(u32 battler)
void RecordedOpponentBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = RecordedOpponentBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -145,15 +137,6 @@ static void RecordedOpponentBufferExecCompleted(u32 battler)
}
}
static void Intro_DelayAndEnd(u32 battler)
{
if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0;
RecordedOpponentBufferExecCompleted(battler);
}
}
static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
{
bool8 healthboxAnimDone = FALSE;
@ -192,7 +175,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
}
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;
gBattlerControllerFuncs[battler] = Intro_DelayAndEnd;
gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd;
}
}
@ -286,46 +269,6 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler)
}
}
static void TryShinyAnimAfterMonAnim(u32 battler)
{
if (TryShinyAnimAfterMonAnimUtil(battler))
RecordedOpponentBufferExecCompleted(battler);
}
static void SwitchIn_ShowSubstitute(u32 battler)
{
if (SwitchIn_ShowSubstituteUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd;
}
static void SwitchIn_HandleSoundAndEnd(u32 battler)
{
if (SwitchIn_HandleSoundAndEndUtil(battler))
RecordedOpponentBufferExecCompleted(battler);
}
static void SwitchIn_ShowHealthbox(u32 battler)
{
if (SwitchIn_ShowHealthboxUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute;
}
static void SwitchIn_TryShinyAnim(u32 battler)
{
if (SwitchIn_TryShinyAnimUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox;
}
static void RecordedOpponentHandleLoadMonSprite(u32 battler)
{
BtlController_HandleLoadMonSprite(battler, TryShinyAnimAfterMonAnim);
}
static void RecordedOpponentHandleSwitchInAnim(u32 battler)
{
BtlController_HandleSwitchInAnim(battler, FALSE, SwitchIn_TryShinyAnim);
}
static void RecordedOpponentHandleDrawTrainerPic(u32 battler)
{
s16 xPos;
@ -371,20 +314,10 @@ static void RecordedOpponentHandleTrainerSlideBack(u32 battler)
BtlController_HandleTrainerSlideBack(battler, 35, FALSE);
}
static void RecordedOpponentHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, FALSE);
}
static void RecordedOpponentHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, FALSE, FALSE);
}
static void RecordedOpponentHandleChooseAction(u32 battler)
{
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0);
RecordedOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void RecordedOpponentHandleChooseMove(u32 battler)
@ -400,7 +333,7 @@ static void RecordedOpponentHandleChooseMove(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveId | (target << 8));
}
RecordedOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void RecordedOpponentHandleChooseItem(u32 battler)
@ -411,7 +344,7 @@ static void RecordedOpponentHandleChooseItem(u32 battler)
gBattleStruct->itemPartyIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_TARGET, battler);
gBattleStruct->itemMoveIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_MOVE, battler);
BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]);
RecordedOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void RecordedOpponentHandleChoosePokemon(u32 battler)
@ -419,12 +352,7 @@ static void RecordedOpponentHandleChoosePokemon(u32 battler)
gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler);
gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing
BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL);
RecordedOpponentBufferExecCompleted(battler);
}
static void RecordedOpponentHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, FALSE);
BtlController_Complete(battler);
}
static void RecordedOpponentHandleStatusIconUpdate(u32 battler)
@ -452,11 +380,6 @@ static void RecordedOpponentHandleDrawPartyStatusSummary(u32 battler)
BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_OPPONENT, TRUE);
}
static void RecordedOpponentHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, FALSE, FALSE);
}
static void RecordedOpponentHandleEndLinkBattle(u32 battler)
{
if (gBattleResources->bufferA[battler][1] == B_OUTCOME_DREW)
@ -466,6 +389,6 @@ static void RecordedOpponentHandleEndLinkBattle(u32 battler)
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
RecordedOpponentBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattlerControllerFuncs[battler] = SetBattleEndCallbacks;
}

View File

@ -29,27 +29,19 @@
#include "constants/songs.h"
#include "constants/trainers.h"
static void RecordedPlayerHandleLoadMonSprite(u32 battler);
static void RecordedPlayerHandleSwitchInAnim(u32 battler);
static void RecordedPlayerHandleDrawTrainerPic(u32 battler);
static void RecordedPlayerHandleTrainerSlideBack(u32 battler);
static void RecordedPlayerHandleMoveAnimation(u32 battler);
static void RecordedPlayerHandlePrintString(u32 battler);
static void RecordedPlayerHandleChooseAction(u32 battler);
static void RecordedPlayerHandleChooseMove(u32 battler);
static void RecordedPlayerHandleChooseItem(u32 battler);
static void RecordedPlayerHandleChoosePokemon(u32 battler);
static void RecordedPlayerHandleHealthBarUpdate(u32 battler);
static void RecordedPlayerHandleStatusIconUpdate(u32 battler);
static void RecordedPlayerHandleStatusAnimation(u32 battler);
static void RecordedPlayerHandleIntroTrainerBallThrow(u32 battler);
static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler);
static void RecordedPlayerHandleBattleAnimation(u32 battler);
static void RecordedPlayerHandleEndLinkBattle(u32 battler);
static void RecordedPlayerBufferRunCommand(u32 battler);
static void RecordedPlayerBufferExecCompleted(u32 battler);
static void SwitchIn_WaitAndEnd(u32 battler);
static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
{
@ -57,8 +49,8 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba
[CONTROLLER_GETRAWMONDATA] = BtlController_Empty,
[CONTROLLER_SETMONDATA] = BtlController_HandleSetMonData,
[CONTROLLER_SETRAWMONDATA] = BtlController_HandleSetRawMonData,
[CONTROLLER_LOADMONSPRITE] = RecordedPlayerHandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = RecordedPlayerHandleSwitchInAnim,
[CONTROLLER_LOADMONSPRITE] = BtlController_HandleLoadMonSprite,
[CONTROLLER_SWITCHINANIM] = BtlController_HandleSwitchInAnim,
[CONTROLLER_RETURNMONTOBALL] = BtlController_HandleReturnMonToBall,
[CONTROLLER_DRAWTRAINERPIC] = RecordedPlayerHandleDrawTrainerPic,
[CONTROLLER_TRAINERSLIDE] = BtlController_Empty,
@ -68,8 +60,8 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba
[CONTROLLER_SUCCESSBALLTHROWANIM] = BtlController_Empty,
[CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = RecordedPlayerHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = RecordedPlayerHandlePrintString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_Empty,
[CONTROLLER_CHOOSEACTION] = RecordedPlayerHandleChooseAction,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
@ -77,7 +69,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba
[CONTROLLER_OPENBAG] = RecordedPlayerHandleChooseItem,
[CONTROLLER_CHOOSEPOKEMON] = RecordedPlayerHandleChoosePokemon,
[CONTROLLER_23] = BtlController_Empty,
[CONTROLLER_HEALTHBARUPDATE] = RecordedPlayerHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate,
[CONTROLLER_STATUSICONUPDATE] = RecordedPlayerHandleStatusIconUpdate,
[CONTROLLER_STATUSANIMATION] = RecordedPlayerHandleStatusAnimation,
@ -101,7 +93,7 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(u32 ba
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_HandleHidePartyStatusSummary,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_HandleSpriteInvisibility,
[CONTROLLER_BATTLEANIMATION] = RecordedPlayerHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = RecordedPlayerHandleEndLinkBattle,
@ -122,16 +114,7 @@ static void RecordedPlayerBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands))
sRecordedPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
RecordedPlayerBufferExecCompleted(battler);
}
}
static void Intro_DelayAndEnd(u32 battler)
{
if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0;
RecordedPlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -172,7 +155,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
HandleLowHpMusicChange(GetBattlerMon(BATTLE_PARTNER(battler)), BATTLE_PARTNER(battler));
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;
gBattlerControllerFuncs[battler] = Intro_DelayAndEnd;
gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd;
}
}
else
@ -197,7 +180,7 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
if (healthboxAnimDone)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 3;
gBattlerControllerFuncs[battler] = Intro_DelayAndEnd;
gBattlerControllerFuncs[battler] = BtlController_Intro_DelayAndEnd;
}
}
}
@ -271,37 +254,7 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler)
}
}
static void WaitForMonAnimAfterLoad(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0)
RecordedPlayerBufferExecCompleted(battler);
}
static void SwitchIn_ShowSubstitute(u32 battler)
{
if (SwitchIn_ShowSubstituteUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd;
}
static void SwitchIn_WaitAndEnd(u32 battler)
{
if (SwitchIn_WaitAndEndUtil(battler))
RecordedPlayerBufferExecCompleted(battler);
}
static void SwitchIn_ShowHealthbox(u32 battler)
{
if (SwitchIn_ShowHealthboxUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute;
}
static void SwitchIn_TryShinyAnim(u32 battler)
{
if (SwitchIn_TryShinyAnimUtil(battler))
gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox;
}
static void RecordedPlayerBufferExecCompleted(u32 battler)
void RecordedPlayerBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = RecordedPlayerBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -317,16 +270,6 @@ static void RecordedPlayerBufferExecCompleted(u32 battler)
}
}
static void RecordedPlayerHandleLoadMonSprite(u32 battler)
{
BtlController_HandleLoadMonSprite(battler, WaitForMonAnimAfterLoad);
}
static void RecordedPlayerHandleSwitchInAnim(u32 battler)
{
BtlController_HandleSwitchInAnim(battler, TRUE, SwitchIn_TryShinyAnim);
}
static void RecordedPlayerHandleDrawTrainerPic(u32 battler)
{
bool32 isFrontPic;
@ -382,22 +325,12 @@ static void RecordedPlayerHandleTrainerSlideBack(u32 battler)
BtlController_HandleTrainerSlideBack(battler, 35, FALSE);
}
static void RecordedPlayerHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, FALSE);
}
static void RecordedPlayerHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, FALSE, FALSE);
}
static void ChooseActionInBattlePalace(u32 battler)
{
if (gBattleCommunication[4] >= gBattlersCount / 2)
{
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_BATTLE_PALACE_ACTION, battler), 0);
RecordedPlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -410,7 +343,7 @@ static void RecordedPlayerHandleChooseAction(u32 battler)
else
{
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(RECORDED_ACTION_TYPE, battler), 0);
RecordedPlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -427,7 +360,7 @@ static void RecordedPlayerHandleChooseMove(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, moveIndex | (target << 8));
}
RecordedPlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void RecordedPlayerHandleChooseItem(u32 battler)
@ -438,7 +371,7 @@ static void RecordedPlayerHandleChooseItem(u32 battler)
gBattleStruct->itemPartyIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_TARGET, battler);
gBattleStruct->itemMoveIndex[battler] = RecordedBattle_GetBattlerAction(RECORDED_ITEM_MOVE, battler);
BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->chosenItem[battler]);
RecordedPlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void RecordedPlayerHandleChoosePokemon(u32 battler)
@ -446,12 +379,7 @@ static void RecordedPlayerHandleChoosePokemon(u32 battler)
gBattleStruct->monToSwitchIntoId[battler] = RecordedBattle_GetBattlerAction(RECORDED_PARTY_INDEX, battler);
gSelectedMonPartyId = gBattleStruct->monToSwitchIntoId[battler]; // Revival Blessing
BtlController_EmitChosenMonReturnValue(battler, B_COMM_TO_ENGINE, gBattleStruct->monToSwitchIntoId[battler], NULL);
RecordedPlayerBufferExecCompleted(battler);
}
static void RecordedPlayerHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, TRUE);
BtlController_Complete(battler);
}
static void RecordedPlayerHandleStatusIconUpdate(u32 battler)
@ -488,16 +416,11 @@ static void RecordedPlayerHandleDrawPartyStatusSummary(u32 battler)
BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, TRUE);
}
static void RecordedPlayerHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, FALSE, FALSE);
}
static void RecordedPlayerHandleEndLinkBattle(u32 battler)
{
gBattleOutcome = gBattleResources->bufferA[battler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
RecordedPlayerBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattlerControllerFuncs[battler] = SetBattleEndCallbacks;
}

View File

@ -31,19 +31,15 @@
static void SafariHandleDrawTrainerPic(u32 battler);
static void SafariHandleSuccessBallThrowAnim(u32 battler);
static void SafariHandleBallThrowAnim(u32 battler);
static void SafariHandlePrintString(u32 battler);
static void SafariHandlePrintSelectionString(u32 battler);
static void SafariHandleChooseAction(u32 battler);
static void SafariHandleChooseItem(u32 battler);
static void SafariHandleChoosePokemon(u32 battler);
static void SafariHandleStatusIconUpdate(u32 battler);
static void SafariHandleFaintingCry(u32 battler);
static void SafariHandleIntroTrainerBallThrow(u32 battler);
static void SafariHandleBattleAnimation(u32 battler);
static void SafariHandleEndLinkBattle(u32 battler);
static void SafariBufferRunCommand(u32 battler);
static void SafariBufferExecCompleted(u32 battler);
static void CompleteWhenChosePokeblock(u32 battler);
static void WaitForMonSelection(u32 battler);
@ -65,8 +61,8 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_BALLTHROWANIM] = SafariHandleBallThrowAnim,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = BtlController_Empty,
[CONTROLLER_PRINTSTRING] = SafariHandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = SafariHandlePrintSelectionString,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly,
[CONTROLLER_CHOOSEACTION] = SafariHandleChooseAction,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
[CONTROLLER_CHOOSEMOVE] = BtlController_Empty,
@ -97,7 +93,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_Empty,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_Empty,
[CONTROLLER_BATTLEANIMATION] = SafariHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = SafariHandleEndLinkBattle,
@ -118,7 +114,7 @@ static void SafariBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sSafariBufferCommands))
sSafariBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
SafariBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -143,7 +139,7 @@ static void HandleInputChooseAction(u32 battler)
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_SAFARI_RUN, 0);
break;
}
SafariBufferExecCompleted(battler);
BtlController_Complete(battler);
}
else if (JOY_NEW(DPAD_LEFT))
{
@ -197,7 +193,7 @@ static void HandleInputChooseAction(u32 battler)
static void Controller_WaitForHealthbox(u32 battler)
{
if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void SafariSetBattleEndCallbacks(u32 battler)
@ -225,7 +221,7 @@ static void CompleteWhenChosePokeblock(u32 battler)
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId);
SafariBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -264,7 +260,7 @@ static void WaitForMonSelection(u32 battler)
}
}
static void SafariBufferExecCompleted(u32 battler)
void SafariBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = SafariBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -299,19 +295,6 @@ static void SafariHandleBallThrowAnim(u32 battler)
BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE);
}
static void SafariHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, FALSE, FALSE);
}
static void SafariHandlePrintSelectionString(u32 battler)
{
if (IsOnPlayerSide(battler))
SafariHandlePrintString(battler);
else
SafariBufferExecCompleted(battler);
}
static void HandleChooseActionAfterDma3(u32 battler)
{
if (!IsDma3ManagerBusyWithBgCopy())
@ -372,7 +355,7 @@ static void SafariHandleChoosePokemon(u32 battler)
static void SafariHandleStatusIconUpdate(u32 battler)
{
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_SAFARI_BALLS_TEXT);
SafariBufferExecCompleted(battler);
BtlController_Complete(battler);
}
// All of the other controllers(except Wally's) use CRY_MODE_FAINT.
@ -382,8 +365,8 @@ static void SafariHandleFaintingCry(u32 battler)
u16 species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES);
PlayCry_Normal(species, 25);
SafariBufferExecCompleted(battler);
SafariBufferExecCompleted(battler);
BtlController_Complete(battler);
BtlController_Complete(battler);
}
static void SafariHandleIntroTrainerBallThrow(u32 battler)
@ -394,17 +377,12 @@ static void SafariHandleIntroTrainerBallThrow(u32 battler)
gBattlerControllerFuncs[battler] = Controller_WaitForHealthbox;
}
static void SafariHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, TRUE, FALSE);
}
static void SafariHandleEndLinkBattle(u32 battler)
{
gBattleOutcome = gBattleResources->bufferA[battler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
SafariBufferExecCompleted(battler);
BtlController_Complete(battler);
if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER))
gBattlerControllerFuncs[battler] = SafariSetBattleEndCallbacks;
}

View File

@ -36,22 +36,15 @@ static void WallyHandleDrawTrainerPic(u32 battler);
static void WallyHandleTrainerSlide(u32 battler);
static void WallyHandleSuccessBallThrowAnim(u32 battler);
static void WallyHandleBallThrowAnim(u32 battler);
static void WallyHandleMoveAnimation(u32 battler);
static void WallyHandlePrintString(u32 battler);
static void WallyHandlePrintSelectionString(u32 battler);
static void WallyHandleChooseAction(u32 battler);
static void WallyHandleChooseMove(u32 battler);
static void WallyHandleChooseItem(u32 battler);
static void WallyHandleHealthBarUpdate(u32 battler);
static void WallyHandlePlaySE(u32 battler);
static void WallyHandleFaintingCry(u32 battler);
static void WallyHandleIntroTrainerBallThrow(u32 battler);
static void WallyHandleDrawPartyStatusSummary(u32 battler);
static void WallyHandleBattleAnimation(u32 battler);
static void WallyHandleEndLinkBattle(u32 battler);
static void WallyBufferRunCommand(u32 battler);
static void WallyBufferExecCompleted(u32 battler);
static void CompleteOnChosenItem(u32 battler);
static void Intro_WaitForShinyAnimAndHealthbox(u32 battler);
@ -72,16 +65,16 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_SUCCESSBALLTHROWANIM] = WallyHandleSuccessBallThrowAnim,
[CONTROLLER_BALLTHROWANIM] = WallyHandleBallThrowAnim,
[CONTROLLER_PAUSE] = BtlController_Empty,
[CONTROLLER_MOVEANIMATION] = WallyHandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = WallyHandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = WallyHandlePrintSelectionString,
[CONTROLLER_MOVEANIMATION] = BtlController_HandleMoveAnimation,
[CONTROLLER_PRINTSTRING] = BtlController_HandlePrintString,
[CONTROLLER_PRINTSTRINGPLAYERONLY] = BtlController_HandlePrintStringPlayerOnly,
[CONTROLLER_CHOOSEACTION] = WallyHandleChooseAction,
[CONTROLLER_YESNOBOX] = BtlController_Empty,
[CONTROLLER_CHOOSEMOVE] = WallyHandleChooseMove,
[CONTROLLER_OPENBAG] = WallyHandleChooseItem,
[CONTROLLER_CHOOSEPOKEMON] = BtlController_Empty,
[CONTROLLER_23] = BtlController_Empty,
[CONTROLLER_HEALTHBARUPDATE] = WallyHandleHealthBarUpdate,
[CONTROLLER_HEALTHBARUPDATE] = BtlController_HandleHealthBarUpdate,
[CONTROLLER_EXPUPDATE] = BtlController_Empty,
[CONTROLLER_STATUSICONUPDATE] = BtlController_Empty,
[CONTROLLER_STATUSANIMATION] = BtlController_Empty,
@ -96,7 +89,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_ONERETURNVALUE_DUPLICATE] = BtlController_Empty,
[CONTROLLER_HITANIMATION] = BtlController_HandleHitAnimation,
[CONTROLLER_CANTSWITCH] = BtlController_Empty,
[CONTROLLER_PLAYSE] = WallyHandlePlaySE,
[CONTROLLER_PLAYSE] = BtlController_HandlePlaySE,
[CONTROLLER_PLAYFANFAREORBGM] = BtlController_HandlePlayFanfareOrBGM,
[CONTROLLER_FAINTINGCRY] = WallyHandleFaintingCry,
[CONTROLLER_INTROSLIDE] = BtlController_HandleIntroSlide,
@ -105,7 +98,7 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(u32 battler) =
[CONTROLLER_HIDEPARTYSTATUSSUMMARY] = BtlController_Empty,
[CONTROLLER_ENDBOUNCE] = BtlController_Empty,
[CONTROLLER_SPRITEINVISIBILITY] = BtlController_Empty,
[CONTROLLER_BATTLEANIMATION] = WallyHandleBattleAnimation,
[CONTROLLER_BATTLEANIMATION] = BtlController_HandleBattleAnimation,
[CONTROLLER_LINKSTANDBYMSG] = BtlController_Empty,
[CONTROLLER_RESETACTIONMOVESELECTION] = BtlController_Empty,
[CONTROLLER_ENDLINKBATTLE] = WallyHandleEndLinkBattle,
@ -130,7 +123,7 @@ static void WallyBufferRunCommand(u32 battler)
if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sWallyBufferCommands))
sWallyBufferCommands[gBattleResources->bufferA[battler][0]](battler);
else
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -146,7 +139,7 @@ static void WallyHandleActions(u32 battler)
{
PlaySE(SE_SELECT);
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattleStruct->wallyBattleState++;
gBattleStruct->wallyMovesState = 0;
gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG;
@ -157,7 +150,7 @@ static void WallyHandleActions(u32 battler)
{
PlaySE(SE_SELECT);
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattleStruct->wallyBattleState++;
gBattleStruct->wallyMovesState = 0;
gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG;
@ -167,7 +160,7 @@ static void WallyHandleActions(u32 battler)
if (--gBattleStruct->wallyWaitFrames == 0)
{
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_WALLY_THROW, 0);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
gBattleStruct->wallyBattleState++;
gBattleStruct->wallyMovesState = 0;
gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG;
@ -188,7 +181,7 @@ static void WallyHandleActions(u32 battler)
{
PlaySE(SE_SELECT);
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
}
break;
}
@ -210,7 +203,7 @@ static void CompleteOnChosenItem(u32 battler)
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
BtlController_EmitOneReturnValue(battler, B_COMM_TO_ENGINE, gSpecialVar_ItemId);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
@ -268,11 +261,11 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler)
CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10);
HandleLowHpMusicChange(GetBattlerMon(battler), battler);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
}
}
static void WallyBufferExecCompleted(u32 battler)
void WallyBufferExecCompleted(u32 battler)
{
gBattlerControllerFuncs[battler] = WallyBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
@ -314,24 +307,6 @@ static void WallyHandleBallThrowAnim(u32 battler)
BtlController_HandleBallThrowAnim(battler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_BALL_THROW_WITH_TRAINER, FALSE);
}
static void WallyHandleMoveAnimation(u32 battler)
{
BtlController_HandleMoveAnimation(battler, FALSE);
}
static void WallyHandlePrintString(u32 battler)
{
BtlController_HandlePrintString(battler, FALSE, FALSE);
}
static void WallyHandlePrintSelectionString(u32 battler)
{
if (IsOnPlayerSide(battler))
WallyHandlePrintString(battler);
else
WallyBufferExecCompleted(battler);
}
static void HandleChooseActionAfterDma3(u32 battler)
{
if (!IsDma3ManagerBusyWithBgCopy())
@ -379,7 +354,7 @@ static void WallyHandleChooseMove(u32 battler)
{
PlaySE(SE_SELECT);
BtlController_EmitTwoReturnValues(battler, B_COMM_TO_ENGINE, B_ACTION_EXEC_SCRIPT, 0x100);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
}
break;
}
@ -392,18 +367,6 @@ static void WallyHandleChooseItem(u32 battler)
gBattlerInMenuId = battler;
}
static void WallyHandleHealthBarUpdate(u32 battler)
{
BtlController_HandleHealthBarUpdate(battler, TRUE);
}
// For some reason Wally's SE don't take side into account and pan is always the same. Possibly a bug
static void WallyHandlePlaySE(u32 battler)
{
PlaySE(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8));
WallyBufferExecCompleted(battler);
}
// All of the other controllers use CRY_MODE_FAINT.
// Wally's Pokémon during the tutorial is never intended to faint, so that's probably why it's different here.
static void WallyHandleFaintingCry(u32 battler)
@ -411,7 +374,7 @@ static void WallyHandleFaintingCry(u32 battler)
u16 species = GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES);
PlayCry_Normal(species, 25);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
}
static void WallyHandleIntroTrainerBallThrow(u32 battler)
@ -425,17 +388,12 @@ static void WallyHandleDrawPartyStatusSummary(u32 battler)
BtlController_HandleDrawPartyStatusSummary(battler, B_SIDE_PLAYER, FALSE);
}
static void WallyHandleBattleAnimation(u32 battler)
{
BtlController_HandleBattleAnimation(battler, TRUE, FALSE);
}
static void WallyHandleEndLinkBattle(u32 battler)
{
gBattleOutcome = gBattleResources->bufferA[battler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
WallyBufferExecCompleted(battler);
BtlController_Complete(battler);
if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK)
gBattlerControllerFuncs[battler] = SetBattleEndCallbacks;

View File

@ -620,6 +620,53 @@ bool32 IsValidForBattle(struct Pokemon *mon)
&& GetMonData(mon, MON_DATA_IS_EGG) == FALSE);
}
static inline bool32 IsControllerPlayer(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == PlayerBufferExecCompleted);
}
static inline bool32 IsControllerRecordedPlayer(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == RecordedPlayerBufferExecCompleted);
}
static inline bool32 IsControllerOpponent(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == OpponentBufferExecCompleted);
}
static inline bool32 IsControllerPlayerPartner(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == PlayerPartnerBufferExecCompleted);
}
static inline bool32 IsControllerWally(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == WallyBufferExecCompleted);
}
static inline bool32 IsControllerRecordedOpponent(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == RecordedOpponentBufferExecCompleted);
}
static inline bool32 IsControllerLinkOpponent(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == LinkOpponentBufferExecCompleted);
}
static inline bool32 IsControllerLinkPartner(u32 battler)
{
return (gBattlerControllerEndFuncs[battler] == LinkPartnerBufferExecCompleted);
}
bool32 ShouldUpdateTvData(u32 battler)
{
return (IsControllerPlayer(battler)
|| IsControllerLinkPartner(battler)
|| IsControllerLinkOpponent(battler));
}
static void SetBattlePartyIds(void)
{
s32 i, j;
@ -1589,7 +1636,7 @@ void BtlController_EmitDebugMenu(u32 battler, u32 bufferId)
// Standardized Controller functions
// Can be used for all the controllers.
void BattleControllerComplete(u32 battler)
void BtlController_Complete(u32 battler)
{
gBattlerControllerEndFuncs[battler](battler);
}
@ -2209,7 +2256,7 @@ static void Controller_ReturnMonToBall2(u32 battler)
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
{
FreeMonSprite(battler);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
@ -2243,7 +2290,7 @@ static void Controller_FaintPlayerMon(u32 battler)
FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
DestroySprite(&gSprites[spriteId]);
SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
@ -2252,7 +2299,7 @@ static void Controller_FaintOpponentMon(u32 battler)
if (!gSprites[gBattlerSpriteIds[battler]].inUse)
{
SetHealthboxSpriteInvisible(gHealthboxSpriteIds[battler]);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
@ -2300,7 +2347,7 @@ static void Controller_DoMoveAnimation(u32 battler)
CopyAllBattleSpritesInvisibilities();
TrySetBehindSubstituteSpriteBit(battler, gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8));
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
break;
}
@ -2314,7 +2361,7 @@ static void Controller_HandleTrainerSlideBack(u32 battler)
FreeTrainerFrontPicPalette(gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].oam.affineParam);
FreeSpriteOamMatrix(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]);
DestroySprite(&gSprites[gBattleStruct->trainerSlideSpriteIds[battler]]);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
@ -2331,38 +2378,38 @@ void Controller_WaitForHealthBar(u32 battler)
{
if (IsOnPlayerSide(battler))
HandleLowHpMusicChange(GetBattlerMon(battler), battler);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
static void Controller_WaitForBallThrow(u32 battler)
{
if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive)
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
static void Controller_WaitForBattleAnimation(u32 battler)
{
if (!gBattleSpritesDataPtr->healthBoxesData[battler].animFromTableActive)
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
static void Controller_WaitForStatusAnimation(u32 battler)
{
if (!gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive)
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
static void Controller_WaitForTrainerPic(u32 battler)
{
if (gSprites[gBattleStruct->trainerSlideSpriteIds[battler]].callback == SpriteCallbackDummy)
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void Controller_WaitForString(u32 battler)
{
if (!IsTextPrinterActive(B_WIN_MSG))
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
static void Controller_WaitForPartyStatusSummary(u32 battler)
@ -2370,7 +2417,7 @@ static void Controller_WaitForPartyStatusSummary(u32 battler)
if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer++ > 92)
{
gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusDelayTimer = 0;
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
@ -2383,7 +2430,7 @@ static void Controller_HitAnimation(u32 battler)
gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = FALSE;
gDoingBattleAnim = FALSE;
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
else
{
@ -2396,7 +2443,7 @@ static void Controller_HitAnimation(u32 battler)
// Used for all the commands which do nothing.
void BtlController_Empty(u32 battler)
{
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
// Dummy function at the end of the table.
@ -2432,7 +2479,7 @@ void BtlController_HandleGetMonData(u32 battler)
}
}
BtlController_EmitDataTransfer(battler, B_COMM_TO_ENGINE, size, monData);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleGetRawMonData(u32 battler)
@ -2448,7 +2495,7 @@ void BtlController_HandleGetRawMonData(u32 battler)
dst[i] = src[i];
BtlController_EmitDataTransfer(battler, B_COMM_TO_ENGINE, gBattleResources->bufferA[battler][2], dst);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleSetMonData(u32 battler)
@ -2470,7 +2517,7 @@ void BtlController_HandleSetMonData(u32 battler)
monToCheck >>= 1;
}
}
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleSetRawMonData(u32 battler)
@ -2481,10 +2528,10 @@ void BtlController_HandleSetRawMonData(u32 battler)
for (i = 0; i < gBattleResources->bufferA[battler][2]; i++)
dst[i] = gBattleResources->bufferA[battler][3 + i];
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u32 battler))
void BtlController_HandleLoadMonSprite(u32 battler)
{
struct Pokemon *mon = GetBattlerMon(battler);
u16 species = GetMonData(mon, MON_DATA_SPECIES);
@ -2505,18 +2552,38 @@ void BtlController_HandleLoadMonSprite(u32 battler, void (*controllerCallback)(u
SetBattlerShadowSpriteCallback(battler, species);
gBattlerControllerFuncs[battler] = controllerCallback;
if (IsControllerOpponent(battler)
&& IsControllerLinkOpponent(battler)
&& IsControllerRecordedOpponent(battler))
gBattlerControllerFuncs[battler] = TryShinyAnimAfterMonAnim;
else
gBattlerControllerFuncs[battler] = WaitForMonAnimAfterLoad;
}
void BtlController_HandleSwitchInAnim(u32 battler, bool32 isPlayerSide, void (*controllerCallback)(u32 battler))
void BtlController_HandleSwitchInAnim(u32 battler)
{
bool32 isPlayerSide = (IsControllerPlayer(battler)
|| IsControllerPlayerPartner(battler)
|| IsControllerRecordedPlayer(battler)
|| IsControllerLinkPartner(battler));
if (IsControllerPlayer(battler))
{
gActionSelectionCursor[battler] = 0;
gMoveSelectionCursor[battler] = 0;
}
else if (IsControllerOpponent(battler))
{
gBattleStruct->monToSwitchIntoId[battler] = PARTY_SIZE;
}
if (isPlayerSide)
ClearTemporarySpeciesSpriteData(battler, gBattleResources->bufferA[battler][2], gBattleResources->bufferA[battler][3]);
gBattlerPartyIndexes[battler] = gBattleResources->bufferA[battler][1];
if (isPlayerSide)
BattleLoadMonSpriteGfx(GetBattlerMon(battler), battler);
StartSendOutAnim(battler, gBattleResources->bufferA[battler][2], gBattleResources->bufferA[battler][3], FALSE);
gBattlerControllerFuncs[battler] = controllerCallback;
gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInTryShinyAnim;
}
void BtlController_HandleReturnMonToBall(u32 battler)
@ -2529,7 +2596,7 @@ void BtlController_HandleReturnMonToBall(u32 battler)
else
{
FreeMonSprite(battler);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
}
@ -2712,7 +2779,7 @@ void BtlController_HandleBallThrowAnim(u32 battler, u32 target, u32 animId, bool
HandleBallThrow(battler, target, animId, allowCriticalCapture);
}
void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData)
void BtlController_HandleMoveAnimation(u32 battler)
{
if (!IsBattleSEPlaying(battler))
{
@ -2728,12 +2795,12 @@ void BtlController_HandleMoveAnimation(u32 battler, bool32 updateTvData)
gTransformedShininess[battler] = gAnimDisableStructPtr->transformedMonShininess;
gBattleSpritesDataPtr->healthBoxesData[battler].animationState = 0;
gBattlerControllerFuncs[battler] = Controller_DoMoveAnimation;
if (updateTvData)
if (ShouldUpdateTvData(battler))
BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr);
}
}
void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 arenaPtsDeduct)
void BtlController_HandlePrintString(u32 battler)
{
u16 *stringId;
@ -2747,20 +2814,29 @@ void BtlController_HandlePrintString(u32 battler, bool32 updateTvData, bool32 ar
TestRunner_Battle_RecordMessage(gDisplayedStringBattle);
if (gTestRunnerHeadless)
{
BattleControllerComplete(battler);
BtlController_Complete(battler);
return;
}
}
BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MSG);
gBattlerControllerFuncs[battler] = Controller_WaitForString;
if (updateTvData)
if (ShouldUpdateTvData(battler))
BattleTv_SetDataBasedOnString(*stringId);
if (arenaPtsDeduct)
if (IsControllerPlayer(battler)
|| IsControllerOpponent(battler))
BattleArena_DeductSkillPoints(battler, *stringId);
}
void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText)
void BtlController_HandlePrintStringPlayerOnly(u32 battler)
{
if (IsOnPlayerSide(battler))
BtlController_HandlePrintString(battler);
else
BtlController_Complete(battler);
}
void BtlController_HandleHealthBarUpdate(u32 battler)
{
s32 maxHP, curHP;
s16 hpVal;
@ -2779,7 +2855,9 @@ void BtlController_HandleHealthBarUpdate(u32 battler, bool32 updateHpText)
else
{
SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], maxHP, 0, hpVal);
if (updateHpText)
if (IsControllerPlayer(battler)
|| IsControllerRecordedPlayer(battler)
|| IsControllerWally(battler))
UpdateHpTextInHealthbox(gHealthboxSpriteIds[battler], HP_CURRENT, 0, maxHP);
TestRunner_Battle_RecordHP(battler, curHP, 0);
}
@ -2818,7 +2896,7 @@ void BtlController_HandleHitAnimation(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].invisible == TRUE)
{
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
else
{
@ -2834,7 +2912,7 @@ void BtlController_HandlePlaySE(u32 battler)
s32 pan = IsOnPlayerSide(battler) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET;
PlaySE12WithPanning(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8), pan);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandlePlayFanfareOrBGM(u32 battler)
@ -2849,7 +2927,7 @@ void BtlController_HandlePlayFanfareOrBGM(u32 battler)
PlayFanfare(gBattleResources->bufferA[battler][1] | (gBattleResources->bufferA[battler][2] << 8));
}
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleFaintingCry(u32 battler)
@ -2869,14 +2947,14 @@ void BtlController_HandleFaintingCry(u32 battler)
}
PlayCry_ByMode(GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), pan, CRY_MODE_FAINT);
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleIntroSlide(u32 battler)
{
HandleIntroSlide(gBattleResources->bufferA[battler][1]);
gIntroSlideFlags |= 1;
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleSpriteInvisibility(u32 battler)
@ -2886,7 +2964,7 @@ void BtlController_HandleSpriteInvisibility(u32 battler)
gSprites[gBattlerSpriteIds[battler]].invisible = gBattleResources->bufferA[battler][1];
CopyBattleSpriteInvisibility(battler);
}
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
bool32 TwoPlayerIntroMons(u32 battler) // Double battle with both player pokemon active.
@ -3044,7 +3122,7 @@ void BtlController_HandleDrawPartyStatusSummary(u32 battler, u32 side, bool32 co
{
if (gBattleResources->bufferA[battler][1] != 0 && IsOnPlayerSide(battler))
{
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
else
{
@ -3078,12 +3156,13 @@ void BtlController_HandleHidePartyStatusSummary(u32 battler)
{
if (gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[battler]].func = Task_HidePartyStatusSummary;
BattleControllerComplete(battler);
BtlController_Complete(battler);
}
void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 updateTvData)
void BtlController_HandleBattleAnimation(u32 battler)
{
if (ignoreSE || !IsBattleSEPlaying(battler))
if ((gBattleTypeFlags & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_WALLY_TUTORIAL))
|| !IsBattleSEPlaying(battler))
{
u8 animationId = gBattleResources->bufferA[battler][1];
u16 argument = gBattleResources->bufferA[battler][2] | (gBattleResources->bufferA[battler][3] << 8);
@ -3091,11 +3170,11 @@ void BtlController_HandleBattleAnimation(u32 battler, bool32 ignoreSE, bool32 up
gAnimDisableStructPtr = (struct DisableStruct *)&gBattleResources->bufferA[battler][4];
if (TryHandleLaunchBattleTableAnimation(battler, battler, battler, animationId, argument))
BattleControllerComplete(battler);
BtlController_Complete(battler);
else
gBattlerControllerFuncs[battler] = Controller_WaitForBattleAnimation;
if (updateTvData)
if (ShouldUpdateTvData(battler))
BattleTv_SetDataBasedOnAnimation(animationId);
}
}
@ -3153,107 +3232,157 @@ void TrySetBattlerShadowSpriteCallback(u32 battler)
SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES));
}
bool32 TryShinyAnimAfterMonAnimUtil(u32 battler)
void TryShinyAnimAfterMonAnim(u32 battler)
{
if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy
|| gSprites[gBattlerSpriteIds[battler]].x2 != 0)
return FALSE;
if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim)
if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy
&& gSprites[gBattlerSpriteIds[battler]].x2 == 0)
{
TryShinyAnimation(battler, GetBattlerMon(battler));
return FALSE;
if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim)
{
TryShinyAnimation(battler, GetBattlerMon(battler));
}
else if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim)
{
gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);
FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);
BtlController_Complete(battler);
}
}
if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim)
return FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);
FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);
return TRUE;
}
bool32 SwitchIn_ShowSubstituteUtil(u32 battler)
void WaitForMonAnimAfterLoad(u32 battler)
{
if (gSprites[gHealthboxSpriteIds[battler]].callback != SpriteCallbackDummy)
return FALSE;
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
CopyBattleSpriteInvisibility(battler);
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE);
return TRUE;
if (gSprites[gBattlerSpriteIds[battler]].animEnded && gSprites[gBattlerSpriteIds[battler]].x2 == 0)
BtlController_Complete(battler);
}
bool32 SwitchIn_WaitAndEndUtil(u32 battler)
void BtlController_HandleSwitchInShowSubstitute(u32 battler)
{
return !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive
&& gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy;
if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy)
{
if (IsOnPlayerSide(battler))
CopyBattleSpriteInvisibility(battler);
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE);
if (IsControllerOpponent(battler)
&& IsControllerLinkOpponent(battler)
&& IsControllerRecordedOpponent(battler))
gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInSoundAndEnd;
else
gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInWaitAndEnd;
}
}
bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler)
void BtlController_HandleSwitchInWaitAndEnd(u32 battler)
{
if (gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive || IsCryPlayingOrClearCrySongs())
return FALSE;
if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy
&& gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy_2
&& GetBattlerSide(battler) == B_SIDE_OPPONENT)
return FALSE;
m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);
return TRUE;
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive
&& gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)
BtlController_Complete(battler);
}
bool32 SwitchIn_ShowHealthboxUtil(u32 battler)
void BtlController_Intro_DelayAndEnd(u32 battler)
{
if (--gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay == (u8)-1)
{
gBattleSpritesDataPtr->healthBoxesData[battler].introEndDelay = 0;
BtlController_Complete(battler);
}
}
void BtlController_HandleSwitchInSoundAndEnd(u32 battler)
{
if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive && !IsCryPlayingOrClearCrySongs())
{
if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy
|| gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy_2
|| IsOnPlayerSide(battler))
{
m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100);
if (IsControllerPlayer(battler))
HandleLowHpMusicChange(GetBattlerMon(battler), battler);
BtlController_Complete(battler);
}
}
}
void BtlController_HandleSwitchInShowHealthbox(u32 battler)
{
u32 side = GetBattlerSide(battler);
if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim
|| (side == B_SIDE_OPPONENT && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy))
return FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);
FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);
if (side == B_SIDE_PLAYER)
if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim
&& (side == B_SIDE_PLAYER || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy))
{
CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10);
HandleLowHpMusicChange(GetBattlerMon(battler), battler);
gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);
FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);
if (side == B_SIDE_PLAYER)
{
CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10);
HandleLowHpMusicChange(GetBattlerMon(battler), battler);
}
StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0);
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL);
StartHealthboxSlideIn(battler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]);
if (side == B_SIDE_OPPONENT)
CopyBattleSpriteInvisibility(battler);
gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInShowSubstitute;
}
StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0);
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL);
StartHealthboxSlideIn(battler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]);
if (side == B_SIDE_OPPONENT)
CopyBattleSpriteInvisibility(battler);
return TRUE;
}
bool32 SwitchIn_TryShinyAnimUtil(u32 battler)
static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler)
{
if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy
&& gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim
&& gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy)
{
CopyBattleSpriteInvisibility(battler);
// Reset shiny anim (even if it didn't occur)
gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE;
FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS);
FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS);
// Check if Substitute should be shown
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE);
gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInSoundAndEnd;
}
}
void BtlController_HandleSwitchInTryShinyAnim(u32 battler)
{
if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive
&& !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim)
TryShinyAnimation(battler, GetBattlerMon(battler));
if (gSprites[gBattleControllerData[battler]].callback != SpriteCallbackDummy
|| gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive)
return FALSE;
if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy
&& !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive)
{
DestroySprite(&gSprites[gBattleControllerData[battler]]);
DestroySprite(&gSprites[gBattleControllerData[battler]]);
if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES));
if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES));
return TRUE;
if (IsControllerPlayer(battler))
{
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL);
StartHealthboxSlideIn(battler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]);
gBattlerControllerFuncs[battler] = SwitchIn_CleanShinyAnimShowSubstitute;
}
else
{
gBattlerControllerFuncs[battler] = BtlController_HandleSwitchInShowHealthbox;
}
}
}