summaryrefslogtreecommitdiff
path: root/src/battle
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle')
-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/battle/battle_controller_player.c4
-rw-r--r--src/battle/battle_controller_safari.c4
-rw-r--r--src/battle/battle_controller_wally.c2
-rw-r--r--src/battle/battle_party_menu.c8
-rw-r--r--src/battle/battle_setup.c12
-rw-r--r--src/battle/reshow_battle_screen.c10
22 files changed, 1431 insertions, 37 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/battle/battle_controller_player.c b/src/battle/battle_controller_player.c
index 653f0938c..c2d34db0d 100644
--- a/src/battle/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -162,7 +162,7 @@ extern u8 gUnknown_0300434C[];
extern u8 gUnknown_0202E8F4;
extern u8 gUnknown_0202E8F5;
extern u8 gUnknown_02038470[];
-extern u16 gScriptItemId;
+extern u16 gSpecialVar_ItemId;
extern u8 gDisplayedStringBattle[];
extern const u8 BattleText_LinkStandby[];
@@ -1522,7 +1522,7 @@ void sub_802E03C(void)
{
if (gMain.callback2 == sub_800F808 && !gPaletteFade.active)
{
- Emitcmd35(1, gScriptItemId);
+ Emitcmd35(1, gSpecialVar_ItemId);
PlayerBufferExecCompleted();
}
}
diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c
index 3dcfca948..6f6286945 100644
--- a/src/battle/battle_controller_safari.c
+++ b/src/battle/battle_controller_safari.c
@@ -31,7 +31,7 @@ extern u8 gObjectBankIDs[];
extern struct SpriteTemplate gUnknown_02024E8C;
extern u16 gBattleTypeFlags;
extern u32 gBattleExecBuffer;
-extern u16 gScriptItemId;
+extern u16 gSpecialVar_ItemId;
extern MainCallback gPreBattleCallback1;
extern u8 gBankInMenu;
extern u8 gHealthboxIDs[];
@@ -315,7 +315,7 @@ void sub_812B758(void)
{
if (gMain.callback2 == sub_800F808 && !gPaletteFade.active)
{
- Emitcmd35(1, gScriptItemId);
+ Emitcmd35(1, gSpecialVar_ItemId);
SafariBufferExecCompleted();
}
}
diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c
index 0d698d9a5..d81c43381 100644
--- a/src/battle/battle_controller_wally.c
+++ b/src/battle/battle_controller_wally.c
@@ -367,7 +367,7 @@ void sub_81374FC(void)
if (gMain.callback2 == sub_800F808
&& !gPaletteFade.active)
{
- Emitcmd35(1, gScriptItemId);
+ Emitcmd35(1, gSpecialVar_ItemId);
WallyBufferExecCompleted();
}
}
diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c
index 5decf8a7b..d4dcae0ca 100644
--- a/src/battle/battle_party_menu.c
+++ b/src/battle/battle_party_menu.c
@@ -426,7 +426,7 @@ bool8 SetUpBattlePartyMenu(void)
case 10:
if (gUnknown_02038473 == 3)
{
- if (GetItemEffectType(gScriptItemId) == 10)
+ if (GetItemEffectType(gSpecialVar_ItemId) == 10)
ewram1B000.promptTextId = 0xFF;
else
ewram1B000.promptTextId = 3;
@@ -464,9 +464,9 @@ void HandleBattlePartyMenu(u8 taskId)
{
if (!gPaletteFade.active)
{
- if (gUnknown_02038473 == 3 && GetItemEffectType(gScriptItemId) == 10)
+ if (gUnknown_02038473 == 3 && GetItemEffectType(gSpecialVar_ItemId) == 10)
{
- gUnknown_03004AE4(taskId, gScriptItemId, Task_80952E4);
+ gUnknown_03004AE4(taskId, gSpecialVar_ItemId, Task_80952E4);
return;
}
@@ -480,7 +480,7 @@ void HandleBattlePartyMenu(u8 taskId)
else
{
sub_806D5A4();
- gUnknown_03004AE4(taskId, gScriptItemId, Task_80952E4);
+ gUnknown_03004AE4(taskId, gSpecialVar_ItemId, Task_80952E4);
}
}
else
diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c
index 6baf47dee..f71aad090 100644
--- a/src/battle/battle_setup.c
+++ b/src/battle/battle_setup.c
@@ -33,7 +33,7 @@
#include "text.h"
#include "trainer.h"
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern void (*gFieldCallback)(void);
@@ -48,7 +48,7 @@ EWRAM_DATA static u8 *sTrainerBattleScriptRetAddr = NULL;
EWRAM_DATA static u8 *sTrainerBattleEndScript = NULL;
extern u16 gBattleTypeFlags;
-extern u16 gScriptLastTalked;
+extern u16 gSpecialVar_LastTalked;
extern u8 gBattleOutcome;
extern struct MapObject gMapObjects[];
@@ -858,8 +858,8 @@ static void CB2_GiveStarter(void)
{
u16 starterPoke;
- *GetVarPointer(0x4023) = gScriptResult;
- starterPoke = GetStarterPokemon(gScriptResult);
+ *GetVarPointer(0x4023) = gSpecialVar_Result;
+ starterPoke = GetStarterPokemon(gSpecialVar_Result);
ScriptGiveMon(starterPoke, 5, 0, 0, 0, 0);
ResetTasks();
sub_80408BC();
@@ -980,7 +980,7 @@ static void battle_80801F0(void)
{
if (sTrainerMapObjectLocalId)
{
- gScriptLastTalked = sTrainerMapObjectLocalId;
+ gSpecialVar_LastTalked = sTrainerMapObjectLocalId;
gSelectedMapObject = GetFieldObjectIdByLocalIdAndMap(sTrainerMapObjectLocalId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
}
}
@@ -1029,7 +1029,7 @@ u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
void TrainerWantsBattle(u8 trainerMapObjId, u8 *trainerScript)
{
gSelectedMapObject = trainerMapObjId;
- gScriptLastTalked = gMapObjects[trainerMapObjId].localId;
+ gSpecialVar_LastTalked = gMapObjects[trainerMapObjId].localId;
BattleSetup_ConfigureTrainerBattle(trainerScript + 1);
ScriptContext1_SetupScript(gUnknown_0819F80B);
ScriptContext2_Enable();
diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c
index 14f465352..03b5660fe 100644
--- a/src/battle/reshow_battle_screen.c
+++ b/src/battle/reshow_battle_screen.c
@@ -198,15 +198,9 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
static void sub_807B06C(void)
{
- struct BGCntrlBitfield *regBgcnt1, *regBgcnt2;
-
sub_800D6D4();
-
- regBgcnt1 = (void*)(&REG_BG1CNT);
- regBgcnt1->charBaseBlock = 0;
-
- regBgcnt2 = (void*)(&REG_BG2CNT);
- regBgcnt2->charBaseBlock = 0;
+ ((vBgCnt *)&REG_BG1CNT)->charBaseBlock = 0;
+ ((vBgCnt *)&REG_BG2CNT)->charBaseBlock = 0;
}
static bool8 LoadAppropiateBankSprite(u8 bank)