summaryrefslogtreecommitdiff
path: root/src/battle/battle_anim_80A7E7C.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle/battle_anim_80A7E7C.c')
-rw-r--r--src/battle/battle_anim_80A7E7C.c940
1 files changed, 940 insertions, 0 deletions
diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c
new file mode 100644
index 000000000..e0c79dc8e
--- /dev/null
+++ b/src/battle/battle_anim_80A7E7C.c
@@ -0,0 +1,940 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+#define SPRITE gSprites[TASK.data[0]]
+
+extern s16 gBattleAnimArgs[8];
+
+extern u8 gObjectBankIDs[];
+extern s32 gMoveDmgMoveAnim;
+extern u16 gMovePowerMoveAnim;
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80A7EF0(u8 taskId);
+static void sub_80A808C(u8 taskId);
+static void sub_80A81D8(u8 taskId);
+static void sub_80A8374(u8 taskId);
+static void sub_80A8488(u8 taskId);
+static void sub_80A85A4(struct Sprite *sprite);
+void sub_80A8614(struct Sprite* sprite);
+static void sub_80A86F4(struct Sprite *sprite);
+static void sub_80A88F0(struct Sprite *sprite);
+static void sub_80A89B4(u8 taskId);
+static void sub_80A8A18(u8 taskId);
+static void sub_80A8C0C(u8 taskId);
+static void sub_80A8D8C(u8 taskId);
+void sub_80A8FD8(u8 taskId);
+static void sub_80A913C(u8 taskId);
+
+void sub_80A7E7C(u8 taskId)
+{
+ u8 sprite;
+ sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (sprite == 0xff)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ gSprites[sprite].pos2.x = gBattleAnimArgs[1];
+ gSprites[sprite].pos2.y = gBattleAnimArgs[2];
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[3];
+ TASK.data[2] = gBattleAnimArgs[4];
+ TASK.data[3] = gBattleAnimArgs[4];
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = gBattleAnimArgs[2];
+ TASK.func = sub_80A7EF0;
+ sub_80A7EF0(taskId);
+}
+
+static void sub_80A7EF0(u8 taskId)
+{
+ if (TASK.data[3] == 0)
+ {
+ if (SPRITE.pos2.x == 0)
+ {
+ SPRITE.pos2.x = TASK.data[4];
+ }
+ else
+ {
+ SPRITE.pos2.x = 0;
+ }
+ if (SPRITE.pos2.y == 0)
+ {
+ SPRITE.pos2.y = TASK.data[5];
+ }
+ else
+ {
+ SPRITE.pos2.y = 0;
+ }
+ TASK.data[3] = TASK.data[2];
+ if (--TASK.data[1] == 0)
+ {
+ SPRITE.pos2.x = 0;
+ SPRITE.pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+ else
+ {
+ TASK.data[3]--;
+ }
+}
+
+
+void sub_80A7FA0(u8 taskId)
+{
+ u8 sprite;
+ bool8 r6;
+ u8 side;
+ r6 = 0;
+ if (gBattleAnimArgs[0] < 4)
+ {
+ sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (sprite == 0xff)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+ else if (gBattleAnimArgs[0] != 8)
+ {
+ switch (gBattleAnimArgs[0])
+ {
+ case 4:
+ side = GetBankByPlayerAI(0);
+ break;
+ case 5:
+ side = GetBankByPlayerAI(2);
+ break;
+ case 6:
+ side = GetBankByPlayerAI(1);
+ break;
+ case 7:
+ default:
+ side = GetBankByPlayerAI(3);
+ break;
+ }
+ if (IsAnimBankSpriteVisible(side) == FALSE)
+ {
+ r6 = 1;
+ }
+ sprite = gObjectBankIDs[side];
+ }
+ else
+ {
+ sprite = gObjectBankIDs[gBattleAnimBankAttacker];
+ }
+ if (r6)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ gSprites[sprite].pos2.x = gBattleAnimArgs[1];
+ gSprites[sprite].pos2.y = gBattleAnimArgs[2];
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[3];
+ TASK.data[2] = gBattleAnimArgs[4];
+ TASK.data[3] = gBattleAnimArgs[4];
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = gBattleAnimArgs[2];
+ TASK.func = sub_80A808C;
+ sub_80A808C(taskId);
+}
+
+static void sub_80A808C(u8 taskId)
+{
+ if (TASK.data[3] == 0)
+ {
+ if (SPRITE.pos2.x == TASK.data[4])
+ {
+ SPRITE.pos2.x = -TASK.data[4];
+ }
+ else
+ {
+ SPRITE.pos2.x = TASK.data[4];
+ }
+ if (SPRITE.pos2.y == TASK.data[5])
+ {
+ SPRITE.pos2.y = -TASK.data[5];
+ }
+ else
+ {
+ SPRITE.pos2.y = TASK.data[5];
+ }
+ TASK.data[3] = TASK.data[2];
+ if (--TASK.data[1] == 0)
+ {
+ SPRITE.pos2.x = 0;
+ SPRITE.pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+ else
+ {
+ TASK.data[3]--;
+ }
+}
+
+void sub_80A8154(u8 taskId)
+{
+ u8 sprite;
+ sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (sprite == 0xff)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ gSprites[sprite].pos2.x += gBattleAnimArgs[1];
+ gSprites[sprite].pos2.y += gBattleAnimArgs[2];
+ TASK.data[0] = sprite;
+ TASK.data[1] = 0;
+ TASK.data[2] = gBattleAnimArgs[3];
+ TASK.data[3] = 0;
+ TASK.data[4] = gBattleAnimArgs[4];
+ TASK.data[5] = gBattleAnimArgs[1] * 2;
+ TASK.data[6] = gBattleAnimArgs[2] * 2;
+ TASK.func = sub_80A81D8;
+ sub_80A81D8(taskId);
+}
+
+static void sub_80A81D8(u8 taskId)
+{
+ if (TASK.data[3] == 0)
+ {
+ if (TASK.data[1] & 1)
+ {
+ SPRITE.pos2.x += TASK.data[5];
+ SPRITE.pos2.y += TASK.data[6];
+ }
+ else
+ {
+ SPRITE.pos2.x -= TASK.data[5];
+ SPRITE.pos2.y -= TASK.data[6];
+ }
+ TASK.data[3] = TASK.data[4];
+ if (++TASK.data[1] >= TASK.data[2])
+ {
+ if (TASK.data[1] & 1)
+ {
+ SPRITE.pos2.x += TASK.data[5] / 2;
+ SPRITE.pos2.y += TASK.data[6] / 2;
+ }
+ else
+ {
+ SPRITE.pos2.x -= TASK.data[5] / 2;
+ SPRITE.pos2.y -= TASK.data[6] / 2;
+ }
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+ else
+ {
+ TASK.data[3]--;
+ }
+}
+
+void sub_80A8314(u8 taskId)
+{
+ u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ gSprites[sprite].pos2.x = gBattleAnimArgs[1];
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = gBattleAnimArgs[4];
+ TASK.func = sub_80A8374;
+ sub_80A8374(taskId);
+}
+
+static void sub_80A8374(u8 taskId)
+{
+ s16 x;
+ u8 sprite;
+ sprite = TASK.data[0];
+ x = TASK.data[1];
+ if (TASK.data[2] == TASK.data[8]++)
+ {
+ TASK.data[8] = 0;
+ if (gSprites[sprite].pos2.x == x)
+ {
+ x = -x;
+ }
+ gSprites[sprite].pos2.x += x;
+ }
+ TASK.data[1] = x;
+ TASK.data[9] += TASK.data[3];
+ gSprites[sprite].pos2.y = TASK.data[9] >> 8;
+ if (--TASK.data[4] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+}
+
+void sub_80A8408(u8 taskId)
+{
+ u8 i;
+ u8 sprite;
+ u8 v1;
+ v1 = 1;
+ sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (gBattleAnimArgs[4] > 5)
+ {
+ gBattleAnimArgs[4] = 5;
+ }
+ for (i = 0; i < gBattleAnimArgs[4]; i++)
+ {
+ v1 <<= 1;
+ }
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = v1;
+ TASK.func = sub_80A8488;
+ sub_80A8488(taskId);
+}
+
+static void sub_80A8488(u8 taskId)
+{
+ u8 sprite;
+ sprite = TASK.data[0];
+ gSprites[sprite].pos2.x = Sin(TASK.data[5], TASK.data[1]);
+ gSprites[sprite].pos2.y = -Cos(TASK.data[5], TASK.data[2]);
+ gSprites[sprite].pos2.y += TASK.data[2];
+ TASK.data[5] += TASK.data[4];
+ TASK.data[5] &= 0xff;
+ if (TASK.data[5] == 0)
+ {
+ TASK.data[3]--;
+ }
+ if (TASK.data[3] == 0)
+ {
+ gSprites[sprite].pos2.x = 0;
+ gSprites[sprite].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+}
+
+void sub_80A8500(u8 taskId)
+{
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ sub_80A8408(taskId);
+}
+
+void sub_80A8530(struct Sprite *sprite)
+{
+ sprite->invisible = TRUE;
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ sprite->data1 = -gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->data1 = gBattleAnimArgs[1];
+ }
+ sprite->data0 = gBattleAnimArgs[0];
+ sprite->data2 = 0;
+ sprite->data3 = gObjectBankIDs[gBattleAnimBankAttacker];
+ sprite->data4 = gBattleAnimArgs[0];
+ StoreSpriteCallbackInData6(sprite, sub_80A85A4);
+ sprite->callback = sub_8078458;
+}
+
+static void sub_80A85A4(struct Sprite *sprite)
+{
+ sprite->data0 = sprite->data4;
+ sprite->data1 = -sprite->data1;
+ sprite->callback = sub_8078458;
+ StoreSpriteCallbackInData6(sprite, move_anim_8072740);
+}
+
+void sub_80A85C8(struct Sprite *sprite)
+{
+ u8 spriteId;
+ sprite->invisible = TRUE;
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sprite->data0 = gBattleAnimArgs[0];
+ sprite->data1 = 0;
+ sprite->data2 = gBattleAnimArgs[1];
+ sprite->data3 = spriteId;
+ sprite->data4 = gBattleAnimArgs[0];
+ StoreSpriteCallbackInData6(sprite, sub_80A8614);
+ sprite->callback = sub_8078458;
+}
+
+void sub_80A8614(struct Sprite *sprite)
+{
+ sprite->data0 = sprite->data4;
+ sprite->data2 = -sprite->data2;
+ sprite->callback = sub_8078458;
+ StoreSpriteCallbackInData6(sprite, move_anim_8072740);
+}
+
+void sub_80A8638(struct Sprite *sprite)
+{
+ int something;
+ int spriteId;
+ if (!gBattleAnimArgs[0])
+ {
+ spriteId = gObjectBankIDs[gBattleAnimBankAttacker];
+ }
+ else
+ {
+ spriteId = gObjectBankIDs[gBattleAnimBankTarget];
+ }
+ sprite->data0 = gBattleAnimArgs[2];
+ sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data2 = gSprites[spriteId].pos1.x;
+ sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data4 = gSprites[spriteId].pos1.y;
+ something = 0;
+ sub_8078A5C(sprite);
+ sprite->data3 = something;
+ sprite->data4 = something;
+ sprite->data5 = gSprites[spriteId].pos2.x;
+ sprite->data6 = gSprites[spriteId].pos2.y;
+ sprite->invisible = TRUE;
+ if (gBattleAnimArgs[1] == 1)
+ {
+ sprite->data2 = something;
+ }
+ else if (gBattleAnimArgs[1] == 2)
+ {
+ sprite->data1 = something;
+ }
+ sprite->data7 = gBattleAnimArgs[1];
+ sprite->data7 |= spriteId << 8;
+ sprite->callback = sub_80A86F4;
+}
+
+static void sub_80A86F4(struct Sprite *sprite)
+{
+ s8 spriteId;
+ u8 lo;
+ struct Sprite *sprite2;
+ lo = sprite->data7 & 0xff;
+ spriteId = sprite->data7 >> 8;
+ sprite2 = &gSprites[spriteId];
+ if (sprite->data0 == 0)
+ {
+ if (lo < 2)
+ {
+ sprite2->pos2.x = 0;
+ }
+ if (lo == 2 || lo == 0)
+ {
+ sprite2->pos2.y = 0;
+ }
+ move_anim_8072740(sprite);
+ }
+ else
+ {
+ sprite->data0--;
+ sprite->data3 += sprite->data1;
+ sprite->data4 += sprite->data2;
+ sprite2->pos2.x = (s8)(sprite->data3 >> 8) + sprite->data5;
+ sprite2->pos2.y = (s8)(sprite->data4 >> 8) + sprite->data6;
+ }
+}
+
+void sub_80A8764(struct Sprite *sprite)
+{
+ u8 v1;
+ u8 spriteId;
+ if (!gBattleAnimArgs[0])
+ {
+ v1 = gBattleAnimBankAttacker;
+ }
+ else
+ {
+ v1 = gBattleAnimBankTarget;
+ }
+ spriteId = gObjectBankIDs[v1];
+ if (GetBankSide(v1))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[3] == 1)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ }
+ sprite->data0 = gBattleAnimArgs[4];
+ sprite->data1 = gSprites[spriteId].pos1.x;
+ sprite->data2 = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
+ sprite->data3 = gSprites[spriteId].pos1.y;
+ sprite->data4 = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
+ sub_8078A5C(sprite);
+ sprite->data3 = 0;
+ sprite->data4 = 0;
+ sprite->data5 = spriteId;
+ sprite->invisible = TRUE;
+ StoreSpriteCallbackInData6(sprite, move_anim_8072740);
+ sprite->callback = sub_80784A8;
+}
+
+void sub_80A8818(struct Sprite *sprite)
+{
+ u8 spriteId;
+ u8 v1;
+ sprite->invisible = TRUE;
+ if (!gBattleAnimArgs[0])
+ {
+ v1 = gBattleAnimBankAttacker;
+ }
+ else
+ {
+ v1 = gBattleAnimBankTarget;
+ }
+ spriteId = gObjectBankIDs[v1];
+ if (GetBankSide(v1))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[3] == 1)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ }
+ sprite->data0 = gBattleAnimArgs[4];
+ sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data2 = sprite->data1 + gBattleAnimArgs[1];
+ sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data4 = sprite->data3 + gBattleAnimArgs[2];
+ sub_8078A5C(sprite);
+ sprite->data3 = gSprites[spriteId].pos2.x << 8;
+ sprite->data4 = gSprites[spriteId].pos2.y << 8;
+ sprite->data5 = spriteId;
+ sprite->data6 = gBattleAnimArgs[5];
+ if (!gBattleAnimArgs[5])
+ {
+ StoreSpriteCallbackInData6(sprite, move_anim_8072740);
+ }
+ else
+ {
+ StoreSpriteCallbackInData6(sprite, sub_80A88F0);
+ }
+ sprite->callback = sub_80784A8;
+}
+
+
+static void sub_80A88F0(struct Sprite *sprite)
+{
+ gSprites[sprite->data5].pos2.x = 0;
+ gSprites[sprite->data5].pos2.y = 0;
+ move_anim_8072740(sprite);
+}
+
+void sub_80A8920(u8 taskId)
+{
+ s16 r7;
+ r7 = 0x8000 / gBattleAnimArgs[3];
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[5] = -gBattleAnimArgs[5];
+ }
+ TASK.data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = gBattleAnimArgs[4];
+ TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6];
+ TASK.data[6] = gBattleAnimArgs[6];
+ TASK.data[7] = r7;
+ TASK.func = sub_80A89B4;
+}
+
+static void sub_80A89B4(u8 taskId)
+{
+ u8 spriteId;
+ spriteId = TASK.data[0];
+ TASK.data[11] += TASK.data[1];
+ gSprites[spriteId].pos2.x = TASK.data[11] >> 8;
+ gSprites[spriteId].pos2.y = Sin((u8)(TASK.data[10] >> 8), TASK.data[2]);
+ TASK.data[10] += TASK.data[7];
+ if (--TASK.data[3] == 0)
+ {
+ TASK.func = sub_80A8A18;
+ }
+}
+
+static void sub_80A8A18(u8 taskId)
+{
+ u8 spriteId;
+ if (TASK.data[4] > 0)
+ {
+ TASK.data[4]--;
+ }
+ else
+ {
+ spriteId = TASK.data[0];
+ TASK.data[12] += TASK.data[5];
+ gSprites[spriteId].pos2.x = (TASK.data[12] >> 8) + (TASK.data[11] >> 8);
+ if (--TASK.data[6] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+}
+
+static void sub_80A8B3C(u8 taskId);
+
+void sub_80A8A80(u8 taskId)
+{
+ u8 spriteId;
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ case 1:
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ break;
+ case 2:
+ if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ spriteId = gObjectBankIDs[gBattleAnimBankAttacker ^ 2];
+ break;
+ case 3:
+ if (!IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ spriteId = gObjectBankIDs[gBattleAnimBankTarget ^ 2];
+ break;
+ default:
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ TASK.data[0] = spriteId;
+ if (GetBankSide(gBattleAnimBankTarget))
+ {
+ TASK.data[1] = gBattleAnimArgs[1];
+ }
+ else
+ {
+ TASK.data[1] = -gBattleAnimArgs[1];
+ }
+ TASK.func = sub_80A8B3C;
+}
+
+static void sub_80A8B3C(u8 taskId)
+{
+ u8 spriteId = TASK.data[0];
+ gSprites[spriteId].pos2.x += TASK.data[1];
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x + 0x20 > 0x130u)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+}
+
+void sub_80A8B88(u8 taskId)
+{
+ u8 spriteId;
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
+ TASK.data[0] = gBattleAnimArgs[0];
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = spriteId;
+ if (gBattleAnimArgs[4] == 0)
+ {
+ TASK.data[5] = gBattleAnimBankAttacker;
+ }
+ else
+ {
+ TASK.data[5] = gBattleAnimBankTarget;
+ }
+ TASK.data[12] = 1;
+ TASK.func = sub_80A8C0C;
+}
+
+static void sub_80A8C0C(u8 taskId)
+{
+ s16 y;
+ u8 spriteId;
+ int index;
+ u16 val;
+ spriteId = TASK.data[4];
+ val = TASK.data[10] + TASK.data[2];
+ TASK.data[10] = val;
+ index = val >> 8;
+ y = Sin(index, TASK.data[1]);
+ if (TASK.data[0] == 0)
+ {
+ gSprites[spriteId].pos2.x = y;
+ }
+ else
+ {
+ if (GetBankSide(TASK.data[5]) == 0)
+ {
+ gSprites[spriteId].pos2.y = (y >= 0) ? y : -y;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.y = (y >= 0) ? -y : y;
+ }
+ }
+ if (((index >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1))
+ || ((index < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0)))
+ {
+ TASK.data[11] ^= 1;
+ TASK.data[12] ^= 1;
+ if (--TASK.data[3] == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+}
+
+void sub_80A8D34(u8 taskId)
+{
+ u8 spriteId;
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
+ sub_8078E70(spriteId, gBattleAnimArgs[4]);
+ TASK.data[0] = gBattleAnimArgs[0];
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[2];
+ TASK.data[4] = spriteId;
+ TASK.data[10] = 0x100;
+ TASK.data[11] = 0x100;
+ TASK.func = sub_80A8D8C;
+}
+
+static void sub_80A8D8C(u8 taskId)
+{
+ u8 spriteId;
+ TASK.data[10] += TASK.data[0];
+ TASK.data[11] += TASK.data[1];
+ spriteId = TASK.data[4];
+ obj_id_set_rotscale(spriteId, TASK.data[10], TASK.data[11], 0);
+ if (--TASK.data[2] == 0)
+ {
+ if (TASK.data[3] > 0)
+ {
+ TASK.data[0] = -TASK.data[0];
+ TASK.data[1] = -TASK.data[1];
+ TASK.data[2] = TASK.data[3];
+ TASK.data[3] = 0;
+ }
+ else
+ {
+ sub_8078F40(spriteId);
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+}
+
+void sub_80A8E04(u8 taskId)
+{
+ u8 spriteId;
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sub_8078E70(spriteId, 0);
+ TASK.data[1] = 0;
+ TASK.data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[3] != 1)
+ {
+ TASK.data[3] = 0;
+ }
+ else
+ {
+ TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ }
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = spriteId;
+ TASK.data[6] = gBattleAnimArgs[3];
+ if (IsContest())
+ {
+ TASK.data[7] = 1;
+ }
+ else
+ {
+ if (gBattleAnimArgs[2] == 0)
+ {
+ TASK.data[7] = !GetBankSide(gBattleAnimBankAttacker);
+ }
+ else
+ {
+ TASK.data[7] = !GetBankSide(gBattleAnimBankTarget);
+ }
+ }
+ if (TASK.data[7])
+ {
+ if (!IsContest())
+ {
+ TASK.data[3] *= -1;
+ TASK.data[4] *= -1;
+ }
+ }
+ TASK.func = sub_80A8FD8;
+}
+
+void sub_80A8EFC(u8 taskId)
+{
+ u8 spriteId;
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sub_8078E70(spriteId, 0);
+ TASK.data[1] = 0;
+ TASK.data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] == 0)
+ {
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ }
+ else
+ {
+ if (GetBankSide(gBattleAnimBankTarget))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ }
+ if (gBattleAnimArgs[3] != 1)
+ {
+ TASK.data[3] = 0;
+ }
+ else
+ {
+ TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ }
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = spriteId;
+ TASK.data[6] = gBattleAnimArgs[3];
+ TASK.data[7] = 1;
+ TASK.data[3] *= -1;
+ TASK.data[4] *= -1;
+ TASK.func = sub_80A8FD8;
+}
+
+void sub_80A8FD8(u8 taskId)
+{
+ TASK.data[3] += TASK.data[4];
+ obj_id_set_rotscale(TASK.data[5], 0x100, 0x100, TASK.data[3]);
+ if (TASK.data[7])
+ {
+ sub_8078F9C(TASK.data[5]);
+ }
+ if (++TASK.data[1] >= TASK.data[2])
+ {
+ switch (TASK.data[6])
+ {
+ case 1:
+ sub_8078F40(TASK.data[5]);
+ case 0:
+ default:
+ DestroyAnimVisualTask(taskId);
+ return;
+ case 2:
+ TASK.data[1] = 0;
+ TASK.data[4] *= -1;
+ TASK.data[6] = 1;
+ break;
+ }
+ }
+}
+
+void sub_80A9058(u8 taskId)
+{
+ if (!gBattleAnimArgs[0])
+ {
+ TASK.data[15] = gMovePowerMoveAnim / 12;
+ if (TASK.data[15] < 1)
+ {
+ TASK.data[15] = 1;
+ }
+ if (TASK.data[15] > 16)
+ {
+ TASK.data[15] = 16;
+ }
+ }
+ else
+ {
+ TASK.data[15] = gMoveDmgMoveAnim / 12;
+ if (TASK.data[15] < 1)
+ {
+ TASK.data[15] = 1;
+ }
+ if (TASK.data[15] > 16)
+ {
+ TASK.data[15] = 16;
+ }
+ }
+ TASK.data[14] = TASK.data[15] / 2;
+ TASK.data[13] = TASK.data[14] + (TASK.data[15] & 1);
+ TASK.data[12] = 0;
+ TASK.data[10] = gBattleAnimArgs[3];
+ TASK.data[11] = gBattleAnimArgs[4];
+ TASK.data[7] = GetAnimBankSpriteId(1);
+ TASK.data[8] = gSprites[TASK.data[7]].pos2.x;
+ TASK.data[9] = gSprites[TASK.data[7]].pos2.y;
+ TASK.data[0] = 0;
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.func = sub_80A913C;
+}
+
+static void sub_80A913C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ if (++task->data[0] > task->data[1])
+ {
+ task->data[0] = 0;
+ task->data[12] = (task->data[12] + 1) & 1;
+ if (task->data[10])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14];
+ }
+ }
+ if (task->data[11])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.y = task->data[15];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.y = 0;
+ }
+ }
+ if (!--task->data[2])
+ {
+ gSprites[task->data[7]].pos2.x = 0;
+ gSprites[task->data[7]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+}