Sync battle anim - poison, psychic

This commit is contained in:
GriffinR
2022-08-17 13:52:24 -04:00
parent a1fcfa2f26
commit 96ecc82c98
2 changed files with 65 additions and 56 deletions
+12 -12
View File
@@ -7,10 +7,10 @@ static void AnimAcidPoisonBubble(struct Sprite *sprite);
static void AnimSludgeBombHitParticle(struct Sprite *sprite); static void AnimSludgeBombHitParticle(struct Sprite *sprite);
static void AnimAcidPoisonDroplet(struct Sprite *sprite); static void AnimAcidPoisonDroplet(struct Sprite *sprite);
static void AnimBubbleEffect(struct Sprite *sprite); static void AnimBubbleEffect(struct Sprite *sprite);
static void sub_80B1684(struct Sprite *sprite); static void AnimSludgeProjectile_Step(struct Sprite *sprite);
static void sub_80B1728(struct Sprite *sprite); static void AnimAcidPoisonBubble_Step(struct Sprite *sprite);
static void sub_80B1798(struct Sprite *sprite); static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite);
static void AnimBubbleEffectStep(struct Sprite *sprite); static void AnimBubbleEffect_Step(struct Sprite *sprite);
static const union AnimCmd sAnim_ToxicBubble[] = static const union AnimCmd sAnim_ToxicBubble[] =
{ {
@@ -194,10 +194,10 @@ static void AnimSludgeProjectile(struct Sprite *sprite)
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
sprite->data[5] = -30; sprite->data[5] = -30;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = sub_80B1684; sprite->callback = AnimSludgeProjectile_Step;
} }
static void sub_80B1684(struct Sprite *sprite) static void AnimSludgeProjectile_Step(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -218,10 +218,10 @@ static void AnimAcidPoisonBubble(struct Sprite *sprite)
sprite->data[4] = l2 + gBattleAnimArgs[5]; sprite->data[4] = l2 + gBattleAnimArgs[5];
sprite->data[5] = -30; sprite->data[5] = -30;
InitAnimArcTranslation(sprite); InitAnimArcTranslation(sprite);
sprite->callback = sub_80B1728; sprite->callback = AnimAcidPoisonBubble_Step;
} }
static void sub_80B1728(struct Sprite *sprite) static void AnimAcidPoisonBubble_Step(struct Sprite *sprite)
{ {
if (TranslateAnimHorizontalArc(sprite)) if (TranslateAnimHorizontalArc(sprite))
DestroyAnimSprite(sprite); DestroyAnimSprite(sprite);
@@ -237,10 +237,10 @@ static void AnimSludgeBombHitParticle(struct Sprite *sprite)
InitSpriteDataForLinearTranslation(sprite); InitSpriteDataForLinearTranslation(sprite);
sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2];
sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2];
sprite->callback = sub_80B1798; sprite->callback = AnimSludgeBombHitParticle_Step;
} }
static void sub_80B1798(struct Sprite *sprite) static void AnimSludgeBombHitParticle_Step(struct Sprite *sprite)
{ {
TranslateSpriteLinearFixedPoint(sprite); TranslateSpriteLinearFixedPoint(sprite);
sprite->data[1] -= sprite->data[5]; sprite->data[1] -= sprite->data[5];
@@ -284,10 +284,10 @@ static void AnimBubbleEffect(struct Sprite *sprite)
sprite->x += gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[1];
} }
sprite->callback = AnimBubbleEffectStep; sprite->callback = AnimBubbleEffect_Step;
} }
static void AnimBubbleEffectStep(struct Sprite *sprite) static void AnimBubbleEffect_Step(struct Sprite *sprite)
{ {
sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF;
sprite->x2 = Sin(sprite->data[0], 4); sprite->x2 = Sin(sprite->data[0], 4);
+53 -44
View File
@@ -12,18 +12,18 @@ static void AnimQuestionMark(struct Sprite *sprite);
static void AnimRedX(struct Sprite *sprite); static void AnimRedX(struct Sprite *sprite);
static void AnimSkillSwapOrb(struct Sprite *sprite); static void AnimSkillSwapOrb(struct Sprite *sprite);
static void AnimPsychoBoost(struct Sprite *sprite); static void AnimPsychoBoost(struct Sprite *sprite);
static void sub_80B300C(struct Sprite *sprite); static void AnimDefensiveWall_Step2(struct Sprite *sprite);
static void sub_80B3044(struct Sprite *sprite); static void AnimDefensiveWall_Step3(struct Sprite *sprite);
static void sub_80B30B0(struct Sprite *sprite); static void AnimDefensiveWall_Step4(struct Sprite *sprite);
static void sub_80B3168(struct Sprite *sprite); static void AnimDefensiveWall_Step5(struct Sprite *sprite);
static void sub_80B3384(struct Sprite *sprite); static void AnimQuestionMark_Step1(struct Sprite *sprite);
static void sub_80B33B8(struct Sprite *sprite); static void AnimQuestionMark_Step2(struct Sprite *sprite);
static void sub_80B3454(u8 taskId); static void AnimTask_MeditateStretchAttacker_Step(u8 taskId);
static void sub_80B34DC(u8 taskId); static void AnimTask_Teleport_Step(u8 taskId);
static void sub_80B3618(u8 taskId); static void AnimTask_ImprisonOrbs_Step(u8 taskId);
static void sub_80B3980(u8 taskId); static void AnimTask_SkillSwap_Step(u8 taskId);
static void sub_80B3B78(u8 taskId); static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId);
static void sub_80B3D78(u8 taskId); static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId);
static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] = static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] =
{ {
@@ -415,6 +415,7 @@ const struct SpriteTemplate gPsychoBoostOrbSpriteTemplate =
.callback = AnimPsychoBoost, .callback = AnimPsychoBoost,
}; };
// For the rectangular wall sprite used by Reflect, Mirror Coat, etc
static void AnimDefensiveWall(struct Sprite *sprite) static void AnimDefensiveWall(struct Sprite *sprite)
{ {
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest()) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest())
@@ -459,20 +460,22 @@ static void AnimDefensiveWall(struct Sprite *sprite)
if (IsContest()) if (IsContest())
sprite->y += 9; sprite->y += 9;
sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16; sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16;
sprite->callback = sub_80B300C; sprite->callback = AnimDefensiveWall_Step2;
sub_80B300C(sprite); sprite->callback(sprite);
} }
static void sub_80B300C(struct Sprite *sprite) // AnimDefensiveWall_Step1 is removed in FRLG from the removal of Contest handling
static void AnimDefensiveWall_Step2(struct Sprite *sprite)
{ {
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));
if (sprite->data[3] == 13) if (sprite->data[3] == 13)
sprite->callback = sub_80B3044; sprite->callback = AnimDefensiveWall_Step3;
else else
++sprite->data[3]; ++sprite->data[3];
} }
static void sub_80B3044(struct Sprite *sprite) static void AnimDefensiveWall_Step3(struct Sprite *sprite)
{ {
u16 color; u16 color;
u16 startOffset; u16 startOffset;
@@ -487,11 +490,11 @@ static void sub_80B3044(struct Sprite *sprite)
gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1]; gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1];
gPlttBufferFaded[startOffset + 1] = color; gPlttBufferFaded[startOffset + 1] = color;
if (++sprite->data[2] == 16) if (++sprite->data[2] == 16)
sprite->callback = sub_80B30B0; sprite->callback = AnimDefensiveWall_Step4;
} }
} }
static void sub_80B30B0(struct Sprite *sprite) static void AnimDefensiveWall_Step4(struct Sprite *sprite)
{ {
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3]));
if (--sprite->data[3] == -1) if (--sprite->data[3] == -1)
@@ -508,11 +511,11 @@ static void sub_80B30B0(struct Sprite *sprite)
gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; gSprites[gBattlerSpriteIds[battler]].invisible = FALSE;
} }
sprite->invisible = TRUE; sprite->invisible = TRUE;
sprite->callback = sub_80B3168; sprite->callback = AnimDefensiveWall_Step5;
} }
} }
static void sub_80B3168(struct Sprite *sprite) static void AnimDefensiveWall_Step5(struct Sprite *sprite)
{ {
if (!IsContest()) if (!IsContest())
{ {
@@ -531,13 +534,14 @@ static void sub_80B3168(struct Sprite *sprite)
sprite->callback = DestroyAnimSprite; sprite->callback = DestroyAnimSprite;
} }
// Animates the sparkle that appears during Reflect or Light Screen/Mirror Coat
static void AnimWallSparkle(struct Sprite *sprite) static void AnimWallSparkle(struct Sprite *sprite)
{ {
if (sprite->data[0] == 0) if (sprite->data[0] == 0)
{ {
int arg3 = gBattleAnimArgs[3]; bool32 ignoreOffsets = gBattleAnimArgs[3];
bool8 respectMonPicOffsets = FALSE; bool8 respectMonPicOffsets = FALSE;
if (arg3 == 0) if (!ignoreOffsets)
respectMonPicOffsets = TRUE; respectMonPicOffsets = TRUE;
if (!IsContest() && IsDoubleBattle()) if (!IsContest() && IsDoubleBattle())
{ {
@@ -589,6 +593,7 @@ static void AnimBentSpoon(struct Sprite *sprite)
sprite->callback = RunStoredCallbackWhenAnimEnds; sprite->callback = RunStoredCallbackWhenAnimEnds;
} }
// Used by Amnesia
static void AnimQuestionMark(struct Sprite *sprite) static void AnimQuestionMark(struct Sprite *sprite)
{ {
s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2; s16 x = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 2;
@@ -600,20 +605,20 @@ static void AnimQuestionMark(struct Sprite *sprite)
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + y; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + y;
if (sprite->y < 16) if (sprite->y < 16)
sprite->y = 16; sprite->y = 16;
StoreSpriteCallbackInData6(sprite, sub_80B3384); StoreSpriteCallbackInData6(sprite, AnimQuestionMark_Step1);
sprite->callback = RunStoredCallbackWhenAnimEnds; sprite->callback = RunStoredCallbackWhenAnimEnds;
} }
static void sub_80B3384(struct Sprite *sprite) static void AnimQuestionMark_Step1(struct Sprite *sprite)
{ {
sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;
sprite->affineAnims = sAffineAnims_QuestionMark; sprite->affineAnims = sAffineAnims_QuestionMark;
sprite->data[0] = 0; sprite->data[0] = 0;
InitSpriteAffineAnim(sprite); InitSpriteAffineAnim(sprite);
sprite->callback = sub_80B33B8; sprite->callback = AnimQuestionMark_Step2;
} }
static void sub_80B33B8(struct Sprite *sprite) static void AnimQuestionMark_Step2(struct Sprite *sprite)
{ {
switch (sprite->data[0]) switch (sprite->data[0])
{ {
@@ -640,10 +645,10 @@ void AnimTask_MeditateStretchAttacker(u8 taskId)
task->data[0] = spriteId; task->data[0] = spriteId;
PrepareAffineAnimInTaskData(task, spriteId, sAffineAnim_MeditateStretchAttacker); PrepareAffineAnimInTaskData(task, spriteId, sAffineAnim_MeditateStretchAttacker);
task->func = sub_80B3454; task->func = AnimTask_MeditateStretchAttacker_Step;
} }
static void sub_80B3454(u8 taskId) static void AnimTask_MeditateStretchAttacker_Step(u8 taskId)
{ {
if (!RunAffineAnimFromTaskData(&gTasks[taskId])) if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
@@ -659,10 +664,10 @@ void AnimTask_Teleport(u8 taskId)
task->data[2] = 0; task->data[2] = 0;
task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8; task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8;
PrepareAffineAnimInTaskData(task, task->data[0], sAffineAnim_Teleport); PrepareAffineAnimInTaskData(task, task->data[0], sAffineAnim_Teleport);
task->func = sub_80B34DC; task->func = AnimTask_Teleport_Step;
} }
static void sub_80B34DC(u8 taskId) static void AnimTask_Teleport_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -682,7 +687,7 @@ static void sub_80B34DC(u8 taskId)
else else
{ {
gSprites[task->data[0]].invisible = TRUE; gSprites[task->data[0]].invisible = TRUE;
gSprites[task->data[0]].x = 272; gSprites[task->data[0]].x = DISPLAY_WIDTH + 32;
ResetSpriteRotScale(task->data[0]); ResetSpriteRotScale(task->data[0]);
DestroyAnimVisualTask(taskId); DestroyAnimVisualTask(taskId);
} }
@@ -704,10 +709,10 @@ void AnimTask_ImprisonOrbs(u8 taskId)
task->data[12] = var0 > var1 ? var0 : var1; task->data[12] = var0 > var1 ? var0 : var1;
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
task->func = sub_80B3618; task->func = AnimTask_ImprisonOrbs_Step;
} }
static void sub_80B3618(u8 taskId) static void AnimTask_ImprisonOrbs_Step(u8 taskId)
{ {
u16 i; u16 i;
u8 spriteId; u8 spriteId;
@@ -757,7 +762,7 @@ static void sub_80B3618(u8 taskId)
if (++task->data[1] == 32) if (++task->data[1] == 32)
{ {
for (i = 8; i < 13; ++i) for (i = 8; i < 13; ++i)
if (task->data[i] != 64) if (task->data[i] != MAX_SPRITES)
DestroySprite(&gSprites[task->data[i]]); DestroySprite(&gSprites[task->data[i]]);
++task->data[0]; ++task->data[0];
} }
@@ -773,7 +778,7 @@ static void sub_80B3618(u8 taskId)
} }
} }
static void sub_80B37A4(struct Sprite *sprite) static void AnimRedX_Step(struct Sprite *sprite)
{ {
if (sprite->data[1] > sprite->data[0] - 10) if (sprite->data[1] > sprite->data[0] - 10)
sprite->invisible = sprite->data[1] & 1; sprite->invisible = sprite->data[1] & 1;
@@ -790,7 +795,7 @@ static void AnimRedX(struct Sprite *sprite)
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
} }
sprite->data[0] = gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[1];
sprite->callback = sub_80B37A4; sprite->callback = AnimRedX_Step;
} }
void AnimTask_SkillSwap(u8 taskId) void AnimTask_SkillSwap(u8 taskId)
@@ -799,7 +804,7 @@ void AnimTask_SkillSwap(u8 taskId)
if (IsContest()) if (IsContest())
{ {
if (gBattleAnimArgs[0] == 1) if (gBattleAnimArgs[0] == ANIM_TARGET)
{ {
task->data[10] = -10; task->data[10] = -10;
task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_RIGHT) - 8;
@@ -836,10 +841,10 @@ void AnimTask_SkillSwap(u8 taskId)
} }
} }
task->data[1] = 6; task->data[1] = 6;
task->func = sub_80B3980; task->func = AnimTask_SkillSwap_Step;
} }
static void sub_80B3980(u8 taskId) static void AnimTask_SkillSwap_Step(u8 taskId)
{ {
u8 spriteId; u8 spriteId;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -881,6 +886,8 @@ static void AnimSkillSwapOrb(struct Sprite *sprite)
} }
} }
// The scanline effect that distorts the target during Extrasensory by segmenting the mon vertically and shifting the slices
// arg0: Stage. Stage 0 is a slight right distortion, 1 is a medium left distortion, and 2 is a severe right distortion
void AnimTask_ExtrasensoryDistortion(u8 taskId) void AnimTask_ExtrasensoryDistortion(u8 taskId)
{ {
s16 i; s16 i;
@@ -932,10 +939,10 @@ void AnimTask_ExtrasensoryDistortion(u8 taskId)
scanlineParams.initState = 1; scanlineParams.initState = 1;
scanlineParams.unused9 = 0; scanlineParams.unused9 = 0;
ScanlineEffect_SetParams(scanlineParams); ScanlineEffect_SetParams(scanlineParams);
task->func = sub_80B3B78; task->func = AnimTask_ExtrasensoryDistortion_Step;
} }
static void sub_80B3B78(u8 taskId) static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId)
{ {
s16 sineIndex, i; s16 sineIndex, i;
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];
@@ -969,6 +976,8 @@ static void sub_80B3B78(u8 taskId)
} }
} }
// Creates a cloned transparent sprite of the battler that grows and then shrinks back to original size. Used by Extrasensory
// arg0: battler
void AnimTask_TransparentCloneGrowAndShrink(u8 taskId) void AnimTask_TransparentCloneGrowAndShrink(u8 taskId)
{ {
s16 spriteId; s16 spriteId;
@@ -998,10 +1007,10 @@ void AnimTask_TransparentCloneGrowAndShrink(u8 taskId)
task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
task->data[14] = matrixNum; task->data[14] = matrixNum;
task->data[15] = spriteId; task->data[15] = spriteId;
task->func = sub_80B3D78; task->func = AnimTask_TransparentCloneGrowAndShrink_Step;
} }
static void sub_80B3D78(u8 taskId) static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId)
{ {
struct Task *task = &gTasks[taskId]; struct Task *task = &gTasks[taskId];