Synced src/pokeball.c

This commit is contained in:
Eduardo Quezada 2022-07-29 21:39:25 -04:00
parent c40791fd4e
commit dcb9d9de1e
32 changed files with 575 additions and 495 deletions

File diff suppressed because it is too large Load Diff

View File

@ -55,6 +55,12 @@
#define MAX_TRAINER_ITEMS 4
enum {
BATTLER_AFFINE_NORMAL,
BATTLER_AFFINE_EMERGE,
BATTLER_AFFINE_RETURN,
};
#define MOVE_TARGET_SELECTED 0
#define MOVE_TARGET_DEPENDS (1 << 0)
#define MOVE_TARGET_USER_OR_SELECTED (1 << 1)
@ -545,15 +551,15 @@ struct BattleAnimationInfo
u8 field_6;
u8 field_7;
u8 ballThrowCaseId;
u8 healthboxSlideInStarted : 1;
u8 field_9_x2 : 1;
u8 field_9_x1C : 3;
u8 field_9_x20 : 1;
u8 field_9_x40 : 1;
u8 field_9_x80 : 1;
u8 field_A;
u8 introAnimActive:1;
u8 wildMonInvisible:1;
u8 field_9_x1C:3;
u8 field_9_x20:1;
u8 field_9_x40:1;
u8 field_9_x80:1;
u8 numBallParticles;
u8 field_B;
s16 field_C;
s16 ballSubpx;
u8 field_E;
u8 field_F;
};

View File

@ -317,7 +317,7 @@ void AnimRecycle(struct Sprite *);
// battle_anim_special.c
void TryShinyAnimation(u8 battler, struct Pokemon *mon);
u8 ItemIdToBallId(u16 itemId);
u8 LaunchBallStarsTask(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId);
u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId);
u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId);
void DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId);
void DoFreeHealthboxPalsForLevelUp(u8 batterId);

View File

@ -40,6 +40,6 @@ void BattleInterfaceSetWindowPals(void);
void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute);
void AllocateMonSpritesGfx(void);
void FreeMonSpritesGfx(void);
bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon);
bool32 ShouldPlayNormalMonCry(struct Pokemon *mon);
#endif // GUARD_BATTLE_GFX_SFX_UTIL_H

View File

@ -312,7 +312,7 @@
#define NUM_CASTFORM_FORMS 4
#define CASTFORM_SUBSTITUTE (1 << 7)
// Return value for IsRunningFromBattleImpossible.
// Return value for IsRunningFromBattleImpossible.
#define BATTLE_RUN_SUCCESS 0
#define BATTLE_RUN_FORBIDDEN 1
#define BATTLE_RUN_FAILURE 2

View File

@ -3,30 +3,30 @@
#include "global.h"
extern const u32 gInterfaceGfx_PokeBall[];
extern const u32 gInterfacePal_PokeBall[];
extern const u32 gInterfaceGfx_GreatBall[];
extern const u32 gInterfacePal_GreatBall[];
extern const u32 gInterfaceGfx_SafariBall[];
extern const u32 gInterfacePal_SafariBall[];
extern const u32 gInterfaceGfx_UltraBall[];
extern const u32 gInterfacePal_UltraBall[];
extern const u32 gInterfaceGfx_MasterBall[];
extern const u32 gInterfacePal_MasterBall[];
extern const u32 gInterfaceGfx_NetBall[];
extern const u32 gInterfacePal_NetBall[];
extern const u32 gInterfaceGfx_DiveBall[];
extern const u32 gInterfacePal_DiveBall[];
extern const u32 gInterfaceGfx_NestBall[];
extern const u32 gInterfacePal_NestBall[];
extern const u32 gInterfaceGfx_RepeatBall[];
extern const u32 gInterfacePal_RepeatBall[];
extern const u32 gInterfaceGfx_TimerBall[];
extern const u32 gInterfacePal_TimerBall[];
extern const u32 gInterfaceGfx_LuxuryBall[];
extern const u32 gInterfacePal_LuxuryBall[];
extern const u32 gInterfaceGfx_PremierBall[];
extern const u32 gInterfacePal_PremierBall[];
extern const u32 gBallGfx_Poke[];
extern const u32 gBallPal_Poke[];
extern const u32 gBallGfx_Great[];
extern const u32 gBallPal_Great[];
extern const u32 gBallGfx_Safari[];
extern const u32 gBallPal_Safari[];
extern const u32 gBallGfx_Ultra[];
extern const u32 gBallPal_Ultra[];
extern const u32 gBallGfx_Master[];
extern const u32 gBallPal_Master[];
extern const u32 gBallGfx_Net[];
extern const u32 gBallPal_Net[];
extern const u32 gBallGfx_Dive[];
extern const u32 gBallPal_Dive[];
extern const u32 gBallGfx_Nest[];
extern const u32 gBallPal_Nest[];
extern const u32 gBallGfx_Repeat[];
extern const u32 gBallPal_Repeat[];
extern const u32 gBallGfx_Timer[];
extern const u32 gBallPal_Timer[];
extern const u32 gBallGfx_Luxury[];
extern const u32 gBallPal_Luxury[];
extern const u32 gBallGfx_Premier[];
extern const u32 gBallPal_Premier[];
extern const u32 gOpenPokeballGfx[];
// pokemon gfx

View File

@ -324,7 +324,7 @@ struct STWIStatus
vu8 sending;
};
// This struct is used as u8 array in SDK.
// This struct is used as u8 array in SDK.
struct RfuIntrStruct
{
union RfuPacket rxPacketAlloc;

View File

@ -20,6 +20,14 @@ enum
POKEBALL_COUNT
};
enum {
BALL_AFFINE_ANIM_0,
BALL_ROTATE_RIGHT,
BALL_ROTATE_LEFT,
BALL_AFFINE_ANIM_3,
BALL_AFFINE_ANIM_4
};
extern const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT];
extern const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT];
extern const struct SpriteTemplate gBallSpriteTemplates[];
@ -34,6 +42,6 @@ void DoHitAnimHealthboxEffect(u8 bank);
void LoadBallGfx(u8 ballId);
void FreeBallGfx(u8 ballId);
void StartHealthboxSlideIn(u8 battler);
void DestroySpriteAndFreeResources2(struct Sprite *sprite);
void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite);
#endif // GUARD_POKEBALL_H

View File

