Merge branch 'master' of github.com:pret/pokeemerald into battle_engine_sync
This commit is contained in:
commit
0312c5be8b
477 files changed
+10069
-9551
No files matched your search
+265
-172
@@ -20,23 +20,21 @@
|
||||
|
||||
extern const struct OamData gOamData_AffineNormal_ObjNormal_64x64;
|
||||
|
||||
static void sub_80A6FB4(struct Sprite *sprite);
|
||||
static void AnimTranslateLinear_WithFollowup_SetCornerVecX(struct Sprite *sprite);
|
||||
static void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite);
|
||||
static void AnimThrowProjectile_Step(struct Sprite *sprite);
|
||||
static void sub_80A8DFC(struct Sprite *sprite);
|
||||
static void AnimBattlerTrace(struct Sprite *sprite);
|
||||
static void AnimWeatherBallUp_Step(struct Sprite *sprite);
|
||||
static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId);
|
||||
static void AnimTask_BlendPalInAndOutSetup(struct Task *task);
|
||||
static void AnimTask_AlphaFadeIn_Step(u8 taskId);
|
||||
static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId);
|
||||
static void AnimTask_BlendMonInAndOut_Step(u8 taskId);
|
||||
static bool8 sub_80A7238(void);
|
||||
static void sub_80A8D78(struct Task *task, u8 taskId);
|
||||
static bool8 ShouldRotScaleSpeciesBeFlipped(void);
|
||||
static void CreateBattlerTrace(struct Task *task, u8 taskId);
|
||||
|
||||
// EWRAM vars
|
||||
EWRAM_DATA static union AffineAnimCmd *gAnimTaskAffineAnim = NULL;
|
||||
EWRAM_DATA static union AffineAnimCmd *sAnimTaskAffineAnim = NULL;
|
||||
|
||||
// Const rom data
|
||||
static const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] =
|
||||
{
|
||||
{ // Single battle
|
||||
@@ -56,10 +54,10 @@ static const struct UCoords8 sBattlerCoords[][MAX_BATTLERS_COUNT] =
|
||||
// One entry for each of the four Castform forms.
|
||||
const struct MonCoords gCastformFrontSpriteCoords[NUM_CASTFORM_FORMS] =
|
||||
{
|
||||
[CASTFORM_NORMAL] = { .size = 0x44, .y_offset = 17 },
|
||||
[CASTFORM_FIRE] = { .size = 0x66, .y_offset = 9 },
|
||||
[CASTFORM_WATER] = { .size = 0x46, .y_offset = 9 },
|
||||
[CASTFORM_ICE] = { .size = 0x86, .y_offset = 8 },
|
||||
[CASTFORM_NORMAL] = { .size = MON_COORDS_SIZE(32, 32), .y_offset = 17 },
|
||||
[CASTFORM_FIRE] = { .size = MON_COORDS_SIZE(48, 48), .y_offset = 9 },
|
||||
[CASTFORM_WATER] = { .size = MON_COORDS_SIZE(32, 48), .y_offset = 9 },
|
||||
[CASTFORM_ICE] = { .size = MON_COORDS_SIZE(64, 48), .y_offset = 8 },
|
||||
};
|
||||
|
||||
static const u8 sCastformElevations[NUM_CASTFORM_FORMS] =
|
||||
@@ -285,8 +283,8 @@ u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3)
|
||||
{
|
||||
if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
|
||||
y += 8;
|
||||
if (y > 104)
|
||||
y = 104;
|
||||
if (y > DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8)
|
||||
y = DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8;
|
||||
}
|
||||
return y;
|
||||
}
|
||||
@@ -383,7 +381,7 @@ u8 GetAnimBattlerSpriteId(u8 animBattler)
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0xff;
|
||||
return SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
else if (animBattler == ANIM_TARGET)
|
||||
@@ -395,13 +393,13 @@ u8 GetAnimBattlerSpriteId(u8 animBattler)
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0xff;
|
||||
return SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
else if (animBattler == ANIM_ATK_PARTNER)
|
||||
{
|
||||
if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
|
||||
return 0xff;
|
||||
return SPRITE_NONE;
|
||||
else
|
||||
return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)];
|
||||
}
|
||||
@@ -410,7 +408,7 @@ u8 GetAnimBattlerSpriteId(u8 animBattler)
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))
|
||||
return gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimTarget)];
|
||||
else
|
||||
return 0xff;
|
||||
return SPRITE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -426,18 +424,38 @@ void SetCallbackToStoredInData6(struct Sprite *sprite)
|
||||
sprite->callback = (void (*)(struct Sprite *))callback;
|
||||
}
|
||||
|
||||
void TranslateSpriteInCircleOverDuration(struct Sprite *sprite)
|
||||
// Sprite data for TranslateSpriteInCircle/Ellipse and related
|
||||
#define sCirclePos data[0]
|
||||
#define sAmplitude data[1]
|
||||
#define sCircleSpeed data[2]
|
||||
#define sDuration data[3]
|
||||
|
||||
// TranslateSpriteInGrowingCircle
|
||||
#define sAmplitudeSpeed data[4]
|
||||
#define sAmplitudeChange data[5]
|
||||
|
||||
// TranslateSpriteInEllipse
|
||||
#define sAmplitudeX sAmplitude
|
||||
#define sAmplitudeY data[4]
|
||||
|
||||
// TranslateSpriteInWavePattern
|
||||
#define sCirclePosX sCirclePos
|
||||
#define sCircleSpeedX sCircleSpeed
|
||||
#define sCirclePosY data[4]
|
||||
#define sCircleSpeedY data[5]
|
||||
|
||||
void TranslateSpriteInCircle(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[3])
|
||||
if (sprite->sDuration)
|
||||
{
|
||||
sprite->x2 = Sin(sprite->data[0], sprite->data[1]);
|
||||
sprite->y2 = Cos(sprite->data[0], sprite->data[1]);
|
||||
sprite->data[0] += sprite->data[2];
|
||||
if (sprite->data[0] >= 0x100)
|
||||
sprite->data[0] -= 0x100;
|
||||
else if (sprite->data[0] < 0)
|
||||
sprite->data[0] += 0x100;
|
||||
sprite->data[3]--;
|
||||
sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitude);
|
||||
sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitude);
|
||||
sprite->sCirclePos += sprite->sCircleSpeed;
|
||||
if (sprite->sCirclePos >= 0x100)
|
||||
sprite->sCirclePos -= 0x100;
|
||||
else if (sprite->sCirclePos < 0)
|
||||
sprite->sCirclePos += 0x100;
|
||||
sprite->sDuration--;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -445,19 +463,19 @@ void TranslateSpriteInCircleOverDuration(struct Sprite *sprite)
|
||||
}
|
||||
}
|
||||
|
||||
void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite)
|
||||
void TranslateSpriteInGrowingCircle(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[3])
|
||||
if (sprite->sDuration)
|
||||
{
|
||||
sprite->x2 = Sin(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]);
|
||||
sprite->y2 = Cos(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]);
|
||||
sprite->data[0] += sprite->data[2];
|
||||
sprite->data[5] += sprite->data[4];
|
||||
if (sprite->data[0] >= 0x100)
|
||||
sprite->data[0] -= 0x100;
|
||||
else if (sprite->data[0] < 0)
|
||||
sprite->data[0] += 0x100;
|
||||
sprite->data[3]--;
|
||||
sprite->x2 = Sin(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude);
|
||||
sprite->y2 = Cos(sprite->sCirclePos, (sprite->sAmplitudeChange >> 8) + sprite->sAmplitude);
|
||||
sprite->sCirclePos += sprite->sCircleSpeed;
|
||||
sprite->sAmplitudeChange += sprite->sAmplitudeSpeed;
|
||||
if (sprite->sCirclePos >= 0x100)
|
||||
sprite->sCirclePos -= 0x100;
|
||||
else if (sprite->sCirclePos < 0)
|
||||
sprite->sCirclePos += 0x100;
|
||||
sprite->sDuration--;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -465,23 +483,28 @@ void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A63C8(struct Sprite *sprite)
|
||||
// Unused
|
||||
// Exact shape depends on arguments. Can move in a figure-8-like pattern, or circular, etc.
|
||||
static void TranslateSpriteInWavePattern(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[3])
|
||||
if (sprite->sDuration)
|
||||
{
|
||||
sprite->x2 = Sin(sprite->data[0], sprite->data[1]);
|
||||
sprite->y2 = Cos(sprite->data[4], sprite->data[1]);
|
||||
sprite->data[0] += sprite->data[2];
|
||||
sprite->data[4] += sprite->data[5];
|
||||
if (sprite->data[0] >= 0x100)
|
||||
sprite->data[0] -= 0x100;
|
||||
else if (sprite->data[0] < 0)
|
||||
sprite->data[0] += 0x100;
|
||||
if (sprite->data[4] >= 0x100)
|
||||
sprite->data[4] -= 0x100;
|
||||
else if (sprite->data[4] < 0)
|
||||
sprite->data[4] += 0x100;
|
||||
sprite->data[3]--;
|
||||
sprite->x2 = Sin(sprite->sCirclePosX, sprite->sAmplitude);
|
||||
sprite->y2 = Cos(sprite->sCirclePosY, sprite->sAmplitude);
|
||||
sprite->sCirclePosX += sprite->sCircleSpeedX;
|
||||
sprite->sCirclePosY += sprite->sCircleSpeedY;
|
||||
|
||||
if (sprite->sCirclePosX >= 0x100)
|
||||
sprite->sCirclePosX -= 0x100;
|
||||
else if (sprite->sCirclePosX < 0)
|
||||
sprite->sCirclePosX += 0x100;
|
||||
|
||||
if (sprite->sCirclePosY >= 0x100)
|
||||
sprite->sCirclePosY -= 0x100;
|
||||
else if (sprite->sCirclePosY < 0)
|
||||
sprite->sCirclePosY += 0x100;
|
||||
|
||||
sprite->sDuration--;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -489,18 +512,18 @@ void sub_80A63C8(struct Sprite *sprite)
|
||||
}
|
||||
}
|
||||
|
||||
void TranslateSpriteInEllipseOverDuration(struct Sprite *sprite)
|
||||
void TranslateSpriteInEllipse(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[3])
|
||||
if (sprite->sDuration)
|
||||
{
|
||||
sprite->x2 = Sin(sprite->data[0], sprite->data[1]);
|
||||
sprite->y2 = Cos(sprite->data[0], sprite->data[4]);
|
||||
sprite->data[0] += sprite->data[2];
|
||||
if (sprite->data[0] >= 0x100)
|
||||
sprite->data[0] -= 0x100;
|
||||
else if (sprite->data[0] < 0)
|
||||
sprite->data[0] += 0x100;
|
||||
sprite->data[3]--;
|
||||
sprite->x2 = Sin(sprite->sCirclePos, sprite->sAmplitudeX);
|
||||
sprite->y2 = Cos(sprite->sCirclePos, sprite->sAmplitudeY);
|
||||
sprite->sCirclePos += sprite->sCircleSpeed;
|
||||
if (sprite->sCirclePos >= 0x100)
|
||||
sprite->sCirclePos -= 0x100;
|
||||
else if (sprite->sCirclePos < 0)
|
||||
sprite->sCirclePos += 0x100;
|
||||
sprite->sDuration--;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -508,6 +531,19 @@ void TranslateSpriteInEllipseOverDuration(struct Sprite *sprite)
|
||||
}
|
||||
}
|
||||
|
||||
#undef sCirclePos
|
||||
#undef sAmplitude
|
||||
#undef sCircleSpeed
|
||||
#undef sDuration
|
||||
#undef sAmplitudeSpeed
|
||||
#undef sAmplitudeChange
|
||||
#undef sAmplitudeX
|
||||
#undef sAmplitudeY
|
||||
#undef sCirclePosX
|
||||
#undef sCircleSpeedX
|
||||
#undef sCirclePosY
|
||||
#undef sCircleSpeedY
|
||||
|
||||
// Simply waits until the sprite's data[0] hits zero.
|
||||
// This is used to let sprite anims or affine anims to run for a designated
|
||||
// duration.
|
||||
@@ -519,34 +555,47 @@ void WaitAnimForDuration(struct Sprite *sprite)
|
||||
SetCallbackToStoredInData6(sprite);
|
||||
}
|
||||
|
||||
static void sub_80A64D0(struct Sprite *sprite)
|
||||
// Sprite data for ConvertPosDataToTranslateLinearData
|
||||
#define sStepsX data[0]
|
||||
#define sStartX data[1]
|
||||
#define sTargetX data[2]
|
||||
#define sStartY data[3]
|
||||
#define sTargetY data[4]
|
||||
|
||||
// Sprite data for TranslateSpriteLinear
|
||||
#define sMoveSteps data[0]
|
||||
#define sSpeedX data[1]
|
||||
#define sSpeedY data[2]
|
||||
|
||||
// Functionally unused
|
||||
static void AnimPosToTranslateLinear(struct Sprite *sprite)
|
||||
{
|
||||
sub_80A64EC(sprite);
|
||||
ConvertPosDataToTranslateLinearData(sprite);
|
||||
sprite->callback = TranslateSpriteLinear;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
void sub_80A64EC(struct Sprite *sprite)
|
||||
void ConvertPosDataToTranslateLinearData(struct Sprite *sprite)
|
||||
{
|
||||
s16 old;
|
||||
int xDiff;
|
||||
|
||||
if (sprite->data[1] > sprite->data[2])
|
||||
sprite->data[0] = -sprite->data[0];
|
||||
xDiff = sprite->data[2] - sprite->data[1];
|
||||
old = sprite->data[0];
|
||||
sprite->data[0] = abs(xDiff / sprite->data[0]);
|
||||
sprite->data[2] = (sprite->data[4] - sprite->data[3]) / sprite->data[0];
|
||||
sprite->data[1] = old;
|
||||
if (sprite->sStartX > sprite->sTargetX)
|
||||
sprite->sStepsX = -sprite->sStepsX;
|
||||
xDiff = sprite->sTargetX - sprite->sStartX;
|
||||
old = sprite->sStepsX;
|
||||
sprite->sMoveSteps = abs(xDiff / sprite->sStepsX);
|
||||
sprite->sSpeedY = (sprite->sTargetY - sprite->sStartY) / sprite->sMoveSteps;
|
||||
sprite->sSpeedX = old;
|
||||
}
|
||||
|
||||
void TranslateSpriteLinear(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] > 0)
|
||||
if (sprite->sMoveSteps > 0)
|
||||
{
|
||||
sprite->data[0]--;
|
||||
sprite->x2 += sprite->data[1];
|
||||
sprite->y2 += sprite->data[2];
|
||||
sprite->sMoveSteps--;
|
||||
sprite->x2 += sprite->sSpeedX;
|
||||
sprite->y2 += sprite->sSpeedY;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -588,16 +637,18 @@ static void TranslateSpriteLinearFixedPointIconFrame(struct Sprite *sprite)
|
||||
UpdateMonIconFrame(sprite);
|
||||
}
|
||||
|
||||
void sub_80A65EC(struct Sprite *sprite)
|
||||
// Unused
|
||||
static void TranslateSpriteToBattleTargetPos(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[1] = sprite->x + sprite->x2;
|
||||
sprite->data[3] = sprite->y + sprite->y2;
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->callback = sub_80A64D0;
|
||||
sprite->sStartX = sprite->x + sprite->x2;
|
||||
sprite->sStartY = sprite->y + sprite->y2;
|
||||
sprite->sTargetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
|
||||
sprite->sTargetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->callback = AnimPosToTranslateLinear;
|
||||
}
|
||||
|
||||
void TranslateMonSpriteLinear(struct Sprite *sprite)
|
||||
// Same as TranslateSpriteLinear but takes an id to specify which sprite to move
|
||||
void TranslateSpriteLinearById(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] > 0)
|
||||
{
|
||||
@@ -611,7 +662,7 @@ void TranslateMonSpriteLinear(struct Sprite *sprite)
|
||||
}
|
||||
}
|
||||
|
||||
void TranslateMonSpriteLinearFixedPoint(struct Sprite *sprite)
|
||||
void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] > 0)
|
||||
{
|
||||
@@ -654,18 +705,26 @@ void DestroySpriteAndMatrix(struct Sprite *sprite)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
void sub_80A6760(struct Sprite *sprite)
|
||||
// Unused
|
||||
static void TranslateSpriteToBattleAttackerPos(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[1] = sprite->x + sprite->x2;
|
||||
sprite->data[3] = sprite->y + sprite->y2;
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->callback = sub_80A64D0;
|
||||
sprite->sStartX = sprite->x + sprite->x2;
|
||||
sprite->sStartY = sprite->y + sprite->y2;
|
||||
sprite->sTargetX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
|
||||
sprite->sTargetY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->callback = AnimPosToTranslateLinear;
|
||||
}
|
||||
|
||||
void sub_80A67A4(struct Sprite *sprite)
|
||||
#undef sStepsX
|
||||
#undef sStartX
|
||||
#undef sTargetX
|
||||
#undef sStartY
|
||||
#undef sTargetY
|
||||
|
||||
// Unused
|
||||
static void EndUnkPaletteAnim(struct Sprite *sprite)
|
||||
{
|
||||
ResetPaletteStructByUid(sprite->data[5]);
|
||||
PaletteStruct_ResetById(sprite->data[5]);
|
||||
DestroySpriteAndMatrix(sprite);
|
||||
}
|
||||
|
||||
@@ -937,7 +996,7 @@ void GetBattleAnimBgData(struct BattleAnimBgData *out, u32 bgId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80A6BFC(struct BattleAnimBgData *out, u8 unused)
|
||||
void GetBgDataForTransform(struct BattleAnimBgData *out, u8 battlerId)
|
||||
{
|
||||
out->bgTiles = gBattleAnimBgTileBuffer;
|
||||
out->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer;
|
||||
@@ -1076,16 +1135,17 @@ void StartAnimLinearTranslation(struct Sprite *sprite)
|
||||
sprite->data[1] = sprite->x;
|
||||
sprite->data[3] = sprite->y;
|
||||
InitAnimLinearTranslation(sprite);
|
||||
sprite->callback = AnimTranslateLinear_WaitEnd;
|
||||
sprite->callback = AnimTranslateLinear_WithFollowup;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
void sub_80A6F14(struct Sprite *sprite)
|
||||
// Unused
|
||||
static void StartAnimLinearTranslation_SetCornerVecX(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[1] = sprite->x;
|
||||
sprite->data[3] = sprite->y;
|
||||
InitAnimLinearTranslation(sprite);
|
||||
sprite->callback = sub_80A6FB4;
|
||||
sprite->callback = AnimTranslateLinear_WithFollowup_SetCornerVecX;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
@@ -1119,15 +1179,16 @@ bool8 AnimTranslateLinear(struct Sprite *sprite)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void AnimTranslateLinear_WaitEnd(struct Sprite *sprite)
|
||||
void AnimTranslateLinear_WithFollowup(struct Sprite *sprite)
|
||||
{
|
||||
if (AnimTranslateLinear(sprite))
|
||||
SetCallbackToStoredInData6(sprite);
|
||||
}
|
||||
|
||||
static void sub_80A6FB4(struct Sprite *sprite)
|
||||
// Functionally unused
|
||||
static void AnimTranslateLinear_WithFollowup_SetCornerVecX(struct Sprite *sprite)
|
||||
{
|
||||
sub_8039E9C(sprite);
|
||||
AnimSetCenterToCornerVecX(sprite);
|
||||
if (AnimTranslateLinear(sprite))
|
||||
SetCallbackToStoredInData6(sprite);
|
||||
}
|
||||
@@ -1144,7 +1205,7 @@ void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite)
|
||||
sprite->data[1] = sprite->x;
|
||||
sprite->data[3] = sprite->y;
|
||||
InitAnimLinearTranslationWithSpeed(sprite);
|
||||
sprite->callback = AnimTranslateLinear_WaitEnd;
|
||||
sprite->callback = AnimTranslateLinear_WithFollowup;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
@@ -1246,7 +1307,7 @@ void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation)
|
||||
src.xScale = xScale;
|
||||
src.yScale = yScale;
|
||||
src.rotation = rotation;
|
||||
if (sub_80A7238())
|
||||
if (ShouldRotScaleSpeciesBeFlipped())
|
||||
src.xScale = -src.xScale;
|
||||
i = gSprites[spriteId].oam.matrixNum;
|
||||
ObjAffineSet(&src, &matrix, 1, 2);
|
||||
@@ -1256,7 +1317,8 @@ void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation)
|
||||
gOamMatrices[i].d = matrix.d;
|
||||
}
|
||||
|
||||
static bool8 sub_80A7238(void)
|
||||
// Pokémon in Contests (except Unown) should be flipped.
|
||||
static bool8 ShouldRotScaleSpeciesBeFlipped(void)
|
||||
{
|
||||
if (IsContest())
|
||||
{
|
||||
@@ -1321,7 +1383,7 @@ void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 x
|
||||
src.xScale = xScale;
|
||||
src.yScale = yScale;
|
||||
src.rotation = rotation;
|
||||
if (sub_80A7238())
|
||||
if (ShouldRotScaleSpeciesBeFlipped())
|
||||
src.xScale = -src.xScale;
|
||||
i = sprite->oam.matrixNum;
|
||||
ObjAffineSet(&src, &matrix, 1, 2);
|
||||
@@ -1629,7 +1691,7 @@ s16 CloneBattlerSpriteWithBlend(u8 animBattler)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void obj_delete_but_dont_free_vram(struct Sprite *sprite)
|
||||
void DestroySpriteWithActiveSheet(struct Sprite *sprite)
|
||||
{
|
||||
sprite->usingSheet = TRUE;
|
||||
DestroySprite(sprite);
|
||||
@@ -1784,34 +1846,34 @@ void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union Aff
|
||||
|
||||
bool8 RunAffineAnimFromTaskData(struct Task *task)
|
||||
{
|
||||
gAnimTaskAffineAnim = &((union AffineAnimCmd *)LoadPointerFromVars(task->data[13], task->data[14]))[task->data[7]];
|
||||
switch (gAnimTaskAffineAnim->type)
|
||||
sAnimTaskAffineAnim = &((union AffineAnimCmd *)LoadPointerFromVars(task->data[13], task->data[14]))[task->data[7]];
|
||||
switch (sAnimTaskAffineAnim->type)
|
||||
{
|
||||
default:
|
||||
if (!gAnimTaskAffineAnim->frame.duration)
|
||||
if (!sAnimTaskAffineAnim->frame.duration)
|
||||
{
|
||||
task->data[10] = gAnimTaskAffineAnim->frame.xScale;
|
||||
task->data[11] = gAnimTaskAffineAnim->frame.yScale;
|
||||
task->data[12] = gAnimTaskAffineAnim->frame.rotation;
|
||||
task->data[10] = sAnimTaskAffineAnim->frame.xScale;
|
||||
task->data[11] = sAnimTaskAffineAnim->frame.yScale;
|
||||
task->data[12] = sAnimTaskAffineAnim->frame.rotation;
|
||||
task->data[7]++;
|
||||
gAnimTaskAffineAnim++;
|
||||
sAnimTaskAffineAnim++;
|
||||
}
|
||||
task->data[10] += gAnimTaskAffineAnim->frame.xScale;
|
||||
task->data[11] += gAnimTaskAffineAnim->frame.yScale;
|
||||
task->data[12] += gAnimTaskAffineAnim->frame.rotation;
|
||||
task->data[10] += sAnimTaskAffineAnim->frame.xScale;
|
||||
task->data[11] += sAnimTaskAffineAnim->frame.yScale;
|
||||
task->data[12] += sAnimTaskAffineAnim->frame.rotation;
|
||||
SetSpriteRotScale(task->data[15], task->data[10], task->data[11], task->data[12]);
|
||||
SetBattlerSpriteYOffsetFromYScale(task->data[15]);
|
||||
if (++task->data[8] >= gAnimTaskAffineAnim->frame.duration)
|
||||
if (++task->data[8] >= sAnimTaskAffineAnim->frame.duration)
|
||||
{
|
||||
task->data[8] = 0;
|
||||
task->data[7]++;
|
||||
}
|
||||
break;
|
||||
case AFFINEANIMCMDTYPE_JUMP:
|
||||
task->data[7] = gAnimTaskAffineAnim->jump.target;
|
||||
task->data[7] = sAnimTaskAffineAnim->jump.target;
|
||||
break;
|
||||
case AFFINEANIMCMDTYPE_LOOP:
|
||||
if (gAnimTaskAffineAnim->loop.count)
|
||||
if (sAnimTaskAffineAnim->loop.count)
|
||||
{
|
||||
if (task->data[9])
|
||||
{
|
||||
@@ -1823,7 +1885,7 @@ bool8 RunAffineAnimFromTaskData(struct Task *task)
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[9] = gAnimTaskAffineAnim->loop.count;
|
||||
task->data[9] = sAnimTaskAffineAnim->loop.count;
|
||||
}
|
||||
if (!task->data[7])
|
||||
{
|
||||
@@ -1832,8 +1894,8 @@ bool8 RunAffineAnimFromTaskData(struct Task *task)
|
||||
for (;;)
|
||||
{
|
||||
task->data[7]--;
|
||||
gAnimTaskAffineAnim--;
|
||||
if (gAnimTaskAffineAnim->type == AFFINEANIMCMDTYPE_LOOP)
|
||||
sAnimTaskAffineAnim--;
|
||||
if (sAnimTaskAffineAnim->type == AFFINEANIMCMDTYPE_LOOP)
|
||||
{
|
||||
task->data[7]++;
|
||||
return TRUE;
|
||||
@@ -1857,12 +1919,12 @@ bool8 RunAffineAnimFromTaskData(struct Task *task)
|
||||
// matrix's scale in the y dimension.
|
||||
void SetBattlerSpriteYOffsetFromYScale(u8 spriteId)
|
||||
{
|
||||
int var = 64 - GetBattlerYDeltaFromSpriteId(spriteId) * 2;
|
||||
int var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(spriteId) * 2;
|
||||
u16 matrix = gSprites[spriteId].oam.matrixNum;
|
||||
int var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d);
|
||||
|
||||
if (var2 > 128)
|
||||
var2 = 128;
|
||||
if (var2 > MON_PIC_HEIGHT * 2)
|
||||
var2 = MON_PIC_HEIGHT * 2;
|
||||
gSprites[spriteId].y2 = (var - var2) / 2;
|
||||
}
|
||||
|
||||
@@ -1870,12 +1932,12 @@ void SetBattlerSpriteYOffsetFromYScale(u8 spriteId)
|
||||
// matrix's scale in the y dimension.
|
||||
void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId)
|
||||
{
|
||||
int var = 64 - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2;
|
||||
int var = MON_PIC_HEIGHT - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2;
|
||||
u16 matrix = gSprites[spriteId].oam.matrixNum;
|
||||
int var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d);
|
||||
|
||||
if (var2 > 128)
|
||||
var2 = 128;
|
||||
if (var2 > MON_PIC_HEIGHT * 2)
|
||||
var2 = MON_PIC_HEIGHT * 2;
|
||||
gSprites[spriteId].y2 = (var - var2) / 2;
|
||||
}
|
||||
|
||||
@@ -1926,7 +1988,7 @@ static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId)
|
||||
}
|
||||
}
|
||||
}
|
||||
return 64;
|
||||
return MON_PIC_HEIGHT;
|
||||
}
|
||||
|
||||
void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr)
|
||||
@@ -2253,17 +2315,17 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr)
|
||||
switch (attr)
|
||||
{
|
||||
case BATTLER_COORD_ATTR_HEIGHT:
|
||||
return (coords->size & 0xf) * 8;
|
||||
return GET_MON_COORDS_HEIGHT(coords->size);
|
||||
case BATTLER_COORD_ATTR_WIDTH:
|
||||
return (coords->size >> 4) * 8;
|
||||
return GET_MON_COORDS_WIDTH(coords->size);
|
||||
case BATTLER_COORD_ATTR_LEFT:
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - ((coords->size >> 4) * 4);
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) - (GET_MON_COORDS_WIDTH(coords->size) / 2);
|
||||
case BATTLER_COORD_ATTR_RIGHT:
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + ((coords->size >> 4) * 4);
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + (GET_MON_COORDS_WIDTH(coords->size) / 2);
|
||||
case BATTLER_COORD_ATTR_TOP:
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - ((coords->size & 0xf) * 4);
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) - (GET_MON_COORDS_HEIGHT(coords->size) / 2);
|
||||
case BATTLER_COORD_ATTR_BOTTOM:
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + ((coords->size & 0xf) * 4);
|
||||
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET) + (GET_MON_COORDS_HEIGHT(coords->size) / 2);
|
||||
case BATTLER_COORD_ATTR_RAW_BOTTOM:
|
||||
ret = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 31;
|
||||
return ret - coords->y_offset;
|
||||
@@ -2375,6 +2437,19 @@ void AnimSpinningSparkle(struct Sprite *sprite)
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Task and sprite data for AnimTask_AttackerPunchWithTrace
|
||||
#define tBattlerSpriteId data[0]
|
||||
#define tMoveSpeed data[1]
|
||||
#define tState data[2]
|
||||
#define tCounter data[3]
|
||||
#define tPaletteNum data[4]
|
||||
#define tNumTracesActive data[5]
|
||||
#define tPriority data[6]
|
||||
|
||||
#define sActiveTime data[0]
|
||||
#define sTaskId data[1]
|
||||
#define sSpriteId data[2]
|
||||
|
||||
// Slides attacker to right and back with a cloned trace of the specified color
|
||||
// arg0: Trace palette blend color
|
||||
// arg1: Trace palette blend coeff
|
||||
@@ -2384,21 +2459,24 @@ void AnimTask_AttackerPunchWithTrace(u8 taskId)
|
||||
u16 dest;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
|
||||
task->data[1] = ((GetBattlerSide(gBattleAnimAttacker)) != B_SIDE_PLAYER) ? -8 : 8;
|
||||
task->data[2] = 0;
|
||||
task->data[3] = 0;
|
||||
gSprites[task->data[0]].x2 -= task->data[0];
|
||||
task->data[4] = AllocSpritePalette(ANIM_TAG_BENT_SPOON);
|
||||
task->data[5] = 0;
|
||||
task->tBattlerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
|
||||
task->tMoveSpeed = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? -8 : 8;
|
||||
task->tState = 0;
|
||||
task->tCounter = 0;
|
||||
gSprites[task->tBattlerSpriteId].x2 -= task->tBattlerSpriteId;
|
||||
task->tPaletteNum = AllocSpritePalette(ANIM_TAG_BENT_SPOON);
|
||||
task->tNumTracesActive = 0;
|
||||
|
||||
dest = (task->data[4] + 0x10) * 0x10;
|
||||
src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10;
|
||||
task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
|
||||
if (task->data[6] == 20 || task->data[6] == 40)
|
||||
task->data[6] = 2;
|
||||
dest = (task->tPaletteNum + 16) * 16;
|
||||
src = (gSprites[task->tBattlerSpriteId].oam.paletteNum + 0x10) * 0x10;
|
||||
|
||||
// Set trace's priority based on battler's subpriority
|
||||
task->tPriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
|
||||
if (task->tPriority == 20 || task->tPriority == 40)
|
||||
task->tPriority = 2;
|
||||
else
|
||||
task->data[6] = 3;
|
||||
task->tPriority = 3;
|
||||
|
||||
CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20);
|
||||
BlendPalette(dest, 16, gBattleAnimArgs[1], gBattleAnimArgs[0]);
|
||||
task->func = AnimTask_AttackerPunchWithTrace_Step;
|
||||
@@ -2407,28 +2485,30 @@ void AnimTask_AttackerPunchWithTrace(u8 taskId)
|
||||
static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
switch (task->data[2])
|
||||
switch (task->tState)
|
||||
{
|
||||
case 0:
|
||||
sub_80A8D78(task, taskId);
|
||||
gSprites[task->data[0]].x2 += task->data[1];
|
||||
if (++task->data[3] == 5)
|
||||
// Move forward
|
||||
CreateBattlerTrace(task, taskId);
|
||||
gSprites[task->tBattlerSpriteId].x2 += task->tMoveSpeed;
|
||||
if (++task->tCounter == 5)
|
||||
{
|
||||
task->data[3]--;
|
||||
task->data[2]++;
|
||||
task->tCounter--;
|
||||
task->tState++;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
sub_80A8D78(task, taskId);
|
||||
gSprites[task->data[0]].x2 -= task->data[1];
|
||||
if (--task->data[3] == 0)
|
||||
// Move back (do same number of traces as before)
|
||||
CreateBattlerTrace(task, taskId);
|
||||
gSprites[task->tBattlerSpriteId].x2 -= task->tMoveSpeed;
|
||||
if (--task->tCounter == 0)
|
||||
{
|
||||
gSprites[task->data[0]].x2 = 0;
|
||||
task->data[2]++;
|
||||
gSprites[task->tBattlerSpriteId].x2 = 0;
|
||||
task->tState++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (!task->data[5])
|
||||
if (task->tNumTracesActive == 0)
|
||||
{
|
||||
FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
@@ -2437,31 +2517,44 @@ static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80A8D78(struct Task *task, u8 taskId)
|
||||
static void CreateBattlerTrace(struct Task *task, u8 taskId)
|
||||
{
|
||||
s16 spriteId = CloneBattlerSpriteWithBlend(0);
|
||||
if (spriteId >= 0)
|
||||
{
|
||||
gSprites[spriteId].oam.priority = task->data[6];
|
||||
gSprites[spriteId].oam.paletteNum = task->data[4];
|
||||
gSprites[spriteId].data[0] = 8;
|
||||
gSprites[spriteId].data[1] = taskId;
|
||||
gSprites[spriteId].data[2] = spriteId;
|
||||
gSprites[spriteId].x2 = gSprites[task->data[0]].x2;
|
||||
gSprites[spriteId].callback = sub_80A8DFC;
|
||||
task->data[5]++;
|
||||
gSprites[spriteId].oam.priority = task->tPriority;
|
||||
gSprites[spriteId].oam.paletteNum = task->tPaletteNum;
|
||||
gSprites[spriteId].sActiveTime = 8;
|
||||
gSprites[spriteId].sTaskId = taskId;
|
||||
gSprites[spriteId].sSpriteId = spriteId;
|
||||
gSprites[spriteId].x2 = gSprites[task->tBattlerSpriteId].x2;
|
||||
gSprites[spriteId].callback = AnimBattlerTrace;
|
||||
task->tNumTracesActive++;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80A8DFC(struct Sprite *sprite)
|
||||
// Just waits until destroyed
|
||||
static void AnimBattlerTrace(struct Sprite *sprite)
|
||||
{
|
||||
if (--sprite->data[0] == 0)
|
||||
if (--sprite->sActiveTime == 0)
|
||||
{
|
||||
gTasks[sprite->data[1]].data[5]--;
|
||||
obj_delete_but_dont_free_vram(sprite);
|
||||
gTasks[sprite->sTaskId].tNumTracesActive--;
|
||||
DestroySpriteWithActiveSheet(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
#undef tBattlerSpriteId
|
||||
#undef tMoveSpeed
|
||||
#undef tState
|
||||
#undef tCounter
|
||||
#undef tPaletteNum
|
||||
#undef tNumTracesActive
|
||||
#undef tPriority
|
||||
|
||||
#undef sActiveTime
|
||||
#undef sTaskId
|
||||
#undef sSpriteId
|
||||
|
||||
void AnimWeatherBallUp(struct Sprite *sprite)
|
||||
{
|
||||
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
|
||||
|
||||
Reference in new issue
Block a user