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
+139 -139
View File
File diff suppressed because it is too large Load Diff
+14 -8
View File
@@ -55,6 +55,12 @@
#define MAX_TRAINER_ITEMS 4 #define MAX_TRAINER_ITEMS 4
enum {
BATTLER_AFFINE_NORMAL,
BATTLER_AFFINE_EMERGE,
BATTLER_AFFINE_RETURN,
};
#define MOVE_TARGET_SELECTED 0 #define MOVE_TARGET_SELECTED 0
#define MOVE_TARGET_DEPENDS (1 << 0) #define MOVE_TARGET_DEPENDS (1 << 0)
#define MOVE_TARGET_USER_OR_SELECTED (1 << 1) #define MOVE_TARGET_USER_OR_SELECTED (1 << 1)
@@ -545,15 +551,15 @@ struct BattleAnimationInfo
u8 field_6; u8 field_6;
u8 field_7; u8 field_7;
u8 ballThrowCaseId; u8 ballThrowCaseId;
u8 healthboxSlideInStarted : 1; u8 introAnimActive:1;
u8 field_9_x2 : 1; u8 wildMonInvisible:1;
u8 field_9_x1C : 3; u8 field_9_x1C:3;
u8 field_9_x20 : 1; u8 field_9_x20:1;
u8 field_9_x40 : 1; u8 field_9_x40:1;
u8 field_9_x80 : 1; u8 field_9_x80:1;
u8 field_A; u8 numBallParticles;
u8 field_B; u8 field_B;
s16 field_C; s16 ballSubpx;
u8 field_E; u8 field_E;
u8 field_F; u8 field_F;
}; };
+1 -1
View File
@@ -317,7 +317,7 @@ void AnimRecycle(struct Sprite *);
// battle_anim_special.c // battle_anim_special.c
void TryShinyAnimation(u8 battler, struct Pokemon *mon); void TryShinyAnimation(u8 battler, struct Pokemon *mon);
u8 ItemIdToBallId(u16 itemId); 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); u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 battlerId, u32 arg2, u8 ballId);
void DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId); void DoLoadHealthboxPalsForLevelUp(u8 *, u8 *, u8 battlerId);
void DoFreeHealthboxPalsForLevelUp(u8 batterId); void DoFreeHealthboxPalsForLevelUp(u8 batterId);
+1 -1
View File
@@ -40,6 +40,6 @@ void BattleInterfaceSetWindowPals(void);
void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute); void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute);
void AllocateMonSpritesGfx(void); void AllocateMonSpritesGfx(void);
void FreeMonSpritesGfx(void); void FreeMonSpritesGfx(void);
bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon); bool32 ShouldPlayNormalMonCry(struct Pokemon *mon);
#endif // GUARD_BATTLE_GFX_SFX_UTIL_H #endif // GUARD_BATTLE_GFX_SFX_UTIL_H
+1 -1
View File
@@ -312,7 +312,7 @@
#define NUM_CASTFORM_FORMS 4 #define NUM_CASTFORM_FORMS 4
#define CASTFORM_SUBSTITUTE (1 << 7) #define CASTFORM_SUBSTITUTE (1 << 7)
// Return value for IsRunningFromBattleImpossible. // Return value for IsRunningFromBattleImpossible.
#define BATTLE_RUN_SUCCESS 0 #define BATTLE_RUN_SUCCESS 0
#define BATTLE_RUN_FORBIDDEN 1 #define BATTLE_RUN_FORBIDDEN 1
#define BATTLE_RUN_FAILURE 2 #define BATTLE_RUN_FAILURE 2
+24 -24
View File
@@ -3,30 +3,30 @@
#include "global.h" #include "global.h"
extern const u32 gInterfaceGfx_PokeBall[]; extern const u32 gBallGfx_Poke[];
extern const u32 gInterfacePal_PokeBall[]; extern const u32 gBallPal_Poke[];
extern const u32 gInterfaceGfx_GreatBall[]; extern const u32 gBallGfx_Great[];
extern const u32 gInterfacePal_GreatBall[]; extern const u32 gBallPal_Great[];
extern const u32 gInterfaceGfx_SafariBall[]; extern const u32 gBallGfx_Safari[];
extern const u32 gInterfacePal_SafariBall[]; extern const u32 gBallPal_Safari[];
extern const u32 gInterfaceGfx_UltraBall[]; extern const u32 gBallGfx_Ultra[];
extern const u32 gInterfacePal_UltraBall[]; extern const u32 gBallPal_Ultra[];
extern const u32 gInterfaceGfx_MasterBall[]; extern const u32 gBallGfx_Master[];
extern const u32 gInterfacePal_MasterBall[]; extern const u32 gBallPal_Master[];
extern const u32 gInterfaceGfx_NetBall[]; extern const u32 gBallGfx_Net[];
extern const u32 gInterfacePal_NetBall[]; extern const u32 gBallPal_Net[];
extern const u32 gInterfaceGfx_DiveBall[]; extern const u32 gBallGfx_Dive[];
extern const u32 gInterfacePal_DiveBall[]; extern const u32 gBallPal_Dive[];
extern const u32 gInterfaceGfx_NestBall[]; extern const u32 gBallGfx_Nest[];
extern const u32 gInterfacePal_NestBall[]; extern const u32 gBallPal_Nest[];
extern const u32 gInterfaceGfx_RepeatBall[]; extern const u32 gBallGfx_Repeat[];
extern const u32 gInterfacePal_RepeatBall[]; extern const u32 gBallPal_Repeat[];
extern const u32 gInterfaceGfx_TimerBall[]; extern const u32 gBallGfx_Timer[];
extern const u32 gInterfacePal_TimerBall[]; extern const u32 gBallPal_Timer[];
extern const u32 gInterfaceGfx_LuxuryBall[]; extern const u32 gBallGfx_Luxury[];
extern const u32 gInterfacePal_LuxuryBall[]; extern const u32 gBallPal_Luxury[];
extern const u32 gInterfaceGfx_PremierBall[]; extern const u32 gBallGfx_Premier[];
extern const u32 gInterfacePal_PremierBall[]; extern const u32 gBallPal_Premier[];
extern const u32 gOpenPokeballGfx[]; extern const u32 gOpenPokeballGfx[];
// pokemon gfx // pokemon gfx
+1 -1
View File
@@ -324,7 +324,7 @@ struct STWIStatus
vu8 sending; vu8 sending;
}; };
// This struct is used as u8 array in SDK. // This struct is used as u8 array in SDK.
struct RfuIntrStruct struct RfuIntrStruct
{ {
union RfuPacket rxPacketAlloc; union RfuPacket rxPacketAlloc;
+9 -1
View File
@@ -20,6 +20,14 @@ enum
POKEBALL_COUNT 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 CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT];
extern const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT]; extern const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT];
extern const struct SpriteTemplate gBallSpriteTemplates[]; extern const struct SpriteTemplate gBallSpriteTemplates[];
@@ -34,6 +42,6 @@ void DoHitAnimHealthboxEffect(u8 bank);
void LoadBallGfx(u8 ballId); void LoadBallGfx(u8 ballId);
void FreeBallGfx(u8 ballId); void FreeBallGfx(u8 ballId);
void StartHealthboxSlideIn(u8 battler); void StartHealthboxSlideIn(u8 battler);
void DestroySpriteAndFreeResources2(struct Sprite *sprite); void DestroySpriteAndFreeResources_Ball(struct Sprite *sprite);
#endif // GUARD_POKEBALL_H #endif // GUARD_POKEBALL_H
+23 -23
View File
@@ -659,7 +659,7 @@ void AnimTask_SwitchOutBallEffect(u8 taskId)
y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
priority = gSprites[spriteId].oam.priority; priority = gSprites[spriteId].oam.priority;
subpriority = gSprites[spriteId].subpriority; 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); selectedPalettes = SelectBattleAnimSpriteAndBgPalettes(1, 0, 0, 0, 0, 0, 0);
gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId); gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId);
gTasks[taskId].data[0]++; 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[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16; gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16;
gSprites[spriteId].callback = SpriteCB_ThrowBall_Init; 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].data[0] = spriteId;
gTasks[taskId].func = AnimTask_ThrowBall_WaitAnimObjComplete; gTasks[taskId].func = AnimTask_ThrowBall_WaitAnimObjComplete;
} }
@@ -860,7 +860,7 @@ static void SpriteCB_ThrowBall_ArcFlight(struct Sprite *sprite)
switch (ballId) switch (ballId)
{ {
case 0 ... POKEBALL_COUNT - 1: 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); LaunchBallFadeMonTask(0, gBattleAnimTarget, 14, ballId);
break; break;
} }
@@ -1015,7 +1015,7 @@ static void SpriteCB_ThrowBall_InitShake(struct Sprite *sprite)
sprite->data[3] = 0; sprite->data[3] = 0;
sprite->affineAnimPaused = TRUE; sprite->affineAnimPaused = TRUE;
StartSpriteAffineAnim(sprite, 1); StartSpriteAffineAnim(sprite, 1);
gBattleSpritesDataPtr->animationData->field_C = 0; gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->callback = SpriteCB_ThrowBall_DoShake; sprite->callback = SpriteCB_ThrowBall_DoShake;
PlaySE(SE_BALL); PlaySE(SE_BALL);
} }
@@ -1029,14 +1029,14 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
switch (sprite->data[3] & 0xFF) switch (sprite->data[3] & 0xFF)
{ {
case 0: case 0:
if (gBattleSpritesDataPtr->animationData->field_C > 0xFF) if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)
{ {
sprite->x2 += sprite->data[4]; sprite->x2 += sprite->data[4];
gBattleSpritesDataPtr->animationData->field_C &= 0xFF; gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;
} }
else else
{ {
gBattleSpritesDataPtr->animationData->field_C += 0xB0; gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;
} }
sprite->data[5]++; sprite->data[5]++;
@@ -1044,7 +1044,7 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
var0 = sprite->data[5] + 7; var0 = sprite->data[5] + 7;
if (var0 > 14) if (var0 > 14)
{ {
gBattleSpritesDataPtr->animationData->field_C = 0; gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->data[3]++; sprite->data[3]++;
sprite->data[5] = 0; sprite->data[5] = 0;
} }
@@ -1067,14 +1067,14 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
} }
break; break;
case 2: case 2:
if (gBattleSpritesDataPtr->animationData->field_C > 0xFF) if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)
{ {
sprite->x2 += sprite->data[4]; sprite->x2 += sprite->data[4];
gBattleSpritesDataPtr->animationData->field_C &= 0xFF; gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;
} }
else else
{ {
gBattleSpritesDataPtr->animationData->field_C += 0xB0; gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;
} }
sprite->data[5]++; sprite->data[5]++;
@@ -1082,7 +1082,7 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
var0 = sprite->data[5] + 12; var0 = sprite->data[5] + 12;
if (var0 > 24) if (var0 > 24)
{ {
gBattleSpritesDataPtr->animationData->field_C = 0; gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->data[3]++; sprite->data[3]++;
sprite->data[5] = 0; sprite->data[5] = 0;
} }
@@ -1104,14 +1104,14 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
ChangeSpriteAffineAnim(sprite, 1); ChangeSpriteAffineAnim(sprite, 1);
// fall through // fall through
case 4: case 4:
if (gBattleSpritesDataPtr->animationData->field_C > 0xFF) if (gBattleSpritesDataPtr->animationData->ballSubpx > 0xFF)
{ {
sprite->x2 += sprite->data[4]; sprite->x2 += sprite->data[4];
gBattleSpritesDataPtr->animationData->field_C &= 0xFF; gBattleSpritesDataPtr->animationData->ballSubpx &= 0xFF;
} }
else else
{ {
gBattleSpritesDataPtr->animationData->field_C += 0xB0; gBattleSpritesDataPtr->animationData->ballSubpx += 0xB0;
} }
sprite->data[5]++; sprite->data[5]++;
@@ -1119,7 +1119,7 @@ static void SpriteCB_ThrowBall_DoShake(struct Sprite *sprite)
var0 = sprite->data[5] + 4; var0 = sprite->data[5] + 4;
if (var0 > 8) if (var0 > 8)
{ {
gBattleSpritesDataPtr->animationData->field_C = 0; gBattleSpritesDataPtr->animationData->ballSubpx = 0;
sprite->data[3]++; sprite->data[3]++;
sprite->data[5] = 0; sprite->data[5] = 0;
sprite->data[4] = -sprite->data[4]; sprite->data[4] = -sprite->data[4];
@@ -1319,7 +1319,7 @@ static void SpriteCB_ThrowBall_BeginBreakOut(struct Sprite *sprite)
switch (ballId) switch (ballId)
{ {
case 0 ... POKEBALL_COUNT - 1: 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); LaunchBallFadeMonTask(1, gBattleAnimTarget, 14, ballId);
break; break;
} }
@@ -1351,7 +1351,7 @@ static void SpriteCB_ThrowBall_RunBreakOut(struct Sprite *sprite)
if (sprite->animEnded && next) if (sprite->animEnded && next)
{ {
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].y2 = 0; 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->data[0] = 0;
sprite->callback = BattleAnimObj_SignalEnd; sprite->callback = BattleAnimObj_SignalEnd;
gDoingBattleAnim = FALSE; 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; u8 taskId;
@@ -1448,7 +1448,7 @@ u8 LaunchBallStarsTask(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId)
static void IncrementBattleParticleCounter(void) static void IncrementBattleParticleCounter(void)
{ {
if (gMain.inBattle) if (gMain.inBattle)
gBattleSpritesDataPtr->animationData->field_A++; gBattleSpritesDataPtr->animationData->numBallParticles++;
} }
static void PokeBallOpenParticleAnimation(u8 taskId) static void PokeBallOpenParticleAnimation(u8 taskId)
@@ -1850,8 +1850,8 @@ static void DestroyBallOpenAnimationParticle(struct Sprite *sprite)
} }
else else
{ {
gBattleSpritesDataPtr->animationData->field_A--; gBattleSpritesDataPtr->animationData->numBallParticles--;
if (gBattleSpritesDataPtr->animationData->field_A == 0) if (gBattleSpritesDataPtr->animationData->numBallParticles == 0)
{ {
for (j = 0; j < POKEBALL_COUNT; j++) for (j = 0; j < POKEBALL_COUNT; j++)
{ {
@@ -2097,7 +2097,7 @@ static void AnimTask_ShinySparkles(u8 taskId)
return; return;
} }
if (gBattleSpritesDataPtr->animationData->field_A) if (gBattleSpritesDataPtr->animationData->numBallParticles)
return; return;
counter = gTasks[taskId].data[10]++; counter = gTasks[taskId].data[10]++;
+2 -2
View File
@@ -271,7 +271,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
StartHealthboxSlideIn(gActiveBattler); StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0; gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
} }
} }
@@ -1538,7 +1538,7 @@ static void LinkOpponentHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler; gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDummy; gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDummy;
} }
+2 -2
View File
@@ -236,7 +236,7 @@ static void Intro_ShowHealthbox(void)
HEALTHBOX_ALL); HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler); StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0; gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForHealthbox; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForHealthbox;
} }
} }
@@ -1464,7 +1464,7 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler; gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDummy; gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDummy;
} }
+2 -2
View File
@@ -427,7 +427,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
HEALTHBOX_ALL); HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler); StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0; gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
} }
} }
@@ -2093,7 +2093,7 @@ static void OakOldManHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler; gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = PlayerDummy; gBattlerControllerFuncs[gActiveBattler] = PlayerDummy;
} }
else else
+2 -2
View File
@@ -265,7 +265,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
StartHealthboxSlideIn(gActiveBattler); StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES));
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = FALSE; gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
} }
} }
@@ -1638,7 +1638,7 @@ static void OpponentHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler; gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = TRUE; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = OpponentDummy; gBattlerControllerFuncs[gActiveBattler] = OpponentDummy;
} }
+8 -8
View File
@@ -931,7 +931,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
HEALTHBOX_ALL); HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler); StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0; gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
} }
} }
@@ -2719,7 +2719,7 @@ static void PlayerHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler; gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = PlayerDummy; gBattlerControllerFuncs[gActiveBattler] = PlayerDummy;
} }
@@ -2912,8 +2912,8 @@ static void PreviewDeterminativeMoveTargets(void)
break; break;
case MOVE_TARGET_BOTH: case MOVE_TARGET_BOTH:
case MOVE_TARGET_OPPONENTS_FIELD: case MOVE_TARGET_OPPONENTS_FIELD:
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)] bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]
| gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16; | gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16;
startY = 8; startY = 8;
break; break;
case MOVE_TARGET_USER: case MOVE_TARGET_USER:
@@ -2935,8 +2935,8 @@ static void PreviewDeterminativeMoveTargets(void)
case MOVE_MIST: case MOVE_MIST:
case MOVE_HEAL_BELL: case MOVE_HEAL_BELL:
case MOVE_AROMATHERAPY: case MOVE_AROMATHERAPY:
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)] bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]
| gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]) << 16; | gBitTable[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]) << 16;
break; break;
case MOVE_HELPING_HAND: case MOVE_HELPING_HAND:
bitMask = (gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) << 16; bitMask = (gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) << 16;
@@ -2948,8 +2948,8 @@ static void PreviewDeterminativeMoveTargets(void)
startY = 8; startY = 8;
break; break;
case MOVE_TARGET_FOES_AND_ALLY: case MOVE_TARGET_FOES_AND_ALLY:
bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)] bitMask = (gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]
| gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)] | gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]
| gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16; | gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]) << 16;
startY = 8; startY = 8;
break; break;
+2 -2
View File
@@ -408,7 +408,7 @@ static void Intro_TryShinyAnimShowHealthbox(void)
HEALTHBOX_ALL); HEALTHBOX_ALL);
StartHealthboxSlideIn(gActiveBattler); StartHealthboxSlideIn(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 0; gBattleSpritesDataPtr->animationData->introAnimActive = FALSE;
gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox;
} }
} }
@@ -1865,7 +1865,7 @@ static void PokedudeHandleIntroTrainerBallThrow(void)
gTasks[taskId].data[0] = gActiveBattler; gTasks[taskId].data[0] = gActiveBattler;
if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown)
gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary;
gBattleSpritesDataPtr->animationData->healthboxSlideInStarted = 1; gBattleSpritesDataPtr->animationData->introAnimActive = TRUE;
gBattlerControllerFuncs[gActiveBattler] = PokedudeDummy; gBattlerControllerFuncs[gActiveBattler] = PokedudeDummy;
} }
+1 -1
View File
@@ -800,7 +800,7 @@ void BtlController_EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2)
} }
// not used // 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[0] = CONTROLLER_UNKNOWNYESNOBOX;
sBattleBuffersTransferData[1] = arg1; sBattleBuffersTransferData[1] = arg1;
+5 -2
View File
@@ -663,7 +663,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 transformType)
{ {
const void *src; const void *src;
void *dst; void *dst;
position = GetBattlerPosition(battlerAtk); position = GetBattlerPosition(battlerAtk);
targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_SPECIES); targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_SPECIES);
personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY);
@@ -1042,17 +1042,20 @@ void FreeMonSpritesGfx(void)
FREE_AND_SET_NULL(gMonSpritesGfxPtr); FREE_AND_SET_NULL(gMonSpritesGfxPtr);
} }
bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon) bool32 ShouldPlayNormalMonCry(struct Pokemon *mon)
{ {
s16 hp, maxHP; s16 hp, maxHP;
s32 barLevel; s32 barLevel;
if (GetMonData(mon, MON_DATA_STATUS) & (STATUS1_ANY | STATUS1_TOXIC_COUNTER)) if (GetMonData(mon, MON_DATA_STATUS) & (STATUS1_ANY | STATUS1_TOXIC_COUNTER))
return FALSE; return FALSE;
hp = GetMonData(mon, MON_DATA_HP); hp = GetMonData(mon, MON_DATA_HP);
maxHP = GetMonData(mon, MON_DATA_MAX_HP); maxHP = GetMonData(mon, MON_DATA_MAX_HP);
barLevel = GetHPBarLevel(hp, maxHP); barLevel = GetHPBarLevel(hp, maxHP);
if (barLevel <= HP_BAR_YELLOW) if (barLevel <= HP_BAR_YELLOW)
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
+1 -1
View File
@@ -676,7 +676,7 @@ static const struct OamData sOamData_MonIconOnLvlUpBanner =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(32x32), .shape = SPRITE_SHAPE(32x32),
.x = 0, .x = 0,
+2 -2
View File
@@ -181,7 +181,7 @@ static void Task_BattleStart(u8 taskId)
case 0: case 0:
if (!FldEffPoison_IsActive()) if (!FldEffPoison_IsActive())
{ {
HelpSystem_Disable(); HelpSystem_Disable();
BT_StartOnField(tTransition); BT_StartOnField(tTransition);
++tState; ++tState;
} }
@@ -189,7 +189,7 @@ static void Task_BattleStart(u8 taskId)
case 1: case 1:
if (BT_IsDone() == TRUE) if (BT_IsDone() == TRUE)
{ {
HelpSystem_Enable(); HelpSystem_Enable();
CleanupOverworldWindowsAndTilemaps(); CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_InitBattle); SetMainCallback2(CB2_InitBattle);
RestartWildEncounterImmunitySteps(); RestartWildEncounterImmunitySteps();
+3 -3
View File
@@ -394,7 +394,7 @@ static const TransitionStateFunc sBT_Phase2WhiteFadeInStripesFuncs[] =
}; };
static const u16 sWhiteStripeDelay[] = { 0, 9, 15, 6, 12, 3 }; static const u16 sWhiteStripeDelay[] = { 0, 9, 15, 6, 12, 3 };
static const TransitionStateFunc sBT_Phase2GridSquaresFuncs[] = static const TransitionStateFunc sBT_Phase2GridSquaresFuncs[] =
{ {
BT_Phase2GridSquares_LoadGfx, BT_Phase2GridSquares_LoadGfx,
@@ -480,7 +480,7 @@ static const struct OamData sOamData_Unused =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(64x64), .shape = SPRITE_SHAPE(64x64),
.x = 0, .x = 0,
@@ -1022,7 +1022,7 @@ static void VBCB_BT_Phase2BigPokeball2(void)
#undef tTheta #undef tTheta
#undef tAmplitude #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) static void BT_Phase2SlidingPokeballs(u8 taskId)
{ {
while (sBT_Phase2SlidingPokeballsFuncs[gTasks[taskId].tState](&gTasks[taskId])); while (sBT_Phase2SlidingPokeballsFuncs[gTasks[taskId].tState](&gTasks[taskId]));
+24 -24
View File
@@ -1,37 +1,37 @@
const u32 gInterfaceGfx_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz"); const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz");
const u32 gInterfacePal_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.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 gBallGfx_Great[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz");
const u32 gInterfacePal_GreatBall[] = INCBIN_U32("graphics/interface/ball/great.gbapal.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 gBallGfx_Safari[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz");
const u32 gInterfacePal_SafariBall[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.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 gBallGfx_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz");
const u32 gInterfacePal_UltraBall[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.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 gBallGfx_Master[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz");
const u32 gInterfacePal_MasterBall[] = INCBIN_U32("graphics/interface/ball/master.gbapal.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 gBallGfx_Net[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz");
const u32 gInterfacePal_NetBall[] = INCBIN_U32("graphics/interface/ball/net.gbapal.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 gBallGfx_Dive[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz");
const u32 gInterfacePal_DiveBall[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.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 gBallGfx_Nest[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz");
const u32 gInterfacePal_NestBall[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.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 gBallGfx_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz");
const u32 gInterfacePal_RepeatBall[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.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 gBallGfx_Timer[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz");
const u32 gInterfacePal_TimerBall[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.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 gBallGfx_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz");
const u32 gInterfacePal_LuxuryBall[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.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 gBallGfx_Premier[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz");
const u32 gInterfacePal_PremierBall[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz"); const u32 gBallPal_Premier[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz");
const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz"); const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz");
+4 -4
View File
@@ -711,7 +711,7 @@ static const struct OamData sOamData_HeldItem =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(8x8), .shape = SPRITE_SHAPE(8x8),
.x = 0, .x = 0,
@@ -767,7 +767,7 @@ static const struct OamData sOamData_MenuPokeball =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(32x32), .shape = SPRITE_SHAPE(32x32),
.x = 0, .x = 0,
@@ -824,7 +824,7 @@ static const struct OamData sOamData_MenuPokeballSmall =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(16x16), .shape = SPRITE_SHAPE(16x16),
.x = 0, .x = 0,
@@ -905,7 +905,7 @@ static const struct OamData sOamData_StatusCondition =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(32x8), .shape = SPRITE_SHAPE(32x8),
.x = 0, .x = 0,
+2 -2
View File
@@ -143,7 +143,7 @@ static const struct OamData sOamData_EggHatch =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(32x32), .shape = SPRITE_SHAPE(32x32),
.x = 0, .x = 0,
@@ -223,7 +223,7 @@ static const struct OamData sOamData_EggShard =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(8x8), .shape = SPRITE_SHAPE(8x8),
.x = 0, .x = 0,
+1 -1
View File
@@ -15,7 +15,7 @@ bool8 SetUpFieldMove_Strength(void)
{ {
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_PUSHABLE_BOULDER) != TRUE) if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_PUSHABLE_BOULDER) != TRUE)
{ {
return FALSE; return FALSE;
} }
else else
{ {
+1 -1
View File
@@ -118,7 +118,7 @@ void STWI_init_Callback_S(void)
STWI_set_Callback_S(NULL); 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) void STWI_set_Callback_M(void *callbackM)
{ {
gSTWIStatus->callbackM = callbackM; gSTWIStatus->callbackM = callbackM;
+1 -1
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++) for (i = 0; i < PLAYER_NAME_LENGTH && gSaveBlock2Ptr->playerName[i] != EOS; i++)
gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i]; gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
for (; i <= 5; 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; gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
+2 -2
View File
@@ -84,7 +84,7 @@ static const struct OamData sOamData_ScrollArrowIndicator =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(16x16), .shape = SPRITE_SHAPE(16x16),
.x = 0, .x = 0,
@@ -224,7 +224,7 @@ static const struct OamData sOamData_RedArrowCursor =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = SPRITE_SHAPE(16x16), .shape = SPRITE_SHAPE(16x16),
.x = 0, .x = 0,
+287 -225
View File
@@ -14,13 +14,34 @@
#include "constants/songs.h" #include "constants/songs.h"
#include "constants/sound.h" #include "constants/sound.h"
#define tFrames data[0] static void Task_DoPokeballSendOutAnim(u8 taskId);
#define tPan data[1] static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite);
#define tThrowId data[2] static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite);
#define tBattler data[3] static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite);
#define tOpponentBattler data[4] 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_POKE_BALL 55000
#define GFX_TAG_GREAT_BALL 55001 #define GFX_TAG_GREAT_BALL 55001
@@ -35,68 +56,36 @@
#define GFX_TAG_LUXURY_BALL 55010 #define GFX_TAG_LUXURY_BALL 55010
#define GFX_TAG_PREMIER_BALL 55011 #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] = const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] =
{ {
{gInterfaceGfx_PokeBall, 384, GFX_TAG_POKE_BALL}, [BALL_POKE] = {gBallGfx_Poke, 384, GFX_TAG_POKE_BALL},
{gInterfaceGfx_GreatBall, 384, GFX_TAG_GREAT_BALL}, [BALL_GREAT] = {gBallGfx_Great, 384, GFX_TAG_GREAT_BALL},
{gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARI_BALL}, [BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARI_BALL},
{gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRA_BALL}, [BALL_ULTRA] = {gBallGfx_Ultra, 384, GFX_TAG_ULTRA_BALL},
{gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTER_BALL}, [BALL_MASTER] = {gBallGfx_Master, 384, GFX_TAG_MASTER_BALL},
{gInterfaceGfx_NetBall, 384, GFX_TAG_NET_BALL}, [BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NET_BALL},
{gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVE_BALL}, [BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVE_BALL},
{gInterfaceGfx_NestBall, 384, GFX_TAG_NEST_BALL}, [BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NEST_BALL},
{gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEAT_BALL}, [BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEAT_BALL},
{gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMER_BALL}, [BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMER_BALL},
{gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURY_BALL}, [BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURY_BALL},
{gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIER_BALL}, [BALL_PREMIER] = {gBallGfx_Premier, 384, GFX_TAG_PREMIER_BALL},
}; };
const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] = const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] =
{ {
{gInterfacePal_PokeBall, GFX_TAG_POKE_BALL}, [BALL_POKE] = {gBallPal_Poke, GFX_TAG_POKE_BALL},
{gInterfacePal_GreatBall, GFX_TAG_GREAT_BALL}, [BALL_GREAT] = {gBallPal_Great, GFX_TAG_GREAT_BALL},
{gInterfacePal_SafariBall, GFX_TAG_SAFARI_BALL}, [BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARI_BALL},
{gInterfacePal_UltraBall, GFX_TAG_ULTRA_BALL}, [BALL_ULTRA] = {gBallPal_Ultra, GFX_TAG_ULTRA_BALL},
{gInterfacePal_MasterBall, GFX_TAG_MASTER_BALL}, [BALL_MASTER] = {gBallPal_Master, GFX_TAG_MASTER_BALL},
{gInterfacePal_NetBall, GFX_TAG_NET_BALL}, [BALL_NET] = {gBallPal_Net, GFX_TAG_NET_BALL},
{gInterfacePal_DiveBall, GFX_TAG_DIVE_BALL}, [BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVE_BALL},
{gInterfacePal_NestBall, GFX_TAG_NEST_BALL}, [BALL_NEST] = {gBallPal_Nest, GFX_TAG_NEST_BALL},
{gInterfacePal_RepeatBall, GFX_TAG_REPEAT_BALL}, [BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEAT_BALL},
{gInterfacePal_TimerBall, GFX_TAG_TIMER_BALL}, [BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMER_BALL},
{gInterfacePal_LuxuryBall, GFX_TAG_LUXURY_BALL}, [BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURY_BALL},
{gInterfacePal_PremierBall, GFX_TAG_PREMIER_BALL}, [BALL_PREMIER] = {gBallPal_Premier, GFX_TAG_PREMIER_BALL},
}; };
static const struct OamData sBallOamData = static const struct OamData sBallOamData =
@@ -171,171 +160,192 @@ static const union AnimCmd *const sBallAnimSequences[] =
sBallAnimSeq6, sBallAnimSeq6,
}; };
static const union AffineAnimCmd sBallAffineAnimSeq0[] = static const union AffineAnimCmd sAffineAnim_BallRotate_0[] =
{ {
AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_FRAME(0, 0, 0, 1),
AFFINEANIMCMD_JUMP(0), AFFINEANIMCMD_JUMP(0),
}; };
static const union AffineAnimCmd sBallAffineAnimSeq1[] = static const union AffineAnimCmd sAffineAnim_BallRotate_Right[] =
{ {
AFFINEANIMCMD_FRAME(0, 0, -3, 1), AFFINEANIMCMD_FRAME(0, 0, -3, 1),
AFFINEANIMCMD_JUMP(0), AFFINEANIMCMD_JUMP(0),
}; };
static const union AffineAnimCmd sBallAffineAnimSeq2[] = static const union AffineAnimCmd sAffineAnim_BallRotate_Left[] =
{ {
AFFINEANIMCMD_FRAME(0, 0, 3, 1), AFFINEANIMCMD_FRAME(0, 0, 3, 1),
AFFINEANIMCMD_JUMP(0), AFFINEANIMCMD_JUMP(0),
}; };
static const union AffineAnimCmd sBallAffineAnimSeq3[] = static const union AffineAnimCmd sAffineAnim_BallRotate_3[] =
{ {
AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd sBallAffineAnimSeq4[] = static const union AffineAnimCmd sAffineAnim_BallRotate_4[] =
{ {
AFFINEANIMCMD_FRAME(0, 0, 25, 1), AFFINEANIMCMD_FRAME(0, 0, 25, 1),
AFFINEANIMCMD_JUMP(0), AFFINEANIMCMD_JUMP(0),
}; };
static const union AffineAnimCmd *const sBallAffineAnimSequences[] = static const union AffineAnimCmd *const sAffineAnim_BallRotate[] =
{ {
sBallAffineAnimSeq0, [BALL_AFFINE_ANIM_0] = sAffineAnim_BallRotate_0,
sBallAffineAnimSeq1, [BALL_ROTATE_RIGHT] = sAffineAnim_BallRotate_Right,
sBallAffineAnimSeq2, [BALL_ROTATE_LEFT] = sAffineAnim_BallRotate_Left,
sBallAffineAnimSeq3, [BALL_AFFINE_ANIM_3] = sAffineAnim_BallRotate_3,
sBallAffineAnimSeq4, [BALL_AFFINE_ANIM_4] = sAffineAnim_BallRotate_4,
}; };
const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
{ {
[BALL_POKE] =
{ {
.tileTag = GFX_TAG_POKE_BALL, .tileTag = GFX_TAG_POKE_BALL,
.paletteTag = GFX_TAG_POKE_BALL, .paletteTag = GFX_TAG_POKE_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_GREAT] =
{ {
.tileTag = GFX_TAG_GREAT_BALL, .tileTag = GFX_TAG_GREAT_BALL,
.paletteTag = GFX_TAG_GREAT_BALL, .paletteTag = GFX_TAG_GREAT_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_SAFARI] =
{ {
.tileTag = GFX_TAG_SAFARI_BALL, .tileTag = GFX_TAG_SAFARI_BALL,
.paletteTag = GFX_TAG_SAFARI_BALL, .paletteTag = GFX_TAG_SAFARI_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_ULTRA] =
{ {
.tileTag = GFX_TAG_ULTRA_BALL, .tileTag = GFX_TAG_ULTRA_BALL,
.paletteTag = GFX_TAG_ULTRA_BALL, .paletteTag = GFX_TAG_ULTRA_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_MASTER] =
{ {
.tileTag = GFX_TAG_MASTER_BALL, .tileTag = GFX_TAG_MASTER_BALL,
.paletteTag = GFX_TAG_MASTER_BALL, .paletteTag = GFX_TAG_MASTER_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_NET] =
{ {
.tileTag = GFX_TAG_NET_BALL, .tileTag = GFX_TAG_NET_BALL,
.paletteTag = GFX_TAG_NET_BALL, .paletteTag = GFX_TAG_NET_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_DIVE] =
{ {
.tileTag = GFX_TAG_DIVE_BALL, .tileTag = GFX_TAG_DIVE_BALL,
.paletteTag = GFX_TAG_DIVE_BALL, .paletteTag = GFX_TAG_DIVE_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_NEST] =
{ {
.tileTag = GFX_TAG_NEST_BALL, .tileTag = GFX_TAG_NEST_BALL,
.paletteTag = GFX_TAG_NEST_BALL, .paletteTag = GFX_TAG_NEST_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_REPEAT] =
{ {
.tileTag = GFX_TAG_REPEAT_BALL, .tileTag = GFX_TAG_REPEAT_BALL,
.paletteTag = GFX_TAG_REPEAT_BALL, .paletteTag = GFX_TAG_REPEAT_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_TIMER] =
{ {
.tileTag = GFX_TAG_TIMER_BALL, .tileTag = GFX_TAG_TIMER_BALL,
.paletteTag = GFX_TAG_TIMER_BALL, .paletteTag = GFX_TAG_TIMER_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_LUXURY] =
{ {
.tileTag = GFX_TAG_LUXURY_BALL, .tileTag = GFX_TAG_LUXURY_BALL,
.paletteTag = GFX_TAG_LUXURY_BALL, .paletteTag = GFX_TAG_LUXURY_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .callback = SpriteCB_BallThrow,
}, },
[BALL_PREMIER] =
{ {
.tileTag = GFX_TAG_PREMIER_BALL, .tileTag = GFX_TAG_PREMIER_BALL,
.paletteTag = GFX_TAG_PREMIER_BALL, .paletteTag = GFX_TAG_PREMIER_BALL,
.oam = &sBallOamData, .oam = &sBallOamData,
.anims = sBallAnimSequences, .anims = sBallAnimSequences,
.images = NULL, .images = NULL,
.affineAnims = sBallAffineAnimSequences, .affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_TestBallThrow, .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 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow)
{ {
u8 taskId; u8 taskId;
gDoingBattleAnim = TRUE; gDoingBattleAnim = TRUE;
gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive = TRUE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive = TRUE;
taskId = CreateTask(Task_DoPokeballSendOutAnim, 5); taskId = CreateTask(Task_DoPokeballSendOutAnim, 5);
gTasks[taskId].tPan = pan; gTasks[taskId].tPan = pan;
gTasks[taskId].tThrowId = kindOfThrow; gTasks[taskId].tThrowId = kindOfThrow;
gTasks[taskId].tBattler = gActiveBattler; gTasks[taskId].tBattler = gActiveBattler;
return 0; return 0;
} }
#define sBattler data[6]
static void Task_DoPokeballSendOutAnim(u8 taskId) static void Task_DoPokeballSendOutAnim(u8 taskId)
{ {
u16 throwCaseId; u16 throwCaseId;
@@ -362,12 +372,12 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
ballId = ItemIdToBallId(itemId); ballId = ItemIdToBallId(itemId);
LoadBallGfx(ballId); LoadBallGfx(ballId);
if (gBattleTypeFlags & BATTLE_TYPE_LINK) if (gBattleTypeFlags & BATTLE_TYPE_LINK)
gender = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].gender; gender = gLinkPlayers[GetBattlerMultiplayerId(battlerId)].gender;
else else
gender = gSaveBlock2Ptr->playerGender; gender = gSaveBlock2Ptr->playerGender;
ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29); ballSpriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29);
gSprites[ballSpriteId].data[0] = 0x80; gSprites[ballSpriteId].data[0] = 0x80;
gSprites[ballSpriteId].data[1] = 0; gSprites[ballSpriteId].data[1] = 0;
@@ -387,7 +397,7 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
x = 48; x = 48;
y = 70; y = 70;
} }
gBattlerTarget = battlerId; gBattlerTarget = battlerId;
gSprites[ballSpriteId].x = x; gSprites[ballSpriteId].x = x;
gSprites[ballSpriteId].y = y; gSprites[ballSpriteId].y = y;
@@ -425,7 +435,10 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
PlaySE(SE_BALL_THROW); 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)) if (TranslateAnimHorizontalArc(sprite))
{ {
@@ -442,7 +455,7 @@ static void SpriteCB_TestBallThrow(struct Sprite *sprite)
sprite->y2 = 0; sprite->y2 = 0;
sprite->data[5] = 0; sprite->data[5] = 0;
ballId = ItemIdToBallId(GetBattlerPokeballItemId(opponentBattler)); 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->data[0] = LaunchBallFadeMonTask(FALSE, opponentBattler, 14, ballId);
sprite->sBattler = opponentBattler; sprite->sBattler = opponentBattler;
sprite->data[7] = noOfShakes; sprite->data[7] = noOfShakes;
@@ -468,7 +481,7 @@ static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite)
{ {
sprite->data[5] = 0; sprite->data[5] = 0;
sprite->callback = SpriteCB_BallThrow_ShrinkMon; sprite->callback = SpriteCB_BallThrow_ShrinkMon;
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 2); StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_RETURN);
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0; gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0;
} }
@@ -479,7 +492,7 @@ static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite)
sprite->data[5]++; sprite->data[5]++;
if (sprite->data[5] == 11) if (sprite->data[5] == 11)
PlaySE(SE_BALL_TRADE); PlaySE(SE_BALL_TRADE);
if (gSprites[gBattlerSpriteIds[sprite->sBattler]].affineAnimEnded) if (gSprites[gBattlerSpriteIds[sprite->sBattler]].affineAnimEnded)
{ {
StartSpriteAnim(sprite, 2); StartSpriteAnim(sprite, 2);
@@ -649,7 +662,7 @@ static void SpriteCB_BallThrow_Shake(struct Sprite *sprite)
StartSpriteAffineAnim(sprite, 2); StartSpriteAffineAnim(sprite, 2);
else else
StartSpriteAffineAnim(sprite, 1); StartSpriteAffineAnim(sprite, 1);
PlaySE(SE_BALL); PlaySE(SE_BALL);
} }
break; break;
@@ -666,10 +679,10 @@ static void SpriteCB_BallThrow_Shake(struct Sprite *sprite)
static void Task_PlayCryWhenReleasedFromBall(u8 taskId) static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
{ {
u8 state2 = gTasks[taskId].data[2]; u8 wantedCry = gTasks[taskId].tCryTaskWantedCry;
s8 pan = gTasks[taskId].tCryTaskPan; s8 pan = gTasks[taskId].tCryTaskPan;
u16 species = gTasks[taskId].tCryTaskSpecies; 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) switch (gTasks[taskId].tCryTaskState)
{ {
@@ -678,14 +691,15 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
if (gTasks[taskId].data[8] < 3) if (gTasks[taskId].data[8] < 3)
gTasks[taskId].data[8]++; gTasks[taskId].data[8]++;
else else
gTasks[taskId].tCryTaskState = state2 + 1; gTasks[taskId].tCryTaskState = wantedCry + 1;
break; break;
case 1: case 1:
if (ShouldPlayNormalPokeCry(mon) == TRUE) // Play single cry
if (ShouldPlayNormalMonCry(mon) == TRUE)
PlayCry_ByMode(species, pan, CRY_MODE_NORMAL); PlayCry_ByMode(species, pan, CRY_MODE_NORMAL);
else else
PlayCry_ByMode(species, pan, CRY_MODE_WEAK); PlayCry_ByMode(species, pan, CRY_MODE_WEAK);
DestroyTask(taskId); DestroyTask(taskId);
break; break;
case 2: case 2:
@@ -696,10 +710,11 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
case 20: case 20:
if (gTasks[taskId].tCryTaskFrames == 0) if (gTasks[taskId].tCryTaskFrames == 0)
{ {
if (ShouldPlayNormalPokeCry(mon) == TRUE) // Play first doubles cry
PlayCry_ReleaseDouble(species, pan, 1); if (ShouldPlayNormalMonCry(mon) == TRUE)
PlayCry_ReleaseDouble(species, pan, CRY_MODE_DOUBLES);
else else
PlayCry_ReleaseDouble(species, pan, 12); PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK_DOUBLES);
DestroyTask(taskId); DestroyTask(taskId);
} }
@@ -719,6 +734,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
break; break;
} }
gTasks[taskId].tCryTaskState++; gTasks[taskId].tCryTaskState++;
// fall through
case 31: case 31:
if (!IsCryPlayingOrClearCrySongs()) if (!IsCryPlayingOrClearCrySongs())
{ {
@@ -733,11 +749,11 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId)
gTasks[taskId].tCryTaskFrames--; gTasks[taskId].tCryTaskFrames--;
break; break;
} }
// Play second doubles cry
if (ShouldPlayNormalPokeCry(mon) == TRUE) if (ShouldPlayNormalMonCry(mon) == TRUE)
PlayCry_ReleaseDouble(species, pan, 0); PlayCry_ReleaseDouble(species, pan, CRY_MODE_NORMAL);
else else
PlayCry_ReleaseDouble(species, pan, 11); PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK);
DestroyTask(taskId); DestroyTask(taskId);
break; break;
@@ -751,8 +767,8 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
StartSpriteAnim(sprite, 1); StartSpriteAnim(sprite, 1);
ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId)); ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId));
LaunchBallStarsTask(sprite->x, sprite->y - 5, 1, 0x1C, ballId); AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId);
sprite->data[0] = LaunchBallFadeMonTask(1, sprite->sBattler, 14, ballId); sprite->data[0] = LaunchBallFadeMonTask(TRUE, sprite->sBattler, 14, ballId);
sprite->callback = HandleBallAnimEnd; sprite->callback = HandleBallAnimEnd;
if (gMain.inBattle) if (gMain.inBattle)
@@ -776,7 +792,7 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
species = GetMonData(mon, MON_DATA_SPECIES); species = GetMonData(mon, MON_DATA_SPECIES);
if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) 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) 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; wantedCryCase = 0;
else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
wantedCryCase = 1; wantedCryCase = 1;
else else
wantedCryCase = 2; wantedCryCase = 2;
taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3); taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3);
gTasks[taskId].tCryTaskSpecies = species; gTasks[taskId].tCryTaskSpecies = species;
gTasks[taskId].tCryTaskPan = pan; gTasks[taskId].tCryTaskPan = pan;
gTasks[taskId].tCryTaskWantedCry = wantedCryCase; gTasks[taskId].tCryTaskWantedCry = wantedCryCase;
gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 0x10; gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 16;
gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon); gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon);
gTasks[taskId].tCryTaskState = 0; gTasks[taskId].tCryTaskState = 0;
} }
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 1); StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_EMERGE);
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000; gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0x1000;
} }
@@ -837,7 +853,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
sprite->invisible = TRUE; sprite->invisible = TRUE;
if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded) if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded)
{ {
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0); StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], BATTLER_AFFINE_NORMAL);
affineAnimEnded = TRUE; affineAnimEnded = TRUE;
} }
else else
@@ -857,7 +873,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
for (doneBattlers = 0, i = 0; i < MAX_BATTLERS_COUNT; i++) for (doneBattlers = 0, i = 0; i < MAX_BATTLERS_COUNT; i++)
{ {
if (!gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive) if (gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive == FALSE)
doneBattlers++; doneBattlers++;
} }
if (doneBattlers == MAX_BATTLERS_COUNT) 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) static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite)
{ {
sprite->data[0] = 25; sprite->data[0] = 25;
sprite->data[2] = GetBattlerSpriteCoord(sprite->sBattler, 2); sprite->data[2] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, 3) + 24; sprite->data[4] = GetBattlerSpriteCoord(sprite->sBattler, BATTLER_COORD_Y_PIC_OFFSET) + 24;
sprite->data[5] = -30; sprite->data[5] = -30;
sprite->oam.affineParam = sprite->sBattler; sprite->oam.affineParam = sprite->sBattler;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
@@ -946,11 +962,12 @@ static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite)
{ {
sprite->x += sprite->x2; sprite->x += sprite->x2;
sprite->y += sprite->y2; sprite->y += sprite->y2;
sprite->x2 = sprite->y2 = 0; sprite->y2 = 0;
sprite->x2 = 0;
sprite->sBattler = sprite->oam.affineParam & 0xFF; sprite->sBattler = sprite->oam.affineParam & 0xFF;
sprite->data[0] = 0; sprite->data[0] = 0;
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->healthboxSlideInStarted if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive
&& sprite->sBattler == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)) && sprite->sBattler == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))
sprite->callback = SpriteCB_ReleaseMon2FromBall; sprite->callback = SpriteCB_ReleaseMon2FromBall;
else else
@@ -976,7 +993,7 @@ static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite)
if (sprite->data[0] > 15) if (sprite->data[0] > 15)
{ {
sprite->data[0] = 0; sprite->data[0] = 0;
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->healthboxSlideInStarted if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive
&& sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))
sprite->callback = SpriteCB_ReleaseMon2FromBall; sprite->callback = SpriteCB_ReleaseMon2FromBall;
else else
@@ -986,121 +1003,144 @@ static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite)
#undef sBattler #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; u8 spriteId;
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]); LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subpriortiy); spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subpriortiy);
gSprites[spriteId].data[0] = monSpriteId;
gSprites[spriteId].data[5] = gSprites[monSpriteId].x; gSprites[spriteId].sMonSpriteId = monSpriteId;
gSprites[spriteId].data[6] = gSprites[monSpriteId].y; gSprites[spriteId].sFinalMonX = gSprites[monSpriteId].x;
gSprites[spriteId].sFinalMonY = gSprites[monSpriteId].y;
gSprites[monSpriteId].x = x; gSprites[monSpriteId].x = x;
gSprites[monSpriteId].y = y; gSprites[monSpriteId].y = y;
gSprites[spriteId].data[1] = g;
gSprites[spriteId].data[2] = battlerId; gSprites[spriteId].sDelay = delay;
gSprites[spriteId].data[3] = h; gSprites[spriteId].sMonPalNum = monPalNum;
gSprites[spriteId].data[4] = h >> 0x10; gSprites[spriteId].sFadePalsLo = fadePalettes;
gSprites[spriteId].sFadePalsHi = fadePalettes >> 16;
gSprites[spriteId].oam.priority = oamPriority; gSprites[spriteId].oam.priority = oamPriority;
gSprites[spriteId].callback = SpriteCB_PokeballReleaseMon; gSprites[spriteId].callback = SpriteCB_PokeballReleaseMon;
gSprites[monSpriteId].invisible = TRUE; gSprites[monSpriteId].invisible = TRUE;
} }
static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite) static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite)
{ {
if (sprite->data[1] == 0) if (sprite->sDelay == 0)
{ {
u8 r5; u8 subpriority;
u8 r7 = sprite->data[0]; u8 spriteId = sprite->sMonSpriteId;
u8 battlerId = sprite->data[2]; u8 monPalNum = sprite->sMonPalNum;
u32 r4 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16); u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16);
if (sprite->subpriority != 0) if (sprite->subpriority != 0)
r5 = sprite->subpriority - 1; subpriority = sprite->subpriority - 1;
else else
r5 = 0; subpriority = 0;
StartSpriteAnim(sprite, 1); StartSpriteAnim(sprite, 1);
LaunchBallStarsTaskForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, r5); AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority);
sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, battlerId, r4); // sDelay re-used to store task id but never read
sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes);
sprite->callback = SpriteCB_ReleasedMonFlyOut; sprite->callback = SpriteCB_ReleasedMonFlyOut;
gSprites[r7].invisible = FALSE; gSprites[spriteId].invisible = FALSE;
StartSpriteAffineAnim(&gSprites[r7], 1); StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_EMERGE);
AnimateSprite(&gSprites[r7]); AnimateSprite(&gSprites[spriteId]);
gSprites[r7].data[1] = 0x1000; gSprites[spriteId].data[1] = 0x1000;
sprite->data[7] = 0; sprite->sTrigIdx = 0;
} }
else else
{ {
sprite->data[1]--; sprite->sDelay--;
} }
} }
static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite) static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite)
{ {
bool8 r12 = FALSE; bool8 emergeAnimFinished = FALSE;
bool8 r6 = FALSE; bool8 atFinalPosition = FALSE;
u8 monSpriteId = sprite->data[0]; u8 monSpriteId = sprite->sMonSpriteId;
u16 var1; u16 x, y;
u16 var2;
if (sprite->animEnded) if (sprite->animEnded)
sprite->invisible = TRUE; sprite->invisible = TRUE;
if (gSprites[monSpriteId].affineAnimEnded) if (gSprites[monSpriteId].affineAnimEnded)
{ {
StartSpriteAffineAnim(&gSprites[monSpriteId], 0); StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_NORMAL);
r12 = TRUE; 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].x2 = sine;
gSprites[monSpriteId].y2 = sine; gSprites[monSpriteId].y2 = sine;
} }
else else
{ {
gSprites[monSpriteId].x = sprite->data[5]; gSprites[monSpriteId].x = sprite->sFinalMonX;
gSprites[monSpriteId].y = sprite->data[6]; gSprites[monSpriteId].y = sprite->sFinalMonY;
gSprites[monSpriteId].x2 = 0; gSprites[monSpriteId].x2 = 0;
gSprites[monSpriteId].y2 = 0; gSprites[monSpriteId].y2 = 0;
r6 = TRUE; atFinalPosition = TRUE;
} }
if (sprite->animEnded && emergeAnimFinished && atFinalPosition)
if (sprite->animEnded && r12 && r6) {
DestroySpriteAndFreeResources(sprite); 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; u8 spriteId;
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[0]); LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[BALL_POKE]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[0]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[BALL_POKE]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, subPriority); spriteId = CreateSprite(&gBallSpriteTemplates[BALL_POKE], x, y, subPriority);
gSprites[spriteId].data[0] = a; gSprites[spriteId].sMonSpriteId = monSpriteId;
gSprites[spriteId].data[1] = g; gSprites[spriteId].sDelay = delay;
gSprites[spriteId].data[2] = b; gSprites[spriteId].sMonPalNum = monPalNum;
gSprites[spriteId].data[3] = h; gSprites[spriteId].sFadePalsLo = fadePalettes;
gSprites[spriteId].data[4] = h >> 16; gSprites[spriteId].sFadePalsHi = fadePalettes >> 16;
gSprites[spriteId].oam.priority = oamPriority; gSprites[spriteId].oam.priority = oamPriority;
gSprites[spriteId].callback = SpriteCB_TradePokeball; gSprites[spriteId].callback = SpriteCB_TradePokeball;
return spriteId; 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) static void SpriteCB_TradePokeball(struct Sprite *sprite)
{ {
if (sprite->data[1] == 0) if (sprite->sDelay == 0)
{ {
u8 r6; u8 subpriority;
u8 r7 = sprite->data[0]; u8 monSpriteId = sprite->sMonSpriteId;
u8 r8 = sprite->data[2]; u8 monPalNum = sprite->sMonPalNum;
u32 r5 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16); u32 selectedPalettes = (u16)sprite->sFadePalsLo | ((u16)sprite->sFadePalsHi << 16);
if (sprite->subpriority != 0) if (sprite->subpriority != 0)
r6 = sprite->subpriority - 1; subpriority = sprite->subpriority - 1;
else else
r6 = 0; subpriority = 0;
StartSpriteAnim(sprite, 1); StartSpriteAnim(sprite, 1);
LaunchBallStarsTaskForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, r6); AnimateBallOpenParticlesForPokeball(sprite->x, sprite->y - 5, sprite->oam.priority, subpriority);
sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, r8, r5); // sDelay re-used to store task id but never read
sprite->sDelay = LaunchBallFadeMonTaskForPokeball(TRUE, monPalNum, selectedPalettes);
sprite->callback = SpriteCB_TradePokeballSendOff; sprite->callback = SpriteCB_TradePokeballSendOff;
StartSpriteAffineAnim(&gSprites[r7], 2); #ifdef BUGFIX
AnimateSprite(&gSprites[r7]); // FIX: If this is used on a sprite that has previously had an affine animation, it will not
gSprites[r7].data[1] = 0; // 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 else
{ {
sprite->data[1]--; sprite->sDelay--;
} }
} }
@@ -1138,16 +1184,16 @@ static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite)
{ {
u8 monSpriteId; u8 monSpriteId;
sprite->data[5]++; sprite->sTimer++;
if (sprite->data[5] == 11) if (sprite->sTimer == 11)
PlaySE(SE_BALL_TRADE); PlaySE(SE_BALL_TRADE);
monSpriteId = sprite->data[0]; monSpriteId = sprite->sMonSpriteId;
if (gSprites[monSpriteId].affineAnimEnded) if (gSprites[monSpriteId].affineAnimEnded)
{ {
StartSpriteAnim(sprite, 2); StartSpriteAnim(sprite, 2);
gSprites[monSpriteId].invisible = TRUE; gSprites[monSpriteId].invisible = TRUE;
sprite->data[5] = 0; sprite->sTimer = 0;
sprite->callback = SpriteCB_TradePokeballEnd; sprite->callback = SpriteCB_TradePokeballEnd;
} }
else else
@@ -1163,28 +1209,40 @@ static void SpriteCB_TradePokeballEnd(struct Sprite *sprite)
sprite->callback = SpriteCallbackDummy; 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); DestroySpriteAndFreeResources(sprite);
} }
#define sSpeedX data[0]
#define sSpeedY data[1]
#define sDelayTimer data[1]
void StartHealthboxSlideIn(u8 battlerId) void StartHealthboxSlideIn(u8 battlerId)
{ {
struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]]; struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]];
healthboxSprite->data[0] = 5; healthboxSprite->sSpeedX = 5;
healthboxSprite->data[1] = 0; healthboxSprite->sSpeedY = 0;
healthboxSprite->x2 = 0x73; healthboxSprite->x2 = 0x73;
healthboxSprite->y2 = 0; healthboxSprite->y2 = 0;
healthboxSprite->callback = SpriteCB_HealthboxSlideIn; healthboxSprite->callback = SpriteCB_HealthboxSlideIn;
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
{ {
healthboxSprite->data[0] = -healthboxSprite->data[0]; healthboxSprite->sSpeedX = -healthboxSprite->sSpeedX;
healthboxSprite->data[1] = -healthboxSprite->data[1]; healthboxSprite->sSpeedY = -healthboxSprite->sSpeedY;
healthboxSprite->x2 = -healthboxSprite->x2; healthboxSprite->x2 = -healthboxSprite->x2;
healthboxSprite->y2 = -healthboxSprite->y2; healthboxSprite->y2 = -healthboxSprite->y2;
} }
gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]); gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]);
if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT) if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT)
healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed; healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed;
@@ -1192,22 +1250,26 @@ void StartHealthboxSlideIn(u8 battlerId)
static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite) static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite)
{ {
sprite->data[1]++; sprite->sDelayTimer++;
if (sprite->data[1] == 20) if (sprite->sDelayTimer == 20)
{ {
sprite->data[1] = 0; sprite->sDelayTimer = 0;
sprite->callback = SpriteCB_HealthboxSlideIn; sprite->callback = SpriteCB_HealthboxSlideIn;
} }
} }
static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite) static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite)
{ {
sprite->x2 -= sprite->data[0]; sprite->x2 -= sprite->sSpeedX;
sprite->y2 -= sprite->data[1]; sprite->y2 -= sprite->sSpeedY;
if (sprite->x2 == 0 && sprite->y2 == 0) if (sprite->x2 == 0 && sprite->y2 == 0)
sprite->callback = SpriteCallbackDummy; sprite->callback = SpriteCallbackDummy;
} }
#undef sSpeedX
#undef sSpeedY
#undef sDelayTimer
void DoHitAnimHealthboxEffect(u8 battlerId) void DoHitAnimHealthboxEffect(u8 battlerId)
{ {
u8 spriteId; u8 spriteId;
@@ -1242,7 +1304,7 @@ void LoadBallGfx(u8 ballId)
LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[ballId]); LoadCompressedSpriteSheetUsingHeap(&gBallSpriteSheets[ballId]);
LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[ballId]); LoadCompressedSpritePaletteUsingHeap(&gBallSpritePalettes[ballId]);
} }
switch (ballId) switch (ballId)
{ {
case BALL_DIVE: case BALL_DIVE:
@@ -1251,7 +1313,7 @@ void LoadBallGfx(u8 ballId)
break; break;
default: default:
var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag);
LZDecompressVram(gOpenPokeballGfx, (void *)(VRAM + 0x10100 + var * 32)); LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32));
break; break;
} }
} }
+1 -1
View File
@@ -1667,7 +1667,7 @@ static const struct OamData sOakSpeechNidoranFDummyOamData =
.y = 0, .y = 0,
.affineMode = 0, .affineMode = 0,
.objMode = 0, .objMode = 0,
.mosaic = 0, .mosaic = FALSE,
.bpp = 0, .bpp = 0,
.shape = 0, .shape = 0,
.x = 0, .x = 0,
+5 -5
View File
@@ -3859,7 +3859,7 @@ static const struct OamData sOamData_JumpMon =
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL, .objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0, .mosaic = FALSE,
.bpp = ST_OAM_4BPP, .bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(64x64), .shape = SPRITE_SHAPE(64x64),
.x = 0, .x = 0,
@@ -3876,7 +3876,7 @@ static const struct OamData sOamData_Vine16x32 =
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL, .objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0, .mosaic = FALSE,
.bpp = ST_OAM_4BPP, .bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x32), .shape = SPRITE_SHAPE(16x32),
.x = 0, .x = 0,
@@ -3893,7 +3893,7 @@ static const struct OamData sOamData_Vine32x32 =
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL, .objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0, .mosaic = FALSE,
.bpp = ST_OAM_4BPP, .bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x32), .shape = SPRITE_SHAPE(32x32),
.x = 0, .x = 0,
@@ -3910,7 +3910,7 @@ static const struct OamData sOamData_Vine32x16 =
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL, .objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0, .mosaic = FALSE,
.bpp = ST_OAM_4BPP, .bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x16), .shape = SPRITE_SHAPE(32x16),
.x = 0, .x = 0,
@@ -4064,7 +4064,7 @@ static const struct OamData sOamData_Star =
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL, .objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0, .mosaic = FALSE,
.bpp = ST_OAM_4BPP, .bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16), .shape = SPRITE_SHAPE(16x16),
.x = 0, .x = 0,
+3 -2
View File
@@ -4133,7 +4133,8 @@ static void ShowOrHideBallIconObj(u8 invisible)
static void DestroyBallIconObj(void) 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) static void PokeSum_CreateMonIconSprite(void)
@@ -5181,7 +5182,7 @@ static void PokeSum_TryPlayMonCry(void)
{ {
if (!GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_IS_EGG)) 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); PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES2), 0, CRY_MODE_NORMAL);
else else
PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES2), 0, CRY_MODE_WEAK); PlayCry_ByMode(GetMonData(&sMonSummaryScreen->currentMon, MON_DATA_SPECIES2), 0, CRY_MODE_WEAK);
+1 -1
View File
@@ -566,7 +566,7 @@ static const struct OamData sOamData_Emoticons = {
.y = 0, .y = 0,
.affineMode = ST_OAM_AFFINE_OFF, .affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL, .objMode = ST_OAM_OBJ_NORMAL,
.mosaic = 0, .mosaic = FALSE,
.bpp = ST_OAM_4BPP, .bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16), .shape = SPRITE_SHAPE(16x16),
.x = 0, .x = 0,