diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index cc36e608f891..95a6b8ff628d 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -37,6 +37,19 @@ static void AnimShockWaveProgressingBolt(struct Sprite *); static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId); static void AnimShockWaveLightning(struct Sprite *sprite); +// Directions for shaking up/down or left/right in AnimTask_ShakeTargetInPattern +// Only first 10 values are ever accessed. +// First pattern results in larger shakes, second results in faster oscillation +static const s8 sShakeDirsPattern0[16] = +{ + -1, -1, 0, 1, 1, 0, 0, -1, -1, 1, 1, 0, 0, -1, 0, 1, +}; + +static const s8 sShakeDirsPattern1[16] = +{ + -1, 0, 1, 0, -1, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, 1, +}; + static const union AnimCmd sAnim_Lightning[] = { ANIMCMD_FRAME(0, 5), @@ -456,6 +469,48 @@ const struct SpriteTemplate gShockWaveProgressingBoltSpriteTemplate = .callback = AnimShockWaveProgressingBolt, }; + +#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) +{ + s8 dir; + u8 spriteId; + + if (gTasks[taskId].tShakeNum == 0) + { + gTasks[taskId].tMaxShakes = gBattleAnimArgs[0]; + gTasks[taskId].tShakeOffset = gBattleAnimArgs[1]; + gTasks[taskId].tVertical = gBattleAnimArgs[2]; + gTasks[taskId].tPatternId = gBattleAnimArgs[3]; + } + gTasks[taskId].tShakeNum++; + + spriteId = gBattlerSpriteIds[gBattleAnimTarget]; + + if (gTasks[taskId].tPatternId == 0) + dir = sShakeDirsPattern0[gTasks[taskId].tShakeNum % 10]; + else + dir = sShakeDirsPattern1[gTasks[taskId].tShakeNum % 10]; + + if (gTasks[taskId].tVertical == TRUE) + gSprites[spriteId].y2 = abs(gBattleAnimArgs[1] * dir); + else + gSprites[spriteId].x2 = gBattleAnimArgs[1] * dir; + + if (gTasks[taskId].tShakeNum == gTasks[taskId].tMaxShakes) + { + gSprites[spriteId].x2 = 0; + gSprites[spriteId].y2 = 0; + DestroyAnimVisualTask(taskId); + } +} + static void AnimLightning(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index 6a9b3a7fadcd..5feb37ebbf0f 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -449,19 +449,6 @@ const struct SpriteTemplate gWillOWispFireSpriteTemplate = .callback = AnimWillOWispFire, }; -// Directions for shaking up/down or left/right in AnimTask_ShakeTargetInPattern -// Only first 10 values are ever accessed. -// First pattern results in larger shakes, second results in faster oscillation -static const s8 sShakeDirsPattern0[16] = -{ - -1, -1, 0, 1, 1, 0, 0, -1, -1, 1, 1, 0, 0, -1, 0, 1, -}; - -static const s8 sShakeDirsPattern1[16] = -{ - -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) { @@ -1333,44 +1320,3 @@ void AnimTask_BlendBackground(u8 taskId) BlendPalette(BG_PLTT_ID(animBg.paletteId), 16, gBattleAnimArgs[0], gBattleAnimArgs[1]); 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) -{ - s8 dir; - u8 spriteId; - - if (gTasks[taskId].tShakeNum == 0) - { - gTasks[taskId].tMaxShakes = gBattleAnimArgs[0]; - gTasks[taskId].tShakeOffset = gBattleAnimArgs[1]; - gTasks[taskId].tVertical = gBattleAnimArgs[2]; - gTasks[taskId].tPatternId = gBattleAnimArgs[3]; - } - gTasks[taskId].tShakeNum++; - - spriteId = gBattlerSpriteIds[gBattleAnimTarget]; - - if (gTasks[taskId].tPatternId == 0) - dir = sShakeDirsPattern0[gTasks[taskId].tShakeNum % 10]; - else - dir = sShakeDirsPattern1[gTasks[taskId].tShakeNum % 10]; - - if (gTasks[taskId].tVertical == TRUE) - gSprites[spriteId].y2 = gBattleAnimArgs[1] * dir < 0 ? -(gBattleAnimArgs[1] * dir) : gBattleAnimArgs[1] * dir; - else - gSprites[spriteId].x2 = gBattleAnimArgs[1] * dir; - - if (gTasks[taskId].tShakeNum == gTasks[taskId].tMaxShakes) - { - gSprites[spriteId].x2 = 0; - gSprites[spriteId].y2 = 0; - DestroyAnimVisualTask(taskId); - } -}