Sync battle anim - fire

This commit is contained in:
GriffinR
2022-08-16 15:08:16 -04:00
parent b598507a2e
commit 796d307ffb
7 changed files with 280 additions and 191 deletions
+2 -2
View File
@@ -362,7 +362,7 @@ u8 GetBattlerYCoordWithElevation(u8 battlerId);
u8 GetAnimBattlerSpriteId(u8 animBattler); u8 GetAnimBattlerSpriteId(u8 animBattler);
void StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback); void StoreSpriteCallbackInData6(struct Sprite *sprite, SpriteCallback callback);
void TranslateSpriteInCircle(struct Sprite *sprite); void TranslateSpriteInCircle(struct Sprite *sprite);
void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite); void TranslateSpriteInGrowingCircle(struct Sprite *sprite);
void TranslateSpriteInEllipse(struct Sprite *sprite); void TranslateSpriteInEllipse(struct Sprite *sprite);
void WaitAnimForDuration(struct Sprite *sprite); void WaitAnimForDuration(struct Sprite *sprite);
void SetupLinearTranslationWithFixedDuration(struct Sprite *sprite); void SetupLinearTranslationWithFixedDuration(struct Sprite *sprite);
@@ -405,7 +405,7 @@ void StartAnimLinearTranslation(struct Sprite *sprite);
void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite); void PlayerThrowBall_StartAnimLinearTranslation(struct Sprite *sprite);
bool8 AnimTranslateLinear(struct Sprite *sprite); bool8 AnimTranslateLinear(struct Sprite *sprite);
void AnimTranslateLinear_WithFollowup(struct Sprite *sprite); void AnimTranslateLinear_WithFollowup(struct Sprite *sprite);
void BattleAnim_InitLinearTranslationWithDuration(struct Sprite *sprite); void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite);
void BattleAnim_InitAndRunLinearTranslationWithDuration(struct Sprite *sprite); void BattleAnim_InitAndRunLinearTranslationWithDuration(struct Sprite *sprite);
void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite); void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite);
bool8 AnimFastTranslateLinear(struct Sprite *sprite); bool8 AnimFastTranslateLinear(struct Sprite *sprite);
+1 -1
View File
@@ -264,7 +264,7 @@ static void AnimTranslateWebThread(struct Sprite *sprite)
{ {
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
} }
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
sprite->data[5] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[3];
sprite->callback = AnimTranslateWebThread_Step; sprite->callback = AnimTranslateWebThread_Step;
} }
+270 -181
View File
@@ -10,8 +10,8 @@ static void AnimFireSpiralInward(struct Sprite *sprite);
static void AnimFireSpread(struct Sprite *sprite); static void AnimFireSpread(struct Sprite *sprite);
static void AnimLargeFlame(struct Sprite *sprite); static void AnimLargeFlame(struct Sprite *sprite);
static void AnimFirePlume(struct Sprite *sprite); static void AnimFirePlume(struct Sprite *sprite);
static void sub_80ACAA8(struct Sprite *sprite); static void AnimUnusedSmallEmber(struct Sprite *sprite);
static void sub_80ACBB0(struct Sprite *sprite); static void AnimSunlight(struct Sprite *sprite);
static void AnimEmberFlare(struct Sprite *sprite); static void AnimEmberFlare(struct Sprite *sprite);
static void AnimBurnFlame(struct Sprite *sprite); static void AnimBurnFlame(struct Sprite *sprite);
static void AnimFireRing(struct Sprite *sprite); static void AnimFireRing(struct Sprite *sprite);
@@ -21,22 +21,22 @@ static void AnimEruptionLaunchRock(struct Sprite *sprite);
static void AnimEruptionFallingRock(struct Sprite *sprite); static void AnimEruptionFallingRock(struct Sprite *sprite);
static void AnimWillOWispOrb(struct Sprite *sprite); static void AnimWillOWispOrb(struct Sprite *sprite);
static void AnimWillOWispFire(struct Sprite *sprite); static void AnimWillOWispFire(struct Sprite *sprite);
static void sub_80ACA6C(struct Sprite *sprite); static void AnimLargeFlame_Step(struct Sprite *sprite);
static void sub_80ACB1C(struct Sprite *sprite); static void AnimUnusedSmallEmber_Step(struct Sprite *sprite);
static void AnimFireRing_Step1(struct Sprite *sprite); static void AnimFireRing_Step1(struct Sprite *sprite);
static void AnimFireRing_Step2(struct Sprite *sprite); static void AnimFireRing_Step2(struct Sprite *sprite);
static void AnimFireRing_Step3(struct Sprite *sprite); static void AnimFireRing_Step3(struct Sprite *sprite);
static void UpdateFireRingCircleOffset(struct Sprite *sprite); static void UpdateFireRingCircleOffset(struct Sprite *sprite);
static void sub_80ACE28(struct Sprite *sprite); static void AnimFireSpiralOutward_Step1(struct Sprite *sprite);
static void sub_80ACE50(struct Sprite *sprite); static void AnimFireSpiralOutward_Step2(struct Sprite *sprite);
static void AnimTask_EruptionLaunchRocks_Step(u8 taskId); static void AnimTask_EruptionLaunchRocks_Step(u8 taskId);
static void sub_80AD1F8(u8 spriteId, u8 taskId, u8 a3); static void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 a3);
static u16 sub_80AD374(u8 spriteId); static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId);
static void sub_80AD3C8(struct Sprite *sprite, s16 x, s16 y); static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 x, s16 y);
static void sub_80AD3E4(struct Sprite *sprite); static void UpdateEruptionLaunchRockPos(struct Sprite *sprite);
static void sub_80AD4A8(struct Sprite *sprite); static void AnimEruptionFallingRock_Step(struct Sprite *sprite);
static void sub_80AD690(struct Sprite *sprite); static void AnimWillOWispOrb_Step(struct Sprite *sprite);
static void sub_80AD870(u8 taskId); static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId);
static const union AnimCmd sAnim_FireSpiralSpread_0[] = static const union AnimCmd sAnim_FireSpiralSpread_0[] =
{ {
@@ -160,7 +160,7 @@ const struct SpriteTemplate gFirePlumeSpriteTemplate =
.callback = AnimFirePlume, .callback = AnimFirePlume,
}; };
const struct SpriteTemplate gUnknown_83E5CB8 = static const struct SpriteTemplate sUnusedEmberFirePlumeSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SMALL_EMBER, .tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER,
@@ -171,7 +171,7 @@ const struct SpriteTemplate gUnknown_83E5CB8 =
.callback = AnimFirePlume, .callback = AnimFirePlume,
}; };
static const union AnimCmd gUnknown_83E5CD0[] = static const union AnimCmd sAnim_UnusedSmallEmber[] =
{ {
ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(16, 6),
ANIMCMD_FRAME(32, 6), ANIMCMD_FRAME(32, 6),
@@ -179,20 +179,20 @@ static const union AnimCmd gUnknown_83E5CD0[] =
ANIMCMD_JUMP(0), ANIMCMD_JUMP(0),
}; };
static const union AnimCmd *const gUnknown_83E5CE0[] = static const union AnimCmd *const sAnims_UnusedSmallEmber[] =
{ {
gUnknown_83E5CD0, sAnim_UnusedSmallEmber,
}; };
const struct SpriteTemplate gUnknown_83E5CE4 = static const struct SpriteTemplate sUnusedSmallEmberSpriteTemplate =
{ {
.tileTag = ANIM_TAG_SMALL_EMBER, .tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER,
.oam = &gOamData_AffineOff_ObjNormal_32x32, .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5CE0, .anims = sAnims_UnusedSmallEmber,
.images = NULL, .images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80ACAA8, .callback = AnimUnusedSmallEmber,
}; };
static const union AffineAnimCmd sAffineAnim_SunlightRay[] = static const union AffineAnimCmd sAffineAnim_SunlightRay[] =
@@ -215,7 +215,7 @@ const struct SpriteTemplate gSunlightRaySpriteTemplate =
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
.affineAnims = sAffineAnims_SunlightRay, .affineAnims = sAffineAnims_SunlightRay,
.callback = sub_80ACBB0, .callback = AnimSunlight,
}; };
static const union AnimCmd sAnim_BasicFire[] = static const union AnimCmd sAnim_BasicFire[] =
@@ -289,22 +289,22 @@ static const union AnimCmd *const sAnims_FireBlastCross[] =
sAnim_FireBlastCross, sAnim_FireBlastCross,
}; };
static const union AffineAnimCmd gUnknown_83E5DBC[] = static const union AffineAnimCmd sAffineAnim_Unused_0[] =
{ {
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd gUnknown_83E5DCC[] = static const union AffineAnimCmd sAffineAnim_Unused_1[] =
{ {
AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0), AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0),
AFFINEANIMCMD_END, AFFINEANIMCMD_END,
}; };
static const union AffineAnimCmd *const gUnknown_83E5DDC[] = static const union AffineAnimCmd *const sAffineAnims_Unused[] =
{ {
gUnknown_83E5DBC, sAffineAnim_Unused_0,
gUnknown_83E5DCC, sAffineAnim_Unused_1,
}; };
const struct SpriteTemplate gFireBlastCrossSpriteTemplate = const struct SpriteTemplate gFireBlastCrossSpriteTemplate =
@@ -351,7 +351,7 @@ static const struct SpriteTemplate gEruptionLaunchRockSpriteTemplate =
.callback = AnimEruptionLaunchRock, .callback = AnimEruptionLaunchRock,
}; };
static const s16 sEruptionLaunchRockCoords[][2] = static const s16 sEruptionLaunchRockSpeeds[][2] =
{ {
{-2, -5}, {-2, -5},
{-1, -1}, {-1, -1},
@@ -457,6 +457,7 @@ static const s8 sShakeDirsPattern1[16] =
-1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1, -1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1,
}; };
// For the first stage of Fire Punch
static void AnimFireSpiralInward(struct Sprite *sprite) static void AnimFireSpiralInward(struct Sprite *sprite)
{ {
sprite->data[0] = gBattleAnimArgs[0]; sprite->data[0] = gBattleAnimArgs[0];
@@ -465,10 +466,11 @@ static void AnimFireSpiralInward(struct Sprite *sprite)
sprite->data[3] = 0x1E; sprite->data[3] = 0x1E;
sprite->data[4] = 0xFE00; sprite->data[4] = 0xFE00;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration; sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite); sprite->callback(sprite);
} }
// For the impact spread of fire sprites for moves like Blaze Kick or Fire Punch
static void AnimFireSpread(struct Sprite *sprite) static void AnimFireSpread(struct Sprite *sprite)
{ {
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
@@ -498,7 +500,7 @@ static void AnimFirePlume(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->callback = sub_80ACA6C; sprite->callback = AnimLargeFlame_Step;
} }
static void AnimLargeFlame(struct Sprite *sprite) static void AnimLargeFlame(struct Sprite *sprite)
@@ -518,10 +520,10 @@ static void AnimLargeFlame(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[2];
sprite->data[4] = gBattleAnimArgs[3]; sprite->data[4] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->callback = sub_80ACA6C; sprite->callback = AnimLargeFlame_Step;
} }
static void sub_80ACA6C(struct Sprite *sprite) static void AnimLargeFlame_Step(struct Sprite *sprite)
{ {
if (++sprite->data[0] < sprite->data[4]) if (++sprite->data[0] < sprite->data[4])
{ {
@@ -532,7 +534,7 @@ static void sub_80ACA6C(struct Sprite *sprite)
DestroySpriteAndMatrix(sprite); DestroySpriteAndMatrix(sprite);
} }
static void sub_80ACAA8(struct Sprite *sprite) static void AnimUnusedSmallEmber(struct Sprite *sprite)
{ {
SetSpriteCoordsToAnimAttackerCoords(sprite); SetSpriteCoordsToAnimAttackerCoords(sprite);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
@@ -551,10 +553,10 @@ static void sub_80ACAA8(struct Sprite *sprite)
sprite->data[3] = gBattleAnimArgs[5]; sprite->data[3] = gBattleAnimArgs[5];
sprite->data[4] = gBattleAnimArgs[6]; sprite->data[4] = gBattleAnimArgs[6];
sprite->data[5] = 0; sprite->data[5] = 0;
sprite->callback = sub_80ACB1C; sprite->callback = AnimUnusedSmallEmber_Step;
} }
static void sub_80ACB1C(struct Sprite *sprite) static void AnimUnusedSmallEmber_Step(struct Sprite *sprite)
{ {
if (sprite->data[3]) if (sprite->data[3])
{ {
@@ -576,8 +578,8 @@ static void sub_80ACB1C(struct Sprite *sprite)
} }
} }
//sunlight // Sunlight from Sunny Day / sunny weather
static void sub_80ACBB0(struct Sprite *sprite) static void AnimSunlight(struct Sprite *sprite)
{ {
sprite->x = 0; sprite->x = 0;
sprite->y = 0; sprite->y = 0;
@@ -588,8 +590,6 @@ static void sub_80ACBB0(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
} }
//fire 2
// Animates the secondary effect of MOVE_EMBER, where the flames grow and slide // Animates the secondary effect of MOVE_EMBER, where the flames grow and slide
// horizontally a bit. // horizontally a bit.
// arg 0: initial x pixel offset // arg 0: initial x pixel offset
@@ -626,7 +626,7 @@ static void AnimBurnFlame(struct Sprite *sprite)
//void AnimFireRing(struct Sprite *sprite) //void AnimFireRing(struct Sprite *sprite)
static void AnimFireRing(struct Sprite *sprite) static void AnimFireRing(struct Sprite *sprite)
{ {
InitSpritePosToAnimAttacker(sprite, 1); InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[7] = gBattleAnimArgs[2]; sprite->data[7] = gBattleAnimArgs[2];
sprite->data[0] = 0; sprite->data[0] = 0;
sprite->callback = AnimFireRing_Step1; sprite->callback = AnimFireRing_Step1;
@@ -706,19 +706,19 @@ static void AnimFireSpiralOutward(struct Sprite *sprite)
sprite->data[0] = gBattleAnimArgs[3]; sprite->data[0] = gBattleAnimArgs[3];
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = WaitAnimForDuration; sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, sub_80ACE28); StoreSpriteCallbackInData6(sprite, AnimFireSpiralOutward_Step1);
} }
static void sub_80ACE28(struct Sprite *sprite) static void AnimFireSpiralOutward_Step1(struct Sprite *sprite)
{ {
sprite->invisible = FALSE; sprite->invisible = FALSE;
sprite->data[0] = sprite->data[1]; sprite->data[0] = sprite->data[1];
sprite->data[1] = 0; sprite->data[1] = 0;
sprite->callback = sub_80ACE50; sprite->callback = AnimFireSpiralOutward_Step2;
sprite->callback(sprite); sprite->callback(sprite);
} }
static void sub_80ACE50(struct Sprite *sprite) static void AnimFireSpiralOutward_Step2(struct Sprite *sprite)
{ {
sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8); sprite->x2 = Sin(sprite->data[1], sprite->data[2] >> 8);
sprite->y2 = Cos(sprite->data[1], sprite->data[2] >> 8); sprite->y2 = Cos(sprite->data[1], sprite->data[2] >> 8);
@@ -728,258 +728,337 @@ static void sub_80ACE50(struct Sprite *sprite)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
} }
void AnimTask_EruptionLaunchRocks(u8 taskId) // initialize animation task for Move_ERUPTION? #define IDX_ACTIVE_SPRITES 6 // Used by the sprite callback to modify the number of active sprites
#define tState data[0]
#define tTimer1 data[1]
#define tTimer2 data[2]
#define tTimer3 data[3]
#define tAttackerY data[4]
#define tAttackerSide data[5]
#define tActiveSprites data[IDX_ACTIVE_SPRITES]
// data[8]-data[15] used by BattleAnimHelper_SetSpriteSquashParams / BattleAnimHelper_RunSpriteSquash
#define tAttackerSpriteId data[15]
#define sSpeedDelay data[0]
#define sLaunchStage data[1]
#define sX data[2]
#define sY data[3]
#define sSpeedX data[4]
#define sSpeedY data[5]
#define sTaskId data[6]
#define sActiveSpritesIdx data[7]
// Animates first stage of Eruption where the attacker squishes and launches rocks away from themself
void AnimTask_EruptionLaunchRocks(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER); task->tAttackerSpriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
task->data[0] = 0; task->tState = 0;
task->data[1] = 0; task->tTimer1 = 0;
task->data[2] = 0; task->tTimer2 = 0;
task->data[3] = 0; task->tTimer3 = 0;
task->data[4] = gSprites[task->data[15]].y; task->tAttackerY = gSprites[task->tAttackerSpriteId].y;
task->data[5] = GetBattlerSide(gBattleAnimAttacker); task->tAttackerSide = GetBattlerSide(gBattleAnimAttacker);
task->data[6] = 0; task->tActiveSprites = 0;
PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL); PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);
task->func = AnimTask_EruptionLaunchRocks_Step; task->func = AnimTask_EruptionLaunchRocks_Step;
} }
static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTION? static void AnimTask_EruptionLaunchRocks_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
switch (task->data[0]) switch (task->tState)
{ {
case 0: case 0:
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x100, 0x100, 0xE0, 0x200, 32);
++task->data[0]; task->tState++;
// fall through
case 1: case 1:
if (++task->data[1] > 1) if (++task->tTimer1 > 1)
{ {
task->data[1] = 0; task->tTimer1 = 0;
if (++task->data[2] & 0x1)
gSprites[task->data[15]].x2 = 3; if (++task->tTimer2 & 1)
gSprites[task->tAttackerSpriteId].x2 = 3;
else else
gSprites[task->data[15]].x2 = -3; gSprites[task->tAttackerSpriteId].x2 = -3;
} }
if (task->data[5])
if (task->tAttackerSide != B_SIDE_PLAYER)
{ {
if (++task->data[3] > 4) if (++task->tTimer3 > 4)
{ {
task->data[3] = 0; task->tTimer3 = 0;
++gSprites[task->data[15]].y; gSprites[task->tAttackerSpriteId].y++;
} }
} }
if(!BattleAnimHelper_RunSpriteSquash(task)) if(!BattleAnimHelper_RunSpriteSquash(task))
{ {
SetBattlerSpriteYOffsetFromYScale(task->data[15]); SetBattlerSpriteYOffsetFromYScale(task->tAttackerSpriteId);
gSprites[task->data[15]].x2 = 0; gSprites[task->tAttackerSpriteId].x2 = 0;
task->data[1] = 0;
task->data[2] = 0; task->tTimer1 = 0;
task->data[3] = 0; task->tTimer2 = 0;
++task->data[0]; task->tTimer3 = 0;
task->tState++;
} }
break; break;
case 2: case 2:
if (++task->data[1] > 4) if (++task->tTimer1 > 4)
{ {
if (task->data[5]) if (task->tAttackerSide != B_SIDE_PLAYER)
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xF0, 6);
else else
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0xE0, 0x200, 0x180, 0xC0, 6);
task->data[1] = 0;
++task->data[0]; task->tTimer1 = 0;
task->tState++;
} }
break; break;
case 3: case 3:
if (!BattleAnimHelper_RunSpriteSquash(task)) if (!BattleAnimHelper_RunSpriteSquash(task))
{ {
sub_80AD1F8(task->data[15], taskId, 6); CreateEruptionLaunchRocks(task->tAttackerSpriteId, taskId, IDX_ACTIVE_SPRITES);
++task->data[0]; task->tState++;
} }
break; break;
case 4: case 4:
if (++task->data[1] > 1) if (++task->tTimer1 > 1)
{ {
task->data[1] = 0; task->tTimer1 = 0;
if (++task->data[2] & 1)
gSprites[task->data[15]].y2 += 3; if (++task->tTimer2 & 1)
gSprites[task->tAttackerSpriteId].y2 += 3;
else else
gSprites[task->data[15]].y2 -= 3; gSprites[task->tAttackerSpriteId].y2 -= 3;
} }
if (++task->data[3] > 0x18)
if (++task->tTimer3 > 24)
{ {
if (task->data[5]) if (task->tAttackerSide != B_SIDE_PLAYER)
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xF0, 0x100, 0x100, 8);
else else
BattleAnimHelper_SetSpriteSquashParams(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8); BattleAnimHelper_SetSpriteSquashParams(task, task->tAttackerSpriteId, 0x180, 0xC0, 0x100, 0x100, 8);
if (task->data[2] & 1)
gSprites[task->data[15]].y2 -= 3; if (task->tTimer2 & 1)
task->data[1] = 0; gSprites[task->tAttackerSpriteId].y2 -= 3;
task->data[2] = 0;
task->data[3] = 0; task->tTimer1 = 0;
++task->data[0]; task->tTimer2 = 0;
task->tTimer3 = 0;
task->tState++;
} }
break; break;
case 5: case 5:
if (task->data[5]) if (task->tAttackerSide != B_SIDE_PLAYER)
--gSprites[task->data[15]].y; gSprites[task->tAttackerSpriteId].y--;
if (!BattleAnimHelper_RunSpriteSquash(task)) if (!BattleAnimHelper_RunSpriteSquash(task))
{ {
gSprites[task->data[15]].y = task->data[4]; gSprites[task->tAttackerSpriteId].y = task->tAttackerY;
ResetSpriteRotScale(task->data[15]); ResetSpriteRotScale(task->tAttackerSpriteId);
task->tTimer2 = 0;
task->data[2] = 0; task->tState++;
++task->data[0];
} }
break; break;
case 6: case 6:
if (!task->data[6]) if (task->tActiveSprites == 0)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
break; break;
default:
break;
} }
} }
static void sub_80AD1F8(u8 spriteId, u8 taskId, u8 a3) static void CreateEruptionLaunchRocks(u8 spriteId, u8 taskId, u8 activeSpritesIdx)
{ {
u16 i, j; u16 i, j;
s8 sign; s8 sign;
u16 y = sub_80AD374(spriteId);
u16 y = GetEruptionLaunchRockInitialYPos(spriteId);
u16 x = gSprites[spriteId].x; u16 x = gSprites[spriteId].x;
if(GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) if(!GetBattlerSide(gBattleAnimAttacker))
{ {
x -= 0xC; x -= 12;
sign = 1; sign = 1;
} }
else else
{ {
x += 0x10; x += 16;
sign = -1; sign = -1;
} }
for (i = 0, j = 0; i <= 6; ++i)
for (i = 0, j = 0; i <= 6; i++)
{ {
u8 spriteId = CreateSprite(&gEruptionLaunchRockSpriteTemplate, x, y, 2); u8 spriteId = CreateSprite(&gEruptionLaunchRockSpriteTemplate, x, y, 2);
if (spriteId != 0x40) if (spriteId != MAX_SPRITES)
{ {
gSprites[spriteId].oam.tileNum += j * 4 + 0x40; gSprites[spriteId].oam.tileNum += j * 4 + 0x40;
if (++j >= 5) if (++j >= 5)
j = 0; j = 0;
sub_80AD3C8(&gSprites[spriteId], sEruptionLaunchRockCoords[i][0] * sign, sEruptionLaunchRockCoords[i][1]);
gSprites[spriteId].data[6] = taskId; InitEruptionLaunchRockCoordData(&gSprites[spriteId], sEruptionLaunchRockSpeeds[i][0] * sign, sEruptionLaunchRockSpeeds[i][1]);
gSprites[spriteId].data[7] = a3; gSprites[spriteId].sTaskId = taskId;
++gTasks[taskId].data[a3]; gSprites[spriteId].sActiveSpritesIdx = activeSpritesIdx;
gTasks[taskId].data[activeSpritesIdx]++;
} }
} }
} }
static void AnimEruptionLaunchRock(struct Sprite *sprite) static void AnimEruptionLaunchRock(struct Sprite *sprite)
{ {
sub_80AD3E4(sprite); UpdateEruptionLaunchRockPos(sprite);
if (sprite->invisible) if (sprite->invisible)
{ {
--gTasks[sprite->data[6]].data[sprite->data[7]]; gTasks[sprite->sTaskId].data[sprite->sActiveSpritesIdx]--;
DestroySprite(sprite); DestroySprite(sprite);
} }
} }
static u16 sub_80AD374(u8 spriteId) static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId)
{ {
u16 var1 = gSprites[spriteId].y + gSprites[spriteId].y2 + gSprites[spriteId].centerToCornerVecY; s16 y = gSprites[spriteId].y + gSprites[spriteId].y2 + gSprites[spriteId].centerToCornerVecY;
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
var1 = ((var1 << 16) + 0x4A0000) >> 16; y += 74;
else else
var1 = ((var1 << 16) + 0x2C0000) >> 16; y += 44;
return var1;
return y;
} }
static void sub_80AD3C8(struct Sprite *sprite, s16 x, s16 y) static void InitEruptionLaunchRockCoordData(struct Sprite *sprite, s16 speedX, s16 speedY)
{ {
sprite->data[0] = 0; sprite->sSpeedDelay = 0;
sprite->data[1] = 0; sprite->sLaunchStage = 0;
sprite->data[2] = (u16)sprite->x * 8; sprite->sX = (u16)sprite->x * 8;
sprite->data[3] = (u16)sprite->y * 8; sprite->sY = (u16)sprite->y * 8;
sprite->data[4] = x * 8; sprite->sSpeedX = speedX * 8;
sprite->data[5] = y * 8; sprite->sSpeedY = speedY * 8;
} }
static void sub_80AD3E4(struct Sprite *sprite) static void UpdateEruptionLaunchRockPos(struct Sprite *sprite)
{ {
s32 var1; int extraLaunchSpeed;
if (++sprite->sSpeedDelay > 2)
if (++sprite->data[0] > 2)
{ {
sprite->data[0] = 0; sprite->sSpeedDelay = 0;
++sprite->data[1]; ++sprite->sLaunchStage;
var1 = (u16)sprite->data[1] * (u16)sprite->data[1]; extraLaunchSpeed = (u16)sprite->sLaunchStage * (u16)sprite->sLaunchStage;
sprite->data[3] += var1; sprite->sY += extraLaunchSpeed;
} }
sprite->data[2] += sprite->data[4];
sprite->x = sprite->data[2] >> 3; sprite->sX += sprite->sSpeedX;
sprite->data[3] += sprite->data[5]; sprite->x = sprite->sX >> 3;
sprite->y = sprite->data[3] >> 3; sprite->sY += sprite->sSpeedY;
if (sprite->x < -8 || sprite->x > 0xf8 || sprite->y < -8 || sprite->y > 120) sprite->y = sprite->sY >> 3;
if (sprite->x < -8 || sprite->x > DISPLAY_WIDTH + 8 || sprite->y < -8 || sprite->y > 120)
sprite->invisible = TRUE; sprite->invisible = TRUE;
} }
#undef IDX_ACTIVE_SPRITES
#undef tState
#undef tTimer1
#undef tTimer2
#undef tTimer3
#undef tAttackerY
#undef tAttackerSide
#undef tActiveSprites
#undef tAttackerSpriteId
#undef sSpeedDelay
#undef sLaunchStage
#undef sX
#undef sY
#undef sSpeedX
#undef sSpeedY
#undef sTaskId
#undef sActiveSpritesIdx
#define sState data[0]
#define sBounceTimer data[1]
#define sBounceDir data[2]
#define sEndTimer data[3]
#define sFallDelay data[6]
#define sTargetY data[7]
static void AnimEruptionFallingRock(struct Sprite *sprite) static void AnimEruptionFallingRock(struct Sprite *sprite)
{ {
sprite->x = gBattleAnimArgs[0]; sprite->x = gBattleAnimArgs[0];
sprite->y = gBattleAnimArgs[1]; sprite->y = gBattleAnimArgs[1];
sprite->data[0] = 0;
sprite->data[1] = 0; sprite->sState = 0;
sprite->data[2] = 0; sprite->sBounceTimer = 0;
sprite->data[6] = gBattleAnimArgs[2]; sprite->sBounceDir = 0;
sprite->data[7] = gBattleAnimArgs[3]; sprite->sFallDelay = gBattleAnimArgs[2];
sprite->sTargetY = gBattleAnimArgs[3];
sprite->oam.tileNum += gBattleAnimArgs[4] * 16; sprite->oam.tileNum += gBattleAnimArgs[4] * 16;
sprite->callback = sub_80AD4A8; sprite->callback = AnimEruptionFallingRock_Step;
} }
static void sub_80AD4A8(struct Sprite *sprite) static void AnimEruptionFallingRock_Step(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->sState)
{ {
case 0: case 0:
if (sprite->data[6] != 0) // Wait to begin falling
if (sprite->sFallDelay != 0)
{ {
--sprite->data[6]; sprite->sFallDelay--;
return; return;
} }
++sprite->data[0];
sprite->sState++;
// fall through // fall through
case 1: case 1:
// Rock is falling
sprite->y += 8; sprite->y += 8;
if (sprite->y >= sprite->data[7]) if (sprite->y >= sprite->sTargetY)
{ {
sprite->y = sprite->data[7]; sprite->y = sprite->sTargetY;
++sprite->data[0]; sprite->sState++;
} }
break; break;
case 2: case 2:
if (++sprite->data[1] > 1) // Bounce up and down on landing spot
if (++sprite->sBounceTimer > 1)
{ {
sprite->data[1] = 0; sprite->sBounceTimer = 0;
if ((++sprite->data[2] & 1) != 0) if ((++sprite->sBounceDir & 1) != 0)
sprite->y2 = -3; sprite->y2 = -3;
else else
sprite->y2 = 3; sprite->y2 = 3;
} }
if (++sprite->data[3] > 16)
if (++sprite->sEndTimer > 16)
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
break; break;
} }
} }
#undef sState
#undef sBounceTimer
#undef sBounceDir
#undef sEndTimer
#undef sFallDelay
#undef sTargetY
//wisp orb //wisp orb
static void AnimWillOWispOrb(struct Sprite *sprite) static void AnimWillOWispOrb(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
case 0: case 0:
InitSpritePosToAnimAttacker(sprite, 0); InitSpritePosToAnimAttacker(sprite, FALSE);
StartSpriteAnim(sprite, gBattleAnimArgs[2]); StartSpriteAnim(sprite, gBattleAnimArgs[2]);
sprite->data[7] = gBattleAnimArgs[2]; sprite->data[7] = gBattleAnimArgs[2];
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
@@ -1016,14 +1095,14 @@ static void AnimWillOWispOrb(struct Sprite *sprite)
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
sprite->callback = sub_80AD690; sprite->callback = AnimWillOWispOrb_Step;
} }
break; break;
} }
} }
static void sub_80AD690(struct Sprite *sprite) static void AnimWillOWispOrb_Step(struct Sprite *sprite)
{ {
s16 initialData5, newData5; s16 initialData5, newData5;
@@ -1042,7 +1121,6 @@ static void sub_80AD690(struct Sprite *sprite)
} }
} }
//wisp fire
static void AnimWillOWispFire(struct Sprite *sprite) static void AnimWillOWispFire(struct Sprite *sprite)
{ {
if (!sprite->data[0]) if (!sprite->data[0])
@@ -1083,10 +1161,10 @@ void AnimTask_MoveHeatWaveTargets(u8 taskId)
task->data[13] = IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK) + 1; task->data[13] = IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK) + 1;
task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET); task->data[14] = GetAnimBattlerSpriteId(ANIM_TARGET);
task->data[15] = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER); task->data[15] = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER);
task->func = sub_80AD870; task->func = AnimTask_MoveHeatWaveTargets_Step;
} }
static void sub_80AD870(u8 taskId) static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -1153,7 +1231,7 @@ static void sub_80AD870(u8 taskId)
} }
} }
// Used to add a color mask to the battle interface / HUD in Heat Wave. // Used to add a color mask to the battle background.
// arg 0: opacity // arg 0: opacity
// arg 1: color code // arg 1: color code
void AnimTask_BlendBackground(u8 taskId) void AnimTask_BlendBackground(u8 taskId)
@@ -1165,29 +1243,40 @@ void AnimTask_BlendBackground(u8 taskId)
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
#define tShakeNum data[0]
#define tMaxShakes data[1]
#define tShakeOffset data[2] // Never read, gBattleAnimArgs[1] is used directly instead
#define tVertical data[3]
#define tPatternId data[4]
// Shakes target horizontally or vertically tMaxShakes times, following a set pattern of alternations
void AnimTask_ShakeTargetInPattern(u8 taskId) void AnimTask_ShakeTargetInPattern(u8 taskId)
{ {
s8 unk; s8 dir;
u8 spriteId; u8 spriteId;
if (gTasks[taskId].data[0] == 0) if (gTasks[taskId].tShakeNum == 0)
{ {
gTasks[taskId].data[1] = gBattleAnimArgs[0]; gTasks[taskId].tMaxShakes = gBattleAnimArgs[0];
gTasks[taskId].data[2] = gBattleAnimArgs[1]; gTasks[taskId].tShakeOffset = gBattleAnimArgs[1];
gTasks[taskId].data[3] = gBattleAnimArgs[2]; gTasks[taskId].tVertical = gBattleAnimArgs[2];
gTasks[taskId].data[4] = gBattleAnimArgs[3]; gTasks[taskId].tPatternId = gBattleAnimArgs[3];
} }
++gTasks[taskId].data[0]; gTasks[taskId].tShakeNum++;
spriteId = gBattlerSpriteIds[gBattleAnimTarget]; spriteId = gBattlerSpriteIds[gBattleAnimTarget];
if (!gTasks[taskId].data[4])
unk = sShakeDirsPattern0[gTasks[taskId].data[0] % 10]; if (gTasks[taskId].tPatternId == 0)
dir = sShakeDirsPattern0[gTasks[taskId].tShakeNum % 10];
else else
unk = sShakeDirsPattern1[gTasks[taskId].data[0] % 10]; dir = sShakeDirsPattern1[gTasks[taskId].tShakeNum % 10];
if (gTasks[taskId].data[3] == 1)
gSprites[spriteId].y2 = gBattleAnimArgs[1] * unk < 0 ? -(gBattleAnimArgs[1] * unk) : gBattleAnimArgs[1] * unk; if (gTasks[taskId].tVertical == TRUE)
gSprites[spriteId].y2 = gBattleAnimArgs[1] * dir < 0 ? -(gBattleAnimArgs[1] * dir) : gBattleAnimArgs[1] * dir;
else else
gSprites[spriteId].x2 = gBattleAnimArgs[1] * unk; gSprites[spriteId].x2 = gBattleAnimArgs[1] * dir;
if (gTasks[taskId].data[0] == gTasks[taskId].data[1])
if (gTasks[taskId].tShakeNum == gTasks[taskId].tMaxShakes)
{ {
gSprites[spriteId].x2 = 0; gSprites[spriteId].x2 = 0;
gSprites[spriteId].y2 = 0; gSprites[spriteId].y2 = 0;
+1 -1
View File
@@ -226,7 +226,7 @@ static void AnimConfuseRayBallBounce(struct Sprite *sprite)
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->data[3] = sprite->y; sprite->data[3] = sprite->y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
sprite->callback = sub_80B52D0; sprite->callback = sub_80B52D0;
sprite->data[6] = 16; sprite->data[6] = 16;
SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL));
+2 -2
View File
@@ -584,7 +584,7 @@ static void AnimIcePunchSwirlingParticle(struct Sprite *sprite)
sprite->data[3] = 30; sprite->data[3] = 30;
sprite->data[4] = -512; sprite->data[4] = -512;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration; sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite); sprite->callback(sprite);
} }
@@ -1230,7 +1230,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
sprite->data[2] = -0x10; sprite->data[2] = -0x10;
++sprite->data[7]; ++sprite->data[7];
sprite->x2 = sprite->y2 = 0; sprite->x2 = sprite->y2 = 0;
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
} }
break; break;
case 2: case 2:
+3 -3
View File
@@ -413,7 +413,7 @@ void TranslateSpriteInCircle(struct Sprite *sprite)
// x = (a0 + da * t) * sin(theta0 + dtheta * t) // x = (a0 + da * t) * sin(theta0 + dtheta * t)
// y = (a0 + da * t) * cos(theta0 + dtheta * t) // y = (a0 + da * t) * cos(theta0 + dtheta * t)
void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite) void TranslateSpriteInGrowingCircle(struct Sprite *sprite)
{ {
if (sprite->data[3]) if (sprite->data[3])
{ {
@@ -1011,7 +1011,7 @@ static void PlayerThrowBall_AnimTranslateLinear_WithFollowup(struct Sprite *spri
SetCallbackToStoredInData6(sprite); SetCallbackToStoredInData6(sprite);
} }
void BattleAnim_InitLinearTranslationWithDuration(struct Sprite *sprite) void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite)
{ {
s32 v1 = abs(sprite->sTransl_DestX - sprite->sTransl_InitX) << 8; s32 v1 = abs(sprite->sTransl_DestX - sprite->sTransl_InitX) << 8;
@@ -1023,7 +1023,7 @@ void BattleAnim_InitAndRunLinearTranslationWithDuration(struct Sprite *sprite)
{ {
sprite->sTransl_InitX = sprite->x; sprite->sTransl_InitX = sprite->x;
sprite->sTransl_InitY = sprite->y; sprite->sTransl_InitY = sprite->y;
BattleAnim_InitLinearTranslationWithDuration(sprite); InitAnimLinearTranslationWithSpeed(sprite);
sprite->callback = AnimTranslateLinear_WithFollowup; sprite->callback = AnimTranslateLinear_WithFollowup;
sprite->callback(sprite); sprite->callback(sprite);
} }
+1 -1
View File
@@ -402,7 +402,7 @@ static void sub_80B9B8C(struct Sprite *sprite)
sprite->data[4] = 112; sprite->data[4] = 112;
sprite->data[5] = 0; sprite->data[5] = 0;
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = TranslateSpriteInGrowingCircleOverDuration; sprite->callback = TranslateSpriteInGrowingCircle;
sprite->callback(sprite); sprite->callback(sprite);
} }