@ -659,7 +659,7 @@ void AnimTask_SwitchOutBallEffect(u8 taskId)
y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
priority = gSprites[spriteId].oam.priority;
subpriority = gSprites[spriteId].subpriority;
gTasks[taskId].data[10] = LaunchBallStarsTask(x, y + 32, priority, subpriority, ballId);
gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballId);
selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0);
gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId);
gTasks[taskId].data[0]++;
@ -748,7 +748,7 @@ void AnimTask_ThrowBall(u8 taskId)
gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16;
gSprites[spriteId].callback = SpriteCB_ThrowBall_Init;
gBattleSpritesDataPtr->animationData->field_9_x2 = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible;
gBattleSpritesDataPtr->animationData->wildMonInvisible = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible;
gTasks[taskId].data[0] = spriteId;
gTasks[taskId].func = AnimTask_ThrowBall_WaitAnimObjComplete;
}
@ -860,7 +860,7 @@ static void SpriteCB_ThrowBall_ArcFlight(struct Sprite *sprite)
switch (ballId)
{
case 0 ... POKEBALL_COUNT - 1:
LaunchBallStarsTask(sprite->x, sprite->y - 5, 1, 28, ballId);
AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);
LaunchBallFadeMonTask(0, gBattleAnimTarget, 14, ballId);
break;
}
@ -1015,7 +1015,7 @@ static void SpriteCB_ThrowBall_InitShake(struct Sprite *sprite)
sprite->data[3] = 0;
sprite->affineAnimPaused = TRUE;
StartSpriteAffineAnim(sprite, 1);
gBattleSpritesDataPtr->animationData->field_C = 0;
gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->callback = SpriteCB_ThrowBall_DoShake;
PlaySE(SE_BALL);
}
@ -1029,14 +1029,14 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
switch (sprite->data[3] & 0xFF)
{
case 0:
if (gBattleSpritesDataPtr->animationData->field_C > 0xFF)
if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)
{
sprite->x2 += sprite->data[4];
gBattleSpritesDataPtr->animationData->field_C &= 0xFF;
gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;
}
else
{
gBattleSpritesDataPtr->animationData->field_C += 0xB0;
gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;
}
sprite->data[5]++;
@ -1044,7 +1044,7 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
var0 = sprite->data[5] + 7;
if (var0 > 14)
{
gBattleSpritesDataPtr->animationData->field_C = 0;
gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->data[3]++;
sprite->data[5] = 0;
}
@ -1067,14 +1067,14 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
}
break;
case 2:
if (gBattleSpritesDataPtr->animationData->field_C > 0xFF)
if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)
{
sprite->x2 += sprite->data[4];
gBattleSpritesDataPtr->animationData->field_C &= 0xFF;
gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;
}
else
{
gBattleSpritesDataPtr->animationData->field_C += 0xB0;
gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;
}
sprite->data[5]++;
@ -1082,7 +1082,7 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
var0 = sprite->data[5] + 12;
if (var0 > 24)
{
gBattleSpritesDataPtr->animationData->field_C = 0;
gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->data[3]++;
sprite->data[5] = 0;
}
@ -1104,14 +1104,14 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
ChangeSpriteAffineAnim(sprite, 1);
// fall through
case 4:
if (gBattleSpritesDataPtr->animationData->field_C > 0xFF)
if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)
{
sprite->x2 += sprite->data[4];
gBattleSpritesDataPtr->animationData->field_C &= 0xFF;
gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;
}
else
{
gBattleSpritesDataPtr->animationData->field_C += 0xB0;
gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;
}
sprite->data[5]++;
@ -1119,7 +1119,7 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
var0 = sprite->data[5] + 4;
if (var0 > 8)
{
gBattleSpritesDataPtr->animationData->field_C = 0;
gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->data[3]++;
sprite->data[5] = 0;
sprite->data[4] = -sprite->data[4];
@ -1319,7 +1319,7 @@ static void SpriteCB_ThrowBall_BeginBreakOut(struct Sprite *sprite)
switch (ballId)
{
case 0 ... POKEBALL_COUNT - 1:
LaunchBallStarsTask(sprite->x, sprite->y - 5, 1, 28, ballId);
AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);
LaunchBallFadeMonTask(1, gBattleAnimTarget, 14, ballId);
break;
}
@ -1351,7 +1351,7 @@ static void SpriteCB_ThrowBall_RunBreakOut(struct Sprite *sprite)
if (sprite->animEnded && next)
{
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].y2 = 0;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = gBattleSpritesDataPtr->animationData->field_9_x2;
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = gBattleSpritesDataPtr->animationData->wildMonInvisible;
sprite->data[0] = 0;
sprite->callback = BattleAnimObj_SignalEnd;
gDoingBattleAnim = FALSE;
@ -1430,7 +1430,7 @@ static void LoadBallParticleGfx(u8 ballId)
}
}
u8 LaunchBallStarsTask(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId)
u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId)
{
u8 taskId;
@ -1448,7 +1448,7 @@ u8 LaunchBallStarsTask(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId)
static void IncrementBattleParticleCounter(void)
{
if (gMain.inBattle)
gBattleSpritesDataPtr->animationData->field_A++;
gBattleSpritesDataPtr->animationData->numBallParticles++;
}
static void PokeBallOpenParticleAnimation(u8 taskId)
@ -1850,8 +1850,8 @@ static void DestroyBallOpenAnimationParticle(struct Sprite *sprite)
}
else
{
gBattleSpritesDataPtr->animationData->field_A--;
if (gBattleSpritesDataPtr->animationData->field_A == 0)
gBattleSpritesDataPtr->animationData->numBallParticles--;
if (gBattleSpritesDataPtr->animationData->numBallParticles == 0)
{
for (j = 0; j < POKEBALL_COUNT; j++)
{
@ -2097,7 +2097,7 @@ static void AnimTask_ShinySparkles(u8 taskId)
return;
}
if (gBattleSpritesDataPtr->animationData->field_A)
if (gBattleSpritesDataPtr->animationData->numBallParticles)
return;
counter = gTasks[taskId].data[10]++;

View File

@ -271,7 +271,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0;
gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
}
}
@ -1538,7 +1538,7 @@ static void LinkOpponentHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1;
gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDummy;
}

View File

@ -236,7 +236,7 @@ static void Intro_ShowHealthbox(void)
HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0;
gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForHealthbox;
}
}
@ -1464,7 +1464,7 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1;
gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDummy;
}

View File

@ -427,7 +427,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0;
gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
}
}
@ -2093,7 +2093,7 @@ static void OakOldManHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1;
gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = PlayerDummy;
}
else

View File

@ -265,7 +265,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = FALSE;
gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
}
}
@ -1638,7 +1638,7 @@ static void OpponentHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = TRUE;
gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = OpponentDummy;
}

View File

