Added battle slide-in animation for Pokemon follower.

This commit is contained in:
Ariel A 2022-08-06 02:25:28 -04:00
parent 1991f65954
commit 7edb7bbc23
6 changed files with 91 additions and 8 deletions

View file

@ -61,6 +61,7 @@ void SpriteCB_FaintSlideAnim(struct Sprite *sprite);
void DoBounceEffect(u8 battlerId, u8 b, s8 c, s8 d);
void EndBounceEffect(u8 battlerId, bool8 b);
void SpriteCB_PlayerMonFromBall(struct Sprite *sprite);
void SpriteCB_PlayerMonSlideIn(struct Sprite *sprite);
void SpriteCB_TrainerThrowObject(struct Sprite *sprite);
void AnimSetCenterToCornerVecX(struct Sprite *sprite);
void BeginBattleIntroDummy(void);

View file

@ -32,6 +32,7 @@ extern const struct SpriteTemplate gBallSpriteTemplates[];
#define POKEBALL_PLAYER_SENDOUT 0xFF
#define POKEBALL_OPPONENT_SENDOUT 0xFE
#define POKEBALL_PLAYER_SLIDEIN 0xFD
u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow);
void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes, u16 species);

View file

@ -10,6 +10,7 @@
#include "battle_tv.h"
#include "bg.h"
#include "data.h"
#include "event_object_movement.h"
#include "item.h"
#include "item_menu.h"
#include "link.h"
@ -114,7 +115,7 @@ static void Task_UpdateLvlInHealthbox(u8);
static void PrintLinkStandbyMsg(void);
static u32 CopyPlayerMonData(u8, u8 *);
static void SetPlayerMonData(u8);
static void StartSendOutAnim(u8, bool8);
static void StartSendOutAnim(u8, bool8, bool8);
static void DoSwitchOutAnimation(void);
static void PlayerDoMoveAnimation(void);
static void Task_StartSendOutAnim(u8);
@ -2189,11 +2190,29 @@ static void PlayerHandleSwitchInAnim(void)
BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
gActionSelectionCursor[gActiveBattler] = 0;
gMoveSelectionCursor[gActiveBattler] = 0;
StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]);
#ifdef BATTLE_ENGINE
StartSendOutAnim(gActiveBattler, gBattleResources->bufferA[gActiveBattler][2], FALSE);
#else
StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2], FALSE);
#endif
gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnimShowHealthbox;
}
static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit)
// In normal singles, if follower pokemon is out, have it slide in instead of being thrown
static bool8 ShouldDoSlideInAnim(void) {
struct ObjectEvent *followerObj = GetFollowerObject();
if (!followerObj || followerObj->invisible)
return FALSE;
if (gBattleTypeFlags & (
BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_FIRST_BATTLE |
BATTLE_TYPE_SAFARI | BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TWO_OPPONENTS |
BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_RECORDED | BATTLE_TYPE_TRAINER_HILL)
)
return FALSE;
return TRUE;
}
static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit, bool8 doSlideIn)
{
u16 species;
@ -2221,7 +2240,7 @@ static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit)
gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy;
gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT);
gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, doSlideIn ? POKEBALL_PLAYER_SLIDEIN : POKEBALL_PLAYER_SENDOUT);
}
static void PlayerHandleReturnMonToBall(void)
@ -2957,7 +2976,7 @@ static void PlayerHandleIntroTrainerBallThrow(void)
gSprites[gBattlerSpriteIds[gActiveBattler]].sBattlerId = gActiveBattler;
StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite);
StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1);
StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], ShouldDoSlideInAnim() ? 2 : 1);
paletteNum = AllocSpritePalette(0xD6F8);
LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, 0x100 + paletteNum * 16, 32);
@ -3004,16 +3023,16 @@ static void Task_StartSendOutAnim(u8 taskId)
if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
StartSendOutAnim(gActiveBattler, FALSE);
StartSendOutAnim(gActiveBattler, FALSE, ShouldDoSlideInAnim());
}
else
{
gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
StartSendOutAnim(gActiveBattler, FALSE);
StartSendOutAnim(gActiveBattler, FALSE, ShouldDoSlideInAnim());
gActiveBattler ^= BIT_FLANK;
gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler];
BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
StartSendOutAnim(gActiveBattler, FALSE);
StartSendOutAnim(gActiveBattler, FALSE, ShouldDoSlideInAnim());
gActiveBattler ^= BIT_FLANK;
}
gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox;

View file

