summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/battle/anim/alert.c33
-rwxr-xr-xsrc/battle/anim/angel.c37
-rwxr-xr-xsrc/battle/anim/angel_kiss.c87
-rwxr-xr-xsrc/battle/anim/anger.c34
-rwxr-xr-xsrc/battle/anim/blow_kiss.c39
-rwxr-xr-xsrc/battle/anim/bottle.c125
-rwxr-xr-xsrc/battle/anim/brace.c45
-rwxr-xr-xsrc/battle/anim/breath.c36
-rwxr-xr-xsrc/battle/anim/bullet.c69
-rwxr-xr-xsrc/battle/anim/copy_orb.c46
-rwxr-xr-xsrc/battle/anim/cube.c52
-rwxr-xr-xsrc/battle/anim/curtain.c82
-rwxr-xr-xsrc/battle/anim/cutter.c130
-rwxr-xr-xsrc/battle/anim/cyclone.c28
-rwxr-xr-xsrc/battle/anim/draw.c292
-rwxr-xr-xsrc/battle/anim/drum.c32
-rwxr-xr-xsrc/battle/anim/egg.c122
-rwxr-xr-xsrc/battle/anim/espeed.c241
-rwxr-xr-xsrc/battle/anim/evasion.c95
-rwxr-xr-xsrc/battle/anim/fang.c19
-rwxr-xr-xsrc/battle/anim/flash.c123
-rwxr-xr-xsrc/battle/anim/flying_hearts.c40
-rwxr-xr-xsrc/battle/anim/flying_path.c296
-rwxr-xr-xsrc/battle/anim/flying_petals.c83
-rwxr-xr-xsrc/battle/anim/glitter.c63
-rwxr-xr-xsrc/battle/anim/glow.c55
-rwxr-xr-xsrc/battle/anim/grip.c44
-rwxr-xr-xsrc/battle/anim/grow.c31
-rwxr-xr-xsrc/battle/anim/guillotine.c90
-rwxr-xr-xsrc/battle/anim/heal.c27
-rwxr-xr-xsrc/battle/anim/heart_1.c25
-rwxr-xr-xsrc/battle/anim/homing.c86
-rwxr-xr-xsrc/battle/anim/hop.c160
-rwxr-xr-xsrc/battle/anim/hop_2.c70
-rwxr-xr-xsrc/battle/anim/kiss_fountain.c38
-rwxr-xr-xsrc/battle/anim/leaf.c74
-rwxr-xr-xsrc/battle/anim/love_bg.c128
-rwxr-xr-xsrc/battle/anim/lunge_1.c124
-rwxr-xr-xsrc/battle/anim/lunge_2.c163
-rwxr-xr-xsrc/battle/anim/money.c62
-rwxr-xr-xsrc/battle/anim/moon.c39
-rwxr-xr-xsrc/battle/anim/note_rain.c37
-rwxr-xr-xsrc/battle/anim/note_scatter.c54
-rwxr-xr-xsrc/battle/anim/note_scatter_2.c57
-rwxr-xr-xsrc/battle/anim/note_wave.c143
-rwxr-xr-xsrc/battle/anim/orbit.c147
-rwxr-xr-xsrc/battle/anim/orbit_fast.c62
-rwxr-xr-xsrc/battle/anim/orbit_scatter.c31
-rwxr-xr-xsrc/battle/anim/orbs.c162
-rwxr-xr-xsrc/battle/anim/osmose.c29
-rwxr-xr-xsrc/battle/anim/perceive.c24
-rwxr-xr-xsrc/battle/anim/powder.c48
-rwxr-xr-xsrc/battle/anim/ring.c156
-rwxr-xr-xsrc/battle/anim/roots.c67
-rwxr-xr-xsrc/battle/anim/scan.c200
-rwxr-xr-xsrc/battle/anim/scary_face.c136
-rwxr-xr-xsrc/battle/anim/seed.c50
-rwxr-xr-xsrc/battle/anim/shadow_enlarge.c35
-rwxr-xr-xsrc/battle/anim/shadow_minimize.c262
-rwxr-xr-xsrc/battle/anim/shield.c81
-rwxr-xr-xsrc/battle/anim/shimmer.c48
-rwxr-xr-xsrc/battle/anim/silhouette.c77
-rwxr-xr-xsrc/battle/anim/slash.c83
-rwxr-xr-xsrc/battle/anim/sleep.c44
-rwxr-xr-xsrc/battle/anim/slice.c111
-rwxr-xr-xsrc/battle/anim/smoke.c22
-rwxr-xr-xsrc/battle/anim/sonic.c136
-rwxr-xr-xsrc/battle/anim/sonic_task.c152
-rwxr-xr-xsrc/battle/anim/spin_finger.c73
-rwxr-xr-xsrc/battle/anim/spit.c30
-rwxr-xr-xsrc/battle/anim/splash.c87
-rwxr-xr-xsrc/battle/anim/startle.c56
-rwxr-xr-xsrc/battle/anim/strike.c77
-rwxr-xr-xsrc/battle/anim/switch.c128
-rwxr-xr-xsrc/battle/anim/sword.c30
-rwxr-xr-xsrc/battle/anim/taunt_finger.c56
-rwxr-xr-xsrc/battle/anim/tendrils.c67
-rwxr-xr-xsrc/battle/anim/thought.c52
-rwxr-xr-xsrc/battle/anim/thrashing.c111
-rwxr-xr-xsrc/battle/anim/tile_in.c51
-rwxr-xr-xsrc/battle/anim/tile_out.c81
-rwxr-xr-xsrc/battle/anim/twinkle.c42
-rwxr-xr-xsrc/battle/anim/unused_1.c25
-rwxr-xr-xsrc/battle/anim/unused_2.c80
-rwxr-xr-xsrc/battle/anim/unused_3.c45
-rwxr-xr-xsrc/battle/anim/unused_4.c58
-rwxr-xr-xsrc/battle/anim/unused_5.c25
-rwxr-xr-xsrc/battle/anim/unused_6.c49
-rwxr-xr-xsrc/battle/anim/unused_7.c51
-rwxr-xr-xsrc/battle/anim/unused_8.c41
-rwxr-xr-xsrc/battle/anim/unused_9.c113
-rwxr-xr-xsrc/battle/anim/wave_finger.c39
-rwxr-xr-xsrc/battle/anim/whip.c46
-rwxr-xr-xsrc/battle/anim/withdraw.c69
-rwxr-xr-xsrc/battle_anim_80CA710.c6258
95 files changed, 7501 insertions, 6258 deletions
diff --git a/src/battle/anim/alert.c b/src/battle/anim/alert.c
new file mode 100755
index 000000000..538008be0
--- /dev/null
+++ b/src/battle/anim/alert.c
@@ -0,0 +1,33 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// alert (red thunder from the sides of a Pokemon, simulating more alert behavior.)
+// Used in Kinesis.
+
+void sub_80CF610(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->hFlip = 1;
+ if (gBattleAnimArgs[2] != 0)
+ sprite->vFlip = 1;
+ }
+ else
+ {
+ if (gBattleAnimArgs[2] != 0)
+ sprite->vFlip = 1;
+ }
+
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
diff --git a/src/battle/anim/angel.c b/src/battle/anim/angel.c
new file mode 100755
index 000000000..916ebfdfd
--- /dev/null
+++ b/src/battle/anim/angel.c
@@ -0,0 +1,37 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// angel (a little angel descends from somewhere towards a position)
+// Used in Sweet Kiss.
+
+void sub_80D2938(struct Sprite* sprite)
+{
+ s16 r5;
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->data[0]++;
+ r5 = (sprite->data[0] * 10) & 0xFF;
+ sprite->pos2.x = Sin(r5, 0x50) >> 8;
+ if (sprite->data[0] <= 0x4F)
+ sprite->pos2.y = (sprite->data[0] / 2) + (Cos(r5, 0x50) >> 8);
+
+ if (sprite->data[0] > 0x5A)
+ {
+ sprite->data[2]++;
+ sprite->pos2.x -= sprite->data[2] / 2;
+ }
+
+ if (sprite->data[0] > 0x64)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/angel_kiss.c b/src/battle/anim/angel_kiss.c
new file mode 100755
index 000000000..453c4d802
--- /dev/null
+++ b/src/battle/anim/angel_kiss.c
@@ -0,0 +1,87 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "random.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// angel_kiss (a different variation of kiss_fountain.)
+// Used in Sweet Kiss.
+
+void sub_80D29CC(struct Sprite* sprite)
+{
+ sprite->data[5]++;
+ sprite->pos2.x = Sin(sprite->data[3], 5);
+ sprite->pos2.y = sprite->data[5] / 2;
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ if (sprite->data[5] > 20)
+ sprite->invisible = sprite->data[5] % 2;
+
+ if (sprite->data[5] > 30)
+ move_anim_8072740(sprite);
+}
+
+void sub_80D2A38(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[4] += sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]);
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ if (sprite->data[3] > 0x46)
+ {
+ sprite->callback = sub_80D29CC;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[3] = Random() % 0xB4;
+ }
+ }
+}
+
+// this is for the next file, but i didnt feel like deleting it from the original 80C file.
+/* void sub_80D2ABC(struct Sprite* sprite)
+{
+ int var;
+ s16 var2;
+ int var3;
+ if (sprite->data[3] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, 0);
+ sprite->subpriority = sub_8079E90(gBattleAnimBankTarget) - 1;
+ sprite->data[2] = 1;
+ }
+
+ sprite->data[0] += sprite->data[2];
+ var = sprite->data[0] * 4;
+ if (var < 0)
+ var += 0xFF;
+
+ sprite->data[1] = (sprite->data[0] * 4) -(((var) >> 8) << 8);
+ if (sprite->data[1] < 0)
+ sprite->data[1] = 0;
+
+ var3 = sprite->data[1];
+ var2 = sprite->data[0];
+ var2 /= 4;
+ sprite->pos2.x = Cos(var3, 30 - var2);
+ var3 = sprite->data[1];
+ var2 = sprite->data[0] / 8;
+ sprite->pos2.x = Sin(var3, 10 - var2);
+ if (sprite->data[1] > 0x80 && sprite->data[2] > 0)
+ sprite->data[2] = 0xFFFF;
+} */
diff --git a/src/battle/anim/anger.c b/src/battle/anim/anger.c
new file mode 100755
index 000000000..8962e0855
--- /dev/null
+++ b/src/battle/anim/anger.c
@@ -0,0 +1,34 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// anger (anger emotes, usually above the Pokemon's head, indicating annoyed emotions.)
+// Used in Frustration, Rage, Swagger, Torment, and Taunt.
+
+void sub_80D09C0(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ if (GetBankSide(bank) == 1)
+ {
+ gBattleAnimArgs[1] *= -1;
+ }
+
+ sprite->pos1.x = sub_8077ABC(bank, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = sub_8077ABC(bank, 3) + gBattleAnimArgs[2];
+ if (sprite->pos1.y <= 7)
+ sprite->pos1.y = 8;
+
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_80785E4;
+}
diff --git a/src/battle/anim/blow_kiss.c b/src/battle/anim/blow_kiss.c
new file mode 100755
index 000000000..e63f7189d
--- /dev/null
+++ b/src/battle/anim/blow_kiss.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D1FA4(struct Sprite* sprite);
+
+// blow_kiss (a heart floating across the screen.)
+// Used in Attract.
+
+void sub_80D1F58(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = 0x5F;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->callback = sub_80D1FA4;
+}
+
+void sub_80D1FA4(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) == 0)
+ {
+ sprite->pos2.y += Sin(sprite->data[5], 14);
+ sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/bottle.c b/src/battle/anim/bottle.c
new file mode 100755
index 000000000..ac5e51881
--- /dev/null
+++ b/src/battle/anim/bottle.c
@@ -0,0 +1,125 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CCF70(struct Sprite* sprite);
+static void sub_80CD0CC(struct Sprite* sprite, int unk1, int unk2);
+
+// bottle (shows a bottle swinging back and forth.)
+// Used by Milk Drink.
+
+void sub_80CCF04(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + 0xFFE8;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[6] = 0;
+ sprite->data[7] = 16;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
+ sprite->callback = sub_80CCF70;
+}
+
+void sub_80CCF70(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[2] > 0)
+ {
+ sprite->data[2] = 0;
+ if (((++sprite->data[1]) & 1) != 0)
+ {
+ if (sprite->data[6] <= 15)
+ sprite->data[6]++;
+ }
+ else if (sprite->data[7] > 0)
+ sprite->data[7]--;
+
+ REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
+ if (sprite->data[6] == 16 && sprite->data[7] == 0)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 8)
+ {
+ sprite->data[1] = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sub_80CD0CC(sprite, 16, 4);
+ if (++sprite->data[1] > 2)
+ {
+ sprite->data[1] = 0;
+ sprite->pos1.y++;
+ }
+
+ if (++sprite->data[2] <= 29)
+ break;
+
+ if (sprite->data[2] & 1)
+ {
+ if (sprite->data[6] > 0)
+ sprite->data[6]--;
+ }
+ else if (sprite->data[7] <= 15)
+ {
+ sprite->data[7]++;
+ }
+
+ REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
+ if (sprite->data[6] == 0 && sprite->data[7] == 16)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->invisible = 1;
+ sprite->data[0]++;
+ break;
+ case 4:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ move_anim_8072740(sprite);
+ break;
+ }
+}
+
+void sub_80CD0CC(struct Sprite* sprite, int unk1, int unk2)
+{
+ if (sprite->data[3] <= 11)
+ sprite->data[4] += 2;
+
+ if ((u16)(sprite->data[3] - 0x12) <= 0x17)
+ sprite->data[4] -= 2;
+
+ if ((sprite->data[3]) > 0x2F)
+ sprite->data[4] += 2;
+
+ sprite->pos2.x = sprite->data[4] / 9;
+ sprite->pos2.y = sprite->data[4] / 14;
+ if (sprite->pos2.y < 0)
+ sprite->pos2.y *= -1;
+
+ sprite->data[3]++;
+ if (sprite->data[3] > 0x3B)
+ sprite->data[3] = 0;
+}
diff --git a/src/battle/anim/brace.c b/src/battle/anim/brace.c
new file mode 100755
index 000000000..7b084efbb
--- /dev/null
+++ b/src/battle/anim/brace.c
@@ -0,0 +1,45 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CDF70(struct Sprite* sprite);
+
+// brace (the Pokemon prepares to endure a hit)
+// Used in Endure.
+
+void sub_80CDF0C(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[1];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[2];
+ }
+ else
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0) + gBattleAnimArgs[1];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 1) + gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CDF70;
+}
+
+void sub_80CDF70(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > sprite->data[1])
+ {
+ sprite->data[0] = 0;
+ sprite->pos1.y--;
+ }
+
+ sprite->pos1.y -= sprite->data[0];
+ if (sprite->animEnded)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/breath.c b/src/battle/anim/breath.c
new file mode 100755
index 000000000..0fcc7fa08
--- /dev/null
+++ b/src/battle/anim/breath.c
@@ -0,0 +1,36 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// breath (a puff of smoke, usually from the mouth or nose of the Pokemon.)
+// Used in Swagger and Bulk Up.
+
+void sub_80D0930(struct Sprite* sprite)
+{
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + 32;
+ sprite->data[1] = 0x40;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) - 32;
+ sprite->data[1] = -0x40;
+ }
+
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->data[0] = 0x34;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ sprite->callback = sub_8078394;
+}
diff --git a/src/battle/anim/bullet.c b/src/battle/anim/bullet.c
new file mode 100755
index 000000000..11306873a
--- /dev/null
+++ b/src/battle/anim/bullet.c
@@ -0,0 +1,69 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "random.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D0030(struct Sprite* sprite);
+static void sub_80D00B4(struct Sprite* sprite);
+
+// bullet (shoot seeds as ammunition.)
+// Used by Bullet Seed.
+
+void sub_80CFFD8(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = 20;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
+ sprite->callback = sub_8078B34;
+ sprite->affineAnimPaused = 1;
+ StoreSpriteCallbackInData(sprite, sub_80D0030);
+}
+
+void sub_80D0030(struct Sprite* sprite)
+{
+ int i;
+ u16 rand;
+ s16* ptr;
+ PlaySE12WithPanning(0xA6, sub_8076F98(0x3F));
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ ptr = &sprite->data[7];
+ for (i = 0; i < 8; i++)
+ {
+ ptr[i - 7] = 0;
+ }
+
+ rand = Random();
+ sprite->data[6] = 0xFFF4 - (rand & 7);
+ rand = Random();
+ sprite->data[7] = (rand % 0xA0) + 0xA0;
+ sprite->callback = sub_80D00B4;
+ sprite->affineAnimPaused = 0;
+}
+
+void sub_80D00B4(struct Sprite* sprite)
+{
+ sprite->data[0] += sprite->data[7];
+ sprite->pos2.x = sprite->data[0] >> 8;
+ if (sprite->data[7] & 1)
+ sprite->pos2.x = -sprite->pos2.x;
+
+ sprite->pos2.y = Sin(sprite->data[1], sprite->data[6]);
+ sprite->data[1] += 8;
+ if (sprite->data[1] > 0x7E)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] /= 2;
+ if (++sprite->data[3] == 1)
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/copy_orb.c b/src/battle/anim/copy_orb.c
new file mode 100755
index 000000000..96d2910f0
--- /dev/null
+++ b/src/battle/anim/copy_orb.c
@@ -0,0 +1,46 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// copy_orb
+// Used in Mimic.
+
+void sub_80CB4CC(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ {
+ if (GetBankSide(gBattleAnimBankTarget) == 0)
+ {
+ s16 a = gBattleAnimArgs[0];
+ gBattleAnimArgs[0] = -a;
+ }
+
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0) + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 1) + gBattleAnimArgs[1];
+ sprite->invisible = 1;
+ sprite->data[0]++;
+ break;
+ }
+ case 1:
+ {
+ sprite->invisible = 0;
+ if (sprite->affineAnimEnded)
+ {
+ ChangeSpriteAffineAnim(sprite, 1);
+ sprite->data[0] = 25;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->callback = sub_8078CC0;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ break;
+ }
+ }
+ }
+}
diff --git a/src/battle/anim/cube.c b/src/battle/anim/cube.c
new file mode 100755
index 000000000..250e3f2d1
--- /dev/null
+++ b/src/battle/anim/cube.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "songs.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CE000(struct Sprite* sprite);
+
+// cube (shows a sphere sharpening into a cube.)
+// Used in Sharpen.
+
+void sub_80CDFB0(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) - 12;
+ sprite->data[0] = 0;
+ sprite->data[1] = 2;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = sub_8076F98(-0x40);
+ sprite->callback = sub_80CE000;
+}
+
+void sub_80CE000(struct Sprite* sprite)
+{
+ if (++sprite->data[0] >= sprite->data[1])
+ {
+ sprite->invisible = !sprite->invisible;
+ if (!sprite->invisible)
+ {
+ sprite->data[4]++;
+ if (!(sprite->data[4] & 1))
+ PlaySE12WithPanning(SE_W207B, sprite->data[5]);
+ }
+
+ sprite->data[0] = 0;
+ if (++sprite->data[2] > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->data[1]++;
+ }
+ }
+
+ if (sprite->animEnded && sprite->data[1] > 16 && sprite->invisible)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/curtain.c b/src/battle/anim/curtain.c
new file mode 100755
index 000000000..1f34cb173
--- /dev/null
+++ b/src/battle/anim/curtain.c
@@ -0,0 +1,82 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u16 gUnknown_03004240;
+extern u16 gUnknown_030042C4;
+
+static void sub_80D1D48(u8 taskId);
+static void sub_80D1D9C(u8 taskId);
+
+// curtain (a sweeping blackening curtain in the BG)
+// Used in Fake Out.
+
+void sub_80D1CD0(u8 taskId)
+{
+ int zero;
+ bool8 result = NotInBattle();
+ u16 var = 0xF0;
+ if (result)
+ {
+ var = 0x98;
+ zero = 0;
+ }
+ else
+ {
+ zero = 0;
+ }
+
+ gUnknown_030042C4 = var;
+ gUnknown_03004240 = 0xA0;
+ REG_WIN0H = var;
+ REG_WIN0V = 0xA0;
+ REG_WININ = 0x3F1F;
+ REG_WINOUT = 0x3F3F;
+ REG_BLDCNT = 0xC8;
+ REG_BLDY = 0x10;
+ gTasks[taskId].data[0] = zero;
+ gTasks[taskId].data[1] = var;
+ gTasks[taskId].func = sub_80D1D48;
+}
+
+void sub_80D1D48(u8 taskId)
+{
+ gTasks[taskId].data[0] += 13;
+ gTasks[taskId].data[1] -= 13;
+ if (gTasks[taskId].data[0] >= gTasks[taskId].data[1])
+ {
+ gUnknown_030042C4 = 0;
+ gTasks[taskId].func = sub_80D1D9C;
+ }
+ else
+ {
+ gUnknown_030042C4 = gTasks[taskId].data[1] | (gTasks[taskId].data[0] << 8);
+ }
+}
+
+void sub_80D1D9C(u8 taskId)
+{
+ if (++gTasks[taskId].data[10] == 5)
+ {
+ gTasks[taskId].data[11] = 0x88;
+ RequestSpriteCopy((u8 *)(&gTasks[taskId].data[11]), (u8 *)(&REG_BLDCNT), 2);
+ BlendPalettes(sub_80791A8(1, 0, 0, 0, 0, 0, 0), 16, RGB(31, 31, 31));
+ }
+ else if (gTasks[taskId].data[10] > 4)
+ {
+ gUnknown_030042C4 = 0;
+ gUnknown_03004240 = 0;
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x3F3F;
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/cutter.c b/src/battle/anim/cutter.c
new file mode 100755
index 000000000..9859497e5
--- /dev/null
+++ b/src/battle/anim/cutter.c
@@ -0,0 +1,130 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CB09C(struct Sprite* sprite);
+static void sub_80CB1A4(struct Sprite* sprite);
+
+// cutter (the cresent shaped leaf used in throwing projectiles for the listed moves.)
+// Used by Razor Leaf and Magical Leaf.
+
+void sub_80CAFD0(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ if (!(gBattleAnimArgs[6]))
+ {
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3];
+ }
+ else
+ {
+ sub_807A3FC(gBattleAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]);
+ sprite->data[2] += gBattleAnimArgs[2];
+ sprite->data[4] += gBattleAnimArgs[3];
+ }
+
+ sprite->data[5] = gBattleAnimArgs[5];
+ sub_80786EC(sprite);
+ if (GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget))
+ {
+ sprite->data[0] = 1;
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ }
+
+ sprite->callback = sub_80CB09C;
+}
+
+void sub_80CB09C(struct Sprite* sprite)
+{
+ bool8 c = FALSE;
+ s16 a = sprite->data[0];
+ s16 b = sprite->data[7];
+ s16 r0;
+
+ sprite->data[0] = 1;
+ sub_8078718(sprite);
+ r0 = sprite->data[7];
+ sprite->data[0] = a;
+ if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0)
+ sprite->oam.affineParam++;
+
+ if (sprite->oam.affineParam != 0 && sprite->data[0] != 0)
+ {
+ sprite->invisible ^= 1;
+ sprite->oam.affineParam++;
+ if (sprite->oam.affineParam == 0x1E)
+ c = TRUE;
+ }
+
+ if (sprite->pos1.x + sprite->pos2.x > 0x100
+ || sprite->pos1.x + sprite->pos2.x < -16
+ || sprite->pos1.y + sprite->pos2.y > 0xA0
+ || sprite->pos1.y + sprite->pos2.y < -16)
+ c = TRUE;
+
+ if (c)
+ move_anim_8072740(sprite);
+}
+
+void sub_80CB144(struct Sprite* sprite)
+{
+ if (!NotInBattle() && IsDoubleBattle() == TRUE)
+ {
+ sub_807A3FC(gBattleAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y);
+ }
+
+ sprite->pos1.y += 32;
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ sprite->data[3] = gBattleAnimArgs[3];
+ sprite->data[4] = gBattleAnimArgs[4];
+ sprite->callback = sub_80CB1A4;
+}
+
+void sub_80CB1A4(struct Sprite* sprite)
+{
+ if (sprite->data[1] == 0xFF)
+ {
+ sprite->pos1.y -= 2;
+ }
+ else if (sprite->data[1] > 0)
+ {
+ sprite->pos1.y -= 2;
+ sprite->data[1] -= 2;
+ }
+
+ sprite->data[5] += sprite->data[2];
+ if (sprite->data[0] < sprite->data[4])
+ sprite->data[5] += sprite->data[2];
+
+ sprite->data[5] &= 0xFF;
+ sprite->pos2.x = Cos(sprite->data[5], sprite->data[3]);
+ sprite->pos2.y = Sin(sprite->data[5], 5);
+ if (sprite->data[5] <= 0x7F)
+ {
+ sprite->oam.priority = sub_8079ED4(gBattleAnimBankTarget) - 1;
+ }
+ else
+ {
+ sprite->oam.priority = sub_8079ED4(gBattleAnimBankTarget) + 1;
+ }
+
+ sprite->data[0]--;
+ if (!sprite->data[0])
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/cyclone.c b/src/battle/anim/cyclone.c
new file mode 100755
index 000000000..b19304f17
--- /dev/null
+++ b/src/battle/anim/cyclone.c
@@ -0,0 +1,28 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// cyclone (creates a circling motion like a cyclone, usually a wind sprite.)
+// Used in Razor Wind.
+
+void sub_80D0118(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ sprite->pos1.y += 16;
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[5];
+ sprite->data[3] = gBattleAnimArgs[6];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->callback = sub_8078114;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ sprite->callback(sprite);
+}
diff --git a/src/battle/anim/draw.c b/src/battle/anim/draw.c
new file mode 100755
index 000000000..c075af097
--- /dev/null
+++ b/src/battle/anim/draw.c
@@ -0,0 +1,292 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "unknown_task.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u16 gUnknown_03004288;
+extern u16 gUnknown_030042C0;
+
+static void sub_80D0D68(u8 taskId);
+static void sub_80D0E8C(struct Sprite* sprite);
+
+// draw (draws the Pokemon into the world using a pencil.)
+// Used in Sketch.
+
+void sub_80D0C88(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ struct UnknownTaskStruct sp;
+ s16 i;
+ task->data[0] = sub_8077FC0(gBattleAnimBankTarget) + 32;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[5] = 0;
+ task->data[15] = sub_807A100(gBattleAnimBankTarget, 0);
+ if (GetBankIdentity_permutated(gBattleAnimBankTarget) == 1)
+ {
+ task->data[6] = gUnknown_030042C0;
+ sp.dest = (u16 *)REG_ADDR_BG1HOFS;
+ }
+ else
+ {
+ task->data[6] = gUnknown_03004288;
+ sp.dest = (u16 *)REG_ADDR_BG2HOFS;
+ }
+
+ for (i = task->data[0] - 0x40; i <= task->data[0];i++)
+ {
+ if (i >= 0)
+ {
+ gUnknown_03004DE0[0][i] = task->data[6] + 0xF0;
+ gUnknown_03004DE0[1][i] = task->data[6] + 0xF0;
+ }
+ }
+
+ sp.control = 0xa2600001;
+ sp.unk8 = 1;
+ sp.unk9 = 0;
+ sub_80895F8(sp);
+ task->func = sub_80D0D68;
+}
+
+#ifdef NONMATCHING
+void sub_80D0D68(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[4])
+ {
+ case 0:
+ if (++task->data[5] > 20)
+ task->data[4]++;
+ break;
+ case 1:
+ if (++task->data[1] > 3)
+ {
+ task->data[1] = 0;
+ task->data[2] = task->data[3] & 3;
+ task->data[5] = task->data[0] - task->data[3];
+ switch (task->data[2])
+ {
+ case 0:
+ break;
+ case 1:
+ task->data[5] -= 2;
+ break;
+ case 2:
+ task->data[5] += 1;
+ break;
+ case 3:
+ task->data[5] += 1;
+ break;
+ }
+
+ if (task->data[5] >= 0)
+ {
+ gUnknown_03004DE0[0][task->data[5]] = task->data[6];
+ gUnknown_03004DE0[1][task->data[5]] = task->data[6];
+ }
+
+ if (++task->data[3] >= task->data[15])
+ {
+ gUnknown_03004DC0.unk15 = 3;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ break;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80D0D68(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r0, r4, 2\n\
+ adds r0, r4\n\
+ lsls r0, 3\n\
+ ldr r1, _080D0D88 @ =gTasks\n\
+ adds r3, r0, r1\n\
+ movs r1, 0x10\n\
+ ldrsh r0, [r3, r1]\n\
+ cmp r0, 0\n\
+ beq _080D0D8C\n\
+ cmp r0, 0x1\n\
+ beq _080D0DA2\n\
+ b _080D0E22\n\
+ .align 2, 0\n\
+_080D0D88: .4byte gTasks\n\
+_080D0D8C:\n\
+ ldrh r0, [r3, 0x12]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0x12]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x14\n\
+ ble _080D0E22\n\
+ ldrh r0, [r3, 0x10]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0x10]\n\
+ b _080D0E22\n\
+_080D0DA2:\n\
+ ldrh r0, [r3, 0xA]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0xA]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x3\n\
+ ble _080D0E22\n\
+ movs r0, 0\n\
+ strh r0, [r3, 0xA]\n\
+ ldrh r1, [r3, 0xE]\n\
+ movs r0, 0x3\n\
+ ands r0, r1\n\
+ strh r0, [r3, 0xC]\n\
+ ldrh r0, [r3, 0x8]\n\
+ subs r0, r1\n\
+ strh r0, [r3, 0x12]\n\
+ movs r2, 0xC\n\
+ ldrsh r1, [r3, r2]\n\
+ cmp r1, 0x1\n\
+ beq _080D0DD8\n\
+ cmp r1, 0x1\n\
+ ble _080D0DE0\n\
+ cmp r1, 0x2\n\
+ beq _080D0DDC\n\
+ cmp r1, 0x3\n\
+ beq _080D0DDC\n\
+ b _080D0DE0\n\
+_080D0DD8:\n\
+ subs r0, 0x2\n\
+ b _080D0DDE\n\
+_080D0DDC:\n\
+ adds r0, 0x1\n\
+_080D0DDE:\n\
+ strh r0, [r3, 0x12]\n\
+_080D0DE0:\n\
+ movs r1, 0x12\n\
+ ldrsh r0, [r3, r1]\n\
+ cmp r0, 0\n\
+ blt _080D0E04\n\
+ ldr r2, _080D0E28 @ =gUnknown_03004DE0\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ ldrh r1, [r3, 0x14]\n\
+ strh r1, [r0]\n\
+ movs r1, 0x12\n\
+ ldrsh r0, [r3, r1]\n\
+ lsls r0, 1\n\
+ movs r1, 0xF0\n\
+ lsls r1, 3\n\
+ adds r2, r1\n\
+ adds r0, r2\n\
+ ldrh r1, [r3, 0x14]\n\
+ strh r1, [r0]\n\
+_080D0E04:\n\
+ ldrh r0, [r3, 0xE]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0xE]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r2, 0x26\n\
+ ldrsh r1, [r3, r2]\n\
+ cmp r0, r1\n\
+ blt _080D0E22\n\
+ ldr r1, _080D0E2C @ =gUnknown_03004DC0\n\
+ movs r0, 0x3\n\
+ strb r0, [r1, 0x15]\n\
+ adds r0, r4, 0\n\
+ bl DestroyAnimVisualTask\n\
+_080D0E22:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080D0E28: .4byte gUnknown_03004DE0\n\
+_080D0E2C: .4byte gUnknown_03004DC0\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80D0E30(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0) - 16;
+ sprite->pos1.y = sub_8077FC0(gBattleAnimBankTarget) + 16;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 16;
+ sprite->data[4] = 0;
+ sprite->data[5] = sub_807A100(gBattleAnimBankTarget, 0) + 2;
+ sprite->data[6] = sub_8076F98(0x3F);
+ sprite->callback = sub_80D0E8C;
+}
+
+void sub_80D0E8C(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[2] > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->invisible = !sprite->invisible;
+ }
+ if (++sprite->data[1] > 16)
+ {
+ sprite->invisible = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 3 && sprite->data[2] < sprite->data[5])
+ {
+ sprite->data[1] = 0;
+ sprite->pos1.y -= 1;
+ sprite->data[2]++;
+ if (sprite->data[2] % 10 == 0)
+ PlaySE12WithPanning(0xCD, sprite->data[6]);
+ }
+ sprite->data[4] += sprite->data[3];
+ if (sprite->data[4] > 31)
+ {
+ sprite->data[4] = 0x40 - sprite->data[4];
+ sprite->data[3] *= -1;
+ }
+ else if (sprite->data[4] <= -32)
+ {
+ sprite->data[4] = -0x40 - sprite->data[4];
+ sprite->data[3] *= -1;
+ }
+ sprite->pos2.x = sprite->data[4];
+ if (sprite->data[5] == sprite->data[2])
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (++sprite->data[2] > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->invisible = !sprite->invisible;
+ }
+ if (++sprite->data[1] > 16)
+ {
+ sprite->invisible = 0;
+ move_anim_8072740(sprite);
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/drum.c b/src/battle/anim/drum.c
new file mode 100755
index 000000000..60cb2acc1
--- /dev/null
+++ b/src/battle/anim/drum.c
@@ -0,0 +1,32 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// drum (using hands to slap the Pokemon's belly in a rhythm.)
+// Used in Belly Drum.
+
+void sub_80CEDF0(struct Sprite* sprite)
+{
+ s16 a;
+ if (gBattleAnimArgs[0] == 1)
+ {
+ sprite->oam.matrixNum = 8;
+ a = 16;
+ }
+ else
+ {
+ a = -16;
+ }
+
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + a;
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + 8;
+ sprite->data[0] = 8;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
diff --git a/src/battle/anim/egg.c b/src/battle/anim/egg.c
new file mode 100755
index 000000000..a5bcffa6d
--- /dev/null
+++ b/src/battle/anim/egg.c
@@ -0,0 +1,122 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D13AC(struct Sprite* sprite);
+static void sub_80D1424(struct Sprite* sprite);
+static void sub_80D144C(struct Sprite* sprite);
+static void sub_80D14C4(struct Sprite* sprite);
+static void sub_80D1504(struct Sprite* sprite);
+static void sub_80D154C(struct Sprite* sprite);
+static void sub_80D158C(struct Sprite* sprite);
+
+// egg (a hatching egg)
+// Used in Softboiled.
+
+void sub_80D1368(struct Sprite* sprite)
+{
+ s16 r1;
+ sub_80787B0(sprite, 0);
+ r1 = (GetBankSide(gBattleAnimBankAttacker)) ? -0xA0 : 0xA0;
+ sprite->data[0] = 0x380;
+ sprite->data[1] = r1;
+ sprite->data[7] = gBattleAnimArgs[2];
+ sprite->callback = sub_80D13AC;
+}
+
+void sub_80D13AC(struct Sprite* sprite)
+{
+ s16 add;
+ sprite->pos2.y -= (sprite->data[0] >> 8);
+ sprite->pos2.x = sprite->data[1] >> 8;
+ sprite->data[0] -= 32;
+ add = (GetBankSide(gBattleAnimBankAttacker)) ? -0xA0 : 0xA0;
+ sprite->data[1] += add;
+ if (sprite->pos2.y > 0)
+ {
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_80D1424;
+ }
+}
+
+void sub_80D1424(struct Sprite* sprite)
+{
+ if (sprite->data[0]++ > 19)
+ {
+ StartSpriteAffineAnim(sprite, 2);
+ sprite->callback = sub_80D144C;
+ }
+}
+
+void sub_80D144C(struct Sprite* sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0] = 0;
+ if (sprite->data[7] == 0)
+ {
+ sprite->oam.tileNum += 16;
+ sprite->callback = sub_80D14C4;
+ }
+ else
+ {
+ sprite->oam.tileNum += 32;
+ sprite->callback = sub_80D154C;
+ }
+ }
+}
+
+void sub_80D14C4(struct Sprite* sprite)
+{
+ sprite->pos2.y -= 2;
+ if (++sprite->data[0] == 9)
+ {
+ sprite->data[0] = 16;
+ sprite->data[1] = 0;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = sprite->data[0];
+ sprite->callback = sub_80D1504;
+ }
+}
+
+void sub_80D1504(struct Sprite* sprite)
+{
+ if (sprite->data[1]++ % 3 == 0)
+ {
+ sprite->data[0]--;
+ REG_BLDALPHA = sprite->data[0] | ((16 - sprite->data[0]) << 8);
+ if (sprite->data[0] == 0)
+ sprite->callback = sub_80D154C;
+ }
+}
+
+void sub_80D154C(struct Sprite* sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->invisible = 1;
+ if (sprite->data[7] == 0)
+ sprite->callback = sub_80D158C;
+ else
+ sprite->callback = move_anim_8072740;
+ }
+}
+
+void sub_80D158C(struct Sprite* sprite)
+{
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/espeed.c b/src/battle/anim/espeed.c
new file mode 100755
index 000000000..621d386e1
--- /dev/null
+++ b/src/battle/anim/espeed.c
@@ -0,0 +1,241 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern s8 gUnknown_083D7A00[4][2];
+
+extern struct AffineAnimFrameCmd gUnknown_083D79BC;
+extern struct SpriteTemplate gSpriteTemplate_83D79E8;
+
+static void sub_80D15E0(u8 taskId);
+static void sub_80D16A0(u8 taskId);
+static void sub_80D1808(u8 taskId);
+static void sub_80D1930(u8 taskId);
+
+// espeed (the Pokemon's width decreases as the sprite becomes vertically compressed)
+// Used in Extremespeed.
+
+// apply espeed
+void sub_80D15A4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ sub_80798F4(task, spriteId, &gUnknown_083D79BC);
+ task->func = sub_80D15E0;
+}
+
+void sub_80D15E0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (sub_807992C(task) == 0)
+ {
+ gSprites[task->data[0]].pos2.y = 0;
+ gSprites[task->data[0]].invisible = 1;
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// espeed hit effect
+void sub_80D1638(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[12] = 3;
+ if (GetBankSide(gBattleAnimBankTarget) == 0)
+ {
+ task->data[13] = 0xFFFF;
+ task->data[14] = 8;
+ }
+ else
+ {
+ task->data[13] = 1;
+ task->data[14] = -8;
+ }
+
+ task->data[15] = GetAnimBankSpriteId(1);
+ task->func = sub_80D16A0;
+}
+
+void sub_80D16A0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ gSprites[task->data[15]].pos2.x += task->data[14];
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ break;
+ case 1:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.x += 6;
+ else
+ gSprites[task->data[15]].pos2.x -= 6;
+
+ if (++task->data[3] > 4)
+ {
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.x -= 6;
+
+ task->data[0]++;
+ }
+ }
+ break;
+ case 2:
+ if (--task->data[12] != 0)
+ task->data[0] = 0;
+ else
+ task->data[0]++;
+ break;
+ case 3:
+ gSprites[task->data[15]].pos2.x += task->data[13];
+ if (gSprites[task->data[15]].pos2.x == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// espeed poke flicker in
+void sub_80D17C4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 1;
+ task->data[13] = 14;
+ task->data[14] = 2;
+ task->data[15] = GetAnimBankSpriteId(0);
+ task->func = sub_80D1808;
+}
+
+void sub_80D1808(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (task->data[0] == 0 && ++task->data[1] > task->data[4])
+ {
+ task->data[1] = 0;
+ if (++task->data[2] & 1)
+ gSprites[task->data[15]].invisible = 0;
+ else
+ gSprites[task->data[15]].invisible = 1;
+
+ if (++task->data[3] >= task->data[13])
+ {
+ if (++task->data[4] < task->data[14])
+ {
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ }
+ else
+ {
+ gSprites[task->data[15]].invisible = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ }
+}
+
+// espeed smoke flicker
+void sub_80D18D4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[5] = 0;
+ task->data[6] = 0;
+ task->data[7] = 0;
+ task->data[8] = 0;
+ task->data[13] = 0;
+ task->data[14] = sub_8077ABC(gBattleAnimBankAttacker, 0);
+ task->data[15] = sub_8077ABC(gBattleAnimBankAttacker, 1);
+ task->func = sub_80D1930;
+}
+
+void sub_80D1930(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[8])
+ {
+ case 0:
+ if (++task->data[4] > 1)
+ {
+ task->data[4] = 0;
+ task->data[5] = (task->data[5] + 1) & 1;
+ if (++task->data[6] > 20)
+ {
+ if (task->data[7] == 0)
+ {
+ task->data[6] = 0;
+ task->data[8] = 1;
+ }
+ else
+ task->data[8] = 2;
+ }
+ }
+ break;
+ case 1:
+ task->data[5] = 0;
+ if (++task->data[4] > 20)
+ {
+ task->data[7] = 1;
+ task->data[8] = 0;
+ }
+ break;
+ case 2:
+ task->data[5] = 1;
+ break;
+ }
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 4)
+ {
+ u8 spriteId;
+ task->data[1] = 0;
+ spriteId = CreateSprite(&gSpriteTemplate_83D79E8, task->data[14], task->data[15], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 13;
+ gSprites[spriteId].pos2.x = gUnknown_083D7A00[task->data[2]][0];
+ gSprites[spriteId].pos2.y = gUnknown_083D7A00[task->data[2]][1];
+ task->data[13]++;
+ if (++task->data[2] > 3)
+ {
+ task->data[2] = 0;
+ if (++task->data[3] > 5)
+ task->data[0]++;
+ }
+ }
+ }
+ break;
+ case 1:
+ if (task->data[13] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/evasion.c b/src/battle/anim/evasion.c
new file mode 100755
index 000000000..b4e81009b
--- /dev/null
+++ b/src/battle/anim/evasion.c
@@ -0,0 +1,95 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+#include "blend_palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CE910(u8 taskId);
+static void sub_80CE974(struct Sprite* sprite);
+
+// evasion (the shadow seen during evasion increases, mainly Double Team.)
+// Used by Double Team.
+
+void sub_80CE7E0(u8 taskId)
+{
+ u16 i;
+ int obj;
+ u16 r3;
+ u16 r4;
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = GetAnimBankSpriteId(0);
+ task->data[1] = AllocSpritePalette(0x2771);
+ r3 = (task->data[1] * 16) + 0x100;
+ r4 = (gSprites[task->data[0]].oam.paletteNum + 16) << 4;
+ for (i = 1; i < 16; i++)
+ {
+ gPlttBufferUnfaded[r3 + i] = gPlttBufferUnfaded[r4 + i];
+ }
+
+ BlendPalette(r3, 16, 11, 0);
+ task->data[3] = 0;
+ i = 0;
+ while (i <= 1 && (obj = duplicate_obj_of_side_rel2move_in_transparent_mode(0)) >= 0)
+ {
+ gSprites[obj].oam.paletteNum = task->data[1];
+ gSprites[obj].data[0] = 0;
+ gSprites[obj].data[1] = i << 7;
+ gSprites[obj].data[2] = taskId;
+ gSprites[obj].callback = sub_80CE974;
+ task->data[3]++;
+ i++;
+ }
+
+ task->func = sub_80CE910;
+ if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1)
+ {
+ REG_DISPCNT &= 0xFDFF;
+ }
+ else
+ {
+ REG_DISPCNT &= 0xFBFF;
+ }
+}
+
+void sub_80CE910(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (!task->data[3])
+ {
+ if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1)
+ REG_DISPCNT |= 0x200;
+ else
+ REG_DISPCNT |= 0x400;
+
+ FreeSpritePaletteByTag(0x2771);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80CE974(struct Sprite* sprite)
+{
+ if (++sprite->data[3] > 1)
+ {
+ sprite->data[3] = 0;
+ sprite->data[0]++;
+ }
+
+ if (sprite->data[0] > 0x40)
+ {
+ gTasks[sprite->data[2]].data[3]--;
+ obj_delete_but_dont_free_vram(sprite);
+ }
+ else
+ {
+ sprite->data[4] = gSineTable[sprite->data[0]] / 6;
+ sprite->data[5] = gSineTable[sprite->data[0]] / 13;
+ sprite->data[1] = (sprite->data[1] + sprite->data[5]) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], sprite->data[4]);
+ }
+}
diff --git a/src/battle/anim/fang.c b/src/battle/anim/fang.c
new file mode 100755
index 000000000..4df450691
--- /dev/null
+++ b/src/battle/anim/fang.c
@@ -0,0 +1,19 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// fang
+// Used by Super Fang (and probably Hyper Fang, but the actual callbacks are not in this file.)
+// (Look into this one later.)
+
+void sub_80CEA04(struct Sprite* sprite)
+{
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ sprite->callback = sub_8078600;
+}
diff --git a/src/battle/anim/flash.c b/src/battle/anim/flash.c
new file mode 100755
index 000000000..0e087ec2d
--- /dev/null
+++ b/src/battle/anim/flash.c
@@ -0,0 +1,123 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FC8;
+extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FF8;
+
+static void sub_80CE4D4(u8 taskId);
+
+// flash (a "ting!" flash effect.)
+// Used in Moonlight.
+
+void sub_80CE3EC(u8 taskId)
+{
+ int a = sub_80791A8(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
+ int b;
+ int c;
+ int d;
+
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = a;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[6] = 0;
+ gTasks[taskId].data[7] = 13;
+ gTasks[taskId].data[8] = 14;
+ gTasks[taskId].data[9] = 15;
+ b = sub_80792C0(1, 1, 1, 1);
+ c = a | b;
+ sub_8079BF4(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void*)c);
+ b = b | (0x10000 << IndexOfSpritePaletteTag(0x27D2));
+ d = IndexOfSpritePaletteTag(0x27D3);
+ BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 0x10, 32699);
+ gTasks[taskId].func = sub_80CE4D4;
+ sub_80CE4D4(taskId);
+}
+
+void sub_80CE4D4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 0)
+ {
+ u16 color;
+ u16 bitmask;
+ u16 r3;
+ u16 i;
+ u16 j;
+ task->data[1] = 0;
+ if (++task->data[2] <= 15)
+ {
+ u16 red;
+ u16 green;
+ u16 blue;
+ task->data[4] += task->data[7];
+ task->data[5] += task->data[8];
+ task->data[6] += task->data[9];
+ red = task->data[4] >> 3;
+ green = task->data[5] >> 3;
+ blue = task->data[6] >> 3;
+ color = RGB(red, green, blue);
+ }
+ else
+ {
+ color = RGB(27, 29, 31);
+ task->data[0]++;
+ }
+
+ bitmask = 1;
+ r3 = 0;
+ for (i = 0; i <= 15; i++)
+ {
+ if (task->data[3] & bitmask)
+ {
+ for (j = 1; j <= 15; j++)
+ {
+ gPlttBufferFaded[r3 + j] = color;
+ }
+ }
+
+ bitmask <<= 1;
+ r3 += 16;
+ }
+ }
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ u8 spriteId;
+ for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++)
+ {
+ if (gSprites[spriteId].template == &gBattleAnimSpriteTemplate_83D6FC8 || gSprites[spriteId].template == &gBattleAnimSpriteTemplate_83D6FF8)
+ gSprites[spriteId].data[0] = 1;
+ }
+
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 30)
+ {
+ BeginNormalPaletteFade((u32)sub_8079BFC(task->data[14], task->data[15]), 0, 16, 0, RGB(27, 29, 31));
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/flying_hearts.c b/src/battle/anim/flying_hearts.c
new file mode 100755
index 000000000..5b7d31a51
--- /dev/null
+++ b/src/battle/anim/flying_hearts.c
@@ -0,0 +1,40 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D2094(struct Sprite* sprite);
+
+// flying_hearts (hearts float upward from the bottom of the screen.)
+// Used in Attract.
+
+void sub_80D2064(struct Sprite* sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = 0xA0;
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80D2094);
+}
+
+void sub_80D2094(struct Sprite* sprite)
+{
+ s16 y;
+ sprite->data[2] += sprite->data[1];
+ sprite->pos2.y = -((u16)sprite->data[2] >> 8);
+ sprite->pos2.x = Sin(sprite->data[3], 4);
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ y = sprite->pos1.y + sprite->pos2.y;
+ if (y <= 0x48)
+ {
+ sprite->invisible = sprite->data[3] % 2;
+ if (y <= 0x40)
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c
new file mode 100755
index 000000000..017f89858
--- /dev/null
+++ b/src/battle/anim/flying_path.c
@@ -0,0 +1,296 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct SpriteTemplate gSpriteTemplate_83D6884;
+
+static void sub_80CBF5C(u8 taskId);
+static s16 sub_80CC338(struct Sprite* sprite);
+static void sub_80CC358(struct Task* task, u8 taskId);
+static void sub_80CC408(struct Sprite* sprite);
+
+// flying_path (guides a sprite along a specific path.)
+// Used by Leaf Blade.
+
+void sub_80CBDF4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[4] = sub_8079E90(gBattleAnimBankTarget) - 1;
+ task->data[6] = sub_8077ABC(gBattleAnimBankTarget, 2);
+ task->data[7] = sub_8077ABC(gBattleAnimBankTarget, 3);
+ task->data[10] = sub_807A100(gBattleAnimBankTarget, 1);
+ task->data[11] = sub_807A100(gBattleAnimBankTarget, 0);
+ task->data[5] = (GetBankSide(gBattleAnimBankTarget) == 1) ? 1 : -1;
+ task->data[9] = 0x38 - (task->data[5] * 64);
+ task->data[8] = task->data[7] - task->data[9] + task->data[6];
+ task->data[2] = CreateSprite(&gSpriteTemplate_83D6884, task->data[8], task->data[9], task->data[4]);
+ if (task->data[2] == 0x40)
+ DestroyAnimVisualTask(taskId);
+
+ gSprites[task->data[2]].data[0] = 10;
+ gSprites[task->data[2]].data[1] = task->data[8];
+ gSprites[task->data[2]].data[2] = task->data[6] - (task->data[10] / 2 + 10) * task->data[5];
+ gSprites[task->data[2]].data[3] = task->data[9];
+ gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5];
+ gSprites[task->data[2]].data[5] = sub_80CC338(&gSprites[task->data[2]]);
+ sub_80786EC(&gSprites[task->data[2]]);
+ task->func = sub_80CBF5C;
+}
+
+void sub_80CBF5C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ struct Sprite* sprite = &gSprites[task->data[2]];
+ int a = task->data[0];
+ switch (a)
+ {
+ case 4:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ {
+ break;
+ }
+ else
+ {
+ task->data[15] = 5;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 8:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ {
+ break;
+ }
+ else
+ {
+ task->data[15] = 9;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 0:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ break;
+
+ task->data[15] = 1;
+ task->data[0] = 0xFF;
+ break;
+ case 1:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] += 2;
+ task->data[3] = a;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 2:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ break;
+
+ task->data[15] = 3;
+ task->data[0] = 0xFF;
+ break;
+ case 3:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7] - ((task->data[11] / 2) + 10) * task->data[5];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[3] = 2;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 5:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6] + ((task->data[10] / 2) + 10) * task->data[5];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] -= 2;
+ task->data[3] = 3;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 6:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ break;
+
+ task->data[15] = 7;
+ task->data[0] = 0xFF;
+ break;
+ case 7:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] += 2;
+ task->data[3] = 4;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 9:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[3] = 5;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 10:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ {
+ break;
+ }
+ else
+ {
+ task->data[15] = 11;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 11:
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[8];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[9];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] -= 2;
+ task->data[3] = 6;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ }
+ case 12:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) != 0)
+ {
+ DestroySprite(sprite);
+ task->data[0]++;
+ }
+ break;
+ case 13:
+ if (task->data[12] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ break;
+ case 255:
+ task->data[1]++;
+ if (task->data[1] > 5)
+ {
+ task->data[1] = 0;
+ task->data[0] = task->data[15];
+ }
+ break;
+ }
+}
+
+s16 sub_80CC338(struct Sprite* sprite)
+{
+ s16 var = 8;
+ if (sprite->data[4] < sprite->pos1.y)
+ var = -var;
+
+ return var;
+}
+
+void sub_80CC358(struct Task* task, u8 taskId)
+{
+ task->data[14]++;
+ if (task->data[14] > 0)
+ {
+ u8 spriteId;
+ s16 spriteX;
+ s16 spriteY;
+ task->data[14] = 0;
+ spriteX = gSprites[task->data[2]].pos1.x + gSprites[task->data[2]].pos2.x;
+ spriteY = gSprites[task->data[2]].pos1.y + gSprites[task->data[2]].pos2.y;
+ spriteId = CreateSprite(&gSpriteTemplate_83D6884, spriteX, spriteY, task->data[4]);
+ if (spriteId != 0x40)
+ {
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = 12;
+ gTasks[taskId].data[12]++;
+ gSprites[spriteId].data[0] = task->data[13] & 1;
+ gTasks[taskId].data[13]++;
+ StartSpriteAnim(&gSprites[spriteId], task->data[3]);
+ gSprites[spriteId].subpriority = task->data[4];
+ gSprites[spriteId].callback = sub_80CC408;
+ }
+ }
+}
+
+void sub_80CC408(struct Sprite* sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible ^= 1;
+ sprite->data[1]++;
+ if (sprite->data[1] > 8)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ DestroySprite(sprite);
+ }
+ }
+}
diff --git a/src/battle/anim/flying_petals.c b/src/battle/anim/flying_petals.c
new file mode 100755
index 000000000..ed6497b7a
--- /dev/null
+++ b/src/battle/anim/flying_petals.c
@@ -0,0 +1,83 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CC580(struct Sprite* sprite);
+
+// flying_petals (petals fly across the screen.)
+// Used by Aromatherapy.
+
+void sub_80CC474(struct Sprite* sprite)
+{
+ u8 bank;
+ if (!gBattleAnimArgs[6])
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ if (GetBankSide(bank) != 0)
+ {
+ sprite->data[4] = 0;
+ sprite->data[2] = gBattleAnimArgs[3];
+ sprite->pos1.x = 0xFFF0;
+ }
+ else
+ {
+ sprite->data[4] = 1;
+ sprite->data[2] = -gBattleAnimArgs[3];
+ sprite->pos1.x = 0x100;
+ }
+
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[3] = gBattleAnimArgs[4];
+ switch (gBattleAnimArgs[5])
+ {
+ case 0:
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->oam.priority = sub_8079ED4(bank);
+ break;
+ case 1:
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->oam.priority = sub_8079ED4(bank) + 1;
+ break;
+ case 2:
+ sprite->pos1.y = sub_8077ABC(bank, 3) + gBattleAnimArgs[0];
+ sprite->oam.priority = sub_8079ED4(bank);
+ break;
+ case 3:
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[0];
+ GetAnimBankSpriteId(1);
+ sprite->oam.priority = sub_8079ED4(bank) + 1;
+ break;
+ }
+
+ sprite->callback = sub_80CC580;
+}
+
+void sub_80CC580(struct Sprite* sprite)
+{
+ int a = sprite->data[7];
+ sprite->data[7]++;
+ sprite->pos2.y = (sprite->data[1] * gSineTable[sprite->data[0]]) >> 8;
+ sprite->pos2.x = sprite->data[2] * a;
+ sprite->data[0] = (sprite->data[3] * a) & 0xFF;
+ if (sprite->data[4] == 0)
+ {
+ if (sprite->pos2.x + sprite->pos1.x <= 0xF7)
+ return;
+ }
+ else
+ {
+ if (sprite->pos2.x + sprite->pos1.x > -16)
+ return;
+ }
+
+ move_anim_8074EE0(sprite);
+}
diff --git a/src/battle/anim/glitter.c b/src/battle/anim/glitter.c
new file mode 100755
index 000000000..548397932
--- /dev/null
+++ b/src/battle/anim/glitter.c
@@ -0,0 +1,63 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// glitter (the sparkling effect seen on Pokemon, usually after healing or a beneficial effect.)
+// Used by Heal Bell, Cosmic Power, and Aromatherapy.
+
+void sub_80CD140(struct Sprite* sprite)
+{
+ if (!gBattleAnimArgs[2])
+ sub_8078650(sprite);
+
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[5];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ sprite->callback = sub_8078394;
+}
+
+void sub_80CD190(struct Sprite* sprite)
+{
+ u8 bank;
+ if (!gBattleAnimArgs[2])
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
+ {
+ sub_807A3FC(bank, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ if (!gBattleAnimArgs[6])
+ {
+ sprite->pos1.x = sub_8077ABC(bank, 0);
+ sprite->pos1.y = sub_8077ABC(bank, 1) + gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x = sub_8077ABC(bank, 2);
+ sprite->pos1.y = sub_8077ABC(bank, 3) + gBattleAnimArgs[1];
+ }
+
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ }
+
+ sprite->data[0] = gBattleAnimArgs[5];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ sprite->callback = sub_8078394;
+}
diff --git a/src/battle/anim/glow.c b/src/battle/anim/glow.c
new file mode 100755
index 000000000..6038825af
--- /dev/null
+++ b/src/battle/anim/glow.c
@@ -0,0 +1,55 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "ewram.h"
+#include "palette.h"
+#include "decompress.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u16 gUnknown_083D7A5C[5];
+
+extern struct INCBIN_U8 gBattleAnimSpritePalette_206;
+
+// glow (a whitening effect where the Pokemon glows white in a cycle.)
+// Used in Heal Bell.
+
+void sub_80D1ADC(u8 taskId)
+{
+ int i;
+ u8 sp[8];
+ void* src;
+ void* dest;
+ void* what;
+ sp[0] = IndexOfSpritePaletteTag(0x27DE);
+ for (i = 1; i <= 4; i++)
+ {
+ sp[i] = AllocSpritePalette(0x2710 - i);
+ }
+
+ src = &gBattleAnimSpritePalette_206;
+ dest = (NotInBattle()) ? gSharedMem + 0x18000 - 0x3800: gSharedMem + 0x18000;
+ LZDecompressWram(src, dest);
+ for (i = 0; i <= 4; i++)
+ {
+ what = ((NotInBattle()) ? gSharedMem + 0x14800 : gSharedMem + 0x18000) + (i << 5);
+ LoadPalette(what, (u16)((sp[i] << 4) + 0x100), 32);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80D1B80(u8 taskId)
+{
+ int i;
+ for (i = 0; i < 5; i++)
+ {
+ FreeSpritePaletteByTag(gUnknown_083D7A5C[i]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/grip.c b/src/battle/anim/grip.c
new file mode 100755
index 000000000..93c3dba96
--- /dev/null
+++ b/src/battle/anim/grip.c
@@ -0,0 +1,44 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D020C(struct Sprite* sprite);
+
+// grip (does a slash which is capable of mirroring for the effect of "gripping".)
+// Used in Vice Grip.
+
+void sub_80D0178(struct Sprite* sprite)
+{
+ s16 r7 = 32;
+ s16 r4 = -32;
+ s16 r8 = 16;
+ s16 r6 = -16;
+ if (gBattleAnimArgs[0] != 0)
+ {
+ r7 = r4;
+ r4 = 32;
+ r8 = r6;
+ r6 = 16;
+ StartSpriteAnim(sprite, 1);
+ }
+
+ sprite->pos1.x += r7;
+ sprite->pos1.y += r4;
+ sprite->data[0] = 6;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + r8;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + r6;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80D020C);
+}
+
+void sub_80D020C(struct Sprite* sprite)
+{
+ if (sprite->animEnded == 1)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/grow.c b/src/battle/anim/grow.c
new file mode 100755
index 000000000..35047c8b0
--- /dev/null
+++ b/src/battle/anim/grow.c
@@ -0,0 +1,31 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D7714;
+
+static void sub_80D0904(u8 taskId);
+
+// grow (grows a Pokemon then shrinks back to normal size.)
+// Used in Swagger and Bulk Up.
+
+void sub_80D08C8(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ sub_80798F4(task, spriteId, &gUnknown_083D7714);
+ task->func = sub_80D0904;
+}
+
+void sub_80D0904(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (!sub_807992C(task))
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/guillotine.c b/src/battle/anim/guillotine.c
new file mode 100755
index 000000000..b710f372a
--- /dev/null
+++ b/src/battle/anim/guillotine.c
@@ -0,0 +1,90 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D02D0(struct Sprite* sprite);
+static void sub_80D0344(struct Sprite* sprite);
+static void sub_80D03A8(struct Sprite* sprite);
+
+// guillotine (does a reverse grip where the slices can reverse at a given period.)
+// Used in Guillotine.
+
+void sub_80D0228(struct Sprite* sprite)
+{
+ s16 r8 = 32;
+ s16 r4 = -32;
+ s16 r9 = 16;
+ s16 r6 = -16;
+ if (gBattleAnimArgs[0] != 0)
+ {
+ r8 = r4;
+ r4 = 32;
+ r9 = r6;
+ r6 = 16;
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ }
+
+ sprite->pos1.x += r8;
+ sprite->pos1.y += r4;
+ sprite->data[0] = 6;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + r9;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + r6;
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = gBattleAnimArgs[0];
+ sprite->data[6] = sprite->data[0];
+ sprite->callback = sub_80D02D0;
+}
+
+void sub_80D02D0(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) && sprite->animEnded == 1)
+ {
+ SeekSpriteAnim(sprite, 0);
+ sprite->animPaused = 1;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 2;
+ sprite->pos2.y = -2;
+ sprite->data[0] = sprite->data[6];
+ sprite->data[1] ^= 1;
+ sprite->data[2] ^= 1;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ sprite->callback = sub_80D0344;
+ }
+}
+
+void sub_80D0344(struct Sprite* sprite)
+{
+ if (sprite->data[3])
+ {
+ sprite->pos2.x = -sprite->pos2.x;
+ sprite->pos2.y = -sprite->pos2.y;
+ }
+
+ sprite->data[3] ^= 1;
+ if (++sprite->data[4] == 0x33)
+ {
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ sprite->animPaused = 0;
+ StartSpriteAnim(sprite, sprite->data[5] ^ 1);
+ sprite->callback = sub_80D03A8;
+ }
+}
+
+void sub_80D03A8(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) != 0)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/heal.c b/src/battle/anim/heal.c
new file mode 100755
index 000000000..c5950650c
--- /dev/null
+++ b/src/battle/anim/heal.c
@@ -0,0 +1,27 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// heal (healing sparkles on a Pokemon)
+// Used in Present, if the move heals instead of damages.
+
+void sub_80CBAA4(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_8078764(sprite, 0);
+ sprite->data[1] = gBattleAnimArgs[2];
+ }
+
+ sprite->data[0]++;
+ sprite->pos2.y = sprite->data[1] * sprite->data[0];
+ if (sprite->animEnded)
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/heart_1.c b/src/battle/anim/heart_1.c
new file mode 100755
index 000000000..1ab83136c
--- /dev/null
+++ b/src/battle/anim/heart_1.c
@@ -0,0 +1,25 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// heart_1 (a floating heart in a wave pattern upward.)
+// Used in Charm, Covet, and when a Pokemon is infatuated.
+
+void sub_80D1C80(struct Sprite* sprite)
+{
+ if (++sprite->data[0] == 1)
+ sub_80787B0(sprite, 0);
+
+ sprite->pos2.x = Sin(sprite->data[1], 8);
+ sprite->pos2.y = sprite->data[2] >> 8;
+ sprite->data[1] = (sprite->data[1] + 7) & 0xFF;
+ sprite->data[2] -= 0x80;
+ if (sprite->data[0] == 0x3C)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/homing.c b/src/battle/anim/homing.c
new file mode 100755
index 000000000..c5e372d78
--- /dev/null
+++ b/src/battle/anim/homing.c
@@ -0,0 +1,86 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CC7D4(struct Sprite* sprite);
+
+// homing (the spinning effect of sprites going inward in a static rotation.)
+// Used by Needle Arm.
+
+void sub_80CC6CC(struct Sprite* sprite)
+{
+ u8 a;
+ u8 b;
+ u16 c;
+ u16 x;
+ u16 y;
+
+ if (gBattleAnimArgs[4] == 0)
+ {
+ move_anim_8072740(sprite);
+ }
+ else
+ {
+ if (gBattleAnimArgs[0] == 0)
+ {
+ a = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ b = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ }
+ else
+ {
+ a = sub_8077ABC(gBattleAnimBankTarget, 2);
+ b = sub_8077ABC(gBattleAnimBankTarget, 3);
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ if (gBattleAnimArgs[1] == 0)
+ {
+ sprite->pos1.x = gBattleAnimArgs[2] + a;
+ sprite->pos1.y = gBattleAnimArgs[3] + b;
+ sprite->data[5] = a;
+ sprite->data[6] = b;
+ }
+ else
+ {
+ sprite->pos1.x = a;
+ sprite->pos1.y = b;
+ sprite->data[5] = gBattleAnimArgs[2] + a;
+ sprite->data[6] = gBattleAnimArgs[3] + b;
+ }
+
+ x = sprite->pos1.x;
+ sprite->data[1] = x * 16;
+ y = sprite->pos1.y;
+ sprite->data[2] = y * 16;
+ sprite->data[3] = (sprite->data[5] - sprite->pos1.x) * 16 / gBattleAnimArgs[4];
+ sprite->data[4] = (sprite->data[6] - sprite->pos1.y) * 16 / gBattleAnimArgs[4];
+ c = sub_80790F0(sprite->data[5] - x, sprite->data[6] - y);
+ if (NotInBattle())
+ c -= 0x8000;
+
+ sub_8078FDC(sprite, 0, 0x100, 0x100, c);
+ sprite->callback = sub_80CC7D4;
+ }
+}
+
+void sub_80CC7D4(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ {
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+ sprite->pos1.x = sprite->data[1] >> 4 ;
+ sprite->pos1.y = sprite->data[2] >> 4 ;
+ sprite->data[0]--;
+ }
+ else
+ {
+ move_anim_8074EE0(sprite);
+ }
+}
diff --git a/src/battle/anim/hop.c b/src/battle/anim/hop.c
new file mode 100755
index 000000000..60f3b8a48
--- /dev/null
+++ b/src/battle/anim/hop.c
@@ -0,0 +1,160 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// hop (where a sprite "hops" across the screen)
+// Used by Present, Trick, and the item knock off effect.
+
+void sub_80CB7EC(struct Sprite* sprite, s16 c)
+{
+ s32 a = (sprite->pos1.x * 256) | sprite->pos1.y;
+ s32 b = (sprite->data[6] * 256) | sprite->data[7];
+ c *= 256;
+ sprite->data[5] = a;
+ sprite->data[6] = b;
+ sprite->data[7] = c;
+}
+
+bool8 sub_80CB814(struct Sprite* sprite)
+{
+ u16 r10 = (u8)(sprite->data[5] >> 8);
+ u16 r9 = (u8)sprite->data[5];
+ s32 r2 = (u8)(sprite->data[6] >> 8);
+ s32 r4 = (u8)sprite->data[6];
+ s16 r6 = sprite->data[7] >> 8;
+ s16 r3 = sprite->data[7] & 0xFF;
+ s16 r4_2;
+ s16 r0;
+ s32 var1;
+ s32 var2;
+
+ if (r2 == 0)
+ {
+ r2 = -32;
+ }
+ else if (r2 == 255)
+ {
+ r2 = 0x110;
+ }
+
+ r4_2 = r4 - r9;
+ r0 = r2 - r10;
+ var1 = r0 * r3 / r6;
+ var2 = r4_2 * r3 / r6;
+ sprite->pos1.x = var1 + r10;
+ sprite->pos1.y = var2 + r9;
+ if (++r3 == r6)
+ return TRUE;
+
+ sprite->data[7] = (r6 << 8) | r3;
+ return FALSE;
+}
+
+void sub_80CB8B8(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 10)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ }
+
+ sprite->data[0]++;
+ if (sprite->data[0] > 50)
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CB8E8(struct Sprite* sprite)
+{
+ sprite->data[0] += sprite->data[3] * 128 / sprite->data[4];
+ if (sprite->data[0] >= 128)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = 0;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 128, 30 - sprite->data[1] * 8);
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = 0;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CB8B8;
+ }
+}
+
+void sub_80CB94C(struct Sprite* sprite)
+{
+ s16 e1;
+ s16 e2;
+ sub_80787B0(sprite, 0);
+ e1 = sub_8077ABC(gBattleAnimBankTarget, 0);
+ e2 = sub_8077ABC(gBattleAnimBankTarget, 1);
+ if ((gBattleAnimBankAttacker ^ 2) == gBattleAnimBankTarget)
+ {
+ sprite->data[6] = e1;
+ sprite->data[7] = e2 + 10;
+ sub_80CB7EC(sprite, 0x3C);
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->data[6] = e1;
+ sprite->data[7] = e2 + 10;
+ sub_80CB7EC(sprite, 0x3C);
+ sprite->data[3] = 3;
+ }
+
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB8E8;
+}
+
+void sub_80CB9C4(struct Sprite* sprite)
+{
+ int zero;
+ sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
+ zero = 0;
+ if (sprite->data[0] > 0x7F)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = zero;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = zero;
+ sprite->data[0] = zero;
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CBA28(struct Sprite* sprite)
+{
+ s16 e = sub_8077ABC(gBattleAnimBankTarget, 1);
+ if (GetBankSide(gBattleAnimBankTarget) == 0)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = e + 10;
+ sub_80CB7EC(sprite, 0x28);
+ sprite->data[3] = 3;
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB8E8;
+ }
+ else
+ {
+ sprite->data[6] = 255;
+ sprite->data[7] = e + 10;
+ if (NotInBattle())
+ sprite->data[6] = 0;
+
+ sub_80CB7EC(sprite, 0x28);
+ sprite->data[3] = 3;
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB9C4;
+ }
+}
diff --git a/src/battle/anim/hop_2.c b/src/battle/anim/hop_2.c
new file mode 100755
index 000000000..5458c4599
--- /dev/null
+++ b/src/battle/anim/hop_2.c
@@ -0,0 +1,70 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern void sub_80CB7EC(struct Sprite* sprite, s16 c);
+extern bool8 sub_80CB814(struct Sprite* sprite);
+extern void sub_80CB8B8(struct Sprite* sprite);
+
+static void sub_80CBB60(struct Sprite* sprite);
+
+// hop_2
+// Used in item steal.
+
+void sub_80CBAE8(struct Sprite* sprite)
+{
+ s16 p1;
+ s16 p2;
+ sub_8078764(sprite, 0);
+ p1 = sub_8077ABC(gBattleAnimBankAttacker, 0);
+ p2 = sub_8077ABC(gBattleAnimBankAttacker, 1);
+ if ((gBattleAnimBankTarget ^ 2) == gBattleAnimBankAttacker)
+ {
+ sprite->data[6] = p1;
+ sprite->data[7] = p2 + 10;
+ sub_80CB7EC(sprite, 0x3c);
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->data[6] = p1;
+ sprite->data[7] = p2 + 10;
+ sub_80CB7EC(sprite, 0x3c);
+ sprite->data[3] = 3;
+ }
+
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CBB60;
+}
+
+void sub_80CBB60(struct Sprite* sprite)
+{
+ int zero;
+ sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
+ zero = 0;
+ if (sprite->data[0] > 0x7F)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = zero;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
+ if (sprite->pos2.y == 0)
+ {
+ PlaySE12WithPanning(0x7D, sub_8076F98(0x3F));
+ }
+
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = 0;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CB8B8;
+ PlaySE12WithPanning(0x7D, sub_8076F98(-0x40));
+ }
+}
diff --git a/src/battle/anim/kiss_fountain.c b/src/battle/anim/kiss_fountain.c
new file mode 100755
index 000000000..2e7f64c11
--- /dev/null
+++ b/src/battle/anim/kiss_fountain.c
@@ -0,0 +1,38 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// kiss_fountain (a series of hearts pour out of a target Pokemon.)
+// Used in Attract and Sweet Kiss.
+
+void sub_80D1FDC(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[4] += sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]);
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ if (sprite->data[3] > 0x64)
+ {
+ sprite->invisible = sprite->data[3] % 2;
+ }
+
+ if (sprite->data[3] > 0x78)
+ {
+ move_anim_8072740(sprite);
+ }
+ }
+}
diff --git a/src/battle/anim/leaf.c b/src/battle/anim/leaf.c
new file mode 100755
index 000000000..13d1bc9f5
--- /dev/null
+++ b/src/battle/anim/leaf.c
@@ -0,0 +1,74 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CAF20(struct Sprite* sprite);
+static void sub_80CAF6C(struct Sprite* sprite);
+
+// leaf
+// Used by Razor Leaf and Twister.
+
+void sub_80CAED8(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ sprite->callback = sub_80CAF20;
+}
+
+void sub_80CAF20(struct Sprite* sprite)
+{
+ if (!sprite->data[2])
+ {
+ if (sprite->data[1] & 1)
+ {
+ sprite->data[0] = 0x80;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sprite->data[0] = sprite->data[1] & 1;
+ sprite->data[1] = sprite->data[1] & 1;
+ sprite->data[2] = sprite->data[1] & 1;
+ }
+ sprite->callback = sub_80CAF6C;
+ }
+ else
+ {
+ sprite->data[2]--;
+ sprite->pos1.x += sprite->data[0];
+ sprite->pos1.y += sprite->data[1];
+ }
+}
+
+void sub_80CAF6C(struct Sprite* sprite)
+{
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ sprite->pos2.x = -Sin(sprite->data[0], 0x19);
+ }
+ else
+ {
+ sprite->pos2.x = Sin(sprite->data[0], 0x19);
+ }
+
+ sprite->data[0] = (sprite->data[0] + 2) & 0xFF;
+ sprite->data[1]++;
+ if (!(sprite->data[1] & 1))
+ {
+ sprite->pos2.y++;
+ }
+
+ if (sprite->data[1] > 0x50)
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/love_bg.c b/src/battle/anim/love_bg.c
new file mode 100755
index 000000000..c5659463e
--- /dev/null
+++ b/src/battle/anim/love_bg.c
@@ -0,0 +1,128 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "decompress.h"
+#include "palette.h"
+
+struct Struct_sub_8078914
+{
+ u8 *field_0;
+ u8 *field_4;
+ u8 field_8;
+};
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct INCBIN_U8 gAttractTilemap;
+extern struct INCBIN_U8 gAttractGfx;
+extern struct INCBIN_U8 gAttractPal;
+
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_030042C0;
+
+static void sub_80D21F0(u8 taskId);
+
+// love_bg (makes the BG a background of hearts.)
+// Used in Attract.
+
+void sub_80D2100(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+ u8* tempvar;
+ REG_BLDCNT = 0x3F42;
+ REG_BLDALPHA = 0x1000;
+ REG_BG1CNT_BITFIELD.priority = 3;
+ REG_BG1CNT_BITFIELD.screenSize = 0;
+ if (!NotInBattle())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ sub_8078914(&subStruct);
+ tempvar = subStruct.field_4;
+ DmaFill32(3, 0x0, tempvar, 0x1000);
+ LZDecompressVram(&gAttractTilemap, tempvar);
+ LZDecompressVram(&gAttractGfx, subStruct.field_0);
+ LoadCompressedPalette(&gAttractPal, subStruct.field_8 << 4, 32);
+ if (NotInBattle())
+ sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
+
+ gTasks[taskId].func = sub_80D21F0;
+}
+
+void sub_80D21F0(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]++;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 16)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 0x8D)
+ {
+ gTasks[taskId].data[11] = 16;
+ gTasks[taskId].data[12]++;
+ }
+ break;
+ case 2:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]--;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_8078914(&subStruct);
+ {
+ u8 *addr = subStruct.field_0;
+ u32 size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ }
+ DmaClear32(3, subStruct.field_4, 0x800);
+ if (!NotInBattle())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 0;
+
+ gTasks[taskId].data[12]++;
+ // fall through
+ case 4:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/lunge_1.c b/src/battle/anim/lunge_1.c
new file mode 100755
index 000000000..f1e1e35b6
--- /dev/null
+++ b/src/battle/anim/lunge_1.c
@@ -0,0 +1,124 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CD7CC(struct Sprite* sprite);
+static void sub_80CD81C(struct Sprite* sprite);
+static void sub_80CD8A8(struct Sprite* sprite);
+static void sub_80CD8F8(struct Sprite* sprite);
+static void sub_80CD91C(struct Sprite* sprite);
+static void sub_80CD9B8(struct Sprite* sprite);
+
+// lunge_1 (makes the pokemon sprite do a "lunge" where it leans back to attack, usually with its head or horn.)
+// Used in Drill Peck, Headbutt, Horn Attack, and Horn Drill.
+
+void sub_80CD774(struct Sprite* sprite)
+{
+ sprite->invisible = 1;
+ sprite->data[0] = 0;
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ sprite->callback = sub_80CD7CC;
+ break;
+ case 1:
+ sprite->callback = sub_80CD8A8;
+ break;
+ case 2:
+ sprite->callback = sub_80CD8F8;
+ break;
+ default:
+ sprite->callback = sub_80CD9B8;
+ break;
+ }
+}
+
+void sub_80CD7CC(struct Sprite* sprite)
+{
+ sprite->data[0] = 6;
+ sprite->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? 2 : -2;
+ sprite->data[2] = 0;
+ sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
+ StoreSpriteCallbackInData(sprite, sub_80CD81C);
+ sprite->callback = sub_8078458;
+}
+
+void sub_80CD81C(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
+ sub_8078E70(sprite->data[3], 0);
+ sprite->data[4] = (sprite->data[6] = GetBankSide(gBattleAnimBankAttacker)) ? 0x300 : 0xFFFFFD00;
+ sprite->data[5] = 0;
+ }
+
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[3]);
+ if (++sprite->data[0] > 3)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD9B8;
+ }
+}
+
+void sub_80CD8A8(struct Sprite* sprite)
+{
+ sprite->data[0] = 4;
+ sprite->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? -3 : 3;
+ sprite->data[2] = 0;
+ sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
+ StoreSpriteCallbackInData(sprite, sub_80CD9B8);
+ sprite->callback = sub_8078458;
+}
+
+void sub_80CD8F8(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 8)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD91C;
+ }
+}
+
+void sub_80CD91C(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
+ sprite->data[6] = GetBankSide(gBattleAnimBankAttacker);
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ sprite->data[4] = 0xFC00;
+ sprite->data[5] = 0xC00;
+ }
+ else
+ {
+ sprite->data[4] = 0x400;
+ sprite->data[5] = 0xF400;
+ }
+ }
+
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[3]);
+ if (++sprite->data[0] > 2)
+ {
+ sub_8078F40(sprite->data[3]);
+ sprite->callback = sub_80CD9B8;
+ }
+}
+
+void sub_80CD9B8(struct Sprite* sprite)
+{
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/lunge_2.c b/src/battle/anim/lunge_2.c
new file mode 100755
index 000000000..3972bee59
--- /dev/null
+++ b/src/battle/anim/lunge_2.c
@@ -0,0 +1,163 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CDB60(u8 taskId);
+static void sub_80CDD20(u8 taskId);
+
+// lunge_2
+// Drill Peck
+
+void sub_80CDAC8(u8 taskId)
+{
+ u8 a;
+
+ gTasks[taskId].data[0] = gObjectBankIDs[gBattleAnimBankAttacker];
+ a = GetBankSide(gBattleAnimBankAttacker);
+ gTasks[taskId].data[1] = a;
+ gTasks[taskId].data[2] = 0;
+ switch (gBattleAnimArgs[0])
+ {
+ default:
+ DestroyAnimVisualTask(taskId);
+ break;
+ case 0:
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 8;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].data[5] = 3;
+ if (a == 0)
+ gTasks[taskId].data[5] *= -1;
+
+ gTasks[taskId].func = sub_80CDB60;
+ break;
+ case 1:
+ gTasks[taskId].data[3] = 8;
+ gTasks[taskId].data[4] = 0x600;
+ gTasks[taskId].data[5] = 0xC0;
+ if (a == 0)
+ {
+ gTasks[taskId].data[4] = -gTasks[taskId].data[4];
+ gTasks[taskId].data[5] = -gTasks[taskId].data[5];
+ }
+
+ gTasks[taskId].func = sub_80CDD20;
+ break;
+ }
+}
+
+void sub_80CDB60(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[2])
+ {
+ case 0:
+ if (task->data[3])
+ {
+ task->data[4] += task->data[5];
+ gSprites[task->data[0]].pos2.x = task->data[4];
+ task->data[3]--;
+ }
+ else
+ {
+ task->data[3] = 8;
+ task->data[4] = 0;
+ task->data[5] = (task->data[1] == 0) ? -0xC0 : 0xC0;
+ sub_8078E70(task->data[0], 0);
+ task->data[2]++;
+ }
+ break;
+ case 1:
+ if (task->data[3])
+ {
+ task->data[4] += task->data[5];
+ obj_id_set_rotscale(task->data[0], 0x100, 0x100, task->data[4]);
+ sub_8078F9C(task->data[0]);
+ task->data[3]--;
+ }
+ else
+ {
+ task->data[3] = 8;
+ task->data[4] = gSprites[task->data[0]].pos2.x;
+ task->data[5] = (task->data[1] == 0) ? 0x2 : -0x2;
+ task->data[6] = 1;
+ task->data[2]++;
+ }
+ break;
+ case 2:
+ if (task->data[3])
+ {
+ if (task->data[6])
+ {
+ task->data[6]--;
+ }
+ else
+ {
+ if (task->data[3] & 1)
+ gSprites[task->data[0]].pos2.x = task->data[4] + task->data[5];
+ else
+ gSprites[task->data[0]].pos2.x = task->data[4] - task->data[5];
+
+ task->data[6] = 1;
+ task->data[3]--;
+ }
+ }
+ else
+ {
+ gSprites[task->data[0]].pos2.x = task->data[4];
+ task->data[3] = 12;
+ task->data[2]++;
+ }
+ break;
+ case 3:
+ if (task->data[3])
+ {
+ task->data[3]--;
+ }
+ else
+ {
+ task->data[3] = 3;
+ task->data[4] = gSprites[task->data[0]].pos2.x;
+ task->data[5] = (task->data[1] == 0) ? 8 : -8;
+ task->data[2]++;
+ }
+ break;
+ case 4:
+ if (task->data[3])
+ {
+ task->data[4] += task->data[5];
+ gSprites[task->data[0]].pos2.x = task->data[4];
+ task->data[3]--;
+ }
+ else
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80CDD20(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (task->data[3])
+ {
+ task->data[4] -= task->data[5];
+ obj_id_set_rotscale(task->data[0], 0x100, 0x100, task->data[4]);
+ sub_8078F9C(task->data[0]);
+ task->data[3]--;
+ }
+ else
+ {
+ sub_8078F40(task->data[0]);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/money.c b/src/battle/anim/money.c
new file mode 100755
index 000000000..91eaf20b1
--- /dev/null
+++ b/src/battle/anim/money.c
@@ -0,0 +1,62 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CFF68(struct Sprite* sprite);
+
+// money
+// Used by Pay Day.
+
+void sub_80CFE9C(struct Sprite* sprite)
+{
+ s16 r6;
+ s16 r7;
+ u16 var;
+
+ sub_80787B0(sprite, 1);
+ r6 = sub_8077ABC(gBattleAnimBankTarget, 2);
+ r7 = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3];
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ r6 += gBattleAnimArgs[2];
+ var = sub_80790F0(r6 - sprite->pos1.x, r7 - sprite->pos1.y);
+ var += 0xC000;
+ sub_8078FDC(sprite, 0, 0x100, 0x100, var);
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = r6;
+ sprite->data[4] = r7;
+ sprite->callback = sub_8078C00;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
+
+void sub_80CFF50(struct Sprite* sprite)
+{
+ sprite->data[2] = -16;
+ sprite->pos1.y += 8;
+ sprite->callback = sub_80CFF68;
+}
+
+void sub_80CFF68(struct Sprite* sprite)
+{
+ sprite->data[0] += 0x80;
+ sprite->pos2.x = sprite->data[0] >> 8;
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ sprite->pos2.x = -sprite->pos2.x;
+
+ sprite->pos2.y = Sin(sprite->data[1], sprite->data[2]);
+ sprite->data[1] += 5;
+ if (sprite->data[1] > 0x7E)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] /= 2;
+ if (++sprite->data[3] == 2)
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/moon.c b/src/battle/anim/moon.c
new file mode 100755
index 000000000..e2a31d14d
--- /dev/null
+++ b/src/battle/anim/moon.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CE354(struct Sprite* sprite);
+
+// moon (shows a moon image.)
+// Used in Moonlight.
+
+void sub_80CE30C(struct Sprite* sprite)
+{
+ if (NotInBattle())
+ {
+ sprite->pos1.x = 0x30;
+ sprite->pos1.y = 0x28;
+ }
+ else
+ {
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+ }
+
+ sprite->oam.shape = 0;
+ sprite->oam.size = 3;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CE354;
+}
+
+void sub_80CE354(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/note_rain.c b/src/battle/anim/note_rain.c
new file mode 100755
index 000000000..fd62b7176
--- /dev/null
+++ b/src/battle/anim/note_rain.c
@@ -0,0 +1,37 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u16 gUnknown_083D7A5C[5];
+
+// note_rain (notes rain from a source point, usually a bell.)
+// Used in Heal Bell.
+
+void sub_80D1BA8(struct Sprite* sprite, u8 a, u8 b)
+{
+ u8 tile;
+ tile = (b & 1);
+ tile = ((-tile | tile) >> 31) & 32;
+ sprite->oam.tileNum += tile + (a << 2);
+ sprite->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083D7A5C[b >> 1]);
+}
+
+void sub_80D1C08(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[2];
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[3];
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ sub_80D1BA8(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]);
+}
diff --git a/src/battle/anim/note_scatter.c b/src/battle/anim/note_scatter.c
new file mode 100755
index 000000000..9ff49ee9d
--- /dev/null
+++ b/src/battle/anim/note_scatter.c
@@ -0,0 +1,54 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CED78(struct Sprite* sprite);
+
+// note_scatter
+// Used by Teeter Dance.
+
+void sub_80CECE8(struct Sprite* sprite)
+{
+ int a;
+ if (GetBankSide(gBattleAnimBankAttacker) == 1)
+ {
+ a = gBattleAnimArgs[1];
+ (u16)gBattleAnimArgs[1] = -a;
+ }
+
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = sprite->pos1.x << 4;
+ sprite->data[5] = sprite->pos1.y << 4;
+ sprite->data[6] = (gBattleAnimArgs[1] << 4) / 5;
+ sprite->data[7] = (gBattleAnimArgs[2] << 7) / 5;
+ sprite->callback = sub_80CED78;
+}
+
+void sub_80CED78(struct Sprite* sprite)
+{
+ sprite->data[4] += sprite->data[6];
+ sprite->data[5] += sprite->data[7];
+ sprite->pos1.x = sprite->data[4] >> 4;
+ sprite->pos1.y = sprite->data[5] >> 4;
+ if (sprite->data[0] > 5 && sprite->data[3] == 0)
+ {
+ sprite->data[2] = (sprite->data[2] + 16) & 0xFF;
+ sprite->pos2.x = Cos(sprite->data[2], 18);
+ sprite->pos2.y = Sin(sprite->data[2], 18);
+ if (sprite->data[2] == 0)
+ sprite->data[3] = 1;
+ }
+
+ if (++sprite->data[0] == 0x30)
+ move_anim_8074EE0(sprite);
+}
diff --git a/src/battle/anim/note_scatter_2.c b/src/battle/anim/note_scatter_2.c
new file mode 100755
index 000000000..a163aa9a5
--- /dev/null
+++ b/src/battle/anim/note_scatter_2.c
@@ -0,0 +1,57 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u16 gUnknown_083D712C[4][6];
+
+static void sub_80CEEE8(struct Sprite* sprite);
+
+// note_scatter_2 (slower scatter of notes.)
+// Used in Belly Drum.
+
+void sub_80CEE60(struct Sprite* sprite)
+{
+ s16 a;
+ u8 index;
+ sub_8078650(sprite);
+ sprite->pos1.y += 8;
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+ index = IndexOfSpritePaletteTag(gUnknown_083D712C[gBattleAnimArgs[2]][0]);
+ if (index != 0xFF)
+ sprite->oam.paletteNum = index;
+
+ a = (gBattleAnimArgs[0] == 0) ? 0xFFE0 : 0x20;
+ sprite->data[0] = 40;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = a + sprite->data[1];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->data[3] - 40;
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CEEE8;
+}
+
+void sub_80CEEE8(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) == 0)
+ {
+ s16 a;
+ a = Sin(sprite->data[5], 8);
+ if (sprite->pos2.x < 0)
+ a = -a;
+
+ sprite->pos2.x += a;
+ sprite->pos2.y += Sin(sprite->data[5], 4);
+ sprite->data[5] = (sprite->data[5] + 8) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/note_wave.c b/src/battle/anim/note_wave.c
new file mode 100755
index 000000000..4dc3ceb75
--- /dev/null
+++ b/src/battle/anim/note_wave.c
@@ -0,0 +1,143 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u16 gUnknown_083D712C[4][6];
+
+static void sub_80CEBC4(s16 a, s16 b, s16* c, s16* d, s8 e);
+static void sub_80CEC1C(struct Sprite* sprite);
+
+// note_wave
+// Used by Grasswhistle, Belly Drum, and Sing.
+
+// rainbow effect for musical notes
+void sub_80CEA20(u8 taskId)
+{
+ u16 i;
+ u16 j;
+ u16 index;
+
+ index = IndexOfSpritePaletteTag(gUnknown_083D712C[0][0]);
+ if (index != 0xFF)
+ {
+ index = (index << 4) + 0x100;
+ for (i = 1; i < 6; i++)
+ {
+ gPlttBufferFaded[index + i] = gUnknown_083D712C[0][i];
+ }
+ }
+
+ for (j = 1; j < 4; j++)
+ {
+ index = AllocSpritePalette(gUnknown_083D712C[j][0]);
+ if (index != 0xFF)
+ {
+ index = (index << 4) + 0x100;
+ for (i = 1; i < 6; i++)
+ {
+ gPlttBufferFaded[index + i] = gUnknown_083D712C[j][i];
+ }
+ }
+ }
+ DestroyAnimVisualTask(taskId);
+}
+
+// clears the rainbow effect for musical notes.
+void sub_80CEAD8(u8 taskId)
+{
+ u16 i;
+ for (i = 1; i < 4; i++)
+ {
+ FreeSpritePaletteByTag(gUnknown_083D712C[i][0]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80CEB0C(struct Sprite* sprite)
+{
+ u8 index;
+ u8 a;
+ u8 b;
+ sub_8078650(sprite);
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ if ((index = IndexOfSpritePaletteTag(gUnknown_083D712C[gBattleAnimArgs[1]][0])) != 0xFF)
+ sprite->oam.paletteNum = index;
+
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = 0;
+ sprite->data[3] = gBattleAnimArgs[2];
+ if (NotInBattle())
+ {
+ a = 0x30;
+ b = 0x28;
+ }
+ else
+ {
+ a = sub_8077ABC(gBattleAnimBankTarget, 2);
+ b = sub_8077ABC(gBattleAnimBankTarget, 3);
+ }
+
+ sprite->data[4] = sprite->pos1.x << 4;
+ sprite->data[5] = sprite->pos1.y << 4;
+ sub_80CEBC4(a - sprite->pos1.x, b - sprite->pos1.y, &sprite->data[6], &sprite->data[7], 0x28);
+ sprite->callback = sub_80CEC1C;
+}
+
+void sub_80CEBC4(s16 a, s16 b, s16* c, s16* d, s8 e)
+{
+ int f;
+ int g;
+ if (a < 0)
+ e = -e;
+
+ f = a << 8;
+ g = f / e;
+ if (g == 0)
+ g = 1;
+
+ *c = f / g;
+ *d = (b << 8) / g;
+}
+
+void sub_80CEC1C(struct Sprite* sprite)
+{
+ int b;
+ s16 a;
+ int c;
+ u8 index;
+ sprite->data[0]++;
+ b = sprite->data[0] * 5 - ((sprite->data[0] * 5 / 256) << 8);
+ sprite->data[4] += sprite->data[6];
+ sprite->data[5] += sprite->data[7];
+ sprite->pos1.x = sprite->data[4] >> 4;
+ sprite->pos1.y = sprite->data[5] >> 4;
+ sprite->pos2.y = Sin(b, 15);
+ a = (u16)sprite->pos1.y;
+ c = (u16)sprite->pos1.x;
+
+ if ((u32)((c + 16) << 16) > (0x110) << 16 || a < -16 || a > 0x80)
+ {
+ move_anim_8074EE0(sprite);
+ }
+ else
+ {
+ if (sprite->data[3] && ++sprite->data[2] > sprite->data[3])
+ {
+ sprite->data[2] = 0;
+ if (++sprite->data[1] > 3)
+ sprite->data[1] = 0;
+
+ index = IndexOfSpritePaletteTag(gUnknown_083D712C[sprite->data[1]][0]);
+ if (index != 0xFF)
+ sprite->oam.paletteNum = index;
+ }
+ }
+}
diff --git a/src/battle/anim/orbit.c b/src/battle/anim/orbit.c
new file mode 100755
index 000000000..9b77552fa
--- /dev/null
+++ b/src/battle/anim/orbit.c
@@ -0,0 +1,147 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CAC44(struct Sprite* sprite);
+static void sub_80CADA8(struct Sprite* sprite);
+static void sub_80CAE74(struct Sprite* sprite);
+
+// orbit (The effect of a sprite rotating around another one in a pseudo 3D effect.)
+// Used by Spore, Cotton Spore, and Petal Dance.
+
+void sub_80CABF8(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ if (gBattleAnimArgs[4] == 1)
+ {
+ sprite->oam.objMode = 1;
+ }
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->callback = sub_80CAC44;
+ sub_80CAC44(sprite);
+}
+
+void sub_80CAC44(struct Sprite* sprite)
+{
+ u8 var1;
+
+ sprite->pos2.x = Sin(sprite->data[1], 32);
+ sprite->pos2.y = Cos(sprite->data[1], -3) + ((sprite->data[2] += 24) >> 8);
+ if ((u16)(sprite->data[1] - 0x40) < 0x80)
+ {
+ sprite->oam.priority = (sub_8079ED4(gBattleAnimBankTarget) & 3);
+ }
+ else
+ {
+ var1 = sub_8079ED4(gBattleAnimBankTarget) + 1;
+ if (var1 > 3)
+ {
+ var1 = 3;
+ }
+
+ sprite->oam.priority = var1;
+ }
+
+ sprite->data[1] = (sprite->data[1] + 2) & 0xFF;
+ sprite->data[0]--;
+ if (sprite->data[0] == -1)
+ move_anim_8072740(sprite);
+}
+
+void sub_80CACEC(u8 taskId)
+{
+ if (NotInBattle() || !IsDoubleBattle())
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ if (GetBankIdentity_permutated(gBattleAnimBankTarget) == 1)
+ {
+ REG_BG2CNT_BITFIELD.priority = 3;
+ }
+ else
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ }
+
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80CAD54(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = 0x40;
+ sprite->callback = sub_80CADA8;
+ sub_80CADA8(sprite);
+}
+
+void sub_80CADA8(struct Sprite* sprite)
+{
+ if (!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], 32);
+ sprite->pos2.y += Cos(sprite->data[5], -5);
+ if ((u16)(sprite->data[5] - 0x40) < 0x80)
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimBankAttacker) - 1;
+ }
+ else
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimBankAttacker) + 1;
+ }
+
+ sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CAE20(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = 0x40;
+ sprite->callback = sub_80CAE74;
+ sub_80CAE74(sprite);
+}
+
+void sub_80CAE74(struct Sprite* sprite)
+{
+ if (!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], 8);
+ if ((u16)(sprite->data[5] - 0x3B) < 5 || (u16)(sprite->data[5] - 0xBB) < 5)
+ {
+ sprite->oam.matrixNum ^= 8;
+ }
+
+ sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/orbit_fast.c b/src/battle/anim/orbit_fast.c
new file mode 100755
index 000000000..30396f398
--- /dev/null
+++ b/src/battle/anim/orbit_fast.c
@@ -0,0 +1,62 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D2704(struct Sprite* sprite);
+
+// orbit_fast (a quickly moving fast circular motion of a sprite around an object.)
+// Used by Hidden Power.
+
+void sub_80D26A4(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->affineAnimPaused = 1;
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[7] = sub_8079E90(gBattleAnimBankAttacker);
+ sprite->callback = sub_80D2704;
+ sub_80D2704(sprite);
+}
+
+void sub_80D2704(struct Sprite* sprite)
+{
+ if ((u16)(sprite->data[1] - 0x40) <= 0x7F)
+ sprite->subpriority = sprite->data[7] + 1;
+ else
+ sprite->subpriority = sprite->data[7] - 1;
+
+ sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8);
+ sprite->pos2.y = Cos(sprite->data[1], sprite->data[3] >> 8);
+ sprite->data[1] = (sprite->data[1] + 9) & 0xFF;
+ switch (sprite->data[5])
+ {
+ case 1:
+ sprite->data[2] -= 0x400;
+ sprite->data[3] -= 0x100;
+ if (++sprite->data[4] == sprite->data[0])
+ {
+ sprite->data[5] = 2;
+ return;
+ }
+ break;
+ case 0:
+ sprite->data[2] += 0x400;
+ sprite->data[3] += 0x100;
+ if (++sprite->data[4] == sprite->data[0])
+ {
+ sprite->data[4] = 0;
+ sprite->data[5] = 1;
+ }
+ break;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/orbit_scatter.c b/src/battle/anim/orbit_scatter.c
new file mode 100755
index 000000000..6cebc9375
--- /dev/null
+++ b/src/battle/anim/orbit_scatter.c
@@ -0,0 +1,31 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D2834(struct Sprite* sprite);
+
+// orbit_scatter (scatters the objects associated with the fast orbit from the last file.)
+// Used in Hidden Power.
+
+void sub_80D27E0(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
+ sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
+ sprite->callback = sub_80D2834;
+}
+
+void sub_80D2834(struct Sprite* sprite)
+{
+ sprite->pos2.x += sprite->data[0];
+ sprite->pos2.y += sprite->data[1];
+ if (sprite->pos1.x + sprite->pos2.x + 16 > 0x110u || sprite->pos1.y + sprite->pos2.y > 0xA0 || sprite->pos1.y + sprite->pos2.y < -16)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c
new file mode 100755
index 000000000..22e7d3895
--- /dev/null
+++ b/src/battle/anim/orbs.c
@@ -0,0 +1,162 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "random.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CA8B4(struct Sprite* sprite);
+static void sub_80CA9F8(struct Sprite* sprite);
+static void sub_80CAACC(struct Sprite* sprite);
+
+extern struct SpriteTemplate gSpriteTemplate_83D631C;
+
+// orbs
+// Used by Solar Beam, Absorb, Hyper Beam, and Leech Seed.
+
+void sub_80CA7B0(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+}
+
+void sub_80CA800(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
+
+void sub_80CA858(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CA8B4;
+ sub_80CA8B4(sprite);
+}
+
+void sub_80CA8B4(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ if (sprite->data[5] > 0x7F)
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimBankTarget) + 1;
+ }
+ else
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimBankTarget) + 6;
+ }
+ sprite->pos2.x += Sin(sprite->data[5], 5);
+ sprite->pos2.y += Cos(sprite->data[5], 14);
+ sprite->data[5] = (sprite->data[5] + 15) & 0xFF;
+ }
+}
+
+void sub_80CA928(u8 taskId)
+{
+ gTasks[taskId].data[0]--;
+ if (gTasks[taskId].data[0] == -1)
+ {
+ gTasks[taskId].data[1]++;
+ gTasks[taskId].data[0] = 6;
+ gBattleAnimArgs[0] = 15;
+ gBattleAnimArgs[1] = 0;
+ gBattleAnimArgs[2] = 80;
+ gBattleAnimArgs[3] = 0;
+ CreateSpriteAndAnimate(&gSpriteTemplate_83D631C, 0, 0, sub_8079E90(gBattleAnimBankTarget) + 1);
+ }
+
+ if (gTasks[taskId].data[1] == 15)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80CA9A8(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->data[5] = gBattleAnimArgs[2];
+ sub_80786EC(sprite);
+ sprite->callback = sub_80CA9F8;
+}
+
+void sub_80CA9F8(struct Sprite* sprite)
+{
+ if (sub_8078718(sprite))
+ move_anim_8072740(sprite);
+}
+
+void sub_80CAA14(struct Sprite* sprite)
+{
+ u16 a = Random();
+ u16 b;
+
+ StartSpriteAnim(sprite, a & 7);
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ sprite->pos1.x -= 20;
+ }
+ else
+ {
+ sprite->pos1.x += 20;
+ }
+
+ b = Random();
+ sprite->data[0] = (b & 31) + 64;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
+ sub_8078D60(sprite);
+ sprite->data[5] = Random() & 0xFF;
+ sprite->data[6] = sprite->subpriority;
+ sprite->callback = sub_80CAACC;
+ sub_80CAACC(sprite);
+}
+
+void sub_80CAACC(struct Sprite* sprite)
+{
+ if (sub_8078CE8(sprite))
+ {
+ move_anim_8072740(sprite);
+ }
+ else
+ {
+ sprite->pos2.y += Cos(sprite->data[5], 12);
+ if (sprite->data[5] <= 0x7E)
+ {
+ sprite->subpriority = sprite->data[6];
+ }
+ else
+ {
+ sprite->subpriority = sprite->data[6] + 1;
+ }
+
+ sprite->data[5] = (sprite->data[5] + 24) & 0xFF;
+ }
+}
diff --git a/src/battle/anim/osmose.c b/src/battle/anim/osmose.c
new file mode 100755
index 000000000..f1f1b25ff
--- /dev/null
+++ b/src/battle/anim/osmose.c
@@ -0,0 +1,29 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// osmose (I didn't want to use "absorb" as thats confusing)
+// Used by Ingrain.
+
+void sub_80CB768(struct Sprite* sprite)
+{
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[1];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+ }
+
+ sprite->data[0]++;
+ sprite->pos2.x = sprite->data[1] * sprite->data[0];
+ sprite->pos2.y = Sin((sprite->data[0] * 20) & 0xFF, sprite->data[2]);
+ if (sprite->data[0] > sprite->data[3])
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/perceive.c b/src/battle/anim/perceive.c
new file mode 100755
index 000000000..27afcbc0c
--- /dev/null
+++ b/src/battle/anim/perceive.c
@@ -0,0 +1,24 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// perceive (shows a sparkle in a set of eyes, usually for heightened perception.)
+// Used in Glare, Tickle, and Scary Face.
+
+void sub_80D2904(struct Sprite* sprite)
+{
+ if (sprite->animEnded)
+ move_anim_8072740(sprite);
+}
+
+void sub_80D2920(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->callback = sub_80D2904;
+}
diff --git a/src/battle/anim/powder.c b/src/battle/anim/powder.c
new file mode 100755
index 000000000..178a61737
--- /dev/null
+++ b/src/battle/anim/powder.c
@@ -0,0 +1,48 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+
+static void sub_80CA768(struct Sprite* sprite);
+
+// powder
+// Used by Sleep Powder, Stun Spore, and Poison Powder.
+
+void sub_80CA710(struct Sprite* sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ sprite->data[3] = -gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->data[3] = gBattleAnimArgs[4];
+ }
+
+ sprite->data[4] = gBattleAnimArgs[5];
+ sprite->callback = sub_80CA768;
+}
+
+void sub_80CA768(struct Sprite* sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ sprite->pos2.y = sprite->data[2] >> 8;
+ sprite->data[2] += sprite->data[1];
+ sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
+ sprite->data[5] = (sprite->data[5] + sprite->data[4]) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/ring.c b/src/battle/anim/ring.c
new file mode 100755
index 000000000..0a5816b23
--- /dev/null
+++ b/src/battle/anim/ring.c
@@ -0,0 +1,156 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "main.h"
+#include "blend_palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80D1098(struct Sprite* sprite);
+
+// ring (a ring that stretches outward from the Pokemon.)
+// Used in Aromatherapy and Heal Bell.
+
+void sub_80D0FD8(struct Sprite* sprite)
+{
+ u8 bank = 0;
+ u16 sp0 = 0;
+ u16 sp1 = 0;
+ u8 r4;
+
+ if (gBattleAnimArgs[2] == 0)
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ r4 = gBattleAnimArgs[3] ^ 1;
+ if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
+ {
+ sub_807A3FC(bank, r4, &sp0, &sp1);
+ if (r4 == 0)
+ r4 = sub_8077ABC(bank, 0);
+ else
+ r4 = sub_8077ABC(bank, 2);
+
+ if (GetBankSide(bank) != 0)
+ gBattleAnimArgs[0] -= (sp0 - r4) - gBattleAnimArgs[0]; // This is weird.
+ else
+ gBattleAnimArgs[0] = sp0 - r4;
+ }
+
+ sprite->callback = sub_80793C4;
+ sub_80793C4(sprite);
+}
+
+void sub_80D1098(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ FreeSpriteOamMatrix(sprite);
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80D10B8(struct Sprite* sprite)
+{
+ u16 r9 = 0;
+ u16 r6 = 0;
+ s16 sp0 = 0;
+ s16 sp1 = 0;
+ u8 sp4;
+ u8 bankr7;
+ u8 bankr8;
+ u8 r10;
+
+ if (gBattleAnimArgs[5] == 0)
+ {
+ bankr7 = gBattleAnimBankAttacker;
+ bankr8 = gBattleAnimBankTarget;
+ }
+ else
+ {
+ bankr7 = gBattleAnimBankTarget;
+ bankr8 = gBattleAnimBankAttacker;
+ }
+
+ if (gBattleAnimArgs[6] == 0)
+ {
+ r10 = 0;
+ sp4 = 1;
+ }
+ else
+ {
+ r10 = 2;
+ sp4 = 3;
+ }
+
+ if (GetBankSide(bankr7) != 0)
+ {
+ r9 = sub_8077ABC(bankr7, r10) + gBattleAnimArgs[0];
+ if (IsAnimBankSpriteVisible(bankr8 ^ 2))
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr8 ^ 2]].subpriority - 1;
+ else
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr8]].subpriority - 1;
+ }
+ else
+ {
+ r9 = sub_8077ABC(bankr7, r10) - gBattleAnimArgs[0];
+ if (gMain.inBattle && IsAnimBankSpriteVisible(bankr7 ^ 2))
+ {
+ if (gSprites[gObjectBankIDs[bankr7]].pos1.x < gSprites[gObjectBankIDs[bankr7 ^ 2]].pos1.x)
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr7 ^ 2]].subpriority + 1;
+ else
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
+ }
+ else
+ {
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
+ }
+
+ }
+
+ r6 = sub_8077ABC(bankr7, sp4) + gBattleAnimArgs[1];
+ if (gMain.inBattle && IsAnimBankSpriteVisible(bankr8 ^ 2))
+ {
+ sub_807A3FC(bankr8, gBattleAnimArgs[6], &sp0, &sp1);
+ }
+ else
+ {
+ sp0 = sub_8077ABC(bankr8, r10);
+ sp1 = sub_8077ABC(bankr8, sp4);
+ }
+
+ if (GetBankSide(bankr8))
+ sp0 += gBattleAnimArgs[3];
+ else
+ sp0 -= gBattleAnimArgs[3];
+
+ sp1 += gBattleAnimArgs[4];
+ sprite->pos1.x = sprite->data[1] = r9;
+ sprite->pos1.y = sprite->data[3] = r6;
+ sprite->data[2] = sp0;
+ sprite->data[4] = sp1;
+ sprite->data[0] = gBattleAnimArgs[0];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->callback = sub_80D1098;
+ sub_80D1098(sprite);
+}
+
+void sub_80D1318(struct Sprite* sprite)
+{
+ u8 index = IndexOfSpritePaletteTag(0x27DB);
+ if (index != 0xFF)
+ {
+ BlendPalette(((index << 20) + 0x1010000) >> 16, 15, gBattleAnimArgs[5], gBattleAnimArgs[4]);
+ }
+
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_80793C4;
+ sub_80793C4(sprite);
+}
diff --git a/src/battle/anim/roots.c b/src/battle/anim/roots.c
new file mode 100755
index 000000000..40c51808a
--- /dev/null
+++ b/src/battle/anim/roots.c
@@ -0,0 +1,67 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern s16 gUnknown_03000728[];
+
+static void sub_80CB710(struct Sprite* sprite);
+
+// roots
+// Used by Ingrain and Frenzy Plant.
+
+void sub_80CB59C(struct Sprite* sprite)
+{
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1);
+ sprite->pos2.x = gBattleAnimArgs[0];
+ sprite->pos2.y = gBattleAnimArgs[1];
+ sprite->subpriority = gBattleAnimArgs[2] + 30;
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[0]++;
+ if ((sprite->pos1.y + sprite->pos2.y) > 120)
+ {
+ sprite->pos1.y += -120 + (sprite->pos2.y + sprite->pos1.y);
+ }
+ }
+ sprite->callback = sub_80CB710;
+}
+
+void sub_80CB620(struct Sprite *sprite)
+{
+ s16 p1 = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ s16 p2 = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ s16 e1 = sub_8077ABC(gBattleAnimBankTarget, 2);
+ s16 e2 = sub_8077ABC(gBattleAnimBankTarget, 3);
+
+ e1 -= p1;
+ e2 -= p2;
+ sprite->pos1.x = p1 + e1 * gBattleAnimArgs[0] / 100;
+ sprite->pos1.y = p2 + e2 * gBattleAnimArgs[0] / 100;
+ sprite->pos2.x = gBattleAnimArgs[1];
+ sprite->pos2.y = gBattleAnimArgs[2];
+ sprite->subpriority = gBattleAnimArgs[3] + 30;
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ sprite->data[2] = gBattleAnimArgs[5];
+ sprite->callback = sub_80CB710;
+ gUnknown_03000728[0] = sprite->pos1.x;
+ gUnknown_03000728[1] = sprite->pos1.y;
+ gUnknown_03000728[2] = e1;
+ gUnknown_03000728[3] = e2;
+}
+
+void sub_80CB710(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > (sprite->data[2] - 10))
+ sprite->invisible = sprite->data[0] % 2;
+
+ if (sprite->data[0] > sprite->data[2])
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/scan.c b/src/battle/anim/scan.c
new file mode 100755
index 000000000..5573758c3
--- /dev/null
+++ b/src/battle/anim/scan.c
@@ -0,0 +1,200 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern s8 gUnknown_083D6DDC[4][2];
+
+static void sub_80CD408(struct Sprite* sprite);
+static void sub_80CD4B8(struct Sprite* sprite);
+static void sub_80CD4EC(struct Sprite* sprite);
+static void sub_80CD5A8(struct Sprite* sprite);
+static void sub_80CD654(struct Sprite* sprite);
+static void sub_80CD67C(struct Sprite* sprite);
+
+// scan
+// Used by Lock-On.
+
+void sub_80CD3E0(struct Sprite* sprite)
+{
+ sprite->pos1.x -= 32;
+ sprite->pos1.y -= 32;
+ sprite->data[0] = 20;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD408);
+}
+
+void sub_80CD408(struct Sprite* sprite)
+{
+ switch (sprite->data[5] & 1)
+ {
+ case 0:
+ sprite->data[0] = 1;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD408);
+ break;
+ case 1:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 8;
+ sprite->data[2] = sprite->pos1.x + gUnknown_083D6DDC[sprite->data[5] >> 8][0];
+ sprite->data[4] = sprite->pos1.y + gUnknown_083D6DDC[sprite->data[5] >> 8][1];
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80CD4B8);
+ sprite->data[5] += 0x100;
+ PlaySE12WithPanning(0xD2, sub_8076F98(0x3F));
+ break;
+ }
+
+ sprite->data[5] ^= 1;
+}
+
+void sub_80CD4B8(struct Sprite* sprite)
+{
+ if ((sprite->data[5] >> 8) == 4)
+ {
+ sprite->data[0] = 10;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD4EC);
+ }
+ else
+ {
+ sprite->callback = sub_80CD408;
+ }
+}
+
+void sub_80CD4EC(struct Sprite* sprite)
+{
+ s16 a;
+ s16 b;
+ if (sprite->oam.affineParam == 0)
+ {
+ sprite->data[0] = 3;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD5A8);
+ }
+ else
+ {
+ switch (sprite->oam.affineParam)
+ {
+ case 1:
+ a = -8;
+ b = -8;
+ break;
+ case 2:
+ a = -8;
+ b = 8;
+ break;
+ case 3:
+ a = 8;
+ b = -8;
+ break;
+ default:
+ a = 8;
+ b = 8;
+ break;
+ }
+
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 6;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + a;
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + b;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80CD654);
+ }
+}
+
+void sub_80CD5A8(struct Sprite* sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ if ((sprite->data[1] += 3) > 16)
+ sprite->data[1] = 16;
+ }
+ else if ((sprite->data[1] -= 3) < 0)
+ {
+ sprite->data[1] = 0;
+ }
+
+ BlendPalettes(sub_80791A8(1, 1, 1, 1, 1, 0, 0), sprite->data[1], 0x7FFF);
+ if (sprite->data[1] == 16)
+ {
+ int pal;
+ sprite->data[2]++;
+ pal = sprite->oam.paletteNum;
+ LoadPalette(&gPlttBufferUnfaded[0x108 + pal * 16], pal * 16 | 0x101, 4);
+ PlaySE12WithPanning(0xC0, sub_8076F98(0x3F));
+ }
+ else if (sprite->data[1] == 0)
+ {
+ sprite->callback = sub_80CD654;
+ }
+}
+
+void sub_80CD654(struct Sprite* sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD67C;
+ }
+}
+
+void sub_80CD67C(struct Sprite* sprite)
+{
+ if (sprite->data[0] % 3 == 0)
+ {
+ sprite->data[1]++;
+ sprite->invisible ^= 1;
+ }
+
+ sprite->data[0]++;
+ if (sprite->data[1] == 8)
+ move_anim_8072740(sprite);
+}
+
+void sub_80CD6CC(struct Sprite* sprite)
+{
+ sprite->oam.affineParam = gBattleAnimArgs[0];
+ if ((s16)sprite->oam.affineParam == 1)
+ {
+ sprite->pos1.x -= 0x18;
+ sprite->pos1.y -= 0x18;
+ }
+ else if ((s16)sprite->oam.affineParam == 2)
+ {
+ sprite->pos1.x -= 0x18;
+ sprite->pos1.y += 0x18;
+ sprite->oam.matrixNum = 16;
+ }
+ else if ((s16)sprite->oam.affineParam == 3)
+ {
+ sprite->pos1.x += 0x18;
+ sprite->pos1.y -= 0x18;
+ sprite->oam.matrixNum = 8;
+ }
+ else
+ {
+ sprite->pos1.x += 0x18;
+ sprite->pos1.y += 0x18;
+ sprite->oam.matrixNum = 24;
+ }
+
+ sprite->oam.tileNum = (sprite->oam.tileNum + 16);
+ sprite->callback = sub_80CD3E0;
+ sub_80CD3E0(sprite);
+}
diff --git a/src/battle/anim/scary_face.c b/src/battle/anim/scary_face.c
new file mode 100755
index 000000000..9f1dfd7d0
--- /dev/null
+++ b/src/battle/anim/scary_face.c
@@ -0,0 +1,136 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "decompress.h"
+#include "palette.h"
+
+struct Struct_sub_8078914
+{
+ u8 *field_0;
+ u8 *field_4;
+ u8 field_8;
+};
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceContest;
+extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFacePlayer;
+extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceOpponent;
+extern struct INCBIN_U8 gBattleAnimBackgroundImage_ScaryFace;
+extern struct INCBIN_U8 gBattleAnimBackgroundPalette_ScaryFace;
+
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_030042C0;
+
+static void sub_80D24E0(u8 taskId);
+
+// scary_face (darkens the screen and shows a scary face.)
+// Used in Glare and Scary Face.
+
+void sub_80D23B4(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+ u8* tempvar;
+ REG_BLDCNT = 0x3F42;
+ REG_BLDALPHA = 0x1000;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG1CNT_BITFIELD.screenSize = 0;
+ if (!NotInBattle())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ sub_8078914(&subStruct);
+ tempvar = subStruct.field_4;
+ DmaFill32(3, 0x0, tempvar, 0x1000);
+ if (NotInBattle())
+ LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFaceContest, subStruct.field_4);
+ else if (GetBankSide(gBattleAnimBankTarget) == 1)
+ LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFacePlayer, subStruct.field_4);
+ else
+ LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFaceOpponent, subStruct.field_4);
+
+ LZDecompressVram(&gBattleAnimBackgroundImage_ScaryFace, subStruct.field_0);
+ LoadCompressedPalette(&gBattleAnimBackgroundPalette_ScaryFace, subStruct.field_8 << 4, 32);
+ if (NotInBattle())
+ sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
+
+ gTasks[taskId].func = sub_80D24E0;
+}
+
+void sub_80D24E0(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 2)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]++;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 14)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 0x15)
+ {
+ gTasks[taskId].data[11] = 14;
+ gTasks[taskId].data[12]++;
+ }
+ break;
+ case 2:
+ if (++gTasks[taskId].data[10] == 2)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]--;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_8078914(&subStruct);
+ {
+ u8 *addr = subStruct.field_0;
+ u32 size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ }
+ DmaClear32(3, subStruct.field_4, 0x800);
+ if (!NotInBattle())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 0;
+
+ gTasks[taskId].data[12]++;
+ // fall through
+ case 4:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c
new file mode 100755
index 000000000..bd072849a
--- /dev/null
+++ b/src/battle/anim/seed.c
@@ -0,0 +1,50 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CAB88(struct Sprite* sprite);
+static void sub_80CABC0(struct Sprite* sprite);
+
+// seed (sprouts a sapling from a seed.)
+// Used by Leech Seed.
+
+void sub_80CAB18(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ if (GetBankSide(gBattleAnimBankAttacker))
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 0) + gBattleAnimArgs[2];
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 1) + gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[5];
+ sub_80786EC(sprite);
+ sprite->callback = sub_80CAB88;
+}
+
+void sub_80CAB88(struct Sprite* sprite)
+{
+ if (sub_8078718(sprite))
+ {
+ sprite->invisible = 1;
+ sprite->data[0] = 10;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CABC0);
+ }
+}
+
+void sub_80CABC0(struct Sprite* sprite)
+{
+ sprite->invisible = 0;
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 60;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
diff --git a/src/battle/anim/shadow_enlarge.c b/src/battle/anim/shadow_enlarge.c
new file mode 100755
index 000000000..bed6c7ea3
--- /dev/null
+++ b/src/battle/anim/shadow_enlarge.c
@@ -0,0 +1,35 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D0428(u8 taskId);
+
+// shadow_enlarge (the magnifying-like shadow over the Pokemon effect)
+// Used in Disable.
+
+void sub_80D03C4(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ sub_8078E70(spriteId, 1);
+ obj_id_set_rotscale(spriteId, 0xD0, 0xD0, 0);
+ sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 0);
+ gTasks[taskId].data[0] = 0x50;
+ gTasks[taskId].func = sub_80D0428;
+}
+
+void sub_80D0428(u8 taskId)
+{
+ if (--gTasks[taskId].data[0] == -1)
+ {
+ u8 spriteId = GetAnimBankSpriteId(1);
+ sub_8078F40(spriteId);
+ sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/shadow_minimize.c b/src/battle/anim/shadow_minimize.c
new file mode 100755
index 000000000..22ebeab7a
--- /dev/null
+++ b/src/battle/anim/shadow_minimize.c
@@ -0,0 +1,262 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D04E0(u8 taskId);
+void sub_80D0614(struct Task* task, u8 taskId);
+void sub_80D0704(struct Sprite* sprite);
+
+// shadow_minimize (the minimizing-like shadow over the Pokemon effect.)
+// Used in Minimize.
+
+void sub_80D0488(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ sub_8078E70(spriteId, 0);
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0x100;
+ task->data[5] = 0;
+ task->data[6] = 0;
+ task->data[7] = sub_8079E90(gBattleAnimBankAttacker);
+ task->func = sub_80D04E0;
+}
+
+void sub_80D04E0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[1])
+ {
+ case 0:
+ if (task->data[2] == 0 || task->data[2] == 3 || task->data[2] == 6)
+ sub_80D0614(task, taskId);
+ task->data[2]++;
+ task->data[4] += 0x28;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ if (task->data[2] == 32)
+ {
+ task->data[5]++;
+ task->data[1]++;
+ }
+ break;
+ case 1:
+ if (task->data[6] == 0)
+ {
+ if (task->data[5] == 3)
+ {
+ task->data[2] = 0;
+ task->data[1] = 3;
+ }
+ else
+ {
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0x100;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ task->data[1] = 2;
+ }
+ }
+ break;
+ case 2:
+ task->data[1] = 0;
+ break;
+ case 3:
+ if (++task->data[2] > 32)
+ {
+ task->data[2] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 4:
+ task->data[2] += 2;
+ task->data[4] -= 0x50;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ if (task->data[2] == 32)
+ {
+ task->data[2] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 5:
+ sub_8078F40(task->data[0]);
+ gSprites[task->data[15]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80D0614(struct Task* task, u8 taskId)
+{
+ s16 r8 = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
+ if (r8 >= 0)
+ {
+ u8 r6 = AllocOamMatrix();
+ if (r6 == 0xFF)
+ {
+ obj_delete_but_dont_free_vram(&gSprites[r8]);
+ }
+ else
+ {
+ gSprites[r8].oam.objMode = 1;
+ gSprites[r8].oam.affineMode = 3;
+ gSprites[r8].affineAnimPaused = 1;
+ gSprites[r8].oam.matrixNum = r6;
+ gSprites[r8].subpriority = task->data[7] - task->data[3];
+ task->data[3]++;
+ task->data[6]++;
+ gSprites[r8].data[0] = 16;
+ gSprites[r8].data[1] = taskId;
+ gSprites[r8].data[2] = 6;
+ gSprites[r8].callback = sub_80D0704;
+ obj_id_set_rotscale(r8, task->data[4], task->data[4], 0);
+ gSprites[r8].oam.affineMode = 1;
+ CalcCenterToCornerVec(&gSprites[r8], gSprites[r8].oam.shape, gSprites[r8].oam.size, gSprites[r8].oam.affineMode);
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80D0614(struct Task* task, u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ adds r7, r0, 0 @r7 is task\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r9, r1 @r9 is taskId\n\
+ movs r0, 0\n\
+ bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
+ lsls r0, 16\n\
+ asrs r4, r0, 16\n\
+ cmp r4, 0\n\
+ blt _080D06EE @jump to bottom\n\
+ bl AllocOamMatrix\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r6, 0xFF\n\
+ bne _080D0658\n\
+ lsls r0, r4, 4\n\
+ adds r0, r4\n\
+ lsls r0, 2\n\
+ ldr r1, _080D0654 @ =gSprites\n\
+ adds r0, r1\n\
+ bl obj_delete_but_dont_free_vram\n\
+ b _080D06EE @ jump to bottom\n\
+ .align 2, 0\n\
+_080D0654: .4byte gSprites\n\
+_080D0658:\n\
+ ldr r5, _080D06FC @ =gSprites\n\
+ lsls r3, r4, 4\n\
+ adds r3, r4\n\
+ lsls r3, 2\n\
+ adds r4, r3, r5\n\
+ ldrb r1, [r4, 0x1]\n\
+ movs r0, 0xD\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ movs r1, 0x3\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x1]\n\
+ adds r2, r4, 0\n\
+ adds r2, 0x2C\n\
+ ldrb r0, [r2]\n\
+ movs r1, 0x80\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ movs r0, 0x1F\n\
+ ands r6, r0\n\
+ lsls r2, r6, 1\n\
+ ldrb r1, [r4, 0x3]\n\
+ movs r0, 0x3F\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ orrs r0, r2\n\
+ strb r0, [r4, 0x3]\n\
+ ldrb r0, [r7, 0x16]\n\
+ ldrb r1, [r7, 0xE]\n\
+ subs r0, r1\n\
+ adds r1, r4, 0\n\
+ adds r1, 0x43\n\
+ strb r0, [r1]\n\
+ ldrh r0, [r7, 0xE]\n\
+ adds r0, 0x1\n\
+ strh r0, [r7, 0xE]\n\
+ ldrh r0, [r7, 0x14]\n\
+ adds r0, 0x1\n\
+ strh r0, [r7, 0x14]\n\
+ movs r0, 0x10\n\
+ strh r0, [r4, 0x2E]\n\
+ mov r0, r9\n\
+ strh r0, [r4, 0x30]\n\
+ movs r0, 0x6\n\
+ strh r0, [r4, 0x32]\n\
+ adds r5, 0x1C\n\
+ adds r3, r5\n\
+ ldr r0, _080D0700 @ =sub_80D0704\n\
+ str r0, [r3]\n\
+ mov r1, r8 @duplicate_obj_of_side_rel2move_in_transparent_mode(0)\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ movs r1, 0x10\n\
+ ldrsh r2, [r7, r1]\n\
+ adds r1, r2, 0\n\
+ movs r3, 0\n\
+ bl obj_id_set_rotscale\n\
+ ldrb r0, [r4, 0x1]\n\
+ movs r3, 0x4\n\
+ negs r3, r3\n\
+ ands r3, r0\n\
+ movs r0, 0x1\n\
+ orrs r3, r0\n\
+ strb r3, [r4, 0x1]\n\
+ lsrs r1, r3, 6\n\
+ ldrb r2, [r4, 0x3]\n\
+ lsrs r2, 6\n\
+ lsls r3, 30\n\
+ lsrs r3, 30\n\
+ adds r0, r4, 0\n\
+ bl CalcCenterToCornerVec\n\
+_080D06EE:\n\
+ pop {r3,r4}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080D06FC: .4byte gSprites\n\
+_080D0700: .4byte sub_80D0704\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80D0704(struct Sprite* sprite)
+{
+ if (--sprite->data[0] == 0)
+ {
+ gTasks[sprite->data[1]].data[sprite->data[2]]--;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ obj_delete_but_dont_free_vram(sprite);
+ }
+}
diff --git a/src/battle/anim/shield.c b/src/battle/anim/shield.c
new file mode 100755
index 000000000..8ed4f9796
--- /dev/null
+++ b/src/battle/anim/shield.c
@@ -0,0 +1,81 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CCE0C(struct Sprite* sprite);
+
+// shield
+// Used by Protect.
+
+void sub_80CCD24(struct Sprite* sprite)
+{
+ if (NotInBattle() != 0)
+ {
+ gBattleAnimArgs[1] += 8;
+ }
+
+ sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[1];
+ if (GetBankSide(gBattleAnimBankAttacker) == 0 || NotInBattle())
+ sprite->oam.priority = sub_8079ED4(gBattleAnimBankAttacker) + 1;
+ else
+ sprite->oam.priority = sub_8079ED4(gBattleAnimBankAttacker);
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = (IndexOfSpritePaletteTag(0x2828) << 4) + 0x100;
+ sprite->data[7] = 16;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);
+ sprite->callback = sub_80CCE0C;
+}
+
+void sub_80CCE0C(struct Sprite* sprite)
+{
+ int a;
+ int i;
+ sprite->data[5] += 0x60;
+ sprite->pos2.x = -(sprite->data[5] >> 8);
+ sprite->data[1]++;
+ if (sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ a = gPlttBufferFaded[sprite->data[2] + 1];
+ i = 0;
+ do
+ {
+ gPlttBufferFaded[sprite->data[2] + ++i] = gPlttBufferFaded[sprite->data[2] + i + 1];
+ } while ( i <= 5 );
+
+ gPlttBufferFaded[sprite->data[2] + 7] = a;
+ }
+
+ if (sprite->data[7] > 6 && sprite->data[0] >0 && ++sprite->data[6] > 1)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] -= 1;
+ REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);;
+ }
+
+ if (sprite->data[0] >0)
+ {
+ sprite->data[0] -= 1;
+ }
+ else if (++sprite->data[6] > 1)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7]++;
+ REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);
+ if (sprite->data[7] == 16)
+ {
+ sprite->invisible = 1;
+ sprite->callback = sub_807861C;
+ }
+ }
+}
diff --git a/src/battle/anim/shimmer.c b/src/battle/anim/shimmer.c
new file mode 100755
index 000000000..ecb3dcdf9
--- /dev/null
+++ b/src/battle/anim/shimmer.c
@@ -0,0 +1,48 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "blend_palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u16 gUnknown_083D6984[];
+
+// shimmer
+// Used by Magical Leaf.
+
+void sub_80CC5F8(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[8] = IndexOfSpritePaletteTag(0x274f) * 16 + 256;
+ task->data[12] = IndexOfSpritePaletteTag(0x27b0) * 16 + 256;
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[9]++;
+ if (task->data[9] >= 0)
+ {
+ task->data[9] = 0;
+ BlendPalette(task->data[8], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]);
+ BlendPalette(task->data[12], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]);
+ task->data[10]++;
+ if (task->data[10] == 17)
+ {
+ task->data[10] = 0;
+ task->data[11]++;
+ if (task->data[11] == 7)
+ task->data[11] = 0;
+ }
+ }
+ break;
+ }
+
+ if (gBattleAnimArgs[7] == -1)
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/silhouette.c b/src/battle/anim/silhouette.c
new file mode 100755
index 000000000..71ff3dae2
--- /dev/null
+++ b/src/battle/anim/silhouette.c
@@ -0,0 +1,77 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CB3A8(u8 taskId);
+static void sub_80CB438(u8 taskId);
+
+// silhouette (the transparent shadow image used for mimic.)
+// Only used by Mimic.
+
+void sub_80CB340(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ if (gSprites[spriteId].invisible)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ sub_8078E70(spriteId, 1);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[11] = 256;
+ gTasks[taskId].func = sub_80CB3A8;
+ }
+}
+
+void sub_80CB3A8(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ gTasks[taskId].data[10] += gTasks[taskId].data[0];
+ gSprites[spriteId].pos2.x = gTasks[taskId].data[10] >> 8;
+ if (GetBankSide(gBattleAnimBankTarget))
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ }
+
+ gTasks[taskId].data[11] += 16;
+ obj_id_set_rotscale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0);
+ sub_8079A64(spriteId);
+ gTasks[taskId].data[1]--;
+ if (!gTasks[taskId].data[1])
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80CB438;
+ }
+}
+
+void sub_80CB438(u8 taskId)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ u8 spriteId = GetAnimBankSpriteId(1);
+ sub_8078F40(spriteId);
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ gTasks[taskId].data[0]++;
+ return;
+ }
+ }
+ else
+ {
+ if (gTasks[taskId].data[0] == 0)
+ return;
+ }
+
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] == 3)
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/slash.c b/src/battle/anim/slash.c
new file mode 100755
index 000000000..c5869c4ab
--- /dev/null
+++ b/src/battle/anim/slash.c
@@ -0,0 +1,83 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CDE78(struct Sprite* sprite);
+static void sub_80CDEB0(struct Sprite* sprite);
+static void sub_80CDEC0(struct Sprite* sprite);
+
+// slash (a cutting animation)
+// Used in Slash and False Swipe.
+
+void sub_80CDD74(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ }
+ else
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CDEC0);
+ sprite->callback = sub_8078600;
+}
+
+void sub_80CDDDC(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + 0xFFD0;
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3);
+ StoreSpriteCallbackInData(sprite, sub_80CDE78);
+ sprite->callback = sub_8078600;
+}
+
+void sub_80CDE24(struct Sprite* sprite)
+{
+ sprite->pos1.x = sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + 0xFFD0 + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3);
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = sub_80CDEC0;
+}
+
+void sub_80CDE78(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 8)
+ {
+ sprite->data[0] = 12;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CDEB0);
+ sprite->callback = sub_8078364;
+ }
+}
+
+void sub_80CDEB0(struct Sprite* sprite)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = sub_80CDEC0;
+}
+
+void sub_80CDEC0(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible = !sprite->invisible;
+ if (++sprite->data[1] > 8)
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/sleep.c b/src/battle/anim/sleep.c
new file mode 100755
index 000000000..58ecc702f
--- /dev/null
+++ b/src/battle/anim/sleep.c
@@ -0,0 +1,44 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CD394(struct Sprite* sprite);
+
+// sleep (the "ZZZ" graphical effect)
+// Used by Rest and the sleep turn when the Pokemon is still asleep.
+
+void sub_80CD328(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[3] = 0xFFFF;
+ StartSpriteAffineAnim(sprite, 1);
+ }
+
+ sprite->callback = sub_80CD394;
+}
+
+void sub_80CD394(struct Sprite* sprite)
+{
+ sprite->pos2.y = -(sprite->data[0] / 0x28);
+ sprite->pos2.x = sprite->data[4] / 10;
+ sprite->data[4] += sprite->data[3] * 2;
+ sprite->data[0] += sprite->data[1];
+ if (++sprite->data[1] > 0x3C)
+ move_anim_8074EE0(sprite);
+}
diff --git a/src/battle/anim/slice.c b/src/battle/anim/slice.c
new file mode 100755
index 000000000..8e33dcb06
--- /dev/null
+++ b/src/battle/anim/slice.c
@@ -0,0 +1,111 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CCB00(struct Sprite* sprite);
+
+// slice (the cutting animation showing as a yellow line drawn diagonally)
+// Used in Cut, Fury Cutter, Aerial Ace, and Air Cutter.
+
+void sub_80CC914(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 1);
+ if (GetBankSide(gBattleAnimBankTarget) == 0)
+ sprite->pos1.y += 8;
+
+ sprite->callback = sub_80CCB00;
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->hFlip = 1;
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] -= 0x400;
+ sprite->data[2] += 0x400;
+ sprite->data[5] = gBattleAnimArgs[2];
+ if (sprite->data[5] == 1)
+ sprite->data[1] = -sprite->data[1];
+}
+
+void sub_80CC9BC(struct Sprite* sprite)
+{
+ u8 a;
+ u8 b;
+ switch (gBattleAnimArgs[3])
+ {
+ case 1:
+ a = sub_8077ABC(gBattleAnimBankTarget ^ 2, 0);
+ b = sub_8077ABC(gBattleAnimBankTarget ^ 2, 1);
+ break;
+ case 2:
+ a = sub_8077ABC(gBattleAnimBankTarget, 0);
+ b = sub_8077ABC(gBattleAnimBankTarget, 1);
+ if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2))
+ {
+ a = (sub_8077ABC(gBattleAnimBankTarget ^ 2, 0) + a) / 2;
+ b = (sub_8077ABC(gBattleAnimBankTarget ^ 2, 1) + b) / 2;
+ }
+ break;
+ case 0:
+ default:
+ a = sub_8077ABC(gBattleAnimBankTarget, 0);
+ b = sub_8077ABC(gBattleAnimBankTarget, 1);
+ break;
+ }
+
+ sprite->pos1.x = a;
+ sprite->pos1.y = b;
+ if (GetBankSide(gBattleAnimBankTarget) == 0)
+ sprite->pos1.y += 8;
+
+ sprite->callback = sub_80CCB00;
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->hFlip = 1;
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] -= 0x400;
+ sprite->data[2] += 0x400;
+ sprite->data[5] = gBattleAnimArgs[2];
+ if (sprite->data[5] == 1)
+ sprite->data[1] = -sprite->data[1];
+}
+
+void sub_80CCB00(struct Sprite* sprite)
+{
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ if (sprite->data[5] == 0)
+ sprite->data[1] += 0x18;
+ else
+ sprite->data[1] -= 0x18;
+
+ sprite->data[2] -= 0x18;
+ sprite->pos2.x = sprite->data[3] >> 8;
+ sprite->pos2.y = sprite->data[4] >> 8;
+ sprite->data[0]++;
+ if (sprite->data[0] == 20)
+ {
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ sprite->data[0] = 3;
+ sprite->callback = sub_80782D8;
+ }
+}
diff --git a/src/battle/anim/smoke.c b/src/battle/anim/smoke.c
new file mode 100755
index 000000000..c6ce91b76
--- /dev/null
+++ b/src/battle/anim/smoke.c
@@ -0,0 +1,22 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// smoke (smoke on the ground around a sprite.)
+// Used in Extremespeed.
+
+void sub_80D1A70(struct Sprite* sprite)
+{
+ sprite->invisible = gTasks[sprite->data[0]].data[5];
+ if (sprite->animEnded)
+ {
+ gTasks[sprite->data[0]].data[sprite->data[1]]--;
+ DestroySprite(sprite);
+ }
+}
diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c
new file mode 100755
index 000000000..684516ba7
--- /dev/null
+++ b/src/battle/anim/sonic.c
@@ -0,0 +1,136 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "battle_anim_80CA710.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// sonic (shoots a projectile towards the target.)
+// Used in Sonic Boom and Air Cutter.
+
+void sub_80CF6DC(struct Sprite* sprite)
+{
+ s16 a;
+ s16 b;
+ u16 c;
+
+ if (NotInBattle())
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ else if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ sub_80787B0(sprite, 1);
+ a = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2];
+ b = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3];
+ c = sub_80790F0(a - sprite->pos1.x, b - sprite->pos1.y);
+ c += 0xF000;
+ if (NotInBattle())
+ c -= 0x6000;
+
+ sub_8078FDC(sprite, 0, 0x100, 0x100, c);
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = a;
+ sprite->data[4] = b;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
+
+void sub_80CF7E0(struct Sprite* sprite)
+{
+ if (sprite->data[0]-- <= 0)
+ {
+ gTasks[sprite->data[7]].data[1]--;
+ DestroySprite(sprite);
+ }
+}
+
+void sub_80CF814(struct Sprite* sprite)
+{
+ struct Task* task = &gTasks[sprite->data[7]];
+ if (sprite->data[0] > task->data[5])
+ {
+ sprite->data[5] += sprite->data[3];
+ sprite->data[6] += sprite->data[4];
+ }
+ else
+ {
+ sprite->data[5] -= sprite->data[3];
+ sprite->data[6] -= sprite->data[4];
+ }
+
+ sprite->data[1] += sprite->data[5];
+ sprite->data[2] += sprite->data[6];
+ if (1 & task->data[7])
+ sprite->pos2.x = ((u16)sprite->data[1] >> 8) * -1;
+ else
+ sprite->pos2.x = (u16)sprite->data[1] >> 8;
+
+ if (1 & task->data[8])
+ sprite->pos2.y = ((u16)sprite->data[2] / 256u) * -1;
+ else
+ sprite->pos2.y = (u16)sprite->data[2] / 256u;
+
+ if (sprite->data[0]-- <= 0)
+ {
+ sprite->data[0] = 30;
+ sprite->callback = sub_80CF7E0;
+ }
+}
+
+void sub_80CF8B8(struct Sprite* sprite)
+{
+ s16 a;
+ s16 b;
+ s16 c;
+
+ struct Task* task = &gTasks[sprite->data[7]];
+ sprite->data[1] += (-2 & task->data[7]);
+ sprite->data[2] += (-2 & task->data[8]);
+ if (1 & task->data[7])
+ sprite->pos2.x = ((u16)sprite->data[1] >> 8) * -1;
+ else
+ sprite->pos2.x = (u16)sprite->data[1] >> 8;
+
+ if (1 & task->data[8])
+ sprite->pos2.y = ((u16)sprite->data[2] / 256u) * -1;
+ else
+ sprite->pos2.y = (u16)sprite->data[2] / 256u;
+
+ if (sprite->data[0]-- <= 0)
+ {
+ sprite->data[0] = 8;
+ task->data[5] = 4;
+ a = sub_81174E0(0x1000);
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ if (task->data[11] >= sprite->pos1.x)
+ b = (task->data[11] - sprite->pos1.x) << 8;
+ else
+ b = (sprite->pos1.x - task->data[11]) << 8;
+
+ if (task->data[12] >= sprite->pos1.y)
+ c = (task->data[12] - sprite->pos1.y) << 8;
+ else
+ c = (sprite->pos1.y - task->data[12]) << 8;
+
+ sprite->data[2] = 0;
+ sprite->data[1] = 0;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[3] = sub_81174C4(sub_81174C4(b, a), sub_81174E0(0x1C0));
+ sprite->data[4] = sub_81174C4(sub_81174C4(c, a), sub_81174E0(0x1C0));
+ sprite->callback = sub_80CF814;
+ }
+}
diff --git a/src/battle/anim/sonic_task.c b/src/battle/anim/sonic_task.c
new file mode 100755
index 000000000..efd13dff6
--- /dev/null
+++ b/src/battle/anim/sonic_task.c
@@ -0,0 +1,152 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "battle_anim_80CA710.h"
+#include "battle.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gBanksBySide[];
+extern u16 gBattleTypeFlags;
+extern struct SpriteTemplate gSpriteTemplate_83D74BC;
+
+// sonic_task (the task functions for the "sonic" effect.)
+// Used in Air Cutter and Sonic Boom.
+
+void sub_80CF9F8(u8 taskId)
+{
+ if (gTasks[taskId].data[1] == 0)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80CFA20(u8 taskId)
+{
+ if (gTasks[taskId].data[0]-- <= 0)
+ {
+ u8 spriteId;
+ struct Sprite* sprite;
+ spriteId = CreateSprite(&gSpriteTemplate_83D74BC, gTasks[taskId].data[9], gTasks[taskId].data[10], gTasks[taskId].data[2] - gTasks[taskId].data[1]);
+ sprite = &gSprites[spriteId];
+ switch (gTasks[taskId].data[4])
+ {
+ case 1:
+ sprite->oam.matrixNum |= 24;
+ break;
+ case 2:
+ sprite->oam.matrixNum = 8;
+ break;
+ }
+
+ sprite->data[0] = gTasks[taskId].data[5] - gTasks[taskId].data[6];
+ sprite->data[7] = taskId;
+ gTasks[taskId].data[gTasks[taskId].data[1] + 13] = spriteId;
+ gTasks[taskId].data[0] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]++;
+ PlaySE12WithPanning(0x9A, sub_8076F98(-0x3F));
+ if (gTasks[taskId].data[1] > 2)
+ gTasks[taskId].func = sub_80CF9F8;
+ }
+}
+
+void sub_80CFB04(u8 taskId)
+{
+ s16 r9 = 0;
+ s16 r6 = 0;
+ s16 sp1 = 0;
+ s16 sp2 = 0;
+ s16 r4;
+
+ if (NotInBattle())
+ {
+ gTasks[taskId].data[4] = 2;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ else
+ {
+ if ((gBanksBySide[gBattleAnimBankTarget] & 1) == 0)
+ {
+ gTasks[taskId].data[4] = 1;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ }
+ r6 = gTasks[taskId].data[9] = sub_8077ABC(gBattleAnimBankAttacker, 0);
+ r9 = gTasks[taskId].data[10] = sub_8077ABC(gBattleAnimBankAttacker, 1);
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ && IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2))
+ {
+ sub_807A3FC(gBattleAnimBankTarget, 0, &sp1, &sp2);
+ }
+ else
+ {
+ sp1 = sub_8077ABC(gBattleAnimBankTarget, 0);
+ sp2 = sub_8077ABC(gBattleAnimBankTarget, 1);
+ }
+
+ sp1 = gTasks[taskId].data[11] = sp1 + gBattleAnimArgs[0];
+ sp2 = gTasks[taskId].data[12] = sp2 + gBattleAnimArgs[1];
+ if (sp1 >= r6)
+ r4 = sp1 - r6;
+ else
+ r4 = r6 - sp1;
+
+ gTasks[taskId].data[5] = sub_81174C4(r4, sub_81174E0(gBattleAnimArgs[2] & ~1));
+ gTasks[taskId].data[6] = sub_81174C4(gTasks[taskId].data[5], 0x80);
+ gTasks[taskId].data[7] = gBattleAnimArgs[2];
+ if (sp2 >= r9)
+ {
+ r4 = sp2 - r9;
+ gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) & ~1;
+ }
+ else
+ {
+ r4 = r9 - sp2;
+ gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) | 1;
+ }
+
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ if (gBattleAnimArgs[4] & 0x80)
+ {
+ gBattleAnimArgs[4] ^= 0x80;
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = sub_8079E90(gBattleAnimBankTarget) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = sub_8079E90(gBattleAnimBankTarget) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = sub_8079E90(gBattleAnimBankTarget) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = sub_8079E90(gBattleAnimBankTarget) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+
+ if (gTasks[taskId].data[2] < 3)
+ gTasks[taskId].data[2] = 3;
+
+ gTasks[taskId].func = sub_80CFA20;
+}
diff --git a/src/battle/anim/spin_finger.c b/src/battle/anim/spin_finger.c
new file mode 100755
index 000000000..adf41b261
--- /dev/null
+++ b/src/battle/anim/spin_finger.c
@@ -0,0 +1,73 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern void sub_80CF088(struct Sprite* sprite);
+static void sub_80CF138(struct Sprite* sprite);
+static void sub_80CF158(struct Sprite* sprite);
+
+// spin_finger
+// Used in Follow Me.
+
+void sub_80CF0BC(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ sprite->pos1.x = sub_8077ABC(bank, 0);
+ sprite->pos1.y = sub_807A100(bank, 2);
+ if (sprite->pos1.y <= 9)
+ sprite->pos1.y = 10;
+
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
+ sprite->data[2] = sprite->subpriority;
+ sprite->data[3] = sprite->subpriority + 4;
+ sprite->data[4] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CF138);
+ sprite->callback = sub_80785E4;
+}
+
+void sub_80CF138(struct Sprite* sprite)
+{
+ if (++sprite->data[4] > 12)
+ sprite->callback = sub_80CF158;
+}
+
+void sub_80CF158(struct Sprite* sprite)
+{
+ s16 temp;
+ s16 temp2;
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 0xFE)
+ {
+ if (--sprite->data[0] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->callback = sub_80CF088;
+ return;
+ }
+ else
+ {
+ sprite->data[1] &= 0xFF;
+ }
+ }
+
+ if (sprite->data[1] > 0x4F)
+ sprite->subpriority = sprite->data[3];
+
+ if (sprite->data[1] > 0x9F)
+ sprite->subpriority = sprite->data[2];
+
+ temp = gSineTable[sprite->data[1]];
+ sprite->pos2.x = (temp2 = temp >> 3) + (temp2 >> 1);
+}
diff --git a/src/battle/anim/spit.c b/src/battle/anim/spit.c
new file mode 100755
index 000000000..f9ad462ae
--- /dev/null
+++ b/src/battle/anim/spit.c
@@ -0,0 +1,30 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// spit (hurls sprites outward from the pokemon. Similar to orbit_fast, but takes another argument.)
+// Used in Spit Up.
+
+void sub_80D287C(struct Sprite* sprite)
+{
+ sprite->pos2.x += sprite->data[0];
+ sprite->pos2.y += sprite->data[1];
+ if (sprite->data[3]++ >= sprite->data[2])
+ move_anim_8072740(sprite);
+}
+
+void sub_80D28AC(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
+ sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->callback = sub_80D287C;
+}
diff --git a/src/battle/anim/splash.c b/src/battle/anim/splash.c
new file mode 100755
index 000000000..1b0ceba93
--- /dev/null
+++ b/src/battle/anim/splash.c
@@ -0,0 +1,87 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D76F4;
+
+static void sub_80D07AC(u8 taskId);
+
+// splash (splash effect of hopping up and down)
+// Used in Splash, Mud Sport, and Sketch.
+
+void sub_80D074C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (gBattleAnimArgs[1] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ task->data[2] = gBattleAnimArgs[1];
+ task->data[3] = 0;
+ task->data[4] = 0;
+ sub_80798F4(task, spriteId, &gUnknown_083D76F4);
+ task->func = sub_80D07AC;
+ }
+}
+
+void sub_80D07AC(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[1])
+ {
+ case 0:
+ sub_807992C(task);
+ task->data[4] += 3;
+ gSprites[task->data[0]].pos2.y += task->data[4];
+ if (++task->data[3] > 7)
+ {
+ task->data[3] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 1:
+ sub_807992C(task);
+ gSprites[task->data[0]].pos2.y += task->data[4];
+ if (++task->data[3] > 7)
+ {
+ task->data[3] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 2:
+ if (task->data[4] != 0)
+ {
+ gSprites[task->data[0]].pos2.y -= 2;
+ task->data[4] -= 2;
+ }
+ else
+ task->data[1]++;
+ break;
+ case 3:
+ if (!sub_807992C(task))
+ {
+ if (--task->data[2] == 0)
+ {
+ gSprites[task->data[0]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ sub_80798F4(task, task->data[0], &gUnknown_083D76F4);
+ task->data[1] = 0;
+ }
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/startle.c b/src/battle/anim/startle.c
new file mode 100755
index 000000000..acbf80fec
--- /dev/null
+++ b/src/battle/anim/startle.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D7A98;
+
+// startle (the pokemon sprite shrivels upward and restores after a brief time.)
+// Used in Fake Out, Trick, and Astonish.
+
+// opponent
+void sub_80D1E38(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ if (++gTasks[taskId].data[0] == 1)
+ {
+ sub_80798F4(&gTasks[taskId], GetAnimBankSpriteId(1), &gUnknown_083D7A98);
+ gSprites[spriteId].pos2.x = 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ if (sub_807992C(&gTasks[taskId]) == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+// player
+void sub_80D1EC8(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(0);
+ if (++gTasks[taskId].data[0] == 1)
+ {
+ sub_80798F4(&gTasks[taskId], GetAnimBankSpriteId(0), &gUnknown_083D7A98);
+ gSprites[spriteId].pos2.x = 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ if (sub_807992C(&gTasks[taskId]) == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
diff --git a/src/battle/anim/strike.c b/src/battle/anim/strike.c
new file mode 100755
index 000000000..f2fbdb5a4
--- /dev/null
+++ b/src/battle/anim/strike.c
@@ -0,0 +1,77 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CE798(struct Sprite* sprite);
+
+// strike (A red strike towards the opponent.)
+// Used in Horn Attack, Fury Attack, and Horn Drill.
+
+void sub_80CE670(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[2] <= 1)
+ gBattleAnimArgs[2] = 2;
+
+ if (gBattleAnimArgs[2] > 0x7F)
+ gBattleAnimArgs[2] = 0x7F;
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[1];
+ sprite->data[6] = sprite->pos1.x;
+ sprite->data[7] = sprite->pos1.y;
+ if (NotInBattle() != 0)
+ {
+ sprite->oam.matrixNum = 8;
+ sprite->pos1.x += 40;
+ sprite->pos1.y += 20;
+ sprite->data[2] = sprite->pos1.x << 7;
+ sprite->data[3] = -0x1400 / sprite->data[1];
+ sprite->data[4] = sprite->pos1.y << 7;
+ sprite->data[5] = -0xA00 / sprite->data[1];
+ }
+ else if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ {
+ sprite->pos1.x -= 40;
+ sprite->pos1.y += 20;
+ sprite->data[2] = sprite->pos1.x << 7;
+ sprite->data[3] = 0x1400 / sprite->data[1];
+ sprite->data[4] = sprite->pos1.y << 7;
+ sprite->data[5] = -0xA00 / sprite->data[1];
+ }
+ else
+ {
+ sprite->pos1.x += 40;
+ sprite->pos1.y -= 20;
+ sprite->data[2] = sprite->pos1.x << 7;
+ sprite->data[3] = -0x1400 / sprite->data[1];
+ sprite->data[4] = sprite->pos1.y << 7;
+ sprite->data[5] = 0xA00 / sprite->data[1];
+ sprite->oam.matrixNum = 24;
+ }
+
+ sprite->callback = sub_80CE798;
+}
+
+void sub_80CE798(struct Sprite* sprite)
+{
+ sprite->data[2] += sprite->data[3];
+ sprite->data[4] += sprite->data[5];
+ sprite->pos1.x = sprite->data[2] >> 7;
+ sprite->pos1.y = sprite->data[4] >> 7;
+ if (--sprite->data[1] == 1)
+ {
+ sprite->pos1.x = sprite->data[6];
+ sprite->pos1.y = sprite->data[7];
+ }
+
+ if (sprite->data[1] == 0)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/switch.c b/src/battle/anim/switch.c
new file mode 100755
index 000000000..a1be144df
--- /dev/null
+++ b/src/battle/anim/switch.c
@@ -0,0 +1,128 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern s8 gUnknown_083D680C[11][3];
+
+static void sub_80CBC8C(struct Sprite* sprite);
+static void sub_80CBCF8(struct Sprite* sprite);
+static void sub_80CBDB0(struct Sprite* sprite);
+
+// switch (makes an item and circles it from side to side on the field.)
+// Used in Trick.
+
+void sub_80CBBF0(struct Sprite* sprite)
+{
+ int a;
+ int b;
+
+ if (sprite->data[0] == 0)
+ {
+ if (!NotInBattle())
+ {
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->pos1.x = 0x78;
+ }
+ else
+ {
+ a = gBattleAnimArgs[1] - 32;
+ if (a < 0)
+ b = gBattleAnimArgs[1] + 0xDF;
+ else
+ b = a;
+
+ sprite->data[1] = a - ((b >> 8) << 8);
+ sprite->pos1.x = 0x46;
+ }
+
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[0];
+ sprite->data[4] = 20;
+ sprite->pos2.x = Cos(sprite->data[1], 0x3C);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ sprite->callback = sub_80CBC8C;
+ if (sprite->data[1] > 0 && sprite->data[1] < 0xC0)
+ sprite->subpriority = 31;
+ else
+ sprite->subpriority = 29;
+ }
+}
+
+void sub_80CBC8C(struct Sprite* sprite)
+{
+ switch (sprite->data[3])
+ {
+ case 0:
+ if (sprite->data[2] > 0x4E)
+ {
+ sprite->data[3] = 1;
+ StartSpriteAffineAnim(sprite, 1);
+ break;
+ }
+ else
+ {
+ sprite->data[2] += sprite->data[4] / 10;
+ sprite->data[4] += 3;
+ sprite->pos1.y = sprite->data[2];
+ break;
+ }
+ break;
+ case 1:
+ if (sprite->data[3] && sprite->affineAnimEnded)
+ {
+ sprite->data[0] = 0;
+ sprite->data[2] = 0;
+ sprite->callback = sub_80CBCF8;
+ }
+ break;
+ }
+}
+
+void sub_80CBCF8(struct Sprite* sprite)
+{
+ if (sprite->data[2] == gUnknown_083D680C[sprite->data[0]][1])
+ {
+ if (gUnknown_083D680C[sprite->data[0]][2] == 0x7F)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CBDB0;
+ }
+
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[2]++;
+ sprite->data[1] = (gUnknown_083D680C[sprite->data[0]][0] * gUnknown_083D680C[sprite->data[0]][2] + sprite->data[1]) & 0xFF;
+ if (!NotInBattle())
+ {
+ if ((u16)(sprite->data[1] - 1) <= 0xBE)
+ {
+ sprite->subpriority = 31;
+ }
+ else
+ {
+ sprite->subpriority = 29;
+ }
+ }
+
+ sprite->pos2.x = Cos(sprite->data[1], 0x3C);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ }
+}
+
+void sub_80CBDB0(struct Sprite* sprite)
+{
+ if (sprite->data[0] > 20)
+ move_anim_8072740(sprite);
+
+ sprite->invisible = sprite->data[0] % 2;
+ sprite->data[0]++;
+}
diff --git a/src/battle/anim/sword.c b/src/battle/anim/sword.c
new file mode 100755
index 000000000..536f89b26
--- /dev/null
+++ b/src/battle/anim/sword.c
@@ -0,0 +1,30 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CF6B4(struct Sprite* sprite);
+
+// sword (sword appears and floats upward.)
+// Used in Swords Dance.
+
+void sub_80CF690(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->callback = sub_80785E4;
+ StoreSpriteCallbackInData(sprite, sub_80CF6B4);
+}
+
+void sub_80CF6B4(struct Sprite* sprite)
+{
+ sprite->data[0] = 6;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y - 32;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
diff --git a/src/battle/anim/taunt_finger.c b/src/battle/anim/taunt_finger.c
new file mode 100755
index 000000000..7024f85a0
--- /dev/null
+++ b/src/battle/anim/taunt_finger.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern void sub_80CEF44(u8 bank, struct Sprite* sprite);
+static void sub_80CF228(struct Sprite* sprite);
+static void sub_80CF264(struct Sprite* sprite);
+
+// taunt_finger
+// Used in Taunt.
+
+void sub_80CF1C8(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ if (GetBankSide(bank) == 0)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[0] = 2;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 3;
+ }
+
+ sprite->callback = sub_80CF228;
+}
+
+void sub_80CF228(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 10)
+ {
+ sprite->data[1] = 0;
+ StartSpriteAnim(sprite, sprite->data[0]);
+ StoreSpriteCallbackInData(sprite, sub_80CF264);
+ sprite->callback = sub_8078600;
+ }
+}
+
+void sub_80CF264(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 5)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/tendrils.c b/src/battle/anim/tendrils.c
new file mode 100755
index 000000000..ba1014d2f
--- /dev/null
+++ b/src/battle/anim/tendrils.c
@@ -0,0 +1,67 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CB298(struct Sprite* sprite);
+static void sub_80CB2D4(struct Sprite* sprite);
+
+// tendrils
+// Used by Constrict.
+
+void sub_80CB25C(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 0);
+ sprite->affineAnimPaused = 1;
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[6] = gBattleAnimArgs[2];
+ sprite->data[7] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CB298;
+}
+
+void sub_80CB298(struct Sprite* sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->affineAnimPaused = 0;
+ GetAnimBankSpriteId(1);
+ sprite->data[0] = 0x100;
+ sprite->callback = sub_80CB2D4;
+ }
+}
+
+void sub_80CB2D4(struct Sprite* sprite)
+{
+ GetAnimBankSpriteId(1);
+ if (!sprite->data[2])
+ {
+ sprite->data[0] += 11;
+ }
+ else
+ {
+ sprite->data[0] -= 11;
+ }
+ sprite->data[1]++;
+ if (sprite->data[1] == 6)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] ^= 1;
+ }
+
+ if (sprite->affineAnimEnded)
+ {
+ sprite->data[7]--;
+ if (sprite->data[7] > 0)
+ {
+ StartSpriteAffineAnim(sprite, sprite->data[6]);
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/battle/anim/thought.c b/src/battle/anim/thought.c
new file mode 100755
index 000000000..9cffafe14
--- /dev/null
+++ b/src/battle/anim/thought.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CF008(struct Sprite* sprite);
+
+// thought (thought bubble)
+// Used in Metronome and Taunt.
+
+void sub_80CEF44(u8 bank, struct Sprite* sprite)
+{
+ if (GetBankSide(bank) == 0)
+ sprite->pos1.x = sub_807A100(bank, 5) + 8;
+ else
+ sprite->pos1.x = sub_807A100(bank, 4) - 8;
+
+ sprite->pos1.y = sub_8077ABC(bank, 3) - (s16)sub_807A100(bank, 0) / 4;
+}
+
+void sub_80CEF9C(struct Sprite* sprite)
+{
+ u8 a;
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ a = (GetBankSide(bank) == 0) ? 0 : 1;
+ sprite->data[0] = gBattleAnimArgs[1];
+ sprite->data[1] = a + 2;
+ StartSpriteAnim(sprite, a);
+ StoreSpriteCallbackInData(sprite, sub_80CF008);
+ sprite->callback = sub_8078600;
+}
+
+void sub_80CF008(struct Sprite* sprite)
+{
+ if (--sprite->data[0] == 0)
+ {
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ StartSpriteAnim(sprite, sprite->data[1]);
+ sprite->callback = sub_8078600;
+ }
+}
diff --git a/src/battle/anim/thrashing.c b/src/battle/anim/thrashing.c
new file mode 100755
index 000000000..9811c546a
--- /dev/null
+++ b/src/battle/anim/thrashing.c
@@ -0,0 +1,111 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D77B0;
+
+static void sub_80D0A8C(u8 taskId);
+static void sub_80D0B3C(u8 taskId);
+
+// thrashing (the movement of the Pokemon left/right repeatedly, with up/down movements below.)
+// Used by Thrash.
+
+// left/right movements
+void sub_80D0A4C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ sub_80798F4(task, spriteId, &gUnknown_083D77B0);
+ task->func = sub_80D0A8C;
+}
+
+void sub_80D0A8C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (!sub_807992C(task))
+ DestroyAnimVisualTask(taskId);
+}
+
+// up/down movements
+void sub_80D0AB8(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = GetAnimBankSpriteId(0);
+ task->data[1] = 0;
+ task->data[2] = 4;
+ task->data[3] = 7;
+ task->data[4] = 3;
+ task->data[5] = gSprites[task->data[0]].pos1.x;
+ task->data[6] = gSprites[task->data[0]].pos1.y;
+ task->data[7] = 0;
+ task->data[8] = 0;
+ task->data[9] = 2;
+ if (GetBankSide(gBattleAnimBankAttacker) == 1)
+ task->data[2] *= -1;
+
+ task->func = sub_80D0B3C;
+}
+
+void sub_80D0B3C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (++task->data[7] > 2)
+ {
+ task->data[7] = 0;
+ task->data[8]++;
+ if ((task->data[8] & 1) != 0)
+ {
+ gSprites[task->data[0]].pos1.y += task->data[9];
+ }
+ else
+ {
+ gSprites[task->data[0]].pos1.y -= task->data[9];
+ }
+ }
+ switch (task->data[1])
+ {
+ case 0:
+ gSprites[task->data[0]].pos1.x += task->data[2];
+ if (--task->data[3] == 0)
+ {
+ task->data[3] = 14;
+ task->data[1] = 1;
+ }
+ break;
+ case 1:
+ gSprites[task->data[0]].pos1.x -= task->data[2];
+ if (--task->data[3] == 0)
+ {
+ task->data[3] = 7;
+ task->data[1] = 2;
+ }
+ break;
+ case 2:
+ gSprites[task->data[0]].pos1.x += task->data[2];
+ if (--task->data[3] == 0)
+ {
+ if (--task->data[4] != 0)
+ {
+ task->data[3] = 7;
+ task->data[1] = 0;
+ }
+ else
+ {
+ if ((task->data[8] & 1) != 0)
+ {
+ gSprites[task->data[0]].pos1.y -= task->data[9];
+ }
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/tile_in.c b/src/battle/anim/tile_in.c
new file mode 100755
index 000000000..5fcbadbb7
--- /dev/null
+++ b/src/battle/anim/tile_in.c
@@ -0,0 +1,51 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// tile_in (flips a white tile from the scene into facing the player.)
+// Used in Conversion.
+
+void sub_80CE09C(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[1];
+ if (NotInBattle())
+ sprite->pos1.y += 10;
+ sprite->data[0]++;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ move_anim_8072740(sprite);
+}
+
+void sub_80CE108(u8 taskId)
+{
+ if (gTasks[taskId].data[2] == 1)
+ {
+ gBattleAnimArgs[7] = 0xFFFF;
+ gTasks[taskId].data[2]++;
+ }
+ else if (gTasks[taskId].data[2] == 2)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ if (++gTasks[taskId].data[0] == 4)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1]++;
+ REG_BLDALPHA = (gTasks[taskId].data[1] << 8) | (16 - gTasks[taskId].data[1]);
+ if (gTasks[taskId].data[1] == 16)
+ gTasks[taskId].data[2]++;
+ }
+ }
+}
diff --git a/src/battle/anim/tile_out.c b/src/battle/anim/tile_out.c
new file mode 100755
index 000000000..8b710268f
--- /dev/null
+++ b/src/battle/anim/tile_out.c
@@ -0,0 +1,81 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "battle_interface.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gNoOfAllBanks;
+extern u8 gHealthboxIDs[];
+
+static void sub_80CE1AC(struct Sprite* sprite);
+
+// tile_out (makes a tile fly inward into a center point.)
+// Used in Conversion 2.
+
+void sub_80CE17C(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 0);
+ sprite->animPaused = 1;
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->callback = sub_80CE1AC;
+}
+
+void sub_80CE1AC(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ {
+ sprite->data[0]--;
+ }
+ else
+ {
+ sprite->animPaused = 0;
+ sprite->data[0] = 30;
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+ }
+}
+
+void sub_80CE210(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 4)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1]++;
+ REG_BLDALPHA = gTasks[taskId].data[1] | ((16 - gTasks[taskId].data[1]) << 8);
+ if (gTasks[taskId].data[1] == 16)
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void unref_sub_80CE260(u8 taskId)
+{
+ u8 i;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (gBattleAnimArgs[0] == 1 && GetBankSide(i) == 0)
+ sub_8043DB0(gHealthboxIDs[i]);
+
+ if (gBattleAnimArgs[1] == 1 && GetBankSide(i) == 1)
+ sub_8043DB0(gHealthboxIDs[i]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void unref_sub_80CE2D4(u8 taskId)
+{
+ u8 i;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ sub_8043DFC(gHealthboxIDs[i]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/twinkle.c b/src/battle/anim/twinkle.c
new file mode 100755
index 000000000..56095c29d
--- /dev/null
+++ b/src/battle/anim/twinkle.c
@@ -0,0 +1,42 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CE3B0(struct Sprite* sprite);
+
+// twinkle (a tiny twinkling star appears above the Pokemon and descends toward the Pokemon.)
+// Used in Moonlight.
+
+void sub_80CE36C(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 1;
+ sprite->callback = sub_80CE3B0;
+}
+
+void sub_80CE3B0(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ if (sprite->data[2] <= 0x77)
+ {
+ sprite->pos1.y++;
+ sprite->data[2]++;
+ }
+ }
+
+ if (sprite->data[0])
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/unused_1.c b/src/battle/anim/unused_1.c
new file mode 100755
index 000000000..fdcef0de9
--- /dev/null
+++ b/src/battle/anim/unused_1.c
@@ -0,0 +1,25 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// unused effect file.
+// Seems to be a beta effect for Beat Up, possibly.
+
+void sub_80CC8C8(struct Sprite* sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+ sprite->data[5] = gBattleAnimArgs[5];
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]);
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_8078504;
+}
diff --git a/src/battle/anim/unused_2.c b/src/battle/anim/unused_2.c
new file mode 100755
index 000000000..f7f5be88d
--- /dev/null
+++ b/src/battle/anim/unused_2.c
@@ -0,0 +1,80 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CCCB4(struct Sprite* sprite);
+
+// unused_2 (unknown effect with music notes.)
+// possibly another unused effect. Unknown usage.
+
+void unref_sub_80CCB6C(struct Sprite* sprite)
+{
+ if (sprite->data[2] > 1)
+ {
+ if (sprite->data[3] & 1)
+ {
+ sprite->invisible = 0;
+ gSprites[sprite->data[0]].invisible = 0;
+ gSprites[sprite->data[1]].invisible = 0;
+ }
+ else
+ {
+ sprite->invisible = 1;
+ gSprites[sprite->data[0]].invisible = 1;
+ gSprites[sprite->data[1]].invisible = 1;
+ }
+
+ sprite->data[2] = 0;
+ sprite->data[3]++;
+ }
+ else
+ {
+ sprite->data[2]++;
+ }
+
+ if (sprite->data[3] == 10)
+ {
+ DestroySprite(&gSprites[sprite->data[0]]);
+ DestroySprite(&gSprites[sprite->data[1]]);
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CCC50(struct Sprite* sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[2];
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ else
+ sprite->pos1.x += gBattleAnimArgs[0];
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[5]);
+ sprite->data[1] = -gBattleAnimArgs[3];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[3] = gBattleAnimArgs[4];
+ sprite->callback = sub_80CCCB4;
+ sub_80CCCB4(sprite);
+}
+
+void sub_80CCCB4(struct Sprite* sprite)
+{
+ sprite->pos2.x = Cos(sprite->data[0], 100);
+ sprite->pos2.y = Sin(sprite->data[0], 20);
+ if (sprite->data[0] <= 0x7F)
+ sprite->subpriority = 0;
+ else
+ sprite->subpriority = 14;
+
+ sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;
+ sprite->data[5] += 0x82;
+ sprite->pos2.y += sprite->data[5] >> 8;
+ sprite->data[2]++;
+ if (sprite->data[2] == sprite->data[3])
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/unused_3.c b/src/battle/anim/unused_3.c
new file mode 100755
index 000000000..049e0ca1b
--- /dev/null
+++ b/src/battle/anim/unused_3.c
@@ -0,0 +1,45 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CD2D4(struct Sprite* sprite);
+
+// unused_3 (seems to be some sort of popping effect with a growing diamond shape)
+// yet another unused effect...
+
+void sub_80CD274(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, 1);
+ }
+
+ sprite->callback = sub_80CD2D4;
+}
+
+void sub_80CD2D4(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 30)
+ {
+ sprite->pos2.y = (30 - sprite->data[0]) / 3;
+ sprite->pos2.x = Sin(sprite->data[1] * 4, 3);
+ sprite->data[1]++;
+ }
+
+ if (sprite->animEnded)
+ move_anim_8072740(sprite);
+}
diff --git a/src/battle/anim/unused_4.c b/src/battle/anim/unused_4.c
new file mode 100755
index 000000000..72ecde05c
--- /dev/null
+++ b/src/battle/anim/unused_4.c
@@ -0,0 +1,58 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CD9D4(struct Sprite* sprite);
+
+// unused_4
+// Unknown usage.
+
+void sub_80CD9C4(struct Sprite* sprite)
+{
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD9D4;
+}
+
+void sub_80CD9D4(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = 0;
+ sprite->data[2] = gObjectBankIDs[gBattleAnimBankAttacker];
+ sprite->data[3] = GetBankSide(gBattleAnimBankAttacker);
+ sprite->data[4] = (sprite->data[3] != 0) ? 0x200 : -0x200;
+ sprite->data[5] = 0;
+ sub_8078E70(sprite->data[2], 0);
+ sprite->data[0]++;
+ case 1:
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[2]);
+ if (++sprite->data[1] > 3)
+ {
+ sprite->data[1] = 0;
+ sprite->data[4] *= -1;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[2]);
+ if (++sprite->data[1] > 3)
+ {
+ sub_8078F40(sprite->data[2]);
+ move_anim_8072740(sprite);
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/unused_5.c b/src/battle/anim/unused_5.c
new file mode 100755
index 000000000..4dc2da70d
--- /dev/null
+++ b/src/battle/anim/unused_5.c
@@ -0,0 +1,25 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// unused_5
+
+void sub_80CF280(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->data[4] = gBattleAnimArgs[3];
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_8078278;
+ sub_8078278(sprite);
+}
diff --git a/src/battle/anim/unused_6.c b/src/battle/anim/unused_6.c
new file mode 100755
index 000000000..f7c87647f
--- /dev/null
+++ b/src/battle/anim/unused_6.c
@@ -0,0 +1,49 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern void sub_80CEF44(u8 bank, struct Sprite* sprite);
+static void sub_80CF310(struct Sprite* sprite);
+
+// unused_6
+
+void sub_80CF2D0(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = sub_80CF310;
+}
+
+void sub_80CF310(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos2.y -= 3;
+ if (++sprite->data[1] == 6)
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->pos2.y += 3;
+ if (--sprite->data[1] == 0)
+ sprite->data[0]++;
+ break;
+ case 2:
+ if (++sprite->data[1] == 0x40)
+ move_anim_8072740(sprite);
+ break;
+ }
+}
diff --git a/src/battle/anim/unused_7.c b/src/battle/anim/unused_7.c
new file mode 100755
index 000000000..3a8998f1d
--- /dev/null
+++ b/src/battle/anim/unused_7.c
@@ -0,0 +1,51 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+// unused_7
+
+void sub_80CF374(struct Sprite* sprite)
+{
+ s16 temp;
+ gSprites[sprite->data[2]].pos2.x += sprite->data[1];
+ temp = sprite->data[1];
+ sprite->data[1] = -temp;
+ if (sprite->data[0] == 0)
+ {
+ gSprites[sprite->data[2]].pos2.x = 0;
+ move_anim_8074EE0(sprite);
+ }
+
+ sprite->data[0]--;
+}
+
+void sub_80CF3C4(struct Sprite* sprite)
+{
+ u8 a;
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
+ a = gObjectBankIDs[gBattleAnimBankTarget];
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = a;
+ sprite->callback = sub_80CF374;
+ sprite->invisible = 1;
+}
diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c
new file mode 100755
index 000000000..bcebfcd2b
--- /dev/null
+++ b/src/battle/anim/unused_8.c
@@ -0,0 +1,41 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80CF490(struct Sprite* sprite);
+static void sub_80CF4B8(struct Sprite* sprite);
+
+// unused_8
+
+void sub_80CF458(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[4];
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CF490);
+}
+
+void sub_80CF490(struct Sprite* sprite)
+{
+ sprite->data[0] = sprite->data[1];
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y + 15;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80CF4B8);
+}
+
+void sub_80CF4B8(struct Sprite* sprite)
+{
+ if (sprite->data[5] == 0)
+ move_anim_8072740(sprite);
+ else
+ sprite->data[5]--;
+}
diff --git a/src/battle/anim/unused_9.c b/src/battle/anim/unused_9.c
new file mode 100755
index 000000000..579238fbc
--- /dev/null
+++ b/src/battle/anim/unused_9.c
@@ -0,0 +1,113 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern struct SpriteTemplate gSpriteTemplate_83D75AC;
+
+static void sub_80CFE2C(struct Sprite* sprite);
+
+// unused_9? (Most likely an unused effect.)
+// I cannot find any reference to this sprite template used to call this.
+
+void sub_80CFDFC(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(gSpriteTemplate_83D75AC.paletteTag) << 4);
+ sprite->callback = sub_80CFE2C;
+}
+
+#ifdef NONMATCHING
+void sub_80CFE2C(struct Sprite* sprite)
+{
+ u16 r7;
+ u16* r1;
+ u16* r2;
+ int i;
+ if (++sprite->data[1] == 2)
+ {
+ sprite->data[1] = 0;
+ r7 = gPlttBufferFaded[sprite->data[0] + 8];
+ r2 = &gPlttBufferFaded[0x10];
+ r1 = &gPlttBufferFaded[sprite->data[0] + 9];
+ for (i = 7; i >= 0; i--)
+ {
+ *r2 = *r1;
+ r1++;
+ r2++;
+ }
+
+ gPlttBufferFaded[sprite->data[0] + 15] = r7;
+ if (++sprite->data[2] == 0x18)
+ move_anim_8072740(sprite);
+ }
+}
+#else
+__attribute__((naked))
+void sub_80CFE2C(struct Sprite* sprite)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ adds r4, r0, 0\n\
+ ldrh r0, [r4, 0x30]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x30]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x2\n\
+ bne _080CFE90\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x30]\n\
+ ldrh r5, [r4, 0x2E]\n\
+ ldr r1, _080CFE98 @ =gPlttBufferFaded\n\
+ adds r0, r5, 0\n\
+ adds r0, 0x8\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r7, [r0]\n\
+ adds r6, r1, 0 @puts gPlttBufferFaded in r6\n\
+ adds r1, r5, 0\n\
+ adds r1, 0x9\n\
+ lsls r0, r5, 1\n\
+ adds r0, r6 \n\
+ adds r2, r0, 0\n\
+ adds r2, 0x10\n\
+ movs r3, 0x7\n\
+ lsls r1, 1\n\
+ adds r1, r6 \n\
+_080CFE64:\n\
+ ldrh r0, [r1]\n\
+ strh r0, [r2]\n\
+ adds r1, 0x2\n\
+ adds r2, 0x2\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _080CFE64\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xF\n\
+ lsls r0, 1\n\
+ adds r0, r6\n\
+ strh r7, [r0]\n\
+ ldrh r0, [r4, 0x32]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x32]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x18\n\
+ bne _080CFE90\n\
+ adds r0, r4, 0\n\
+ bl move_anim_8072740\n\
+_080CFE90:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080CFE98: .4byte gPlttBufferFaded\n\
+.syntax divided\n");
+}
+#endif
diff --git a/src/battle/anim/wave_finger.c b/src/battle/anim/wave_finger.c
new file mode 100755
index 000000000..58f0f8778
--- /dev/null
+++ b/src/battle/anim/wave_finger.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern void sub_80CEF44(u8 bank, struct Sprite* sprite);
+void sub_80CF088(struct Sprite* sprite);
+
+// wave_finger
+// Used by Metronome.
+
+void sub_80CF040(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gBattleAnimBankAttacker;
+ else
+ bank = gBattleAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ sprite->data[0] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CF088);
+ sprite->callback = sub_80785E4;
+}
+
+void sub_80CF088(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 16)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_80785E4;
+ }
+}
diff --git a/src/battle/anim/whip.c b/src/battle/anim/whip.c
new file mode 100755
index 000000000..3aa0758a9
--- /dev/null
+++ b/src/battle/anim/whip.c
@@ -0,0 +1,46 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// whip (does a hitting animation that uses a rotating sprite to invoke the sprite getting hit.)
+// Used by Slam and Vine Whip.
+
+void sub_80CC810(struct Sprite* sprite)
+{
+ if (sprite->animEnded)
+ move_anim_8072740(sprite);
+}
+
+// unused, beta effect for diagonal sprite movement?
+void sub_80CC82C(struct Sprite* sprite)
+{
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
+
+void sub_80CC884(struct Sprite* sprite)
+{
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ StartSpriteAnim(sprite, 1);
+
+ sprite->callback = sub_80CC810;
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+}
diff --git a/src/battle/anim/withdraw.c b/src/battle/anim/withdraw.c
new file mode 100755
index 000000000..9abcff32d
--- /dev/null
+++ b/src/battle/anim/withdraw.c
@@ -0,0 +1,69 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CF514(u8 taskId);
+
+// withdraw (where a Pokemon leans inward to mimic the effect of withdrawing into a shell.)
+// Used in Withdraw.
+
+void sub_80CF4D8(u8 taskId)
+{
+ sub_8078E70(gObjectBankIDs[gBattleAnimBankAttacker], 0);
+ gTasks[taskId].func = sub_80CF514;
+}
+
+void sub_80CF514(u8 taskId)
+{
+ u8 a = gObjectBankIDs[gBattleAnimBankAttacker];
+ s16 b;
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ {
+ b = -gTasks[taskId].data[0];
+ }
+ else
+ {
+ b = gTasks[taskId].data[0];
+ }
+
+ obj_id_set_rotscale(a, 0x100, 0x100, b);
+ if (gTasks[taskId].data[1] == 0)
+ {
+ gTasks[taskId].data[0] += 0xB0;
+ gSprites[a].pos2.y++;
+ }
+ else if (gTasks[taskId].data[1] == 1)
+ {
+ if (++gTasks[taskId].data[3] == 0x1E)
+ gTasks[taskId].data[1] = 2;
+
+ return;
+ }
+ else
+ {
+ gTasks[taskId].data[0] -= 0xB0;
+ gSprites[a].pos2.y--;
+ }
+
+ sub_8078F9C(a);
+ if (gTasks[taskId].data[0] == 0xF20 || gTasks[taskId].data[0] == 0)
+ {
+ if (gTasks[taskId].data[1] == 2)
+ {
+ sub_8078F40(a);
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[1]++;
+ }
+ }
+}
diff --git a/src/battle_anim_80CA710.c b/src/battle_anim_80CA710.c
deleted file mode 100755
index 01f445094..000000000
--- a/src/battle_anim_80CA710.c
+++ /dev/null
@@ -1,6258 +0,0 @@
-#include "global.h"
-#include "battle.h"
-#include "battle_anim.h"
-#include "battle_anim_80CA710.h"
-#include "battle_interface.h"
-#include "blend_palette.h"
-#include "decompress.h"
-#include "ewram.h"
-#include "main.h"
-#include "palette.h"
-#include "random.h"
-#include "rom_8077ABC.h"
-#include "songs.h"
-#include "sound.h"
-#include "sprite.h"
-#include "task.h"
-#include "trig.h"
-#include "unknown_task.h"
-
-struct Struct_sub_8078914
-{
- u8 *field_0;
- u8 *field_4;
- u8 field_8;
-};
-
-extern u8 gBanksBySide[];
-extern s16 gBattleAnimArgs[8];
-extern u8 gBattleAnimBankAttacker;
-extern u8 gBattleAnimBankTarget;
-extern struct SpriteTemplate gSpriteTemplate_83D631C;
-extern struct SpriteTemplate gSpriteTemplate_83D6884;
-extern struct SpriteTemplate gSpriteTemplate_83D74BC;
-extern struct SpriteTemplate gSpriteTemplate_83D75AC;
-extern struct SpriteTemplate gSpriteTemplate_83D79E8;
-extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FC8;
-extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FF8;
-extern struct AffineAnimFrameCmd gUnknown_083D76F4;
-extern struct AffineAnimFrameCmd gUnknown_083D7714;
-extern struct AffineAnimFrameCmd gUnknown_083D77B0;
-extern struct AffineAnimFrameCmd gUnknown_083D79BC;
-extern struct AffineAnimFrameCmd gUnknown_083D7A98;
-extern struct INCBIN_U8 gBattleAnimSpritePalette_206;
-extern struct INCBIN_U8 gAttractTilemap;
-extern struct INCBIN_U8 gAttractGfx;
-extern struct INCBIN_U8 gAttractPal;
-extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceContest;
-extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFacePlayer;
-extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceOpponent;
-extern struct INCBIN_U8 gBattleAnimBackgroundImage_ScaryFace;
-extern struct INCBIN_U8 gBattleAnimBackgroundPalette_ScaryFace;
-extern s16 gUnknown_03000728[];
-extern s8 gUnknown_083D680C[11][3];
-extern u16 gUnknown_083D6984[];
-extern s8 gUnknown_083D6DDC[4][2];
-extern u8 gObjectBankIDs[];
-extern u8 gNoOfAllBanks;
-extern u8 gHealthboxIDs[];
-extern u16 gUnknown_083D712C[4][6];
-extern u16 gBattleTypeFlags;
-extern u16 gUnknown_030042C0;
-extern u16 gUnknown_03004288;
-extern u16 gUnknown_030042C4;
-extern u16 gUnknown_03004240;
-extern u16 gUnknown_030041B4;
-extern s8 gUnknown_083D7A00[4][2];
-extern u16 gUnknown_083D7A5C[5];
-
-static void sub_80CA768(struct Sprite* sprite);
-static void sub_80CA8B4(struct Sprite* sprite);
-static void sub_80CA9F8(struct Sprite* sprite);
-static void sub_80CAACC(struct Sprite* sprite);
-static void sub_80CAB88(struct Sprite* sprite);
-static void sub_80CABC0(struct Sprite* sprite);
-static void sub_80CAC44(struct Sprite* sprite);
-static void sub_80CADA8(struct Sprite* sprite);
-static void sub_80CAE74(struct Sprite* sprite);
-static void sub_80CAF20(struct Sprite* sprite);
-static void sub_80CAF6C(struct Sprite* sprite);
-static void sub_80CB09C(struct Sprite* sprite);
-static void sub_80CB1A4(struct Sprite* sprite);
-static void sub_80CB298(struct Sprite* sprite);
-static void sub_80CB2D4(struct Sprite* sprite);
-static void sub_80CB710(struct Sprite* sprite);
-static void sub_80CBB60(struct Sprite* sprite);
-static void sub_80CBC8C(struct Sprite* sprite);
-static void sub_80CBCF8(struct Sprite* sprite);
-static void sub_80CBDB0(struct Sprite* sprite);
-static void sub_80CC408(struct Sprite* sprite);
-static void sub_80CC580(struct Sprite* sprite);
-static void sub_80CC7D4(struct Sprite* sprite);
-static void sub_80CCB00(struct Sprite* sprite);
-static void sub_80CCCB4(struct Sprite* sprite);
-static void sub_80CCE0C(struct Sprite* sprite);
-static void sub_80CCF70(struct Sprite* sprite);
-static void sub_80CD0CC(struct Sprite* sprite, int unk1, int unk2);
-static void sub_80CD2D4(struct Sprite* sprite);
-static void sub_80CD394(struct Sprite* sprite);
-static void sub_80CD408(struct Sprite* sprite);
-static void sub_80CD4B8(struct Sprite* sprite);
-static void sub_80CD4EC(struct Sprite* sprite);
-static void sub_80CD5A8(struct Sprite* sprite);
-static void sub_80CD654(struct Sprite* sprite);
-static void sub_80CD67C(struct Sprite* sprite);
-static void sub_80CD7CC(struct Sprite* sprite);
-static void sub_80CD81C(struct Sprite* sprite);
-static void sub_80CD8A8(struct Sprite* sprite);
-static void sub_80CD8F8(struct Sprite* sprite);
-static void sub_80CD91C(struct Sprite* sprite);
-static void sub_80CD9B8(struct Sprite* sprite);
-static void sub_80CD9D4(struct Sprite* sprite);
-static void sub_80CDE78(struct Sprite* sprite);
-static void sub_80CDEB0(struct Sprite* sprite);
-static void sub_80CDEC0(struct Sprite* sprite);
-static void sub_80CDF70(struct Sprite* sprite);
-static void sub_80CE000(struct Sprite* sprite);
-static void sub_80CE1AC(struct Sprite* sprite);
-static void sub_80CE354(struct Sprite* sprite);
-static void sub_80CE3B0(struct Sprite* sprite);
-static void sub_80CE798(struct Sprite* sprite);
-static void sub_80CE974(struct Sprite* sprite);
-static void sub_80CEC1C(struct Sprite* sprite);
-static void sub_80CED78(struct Sprite* sprite);
-static void sub_80CEEE8(struct Sprite* sprite);
-static void sub_80CF008(struct Sprite* sprite);
-static void sub_80CF088(struct Sprite* sprite);
-static void sub_80CF138(struct Sprite* sprite);
-static void sub_80CF158(struct Sprite* sprite);
-static void sub_80CF228(struct Sprite* sprite);
-static void sub_80CF264(struct Sprite* sprite);
-static void sub_80CF310(struct Sprite* sprite);
-static void sub_80CF490(struct Sprite* sprite);
-static void sub_80CF4B8(struct Sprite* sprite);
-static void sub_80CF6B4(struct Sprite* sprite);
-static void sub_80CFE2C(struct Sprite* sprite);
-static void sub_80CFF68(struct Sprite* sprite);
-static void sub_80D0030(struct Sprite* sprite);
-static void sub_80D00B4(struct Sprite* sprite);
-static void sub_80D020C(struct Sprite* sprite);
-static void sub_80D02D0(struct Sprite* sprite);
-static void sub_80D0344(struct Sprite* sprite);
-static void sub_80D03A8(struct Sprite* sprite);
-extern void sub_80D0704(struct Sprite* sprite);
-static void sub_80D0E8C(struct Sprite* sprite);
-static void sub_80D1098(struct Sprite* sprite);
-static void sub_80D13AC(struct Sprite* sprite);
-static void sub_80D1424(struct Sprite* sprite);
-static void sub_80D144C(struct Sprite* sprite);
-static void sub_80D14C4(struct Sprite* sprite);
-static void sub_80D1504(struct Sprite* sprite);
-static void sub_80D154C(struct Sprite* sprite);
-static void sub_80D158C(struct Sprite* sprite);
-static void sub_80D1FA4(struct Sprite* sprite);
-static void sub_80D2094(struct Sprite* sprite);
-static void sub_80D2704(struct Sprite* sprite);
-static void sub_80D2834(struct Sprite* sprite);
-static s16 sub_80CC338(struct Sprite* sprite);
-static void sub_80CB3A8(u8 taskId);
-static void sub_80CB438(u8 taskId);
-static void sub_80CBF5C(u8 taskId);
-static void sub_80CDB60(u8 taskId);
-static void sub_80CDD20(u8 taskId);
-static void sub_80CE4D4(u8 taskId);
-static void sub_80CE910(u8 taskId);
-static void sub_80CF514(u8 taskId);
-static void sub_80D0428(u8 taskId);
-static void sub_80D04E0(u8 taskId);
-static void sub_80D07AC(u8 taskId);
-static void sub_80D0904(u8 taskId);
-static void sub_80D0A8C(u8 taskId);
-static void sub_80D0B3C(u8 taskId);
-static void sub_80D0D68(u8 taskId);
-static void sub_80D15E0(u8 taskId);
-static void sub_80D16A0(u8 taskId);
-static void sub_80D1808(u8 taskId);
-static void sub_80D1930(u8 taskId);
-static void sub_80D1D48(u8 taskId);
-static void sub_80D1D9C(u8 taskId);
-static void sub_80D21F0(u8 taskId);
-static void sub_80D24E0(u8 taskId);
-static void sub_80CC358(struct Task* task, u8 taskId);
-extern void sub_80D0614(struct Task* task, u8 taskId);
-static void sub_80CEBC4(s16 a, s16 b, s16* c, s16* d, s8 e);
-
-
-void sub_80CA710(struct Sprite* sprite)
-{
- sprite->pos1.x += gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[1] = gBattleAnimArgs[3];
-
- if (GetBankSide(gBattleAnimBankAttacker))
- {
- sprite->data[3] = -gBattleAnimArgs[4];
- }
- else
- {
- sprite->data[3] = gBattleAnimArgs[4];
- }
-
- sprite->data[4] = gBattleAnimArgs[5];
- sprite->callback = sub_80CA768;
-}
-
-void sub_80CA768(struct Sprite* sprite)
-{
- if (sprite->data[0] > 0)
- {
- sprite->data[0]--;
- sprite->pos2.y = sprite->data[2] >> 8;
- sprite->data[2] += sprite->data[1];
- sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
- sprite->data[5] = (sprite->data[5] + sprite->data[4]) & 0xFF;
- }
- else
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CA7B0(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
-}
-
-void sub_80CA800(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- StartSpriteAnim(sprite, gBattleAnimArgs[3]);
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-void sub_80CA858(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
- obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->data[5] = gBattleAnimArgs[3];
- sprite->callback = sub_80CA8B4;
- sub_80CA8B4(sprite);
-}
-
-void sub_80CA8B4(struct Sprite* sprite)
-{
- if (sub_8078B5C(sprite))
- {
- DestroySprite(sprite);
- }
- else
- {
- if (sprite->data[5] > 0x7F)
- {
- sprite->subpriority = sub_8079E90(gBattleAnimBankTarget) + 1;
- }
- else
- {
- sprite->subpriority = sub_8079E90(gBattleAnimBankTarget) + 6;
- }
- sprite->pos2.x += Sin(sprite->data[5], 5);
- sprite->pos2.y += Cos(sprite->data[5], 14);
- sprite->data[5] = (sprite->data[5] + 15) & 0xFF;
- }
-}
-
-void sub_80CA928(u8 taskId)
-{
- gTasks[taskId].data[0]--;
- if (gTasks[taskId].data[0] == -1)
- {
- gTasks[taskId].data[1]++;
- gTasks[taskId].data[0] = 6;
- gBattleAnimArgs[0] = 15;
- gBattleAnimArgs[1] = 0;
- gBattleAnimArgs[2] = 80;
- gBattleAnimArgs[3] = 0;
- CreateSpriteAndAnimate(&gSpriteTemplate_83D631C, 0, 0, sub_8079E90(gBattleAnimBankTarget) + 1);
- }
-
- if (gTasks[taskId].data[1] == 15)
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80CA9A8(struct Sprite* sprite)
-{
- sub_8078764(sprite, 1);
- sprite->data[0] = gBattleAnimArgs[3];
- sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->data[5] = gBattleAnimArgs[2];
- sub_80786EC(sprite);
- sprite->callback = sub_80CA9F8;
-}
-
-void sub_80CA9F8(struct Sprite* sprite)
-{
- if (sub_8078718(sprite))
- move_anim_8072740(sprite);
-}
-
-void sub_80CAA14(struct Sprite* sprite)
-{
- u16 a = Random();
- u16 b;
-
- StartSpriteAnim(sprite, a & 7);
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
- if (GetBankSide(gBattleAnimBankAttacker))
- {
- sprite->pos1.x -= 20;
- }
- else
- {
- sprite->pos1.x += 20;
- }
-
- b = Random();
- sprite->data[0] = (b & 31) + 64;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
- sub_8078D60(sprite);
- sprite->data[5] = Random() & 0xFF;
- sprite->data[6] = sprite->subpriority;
- sprite->callback = sub_80CAACC;
- sub_80CAACC(sprite);
-}
-
-void sub_80CAACC(struct Sprite* sprite)
-{
- if (sub_8078CE8(sprite))
- {
- move_anim_8072740(sprite);
- }
- else
- {
- sprite->pos2.y += Cos(sprite->data[5], 12);
- if (sprite->data[5] <= 0x7E)
- {
- sprite->subpriority = sprite->data[6];
- }
- else
- {
- sprite->subpriority = sprite->data[6] + 1;
- }
-
- sprite->data[5] = (sprite->data[5] + 24) & 0xFF;
- }
-}
-
-void sub_80CAB18(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- if (GetBankSide(gBattleAnimBankAttacker))
- {
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
- }
-
- sprite->data[0] = gBattleAnimArgs[4];
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 0) + gBattleAnimArgs[2];
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 1) + gBattleAnimArgs[3];
- sprite->data[5] = gBattleAnimArgs[5];
- sub_80786EC(sprite);
- sprite->callback = sub_80CAB88;
-}
-
-void sub_80CAB88(struct Sprite* sprite)
-{
- if (sub_8078718(sprite))
- {
- sprite->invisible = 1;
- sprite->data[0] = 10;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80CABC0);
- }
-}
-
-void sub_80CABC0(struct Sprite* sprite)
-{
- sprite->invisible = 0;
- StartSpriteAnim(sprite, 1);
- sprite->data[0] = 60;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-void sub_80CABF8(struct Sprite* sprite)
-{
- sub_8078764(sprite, 1);
- StartSpriteAnim(sprite, gBattleAnimArgs[4]);
- if (gBattleAnimArgs[4] == 1)
- {
- sprite->oam.objMode = 1;
- }
-
- sprite->data[0] = gBattleAnimArgs[3];
- sprite->data[1] = gBattleAnimArgs[2];
- sprite->callback = sub_80CAC44;
- sub_80CAC44(sprite);
-}
-
-void sub_80CAC44(struct Sprite* sprite)
-{
- u8 var1;
-
- sprite->pos2.x = Sin(sprite->data[1], 32);
- sprite->pos2.y = Cos(sprite->data[1], -3) + ((sprite->data[2] += 24) >> 8);
- if ((u16)(sprite->data[1] - 0x40) < 0x80)
- {
- sprite->oam.priority = (sub_8079ED4(gBattleAnimBankTarget) & 3);
- }
- else
- {
- var1 = sub_8079ED4(gBattleAnimBankTarget) + 1;
- if (var1 > 3)
- {
- var1 = 3;
- }
-
- sprite->oam.priority = var1;
- }
-
- sprite->data[1] = (sprite->data[1] + 2) & 0xFF;
- sprite->data[0]--;
- if (sprite->data[0] == -1)
- move_anim_8072740(sprite);
-}
-
-void sub_80CACEC(u8 taskId)
-{
- if (NotInBattle() || !IsDoubleBattle())
- {
- DestroyAnimVisualTask(taskId);
- }
- else
- {
- if (GetBankIdentity_permutated(gBattleAnimBankTarget) == 1)
- {
- REG_BG2CNT_BITFIELD.priority = 3;
- }
- else
- {
- REG_BG1CNT_BITFIELD.priority = 1;
- }
-
- DestroyAnimVisualTask(taskId);
- }
-}
-
-void sub_80CAD54(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 0);
- sprite->data[0] = gBattleAnimArgs[3];
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = sprite->pos1.x;
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
- obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->data[5] = 0x40;
- sprite->callback = sub_80CADA8;
- sub_80CADA8(sprite);
-}
-
-void sub_80CADA8(struct Sprite* sprite)
-{
- if (!sub_8078B5C(sprite))
- {
- sprite->pos2.x += Sin(sprite->data[5], 32);
- sprite->pos2.y += Cos(sprite->data[5], -5);
- if ((u16)(sprite->data[5] - 0x40) < 0x80)
- {
- sprite->subpriority = sub_8079E90(gBattleAnimBankAttacker) - 1;
- }
- else
- {
- sprite->subpriority = sub_8079E90(gBattleAnimBankAttacker) + 1;
- }
-
- sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
- }
- else
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CAE20(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- sprite->data[0] = gBattleAnimArgs[3];
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = sprite->pos1.x;
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
- obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->data[5] = 0x40;
- sprite->callback = sub_80CAE74;
- sub_80CAE74(sprite);
-}
-
-void sub_80CAE74(struct Sprite* sprite)
-{
- if (!sub_8078B5C(sprite))
- {
- sprite->pos2.x += Sin(sprite->data[5], 8);
- if ((u16)(sprite->data[5] - 0x3B) < 5 || (u16)(sprite->data[5] - 0xBB) < 5)
- {
- sprite->oam.matrixNum ^= 8;
- }
-
- sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
- }
- else
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CAED8(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->data[0] = gBattleAnimArgs[0];
- sprite->data[1] = gBattleAnimArgs[1];
- sprite->data[2] = gBattleAnimArgs[2];
- sprite->callback = sub_80CAF20;
-}
-
-void sub_80CAF20(struct Sprite* sprite)
-{
- if (!sprite->data[2])
- {
- if (sprite->data[1] & 1)
- {
- sprite->data[0] = 0x80;
- sprite->data[1] = 0;
- sprite->data[2] = 0;
- }
- else
- {
- sprite->data[0] = sprite->data[1] & 1;
- sprite->data[1] = sprite->data[1] & 1;
- sprite->data[2] = sprite->data[1] & 1;
- }
- sprite->callback = sub_80CAF6C;
- }
- else
- {
- sprite->data[2]--;
- sprite->pos1.x += sprite->data[0];
- sprite->pos1.y += sprite->data[1];
- }
-}
-
-void sub_80CAF6C(struct Sprite* sprite)
-{
- if (GetBankSide(gBattleAnimBankAttacker))
- {
- sprite->pos2.x = -Sin(sprite->data[0], 0x19);
- }
- else
- {
- sprite->pos2.x = Sin(sprite->data[0], 0x19);
- }
-
- sprite->data[0] = (sprite->data[0] + 2) & 0xFF;
- sprite->data[1]++;
- if (!(sprite->data[1] & 1))
- {
- sprite->pos2.y++;
- }
-
- if (sprite->data[1] > 0x50)
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CAFD0(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- if (GetBankSide(gBattleAnimBankAttacker))
- {
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
- }
-
- sprite->data[0] = gBattleAnimArgs[4];
- if (!(gBattleAnimArgs[6]))
- {
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2];
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3];
- }
- else
- {
- sub_807A3FC(gBattleAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]);
- sprite->data[2] += gBattleAnimArgs[2];
- sprite->data[4] += gBattleAnimArgs[3];
- }
-
- sprite->data[5] = gBattleAnimArgs[5];
- sub_80786EC(sprite);
- if (GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget))
- {
- sprite->data[0] = 1;
- }
- else
- {
- sprite->data[0] = 0;
- }
-
- sprite->callback = sub_80CB09C;
-}
-
-void sub_80CB09C(struct Sprite* sprite)
-{
- bool8 c = FALSE;
- s16 a = sprite->data[0];
- s16 b = sprite->data[7];
- s16 r0;
-
- sprite->data[0] = 1;
- sub_8078718(sprite);
- r0 = sprite->data[7];
- sprite->data[0] = a;
- if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0)
- sprite->oam.affineParam++;
-
- if (sprite->oam.affineParam != 0 && sprite->data[0] != 0)
- {
- sprite->invisible ^= 1;
- sprite->oam.affineParam++;
- if (sprite->oam.affineParam == 0x1E)
- c = TRUE;
- }
-
- if (sprite->pos1.x + sprite->pos2.x > 0x100
- || sprite->pos1.x + sprite->pos2.x < -16
- || sprite->pos1.y + sprite->pos2.y > 0xA0
- || sprite->pos1.y + sprite->pos2.y < -16)
- c = TRUE;
-
- if (c)
- move_anim_8072740(sprite);
-}
-
-void sub_80CB144(struct Sprite* sprite)
-{
- if (!NotInBattle() && IsDoubleBattle() == TRUE)
- {
- sub_807A3FC(gBattleAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y);
- }
-
- sprite->pos1.y += 32;
- sprite->data[0] = gBattleAnimArgs[0];
- sprite->data[1] = gBattleAnimArgs[1];
- sprite->data[2] = gBattleAnimArgs[2];
- sprite->data[3] = gBattleAnimArgs[3];
- sprite->data[4] = gBattleAnimArgs[4];
- sprite->callback = sub_80CB1A4;
-}
-
-void sub_80CB1A4(struct Sprite* sprite)
-{
- if (sprite->data[1] == 0xFF)
- {
- sprite->pos1.y -= 2;
- }
- else if (sprite->data[1] > 0)
- {
- sprite->pos1.y -= 2;
- sprite->data[1] -= 2;
- }
-
- sprite->data[5] += sprite->data[2];
- if (sprite->data[0] < sprite->data[4])
- sprite->data[5] += sprite->data[2];
-
- sprite->data[5] &= 0xFF;
- sprite->pos2.x = Cos(sprite->data[5], sprite->data[3]);
- sprite->pos2.y = Sin(sprite->data[5], 5);
- if (sprite->data[5] <= 0x7F)
- {
- sprite->oam.priority = sub_8079ED4(gBattleAnimBankTarget) - 1;
- }
- else
- {
- sprite->oam.priority = sub_8079ED4(gBattleAnimBankTarget) + 1;
- }
-
- sprite->data[0]--;
- if (!sprite->data[0])
- move_anim_8072740(sprite);
-}
-
-void sub_80CB25C(struct Sprite* sprite)
-{
- sub_8078764(sprite, 0);
- sprite->affineAnimPaused = 1;
- StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
- sprite->data[6] = gBattleAnimArgs[2];
- sprite->data[7] = gBattleAnimArgs[3];
- sprite->callback = sub_80CB298;
-}
-
-void sub_80CB298(struct Sprite* sprite)
-{
- if ((u16)gBattleAnimArgs[7] == 0xFFFF)
- {
- sprite->affineAnimPaused = 0;
- GetAnimBankSpriteId(1);
- sprite->data[0] = 0x100;
- sprite->callback = sub_80CB2D4;
- }
-}
-
-void sub_80CB2D4(struct Sprite* sprite)
-{
- GetAnimBankSpriteId(1);
- if (!sprite->data[2])
- {
- sprite->data[0] += 11;
- }
- else
- {
- sprite->data[0] -= 11;
- }
- sprite->data[1]++;
- if (sprite->data[1] == 6)
- {
- sprite->data[1] = 0;
- sprite->data[2] ^= 1;
- }
-
- if (sprite->affineAnimEnded)
- {
- sprite->data[7]--;
- if (sprite->data[7] > 0)
- {
- StartSpriteAffineAnim(sprite, sprite->data[6]);
- }
- else
- {
- move_anim_8072740(sprite);
- }
- }
-}
-
-void sub_80CB340(u8 taskId)
-{
- u8 spriteId = GetAnimBankSpriteId(1);
- if (gSprites[spriteId].invisible)
- {
- DestroyAnimVisualTask(taskId);
- }
- else
- {
- sub_8078E70(spriteId, 1);
- gTasks[taskId].data[0] = gBattleAnimArgs[0];
- gTasks[taskId].data[1] = gBattleAnimArgs[1];
- gTasks[taskId].data[11] = 256;
- gTasks[taskId].func = sub_80CB3A8;
- }
-}
-
-void sub_80CB3A8(u8 taskId)
-{
- u8 spriteId = GetAnimBankSpriteId(1);
- gTasks[taskId].data[10] += gTasks[taskId].data[0];
- gSprites[spriteId].pos2.x = gTasks[taskId].data[10] >> 8;
- if (GetBankSide(gBattleAnimBankTarget))
- {
- gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
- }
-
- gTasks[taskId].data[11] += 16;
- obj_id_set_rotscale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0);
- sub_8079A64(spriteId);
- gTasks[taskId].data[1]--;
- if (!gTasks[taskId].data[1])
- {
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_80CB438;
- }
-}
-
-void sub_80CB438(u8 taskId)
-{
- if ((u16)gBattleAnimArgs[7] == 0xFFFF)
- {
- if (gTasks[taskId].data[0] == 0)
- {
- u8 spriteId = GetAnimBankSpriteId(1);
- sub_8078F40(spriteId);
- gSprites[spriteId].pos2.x = 0;
- gSprites[spriteId].pos2.y = 0;
- gTasks[taskId].data[0]++;
- return;
- }
- }
- else
- {
- if (gTasks[taskId].data[0] == 0)
- return;
- }
-
- gTasks[taskId].data[0]++;
- if (gTasks[taskId].data[0] == 3)
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80CB4CC(struct Sprite* sprite)
-{
- switch (sprite->data[0])
- {
- case 0:
- {
- if (GetBankSide(gBattleAnimBankTarget) == 0)
- {
- s16 a = gBattleAnimArgs[0];
- gBattleAnimArgs[0] = -a;
- }
-
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0) + gBattleAnimArgs[0];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 1) + gBattleAnimArgs[1];
- sprite->invisible = 1;
- sprite->data[0]++;
- break;
- }
- case 1:
- {
- sprite->invisible = 0;
- if (sprite->affineAnimEnded)
- {
- ChangeSpriteAffineAnim(sprite, 1);
- sprite->data[0] = 25;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->callback = sub_8078CC0;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- break;
- }
- }
- }
-}
-
-void sub_80CB59C(struct Sprite* sprite)
-{
- if (!sprite->data[0])
- {
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1);
- sprite->pos2.x = gBattleAnimArgs[0];
- sprite->pos2.y = gBattleAnimArgs[1];
- sprite->subpriority = gBattleAnimArgs[2] + 30;
- StartSpriteAnim(sprite, gBattleAnimArgs[3]);
- sprite->data[2] = gBattleAnimArgs[4];
- sprite->data[0]++;
- if ((sprite->pos1.y + sprite->pos2.y) > 120)
- {
- sprite->pos1.y += -120 + (sprite->pos2.y + sprite->pos1.y);
- }
- }
- sprite->callback = sub_80CB710;
-}
-
-void sub_80CB620(struct Sprite *sprite)
-{
- s16 p1 = sub_8077ABC(gBattleAnimBankAttacker, 2);
- s16 p2 = sub_8077ABC(gBattleAnimBankAttacker, 3);
- s16 e1 = sub_8077ABC(gBattleAnimBankTarget, 2);
- s16 e2 = sub_8077ABC(gBattleAnimBankTarget, 3);
-
- e1 -= p1;
- e2 -= p2;
- sprite->pos1.x = p1 + e1 * gBattleAnimArgs[0] / 100;
- sprite->pos1.y = p2 + e2 * gBattleAnimArgs[0] / 100;
- sprite->pos2.x = gBattleAnimArgs[1];
- sprite->pos2.y = gBattleAnimArgs[2];
- sprite->subpriority = gBattleAnimArgs[3] + 30;
- StartSpriteAnim(sprite, gBattleAnimArgs[4]);
- sprite->data[2] = gBattleAnimArgs[5];
- sprite->callback = sub_80CB710;
- gUnknown_03000728[0] = sprite->pos1.x;
- gUnknown_03000728[1] = sprite->pos1.y;
- gUnknown_03000728[2] = e1;
- gUnknown_03000728[3] = e2;
-}
-
-void sub_80CB710(struct Sprite* sprite)
-{
- if (++sprite->data[0] > (sprite->data[2] - 10))
- sprite->invisible = sprite->data[0] % 2;
-
- if (sprite->data[0] > sprite->data[2])
- move_anim_8072740(sprite);
-}
-
-void sub_80CB768(struct Sprite* sprite)
-{
- if (!sprite->data[0])
- {
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[0];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[1];
- sprite->data[1] = gBattleAnimArgs[2];
- sprite->data[2] = gBattleAnimArgs[3];
- sprite->data[3] = gBattleAnimArgs[4];
- }
-
- sprite->data[0]++;
- sprite->pos2.x = sprite->data[1] * sprite->data[0];
- sprite->pos2.y = Sin((sprite->data[0] * 20) & 0xFF, sprite->data[2]);
- if (sprite->data[0] > sprite->data[3])
- move_anim_8072740(sprite);
-}
-
-void sub_80CB7EC(struct Sprite* sprite, s16 c)
-{
- s32 a = (sprite->pos1.x * 256) | sprite->pos1.y;
- s32 b = (sprite->data[6] * 256) | sprite->data[7];
- c *= 256;
- sprite->data[5] = a;
- sprite->data[6] = b;
- sprite->data[7] = c;
-}
-
-bool8 sub_80CB814(struct Sprite* sprite)
-{
- u16 r10 = (u8)(sprite->data[5] >> 8);
- u16 r9 = (u8)sprite->data[5];
- s32 r2 = (u8)(sprite->data[6] >> 8);
- s32 r4 = (u8)sprite->data[6];
- s16 r6 = sprite->data[7] >> 8;
- s16 r3 = sprite->data[7] & 0xFF;
- s16 r4_2;
- s16 r0;
- s32 var1;
- s32 var2;
-
- if (r2 == 0)
- {
- r2 = -32;
- }
- else if (r2 == 255)
- {
- r2 = 0x110;
- }
-
- r4_2 = r4 - r9;
- r0 = r2 - r10;
- var1 = r0 * r3 / r6;
- var2 = r4_2 * r3 / r6;
- sprite->pos1.x = var1 + r10;
- sprite->pos1.y = var2 + r9;
- if (++r3 == r6)
- return TRUE;
-
- sprite->data[7] = (r6 << 8) | r3;
- return FALSE;
-}
-
-void sub_80CB8B8(struct Sprite* sprite)
-{
- if (sprite->data[0] == 10)
- {
- StartSpriteAffineAnim(sprite, 1);
- }
-
- sprite->data[0]++;
- if (sprite->data[0] > 50)
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CB8E8(struct Sprite* sprite)
-{
- sprite->data[0] += sprite->data[3] * 128 / sprite->data[4];
- if (sprite->data[0] >= 128)
- {
- sprite->data[1]++;
- sprite->data[0] = 0;
- }
-
- sprite->pos2.y = Sin(sprite->data[0] + 128, 30 - sprite->data[1] * 8);
- if (sub_80CB814(sprite))
- {
- sprite->pos2.y = 0;
- sprite->data[0] = 0;
- sprite->callback = sub_80CB8B8;
- }
-}
-
-void sub_80CB94C(struct Sprite* sprite)
-{
- s16 e1;
- s16 e2;
- sub_80787B0(sprite, 0);
- e1 = sub_8077ABC(gBattleAnimBankTarget, 0);
- e2 = sub_8077ABC(gBattleAnimBankTarget, 1);
- if ((gBattleAnimBankAttacker ^ 2) == gBattleAnimBankTarget)
- {
- sprite->data[6] = e1;
- sprite->data[7] = e2 + 10;
- sub_80CB7EC(sprite, 0x3C);
- sprite->data[3] = 1;
- }
- else
- {
- sprite->data[6] = e1;
- sprite->data[7] = e2 + 10;
- sub_80CB7EC(sprite, 0x3C);
- sprite->data[3] = 3;
- }
-
- sprite->data[4] = 0x3C;
- sprite->callback = sub_80CB8E8;
-}
-
-void sub_80CB9C4(struct Sprite* sprite)
-{
- int zero;
- sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
- zero = 0;
- if (sprite->data[0] > 0x7F)
- {
- sprite->data[1]++;
- sprite->data[0] = zero;
- }
-
- sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
- if (sub_80CB814(sprite))
- {
- sprite->pos2.y = zero;
- sprite->data[0] = zero;
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CBA28(struct Sprite* sprite)
-{
- s16 e = sub_8077ABC(gBattleAnimBankTarget, 1);
- if (GetBankSide(gBattleAnimBankTarget) == 0)
- {
- sprite->data[6] = 0;
- sprite->data[7] = e + 10;
- sub_80CB7EC(sprite, 0x28);
- sprite->data[3] = 3;
- sprite->data[4] = 0x3C;
- sprite->callback = sub_80CB8E8;
- }
- else
- {
- sprite->data[6] = 255;
- sprite->data[7] = e + 10;
- if (NotInBattle())
- sprite->data[6] = 0;
-
- sub_80CB7EC(sprite, 0x28);
- sprite->data[3] = 3;
- sprite->data[4] = 0x3C;
- sprite->callback = sub_80CB9C4;
- }
-}
-
-void sub_80CBAA4(struct Sprite* sprite)
-{
- if (sprite->data[0] == 0)
- {
- sub_8078764(sprite, 0);
- sprite->data[1] = gBattleAnimArgs[2];
- }
-
- sprite->data[0]++;
- sprite->pos2.y = sprite->data[1] * sprite->data[0];
- if (sprite->animEnded)
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CBAE8(struct Sprite* sprite)
-{
- s16 p1;
- s16 p2;
- sub_8078764(sprite, 0);
- p1 = sub_8077ABC(gBattleAnimBankAttacker, 0);
- p2 = sub_8077ABC(gBattleAnimBankAttacker, 1);
- if ((gBattleAnimBankTarget ^ 2) == gBattleAnimBankAttacker)
- {
- sprite->data[6] = p1;
- sprite->data[7] = p2 + 10;
- sub_80CB7EC(sprite, 0x3c);
- sprite->data[3] = 1;
- }
- else
- {
- sprite->data[6] = p1;
- sprite->data[7] = p2 + 10;
- sub_80CB7EC(sprite, 0x3c);
- sprite->data[3] = 3;
- }
-
- sprite->data[4] = 0x3C;
- sprite->callback = sub_80CBB60;
-}
-
-void sub_80CBB60(struct Sprite* sprite)
-{
- int zero;
- sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
- zero = 0;
- if (sprite->data[0] > 0x7F)
- {
- sprite->data[1]++;
- sprite->data[0] = zero;
- }
-
- sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
- if (sprite->pos2.y == 0)
- {
- PlaySE12WithPanning(0x7D, sub_8076F98(0x3F));
- }
-
- if (sub_80CB814(sprite))
- {
- sprite->pos2.y = 0;
- sprite->data[0] = 0;
- sprite->callback = sub_80CB8B8;
- PlaySE12WithPanning(0x7D, sub_8076F98(-0x40));
- }
-}
-
-void sub_80CBBF0(struct Sprite* sprite)
-{
- int a;
- int b;
-
- if (sprite->data[0] == 0)
- {
- if (!NotInBattle())
- {
- sprite->data[1] = gBattleAnimArgs[1];
- sprite->pos1.x = 0x78;
- }
- else
- {
- a = gBattleAnimArgs[1] - 32;
- if (a < 0)
- b = gBattleAnimArgs[1] + 0xDF;
- else
- b = a;
-
- sprite->data[1] = a - ((b >> 8) << 8);
- sprite->pos1.x = 0x46;
- }
-
- sprite->pos1.y = gBattleAnimArgs[0];
- sprite->data[2] = gBattleAnimArgs[0];
- sprite->data[4] = 20;
- sprite->pos2.x = Cos(sprite->data[1], 0x3C);
- sprite->pos2.y = Sin(sprite->data[1], 20);
- sprite->callback = sub_80CBC8C;
- if (sprite->data[1] > 0 && sprite->data[1] < 0xC0)
- sprite->subpriority = 31;
- else
- sprite->subpriority = 29;
- }
-}
-
-void sub_80CBC8C(struct Sprite* sprite)
-{
- switch (sprite->data[3])
- {
- case 0:
- if (sprite->data[2] > 0x4E)
- {
- sprite->data[3] = 1;
- StartSpriteAffineAnim(sprite, 1);
- break;
- }
- else
- {
- sprite->data[2] += sprite->data[4] / 10;
- sprite->data[4] += 3;
- sprite->pos1.y = sprite->data[2];
- break;
- }
- break;
- case 1:
- if (sprite->data[3] && sprite->affineAnimEnded)
- {
- sprite->data[0] = 0;
- sprite->data[2] = 0;
- sprite->callback = sub_80CBCF8;
- }
- break;
- }
-}
-
-
-
-void sub_80CBCF8(struct Sprite* sprite)
-{
- if (sprite->data[2] == gUnknown_083D680C[sprite->data[0]][1])
- {
- if (gUnknown_083D680C[sprite->data[0]][2] == 0x7F)
- {
- sprite->data[0] = 0;
- sprite->callback = sub_80CBDB0;
- }
-
- sprite->data[2] = 0;
- sprite->data[0]++;
- }
- else
- {
- sprite->data[2]++;
- sprite->data[1] = (gUnknown_083D680C[sprite->data[0]][0] * gUnknown_083D680C[sprite->data[0]][2] + sprite->data[1]) & 0xFF;
- if (!NotInBattle())
- {
- if ((u16)(sprite->data[1] - 1) <= 0xBE)
- {
- sprite->subpriority = 31;
- }
- else
- {
- sprite->subpriority = 29;
- }
- }
-
- sprite->pos2.x = Cos(sprite->data[1], 0x3C);
- sprite->pos2.y = Sin(sprite->data[1], 20);
- }
-}
-
-void sub_80CBDB0(struct Sprite* sprite)
-{
- if (sprite->data[0] > 20)
- move_anim_8072740(sprite);
-
- sprite->invisible = sprite->data[0] % 2;
- sprite->data[0]++;
-}
-
-void sub_80CBDF4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
-
- task->data[4] = sub_8079E90(gBattleAnimBankTarget) - 1;
- task->data[6] = sub_8077ABC(gBattleAnimBankTarget, 2);
- task->data[7] = sub_8077ABC(gBattleAnimBankTarget, 3);
- task->data[10] = sub_807A100(gBattleAnimBankTarget, 1);
- task->data[11] = sub_807A100(gBattleAnimBankTarget, 0);
- task->data[5] = (GetBankSide(gBattleAnimBankTarget) == 1) ? 1 : -1;
- task->data[9] = 0x38 - (task->data[5] * 64);
- task->data[8] = task->data[7] - task->data[9] + task->data[6];
- task->data[2] = CreateSprite(&gSpriteTemplate_83D6884, task->data[8], task->data[9], task->data[4]);
- if (task->data[2] == 0x40)
- DestroyAnimVisualTask(taskId);
-
- gSprites[task->data[2]].data[0] = 10;
- gSprites[task->data[2]].data[1] = task->data[8];
- gSprites[task->data[2]].data[2] = task->data[6] - (task->data[10] / 2 + 10) * task->data[5];
- gSprites[task->data[2]].data[3] = task->data[9];
- gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5];
- gSprites[task->data[2]].data[5] = sub_80CC338(&gSprites[task->data[2]]);
- sub_80786EC(&gSprites[task->data[2]]);
- task->func = sub_80CBF5C;
-}
-
-void sub_80CBF5C(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- struct Sprite* sprite = &gSprites[task->data[2]];
- int a = task->data[0];
- switch (a)
- {
- case 4:
- sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
- {
- break;
- }
- else
- {
- task->data[15] = 5;
- task->data[0] = 0xFF;
- }
- break;
- case 8:
- sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
- {
- break;
- }
- else
- {
- task->data[15] = 9;
- task->data[0] = 0xFF;
- }
- break;
- case 0:
- sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
- break;
-
- task->data[15] = 1;
- task->data[0] = 0xFF;
- break;
- case 1:
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
- sprite->data[0] = 10;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = task->data[6];
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = task->data[7];
- sprite->data[5] = sub_80CC338(sprite);
- task->data[4] += 2;
- task->data[3] = a;
- sprite->subpriority = task->data[4];
- StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
- task->data[0]++;
- break;
- case 2:
- sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
- break;
-
- task->data[15] = 3;
- task->data[0] = 0xFF;
- break;
- case 3:
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
- sprite->data[0] = 10;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = task->data[7] - ((task->data[11] / 2) + 10) * task->data[5];
- sprite->data[5] = sub_80CC338(sprite);
- task->data[3] = 2;
- sprite->subpriority = task->data[4];
- StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
- task->data[0]++;
- break;
- case 5:
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
- sprite->data[0] = 10;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = task->data[6] + ((task->data[10] / 2) + 10) * task->data[5];
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
- sprite->data[5] = sub_80CC338(sprite);
- task->data[4] -= 2;
- task->data[3] = 3;
- sprite->subpriority = task->data[4];
- StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
- task->data[0]++;
- break;
- case 6:
- sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
- break;
-
- task->data[15] = 7;
- task->data[0] = 0xFF;
- break;
- case 7:
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
- sprite->data[0] = 10;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = task->data[6];
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = task->data[7];
- sprite->data[5] = sub_80CC338(sprite);
- task->data[4] += 2;
- task->data[3] = 4;
- sprite->subpriority = task->data[4];
- StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
- task->data[0]++;
- break;
- case 9:
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
- sprite->data[0] = 10;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
- sprite->data[5] = sub_80CC338(sprite);
- task->data[3] = 5;
- sprite->subpriority = task->data[4];
- StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
- task->data[0]++;
- break;
- case 10:
- sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
- {
- break;
- }
- else
- {
- task->data[15] = 11;
- task->data[0] = 0xFF;
- }
- break;
- case 11:
- {
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
- sprite->data[0] = 10;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = task->data[8];
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = task->data[9];
- sprite->data[5] = sub_80CC338(sprite);
- task->data[4] -= 2;
- task->data[3] = 6;
- sprite->subpriority = task->data[4];
- StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
- task->data[0]++;
- break;
- }
- case 12:
- sub_80CC358(task, taskId);
- if (sub_8078718(sprite) != 0)
- {
- DestroySprite(sprite);
- task->data[0]++;
- }
- break;
- case 13:
- if (task->data[12] == 0)
- {
- DestroyAnimVisualTask(taskId);
- }
- break;
- case 255:
- task->data[1]++;
- if (task->data[1] > 5)
- {
- task->data[1] = 0;
- task->data[0] = task->data[15];
- }
- break;
- }
-}
-
-s16 sub_80CC338(struct Sprite* sprite)
-{
- s16 var = 8;
- if (sprite->data[4] < sprite->pos1.y)
- var = -var;
-
- return var;
-}
-
-void sub_80CC358(struct Task* task, u8 taskId)
-{
- task->data[14]++;
- if (task->data[14] > 0)
- {
- u8 spriteId;
- s16 spriteX;
- s16 spriteY;
- task->data[14] = 0;
- spriteX = gSprites[task->data[2]].pos1.x + gSprites[task->data[2]].pos2.x;
- spriteY = gSprites[task->data[2]].pos1.y + gSprites[task->data[2]].pos2.y;
- spriteId = CreateSprite(&gSpriteTemplate_83D6884, spriteX, spriteY, task->data[4]);
- if (spriteId != 0x40)
- {
- gSprites[spriteId].data[6] = taskId;
- gSprites[spriteId].data[7] = 12;
- gTasks[taskId].data[12]++;
- gSprites[spriteId].data[0] = task->data[13] & 1;
- gTasks[taskId].data[13]++;
- StartSpriteAnim(&gSprites[spriteId], task->data[3]);
- gSprites[spriteId].subpriority = task->data[4];
- gSprites[spriteId].callback = sub_80CC408;
- }
- }
-}
-
-void sub_80CC408(struct Sprite* sprite)
-{
- sprite->data[0]++;
- if (sprite->data[0] > 1)
- {
- sprite->data[0] = 0;
- sprite->invisible ^= 1;
- sprite->data[1]++;
- if (sprite->data[1] > 8)
- {
- gTasks[sprite->data[6]].data[sprite->data[7]]--;
- DestroySprite(sprite);
- }
- }
-}
-
-void sub_80CC474(struct Sprite* sprite)
-{
- u8 bank;
- if (!gBattleAnimArgs[6])
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- if (GetBankSide(bank) != 0)
- {
- sprite->data[4] = 0;
- sprite->data[2] = gBattleAnimArgs[3];
- sprite->pos1.x = 0xFFF0;
- }
- else
- {
- sprite->data[4] = 1;
- sprite->data[2] = -gBattleAnimArgs[3];
- sprite->pos1.x = 0x100;
- }
-
- sprite->data[1] = gBattleAnimArgs[1];
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[3] = gBattleAnimArgs[4];
- switch (gBattleAnimArgs[5])
- {
- case 0:
- sprite->pos1.y = gBattleAnimArgs[0];
- sprite->oam.priority = sub_8079ED4(bank);
- break;
- case 1:
- sprite->pos1.y = gBattleAnimArgs[0];
- sprite->oam.priority = sub_8079ED4(bank) + 1;
- break;
- case 2:
- sprite->pos1.y = sub_8077ABC(bank, 3) + gBattleAnimArgs[0];
- sprite->oam.priority = sub_8079ED4(bank);
- break;
- case 3:
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[0];
- GetAnimBankSpriteId(1);
- sprite->oam.priority = sub_8079ED4(bank) + 1;
- break;
- }
-
- sprite->callback = sub_80CC580;
-}
-
-void sub_80CC580(struct Sprite* sprite)
-{
- int a = sprite->data[7];
- sprite->data[7]++;
- sprite->pos2.y = (sprite->data[1] * gSineTable[sprite->data[0]]) >> 8;
- sprite->pos2.x = sprite->data[2] * a;
- sprite->data[0] = (sprite->data[3] * a) & 0xFF;
- if (sprite->data[4] == 0)
- {
- if (sprite->pos2.x + sprite->pos1.x <= 0xF7)
- return;
- }
- else
- {
- if (sprite->pos2.x + sprite->pos1.x > -16)
- return;
- }
-
- move_anim_8074EE0(sprite);
-}
-
-void sub_80CC5F8(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- switch (task->data[0])
- {
- case 0:
- task->data[8] = IndexOfSpritePaletteTag(0x274f) * 16 + 256;
- task->data[12] = IndexOfSpritePaletteTag(0x27b0) * 16 + 256;
- task->data[0]++;
- break;
- case 1:
- task->data[9]++;
- if (task->data[9] >= 0)
- {
- task->data[9] = 0;
- BlendPalette(task->data[8], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]);
- BlendPalette(task->data[12], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]);
- task->data[10]++;
- if (task->data[10] == 17)
- {
- task->data[10] = 0;
- task->data[11]++;
- if (task->data[11] == 7)
- task->data[11] = 0;
- }
- }
- break;
- }
-
- if (gBattleAnimArgs[7] == -1)
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80CC6CC(struct Sprite* sprite)
-{
- u8 a;
- u8 b;
- u16 c;
- u16 x;
- u16 y;
-
- if (gBattleAnimArgs[4] == 0)
- {
- move_anim_8072740(sprite);
- }
- else
- {
- if (gBattleAnimArgs[0] == 0)
- {
- a = sub_8077ABC(gBattleAnimBankAttacker, 2);
- b = sub_8077ABC(gBattleAnimBankAttacker, 3);
- }
- else
- {
- a = sub_8077ABC(gBattleAnimBankTarget, 2);
- b = sub_8077ABC(gBattleAnimBankTarget, 3);
- }
-
- sprite->data[0] = gBattleAnimArgs[4];
- if (gBattleAnimArgs[1] == 0)
- {
- sprite->pos1.x = gBattleAnimArgs[2] + a;
- sprite->pos1.y = gBattleAnimArgs[3] + b;
- sprite->data[5] = a;
- sprite->data[6] = b;
- }
- else
- {
- sprite->pos1.x = a;
- sprite->pos1.y = b;
- sprite->data[5] = gBattleAnimArgs[2] + a;
- sprite->data[6] = gBattleAnimArgs[3] + b;
- }
-
- x = sprite->pos1.x;
- sprite->data[1] = x * 16;
- y = sprite->pos1.y;
- sprite->data[2] = y * 16;
- sprite->data[3] = (sprite->data[5] - sprite->pos1.x) * 16 / gBattleAnimArgs[4];
- sprite->data[4] = (sprite->data[6] - sprite->pos1.y) * 16 / gBattleAnimArgs[4];
- c = sub_80790F0(sprite->data[5] - x, sprite->data[6] - y);
- if (NotInBattle())
- c -= 0x8000;
-
- sub_8078FDC(sprite, 0, 0x100, 0x100, c);
- sprite->callback = sub_80CC7D4;
- }
-}
-
-void sub_80CC7D4(struct Sprite* sprite)
-{
- if (sprite->data[0])
- {
- sprite->data[1] += sprite->data[3];
- sprite->data[2] += sprite->data[4];
- sprite->pos1.x = sprite->data[1] >> 4 ;
- sprite->pos1.y = sprite->data[2] >> 4 ;
- sprite->data[0]--;
- }
- else
- {
- move_anim_8074EE0(sprite);
- }
-}
-
-void sub_80CC810(struct Sprite* sprite)
-{
- if (sprite->animEnded)
- move_anim_8072740(sprite);
-}
-
-void sub_80CC82C(struct Sprite* sprite)
-{
- if (GetBankSide(gBattleAnimBankAttacker) != 0)
- {
- sprite->pos1.x -= gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- }
- else
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- }
-
- sprite->callback = sub_8078600;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-void sub_80CC884(struct Sprite* sprite)
-{
- if (GetBankSide(gBattleAnimBankAttacker) == 0)
- StartSpriteAnim(sprite, 1);
-
- sprite->callback = sub_80CC810;
- sub_807867C(sprite, gBattleAnimArgs[0]);
- sprite->pos1.y += gBattleAnimArgs[1];
-}
-
-void sub_80CC8C8(struct Sprite* sprite)
-{
- sprite->pos1.x += gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[1] = gBattleAnimArgs[3];
- sprite->data[3] = gBattleAnimArgs[4];
- sprite->data[5] = gBattleAnimArgs[5];
- StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]);
- StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
- sprite->callback = sub_8078504;
-}
-
-void sub_80CC914(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 1);
- if (GetBankSide(gBattleAnimBankTarget) == 0)
- sprite->pos1.y += 8;
-
- sprite->callback = sub_80CCB00;
- if (gBattleAnimArgs[2] == 0)
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- }
- else
- {
- sprite->pos1.x -= gBattleAnimArgs[0];
- sprite->hFlip = 1;
- }
-
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[1] -= 0x400;
- sprite->data[2] += 0x400;
- sprite->data[5] = gBattleAnimArgs[2];
- if (sprite->data[5] == 1)
- sprite->data[1] = -sprite->data[1];
-}
-
-void sub_80CC9BC(struct Sprite* sprite)
-{
- u8 a;
- u8 b;
- switch (gBattleAnimArgs[3])
- {
- case 1:
- a = sub_8077ABC(gBattleAnimBankTarget ^ 2, 0);
- b = sub_8077ABC(gBattleAnimBankTarget ^ 2, 1);
- break;
- case 2:
- a = sub_8077ABC(gBattleAnimBankTarget, 0);
- b = sub_8077ABC(gBattleAnimBankTarget, 1);
- if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2))
- {
- a = (sub_8077ABC(gBattleAnimBankTarget ^ 2, 0) + a) / 2;
- b = (sub_8077ABC(gBattleAnimBankTarget ^ 2, 1) + b) / 2;
- }
- break;
- case 0:
- default:
- a = sub_8077ABC(gBattleAnimBankTarget, 0);
- b = sub_8077ABC(gBattleAnimBankTarget, 1);
- break;
- }
-
- sprite->pos1.x = a;
- sprite->pos1.y = b;
- if (GetBankSide(gBattleAnimBankTarget) == 0)
- sprite->pos1.y += 8;
-
- sprite->callback = sub_80CCB00;
- if (gBattleAnimArgs[2] == 0)
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- }
- else
- {
- sprite->pos1.x -= gBattleAnimArgs[0];
- sprite->hFlip = 1;
- }
-
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[1] -= 0x400;
- sprite->data[2] += 0x400;
- sprite->data[5] = gBattleAnimArgs[2];
- if (sprite->data[5] == 1)
- sprite->data[1] = -sprite->data[1];
-}
-
-void sub_80CCB00(struct Sprite* sprite)
-{
- sprite->data[3] += sprite->data[1];
- sprite->data[4] += sprite->data[2];
- if (sprite->data[5] == 0)
- sprite->data[1] += 0x18;
- else
- sprite->data[1] -= 0x18;
-
- sprite->data[2] -= 0x18;
- sprite->pos2.x = sprite->data[3] >> 8;
- sprite->pos2.y = sprite->data[4] >> 8;
- sprite->data[0]++;
- if (sprite->data[0] == 20)
- {
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- sprite->data[0] = 3;
- sprite->callback = sub_80782D8;
- }
-}
-
-void unref_sub_80CCB6C(struct Sprite* sprite)
-{
- if (sprite->data[2] > 1)
- {
- if (sprite->data[3] & 1)
- {
- sprite->invisible = 0;
- gSprites[sprite->data[0]].invisible = 0;
- gSprites[sprite->data[1]].invisible = 0;
- }
- else
- {
- sprite->invisible = 1;
- gSprites[sprite->data[0]].invisible = 1;
- gSprites[sprite->data[1]].invisible = 1;
- }
-
- sprite->data[2] = 0;
- sprite->data[3]++;
- }
- else
- {
- sprite->data[2]++;
- }
-
- if (sprite->data[3] == 10)
- {
- DestroySprite(&gSprites[sprite->data[0]]);
- DestroySprite(&gSprites[sprite->data[1]]);
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CCC50(struct Sprite* sprite)
-{
- sprite->data[0] = gBattleAnimArgs[2];
- if (GetBankSide(gBattleAnimBankAttacker) != 0)
- sprite->pos1.x -= gBattleAnimArgs[0];
- else
- sprite->pos1.x += gBattleAnimArgs[0];
-
- StartSpriteAnim(sprite, gBattleAnimArgs[5]);
- sprite->data[1] = -gBattleAnimArgs[3];
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[3] = gBattleAnimArgs[4];
- sprite->callback = sub_80CCCB4;
- sub_80CCCB4(sprite);
-}
-
-void sub_80CCCB4(struct Sprite* sprite)
-{
- sprite->pos2.x = Cos(sprite->data[0], 100);
- sprite->pos2.y = Sin(sprite->data[0], 20);
- if (sprite->data[0] <= 0x7F)
- sprite->subpriority = 0;
- else
- sprite->subpriority = 14;
-
- sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;
- sprite->data[5] += 0x82;
- sprite->pos2.y += sprite->data[5] >> 8;
- sprite->data[2]++;
- if (sprite->data[2] == sprite->data[3])
- move_anim_8072740(sprite);
-}
-
-void sub_80CCD24(struct Sprite* sprite)
-{
- if (NotInBattle() != 0)
- {
- gBattleAnimArgs[1] += 8;
- }
-
- sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[0];
- sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[1];
- if (GetBankSide(gBattleAnimBankAttacker) == 0 || NotInBattle())
- sprite->oam.priority = sub_8079ED4(gBattleAnimBankAttacker) + 1;
- else
- sprite->oam.priority = sub_8079ED4(gBattleAnimBankAttacker);
-
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[2] = (IndexOfSpritePaletteTag(0x2828) << 4) + 0x100;
- sprite->data[7] = 16;
- REG_BLDCNT = 0x3F40;
- REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);
- sprite->callback = sub_80CCE0C;
-}
-
-void sub_80CCE0C(struct Sprite* sprite)
-{
- int a;
- int i;
- sprite->data[5] += 0x60;
- sprite->pos2.x = -(sprite->data[5] >> 8);
- sprite->data[1]++;
- if (sprite->data[1] > 1)
- {
- sprite->data[1] = 0;
- a = gPlttBufferFaded[sprite->data[2] + 1];
- i = 0;
- do
- {
- gPlttBufferFaded[sprite->data[2] + ++i] = gPlttBufferFaded[sprite->data[2] + i + 1];
- } while ( i <= 5 );
-
- gPlttBufferFaded[sprite->data[2] + 7] = a;
- }
-
- if (sprite->data[7] > 6 && sprite->data[0] >0 && ++sprite->data[6] > 1)
- {
- sprite->data[6] = 0;
- sprite->data[7] -= 1;
- REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);;
- }
-
- if (sprite->data[0] >0)
- {
- sprite->data[0] -= 1;
- }
- else if (++sprite->data[6] > 1)
- {
- sprite->data[6] = 0;
- sprite->data[7]++;
- REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);
- if (sprite->data[7] == 16)
- {
- sprite->invisible = 1;
- sprite->callback = sub_807861C;
- }
- }
-}
-
-void sub_80CCF04(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + 0xFFE8;
- sprite->data[0] = 0;
- sprite->data[1] = 0;
- sprite->data[2] = 0;
- sprite->data[3] = 0;
- sprite->data[4] = 0;
- sprite->data[6] = 0;
- sprite->data[7] = 16;
- REG_BLDCNT = 0x3F40;
- REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
- sprite->callback = sub_80CCF70;
-}
-
-void sub_80CCF70(struct Sprite* sprite)
-{
- switch (sprite->data[0])
- {
- case 0:
- if (++sprite->data[2] > 0)
- {
- sprite->data[2] = 0;
- if (((++sprite->data[1]) & 1) != 0)
- {
- if (sprite->data[6] <= 15)
- sprite->data[6]++;
- }
- else if (sprite->data[7] > 0)
- sprite->data[7]--;
-
- REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
- if (sprite->data[6] == 16 && sprite->data[7] == 0)
- {
- sprite->data[1] = 0;
- sprite->data[0]++;
- }
- }
- break;
- case 1:
- if (++sprite->data[1] > 8)
- {
- sprite->data[1] = 0;
- StartSpriteAffineAnim(sprite, 1);
- sprite->data[0]++;
- }
- break;
- case 2:
- sub_80CD0CC(sprite, 16, 4);
- if (++sprite->data[1] > 2)
- {
- sprite->data[1] = 0;
- sprite->pos1.y++;
- }
-
- if (++sprite->data[2] <= 29)
- break;
-
- if (sprite->data[2] & 1)
- {
- if (sprite->data[6] > 0)
- sprite->data[6]--;
- }
- else if (sprite->data[7] <= 15)
- {
- sprite->data[7]++;
- }
-
- REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
- if (sprite->data[6] == 0 && sprite->data[7] == 16)
- {
- sprite->data[1] = 0;
- sprite->data[2] = 0;
- sprite->data[0]++;
- }
- break;
- case 3:
- sprite->invisible = 1;
- sprite->data[0]++;
- break;
- case 4:
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- move_anim_8072740(sprite);
- break;
- }
-}
-
-void sub_80CD0CC(struct Sprite* sprite, int unk1, int unk2)
-{
- if (sprite->data[3] <= 11)
- sprite->data[4] += 2;
-
- if ((u16)(sprite->data[3] - 0x12) <= 0x17)
- sprite->data[4] -= 2;
-
- if ((sprite->data[3]) > 0x2F)
- sprite->data[4] += 2;
-
- sprite->pos2.x = sprite->data[4] / 9;
- sprite->pos2.y = sprite->data[4] / 14;
- if (sprite->pos2.y < 0)
- sprite->pos2.y *= -1;
-
- sprite->data[3]++;
- if (sprite->data[3] > 0x3B)
- sprite->data[3] = 0;
-}
-
-void sub_80CD140(struct Sprite* sprite)
-{
- if (!gBattleAnimArgs[2])
- sub_8078650(sprite);
-
- sub_807867C(sprite, gBattleAnimArgs[0]);
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[0] = gBattleAnimArgs[5];
- sprite->data[1] = gBattleAnimArgs[3];
- sprite->data[2] = gBattleAnimArgs[4];
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- sprite->callback = sub_8078394;
-}
-
-void sub_80CD190(struct Sprite* sprite)
-{
- u8 bank;
- if (!gBattleAnimArgs[2])
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
- {
- sub_807A3FC(bank, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y);
- sub_807867C(sprite, gBattleAnimArgs[0]);
- sprite->pos1.y += gBattleAnimArgs[1];
- }
- else
- {
- if (!gBattleAnimArgs[6])
- {
- sprite->pos1.x = sub_8077ABC(bank, 0);
- sprite->pos1.y = sub_8077ABC(bank, 1) + gBattleAnimArgs[1];
- }
- else
- {
- sprite->pos1.x = sub_8077ABC(bank, 2);
- sprite->pos1.y = sub_8077ABC(bank, 3) + gBattleAnimArgs[1];
- }
-
- sub_807867C(sprite, gBattleAnimArgs[0]);
- }
-
- sprite->data[0] = gBattleAnimArgs[5];
- sprite->data[1] = gBattleAnimArgs[3];
- sprite->data[2] = gBattleAnimArgs[4];
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- sprite->callback = sub_8078394;
-}
-
-void sub_80CD274(struct Sprite* sprite)
-{
- sub_8078650(sprite);
- if (GetBankSide(gBattleAnimBankAttacker) == 0)
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- }
- else
- {
- sprite->pos1.x -= gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- StartSpriteAnim(sprite, 1);
- }
-
- sprite->callback = sub_80CD2D4;
-}
-
-void sub_80CD2D4(struct Sprite* sprite)
-{
- if (++sprite->data[0] > 30)
- {
- sprite->pos2.y = (30 - sprite->data[0]) / 3;
- sprite->pos2.x = Sin(sprite->data[1] * 4, 3);
- sprite->data[1]++;
- }
-
- if (sprite->animEnded)
- move_anim_8072740(sprite);
-}
-
-void sub_80CD328(struct Sprite* sprite)
-{
- sub_8078650(sprite);
- if (GetBankSide(gBattleAnimBankAttacker) == 0)
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[3] = 1;
- }
- else
- {
- sprite->pos1.x -= gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[3] = 0xFFFF;
- StartSpriteAffineAnim(sprite, 1);
- }
-
- sprite->callback = sub_80CD394;
-}
-
-void sub_80CD394(struct Sprite* sprite)
-{
- sprite->pos2.y = -(sprite->data[0] / 0x28);
- sprite->pos2.x = sprite->data[4] / 10;
- sprite->data[4] += sprite->data[3] * 2;
- sprite->data[0] += sprite->data[1];
- if (++sprite->data[1] > 0x3C)
- move_anim_8074EE0(sprite);
-}
-
-void sub_80CD3E0(struct Sprite* sprite)
-{
- sprite->pos1.x -= 32;
- sprite->pos1.y -= 32;
- sprite->data[0] = 20;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80CD408);
-}
-
-void sub_80CD408(struct Sprite* sprite)
-{
- switch (sprite->data[5] & 1)
- {
- case 0:
- sprite->data[0] = 1;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80CD408);
- break;
- case 1:
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
- sprite->data[0] = 8;
- sprite->data[2] = sprite->pos1.x + gUnknown_083D6DDC[sprite->data[5] >> 8][0];
- sprite->data[4] = sprite->pos1.y + gUnknown_083D6DDC[sprite->data[5] >> 8][1];
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, sub_80CD4B8);
- sprite->data[5] += 0x100;
- PlaySE12WithPanning(0xD2, sub_8076F98(0x3F));
- break;
- }
-
- sprite->data[5] ^= 1;
-}
-
-void sub_80CD4B8(struct Sprite* sprite)
-{
- if ((sprite->data[5] >> 8) == 4)
- {
- sprite->data[0] = 10;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80CD4EC);
- }
- else
- {
- sprite->callback = sub_80CD408;
- }
-}
-
-void sub_80CD4EC(struct Sprite* sprite)
-{
- s16 a;
- s16 b;
- if (sprite->oam.affineParam == 0)
- {
- sprite->data[0] = 3;
- sprite->data[1] = 0;
- sprite->data[2] = 0;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80CD5A8);
- }
- else
- {
- switch (sprite->oam.affineParam)
- {
- case 1:
- a = -8;
- b = -8;
- break;
- case 2:
- a = -8;
- b = 8;
- break;
- case 3:
- a = 8;
- b = -8;
- break;
- default:
- a = 8;
- b = 8;
- break;
- }
-
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
- sprite->data[0] = 6;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + a;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + b;
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, sub_80CD654);
- }
-}
-
-void sub_80CD5A8(struct Sprite* sprite)
-{
- if (sprite->data[2] == 0)
- {
- if ((sprite->data[1] += 3) > 16)
- sprite->data[1] = 16;
- }
- else if ((sprite->data[1] -= 3) < 0)
- {
- sprite->data[1] = 0;
- }
-
- BlendPalettes(sub_80791A8(1, 1, 1, 1, 1, 0, 0), sprite->data[1], 0x7FFF);
- if (sprite->data[1] == 16)
- {
- int pal;
- sprite->data[2]++;
- pal = sprite->oam.paletteNum;
- LoadPalette(&gPlttBufferUnfaded[0x108 + pal * 16], pal * 16 | 0x101, 4);
- PlaySE12WithPanning(0xC0, sub_8076F98(0x3F));
- }
- else if (sprite->data[1] == 0)
- {
- sprite->callback = sub_80CD654;
- }
-}
-
-void sub_80CD654(struct Sprite* sprite)
-{
- if ((u16)gBattleAnimArgs[7] == 0xFFFF)
- {
- sprite->data[1] = 0;
- sprite->data[0] = 0;
- sprite->callback = sub_80CD67C;
- }
-}
-
-void sub_80CD67C(struct Sprite* sprite)
-{
- if (sprite->data[0] % 3 == 0)
- {
- sprite->data[1]++;
- sprite->invisible ^= 1;
- }
-
- sprite->data[0]++;
- if (sprite->data[1] == 8)
- move_anim_8072740(sprite);
-}
-
-void sub_80CD6CC(struct Sprite* sprite)
-{
- sprite->oam.affineParam = gBattleAnimArgs[0];
- if ((s16)sprite->oam.affineParam == 1)
- {
- sprite->pos1.x -= 0x18;
- sprite->pos1.y -= 0x18;
- }
- else if ((s16)sprite->oam.affineParam == 2)
- {
- sprite->pos1.x -= 0x18;
- sprite->pos1.y += 0x18;
- sprite->oam.matrixNum = 16;
- }
- else if ((s16)sprite->oam.affineParam == 3)
- {
- sprite->pos1.x += 0x18;
- sprite->pos1.y -= 0x18;
- sprite->oam.matrixNum = 8;
- }
- else
- {
- sprite->pos1.x += 0x18;
- sprite->pos1.y += 0x18;
- sprite->oam.matrixNum = 24;
- }
-
- sprite->oam.tileNum = (sprite->oam.tileNum + 16);
- sprite->callback = sub_80CD3E0;
- sub_80CD3E0(sprite);
-}
-
-void sub_80CD774(struct Sprite* sprite)
-{
- sprite->invisible = 1;
- sprite->data[0] = 0;
- switch (gBattleAnimArgs[0])
- {
- case 0:
- sprite->callback = sub_80CD7CC;
- break;
- case 1:
- sprite->callback = sub_80CD8A8;
- break;
- case 2:
- sprite->callback = sub_80CD8F8;
- break;
- default:
- sprite->callback = sub_80CD9B8;
- break;
- }
-}
-
-void sub_80CD7CC(struct Sprite* sprite)
-{
- sprite->data[0] = 6;
- sprite->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? 2 : -2;
- sprite->data[2] = 0;
- sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
- StoreSpriteCallbackInData(sprite, sub_80CD81C);
- sprite->callback = sub_8078458;
-}
-
-void sub_80CD81C(struct Sprite* sprite)
-{
- if (sprite->data[0] == 0)
- {
- sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
- sub_8078E70(sprite->data[3], 0);
- sprite->data[4] = (sprite->data[6] = GetBankSide(gBattleAnimBankAttacker)) ? 0x300 : 0xFFFFFD00;
- sprite->data[5] = 0;
- }
-
- sprite->data[5] += sprite->data[4];
- obj_id_set_rotscale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
- sub_8078F9C(sprite->data[3]);
- if (++sprite->data[0] > 3)
- {
- sprite->data[0] = 0;
- sprite->callback = sub_80CD9B8;
- }
-}
-
-void sub_80CD8A8(struct Sprite* sprite)
-{
- sprite->data[0] = 4;
- sprite->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? -3 : 3;
- sprite->data[2] = 0;
- sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
- StoreSpriteCallbackInData(sprite, sub_80CD9B8);
- sprite->callback = sub_8078458;
-}
-
-void sub_80CD8F8(struct Sprite* sprite)
-{
- if (++sprite->data[0] > 8)
- {
- sprite->data[0] = 0;
- sprite->callback = sub_80CD91C;
- }
-}
-
-void sub_80CD91C(struct Sprite* sprite)
-{
- if (sprite->data[0] == 0)
- {
- sprite->data[3] = gObjectBankIDs[gBattleAnimBankAttacker];
- sprite->data[6] = GetBankSide(gBattleAnimBankAttacker);
- if (GetBankSide(gBattleAnimBankAttacker))
- {
- sprite->data[4] = 0xFC00;
- sprite->data[5] = 0xC00;
- }
- else
- {
- sprite->data[4] = 0x400;
- sprite->data[5] = 0xF400;
- }
- }
-
- sprite->data[5] += sprite->data[4];
- obj_id_set_rotscale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
- sub_8078F9C(sprite->data[3]);
- if (++sprite->data[0] > 2)
- {
- sub_8078F40(sprite->data[3]);
- sprite->callback = sub_80CD9B8;
- }
-}
-
-void sub_80CD9B8(struct Sprite* sprite)
-{
- move_anim_8072740(sprite);
-}
-
-void sub_80CD9C4(struct Sprite* sprite)
-{
- sprite->data[0] = 0;
- sprite->callback = sub_80CD9D4;
-}
-
-void sub_80CD9D4(struct Sprite* sprite)
-{
- switch (sprite->data[0])
- {
- case 0:
- sprite->data[1] = 0;
- sprite->data[2] = gObjectBankIDs[gBattleAnimBankAttacker];
- sprite->data[3] = GetBankSide(gBattleAnimBankAttacker);
- sprite->data[4] = (sprite->data[3] != 0) ? 0x200 : -0x200;
- sprite->data[5] = 0;
- sub_8078E70(sprite->data[2], 0);
- sprite->data[0]++;
- case 1:
- sprite->data[5] += sprite->data[4];
- obj_id_set_rotscale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
- sub_8078F9C(sprite->data[2]);
- if (++sprite->data[1] > 3)
- {
- sprite->data[1] = 0;
- sprite->data[4] *= -1;
- sprite->data[0]++;
- }
- break;
- case 2:
- sprite->data[5] += sprite->data[4];
- obj_id_set_rotscale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
- sub_8078F9C(sprite->data[2]);
- if (++sprite->data[1] > 3)
- {
- sub_8078F40(sprite->data[2]);
- move_anim_8072740(sprite);
- }
- break;
- }
-}
-
-void sub_80CDAC8(u8 taskId)
-{ u8 a;
- gTasks[taskId].data[0] = gObjectBankIDs[gBattleAnimBankAttacker];
- a = GetBankSide(gBattleAnimBankAttacker);
- gTasks[taskId].data[1] = a;
- gTasks[taskId].data[2] = 0;
- switch (gBattleAnimArgs[0])
- {
- default:
- DestroyAnimVisualTask(taskId);
- break;
- case 0:
- gTasks[taskId].data[2] = 0;
- gTasks[taskId].data[3] = 8;
- gTasks[taskId].data[4] = 0;
- gTasks[taskId].data[5] = 3;
- if (a == 0)
- gTasks[taskId].data[5] *= -1;
-
- gTasks[taskId].func = sub_80CDB60;
- break;
- case 1:
- gTasks[taskId].data[3] = 8;
- gTasks[taskId].data[4] = 0x600;
- gTasks[taskId].data[5] = 0xC0;
- if (a == 0)
- {
- gTasks[taskId].data[4] = -gTasks[taskId].data[4];
- gTasks[taskId].data[5] = -gTasks[taskId].data[5];
- }
-
- gTasks[taskId].func = sub_80CDD20;
- break;
- }
-}
-
-void sub_80CDB60(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- switch (task->data[2])
- {
- case 0:
- if (task->data[3])
- {
- task->data[4] += task->data[5];
- gSprites[task->data[0]].pos2.x = task->data[4];
- task->data[3]--;
- }
- else
- {
- task->data[3] = 8;
- task->data[4] = 0;
- task->data[5] = (task->data[1] == 0) ? -0xC0 : 0xC0;
- sub_8078E70(task->data[0], 0);
- task->data[2]++;
- }
- break;
- case 1:
- if (task->data[3])
- {
- task->data[4] += task->data[5];
- obj_id_set_rotscale(task->data[0], 0x100, 0x100, task->data[4]);
- sub_8078F9C(task->data[0]);
- task->data[3]--;
- }
- else
- {
- task->data[3] = 8;
- task->data[4] = gSprites[task->data[0]].pos2.x;
- task->data[5] = (task->data[1] == 0) ? 0x2 : -0x2;
- task->data[6] = 1;
- task->data[2]++;
- }
- break;
- case 2:
- if (task->data[3])
- {
- if (task->data[6])
- {
- task->data[6]--;
- }
- else
- {
- if (task->data[3] & 1)
- gSprites[task->data[0]].pos2.x = task->data[4] + task->data[5];
- else
- gSprites[task->data[0]].pos2.x = task->data[4] - task->data[5];
-
- task->data[6] = 1;
- task->data[3]--;
- }
- }
- else
- {
- gSprites[task->data[0]].pos2.x = task->data[4];
- task->data[3] = 12;
- task->data[2]++;
- }
- break;
- case 3:
- if (task->data[3])
- {
- task->data[3]--;
- }
- else
- {
- task->data[3] = 3;
- task->data[4] = gSprites[task->data[0]].pos2.x;
- task->data[5] = (task->data[1] == 0) ? 8 : -8;
- task->data[2]++;
- }
- break;
- case 4:
- if (task->data[3])
- {
- task->data[4] += task->data[5];
- gSprites[task->data[0]].pos2.x = task->data[4];
- task->data[3]--;
- }
- else
- {
- DestroyAnimVisualTask(taskId);
- }
- break;
- }
-}
-
-void sub_80CDD20(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (task->data[3])
- {
- task->data[4] -= task->data[5];
- obj_id_set_rotscale(task->data[0], 0x100, 0x100, task->data[4]);
- sub_8078F9C(task->data[0]);
- task->data[3]--;
- }
- else
- {
- sub_8078F40(task->data[0]);
- DestroyAnimVisualTask(taskId);
- }
-}
-
-void sub_80CDD74(struct Sprite* sprite)
-{
- if (gBattleAnimArgs[0] == 0)
- {
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[1];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
- }
- else
- {
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[1];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[2];
- }
-
- sprite->data[0] = 0;
- sprite->data[1] = 0;
- StoreSpriteCallbackInData(sprite, sub_80CDEC0);
- sprite->callback = sub_8078600;
-}
-
-void sub_80CDDDC(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + 0xFFD0;
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3);
- StoreSpriteCallbackInData(sprite, sub_80CDE78);
- sprite->callback = sub_8078600;
-}
-
-void sub_80CDE24(struct Sprite* sprite)
-{
- sprite->pos1.x = sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + 0xFFD0 + gBattleAnimArgs[0];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3);
- StartSpriteAnim(sprite, 1);
- sprite->data[0] = 0;
- sprite->data[1] = 0;
- sprite->callback = sub_80CDEC0;
-}
-
-void sub_80CDE78(struct Sprite* sprite)
-{
- if (++sprite->data[0] > 8)
- {
- sprite->data[0] = 12;
- sprite->data[1] = 8;
- sprite->data[2] = 0;
- StoreSpriteCallbackInData(sprite, sub_80CDEB0);
- sprite->callback = sub_8078364;
- }
-}
-
-void sub_80CDEB0(struct Sprite* sprite)
-{
- sprite->data[0] = 0;
- sprite->data[1] = 0;
- sprite->callback = sub_80CDEC0;
-}
-
-void sub_80CDEC0(struct Sprite* sprite)
-{
- if (++sprite->data[0] > 1)
- {
- sprite->data[0] = 0;
- sprite->invisible = !sprite->invisible;
- if (++sprite->data[1] > 8)
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CDF0C(struct Sprite* sprite)
-{
- if (gBattleAnimArgs[0] == 0)
- {
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[1];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[2];
- }
- else
- {
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0) + gBattleAnimArgs[1];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 1) + gBattleAnimArgs[2];
- }
-
- sprite->data[0] = 0;
- sprite->data[1] = gBattleAnimArgs[3];
- sprite->callback = sub_80CDF70;
-}
-
-void sub_80CDF70(struct Sprite* sprite)
-{
- if (++sprite->data[0] > sprite->data[1])
- {
- sprite->data[0] = 0;
- sprite->pos1.y--;
- }
-
- sprite->pos1.y -= sprite->data[0];
- if (sprite->animEnded)
- move_anim_8072740(sprite);
-}
-
-void sub_80CDFB0(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) - 12;
- sprite->data[0] = 0;
- sprite->data[1] = 2;
- sprite->data[2] = 0;
- sprite->data[3] = 0;
- sprite->data[4] = 0;
- sprite->data[5] = sub_8076F98(-0x40);
- sprite->callback = sub_80CE000;
-}
-
-void sub_80CE000(struct Sprite* sprite)
-{
- if (++sprite->data[0] >= sprite->data[1])
- {
- sprite->invisible = !sprite->invisible;
- if (!sprite->invisible)
- {
- sprite->data[4]++;
- if (!(sprite->data[4] & 1))
- PlaySE12WithPanning(SE_W207B, sprite->data[5]);
- }
-
- sprite->data[0] = 0;
- if (++sprite->data[2] > 1)
- {
- sprite->data[2] = 0;
- sprite->data[1]++;
- }
- }
-
- if (sprite->animEnded && sprite->data[1] > 16 && sprite->invisible)
- move_anim_8072740(sprite);
-}
-
-void sub_80CE09C(struct Sprite* sprite)
-{
- if (sprite->data[0] == 0)
- {
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[0];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[1];
- if (NotInBattle())
- sprite->pos1.y += 10;
- sprite->data[0]++;
- }
-
- if ((u16)gBattleAnimArgs[7] == 0xFFFF)
- move_anim_8072740(sprite);
-}
-
-void sub_80CE108(u8 taskId)
-{
- if (gTasks[taskId].data[2] == 1)
- {
- gBattleAnimArgs[7] = 0xFFFF;
- gTasks[taskId].data[2]++;
- }
- else if (gTasks[taskId].data[2] == 2)
- {
- DestroyAnimVisualTask(taskId);
- }
- else
- {
- if (++gTasks[taskId].data[0] == 4)
- {
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1]++;
- REG_BLDALPHA = (gTasks[taskId].data[1] << 8) | (16 - gTasks[taskId].data[1]);
- if (gTasks[taskId].data[1] == 16)
- gTasks[taskId].data[2]++;
- }
- }
-}
-
-void sub_80CE17C(struct Sprite* sprite)
-{
- sub_8078764(sprite, 0);
- sprite->animPaused = 1;
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->callback = sub_80CE1AC;
-}
-
-void sub_80CE1AC(struct Sprite* sprite)
-{
- if (sprite->data[0])
- {
- sprite->data[0]--;
- }
- else
- {
- sprite->animPaused = 0;
- sprite->data[0] = 30;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- }
-}
-
-void sub_80CE210(u8 taskId)
-{
- if (++gTasks[taskId].data[0] == 4)
- {
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1]++;
- REG_BLDALPHA = gTasks[taskId].data[1] | ((16 - gTasks[taskId].data[1]) << 8);
- if (gTasks[taskId].data[1] == 16)
- DestroyAnimVisualTask(taskId);
- }
-}
-
-void unref_sub_80CE260(u8 taskId)
-{
- u8 i;
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- if (gBattleAnimArgs[0] == 1 && GetBankSide(i) == 0)
- sub_8043DB0(gHealthboxIDs[i]);
-
- if (gBattleAnimArgs[1] == 1 && GetBankSide(i) == 1)
- sub_8043DB0(gHealthboxIDs[i]);
- }
-
- DestroyAnimVisualTask(taskId);
-}
-
-void unref_sub_80CE2D4(u8 taskId)
-{
- u8 i;
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- sub_8043DFC(gHealthboxIDs[i]);
- }
-
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80CE30C(struct Sprite* sprite)
-{
- if (NotInBattle())
- {
- sprite->pos1.x = 0x30;
- sprite->pos1.y = 0x28;
- }
- else
- {
- sprite->pos1.x = gBattleAnimArgs[0];
- sprite->pos1.y = gBattleAnimArgs[1];
- }
-
- sprite->oam.shape = 0;
- sprite->oam.size = 3;
- sprite->data[0] = 0;
- sprite->callback = sub_80CE354;
-}
-
-void sub_80CE354(struct Sprite* sprite)
-{
- if (sprite->data[0])
- move_anim_8072740(sprite);
-}
-
-void sub_80CE36C(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[0];
- sprite->pos1.y = gBattleAnimArgs[1];
- sprite->data[0] = 0;
- sprite->data[1] = 0;
- sprite->data[2] = 0;
- sprite->data[3] = 0;
- sprite->data[4] = 1;
- sprite->callback = sub_80CE3B0;
-}
-
-void sub_80CE3B0(struct Sprite* sprite)
-{
- if (++sprite->data[1] > 1)
- {
- sprite->data[1] = 0;
- if (sprite->data[2] <= 0x77)
- {
- sprite->pos1.y++;
- sprite->data[2]++;
- }
- }
-
- if (sprite->data[0])
- move_anim_8072740(sprite);
-}
-
-void sub_80CE3EC(u8 taskId)
-{
- int a = sub_80791A8(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
- int b;
- int c;
- int d;
-
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = 0;
- gTasks[taskId].data[2] = 0;
- gTasks[taskId].data[3] = a;
- gTasks[taskId].data[4] = 0;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[6] = 0;
- gTasks[taskId].data[7] = 13;
- gTasks[taskId].data[8] = 14;
- gTasks[taskId].data[9] = 15;
- b = sub_80792C0(1, 1, 1, 1);
- c = a | b;
- sub_8079BF4(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void*)c);
- b = b | (0x10000 << IndexOfSpritePaletteTag(0x27D2));
- d = IndexOfSpritePaletteTag(0x27D3);
- BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 0x10, 32699);
- gTasks[taskId].func = sub_80CE4D4;
- sub_80CE4D4(taskId);
-}
-
-void sub_80CE4D4(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- switch (task->data[0])
- {
- case 0:
- if (++task->data[1] > 0)
- {
- u16 color;
- u16 bitmask;
- u16 r3;
- u16 i;
- u16 j;
- task->data[1] = 0;
- if (++task->data[2] <= 15)
- {
- u16 red;
- u16 green;
- u16 blue;
- task->data[4] += task->data[7];
- task->data[5] += task->data[8];
- task->data[6] += task->data[9];
- red = task->data[4] >> 3;
- green = task->data[5] >> 3;
- blue = task->data[6] >> 3;
- color = RGB(red, green, blue);
- }
- else
- {
- color = RGB(27, 29, 31);
- task->data[0]++;
- }
-
- bitmask = 1;
- r3 = 0;
- for (i = 0; i <= 15; i++)
- {
- if (task->data[3] & bitmask)
- {
- for (j = 1; j <= 15; j++)
- {
- gPlttBufferFaded[r3 + j] = color;
- }
- }
-
- bitmask <<= 1;
- r3 += 16;
- }
- }
- break;
- case 1:
- if (!gPaletteFade.active)
- {
- u8 spriteId;
- for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++)
- {
- if (gSprites[spriteId].template == &gBattleAnimSpriteTemplate_83D6FC8 || gSprites[spriteId].template == &gBattleAnimSpriteTemplate_83D6FF8)
- gSprites[spriteId].data[0] = 1;
- }
-
- task->data[1] = 0;
- task->data[0]++;
- }
- break;
- case 2:
- if (++task->data[1] > 30)
- {
- BeginNormalPaletteFade((u32)sub_8079BFC(task->data[14], task->data[15]), 0, 16, 0, RGB(27, 29, 31));
- task->data[0]++;
- }
- break;
- case 3:
- if (!gPaletteFade.active)
- DestroyAnimVisualTask(taskId);
- break;
- }
-}
-
-void sub_80CE670(struct Sprite* sprite)
-{
- if (gBattleAnimArgs[2] <= 1)
- gBattleAnimArgs[2] = 2;
-
- if (gBattleAnimArgs[2] > 0x7F)
- gBattleAnimArgs[2] = 0x7F;
-
- sprite->data[0] = 0;
- sprite->data[1] = gBattleAnimArgs[2];
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[0];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[1];
- sprite->data[6] = sprite->pos1.x;
- sprite->data[7] = sprite->pos1.y;
- if (NotInBattle() != 0)
- {
- sprite->oam.matrixNum = 8;
- sprite->pos1.x += 40;
- sprite->pos1.y += 20;
- sprite->data[2] = sprite->pos1.x << 7;
- sprite->data[3] = -0x1400 / sprite->data[1];
- sprite->data[4] = sprite->pos1.y << 7;
- sprite->data[5] = -0xA00 / sprite->data[1];
- }
- else if (GetBankSide(gBattleAnimBankAttacker) == 0)
- {
- sprite->pos1.x -= 40;
- sprite->pos1.y += 20;
- sprite->data[2] = sprite->pos1.x << 7;
- sprite->data[3] = 0x1400 / sprite->data[1];
- sprite->data[4] = sprite->pos1.y << 7;
- sprite->data[5] = -0xA00 / sprite->data[1];
- }
- else
- {
- sprite->pos1.x += 40;
- sprite->pos1.y -= 20;
- sprite->data[2] = sprite->pos1.x << 7;
- sprite->data[3] = -0x1400 / sprite->data[1];
- sprite->data[4] = sprite->pos1.y << 7;
- sprite->data[5] = 0xA00 / sprite->data[1];
- sprite->oam.matrixNum = 24;
- }
-
- sprite->callback = sub_80CE798;
-}
-
-void sub_80CE798(struct Sprite* sprite)
-{
- sprite->data[2] += sprite->data[3];
- sprite->data[4] += sprite->data[5];
- sprite->pos1.x = sprite->data[2] >> 7;
- sprite->pos1.y = sprite->data[4] >> 7;
- if (--sprite->data[1] == 1)
- {
- sprite->pos1.x = sprite->data[6];
- sprite->pos1.y = sprite->data[7];
- }
-
- if (sprite->data[1] == 0)
- move_anim_8072740(sprite);
-}
-
-// double team
-void sub_80CE7E0(u8 taskId)
-{
- u16 i;
- int obj;
- u16 r3;
- u16 r4;
- struct Task* task = &gTasks[taskId];
- task->data[0] = GetAnimBankSpriteId(0);
- task->data[1] = AllocSpritePalette(0x2771);
- r3 = (task->data[1] * 16) + 0x100;
- r4 = (gSprites[task->data[0]].oam.paletteNum + 16) << 4;
- for (i = 1; i < 16; i++)
- {
- gPlttBufferUnfaded[r3 + i] = gPlttBufferUnfaded[r4 + i];
- }
-
- BlendPalette(r3, 16, 11, 0);
- task->data[3] = 0;
- i = 0;
- while (i <= 1 && (obj = duplicate_obj_of_side_rel2move_in_transparent_mode(0)) >= 0)
- {
- gSprites[obj].oam.paletteNum = task->data[1];
- gSprites[obj].data[0] = 0;
- gSprites[obj].data[1] = i << 7;
- gSprites[obj].data[2] = taskId;
- gSprites[obj].callback = sub_80CE974;
- task->data[3]++;
- i++;
- }
-
- task->func = sub_80CE910;
- if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1)
- {
- REG_DISPCNT &= 0xFDFF;
- }
- else
- {
- REG_DISPCNT &= 0xFBFF;
- }
-}
-
-void sub_80CE910(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (!task->data[3])
- {
- if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1)
- REG_DISPCNT |= 0x200;
- else
- REG_DISPCNT |= 0x400;
-
- FreeSpritePaletteByTag(0x2771);
- DestroyAnimVisualTask(taskId);
- }
-}
-
-void sub_80CE974(struct Sprite* sprite)
-{
- if (++sprite->data[3] > 1)
- {
- sprite->data[3] = 0;
- sprite->data[0]++;
- }
-
- if (sprite->data[0] > 0x40)
- {
- gTasks[sprite->data[2]].data[3]--;
- obj_delete_but_dont_free_vram(sprite);
- }
- else
- {
- sprite->data[4] = gSineTable[sprite->data[0]] / 6;
- sprite->data[5] = gSineTable[sprite->data[0]] / 13;
- sprite->data[1] = (sprite->data[1] + sprite->data[5]) & 0xFF;
- sprite->pos2.x = Sin(sprite->data[1], sprite->data[4]);
- }
-}
-
-void sub_80CEA04(struct Sprite* sprite)
-{
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- sprite->callback = sub_8078600;
-}
-
-// grasswhistle
-void sub_80CEA20(u8 taskId)
-{
- u16 i;
- u16 j;
- u16 index;
-
- index = IndexOfSpritePaletteTag(gUnknown_083D712C[0][0]);
- if (index != 0xFF)
- {
- index = (index << 4) + 0x100;
- for (i = 1; i < 6; i++)
- {
- gPlttBufferFaded[index + i] = gUnknown_083D712C[0][i];
- }
- }
-
- for (j = 1; j < 4; j++)
- {
- index = AllocSpritePalette(gUnknown_083D712C[j][0]);
- if (index != 0xFF)
- {
- index = (index << 4) + 0x100;
- for (i = 1; i < 6; i++)
- {
- gPlttBufferFaded[index + i] = gUnknown_083D712C[j][i];
- }
- }
- }
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80CEAD8(u8 taskId)
-{
- u16 i;
- for (i = 1; i < 4; i++)
- {
- FreeSpritePaletteByTag(gUnknown_083D712C[i][0]);
- }
-
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80CEB0C(struct Sprite* sprite)
-{
- u8 index;
- u8 a;
- u8 b;
- sub_8078650(sprite);
- StartSpriteAnim(sprite, gBattleAnimArgs[0]);
- if ((index = IndexOfSpritePaletteTag(gUnknown_083D712C[gBattleAnimArgs[1]][0])) != 0xFF)
- sprite->oam.paletteNum = index;
-
- sprite->data[1] = gBattleAnimArgs[1];
- sprite->data[2] = 0;
- sprite->data[3] = gBattleAnimArgs[2];
- if (NotInBattle())
- {
- a = 0x30;
- b = 0x28;
- }
- else
- {
- a = sub_8077ABC(gBattleAnimBankTarget, 2);
- b = sub_8077ABC(gBattleAnimBankTarget, 3);
- }
-
- sprite->data[4] = sprite->pos1.x << 4;
- sprite->data[5] = sprite->pos1.y << 4;
- sub_80CEBC4(a - sprite->pos1.x, b - sprite->pos1.y, &sprite->data[6], &sprite->data[7], 0x28);
- sprite->callback = sub_80CEC1C;
-}
-
-void sub_80CEBC4(s16 a, s16 b, s16* c, s16* d, s8 e)
-{
- int f;
- int g;
- if (a < 0)
- e = -e;
-
- f = a << 8;
- g = f / e;
- if (g == 0)
- g = 1;
-
- *c = f / g;
- *d = (b << 8) / g;
-}
-
-//grasswhistle music notes
-void sub_80CEC1C(struct Sprite* sprite)
-{
- int b;
- s16 a;
- int c;
- u8 index;
- sprite->data[0]++;
- b = sprite->data[0] * 5 - ((sprite->data[0] * 5 / 256) << 8);
- sprite->data[4] += sprite->data[6];
- sprite->data[5] += sprite->data[7];
- sprite->pos1.x = sprite->data[4] >> 4;
- sprite->pos1.y = sprite->data[5] >> 4;
- sprite->pos2.y = Sin(b, 15);
- a = (u16)sprite->pos1.y;
- c = (u16)sprite->pos1.x;
-
- if ((u32)((c + 16) << 16) > (0x110) << 16 || a < -16 || a > 0x80)
- {
- move_anim_8074EE0(sprite);
- }
- else
- {
- if (sprite->data[3] && ++sprite->data[2] > sprite->data[3])
- {
- sprite->data[2] = 0;
- if (++sprite->data[1] > 3)
- sprite->data[1] = 0;
-
- index = IndexOfSpritePaletteTag(gUnknown_083D712C[sprite->data[1]][0]);
- if (index != 0xFF)
- sprite->oam.paletteNum = index;
- }
- }
-}
-
-void sub_80CECE8(struct Sprite* sprite)
-{
- int a;
- if (GetBankSide(gBattleAnimBankAttacker) == 1)
- {
- a = gBattleAnimArgs[1];
- (u16)gBattleAnimArgs[1] = -a;
- }
-
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[1];
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[2];
- StartSpriteAnim(sprite, gBattleAnimArgs[0]);
- sprite->data[2] = 0;
- sprite->data[3] = 0;
- sprite->data[4] = sprite->pos1.x << 4;
- sprite->data[5] = sprite->pos1.y << 4;
- sprite->data[6] = (gBattleAnimArgs[1] << 4) / 5;
- sprite->data[7] = (gBattleAnimArgs[2] << 7) / 5;
- sprite->callback = sub_80CED78;
-}
-
-void sub_80CED78(struct Sprite* sprite)
-{
- sprite->data[4] += sprite->data[6];
- sprite->data[5] += sprite->data[7];
- sprite->pos1.x = sprite->data[4] >> 4;
- sprite->pos1.y = sprite->data[5] >> 4;
- if (sprite->data[0] > 5 && sprite->data[3] == 0)
- {
- sprite->data[2] = (sprite->data[2] + 16) & 0xFF;
- sprite->pos2.x = Cos(sprite->data[2], 18);
- sprite->pos2.y = Sin(sprite->data[2], 18);
- if (sprite->data[2] == 0)
- sprite->data[3] = 1;
- }
-
- if (++sprite->data[0] == 0x30)
- move_anim_8074EE0(sprite);
-}
-
-void sub_80CEDF0(struct Sprite* sprite)
-{
- s16 a;
- if (gBattleAnimArgs[0] == 1)
- {
- sprite->oam.matrixNum = 8;
- a = 16;
- }
- else
- {
- a = -16;
- }
-
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + a;
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + 8;
- sprite->data[0] = 8;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-void sub_80CEE60(struct Sprite* sprite)
-{
- s16 a;
- u8 index;
- sub_8078650(sprite);
- sprite->pos1.y += 8;
- StartSpriteAnim(sprite, gBattleAnimArgs[1]);
- index = IndexOfSpritePaletteTag(gUnknown_083D712C[gBattleAnimArgs[2]][0]);
- if (index != 0xFF)
- sprite->oam.paletteNum = index;
-
- a = (gBattleAnimArgs[0] == 0) ? 0xFFE0 : 0x20;
- sprite->data[0] = 40;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = a + sprite->data[1];
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = sprite->data[3] - 40;
- obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->data[5] = gBattleAnimArgs[3];
- sprite->callback = sub_80CEEE8;
-}
-
-void sub_80CEEE8(struct Sprite* sprite)
-{
- if (sub_8078B5C(sprite) == 0)
- {
- s16 a;
- a = Sin(sprite->data[5], 8);
- if (sprite->pos2.x < 0)
- a = -a;
-
- sprite->pos2.x += a;
- sprite->pos2.y += Sin(sprite->data[5], 4);
- sprite->data[5] = (sprite->data[5] + 8) & 0xFF;
- }
- else
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CEF44(u8 bank, struct Sprite* sprite)
-{
- if (GetBankSide(bank) == 0)
- sprite->pos1.x = sub_807A100(bank, 5) + 8;
- else
- sprite->pos1.x = sub_807A100(bank, 4) - 8;
-
- sprite->pos1.y = sub_8077ABC(bank, 3) - (s16)sub_807A100(bank, 0) / 4;
-}
-
-void sub_80CEF9C(struct Sprite* sprite)
-{
- u8 a;
- u8 bank;
- if (gBattleAnimArgs[0] == 0)
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- sub_80CEF44(bank, sprite);
- a = (GetBankSide(bank) == 0) ? 0 : 1;
- sprite->data[0] = gBattleAnimArgs[1];
- sprite->data[1] = a + 2;
- StartSpriteAnim(sprite, a);
- StoreSpriteCallbackInData(sprite, sub_80CF008);
- sprite->callback = sub_8078600;
-}
-
-void sub_80CF008(struct Sprite* sprite)
-{
- if (--sprite->data[0] == 0)
- {
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- StartSpriteAnim(sprite, sprite->data[1]);
- sprite->callback = sub_8078600;
- }
-}
-
-void sub_80CF040(struct Sprite* sprite)
-{
- u8 bank;
- if (gBattleAnimArgs[0] == 0)
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- sub_80CEF44(bank, sprite);
- sprite->data[0] = 0;
- StoreSpriteCallbackInData(sprite, sub_80CF088);
- sprite->callback = sub_80785E4;
-}
-
-void sub_80CF088(struct Sprite* sprite)
-{
- if (++sprite->data[0] > 16)
- {
- StartSpriteAffineAnim(sprite, 1);
- StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
- sprite->callback = sub_80785E4;
- }
-}
-
-void sub_80CF0BC(struct Sprite* sprite)
-{
- u8 bank;
- if (gBattleAnimArgs[0] == 0)
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- sprite->pos1.x = sub_8077ABC(bank, 0);
- sprite->pos1.y = sub_807A100(bank, 2);
- if (sprite->pos1.y <= 9)
- sprite->pos1.y = 10;
-
- sprite->data[0] = 1;
- sprite->data[1] = 0;
- sprite->data[2] = sprite->subpriority;
- sprite->data[3] = sprite->subpriority + 4;
- sprite->data[4] = 0;
- StoreSpriteCallbackInData(sprite, sub_80CF138);
- sprite->callback = sub_80785E4;
-}
-
-void sub_80CF138(struct Sprite* sprite)
-{
- if (++sprite->data[4] > 12)
- sprite->callback = sub_80CF158;
-}
-
-void sub_80CF158(struct Sprite* sprite)
-{
- s16 temp;
- s16 temp2;
- sprite->data[1] += 4;
- if (sprite->data[1] > 0xFE)
- {
- if (--sprite->data[0] == 0)
- {
- sprite->pos2.x = 0;
- sprite->callback = sub_80CF088;
- return;
- }
- else
- {
- sprite->data[1] &= 0xFF;
- }
- }
-
- if (sprite->data[1] > 0x4F)
- sprite->subpriority = sprite->data[3];
-
- if (sprite->data[1] > 0x9F)
- sprite->subpriority = sprite->data[2];
-
- temp = gSineTable[sprite->data[1]];
- sprite->pos2.x = (temp2 = temp >> 3) + (temp2 >> 1);
-}
-
-void sub_80CF1C8(struct Sprite* sprite)
-{
- u8 bank;
- if (gBattleAnimArgs[0] == 0)
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- sub_80CEF44(bank, sprite);
- if (GetBankSide(bank) == 0)
- {
- StartSpriteAnim(sprite, 0);
- sprite->data[0] = 2;
- }
- else
- {
- StartSpriteAnim(sprite, 1);
- sprite->data[0] = 3;
- }
-
- sprite->callback = sub_80CF228;
-}
-
-void sub_80CF228(struct Sprite* sprite)
-{
- if (++sprite->data[1] > 10)
- {
- sprite->data[1] = 0;
- StartSpriteAnim(sprite, sprite->data[0]);
- StoreSpriteCallbackInData(sprite, sub_80CF264);
- sprite->callback = sub_8078600;
- }
-}
-
-void sub_80CF264(struct Sprite* sprite)
-{
- if (++sprite->data[1] > 5)
- move_anim_8072740(sprite);
-}
-
-void sub_80CF280(struct Sprite* sprite)
-{
- sub_8078650(sprite);
- sub_807867C(sprite, gBattleAnimArgs[0]);
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[1] = gBattleAnimArgs[2];
- sprite->data[2] = gBattleAnimArgs[4];
- sprite->data[3] = gBattleAnimArgs[5];
- sprite->data[4] = gBattleAnimArgs[3];
- StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
- sprite->callback = sub_8078278;
- sub_8078278(sprite);
-}
-
-void sub_80CF2D0(struct Sprite* sprite)
-{
- u8 bank;
- if (gBattleAnimArgs[0] == 0)
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- sub_80CEF44(bank, sprite);
- sprite->data[0] = 0;
- sprite->data[1] = 0;
- sprite->callback = sub_80CF310;
-}
-
-void sub_80CF310(struct Sprite* sprite)
-{
- switch (sprite->data[0])
- {
- case 0:
- sprite->pos2.y -= 3;
- if (++sprite->data[1] == 6)
- sprite->data[0]++;
- break;
- case 1:
- sprite->pos2.y += 3;
- if (--sprite->data[1] == 0)
- sprite->data[0]++;
- break;
- case 2:
- if (++sprite->data[1] == 0x40)
- move_anim_8072740(sprite);
- break;
- }
-}
-
-void sub_80CF374(struct Sprite* sprite)
-{
- s16 temp;
- gSprites[sprite->data[2]].pos2.x += sprite->data[1];
- temp = sprite->data[1];
- sprite->data[1] = -temp;
- if (sprite->data[0] == 0)
- {
- gSprites[sprite->data[2]].pos2.x = 0;
- move_anim_8074EE0(sprite);
- }
-
- sprite->data[0]--;
-}
-
-void sub_80CF3C4(struct Sprite* sprite)
-{
- u8 a;
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
- a = gObjectBankIDs[gBattleAnimBankTarget];
- if (GetBankSide(gBattleAnimBankAttacker) != 0)
- {
- sprite->pos1.x -= gBattleAnimArgs[0];
- }
- else
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- }
-
- sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[1] = gBattleAnimArgs[3];
- sprite->data[2] = a;
- sprite->callback = sub_80CF374;
- sprite->invisible = 1;
-}
-
-void sub_80CF458(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[1] = gBattleAnimArgs[3];
- sprite->data[5] = gBattleAnimArgs[4];
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80CF490);
-}
-
-void sub_80CF490(struct Sprite* sprite)
-{
- sprite->data[0] = sprite->data[1];
- sprite->data[2] = sprite->pos1.x;
- sprite->data[4] = sprite->pos1.y + 15;
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, sub_80CF4B8);
-}
-
-void sub_80CF4B8(struct Sprite* sprite)
-{
- if (sprite->data[5] == 0)
- move_anim_8072740(sprite);
- else
- sprite->data[5]--;
-}
-
-void sub_80CF4D8(u8 taskId)
-{
- sub_8078E70(gObjectBankIDs[gBattleAnimBankAttacker], 0);
- gTasks[taskId].func = sub_80CF514;
-}
-
-void sub_80CF514(u8 taskId)
-{
- u8 a = gObjectBankIDs[gBattleAnimBankAttacker];
- s16 b;
- if (GetBankSide(gBattleAnimBankAttacker) == 0)
- {
- b = -gTasks[taskId].data[0];
- }
- else
- {
- b = gTasks[taskId].data[0];
- }
-
- obj_id_set_rotscale(a, 0x100, 0x100, b);
- if (gTasks[taskId].data[1] == 0)
- {
- gTasks[taskId].data[0] += 0xB0;
- gSprites[a].pos2.y++;
- }
- else if (gTasks[taskId].data[1] == 1)
- {
- if (++gTasks[taskId].data[3] == 0x1E)
- gTasks[taskId].data[1] = 2;
-
- return;
- }
- else
- {
- gTasks[taskId].data[0] -= 0xB0;
- gSprites[a].pos2.y--;
- }
-
- sub_8078F9C(a);
- if (gTasks[taskId].data[0] == 0xF20 || gTasks[taskId].data[0] == 0)
- {
- if (gTasks[taskId].data[1] == 2)
- {
- sub_8078F40(a);
- DestroyAnimVisualTask(taskId);
- }
- else
- {
- gTasks[taskId].data[1]++;
- }
- }
-}
-
-void sub_80CF610(struct Sprite* sprite)
-{
- sub_8078650(sprite);
- sub_807867C(sprite, gBattleAnimArgs[0]);
- sprite->pos1.y += gBattleAnimArgs[1];
- if (GetBankSide(gBattleAnimBankAttacker) != 0)
- {
- sprite->hFlip = 1;
- if (gBattleAnimArgs[2] != 0)
- sprite->vFlip = 1;
- }
- else
- {
- if (gBattleAnimArgs[2] != 0)
- sprite->vFlip = 1;
- }
-
- sprite->callback = sub_8078600;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-void sub_80CF690(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 0);
- sprite->callback = sub_80785E4;
- StoreSpriteCallbackInData(sprite, sub_80CF6B4);
-}
-
-void sub_80CF6B4(struct Sprite* sprite)
-{
- sprite->data[0] = 6;
- sprite->data[2] = sprite->pos1.x;
- sprite->data[4] = sprite->pos1.y - 32;
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-//sonic boom
-void sub_80CF6DC(struct Sprite* sprite)
-{
- s16 a;
- s16 b;
- u16 c;
-
- if (NotInBattle())
- {
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
- }
- else if (GetBankSide(gBattleAnimBankAttacker) != 0)
- {
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- gBattleAnimArgs[3] = -gBattleAnimArgs[3];
- }
-
- sub_80787B0(sprite, 1);
- a = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2];
- b = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3];
- c = sub_80790F0(a - sprite->pos1.x, b - sprite->pos1.y);
- c += 0xF000;
- if (NotInBattle())
- c -= 0x6000;
-
- sub_8078FDC(sprite, 0, 0x100, 0x100, c);
- sprite->data[0] = gBattleAnimArgs[4];
- sprite->data[2] = a;
- sprite->data[4] = b;
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-void sub_80CF7E0(struct Sprite* sprite)
-{
- if (sprite->data[0]-- <= 0)
- {
- gTasks[sprite->data[7]].data[1]--;
- DestroySprite(sprite);
- }
-}
-
-void sub_80CF814(struct Sprite* sprite)
-{
- struct Task* task = &gTasks[sprite->data[7]];
- if (sprite->data[0] > task->data[5])
- {
- sprite->data[5] += sprite->data[3];
- sprite->data[6] += sprite->data[4];
- }
- else
- {
- sprite->data[5] -= sprite->data[3];
- sprite->data[6] -= sprite->data[4];
- }
-
- sprite->data[1] += sprite->data[5];
- sprite->data[2] += sprite->data[6];
- if (1 & task->data[7])
- sprite->pos2.x = ((u16)sprite->data[1] >> 8) * -1;
- else
- sprite->pos2.x = (u16)sprite->data[1] >> 8;
-
- if (1 & task->data[8])
- sprite->pos2.y = ((u16)sprite->data[2] / 256u) * -1;
- else
- sprite->pos2.y = (u16)sprite->data[2] / 256u;
-
- if (sprite->data[0]-- <= 0)
- {
- sprite->data[0] = 30;
- sprite->callback = sub_80CF7E0;
- }
-}
-
-//air cutter
-void sub_80CF8B8(struct Sprite* sprite)
-{
- s16 a;
- s16 b;
- s16 c;
-
- struct Task* task = &gTasks[sprite->data[7]];
- sprite->data[1] += (-2 & task->data[7]);
- sprite->data[2] += (-2 & task->data[8]);
- if (1 & task->data[7])
- sprite->pos2.x = ((u16)sprite->data[1] >> 8) * -1;
- else
- sprite->pos2.x = (u16)sprite->data[1] >> 8;
-
- if (1 & task->data[8])
- sprite->pos2.y = ((u16)sprite->data[2] / 256u) * -1;
- else
- sprite->pos2.y = (u16)sprite->data[2] / 256u;
-
- if (sprite->data[0]-- <= 0)
- {
- sprite->data[0] = 8;
- task->data[5] = 4;
- a = sub_81174E0(0x1000);
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
- if (task->data[11] >= sprite->pos1.x)
- b = (task->data[11] - sprite->pos1.x) << 8;
- else
- b = (sprite->pos1.x - task->data[11]) << 8;
-
- if (task->data[12] >= sprite->pos1.y)
- c = (task->data[12] - sprite->pos1.y) << 8;
- else
- c = (sprite->pos1.y - task->data[12]) << 8;
-
- sprite->data[2] = 0;
- sprite->data[1] = 0;
- sprite->data[6] = 0;
- sprite->data[5] = 0;
- sprite->data[3] = sub_81174C4(sub_81174C4(b, a), sub_81174E0(0x1C0));
- sprite->data[4] = sub_81174C4(sub_81174C4(c, a), sub_81174E0(0x1C0));
- sprite->callback = sub_80CF814;
- }
-}
-
-void sub_80CF9F8(u8 taskId)
-{
- if (gTasks[taskId].data[1] == 0)
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80CFA20(u8 taskId)
-{
- if (gTasks[taskId].data[0]-- <= 0)
- {
- u8 spriteId;
- struct Sprite* sprite;
- spriteId = CreateSprite(&gSpriteTemplate_83D74BC, gTasks[taskId].data[9], gTasks[taskId].data[10], gTasks[taskId].data[2] - gTasks[taskId].data[1]);
- sprite = &gSprites[spriteId];
- switch (gTasks[taskId].data[4])
- {
- case 1:
- sprite->oam.matrixNum |= 24;
- break;
- case 2:
- sprite->oam.matrixNum = 8;
- break;
- }
-
- sprite->data[0] = gTasks[taskId].data[5] - gTasks[taskId].data[6];
- sprite->data[7] = taskId;
- gTasks[taskId].data[gTasks[taskId].data[1] + 13] = spriteId;
- gTasks[taskId].data[0] = gTasks[taskId].data[3];
- gTasks[taskId].data[1]++;
- PlaySE12WithPanning(0x9A, sub_8076F98(-0x3F));
- if (gTasks[taskId].data[1] > 2)
- gTasks[taskId].func = sub_80CF9F8;
- }
-}
-
-void sub_80CFB04(u8 taskId)
-{
- s16 r9 = 0;
- s16 r6 = 0;
- s16 sp1 = 0;
- s16 sp2 = 0;
- s16 r4;
-
- if (NotInBattle())
- {
- gTasks[taskId].data[4] = 2;
- gBattleAnimArgs[0] = -gBattleAnimArgs[0];
- if (gBattleAnimArgs[2] & 1)
- gBattleAnimArgs[2] &= ~1;
- else
- gBattleAnimArgs[2] |= 1;
- }
- else
- {
- if ((gBanksBySide[gBattleAnimBankTarget] & 1) == 0)
- {
- gTasks[taskId].data[4] = 1;
- gBattleAnimArgs[0] = -gBattleAnimArgs[0];
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- if (gBattleAnimArgs[2] & 1)
- gBattleAnimArgs[2] &= ~1;
- else
- gBattleAnimArgs[2] |= 1;
- }
- }
- r6 = gTasks[taskId].data[9] = sub_8077ABC(gBattleAnimBankAttacker, 0);
- r9 = gTasks[taskId].data[10] = sub_8077ABC(gBattleAnimBankAttacker, 1);
- if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- && IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2))
- {
- sub_807A3FC(gBattleAnimBankTarget, 0, &sp1, &sp2);
- }
- else
- {
- sp1 = sub_8077ABC(gBattleAnimBankTarget, 0);
- sp2 = sub_8077ABC(gBattleAnimBankTarget, 1);
- }
-
- sp1 = gTasks[taskId].data[11] = sp1 + gBattleAnimArgs[0];
- sp2 = gTasks[taskId].data[12] = sp2 + gBattleAnimArgs[1];
- if (sp1 >= r6)
- r4 = sp1 - r6;
- else
- r4 = r6 - sp1;
-
- gTasks[taskId].data[5] = sub_81174C4(r4, sub_81174E0(gBattleAnimArgs[2] & ~1));
- gTasks[taskId].data[6] = sub_81174C4(gTasks[taskId].data[5], 0x80);
- gTasks[taskId].data[7] = gBattleAnimArgs[2];
- if (sp2 >= r9)
- {
- r4 = sp2 - r9;
- gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) & ~1;
- }
- else
- {
- r4 = r9 - sp2;
- gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) | 1;
- }
-
- gTasks[taskId].data[3] = gBattleAnimArgs[3];
- if (gBattleAnimArgs[4] & 0x80)
- {
- gBattleAnimArgs[4] ^= 0x80;
- if (gBattleAnimArgs[4] >= 64)
- {
- u16 var = sub_8079E90(gBattleAnimBankTarget) + (gBattleAnimArgs[4] - 64);
- gTasks[taskId].data[2] = var;
- }
- else
- {
- u16 var = sub_8079E90(gBattleAnimBankTarget) - gBattleAnimArgs[4];
- gTasks[taskId].data[2] = var;
- }
- }
- else
- {
- if (gBattleAnimArgs[4] >= 64)
- {
- u16 var = sub_8079E90(gBattleAnimBankTarget) + (gBattleAnimArgs[4] - 64);
- gTasks[taskId].data[2] = var;
- }
- else
- {
- u16 var = sub_8079E90(gBattleAnimBankTarget) - gBattleAnimArgs[4];
- gTasks[taskId].data[2] = var;
- }
- }
-
- if (gTasks[taskId].data[2] < 3)
- gTasks[taskId].data[2] = 3;
-
- gTasks[taskId].func = sub_80CFA20;
-}
-
-void sub_80CFDFC(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 0);
- sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(gSpriteTemplate_83D75AC.paletteTag) << 4);
- sprite->callback = sub_80CFE2C;
-}
-
-#ifdef NONMATCHING
-void sub_80CFE2C(struct Sprite* sprite)
-{
- u16 r7;
- u16* r1;
- u16* r2;
- int i;
- if (++sprite->data[1] == 2)
- {
- sprite->data[1] = 0;
- r7 = gPlttBufferFaded[sprite->data[0] + 8];
- r2 = &gPlttBufferFaded[0x10];
- r1 = &gPlttBufferFaded[sprite->data[0] + 9];
- for (i = 7; i >= 0; i--)
- {
- *r2 = *r1;
- r1++;
- r2++;
- }
-
- gPlttBufferFaded[sprite->data[0] + 15] = r7;
- if (++sprite->data[2] == 0x18)
- move_anim_8072740(sprite);
- }
-}
-#else
-__attribute__((naked))
-void sub_80CFE2C(struct Sprite* sprite)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- adds r4, r0, 0\n\
- ldrh r0, [r4, 0x30]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x30]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x2\n\
- bne _080CFE90\n\
- movs r0, 0\n\
- strh r0, [r4, 0x30]\n\
- ldrh r5, [r4, 0x2E]\n\
- ldr r1, _080CFE98 @ =gPlttBufferFaded\n\
- adds r0, r5, 0\n\
- adds r0, 0x8\n\
- lsls r0, 1\n\
- adds r0, r1\n\
- ldrh r7, [r0]\n\
- adds r6, r1, 0 @puts gPlttBufferFaded in r6\n\
- adds r1, r5, 0\n\
- adds r1, 0x9\n\
- lsls r0, r5, 1\n\
- adds r0, r6 \n\
- adds r2, r0, 0\n\
- adds r2, 0x10\n\
- movs r3, 0x7\n\
- lsls r1, 1\n\
- adds r1, r6 \n\
-_080CFE64:\n\
- ldrh r0, [r1]\n\
- strh r0, [r2]\n\
- adds r1, 0x2\n\
- adds r2, 0x2\n\
- subs r3, 0x1\n\
- cmp r3, 0\n\
- bge _080CFE64\n\
- adds r0, r5, 0\n\
- adds r0, 0xF\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- strh r7, [r0]\n\
- ldrh r0, [r4, 0x32]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x32]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x18\n\
- bne _080CFE90\n\
- adds r0, r4, 0\n\
- bl move_anim_8072740\n\
-_080CFE90:\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080CFE98: .4byte gPlttBufferFaded\n\
-.syntax divided\n");
-}
-#endif
-
-void sub_80CFE9C(struct Sprite* sprite)
-{
- s16 r6;
- s16 r7;
- u16 var;
-
- sub_80787B0(sprite, 1);
- r6 = sub_8077ABC(gBattleAnimBankTarget, 2);
- r7 = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3];
- if (GetBankSide(gBattleAnimBankAttacker) != 0)
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
-
- r6 += gBattleAnimArgs[2];
- var = sub_80790F0(r6 - sprite->pos1.x, r7 - sprite->pos1.y);
- var += 0xC000;
- sub_8078FDC(sprite, 0, 0x100, 0x100, var);
- sprite->data[0] = gBattleAnimArgs[4];
- sprite->data[2] = r6;
- sprite->data[4] = r7;
- sprite->callback = sub_8078C00;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
-}
-
-void sub_80CFF50(struct Sprite* sprite)
-{
- sprite->data[2] = -16;
- sprite->pos1.y += 8;
- sprite->callback = sub_80CFF68;
-}
-
-void sub_80CFF68(struct Sprite* sprite)
-{
- sprite->data[0] += 0x80;
- sprite->pos2.x = sprite->data[0] >> 8;
- if (GetBankSide(gBattleAnimBankAttacker) == 0)
- sprite->pos2.x = -sprite->pos2.x;
-
- sprite->pos2.y = Sin(sprite->data[1], sprite->data[2]);
- sprite->data[1] += 5;
- if (sprite->data[1] > 0x7E)
- {
- sprite->data[1] = 0;
- sprite->data[2] /= 2;
- if (++sprite->data[3] == 2)
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80CFFD8(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- sprite->data[0] = 20;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
- sprite->callback = sub_8078B34;
- sprite->affineAnimPaused = 1;
- StoreSpriteCallbackInData(sprite, sub_80D0030);
-}
-
-void sub_80D0030(struct Sprite* sprite)
-{
- int i;
- u16 rand;
- s16* ptr;
- PlaySE12WithPanning(0xA6, sub_8076F98(0x3F));
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
- ptr = &sprite->data[7];
- for (i = 0; i < 8; i++)
- {
- ptr[i - 7] = 0;
- }
-
- rand = Random();
- sprite->data[6] = 0xFFF4 - (rand & 7);
- rand = Random();
- sprite->data[7] = (rand % 0xA0) + 0xA0;
- sprite->callback = sub_80D00B4;
- sprite->affineAnimPaused = 0;
-}
-
-void sub_80D00B4(struct Sprite* sprite)
-{
- sprite->data[0] += sprite->data[7];
- sprite->pos2.x = sprite->data[0] >> 8;
- if (sprite->data[7] & 1)
- sprite->pos2.x = -sprite->pos2.x;
-
- sprite->pos2.y = Sin(sprite->data[1], sprite->data[6]);
- sprite->data[1] += 8;
- if (sprite->data[1] > 0x7E)
- {
- sprite->data[1] = 0;
- sprite->data[2] /= 2;
- if (++sprite->data[3] == 1)
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80D0118(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 0);
- if (GetBankSide(gBattleAnimBankAttacker) == 0)
- sprite->pos1.y += 16;
-
- sprite->data[0] = gBattleAnimArgs[4];
- sprite->data[1] = gBattleAnimArgs[2];
- sprite->data[2] = gBattleAnimArgs[5];
- sprite->data[3] = gBattleAnimArgs[6];
- sprite->data[4] = gBattleAnimArgs[3];
- sprite->callback = sub_8078114;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- sprite->callback(sprite);
-}
-
-void sub_80D0178(struct Sprite* sprite)
-{
- s16 r7 = 32;
- s16 r4 = -32;
- s16 r8 = 16;
- s16 r6 = -16;
- if (gBattleAnimArgs[0] != 0)
- {
- r7 = r4;
- r4 = 32;
- r8 = r6;
- r6 = 16;
- StartSpriteAnim(sprite, 1);
- }
-
- sprite->pos1.x += r7;
- sprite->pos1.y += r4;
- sprite->data[0] = 6;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + r8;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + r6;
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, sub_80D020C);
-}
-
-void sub_80D020C(struct Sprite* sprite)
-{
- if (sprite->animEnded == 1)
- move_anim_8072740(sprite);
-}
-
-void sub_80D0228(struct Sprite* sprite)
-{
- s16 r8 = 32;
- s16 r4 = -32;
- s16 r9 = 16;
- s16 r6 = -16;
- if (gBattleAnimArgs[0] != 0)
- {
- r8 = r4;
- r4 = 32;
- r9 = r6;
- r6 = 16;
- StartSpriteAnim(sprite, gBattleAnimArgs[0]);
- }
-
- sprite->pos1.x += r8;
- sprite->pos1.y += r4;
- sprite->data[0] = 6;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + r9;
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3) + r6;
- obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->data[5] = gBattleAnimArgs[0];
- sprite->data[6] = sprite->data[0];
- sprite->callback = sub_80D02D0;
-}
-
-void sub_80D02D0(struct Sprite* sprite)
-{
- if (sub_8078B5C(sprite) && sprite->animEnded == 1)
- {
- SeekSpriteAnim(sprite, 0);
- sprite->animPaused = 1;
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 2;
- sprite->pos2.y = -2;
- sprite->data[0] = sprite->data[6];
- sprite->data[1] ^= 1;
- sprite->data[2] ^= 1;
- sprite->data[4] = 0;
- sprite->data[3] = 0;
- sprite->callback = sub_80D0344;
- }
-}
-
-void sub_80D0344(struct Sprite* sprite)
-{
- if (sprite->data[3])
- {
- sprite->pos2.x = -sprite->pos2.x;
- sprite->pos2.y = -sprite->pos2.y;
- }
-
- sprite->data[3] ^= 1;
- if (++sprite->data[4] == 0x33)
- {
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
- sprite->data[4] = 0;
- sprite->data[3] = 0;
- sprite->animPaused = 0;
- StartSpriteAnim(sprite, sprite->data[5] ^ 1);
- sprite->callback = sub_80D03A8;
- }
-}
-
-void sub_80D03A8(struct Sprite* sprite)
-{
- if (sub_8078B5C(sprite) != 0)
- move_anim_8072740(sprite);
-}
-
-void sub_80D03C4(u8 taskId)
-{
- u8 spriteId = GetAnimBankSpriteId(1);
- sub_8078E70(spriteId, 1);
- obj_id_set_rotscale(spriteId, 0xD0, 0xD0, 0);
- sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 0);
- gTasks[taskId].data[0] = 0x50;
- gTasks[taskId].func = sub_80D0428;
-}
-
-void sub_80D0428(u8 taskId)
-{
- if (--gTasks[taskId].data[0] == -1)
- {
- u8 spriteId = GetAnimBankSpriteId(1);
- sub_8078F40(spriteId);
- sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 1);
- DestroyAnimVisualTask(taskId);
- }
-}
-
-void sub_80D0488(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- u8 spriteId = GetAnimBankSpriteId(0);
- task->data[0] = spriteId;
- sub_8078E70(spriteId, 0);
- task->data[1] = 0;
- task->data[2] = 0;
- task->data[3] = 0;
- task->data[4] = 0x100;
- task->data[5] = 0;
- task->data[6] = 0;
- task->data[7] = sub_8079E90(gBattleAnimBankAttacker);
- task->func = sub_80D04E0;
-}
-
-void sub_80D04E0(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- switch (task->data[1])
- {
- case 0:
- if (task->data[2] == 0 || task->data[2] == 3 || task->data[2] == 6)
- sub_80D0614(task, taskId);
- task->data[2]++;
- task->data[4] += 0x28;
- obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
- sub_8079A64(task->data[0]);
- if (task->data[2] == 32)
- {
- task->data[5]++;
- task->data[1]++;
- }
- break;
- case 1:
- if (task->data[6] == 0)
- {
- if (task->data[5] == 3)
- {
- task->data[2] = 0;
- task->data[1] = 3;
- }
- else
- {
- task->data[2] = 0;
- task->data[3] = 0;
- task->data[4] = 0x100;
- obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
- sub_8079A64(task->data[0]);
- task->data[1] = 2;
- }
- }
- break;
- case 2:
- task->data[1] = 0;
- break;
- case 3:
- if (++task->data[2] > 32)
- {
- task->data[2] = 0;
- task->data[1]++;
- }
- break;
- case 4:
- task->data[2] += 2;
- task->data[4] -= 0x50;
- obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
- sub_8079A64(task->data[0]);
- if (task->data[2] == 32)
- {
- task->data[2] = 0;
- task->data[1]++;
- }
- break;
- case 5:
- sub_8078F40(task->data[0]);
- gSprites[task->data[15]].pos2.y = 0;
- DestroyAnimVisualTask(taskId);
- break;
- }
-}
-
-#ifdef NONMATCHING
-void sub_80D0614(struct Task* task, u8 taskId)
-{
- s16 r8 = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
- if (r8 >= 0)
- {
- u8 r6 = AllocOamMatrix();
- if (r6 == 0xFF)
- {
- obj_delete_but_dont_free_vram(&gSprites[r8]);
- }
- else
- {
- gSprites[r8].oam.objMode = 1;
- gSprites[r8].oam.affineMode = 3;
- gSprites[r8].affineAnimPaused = 1;
- gSprites[r8].oam.matrixNum = r6;
- gSprites[r8].subpriority = task->data[7] - task->data[3];
- task->data[3]++;
- task->data[6]++;
- gSprites[r8].data[0] = 16;
- gSprites[r8].data[1] = taskId;
- gSprites[r8].data[2] = 6;
- gSprites[r8].callback = sub_80D0704;
- obj_id_set_rotscale(r8, task->data[4], task->data[4], 0);
- gSprites[r8].oam.affineMode = 1;
- CalcCenterToCornerVec(&gSprites[r8], gSprites[r8].oam.shape, gSprites[r8].oam.size, gSprites[r8].oam.affineMode);
- }
- }
-}
-#else
-__attribute__((naked))
-void sub_80D0614(struct Task* task, u8 taskId)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- adds r7, r0, 0 @r7 is task\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r9, r1 @r9 is taskId\n\
- movs r0, 0\n\
- bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- lsls r0, 16\n\
- asrs r4, r0, 16\n\
- cmp r4, 0\n\
- blt _080D06EE @jump to bottom\n\
- bl AllocOamMatrix\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- cmp r6, 0xFF\n\
- bne _080D0658\n\
- lsls r0, r4, 4\n\
- adds r0, r4\n\
- lsls r0, 2\n\
- ldr r1, _080D0654 @ =gSprites\n\
- adds r0, r1\n\
- bl obj_delete_but_dont_free_vram\n\
- b _080D06EE @ jump to bottom\n\
- .align 2, 0\n\
-_080D0654: .4byte gSprites\n\
-_080D0658:\n\
- ldr r5, _080D06FC @ =gSprites\n\
- lsls r3, r4, 4\n\
- adds r3, r4\n\
- lsls r3, 2\n\
- adds r4, r3, r5\n\
- ldrb r1, [r4, 0x1]\n\
- movs r0, 0xD\n\
- negs r0, r0\n\
- ands r0, r1\n\
- movs r1, 0x4\n\
- orrs r0, r1\n\
- movs r1, 0x3\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x1]\n\
- adds r2, r4, 0\n\
- adds r2, 0x2C\n\
- ldrb r0, [r2]\n\
- movs r1, 0x80\n\
- orrs r0, r1\n\
- strb r0, [r2]\n\
- movs r0, 0x1F\n\
- ands r6, r0\n\
- lsls r2, r6, 1\n\
- ldrb r1, [r4, 0x3]\n\
- movs r0, 0x3F\n\
- negs r0, r0\n\
- ands r0, r1\n\
- orrs r0, r2\n\
- strb r0, [r4, 0x3]\n\
- ldrb r0, [r7, 0x16]\n\
- ldrb r1, [r7, 0xE]\n\
- subs r0, r1\n\
- adds r1, r4, 0\n\
- adds r1, 0x43\n\
- strb r0, [r1]\n\
- ldrh r0, [r7, 0xE]\n\
- adds r0, 0x1\n\
- strh r0, [r7, 0xE]\n\
- ldrh r0, [r7, 0x14]\n\
- adds r0, 0x1\n\
- strh r0, [r7, 0x14]\n\
- movs r0, 0x10\n\
- strh r0, [r4, 0x2E]\n\
- mov r0, r9\n\
- strh r0, [r4, 0x30]\n\
- movs r0, 0x6\n\
- strh r0, [r4, 0x32]\n\
- adds r5, 0x1C\n\
- adds r3, r5\n\
- ldr r0, _080D0700 @ =sub_80D0704\n\
- str r0, [r3]\n\
- mov r1, r8 @duplicate_obj_of_side_rel2move_in_transparent_mode(0)\n\
- lsls r0, r1, 24\n\
- lsrs r0, 24\n\
- movs r1, 0x10\n\
- ldrsh r2, [r7, r1]\n\
- adds r1, r2, 0\n\
- movs r3, 0\n\
- bl obj_id_set_rotscale\n\
- ldrb r0, [r4, 0x1]\n\
- movs r3, 0x4\n\
- negs r3, r3\n\
- ands r3, r0\n\
- movs r0, 0x1\n\
- orrs r3, r0\n\
- strb r3, [r4, 0x1]\n\
- lsrs r1, r3, 6\n\
- ldrb r2, [r4, 0x3]\n\
- lsrs r2, 6\n\
- lsls r3, 30\n\
- lsrs r3, 30\n\
- adds r0, r4, 0\n\
- bl CalcCenterToCornerVec\n\
-_080D06EE:\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080D06FC: .4byte gSprites\n\
-_080D0700: .4byte sub_80D0704\n\
-.syntax divided\n");
-}
-#endif
-
-void sub_80D0704(struct Sprite* sprite)
-{
- if (--sprite->data[0] == 0)
- {
- gTasks[sprite->data[1]].data[sprite->data[2]]--;
- FreeOamMatrix(sprite->oam.matrixNum);
- obj_delete_but_dont_free_vram(sprite);
- }
-}
-
-void sub_80D074C(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (gBattleAnimArgs[1] == 0)
- {
- DestroyAnimVisualTask(taskId);
- }
- else
- {
- u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
- task->data[0] = spriteId;
- task->data[1] = 0;
- task->data[2] = gBattleAnimArgs[1];
- task->data[3] = 0;
- task->data[4] = 0;
- sub_80798F4(task, spriteId, &gUnknown_083D76F4);
- task->func = sub_80D07AC;
- }
-}
-
-void sub_80D07AC(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- switch (task->data[1])
- {
- case 0:
- sub_807992C(task);
- task->data[4] += 3;
- gSprites[task->data[0]].pos2.y += task->data[4];
- if (++task->data[3] > 7)
- {
- task->data[3] = 0;
- task->data[1]++;
- }
- break;
- case 1:
- sub_807992C(task);
- gSprites[task->data[0]].pos2.y += task->data[4];
- if (++task->data[3] > 7)
- {
- task->data[3] = 0;
- task->data[1]++;
- }
- break;
- case 2:
- if (task->data[4] != 0)
- {
- gSprites[task->data[0]].pos2.y -= 2;
- task->data[4] -= 2;
- }
- else
- task->data[1]++;
- break;
- case 3:
- if (!sub_807992C(task))
- {
- if (--task->data[2] == 0)
- {
- gSprites[task->data[0]].pos2.y = 0;
- DestroyAnimVisualTask(taskId);
- }
- else
- {
- sub_80798F4(task, task->data[0], &gUnknown_083D76F4);
- task->data[1] = 0;
- }
- }
- break;
- }
-}
-
-void sub_80D08C8(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- u8 spriteId = GetAnimBankSpriteId(0);
- sub_80798F4(task, spriteId, &gUnknown_083D7714);
- task->func = sub_80D0904;
-}
-
-void sub_80D0904(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (!sub_807992C(task))
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80D0930(struct Sprite* sprite)
-{
- if (GetBankSide(gBattleAnimBankAttacker) == 0)
- {
- StartSpriteAnim(sprite, 0);
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + 32;
- sprite->data[1] = 0x40;
- }
- else
- {
- StartSpriteAnim(sprite, 1);
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) - 32;
- sprite->data[1] = -0x40;
- }
-
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->data[0] = 0x34;
- sprite->data[2] = 0;
- sprite->data[3] = 0;
- sprite->data[4] = 0;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- sprite->callback = sub_8078394;
-}
-
-void sub_80D09C0(struct Sprite* sprite)
-{
- u8 bank;
- if (gBattleAnimArgs[0] == 0)
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- if (GetBankSide(bank) == 1)
- {
- gBattleAnimArgs[1] *= -1;
- }
-
- sprite->pos1.x = sub_8077ABC(bank, 2) + gBattleAnimArgs[1];
- sprite->pos1.y = sub_8077ABC(bank, 3) + gBattleAnimArgs[2];
- if (sprite->pos1.y <= 7)
- sprite->pos1.y = 8;
-
- StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
- sprite->callback = sub_80785E4;
-}
-
-void sub_80D0A4C(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- u8 spriteId = GetAnimBankSpriteId(0);
- task->data[0] = spriteId;
- task->data[1] = 0;
- sub_80798F4(task, spriteId, &gUnknown_083D77B0);
- task->func = sub_80D0A8C;
-}
-
-void sub_80D0A8C(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (!sub_807992C(task))
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80D0AB8(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- task->data[0] = GetAnimBankSpriteId(0);
- task->data[1] = 0;
- task->data[2] = 4;
- task->data[3] = 7;
- task->data[4] = 3;
- task->data[5] = gSprites[task->data[0]].pos1.x;
- task->data[6] = gSprites[task->data[0]].pos1.y;
- task->data[7] = 0;
- task->data[8] = 0;
- task->data[9] = 2;
- if (GetBankSide(gBattleAnimBankAttacker) == 1)
- task->data[2] *= -1;
-
- task->func = sub_80D0B3C;
-}
-
-void sub_80D0B3C(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (++task->data[7] > 2)
- {
- task->data[7] = 0;
- task->data[8]++;
- if ((task->data[8] & 1) != 0)
- {
- gSprites[task->data[0]].pos1.y += task->data[9];
- }
- else
- {
- gSprites[task->data[0]].pos1.y -= task->data[9];
- }
- }
- switch (task->data[1])
- {
- case 0:
- gSprites[task->data[0]].pos1.x += task->data[2];
- if (--task->data[3] == 0)
- {
- task->data[3] = 14;
- task->data[1] = 1;
- }
- break;
- case 1:
- gSprites[task->data[0]].pos1.x -= task->data[2];
- if (--task->data[3] == 0)
- {
- task->data[3] = 7;
- task->data[1] = 2;
- }
- break;
- case 2:
- gSprites[task->data[0]].pos1.x += task->data[2];
- if (--task->data[3] == 0)
- {
- if (--task->data[4] != 0)
- {
- task->data[3] = 7;
- task->data[1] = 0;
- }
- else
- {
- if ((task->data[8] & 1) != 0)
- {
- gSprites[task->data[0]].pos1.y -= task->data[9];
- }
- DestroyAnimVisualTask(taskId);
- }
- }
- break;
- }
-}
-
-void sub_80D0C88(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- struct UnknownTaskStruct sp;
- s16 i;
- task->data[0] = sub_8077FC0(gBattleAnimBankTarget) + 32;
- task->data[1] = 4;
- task->data[2] = 0;
- task->data[3] = 0;
- task->data[4] = 0;
- task->data[5] = 0;
- task->data[15] = sub_807A100(gBattleAnimBankTarget, 0);
- if (GetBankIdentity_permutated(gBattleAnimBankTarget) == 1)
- {
- task->data[6] = gUnknown_030042C0;
- sp.dest = (u16 *)REG_ADDR_BG1HOFS;
- }
- else
- {
- task->data[6] = gUnknown_03004288;
- sp.dest = (u16 *)REG_ADDR_BG2HOFS;
- }
-
- for (i = task->data[0] - 0x40; i <= task->data[0];i++)
- {
- if (i >= 0)
- {
- gUnknown_03004DE0[0][i] = task->data[6] + 0xF0;
- gUnknown_03004DE0[1][i] = task->data[6] + 0xF0;
- }
- }
-
- sp.control = 0xa2600001;
- sp.unk8 = 1;
- sp.unk9 = 0;
- sub_80895F8(sp);
- task->func = sub_80D0D68;
-}
-
-#ifdef NONMATCHING
-void sub_80D0D68(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
-
- switch (task->data[4])
- {
- case 0:
- if (++task->data[5] > 20)
- task->data[4]++;
- break;
- case 1:
- if (++task->data[1] > 3)
- {
- task->data[1] = 0;
- task->data[2] = task->data[3] & 3;
- task->data[5] = task->data[0] - task->data[3];
- switch (task->data[2])
- {
- case 0:
- break;
- case 1:
- task->data[5] -= 2;
- break;
- case 2:
- task->data[5] += 1;
- break;
- case 3:
- task->data[5] += 1;
- break;
- }
-
- if (task->data[5] >= 0)
- {
- gUnknown_03004DE0[0][task->data[5]] = task->data[6];
- gUnknown_03004DE0[1][task->data[5]] = task->data[6];
- }
-
- if (++task->data[3] >= task->data[15])
- {
- gUnknown_03004DC0.unk15 = 3;
- DestroyAnimVisualTask(taskId);
- }
- }
- break;
- }
-}
-#else
-__attribute__((naked))
-void sub_80D0D68(u8 taskId)
-{
- asm(".syntax unified\n\
- push {r4,lr}\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- lsls r0, r4, 2\n\
- adds r0, r4\n\
- lsls r0, 3\n\
- ldr r1, _080D0D88 @ =gTasks\n\
- adds r3, r0, r1\n\
- movs r1, 0x10\n\
- ldrsh r0, [r3, r1]\n\
- cmp r0, 0\n\
- beq _080D0D8C\n\
- cmp r0, 0x1\n\
- beq _080D0DA2\n\
- b _080D0E22\n\
- .align 2, 0\n\
-_080D0D88: .4byte gTasks\n\
-_080D0D8C:\n\
- ldrh r0, [r3, 0x12]\n\
- adds r0, 0x1\n\
- strh r0, [r3, 0x12]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x14\n\
- ble _080D0E22\n\
- ldrh r0, [r3, 0x10]\n\
- adds r0, 0x1\n\
- strh r0, [r3, 0x10]\n\
- b _080D0E22\n\
-_080D0DA2:\n\
- ldrh r0, [r3, 0xA]\n\
- adds r0, 0x1\n\
- strh r0, [r3, 0xA]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x3\n\
- ble _080D0E22\n\
- movs r0, 0\n\
- strh r0, [r3, 0xA]\n\
- ldrh r1, [r3, 0xE]\n\
- movs r0, 0x3\n\
- ands r0, r1\n\
- strh r0, [r3, 0xC]\n\
- ldrh r0, [r3, 0x8]\n\
- subs r0, r1\n\
- strh r0, [r3, 0x12]\n\
- movs r2, 0xC\n\
- ldrsh r1, [r3, r2]\n\
- cmp r1, 0x1\n\
- beq _080D0DD8\n\
- cmp r1, 0x1\n\
- ble _080D0DE0\n\
- cmp r1, 0x2\n\
- beq _080D0DDC\n\
- cmp r1, 0x3\n\
- beq _080D0DDC\n\
- b _080D0DE0\n\
-_080D0DD8:\n\
- subs r0, 0x2\n\
- b _080D0DDE\n\
-_080D0DDC:\n\
- adds r0, 0x1\n\
-_080D0DDE:\n\
- strh r0, [r3, 0x12]\n\
-_080D0DE0:\n\
- movs r1, 0x12\n\
- ldrsh r0, [r3, r1]\n\
- cmp r0, 0\n\
- blt _080D0E04\n\
- ldr r2, _080D0E28 @ =gUnknown_03004DE0\n\
- lsls r0, 1\n\
- adds r0, r2\n\
- ldrh r1, [r3, 0x14]\n\
- strh r1, [r0]\n\
- movs r1, 0x12\n\
- ldrsh r0, [r3, r1]\n\
- lsls r0, 1\n\
- movs r1, 0xF0\n\
- lsls r1, 3\n\
- adds r2, r1\n\
- adds r0, r2\n\
- ldrh r1, [r3, 0x14]\n\
- strh r1, [r0]\n\
-_080D0E04:\n\
- ldrh r0, [r3, 0xE]\n\
- adds r0, 0x1\n\
- strh r0, [r3, 0xE]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- movs r2, 0x26\n\
- ldrsh r1, [r3, r2]\n\
- cmp r0, r1\n\
- blt _080D0E22\n\
- ldr r1, _080D0E2C @ =gUnknown_03004DC0\n\
- movs r0, 0x3\n\
- strb r0, [r1, 0x15]\n\
- adds r0, r4, 0\n\
- bl DestroyAnimVisualTask\n\
-_080D0E22:\n\
- pop {r4}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080D0E28: .4byte gUnknown_03004DE0\n\
-_080D0E2C: .4byte gUnknown_03004DC0\n\
-.syntax divided\n");
-}
-#endif
-
-void sub_80D0E30(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 0) - 16;
- sprite->pos1.y = sub_8077FC0(gBattleAnimBankTarget) + 16;
- sprite->data[0] = 0;
- sprite->data[1] = 0;
- sprite->data[2] = 0;
- sprite->data[3] = 16;
- sprite->data[4] = 0;
- sprite->data[5] = sub_807A100(gBattleAnimBankTarget, 0) + 2;
- sprite->data[6] = sub_8076F98(0x3F);
- sprite->callback = sub_80D0E8C;
-}
-
-void sub_80D0E8C(struct Sprite* sprite)
-{
- switch (sprite->data[0])
- {
- case 0:
- if (++sprite->data[2] > 1)
- {
- sprite->data[2] = 0;
- sprite->invisible = !sprite->invisible;
- }
- if (++sprite->data[1] > 16)
- {
- sprite->invisible = 0;
- sprite->data[0]++;
- }
- break;
- case 1:
- if (++sprite->data[1] > 3 && sprite->data[2] < sprite->data[5])
- {
- sprite->data[1] = 0;
- sprite->pos1.y -= 1;
- sprite->data[2]++;
- if (sprite->data[2] % 10 == 0)
- PlaySE12WithPanning(0xCD, sprite->data[6]);
- }
- sprite->data[4] += sprite->data[3];
- if (sprite->data[4] > 31)
- {
- sprite->data[4] = 0x40 - sprite->data[4];
- sprite->data[3] *= -1;
- }
- else if (sprite->data[4] <= -32)
- {
- sprite->data[4] = -0x40 - sprite->data[4];
- sprite->data[3] *= -1;
- }
- sprite->pos2.x = sprite->data[4];
- if (sprite->data[5] == sprite->data[2])
- {
- sprite->data[1] = 0;
- sprite->data[2] = 0;
- sprite->data[0]++;
- }
- break;
- case 2:
- if (++sprite->data[2] > 1)
- {
- sprite->data[2] = 0;
- sprite->invisible = !sprite->invisible;
- }
- if (++sprite->data[1] > 16)
- {
- sprite->invisible = 0;
- move_anim_8072740(sprite);
- }
- break;
- }
-}
-
-void sub_80D0FD8(struct Sprite* sprite)
-{
- u8 bank = 0;
- u16 sp0 = 0;
- u16 sp1 = 0;
- u8 r4;
-
- if (gBattleAnimArgs[2] == 0)
- bank = gBattleAnimBankAttacker;
- else
- bank = gBattleAnimBankTarget;
-
- r4 = gBattleAnimArgs[3] ^ 1;
- if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
- {
- sub_807A3FC(bank, r4, &sp0, &sp1);
- if (r4 == 0)
- r4 = sub_8077ABC(bank, 0);
- else
- r4 = sub_8077ABC(bank, 2);
-
- if (GetBankSide(bank) != 0)
- gBattleAnimArgs[0] -= (sp0 - r4) - gBattleAnimArgs[0]; // This is weird.
- else
- gBattleAnimArgs[0] = sp0 - r4;
- }
-
- sprite->callback = sub_80793C4;
- sub_80793C4(sprite);
-}
-
-void sub_80D1098(struct Sprite* sprite)
-{
- if (sub_8078B5C(sprite))
- {
- FreeSpriteOamMatrix(sprite);
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80D10B8(struct Sprite* sprite)
-{
- u16 r9 = 0;
- u16 r6 = 0;
- s16 sp0 = 0;
- s16 sp1 = 0;
- u8 sp4;
- u8 bankr7;
- u8 bankr8;
- u8 r10;
-
- if (gBattleAnimArgs[5] == 0)
- {
- bankr7 = gBattleAnimBankAttacker;
- bankr8 = gBattleAnimBankTarget;
- }
- else
- {
- bankr7 = gBattleAnimBankTarget;
- bankr8 = gBattleAnimBankAttacker;
- }
-
- if (gBattleAnimArgs[6] == 0)
- {
- r10 = 0;
- sp4 = 1;
- }
- else
- {
- r10 = 2;
- sp4 = 3;
- }
-
- if (GetBankSide(bankr7) != 0)
- {
- r9 = sub_8077ABC(bankr7, r10) + gBattleAnimArgs[0];
- if (IsAnimBankSpriteVisible(bankr8 ^ 2))
- sprite->subpriority = gSprites[gObjectBankIDs[bankr8 ^ 2]].subpriority - 1;
- else
- sprite->subpriority = gSprites[gObjectBankIDs[bankr8]].subpriority - 1;
- }
- else
- {
- r9 = sub_8077ABC(bankr7, r10) - gBattleAnimArgs[0];
- if (gMain.inBattle && IsAnimBankSpriteVisible(bankr7 ^ 2))
- {
- if (gSprites[gObjectBankIDs[bankr7]].pos1.x < gSprites[gObjectBankIDs[bankr7 ^ 2]].pos1.x)
- sprite->subpriority = gSprites[gObjectBankIDs[bankr7 ^ 2]].subpriority + 1;
- else
- sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
- }
- else
- {
- sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
- }
-
- }
-
- r6 = sub_8077ABC(bankr7, sp4) + gBattleAnimArgs[1];
- if (gMain.inBattle && IsAnimBankSpriteVisible(bankr8 ^ 2))
- {
- sub_807A3FC(bankr8, gBattleAnimArgs[6], &sp0, &sp1);
- }
- else
- {
- sp0 = sub_8077ABC(bankr8, r10);
- sp1 = sub_8077ABC(bankr8, sp4);
- }
-
- if (GetBankSide(bankr8))
- sp0 += gBattleAnimArgs[3];
- else
- sp0 -= gBattleAnimArgs[3];
-
- sp1 += gBattleAnimArgs[4];
- sprite->pos1.x = sprite->data[1] = r9;
- sprite->pos1.y = sprite->data[3] = r6;
- sprite->data[2] = sp0;
- sprite->data[4] = sp1;
- sprite->data[0] = gBattleAnimArgs[0];
- obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->callback = sub_80D1098;
- sub_80D1098(sprite);
-}
-
-void sub_80D1318(struct Sprite* sprite)
-{
- u8 index = IndexOfSpritePaletteTag(0x27DB);
- if (index != 0xFF)
- {
- BlendPalette(((index << 20) + 0x1010000) >> 16, 15, gBattleAnimArgs[5], gBattleAnimArgs[4]);
- }
-
- StartSpriteAffineAnim(sprite, 1);
- sprite->callback = sub_80793C4;
- sub_80793C4(sprite);
-}
-
-void sub_80D1368(struct Sprite* sprite)
-{
- s16 r1;
- sub_80787B0(sprite, 0);
- r1 = (GetBankSide(gBattleAnimBankAttacker)) ? -0xA0 : 0xA0;
- sprite->data[0] = 0x380;
- sprite->data[1] = r1;
- sprite->data[7] = gBattleAnimArgs[2];
- sprite->callback = sub_80D13AC;
-}
-
-void sub_80D13AC(struct Sprite* sprite)
-{
- s16 add;
- sprite->pos2.y -= (sprite->data[0] >> 8);
- sprite->pos2.x = sprite->data[1] >> 8;
- sprite->data[0] -= 32;
- add = (GetBankSide(gBattleAnimBankAttacker)) ? -0xA0 : 0xA0;
- sprite->data[1] += add;
- if (sprite->pos2.y > 0)
- {
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos2.y = 0;
- sprite->pos2.x = 0;
- sprite->data[0] = 0;
- StartSpriteAffineAnim(sprite, 1);
- sprite->callback = sub_80D1424;
- }
-}
-
-void sub_80D1424(struct Sprite* sprite)
-{
- if (sprite->data[0]++ > 19)
- {
- StartSpriteAffineAnim(sprite, 2);
- sprite->callback = sub_80D144C;
- }
-}
-
-void sub_80D144C(struct Sprite* sprite)
-{
- if (sprite->affineAnimEnded)
- {
- StartSpriteAffineAnim(sprite, 1);
- sprite->data[0] = 0;
- if (sprite->data[7] == 0)
- {
- sprite->oam.tileNum += 16;
- sprite->callback = sub_80D14C4;
- }
- else
- {
- sprite->oam.tileNum += 32;
- sprite->callback = sub_80D154C;
- }
- }
-}
-
-void sub_80D14C4(struct Sprite* sprite)
-{
- sprite->pos2.y -= 2;
- if (++sprite->data[0] == 9)
- {
- sprite->data[0] = 16;
- sprite->data[1] = 0;
- REG_BLDCNT = 0x3F40;
- REG_BLDALPHA = sprite->data[0];
- sprite->callback = sub_80D1504;
- }
-}
-
-void sub_80D1504(struct Sprite* sprite)
-{
- if (sprite->data[1]++ % 3 == 0)
- {
- sprite->data[0]--;
- REG_BLDALPHA = sprite->data[0] | ((16 - sprite->data[0]) << 8);
- if (sprite->data[0] == 0)
- sprite->callback = sub_80D154C;
- }
-}
-
-void sub_80D154C(struct Sprite* sprite)
-{
- if ((u16)gBattleAnimArgs[7] == 0xFFFF)
- {
- sprite->invisible = 1;
- if (sprite->data[7] == 0)
- sprite->callback = sub_80D158C;
- else
- sprite->callback = move_anim_8072740;
- }
-}
-
-void sub_80D158C(struct Sprite* sprite)
-{
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- move_anim_8072740(sprite);
-}
-
-void sub_80D15A4(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- u8 spriteId = GetAnimBankSpriteId(0);
- task->data[0] = spriteId;
- sub_80798F4(task, spriteId, &gUnknown_083D79BC);
- task->func = sub_80D15E0;
-}
-
-void sub_80D15E0(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (sub_807992C(task) == 0)
- {
- gSprites[task->data[0]].pos2.y = 0;
- gSprites[task->data[0]].invisible = 1;
- DestroyAnimVisualTask(taskId);
- }
-}
-
-void sub_80D1638(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- task->data[0] = 0;
- task->data[1] = 0;
- task->data[2] = 0;
- task->data[3] = 0;
- task->data[12] = 3;
- if (GetBankSide(gBattleAnimBankTarget) == 0)
- {
- task->data[13] = 0xFFFF;
- task->data[14] = 8;
- }
- else
- {
- task->data[13] = 1;
- task->data[14] = -8;
- }
-
- task->data[15] = GetAnimBankSpriteId(1);
- task->func = sub_80D16A0;
-}
-
-void sub_80D16A0(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
-
- switch (task->data[0])
- {
- case 0:
- gSprites[task->data[15]].pos2.x += task->data[14];
- task->data[1] = 0;
- task->data[2] = 0;
- task->data[3] = 0;
- task->data[0]++;
- break;
- case 1:
- if (++task->data[1] > 1)
- {
- task->data[1] = 0;
- task->data[2]++;
- if (task->data[2] & 1)
- gSprites[task->data[15]].pos2.x += 6;
- else
- gSprites[task->data[15]].pos2.x -= 6;
-
- if (++task->data[3] > 4)
- {
- if (task->data[2] & 1)
- gSprites[task->data[15]].pos2.x -= 6;
-
- task->data[0]++;
- }
- }
- break;
- case 2:
- if (--task->data[12] != 0)
- task->data[0] = 0;
- else
- task->data[0]++;
- break;
- case 3:
- gSprites[task->data[15]].pos2.x += task->data[13];
- if (gSprites[task->data[15]].pos2.x == 0)
- DestroyAnimVisualTask(taskId);
- break;
- }
-}
-
-void sub_80D17C4(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- task->data[0] = 0;
- task->data[1] = 0;
- task->data[2] = 0;
- task->data[3] = 0;
- task->data[4] = 1;
- task->data[13] = 14;
- task->data[14] = 2;
- task->data[15] = GetAnimBankSpriteId(0);
- task->func = sub_80D1808;
-}
-
-void sub_80D1808(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- if (task->data[0] == 0 && ++task->data[1] > task->data[4])
- {
- task->data[1] = 0;
- if (++task->data[2] & 1)
- gSprites[task->data[15]].invisible = 0;
- else
- gSprites[task->data[15]].invisible = 1;
-
- if (++task->data[3] >= task->data[13])
- {
- if (++task->data[4] < task->data[14])
- {
- task->data[1] = 0;
- task->data[2] = 0;
- task->data[3] = 0;
- }
- else
- {
- gSprites[task->data[15]].invisible = 0;
- DestroyAnimVisualTask(taskId);
- }
- }
- }
-}
-
-void sub_80D18D4(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- task->data[0] = 0;
- task->data[1] = 4;
- task->data[2] = 0;
- task->data[3] = 0;
- task->data[4] = 0;
- task->data[5] = 0;
- task->data[6] = 0;
- task->data[7] = 0;
- task->data[8] = 0;
- task->data[13] = 0;
- task->data[14] = sub_8077ABC(gBattleAnimBankAttacker, 0);
- task->data[15] = sub_8077ABC(gBattleAnimBankAttacker, 1);
- task->func = sub_80D1930;
-}
-
-void sub_80D1930(u8 taskId)
-{
- struct Task* task = &gTasks[taskId];
- switch (task->data[8])
- {
- case 0:
- if (++task->data[4] > 1)
- {
- task->data[4] = 0;
- task->data[5] = (task->data[5] + 1) & 1;
- if (++task->data[6] > 20)
- {
- if (task->data[7] == 0)
- {
- task->data[6] = 0;
- task->data[8] = 1;
- }
- else
- task->data[8] = 2;
- }
- }
- break;
- case 1:
- task->data[5] = 0;
- if (++task->data[4] > 20)
- {
- task->data[7] = 1;
- task->data[8] = 0;
- }
- break;
- case 2:
- task->data[5] = 1;
- break;
- }
-
- switch (task->data[0])
- {
- case 0:
- if (++task->data[1] > 4)
- {
- u8 spriteId;
- task->data[1] = 0;
- spriteId = CreateSprite(&gSpriteTemplate_83D79E8, task->data[14], task->data[15], 0);
- if (spriteId != MAX_SPRITES)
- {
- gSprites[spriteId].data[0] = taskId;
- gSprites[spriteId].data[1] = 13;
- gSprites[spriteId].pos2.x = gUnknown_083D7A00[task->data[2]][0];
- gSprites[spriteId].pos2.y = gUnknown_083D7A00[task->data[2]][1];
- task->data[13]++;
- if (++task->data[2] > 3)
- {
- task->data[2] = 0;
- if (++task->data[3] > 5)
- task->data[0]++;
- }
- }
- }
- break;
- case 1:
- if (task->data[13] == 0)
- DestroyAnimVisualTask(taskId);
- break;
- }
-}
-
-void sub_80D1A70(struct Sprite* sprite)
-{
- sprite->invisible = gTasks[sprite->data[0]].data[5];
- if (sprite->animEnded)
- {
- gTasks[sprite->data[0]].data[sprite->data[1]]--;
- DestroySprite(sprite);
- }
-}
-
-void sub_80D1ADC(u8 taskId)
-{
- int i;
- u8 sp[8];
- void* src;
- void* dest;
- void* what;
- sp[0] = IndexOfSpritePaletteTag(0x27DE);
- for (i = 1; i <= 4; i++)
- {
- sp[i] = AllocSpritePalette(0x2710 - i);
- }
-
- src = &gBattleAnimSpritePalette_206;
- dest = (NotInBattle()) ? gSharedMem + 0x18000 - 0x3800: gSharedMem + 0x18000;
- LZDecompressWram(src, dest);
- for (i = 0; i <= 4; i++)
- {
- what = ((NotInBattle()) ? gSharedMem + 0x14800 : gSharedMem + 0x18000) + (i << 5);
- LoadPalette(what, (u16)((sp[i] << 4) + 0x100), 32);
- }
-
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80D1B80(u8 taskId)
-{
- int i;
- for (i = 0; i < 5; i++)
- {
- FreeSpritePaletteByTag(gUnknown_083D7A5C[i]);
- }
-
- DestroyAnimVisualTask(taskId);
-}
-
-void sub_80D1BA8(struct Sprite* sprite, u8 a, u8 b)
-{
- u8 tile;
- tile = (b & 1);
- tile = ((-tile | tile) >> 31) & 32;
- sprite->oam.tileNum += tile + (a << 2);
- sprite->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083D7A5C[b >> 1]);
-}
-
-void sub_80D1C08(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 0);
- if (GetBankSide(gBattleAnimBankAttacker) != 0)
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
-
- sprite->data[0] = gBattleAnimArgs[4];
- sprite->data[2] = sub_8077ABC(gBattleAnimBankAttacker, 0) + gBattleAnimArgs[2];
- sprite->data[4] = sub_8077ABC(gBattleAnimBankAttacker, 1) + gBattleAnimArgs[3];
- sprite->callback = sub_8078B34;
- StoreSpriteCallbackInData(sprite, move_anim_8072740);
- sub_80D1BA8(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]);
-}
-
-void sub_80D1C80(struct Sprite* sprite)
-{
- if (++sprite->data[0] == 1)
- sub_80787B0(sprite, 0);
-
- sprite->pos2.x = Sin(sprite->data[1], 8);
- sprite->pos2.y = sprite->data[2] >> 8;
- sprite->data[1] = (sprite->data[1] + 7) & 0xFF;
- sprite->data[2] -= 0x80;
- if (sprite->data[0] == 0x3C)
- move_anim_8072740(sprite);
-}
-
-void sub_80D1CD0(u8 taskId)
-{
- int zero;
- bool8 result = NotInBattle();
- u16 var = 0xF0;
- if (result)
- {
- var = 0x98;
- zero = 0;
- }
- else
- {
- zero = 0;
- }
-
- gUnknown_030042C4 = var;
- gUnknown_03004240 = 0xA0;
- REG_WIN0H = var;
- REG_WIN0V = 0xA0;
- REG_WININ = 0x3F1F;
- REG_WINOUT = 0x3F3F;
- REG_BLDCNT = 0xC8;
- REG_BLDY = 0x10;
- gTasks[taskId].data[0] = zero;
- gTasks[taskId].data[1] = var;
- gTasks[taskId].func = sub_80D1D48;
-}
-
-void sub_80D1D48(u8 taskId)
-{
- gTasks[taskId].data[0] += 13;
- gTasks[taskId].data[1] -= 13;
- if (gTasks[taskId].data[0] >= gTasks[taskId].data[1])
- {
- gUnknown_030042C4 = 0;
- gTasks[taskId].func = sub_80D1D9C;
- }
- else
- {
- gUnknown_030042C4 = gTasks[taskId].data[1] | (gTasks[taskId].data[0] << 8);
- }
-}
-
-void sub_80D1D9C(u8 taskId)
-{
- if (++gTasks[taskId].data[10] == 5)
- {
- gTasks[taskId].data[11] = 0x88;
- RequestSpriteCopy((u8 *)(&gTasks[taskId].data[11]), (u8 *)(&REG_BLDCNT), 2);
- BlendPalettes(sub_80791A8(1, 0, 0, 0, 0, 0, 0), 16, RGB(31, 31, 31));
- }
- else if (gTasks[taskId].data[10] > 4)
- {
- gUnknown_030042C4 = 0;
- gUnknown_03004240 = 0;
- REG_WININ = 0x3F3F;
- REG_WINOUT = 0x3F3F;
- REG_BLDCNT = 0;
- REG_BLDY = 0;
- DestroyAnimVisualTask(taskId);
- }
-}
-
-void sub_80D1E38(u8 taskId)
-{
- u8 spriteId = GetAnimBankSpriteId(1);
- if (++gTasks[taskId].data[0] == 1)
- {
- sub_80798F4(&gTasks[taskId], GetAnimBankSpriteId(1), &gUnknown_083D7A98);
- gSprites[spriteId].pos2.x = 4;
- }
- else
- {
- gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
- if (sub_807992C(&gTasks[taskId]) == 0)
- {
- gSprites[spriteId].pos2.x = 0;
- gSprites[spriteId].pos2.y = 0;
- DestroyAnimVisualTask(taskId);
- }
- }
-}
-
-void sub_80D1EC8(u8 taskId)
-{
- u8 spriteId = GetAnimBankSpriteId(0);
- if (++gTasks[taskId].data[0] == 1)
- {
- sub_80798F4(&gTasks[taskId], GetAnimBankSpriteId(0), &gUnknown_083D7A98);
- gSprites[spriteId].pos2.x = 4;
- }
- else
- {
- gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
- if (sub_807992C(&gTasks[taskId]) == 0)
- {
- gSprites[spriteId].pos2.x = 0;
- gSprites[spriteId].pos2.y = 0;
- DestroyAnimVisualTask(taskId);
- }
- }
-}
-
-void sub_80D1F58(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- sprite->data[0] = 0x5F;
- sprite->data[1] = sprite->pos1.x;
- sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2);
- sprite->data[3] = sprite->pos1.y;
- sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3);
- obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->callback = sub_80D1FA4;
-}
-
-void sub_80D1FA4(struct Sprite* sprite)
-{
- if (sub_8078B5C(sprite) == 0)
- {
- sprite->pos2.y += Sin(sprite->data[5], 14);
- sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
- }
- else
- {
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80D1FDC(struct Sprite* sprite)
-{
- if (sprite->data[0] == 0)
- {
- sprite->data[1] = gBattleAnimArgs[0];
- sprite->data[2] = gBattleAnimArgs[1];
- sprite->data[0]++;
- }
- else
- {
- sprite->data[4] += sprite->data[1];
- sprite->pos2.x = sprite->data[4] >> 8;
- sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]);
- sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
- if (sprite->data[3] > 0x64)
- {
- sprite->invisible = sprite->data[3] % 2;
- }
-
- if (sprite->data[3] > 0x78)
- {
- move_anim_8072740(sprite);
- }
- }
-}
-
-void sub_80D2064(struct Sprite* sprite)
-{
- sprite->pos1.x = gBattleAnimArgs[0];
- sprite->pos1.y = 0xA0;
- sprite->data[0] = gBattleAnimArgs[2];
- sprite->data[1] = gBattleAnimArgs[1];
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80D2094);
-}
-
-void sub_80D2094(struct Sprite* sprite)
-{
- s16 y;
- sprite->data[2] += sprite->data[1];
- sprite->pos2.y = -((u16)sprite->data[2] >> 8);
- sprite->pos2.x = Sin(sprite->data[3], 4);
- sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
- y = sprite->pos1.y + sprite->pos2.y;
- if (y <= 0x48)
- {
- sprite->invisible = sprite->data[3] % 2;
- if (y <= 0x40)
- move_anim_8072740(sprite);
- }
-}
-
-void sub_80D2100(u8 taskId)
-{
- struct Struct_sub_8078914 subStruct;
- u8* tempvar;
- REG_BLDCNT = 0x3F42;
- REG_BLDALPHA = 0x1000;
- REG_BG1CNT_BITFIELD.priority = 3;
- REG_BG1CNT_BITFIELD.screenSize = 0;
- if (!NotInBattle())
- REG_BG1CNT_BITFIELD.charBaseBlock = 1;
-
- gUnknown_030042C0 = 0;
- gUnknown_030041B4 = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- sub_8078914(&subStruct);
- tempvar = subStruct.field_4;
- DmaFill32(3, 0x0, tempvar, 0x1000);
- LZDecompressVram(&gAttractTilemap, tempvar);
- LZDecompressVram(&gAttractGfx, subStruct.field_0);
- LoadCompressedPalette(&gAttractPal, subStruct.field_8 << 4, 32);
- if (NotInBattle())
- sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
-
- gTasks[taskId].func = sub_80D21F0;
-}
-
-void sub_80D21F0(u8 taskId)
-{
- struct Struct_sub_8078914 subStruct;
-
- switch (gTasks[taskId].data[12])
- {
- case 0:
- if (++gTasks[taskId].data[10] == 4)
- {
- gTasks[taskId].data[10] = 0;
- gTasks[taskId].data[11]++;
- REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
- if (gTasks[taskId].data[11] == 16)
- {
- gTasks[taskId].data[12]++;
- gTasks[taskId].data[11] = 0;
- }
- }
- break;
- case 1:
- if (++gTasks[taskId].data[11] == 0x8D)
- {
- gTasks[taskId].data[11] = 16;
- gTasks[taskId].data[12]++;
- }
- break;
- case 2:
- if (++gTasks[taskId].data[10] == 4)
- {
- gTasks[taskId].data[10] = 0;
- gTasks[taskId].data[11]--;
- REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
- if (gTasks[taskId].data[11] == 0)
- {
- gTasks[taskId].data[12]++;
- gTasks[taskId].data[11] = 0;
- }
- }
- break;
- case 3:
- sub_8078914(&subStruct);
- {
- u8 *addr = subStruct.field_0;
- u32 size = 0x2000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
- }
- DmaClear32(3, subStruct.field_4, 0x800);
- if (!NotInBattle())
- REG_BG1CNT_BITFIELD.charBaseBlock = 0;
-
- gTasks[taskId].data[12]++;
- // fall through
- case 4:
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BG1CNT_BITFIELD.priority = 1;
- DestroyAnimVisualTask(taskId);
- break;
- }
-}
-
-void sub_80D23B4(u8 taskId)
-{
- struct Struct_sub_8078914 subStruct;
- u8* tempvar;
- REG_BLDCNT = 0x3F42;
- REG_BLDALPHA = 0x1000;
- REG_BG1CNT_BITFIELD.priority = 1;
- REG_BG1CNT_BITFIELD.screenSize = 0;
- if (!NotInBattle())
- REG_BG1CNT_BITFIELD.charBaseBlock = 1;
-
- gUnknown_030042C0 = 0;
- gUnknown_030041B4 = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- sub_8078914(&subStruct);
- tempvar = subStruct.field_4;
- DmaFill32(3, 0x0, tempvar, 0x1000);
- if (NotInBattle())
- LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFaceContest, subStruct.field_4);
- else if (GetBankSide(gBattleAnimBankTarget) == 1)
- LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFacePlayer, subStruct.field_4);
- else
- LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFaceOpponent, subStruct.field_4);
-
- LZDecompressVram(&gBattleAnimBackgroundImage_ScaryFace, subStruct.field_0);
- LoadCompressedPalette(&gBattleAnimBackgroundPalette_ScaryFace, subStruct.field_8 << 4, 32);
- if (NotInBattle())
- sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
-
- gTasks[taskId].func = sub_80D24E0;
-}
-
-void sub_80D24E0(u8 taskId)
-{
- struct Struct_sub_8078914 subStruct;
-
- switch (gTasks[taskId].data[12])
- {
- case 0:
- if (++gTasks[taskId].data[10] == 2)
- {
- gTasks[taskId].data[10] = 0;
- gTasks[taskId].data[11]++;
- REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
- if (gTasks[taskId].data[11] == 14)
- {
- gTasks[taskId].data[12]++;
- gTasks[taskId].data[11] = 0;
- }
- }
- break;
- case 1:
- if (++gTasks[taskId].data[11] == 0x15)
- {
- gTasks[taskId].data[11] = 14;
- gTasks[taskId].data[12]++;
- }
- break;
- case 2:
- if (++gTasks[taskId].data[10] == 2)
- {
- gTasks[taskId].data[10] = 0;
- gTasks[taskId].data[11]--;
- REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
- if (gTasks[taskId].data[11] == 0)
- {
- gTasks[taskId].data[12]++;
- gTasks[taskId].data[11] = 0;
- }
- }
- break;
- case 3:
- sub_8078914(&subStruct);
- {
- u8 *addr = subStruct.field_0;
- u32 size = 0x2000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
- }
- DmaClear32(3, subStruct.field_4, 0x800);
- if (!NotInBattle())
- REG_BG1CNT_BITFIELD.charBaseBlock = 0;
-
- gTasks[taskId].data[12]++;
- // fall through
- case 4:
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BG1CNT_BITFIELD.priority = 1;
- DestroyAnimVisualTask(taskId);
- break;
- }
-}
-
-void sub_80D26A4(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->affineAnimPaused = 1;
- sprite->data[0] = gBattleAnimArgs[0];
- sprite->data[1] = gBattleAnimArgs[1];
- sprite->data[7] = sub_8079E90(gBattleAnimBankAttacker);
- sprite->callback = sub_80D2704;
- sub_80D2704(sprite);
-}
-
-void sub_80D2704(struct Sprite* sprite)
-{
- if ((u16)(sprite->data[1] - 0x40) <= 0x7F)
- sprite->subpriority = sprite->data[7] + 1;
- else
- sprite->subpriority = sprite->data[7] - 1;
-
- sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8);
- sprite->pos2.y = Cos(sprite->data[1], sprite->data[3] >> 8);
- sprite->data[1] = (sprite->data[1] + 9) & 0xFF;
- switch (sprite->data[5])
- {
- case 1:
- sprite->data[2] -= 0x400;
- sprite->data[3] -= 0x100;
- if (++sprite->data[4] == sprite->data[0])
- {
- sprite->data[5] = 2;
- return;
- }
- break;
- case 0:
- sprite->data[2] += 0x400;
- sprite->data[3] += 0x100;
- if (++sprite->data[4] == sprite->data[0])
- {
- sprite->data[4] = 0;
- sprite->data[5] = 1;
- }
- break;
- }
-
- if ((u16)gBattleAnimArgs[7] == 0xFFFF)
- move_anim_8072740(sprite);
-}
-
-void sub_80D27E0(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
- sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
- sprite->callback = sub_80D2834;
-}
-
-void sub_80D2834(struct Sprite* sprite)
-{
- sprite->pos2.x += sprite->data[0];
- sprite->pos2.y += sprite->data[1];
- if (sprite->pos1.x + sprite->pos2.x + 16 > 0x110u || sprite->pos1.y + sprite->pos2.y > 0xA0 || sprite->pos1.y + sprite->pos2.y < -16)
- move_anim_8072740(sprite);
-}
-
-void sub_80D287C(struct Sprite* sprite)
-{
- sprite->pos2.x += sprite->data[0];
- sprite->pos2.y += sprite->data[1];
- if (sprite->data[3]++ >= sprite->data[2])
- move_anim_8072740(sprite);
-}
-
-void sub_80D28AC(struct Sprite* sprite)
-{
- sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3);
- sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
- sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
- sprite->data[2] = gBattleAnimArgs[1];
- sprite->callback = sub_80D287C;
-}
-
-void sub_80D2904(struct Sprite* sprite)
-{
- if (sprite->animEnded)
- move_anim_8072740(sprite);
-}
-
-void sub_80D2920(struct Sprite* sprite)
-{
- sub_80787B0(sprite, 1);
- sprite->callback = sub_80D2904;
-}
-
-void sub_80D2938(struct Sprite* sprite)
-{
- s16 r5;
- if (sprite->data[0] == 0)
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- }
-
- sprite->data[0]++;
- r5 = (sprite->data[0] * 10) & 0xFF;
- sprite->pos2.x = Sin(r5, 0x50) >> 8;
- if (sprite->data[0] <= 0x4F)
- sprite->pos2.y = (sprite->data[0] / 2) + (Cos(r5, 0x50) >> 8);
-
- if (sprite->data[0] > 0x5A)
- {
- sprite->data[2]++;
- sprite->pos2.x -= sprite->data[2] / 2;
- }
-
- if (sprite->data[0] > 0x64)
- move_anim_8072740(sprite);
-}
-
-void sub_80D29CC(struct Sprite* sprite)
-{
- sprite->data[5]++;
- sprite->pos2.x = Sin(sprite->data[3], 5);
- sprite->pos2.y = sprite->data[5] / 2;
- sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
- if (sprite->data[5] > 20)
- sprite->invisible = sprite->data[5] % 2;
-
- if (sprite->data[5] > 30)
- move_anim_8072740(sprite);
-}
-
-void sub_80D2A38(struct Sprite* sprite)
-{
- if (sprite->data[0] == 0)
- {
- sprite->data[1] = gBattleAnimArgs[0];
- sprite->data[2] = gBattleAnimArgs[1];
- sprite->data[0]++;
- }
- else
- {
- sprite->data[4] += sprite->data[1];
- sprite->pos2.x = sprite->data[4] >> 8;
- sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]);
- sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
- if (sprite->data[3] > 0x46)
- {
- sprite->callback = sub_80D29CC;
- sprite->pos1.x += sprite->pos2.x;
- sprite->pos1.y += sprite->pos2.y;
- sprite->pos2.x = 0;
- sprite->pos2.y = 0;
- sprite->data[3] = Random() % 0xB4;
- }
- }
-}
-
-/* void sub_80D2ABC(struct Sprite* sprite)
-{
- int var;
- s16 var2;
- int var3;
- if (sprite->data[3] == 0)
- {
- sprite->pos1.x += gBattleAnimArgs[0];
- sprite->pos1.y += gBattleAnimArgs[1];
- StartSpriteAnim(sprite, 0);
- sprite->subpriority = sub_8079E90(gBattleAnimBankTarget) - 1;
- sprite->data[2] = 1;
- }
-
- sprite->data[0] += sprite->data[2];
- var = sprite->data[0] * 4;
- if (var < 0)
- var += 0xFF;
-
- sprite->data[1] = (sprite->data[0] * 4) -(((var) >> 8) << 8);
- if (sprite->data[1] < 0)
- sprite->data[1] = 0;
-
- var3 = sprite->data[1];
- var2 = sprite->data[0];
- var2 /= 4;
- sprite->pos2.x = Cos(var3, 30 - var2);
- var3 = sprite->data[1];
- var2 = sprite->data[0] / 8;
- sprite->pos2.x = Sin(var3, 10 - var2);
- if (sprite->data[1] > 0x80 && sprite->data[2] > 0)
- sprite->data[2] = 0xFFFF;
-} */ \ No newline at end of file