Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions src/battle_anim_electric.c
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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)
Expand Down
54 changes: 0 additions & 54 deletions src/battle_anim_fire.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
}
}