@ -2978,6 +2978,29 @@ void SpriteCB_PlayerMonFromBall(struct Sprite *sprite)
BattleAnimateBackSprite(sprite, sprite->sSpeciesId);
}
void SpriteCB_PlayerMonSlideIn(struct Sprite *sprite) {
if (sprite->data[3] == 0) {
PlaySE(SE_BALL_TRAY_ENTER);
sprite->data[3]++;
} else if (sprite->data[3] == 1) {
if (sprite->animEnded)
return;
sprite->data[4] = sprite->x;
sprite->x = -33;
sprite->invisible = FALSE;
sprite->data[3]++;
} else if (sprite->data[3] < 27) {
sprite->x += 4;
sprite->data[3]++;
} else {
sprite->data[3] = 0;
sprite->x = sprite->data[4];
sprite->data[4] = 0;
sprite->callback = SpriteCB_PlayerMonFromBall;
PlayCry_ByMode(sprite->sSpeciesId, -25, CRY_MODE_NORMAL);
}
}
static void SpriteCB_TrainerThrowObject_Main(struct Sprite *sprite)
{
AnimSetCenterToCornerVecX(sprite);

View file

@ -18,6 +18,16 @@ static const union AnimCmd sAnimCmd_May_Steven_1[] =
ANIMCMD_END,
};
static const union AnimCmd sAnimCmd_Point_HGSS[] =
{
ANIMCMD_FRAME(3, 9),
ANIMCMD_FRAME(0, 9),
ANIMCMD_FRAME(2, 24),
ANIMCMD_FRAME(2, 24),
ANIMCMD_FRAME(3, 50),
ANIMCMD_END,
};
static const union AnimCmd sAnimCmd_Wally_1[] =
{
ANIMCMD_FRAME(0, 24),
@ -48,6 +58,16 @@ static const union AnimCmd sAnimCmd_Leaf_1[] =
ANIMCMD_END,
};
static const union AnimCmd sAnimCmd_Point_HGSS_Red_Leaf[] =
{
ANIMCMD_FRAME(0, 9),
ANIMCMD_FRAME(1, 9),
ANIMCMD_FRAME(3, 24),
ANIMCMD_FRAME(3, 24),
ANIMCMD_FRAME(0, 50),
ANIMCMD_END,
};
static const union AnimCmd sAnimCmd_RubySapphireBrendan_1[] =
{
ANIMCMD_FRAME(0, 24),
@ -72,48 +92,56 @@ static const union AnimCmd *const sBackAnims_Brendan[] =
{
sAnim_GeneralFrame3,
sAnimCmd_Brendan_1,
sAnimCmd_Point_HGSS,
};
static const union AnimCmd *const sBackAnims_May[] =
{
sAnim_GeneralFrame3,
sAnimCmd_May_Steven_1,
sAnimCmd_Point_HGSS,
};
static const union AnimCmd *const sBackAnims_Red[] =
{
sAnim_GeneralFrame0,
sAnimCmd_Red_1,
sAnimCmd_Point_HGSS_Red_Leaf,
};
static const union AnimCmd *const sBackAnims_Leaf[] =
{
sAnim_GeneralFrame0,
sAnimCmd_Leaf_1,
sAnimCmd_Point_HGSS_Red_Leaf,
};
static const union AnimCmd *const sBackAnims_RubySapphireBrendan[] =
{
sAnim_GeneralFrame3,
sAnimCmd_RubySapphireBrendan_1,
sAnimCmd_Point_HGSS,
};
static const union AnimCmd *const sBackAnims_RubySapphireMay[] =
{
sAnim_GeneralFrame3,
sAnimCmd_RubySapphireMay_1,
sAnimCmd_Point_HGSS,
};
static const union AnimCmd *const sBackAnims_Wally[] =
{
sAnim_GeneralFrame3,
sAnimCmd_Wally_1,
sAnimCmd_Point_HGSS,
};
static const union AnimCmd *const sBackAnims_Steven[] =
{
sAnim_GeneralFrame3,
sAnimCmd_May_Steven_1,
sAnimCmd_Point_HGSS,
};
const union AnimCmd *const *const gTrainerBackAnimsPtrTable[] =

View file

@ -380,6 +380,11 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
switch (throwCaseId)
{
case POKEBALL_PLAYER_SLIDEIN: // don't actually send out, trigger the slide-in animation
gBattlerTarget = battlerId;
gSprites[ballSpriteId].callback = HandleBallAnimEnd;
gSprites[ballSpriteId].invisible = TRUE;
break;
case POKEBALL_PLAYER_SENDOUT:
gBattlerTarget = battlerId;
gSprites[ballSpriteId].x = 24;
@ -845,6 +850,12 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
bool8 affineAnimEnded = FALSE;
u8 battlerId = sprite->sBattler;
if (sprite->data[7] == POKEBALL_PLAYER_SLIDEIN) {
gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCB_PlayerMonSlideIn;
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000;
}
gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;
if (sprite->animEnded)
sprite->invisible = TRUE;