@ -931,7 +931,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0;
gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
}
}
@ -2719,7 +2719,7 @@ static void PlayerHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1;
gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = PlayerDummy;
}
@ -2912,8 +2912,8 @@ static void PreviewDeterminativeMoveTargets(void)
break;
case MOVE_TARGET_BOTH:
case MOVE_TARGET_OPPONENTS_FIELD:
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]
| gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16;
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]
| gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16;
startY = 8;
break;
case MOVE_TARGET_USER:
@ -2935,8 +2935,8 @@ static void PreviewDeterminativeMoveTargets(void)
case MOVE_MIST:
case MOVE_HEAL_BELL:
case MOVE_AROMATHERAPY:
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]
| gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]) << 16;
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]
| gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]) << 16;
break;
case MOVE_HELPING_HAND:
bitMask = (gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) << 16;
@ -2948,8 +2948,8 @@ static void PreviewDeterminativeMoveTargets(void)
startY = 8;
break;
case MOVE_TARGET_FOES_AND_ALLY:
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]
| gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]
| gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]
| gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16;
startY = 8;
break;

View File

@ -408,7 +408,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0;
gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
}
}
@ -1865,7 +1865,7 @@ static void PokedudeHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1;
gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = PokedudeDummy;
}

View File

@ -800,7 +800,7 @@ void BtlController_EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2)
}
// not used
static void BtlController_EmitUnknownYesNoBox(u8 bufferId, u32 arg1) // TODO: Does the function name make sense for pokefirered?
static void BtlController_EmitUnknownYesNoBox(u8 bufferId, u32 arg1) // TODO: Does the function name make sense for pokefirered?
{
sBattleBuffersTransferData[0] = CONTROLLER_UNKNOWNYESNOBOX;
sBattleBuffersTransferData[1] = arg1;

View File

@ -663,7 +663,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 transformType)
{
const void *src;
void *dst;
position = GetBattlerPosition(battlerAtk);
targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_SPECIES);
personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY);
@ -1042,17 +1042,20 @@ void FreeMonSpritesGfx(void)
FREE_AND_SET_NULL(gMonSpritesGfxPtr);
}
bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon)
bool32 ShouldPlayNormalMonCry(struct Pokemon *mon)
{
s16 hp, maxHP;
s32 barLevel;
if (GetMonData(mon, MON_DATA_STATUS) & (STATUS1_ANY | STATUS1_TOXIC_COUNTER))
return FALSE;
hp = GetMonData(mon, MON_DATA_HP);
maxHP = GetMonData(mon, MON_DATA_MAX_HP);
barLevel = GetHPBarLevel(hp, maxHP);
if (barLevel <= HP_BAR_YELLOW)
return FALSE;
return TRUE;
}

View File

@ -676,7 +676,7 @@ static const struct OamData sOamData_MonIconOnLvlUpBanner =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(32x32),
.x = 0,

View File

@ -181,7 +181,7 @@ static void Task_BattleStart(u8 taskId)
case 0:
if (!FldEffPoison_IsActive())
{
HelpSystem_Disable();
HelpSystem_Disable();
BT_StartOnField(tTransition);
++tState;
}
@ -189,7 +189,7 @@ static void Task_BattleStart(u8 taskId)
case 1:
if (BT_IsDone() == TRUE)
{
HelpSystem_Enable();
HelpSystem_Enable();
CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_InitBattle);
RestartWildEncounterImmunitySteps();

View File

