summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-12-20 15:54:25 -0600
committerGitHub <noreply@github.com>2017-12-20 15:54:25 -0600
commit871ae4c283ec8bc7730df52790b5ca53baa82230 (patch)
tree6899e26a068d4854a026e3d13b7c51c36b68208a /src
parent3c5f725de49371aced1788a21f5e53df5b498b5f (diff)
parent5e6bfe67a87e041ebdc9e0b573d1ae1f22b79d59 (diff)
Merge pull request #494 from huderlem/battle_anim
Decompile small battle_anim effects
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/beta_beat_up.c34
-rw-r--r--src/battle/anim/bubble.c102
-rw-r--r--src/battle/anim/energy_wave.c162
-rw-r--r--src/battle/anim/fury_cutter_count.c20
-rw-r--r--src/battle/anim/guard.c34
-rw-r--r--src/battle/anim/heated_rock.c205
-rwxr-xr-xsrc/battle/anim/love_bg.c7
-rw-r--r--src/battle/anim/noise.c56
-rw-r--r--src/battle/anim/note_spin.c110
-rw-r--r--src/battle/anim/rain.c56
-rwxr-xr-xsrc/battle/anim/scary_face.c7
-rw-r--r--src/battle/anim/shock.c106
-rw-r--r--src/battle/anim/sunlight.c17
-rw-r--r--src/battle/anim/thunder.c36
-rw-r--r--src/battle/anim/water.c371
-rw-r--r--src/battle/anim/wisp_orb.c105
-rw-r--r--src/engine/sprite.c8
-rw-r--r--src/rom_8077ABC.c13
18 files changed, 1414 insertions, 35 deletions
diff --git a/src/battle/anim/beta_beat_up.c b/src/battle/anim/beta_beat_up.c
new file mode 100644
index 000000000..499e52a80
--- /dev/null
+++ b/src/battle/anim/beta_beat_up.c
@@ -0,0 +1,34 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D6278(struct Sprite *);
+
+// beta_beat_up
+
+void sub_80D6234(struct Sprite *sprite)
+{
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+
+ sprite->callback = sub_80D6278;
+}
+
+static void sub_80D6278(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ move_anim_8074EE0(sprite);
+ }
+}
diff --git a/src/battle/anim/bubble.c b/src/battle/anim/bubble.c
new file mode 100644
index 000000000..5da0d9929
--- /dev/null
+++ b/src/battle/anim/bubble.c
@@ -0,0 +1,102 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "util.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D32E8(struct Sprite *sprite);
+static void sub_80D3370(struct Sprite *sprite);
+static void sub_80D3398(struct Sprite *sprite);
+
+// bubble (indidivual bubble that floats around)
+// Used in Bubble and Bubblebeam
+
+void sub_80D31C8(struct Sprite* sprite)
+{
+ u8 newSpriteId;
+
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) - gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[1];
+ }
+
+ sprite->animPaused = 1;
+
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[6];
+ 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);
+
+ newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
+ sprite->data[5] = newSpriteId;
+
+ sprite->pos1.x -= Sin((u8)gBattleAnimArgs[4], gBattleAnimArgs[2]);
+ sprite->pos1.y -= Cos((u8)gBattleAnimArgs[4], gBattleAnimArgs[3]);
+
+ gSprites[newSpriteId].data[0] = gBattleAnimArgs[2];
+ gSprites[newSpriteId].data[1] = gBattleAnimArgs[3];
+ gSprites[newSpriteId].data[2] = gBattleAnimArgs[5];
+ gSprites[newSpriteId].data[3] = (u8)gBattleAnimArgs[4] * 256;
+ gSprites[newSpriteId].data[4] = gBattleAnimArgs[6];
+
+ sprite->callback = sub_80D32E8;
+ sprite->callback(sprite);
+}
+
+static void sub_80D32E8(struct Sprite *sprite)
+{
+ u8 spriteId = sprite->data[5];
+
+ u8 counter = gSprites[spriteId].data[4];
+ u16 index = gSprites[spriteId].data[3];
+
+ sprite->data[0] = 1;
+ sub_8078B5C(sprite);
+
+ sprite->pos2.x += Sin(index / 256, gSprites[spriteId].data[0]);
+ sprite->pos2.y += Cos(index / 256, gSprites[spriteId].data[1]);
+
+ gSprites[spriteId].data[3] = gSprites[spriteId].data[2] + index;
+
+ if (--counter != 0)
+ {
+ gSprites[spriteId].data[4] = counter;
+ }
+ else
+ {
+ sprite->callback = sub_80D3370;
+ DestroySprite(&gSprites[spriteId]);
+ }
+}
+
+static void sub_80D3370(struct Sprite *sprite)
+{
+ sprite->animPaused = 0;
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, sub_80D3398);
+}
+
+static void sub_80D3398(struct Sprite *sprite)
+{
+ sprite->data[0] = 10;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+}
diff --git a/src/battle/anim/energy_wave.c b/src/battle/anim/energy_wave.c
new file mode 100644
index 000000000..ffba5c300
--- /dev/null
+++ b/src/battle/anim/energy_wave.c
@@ -0,0 +1,162 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+extern const struct SpriteTemplate gSpriteTemplate_83D9130[];
+
+static void sub_80D35DC(struct Sprite *);
+static void sub_80D365C(u8);
+static void sub_80D370C(struct Sprite *);
+
+// energy_wave (animates steady "waves" of energy)
+// Used in Hydro Pump, Mud Shot, Signal Beam, Flamethrower, Psywave, and
+// Hydro Cannon.
+
+void sub_80D3554(struct Sprite *sprite)
+{
+ sub_80787B0(sprite, 1);
+
+ sprite->data[0] = 30;
+ 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] = 0xD200 / sprite->data[0];
+ sprite->data[7] = gBattleAnimArgs[3];
+
+ if (gBattleAnimArgs[7] > 127)
+ {
+ sprite->data[6] = (gBattleAnimArgs[7] - 127) << 8;
+ sprite->data[7] = -sprite->data[7];
+ }
+ else
+ {
+ sprite->data[6] = gBattleAnimArgs[7] << 8;
+ }
+
+ sprite->callback = sub_80D35DC;
+ sprite->callback(sprite);
+}
+
+static void sub_80D35DC(struct Sprite *sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ move_anim_8072740(sprite);
+ }
+
+ sprite->pos2.y += Sin(sprite->data[6] >> 8, sprite->data[7]);
+ if (((sprite->data[6] + sprite->data[5]) >> 8) > 127)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = -sprite->data[7];
+ }
+ else
+ {
+ sprite->data[6] += sprite->data[5];
+ }
+}
+
+void sub_80D3630(u8 taskId)
+{
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gBattleAnimArgs[7] = 0;
+ gTasks[taskId].func = sub_80D365C;
+}
+
+static void sub_80D365C(u8 taskId)
+{
+ gBattleAnimArgs[7] = (gBattleAnimArgs[7] + 3) & 0xFF;
+ if (--gTasks[taskId].data[0] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80D3698(struct Sprite *sprite)
+{
+ u8 subpriority;
+
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 0);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1);
+ sprite->pos2.y = -10;
+
+ subpriority = sub_8079E90(gBattleAnimBankAttacker);
+
+ if (!NotInBattle())
+ {
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ {
+ sprite->pos2.x = 10;
+ sprite->subpriority = subpriority + 2;
+ }
+ else
+ {
+ sprite->pos2.x = -10;
+ sprite->subpriority = subpriority - 2;
+ }
+ }
+ else
+ {
+ sprite->pos2.x = -10;
+ sprite->subpriority = subpriority + 2;
+ }
+
+ sprite->callback = sub_80D370C;
+}
+
+static void sub_80D370C(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80D3728(struct Sprite *sprite)
+{
+ int var1, var2;
+
+ if (GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget))
+ {
+ gBattleAnimArgs[0] *= -1;
+
+ if (GetBankIdentity(gBattleAnimBankAttacker) == 0 || GetBankIdentity(gBattleAnimBankAttacker) == 1)
+ {
+ gBattleAnimArgs[0] *= -1;
+ }
+
+ }
+
+ if ((gBattleAnimArgs[5] & 0xFF00) == 0)
+ var1 = 1;
+ else
+ var1 = 0;
+
+ if ((u8)gBattleAnimArgs[5] == 0)
+ var2 = 3;
+ else
+ var2 = 1;
+
+ sub_80787B0(sprite, var1);
+
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, var2) + gBattleAnimArgs[3];
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
diff --git a/src/battle/anim/fury_cutter_count.c b/src/battle/anim/fury_cutter_count.c
new file mode 100644
index 000000000..17b084585
--- /dev/null
+++ b/src/battle/anim/fury_cutter_count.c
@@ -0,0 +1,20 @@
+#include "global.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 *gDisableStructMoveAnim; // TODO: this is declared with a different type in different files
+
+// fury_cutter (updates the direction and count of the fury cutter animation)
+// Used in Fury Cutter.
+
+void UpdateFuryCutterAnimDirection(u8 taskId)
+{
+ gBattleAnimArgs[7] = gDisableStructMoveAnim[16] & 1;
+ DestroyAnimVisualTask(taskId);
+}
+
+void UpdateFuryCutterAnimCount(u8 taskId)
+{
+ gBattleAnimArgs[7] = gDisableStructMoveAnim[16];
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c
new file mode 100644
index 000000000..4769db2e4
--- /dev/null
+++ b/src/battle/anim/guard.c
@@ -0,0 +1,34 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+extern u16 gBattleTypeFlags;
+
+// guard (moves guard rings upwards)
+// Used in Safeguard.
+
+void sub_80D3014(struct Sprite *sprite)
+{
+ if ((gBattleTypeFlags & 1) && IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2))
+ {
+ sub_807A3FC(gBattleAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->pos1.y += 40;
+
+ StartSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 0);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1) + 40;
+ }
+
+ sprite->data[0] = 13;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y - 72;
+
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
diff --git a/src/battle/anim/heated_rock.c b/src/battle/anim/heated_rock.c
new file mode 100644
index 000000000..1d59669cf
--- /dev/null
+++ b/src/battle/anim/heated_rock.c
@@ -0,0 +1,205 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+extern u16 gBattleTypeFlags;
+
+void sub_80D59B0(struct Sprite *);
+static void sub_80D5A74(struct Sprite *);
+
+// heated_rock (moves heated rock sprites)
+// Used in Eruption.
+
+void sub_80D58FC(struct Sprite *sprite)
+{
+ sub_80D59B0(sprite);
+
+ if (sprite->invisible)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ DestroySprite(sprite);
+ }
+}
+
+u16 sub_80D5940(u8 spriteId)
+{
+ u16 var1 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y + gSprites[spriteId].centerToCornerVecY;
+
+ if (GetBankSide(gBattleAnimBankAttacker) == 0)
+ {
+ var1 = ((var1 << 16) + 0x4A0000) >> 16;
+ }
+ else
+ {
+ var1 = ((var1 << 16) + 0x2C0000) >> 16;
+ }
+
+ return var1;
+}
+
+void sub_80D5994(struct Sprite *sprite, s16 x, s16 y)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = (u16)sprite->pos1.x * 8;
+ sprite->data[3] = (u16)sprite->pos1.y * 8;
+ sprite->data[4] = x * 8;
+ sprite->data[5] = y * 8;
+}
+
+#ifdef NONMATCHING
+void sub_80D59B0(struct Sprite *sprite)
+{
+ int var1;
+ int var2;
+
+ if (++sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ ++sprite->data[1];
+ sprite->data[3] += ((u16)sprite->data[1] * (u16)sprite->data[1]);
+ }
+
+ var1 = (u16)sprite->data[4] + (u16)sprite->data[2];
+ sprite->data[2] = var1;
+ var1 = (s16)var1 >> 3;
+ sprite->pos1.x = var1;
+
+ var2 = (u16)sprite->data[5] + (u16)sprite->data[3];
+ sprite->data[3] = var2;
+ var2 = (s16)var2 >> 3;
+ sprite->pos1.y = var2;
+
+ if ((u32)((var1 + 8) << 16) > 0x1000000 || var2 < -8 || var2 > 120)
+ {
+ sprite->invisible = 1;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80D59B0(struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {lr}\n\
+ adds r2, r0, 0\n\
+ ldrh r0, [r2, 0x2E]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x2E]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x2\n\
+ ble _080D59DA\n\
+ movs r0, 0\n\
+ strh r0, [r2, 0x2E]\n\
+ ldrh r0, [r2, 0x30]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x30]\n\
+ ldrh r0, [r2, 0x30]\n\
+ adds r1, r0, 0\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ ldrh r3, [r2, 0x34]\n\
+ adds r0, r3\n\
+ strh r0, [r2, 0x34]\n\
+_080D59DA:\n\
+ ldrh r0, [r2, 0x36]\n\
+ ldrh r1, [r2, 0x32]\n\
+ adds r0, r1\n\
+ strh r0, [r2, 0x32]\n\
+ lsls r0, 16\n\
+ asrs r0, 19\n\
+ strh r0, [r2, 0x20]\n\
+ ldrh r1, [r2, 0x38]\n\
+ ldrh r3, [r2, 0x34]\n\
+ adds r1, r3\n\
+ strh r1, [r2, 0x34]\n\
+ lsls r1, 16\n\
+ asrs r3, r1, 19\n\
+ strh r3, [r2, 0x22]\n\
+ adds r0, 0x8\n\
+ lsls r0, 16\n\
+ movs r1, 0x80\n\
+ lsls r1, 17\n\
+ cmp r0, r1\n\
+ bhi _080D5A10\n\
+ adds r1, r3, 0\n\
+ movs r0, 0x8\n\
+ negs r0, r0\n\
+ cmp r1, r0\n\
+ blt _080D5A10\n\
+ cmp r1, 0x78\n\
+ ble _080D5A1C\n\
+_080D5A10:\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x3E\n\
+ ldrb r1, [r0]\n\
+ movs r2, 0x4\n\
+ orrs r1, r2\n\
+ strb r1, [r0]\n\
+_080D5A1C:\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+void sub_80D5A20(struct Sprite *sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[6] = gBattleAnimArgs[2];
+ sprite->data[7] = gBattleAnimArgs[3];
+
+ sprite->oam.tileNum += gBattleAnimArgs[4] * 16;
+ sprite->callback = sub_80D5A74;
+}
+
+static void sub_80D5A74(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (sprite->data[6] != 0)
+ {
+ sprite->data[6]--;
+ return;
+ }
+
+ sprite->data[0]++;
+ // fall through
+ case 1:
+ sprite->pos1.y += 8;
+ if (sprite->pos1.y >= sprite->data[7])
+ {
+ sprite->pos1.y = sprite->data[7];
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ if ((++sprite->data[2] & 1) != 0)
+ {
+ sprite->pos2.y = -3;
+ }
+ else
+ {
+ sprite->pos2.y = 3;
+ }
+ }
+
+ if (++sprite->data[3] > 16)
+ {
+ move_anim_8072740(sprite);
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/love_bg.c b/src/battle/anim/love_bg.c
index c5659463e..1e49b536c 100755
--- a/src/battle/anim/love_bg.c
+++ b/src/battle/anim/love_bg.c
@@ -6,13 +6,6 @@
#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;
diff --git a/src/battle/anim/noise.c b/src/battle/anim/noise.c
new file mode 100644
index 000000000..78953d96a
--- /dev/null
+++ b/src/battle/anim/noise.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D2E30(struct Sprite *);
+
+// noise (moving music note)
+// Used in Uproar.
+
+void sub_80D2D68(struct Sprite* sprite)
+{
+ int var1;
+ u8 slot = gBattleAnimArgs[0] == 0 ? gBattleAnimBankAttacker : gBattleAnimBankTarget;
+
+ if (GetBankSide(slot) == 1)
+ {
+ gBattleAnimArgs[1] *= -1;
+ }
+
+ sprite->pos1.x = sub_8077ABC(slot, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = sub_8077ABC(slot, 3) + gBattleAnimArgs[2];
+ sprite->data[0] = 0;
+ sprite->data[1] = (u16)sprite->pos1.x << 3;
+ sprite->data[2] = (u16)sprite->pos1.y << 3;
+
+ var1 = gBattleAnimArgs[1] << 3;
+ if (var1 < 0)
+ var1 += 7;
+ sprite->data[3] = var1 >> 3;
+
+ var1 = gBattleAnimArgs[2] << 3;
+ if (var1 < 0)
+ var1 += 7;
+ sprite->data[4] = var1 >> 3;
+
+ sprite->oam.tileNum += gBattleAnimArgs[3] * 16;
+ sprite->callback = sub_80D2E30;
+}
+
+static void sub_80D2E30(struct Sprite *sprite)
+{
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+
+ sprite->pos1.x = sprite->data[1] >> 3;
+ sprite->pos1.y = sprite->data[2] >> 3;
+
+ if (++sprite->data[0] > 16)
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/note_spin.c b/src/battle/anim/note_spin.c
new file mode 100644
index 000000000..bdc0f4615
--- /dev/null
+++ b/src/battle/anim/note_spin.c
@@ -0,0 +1,110 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D2F80(struct Sprite *);
+static void sub_80D2FA4(struct Sprite *);
+
+// note_spin (spins music notes around, and rotates them)
+// Used in Perish Song.
+
+void sub_80D2E68(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[1] = 120 - gBattleAnimArgs[0];
+ sprite->invisible = 1;
+ }
+
+ if (++sprite->data[0] == sprite->data[1])
+ {
+ sub_8079108(sprite->oam.paletteNum + 16, 0);
+ }
+
+ if (sprite->data[0] == sprite->data[1] + 80)
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80D2EC8(struct Sprite *sprite)
+{
+ int index;
+ int var2;
+
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x = 120;
+ sprite->pos1.y = (gBattleAnimArgs[0] + (((u16)gBattleAnimArgs[0]) >> 31)) / 2 - 15;
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+
+ sprite->data[5] = 120;
+ sprite->data[3] = gBattleAnimArgs[2];
+ }
+
+ sprite->data[0]++;
+
+ sprite->data[1] = (sprite->data[0] + ((u16)sprite->data[0] >> 31)) / 2;
+ index = ((sprite->data[0] * 3) + (u16)sprite->data[3]);
+ var2 = 0xFF;
+ sprite->data[6] = (sprite->data[6] + 10) & 0xFF;
+
+ index &= var2;
+ sprite->pos2.x = Cos(index, 100);
+
+ sprite->pos2.y = sprite->data[1] + Sin(index, 10) + Cos(sprite->data[6], 4);
+
+ if (sprite->data[0] > sprite->data[5])
+ {
+ sprite->callback = sub_80D2F80;
+
+ sprite->data[0] = 0;
+ oamt_add_pos2_onto_pos1(sprite);
+ sprite->data[2] = 5;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+
+ StartSpriteAffineAnim(sprite, 1);
+ }
+}
+
+static void sub_80D2F80(struct Sprite *sprite)
+{
+ if (++sprite->data[0] > 10)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80D2FA4;
+ }
+}
+
+static void sub_80D2FA4(struct Sprite *sprite)
+{
+ sprite->data[3] += sprite->data[2];
+ sprite->pos2.y = sprite->data[3];
+
+ sprite->data[2]++;
+
+ if (sprite->data[3] > 48 && sprite->data[2] > 0)
+ {
+ sprite->data[2] = sprite->data[4] - 5;
+ sprite->data[4]++;
+ }
+
+ if (sprite->data[4] > 3)
+ {
+ int var1 = sprite->data[2];
+ sprite->invisible = var1 - (((s32)(var1 + ((u32)var1 >> 31)) >> 1) << 1);
+ move_anim_8072740(sprite);
+ }
+
+ if (sprite->data[4] == 4)
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/rain.c b/src/battle/anim/rain.c
new file mode 100644
index 000000000..b38233e3c
--- /dev/null
+++ b/src/battle/anim/rain.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "random.h"
+#include "sprite.h"
+#include "task.h"
+
+extern s16 gBattleAnimArgs[8];
+extern const struct SpriteTemplate gSpriteTemplate_83D9130[];
+
+static void MoveAnimRaindrop(struct Sprite *);
+
+// rain (spawns and animates raindrops)
+// Used in Rain Dance and general rain animation.
+
+void CreateAnimRaindrops(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[1] = gBattleAnimArgs[0];
+ gTasks[taskId].data[2] = gBattleAnimArgs[1];
+ gTasks[taskId].data[3] = gBattleAnimArgs[2];
+ }
+
+ gTasks[taskId].data[0]++;
+
+ if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1)
+ {
+ u8 x = Random() % 240;
+ u8 y = Random() % 80;
+ CreateSprite(gSpriteTemplate_83D9130, x, y, 4);
+ }
+
+ if (gTasks[taskId].data[0] == gTasks[taskId].data[3])
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void SetAnimRaindropCallback(struct Sprite *sprite)
+{
+ sprite->callback = MoveAnimRaindrop;
+}
+
+static void MoveAnimRaindrop(struct Sprite *sprite)
+{
+ if (++sprite->data[0] <= 13)
+ {
+ sprite->pos2.x++;
+ sprite->pos2.y += 4;
+ }
+
+ if (sprite->animEnded)
+ {
+ DestroySprite(sprite);
+ }
+}
diff --git a/src/battle/anim/scary_face.c b/src/battle/anim/scary_face.c
index 9f1dfd7d0..0c5056704 100755
--- a/src/battle/anim/scary_face.c
+++ b/src/battle/anim/scary_face.c
@@ -6,13 +6,6 @@
#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;
diff --git a/src/battle/anim/shock.c b/src/battle/anim/shock.c
new file mode 100644
index 000000000..35c380f23
--- /dev/null
+++ b/src/battle/anim/shock.c
@@ -0,0 +1,106 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+extern struct OamMatrix gOamMatrices[];
+
+extern void sub_80DA48C(struct Sprite *);
+
+// shock (moves the little electricity lines)
+// Used in Shock.
+
+void sub_80D6294(struct Sprite *sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimBankTarget, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimBankTarget, 3);
+
+ 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->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_8078114;
+}
+
+void sub_80D6328(struct Sprite *sprite)
+{
+ u8 slot;
+ u32 matrixNum;
+ s16 sineVal;
+
+ switch (gBattleAnimArgs[4])
+ {
+ case 0:
+ slot = gBattleAnimBankAttacker;
+ break;
+ case 1:
+ default:
+ slot = gBattleAnimBankTarget;
+ break;
+ case 2:
+ if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2))
+ {
+ slot = gBattleAnimBankAttacker;
+ }
+ else
+ {
+ slot = gBattleAnimBankAttacker ^ 2;
+ }
+ break;
+ case 3:
+ if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2))
+ {
+ slot = gBattleAnimBankTarget ^ 2;
+ }
+ else
+ {
+ slot = gBattleAnimBankTarget;
+ }
+ break;
+ }
+
+ if (gBattleAnimArgs[5] == 0)
+ {
+ sprite->pos1.x = sub_8077ABC(slot, 0);
+ sprite->pos1.y = sub_8077ABC(slot, 1);
+ }
+ else
+ {
+ sprite->pos1.x = sub_8077ABC(slot, 2);
+ sprite->pos1.y = sub_8077ABC(slot, 3);
+ }
+
+ sprite->pos2.x = (gSineTable[gBattleAnimArgs[0]] * gBattleAnimArgs[1]) >> 8;
+ sprite->pos2.y = (gSineTable[gBattleAnimArgs[0] + 64] * gBattleAnimArgs[1]) >> 8;
+
+ if (gBattleAnimArgs[6] & 1)
+ {
+ sprite->oam.priority = sub_8079ED4(slot) + 1;
+ }
+
+ matrixNum = sprite->oam.matrixNum;
+ sineVal = gSineTable[gBattleAnimArgs[2]];
+
+ gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[gBattleAnimArgs[2] + 64];
+ gOamMatrices[matrixNum].b = sineVal;
+ gOamMatrices[matrixNum].c = -sineVal;
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->callback = sub_80DA48C;
+}
diff --git a/src/battle/anim/sunlight.c b/src/battle/anim/sunlight.c
new file mode 100644
index 000000000..f6cb8a077
--- /dev/null
+++ b/src/battle/anim/sunlight.c
@@ -0,0 +1,17 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+// sunlight (creates sunlight orbs)
+// Used in Sunny Day
+
+void sub_80D517C(struct Sprite *sprite)
+{
+ sprite->pos1.x = 0;
+ sprite->pos1.y = 0;
+ sprite->data[0] = 60;
+ sprite->data[2] = 140;
+ sprite->data[4] = 80;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
diff --git a/src/battle/anim/thunder.c b/src/battle/anim/thunder.c
new file mode 100644
index 000000000..5064148ef
--- /dev/null
+++ b/src/battle/anim/thunder.c
@@ -0,0 +1,36 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+extern u16 gBattleTypeFlags;
+
+static void sub_80D6218(struct Sprite *);
+
+// thunder (positions the lightning bolts)
+// Used in Thunder, Thunder Punch, and Tri Attack.
+
+void sub_80D61C8(struct Sprite *sprite)
+{
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->callback = sub_80D6218;
+}
+
+static void sub_80D6218(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c
new file mode 100644
index 000000000..396a4637d
--- /dev/null
+++ b/src/battle/anim/water.c
@@ -0,0 +1,371 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "util.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+static void sub_80D3874(struct Sprite *);
+
+void sub_80D37FC(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 1);
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[4];
+
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8072740);
+}
+
+void sub_80D3838(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[3] != 0)
+ {
+ sub_8078764(sprite, 1);
+ }
+ else
+ {
+ sub_80787B0(sprite, 1);
+ }
+
+ sprite->data[7] = gBattleAnimArgs[2];
+ sprite->callback = sub_80D3874;
+}
+
+static void sub_80D3874(struct Sprite *sprite)
+{
+ sprite->data[0] = (sprite->data[0] + 11) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[0], 4);
+
+ sprite->data[1] += 48;
+ sprite->pos2.y = -(sprite->data[1] >> 8);
+
+ if (--sprite->data[7] == -1)
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+__attribute__((naked))
+void sub_80D38BC(u8 taskId)
+{
+ asm(".syntax unified\n\
+ .equ REG_BLDCNT, 0x4000050\n\
+ .equ REG_BG1CNT, 0x400000A\n\
+ .equ REG_BG1HOFS, 0x4000014\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x14\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ ldr r1, _080D398C @ =REG_BLDCNT\n\
+ ldr r2, _080D3990 @ =0x00003f42\n\
+ adds r0, r2, 0\n\
+ strh r0, [r1]\n\
+ adds r1, 0x2\n\
+ movs r3, 0x80\n\
+ lsls r3, 5\n\
+ adds r0, r3, 0\n\
+ strh r0, [r1]\n\
+ ldr r2, _080D3994 @ =REG_BG1CNT\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x4\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x1\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldrb r1, [r2, 0x1]\n\
+ movs r0, 0x3F\n\
+ ands r0, r1\n\
+ movs r1, 0x40\n\
+ orrs r0, r1\n\
+ strb r0, [r2, 0x1]\n\
+ mov r0, sp\n\
+ bl sub_8078914\n\
+ ldr r2, [sp]\n\
+ movs r3, 0x80\n\
+ lsls r3, 6\n\
+ add r6, sp, 0x10\n\
+ add r0, sp, 0xC\n\
+ mov r12, r0\n\
+ movs r5, 0\n\
+ ldr r1, _080D3998 @ =0x040000d4\n\
+ movs r4, 0x80\n\
+ lsls r4, 5\n\
+ mov r8, r6\n\
+ ldr r7, _080D399C @ =0x85000400\n\
+ movs r0, 0x85\n\
+ lsls r0, 24\n\
+ mov r9, r0\n\
+_080D3920:\n\
+ str r5, [sp, 0x10]\n\
+ mov r0, r8\n\
+ str r0, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ str r7, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ adds r2, r4\n\
+ subs r3, r4\n\
+ cmp r3, r4\n\
+ bhi _080D3920\n\
+ str r5, [sp, 0x10]\n\
+ str r6, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ lsrs r0, r3, 2\n\
+ mov r2, r9\n\
+ orrs r0, r2\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ movs r0, 0\n\
+ mov r3, r12\n\
+ strb r0, [r3]\n\
+ strb r0, [r3]\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+ ldr r0, _080D3998 @ =0x040000d4\n\
+ str r6, [r0]\n\
+ str r1, [r0, 0x4]\n\
+ ldr r1, _080D399C @ =0x85000400\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ bl NotInBattle\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080D39B8\n\
+ ldr r2, _080D3994 @ =REG_BG1CNT\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xD\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r0, _080D39A0 @ =gBattleAnimBankAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _080D39A8\n\
+ ldr r0, _080D39A4 @ =gUnknown_08E70968\n\
+ b _080D39AA\n\
+ .align 2, 0\n\
+_080D398C: .4byte REG_BLDCNT\n\
+_080D3990: .4byte 0x00003f42\n\
+_080D3994: .4byte REG_BG1CNT\n\
+_080D3998: .4byte 0x040000d4\n\
+_080D399C: .4byte 0x85000400\n\
+_080D39A0: .4byte gBattleAnimBankAttacker\n\
+_080D39A4: .4byte gUnknown_08E70968\n\
+_080D39A8:\n\
+ ldr r0, _080D39B4 @ =gUnknown_08E70C38\n\
+_080D39AA:\n\
+ ldr r1, [sp, 0x4]\n\
+ bl LZDecompressVram\n\
+ b _080D39CE\n\
+ .align 2, 0\n\
+_080D39B4: .4byte gUnknown_08E70C38\n\
+_080D39B8:\n\
+ ldr r0, _080D39F0 @ =gUnknown_08E70F0C\n\
+ ldr r1, [sp, 0x4]\n\
+ bl LZDecompressVram\n\
+ mov r0, sp\n\
+ ldrb r0, [r0, 0x8]\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r2, 0\n\
+ movs r3, 0x1\n\
+ bl sub_80763FC\n\
+_080D39CE:\n\
+ ldr r0, _080D39F4 @ =gBattleAnimBackgroundImage_Surf\n\
+ ldr r1, [sp]\n\
+ bl LZDecompressVram\n\
+ ldr r0, _080D39F8 @ =gBattleAnimArgs\n\
+ movs r1, 0\n\
+ ldrsh r0, [r0, r1]\n\
+ cmp r0, 0\n\
+ bne _080D3A00\n\
+ ldr r0, _080D39FC @ =gBattleAnimBackgroundPalette_Surf\n\
+ mov r1, sp\n\
+ ldrb r1, [r1, 0x8]\n\
+ lsls r1, 4\n\
+ movs r2, 0x20\n\
+ bl LoadCompressedPalette\n\
+ b _080D3A0E\n\
+ .align 2, 0\n\
+_080D39F0: .4byte gUnknown_08E70F0C\n\
+_080D39F4: .4byte gBattleAnimBackgroundImage_Surf\n\
+_080D39F8: .4byte gBattleAnimArgs\n\
+_080D39FC: .4byte gBattleAnimBackgroundPalette_Surf\n\
+_080D3A00:\n\
+ ldr r0, _080D3A78 @ =gBattleAnimBackgroundImageMuddyWater_Pal\n\
+ mov r1, sp\n\
+ ldrb r1, [r1, 0x8]\n\
+ lsls r1, 4\n\
+ movs r2, 0x20\n\
+ bl LoadCompressedPalette\n\
+_080D3A0E:\n\
+ ldr r0, _080D3A7C @ =sub_80D3D68\n\
+ ldr r4, _080D3A80 @ =gTasks\n\
+ mov r2, r10\n\
+ lsls r5, r2, 2\n\
+ adds r1, r5, r2\n\
+ lsls r1, 3\n\
+ adds r6, r1, r4\n\
+ ldrb r1, [r6, 0x7]\n\
+ adds r1, 0x1\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ bl CreateTask\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ movs r3, 0\n\
+ mov r9, r3\n\
+ mov r0, r8\n\
+ strh r0, [r6, 0x26]\n\
+ mov r1, r8\n\
+ lsls r0, r1, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r7, r0, r4\n\
+ mov r2, r9\n\
+ strh r2, [r7, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ strh r0, [r7, 0xA]\n\
+ strh r0, [r7, 0xC]\n\
+ bl NotInBattle\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0\n\
+ beq _080D3A94\n\
+ ldr r3, _080D3A84 @ =0x0000ffb0\n\
+ adds r0, r3, 0\n\
+ ldr r1, _080D3A88 @ =gUnknown_030042C0\n\
+ strh r0, [r1]\n\
+ ldr r2, _080D3A8C @ =0x0000ffd0\n\
+ adds r0, r2, 0\n\
+ ldr r3, _080D3A90 @ =gUnknown_030041B4\n\
+ strh r0, [r3]\n\
+ movs r0, 0x2\n\
+ strh r0, [r6, 0x8]\n\
+ movs r0, 0x1\n\
+ strh r0, [r6, 0xA]\n\
+ mov r0, r9\n\
+ strh r0, [r7, 0xE]\n\
+ b _080D3AEE\n\
+ .align 2, 0\n\
+_080D3A78: .4byte gBattleAnimBackgroundImageMuddyWater_Pal\n\
+_080D3A7C: .4byte sub_80D3D68\n\
+_080D3A80: .4byte gTasks\n\
+_080D3A84: .4byte 0x0000ffb0\n\
+_080D3A88: .4byte gUnknown_030042C0\n\
+_080D3A8C: .4byte 0x0000ffd0\n\
+_080D3A90: .4byte gUnknown_030041B4\n\
+_080D3A94:\n\
+ ldr r0, _080D3AC4 @ =gBattleAnimBankAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r1, 0x1\n\
+ bne _080D3AD8\n\
+ ldr r2, _080D3AC8 @ =0x0000ff20\n\
+ adds r0, r2, 0\n\
+ ldr r3, _080D3ACC @ =gUnknown_030042C0\n\
+ strh r0, [r3]\n\
+ movs r2, 0x80\n\
+ lsls r2, 1\n\
+ adds r0, r2, 0\n\
+ ldr r3, _080D3AD0 @ =gUnknown_030041B4\n\
+ strh r0, [r3]\n\
+ movs r0, 0x2\n\
+ strh r0, [r6, 0x8]\n\
+ ldr r0, _080D3AD4 @ =0x0000ffff\n\
+ strh r0, [r6, 0xA]\n\
+ strh r1, [r7, 0xE]\n\
+ b _080D3AEE\n\
+ .align 2, 0\n\
+_080D3AC4: .4byte gBattleAnimBankAttacker\n\
+_080D3AC8: .4byte 0x0000ff20\n\
+_080D3ACC: .4byte gUnknown_030042C0\n\
+_080D3AD0: .4byte gUnknown_030041B4\n\
+_080D3AD4: .4byte 0x0000ffff\n\
+_080D3AD8:\n\
+ ldr r0, _080D3B1C @ =gUnknown_030042C0\n\
+ strh r4, [r0]\n\
+ ldr r1, _080D3B20 @ =0x0000ffd0\n\
+ adds r0, r1, 0\n\
+ ldr r2, _080D3B24 @ =gUnknown_030041B4\n\
+ strh r0, [r2]\n\
+ ldr r0, _080D3B28 @ =0x0000fffe\n\
+ strh r0, [r6, 0x8]\n\
+ movs r0, 0x1\n\
+ strh r0, [r6, 0xA]\n\
+ strh r4, [r7, 0xE]\n\
+_080D3AEE:\n\
+ ldr r1, _080D3B2C @ =REG_BG1HOFS\n\
+ ldr r3, _080D3B1C @ =gUnknown_030042C0\n\
+ ldrh r0, [r3]\n\
+ strh r0, [r1]\n\
+ adds r1, 0x2\n\
+ ldr r2, _080D3B24 @ =gUnknown_030041B4\n\
+ ldrh r0, [r2]\n\
+ strh r0, [r1]\n\
+ ldr r1, _080D3B30 @ =gTasks\n\
+ mov r3, r8\n\
+ lsls r0, r3, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r2, r0, r1\n\
+ movs r3, 0xE\n\
+ ldrsh r0, [r2, r3]\n\
+ cmp r0, 0\n\
+ bne _080D3B34\n\
+ movs r0, 0x30\n\
+ strh r0, [r2, 0x10]\n\
+ movs r0, 0x70\n\
+ b _080D3B38\n\
+ .align 2, 0\n\
+_080D3B1C: .4byte gUnknown_030042C0\n\
+_080D3B20: .4byte 0x0000ffd0\n\
+_080D3B24: .4byte gUnknown_030041B4\n\
+_080D3B28: .4byte 0x0000fffe\n\
+_080D3B2C: .4byte REG_BG1HOFS\n\
+_080D3B30: .4byte gTasks\n\
+_080D3B34:\n\
+ movs r0, 0\n\
+ strh r0, [r2, 0x10]\n\
+_080D3B38:\n\
+ strh r0, [r2, 0x12]\n\
+ mov r2, r10\n\
+ adds r0, r5, r2\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ movs r1, 0x1\n\
+ strh r1, [r0, 0x14]\n\
+ ldr r1, _080D3B5C @ =sub_80D3B60\n\
+ str r1, [r0]\n\
+ add sp, 0x14\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080D3B5C: .4byte sub_80D3B60\n\
+ .syntax divided\n");
+}
diff --git a/src/battle/anim/wisp_orb.c b/src/battle/anim/wisp_orb.c
new file mode 100644
index 000000000..0e13fa119
--- /dev/null
+++ b/src/battle/anim/wisp_orb.c
@@ -0,0 +1,105 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "constants/songs.h"
+#include "rom_8077ABC.h"
+#include "sound.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+extern u16 gBattleTypeFlags;
+extern u8 gUnknown_0202F7D2;
+
+static void sub_80D5C5C(struct Sprite *);
+
+// wisp_orb (animates the wisp orbs)
+// Used in Will-O-Wisp
+
+void sub_80D5B0C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sub_80787B0(sprite, 0);
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[7] = gBattleAnimArgs[2];
+
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->data[4] = 4;
+ }
+ else
+ {
+ sprite->data[4] = -4;
+ }
+
+ sprite->oam.priority = sub_8079ED4(gBattleAnimBankTarget);
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->data[1] += 192;
+ if (GetBankSide(gBattleAnimBankAttacker) != 0)
+ {
+ sprite->pos2.y = -(sprite->data[1] >> 8);
+ }
+ else
+ {
+ sprite->pos2.y = sprite->data[1] >> 8;
+ }
+
+ sprite->pos2.x = Sin(sprite->data[2], sprite->data[4]);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xFF;
+
+ if (++sprite->data[3] == 1)
+ {
+ sprite->data[3] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->pos2.x = Sin(sprite->data[2], sprite->data[4]);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xFF;
+
+ if (++sprite->data[3] == 31)
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ sprite->data[0] = 256;
+ 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_8078BD4(sprite);
+ sprite->callback = sub_80D5C5C;
+ }
+ break;
+ }
+}
+
+static void sub_80D5C5C(struct Sprite *sprite)
+{
+ s16 initialData5;
+ s16 newData5;
+
+ if (!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], 16);
+ initialData5 = sprite->data[5];
+ sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
+ newData5 = sprite->data[5];
+
+ if ((initialData5 == 0 || initialData5 > 196) && newData5 > 0 && sprite->data[7] == 0)
+ {
+ PlaySE12WithPanning(SE_W172, gUnknown_0202F7D2);
+ }
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
diff --git a/src/engine/sprite.c b/src/engine/sprite.c
index 69fa860c1..c1bb36917 100644
--- a/src/engine/sprite.c
+++ b/src/engine/sprite.c
@@ -26,14 +26,6 @@
#define SPRITE_TILE_IS_ALLOCATED(n) ((gSpriteTileAllocBitmap[(n) / 8] >> ((n) % 8)) & 1)
-struct OamMatrix
-{
- s16 a;
- s16 b;
- s16 c;
- s16 d;
-};
-
struct SpriteCopyRequest
{
const u8 *src;
diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c
index 8fea7f710..0ecaa9dcb 100644
--- a/src/rom_8077ABC.c
+++ b/src/rom_8077ABC.c
@@ -51,13 +51,6 @@ struct Struct_gUnknown_0837F578 {
u8 field_1;
};
-struct OamMatrix {
- s16 a;
- s16 b;
- s16 c;
- s16 d;
-};
-
struct Struct_2017810 {
u8 filler_0[6];
u8 field_6;
@@ -70,12 +63,6 @@ struct Color {
u16 b:5;
};
-struct Struct_sub_8078914 {
- u8 *field_0;
- u8 *field_4;
- u8 field_8;
-};
-
struct BGCnt {
u16 priority:2;
u16 charBase:2;