@ -394,7 +394,7 @@ static const TransitionStateFunc sBT_Phase2WhiteFadeInStripesFuncs[] =
};
static const u16 sWhiteStripeDelay[] = { 0, 9, 15, 6, 12, 3 };
static const TransitionStateFunc sBT_Phase2GridSquaresFuncs[] =
{
BT_Phase2GridSquares_LoadGfx,
@ -480,7 +480,7 @@ static const struct OamData sOamData_Unused =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(64x64),
.x = 0,
@ -1022,7 +1022,7 @@ static void VBCB_BT_Phase2BigPokeball2(void)
#undef tTheta
#undef tAmplitude
// TODO: Document this effect after knowing more about field effects.
// TODO: Document this effect after knowing more about field effects.
static void BT_Phase2SlidingPokeballs(u8 taskId)
{
while (sBT_Phase2SlidingPokeballsFuncs[gTasks[taskId].tState](&gTasks[taskId]));

View File

@ -1,37 +1,37 @@
const u32 gInterfaceGfx_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz");
const u32 gInterfacePal_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.lz");
const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz");
const u32 gBallPal_Poke[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.lz");
const u32 gInterfaceGfx_GreatBall[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz");
const u32 gInterfacePal_GreatBall[] = INCBIN_U32("graphics/interface/ball/great.gbapal.lz");
const u32 gBallGfx_Great[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz");
const u32 gBallPal_Great[] = INCBIN_U32("graphics/interface/ball/great.gbapal.lz");
const u32 gInterfaceGfx_SafariBall[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz");
const u32 gInterfacePal_SafariBall[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.lz");
const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz");
const u32 gBallPal_Safari[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.lz");
const u32 gInterfaceGfx_UltraBall[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz");
const u32 gInterfacePal_UltraBall[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.lz");
const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz");
const u32 gBallPal_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.lz");
const u32 gInterfaceGfx_MasterBall[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz");
const u32 gInterfacePal_MasterBall[] = INCBIN_U32("graphics/interface/ball/master.gbapal.lz");
const u32 gBallGfx_Master[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz");
const u32 gBallPal_Master[] = INCBIN_U32("graphics/interface/ball/master.gbapal.lz");
const u32 gInterfaceGfx_NetBall[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz");
const u32 gInterfacePal_NetBall[] = INCBIN_U32("graphics/interface/ball/net.gbapal.lz");
const u32 gBallGfx_Net[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz");
const u32 gBallPal_Net[] = INCBIN_U32("graphics/interface/ball/net.gbapal.lz");
const u32 gInterfaceGfx_DiveBall[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz");
const u32 gInterfacePal_DiveBall[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.lz");
const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz");
const u32 gBallPal_Dive[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.lz");
const u32 gInterfaceGfx_NestBall[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz");
const u32 gInterfacePal_NestBall[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.lz");
const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz");
const u32 gBallPal_Nest[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.lz");
const u32 gInterfaceGfx_RepeatBall[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz");
const u32 gInterfacePal_RepeatBall[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.lz");
const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz");
const u32 gBallPal_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.lz");
const u32 gInterfaceGfx_TimerBall[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz");
const u32 gInterfacePal_TimerBall[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.lz");
const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz");
const u32 gBallPal_Timer[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.lz");
const u32 gInterfaceGfx_LuxuryBall[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz");
const u32 gInterfacePal_LuxuryBall[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.lz");
const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz");
const u32 gBallPal_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.lz");
const u32 gInterfaceGfx_PremierBall[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz");
const u32 gInterfacePal_PremierBall[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz");
const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz");
const u32 gBallPal_Premier[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz");
const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz");

View File

@ -711,7 +711,7 @@ static const struct OamData sOamData_HeldItem =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(8x8),
.x = 0,
@ -767,7 +767,7 @@ static const struct OamData sOamData_MenuPokeball =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(32x32),
.x = 0,
@ -824,7 +824,7 @@ static const struct OamData sOamData_MenuPokeballSmall =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(16x16),
.x = 0,
@ -905,7 +905,7 @@ static const struct OamData sOamData_StatusCondition =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(32x8),
.x = 0,

View File

@ -143,7 +143,7 @@ static const struct OamData sOamData_EggHatch =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(32x32),
.x = 0,
@ -223,7 +223,7 @@ static const struct OamData sOamData_EggShard =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(8x8),
.x = 0,

View File

@ -15,7 +15,7 @@ bool8 SetUpFieldMove_Strength(void)
{
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_PUSHABLE_BOULDER) != TRUE)
{
return FALSE;
return FALSE;
}
else
{

View File

@ -118,7 +118,7 @@ void STWI_init_Callback_S(void)
STWI_set_Callback_S(NULL);
}
// The callback can take 2 or 3 arguments.
// The callback can take 2 or 3 arguments.
void STWI_set_Callback_M(void *callbackM)
{
gSTWIStatus->callbackM = callbackM;

View File

@ -54,7 +54,7 @@ u8 GiveMailToMon(struct Pokemon *mon, u16 itemId)
for (i = 0; i < PLAYER_NAME_LENGTH && gSaveBlock2Ptr->playerName[i] != EOS; i++)
gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
for (; i <= 5; i++)
gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE;
gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE;
gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
for (i = 0; i < 4; i++)
gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];

View File

@ -84,7 +84,7 @@ static const struct OamData sOamData_ScrollArrowIndicator =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(16x16),
.x = 0,
@ -224,7 +224,7 @@ static const struct OamData sOamData_RedArrowCursor =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = SPRITE_SHAPE(16x16),
.x = 0,

View File

@ -14,13 +14,34 @@
#include "constants/songs.h"
#include "constants/sound.h"
#define tFrames data[0]
#define tPan data[1]
#define tThrowId data[2]
#define tBattler data[3]
#define tOpponentBattler data[4]
static void Task_DoPokeballSendOutAnim(u8 taskId);
static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite);
static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite);
static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite);
static void SpriteCB_BallThrow(struct Sprite *sprite);
static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite);
static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite);
static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite);
static void SpriteCB_BallThrow_Close(struct Sprite *sprite);
static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite);
static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite);
static void SpriteCB_BallThrow_Shake(struct Sprite *sprite);
static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite);
static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite);
static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite);
static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite);
static void HandleBallAnimEnd(struct Sprite *sprite);
static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite);
static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite);
static void SpriteCB_TradePokeball(struct Sprite *sprite);
static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite);
static void SpriteCB_TradePokeballEnd(struct Sprite *sprite);
static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite);
static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite);
static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite);
static u16 GetBattlerPokeballItemId(u8 battlerId);
#define sBattler data[6]
// rom const data
#define GFX_TAG_POKE_BALL 55000
#define GFX_TAG_GREAT_BALL 55001
@ -35,68 +56,36 @@
#define GFX_TAG_LUXURY_BALL 55010
#define GFX_TAG_PREMIER_BALL 55011
// Function Declarations
static void Task_DoPokeballSendOutAnim(u8 taskId);
static void SpriteCB_TestBallThrow(struct Sprite *sprite);
static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite);
static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite);
static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite);
static void SpriteCB_BallThrow_Close(struct Sprite *sprite);
static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite);
static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite);
static void SpriteCB_BallThrow_Shake(struct Sprite *sprite);
static void Task_PlayCryWhenReleasedFromBall(u8 taskId);
static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite);
static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite);
static void HandleBallAnimEnd(struct Sprite *sprite);
static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite);
static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite);
static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite);
static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite);
static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite);
static u8 LaunchBallStarsTaskForPokeball(u8 x, u8 y, u8 kindOfStars, u8 d);
static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 battlerId, u32 arg2);
static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite);
static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite);
static void SpriteCB_TradePokeball(struct Sprite *sprite);
static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite);
static void SpriteCB_TradePokeballEnd(struct Sprite *sprite);
static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite);
static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite);
static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite);
static u16 GetBattlerPokeballItemId(u8 battlerId);
// Data
const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] =
{
{gInterfaceGfx_PokeBall, 384, GFX_TAG_POKE_BALL},
{gInterfaceGfx_GreatBall, 384, GFX_TAG_GREAT_BALL},
{gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARI_BALL},
{gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRA_BALL},
{gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTER_BALL},
{gInterfaceGfx_NetBall, 384, GFX_TAG_NET_BALL},
{gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVE_BALL},
{gInterfaceGfx_NestBall, 384, GFX_TAG_NEST_BALL},
{gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEAT_BALL},
{gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMER_BALL},
{gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURY_BALL},
{gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIER_BALL},
[BALL_POKE] = {gBallGfx_Poke, 384, GFX_TAG_POKE_BALL},
[BALL_GREAT] = {gBallGfx_Great, 384, GFX_TAG_GREAT_BALL},
[BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARI_BALL},
[BALL_ULTRA] = {gBallGfx_Ultra, 384, GFX_TAG_ULTRA_BALL},
[BALL_MASTER] = {gBallGfx_Master, 384, GFX_TAG_MASTER_BALL},
[BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NET_BALL},
[BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVE_BALL},
[BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NEST_BALL},
[BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEAT_BALL},
[BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMER_BALL},
[BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURY_BALL},
[BALL_PREMIER] = {gBallGfx_Premier, 384, GFX_TAG_PREMIER_BALL},
};
const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] =
{
{gInterfacePal_PokeBall, GFX_TAG_POKE_BALL},
{gInterfacePal_GreatBall, GFX_TAG_GREAT_BALL},
{gInterfacePal_SafariBall, GFX_TAG_SAFARI_BALL},
{gInterfacePal_UltraBall, GFX_TAG_ULTRA_BALL},
{gInterfacePal_MasterBall, GFX_TAG_MASTER_BALL},
{gInterfacePal_NetBall, GFX_TAG_NET_BALL},
{gInterfacePal_DiveBall, GFX_TAG_DIVE_BALL},
{gInterfacePal_NestBall, GFX_TAG_NEST_BALL},
{gInterfacePal_RepeatBall, GFX_TAG_REPEAT_BALL},
{gInterfacePal_TimerBall, GFX_TAG_TIMER_BALL},
{gInterfacePal_LuxuryBall, GFX_TAG_LUXURY_BALL},
{gInterfacePal_PremierBall, GFX_TAG_PREMIER_BALL},
[BALL_POKE] = {gBallPal_Poke, GFX_TAG_POKE_BALL},
[BALL_GREAT] = {gBallPal_Great, GFX_TAG_GREAT_BALL},
[BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARI_BALL},
[BALL_ULTRA] = {gBallPal_Ultra, GFX_TAG_ULTRA_BALL},
[BALL_MASTER] = {gBallPal_Master, GFX_TAG_MASTER_BALL},
[BALL_NET] = {gBallPal_Net, GFX_TAG_NET_BALL},
[BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVE_BALL},
[BALL_NEST] = {gBallPal_Nest, GFX_TAG_NEST_BALL},
[BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEAT_BALL},
[BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMER_BALL},
[BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURY_BALL},
[BALL_PREMIER] = {gBallPal_Premier, GFX_TAG_PREMIER_BALL},
};
static const struct OamData sBallOamData =
@ -171,171 +160,192 @@ static const union AnimCmd *const sBallAnimSequences[] =
sBallAnimSeq6,
};
static const union AffineAnimCmd sBallAffineAnimSeq0[] =
static const union AffineAnimCmd sAffineAnim_BallRotate_0[] =
{
AFFINEANIMCMD_FRAME(0, 0, 0, 1),
AFFINEANIMCMD_JUMP(0),
};
static const union AffineAnimCmd sBallAffineAnimSeq1[] =
static const union AffineAnimCmd sAffineAnim_BallRotate_Right[] =
{
AFFINEANIMCMD_FRAME(0, 0, -3, 1),
AFFINEANIMCMD_JUMP(0),
};
static const union AffineAnimCmd sBallAffineAnimSeq2[] =
static const union AffineAnimCmd sAffineAnim_BallRotate_Left[] =
{
AFFINEANIMCMD_FRAME(0, 0, 3, 1),
AFFINEANIMCMD_JUMP(0),
};
static const union AffineAnimCmd sBallAffineAnimSeq3[] =
static const union AffineAnimCmd sAffineAnim_BallRotate_3[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END,
};
static const union AffineAnimCmd sBallAffineAnimSeq4[] =
static const union AffineAnimCmd sAffineAnim_BallRotate_4[] =
{
AFFINEANIMCMD_FRAME(0, 0, 25, 1),
AFFINEANIMCMD_JUMP(0),
};
static const union AffineAnimCmd *const sBallAffineAnimSequences[] =
static const union AffineAnimCmd *const sAffineAnim_BallRotate[] =
{
sBallAffineAnimSeq0,
sBallAffineAnimSeq1,
sBallAffineAnimSeq2,
sBallAffineAnimSeq3,
sBallAffineAnimSeq4,
[BALL_AFFINE_ANIM_0] = sAffineAnim_BallRotate_0,
[BALL_ROTATE_RIGHT] = sAffineAnim_BallRotate_Right,
[BALL_ROTATE_LEFT] = sAffineAnim_BallRotate_Left,
[BALL_AFFINE_ANIM_3] = sAffineAnim_BallRotate_3,
[BALL_AFFINE_ANIM_4] = sAffineAnim_BallRotate_4,
};
const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
{
[BALL_POKE] =
{
.tileTag = GFX_TAG_POKE_BALL,
.paletteTag = GFX_TAG_POKE_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_GREAT] =
{
.tileTag = GFX_TAG_GREAT_BALL,
.paletteTag = GFX_TAG_GREAT_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_SAFARI] =
{
.tileTag = GFX_TAG_SAFARI_BALL,
.paletteTag = GFX_TAG_SAFARI_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_ULTRA] =
{
.tileTag = GFX_TAG_ULTRA_BALL,
.paletteTag = GFX_TAG_ULTRA_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_MASTER] =
{
.tileTag = GFX_TAG_MASTER_BALL,
.paletteTag = GFX_TAG_MASTER_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_NET] =
{
.tileTag = GFX_TAG_NET_BALL,
.paletteTag = GFX_TAG_NET_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_DIVE] =
{
.tileTag = GFX_TAG_DIVE_BALL,
.paletteTag = GFX_TAG_DIVE_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_NEST] =
{
.tileTag = GFX_TAG_NEST_BALL,
.paletteTag = GFX_TAG_NEST_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_REPEAT] =
{
.tileTag = GFX_TAG_REPEAT_BALL,
.paletteTag = GFX_TAG_REPEAT_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_TIMER] =
{
.tileTag = GFX_TAG_TIMER_BALL,
.paletteTag = GFX_TAG_TIMER_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_LUXURY] =
{
.tileTag = GFX_TAG_LUXURY_BALL,
.paletteTag = GFX_TAG_LUXURY_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
[BALL_PREMIER] =
{
.tileTag = GFX_TAG_PREMIER_BALL,
.paletteTag = GFX_TAG_PREMIER_BALL,
.oam = &sBallOamData,
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sBallAffineAnimSequences,
.callback = SpriteCB_TestBallThrow,
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
};
// Functions
#define tFrames data[0]
#define tPan data[1]
#define tThrowId data[2]
#define tBattler data[3]
#define tOpponentBattler data[4]
u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow)
{
u8 taskId;
gDoingBattleAnim = TRUE;
gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive = TRUE;
taskId = CreateTask(Task_DoPokeballSendOutAnim, 5);
gTasks[taskId].tPan = pan;
gTasks[taskId].tThrowId = kindOfThrow;
gTasks[taskId].tBattler = gActiveBattler;
return 0;
}
#define sBattler data[6]
static void Task_DoPokeballSendOutAnim(u8 taskId)
{
u16 throwCaseId;
@ -362,12 +372,12 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
ballId = ItemIdToBallId(itemId);
LoadBallGfx(ballId);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
gender = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].gender;
else
gender = gSaveBlock2Ptr->playerGender;
ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29);
gSprites[ballSpriteId].data[0] = 0x80;
gSprites[ballSpriteId].data[1] = 0;
@ -387,7 +397,7 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
x = 48;
y = 70;
}
gBattlerTarget = battlerId;
gSprites[ballSpriteId].x = x;
gSprites[ballSpriteId].y = y;
@ -425,7 +435,10 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
PlaySE(SE_BALL_THROW);
}
static void SpriteCB_TestBallThrow(struct Sprite *sprite)
// This sequence of functions is very similar to those that get run when
// a Pokéball gets thrown at a wild Pokémon, starting at SpriteCB_Ball_Arc.
// These do not seem to get run.
static void SpriteCB_BallThrow(struct Sprite *sprite)
{
if (TranslateAnimHorizontalArc(sprite))
{
@ -442,7 +455,7 @@ static void SpriteCB_TestBallThrow(struct Sprite *sprite)
sprite->y2 = 0;
sprite->data[5] = 0;
ballId = ItemIdToBallId(GetBattlerPokeballItemId(opponentBattler));
LaunchBallStarsTask(sprite->x, sprite->y - 5, 1, 0x1C, ballId);
AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);
sprite->data[0] = LaunchBallFadeMonTask(FALSE, opponentBattler, 14, ballId);
sprite->sBattler = opponentBattler;
sprite->data[7] = noOfShakes;
@ -468,7 +481,7 @@ static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite)
{
sprite->data[5] = 0;
sprite->callback = SpriteCB_BallThrow_ShrinkMon;
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 2);
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_RETURN);
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0;
}
@ -479,7 +492,7 @@ static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite)
sprite->data[5]++;
if (sprite->data[5] == 11)
PlaySE(SE_BALL_TRADE);
if (gSprites[gBattlerSpriteIds[sprite->sBattler]].affineAnimEnded)
{
StartSpriteAnim(sprite, 2);
@ -649,7 +662,7 @@ static void SpriteCB_BallThrow_Shake(struct Sprite *sprite)
StartSpriteAffineAnim(sprite, 2);
else
StartSpriteAffineAnim(sprite, 1);
PlaySE(SE_BALL);
}
break;
@ -666,10 +679,10 @@ static void SpriteCB_BallThrow_Shake(struct Sprite *sprite)
static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
{
u8 state2 = gTasks[taskId].data[2];
u8 wantedCry = gTasks[taskId].tCryTaskWantedCry;
s8 pan = gTasks[taskId].tCryTaskPan;
u16 species = gTasks[taskId].tCryTaskSpecies;
struct Pokemon *mon = (void *)(u32)((u32)(gTasks[taskId].tCryTaskMonPtr1 << 0x10) | ((u16)gTasks[taskId].tCryTaskMonPtr2));
struct Pokemon *mon = (void *)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 16) | (u16)(gTasks[taskId].tCryTaskMonPtr2));
switch (gTasks[taskId].tCryTaskState)
{
@ -678,14 +691,15 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
if (gTasks[taskId].data[8] < 3)
gTasks[taskId].data[8]++;
else
gTasks[taskId].tCryTaskState = state2 + 1;
gTasks[taskId].tCryTaskState = wantedCry + 1;
break;
case 1:
if (ShouldPlayNormalPokeCry(mon) == TRUE)
// Play single cry
if (ShouldPlayNormalMonCry(mon) == TRUE)
PlayCry_ByMode(species, pan, CRY_MODE_NORMAL);
else
PlayCry_ByMode(species, pan, CRY_MODE_WEAK);
DestroyTask(taskId);
break;
case 2:
@ -696,10 +710,11 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
case 20:
if (gTasks[taskId].tCryTaskFrames == 0)
{
if (ShouldPlayNormalPokeCry(mon) == TRUE)
PlayCry_ReleaseDouble(species, pan, 1);
// Play first doubles cry
if (ShouldPlayNormalMonCry(mon) == TRUE)
PlayCry_ReleaseDouble(species, pan, CRY_MODE_DOUBLES);
else
PlayCry_ReleaseDouble(species, pan, 12);
PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK_DOUBLES);
DestroyTask(taskId);
}
@ -719,6 +734,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
break;
}
gTasks[taskId].tCryTaskState++;
// fall through
case 31:
if (!IsCryPlayingOrClearCrySongs())
{
@ -733,11 +749,11 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
gTasks[taskId].tCryTaskFrames--;
break;
}
if (ShouldPlayNormalPokeCry(mon) == TRUE)
PlayCry_ReleaseDouble(species, pan, 0);
// Play second doubles cry
if (ShouldPlayNormalMonCry(mon) == TRUE)
PlayCry_ReleaseDouble(species, pan, CRY_MODE_NORMAL);
else
PlayCry_ReleaseDouble(species, pan, 11);
PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK);
DestroyTask(taskId);
break;
@ -751,8 +767,8 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
StartSpriteAnim(sprite, 1);
ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId));
LaunchBallStarsTask(sprite->x, sprite->y - 5, 1, 0x1C, ballId);
sprite->data[0] = LaunchBallFadeMonTask(1, sprite->sBattler, 14, ballId);
AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);
sprite->data[0] = LaunchBallFadeMonTask(TRUE, sprite->sBattler, 14, ballId);
sprite->callback = HandleBallAnimEnd;
if (gMain.inBattle)
@ -776,7 +792,7 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
species = GetMonData(mon, MON_DATA_SPECIES);
if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
&& IsDoubleBattle() && gBattleSpritesDataPtr->animationData->healthboxSlideInStarted)
&& IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@ -789,23 +805,23 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
}
}
if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->healthboxSlideInStarted)
if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->introAnimActive)
wantedCryCase = 0;
else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
wantedCryCase = 1;
else
wantedCryCase = 2;
taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3);
gTasks[taskId].tCryTaskSpecies = species;
gTasks[taskId].tCryTaskPan = pan;
gTasks[taskId].tCryTaskWantedCry = wantedCryCase;
gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 0x10;
gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 16;
gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon);
gTasks[taskId].tCryTaskState = 0;
}
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 1);
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_EMERGE);
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000;
}
@ -837,7 +853,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
sprite->invisible = TRUE;
if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded)
{
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0);
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], BATTLER_AFFINE_NORMAL);
affineAnimEnded = TRUE;
}
else
@ -857,7 +873,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
for (doneBattlers = 0, i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (!gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive)
if (gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive == FALSE)
doneBattlers++;
}
if (doneBattlers == MAX_BATTLERS_COUNT)
@ -896,8 +912,8 @@ static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite)
static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite)
{
sprite->data[0] = 25;
sprite->data[2] = GetBattlerSpriteCoord(sprite->sBattler, 2);
sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, 3) + 24;
sprite->data[2] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_Y_PIC_OFFSET) + 24;
sprite->data[5] = -30;
sprite->oam.affineParam = sprite->sBattler;
InitAnimArcTranslation(sprite);
@ -946,11 +962,12 @@ static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite)
{
sprite->x += sprite->x2;
sprite->y += sprite->y2;
sprite->x2 = sprite->y2 = 0;
sprite->y2 = 0;
sprite->x2 = 0;
sprite->sBattler = sprite->oam.affineParam & 0xFF;
sprite->data[0] = 0;
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->healthboxSlideInStarted
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive
&& sprite->sBattler == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))
sprite->callback = SpriteCB_ReleaseMon2FromBall;
else
@ -976,7 +993,7 @@ static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite)
if (sprite->data[0] > 15)
{
sprite->data[0] = 0;
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->healthboxSlideInStarted
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive
&& sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))
sprite->callback = SpriteCB_ReleaseMon2FromBall;
else
@ -986,121 +1003,144 @@ static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite)
#undef sBattler
static u8 LaunchBallStarsTaskForPokeball(u8 x, u8 y, u8 kindOfStars, u8 d)
static u8 AnimateBallOpenParticlesForPokeball(u8 x, u8 y, u8 kindOfStars, u8 subpriority)
{
return LaunchBallStarsTask(x, y, kindOfStars, d, BALL_POKE);
return AnimateBallOpenParticles(x, y, kindOfStars, subpriority, BALL_POKE);
}
static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 battlerId, u32 arg2)
static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 spritePalNum, u32 selectedPalettes)
{
return LaunchBallFadeMonTask(unFadeLater, battlerId, arg2, BALL_POKE);
return LaunchBallFadeMonTask(unFadeLater, spritePalNum, selectedPalettes, BALL_POKE);
}
void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 battlerId, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h)
// Sprite data for the pokeball
#define sMonSpriteId data[0]
#define sDelay data[1]
#define sMonPalNum data[2]
#define sFadePalsLo data[3]
#define sFadePalsHi data[4]
#define sFinalMonX data[5]
#define sFinalMonY data[6]
#define sTrigIdx data[7]
// Pokeball in Oak intro, and when receiving via trade
void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes)
{
u8 spriteId;
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subpriortiy);
gSprites[spriteId].data[0] = monSpriteId;
gSprites[spriteId].data[5] = gSprites[monSpriteId].x;
gSprites[spriteId].data[6] = gSprites[monSpriteId].y;
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]);
spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriortiy);
gSprites[spriteId].sMonSpriteId = monSpriteId;
gSprites[spriteId].sFinalMonX = gSprites[monSpriteId].x;
gSprites[spriteId].sFinalMonY = gSprites[monSpriteId].y;
gSprites[monSpriteId].x = x;
gSprites[monSpriteId].y = y;
gSprites[spriteId].data[1] = g;
gSprites[spriteId].data[2] = battlerId;
gSprites[spriteId].data[3] = h;
gSprites[spriteId].data[4] = h >> 0x10;
gSprites[spriteId].sDelay = delay;
gSprites[spriteId].sMonPalNum = monPalNum;
gSprites[spriteId].sFadePalsLo = fadePalettes;
gSprites[spriteId].sFadePalsHi = fadePalettes >> 16;
gSprites[spriteId].oam.priority = oamPriority;
gSprites[spriteId].callback = SpriteCB_PokeballReleaseMon;
gSprites[monSpriteId].invisible = TRUE;
}
static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite)
{
if (sprite->data[1] == 0)
if (sprite->sDelay == 0)
{
u8 r5;
u8 r7 = sprite->data[0];
u8 battlerId = sprite->data[2];
u32 r4 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16);
u8 subpriority;
u8 spriteId = sprite->sMonSpriteId;
u8 monPalNum = sprite->sMonPalNum;
u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16);
if (sprite->subpriority != 0)
r5 = sprite->subpriority - 1;
subpriority = sprite->subpriority - 1;
else
r5 = 0;
subpriority = 0;
StartSpriteAnim(sprite, 1);
LaunchBallStarsTaskForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, r5);
sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, battlerId, r4);
AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority);
// sDelay re-used to store task id but never read
sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes);
sprite->callback = SpriteCB_ReleasedMonFlyOut;
gSprites[r7].invisible = FALSE;
StartSpriteAffineAnim(&gSprites[r7], 1);
AnimateSprite(&gSprites[r7]);
gSprites[r7].data[1] = 0x1000;
sprite->data[7] = 0;
gSprites[spriteId].invisible = FALSE;
StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_EMERGE);
AnimateSprite(&gSprites[spriteId]);
gSprites[spriteId].data[1] = 0x1000;
sprite->sTrigIdx = 0;
}
else
{
sprite->data[1]--;
sprite->sDelay--;
}
}
static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite)
{
bool8 r12 = FALSE;
bool8 r6 = FALSE;
u8 monSpriteId = sprite->data[0];
u16 var1;
u16 var2;
bool8 emergeAnimFinished = FALSE;
bool8 atFinalPosition = FALSE;
u8 monSpriteId = sprite->sMonSpriteId;
u16 x, y;
if (sprite->animEnded)
sprite->invisible = TRUE;
if (gSprites[monSpriteId].affineAnimEnded)
{
StartSpriteAffineAnim(&gSprites[monSpriteId], 0);
r12 = TRUE;
StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_NORMAL);
emergeAnimFinished = TRUE;
}
var1 = (sprite->data[5] - sprite->x) * sprite->data[7] / 128 + sprite->x;
var2 = (sprite->data[6] - sprite->y) * sprite->data[7] / 128 + sprite->y;
gSprites[monSpriteId].x = var1;
gSprites[monSpriteId].y = var2;
if (sprite->data[7] < 128)
{
s16 sine = -(gSineTable[(u8)sprite->data[7]] / 8);
sprite->data[7] += 4;
x = (sprite->sFinalMonX - sprite->x) * sprite->sTrigIdx / 128 + sprite->x;
y = (sprite->sFinalMonY - sprite->y) * sprite->sTrigIdx / 128 + sprite->y;
gSprites[monSpriteId].x = x;
gSprites[monSpriteId].y = y;
if (sprite->sTrigIdx < 128)
{
s16 sine = -(gSineTable[(u8)sprite->sTrigIdx] / 8);
sprite->sTrigIdx += 4;
gSprites[monSpriteId].x2 = sine;
gSprites[monSpriteId].y2 = sine;
}
else
{
gSprites[monSpriteId].x = sprite->data[5];
gSprites[monSpriteId].y = sprite->data[6];
gSprites[monSpriteId].x = sprite->sFinalMonX;
gSprites[monSpriteId].y = sprite->sFinalMonY;
gSprites[monSpriteId].x2 = 0;
gSprites[monSpriteId].y2 = 0;
r6 = TRUE;
atFinalPosition = TRUE;
}
if (sprite->animEnded && r12 && r6)
if (sprite->animEnded && emergeAnimFinished && atFinalPosition)
{
DestroySpriteAndFreeResources(sprite);
}
}
u8 CreateTradePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 g, u32 h)
#undef sFinalMonX
#undef sFinalMonY
#undef sTrigIdx
#define sTimer data[5]
u8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes)
{
u8 spriteId;
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subPriority);
gSprites[spriteId].data[0] = a;
gSprites[spriteId].data[1] = g;
gSprites[spriteId].data[2] = b;
gSprites[spriteId].data[3] = h;
gSprites[spriteId].data[4] = h >> 16;
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]);
spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subPriority);
gSprites[spriteId].sMonSpriteId = monSpriteId;
gSprites[spriteId].sDelay = delay;
gSprites[spriteId].sMonPalNum = monPalNum;
gSprites[spriteId].sFadePalsLo = fadePalettes;
gSprites[spriteId].sFadePalsHi = fadePalettes >> 16;
gSprites[spriteId].oam.priority = oamPriority;
gSprites[spriteId].callback = SpriteCB_TradePokeball;
return spriteId;
@ -1108,29 +1148,35 @@ u8 CreateTradePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPrior
static void SpriteCB_TradePokeball(struct Sprite *sprite)
{
if (sprite->data[1] == 0)
if (sprite->sDelay == 0)
{
u8 r6;
u8 r7 = sprite->data[0];
u8 r8 = sprite->data[2];
u32 r5 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16);
u8 subpriority;
u8 monSpriteId = sprite->sMonSpriteId;
u8 monPalNum = sprite->sMonPalNum;
u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16);
if (sprite->subpriority != 0)
r6 = sprite->subpriority - 1;
subpriority = sprite->subpriority - 1;
else
r6 = 0;
subpriority = 0;
StartSpriteAnim(sprite, 1);
LaunchBallStarsTaskForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, r6);
sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, r8, r5);
AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority);
// sDelay re-used to store task id but never read
sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes);
sprite->callback = SpriteCB_TradePokeballSendOff;
StartSpriteAffineAnim(&gSprites[r7], 2);
AnimateSprite(&gSprites[r7]);
gSprites[r7].data[1] = 0;
#ifdef BUGFIX
// FIX: If this is used on a sprite that has previously had an affine animation, it will not
// play the shrink anim properly due to being paused.
gSprites[monSpriteId].affineAnimPaused = FALSE;
#endif // BUGFIX
StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_RETURN);
AnimateSprite(&gSprites[monSpriteId]);
gSprites[monSpriteId].data[1] = 0;
}
else
{
sprite->data[1]--;
sprite->sDelay--;
}
}
@ -1138,16 +1184,16 @@ static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite)
{
u8 monSpriteId;
sprite->data[5]++;
if (sprite->data[5] == 11)
sprite->sTimer++;
if (sprite->sTimer == 11)
PlaySE(SE_BALL_TRADE);
monSpriteId = sprite->data[0];
monSpriteId = sprite->sMonSpriteId;
if (gSprites[monSpriteId].affineAnimEnded)
{
StartSpriteAnim(sprite, 2);
gSprites[monSpriteId].invisible = TRUE;
sprite->data[5] = 0;
sprite->sTimer = 0;
sprite->callback = SpriteCB_TradePokeballEnd;
}
else
@ -1163,28 +1209,40 @@ static void SpriteCB_TradePokeballEnd(struct Sprite *sprite)
sprite->callback = SpriteCallbackDummy;
}
void DestroySpriteAndFreeResources2(struct Sprite *sprite)
#undef sMonSpriteId
#undef sDelay
#undef sMonPalNum
#undef sFadePalsLo
#undef sFadePalsHi
#undef sTimer
// Unreferenced in RSE, but used here, possibly by mistake.
void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite)
{
DestroySpriteAndFreeResources(sprite);
}
#define sSpeedX data[0]
#define sSpeedY data[1]
#define sDelayTimer data[1]
void StartHealthboxSlideIn(u8 battlerId)
{
struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]];
healthboxSprite->data[0] = 5;
healthboxSprite->data[1] = 0;
healthboxSprite->sSpeedX = 5;
healthboxSprite->sSpeedY = 0;
healthboxSprite->x2 = 0x73;
healthboxSprite->y2 = 0;
healthboxSprite->callback = SpriteCB_HealthboxSlideIn;
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
{
healthboxSprite->data[0] = -healthboxSprite->data[0];
healthboxSprite->data[1] = -healthboxSprite->data[1];
healthboxSprite->sSpeedX = -healthboxSprite->sSpeedX;
healthboxSprite->sSpeedY = -healthboxSprite->sSpeedY;
healthboxSprite->x2 = -healthboxSprite->x2;
healthboxSprite->y2 = -healthboxSprite->y2;
}
gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]);
if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT)
healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed;
@ -1192,22 +1250,26 @@ void StartHealthboxSlideIn(u8 battlerId)
static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite)
{
sprite->data[1]++;
if (sprite->data[1] == 20)
sprite->sDelayTimer++;
if (sprite->sDelayTimer == 20)
{
sprite->data[1] = 0;
sprite->sDelayTimer = 0;
sprite->callback = SpriteCB_HealthboxSlideIn;
}
}
static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite)
{
sprite->x2 -= sprite->data[0];
sprite->y2 -= sprite->data[1];
sprite->x2 -= sprite->sSpeedX;
sprite->y2 -= sprite->sSpeedY;
if (sprite->x2 == 0 && sprite->y2 == 0)
sprite->callback = SpriteCallbackDummy;
}
#undef sSpeedX
#undef sSpeedY
#undef sDelayTimer
void DoHitAnimHealthboxEffect(u8 battlerId)
{
u8 spriteId;
@ -1242,7 +1304,7 @@ void LoadBallGfx(u8 ballId)
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[ballId]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[ballId]);
}
switch (ballId)
{
case BALL_DIVE:
@ -1251,7 +1313,7 @@ void LoadBallGfx(u8 ballId)
break;
default:
var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag);
LZDecompressVram(gOpenPokeballGfx, (void *)(VRAM + 0x10100 + var * 32));
LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32));
break;
}
}

View File

@ -1667,7 +1667,7 @@ static const struct OamData sOakSpeechNidoranFDummyOamData =
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.mosaic = FALSE,
.bpp = 0,
.shape = 0,
.x = 0,

View File

@ -3859,7 +3859,7 @@ static const struct OamData sOamData_JumpMon =
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x64),
.x = 0,
@ -3876,7 +3876,7 @@ static const struct OamData sOamData_Vine16x32 =
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x32),
.x = 0,
@ -3893,7 +3893,7 @@ static const struct OamData sOamData_Vine32x32 =
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x32),
.x = 0,
@ -3910,7 +3910,7 @@ static const struct OamData sOamData_Vine32x16 =
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x16),
.x = 0,
@ -4064,7 +4064,7 @@ static const struct OamData sOamData_Star =
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16),
.x = 0,

View File

@ -4133,7 +4133,8 @@ static void ShowOrHideBallIconObj(u8 invisible)
static void DestroyBallIconObj(void)
{
DestroySpriteAndFreeResources2(&gSprites[sMonSummaryScreen->ballIconSpriteId]);
// Redundant, as DestroySpriteAndFreeResources could've been used.
DestroySpriteAndFreeResources_Ball(&gSprites[sMonSummaryScreen->ballIconSpriteId]);
}
static void PokeSum_CreateMonIconSprite(void)
@ -5181,7 +5182,7 @@ static void PokeSum_TryPlayMonCry(void)
{
if (!GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG))
{
if (ShouldPlayNormalPokeCry(&sMonSummaryScreen->currentMon) == TRUE)
if (ShouldPlayNormalMonCry(&sMonSummaryScreen->currentMon) == TRUE)
PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES2), 0, CRY_MODE_NORMAL);
else
PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES2), 0, CRY_MODE_WEAK);

View File

@ -566,7 +566,7 @@ static const struct OamData sOamData_Emoticons = {
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16),
.x = 0,