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
-rw-r--r--src/battle/battle_2.c2
-rw-r--r--src/battle/battle_3.c2
-rw-r--r--src/battle/battle_4.c6
-rw-r--r--src/battle/battle_ai.c2
-rw-r--r--src/battle/battle_party_menu.c2
-rw-r--r--src/battle/battle_setup.c2
-rw-r--r--src/battle/battle_transition.c2
-rwxr-xr-xsrc/battle_anim_80CA710.c6258
-rw-r--r--src/data/text/move_descriptions_de.h1771
-rw-r--r--src/data/text/move_descriptions_en.h1772
-rw-r--r--src/data/text/nature_names_de.h53
-rw-r--r--src/data/text/nature_names_en.h53
-rw-r--r--src/engine/link.c2
-rw-r--r--src/engine/main.c2
-rw-r--r--src/engine/random.c (renamed from src/engine/rng.c)2
-rw-r--r--src/engine/record_mixing.c2
-rw-r--r--src/engine/time_events.c2
-rw-r--r--src/engine/trade.c4
-rw-r--r--src/field/battle_tower.c2
-rw-r--r--src/field/berry.c2
-rw-r--r--src/field/choose_party.c5
-rw-r--r--src/field/daycare.c2
-rw-r--r--src/field/dewford_trend.c2
-rw-r--r--src/field/easy_chat.c2
-rw-r--r--src/field/field_map_obj.c2
-rw-r--r--src/field/field_player_avatar.c2
-rw-r--r--src/field/field_specials.c2
-rw-r--r--src/field/field_weather.c327
-rw-r--r--src/field/field_weather_2.c1511
-rw-r--r--src/field/field_weather_effects.c2383
-rw-r--r--src/field/lottery_corner.c2
-rw-r--r--src/field/mauville_man.c2
-rw-r--r--src/field/overworld.c8
-rw-r--r--src/field/party_menu.c2
-rw-r--r--src/field/roamer.c2
-rw-r--r--src/field/scrcmd.c4
-rw-r--r--src/field/tv.c4
-rw-r--r--src/field/wild_encounter.c2
-rw-r--r--src/pokemon/learn_move.c24
-rw-r--r--src/pokemon/mon_markings.c16
-rw-r--r--src/pokemon/pokedex.c2
-rw-r--r--src/pokemon/pokemon_1.c2
-rw-r--r--src/pokemon/pokemon_2.c2
-rw-r--r--src/pokemon/pokemon_3.c2
-rw-r--r--src/pokemon/pokemon_menu.c2
-rw-r--r--src/pokemon/pokemon_summary_screen.c5423
-rw-r--r--src/scene/berry_blender.c2
-rw-r--r--src/scene/contest_painting.c2
-rw-r--r--src/scene/credits.c2
-rw-r--r--src/scene/egg_hatch.c2
-rw-r--r--src/scene/evolution_graphics.c2
-rw-r--r--src/scene/evolution_scene.c4
-rw-r--r--src/scene/hall_of_fame.c2
-rw-r--r--src/scene/intro.c2
-rwxr-xr-xsrc/scene/intro_credits_graphics.c2
-rw-r--r--src/scene/new_game.c2
-rw-r--r--src/script_pokemon_util_80C4BF0.c2
-rw-r--r--src/script_pokemon_util_80F99CC.c2
-rw-r--r--src/strings.c2
153 files changed, 19179 insertions, 8030 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/battle_2.c b/src/battle/battle_2.c
index 6d406c5e5..a3cd15042 100644
--- a/src/battle/battle_2.c
+++ b/src/battle/battle_2.c
@@ -13,7 +13,7 @@
#include "pokeball.h"
#include "pokedex.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom3.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
diff --git a/src/battle/battle_3.c b/src/battle/battle_3.c
index 958ee0b55..263eb2be5 100644
--- a/src/battle/battle_3.c
+++ b/src/battle/battle_3.c
@@ -8,7 +8,7 @@
#include "species.h"
#include "pokemon.h"
#include "data2.h"
-#include "rng.h"
+#include "random.h"
#include "text.h"
#include "battle_move_effects.h"
#include "string_util.h"
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c
index 73530c486..4483c252a 100644
--- a/src/battle/battle_4.c
+++ b/src/battle/battle_4.c
@@ -7,7 +7,7 @@
#include "items.h"
#include "data2.h"
#include "hold_effects.h"
-#include "rng.h"
+#include "random.h"
#include "rom3.h"
#include "species.h"
#include "pokemon.h"
@@ -18,6 +18,7 @@
#include "sound.h"
#include "task.h"
#include "decompress.h"
+#include "pokemon_summary_screen.h"
#include "naming_screen.h"
#include "ewram.h"
@@ -139,7 +140,6 @@ u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight);
u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
void DestroyMenuCursor(void);
void sub_802BC6C(void);
-void sub_809D9F0(struct Pokemon *party, u8, u8, void *, u32);
u8 sub_809FA30(void);
bool32 IsHMMove2(u16 move);
void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0);
@@ -10833,7 +10833,7 @@ static void atk5A(void)
case 2:
if (!gPaletteFade.active)
{
- sub_809D9F0(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
BATTLE_STRUCT->atk5A_StateTracker++;
}
break;
diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c
index cb6c10676..0348c3ccd 100644
--- a/src/battle/battle_ai.c
+++ b/src/battle/battle_ai.c
@@ -7,7 +7,7 @@
#include "item.h"
#include "moves.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom_8077ABC.h"
#include "species.h"
#include "util.h"
diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c
index 97e9dc0fc..5531ead4b 100644
--- a/src/battle/battle_party_menu.c
+++ b/src/battle/battle_party_menu.c
@@ -625,7 +625,7 @@ static void Task_ShowSummaryScreen(u8 taskId)
{
DestroyTask(taskId);
EWRAM_1B000.unk262 = 1;
- ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, 4);
+ ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, PSS_MODE_NO_MOVE_ORDER_EDIT);
}
}
diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c
index dab87b462..3d63a85c9 100644
--- a/src/battle/battle_setup.c
+++ b/src/battle/battle_setup.c
@@ -17,7 +17,7 @@
#include "metatile_behavior.h"
#include "opponent_constants.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "safari_zone.h"
#include "script.h"
diff --git a/src/battle/battle_transition.c b/src/battle/battle_transition.c
index 7f6c114f6..f7c8073c5 100644
--- a/src/battle/battle_transition.c
+++ b/src/battle/battle_transition.c
@@ -6,7 +6,7 @@
#include "palette.h"
#include "trig.h"
#include "field_effect.h"
-#include "rng.h"
+#include "random.h"
#include "sprite.h"
#include "sound.h"
#include "songs.h"
diff --git a/src/battle_anim_80CA710.c b/src/battle_anim_80CA710.c
deleted file mode 100755
index 6e4907888..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 "rng.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
diff --git a/src/data/text/move_descriptions_de.h b/src/data/text/move_descriptions_de.h
new file mode 100644
index 000000000..854336295
--- /dev/null
+++ b/src/data/text/move_descriptions_de.h
@@ -0,0 +1,1771 @@
+static const u8 MoveDescription_Pound[] = _(
+ "Ein Hieb mit den Vorder-\n"
+ "beinen oder dem Schweif.");
+
+static const u8 MoveDescription_KarateChop[] = _(
+ "Gute Möglichkeit, einen\n"
+ "Volltreffer zu landen.");
+
+static const u8 MoveDescription_DoubleSlap[] = _(
+ "Trifft den Gegner 2 - 5-mal\n"
+ "hintereinander.");
+
+static const u8 MoveDescription_CometPunch[] = _(
+ "Trifft den Gegner 2 - 5-mal\n"
+ "hintereinander.");
+
+static const u8 MoveDescription_MegaPunch[] = _(
+ "Ein unglaublich kräftiger\n"
+ "Hieb.");
+
+static const u8 MoveDescription_PayDay[] = _(
+ "Wirft Münzen auf Gegner.\n"
+ "Geld wird erstattet.");
+
+static const u8 MoveDescription_FirePunch[] = _(
+ "Schlag, der dem Gegner evtl.\n"
+ "Verbrennungen zufügt.");
+
+static const u8 MoveDescription_IcePunch[] = _(
+ "Ein Schlag, der den Gegner\n"
+ "evtl. einfriert.");
+
+static const u8 MoveDescription_ThunderPunch[] = _(
+ "Schlag, der den Gegner evtl.\n"
+ "paralysiert.");
+
+static const u8 MoveDescription_Scratch[] = _(
+ "Der Gegner wird mit\n"
+ "scharfen Klauen zerkratzt.");
+
+static const u8 MoveDescription_ViceGrip[] = _(
+ "Umklammert den Gegner mit\n"
+ "großen, kräftigen Zangen.");
+
+static const u8 MoveDescription_Guillotine[] = _(
+ "Kräftige Scheren-Attacke.\n"
+ "Führt evtl. zum K.O.");
+
+static const u8 MoveDescription_RazorWind[] = _(
+ "Eine Attacke, die auf 2\n"
+ "Runden basiert.");
+
+static const u8 MoveDescription_SwordsDance[] = _(
+ "Erhöht den Angriffs-Wert\n"
+ "drastisch.");
+
+static const u8 MoveDescription_Cut[] = _(
+ "Trifft den Gegner mit\n"
+ "Klauen, Scheren o. ä.");
+
+static const u8 MoveDescription_Gust[] = _(
+ "Trifft den Gegner mit Wind-\n"
+ "stoß durch Flügelschlag.");
+
+static const u8 MoveDescription_WingAttack[] = _(
+ "Trifft den Gegner mit weit\n"
+ "gespreizten Flügeln.");
+
+static const u8 MoveDescription_Whirlwind[] = _(
+ "Weht Gegner weg und be-\n"
+ "endet den Kampf in Wildnis.");
+
+static const u8 MoveDescription_Fly[] = _(
+ "Steigt empor in der 1. Runde\n"
+ "und trifft Gegner in der 2.");
+
+static const u8 MoveDescription_Bind[] = _(
+ "Umklammert und trifft den\n"
+ "Gegner 2 - 5-mal.");
+
+static const u8 MoveDescription_Slam[] = _(
+ "Schlag mit einem langen\n"
+ "Schweif, einer Ranke o. ä.");
+
+static const u8 MoveDescription_VineWhip[] = _(
+ "Peitschenähnlicher Schlag\n"
+ "mit Ranken.");
+
+static const u8 MoveDescription_Stomp[] = _(
+ "Stampfen mit Fuß. Gegner\n"
+ "schreckt evtl. zurück.");
+
+static const u8 MoveDescription_DoubleKick[] = _(
+ "Doppeltritt. Der Gegner\n"
+ "wird zweimal getroffen.");
+
+static const u8 MoveDescription_MegaKick[] = _(
+ "Ein extrem heftiger Tritt.");
+
+static const u8 MoveDescription_JumpKick[] = _(
+ "Sprung-Tritt. Selbstschä-\n"
+ "digung bei Misserfolg.");
+
+static const u8 MoveDescription_RollingKick[] = _(
+ "Schneller Tritt aus der\n"
+ "Drehung.");
+
+static const u8 MoveDescription_SandAttack[] = _(
+ "Senkt Genauigkeit des Geg-\n"
+ "ners durch Sand.");
+
+static const u8 MoveDescription_Headbutt[] = _(
+ "Rammt den Gegner und lässt\n"
+ "ihn evtl. zurückschrecken.");
+
+static const u8 MoveDescription_HornAttack[] = _(
+ "Spießt den Gegner mit\n"
+ "spitzen Hörnern auf.");
+
+static const u8 MoveDescription_FuryAttack[] = _(
+ "Spießt den Gegner 2 - 5-mal\n"
+ "mit spitzen Hörnern auf.");
+
+static const u8 MoveDescription_HornDrill[] = _(
+ "K.O.-Attacke, die ein Horn\n"
+ "als Bohrer einsetzt.");
+
+static const u8 MoveDescription_Tackle[] = _(
+ "Trifft den Gegner mit vollem\n"
+ "Körpereinsatz.");
+
+static const u8 MoveDescription_BodySlam[] = _(
+ "Körper-Ramme, kann\n"
+ "Paralyse hervorrufen.");
+
+static const u8 MoveDescription_Wrap[] = _(
+ "Umwickelt Gegner 2 - 5-mal\n"
+ "mit Ranken o. ä.");
+
+static const u8 MoveDescription_TakeDown[] = _(
+ "Rücksichtslose Attacke,\n"
+ "mit Selbstschädigung.");
+
+static const u8 MoveDescription_Thrash[] = _(
+ "Attacke in 2 bis 3 Runden,\n"
+ "die Anwender verwirrt.");
+
+static const u8 MoveDescription_DoubleEdge[] = _(
+ "Lebensgefährlicher Angriff\n"
+ "mit Selbstschädigung.");
+
+static const u8 MoveDescription_TailWhip[] = _(
+ "Hieb mit dem Schweif, senkt\n"
+ "die VERT. des Gegners.");
+
+static const u8 MoveDescription_PoisonSting[] = _(
+ "Angriff mit Widerhaken,\n"
+ "kann Gegner vergiften.");
+
+static const u8 MoveDescription_Twineedle[] = _(
+ "Stacheln an den Vorderbei-\n"
+ "nen treffen Gegner 2-mal.");
+
+static const u8 MoveDescription_PinMissile[] = _(
+ "Spitze Nadeln treffen den\n"
+ "Gegner 2 - 5-mal.");
+
+static const u8 MoveDescription_Leer[] = _(
+ "Gegners VERT.-Wert wird\n"
+ "durch Blick gesenkt.");
+
+static const u8 MoveDescription_Bite[] = _(
+ "Beißt zu und lässt den Geg-\n"
+ "ner evtl. zurückschrecken.");
+
+static const u8 MoveDescription_Growl[] = _(
+ "Knurren, das den ANGR.-Wert\n"
+ "des Gegners senkt.");
+
+static const u8 MoveDescription_Roar[] = _(
+ "Verjagt den Gegner und be-\n"
+ "endet den Kampf in Wildnis.");
+
+static const u8 MoveDescription_Sing[] = _(
+ "Ein Lied, das den Gegner\n"
+ "in tiefen Schlaf versetzt.");
+
+static const u8 MoveDescription_Supersonic[] = _(
+ "Ausstoß bizarrer Schallwel-\n"
+ "len. Verwirrt Gegner evtl.");
+
+static const u8 MoveDescription_SonicBoom[] = _(
+ "Schockwellen. Richten immer\n"
+ "20 KP Schaden an.");
+
+static const u8 MoveDescription_Disable[] = _(
+ "Psycho-Attacke. Blockiert\n"
+ "eine Attacke des Gegners.");
+
+static const u8 MoveDescription_Acid[] = _(
+ "Versprüht ätzende Flüssig-\n"
+ "keit, senkt evtl. VERT.");
+
+static const u8 MoveDescription_Ember[] = _(
+ "Schwache Feuer-Attacke.\n"
+ "Verbrennt Gegner evtl.");
+
+static const u8 MoveDescription_Flamethrower[] = _(
+ "Starke Feuer-Attacke.\n"
+ "Verbrennt Gegner evtl.");
+
+static const u8 MoveDescription_Mist[] = _(
+ "Nebel, der die Änderung der\n"
+ "Werte verhindert.");
+
+static const u8 MoveDescription_WaterGun[] = _(
+ "Der Gegner wird mit Wasser\n"
+ "bespritzt.");
+
+static const u8 MoveDescription_HydroPump[] = _(
+ "Spritzt Wasser mit\n"
+ "Hochdruck auf den Gegner.");
+
+static const u8 MoveDescription_Surf[] = _(
+ "Eine riesige Welle bricht\n"
+ "über den Gegner herein.");
+
+static const u8 MoveDescription_IceBeam[] = _(
+ "Gegner wird von Eisstrahl\n"
+ "getroffen, friert evtl. ein.");
+
+static const u8 MoveDescription_Blizzard[] = _(
+ "Ein Schneesturm, der den\n"
+ "Gegner einfrieren kann.");
+
+static const u8 MoveDescription_Psybeam[] = _(
+ "Feuert einen Strahl ab, der\n"
+ "Gegner verwirren kann.");
+
+static const u8 MoveDescription_BubbleBeam[] = _(
+ "Versprüht Blasen, die den\n"
+ "INIT.-Wert evtl. senken.");
+
+static const u8 MoveDescription_AuroraBeam[] = _(
+ "Regenbogenfarbener Strahl,\n"
+ "senkt evtl. ANGR.-Wert.");
+
+static const u8 MoveDescription_HyperBeam[] = _(
+ "Starke Attacke. Angreifer\n"
+ "setzt eine Runde aus.");
+
+static const u8 MoveDescription_Peck[] = _(
+ "Greift Gegner mit dem\n"
+ "Schnabel an.");
+
+static const u8 MoveDescription_DrillPeck[] = _(
+ "Attacke, bei der der Schna-\n"
+ "bel als Bohrer dient.");
+
+static const u8 MoveDescription_Submission[] = _(
+ "Rücksichtsloser Rempler. \n"
+ "Schädigt auch Angreifer.");
+
+static const u8 MoveDescription_LowKick[] = _(
+ "Tritt, der massigen Gegnern\n"
+ "mehr Schaden zufügt.");
+
+static const u8 MoveDescription_Counter[] = _(
+ "Kontert physischen Tref-\n"
+ "fer mit doppelter Kraft.");
+
+static const u8 MoveDescription_SeismicToss[] = _(
+ "Richtet Schaden gemäß\n"
+ "Level d. Angreifers an.");
+
+static const u8 MoveDescription_Strength[] = _(
+ "Erzeugt enorme Kraft und\n"
+ "rammt den Gegner.");
+
+static const u8 MoveDescription_Absorb[] = _(
+ "Attacke, die die Hälfte des\n"
+ "Schadens absorbiert.");
+
+static const u8 MoveDescription_MegaDrain[] = _(
+ "Attacke, die die Hälfte des\n"
+ "Schadens absorbiert.");
+
+static const u8 MoveDescription_LeechSeed[] = _(
+ "Gegner wird bepflanzt und\n"
+ "verliert jede Runde KP.");
+
+static const u8 MoveDescription_Growth[] = _(
+ "Der Körper wächst und\n"
+ "SPEZ. ANGR. wird erhöht.");
+
+static const u8 MoveDescription_RazorLeaf[] = _(
+ "Trifft Gegner mit Blättern.\n"
+ "Hohe Volltrefferquote.");
+
+static const u8 MoveDescription_SolarBeam[] = _(
+ "Absorbiert Licht in der 1.\n"
+ "Runde, 2. Runde Angriff.");
+
+static const u8 MoveDescription_PoisonPowder[] = _(
+ "Verstreut giftigen Puder,\n"
+ "der Gegner vergiften kann.");
+
+static const u8 MoveDescription_StunSpore[] = _(
+ "Verstreut Puder, der den\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_SleepPowder[] = _(
+ "Verstreut Puder, der Geg.\n"
+ "evtl. in Schlaf versetzt.");
+
+static const u8 MoveDescription_PetalDance[] = _(
+ "Angriff in 2-3 Runden.\n"
+ "Angreifer wird verwirrt.");
+
+static const u8 MoveDescription_StringShot[] = _(
+ "Umwickelt Gegner mit Faden\n"
+ "und senkt INIT.-Wert.");
+
+static const u8 MoveDescription_DragonRage[] = _(
+ "Stößt Schockwellen aus, die\n"
+ "40 KP Schaden anrichten.");
+
+static const u8 MoveDescription_FireSpin[] = _(
+ "Schließt Gegner für 2-5\n"
+ "Runden in Feuerkreis ein.");
+
+static const u8 MoveDescription_ThunderShock[] = _(
+ "Elektro-Attacke. Gegner\n"
+ "evtl. paralysiert.");
+
+static const u8 MoveDescription_Thunderbolt[] = _(
+ "Starke Elektro-Attacke,\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_ThunderWave[] = _(
+ "Ein schwacher Stromstoß,\n"
+ "der den Gegner paralysiert.");
+
+static const u8 MoveDescription_Thunder[] = _(
+ "Elektro-Attacke, die den\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_RockThrow[] = _(
+ "Wirft kleine Steine auf den\n"
+ "Gegner.");
+
+static const u8 MoveDescription_Earthquake[] = _(
+ "Mächtiges Beben. Ist bei\n"
+ "fliegenden Feinden nutzlos.");
+
+static const u8 MoveDescription_Fissure[] = _(
+ "Sofort-K.O. Wirft Gegner\n"
+ "in Gebirgsspalte.");
+
+static const u8 MoveDescription_Dig[] = _(
+ "Gräbt sich in der 1. Runde\n"
+ "ein und trifft in der 2.");
+
+static const u8 MoveDescription_Toxic[] = _(
+ "Vergiftet den Gegner mit \n"
+ "einem starken Toxin.");
+
+static const u8 MoveDescription_Confusion[] = _(
+ "Psycho-Attacke, die den\n"
+ "Gegner evtl. verwirrt.");
+
+static const u8 MoveDescription_Psychic[] = _(
+ "Starke Psycho-Attacke, die\n"
+ "evtl. SPEZ. VERT. senkt.");
+
+static const u8 MoveDescription_Hypnosis[] = _(
+ "Hypno-Attacke, die Gegner\n"
+ "evtl. in Schlaf versetzt.");
+
+static const u8 MoveDescription_Meditate[] = _(
+ "Friedliche Meditation, um\n"
+ "ANGR.-Wert zu steigern.");
+
+static const u8 MoveDescription_Agility[] = _(
+ "Entspannt den Körper, um\n"
+ "INIT.-Wert. zu steigern.");
+
+static const u8 MoveDescription_QuickAttack[] = _(
+ "Sehr schneller Angriff mit\n"
+ "Erstschlaggarantie.");
+
+static const u8 MoveDescription_Rage[] = _(
+ "Erhöht ANGR. des Anwenders\n"
+ "bei jedem gegn. Treffer.");
+
+static const u8 MoveDescription_Teleport[] = _(
+ "Psycho-Angriff, um sofort\n"
+ "aus einem Kampf zu fliehen.");
+
+static const u8 MoveDescription_NightShade[] = _(
+ "Richtet Schaden gemäß\n"
+ "Level d. Angreifers an.");
+
+static const u8 MoveDescription_Mimic[] = _(
+ "Kopiert eine zuvor ausge-\n"
+ "führte Attacke d. Gegners.");
+
+static const u8 MoveDescription_Screech[] = _(
+ "Stößt einen Schrei aus, um\n"
+ "gegn. VERT. zu senken.");
+
+static const u8 MoveDescription_DoubleTeam[] = _(
+ "Erzeugt Ebenbilder, um \n"
+ "Fluchtwert zu erhöhen.");
+
+static const u8 MoveDescription_Recover[] = _(
+ "Max. KP des Anwenders w.\n"
+ "bis zur Hälfte aufgefüllt.");
+
+static const u8 MoveDescription_Harden[] = _(
+ "Stärkt die Muskulatur und\n"
+ "erhöht VERT.-Wert.");
+
+static const u8 MoveDescription_Minimize[] = _(
+ "Anwender schrumpft, um\n"
+ "Fluchtwert zu erhöhen.");
+
+static const u8 MoveDescription_Smokescreen[] = _(
+ "Senkt Genauigkeit d. Geg-\n"
+ "ners mit Rauch, Tinte o. ä.");
+
+static const u8 MoveDescription_ConfuseRay[] = _(
+ "Ein fieser Strahl, der den\n"
+ "Gegner verwirrt.");
+
+static const u8 MoveDescription_Withdraw[] = _(
+ "Rückzug in den harten\n"
+ "Panzer. Erhöht VERT.-Wert.");
+
+static const u8 MoveDescription_DefenseCurl[] = _(
+ "Verbirgt Schwächen durch\n"
+ "Einrollen, VERT.-Wert hoch.");
+
+static const u8 MoveDescription_Barrier[] = _(
+ "Erzeugt Barriere, die den\n"
+ "VERT.-Wert stark erhöht.");
+
+static const u8 MoveDescription_LightScreen[] = _(
+ "Erzeugt Lichtwand u. senkt\n"
+ "SPEZ. ANGR.-Schaden.");
+
+static const u8 MoveDescription_Haze[] = _(
+ "Erzeugt dunklen Dunst.\n"
+ "Löscht alle Statusänder.");
+
+static const u8 MoveDescription_Reflect[] = _(
+ "Erzeugt Lichtwand, schützt\n"
+ "teilweise vor phys. Angr.");
+
+static const u8 MoveDescription_FocusEnergy[] = _(
+ "Bündelt Kraft. Volltreffer-\n"
+ "chance wird erhöht.");
+
+static const u8 MoveDescription_Bide[] = _(
+ "Erträgt 2 Runden Angriffe,\n"
+ "schlägt doppelt zurück.");
+
+static const u8 MoveDescription_Metronome[] = _(
+ "Bewegt Finger und wählt\n"
+ "PKMN-Attacke zufällig aus.");
+
+static const u8 MoveDescription_MirrorMove[] = _(
+ "Erwidert gegn. Angriff mit\n"
+ "derselben Attacke.");
+
+static const u8 MoveDescription_SelfDestruct[] = _(
+ "Richtet großen Schaden an.\n"
+ "Anwender wird besiegt.");
+
+static const u8 MoveDescription_EggBomb[] = _(
+ "Ein Ei wird auf den Gegner\n"
+ "abgefeuert.");
+
+static const u8 MoveDescription_Lick[] = _(
+ "Leck-Attacke mit Zunge.\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_Smog[] = _(
+ "Angriff mit Gas. Gegner wird\n"
+ "evtl. vergiftet.");
+
+static const u8 MoveDescription_Sludge[] = _(
+ "Wirft Schlamm auf Gegner.\n"
+ "Evtl. Vergiftung.");
+
+static const u8 MoveDescription_BoneClub[] = _(
+ "Schlägt Gegner mit Keule\n"
+ "und verschreckt ihn evtl.");
+
+static const u8 MoveDescription_FireBlast[] = _(
+ "Feuersbrunst, die alles ver-\n"
+ "sengt. Verbrennt Geg. evtl.");
+
+static const u8 MoveDescription_Waterfall[] = _(
+ "Attacke basiert auf Tempo.\n"
+ "Erklimmt Wasserfälle.");
+
+static const u8 MoveDescription_Clamp[] = _(
+ "Fängt und drückt Gegner\n"
+ "für 2-5 Runden.");
+
+static const u8 MoveDescription_Swift[] = _(
+ "Verschießt sternförmige\n"
+ "Strahlen. Treffergarantie!");
+
+static const u8 MoveDescription_SkullBash[] = _(
+ "Zieht Kopf ein und greift in\n"
+ "der nächsten Runde an.");
+
+static const u8 MoveDescription_SpikeCannon[] = _(
+ "Verschießt spitze Stacheln\n"
+ "und trifft 2 - 5-mal.");
+
+static const u8 MoveDescription_Constrict[] = _(
+ "Schmerzvoller Klammergriff.\n"
+ "Senkt evtl. INIT.-Wert.");
+
+static const u8 MoveDescription_Amnesia[] = _(
+ "Gedächtnisverlust, der\n"
+ "SPEZ. VERT. deutlich erhöht.");
+
+static const u8 MoveDescription_Kinesis[] = _(
+ "Lenkt Gegner ab und senkt\n"
+ "evtl. seine Genauigkeit.");
+
+static const u8 MoveDescription_SoftBoiled[] = _(
+ "Max. KP des Anwenders w.\n"
+ "bis zur Hälfte aufgefüllt.");
+
+static const u8 MoveDescription_HiJumpKick[] = _(
+ "Sprung-Tritt mit Knie. Miss-\n"
+ "erfolg verletzt Anwender.");
+
+static const u8 MoveDescription_Glare[] = _(
+ "Schüchtert Gegner ein, so\n"
+ "dass er paralysiert ist.");
+
+static const u8 MoveDescription_DreamEater[] = _(
+ "Schlafendem Gegner wird\n"
+ "halber Schaden abgezogen.");
+
+static const u8 MoveDescription_PoisonGas[] = _(
+ "Hüllt Gegner in giftiges Gas\n"
+ "ein, kann vergiften.");
+
+static const u8 MoveDescription_Barrage[] = _(
+ "Wirft 2 - 5-mal runde Gegen-\n"
+ "stände auf den Gegner.");
+
+static const u8 MoveDescription_LeechLife[] = _(
+ "Ein Angriff, der die Hälfte\n"
+ "des Schadens saugt.");
+
+static const u8 MoveDescription_LovelyKiss[] = _(
+ "Fordert Kuss mit bösem\n"
+ "Blick. Evtl. Schlaf.");
+
+static const u8 MoveDescription_SkyAttack[] = _(
+ "Sucht nach Schwächen,\n"
+ "Treffer nächste Runde.");
+
+static const u8 MoveDescription_Transform[] = _(
+ "Ändert die Anwenderzellen\n"
+ "für ein Ebenbild d. Gegners.");
+
+static const u8 MoveDescription_Bubble[] = _(
+ "Angriff mit Blasen. INIT.-\n"
+ "Wert wird evtl. gesenkt.");
+
+static const u8 MoveDescription_DizzyPunch[] = _(
+ "Rhythmischer Schlag, der\n"
+ "den Gegner verwirren kann.");
+
+static const u8 MoveDescription_Spore[] = _(
+ "Erzeugt eine Wolke aus ein-\n"
+ "schläfernden Sporen.");
+
+static const u8 MoveDescription_Flash[] = _(
+ "Erzeugt helles Licht, das\n"
+ "gegn. Genauigkeit senkt.");
+
+static const u8 MoveDescription_Psywave[] = _(
+ "Psycho-Welle mit unter-\n"
+ "schiedlicher Intensität.");
+
+static const u8 MoveDescription_Splash[] = _(
+ "Nur ein Platscher..., der\n"
+ "überhaupt nichts bewirkt.");
+
+static const u8 MoveDescription_AcidArmor[] = _(
+ "Verflüssigt Körper d. An-\n"
+ "wenders. Erhört VERT.");
+
+static const u8 MoveDescription_Crabhammer[] = _(
+ "Schlägt mit Schere zu.\n"
+ "Volltrefferchance hoch.");
+
+static const u8 MoveDescription_Explosion[] = _(
+ "Richtet großen Schaden an.\n"
+ "Anwender wird besiegt.");
+
+static const u8 MoveDescription_FurySwipes[] = _(
+ "Beharkt Gegner 2 - 5-mal\n"
+ "mit scharfen Klauen o. ä.");
+
+static const u8 MoveDescription_Bonemerang[] = _(
+ "Ein Bumerang aus Knochen,\n"
+ "der zweimal trifft.");
+
+static const u8 MoveDescription_Rest[] = _(
+ "Anwender schläft 2 Runden,\n"
+ "KP und Status erneuert.");
+
+static const u8 MoveDescription_RockSlide[] = _(
+ "Schleudert riesige Felsen.\n"
+ "Verschreckt evtl. Gegner.");
+
+static const u8 MoveDescription_HyperFang[] = _(
+ "Angriff mit Zähnen.\n"
+ "Verschreckt evtl. Gegner.");
+
+static const u8 MoveDescription_Sharpen[] = _(
+ "Reduziert Polygonzahl und\n"
+ "erhöht ANGR.-Wert.");
+
+static const u8 MoveDescription_Conversion[] = _(
+ "Wandelt Typ d. Anwenders in\n"
+ "eigenen Attacken-Typ.");
+
+static const u8 MoveDescription_TriAttack[] = _(
+ "Feuert 3 Arten von Strahlen\n"
+ "gleichzeitig ab.");
+
+static const u8 MoveDescription_SuperFang[] = _(
+ "Greift mit scharfen Zähnen\n"
+ "an. Halbiert gegnerische KP.");
+
+static const u8 MoveDescription_Slash[] = _(
+ "Hieb mit Klauen o. ä. Hohe\n"
+ "Volltrefferquote.");
+
+static const u8 MoveDescription_Substitute[] = _(
+ "Lockvogel, der 1/4 der max.\n"
+ "KP des Anwenders besitzt.");
+
+static const u8 MoveDescription_Struggle[] = _(
+ "Einsatz nur bei verbrauch-\n"
+ "ten AP. Selbstschädigung!");
+
+static const u8 MoveDescription_Sketch[] = _(
+ "Kopiert stets den zuletzt\n"
+ "erlittenen Angriff.");
+
+static const u8 MoveDescription_TripleKick[] = _(
+ "Tritt Gegner 3-mal nach-\n"
+ "einander. Härte nimmt zu.");
+
+static const u8 MoveDescription_Thief[] = _(
+ "Kann das vom Gegner\n"
+ "gehaltene Item stehlen.");
+
+static const u8 MoveDescription_SpiderWeb[] = _(
+ "Wickelt Gegner ein. Flucht \n"
+ "oder Tausch unmöglich.");
+
+static const u8 MoveDescription_MindReader[] = _(
+ "Ahnt gegnerische Aktion.\n"
+ "Nächste Attacke trifft.");
+
+static const u8 MoveDescription_Nightmare[] = _(
+ "Bewirkt 1/4 Schaden pro\n"
+ "Zug bei schlafendem Gegner.");
+
+static const u8 MoveDescription_FlameWheel[] = _(
+ "Feuer-Attacke, die Gegner\n"
+ "evtl. verbrennt.");
+
+static const u8 MoveDescription_Snore[] = _(
+ "Laute Attacke. Kann nur im\n"
+ "Schlaf benutzt werden.");
+
+static const u8 MoveDescription_Curse[] = _(
+ "Ein Angriff, der bei GEIST-\n"
+ "PKMN anders funktioniert.");
+
+static const u8 MoveDescription_Flail[] = _(
+ "Richtet mehr Schaden an,\n"
+ "wenn eigene KP niedrig sind.");
+
+static const u8 MoveDescription_Conversion2[] = _(
+ "Anwender wird resistent\n"
+ "gegen letzten Angr.-Typ.");
+
+static const u8 MoveDescription_Aeroblast[] = _(
+ "Erzeugt ein Vakuum.\n"
+ "Hohe Volltrefferquote.");
+
+static const u8 MoveDescription_CottonSpore[] = _(
+ "Sporen heften sich an den\n"
+ "Gegner. Senkt INIT.-Wert.");
+
+static const u8 MoveDescription_Reversal[] = _(
+ "Richtet mehr Schaden an,\n"
+ "wenn eigene KP niedrig sind.");
+
+static const u8 MoveDescription_Spite[] = _(
+ "AP des letzten gegner.\n"
+ "Angriffs werden gesenkt.");
+
+static const u8 MoveDescription_PowderSnow[] = _(
+ "Schnee auf Gegner, der\n"
+ "evtl. eingefroren wird.");
+
+static const u8 MoveDescription_Protect[] = _(
+ "Weicht Angriff aus.\n"
+ "Scheitert evtl. bei Wdh.");
+
+static const u8 MoveDescription_MachPunch[] = _(
+ "Schneller Hieb, der stets\n"
+ "zuerst trifft.");
+
+static const u8 MoveDescription_ScaryFace[] = _(
+ "Erschreckt mit Grimasse. \n"
+ "INIT.-Wert sinkt deutlich.");
+
+static const u8 MoveDescription_FaintAttack[] = _(
+ "Zieht Gegner heran und\n"
+ "trifft mit Sicherheit.");
+
+static const u8 MoveDescription_SweetKiss[] = _(
+ "Fordert Kuss mit süßem\n"
+ "Blick. Verwirrt Gegner evtl.");
+
+static const u8 MoveDescription_BellyDrum[] = _(
+ "Erhöht ANGR.-Wert,\n"
+ "opfert jedoch KP.");
+
+static const u8 MoveDescription_SludgeBomb[] = _(
+ "Wirft Schlamm auf Gegner\n"
+ "und vergiftet ihn evtl.");
+
+static const u8 MoveDescription_MudSlap[] = _(
+ "Wirft Gegner Matsch ins Ge-\n"
+ "sicht. Genauigkeit sinkt.");
+
+static const u8 MoveDescription_Octazooka[] = _(
+ "Verschießt Tinte und senkt\n"
+ "dadurch Genauigkeit.");
+
+static const u8 MoveDescription_Spikes[] = _(
+ "Richtet bei Tausch Schaden\n"
+ "mit Stacheln an.");
+
+static const u8 MoveDescription_ZapCannon[] = _(
+ "Kräftige, ungenaue At-\n"
+ "tacke, die evtl. paralysiert.");
+
+static const u8 MoveDescription_Foresight[] = _(
+ "Verhindert Anstieg von\n"
+ "gegnerischem Fluchtwert.");
+
+static const u8 MoveDescription_DestinyBond[] = _(
+ "Wird der Angreifer besiegt,\n"
+ "gilt das auch für d. Gegner.");
+
+static const u8 MoveDescription_PerishSong[] = _(
+ "Wer dieses Lied hört, wird\n"
+ "nach 3 Runden besiegt.");
+
+static const u8 MoveDescription_IcyWind[] = _(
+ "Eis-Attacke, die den INIT.-\n"
+ "Wert des Gegners senkt.");
+
+static const u8 MoveDescription_Detect[] = _(
+ "Wendet Attacken ab, Erfolg\n"
+ "sinkt bei Wiederholung.");
+
+static const u8 MoveDescription_BoneRush[] = _(
+ "Greift Gegner 2 - 5-mal in\n"
+ "Folge mit einem Knochen an.");
+
+static const u8 MoveDescription_LockOn[] = _(
+ "Visiert Gegner an u. trifft\n"
+ "in der nächsten Runde.");
+
+static const u8 MoveDescription_Outrage[] = _(
+ "Wiederholt Angriff 2-3 Run-\n"
+ "den lang. Verwirrt Anwender.");
+
+static const u8 MoveDescription_Sandstorm[] = _(
+ "Erzeugt einen Sandsturm,\n"
+ "der mehrere Runden wütet.");
+
+static const u8 MoveDescription_GigaDrain[] = _(
+ "Absorbiert die Hälfte des\n"
+ "angerichteten Schadens.");
+
+static const u8 MoveDescription_Endure[] = _(
+ "Hält jeder Attacke 1 Runde\n"
+ "stand. 1 KP bleibt stets.");
+
+static const u8 MoveDescription_Charm[] = _(
+ "Betört den Gegner u. redu-\n"
+ "ziert seinen ANGR. deutlich.");
+
+static const u8 MoveDescription_Rollout[] = _(
+ "Attacke, die 5 Runden\n"
+ "dauert. Die Härte nimmt zu.");
+
+static const u8 MoveDescription_FalseSwipe[] = _(
+ "Ein Angriff, der dem Gegner\n"
+ "zumindest 1 KP lässt.");
+
+static const u8 MoveDescription_Swagger[] = _(
+ "Verwirrt den Gegner und\n"
+ "erhöht ANGR.-Wert deutlich.");
+
+static const u8 MoveDescription_MilkDrink[] = _(
+ "Füllt bis zur Hälfte der max.\n"
+ "KP des Benutzers auf.");
+
+static const u8 MoveDescription_Spark[] = _(
+ "Elektro-Hieb, der Gegner\n"
+ "paralysieren kann.");
+
+static const u8 MoveDescription_FuryCutter[] = _(
+ "Eine Attacke, deren Härte\n"
+ "bei jedem Treffer zunimmt.");
+
+static const u8 MoveDescription_SteelWing[] = _(
+ "Trifft den Gegner hart mit\n"
+ "ausgebreiteten Flügeln.");
+
+static const u8 MoveDescription_MeanLook[] = _(
+ "Böser Blick, der die Flucht\n"
+ "des Gegners vereitelt.");
+
+static const u8 MoveDescription_Attract[] = _(
+ "Angriff des anderen Ge-\n"
+ "schlechts unwahrscheinl.");
+
+static const u8 MoveDescription_SleepTalk[] = _(
+ "Benutzt per Zufall eine\n"
+ "Attacke im Schlaf.");
+
+static const u8 MoveDescription_HealBell[] = _(
+ "Läutet beruhigend, heilt\n"
+ "alle Status-Veränderungen.");
+
+static const u8 MoveDescription_Return[] = _(
+ "Angriff, dessen Kraft bei \n"
+ "Freundschaft größer wird.");
+
+static const u8 MoveDescription_Present[] = _(
+ "Eine Bombe als Geschenk. Es\n"
+ "kann KP wiederherstellen.");
+
+static const u8 MoveDescription_Frustration[] = _(
+ "Die Attacke ist stärker bei\n"
+ "verhassten TRAINERn.");
+
+static const u8 MoveDescription_Safeguard[] = _(
+ "Mystische Kraft, die alle\n"
+ "Statusprobleme verhindert.");
+
+static const u8 MoveDescription_PainSplit[] = _(
+ "Addiert KP v. Anwender u.\n"
+ "Gegner, teilt gerecht auf.");
+
+static const u8 MoveDescription_SacredFire[] = _(
+ "Mystische Feuer-Attacke, \n"
+ "die d. Geg. evtl. verbrennt.");
+
+static const u8 MoveDescription_Magnitude[] = _(
+ "Ein erdbebenartiger An-\n"
+ "griff von zufälliger Stärke.");
+
+static const u8 MoveDescription_DynamicPunch[] = _(
+ "Kräftige Attacke, die ver-\n"
+ "wirrt, aber ungenau ist.");
+
+static const u8 MoveDescription_Megahorn[] = _(
+ "Brutaler Frontalangriff\n"
+ "mit spitzen Hörnern.");
+
+static const u8 MoveDescription_DragonBreath[] = _(
+ "Fegt den Gegner mit zer-\n"
+ "störerisch heißem Atem weg.");
+
+static const u8 MoveDescription_BatonPass[] = _(
+ "Tauscht PKMN aus. Alle Än-\n"
+ "derungen bleiben bestehen.");
+
+static const u8 MoveDescription_Encore[] = _(
+ "Gegner wiederholt letzten\n"
+ "Angriff 2 - 6-mal.");
+
+static const u8 MoveDescription_Pursuit[] = _(
+ "Richtet großen Schaden bei\n"
+ "Austausch des Gegners an.");
+
+static const u8 MoveDescription_RapidSpin[] = _(
+ "Trifft den Gegner durch\n"
+ "Drehen mit max. Tempo.");
+
+static const u8 MoveDescription_SweetScent[] = _(
+ "Lockt Gegner an und senkt\n"
+ "seinen Fluchtwert.");
+
+static const u8 MoveDescription_IronTail[] = _(
+ "Att. mit hartem Schweif. \n"
+ "Senkt evtl. VERT.-Wert.");
+
+static const u8 MoveDescription_MetalClaw[] = _(
+ "Klauen-Attacke. Evtl. Er-\n"
+ "höhung d. ANGR.-Wert d. Anw.");
+
+static const u8 MoveDescription_VitalThrow[] = _(
+ "Attacke stets gleich, aber\n"
+ "mit Treffergarantie.");
+
+static const u8 MoveDescription_MorningSun[] = _(
+ "Füllt KP auf. Die Menge\n"
+ "hängt vom Wetter ab.");
+
+static const u8 MoveDescription_Synthesis[] = _(
+ "Füllt KP auf. Die Menge\n"
+ "hängt vom Wetter ab.");
+
+static const u8 MoveDescription_Moonlight[] = _(
+ "Füllt KP auf. Die Menge\n"
+ "hängt vom Wetter ab.");
+
+static const u8 MoveDescription_HiddenPower[] = _(
+ "Die Wirkung dieser Attacke\n"
+ "hängt vom Benutzer ab.");
+
+static const u8 MoveDescription_CrossChop[] = _(
+ "Doppelter Hieb. Hohe \n"
+ "Volltrefferquote.");
+
+static const u8 MoveDescription_Twister[] = _(
+ "Trifft Gegner mit\n"
+ "heftigem Wirbelsturm.");
+
+static const u8 MoveDescription_RainDance[] = _(
+ "Erhöht Stärke von WASSER-\n"
+ "Attacken 5 Runden lang.");
+
+static const u8 MoveDescription_SunnyDay[] = _(
+ "Erhöht Stärke von FEUER-\n"
+ "Attacken 5 Runden lang.");
+
+static const u8 MoveDescription_Crunch[] = _(
+ "Beißt mit Reißzähnen zu und\n"
+ "senkt evtl. SPEZ. VERT.");
+
+static const u8 MoveDescription_MirrorCoat[] = _(
+ "Kontert d. Spezial-Attacke\n"
+ "d. Geg. mit 2-facher Kraft.");
+
+static const u8 MoveDescription_PsychUp[] = _(
+ "Kopiert Effekte d. Gegners\n"
+ "u. gibt sie dem Angreifer.");
+
+static const u8 MoveDescription_ExtremeSpeed[] = _(
+ "Extrem schnelle und kraft-\n"
+ "volle Attacke.");
+
+static const u8 MoveDescription_AncientPower[] = _(
+ "Ein Angriff, der alle\n"
+ "Status-Werte erhöhen kann.");
+
+static const u8 MoveDescription_ShadowBall[] = _(
+ "Bewirft Gegner und senkt\n"
+ "evtl. SPEZ. VERT.");
+
+static const u8 MoveDescription_FutureSight[] = _(
+ "Stärkt innere Kraft. Trifft\n"
+ "2 Runden später.");
+
+static const u8 MoveDescription_RockSmash[] = _(
+ "Zertrümmernder Angriff, \n"
+ "der evtl. VERT.-Wert senkt.");
+
+static const u8 MoveDescription_Whirlpool[] = _(
+ "Hält Gegner 2-5 Züge in\n"
+ "einem Strudel gefangen.");
+
+static const u8 MoveDescription_BeatUp[] = _(
+ "Ruft POKéMON hinzu, um an\n"
+ "dem Angriff teilzuhaben.");
+
+static const u8 MoveDescription_FakeOut[] = _(
+ "Trifft schon mit dem ersten\n"
+ "Schlag. Verjagt Gegner evtl.");
+
+static const u8 MoveDescription_Uproar[] = _(
+ "Erzeugt für 2-5 Züge einen\n"
+ "Aufruhr. Verhindert Schlaf.");
+
+static const u8 MoveDescription_Stockpile[] = _(
+ "Lädt Kraft für bis zu 3\n"
+ "Runden auf.");
+
+static const u8 MoveDescription_SpitUp[] = _(
+ "Entlädt gehortete Kraft.\n"
+ "Je mehr, desto besser.");
+
+static const u8 MoveDescription_Swallow[] = _(
+ "Absorbiert gehortete\n"
+ "Kraft. Stellt KP wieder her.");
+
+static const u8 MoveDescription_HeatWave[] = _(
+ "Gegner wird von heißem Atem\n"
+ "getroffen. Verbrennt evtl.");
+
+static const u8 MoveDescription_Hail[] = _(
+ "Erzeugt Hagelsturm, der in\n"
+ "jeder Runde trifft.");
+
+static const u8 MoveDescription_Torment[] = _(
+ "Quält Gegner u. verhindert\n"
+ "Wdh. eines Angriffs.");
+
+static const u8 MoveDescription_Flatter[] = _(
+ "Verwirrt den Gegner, erhöht\n"
+ "aber dessen SPEZ. ANGR.");
+
+static const u8 MoveDescription_WillOWisp[] = _(
+ "Fügt dem Gegner \n"
+ "Verbrennungen zu.");
+
+static const u8 MoveDescription_Memento[] = _(
+ "Der Benutzer ist besiegt\n"
+ "und senkt die gegn. Werte.");
+
+static const u8 MoveDescription_Facade[] = _(
+ "Erhöht ANGR. nach Verbren-\n"
+ "nung, Paralyse o. Vergift.");
+
+static const u8 MoveDescription_FocusPunch[] = _(
+ "Angriff, der später trifft.\n"
+ "Ben. schreckt evtl. zurück.");
+
+static const u8 MoveDescription_SmellingSalt[] = _(
+ "Effektiv geg. paralysierte\n"
+ "Gegner. Heilt sie aber auch.");
+
+static const u8 MoveDescription_FollowMe[] = _(
+ "Zieht Aufmerksamkeit an.\n"
+ "Gegner greift nur Anw. an.");
+
+static const u8 MoveDescription_NaturePower[] = _(
+ "Die Elementklasse des\n"
+ "Angriffs hängt vom Ort ab.");
+
+static const u8 MoveDescription_Charge[] = _(
+ "Lädt Energie für den kom-\n"
+ "menden Elektro-Angr. auf.");
+
+static const u8 MoveDescription_Taunt[] = _(
+ "Legt den Gegner rein. Er\n"
+ "benutzt nur noch Angriffe.");
+
+static const u8 MoveDescription_HelpingHand[] = _(
+ "Steigert die Kraft der An-\n"
+ "griffe des Getroffenen.");
+
+static const u8 MoveDescription_Trick[] = _(
+ "Betrügt beim Handel\n"
+ "mit Gegenständen.");
+
+static const u8 MoveDescription_RolePlay[] = _(
+ "Parodiert Gegner u. kopiert\n"
+ "seine Spezialfähigkeiten.");
+
+static const u8 MoveDescription_Wish[] = _(
+ "Ein Wunsch, der KP auffüllt.\n"
+ "Die Erfüllung braucht Zeit.");
+
+static const u8 MoveDescription_Assist[] = _(
+ "Greift zufällig mit einem\n"
+ "Angriff d. Partners an.");
+
+static const u8 MoveDescription_Ingrain[] = _(
+ "Verwurzelung füllt KP auf.\n"
+ "Austausch unmöglich.");
+
+static const u8 MoveDescription_Superpower[] = _(
+ "Steigert Stärke deutlich,\n"
+ "senkt aber Status-Werte.");
+
+static const u8 MoveDescription_MagicCoat[] = _(
+ "Gibt Spezialeffekte zurück\n"
+ "an Benutzer.");
+
+static const u8 MoveDescription_Recycle[] = _(
+ "Recycling eines\n"
+ "verwendeten Items.");
+
+static const u8 MoveDescription_Revenge[] = _(
+ "Attacke wird stärker, wenn\n"
+ "Anwender Schaden nimmt.");
+
+static const u8 MoveDescription_BrickBreak[] = _(
+ "Durchbricht Barrieren und\n"
+ "verursacht Schaden.");
+
+static const u8 MoveDescription_Yawn[] = _(
+ "Gegner gähnt und schläft\n"
+ "in der nächsten Runde ein.");
+
+static const u8 MoveDescription_KnockOff[] = _(
+ "Schlägt Gegner Item weg.\n"
+ "Vereitelt so den Gebrauch.");
+
+static const u8 MoveDescription_Endeavor[] = _(
+ "Wird stärker, wenn Anw.-KP\n"
+ "geringer als Gegner-KP ist.");
+
+static const u8 MoveDescription_Eruption[] = _(
+ "Je höher KP des Benutzers,\n"
+ "desto mehr Schaden.");
+
+static const u8 MoveDescription_SkillSwap[] = _(
+ "Anw. tauscht Spezial-\n"
+ "fähigkeit mit POKéMON.");
+
+static const u8 MoveDescription_Imprison[] = _(
+ "Hindert Gegner an Atta-\n"
+ "cken, die d. Benutzer kennt.");
+
+static const u8 MoveDescription_Refresh[] = _(
+ "Kuriert Vergiftungen, Para-\n"
+ "lyse und Verbrennung.");
+
+static const u8 MoveDescription_Grudge[] = _(
+ "Wenn Anw. bes., werden AP\n"
+ "der Finalattacke gelöscht.");
+
+static const u8 MoveDescription_Snatch[] = _(
+ "Immunität geg. den Effekt\n"
+ "d. nächsten gegn. Angriffs.");
+
+static const u8 MoveDescription_SecretPower[] = _(
+ "Angriff, dessen Auswirkung\n"
+ "abhängig vom Ort ist.");
+
+static const u8 MoveDescription_Dive[] = _(
+ "Taucht in der 1. Runde\n"
+ "unter u. trifft in der 2.");
+
+static const u8 MoveDescription_ArmThrust[] = _(
+ "Schläge mit geradem Arm, die\n"
+ "Gegner 2 - 5-mal treffen.");
+
+static const u8 MoveDescription_Camouflage[] = _(
+ "Die Elementklasse des\n"
+ "POKéMON hängt vom Ort ab.");
+
+static const u8 MoveDescription_TailGlow[] = _(
+ "Ein blinkendes Licht. SPEZ.\n"
+ "ANGR. wird deutlich erhöht.");
+
+static const u8 MoveDescription_LusterPurge[] = _(
+ "Angriff mit grellem Licht.\n"
+ "Senkt evtl. SPEZ. VERT.");
+
+static const u8 MoveDescription_MistBall[] = _(
+ "Angriff m. Daunengestöber,\n"
+ "Senkt evtl. SPEZ. ANGR.");
+
+static const u8 MoveDescription_FeatherDance[] = _(
+ "Hüllt Gegner in Daunen und\n"
+ "senkt ANGR.-Wert deutlich.");
+
+static const u8 MoveDescription_TeeterDance[] = _(
+ "Verwirrt alle POKéMON im \n"
+ "Kampf.");
+
+static const u8 MoveDescription_BlazeKick[] = _(
+ "Hohe Volltrefferquote. Ver-\n"
+ "ursacht evtl. Verbrennung.");
+
+static const u8 MoveDescription_MudSport[] = _(
+ "Bedeckt Anw. mit Lehm u. er-\n"
+ "höht Schutz geg. Elek.-Att.");
+
+static const u8 MoveDescription_IceBall[] = _(
+ "Angriff für 5 Runden. \n"
+ "Stärker, wenn Treffer.");
+
+static const u8 MoveDescription_NeedleArm[] = _(
+ "Angriff mit dornigen Armen. \n"
+ "Geg. schreckt evtl. zurück.");
+
+static const u8 MoveDescription_SlackOff[] = _(
+ "Durch Müßiggang wird die\n"
+ "Hälfte d. max. KP aufgefüllt.");
+
+static const u8 MoveDescription_HyperVoice[] = _(
+ "Laute Attacke mit Schall-\n"
+ "wellen.");
+
+static const u8 MoveDescription_PoisonFang[] = _(
+ "Angriff mit Reißzähnen. \n"
+ "Gegner wird evtl. vergiftet.");
+
+static const u8 MoveDescription_CrushClaw[] = _(
+ "Angriff mit scharfen Klau-\n"
+ "en. Senkt evtl. VERT.-Wert.");
+
+static const u8 MoveDescription_BlastBurn[] = _(
+ "Starker Angriff. Angreifer\n"
+ "muss eine Runde aussetzen.");
+
+static const u8 MoveDescription_HydroCannon[] = _(
+ "Starker Angriff. Angreifer\n"
+ "muss eine Runde aussetzen.");
+
+static const u8 MoveDescription_MeteorMash[] = _(
+ "Ein Schlag wie ein Meteor.\n"
+ "Erhöht evtl. ANGR.-Wert.");
+
+static const u8 MoveDescription_Astonish[] = _(
+ "Angriff, der Gegner evtl.\n"
+ "zurückschrecken lässt.");
+
+static const u8 MoveDescription_WeatherBall[] = _(
+ "Elementkl. u. Stärke der At-\n"
+ "tacke sind wetterabhängig.");
+
+static const u8 MoveDescription_Aromatherapy[] = _(
+ "Heilt alle Status-Probleme\n"
+ "mit beruhigendem Duft.");
+
+static const u8 MoveDescription_FakeTears[] = _(
+ "Täuscht Weinen vor, um\n"
+ "gegn. SPEZ. VERT. zu senken.");
+
+static const u8 MoveDescription_AirCutter[] = _(
+ "Greift mit heftigem Wind an.\n"
+ "Hohe Volltrefferquote.");
+
+static const u8 MoveDescription_Overheat[] = _(
+ "Angriff mit voller Kraft.\n"
+ "SPEZ. ANGR. sinkt deutlich.");
+
+static const u8 MoveDescription_OdorSleuth[] = _(
+ "Hindert Gegner daran, ihren\n"
+ "Fluchtwert zu erhöhen.");
+
+static const u8 MoveDescription_RockTomb[] = _(
+ "Hält den Feind mit Steinen\n"
+ "auf u. senkt INIT.-Wert.");
+
+static const u8 MoveDescription_SilverWind[] = _(
+ "Pulver-Attacke, die evtl.\n"
+ "die Werte erhöht.");
+
+static const u8 MoveDescription_MetalSound[] = _(
+ "Stößt einen spitzen Schrei\n"
+ "aus. Senkt SPEZ. VERT.");
+
+static const u8 MoveDescription_GrassWhistle[] = _(
+ "Versetzt Gegner mit schö-\n"
+ "ner Melodie in den Schlaf.");
+
+static const u8 MoveDescription_Tickle[] = _(
+ "Bringt Gegner zum Lachen.\n"
+ "ANGR. u. VERT. sinken.");
+
+static const u8 MoveDescription_CosmicPower[] = _(
+ "Erhöht VERT. u. SPEZ. VERT.\n"
+ "durch mystische Kraft.");
+
+static const u8 MoveDescription_WaterSpout[] = _(
+ "Ist wirkungsvoller, wenn KP\n"
+ "des Benutzers hoch sind.");
+
+static const u8 MoveDescription_SignalBeam[] = _(
+ "Seltsame Strahlenattacke.\n"
+ "Verwirrt evtl. den Gegner.");
+
+static const u8 MoveDescription_ShadowPunch[] = _(
+ "Schattenhieb. Ausweichen\n"
+ "unmöglich.");
+
+static const u8 MoveDescription_Extrasensory[] = _(
+ "Besonderer Angriff. Gegner\n"
+ "schreckt evtl. zurück.");
+
+static const u8 MoveDescription_SkyUppercut[] = _(
+ "Kinnhaken, als würde man in\n"
+ "die Luft springen.");
+
+static const u8 MoveDescription_SandTomb[] = _(
+ "Gegner leidet für 2-5\n"
+ "Runden in Sandhose.");
+
+static const u8 MoveDescription_SheerCold[] = _(
+ "Eis-Attacke. Besiegt den\n"
+ "Gegner, wenn sie trifft.");
+
+static const u8 MoveDescription_MuddyWater[] = _(
+ "Greift mit Matsch an und\n"
+ "senkt evtl. Genauigkeit.");
+
+static const u8 MoveDescription_BulletSeed[] = _(
+ "Verschießt 2 bis 5 Samen\n"
+ "gleichzeitig auf Gegner.");
+
+static const u8 MoveDescription_AerialAce[] = _(
+ "Eine extrem schnelle und\n"
+ "unausweichbare Attacke.");
+
+static const u8 MoveDescription_IcicleSpear[] = _(
+ "Feuert 2-5 Eiszapfen auf\n"
+ "den Gegner.");
+
+static const u8 MoveDescription_IronDefense[] = _(
+ "Stärkt den Körper.\n"
+ "Erhöht VERT.-Wert deutlich.");
+
+static const u8 MoveDescription_Block[] = _(
+ "Versperrt den Fluchtweg\n"
+ "des Gegners.");
+
+static const u8 MoveDescription_Howl[] = _(
+ "Jault, um in sich zu gehen.\n"
+ "Erhöht ANGR.-Wert.");
+
+static const u8 MoveDescription_DragonClaw[] = _(
+ "Der Gegner wird mit\n"
+ "scharfen Klauen verletzt.");
+
+static const u8 MoveDescription_FrenzyPlant[] = _(
+ "Starker Angriff. Angreifer\n"
+ "muss eine Runde aussetzen.");
+
+static const u8 MoveDescription_BulkUp[] = _(
+ "Pumpt den Körper auf. ANGR.\n"
+ "u. VERT. werden erhöht.");
+
+static const u8 MoveDescription_Bounce[] = _(
+ "Springt hoch u. landet in\n"
+ "nächstem Zug. Evtl. Para.");
+
+static const u8 MoveDescription_MudShot[] = _(
+ "Bewirft den Gegner mit Lehm\n"
+ "und senkt INIT.-Wert.");
+
+static const u8 MoveDescription_PoisonTail[] = _(
+ "Hohe Volltrefferquote.\n"
+ "Gegner evtl. vergiftet.");
+
+static const u8 MoveDescription_Covet[] = _(
+ "Bittet charmant um das ge-\n"
+ "haltene Item des Gegners.");
+
+static const u8 MoveDescription_VoltTackle[] = _(
+ "Lebensgefährliche Attacke,\n"
+ "leichte Selbstschädigung.");
+
+static const u8 MoveDescription_MagicalLeaf[] = _(
+ "Magischer Blattangriff.\n"
+ "Ausweichen unmöglich.");
+
+static const u8 MoveDescription_WaterSport[] = _(
+ "Benutzer wird nass, so dass\n"
+ "er Feuer besser standhält.");
+
+static const u8 MoveDescription_CalmMind[] = _(
+ "Erhöht SPEZ. ANGR. u. SPEZ.\n"
+ "VERT. durch Konzentration.");
+
+static const u8 MoveDescription_LeafBlade[] = _(
+ "Hieb mit scharfkantigem\n"
+ "Blatt. Hohe Volltrefferqu.");
+
+static const u8 MoveDescription_DragonDance[] = _(
+ "Ein mystischer Tanz, der\n"
+ "ANGR.- u. INIT.-Wert erhöht.");
+
+static const u8 MoveDescription_RockBlast[] = _(
+ "Wirft 2 - 5-mal in Folge\n"
+ "Felsblöcke auf den Gegner.");
+
+static const u8 MoveDescription_ShockWave[] = _(
+ "Schnelle Elektro-Attacke\n"
+ "mit Treffergarantie.");
+
+static const u8 MoveDescription_WaterPulse[] = _(
+ "Ultraschallwellen, die den\n"
+ "Gegner verwirren können.");
+
+static const u8 MoveDescription_DoomDesire[] = _(
+ "Speichert Sonnenenergie.\n"
+ "Angriff 2 Runden später.");
+
+static const u8 MoveDescription_PsychoBoost[] = _(
+ "Angriff mit voller Kraft.\n"
+ "SPEZ. ANGR. sinkt deutlich.");
+
+const u8 * const gMoveDescriptions[] = {
+ MoveDescription_Pound,
+ MoveDescription_KarateChop,
+ MoveDescription_DoubleSlap,
+ MoveDescription_CometPunch,
+ MoveDescription_MegaPunch,
+ MoveDescription_PayDay,
+ MoveDescription_FirePunch,
+ MoveDescription_IcePunch,
+ MoveDescription_ThunderPunch,
+ MoveDescription_Scratch,
+ MoveDescription_ViceGrip,
+ MoveDescription_Guillotine,
+ MoveDescription_RazorWind,
+ MoveDescription_SwordsDance,
+ MoveDescription_Cut,
+ MoveDescription_Gust,
+ MoveDescription_WingAttack,
+ MoveDescription_Whirlwind,
+ MoveDescription_Fly,
+ MoveDescription_Bind,
+ MoveDescription_Slam,
+ MoveDescription_VineWhip,
+ MoveDescription_Stomp,
+ MoveDescription_DoubleKick,
+ MoveDescription_MegaKick,
+ MoveDescription_JumpKick,
+ MoveDescription_RollingKick,
+ MoveDescription_SandAttack,
+ MoveDescription_Headbutt,
+ MoveDescription_HornAttack,
+ MoveDescription_FuryAttack,
+ MoveDescription_HornDrill,
+ MoveDescription_Tackle,
+ MoveDescription_BodySlam,
+ MoveDescription_Wrap,
+ MoveDescription_TakeDown,
+ MoveDescription_Thrash,
+ MoveDescription_DoubleEdge,
+ MoveDescription_TailWhip,
+ MoveDescription_PoisonSting,
+ MoveDescription_Twineedle,
+ MoveDescription_PinMissile,
+ MoveDescription_Leer,
+ MoveDescription_Bite,
+ MoveDescription_Growl,
+ MoveDescription_Roar,
+ MoveDescription_Sing,
+ MoveDescription_Supersonic,
+ MoveDescription_SonicBoom,
+ MoveDescription_Disable,
+ MoveDescription_Acid,
+ MoveDescription_Ember,
+ MoveDescription_Flamethrower,
+ MoveDescription_Mist,
+ MoveDescription_WaterGun,
+ MoveDescription_HydroPump,
+ MoveDescription_Surf,
+ MoveDescription_IceBeam,
+ MoveDescription_Blizzard,
+ MoveDescription_Psybeam,
+ MoveDescription_BubbleBeam,
+ MoveDescription_AuroraBeam,
+ MoveDescription_HyperBeam,
+ MoveDescription_Peck,
+ MoveDescription_DrillPeck,
+ MoveDescription_Submission,
+ MoveDescription_LowKick,
+ MoveDescription_Counter,
+ MoveDescription_SeismicToss,
+ MoveDescription_Strength,
+ MoveDescription_Absorb,
+ MoveDescription_MegaDrain,
+ MoveDescription_LeechSeed,
+ MoveDescription_Growth,
+ MoveDescription_RazorLeaf,
+ MoveDescription_SolarBeam,
+ MoveDescription_PoisonPowder,
+ MoveDescription_StunSpore,
+ MoveDescription_SleepPowder,
+ MoveDescription_PetalDance,
+ MoveDescription_StringShot,
+ MoveDescription_DragonRage,
+ MoveDescription_FireSpin,
+ MoveDescription_ThunderShock,
+ MoveDescription_Thunderbolt,
+ MoveDescription_ThunderWave,
+ MoveDescription_Thunder,
+ MoveDescription_RockThrow,
+ MoveDescription_Earthquake,
+ MoveDescription_Fissure,
+ MoveDescription_Dig,
+ MoveDescription_Toxic,
+ MoveDescription_Confusion,
+ MoveDescription_Psychic,
+ MoveDescription_Hypnosis,
+ MoveDescription_Meditate,
+ MoveDescription_Agility,
+ MoveDescription_QuickAttack,
+ MoveDescription_Rage,
+ MoveDescription_Teleport,
+ MoveDescription_NightShade,
+ MoveDescription_Mimic,
+ MoveDescription_Screech,
+ MoveDescription_DoubleTeam,
+ MoveDescription_Recover,
+ MoveDescription_Harden,
+ MoveDescription_Minimize,
+ MoveDescription_Smokescreen,
+ MoveDescription_ConfuseRay,
+ MoveDescription_Withdraw,
+ MoveDescription_DefenseCurl,
+ MoveDescription_Barrier,
+ MoveDescription_LightScreen,
+ MoveDescription_Haze,
+ MoveDescription_Reflect,
+ MoveDescription_FocusEnergy,
+ MoveDescription_Bide,
+ MoveDescription_Metronome,
+ MoveDescription_MirrorMove,
+ MoveDescription_SelfDestruct,
+ MoveDescription_EggBomb,
+ MoveDescription_Lick,
+ MoveDescription_Smog,
+ MoveDescription_Sludge,
+ MoveDescription_BoneClub,
+ MoveDescription_FireBlast,
+ MoveDescription_Waterfall,
+ MoveDescription_Clamp,
+ MoveDescription_Swift,
+ MoveDescription_SkullBash,
+ MoveDescription_SpikeCannon,
+ MoveDescription_Constrict,
+ MoveDescription_Amnesia,
+ MoveDescription_Kinesis,
+ MoveDescription_SoftBoiled,
+ MoveDescription_HiJumpKick,
+ MoveDescription_Glare,
+ MoveDescription_DreamEater,
+ MoveDescription_PoisonGas,
+ MoveDescription_Barrage,
+ MoveDescription_LeechLife,
+ MoveDescription_LovelyKiss,
+ MoveDescription_SkyAttack,
+ MoveDescription_Transform,
+ MoveDescription_Bubble,
+ MoveDescription_DizzyPunch,
+ MoveDescription_Spore,
+ MoveDescription_Flash,
+ MoveDescription_Psywave,
+ MoveDescription_Splash,
+ MoveDescription_AcidArmor,
+ MoveDescription_Crabhammer,
+ MoveDescription_Explosion,
+ MoveDescription_FurySwipes,
+ MoveDescription_Bonemerang,
+ MoveDescription_Rest,
+ MoveDescription_RockSlide,
+ MoveDescription_HyperFang,
+ MoveDescription_Sharpen,
+ MoveDescription_Conversion,
+ MoveDescription_TriAttack,
+ MoveDescription_SuperFang,
+ MoveDescription_Slash,
+ MoveDescription_Substitute,
+ MoveDescription_Struggle,
+ MoveDescription_Sketch,
+ MoveDescription_TripleKick,
+ MoveDescription_Thief,
+ MoveDescription_SpiderWeb,
+ MoveDescription_MindReader,
+ MoveDescription_Nightmare,
+ MoveDescription_FlameWheel,
+ MoveDescription_Snore,
+ MoveDescription_Curse,
+ MoveDescription_Flail,
+ MoveDescription_Conversion2,
+ MoveDescription_Aeroblast,
+ MoveDescription_CottonSpore,
+ MoveDescription_Reversal,
+ MoveDescription_Spite,
+ MoveDescription_PowderSnow,
+ MoveDescription_Protect,
+ MoveDescription_MachPunch,
+ MoveDescription_ScaryFace,
+ MoveDescription_FaintAttack,
+ MoveDescription_SweetKiss,
+ MoveDescription_BellyDrum,
+ MoveDescription_SludgeBomb,
+ MoveDescription_MudSlap,
+ MoveDescription_Octazooka,
+ MoveDescription_Spikes,
+ MoveDescription_ZapCannon,
+ MoveDescription_Foresight,
+ MoveDescription_DestinyBond,
+ MoveDescription_PerishSong,
+ MoveDescription_IcyWind,
+ MoveDescription_Detect,
+ MoveDescription_BoneRush,
+ MoveDescription_LockOn,
+ MoveDescription_Outrage,
+ MoveDescription_Sandstorm,
+ MoveDescription_GigaDrain,
+ MoveDescription_Endure,
+ MoveDescription_Charm,
+ MoveDescription_Rollout,
+ MoveDescription_FalseSwipe,
+ MoveDescription_Swagger,
+ MoveDescription_MilkDrink,
+ MoveDescription_Spark,
+ MoveDescription_FuryCutter,
+ MoveDescription_SteelWing,
+ MoveDescription_MeanLook,
+ MoveDescription_Attract,
+ MoveDescription_SleepTalk,
+ MoveDescription_HealBell,
+ MoveDescription_Return,
+ MoveDescription_Present,
+ MoveDescription_Frustration,
+ MoveDescription_Safeguard,
+ MoveDescription_PainSplit,
+ MoveDescription_SacredFire,
+ MoveDescription_Magnitude,
+ MoveDescription_DynamicPunch,
+ MoveDescription_Megahorn,
+ MoveDescription_DragonBreath,
+ MoveDescription_BatonPass,
+ MoveDescription_Encore,
+ MoveDescription_Pursuit,
+ MoveDescription_RapidSpin,
+ MoveDescription_SweetScent,
+ MoveDescription_IronTail,
+ MoveDescription_MetalClaw,
+ MoveDescription_VitalThrow,
+ MoveDescription_MorningSun,
+ MoveDescription_Synthesis,
+ MoveDescription_Moonlight,
+ MoveDescription_HiddenPower,
+ MoveDescription_CrossChop,
+ MoveDescription_Twister,
+ MoveDescription_RainDance,
+ MoveDescription_SunnyDay,
+ MoveDescription_Crunch,
+ MoveDescription_MirrorCoat,
+ MoveDescription_PsychUp,
+ MoveDescription_ExtremeSpeed,
+ MoveDescription_AncientPower,
+ MoveDescription_ShadowBall,
+ MoveDescription_FutureSight,
+ MoveDescription_RockSmash,
+ MoveDescription_Whirlpool,
+ MoveDescription_BeatUp,
+ MoveDescription_FakeOut,
+ MoveDescription_Uproar,
+ MoveDescription_Stockpile,
+ MoveDescription_SpitUp,
+ MoveDescription_Swallow,
+ MoveDescription_HeatWave,
+ MoveDescription_Hail,
+ MoveDescription_Torment,
+ MoveDescription_Flatter,
+ MoveDescription_WillOWisp,
+ MoveDescription_Memento,
+ MoveDescription_Facade,
+ MoveDescription_FocusPunch,
+ MoveDescription_SmellingSalt,
+ MoveDescription_FollowMe,
+ MoveDescription_NaturePower,
+ MoveDescription_Charge,
+ MoveDescription_Taunt,
+ MoveDescription_HelpingHand,
+ MoveDescription_Trick,
+ MoveDescription_RolePlay,
+ MoveDescription_Wish,
+ MoveDescription_Assist,
+ MoveDescription_Ingrain,
+ MoveDescription_Superpower,
+ MoveDescription_MagicCoat,
+ MoveDescription_Recycle,
+ MoveDescription_Revenge,
+ MoveDescription_BrickBreak,
+ MoveDescription_Yawn,
+ MoveDescription_KnockOff,
+ MoveDescription_Endeavor,
+ MoveDescription_Eruption,
+ MoveDescription_SkillSwap,
+ MoveDescription_Imprison,
+ MoveDescription_Refresh,
+ MoveDescription_Grudge,
+ MoveDescription_Snatch,
+ MoveDescription_SecretPower,
+ MoveDescription_Dive,
+ MoveDescription_ArmThrust,
+ MoveDescription_Camouflage,
+ MoveDescription_TailGlow,
+ MoveDescription_LusterPurge,
+ MoveDescription_MistBall,
+ MoveDescription_FeatherDance,
+ MoveDescription_TeeterDance,
+ MoveDescription_BlazeKick,
+ MoveDescription_MudSport,
+ MoveDescription_IceBall,
+ MoveDescription_NeedleArm,
+ MoveDescription_SlackOff,
+ MoveDescription_HyperVoice,
+ MoveDescription_PoisonFang,
+ MoveDescription_CrushClaw,
+ MoveDescription_BlastBurn,
+ MoveDescription_HydroCannon,
+ MoveDescription_MeteorMash,
+ MoveDescription_Astonish,
+ MoveDescription_WeatherBall,
+ MoveDescription_Aromatherapy,
+ MoveDescription_FakeTears,
+ MoveDescription_AirCutter,
+ MoveDescription_Overheat,
+ MoveDescription_OdorSleuth,
+ MoveDescription_RockTomb,
+ MoveDescription_SilverWind,
+ MoveDescription_MetalSound,
+ MoveDescription_GrassWhistle,
+ MoveDescription_Tickle,
+ MoveDescription_CosmicPower,
+ MoveDescription_WaterSpout,
+ MoveDescription_SignalBeam,
+ MoveDescription_ShadowPunch,
+ MoveDescription_Extrasensory,
+ MoveDescription_SkyUppercut,
+ MoveDescription_SandTomb,
+ MoveDescription_SheerCold,
+ MoveDescription_MuddyWater,
+ MoveDescription_BulletSeed,
+ MoveDescription_AerialAce,
+ MoveDescription_IcicleSpear,
+ MoveDescription_IronDefense,
+ MoveDescription_Block,
+ MoveDescription_Howl,
+ MoveDescription_DragonClaw,
+ MoveDescription_FrenzyPlant,
+ MoveDescription_BulkUp,
+ MoveDescription_Bounce,
+ MoveDescription_MudShot,
+ MoveDescription_PoisonTail,
+ MoveDescription_Covet,
+ MoveDescription_VoltTackle,
+ MoveDescription_MagicalLeaf,
+ MoveDescription_WaterSport,
+ MoveDescription_CalmMind,
+ MoveDescription_LeafBlade,
+ MoveDescription_DragonDance,
+ MoveDescription_RockBlast,
+ MoveDescription_ShockWave,
+ MoveDescription_WaterPulse,
+ MoveDescription_DoomDesire,
+ MoveDescription_PsychoBoost,
+};
diff --git a/src/data/text/move_descriptions_en.h b/src/data/text/move_descriptions_en.h
new file mode 100644
index 000000000..3c3a961d1
--- /dev/null
+++ b/src/data/text/move_descriptions_en.h
@@ -0,0 +1,1772 @@
+static const u8 MoveDescription_Pound[] = _(
+ "Pounds the foe with\n"
+ "forelegs or tail.");
+
+static const u8 MoveDescription_KarateChop[] = _(
+ "A chopping attack with a\n"
+ "high critical-hit ratio.");
+
+static const u8 MoveDescription_DoubleSlap[] = _(
+ "Repeatedly slaps the foe\n"
+ "2 to 5 times.");
+
+static const u8 MoveDescription_CometPunch[] = _(
+ "Repeatedly punches the foe\n"
+ "2 to 5 times.");
+
+static const u8 MoveDescription_MegaPunch[] = _(
+ "A strong punch thrown with\n"
+ "incredible power.");
+
+static const u8 MoveDescription_PayDay[] = _(
+ "Throws coins at the foe.\n"
+ "Money is recovered after.");
+
+static const u8 MoveDescription_FirePunch[] = _(
+ "A fiery punch that may burn\n"
+ "the foe.");
+
+static const u8 MoveDescription_IcePunch[] = _(
+ "An icy punch that may\n"
+ "freeze the foe.");
+
+static const u8 MoveDescription_ThunderPunch[] = _(
+ "An electrified punch that\n"
+ "may paralyze the foe.");
+
+static const u8 MoveDescription_Scratch[] = _(
+ "Scratches the foe with\n"
+ "sharp claws.");
+
+static const u8 MoveDescription_ViceGrip[] = _(
+ "Grips the foe with large and\n"
+ "powerful pincers.");
+
+static const u8 MoveDescription_Guillotine[] = _(
+ "A powerful pincer attack\n"
+ "that may cause fainting.");
+
+static const u8 MoveDescription_RazorWind[] = _(
+ "A 2-turn move that strikes\n"
+ "the foe on the 2nd turn.");
+
+static const u8 MoveDescription_SwordsDance[] = _(
+ "A fighting dance that\n"
+ "sharply raises ATTACK.");
+
+static const u8 MoveDescription_Cut[] = _(
+ "Cuts the foe with sharp\n"
+ "scythes, claws, etc.");
+
+static const u8 MoveDescription_Gust[] = _(
+ "Strikes the foe with a gust\n"
+ "of wind whipped up by wings.");
+
+static const u8 MoveDescription_WingAttack[] = _(
+ "Strikes the foe with wings\n"
+ "spread wide.");
+
+static const u8 MoveDescription_Whirlwind[] = _(
+ "Blows away the foe with\n"
+ "wind and ends the battle.");
+
+static const u8 MoveDescription_Fly[] = _(
+ "Flies up on the first turn,\n"
+ "then strikes the next turn.");
+
+static const u8 MoveDescription_Bind[] = _(
+ "Binds and squeezes the foe\n"
+ "for 2 to 5 turns.");
+
+static const u8 MoveDescription_Slam[] = _(
+ "Slams the foe with a long\n"
+ "tail, vine, etc.");
+
+static const u8 MoveDescription_VineWhip[] = _(
+ "Strikes the foe with\n"
+ "slender, whiplike vines.");
+
+static const u8 MoveDescription_Stomp[] = _(
+ "Stomps the enemy with a big\n"
+ "foot. May cause flinching.");
+
+static const u8 MoveDescription_DoubleKick[] = _(
+ "A double-kicking attack\n"
+ "that strikes the foe twice.");
+
+static const u8 MoveDescription_MegaKick[] = _(
+ "An extremely powerful kick\n"
+ "with intense force.");
+
+static const u8 MoveDescription_JumpKick[] = _(
+ "A strong jumping kick. May\n"
+ "miss and hurt the kicker.");
+
+static const u8 MoveDescription_RollingKick[] = _(
+ "A fast kick delivered from\n"
+ "a rapid spin.");
+
+static const u8 MoveDescription_SandAttack[] = _(
+ "Reduces the foe’s accuracy\n"
+ "by hurling sand in its face.");
+
+static const u8 MoveDescription_Headbutt[] = _(
+ "A ramming attack that may\n"
+ "cause flinching.");
+
+static const u8 MoveDescription_HornAttack[] = _(
+ "Jabs the foe with sharp\n"
+ "horns.");
+
+static const u8 MoveDescription_FuryAttack[] = _(
+ "Jabs the foe 2 to 5 times\n"
+ "with sharp horns, etc.");
+
+static const u8 MoveDescription_HornDrill[] = _(
+ "A one-hit KO attack that\n"
+ "uses a horn like a drill.");
+
+static const u8 MoveDescription_Tackle[] = _(
+ "Charges the foe with a full-\n"
+ "body tackle.");
+
+static const u8 MoveDescription_BodySlam[] = _(
+ "A full-body slam that may\n"
+ "cause paralysis.");
+
+static const u8 MoveDescription_Wrap[] = _(
+ "Wraps and squeezes the foe\n"
+ "2 to 5 times with vines, etc.");
+
+static const u8 MoveDescription_TakeDown[] = _(
+ "A reckless charge attack\n"
+ "that also hurts the user.");
+
+static const u8 MoveDescription_Thrash[] = _(
+ "A rampage of 2 to 3 turns\n"
+ "that confuses the user.");
+
+static const u8 MoveDescription_DoubleEdge[] = _(
+ "A life-risking tackle that\n"
+ "also hurts the user.");
+
+static const u8 MoveDescription_TailWhip[] = _(
+ "Wags the tail to lower the\n"
+ "foe’s DEFENSE.");
+
+static const u8 MoveDescription_PoisonSting[] = _(
+ "A toxic attack with barbs,\n"
+ "etc., that may poison.");
+
+static const u8 MoveDescription_Twineedle[] = _(
+ "Stingers on the forelegs\n"
+ "jab the foe twice.");
+
+static const u8 MoveDescription_PinMissile[] = _(
+ "Sharp pins are fired to\n"
+ "strike 2 to 5 times.");
+
+static const u8 MoveDescription_Leer[] = _(
+ "Frightens the foe with a\n"
+ "leer to lower DEFENSE.");
+
+static const u8 MoveDescription_Bite[] = _(
+ "Bites with vicious fangs.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_Growl[] = _(
+ "Growls cutely to reduce the\n"
+ "foe’s ATTACK.");
+
+static const u8 MoveDescription_Roar[] = _(
+ "Makes the foe flee to end\n"
+ "the battle.");
+
+static const u8 MoveDescription_Sing[] = _(
+ "A soothing song lulls the\n"
+ "foe into a deep slumber.");
+
+static const u8 MoveDescription_Supersonic[] = _(
+ "Emits bizarre sound waves\n"
+ "that may confuse the foe.");
+
+static const u8 MoveDescription_SonicBoom[] = _(
+ "Launches shock waves that\n"
+ "always inflict 20 HP damage.");
+
+static const u8 MoveDescription_Disable[] = _(
+ "Psychically disables one of\n"
+ "the foe’s moves.");
+
+static const u8 MoveDescription_Acid[] = _(
+ "Sprays a hide-melting acid.\n"
+ "May lower DEFENSE.");
+
+static const u8 MoveDescription_Ember[] = _(
+ "A weak fire attack that may\n"
+ "inflict a burn.");
+
+static const u8 MoveDescription_Flamethrower[] = _(
+ "A powerful fire attack that\n"
+ "may inflict a burn.");
+
+static const u8 MoveDescription_Mist[] = _(
+ "Creates a mist that stops\n"
+ "reduction of abilities.");
+
+static const u8 MoveDescription_WaterGun[] = _(
+ "Squirts water to attack\n"
+ "the foe.");
+
+static const u8 MoveDescription_HydroPump[] = _(
+ "Blasts water at high power\n"
+ "to strike the foe.");
+
+static const u8 MoveDescription_Surf[] = _(
+ "Creates a huge wave, then\n"
+ "crashes it down on the foe.");
+
+static const u8 MoveDescription_IceBeam[] = _(
+ "Blasts the foe with an icy\n"
+ "beam that may freeze it.");
+
+static const u8 MoveDescription_Blizzard[] = _(
+ "Hits the foe with an icy\n"
+ "storm that may freeze it.");
+
+static const u8 MoveDescription_Psybeam[] = _(
+ "Fires a peculiar ray that\n"
+ "may confuse the foe.");
+
+static const u8 MoveDescription_BubbleBeam[] = _(
+ "Forcefully sprays bubbles\n"
+ "that may lower SPEED.");
+
+static const u8 MoveDescription_AuroraBeam[] = _(
+ "Fires a rainbow-colored\n"
+ "beam that may lower ATTACK.");
+
+static const u8 MoveDescription_HyperBeam[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_Peck[] = _(
+ "Attacks the foe with a\n"
+ "jabbing beak, etc.");
+
+static const u8 MoveDescription_DrillPeck[] = _(
+ "A corkscrewing attack with\n"
+ "the beak acting as a drill.");
+
+static const u8 MoveDescription_Submission[] = _(
+ "A reckless body slam that\n"
+ "also hurts the user.");
+
+static const u8 MoveDescription_LowKick[] = _(
+ "A kick that inflicts more\n"
+ "damage on heavier foes.");
+
+static const u8 MoveDescription_Counter[] = _(
+ "Retaliates any physical hit\n"
+ "with double the power.");
+
+static const u8 MoveDescription_SeismicToss[] = _(
+ "Inflicts damage identical\n"
+ "to the user’s level.");
+
+static const u8 MoveDescription_Strength[] = _(
+ "Builds enormous power,\n"
+ "then slams the foe.");
+
+static const u8 MoveDescription_Absorb[] = _(
+ "An attack that absorbs\n"
+ "half the damage inflicted.");
+
+static const u8 MoveDescription_MegaDrain[] = _(
+ "An attack that absorbs\n"
+ "half the damage inflicted.");
+
+static const u8 MoveDescription_LeechSeed[] = _(
+ "Plants a seed on the foe to\n"
+ "steal HP on every turn.");
+
+static const u8 MoveDescription_Growth[] = _(
+ "Forces the body to grow\n"
+ "and heightens SP. ATK.");
+
+static const u8 MoveDescription_RazorLeaf[] = _(
+ "Cuts the enemy with leaves.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_SolarBeam[] = _(
+ "Absorbs light in one turn,\n"
+ "then attacks next turn.");
+
+static const u8 MoveDescription_PoisonPowder[] = _(
+ "Scatters a toxic powder\n"
+ "that may poison the foe.");
+
+static const u8 MoveDescription_StunSpore[] = _(
+ "Scatters a powder that may\n"
+ "paralyze the foe.");
+
+static const u8 MoveDescription_SleepPowder[] = _(
+ "Scatters a powder that may\n"
+ "cause the foe to sleep.");
+
+static const u8 MoveDescription_PetalDance[] = _(
+ "A rampage of 2 to 3 turns\n"
+ "that confuses the user.");
+
+static const u8 MoveDescription_StringShot[] = _(
+ "Binds the foe with string\n"
+ "to reduce its SPEED.");
+
+static const u8 MoveDescription_DragonRage[] = _(
+ "Launches shock waves that\n"
+ "always inflict 40 HP damage.");
+
+static const u8 MoveDescription_FireSpin[] = _(
+ "Traps the foe in a ring of\n"
+ "fire for 2 to 5 turns.");
+
+static const u8 MoveDescription_ThunderShock[] = _(
+ "An electrical attack that\n"
+ "may paralyze the foe.");
+
+static const u8 MoveDescription_Thunderbolt[] = _(
+ "A strong electrical attack\n"
+ "that may paralyze the foe.");
+
+static const u8 MoveDescription_ThunderWave[] = _(
+ "A weak jolt of electricity\n"
+ "that paralyzes the foe.");
+
+static const u8 MoveDescription_Thunder[] = _(
+ "A lightning attack that may\n"
+ "cause paralysis.");
+
+static const u8 MoveDescription_RockThrow[] = _(
+ "Throws small rocks to\n"
+ "strike the foe.");
+
+static const u8 MoveDescription_Earthquake[] = _(
+ "A powerful quake, but has\n"
+ "no effect on flying foes.");
+
+static const u8 MoveDescription_Fissure[] = _(
+ "A one-hit KO move that\n"
+ "drops the foe in a fissure.");
+
+static const u8 MoveDescription_Dig[] = _(
+ "Digs underground the first\n"
+ "turn and strikes next turn.");
+
+static const u8 MoveDescription_Toxic[] = _(
+ "Poisons the foe with an\n"
+ "intensifying toxin.");
+
+static const u8 MoveDescription_Confusion[] = _(
+ "A psychic attack that may\n"
+ "cause confusion.");
+
+static const u8 MoveDescription_Psychic[] = _(
+ "A powerful psychic attack\n"
+ "that may lower SP. DEF.");
+
+static const u8 MoveDescription_Hypnosis[] = _(
+ "A hypnotizing move that\n"
+ "may induce sleep.");
+
+static const u8 MoveDescription_Meditate[] = _(
+ "Meditates in a peaceful\n"
+ "fashion to raise ATTACK.");
+
+static const u8 MoveDescription_Agility[] = _(
+ "Relaxes the body to sharply\n"
+ "boost SPEED.");
+
+static const u8 MoveDescription_QuickAttack[] = _(
+ "An extremely fast attack\n"
+ "that always strikes first.");
+
+static const u8 MoveDescription_Rage[] = _(
+ "Raises the user’s ATTACK\n"
+ "every time it is hit.");
+
+static const u8 MoveDescription_Teleport[] = _(
+ "A psychic move for fleeing\n"
+ "from battle instantly.");
+
+static const u8 MoveDescription_NightShade[] = _(
+ "Inflicts damage identical\n"
+ "to the user’s level.");
+
+static const u8 MoveDescription_Mimic[] = _(
+ "Copies a move used by the\n"
+ "foe during one battle.");
+
+static const u8 MoveDescription_Screech[] = _(
+ "Emits a screech to sharply\n"
+ "reduce the foe’s DEFENSE.");
+
+static const u8 MoveDescription_DoubleTeam[] = _(
+ "Creates illusory copies to\n"
+ "raise evasiveness.");
+
+static const u8 MoveDescription_Recover[] = _(
+ "Recovers up to half the\n"
+ "user’s maximum HP.");
+
+static const u8 MoveDescription_Harden[] = _(
+ "Stiffens the body’s \n"
+ "muscles to raise DEFENSE.");
+
+static const u8 MoveDescription_Minimize[] = _(
+ "Minimizes the user’s size\n"
+ "to raise evasiveness.");
+
+static const u8 MoveDescription_Smokescreen[] = _(
+ "Lowers the foe’s accuracy\n"
+ "using smoke, ink, etc.");
+
+static const u8 MoveDescription_ConfuseRay[] = _(
+ "A sinister ray that\n"
+ "confuses the foe.");
+
+static const u8 MoveDescription_Withdraw[] = _(
+ "Withdraws the body into its\n"
+ "hard shell to raise DEFENSE.");
+
+static const u8 MoveDescription_DefenseCurl[] = _(
+ "Curls up to conceal weak\n"
+ "spots and raise DEFENSE.");
+
+static const u8 MoveDescription_Barrier[] = _(
+ "Creates a barrier that\n"
+ "sharply raises DEFENSE.");
+
+static const u8 MoveDescription_LightScreen[] = _(
+ "Creates a wall of light that\n"
+ "lowers SP. ATK damage.");
+
+static const u8 MoveDescription_Haze[] = _(
+ "Creates a black haze that\n"
+ "eliminates all stat changes.");
+
+static const u8 MoveDescription_Reflect[] = _(
+ "Creates a wall of light that\n"
+ "weakens physical attacks.");
+
+static const u8 MoveDescription_FocusEnergy[] = _(
+ "Focuses power to raise the\n"
+ "critical-hit ratio.");
+
+static const u8 MoveDescription_Bide[] = _(
+ "Endures attack for 2\n"
+ "turns to retaliate double.");
+
+static const u8 MoveDescription_Metronome[] = _(
+ "Waggles a finger to use any\n"
+ "POKéMON move at random.");
+
+static const u8 MoveDescription_MirrorMove[] = _(
+ "Counters the foe’s attack\n"
+ "with the same move.");
+
+static const u8 MoveDescription_SelfDestruct[] = _(
+ "Inflicts severe damage but\n"
+ "makes the user faint.");
+
+static const u8 MoveDescription_EggBomb[] = _(
+ "An egg is forcibly hurled at\n"
+ "the foe.");
+
+static const u8 MoveDescription_Lick[] = _(
+ "Licks with a long tongue to\n"
+ "injure. May also paralyze.");
+
+static const u8 MoveDescription_Smog[] = _(
+ "An exhaust-gas attack\n"
+ "that may also poison.");
+
+static const u8 MoveDescription_Sludge[] = _(
+ "Sludge is hurled to inflict\n"
+ "damage. May also poison.");
+
+static const u8 MoveDescription_BoneClub[] = _(
+ "Clubs the foe with a bone.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_FireBlast[] = _(
+ "A fiery blast that scorches\n"
+ "all. May cause a burn.");
+
+static const u8 MoveDescription_Waterfall[] = _(
+ "Charges the foe with speed\n"
+ "to climb waterfalls.");
+
+static const u8 MoveDescription_Clamp[] = _(
+ "Traps and squeezes the\n"
+ "foe for 2 to 5 turns.");
+
+static const u8 MoveDescription_Swift[] = _(
+ "Sprays star-shaped rays\n"
+ "that never miss.");
+
+static const u8 MoveDescription_SkullBash[] = _(
+ "Tucks in the head, then\n"
+ "attacks on the next turn.");
+
+static const u8 MoveDescription_SpikeCannon[] = _(
+ "Launches sharp spikes that\n"
+ "strike 2 to 5 times.");
+
+static const u8 MoveDescription_Constrict[] = _(
+ "Constricts to inflict pain.\n"
+ "May lower SPEED.");
+
+static const u8 MoveDescription_Amnesia[] = _(
+ "Forgets about something\n"
+ "and sharply raises SP. DEF.");
+
+static const u8 MoveDescription_Kinesis[] = _(
+ "Distracts the foe.\n"
+ "May lower accuracy.");
+
+static const u8 MoveDescription_SoftBoiled[] = _(
+ "Recovers up to half the\n"
+ "user’s maximum HP.");
+
+static const u8 MoveDescription_HiJumpKick[] = _(
+ "A jumping knee kick. If it\n"
+ "misses, the user is hurt.");
+
+static const u8 MoveDescription_Glare[] = _(
+ "Intimidates and frightens\n"
+ "the foe into paralysis.");
+
+static const u8 MoveDescription_DreamEater[] = _(
+ "Takes one half the damage\n"
+ "inflicted on a sleeping foe.");
+
+static const u8 MoveDescription_PoisonGas[] = _(
+ "Envelops the foe in a toxic\n"
+ "gas that may poison.");
+
+static const u8 MoveDescription_Barrage[] = _(
+ "Hurls round objects at the\n"
+ "foe 2 to 5 times.");
+
+static const u8 MoveDescription_LeechLife[] = _(
+ "An attack that steals half\n"
+ "the damage inflicted.");
+
+static const u8 MoveDescription_LovelyKiss[] = _(
+ "Demands a kiss with a scary\n"
+ "face that induces sleep.");
+
+static const u8 MoveDescription_SkyAttack[] = _(
+ "Searches out weak spots,\n"
+ "then strikes the next turn.");
+
+static const u8 MoveDescription_Transform[] = _(
+ "Alters the user’s cells to\n"
+ "become a copy of the foe.");
+
+static const u8 MoveDescription_Bubble[] = _(
+ "An attack using bubbles.\n"
+ "May lower the foe’s SPEED.");
+
+static const u8 MoveDescription_DizzyPunch[] = _(
+ "A rhythmic punch that may\n"
+ "confuse the foe.");
+
+static const u8 MoveDescription_Spore[] = _(
+ "Scatters a cloud of spores\n"
+ "that always induce sleep.");
+
+static const u8 MoveDescription_Flash[] = _(
+ "Looses a powerful blast of\n"
+ "light that cuts accuracy.");
+
+static const u8 MoveDescription_Psywave[] = _(
+ "Attacks with a psychic\n"
+ "wave of varying intensity.");
+
+static const u8 MoveDescription_Splash[] = _(
+ "It’s just a splash...\n"
+ "Has no effect whatsoever.");
+
+static const u8 MoveDescription_AcidArmor[] = _(
+ "Liquifies the user’s body\n"
+ "to sharply raise DEFENSE.");
+
+static const u8 MoveDescription_Crabhammer[] = _(
+ "Hammers with a pincer. Has a\n"
+ "high critical-hit ratio.");
+
+static const u8 MoveDescription_Explosion[] = _(
+ "Inflicts severe damage but\n"
+ "makes the user faint.");
+
+static const u8 MoveDescription_FurySwipes[] = _(
+ "Rakes the foe with sharp\n"
+ "claws, etc., 2 to 5 times.");
+
+static const u8 MoveDescription_Bonemerang[] = _(
+ "Throws a bone boomerang\n"
+ "that strikes twice.");
+
+static const u8 MoveDescription_Rest[] = _(
+ "The user sleeps for 2 turns,\n"
+ "restoring HP and status.");
+
+static const u8 MoveDescription_RockSlide[] = _(
+ "Large boulders are hurled.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_HyperFang[] = _(
+ "Attacks with sharp fangs.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_Sharpen[] = _(
+ "Reduces the polygon count\n"
+ "and raises ATTACK.");
+
+static const u8 MoveDescription_Conversion[] = _(
+ "Changes the user’s type\n"
+ "into an own move’s type.");
+
+static const u8 MoveDescription_TriAttack[] = _(
+ "Fires three types of beams\n"
+ "at the same time.");
+
+static const u8 MoveDescription_SuperFang[] = _(
+ "Attacks with sharp fangs\n"
+ "and cuts half the foe’s HP.");
+
+static const u8 MoveDescription_Slash[] = _(
+ "Slashes with claws, etc. Has\n"
+ "a high critical-hit ratio.");
+
+static const u8 MoveDescription_Substitute[] = _(
+ "Creates a decoy using 1/4\n"
+ "of the user’s maximum HP.");
+
+static const u8 MoveDescription_Struggle[] = _(
+ "Used only if all PP are gone.\n"
+ "Also hurts the user a little.");
+
+static const u8 MoveDescription_Sketch[] = _(
+ "Copies the foe’s last move\n"
+ "permanently.");
+
+static const u8 MoveDescription_TripleKick[] = _(
+ "Kicks the foe 3 times in a\n"
+ "row with rising intensity.");
+
+static const u8 MoveDescription_Thief[] = _(
+ "While attacking, it may\n"
+ "steal the foe’s held item.");
+
+static const u8 MoveDescription_SpiderWeb[] = _(
+ "Ensnares the foe to stop it\n"
+ "from fleeing or switching.");
+
+static const u8 MoveDescription_MindReader[] = _(
+ "Senses the foe’s action to\n"
+ "ensure the next move’s hit.");
+
+static const u8 MoveDescription_Nightmare[] = _(
+ "Inflicts 1/4 damage on a\n"
+ "sleeping foe every turn.");
+
+static const u8 MoveDescription_FlameWheel[] = _(
+ "A fiery charge attack that\n"
+ "may inflict a burn.");
+
+static const u8 MoveDescription_Snore[] = _(
+ "A loud attack that can be\n"
+ "used only while asleep.");
+
+static const u8 MoveDescription_Curse[] = _(
+ "A move that functions\n"
+ "differently for GHOSTS.");
+
+static const u8 MoveDescription_Flail[] = _(
+ "Inflicts more damage when\n"
+ "the user’s HP is down.");
+
+static const u8 MoveDescription_Conversion2[] = _(
+ "Makes the user resistant\n"
+ "to the last attack’s type.");
+
+static const u8 MoveDescription_Aeroblast[] = _(
+ "Launches a vacuumed blast.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_CottonSpore[] = _(
+ "Spores cling to the foe,\n"
+ "sharply reducing SPEED.");
+
+static const u8 MoveDescription_Reversal[] = _(
+ "Inflicts more damage when\n"
+ "the user’s HP is down.");
+
+static const u8 MoveDescription_Spite[] = _(
+ "Spitefully cuts the PP\n"
+ "of the foe’s last move.");
+
+static const u8 MoveDescription_PowderSnow[] = _(
+ "Blasts the foe with a snowy\n"
+ "gust. May cause freezing.");
+
+static const u8 MoveDescription_Protect[] = _(
+ "Evades attack, but may fail\n"
+ "if used in succession.");
+
+static const u8 MoveDescription_MachPunch[] = _(
+ "A punch is thrown at wicked\n"
+ "speed to strike first.");
+
+static const u8 MoveDescription_ScaryFace[] = _(
+ "Frightens with a scary face\n"
+ "to sharply reduce SPEED.");
+
+static const u8 MoveDescription_FaintAttack[] = _(
+ "Draws the foe close, then\n"
+ "strikes without fail.");
+
+static const u8 MoveDescription_SweetKiss[] = _(
+ "Demands a kiss with a cute\n"
+ "look. May cause confusion.");
+
+static const u8 MoveDescription_BellyDrum[] = _(
+ "Maximizes ATTACK while\n"
+ "sacrificing HP.");
+
+static const u8 MoveDescription_SludgeBomb[] = _(
+ "Sludge is hurled to inflict\n"
+ "damage. May also poison.");
+
+static const u8 MoveDescription_MudSlap[] = _(
+ "Hurls mud in the foe’s face\n"
+ "to reduce its accuracy.");
+
+static const u8 MoveDescription_Octazooka[] = _(
+ "Fires a lump of ink to\n"
+ "damage and cut accuracy.");
+
+static const u8 MoveDescription_Spikes[] = _(
+ "Sets spikes that hurt a \n"
+ "foe switching out.");
+
+static const u8 MoveDescription_ZapCannon[] = _(
+ "Powerful and sure to cause\n"
+ "paralysis, but inaccurate.");
+
+static const u8 MoveDescription_Foresight[] = _(
+ "Negates the foe’s efforts\n"
+ "to heighten evasiveness.");
+
+static const u8 MoveDescription_DestinyBond[] = _(
+ "If the user faints, the foe\n"
+ "is also made to faint.");
+
+static const u8 MoveDescription_PerishSong[] = _(
+ "Any POKéMON hearing this\n"
+ "song faints in 3 turns.");
+
+static const u8 MoveDescription_IcyWind[] = _(
+ "A chilling attack that\n"
+ "lowers the foe’s SPEED.");
+
+static const u8 MoveDescription_Detect[] = _(
+ "Evades attack, but may fail\n"
+ "if used in succession.");
+
+static const u8 MoveDescription_BoneRush[] = _(
+ "Strikes the foe with a bone\n"
+ "in hand 2 to 5 times.");
+
+static const u8 MoveDescription_LockOn[] = _(
+ "Locks on to the foe to\n"
+ "ensure the next move hits.");
+
+static const u8 MoveDescription_Outrage[] = _(
+ "A rampage of 2 to 3 turns\n"
+ "that confuses the user.");
+
+static const u8 MoveDescription_Sandstorm[] = _(
+ "Causes a sandstorm that\n"
+ "rages for several turns.");
+
+static const u8 MoveDescription_GigaDrain[] = _(
+ "An attack that steals half\n"
+ "the damage inflicted.");
+
+static const u8 MoveDescription_Endure[] = _(
+ "Endures any attack for\n"
+ "1 turn, leaving at least 1HP.");
+
+static const u8 MoveDescription_Charm[] = _(
+ "Charms the foe and sharply\n"
+ "reduces its ATTACK.");
+
+static const u8 MoveDescription_Rollout[] = _(
+ "An attack lasting 5 turns\n"
+ "with rising intensity.");
+
+static const u8 MoveDescription_FalseSwipe[] = _(
+ "An attack that leaves the\n"
+ "foe with at least 1 HP.");
+
+static const u8 MoveDescription_Swagger[] = _(
+ "Confuses the foe, but also\n"
+ "sharply raises ATTACK.");
+
+static const u8 MoveDescription_MilkDrink[] = _(
+ "Recovers up to half the\n"
+ "user’s maximum HP.");
+
+static const u8 MoveDescription_Spark[] = _(
+ "An electrified tackle that\n"
+ "may paralyze the foe.");
+
+static const u8 MoveDescription_FuryCutter[] = _(
+ "An attack that intensifies\n"
+ "on each successive hit.");
+
+static const u8 MoveDescription_SteelWing[] = _(
+ "Strikes the foe with hard\n"
+ "wings spread wide.");
+
+static const u8 MoveDescription_MeanLook[] = _(
+ "Fixes the foe with a mean\n"
+ "look that prevents escape.");
+
+static const u8 MoveDescription_Attract[] = _(
+ "Makes the opposite gender\n"
+ "less likely to attack.");
+
+static const u8 MoveDescription_SleepTalk[] = _(
+ "Uses an own move randomly\n"
+ "while asleep.");
+
+static const u8 MoveDescription_HealBell[] = _(
+ "Chimes soothingly to heal\n"
+ "all status abnormalities.");
+
+static const u8 MoveDescription_Return[] = _(
+ "An attack that increases\n"
+ "in power with friendship.");
+
+static const u8 MoveDescription_Present[] = _(
+ "A gift in the form of a\n"
+ "bomb. May restore HP.");
+
+static const u8 MoveDescription_Frustration[] = _(
+ "An attack that is stronger\n"
+ "if the TRAINER is disliked.");
+
+static const u8 MoveDescription_Safeguard[] = _(
+ "A mystical force prevents\n"
+ "all status problems.");
+
+static const u8 MoveDescription_PainSplit[] = _(
+ "Adds the user and foe’s HP,\n"
+ "then shares them equally.");
+
+static const u8 MoveDescription_SacredFire[] = _(
+ "A mystical fire attack that\n"
+ "may inflict a burn.");
+
+static const u8 MoveDescription_Magnitude[] = _(
+ "A ground-shaking attack\n"
+ "of random intensity.");
+
+static const u8 MoveDescription_DynamicPunch[] = _(
+ "Powerful and sure to cause\n"
+ "confusion, but inaccurate.");
+
+static const u8 MoveDescription_Megahorn[] = _(
+ "A brutal ramming attack\n"
+ "using out-thrust horns.");
+
+static const u8 MoveDescription_DragonBreath[] = _(
+ "Strikes the foe with an\n"
+ "incredible blast of breath.");
+
+static const u8 MoveDescription_BatonPass[] = _(
+ "Switches out the user while\n"
+ "keeping effects in play.");
+
+static const u8 MoveDescription_Encore[] = _(
+ "Makes the foe repeat its\n"
+ "last move over 2 to 6 turns.");
+
+static const u8 MoveDescription_Pursuit[] = _(
+ "Inflicts bad damage if used\n"
+ "on a foe switching out.");
+
+static const u8 MoveDescription_RapidSpin[] = _(
+ "Spins the body at high\n"
+ "speed to strike the foe.");
+
+static const u8 MoveDescription_SweetScent[] = _(
+ "Allures the foe to reduce\n"
+ "evasiveness.");
+
+static const u8 MoveDescription_IronTail[] = _(
+ "Attacks with a rock-hard\n"
+ "tail. May lower DEFENSE.");
+
+static const u8 MoveDescription_MetalClaw[] = _(
+ "A claw attack that may\n"
+ "raise the user’s ATTACK.");
+
+static const u8 MoveDescription_VitalThrow[] = _(
+ "Makes the user’s move last,\n"
+ "but it never misses.");
+
+static const u8 MoveDescription_MorningSun[] = _(
+ "Restores HP. The amount\n"
+ "varies with the weather.");
+
+static const u8 MoveDescription_Synthesis[] = _(
+ "Restores HP. The amount\n"
+ "varies with the weather.");
+
+static const u8 MoveDescription_Moonlight[] = _(
+ "Restores HP. The amount\n"
+ "varies with the weather.");
+
+static const u8 MoveDescription_HiddenPower[] = _(
+ "The effectiveness varies\n"
+ "with the user.");
+
+static const u8 MoveDescription_CrossChop[] = _(
+ "A double-chopping attack.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_Twister[] = _(
+ "Whips up a vicious twister\n"
+ "to tear at the foe.");
+
+static const u8 MoveDescription_RainDance[] = _(
+ "Boosts the power of WATER-\n"
+ "type moves for 5 turns.");
+
+static const u8 MoveDescription_SunnyDay[] = _(
+ "Boosts the power of FIRE-\n"
+ "type moves for 5 turns.");
+
+static const u8 MoveDescription_Crunch[] = _(
+ "Crunches with sharp fangs.\n"
+ "May lower SP. DEF.");
+
+static const u8 MoveDescription_MirrorCoat[] = _(
+ "Counters the foe’s special\n"
+ "attack at double the power.");
+
+static const u8 MoveDescription_PsychUp[] = _(
+ "Copies the foe’s effect(s)\n"
+ "and gives to the user.");
+
+static const u8 MoveDescription_ExtremeSpeed[] = _(
+ "An extremely fast and\n"
+ "powerful attack.");
+
+static const u8 MoveDescription_AncientPower[] = _(
+ "An attack that may raise\n"
+ "all stats.");
+
+static const u8 MoveDescription_ShadowBall[] = _(
+ "Hurls a black blob that may\n"
+ "lower the foe’s SP. DEF.");
+
+static const u8 MoveDescription_FutureSight[] = _(
+ "Heightens inner power to\n"
+ "strike 2 turns later.");
+
+static const u8 MoveDescription_RockSmash[] = _(
+ "A rock-crushing attack\n"
+ "that may lower DEFENSE.");
+
+static const u8 MoveDescription_Whirlpool[] = _(
+ "Traps and hurts the foe in\n"
+ "a whirlpool for 2 to 5 turns.");
+
+static const u8 MoveDescription_BeatUp[] = _(
+ "Summons party POKéMON to\n"
+ "join in the attack.");
+
+static const u8 MoveDescription_FakeOut[] = _(
+ "A 1st-turn, 1st-strike move\n"
+ "that causes flinching.");
+
+static const u8 MoveDescription_Uproar[] = _(
+ "Causes an uproar for 2 to 5\n"
+ "turns and prevents sleep.");
+
+static const u8 MoveDescription_Stockpile[] = _(
+ "Charges up power for up to\n"
+ "3 turns.");
+
+static const u8 MoveDescription_SpitUp[] = _(
+ "Releases stockpiled power\n"
+ "(the more the better).");
+
+static const u8 MoveDescription_Swallow[] = _(
+ "Absorbs stockpiled power\n"
+ "and restores HP.");
+
+static const u8 MoveDescription_HeatWave[] = _(
+ "Exhales a hot breath on the\n"
+ "foe. May inflict a burn.");
+
+static const u8 MoveDescription_Hail[] = _(
+ "Summons a hailstorm that\n"
+ "strikes every turn.");
+
+static const u8 MoveDescription_Torment[] = _(
+ "Torments the foe and stops\n"
+ "successive use of a move.");
+
+static const u8 MoveDescription_Flatter[] = _(
+ "Confuses the foe, but\n"
+ "raises its SP. ATK.");
+
+static const u8 MoveDescription_WillOWisp[] = _(
+ "Inflicts a burn on the foe\n"
+ "with intense fire.");
+
+static const u8 MoveDescription_Memento[] = _(
+ "The user faints and lowers\n"
+ "the foe’s abilities.");
+
+static const u8 MoveDescription_Facade[] = _(
+ "Boosts ATTACK when burned,\n"
+ "paralyzed, or poisoned.");
+
+static const u8 MoveDescription_FocusPunch[] = _(
+ "A powerful loyalty attack.\n"
+ "The user flinches if hit.");
+
+static const u8 MoveDescription_SmellingSalt[] = _(
+ "Powerful against paralyzed\n"
+ "foes, but also heals them.");
+
+static const u8 MoveDescription_FollowMe[] = _(
+ "Draws attention to make\n"
+ "foes attack only the user.");
+
+static const u8 MoveDescription_NaturePower[] = _(
+ "The type of attack varies\n"
+ "depending on the location.");
+
+static const u8 MoveDescription_Charge[] = _(
+ "Charges power to boost the\n"
+ "electric move used next.");
+
+static const u8 MoveDescription_Taunt[] = _(
+ "Taunts the foe into only\n"
+ "using attack moves.");
+
+static const u8 MoveDescription_HelpingHand[] = _(
+ "Boosts the power of the\n"
+ "recipient’s moves.");
+
+static const u8 MoveDescription_Trick[] = _(
+ "Tricks the foe into trading\n"
+ "held items.");
+
+static const u8 MoveDescription_RolePlay[] = _(
+ "Mimics the target and\n"
+ "copies its special ability.");
+
+static const u8 MoveDescription_Wish[] = _(
+ "A wish that restores HP.\n"
+ "It takes time to work.");
+
+static const u8 MoveDescription_Assist[] = _(
+ "Attacks randomly with one\n"
+ "of the partner’s moves.");
+
+static const u8 MoveDescription_Ingrain[] = _(
+ "Lays roots that restore HP.\n"
+ "The user can’t switch out.");
+
+static const u8 MoveDescription_Superpower[] = _(
+ "Boosts strength sharply,\n"
+ "but lowers abilities.");
+
+static const u8 MoveDescription_MagicCoat[] = _(
+ "Reflects special effects\n"
+ "back to the attacker.");
+
+static const u8 MoveDescription_Recycle[] = _(
+ "Recycles a used item for\n"
+ "one more use.");
+
+static const u8 MoveDescription_Revenge[] = _(
+ "An attack that gains power\n"
+ "if injured by the foe.");
+
+static const u8 MoveDescription_BrickBreak[] = _(
+ "Destroys barriers such as\n"
+ "REFLECT and causes damage.");
+
+static const u8 MoveDescription_Yawn[] = _(
+ "Lulls the foe into yawning,\n"
+ "then sleeping next turn.");
+
+static const u8 MoveDescription_KnockOff[] = _(
+ "Knocks down the foe’s held\n"
+ "item to prevent its use.");
+
+static const u8 MoveDescription_Endeavor[] = _(
+ "Gains power if the user’s HP\n"
+ "is lower than the foe’s HP.");
+
+static const u8 MoveDescription_Eruption[] = _(
+ "The higher the user’s HP,\n"
+ "the more damage caused.");
+
+static const u8 MoveDescription_SkillSwap[] = _(
+ "The user swaps special\n"
+ "abilities with the target.");
+
+static const u8 MoveDescription_Imprison[] = _(
+ "Prevents foes from using\n"
+ "moves known by the user.");
+
+static const u8 MoveDescription_Refresh[] = _(
+ "Heals poisoning, paralysis,\n"
+ "or a burn.");
+
+static const u8 MoveDescription_Grudge[] = _(
+ "If the user faints, deletes\n"
+ "the PP of the final move.");
+
+static const u8 MoveDescription_Snatch[] = _(
+ "Steals the effects of the\n"
+ "move the foe uses next.");
+
+static const u8 MoveDescription_SecretPower[] = _(
+ "An attack with effects\n"
+ "that vary by location.");
+
+static const u8 MoveDescription_Dive[] = _(
+ "Dives underwater the first\n"
+ "turn and strikes next turn.");
+
+static const u8 MoveDescription_ArmThrust[] = _(
+ "Straight-arm punches that\n"
+ "strike the foe 2 to 5 times.");
+
+static const u8 MoveDescription_Camouflage[] = _(
+ "Alters the POKéMON’s type\n"
+ "depending on the location.");
+
+static const u8 MoveDescription_TailGlow[] = _(
+ "Flashes a light that sharply\n"
+ "raises SP. ATK.");
+
+static const u8 MoveDescription_LusterPurge[] = _(
+ "Attacks with a burst of\n"
+ "light. May lower SP. DEF.");
+
+static const u8 MoveDescription_MistBall[] = _(
+ "Attacks with a flurry of\n"
+ "down. May lower SP. ATK.");
+
+static const u8 MoveDescription_FeatherDance[] = _(
+ "Envelops the foe with down\n"
+ "to sharply reduce ATTACK.");
+
+static const u8 MoveDescription_TeeterDance[] = _(
+ "Confuses all POKéMON on\n"
+ "the scene.");
+
+static const u8 MoveDescription_BlazeKick[] = _(
+ "A kick with a high critical-\n"
+ "hit ratio. May cause a burn.");
+
+static const u8 MoveDescription_MudSport[] = _(
+ "Covers the user in mud to\n"
+ "raise electrical resistance.");
+
+static const u8 MoveDescription_IceBall[] = _(
+ "A 5-turn attack that gains\n"
+ "power on successive hits.");
+
+static const u8 MoveDescription_NeedleArm[] = _(
+ "Attacks with thorny arms.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_SlackOff[] = _(
+ "Slacks off and restores\n"
+ "half the maximum HP.");
+
+static const u8 MoveDescription_HyperVoice[] = _(
+ "A loud attack that uses\n"
+ "sound waves to injure.");
+
+static const u8 MoveDescription_PoisonFang[] = _(
+ "A sharp-fanged attack.\n"
+ "May badly poison the foe.");
+
+static const u8 MoveDescription_CrushClaw[] = _(
+ "Tears at the foe with sharp\n"
+ "claws. May lower DEFENSE.");
+
+static const u8 MoveDescription_BlastBurn[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_HydroCannon[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_MeteorMash[] = _(
+ "Fires a meteor-like punch.\n"
+ "May raise ATTACK.");
+
+static const u8 MoveDescription_Astonish[] = _(
+ "An attack that may shock\n"
+ "the foe into flinching.");
+
+static const u8 MoveDescription_WeatherBall[] = _(
+ "The move’s type and power\n"
+ "change with the weather.");
+
+static const u8 MoveDescription_Aromatherapy[] = _(
+ "Heals all status problems\n"
+ "with a soothing scent.");
+
+static const u8 MoveDescription_FakeTears[] = _(
+ "Feigns crying to sharply\n"
+ "lower the foe’s SP. DEF.");
+
+static const u8 MoveDescription_AirCutter[] = _(
+ "Hacks with razorlike wind.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_Overheat[] = _(
+ "Allows a full-power attack,\n"
+ "but sharply lowers SP. ATK.");
+
+static const u8 MoveDescription_OdorSleuth[] = _(
+ "Negates the foe’s efforts\n"
+ "to heighten evasiveness.");
+
+static const u8 MoveDescription_RockTomb[] = _(
+ "Stops the foe from moving\n"
+ "with rocks and cuts SPEED.");
+
+static const u8 MoveDescription_SilverWind[] = _(
+ "A powdery attack that may\n"
+ "raise abilities.");
+
+static const u8 MoveDescription_MetalSound[] = _(
+ "Emits a horrible screech\n"
+ "that sharply lowers SP. DEF.");
+
+static const u8 MoveDescription_GrassWhistle[] = _(
+ "Lulls the foe into sleep\n"
+ "with a pleasant melody.");
+
+static const u8 MoveDescription_Tickle[] = _(
+ "Makes the foe laugh to\n"
+ "lower ATTACK and DEFENSE.");
+
+static const u8 MoveDescription_CosmicPower[] = _(
+ "Raises DEFENSE and SP. DEF\n"
+ "with a mystic power.");
+
+static const u8 MoveDescription_WaterSpout[] = _(
+ "Inflicts more damage if the\n"
+ "user’s HP is high.");
+
+static const u8 MoveDescription_SignalBeam[] = _(
+ "A strange beam attack that\n"
+ "may confuse the foe.");
+
+static const u8 MoveDescription_ShadowPunch[] = _(
+ "An unavoidable punch that\n"
+ "is thrown from shadows.");
+
+static const u8 MoveDescription_Extrasensory[] = _(
+ "Attacks with a peculiar\n"
+ "power. May cause flinching.");
+
+static const u8 MoveDescription_SkyUppercut[] = _(
+ "An uppercut thrown as if\n"
+ "leaping into the sky.");
+
+static const u8 MoveDescription_SandTomb[] = _(
+ "Traps and hurts the foe in\n"
+ "quicksand for 2 to 5 turns.");
+
+static const u8 MoveDescription_SheerCold[] = _(
+ "A chilling attack that\n"
+ "causes fainting if it hits.");
+
+static const u8 MoveDescription_MuddyWater[] = _(
+ "Attacks with muddy water.\n"
+ "May lower accuracy.");
+
+static const u8 MoveDescription_BulletSeed[] = _(
+ "Shoots 2 to 5 seeds in a row\n"
+ "to strike the foe.");
+
+static const u8 MoveDescription_AerialAce[] = _(
+ "An extremely speedy and\n"
+ "unavoidable attack.");
+
+static const u8 MoveDescription_IcicleSpear[] = _(
+ "Attacks the foe by firing\n"
+ "2 to 5 icicles in a row.");
+
+static const u8 MoveDescription_IronDefense[] = _(
+ "Hardens the body’s surface\n"
+ "to sharply raise DEFENSE.");
+
+static const u8 MoveDescription_Block[] = _(
+ "Blocks the foe’s way to\n"
+ "prevent escape.");
+
+static const u8 MoveDescription_Howl[] = _(
+ "Howls to raise the spirit\n"
+ "and boosts ATTACK.");
+
+static const u8 MoveDescription_DragonClaw[] = _(
+ "Slashes the foe with sharp\n"
+ "claws.");
+
+static const u8 MoveDescription_FrenzyPlant[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_BulkUp[] = _(
+ "Bulks up the body to boost\n"
+ "both ATTACK and DEFENSE.");
+
+static const u8 MoveDescription_Bounce[] = _(
+ "Bounces up, then down the\n"
+ "next turn. May paralyze.");
+
+static const u8 MoveDescription_MudShot[] = _(
+ "Hurls mud at the foe and\n"
+ "reduces SPEED.");
+
+static const u8 MoveDescription_PoisonTail[] = _(
+ "Has a high critical-hit\n"
+ "ratio. May also poison.");
+
+static const u8 MoveDescription_Covet[] = _(
+ "Cutely begs to obtain an\n"
+ "item held by the foe.");
+
+static const u8 MoveDescription_VoltTackle[] = _(
+ "A life-risking tackle that\n"
+ "slightly hurts the user.");
+
+static const u8 MoveDescription_MagicalLeaf[] = _(
+ "Attacks with a strange leaf\n"
+ "that cannot be evaded.");
+
+static const u8 MoveDescription_WaterSport[] = _(
+ "The user becomes soaked to\n"
+ "raise resistance to fire.");
+
+static const u8 MoveDescription_CalmMind[] = _(
+ "Raises SP. ATK and SP. DEF\n"
+ "by focusing the mind.");
+
+static const u8 MoveDescription_LeafBlade[] = _(
+ "Slashes with a sharp leaf.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_DragonDance[] = _(
+ "A mystical dance that ups\n"
+ "ATTACK and SPEED.");
+
+static const u8 MoveDescription_RockBlast[] = _(
+ "Hurls boulders at the foe\n"
+ "2 to 5 times in a row.");
+
+static const u8 MoveDescription_ShockWave[] = _(
+ "A fast and unavoidable\n"
+ "electric attack.");
+
+static const u8 MoveDescription_WaterPulse[] = _(
+ "Attacks with ultrasonic\n"
+ "waves. May confuse the foe");
+
+static const u8 MoveDescription_DoomDesire[] = _(
+ "Summons strong sunlight to\n"
+ "attack 2 turns later.");
+
+static const u8 MoveDescription_PsychoBoost[] = _(
+ "Allows a full-power attack,\n"
+ "but sharply lowers SP. ATK.");
+
+const u8 * const gMoveDescriptions[] = {
+ MoveDescription_Pound,
+ MoveDescription_KarateChop,
+ MoveDescription_DoubleSlap,
+ MoveDescription_CometPunch,
+ MoveDescription_MegaPunch,
+ MoveDescription_PayDay,
+ MoveDescription_FirePunch,
+ MoveDescription_IcePunch,
+ MoveDescription_ThunderPunch,
+ MoveDescription_Scratch,
+ MoveDescription_ViceGrip,
+ MoveDescription_Guillotine,
+ MoveDescription_RazorWind,
+ MoveDescription_SwordsDance,
+ MoveDescription_Cut,
+ MoveDescription_Gust,
+ MoveDescription_WingAttack,
+ MoveDescription_Whirlwind,
+ MoveDescription_Fly,
+ MoveDescription_Bind,
+ MoveDescription_Slam,
+ MoveDescription_VineWhip,
+ MoveDescription_Stomp,
+ MoveDescription_DoubleKick,
+ MoveDescription_MegaKick,
+ MoveDescription_JumpKick,
+ MoveDescription_RollingKick,
+ MoveDescription_SandAttack,
+ MoveDescription_Headbutt,
+ MoveDescription_HornAttack,
+ MoveDescription_FuryAttack,
+ MoveDescription_HornDrill,
+ MoveDescription_Tackle,
+ MoveDescription_BodySlam,
+ MoveDescription_Wrap,
+ MoveDescription_TakeDown,
+ MoveDescription_Thrash,
+ MoveDescription_DoubleEdge,
+ MoveDescription_TailWhip,
+ MoveDescription_PoisonSting,
+ MoveDescription_Twineedle,
+ MoveDescription_PinMissile,
+ MoveDescription_Leer,
+ MoveDescription_Bite,
+ MoveDescription_Growl,
+ MoveDescription_Roar,
+ MoveDescription_Sing,
+ MoveDescription_Supersonic,
+ MoveDescription_SonicBoom,
+ MoveDescription_Disable,
+ MoveDescription_Acid,
+ MoveDescription_Ember,
+ MoveDescription_Flamethrower,
+ MoveDescription_Mist,
+ MoveDescription_WaterGun,
+ MoveDescription_HydroPump,
+ MoveDescription_Surf,
+ MoveDescription_IceBeam,
+ MoveDescription_Blizzard,
+ MoveDescription_Psybeam,
+ MoveDescription_BubbleBeam,
+ MoveDescription_AuroraBeam,
+ MoveDescription_HyperBeam,
+ MoveDescription_Peck,
+ MoveDescription_DrillPeck,
+ MoveDescription_Submission,
+ MoveDescription_LowKick,
+ MoveDescription_Counter,
+ MoveDescription_SeismicToss,
+ MoveDescription_Strength,
+ MoveDescription_Absorb,
+ MoveDescription_MegaDrain,
+ MoveDescription_LeechSeed,
+ MoveDescription_Growth,
+ MoveDescription_RazorLeaf,
+ MoveDescription_SolarBeam,
+ MoveDescription_PoisonPowder,
+ MoveDescription_StunSpore,
+ MoveDescription_SleepPowder,
+ MoveDescription_PetalDance,
+ MoveDescription_StringShot,
+ MoveDescription_DragonRage,
+ MoveDescription_FireSpin,
+ MoveDescription_ThunderShock,
+ MoveDescription_Thunderbolt,
+ MoveDescription_ThunderWave,
+ MoveDescription_Thunder,
+ MoveDescription_RockThrow,
+ MoveDescription_Earthquake,
+ MoveDescription_Fissure,
+ MoveDescription_Dig,
+ MoveDescription_Toxic,
+ MoveDescription_Confusion,
+ MoveDescription_Psychic,
+ MoveDescription_Hypnosis,
+ MoveDescription_Meditate,
+ MoveDescription_Agility,
+ MoveDescription_QuickAttack,
+ MoveDescription_Rage,
+ MoveDescription_Teleport,
+ MoveDescription_NightShade,
+ MoveDescription_Mimic,
+ MoveDescription_Screech,
+ MoveDescription_DoubleTeam,
+ MoveDescription_Recover,
+ MoveDescription_Harden,
+ MoveDescription_Minimize,
+ MoveDescription_Smokescreen,
+ MoveDescription_ConfuseRay,
+ MoveDescription_Withdraw,
+ MoveDescription_DefenseCurl,
+ MoveDescription_Barrier,
+ MoveDescription_LightScreen,
+ MoveDescription_Haze,
+ MoveDescription_Reflect,
+ MoveDescription_FocusEnergy,
+ MoveDescription_Bide,
+ MoveDescription_Metronome,
+ MoveDescription_MirrorMove,
+ MoveDescription_SelfDestruct,
+ MoveDescription_EggBomb,
+ MoveDescription_Lick,
+ MoveDescription_Smog,
+ MoveDescription_Sludge,
+ MoveDescription_BoneClub,
+ MoveDescription_FireBlast,
+ MoveDescription_Waterfall,
+ MoveDescription_Clamp,
+ MoveDescription_Swift,
+ MoveDescription_SkullBash,
+ MoveDescription_SpikeCannon,
+ MoveDescription_Constrict,
+ MoveDescription_Amnesia,
+ MoveDescription_Kinesis,
+ MoveDescription_SoftBoiled,
+ MoveDescription_HiJumpKick,
+ MoveDescription_Glare,
+ MoveDescription_DreamEater,
+ MoveDescription_PoisonGas,
+ MoveDescription_Barrage,
+ MoveDescription_LeechLife,
+ MoveDescription_LovelyKiss,
+ MoveDescription_SkyAttack,
+ MoveDescription_Transform,
+ MoveDescription_Bubble,
+ MoveDescription_DizzyPunch,
+ MoveDescription_Spore,
+ MoveDescription_Flash,
+ MoveDescription_Psywave,
+ MoveDescription_Splash,
+ MoveDescription_AcidArmor,
+ MoveDescription_Crabhammer,
+ MoveDescription_Explosion,
+ MoveDescription_FurySwipes,
+ MoveDescription_Bonemerang,
+ MoveDescription_Rest,
+ MoveDescription_RockSlide,
+ MoveDescription_HyperFang,
+ MoveDescription_Sharpen,
+ MoveDescription_Conversion,
+ MoveDescription_TriAttack,
+ MoveDescription_SuperFang,
+ MoveDescription_Slash,
+ MoveDescription_Substitute,
+ MoveDescription_Struggle,
+ MoveDescription_Sketch,
+ MoveDescription_TripleKick,
+ MoveDescription_Thief,
+ MoveDescription_SpiderWeb,
+ MoveDescription_MindReader,
+ MoveDescription_Nightmare,
+ MoveDescription_FlameWheel,
+ MoveDescription_Snore,
+ MoveDescription_Curse,
+ MoveDescription_Flail,
+ MoveDescription_Conversion2,
+ MoveDescription_Aeroblast,
+ MoveDescription_CottonSpore,
+ MoveDescription_Reversal,
+ MoveDescription_Spite,
+ MoveDescription_PowderSnow,
+ MoveDescription_Protect,
+ MoveDescription_MachPunch,
+ MoveDescription_ScaryFace,
+ MoveDescription_FaintAttack,
+ MoveDescription_SweetKiss,
+ MoveDescription_BellyDrum,
+ MoveDescription_SludgeBomb,
+ MoveDescription_MudSlap,
+ MoveDescription_Octazooka,
+ MoveDescription_Spikes,
+ MoveDescription_ZapCannon,
+ MoveDescription_Foresight,
+ MoveDescription_DestinyBond,
+ MoveDescription_PerishSong,
+ MoveDescription_IcyWind,
+ MoveDescription_Detect,
+ MoveDescription_BoneRush,
+ MoveDescription_LockOn,
+ MoveDescription_Outrage,
+ MoveDescription_Sandstorm,
+ MoveDescription_GigaDrain,
+ MoveDescription_Endure,
+ MoveDescription_Charm,
+ MoveDescription_Rollout,
+ MoveDescription_FalseSwipe,
+ MoveDescription_Swagger,
+ MoveDescription_MilkDrink,
+ MoveDescription_Spark,
+ MoveDescription_FuryCutter,
+ MoveDescription_SteelWing,
+ MoveDescription_MeanLook,
+ MoveDescription_Attract,
+ MoveDescription_SleepTalk,
+ MoveDescription_HealBell,
+ MoveDescription_Return,
+ MoveDescription_Present,
+ MoveDescription_Frustration,
+ MoveDescription_Safeguard,
+ MoveDescription_PainSplit,
+ MoveDescription_SacredFire,
+ MoveDescription_Magnitude,
+ MoveDescription_DynamicPunch,
+ MoveDescription_Megahorn,
+ MoveDescription_DragonBreath,
+ MoveDescription_BatonPass,
+ MoveDescription_Encore,
+ MoveDescription_Pursuit,
+ MoveDescription_RapidSpin,
+ MoveDescription_SweetScent,
+ MoveDescription_IronTail,
+ MoveDescription_MetalClaw,
+ MoveDescription_VitalThrow,
+ MoveDescription_MorningSun,
+ MoveDescription_Synthesis,
+ MoveDescription_Moonlight,
+ MoveDescription_HiddenPower,
+ MoveDescription_CrossChop,
+ MoveDescription_Twister,
+ MoveDescription_RainDance,
+ MoveDescription_SunnyDay,
+ MoveDescription_Crunch,
+ MoveDescription_MirrorCoat,
+ MoveDescription_PsychUp,
+ MoveDescription_ExtremeSpeed,
+ MoveDescription_AncientPower,
+ MoveDescription_ShadowBall,
+ MoveDescription_FutureSight,
+ MoveDescription_RockSmash,
+ MoveDescription_Whirlpool,
+ MoveDescription_BeatUp,
+ MoveDescription_FakeOut,
+ MoveDescription_Uproar,
+ MoveDescription_Stockpile,
+ MoveDescription_SpitUp,
+ MoveDescription_Swallow,
+ MoveDescription_HeatWave,
+ MoveDescription_Hail,
+ MoveDescription_Torment,
+ MoveDescription_Flatter,
+ MoveDescription_WillOWisp,
+ MoveDescription_Memento,
+ MoveDescription_Facade,
+ MoveDescription_FocusPunch,
+ MoveDescription_SmellingSalt,
+ MoveDescription_FollowMe,
+ MoveDescription_NaturePower,
+ MoveDescription_Charge,
+ MoveDescription_Taunt,
+ MoveDescription_HelpingHand,
+ MoveDescription_Trick,
+ MoveDescription_RolePlay,
+ MoveDescription_Wish,
+ MoveDescription_Assist,
+ MoveDescription_Ingrain,
+ MoveDescription_Superpower,
+ MoveDescription_MagicCoat,
+ MoveDescription_Recycle,
+ MoveDescription_Revenge,
+ MoveDescription_BrickBreak,
+ MoveDescription_Yawn,
+ MoveDescription_KnockOff,
+ MoveDescription_Endeavor,
+ MoveDescription_Eruption,
+ MoveDescription_SkillSwap,
+ MoveDescription_Imprison,
+ MoveDescription_Refresh,
+ MoveDescription_Grudge,
+ MoveDescription_Snatch,
+ MoveDescription_SecretPower,
+ MoveDescription_Dive,
+ MoveDescription_ArmThrust,
+ MoveDescription_Camouflage,
+ MoveDescription_TailGlow,
+ MoveDescription_LusterPurge,
+ MoveDescription_MistBall,
+ MoveDescription_FeatherDance,
+ MoveDescription_TeeterDance,
+ MoveDescription_BlazeKick,
+ MoveDescription_MudSport,
+ MoveDescription_IceBall,
+ MoveDescription_NeedleArm,
+ MoveDescription_SlackOff,
+ MoveDescription_HyperVoice,
+ MoveDescription_PoisonFang,
+ MoveDescription_CrushClaw,
+ MoveDescription_BlastBurn,
+ MoveDescription_HydroCannon,
+ MoveDescription_MeteorMash,
+ MoveDescription_Astonish,
+ MoveDescription_WeatherBall,
+ MoveDescription_Aromatherapy,
+ MoveDescription_FakeTears,
+ MoveDescription_AirCutter,
+ MoveDescription_Overheat,
+ MoveDescription_OdorSleuth,
+ MoveDescription_RockTomb,
+ MoveDescription_SilverWind,
+ MoveDescription_MetalSound,
+ MoveDescription_GrassWhistle,
+ MoveDescription_Tickle,
+ MoveDescription_CosmicPower,
+ MoveDescription_WaterSpout,
+ MoveDescription_SignalBeam,
+ MoveDescription_ShadowPunch,
+ MoveDescription_Extrasensory,
+ MoveDescription_SkyUppercut,
+ MoveDescription_SandTomb,
+ MoveDescription_SheerCold,
+ MoveDescription_MuddyWater,
+ MoveDescription_BulletSeed,
+ MoveDescription_AerialAce,
+ MoveDescription_IcicleSpear,
+ MoveDescription_IronDefense,
+ MoveDescription_Block,
+ MoveDescription_Howl,
+ MoveDescription_DragonClaw,
+ MoveDescription_FrenzyPlant,
+ MoveDescription_BulkUp,
+ MoveDescription_Bounce,
+ MoveDescription_MudShot,
+ MoveDescription_PoisonTail,
+ MoveDescription_Covet,
+ MoveDescription_VoltTackle,
+ MoveDescription_MagicalLeaf,
+ MoveDescription_WaterSport,
+ MoveDescription_CalmMind,
+ MoveDescription_LeafBlade,
+ MoveDescription_DragonDance,
+ MoveDescription_RockBlast,
+ MoveDescription_ShockWave,
+ MoveDescription_WaterPulse,
+ MoveDescription_DoomDesire,
+ MoveDescription_PsychoBoost,
+};
diff --git a/src/data/text/nature_names_de.h b/src/data/text/nature_names_de.h
new file mode 100644
index 000000000..695b0b62c
--- /dev/null
+++ b/src/data/text/nature_names_de.h
@@ -0,0 +1,53 @@
+static const u8 NatureName_Hardy[] = _("ROBUST");
+static const u8 NatureName_Lonely[] = _("SOLO");
+static const u8 NatureName_Brave[] = _("MUTIG");
+static const u8 NatureName_Adamant[] = _("HART");
+static const u8 NatureName_Naughty[] = _("FRECH");
+static const u8 NatureName_Bold[] = _("KÜHN");
+static const u8 NatureName_Docile[] = _("SANFT");
+static const u8 NatureName_Relaxed[] = _("LOCKER");
+static const u8 NatureName_Impish[] = _("PFIFFIG");
+static const u8 NatureName_Lax[] = _("LASCH");
+static const u8 NatureName_Timid[] = _("SCHEU");
+static const u8 NatureName_Hasty[] = _("HASTIG");
+static const u8 NatureName_Serious[] = _("ERNST");
+static const u8 NatureName_Jolly[] = _("FROH");
+static const u8 NatureName_Naive[] = _("NAIV");
+static const u8 NatureName_Modest[] = _("MÄSSIG");
+static const u8 NatureName_Mild[] = _("MILD");
+static const u8 NatureName_Quiet[] = _("RUHIG");
+static const u8 NatureName_Bashful[] = _("ZAGHAFT");
+static const u8 NatureName_Rash[] = _("HITZIG");
+static const u8 NatureName_Calm[] = _("STILL");
+static const u8 NatureName_Gentle[] = _("ZART");
+static const u8 NatureName_Sassy[] = _("FORSCH");
+static const u8 NatureName_Careful[] = _("SACHT");
+static const u8 NatureName_Quirky[] = _("KAUZIG");
+
+const u8 * const gNatureNames[] = {
+ NatureName_Hardy,
+ NatureName_Lonely,
+ NatureName_Brave,
+ NatureName_Adamant,
+ NatureName_Naughty,
+ NatureName_Bold,
+ NatureName_Docile,
+ NatureName_Relaxed,
+ NatureName_Impish,
+ NatureName_Lax,
+ NatureName_Timid,
+ NatureName_Hasty,
+ NatureName_Serious,
+ NatureName_Jolly,
+ NatureName_Naive,
+ NatureName_Modest,
+ NatureName_Mild,
+ NatureName_Quiet,
+ NatureName_Bashful,
+ NatureName_Rash,
+ NatureName_Calm,
+ NatureName_Gentle,
+ NatureName_Sassy,
+ NatureName_Careful,
+ NatureName_Quirky,
+};
diff --git a/src/data/text/nature_names_en.h b/src/data/text/nature_names_en.h
new file mode 100644
index 000000000..305b43690
--- /dev/null
+++ b/src/data/text/nature_names_en.h
@@ -0,0 +1,53 @@
+static const u8 NatureName_Hardy[] = _("HARDY");
+static const u8 NatureName_Lonely[] = _("LONELY");
+static const u8 NatureName_Brave[] = _("BRAVE");
+static const u8 NatureName_Adamant[] = _("ADAMANT");
+static const u8 NatureName_Naughty[] = _("NAUGHTY");
+static const u8 NatureName_Bold[] = _("BOLD");
+static const u8 NatureName_Docile[] = _("DOCILE");
+static const u8 NatureName_Relaxed[] = _("RELAXED");
+static const u8 NatureName_Impish[] = _("IMPISH");
+static const u8 NatureName_Lax[] = _("LAX");
+static const u8 NatureName_Timid[] = _("TIMID");
+static const u8 NatureName_Hasty[] = _("HASTY");
+static const u8 NatureName_Serious[] = _("SERIOUS");
+static const u8 NatureName_Jolly[] = _("JOLLY");
+static const u8 NatureName_Naive[] = _("NAIVE");
+static const u8 NatureName_Modest[] = _("MODEST");
+static const u8 NatureName_Mild[] = _("MILD");
+static const u8 NatureName_Quiet[] = _("QUIET");
+static const u8 NatureName_Bashful[] = _("BASHFUL");
+static const u8 NatureName_Rash[] = _("RASH");
+static const u8 NatureName_Calm[] = _("CALM");
+static const u8 NatureName_Gentle[] = _("GENTLE");
+static const u8 NatureName_Sassy[] = _("SASSY");
+static const u8 NatureName_Careful[] = _("CAREFUL");
+static const u8 NatureName_Quirky[] = _("QUIRKY");
+
+const u8 * const gNatureNames[] = {
+ NatureName_Hardy,
+ NatureName_Lonely,
+ NatureName_Brave,
+ NatureName_Adamant,
+ NatureName_Naughty,
+ NatureName_Bold,
+ NatureName_Docile,
+ NatureName_Relaxed,
+ NatureName_Impish,
+ NatureName_Lax,
+ NatureName_Timid,
+ NatureName_Hasty,
+ NatureName_Serious,
+ NatureName_Jolly,
+ NatureName_Naive,
+ NatureName_Modest,
+ NatureName_Mild,
+ NatureName_Quiet,
+ NatureName_Bashful,
+ NatureName_Rash,
+ NatureName_Calm,
+ NatureName_Gentle,
+ NatureName_Sassy,
+ NatureName_Careful,
+ NatureName_Quirky,
+};
diff --git a/src/engine/link.c b/src/engine/link.c
index 002d397d2..441f3707b 100644
--- a/src/engine/link.c
+++ b/src/engine/link.c
@@ -7,7 +7,7 @@
#include "main.h"
#include "menu.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/engine/main.c b/src/engine/main.c
index ea381cb31..82a5fffb4 100644
--- a/src/engine/main.c
+++ b/src/engine/main.c
@@ -7,7 +7,7 @@
#include "load_save.h"
#include "m4a.h"
#include "play_time.h"
-#include "rng.h"
+#include "random.h"
#include "rom3.h"
#include "overworld.h"
#include "rtc.h"
diff --git a/src/engine/rng.c b/src/engine/random.c
index 7d4b5600e..8f82b722f 100644
--- a/src/engine/rng.c
+++ b/src/engine/random.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "rng.h"
+#include "random.h"
// The number 1103515245 comes from the example implementation of rand and srand
// in the ISO C standard.
diff --git a/src/engine/record_mixing.c b/src/engine/record_mixing.c
index cf51bec9e..4b5f1b6d5 100644
--- a/src/engine/record_mixing.c
+++ b/src/engine/record_mixing.c
@@ -13,7 +13,7 @@
#include "mauville_man.h"
#include "menu.h"
#include "mystery_event_script.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "save.h"
#include "script.h"
diff --git a/src/engine/time_events.c b/src/engine/time_events.c
index accb03db8..831048add 100644
--- a/src/engine/time_events.c
+++ b/src/engine/time_events.c
@@ -3,7 +3,7 @@
#include "event_data.h"
#include "field_weather.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rtc.h"
#include "script.h"
diff --git a/src/engine/trade.c b/src/engine/trade.c
index 729791aff..e09942589 100644
--- a/src/engine/trade.c
+++ b/src/engine/trade.c
@@ -2186,11 +2186,11 @@ static void sub_804997C(void)
{
if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE)
{
- ShowPokemonSummaryScreen(gPlayerParty, gUnknown_03004824->tradeMenuCursorPosition, gUnknown_03004824->partyCounts[0] - 1, sub_80484F4, 4);
+ ShowPokemonSummaryScreen(gPlayerParty, gUnknown_03004824->tradeMenuCursorPosition, gUnknown_03004824->partyCounts[0] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT);
}
else
{
- ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, 4);
+ ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT);
}
}
}
diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c
index d6271643c..2b45766dd 100644
--- a/src/field/battle_tower.c
+++ b/src/field/battle_tower.c
@@ -14,7 +14,7 @@
#include "new_game.h"
#include "overworld.h"
#include "pokedex.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "script_pokemon_80C4.h"
#include "species.h"
diff --git a/src/field/berry.c b/src/field/berry.c
index cd1fc5c94..973bc56ff 100644
--- a/src/field/berry.c
+++ b/src/field/berry.c
@@ -8,7 +8,7 @@
#include "item_use.h"
#include "items.h"
#include "main.h"
-#include "rng.h"
+#include "random.h"
#include "text.h"
#define BERRY_NAME_LENGTH 6
diff --git a/src/field/choose_party.c b/src/field/choose_party.c
index c3845e48b..e16da3a58 100644
--- a/src/field/choose_party.c
+++ b/src/field/choose_party.c
@@ -32,7 +32,6 @@ EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0};
extern u8 sub_806BD58(u8, u8);
extern void PartyMenuPrintMonsLevelOrStatus(void);
extern void sub_806BC3C(u8, u8);
-extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(void), int);
extern u8 GetMonStatusAndPokerus();
extern void PartyMenuPrintHP();
extern bool8 sub_80F9344(void);
@@ -434,7 +433,7 @@ static void sub_81225D4(u8 taskId)
DestroyTask(taskId);
ewram1B000.unk262 = 1;
- ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, 0);
+ ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, PSS_MODE_NORMAL);
}
}
@@ -884,7 +883,7 @@ static void sub_8123034(u8 taskId)
DestroyTask(taskId);
ewram1B000.unk262 = 1;
- ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, 0);
+ ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, PSS_MODE_NORMAL);
}
}
diff --git a/src/field/daycare.c b/src/field/daycare.c
index 2b58a0d5d..9f7e3b989 100644
--- a/src/field/daycare.c
+++ b/src/field/daycare.c
@@ -12,7 +12,7 @@
#include "party_menu.h"
#include "pokemon.h"
#include "pokemon_storage_system.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/field/dewford_trend.c b/src/field/dewford_trend.c
index 102784066..bdcd76ec5 100644
--- a/src/field/dewford_trend.c
+++ b/src/field/dewford_trend.c
@@ -3,7 +3,7 @@
#include "easy_chat.h"
#include "event_data.h"
#include "link.h"
-#include "rng.h"
+#include "random.h"
#include "text.h"
#include "ewram.h"
diff --git a/src/field/easy_chat.c b/src/field/easy_chat.c
index 8e7413516..7a4ae045e 100644
--- a/src/field/easy_chat.c
+++ b/src/field/easy_chat.c
@@ -4,7 +4,7 @@
#include "event_data.h"
#include "field_message_box.h"
#include "pokedex.h"
-#include "rng.h"
+#include "random.h"
#include "string_util.h"
#include "strings.h"
#include "strings2.h"
diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c
index 98f6fedab..20edbc34f 100644
--- a/src/field/field_map_obj.c
+++ b/src/field/field_map_obj.c
@@ -10,7 +10,7 @@
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "sprite.h"
#include "metatile_behavior.h"
diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c
index e7da9b1b7..a26638b39 100644
--- a/src/field/field_player_avatar.c
+++ b/src/field/field_player_avatar.c
@@ -13,7 +13,7 @@
#include "menu.h"
#include "metatile_behavior.h"
#include "party_menu.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rotating_gate.h"
#include "script.h"
diff --git a/src/field/field_specials.c b/src/field/field_specials.c
index 48e9b44aa..e5bb1b798 100644
--- a/src/field/field_specials.c
+++ b/src/field/field_specials.c
@@ -34,7 +34,7 @@
#include "battle_tower.h"
#include "field_weather.h"
#include "pokemon_summary_screen.h"
-#include "rng.h"
+#include "random.h"
#if ENGLISH
#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index 2d4711b81..ff7c2e4c4 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -3,7 +3,7 @@
#include "field_map_obj.h"
#include "field_weather.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
@@ -28,10 +28,10 @@ struct WeatherPaletteData
struct WeatherCallbacks
{
- void (*func0)(void);
- void (*func1)(void);
- void (*func2)(void);
- u8 (*func3)(void);
+ void (*initVars)(void);
+ void (*main)(void);
+ void (*initAll)(void);
+ bool8 (*finish)(void);
};
extern struct Weather gWeather;
@@ -48,7 +48,7 @@ const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz");
extern u8 (*gUnknown_0202FC48)[32];
extern u8 gUnknown_0202F9E8[32];
-const u8 *const gUnknown_08396FA8[] =
+static const u8 *const sCompressedDroughtPalettes[] =
{
DroughtPaletteData_0,
DroughtPaletteData_1,
@@ -65,83 +65,83 @@ const u8 *const gUnknown_08396FA8[] =
// this file produces the same result as accessing gWeather directly.
struct Weather *const gWeatherPtr = &gWeather;
-void sub_807CAE8(void);
-void nullsub_38(void);
-u8 sub_807CB0C(void);
-void sub_807DE78(void);
-void sub_807DEF4(void);
-void sub_807DEC4(void);
-u8 sub_807DF54(void);
-void sub_807DF9C(void);
-void nullsub_55(void);
-void sub_807DFC0(void);
-u8 sub_807DFD0(void);
+void None_Init(void);
+void None_Main(void);
+bool8 None_Finish(void);
+void Clouds_InitVars(void);
+void Clouds_Main(void);
+void Clouds_InitAll(void);
+bool8 Clouds_Finish(void);
+void Weather2_InitVars(void);
+void Weather2_Main(void);
+void Weather2_InitAll(void);
+bool8 Weather2_Finish(void);
void LightRain_InitVars(void);
-void sub_807E400(void);
-void sub_807E3D0(void);
-u8 sub_807E460(void);
+void LightRain_Main(void);
+void LightRain_InitAll(void);
+bool8 LightRain_Finish(void);
void Snow_InitVars(void);
-void snowflakes_progress2(void);
-void sub_807EA18(void);
-u8 sub_807EAC0(void);
-void sub_807EE80(void);
-void sub_807EFC0(void);
-void sub_807EEF4(void);
-u8 sub_807F34C(void);
-void sub_807F49C(void);
-void sub_807F52C(void);
-void sub_807F4FC(void);
-u8 sub_807F5EC(void);
-void sub_807F7F8(void);
-void sub_807F888(void);
-void sub_807F858(void);
-u8 sub_807F934(void);
-void sub_807FE9C(void);
-void sub_807FF4C(void);
-void sub_807FF1C(void);
-u8 sub_807FFC8(void);
-void sub_807FB24(void);
-void sub_807FBD8(void);
-void sub_807FBA8(void);
-u8 sub_807FC3C(void);
-void sub_807F49C(void);
-void sub_807F52C(void);
-void sub_807F4FC(void);
-u8 sub_807F5EC(void);
-void sub_8080430(void);
-void nullsub_56(void);
-void sub_8080460(void);
-u8 sub_8080470(void);
-void sub_807E110(void);
-void sub_807E174(void);
-void sub_807E144(void);
-u8 sub_807E258(void);
-void sub_807EF24(void);
-void sub_807EFC0(void);
-void sub_807EF90(void);
-u8 sub_807F34C(void);
-void sub_8080474(void);
-void sub_80804F8(void);
-void sub_80804C8(void);
-u8 sub_808056C(void);
-
-const struct WeatherCallbacks gUnknown_08396FC8[] =
+void Snow_Main(void);
+void Snow_InitAll(void);
+bool8 Snow_Finish(void);
+void MedRain_InitVars(void);
+void Rain_Main(void);
+void MedRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Ash_InitVars(void);
+void Ash_Main(void);
+void Ash_InitAll(void);
+bool8 Ash_Finish(void);
+void Sandstorm_InitVars(void);
+void Sandstorm_Main(void);
+void Sandstorm_InitAll(void);
+bool8 Sandstorm_Finish(void);
+void Fog2_InitVars(void);
+void Fog2_Main(void);
+void Fog2_InitAll(void);
+bool8 Fog2_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Weather11_InitVars(void);
+void Weather11_Main(void);
+void Weather11_InitAll(void);
+bool8 Weather11_Finish(void);
+void Drought_InitVars(void);
+void Drought_Main(void);
+void Drought_InitAll(void);
+bool8 Drought_Finish(void);
+void HeavyRain_InitVars(void);
+void Rain_Main(void);
+void HeavyRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Bubbles_InitVars(void);
+void Bubbles_Main(void);
+void Bubbles_InitAll(void);
+bool8 Bubbles_Finish(void);
+
+static const struct WeatherCallbacks sWeatherFuncs[] =
{
- {sub_807CAE8, nullsub_38, sub_807CAE8, sub_807CB0C},
- {sub_807DE78, sub_807DEF4, sub_807DEC4, sub_807DF54},
- {sub_807DF9C, nullsub_55, sub_807DFC0, sub_807DFD0},
- {LightRain_InitVars, sub_807E400, sub_807E3D0, sub_807E460}, // light rain
- {Snow_InitVars, snowflakes_progress2, sub_807EA18, sub_807EAC0}, // snow
- {sub_807EE80, sub_807EFC0, sub_807EEF4, sub_807F34C},
- {sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC},
- {sub_807F7F8, sub_807F888, sub_807F858, sub_807F934},
- {sub_807FE9C, sub_807FF4C, sub_807FF1C, sub_807FFC8},
- {sub_807FB24, sub_807FBD8, sub_807FBA8, sub_807FC3C},
- {sub_807F49C, sub_807F52C, sub_807F4FC, sub_807F5EC},
- {sub_8080430, nullsub_56, sub_8080460, sub_8080470},
- {sub_807E110, sub_807E174, sub_807E144, sub_807E258},
- {sub_807EF24, sub_807EFC0, sub_807EF90, sub_807F34C},
- {sub_8080474, sub_80804F8, sub_80804C8, sub_808056C},
+ {None_Init, None_Main, None_Init, None_Finish},
+ {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish},
+ {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish},
+ {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain
+ {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish},
+ {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish},
+ {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish},
+ {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish},
+ {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish},
+ {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish},
+ {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish},
};
void (*const gUnknown_083970B8[])(void) =
@@ -190,33 +190,33 @@ const u8 gUnknown_083970C8[] =
const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
-void sub_807C828(void)
+void StartWeather(void)
{
u8 index;
- if (!FuncIsActiveTask(sub_807CA34))
+ if (!FuncIsActiveTask(Task_WeatherMain))
{
index = AllocSpritePalette(0x1200);
CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
sub_807CB10();
gWeatherPtr->unknown_6D5 = index;
gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201);
- gWeatherPtr->unknown_6DA = 0;
+ gWeatherPtr->rainSpriteCount = 0;
gWeatherPtr->unknown_6D8 = 0;
- gWeatherPtr->unknown_6DE = 0;
- gWeatherPtr->unknown_6E4 = 0;
- gWeatherPtr->unknown_700 = 0;
- gWeatherPtr->unknown_6FB = 0;
- gWeatherPtr->unknown_724 = 0;
- gWeatherPtr->unknown_716 = 0;
- gWeatherPtr->unknown_717 = 0;
+ gWeatherPtr->cloudSpritesCreated = 0;
+ gWeatherPtr->snowflakeSpriteCount = 0;
+ gWeatherPtr->ashSpritesCreated = 0;
+ gWeatherPtr->fog1SpritesCreated = 0;
+ gWeatherPtr->fog2SpritesCreated = 0;
+ gWeatherPtr->sandstormSprites1Created = 0;
+ gWeatherPtr->sandstormSprites2Created = 0;
gWeatherPtr->unknown_72E = 0;
gWeatherPtr->unknown_6FA = 0;
- sub_807DB64(16, 0);
+ Weather_SetBlendCoeffs(16, 0);
gWeatherPtr->currWeather = 0;
gWeatherPtr->unknown_6C6 = 3;
gWeatherPtr->unknown_6C8 = 0;
gWeatherPtr->unknown_6D3 = 1;
- gWeatherPtr->unknown_6C9 = CreateTask(sub_807C9E4, 80);
+ gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80);
}
}
@@ -226,72 +226,70 @@ void DoWeatherEffect(u8 effect)
{
PlayRainSoundEffect();
}
- if (gWeatherPtr->unknown_6D1 != effect && gWeatherPtr->currWeather == effect)
+ if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect)
{
- gUnknown_08396FC8[effect].func0();
+ sWeatherFuncs[effect].initVars();
}
gWeatherPtr->unknown_6D3 = 0;
- gWeatherPtr->unknown_6D1 = effect;
- gWeatherPtr->unknown_6CE = 0;
+ gWeatherPtr->nextWeather = effect;
+ gWeatherPtr->finishStep = 0;
}
void sub_807C988(u8 effect)
{
PlayRainSoundEffect();
gWeatherPtr->currWeather = effect;
- gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->nextWeather = effect;
}
void sub_807C9B4(u8 effect)
{
PlayRainSoundEffect();
gWeatherPtr->currWeather = effect;
- gWeatherPtr->unknown_6D1 = effect;
+ gWeatherPtr->nextWeather = effect;
gWeatherPtr->unknown_6C8 = 1;
}
-void sub_807C9E4(u8 taskId)
+void Task_WeatherInit(u8 taskId)
{
if (gWeatherPtr->unknown_6C8)
{
- gUnknown_08396FC8[gWeatherPtr->currWeather].func2();
- gTasks[taskId].func = sub_807CA34;
+ sWeatherFuncs[gWeatherPtr->currWeather].initAll();
+ gTasks[taskId].func = Task_WeatherMain;
}
}
-void sub_807CA34(u8 task)
+void Task_WeatherMain(u8 taskId)
{
- u8 v1;
- if (gWeatherPtr->currWeather != gWeatherPtr->unknown_6D1)
+ if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather)
{
- v1 = gUnknown_08396FC8[gWeatherPtr->currWeather].func3();
- if (!v1)
+ if (!sWeatherFuncs[gWeatherPtr->currWeather].finish())
{
- gUnknown_08396FC8[gWeatherPtr->unknown_6D1].func0();
- gWeatherPtr->unknown_6C3 = 0; // compiler reuses v1
- gWeatherPtr->unknown_6C6 = 0; // compiler reuses v1
- gWeatherPtr->currWeather = gWeatherPtr->unknown_6D1;
+ sWeatherFuncs[gWeatherPtr->nextWeather].initVars();
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->currWeather = gWeatherPtr->nextWeather;
gWeatherPtr->unknown_6D3 = 1;
}
}
else
{
- gUnknown_08396FC8[gWeatherPtr->currWeather].func1();
+ sWeatherFuncs[gWeatherPtr->currWeather].main();
}
gUnknown_083970B8[gWeatherPtr->unknown_6C6]();
}
-void sub_807CAE8(void)
+void None_Init(void)
{
gWeatherPtr->unknown_6C1 = 0;
gWeatherPtr->unknown_6C2 = 0;
}
-void nullsub_38(void)
+void None_Main(void)
{
}
-u8 sub_807CB0C(void)
+u8 None_Finish(void)
{
return 0;
}
@@ -627,14 +625,14 @@ void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e)
}
}
-void sub_807D304(s8 a, u8 arg2, u16 c)
+void sub_807D304(s8 a, u8 coeff, u16 c)
{
struct RGBColor color;
u8 r_;
u8 g_;
u8 b_;
u16 r4;
- u16 r5;
+ u16 palOffset;
u16 r12;
a = -a - 1;
@@ -642,13 +640,13 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
r_ = color.r;
g_ = color.g;
b_ = color.b;
- r5 = 0;
+ palOffset = 0;
for (r4 = 0; r4 < 32; r4++)
{
if (gUnknown_030006DC[r4] == 0)
{
- BlendPalette(r5, 16, arg2, c);
- r5 += 16;
+ BlendPalette(palOffset, 16, coeff, c);
+ palOffset += 16;
}
else
{
@@ -660,7 +658,7 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
u8 r1, g1, b1;
u8 r2, g2, b2;
- color1 = *(struct RGBColor *)&gPlttBufferUnfaded[r5];
+ color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
r1 = color1.r;
g1 = color1.g;
b1 = color1.b;
@@ -671,11 +669,11 @@ void sub_807D304(s8 a, u8 arg2, u16 c)
g2 = color2.g;
b2 = color2.b;
- r2 += ((r_ - r2) * arg2) >> 4;
- g2 += ((g_ - g2) * arg2) >> 4;
- b2 += ((b_ - b2) * arg2) >> 4;
+ r2 += ((r_ - r2) * coeff) >> 4;
+ g2 += ((g_ - g2) * coeff) >> 4;
+ b2 += ((b_ - b2) * coeff) >> 4;
- gPlttBufferFaded[r5++] = (b2 << 10) | (g2 << 5) | r2;
+ gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2;
}
}
}
@@ -775,28 +773,28 @@ void sub_807D5F0(u8 a, u8 b, u8 c)
}
}
-void fade_screen(u8 a, u8 b)
+void fade_screen(u8 a, u8 delay)
{
- u32 r4;
+ u32 fadeColor;
u32 r1;
u32 r2;
switch (a)
{
case 0:
- r4 = 0;
+ fadeColor = 0;
r1 = 0;
break;
case 2:
- r4 = 0xFFFF;
+ fadeColor = 0xFFFF;
r1 = 0;
break;
case 1:
- r4 = 0;
+ fadeColor = 0;
r1 = 1;
break;
case 3:
- r4 = 0xFFFF;
+ fadeColor = 0xFFFF;
r1 = 1;
break;
default:
@@ -823,20 +821,20 @@ void fade_screen(u8 a, u8 b)
{
if (r2 != 0)
CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
- BeginNormalPaletteFade(0xFFFFFFFF, b, 0, 16, r4);
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor);
gWeatherPtr->unknown_6C6 = 2;
}
else
{
- gWeatherPtr->unknown_6C4 = r4;
+ gWeatherPtr->unknown_6C4 = fadeColor;
if (r2 != 0)
gWeatherPtr->unknown_6C7 = 0;
else
- BeginNormalPaletteFade(0xFFFFFFFF, b, 16, 0, r4);
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor);
gWeatherPtr->unknown_6C6 = 1;
gWeatherPtr->unknown_6CA = 1;
gWeatherPtr->unknown_6CB = 0;
- sub_807DB64(gWeatherPtr->unknown_730, gWeatherPtr->unknown_732);
+ Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
gWeatherPtr->unknown_6C8 = 1;
}
}
@@ -909,7 +907,7 @@ void sub_807D8F0(u8 *a, u8 *b)
if (r4 < 7)
{
r4--;
- LZ77UnCompWram(gUnknown_08396FA8[r4], eWeatherPaletteData.data[r4]);
+ LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]);
if (r4 == 0)
{
eWeatherPaletteData.data[r4][0] = 0x421;
@@ -921,8 +919,7 @@ void sub_807D8F0(u8 *a, u8 *b)
for (i = 0; i < 0x1000; i++)
eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i];
}
- (*a)++;
- if (*a == 7)
+ if (++(*a) == 7)
{
*a = 32;
*b = 32;
@@ -997,52 +994,58 @@ void sub_807DA4C(void)
}
}
-void sub_807DB64(u8 a, u8 b)
+void Weather_SetBlendCoeffs(u8 eva, u8 evb)
{
- gWeatherPtr->unknown_730 = a;
- gWeatherPtr->unknown_732 = b;
- gWeatherPtr->unknown_734 = a;
- gWeatherPtr->unknown_736 = b;
- REG_BLDALPHA = (b << 8) | a;
+ gWeatherPtr->currBlendEVA = eva;
+ gWeatherPtr->currBlendEVB = evb;
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ REG_BLDALPHA = BLDALPHA_BLEND(eva, evb);
}
-void sub_807DBA4(u8 a, u8 b, int c)
+void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay)
{
- gWeatherPtr->unknown_734 = a;
- gWeatherPtr->unknown_736 = b;
- gWeatherPtr->unknown_73A = c;
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ gWeatherPtr->blendDelay = delay;
gWeatherPtr->unknown_739 = 0;
gWeatherPtr->unknown_738 = 0;
}
-bool8 sub_807DBE8(void)
+bool8 Weather_UpdateBlend(void)
{
- if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
- && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
- if (++gWeatherPtr->unknown_739 > gWeatherPtr->unknown_73A)
+
+ if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay)
{
gWeatherPtr->unknown_739 = 0;
gWeatherPtr->unknown_738++;
+
+ // Update currBlendEVA and currBlendEVB on alternate frames
if (gWeatherPtr->unknown_738 & 1)
{
- if (gWeatherPtr->unknown_730 < gWeatherPtr->unknown_734)
- gWeatherPtr->unknown_730++;
- else if (gWeatherPtr->unknown_730 > gWeatherPtr->unknown_734)
- gWeatherPtr->unknown_730--;
+ if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA++;
+ else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA--;
}
else
{
- if (gWeatherPtr->unknown_732 < gWeatherPtr->unknown_736)
- gWeatherPtr->unknown_732++;
- else if (gWeatherPtr->unknown_732 > gWeatherPtr->unknown_736)
- gWeatherPtr->unknown_732--;
+ if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB++;
+ else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB--;
}
}
- REG_BLDALPHA = (gWeatherPtr->unknown_732 << 8) | gWeatherPtr->unknown_730;
- if (gWeatherPtr->unknown_730 == gWeatherPtr->unknown_734
- && gWeatherPtr->unknown_732 == gWeatherPtr->unknown_736)
+
+ REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
return TRUE;
+
return FALSE;
}
diff --git a/src/field/field_weather_2.c b/src/field/field_weather_2.c
deleted file mode 100644
index fa97df459..000000000
--- a/src/field/field_weather_2.c
+++ /dev/null
@@ -1,1511 +0,0 @@
-#include "global.h"
-#include "field_map_obj.h"
-#include "field_weather.h"
-#include "rng.h"
-#include "script.h"
-#include "songs.h"
-#include "sound.h"
-#include "sprite.h"
-#include "task.h"
-#include "trig.h"
-
-extern struct Weather *const gWeatherPtr;
-
-//extern const s16 gUnknown_0839A9C8[][2];
-extern const struct SpriteSheet gWeatherCloudSpriteSheet;
-extern const struct SpriteTemplate gSpriteTemplate_839A9F0;
-extern const struct SpriteTemplate gSpriteTemplate_839AAA4;
-extern const struct SpriteTemplate gSpriteTemplate_839AB04;
-
-const u16 gUnknown_08397108[] = INCBIN_U16("graphics/weather/1.gbapal");
-const u16 gUnknown_08397128[] = INCBIN_U16("graphics/weather/2.gbapal");
-const u8 WeatherFog0Tiles[] = INCBIN_U8("graphics/weather/fog0.4bpp");
-const u8 gWeatherFog1Tiles[] = INCBIN_U8("graphics/weather/fog1.4bpp");
-const u8 WeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp");
-const u8 gSpriteImage_8398948[] = INCBIN_U8("graphics/weather/snow0.4bpp");
-const u8 gSpriteImage_8398968[] = INCBIN_U8("graphics/weather/snow1.4bpp");
-const u8 WeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp");
-const u8 WeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp");
-const u8 WeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp");
-const u8 WeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp");
-
-const struct Coords16 gUnknown_0839A9C8[] =
-{
- { 0, 66},
- { 5, 73},
- {10, 78},
-};
-
-const struct SpriteSheet gWeatherCloudSpriteSheet = {WeatherCloudTiles, 0x800, 0x1200};
-
-const struct OamData gOamData_839A9DC =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 3,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-const union AnimCmd gSpriteAnim_839A9E4[] =
-{
- ANIMCMD_FRAME(0, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd *const gSpriteAnimTable_839A9EC[] =
-{
- gSpriteAnim_839A9E4,
-};
-
-void sub_807E0F4(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839A9F0 =
-{
- .tileTag = 4608,
- .paletteTag = 4609,
- .oam = &gOamData_839A9DC,
- .anims = gSpriteAnimTable_839A9EC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807E0F4,
-};
-
-extern void sub_807D5BC(s8 a);
-extern void sub_807D8C0(const u16 *palette);
-extern void sub_807D9A8(void);
-extern bool8 sub_807D9C8(void);
-extern void sub_807DA14(void);
-extern void sub_807DA4C(void);
-extern void sub_807DBA4(u8 a, u8 b, int c);
-extern bool8 sub_807DBE8(void);
-extern void SetRainStrengthFromSoundEffect(u16 sndEff);
-extern void sub_807D5F0(u8 a, u8 b, u8 c);
-
-//------------------------------------------------------------------------------
-// Clouds
-//------------------------------------------------------------------------------
-
-void sub_807DE78(void)
-{
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
- gWeatherPtr->unknown_6D2 = 0;
- gWeatherPtr->unknown_6CC = 0;
- if (gWeatherPtr->unknown_6DE == 0)
- sub_807DB64(0, 16);
-}
-
-void sub_807DEF4(void);
-
-void sub_807DEC4(void)
-{
- sub_807DE78();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807DEF4();
-}
-
-void sub_807DFD4(void);
-
-void sub_807DEF4(void)
-{
- switch (gWeatherPtr->unknown_6CC)
- {
- case 0:
- sub_807DFD4();
- gWeatherPtr->unknown_6CC++;
- break;
- case 1:
- sub_807DBA4(12, 8, 1);
- gWeatherPtr->unknown_6CC++;
- break;
- case 2:
- if (sub_807DBE8())
- {
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807E0A0(void);
-
-bool8 sub_807DF54(void)
-{
- switch (gWeatherPtr->unknown_6CE)
- {
- case 0:
- sub_807DBA4(0, 16, 1);
- gWeatherPtr->unknown_6CE++;
- return TRUE;
- case 1:
- if (sub_807DBE8())
- {
- sub_807E0A0();
- gWeatherPtr->unknown_6CE++;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_807DF9C(void)
-{
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
-}
-
-void sub_807DFC0(void)
-{
- sub_807DF9C();
-}
-
-void nullsub_55(void)
-{
-}
-
-int sub_807DFD0(void)
-{
- return 0;
-}
-
-void sub_807DFD4(void)
-{
- u16 i;
-
- if (gWeatherPtr->unknown_6DE == 1)
- return;
- LoadSpriteSheet(&gWeatherCloudSpriteSheet);
- sub_807D8C0(gUnknown_08397108);
- for (i = 0; i < 3; i++)
- {
- u8 spriteId = CreateSprite(&gSpriteTemplate_839A9F0, 0, 0, 0xFF);
-
- if (spriteId != 64)
- {
- struct Sprite *sprite;
-
- gWeatherPtr->cloudSprites[i] = &gSprites[spriteId];
- sprite = gWeatherPtr->cloudSprites[i];
- sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y);
- sprite->coordOffsetEnabled = TRUE;
- }
- else
- {
- gWeatherPtr->cloudSprites[i] = NULL;
- }
- }
- gWeatherPtr->unknown_6DE = 1;
-}
-
-void sub_807E0A0(void)
-{
- u16 i;
-
- if (gWeatherPtr->unknown_6DE == 0)
- return;
- for (i = 0; i < 3; i++)
- {
- if (gWeatherPtr->cloudSprites[i] != NULL)
- DestroySprite(gWeatherPtr->cloudSprites[i]);
- }
- FreeSpriteTilesByTag(0x1200);
- gWeatherPtr->unknown_6DE = 0;
-}
-
-void sub_807E0F4(struct Sprite *sprite)
-{
- sprite->data[0] = (sprite->data[0] + 1) & 1;
- if (sprite->data[0] != 0)
- sprite->pos1.x--;
-}
-
-void sub_807E110(void)
-{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 0;
-}
-
-void sub_807E174(void);
-
-void sub_807E144(void)
-{
- sub_807E110();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807E174();
-}
-
-void sub_807E174(void)
-{
- switch (gWeatherPtr->unknown_6CC)
- {
- case 0:
- if (gWeatherPtr->unknown_6C6 != 0)
- gWeatherPtr->unknown_6CC++;
- break;
- case 1:
- sub_807D9A8();
- gWeatherPtr->unknown_6CC++;
- break;
- case 2:
- if (sub_807D9C8() == FALSE)
- gWeatherPtr->unknown_6CC++;
- break;
- case 3:
- sub_807DA14();
- gWeatherPtr->unknown_6CC++;
- break;
- case 4:
- sub_807DA4C();
- if (gWeatherPtr->unknown_73C == 6)
- {
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
- }
- break;
- default:
- sub_807DA4C();
- break;
- }
-}
-
-int sub_807E258(void)
-{
- return 0;
-}
-
-void task50_0807B6D4(u8);
-
-void sub_807E25C(void)
-{
- CreateTask(task50_0807B6D4, 0x50);
-}
-
-#define tState data[0]
-#define tBlendY data[1]
-#define tBlendDelay data[2]
-#define tWinRange data[3]
-
-void task50_0807B6D4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
-
- switch (task->tState)
- {
- case 0:
- task->tBlendY = 0;
- task->tBlendDelay = 0;
- task->tWinRange = REG_WININ;
- REG_WININ = WIN_RANGE(63, 63);
- REG_BLDCNT = 0x9E;
- REG_BLDY = 0;
- task->tState++;
- // fall through
- case 1:
- task->tBlendY += 3;
- if (task->tBlendY > 16)
- task->tBlendY = 16;
- REG_BLDY = task->tBlendY;
- if (task->tBlendY >= 16)
- task->tState++;
- break;
- case 2:
- task->tBlendDelay++;
- if (task->tBlendDelay > 9)
- {
- task->tBlendDelay = 0;
- task->tBlendY--;
- if (task->tBlendY <= 0)
- {
- task->tBlendY = 0;
- task->tState++;
- }
- REG_BLDY = task->tBlendY;
- }
- break;
- case 3:
- REG_BLDCNT = 0;
- REG_BLDY = 0;
- REG_WININ = task->tWinRange;
- task->tState++;
- break;
- case 4:
- EnableBothScriptContexts();
- DestroyTask(taskId);
- break;
- }
-}
-
-#undef tState
-#undef tBlendY
-#undef tBlendDelay
-#undef tWinRange
-
-//------------------------------------------------------------------------------
-// Light Rain
-//------------------------------------------------------------------------------
-
-void LightRain_InitVars(void)
-{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
- gWeatherPtr->unknown_6D6 = 0;
- gWeatherPtr->unknown_6DB = 8;
- gWeatherPtr->unknown_6DC = 0;
- gWeatherPtr->unknown_6D9 = 10;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
- SetRainStrengthFromSoundEffect(SE_T_KOAME);
-}
-
-void sub_807E400(void);
-
-void sub_807E3D0(void)
-{
- LightRain_InitVars();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807E400();
-}
-
-void sub_807E7A4(void);
-u8 sub_807E7B4(void);
-u8 sub_807E8E8(void);
-
-void sub_807E400(void)
-{
- switch (gWeatherPtr->unknown_6CC)
- {
- case 0:
- sub_807E7A4();
- gWeatherPtr->unknown_6CC++;
- break;
- case 1:
- if (sub_807E7B4() == 0)
- gWeatherPtr->unknown_6CC++;
- break;
- case 2:
- if (sub_807E8E8() == FALSE)
- {
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807E974(void);
-
-bool8 sub_807E460(void)
-{
- switch (gWeatherPtr->unknown_6CE)
- {
- case 0:
- if (gWeatherPtr->unknown_6D1 == 3
- || gWeatherPtr->unknown_6D1 == 5
- || gWeatherPtr->unknown_6D1 == 13)
- {
- gWeatherPtr->unknown_6CE = 0xFF;
- return FALSE;
- }
- else
- {
- gWeatherPtr->unknown_6D9 = 0;
- gWeatherPtr->unknown_6CE++;
- }
- // fall through
- case 1:
- if (sub_807E8E8() == FALSE)
- {
- sub_807E974();
- gWeatherPtr->unknown_6CE++;
- return FALSE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-// defined below
-extern const s16 gUnknown_0839AABC[][2];
-extern const u16 gUnknown_0839AAC4[][2];
-
-void sub_807E4EC(struct Sprite *sprite)
-{
- u32 randVal;
- u16 r6;
- s32 r4;
- s32 r0;
-
- if (sprite->data[1] == 0)
- sprite->data[1] = 361;
- randVal = sprite->data[1] * 1103515245 + 12345;
- sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600;
-
- r6 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
-
- r4 = sprite->data[1] % 30;
- sprite->data[2] = r4 * 8; // useless assignment
-
- r0 = sprite->data[1] / 30;
- sprite->data[3] = r0 * 8; // useless assignment
-
- sprite->data[2] = r4;
- sprite->data[2] <<= 7;
-
- sprite->data[3] = r0;
- sprite->data[3] <<= 7;
-
- sprite->data[2] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0] * r6;
- sprite->data[3] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1] * r6;
-
- StartSpriteAnim(sprite, 0);
- sprite->data[4] = 0;
- sprite->coordOffsetEnabled = FALSE;
- sprite->data[0] = r6;
-}
-
-void sub_807E5C0(struct Sprite *sprite)
-{
- if (sprite->data[4] == 0)
- {
- sprite->data[2] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0];
- sprite->data[3] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1];
- sprite->pos1.x = sprite->data[2] >> 4;
- sprite->pos1.y = sprite->data[3] >> 4;
-
- if (sprite->data[5] != 0
- && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248)
- && sprite->pos1.y >= -16 && sprite->pos1.y <= 176)
- sprite->invisible = FALSE;
- else
- sprite->invisible = TRUE;
-
- sprite->data[0]--;
- if (sprite->data[0] == 0)
- {
- StartSpriteAnim(sprite, gWeatherPtr->unknown_6DC + 1);
- sprite->data[4] = 1;
- sprite->pos1.x -= gSpriteCoordOffsetX;
- sprite->pos1.y -= gSpriteCoordOffsetY;
- sprite->coordOffsetEnabled = TRUE;
- }
- }
- else if (sprite->animEnded)
- {
- sprite->invisible = TRUE;
- sub_807E4EC(sprite);
- }
-}
-
-void sub_807E6C4(struct Sprite *sprite)
-{
- if (sprite->data[0] == 0)
- {
- sub_807E4EC(sprite);
- sprite->callback = sub_807E5C0;
- }
- else
- {
- sprite->data[0]--;
- }
-}
-
-void sub_807E6F0(struct Sprite *sprite, u16 b)
-{
- u16 r8 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
- u16 r6 = b / (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
- u16 r4 = b % (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
-
- while (--r6 != 0xFFFF)
- sub_807E4EC(sprite);
- if (r4 < r8)
- {
- while (--r4 != 0xFFFF)
- sub_807E5C0(sprite);
- sprite->data[6] = 0;
- }
- else
- {
- sprite->data[0] = r4 - r8;
- sprite->invisible = TRUE;
- sprite->data[6] = 1;
- }
-}
-
-extern const struct SpriteSheet gUnknown_0839AACC; // defined below
-
-void sub_807E7A4(void)
-{
- LoadSpriteSheet(&gUnknown_0839AACC);
-}
-
-const struct Coords16 gUnknown_0839AA08[] =
-{
- { 0, 0},
- { 0, 160},
- { 0, 64},
- {144, 224},
- {144, 128},
- { 32, 32},
- { 32, 192},
- { 32, 96},
- { 72, 128},
- { 72, 32},
- { 72, 192},
- {216, 96},
- {216, 0},
- {104, 160},
- {104, 64},
- {104, 224},
- {144, 0},
- {144, 160},
- {144, 64},
- { 32, 224},
- { 32, 128},
- { 72, 32},
- { 72, 192},
- { 48, 96},
-};
-
-const struct OamData gOamData_839AA68 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 2,
- .x = 0,
- .matrixNum = 0,
- .size = 2,
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 2,
- .affineParam = 0,
-};
-
-const union AnimCmd gSpriteAnim_839AA70[] =
-{
- ANIMCMD_FRAME(0, 16),
- ANIMCMD_JUMP(0),
-};
-
-const union AnimCmd gSpriteAnim_839AA78[] =
-{
- ANIMCMD_FRAME(8, 3),
- ANIMCMD_FRAME(32, 2),
- ANIMCMD_FRAME(40, 2),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AA88[] =
-{
- ANIMCMD_FRAME(8, 3),
- ANIMCMD_FRAME(16, 3),
- ANIMCMD_FRAME(24, 4),
- ANIMCMD_END,
-};
-
-const union AnimCmd *const gSpriteAnimTable_839AA98[] =
-{
- gSpriteAnim_839AA70,
- gSpriteAnim_839AA78,
- gSpriteAnim_839AA88,
-};
-
-const struct SpriteTemplate gSpriteTemplate_839AAA4 =
-{
- .tileTag = 4614,
- .paletteTag = 4608,
- .oam = &gOamData_839AA68,
- .anims = gSpriteAnimTable_839AA98,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807E5C0,
-};
-
-
-const s16 gUnknown_0839AABC[][2] =
-{
- {-104, 208},
- {-160, 320},
-};
-
-const u16 gUnknown_0839AAC4[][2] =
-{
- {18, 7},
- {12, 10},
-};
-
-const struct SpriteSheet gUnknown_0839AACC = {WeatherRainTiles, sizeof(WeatherRainTiles), 0x1206};
-
-const struct OamData gOamData_839AAD4 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 0,
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-const struct SpriteFrameImage gSpriteImageTable_839AADC[] =
-{
- {gSpriteImage_8398948, sizeof(gSpriteImage_8398948)},
- {gSpriteImage_8398968, sizeof(gSpriteImage_8398968)},
-};
-
-const union AnimCmd gSpriteAnim_839AAEC[] =
-{
- ANIMCMD_FRAME(0, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AAF4[] =
-{
- ANIMCMD_FRAME(1, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd *const gSpriteAnimTable_839AAFC[] =
-{
- gSpriteAnim_839AAEC,
- gSpriteAnim_839AAF4,
-};
-
-void sub_807ED48(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839AB04 =
-{
- .tileTag = 0xFFFF,
- .paletteTag = 4608,
- .oam = &gOamData_839AAD4,
- .anims = gSpriteAnimTable_839AAFC,
- .images = gSpriteImageTable_839AADC,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807ED48,
-};
-
-// unused data
-const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300};
-
-const struct OamData gOamData_839AB2C =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-const union AnimCmd gSpriteAnim_839AB34[] =
-{
- ANIMCMD_FRAME(0, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AB3C[] =
-{
- ANIMCMD_FRAME(32, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AB44[] =
-{
- ANIMCMD_FRAME(64, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AB4C[] =
-{
- ANIMCMD_FRAME(96, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AB54[] =
-{
- ANIMCMD_FRAME(128, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AB5C[] =
-{
- ANIMCMD_FRAME(160, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd *const gSpriteAnimTable_839AB64[] =
-{
- gSpriteAnim_839AB34,
- gSpriteAnim_839AB3C,
- gSpriteAnim_839AB44,
- gSpriteAnim_839AB4C,
- gSpriteAnim_839AB54,
- gSpriteAnim_839AB5C,
-};
-
-const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] =
-{
- AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
- AFFINEANIMCMD_END,
-};
-
-const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] =
-{
- gSpriteAffineAnim_839AB7C,
-};
-
-void sub_807F688(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839AB90 =
-{
- .tileTag = 4609,
- .paletteTag = 4608,
- .oam = &gOamData_839AB2C,
- .anims = gSpriteAnimTable_839AB64,
- .images = NULL,
- .affineAnims = gSpriteAffineAnimTable_839AB8C,
- .callback = sub_807F688,
-};
-
-const struct SpriteSheet gWeatherFog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 0x1201};
-const struct SpriteSheet gWeatherAshSpriteSheet = {WeatherAshTiles, sizeof(WeatherAshTiles), 0x1202};
-
-const struct OamData gOamData_839ABB8 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 15,
- .affineParam = 0,
-};
-
-const union AnimCmd gSpriteAnim_839ABC0[] =
-{
- ANIMCMD_FRAME(0, 60),
- ANIMCMD_FRAME(64, 60),
- ANIMCMD_JUMP(0),
-};
-
-const union AnimCmd *const gSpriteAnimTable_839ABCC[] =
-{
- gSpriteAnim_839ABC0,
-};
-
-void sub_807FAA8(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839ABD0 =
-{
- .tileTag = 4610,
- .paletteTag = 4608,
- .oam = &gOamData_839ABB8,
- .anims = gSpriteAnimTable_839ABCC,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807FAA8,
-};
-
-const struct SpriteSheet gWeatherFog0SpriteSheet = {WeatherFog0Tiles, sizeof(WeatherFog0Tiles), 0x1203};
-
-const struct OamData gOamData_839ABF0 =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 2,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-const union AnimCmd gSpriteAnim_839ABF8[] =
-{
- ANIMCMD_FRAME(0, 16),
- ANIMCMD_END,
-};
-
-const union AnimCmd *const gSpriteAnimTable_839AC00[] =
-{
- gSpriteAnim_839ABF8,
-};
-
-void sub_807FE3C(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839AC04 =
-{
- .tileTag = 4611,
- .paletteTag = 4608,
- .oam = &gOamData_839ABF0,
- .anims = gSpriteAnimTable_839AC00,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_807FE3C,
-};
-
-const struct OamData gOamData_839AC1C =
-{
- .y = 0,
- .affineMode = 0,
- .objMode = 1,
- .mosaic = 0,
- .bpp = 0,
- .shape = 0,
- .x = 0,
- .matrixNum = 0,
- .size = 3,
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 0,
- .affineParam = 0,
-};
-
-const union AnimCmd gSpriteAnim_839AC24[] =
-{
- ANIMCMD_FRAME(0, 3),
- ANIMCMD_END,
-};
-
-const union AnimCmd gSpriteAnim_839AC2C[] =
-{
- ANIMCMD_FRAME(64, 3),
- ANIMCMD_END,
-};
-
-const union AnimCmd *const gSpriteAnimTable_839AC34[] =
-{
- gSpriteAnim_839AC24,
- gSpriteAnim_839AC2C,
-};
-
-void sub_8080338(struct Sprite *);
-const struct SpriteTemplate gSpriteTemplate_839AC3C =
-{
- .tileTag = 4612,
- .paletteTag = 4609,
- .oam = &gOamData_839AC1C,
- .anims = gSpriteAnimTable_839AC34,
- .images = NULL,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8080338,
-};
-
-const struct SpriteSheet gWeatherSandstormSpriteSheet = {WeatherSandstormTiles, sizeof(WeatherSandstormTiles), 0x1204};
-
-bool8 sub_807E7B4(void)
-{
- u8 r7;
- u8 spriteId;
-
- if (gWeatherPtr->unknown_6DA == 24)
- return FALSE;
-
- r7 = gWeatherPtr->unknown_6DA;
- spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AAA4,
- gUnknown_0839AA08[r7].x, gUnknown_0839AA08[r7].y, 78);
- if (spriteId != 64)
- {
- gSprites[spriteId].data[5] = 0;
- gSprites[spriteId].data[1] = r7 * 145;
- while (gSprites[spriteId].data[1] >= 600)
- gSprites[spriteId].data[1] -= 600;
- sub_807E4EC(&gSprites[spriteId]);
- sub_807E6F0(&gSprites[spriteId], r7 * 9);
- gSprites[spriteId].invisible = TRUE;
- gWeatherPtr->unknown_0[r7] = &gSprites[spriteId];
- }
- else
- {
- gWeatherPtr->unknown_0[r7] = NULL;
- }
-
- if (++gWeatherPtr->unknown_6DA == 24)
- {
- u16 i;
-
- for (i = 0; i < 24; i++)
- {
- if (gWeatherPtr->unknown_0[i] != NULL)
- {
- if (gWeatherPtr->unknown_0[i]->data[6] == 0)
- gWeatherPtr->unknown_0[i]->callback = sub_807E5C0;
- else
- gWeatherPtr->unknown_0[i]->callback = sub_807E6C4;
- }
- }
- return FALSE;
- }
- return TRUE;
-}
-
-bool8 sub_807E8E8(void)
-{
- if (gWeatherPtr->unknown_6D8 == gWeatherPtr->unknown_6D9)
- return FALSE;
-
- if (++gWeatherPtr->unknown_6D6 > gWeatherPtr->unknown_6DB)
- {
- gWeatherPtr->unknown_6D6 = 0;
- if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9)
- {
- gWeatherPtr->unknown_0[gWeatherPtr->unknown_6D8++]->data[5] = 1;
- }
- else
- {
- gWeatherPtr->unknown_6D8--;
- gWeatherPtr->unknown_0[gWeatherPtr->unknown_6D8]->data[5] = 0;
- gWeatherPtr->unknown_0[gWeatherPtr->unknown_6D8]->invisible = TRUE;
- }
- }
- return TRUE;
-}
-
-void sub_807E974(void)
-{
- u16 i;
-
- for (i = 0; i < gWeatherPtr->unknown_6DA; i++)
- {
- if (gWeatherPtr->unknown_0[i] != NULL)
- DestroySprite(gWeatherPtr->unknown_0[i]);
- }
- gWeatherPtr->unknown_6DA = 0;
- FreeSpriteTilesByTag(0x1206);
-}
-
-//------------------------------------------------------------------------------
-// Snow
-//------------------------------------------------------------------------------
-
-void Snow_InitVars(void)
-{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
- gWeatherPtr->unknown_6E5 = 16;
- gWeatherPtr->unknown_6E0 = 0;
-}
-
-void snowflakes_progress2(void);
-void sub_807ED48(struct Sprite *);
-
-void sub_807EA18(void)
-{
- Snow_InitVars();
- while (gWeatherPtr->unknown_6D2 == 0)
- {
- u16 i;
-
- snowflakes_progress2();
- for (i = 0; i < gWeatherPtr->unknown_6E4; i++)
- {
- sub_807ED48(gWeatherPtr->snowflakeSprites[i]);
- }
- }
-}
-
-u8 snowflakes_progress(void);
-
-void snowflakes_progress2(void)
-{
- if (gWeatherPtr->unknown_6CC == 0 && snowflakes_progress() == FALSE)
- {
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
- }
-}
-
-bool8 sub_807EAC0(void)
-{
- switch (gWeatherPtr->unknown_6CE)
- {
- case 0:
- gWeatherPtr->unknown_6E5 = 0;
- gWeatherPtr->unknown_6E0 = 0;
- gWeatherPtr->unknown_6CE++;
- // fall through
- case 1:
- if (snowflakes_progress() == FALSE)
- {
- gWeatherPtr->unknown_6CE++;
- return FALSE;
- }
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 snowflake_add(void);
-bool8 snowflake_remove(void);
-
-bool8 snowflakes_progress(void)
-{
- if (gWeatherPtr->unknown_6E4 == gWeatherPtr->unknown_6E5)
- return FALSE;
-
- gWeatherPtr->unknown_6E0++;
- if (gWeatherPtr->unknown_6E0 > 36)
- {
- gWeatherPtr->unknown_6E0 = 0;
- if (gWeatherPtr->unknown_6E4 < gWeatherPtr->unknown_6E5)
- snowflake_add();
- else
- snowflake_remove();
- }
- return (gWeatherPtr->unknown_6E4 != gWeatherPtr->unknown_6E5);
-}
-
-void sub_807EC40(struct Sprite *);
-
-bool8 snowflake_add(void)
-{
- u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839AB04, 0, 0, 78);
-
- if (spriteId == 64)
- return FALSE;
- gSprites[spriteId].data[4] = gWeatherPtr->unknown_6E4;
- sub_807EC40(&gSprites[spriteId]);
- gSprites[spriteId].coordOffsetEnabled = TRUE;
- gWeatherPtr->snowflakeSprites[gWeatherPtr->unknown_6E4++] = &gSprites[spriteId];
- return TRUE;
-}
-
-bool8 snowflake_remove(void)
-{
- if (gWeatherPtr->unknown_6E4 != 0)
- {
- DestroySprite(gWeatherPtr->snowflakeSprites[--gWeatherPtr->unknown_6E4]);
- return TRUE;
- }
- return FALSE;
-}
-
-void sub_807EC40(struct Sprite *sprite)
-{
- u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30);
- u16 r6;
-
- sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->pos2.x = 0;
- r6 = Random();
- sprite->data[1] = (r6 & 3) * 5 + 64;
- sprite->data[7] = (r6 & 3) * 5 + 64;
- StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
- sprite->data[3] = 0;
- sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1;
- sprite->data[6] = (r6 & 0x1F) + 210;
- sprite->data[5] = 0;
-}
-
-void sub_807ECEC(struct Sprite *sprite)
-{
- if (gWeatherPtr->unknown_6E2 > 18)
- {
- sprite->invisible = FALSE;
- sprite->callback = sub_807ED48;
- sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->data[0] = sprite->pos1.y * 128;
- gWeatherPtr->unknown_6E2 = 0;
- }
-}
-
-void sub_807ED48(struct Sprite *sprite)
-{
- s16 r3;
- s16 r2;
-
- sprite->data[0] += sprite->data[1];
- sprite->pos1.y = sprite->data[0] >> 7;
- sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF;
- sprite->pos2.x = gSineTable[sprite->data[3]] / 64;
-
- r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;
- if (r3 & 0x100)
- r3 = -0x100 | r3; // hmm... what is this?
- if (r3 < -3)
- sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
- else if (r3 > 242)
- sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
-
- r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF;
- if (r2 > 163 && r2 < 171)
- {
- sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->data[5] = 0;
- sprite->data[6] = 220;
- }
- else if (r2 > 242 && r2 < 250)
- {
- sprite->pos1.y = 163;
- sprite->data[0] = sprite->pos1.y * 128;
- sprite->data[5] = 0;
- sprite->data[6] = 220;
- sprite->invisible = TRUE;
- sprite->callback = sub_807ECEC;
- }
-
- sprite->data[5]++;
- if (sprite->data[5] == sprite->data[6])
- {
- sub_807EC40(sprite);
- sprite->pos1.y = 250;
- sprite->invisible = TRUE;
- sprite->callback = sub_807ECEC;
- }
-}
-
-//------------------------------------------------------------------------------
-// Medium Rain
-//------------------------------------------------------------------------------
-
-void sub_807EE80(void)
-{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
- gWeatherPtr->unknown_6D6 = 0;
- gWeatherPtr->unknown_6DB = 4;
- gWeatherPtr->unknown_6DC = 0;
- gWeatherPtr->unknown_6D9 = 16;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
- gWeatherPtr->unknown_6D2 = 0; // duplicate assignment
- gWeatherPtr->unknown_6ED = 0;
- SetRainStrengthFromSoundEffect(SE_T_AME);
-}
-
-void sub_807EFC0(void);
-
-void sub_807EEF4(void)
-{
- sub_807EE80();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807EFC0();
-}
-
-//------------------------------------------------------------------------------
-// Heavy Rain
-//------------------------------------------------------------------------------
-
-void sub_807EF24(void)
-{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
- gWeatherPtr->unknown_6D6 = 0;
- gWeatherPtr->unknown_6DB = 4;
- gWeatherPtr->unknown_6DC = 1;
- gWeatherPtr->unknown_6D9 = 24;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
- gWeatherPtr->unknown_6D2 = 0; // duplicate assignment
- SetRainStrengthFromSoundEffect(SE_T_OOAME);
-}
-
-void sub_807EF90(void)
-{
- sub_807EF24();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807EFC0();
-}
-
-void sub_807F434(void);
-void sub_807F3F8(u16);
-
-void sub_807EFC0(void)
-{
- sub_807F434();
- switch (gWeatherPtr->unknown_6CC)
- {
- case 0:
- sub_807E7A4();
- gWeatherPtr->unknown_6CC++;
- break;
- case 1:
- if (sub_807E7B4())
- break;
- gWeatherPtr->unknown_6CC++;
- break;
- case 2:
- if (sub_807E8E8())
- break;
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
- break;
- case 3:
- if (gWeatherPtr->unknown_6C6 == 0)
- break;
- gWeatherPtr->unknown_6CC = 6;
- break;
- case 4:
- gWeatherPtr->unknown_6EA = 1;
- gWeatherPtr->unknown_6E6 = (Random() % 360) + 360;
- gWeatherPtr->unknown_6CC++;
- // fall through
- case 5:
- if (--gWeatherPtr->unknown_6E6 != 0)
- break;
- gWeatherPtr->unknown_6CC++;
- break;
- case 6:
- gWeatherPtr->unknown_6EA = 1;
- gWeatherPtr->unknown_6EB = Random() % 2;
- gWeatherPtr->unknown_6CC++;
- break;
- case 7:
- gWeatherPtr->unknown_6EC = (Random() & 1) + 1;
- gWeatherPtr->unknown_6CC++;
- // fall through
- case 8:
- sub_807D5BC(19);
- if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1)
- sub_807F3F8(20);
- gWeatherPtr->unknown_6E6 = (Random() % 3) + 6;
- gWeatherPtr->unknown_6CC++;
- break;
- case 9:
- if (--gWeatherPtr->unknown_6E6 != 0)
- break;
- sub_807D5BC(3);
- gWeatherPtr->unknown_6EA = 1;
- if (--gWeatherPtr->unknown_6EC != 0)
- {
- gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
- gWeatherPtr->unknown_6CC = 10;
- }
- else if (gWeatherPtr->unknown_6EB == 0)
- {
- gWeatherPtr->unknown_6CC = 4;
- }
- else
- {
- gWeatherPtr->unknown_6CC = 11;
- }
- break;
- case 10:
- if (--gWeatherPtr->unknown_6E6 != 0)
- break;
- gWeatherPtr->unknown_6CC = 8;
- break;
- case 11:
- gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
- gWeatherPtr->unknown_6CC++;
- break;
- case 12:
- if (--gWeatherPtr->unknown_6E6 != 0)
- break;
- sub_807F3F8(100);
- sub_807D5BC(19);
- // Why use "% 16" everywhere else and "& 0xF" here. So dumb.
- gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30;
- gWeatherPtr->unknown_6CC++;
- break;
- case 13:
- if (--gWeatherPtr->unknown_6E6 != 0)
- break;
- sub_807D5F0(19, 3, 5);
- gWeatherPtr->unknown_6CC++;
- break;
- case 14:
- if (gWeatherPtr->unknown_6C6 != 3)
- break;
- gWeatherPtr->unknown_6EA = 1;
- gWeatherPtr->unknown_6CC = 4;
- break;
- }
-}
-
-bool8 sub_807F34C(void)
-{
- switch (gWeatherPtr->unknown_6CE)
- {
- case 0:
- gWeatherPtr->unknown_6EA = 0;
- gWeatherPtr->unknown_6CE++;
- // fall through
- case 1:
- sub_807EFC0();
- if (gWeatherPtr->unknown_6EA != 0)
- {
- if (gWeatherPtr->unknown_6D1 == 3
- || gWeatherPtr->unknown_6D1 == 5
- || gWeatherPtr->unknown_6D1 == 13)
- return FALSE;
- gWeatherPtr->unknown_6D9 = 0;
- gWeatherPtr->unknown_6CE++;
- }
- break;
- case 2:
- if (sub_807E8E8())
- break;
- sub_807E974();
- gWeatherPtr->unknown_6ED = 0;
- gWeatherPtr->unknown_6CE++;
- return FALSE;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-void sub_807F3F8(u16 a)
-{
- if (gWeatherPtr->unknown_6ED == 0)
- {
- gWeatherPtr->unknown_6E8 = Random() % a;
- gWeatherPtr->unknown_6ED = 1;
- }
-}
-
-void sub_807F434(void)
-{
- if (gWeatherPtr->unknown_6ED == 1)
- {
- if (gWeatherPtr->unknown_6E8 == 0)
- {
- if (IsSEPlaying())
- return;
- if (Random() & 1)
- PlaySE(SE_T_KAMI);
- else
- PlaySE(SE_T_KAMI2);
- gWeatherPtr->unknown_6ED = 0;
- }
- else
- {
- gWeatherPtr->unknown_6E8--;
- }
- }
-}
-
-void sub_807F49C(void)
-{
- gWeatherPtr->unknown_6CC = 0;
- gWeatherPtr->unknown_6D2 = 0;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
- if (gWeatherPtr->unknown_6FB == 0)
- {
- gWeatherPtr->unknown_6F0 = 0;
- gWeatherPtr->unknown_6F2 = 0;
- gWeatherPtr->unknown_6EE = 0;
- sub_807DB64(0, 16);
- }
-}
-
-void sub_807F52C(void);
-
-void sub_807F4FC(void)
-{
- sub_807F49C();
- while (gWeatherPtr->unknown_6D2 == 0)
- sub_807F52C();
-}
-
-void sub_807F6E8(void);
-
-void sub_807F52C(void)
-{
- gWeatherPtr->unknown_6EE = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
- if (++gWeatherPtr->unknown_6F0 > 3)
- {
- gWeatherPtr->unknown_6F0 = 0;
- gWeatherPtr->unknown_6F2++;
- }
- switch (gWeatherPtr->unknown_6CC)
- {
- case 0:
- sub_807F6E8();
- if (gWeatherPtr->currWeather == 6)
- sub_807DBA4(12, 8, 3);
- else
- sub_807DBA4(4, 16, 0);
- gWeatherPtr->unknown_6CC++;
- break;
- case 1:
- if (sub_807DBE8())
- {
- gWeatherPtr->unknown_6D2 = 1;
- gWeatherPtr->unknown_6CC++;
- }
- break;
- }
-}
-
-void sub_807F7A4(void);
-
-bool8 sub_807F5EC(void)
-{
- gWeatherPtr->unknown_6EE = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
- if (++gWeatherPtr->unknown_6F0 > 3)
- {
- gWeatherPtr->unknown_6F0 = 0;
- gWeatherPtr->unknown_6F2++;
- }
- switch (gWeatherPtr->unknown_6CE)
- {
- case 0:
- sub_807DBA4(0, 16, 3);
- gWeatherPtr->unknown_6CE++;
- break;
- case 1:
- if (!sub_807DBE8())
- break;
- gWeatherPtr->unknown_6CE++;
- break;
- case 2:
- sub_807F7A4();
- gWeatherPtr->unknown_6CE++;
- break;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-void sub_807F688(struct Sprite *sprite)
-{
- sprite->pos2.y = (u8)gSpriteCoordOffsetY;
- sprite->pos1.x = gWeatherPtr->unknown_6EE + 32 + sprite->data[0] * 64;
- if (sprite->pos1.x > 0x10F)
- {
- sprite->pos1.x = 480 + gWeatherPtr->unknown_6EE - (4 - sprite->data[0]) * 64;
- sprite->pos1.x &= 0x1FF;
- }
-}
diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c
new file mode 100644
index 000000000..b1dca6396
--- /dev/null
+++ b/src/field/field_weather_effects.c
@@ -0,0 +1,2383 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "field_weather.h"
+#include "overworld.h"
+#include "random.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+extern struct Weather *const gWeatherPtr;
+
+const u16 gUnknown_08397108[] = INCBIN_U16("graphics/weather/1.gbapal");
+const u16 gUnknown_08397128[] = INCBIN_U16("graphics/weather/2.gbapal");
+const u8 gWeatherFog2Tiles[] = INCBIN_U8("graphics/weather/fog2.4bpp");
+const u8 gWeatherFog1Tiles[] = INCBIN_U8("graphics/weather/fog1.4bpp");
+const u8 gWeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp");
+const u8 gWeatherSnow1Tiles[] = INCBIN_U8("graphics/weather/snow0.4bpp");
+const u8 gWeatherSnow2Tiles[] = INCBIN_U8("graphics/weather/snow1.4bpp");
+const u8 gWeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp");
+const u8 gWeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp");
+const u8 gWeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp");
+const u8 gWeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp");
+
+static const struct Coords16 gUnknown_0839A9C8[] =
+{
+ { 0, 66},
+ { 5, 73},
+ {10, 78},
+};
+
+static const struct SpriteSheet sCloudSpriteSheet = {gWeatherCloudTiles, sizeof(gWeatherCloudTiles), 0x1200};
+
+static const struct OamData gOamData_839A9DC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839A9E4[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839A9EC[] =
+{
+ gSpriteAnim_839A9E4,
+};
+
+void sub_807E0F4(struct Sprite *);
+static const struct SpriteTemplate sCloudSpriteTemplate =
+{
+ .tileTag = 4608,
+ .paletteTag = 4609,
+ .oam = &gOamData_839A9DC,
+ .anims = gSpriteAnimTable_839A9EC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E0F4,
+};
+
+extern void sub_807D5BC(s8 a);
+extern void sub_807D8C0(const u16 *palette);
+extern void sub_807D9A8(void);
+extern bool8 sub_807D9C8(void);
+extern void sub_807DA14(void);
+extern void sub_807DA4C(void);
+extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c);
+extern bool8 Weather_UpdateBlend(void);
+extern void SetRainStrengthFromSoundEffect(u16 sndEff);
+extern void sub_807D5F0(u8 a, u8 b, u8 c);
+
+//------------------------------------------------------------------------------
+// Clouds
+//------------------------------------------------------------------------------
+
+void Clouds_InitVars(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->initStep = 0;
+ if (gWeatherPtr->cloudSpritesCreated == FALSE)
+ Weather_SetBlendCoeffs(0, 16);
+}
+
+void Clouds_Main(void);
+
+void Clouds_InitAll(void)
+{
+ Clouds_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Clouds_Main();
+}
+
+void CreateCloudSprites(void);
+
+void Clouds_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateCloudSprites();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(12, 8, 1);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (Weather_UpdateBlend())
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+void sub_807E0A0(void);
+
+bool8 Clouds_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ return TRUE;
+ case 1:
+ if (Weather_UpdateBlend())
+ {
+ sub_807E0A0();
+ gWeatherPtr->finishStep++;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//------------------------------------------------------------------------------
+// Weather 2
+//------------------------------------------------------------------------------
+
+void Weather2_InitVars(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+}
+
+void Weather2_InitAll(void)
+{
+ Weather2_InitVars();
+}
+
+void Weather2_Main(void)
+{
+}
+
+int Weather2_Finish(void)
+{
+ return 0;
+}
+
+void CreateCloudSprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->cloudSpritesCreated == TRUE)
+ return;
+ LoadSpriteSheet(&sCloudSpriteSheet);
+ sub_807D8C0(gUnknown_08397108);
+ for (i = 0; i < 3; i++)
+ {
+ u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF);
+
+ if (spriteId != 64)
+ {
+ struct Sprite *sprite;
+
+ gWeatherPtr->sprites.s1.cloudSprites[i] = &gSprites[spriteId];
+ sprite = gWeatherPtr->sprites.s1.cloudSprites[i];
+ sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s1.cloudSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->cloudSpritesCreated = TRUE;
+}
+
+void sub_807E0A0(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->cloudSpritesCreated == FALSE)
+ return;
+ for (i = 0; i < 3; i++)
+ {
+ if (gWeatherPtr->sprites.s1.cloudSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1200);
+ gWeatherPtr->cloudSpritesCreated = FALSE;
+}
+
+void sub_807E0F4(struct Sprite *sprite)
+{
+ sprite->data[0] = (sprite->data[0] + 1) & 1;
+ if (sprite->data[0] != 0)
+ sprite->pos1.x--;
+}
+
+//------------------------------------------------------------------------------
+// Drought
+//------------------------------------------------------------------------------
+
+void Drought_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 0;
+}
+
+void Drought_Main(void);
+
+void Drought_InitAll(void)
+{
+ Drought_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Drought_Main();
+}
+
+void Drought_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ if (gWeatherPtr->unknown_6C6 != 0)
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ sub_807D9A8();
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807D9C8() == FALSE)
+ gWeatherPtr->initStep++;
+ break;
+ case 3:
+ sub_807DA14();
+ gWeatherPtr->initStep++;
+ break;
+ case 4:
+ sub_807DA4C();
+ if (gWeatherPtr->unknown_73C == 6)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ default:
+ sub_807DA4C();
+ break;
+ }
+}
+
+int Drought_Finish(void)
+{
+ return 0;
+}
+
+void task50_0807B6D4(u8);
+
+void sub_807E25C(void)
+{
+ CreateTask(task50_0807B6D4, 0x50);
+}
+
+#define tState data[0]
+#define tBlendY data[1]
+#define tBlendDelay data[2]
+#define tWinRange data[3]
+
+void task50_0807B6D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->tState)
+ {
+ case 0:
+ task->tBlendY = 0;
+ task->tBlendDelay = 0;
+ task->tWinRange = REG_WININ;
+ REG_WININ = WIN_RANGE(63, 63);
+ REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ
+ | BLDCNT_EFFECT_LIGHTEN;
+ REG_BLDY = 0;
+ task->tState++;
+ // fall through
+ case 1:
+ task->tBlendY += 3;
+ if (task->tBlendY > 16)
+ task->tBlendY = 16;
+ REG_BLDY = task->tBlendY;
+ if (task->tBlendY >= 16)
+ task->tState++;
+ break;
+ case 2:
+ task->tBlendDelay++;
+ if (task->tBlendDelay > 9)
+ {
+ task->tBlendDelay = 0;
+ task->tBlendY--;
+ if (task->tBlendY <= 0)
+ {
+ task->tBlendY = 0;
+ task->tState++;
+ }
+ REG_BLDY = task->tBlendY;
+ }
+ break;
+ case 3:
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ REG_WININ = task->tWinRange;
+ task->tState++;
+ break;
+ case 4:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+#undef tState
+#undef tBlendY
+#undef tBlendDelay
+#undef tWinRange
+
+//------------------------------------------------------------------------------
+// Light Rain
+//------------------------------------------------------------------------------
+
+void LightRain_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 8;
+ gWeatherPtr->unknown_6DC = 0;
+ gWeatherPtr->unknown_6D9 = 10;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ SetRainStrengthFromSoundEffect(SE_T_KOAME);
+}
+
+void LightRain_Main(void);
+
+void LightRain_InitAll(void)
+{
+ LightRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ LightRain_Main();
+}
+
+void LoadRainSpriteSheet(void);
+u8 CreateRainSprite(void);
+u8 sub_807E8E8(void);
+
+void LightRain_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (CreateRainSprite() == 0)
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807E8E8() == FALSE)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+void DestroyRainSprites(void);
+
+bool8 LightRain_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
+ {
+ gWeatherPtr->finishStep = 0xFF;
+ return FALSE;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->finishStep++;
+ }
+ // fall through
+ case 1:
+ if (sub_807E8E8() == FALSE)
+ {
+ DestroyRainSprites();
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+// defined below
+extern const s16 gUnknown_0839AABC[][2];
+extern const u16 gUnknown_0839AAC4[][2];
+
+void sub_807E4EC(struct Sprite *sprite)
+{
+ u32 randVal;
+ u16 r6;
+ s32 r4;
+ s32 r0;
+
+ if (sprite->data[1] == 0)
+ sprite->data[1] = 361;
+ randVal = sprite->data[1] * 1103515245 + 12345;
+ sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600;
+
+ r6 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+
+ r4 = sprite->data[1] % 30;
+ sprite->data[2] = r4 * 8; // useless assignment
+
+ r0 = sprite->data[1] / 30;
+ sprite->data[3] = r0 * 8; // useless assignment
+
+ sprite->data[2] = r4;
+ sprite->data[2] <<= 7;
+
+ sprite->data[3] = r0;
+ sprite->data[3] <<= 7;
+
+ sprite->data[2] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0] * r6;
+ sprite->data[3] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1] * r6;
+
+ StartSpriteAnim(sprite, 0);
+ sprite->data[4] = 0;
+ sprite->coordOffsetEnabled = FALSE;
+ sprite->data[0] = r6;
+}
+
+void sub_807E5C0(struct Sprite *sprite)
+{
+ if (sprite->data[4] == 0)
+ {
+ sprite->data[2] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0];
+ sprite->data[3] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ sprite->pos1.y = sprite->data[3] >> 4;
+
+ if (sprite->data[5] != 0
+ && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248)
+ && sprite->pos1.y >= -16 && sprite->pos1.y <= 176)
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+
+ sprite->data[0]--;
+ if (sprite->data[0] == 0)
+ {
+ StartSpriteAnim(sprite, gWeatherPtr->unknown_6DC + 1);
+ sprite->data[4] = 1;
+ sprite->pos1.x -= gSpriteCoordOffsetX;
+ sprite->pos1.y -= gSpriteCoordOffsetY;
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ }
+ else if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sub_807E4EC(sprite);
+ }
+}
+
+void sub_807E6C4(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_807E4EC(sprite);
+ sprite->callback = sub_807E5C0;
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+void sub_807E6F0(struct Sprite *sprite, u16 b)
+{
+ u16 r8 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+ u16 r6 = b / (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+ u16 r4 = b % (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+
+ while (--r6 != 0xFFFF)
+ sub_807E4EC(sprite);
+ if (r4 < r8)
+ {
+ while (--r4 != 0xFFFF)
+ sub_807E5C0(sprite);
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[0] = r4 - r8;
+ sprite->invisible = TRUE;
+ sprite->data[6] = 1;
+ }
+}
+
+extern const struct SpriteSheet sRainSpriteSheet; // defined below
+
+void LoadRainSpriteSheet(void)
+{
+ LoadSpriteSheet(&sRainSpriteSheet);
+}
+
+static const struct Coords16 sRainSpriteCoords[] =
+{
+ { 0, 0},
+ { 0, 160},
+ { 0, 64},
+ {144, 224},
+ {144, 128},
+ { 32, 32},
+ { 32, 192},
+ { 32, 96},
+ { 72, 128},
+ { 72, 32},
+ { 72, 192},
+ {216, 96},
+ {216, 0},
+ {104, 160},
+ {104, 64},
+ {104, 224},
+ {144, 0},
+ {144, 160},
+ {144, 64},
+ { 32, 224},
+ { 32, 128},
+ { 72, 32},
+ { 72, 192},
+ { 48, 96},
+};
+
+static const struct OamData gOamData_839AA68 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 2,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839AA70[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gSpriteAnim_839AA78[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(40, 2),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AA88[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AA98[] =
+{
+ gSpriteAnim_839AA70,
+ gSpriteAnim_839AA78,
+ gSpriteAnim_839AA88,
+};
+
+static const struct SpriteTemplate sRainSpriteTemplate =
+{
+ .tileTag = 4614,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AA68,
+ .anims = gSpriteAnimTable_839AA98,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E5C0,
+};
+
+
+const s16 gUnknown_0839AABC[][2] =
+{
+ {-104, 208},
+ {-160, 320},
+};
+
+const u16 gUnknown_0839AAC4[][2] =
+{
+ {18, 7},
+ {12, 10},
+};
+
+static const struct SpriteSheet sRainSpriteSheet = {gWeatherRainTiles, sizeof(gWeatherRainTiles), 0x1206};
+
+static const struct OamData gOamData_839AAD4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_839AADC[] =
+{
+ {gWeatherSnow1Tiles, sizeof(gWeatherSnow1Tiles)},
+ {gWeatherSnow2Tiles, sizeof(gWeatherSnow2Tiles)},
+};
+
+static const union AnimCmd gSpriteAnim_839AAEC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AAF4[] =
+{
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AAFC[] =
+{
+ gSpriteAnim_839AAEC,
+ gSpriteAnim_839AAF4,
+};
+
+void sub_807ED48(struct Sprite *);
+static const struct SpriteTemplate sSnowflakeSpriteTemplate =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AAD4,
+ .anims = gSpriteAnimTable_839AAFC,
+ .images = gSpriteImageTable_839AADC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807ED48,
+};
+
+// unused data
+static const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300};
+
+static const struct OamData gOamData_839AB2C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839AB34[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB3C[] =
+{
+ ANIMCMD_FRAME(32, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB44[] =
+{
+ ANIMCMD_FRAME(64, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB4C[] =
+{
+ ANIMCMD_FRAME(96, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB54[] =
+{
+ ANIMCMD_FRAME(128, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB5C[] =
+{
+ ANIMCMD_FRAME(160, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AB64[] =
+{
+ gSpriteAnim_839AB34,
+ gSpriteAnim_839AB3C,
+ gSpriteAnim_839AB44,
+ gSpriteAnim_839AB4C,
+ gSpriteAnim_839AB54,
+ gSpriteAnim_839AB5C,
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] =
+{
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] =
+{
+ gSpriteAffineAnim_839AB7C,
+};
+
+static void Fog1SpriteCallback(struct Sprite *);
+static const struct SpriteTemplate sFog1SpriteTemplate =
+{
+ .tileTag = 4609,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AB2C,
+ .anims = gSpriteAnimTable_839AB64,
+ .images = NULL,
+ .affineAnims = gSpriteAffineAnimTable_839AB8C,
+ .callback = Fog1SpriteCallback,
+};
+
+bool8 CreateRainSprite(void)
+{
+ u8 spriteNum;
+ u8 spriteId;
+
+ if (gWeatherPtr->rainSpriteCount == 24)
+ return FALSE;
+
+ spriteNum = gWeatherPtr->rainSpriteCount;
+ spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate,
+ sRainSpriteCoords[spriteNum].x, sRainSpriteCoords[spriteNum].y, 78);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].data[5] = 0;
+ gSprites[spriteId].data[1] = spriteNum * 145;
+ while (gSprites[spriteId].data[1] >= 600)
+ gSprites[spriteId].data[1] -= 600;
+ sub_807E4EC(&gSprites[spriteId]);
+ sub_807E6F0(&gSprites[spriteId], spriteNum * 9);
+ gSprites[spriteId].invisible = TRUE;
+ gWeatherPtr->sprites.s1.rainSprites[spriteNum] = &gSprites[spriteId];
+ }
+ else
+ {
+ gWeatherPtr->sprites.s1.rainSprites[spriteNum] = NULL;
+ }
+
+ if (++gWeatherPtr->rainSpriteCount == 24)
+ {
+ u16 i;
+
+ for (i = 0; i < 24; i++)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i]->data[6] == 0)
+ gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E5C0;
+ else
+ gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E6C4;
+ }
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_807E8E8(void)
+{
+ if (gWeatherPtr->unknown_6D8 == gWeatherPtr->unknown_6D9)
+ return FALSE;
+
+ if (++gWeatherPtr->unknown_6D6 > gWeatherPtr->unknown_6DB)
+ {
+ gWeatherPtr->unknown_6D6 = 0;
+ if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9)
+ {
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8++]->data[5] = 1;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D8--;
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->data[5] = 0;
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->invisible = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+void DestroyRainSprites(void)
+{
+ u16 i;
+
+ for (i = 0; i < gWeatherPtr->rainSpriteCount; i++)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]);
+ }
+ gWeatherPtr->rainSpriteCount = 0;
+ FreeSpriteTilesByTag(0x1206);
+}
+
+//------------------------------------------------------------------------------
+// Snow
+//------------------------------------------------------------------------------
+
+void Snow_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6E5 = 16;
+ gWeatherPtr->unknown_6E0 = 0;
+}
+
+void Snow_Main(void);
+void sub_807ED48(struct Sprite *);
+
+void Snow_InitAll(void)
+{
+ Snow_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ {
+ u16 i;
+
+ Snow_Main();
+ for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++)
+ {
+ sub_807ED48(gWeatherPtr->sprites.s1.snowflakeSprites[i]);
+ }
+ }
+}
+
+u8 snowflakes_progress(void);
+
+void Snow_Main(void)
+{
+ if (gWeatherPtr->initStep == 0 && snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+}
+
+bool8 Snow_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ gWeatherPtr->unknown_6E5 = 0;
+ gWeatherPtr->unknown_6E0 = 0;
+ gWeatherPtr->finishStep++;
+ // fall through
+ case 1:
+ if (snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 CreateSnowflakeSprite(void);
+bool8 RemoveSnowflakeSprite(void);
+
+bool8 snowflakes_progress(void)
+{
+ if (gWeatherPtr->snowflakeSpriteCount == gWeatherPtr->unknown_6E5)
+ return FALSE;
+
+ gWeatherPtr->unknown_6E0++;
+ if (gWeatherPtr->unknown_6E0 > 36)
+ {
+ gWeatherPtr->unknown_6E0 = 0;
+ if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->unknown_6E5)
+ CreateSnowflakeSprite();
+ else
+ RemoveSnowflakeSprite();
+ }
+ return (gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->unknown_6E5);
+}
+
+void sub_807EC40(struct Sprite *);
+
+bool8 CreateSnowflakeSprite(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78);
+
+ if (spriteId == 64)
+ return FALSE;
+ gSprites[spriteId].data[4] = gWeatherPtr->snowflakeSpriteCount;
+ sub_807EC40(&gSprites[spriteId]);
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gWeatherPtr->sprites.s1.snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId];
+ return TRUE;
+}
+
+bool8 RemoveSnowflakeSprite(void)
+{
+ if (gWeatherPtr->snowflakeSpriteCount != 0)
+ {
+ DestroySprite(gWeatherPtr->sprites.s1.snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807EC40(struct Sprite *sprite)
+{
+ u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30);
+ u16 r6;
+
+ sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->pos2.x = 0;
+ r6 = Random();
+ sprite->data[1] = (r6 & 3) * 5 + 64;
+ sprite->data[7] = (r6 & 3) * 5 + 64;
+ StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
+ sprite->data[3] = 0;
+ sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1;
+ sprite->data[6] = (r6 & 0x1F) + 210;
+ sprite->data[5] = 0;
+}
+
+void sub_807ECEC(struct Sprite *sprite)
+{
+ if (gWeatherPtr->unknown_6E2 > 18)
+ {
+ sprite->invisible = FALSE;
+ sprite->callback = sub_807ED48;
+ sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ gWeatherPtr->unknown_6E2 = 0;
+ }
+}
+
+void sub_807ED48(struct Sprite *sprite)
+{
+ s16 r3;
+ s16 r2;
+
+ sprite->data[0] += sprite->data[1];
+ sprite->pos1.y = sprite->data[0] >> 7;
+ sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF;
+ sprite->pos2.x = gSineTable[sprite->data[3]] / 64;
+
+ r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;
+ if (r3 & 0x100)
+ r3 = -0x100 | r3; // hmm... what is this?
+ if (r3 < -3)
+ sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ else if (r3 > 242)
+ sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+
+ r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF;
+ if (r2 > 163 && r2 < 171)
+ {
+ sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ }
+ else if (r2 > 242 && r2 < 250)
+ {
+ sprite->pos1.y = 163;
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+
+ sprite->data[5]++;
+ if (sprite->data[5] == sprite->data[6])
+ {
+ sub_807EC40(sprite);
+ sprite->pos1.y = 250;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Medium Rain
+//------------------------------------------------------------------------------
+
+void MedRain_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 4;
+ gWeatherPtr->unknown_6DC = 0;
+ gWeatherPtr->unknown_6D9 = 16;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
+ gWeatherPtr->unknown_6ED = 0;
+ SetRainStrengthFromSoundEffect(SE_T_AME);
+}
+
+void Rain_Main(void);
+
+void MedRain_InitAll(void)
+{
+ MedRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
+}
+
+//------------------------------------------------------------------------------
+// Heavy Rain
+//------------------------------------------------------------------------------
+
+void HeavyRain_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 4;
+ gWeatherPtr->unknown_6DC = 1;
+ gWeatherPtr->unknown_6D9 = 24;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
+ SetRainStrengthFromSoundEffect(SE_T_OOAME);
+}
+
+void HeavyRain_InitAll(void)
+{
+ HeavyRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
+}
+
+void UpdateThunderSound(void);
+void SetThunderCounter(u16);
+
+void Rain_Main(void)
+{
+ UpdateThunderSound();
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (CreateRainSprite())
+ break;
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ case 3:
+ if (gWeatherPtr->unknown_6C6 == 0)
+ break;
+ gWeatherPtr->initStep = 6;
+ break;
+ case 4:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6E6 = (Random() % 360) + 360;
+ gWeatherPtr->initStep++;
+ // fall through
+ case 5:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->initStep++;
+ break;
+ case 6:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6EB = Random() % 2;
+ gWeatherPtr->initStep++;
+ break;
+ case 7:
+ gWeatherPtr->unknown_6EC = (Random() & 1) + 1;
+ gWeatherPtr->initStep++;
+ // fall through
+ case 8:
+ sub_807D5BC(19);
+ if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1)
+ SetThunderCounter(20);
+ gWeatherPtr->unknown_6E6 = (Random() % 3) + 6;
+ gWeatherPtr->initStep++;
+ break;
+ case 9:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5BC(3);
+ gWeatherPtr->unknown_6EA = 1;
+ if (--gWeatherPtr->unknown_6EC != 0)
+ {
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->initStep = 10;
+ }
+ else if (gWeatherPtr->unknown_6EB == 0)
+ {
+ gWeatherPtr->initStep = 4;
+ }
+ else
+ {
+ gWeatherPtr->initStep = 11;
+ }
+ break;
+ case 10:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->initStep = 8;
+ break;
+ case 11:
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->initStep++;
+ break;
+ case 12:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ SetThunderCounter(100);
+ sub_807D5BC(19);
+ // Why use "% 16" everywhere else and "& 0xF" here. So dumb.
+ gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30;
+ gWeatherPtr->initStep++;
+ break;
+ case 13:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5F0(19, 3, 5);
+ gWeatherPtr->initStep++;
+ break;
+ case 14:
+ if (gWeatherPtr->unknown_6C6 != 3)
+ break;
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->initStep = 4;
+ break;
+ }
+}
+
+bool8 Rain_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ gWeatherPtr->unknown_6EA = 0;
+ gWeatherPtr->finishStep++;
+ // fall through
+ case 1:
+ Rain_Main();
+ if (gWeatherPtr->unknown_6EA != 0)
+ {
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
+ return FALSE;
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->finishStep++;
+ }
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ DestroyRainSprites();
+ gWeatherPtr->unknown_6ED = 0;
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void SetThunderCounter(u16 max)
+{
+ if (gWeatherPtr->unknown_6ED == 0)
+ {
+ gWeatherPtr->thunderCounter = Random() % max;
+ gWeatherPtr->unknown_6ED = 1;
+ }
+}
+
+void UpdateThunderSound(void)
+{
+ if (gWeatherPtr->unknown_6ED == 1)
+ {
+ if (gWeatherPtr->thunderCounter == 0)
+ {
+ if (IsSEPlaying())
+ return;
+ if (Random() & 1)
+ PlaySE(SE_T_KAMI);
+ else
+ PlaySE(SE_T_KAMI2);
+ gWeatherPtr->unknown_6ED = 0;
+ }
+ else
+ {
+ gWeatherPtr->thunderCounter--;
+ }
+ }
+}
+
+//------------------------------------------------------------------------------
+// Fog 1
+//------------------------------------------------------------------------------
+
+void Fog1_Main(void);
+static void CreateFog1Sprites(void);
+static void DestroyFog1Sprites(void);
+
+void Fog1_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ if (gWeatherPtr->fog1SpritesCreated == 0)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2 = 0;
+ gWeatherPtr->fog1ScrollPosX = 0;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Fog1_InitAll(void)
+{
+ Fog1_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Fog1_Main();
+}
+
+void Fog1_Main(void)
+{
+ gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateFog1Sprites();
+ if (gWeatherPtr->currWeather == WEATHER_FOG_1)
+ Weather_SetTargetBlendCoeffs(12, 8, 3);
+ else
+ Weather_SetTargetBlendCoeffs(4, 16, 0);
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (Weather_UpdateBlend())
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+bool8 Fog1_Finish(void)
+{
+ gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 3);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ DestroyFog1Sprites();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+#define sprColumn data[0]
+
+static void Fog1SpriteCallback(struct Sprite *sprite)
+{
+ sprite->pos2.y = (u8)gSpriteCoordOffsetY;
+ sprite->pos1.x = gWeatherPtr->fog1ScrollPosX + 32 + sprite->sprColumn * 64;
+ if (sprite->pos1.x > 0x10F)
+ {
+ sprite->pos1.x = 480 + gWeatherPtr->fog1ScrollPosX - (4 - sprite->sprColumn) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+static void CreateFog1Sprites(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->fog1SpritesCreated)
+ {
+ struct SpriteSheet fog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 0x1201};
+
+ LoadSpriteSheet(&fog1SpriteSheet);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sFog1SpriteTemplate, 0, 0, 0xFF);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->sprColumn = i % 5;
+ sprite->pos1.x = (i % 5) * 64 + 32;
+ sprite->pos1.y = (i / 5) * 64 + 32;
+ gWeatherPtr->sprites.s2.fog1Sprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.fog1Sprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->fog1SpritesCreated = TRUE;
+ }
+}
+
+#undef sprColumn
+
+static void DestroyFog1Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->fog1SpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.fog1Sprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.fog1Sprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1201);
+ gWeatherPtr->fog1SpritesCreated = 0;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Volcanic ash
+//------------------------------------------------------------------------------
+
+void Ash_Main(void);
+void LoadAshSpriteSheet(void);
+void CreateAshSprites(void);
+void DestroyAshSprites(void);
+
+void Ash_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6FE = 20;
+ if (!gWeatherPtr->ashSpritesCreated)
+ {
+ Weather_SetBlendCoeffs(0, 16);
+ REG_BLDALPHA = BLDALPHA_BLEND(64, 63); // Those aren't even valid coefficients!
+ }
+}
+
+void Ash_InitAll(void)
+{
+ Ash_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Ash_Main();
+}
+
+void Ash_Main(void)
+{
+ gWeatherPtr->unknown_6FC = gSpriteCoordOffsetX & 0x1FF;
+ while (gWeatherPtr->unknown_6FC > 0xEF)
+ gWeatherPtr->unknown_6FC -= 0xF0;
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadAshSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (!gWeatherPtr->ashSpritesCreated)
+ CreateAshSprites();
+ Weather_SetTargetBlendCoeffs(16, 0, 1);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ default:
+ Weather_UpdateBlend();
+ break;
+ }
+}
+
+bool8 Ash_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ DestroyAshSprites();
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ REG_BLDALPHA = 0;
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static const struct SpriteSheet sAshSpriteSheet = {gWeatherAshTiles, sizeof(gWeatherAshTiles), 0x1202};
+
+void LoadAshSpriteSheet(void)
+{
+ LoadSpriteSheet(&sAshSpriteSheet);
+}
+
+const struct OamData gOamData_839ABB8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 15,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839ABC0[] =
+{
+ ANIMCMD_FRAME(0, 60),
+ ANIMCMD_FRAME(64, 60),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gSpriteAnimTable_839ABCC[] =
+{
+ gSpriteAnim_839ABC0,
+};
+
+void sub_807FAA8(struct Sprite *);
+static const struct SpriteTemplate sAshSpriteTemplate =
+{
+ .tileTag = 4610,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABB8,
+ .anims = gSpriteAnimTable_839ABCC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807FAA8,
+};
+
+void CreateAshSprites(void)
+{
+ u8 i;
+
+ if (!gWeatherPtr->ashSpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sAshSpriteTemplate, 0, 0, 0x4E);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->data[1] = 0;
+ sprite->data[2] = (u8)(i % 5);
+ sprite->data[3] = (u8)(i / 5);
+ sprite->data[0] = sprite->data[3] * 64 + 32;
+ gWeatherPtr->sprites.s2.ashSprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->ashSpritesCreated = TRUE;
+ }
+}
+
+void DestroyAshSprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->ashSpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1202);
+ gWeatherPtr->ashSpritesCreated = FALSE;
+ }
+}
+
+void sub_807FAA8(struct Sprite *sprite)
+{
+ sprite->data[1]++;
+ if (sprite->data[1] > 5)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ sprite->pos1.y = gSpriteCoordOffsetY + sprite->data[0];
+ sprite->pos1.x = gWeatherPtr->unknown_6FC + 32 + sprite->data[2] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_6FC + 0x1E0 - (4 - sprite->data[2]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Fog 2
+//------------------------------------------------------------------------------
+
+void Fog2_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2 = 1;
+ if (gWeatherPtr->fog2SpritesCreated == 0)
+ {
+ gWeatherPtr->unknown_71C = 0;
+ gWeatherPtr->unknown_71E = 0;
+ gWeatherPtr->unknown_720 = 0;
+ gWeatherPtr->unknown_722 = 0;
+ gWeatherPtr->unknown_718 = 0;
+ gWeatherPtr->unknown_71A = 0;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Fog2_Main(void);
+
+void Fog2_InitAll(void)
+{
+ Fog2_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Fog2_Main();
+}
+
+void sub_807FC9C(void);
+void CreateFog2Sprites(void);
+
+void Fog2_Main(void)
+{
+ sub_807FC9C();
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateFog2Sprites();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(12, 8, 8);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ }
+}
+
+void DestroyFog2Sprites(void);
+
+bool8 Fog2_Finish(void)
+{
+ sub_807FC9C();
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ DestroyFog2Sprites();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_807FC9C(void)
+{
+ if (++gWeatherPtr->unknown_71C > 2)
+ {
+ gWeatherPtr->unknown_720++;
+ gWeatherPtr->unknown_71C = 0;
+ }
+
+ if (++gWeatherPtr->unknown_71E > 4)
+ {
+ gWeatherPtr->unknown_722++;
+ gWeatherPtr->unknown_71E = 0;
+ }
+
+ gWeatherPtr->unknown_718 = (gSpriteCoordOffsetX - gWeatherPtr->unknown_720) & 0xFF;
+ gWeatherPtr->unknown_71A = gSpriteCoordOffsetY + gWeatherPtr->unknown_722;
+}
+
+extern const struct SpriteTemplate sFog2SpriteTemplate; // defined below
+
+void CreateFog2Sprites(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->fog2SpritesCreated)
+ {
+ struct SpriteSheet fog2SpriteSheet = {gWeatherFog2Tiles, sizeof(gWeatherFog2Tiles), 0x1203};
+
+ LoadSpriteSheet(&fog2SpriteSheet);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sFog2SpriteTemplate, 0, (i / 5) * 64, 0xFF);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->data[0] = i % 5;
+ sprite->data[1] = i / 5;
+ gWeatherPtr->sprites.s2.fog2Sprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.fog2Sprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->fog2SpritesCreated = TRUE;
+ }
+}
+
+const struct OamData gOamData_839ABF0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839ABF8[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AC00[] =
+{
+ gSpriteAnim_839ABF8,
+};
+
+void Fog2SpriteCallback(struct Sprite *);
+const struct SpriteTemplate sFog2SpriteTemplate =
+{
+ .tileTag = 4611,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABF0,
+ .anims = gSpriteAnimTable_839AC00,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = Fog2SpriteCallback,
+};
+
+void DestroyFog2Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->fog2SpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.fog2Sprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.fog2Sprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1203);
+ gWeatherPtr->fog2SpritesCreated = FALSE;
+ }
+}
+
+void Fog2SpriteCallback(struct Sprite *sprite)
+{
+ sprite->pos2.y = gWeatherPtr->unknown_71A;
+ sprite->pos1.x = gWeatherPtr->unknown_718 + 32 + sprite->data[0] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_718 + 0x1E0 - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Sandstorm
+//------------------------------------------------------------------------------
+
+void Sandstorm_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ if (gWeatherPtr->sandstormSprites1Created == 0)
+ {
+ gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0;
+ gWeatherPtr->unknown_712 = 8;
+ gWeatherPtr->unknown_714 = 0;
+ // Dead code. How does the compiler not optimize this out?
+ if (gWeatherPtr->unknown_712 > 0x5F)
+ gWeatherPtr->unknown_712 = 0x80 - gWeatherPtr->unknown_712;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Sandstorm_Main(void);
+
+void Sandstorm_InitAll(void)
+{
+ Sandstorm_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Sandstorm_Main();
+}
+
+void sub_808002C(void);
+void sub_8080064(void);
+void CreateSandstormSprites_1(void);
+void CreateSandstormSprites_2(void);
+
+void Sandstorm_Main(void)
+{
+ sub_8080064();
+ sub_808002C();
+ if (gWeatherPtr->unknown_712 > 0x5F)
+ gWeatherPtr->unknown_712 = 32;
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateSandstormSprites_1();
+ CreateSandstormSprites_2();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(16, 0, 0);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ }
+}
+
+void sub_80800E4(void);
+
+bool8 Sandstorm_Finish(void)
+{
+ sub_8080064();
+ sub_808002C();
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 0);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ sub_80800E4();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_808002C(void)
+{
+ if (gWeatherPtr->unknown_714++ > 4)
+ {
+ gWeatherPtr->unknown_712++;
+ gWeatherPtr->unknown_714 = 0;
+ }
+}
+
+void sub_8080064(void)
+{
+ gWeatherPtr->unknown_704 -= gSineTable[gWeatherPtr->unknown_712] * 4;
+ gWeatherPtr->unknown_708 -= gSineTable[gWeatherPtr->unknown_712];
+ gWeatherPtr->unknown_70E = (gSpriteCoordOffsetX + (gWeatherPtr->unknown_704 >> 8)) & 0xFF;
+ gWeatherPtr->unknown_710 = gSpriteCoordOffsetY + (gWeatherPtr->unknown_708 >> 8);
+}
+
+void sub_80800E4(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->sandstormSprites1Created)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.sandstormSprites1[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites1[i]);
+ }
+ gWeatherPtr->sandstormSprites1Created = FALSE;
+ FreeSpriteTilesByTag(0x1204);
+ }
+
+ if (gWeatherPtr->sandstormSprites2Created)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (gWeatherPtr->sprites.s2.sandstormSprites2[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites2[i]);
+ }
+ gWeatherPtr->sandstormSprites2Created = FALSE;
+ }
+}
+
+const struct OamData gOamData_839AC1C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839AC24[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AC2C[] =
+{
+ ANIMCMD_FRAME(64, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AC34[] =
+{
+ gSpriteAnim_839AC24,
+ gSpriteAnim_839AC2C,
+};
+
+void SandstormSpriteCallback1(struct Sprite *);
+const struct SpriteTemplate sSandstormSpriteTemplate =
+{
+ .tileTag = 4612,
+ .paletteTag = 4609,
+ .oam = &gOamData_839AC1C,
+ .anims = gSpriteAnimTable_839AC34,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SandstormSpriteCallback1,
+};
+
+static const struct SpriteSheet sSandstormSpriteSheet = {gWeatherSandstormTiles, sizeof(gWeatherSandstormTiles), 0x1204};
+
+void CreateSandstormSprites_1(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->sandstormSprites1Created)
+ {
+ LoadSpriteSheet(&sSandstormSpriteSheet);
+ sub_807D8C0(gUnknown_08397128);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites1[i] = &gSprites[spriteId];
+ gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[0] = i % 5;
+ gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[1] = i / 5;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites1[i] = NULL;
+ }
+ }
+ gWeatherPtr->sandstormSprites1Created = TRUE;
+ }
+}
+
+const u16 gUnknown_0839AC5C[] = {0, 120, 80, 160, 40, 0};
+
+void SandstormSpriteCallback2(struct Sprite *);
+
+void CreateSandstormSprites_2(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->sandstormSprites2Created)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, i * 48 + 0x18, 0xD0, 1);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites2[i] = &gSprites[spriteId];
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->oam.size = 2;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[1] = i * 51;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[0] = 8;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[2] = 0;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[4] = 0x6730;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[3] = gUnknown_0839AC5C[i];
+ StartSpriteAnim(gWeatherPtr->sprites.s2.sandstormSprites2[i], 1);
+ CalcCenterToCornerVec(gWeatherPtr->sprites.s2.sandstormSprites2[i], 0, 2, 0);
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->callback = SandstormSpriteCallback2;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites2[i] = NULL;
+ }
+ gWeatherPtr->sandstormSprites2Created = TRUE;
+ }
+ }
+}
+
+void SandstormSpriteCallback1(struct Sprite *sprite)
+{
+ sprite->pos2.y = gWeatherPtr->unknown_710;
+ sprite->pos1.x = gWeatherPtr->unknown_70E + 32 + sprite->data[0] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_70E + 0x1E0 - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+void SandstormSpriteCallback3(struct Sprite *);
+
+void SandstormSpriteCallback2(struct Sprite *sprite)
+{
+ if (--sprite->data[3] == -1)
+ sprite->callback = SandstormSpriteCallback3;
+}
+
+void SandstormSpriteCallback3(struct Sprite *sprite)
+{
+ u32 x;
+ u32 y;
+
+ if (--sprite->pos1.y < -48)
+ {
+ sprite->pos1.y = 208;
+ sprite->data[0] = 4;
+ }
+ x = sprite->data[0] * gSineTable[sprite->data[1]];
+ y = sprite->data[0] * gSineTable[sprite->data[1] + 64];
+ sprite->pos2.x = x >> 8;
+ sprite->pos2.y = y >> 8;
+ sprite->data[1] = (sprite->data[1] + 10) & 0xFF;
+ if (++sprite->data[2] > 8)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Weather 11
+//------------------------------------------------------------------------------
+
+void Weather11_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+}
+
+void Weather11_InitAll(void)
+{
+ Weather11_InitVars();
+}
+
+void Weather11_Main(void)
+{
+}
+
+bool8 Weather11_Finish(void)
+{
+ return FALSE;
+}
+
+//------------------------------------------------------------------------------
+// Weather 14
+//------------------------------------------------------------------------------
+
+const u8 gUnknown_0839AC68[] = {40, 90, 60, 90, 2, 60, 40, 30};
+
+const struct SpriteSheet gWeatherBubbleSpriteSheet = {gWeatherBubbleTiles, sizeof(gWeatherBubbleTiles), 0x1205};
+
+void Bubbles_InitVars(void)
+{
+ Fog1_InitVars();
+ if (gWeatherPtr->unknown_72E == 0)
+ {
+ LoadSpriteSheet(&gWeatherBubbleSpriteSheet);
+ gWeatherPtr->unknown_728 = 0;
+ gWeatherPtr->unknown_726 = gUnknown_0839AC68[0];
+ gWeatherPtr->unknown_72A = 0;
+ gWeatherPtr->unknown_72C = 0;
+ }
+}
+
+void Bubbles_Main(void);
+
+void Bubbles_InitAll(void)
+{
+ Bubbles_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Bubbles_Main();
+}
+
+void sub_8080588(u16);
+
+void Bubbles_Main(void)
+{
+ Fog1_Main();
+ if (++gWeatherPtr->unknown_726 > gUnknown_0839AC68[gWeatherPtr->unknown_728])
+ {
+ gWeatherPtr->unknown_726 = 0;
+ if (++gWeatherPtr->unknown_728 > 7)
+ gWeatherPtr->unknown_728 = 0;
+ sub_8080588(gWeatherPtr->unknown_72A);
+ if (++gWeatherPtr->unknown_72A > 12)
+ gWeatherPtr->unknown_72A = 0;
+ }
+}
+
+void sub_8080610(void);
+
+bool8 Bubbles_Finish(void)
+{
+ if (!Fog1_Finish())
+ {
+ sub_8080610();
+ return FALSE;
+ }
+ return TRUE;
+}
+
+const s16 gUnknown_0839AC78[][2] =
+{
+ {120, 160},
+ {376, 160},
+ { 40, 140},
+ {296, 140},
+ {180, 130},
+ {436, 130},
+ { 60, 160},
+ {436, 160},
+ {220, 180},
+ {476, 180},
+ { 10, 90},
+ {266, 90},
+ {256, 160},
+};
+
+const union AnimCmd gSpriteAnim_839ACAC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839ACB8[] =
+{
+ gSpriteAnim_839ACAC,
+};
+
+extern const struct OamData gOamData_837DF24;
+
+void unc_0807DAB4(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839ACBC =
+{
+ .tileTag = 4613,
+ .paletteTag = 4608,
+ .oam = &gOamData_837DF24,
+ .anims = gSpriteAnimTable_839ACB8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = unc_0807DAB4,
+};
+
+void sub_8080588(u16 a)
+{
+ s16 x = gUnknown_0839AC78[a][0];
+ s16 y = gUnknown_0839AC78[a][1] - gSpriteCoordOffsetY;
+ u8 spriteId = CreateSpriteAtEnd(
+ &gSpriteTemplate_839ACBC,
+ x,
+ y,
+ 0);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].data[2] = 0;
+ gWeatherPtr->unknown_72C++;
+ }
+}
+
+void sub_8080610(void)
+{
+ u16 i;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (gSprites[i].template == &gSpriteTemplate_839ACBC)
+ DestroySprite(&gSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1205);
+}
+
+void unc_0807DAB4(struct Sprite *sprite)
+{
+ ++sprite->data[0];
+ if (++sprite->data[0] > 8) // double increment
+ {
+ sprite->data[0] = 0;
+ if (sprite->data[1] == 0)
+ {
+ if (++sprite->pos2.x > 4)
+ sprite->data[1] = 1;
+ }
+ else
+ {
+ if (--sprite->pos2.x <= 0)
+ sprite->data[1] = 0;
+ }
+ }
+ sprite->pos1.y -= 3;
+ if (++sprite->data[2] > 0x77)
+ DestroySprite(sprite);
+}
+
+//------------------------------------------------------------------------------
+
+u8 TranslateWeatherNum(u8);
+void UpdateRainCounter(u8, u8);
+
+void SetSav1Weather(u32 weather)
+{
+ u8 oldWeather = gSaveBlock1.weather;
+
+ gSaveBlock1.weather = TranslateWeatherNum(weather);
+ UpdateRainCounter(gSaveBlock1.weather, oldWeather);
+}
+
+u8 GetSav1Weather(void)
+{
+ return gSaveBlock1.weather;
+}
+
+void SetSav1WeatherFromCurrMapHeader(void)
+{
+ u8 oldWeather = gSaveBlock1.weather;
+
+ gSaveBlock1.weather = TranslateWeatherNum(gMapHeader.weather);
+ UpdateRainCounter(gSaveBlock1.weather, oldWeather);
+}
+
+void SetWeather(u32 weather)
+{
+ SetSav1Weather(weather);
+ DoWeatherEffect(GetSav1Weather());
+}
+
+void SetWeather_Unused(u32 weather)
+{
+ SetSav1Weather(weather);
+ sub_807C988(GetSav1Weather());
+}
+
+void DoCurrentWeather(void)
+{
+ DoWeatherEffect(GetSav1Weather());
+}
+
+void sub_8080750(void)
+{
+ sub_807C988(GetSav1Weather());
+}
+
+static const u8 sWeatherCycle1[] = {2, 3, 5, 3};
+static const u8 sWeatherCycle2[] = {2, 2, 3, 2};
+
+u8 TranslateWeatherNum(u8 weather)
+{
+ switch (weather)
+ {
+ case 0: return 0;
+ case 1: return 1;
+ case 2: return 2;
+ case 3: return 3;
+ case 4: return 4;
+ case 5: return 5;
+ case 6: return 6;
+ case 7: return 7;
+ case 8: return 8;
+ case 9: return 9;
+ case 10: return 10;
+ case 11: return 11;
+ case 12: return 12;
+ case 13: return 13;
+ case 14: return 14;
+ case 20: return sWeatherCycle1[gSaveBlock1.filler_2F];
+ case 21: return sWeatherCycle2[gSaveBlock1.filler_2F];
+ default: return 0;
+ }
+}
+
+void UpdateWeatherPerDay(u16 increment)
+{
+ u16 weatherStage = gSaveBlock1.filler_2F + increment;
+ weatherStage %= 4;
+ gSaveBlock1.filler_2F = weatherStage;
+}
+
+void UpdateRainCounter(u8 newWeather, u8 oldWeather)
+{
+ if (newWeather != oldWeather
+ && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED))
+ IncrementGameStat(0x28);
+}
diff --git a/src/field/lottery_corner.c b/src/field/lottery_corner.c
index c2c25b9ac..5f0ce2907 100644
--- a/src/field/lottery_corner.c
+++ b/src/field/lottery_corner.c
@@ -2,7 +2,7 @@
#include "lottery_corner.h"
#include "event_data.h"
#include "items.h"
-#include "rng.h"
+#include "random.h"
#include "species.h"
#include "string_util.h"
#include "text.h"
diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c
index 33bc39648..a27c54df7 100644
--- a/src/field/mauville_man.c
+++ b/src/field/mauville_man.c
@@ -7,7 +7,7 @@
#include "m4a.h"
#include "menu.h"
#include "overworld.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/field/overworld.c b/src/field/overworld.c
index 59aac5c33..ca59426fa 100644
--- a/src/field/overworld.c
+++ b/src/field/overworld.c
@@ -32,7 +32,7 @@
#include "new_game.h"
#include "palette.h"
#include "play_time.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
#include "rotating_gate.h"
#include "safari_zone.h"
@@ -602,7 +602,7 @@ void sub_80538F0(u8 mapGroup, u8 mapNum)
prev_quest_postbuffer_cursor_backup_reset();
sub_8082BD0(mapGroup, mapNum);
DoTimeBasedEvents();
- sub_80806E4();
+ SetSav1WeatherFromCurrMapHeader();
ChooseAmbientCrySpecies();
SetDefaultFlashLevel();
Overworld_ClearSavedMusic();
@@ -638,7 +638,7 @@ void sub_8053994(u32 a1)
sub_8082BD0(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
if (a1 != 1)
DoTimeBasedEvents();
- sub_80806E4();
+ SetSav1WeatherFromCurrMapHeader();
ChooseAmbientCrySpecies();
if (v2)
FlagClear(SYS_USE_FLASH);
@@ -1737,7 +1737,7 @@ void sub_8054D4C(u32 a1)
sub_805C7C4(0);
FieldEffectActiveListClear();
InitFieldMessageBox();
- sub_807C828();
+ StartWeather();
sub_8080750();
if (!a1)
SetUpFieldTasks();
diff --git a/src/field/party_menu.c b/src/field/party_menu.c
index a8620570b..bee64fb27 100644
--- a/src/field/party_menu.c
+++ b/src/field/party_menu.c
@@ -4292,7 +4292,7 @@ void sub_806F3FC(u8 taskId)
{
if (!gPaletteFade.active)
{
- sub_809D9F0(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8);
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8);
DestroyTask(taskId);
}
}
diff --git a/src/field/roamer.c b/src/field/roamer.c
index c45c87601..d8ea1ef52 100644
--- a/src/field/roamer.c
+++ b/src/field/roamer.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "roamer.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "species.h"
#ifdef SAPPHIRE
diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c
index 28584d4d0..e6305d9c4 100644
--- a/src/field/scrcmd.c
+++ b/src/field/scrcmd.c
@@ -30,7 +30,7 @@
#include "palette.h"
#include "party_menu.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rtc.h"
#include "script.h"
@@ -692,7 +692,7 @@ bool8 ScrCmd_setweather(struct ScriptContext *ctx)
bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
{
- sub_80806E4();
+ SetSav1WeatherFromCurrMapHeader();
return FALSE;
}
diff --git a/src/field/tv.c b/src/field/tv.c
index 29d012f28..e58adebc9 100644
--- a/src/field/tv.c
+++ b/src/field/tv.c
@@ -9,7 +9,7 @@
#include "field_message_box.h"
#include "field_camera.h"
#include "flags.h"
-#include "rng.h"
+#include "random.h"
#include "string_util.h"
#include "text.h"
#include "species.h"
@@ -30,7 +30,7 @@
#include "naming_screen.h"
#include "pokedex.h"
#include "region_map.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rtc.h"
#include "script_menu.h"
diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c
index 390898917..df0b12207 100644
--- a/src/field/wild_encounter.c
+++ b/src/field/wild_encounter.c
@@ -8,7 +8,7 @@
#include "map_constants.h"
#include "metatile_behavior.h"
#include "pokeblock.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
#include "overworld.h"
#include "safari_zone.h"
diff --git a/src/pokemon/learn_move.c b/src/pokemon/learn_move.c
index 55aac840f..730717965 100644
--- a/src/pokemon/learn_move.c
+++ b/src/pokemon/learn_move.c
@@ -4,8 +4,10 @@
#include "main.h"
#include "menu.h"
#include "menu_cursor.h"
+#include "learn_move.h"
#include "palette.h"
#include "pokemon.h"
+#include "pokemon_summary_screen.h"
#include "overworld.h"
#include "script.h"
#include "songs.h"
@@ -22,26 +24,11 @@ extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
extern u8 gTileBuffer[];
-struct ContestMove
-{
- u8 effect;
- u8 contestCategory:3;
- u8 comboStarterId;
- u8 comboMoves[4];
-};
-
-struct ContestEffect
-{
- u8 effectType;
- u8 appeal;
- u8 jam;
-};
-
extern const struct ContestMove gContestMoves[];
extern const struct ContestEffect gContestEffects[];
extern const struct WindowConfig gWindowConfig_81E6CE4;
extern const struct WindowConfig gWindowConfig_81E7240;
-extern const u8 *const gUnknown_083CADD4[];
+extern const u8 *const gContestEffectStrings[];
extern const u8 *const gMoveDescriptions[];
extern const u8 gTypeNames[][7];
extern const u8 *const gUnknown_083CAF70[];
@@ -50,7 +37,6 @@ extern const u8 *const gUnknown_083CAF70[];
extern const u8 deuOtherText_ForgotAndLearned[];
#endif
-extern void sub_809D9F0(struct Pokemon *, u8, u8, void *, u32);
struct LearnMoveStruct
{
@@ -557,7 +543,7 @@ void LearnMoveMain(void)
case 20:
if (!gPaletteFade.active)
{
- sub_809D9F0(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]);
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]);
sLearnMoveStruct->state = 28;
}
break;
@@ -1039,7 +1025,7 @@ void sub_8133AEC(bool8 contestInfo, int unused)
gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = FALSE;
for (i = 0; i < 3; i++)
PrintMoveInfo(moveId, gUnknown_08402E24[gUnknown_08402E3D[i]]);
- sub_8072AB0(gUnknown_083CADD4[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1);
+ sub_8072AB0(gContestEffectStrings[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1);
}
else
{
diff --git a/src/pokemon/mon_markings.c b/src/pokemon/mon_markings.c
index 29e8c5127..e330fed65 100644
--- a/src/pokemon/mon_markings.c
+++ b/src/pokemon/mon_markings.c
@@ -45,11 +45,11 @@ extern const union AnimCmd *const gSpriteAnimTable_83E533C[];
static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL;
-void sub_80F761C(s16, s16, u16, u16);
-void nullsub_65(struct Sprite *);
-void sub_80F78CC(struct Sprite *);
-void sub_80F7908(struct Sprite *);
-struct Sprite *sub_80F7960(u16, u16, u16 *, u16);
+static void sub_80F761C(s16, s16, u16, u16);
+static void nullsub_65(struct Sprite *);
+static void sub_80F78CC(struct Sprite *);
+static void sub_80F7908(struct Sprite *);
+static struct Sprite *sub_80F7960(u16, u16, const u16 *, u16);
void sub_80F727C(struct PokemonMarkMenu *ptr)
{
@@ -335,21 +335,21 @@ void sub_80F7908(struct Sprite *sprite)
sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY;
}
-struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, u16 *palette)
+struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (!palette)
palette = gUnknown_083E49F4;
return sub_80F7960(tileTag, paletteTag, palette, 16);
}
-struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, u16 *palette)
+struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (!palette)
palette = gUnknown_083E49F4;
return sub_80F7960(tileTag, paletteTag, palette, 1);
}
-struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, u16 *palette, u16 size)
+struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
{
u8 spriteId;
struct SpriteTemplate sprTemplate;
diff --git a/src/pokemon/pokedex.c b/src/pokemon/pokedex.c
index cd37c3a93..604085b28 100644
--- a/src/pokemon/pokedex.c
+++ b/src/pokemon/pokedex.c
@@ -14,7 +14,7 @@
#include "pokedex_area_screen.h"
#include "pokedex_cry_screen.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c
index 750a9892a..d44a8b61e 100644
--- a/src/pokemon/pokemon_1.c
+++ b/src/pokemon/pokemon_1.c
@@ -3,7 +3,7 @@
#include "items.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "species.h"
#include "sprite.h"
diff --git a/src/pokemon/pokemon_2.c b/src/pokemon/pokemon_2.c
index 68923a16e..cedcc2720 100644
--- a/src/pokemon/pokemon_2.c
+++ b/src/pokemon/pokemon_2.c
@@ -4,7 +4,7 @@
#include "event_data.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom_8077ABC.h"
#include "species.h"
#include "sprite.h"
diff --git a/src/pokemon/pokemon_3.c b/src/pokemon/pokemon_3.c
index a8e824b33..40165384d 100644
--- a/src/pokemon/pokemon_3.c
+++ b/src/pokemon/pokemon_3.c
@@ -10,7 +10,7 @@
#include "m4a.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c
index 07d7e5322..ae9fcefea 100644
--- a/src/pokemon/pokemon_menu.c
+++ b/src/pokemon/pokemon_menu.c
@@ -350,7 +350,7 @@ static void sub_8089F44(u8 taskID)
u8 spriteID = gSprites[gTasks[taskID].data[3] >> 8].data[0];
DestroyTask(taskID);
ewram1B000_alt.unk262 = 1;
- ShowPokemonSummaryScreen(gPlayerParty, spriteID, gPlayerPartyCount - 1, sub_8089F14, 0);
+ ShowPokemonSummaryScreen(gPlayerParty, spriteID, gPlayerPartyCount - 1, sub_8089F14, PSS_MODE_NORMAL);
}
}
diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c
index 70b9b7d94..c0f643818 100644
--- a/src/pokemon/pokemon_summary_screen.c
+++ b/src/pokemon/pokemon_summary_screen.c
@@ -1,13 +1,3348 @@
#include "global.h"
-#include "pokemon_summary_screen.h"
+#include "battle.h"
+#include "data2.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "ewram.h"
+#include "item.h"
+#include "items.h"
+#include "learn_move.h"
#include "link.h"
+#include "m4a.h"
+#include "main.h"
#include "menu.h"
+#include "menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokeball.h"
#include "pokemon.h"
+#include "pokemon_summary_screen.h"
#include "region_map.h"
+#include "songs.h"
+#include "sound.h"
+#include "species.h"
+#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "strings2.h"
+#include "task.h"
#include "tv.h"
-#include "ewram.h"
+#include "unknown_task.h"
+
+static void sub_809FC0C(void);
+static void sub_809FEB8(void);
+static void sub_809F63C(struct Pokemon *);
+static void sub_809F650(struct Pokemon *);
+static void sub_809F664(struct Pokemon *);
+static void sub_809FE6C(struct Pokemon *);
+static void sub_80A0090(struct Pokemon *);
+static void sub_80A015C(struct Pokemon *);
+static void sub_809DE44(void);
+static void sub_809EB40(u8);
+static void sub_809EBC4(void);
+static void sub_809E044(void);
+static void sub_80A1D84(struct Pokemon *);
+static void sub_80A18C4(void);
+static bool8 LoadPokemonSummaryScreenGraphics(void);
+static bool8 MonKnowsMultipleMoves(struct Pokemon *);
+static void PrintSummaryWindowHeaderText(void);
+static void sub_80A1DCC(struct Pokemon *);
+static void sub_809FE80(void);
+static void sub_80A00A4(void);
+static void sub_80A0390(void);
+extern u8 sub_80A1808(struct Pokemon *);
+static void sub_80A1F98(s32, u8, u8, u8, u8, u16, s32);
+static void sub_80A0958(struct Pokemon *);
+static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *, u8, u8);
+static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *, u8, u8);
+static void sub_80A1EF8(const u8 *, u8, u8, u16, s32);
+static void sub_80A1F48(const u8 *, u8, u8, u8, u16);
+static void PrintHeldItemName(u16, u8, u8);
+static void PrintNumRibbons(struct Pokemon *);
+static void DrawExperienceProgressBar(struct Pokemon *, u8, u8);
+static void sub_809E13C(u8 taskId);
+static void sub_80A1950(void);
+static void sub_809DE64(void);
+static void SummaryScreenHandleAButton(u8);
+static void SummaryScreenHandleUpDownInput(u8, s8);
+static bool8 sub_809F7D0(u8);
+static void sub_809F9D0(u8, u8);
+static void sub_809EAC8(u8);
+static void sub_809E534(u8);
+static void sub_809E83C(u8, s8);
+static void sub_80A1B40(u8);
+static void sub_80A2078(int);
+static void sub_809E3FC(u8);
+static void SummaryScreenHandleKeyInput(u8);
+static void sub_80A1B1C(u8);
+static void sub_80A16CC(u8);
+static void sub_80A1A30(u8);
+static void DrawSummaryScreenNavigationDots(void);
+static void sub_80A00F4(u8);
+static void sub_80A029C(struct Pokemon *);
+static void sub_809FBE4(void);
+static void sub_80A1500(u8);
+static void sub_80A1334(u8);
+extern void sub_809F43C(u8);
+extern s8 sub_809F284(s8);
+extern s8 sub_809F3CC(s8);
+static bool8 sub_809F5F8(void);
+static void sub_80A1DE8(struct Pokemon *);
+static u8 sub_809F6B4(struct Pokemon *, u8 *);
+static void DrawPokerusSurvivorDot(struct Pokemon *);
+static void sub_80A12D0(s8);
+static void sub_809FAC8(struct Pokemon *);
+static void SummaryScreenHandleLeftRightInput(u8, s8);
+static void sub_809E8F0();
+static void sub_80A1654(s8, u8);
+static void sub_80A1488(s8, u8);
+static void sub_809FC34(struct Pokemon *);
+static void sub_809FF64(struct Pokemon *);
+static void sub_80A1918(u8, u8);
+static void sub_80A198C(u8, u8, u8, u8);
+static u16 GetMonMove(struct Pokemon *, u8);
+static void sub_80A04CC(u16);
+static void sub_80A057C(u16);
+static void sub_80A0498(u16);
+static void sub_80A046C(u16);
+static void sub_80A20A8(u8);
+static void sub_809F678(struct Pokemon *);
+static void sub_80A1BC0(struct Sprite *sprite);
+static void sub_80A1888(struct Sprite *);
+static void sub_80A0428(struct Pokemon *, u8 *);
+static void sub_80A18E4(u8);
+static u8 *sub_80A1E58(u8 *, u8);
+static void sub_80A0A2C(struct Pokemon *, u8, u8);
+static void sub_80A1FF8(const u8 *, u8, u8, u8);
+
+extern u8 ball_number_to_ball_processing_index(u16);
+extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8);
+
+extern struct MusicPlayerInfo gMPlay_BGM;
+extern u8 gUnknown_020384F0;
+extern u8 gUnknown_08208238[];
+extern u16 gUnknown_030041B8;
+extern u16 gUnknown_03004280;
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_030042C0;
+extern u16 gUnknown_03004288;
+extern u16 gUnknown_030041B0;
+extern TaskFunc gUnknown_03005CF0;
+extern struct Sprite *gUnknown_020384F4;
+extern struct SpriteTemplate gUnknown_02024E8C;
+
+extern const u8 gStatusPal_Icons[];
+extern const u8 gStatusGfx_Icons[];
+extern const u8 gMenuSummaryPal[];
+extern const u8 gMenuSummaryGfx[];
+extern const u8 gMoveTypes_Gfx[];
+extern const u8 gMoveTypes_Pal[];
+extern const u8 gStatusScreen_Pal[];
+extern const u8 gStatusScreen_Tilemap[];
+extern const u8 gUnknown_08E74688[];
+extern const u8 gUnknown_08E74E88[];
+extern const u8 gUnknown_08E73508[];
+extern const u8 gStatusScreen_Gfx[];
+extern const u8 gFontDefaultPalette[];
+extern const u8 gUnknownPalette_81E6692[];
+extern const u8 gAbilityNames[][13];
+extern const u8 * const gAbilityDescriptions[];
+extern const u8 * const gContestEffectStrings[];
+extern const struct ContestMove gContestMoves[];
+extern const struct ContestEffect gContestEffects[];
+extern const u16 gUnknown_08E94510[];
+extern const u16 gUnknown_08E94550[];
+extern const u16 gUnknown_08E94590[];
+extern const u8 gUnknown_08E73E88[];
+
+#if ENGLISH
+#include "../data/text/move_descriptions_en.h"
+#include "../data/text/nature_names_en.h"
+#elif GERMAN
+#include "../data/text/move_descriptions_de.h"
+#include "../data/text/nature_names_de.h"
+#endif
+
+static const u8 * const sPageHeaderTexts[] = {
+ gEmptyString_81E72B0,
+ OtherText_PokeInfo,
+ OtherText_PokeSkills,
+ OtherText_BattleMoves,
+ OtherText_ContestMoves,
+ OtherText_Switch,
+ OtherText_Info,
+ gOtherText_CancelNoTerminator,
+};
+
+static const union AffineAnimCmd sUnusedSpriteAffineAnim[] = {
+ AFFINEANIMCMD_FRAME(0xFF00, 0x100, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sUnsuedSpriteAffineAnimTable[] = {
+ sUnusedSpriteAffineAnim,
+};
+
+static const struct OamData sOamData_83C109C = {
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_83C10A4[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10AC[] = {
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10B4[] = {
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10BC[] = {
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10C4[] = {
+ ANIMCMD_FRAME(32, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10CC[] = {
+ ANIMCMD_FRAME(40, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10D4[] = {
+ ANIMCMD_FRAME(48, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10DC[] = {
+ ANIMCMD_FRAME(56, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10E4[] = {
+ ANIMCMD_FRAME(64, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10EC[] = {
+ ANIMCMD_FRAME(72, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10F4[] = {
+ ANIMCMD_FRAME(80, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10FC[] = {
+ ANIMCMD_FRAME(88, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1104[] = {
+ ANIMCMD_FRAME(96, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C110C[] = {
+ ANIMCMD_FRAME(104, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1114[] = {
+ ANIMCMD_FRAME(112, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C111C[] = {
+ ANIMCMD_FRAME(120, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1124[] = {
+ ANIMCMD_FRAME(128, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C112C[] = {
+ ANIMCMD_FRAME(136, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1134[] = {
+ ANIMCMD_FRAME(144, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C113C[] = {
+ ANIMCMD_FRAME(152, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1144[] = {
+ ANIMCMD_FRAME(160, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C114C[] = {
+ ANIMCMD_FRAME(168, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1154[] = {
+ ANIMCMD_FRAME(176, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83C115C[] = {
+ sSpriteAnim_83C10A4,
+ sSpriteAnim_83C10AC,
+ sSpriteAnim_83C10B4,
+ sSpriteAnim_83C10BC,
+ sSpriteAnim_83C10C4,
+ sSpriteAnim_83C10CC,
+ sSpriteAnim_83C10D4,
+ sSpriteAnim_83C10DC,
+ sSpriteAnim_83C10E4,
+ sSpriteAnim_83C10EC,
+ sSpriteAnim_83C10F4,
+ sSpriteAnim_83C10FC,
+ sSpriteAnim_83C1104,
+ sSpriteAnim_83C110C,
+ sSpriteAnim_83C1114,
+ sSpriteAnim_83C111C,
+ sSpriteAnim_83C1124,
+ sSpriteAnim_83C112C,
+ sSpriteAnim_83C1134,
+ sSpriteAnim_83C113C,
+ sSpriteAnim_83C1144,
+ sSpriteAnim_83C114C,
+ sSpriteAnim_83C1154,
+};
+
+static const struct CompressedSpriteSheet sUnknown_083C11B8 = { gMoveTypes_Gfx, 0x1700, 30002 };
+
+static const struct SpriteTemplate sSpriteTemplate_83C11C0 = {
+ .tileTag = 30002,
+ .paletteTag = 30002,
+ .oam = &sOamData_83C109C,
+ .anims = sSpriteAnimTable_83C115C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const u8 sUnknown_PaletteNums[] = { 0xD, 0xD, 0xE, 0xE, 0xD, 0xD, 0xF, 0xE, 0xD, 0xF, 0xD, 0xE, 0xF, 0xD, 0xE, 0xE, 0xF, 0xD, 0xD, 0xE, 0xE, 0xF, 0xD };
+
+static const struct OamData sOamData_83C11F0 = {
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_83C11F8[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1200[] = {
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1208[] = {
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1210[] = {
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1218[] = {
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1220[] = {
+ ANIMCMD_FRAME(16, 0, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1228[] = {
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1230[] = {
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1238[] = {
+ ANIMCMD_FRAME(24, 0, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1240[] = {
+ ANIMCMD_FRAME(28, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83C1248[] = {
+ sSpriteAnim_83C11F8,
+ sSpriteAnim_83C1200,
+ sSpriteAnim_83C1208,
+ sSpriteAnim_83C1210,
+ sSpriteAnim_83C1218,
+ sSpriteAnim_83C1220,
+ sSpriteAnim_83C1228,
+ sSpriteAnim_83C1230,
+ sSpriteAnim_83C1238,
+ sSpriteAnim_83C1240,
+};
+
+static const struct CompressedSpriteSheet sUnknown_083C1270 = { gMenuSummaryGfx, 0x400, 30000 };
+static const struct CompressedSpritePalette sUnknown_083C1278 = { gMenuSummaryPal, 30000 };
+
+static const struct SpriteTemplate sSpriteTemplate_83C1280 = {
+ .tileTag = 30000,
+ .paletteTag = 30000,
+ .oam = &sOamData_83C11F0,
+ .anims = sSpriteAnimTable_83C1248,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_83C1298 = {
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_83C12A0[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12A8[] = {
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12B0[] = {
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12B8[] = {
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12C0[] = {
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12C8[] = {
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12D0[] = {
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83C12D8[] = {
+ sSpriteAnim_83C12A0,
+ sSpriteAnim_83C12A8,
+ sSpriteAnim_83C12B0,
+ sSpriteAnim_83C12B8,
+ sSpriteAnim_83C12C0,
+ sSpriteAnim_83C12C8,
+ sSpriteAnim_83C12D0,
+};
+
+static const struct CompressedSpriteSheet sUnknown_083C12F4 = { gStatusGfx_Icons, 0x380, 30001 };
+static const struct CompressedSpritePalette sUnknown_083C12FC = { gStatusPal_Icons, 30001 };
+
+static const struct SpriteTemplate sSpriteTemplate_83C1304 = {
+ .tileTag = 30001,
+ .paletteTag = 30001,
+ .oam = &sOamData_83C1298,
+ .anims = sSpriteAnimTable_83C12D8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const u16 sSummaryScreenMonMarkingsPalette[] = INCBIN_U16("graphics/summary_screen/mon_markings.gbapal");
+
+#if ENGLISH
+static const u16 gSummaryScreenTextTiles[] = INCBIN_U16("graphics/summary_screen/text.4bpp");
+#elif GERMAN
+extern const u16 gSummaryScreenTextTiles[];
+#endif
+
+static const u16 sSummaryScreenButtonTiles[] = INCBIN_U16("graphics/summary_screen/buttons.4bpp");
+
+static const u16 sUnknown_083C157C[] = { RGB(26, 26, 23) };
+static const u16 sUnknown_083C157E[] = { RGB(30, 30, 27) };
+
+static void (*const sUnknown_083C1580[])(void) = {
+ sub_809FC0C,
+ sub_809FEB8,
+};
+
+static void (*const sUnknown_083C1588[])(struct Pokemon *) = {
+ sub_809F63C,
+ sub_809F650,
+ sub_809F664,
+ sub_809F664,
+};
+
+static void (*const sUnknown_083C1598[])(struct Pokemon *) = {
+ sub_809FE6C,
+ sub_80A0090,
+ sub_80A015C,
+ sub_80A015C,
+};
+
+static const u8 sDoubleBattlePartyOrder[] = { 0, 2, 3, 1, 4, 5 };
+
+static const u8 sUnknown_083C15AE[] = _("{STR_VAR_1}{CLEAR_TO 64}");
+static const u8 sUnknown_083C15B4[] = _("{STR_VAR_1}{CLEAR_TO 72}");
+
+asm(".align 2"); // TODO: this array is probably not correctly-typed
+static const u8 sUnknown_083C15BC[] = {
+ 9, 1, 0, 2,
+ 10, 3, 0, 4,
+ 8, 5, 0, 6,
+ 11, 7, 0, 8,
+ 14, 9, 0, 10,
+ 12, 11, 0, 12,
+ 13, 13, 0, 14,
+ -1, 15, 0, 10,
+};
+
+
+void sub_809D844(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_809D85C(void)
+{
+ REG_BG1HOFS = gUnknown_030042C0;
+ REG_BG1VOFS = gUnknown_030041B4;
+ REG_BG2HOFS = gUnknown_03004288;
+ REG_BG2VOFS = gUnknown_03004280;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void ShowPokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u8 mode)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+
+ pssData.monList.partyMons = party;
+ pssData.mode = mode;
+ pssData.monIndex = monIndex;
+ pssData.maxMonIndex = maxMonIndex;
+ pssData.callback = callback;
+ pssData.loadGfxState = 0;
+ pssData.selectedMoveIndex = 4;
+ pssData.moveToLearn = 0;
+ pssData.bgToggle = 0;
+ pssData.disableMoveOrderEditing = FALSE;
+
+ if (mode >= PSS_MODE_PC_NORMAL)
+ {
+ pssData.usingPC = TRUE;
+ }
+ else
+ {
+ pssData.usingPC = FALSE;
+ }
+
+ switch (mode)
+ {
+ case PSS_MODE_NORMAL:
+ case PSS_MODE_PC_NORMAL:
+ pssData.firstPage = PSS_PAGE_INFO;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 0;
+ pssData.unk78 = 0;
+ pssData.headerTextId = 1;
+ pssData.headerActionTextId = 7;
+ break;
+ case PSS_MODE_NO_MOVE_ORDER_EDIT:
+ pssData.firstPage = PSS_PAGE_INFO;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 0;
+ pssData.unk78 = 0;
+ pssData.headerTextId = 1;
+ pssData.headerActionTextId = 7;
+ pssData.disableMoveOrderEditing = TRUE;
+ break;
+ case PSS_MODE_SELECT_MOVE:
+ pssData.firstPage = PSS_PAGE_BATTLE_MOVES;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 1;
+ pssData.unk78 = 1;
+ pssData.headerTextId = 3;
+ pssData.headerActionTextId = 0;
+ pssData.selectedMoveIndex = 0;
+ break;
+ case PSS_MODE_MOVES_ONLY:
+ case PSS_MODE_PC_MOVES_ONLY:
+ pssData.firstPage = PSS_PAGE_BATTLE_MOVES;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 1;
+ pssData.unk78 = 1;
+ break;
+ }
+
+ pssData.page = pssData.firstPage;
+ SetMainCallback2(sub_809DE44);
+}
+
+void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u16 move)
+{
+ ShowPokemonSummaryScreen(party, monIndex, maxMonIndex, callback, PSS_MODE_SELECT_MOVE);
+ pssData.moveToLearn = move;
+}
+
+void sub_809DA1C(void)
+{
+ switch (pssData.mode)
+ {
+ case PSS_MODE_NORMAL:
+ case PSS_MODE_PC_NORMAL:
+ pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0);
+ break;
+ case PSS_MODE_NO_MOVE_ORDER_EDIT:
+ pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0);
+ break;
+ case PSS_MODE_SELECT_MOVE:
+ case PSS_MODE_UNKNOWN:
+ pssData.inputHandlingTaskId = CreateTask(sub_809EB40, 0);
+ break;
+ case PSS_MODE_MOVES_ONLY:
+ case PSS_MODE_PC_MOVES_ONLY:
+ pssData.inputHandlingTaskId = CreateTask(sub_809E3FC, 0);
+ break;
+ }
+}
+
+bool8 sub_809DA84(void)
+{
+ const u16 *src;
+ void *dest;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 1:
+ remove_some_task();
+ gMain.state++;
+ break;
+ case 2:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 3:
+ dest = (void *)VRAM;
+ DmaClearLarge(3, dest, 0x10000, 0x1000, 32);
+ gMain.state++;
+ break;
+ case 4:
+ sub_809DE64();
+ gMain.state++;
+ break;
+ case 5:
+ SetUpWindowConfig(&gWindowConfig_81E6E6C);
+ gMain.state++;
+ break;
+ case 6:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E6E6C);
+ gMain.state++;
+ break;
+ case 7:
+ if (MultistepInitMenuWindowContinue())
+ {
+ gMain.state++;
+ }
+ break;
+ case 8:
+ sub_809DA1C();
+ gMain.state++;
+ break;
+ case 9:
+ src = gSummaryScreenTextTiles;
+ dest = (void *)VRAM + 0xD000;
+ DmaCopy16(3, src, dest, 320);
+
+ src = sSummaryScreenButtonTiles;
+ dest = (void *)VRAM + 0xD140;
+ DmaCopy16(3, src, dest, 256);
+
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ break;
+ case 10:
+ if (LoadPokemonSummaryScreenGraphics())
+ {
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ }
+ break;
+ case 11:
+ sub_80A18C4();
+ gMain.state++;
+ break;
+ case 12:
+ sub_809F678(&pssData.loadedMon);
+ if (!GetMonStatusAndPokerus(&pssData.loadedMon))
+ {
+ sub_80A12D0(0);
+ }
+ else
+ {
+ sub_80A12D0(10);
+ }
+
+ DrawPokerusSurvivorDot(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 13:
+ sub_80A1950();
+ sub_80A1D84(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 14:
+ sub_80A1DE8(&pssData.loadedMon);
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ break;
+ case 15:
+ if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF)
+ {
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ }
+ break;
+ case 16:
+ sub_809E044();
+ DrawSummaryScreenNavigationDots();
+ gMain.state++;
+ break;
+ case 17:
+ if (pssData.page <= PSS_PAGE_SKILLS)
+ {
+ sUnknown_083C1580[pssData.page]();
+ }
+
+ gMain.state++;
+ break;
+ case 18:
+ sub_809FAC8(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 19:
+ sUnknown_083C1598[pssData.page](&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 20:
+ if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ gUnknown_030041B0 = 256;
+ }
+ else
+ {
+ gUnknown_030041B0 = 0;
+ }
+
+ gMain.state++;
+ break;
+ case 21:
+ sub_809EBC4();
+ if (pssData.selectedMoveIndex != 0)
+ {
+ sub_80A1488(0, 0);
+ sub_80A1654(0, 0);
+ }
+ else
+ {
+ sub_80A1488(10, 0);
+ sub_80A1654(10, 0);
+ }
+
+ PrintSummaryWindowHeaderText();
+ gMain.state++;
+ break;
+ case 22:
+ if (sub_8055870() != TRUE)
+ {
+ gMain.state++;
+ }
+ break;
+ default:
+ SetVBlankCallback(sub_809D85C);
+ BeginHardwarePaletteFade(0xFF, 0, 16, 0, 1);
+ SetMainCallback2(sub_809D844);
+ gPaletteFade.bufferTransferDisabled = 0;
+ return TRUE;
+ break;
+ }
+
+ return FALSE;
+}
+
+static void sub_809DE44(void)
+{
+ while (sub_809DA84() != TRUE && sub_80F9344() != TRUE);
+}
+
+static void sub_809DE64(void)
+{
+ REG_BG0CNT = 0x1E08;
+ REG_BG1CNT = 0x4801;
+ REG_BG2CNT = 0x4A02;
+ REG_BG3CNT = 0x5C03;
+
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ gUnknown_03004288 = 0;
+ gUnknown_03004280 = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+
+ REG_BLDCNT = 0;
+ REG_DISPCNT = 0x1F40;
+}
+
+static bool8 LoadPokemonSummaryScreenGraphics(void)
+{
+ switch (pssData.loadGfxState)
+ {
+ case 0:
+ LZDecompressVram(gStatusScreen_Gfx, (void *)VRAM + 0);
+ break;
+ case 1:
+ CpuSet(gUnknown_08E73508, (void *)VRAM + 0xE000, 0x400);
+ break;
+ case 2:
+ LZDecompressVram(gUnknown_08E74E88, (void *)VRAM + 0xE800);
+ break;
+ case 3:
+ LZDecompressVram(gStatusScreen_Tilemap, (void *)VRAM + 0x4800);
+ break;
+ case 4:
+ CpuSet(gUnknown_08E73E88, (void *)VRAM + 0x5800, 0x400);
+ break;
+ case 5:
+ CpuSet(gUnknown_08E74688, (void *)VRAM + 0x6800, 0x400);
+ break;
+ case 6:
+ LoadCompressedPalette(gStatusScreen_Pal, 0, 160);
+ break;
+ case 7:
+ LoadCompressedObjectPic(&sUnknown_083C11B8);
+ break;
+ case 8:
+ LoadCompressedObjectPic(&sUnknown_083C1270);
+ break;
+ case 9:
+ LoadCompressedObjectPic(&sUnknown_083C12F4);
+ break;
+ case 10:
+ LoadCompressedObjectPalette(&sUnknown_083C12FC);
+ break;
+ case 11:
+ LoadCompressedObjectPalette(&sUnknown_083C1278);
+ break;
+ case 12:
+ LoadCompressedPalette(gMoveTypes_Pal, 464, 96);
+ pssData.loadGfxState = 0;
+ return TRUE;
+ }
+
+ pssData.loadGfxState++;
+ return FALSE;
+}
+
+static void sub_809E044(void)
+{
+ LoadPalette(&gUnknownPalette_81E6692[28], 129, 2);
+ LoadPalette(&gUnknownPalette_81E6692[30], 136, 2);
+ LoadPalette(&gUnknownPalette_81E6692[28], 143, 2);
+ LoadPalette(&gUnknownPalette_81E6692[30], 137, 2);
+ LoadPalette(&gUnknownPalette_81E6692[12], 209, 4);
+ LoadPalette(&gUnknownPalette_81E6692[20], 211, 4);
+ LoadPalette(&gUnknownPalette_81E6692[28], 213, 4);
+ LoadPalette(&gUnknownPalette_81E6692[12], 215, 4);
+ LoadPalette(&gUnknownPalette_81E6692[8], 217, 4);
+ LoadPalette(&gUnknownPalette_81E6692[16], 219, 4);
+ LoadPalette(&gUnknownPalette_81E6692[4], 221, 2);
+ LoadPalette(&gUnknownPalette_81E6692[6], 222, 2);
+ LoadPalette(&gUnknownPalette_81E6692[2], 223, 2);
+ LoadPalette(gFontDefaultPalette, 240, 32);
+ LoadPalette(&gUnknownPalette_81E6692[6], 249, 2);
+}
+
+static void SummaryScreenExit(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_809E13C;
+}
+
+static void sub_809E13C(u8 taskId)
+{
+ if (sub_8055870() != TRUE && !gPaletteFade.active)
+ {
+ gUnknown_020384F0 = pssData.monIndex;
+
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ StopCryAndClearCrySongs();
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ SetMainCallback2(pssData.callback);
+ DestroyTask(taskId);
+ }
+}
+
+static void SummaryScreenHandleKeyInput(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ SummaryScreenHandleUpDownInput(taskId, -1);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ SummaryScreenHandleUpDownInput(taskId, 1);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1)
+ {
+ SummaryScreenHandleLeftRightInput(taskId, -1);
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2)
+ {
+ SummaryScreenHandleLeftRightInput(taskId, 1);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES)
+ {
+ SummaryScreenHandleAButton(taskId);
+ }
+
+ if (pssData.page == PSS_PAGE_INFO)
+ {
+ SummaryScreenExit(taskId);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ SummaryScreenExit(taskId);
+ }
+}
+
+static void sub_809E260(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1)
+ {
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ SummaryScreenHandleLeftRightInput(taskId, -1);
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2)
+ {
+ if (pssData.page != pssData.lastPage)
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ SummaryScreenHandleLeftRightInput(taskId, 1);
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (sub_809F7D0(taskId) == TRUE || pssData.selectedMoveIndex == 4)
+ {
+ pssData.switchMoveIndex = pssData.selectedMoveIndex;
+ gSpecialVar_0x8005 = pssData.switchMoveIndex;
+ SummaryScreenExit(taskId);
+ }
+ else
+ {
+ PlaySE(SE_HAZURE);
+ sub_809F9D0(taskId, pssData.selectedMoveIndex);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ pssData.switchMoveIndex = 4;
+ gSpecialVar_0x8005 = 4;
+ SummaryScreenExit(taskId);
+ }
+}
+
+static void sub_809E3FC(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (pssData.selectedMoveIndex != 4 && !pssData.disableMoveOrderEditing)
+ {
+ if (!MonKnowsMultipleMoves(&pssData.loadedMon))
+ {
+ PlaySE(SE_HAZURE);
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+
+ pssData.switchMoveIndex = pssData.selectedMoveIndex;
+ sub_80A1B40(1);
+ sub_80A1A30(19);
+
+ gTasks[taskId].func = sub_809E534;
+ }
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ sub_809EAC8(taskId);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_809EAC8(taskId);
+ }
+
+}
+
+static bool8 MonKnowsMultipleMoves(struct Pokemon *mon)
+{
+ u8 i;
+
+ for (i = 1; i < 4; i++)
+ {
+ if (GetMonMove(mon, i))
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_809E534(u8 taskId)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].data[0] = 3;
+ sub_809E8F0(taskId, -1, &pssData.switchMoveIndex);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].data[0] = 3;
+ sub_809E8F0(taskId, 1, &pssData.switchMoveIndex);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ sub_809E83C(taskId, 1);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ sub_809E83C(taskId, -1);
+ }
+}
+
+static void sub_809E5C4(void)
+{
+ struct Pokemon *party = pssData.monList.partyMons;
+ struct Pokemon *pkmn = &party[pssData.monIndex];
+ u8 moveIndex1 = pssData.selectedMoveIndex;
+ u8 moveIndex2 = pssData.switchMoveIndex;
+
+ u16 move1 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1);
+ u16 move2 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2);
+ u8 move1pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex1);
+ u8 move2pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex2);
+ u8 ppBonuses = GetMonData(pkmn, MON_DATA_PP_BONUSES);
+
+ // Calculate PP bonuses
+ u8 r9 = gUnknown_08208238[moveIndex1];
+ u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2);
+ u8 r3 = gUnknown_08208238[moveIndex2];
+ u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2);
+ ppBonuses &= ~r9;
+ ppBonuses &= ~r3;
+ ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2));
+
+ // Swap the moves
+ SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2);
+ SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1);
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp);
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp);
+ SetMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses);
+}
+
+static void sub_809E6D8(void)
+{
+ struct BoxPokemon *boxMons = pssData.monList.boxMons;
+ struct BoxPokemon *pkmn = &boxMons[pssData.monIndex];
+ u8 moveIndex1 = pssData.selectedMoveIndex;
+ u8 moveIndex2 = pssData.switchMoveIndex;
+
+ u16 move1 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1);
+ u16 move2 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2);
+ u8 move1pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1);
+ u8 move2pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2);
+ u8 ppBonuses = GetBoxMonData(pkmn, MON_DATA_PP_BONUSES);
+
+ // Calculate PP bonuses
+ u8 r9 = gUnknown_08208238[moveIndex1];
+ u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2);
+ u8 r3 = gUnknown_08208238[moveIndex2];
+ u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2);
+ ppBonuses &= ~r9;
+ ppBonuses &= ~r3;
+ ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2));
+
+ // Swap the moves
+ SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2);
+ SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1);
+ SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp);
+ SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp);
+ SetBoxMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses);
+}
+
+void sub_809E7F0(u8 taskId)
+{
+ if (sub_809F5F8())
+ {
+ pssData.loadGfxState = 0;
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ gTasks[taskId].func = sub_809E3FC;
+ sub_80A2078(taskId);
+ }
+}
+
+static void sub_809E83C(u8 taskId, s8 b)
+{
+ PlaySE(SE_SELECT);
+
+ sub_80A1B1C(19);
+ sub_80A1B40(0);
+
+ if (b == 1)
+ {
+ if (pssData.selectedMoveIndex != pssData.switchMoveIndex)
+ {
+ if (pssData.usingPC == FALSE)
+ {
+ sub_809E5C4();
+ }
+ else
+ {
+ sub_809E6D8();
+ }
+
+ pssData.selectedMoveIndex = pssData.switchMoveIndex;
+ sub_809F678(&pssData.loadedMon);
+ pssData.loadGfxState = 1;
+
+ gTasks[taskId].func = sub_809E7F0;
+ return;
+ }
+ }
+ else
+ {
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ }
+
+ gTasks[taskId].func = sub_809E3FC;
+ sub_80A2078(taskId);
+}
+
+__attribute__((naked))
+static void sub_809E8F0(/*u8 taskId, s8 direction, u8 *c*/)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x8\n\
+ adds r4, r1, 0\n\
+ mov r9, r2\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ movs r0, 0x1\n\
+ str r0, [sp]\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ mov r1, r9\n\
+ ldrb r6, [r1]\n\
+ ldr r1, _0809E944 @ =gTasks\n\
+ mov r2, r8\n\
+ lsls r0, r2, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x8]\n\
+ movs r2, 0\n\
+ lsls r4, 24\n\
+ asrs r4, 24\n\
+ mov r10, r4\n\
+ lsls r7, r0, 24\n\
+_0809E930:\n\
+ lsls r0, r6, 24\n\
+ asrs r0, 24\n\
+ add r0, r10\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ asrs r1, r0, 24\n\
+ cmp r0, r7\n\
+ ble _0809E948\n\
+ movs r6, 0\n\
+ b _0809E94E\n\
+ .align 2, 0\n\
+_0809E944: .4byte gTasks\n\
+_0809E948:\n\
+ cmp r1, 0\n\
+ bge _0809E94E\n\
+ lsrs r6, r7, 24\n\
+_0809E94E:\n\
+ lsls r4, r6, 24\n\
+ lsrs r1, r4, 24\n\
+ ldr r0, _0809EA10 @ =gSharedMem + 0x18010\n\
+ str r2, [sp, 0x4]\n\
+ bl GetMonMove\n\
+ lsls r0, 16\n\
+ adds r5, r4, 0\n\
+ ldr r2, [sp, 0x4]\n\
+ cmp r0, 0\n\
+ bne _0809E97A\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x4\n\
+ beq _0809E97A\n\
+ lsls r0, r2, 24\n\
+ movs r3, 0x80\n\
+ lsls r3, 17\n\
+ adds r0, r3\n\
+ lsrs r2, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x3\n\
+ ble _0809E930\n\
+_0809E97A:\n\
+ mov r1, r9\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x4\n\
+ bne _0809E996\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x4\n\
+ beq _0809E996\n\
+ ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\
+ adds r0, 0x7C\n\
+ ldrh r0, [r0]\n\
+ mov r2, r8\n\
+ lsls r7, r2, 2\n\
+ cmp r0, 0\n\
+ beq _0809E9AC\n\
+_0809E996:\n\
+ ldr r2, _0809EA18 @ =gTasks\n\
+ mov r3, r8\n\
+ lsls r1, r3, 2\n\
+ adds r0, r1, r3\n\
+ lsls r0, 3\n\
+ adds r0, r2\n\
+ movs r2, 0x22\n\
+ ldrsh r0, [r0, r2]\n\
+ adds r7, r1, 0\n\
+ cmp r0, 0x1\n\
+ bne _0809E9D0\n\
+_0809E9AC:\n\
+ lsrs r4, r5, 24\n\
+ movs r0, 0x2\n\
+ adds r1, r4, 0\n\
+ bl sub_80A1488\n\
+ movs r0, 0x2\n\
+ adds r1, r4, 0\n\
+ bl sub_80A1654\n\
+ ldr r1, _0809EA18 @ =gTasks\n\
+ mov r3, r8\n\
+ adds r0, r7, r3\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ movs r1, 0\n\
+ strh r1, [r0, 0x22]\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+_0809E9D0:\n\
+ mov r1, r9\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x4\n\
+ beq _0809E9FE\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x4\n\
+ bne _0809E9FE\n\
+ ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\
+ adds r0, 0x7C\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _0809E9FE\n\
+ movs r4, 0x2\n\
+ negs r4, r4\n\
+ lsrs r5, 24\n\
+ adds r0, r4, 0\n\
+ adds r1, r5, 0\n\
+ bl sub_80A1488\n\
+ adds r0, r4, 0\n\
+ adds r1, r5, 0\n\
+ bl sub_80A1654\n\
+_0809E9FE:\n\
+ mov r2, r9\n\
+ strb r6, [r2]\n\
+ ldr r0, _0809EA1C @ =gSharedMem + 0x18079\n\
+ cmp r9, r0\n\
+ bne _0809EA20\n\
+ movs r0, 0\n\
+ bl sub_80A1C30\n\
+ b _0809EA26\n\
+ .align 2, 0\n\
+_0809EA10: .4byte gSharedMem + 0x18010\n\
+_0809EA14: .4byte gSharedMem + 0x18000\n\
+_0809EA18: .4byte gTasks\n\
+_0809EA1C: .4byte gSharedMem + 0x18079\n\
+_0809EA20:\n\
+ movs r0, 0x1\n\
+ bl sub_80A1C30\n\
+_0809EA26:\n\
+ ldr r3, [sp]\n\
+ cmp r3, 0\n\
+ beq _0809EA34\n\
+ ldr r0, _0809EA4C @ =gSharedMem + 0x18010\n\
+ mov r1, r9\n\
+ bl sub_80A0428\n\
+_0809EA34:\n\
+ mov r0, r8\n\
+ bl sub_80A2078\n\
+ add sp, 0x8\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\
+_0809EA4C: .4byte gSharedMem + 0x18010\n\
+ .syntax divided\n");
+}
+
+static void SummaryScreenHandleAButton(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+
+ pssData.selectedMoveIndex = 0;
+ sub_80A1488(2, 0);
+ sub_80A1654(2, 0);
+
+ if (!pssData.disableMoveOrderEditing)
+ {
+ pssData.headerActionTextId = 5;
+ PrintSummaryWindowHeaderText();
+ }
+
+ sub_80A16CC(0);
+ sub_80A029C(&pssData.loadedMon);
+ sub_80A1A30(9);
+
+ gTasks[taskId].func = sub_809E3FC;
+ sub_80A2078(taskId);
+}
+
+static void sub_809EAC8(u8 taskId)
+{
+ if (pssData.selectedMoveIndex != 4)
+ {
+ sub_80A1488(-2, 0);
+ sub_80A1654(-2, 0);
+ }
+
+ sub_80A1B1C(9);
+ sub_80A16CC(1);
+
+ MenuZeroFillWindowRect(15, 12, 28, 13);
+ MenuZeroFillWindowRect(11, 15, 28, 18);
+
+ pssData.headerActionTextId = 6;
+ PrintSummaryWindowHeaderText();
+
+ gTasks[taskId].func = SummaryScreenHandleKeyInput;
+}
+
+static void sub_809EB40(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 5:
+ sub_80A1A30(9);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_809E260;
+ break;
+ case 0:
+ pssData.selectedMoveIndex = 0;
+ if (pssData.moveToLearn != 0)
+ {
+ sub_80A1488(10, 0);
+ sub_80A1654(10, pssData.selectedMoveIndex);
+ }
+
+ sub_80A16CC(0);
+ sub_80A029C(&pssData.loadedMon);
+ // fall through
+ default:
+ gTasks[taskId].data[0]++;
+ break;
+ }
+}
+
+static void sub_809EBC4(void)
+{
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ DrawSummaryScreenNavigationDots();
+ gUnknown_030042C0 = 0x100;
+
+ if (pssData.page == PSS_PAGE_SKILLS)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xC00;
+ }
+}
+
+void sub_809EC38(u8 taskId)
+{
+ u8 minus2;
+ s16 *taskData = gTasks[taskId].data;
+
+ switch (taskData[0])
+ {
+ case 0:
+ if (pssData.bgToggle == 0)
+ {
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ gUnknown_03004288 = 0x100;
+ }
+
+ if (pssData.page == PSS_PAGE_SKILLS)
+ {
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0x800;
+ }
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0xA00;
+ }
+ }
+ else
+ {
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ gUnknown_030042C0 = 0x100;
+ }
+
+ if (pssData.page == PSS_PAGE_SKILLS)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800;
+ }
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00;
+ }
+ }
+
+ taskData[0]++;
+ break;
+ case 1:
+ if (pssData.bgToggle == 0)
+ {
+ int var2 = gUnknown_030042C0 - 0x20;
+ gUnknown_030042C0 = var2;
+ if (var2 << 16 == 0)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2;
+ REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 1;
+ taskData[0]++;
+ }
+ }
+ else
+ {
+ int var2 = gUnknown_03004288 - 0x20;
+ gUnknown_03004288 = var2;
+ if (var2 << 16 == 0)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 1;
+ REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2;
+ taskData[0]++;
+ }
+ }
+ break;
+ case 2:
+ pssData.headerTextId = pssData.page + 1;
+ minus2 = pssData.mode - 2;
+ if (minus2 < 2)
+ {
+ pssData.headerActionTextId = 0;
+ sub_80A029C(&pssData.loadedMon);
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ sub_80A00F4(pssData.selectedMoveIndex);
+ }
+ else
+ {
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT))
+ {
+ pssData.headerActionTextId = 6;
+ }
+ else if (pssData.page == PSS_PAGE_INFO)
+ {
+ pssData.headerActionTextId = 7;
+ }
+ else
+ {
+ pssData.headerActionTextId = 0;
+ }
+ }
+
+ taskData[0]++;
+ break;
+ case 3:
+ DrawSummaryScreenNavigationDots();
+ PrintSummaryWindowHeaderText();
+ taskData[0]++;
+ break;
+ case 4:
+ sUnknown_083C1598[pssData.page](&pssData.loadedMon);
+ pssData.bgToggle ^= 1;
+ taskData[0]++;
+ break;
+ case 5:
+ if (sub_8055870() != TRUE)
+ {
+ gTasks[taskId].func = gUnknown_03005CF0;
+ }
+ break;
+ }
+}
+
+void sub_809EE74(u8 taskId)
+{
+ int var1;
+ u8 minus2;
+ s16 *taskData = gTasks[taskId].data;
+
+ switch (taskData[0])
+ {
+ case 0:
+ var1 = pssData.bgToggle;
+ if (var1 == 0)
+ {
+ gUnknown_03004288 = pssData.bgToggle;
+ taskData[0]++;
+ }
+ else
+ {
+ gUnknown_030042C0 = 0;
+ taskData[0]++;
+ }
+ break;
+ case 1:
+ if (pssData.bgToggle == 0)
+ {
+ if (pssData.page == PSS_PAGE_SKILLS)
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0x801;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xA01;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xC01;
+
+ REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2;
+ }
+ else
+ {
+ if (pssData.page == PSS_PAGE_SKILLS)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0x801;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xA01;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xC01;
+
+ REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2;
+ }
+
+ taskData[0]++;
+ break;
+ case 2:
+ if (pssData.bgToggle == 0)
+ {
+ int var2 = gUnknown_03004288 + 0x20;
+ gUnknown_03004288 = var2;
+ if ((var2 << 16) == 0x1000000)
+ {
+ taskData[0]++;
+ }
+ }
+ else
+ {
+ int var2 = gUnknown_030042C0 + 0x20;
+ gUnknown_030042C0 = var2;
+ if ((var2 << 16) == 0x1000000)
+ {
+ taskData[0]++;
+ }
+ }
+ break;
+ case 3:
+ pssData.headerTextId = pssData.page + 1;
+ minus2 = pssData.mode - 2;
+ if (minus2 < 2)
+ {
+ pssData.headerActionTextId = 0;
+ sub_80A029C(&pssData.loadedMon);
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ sub_80A00F4(pssData.selectedMoveIndex);
+ }
+ else
+ {
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT))
+ {
+ pssData.headerActionTextId = 6;
+ }
+ else if (pssData.page == PSS_PAGE_INFO)
+ {
+ pssData.headerActionTextId = 7;
+ }
+ else
+ {
+ pssData.headerActionTextId = 0;
+ }
+ }
+
+ taskData[0]++;
+ break;
+ case 4:
+ DrawSummaryScreenNavigationDots();
+ PrintSummaryWindowHeaderText();
+ taskData[0]++;
+ break;
+ case 5:
+ sUnknown_083C1598[pssData.page](&pssData.loadedMon);
+ pssData.bgToggle ^= 1;
+ taskData[0]++;
+ break;
+ case 6:
+ if (sub_8055870() != TRUE)
+ {
+ gTasks[taskId].func = gUnknown_03005CF0;
+ }
+ break;
+ }
+}
+
+void sub_809F0D0(u8 taskId, s8 direction)
+{
+ pssData.page += direction;
+ gUnknown_03005CF0 = gTasks[taskId].func;
+ sub_809FBE4();
+ gTasks[taskId].data[0] = 0;
+
+ if (direction == -1)
+ {
+ gTasks[taskId].func = sub_809EC38;
+ }
+ else
+ {
+ gTasks[taskId].func = sub_809EE74;
+ gTasks[taskId].func(taskId);
+ }
+}
+
+static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction)
+{
+ if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ if (direction == -1 && pssData.page == pssData.firstPage) return;
+ if (direction == 1 && pssData.page == pssData.lastPage) return;
+
+ if (FindTaskIdByFunc(sub_80A1334) == 0xFF && FindTaskIdByFunc(sub_80A1500) == 0xFF)
+ {
+ PlaySE(SE_SELECT);
+ sub_809F0D0(taskId, direction);
+ }
+ }
+}
+
+#ifdef NONMATCHING
+static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
+{
+ s8 var3;
+ u8 var1 = direction;
+
+ if (pssData.usingPC == TRUE)
+ {
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ var1 = (direction == 1) ? 0 : 1;
+ }
+ else
+ {
+ var1 = (direction == 1) ? 2 : 3;
+ }
+
+ var3 = StorageSystemGetNextMonIndex(pssData.monList.boxMons, pssData.monIndex, pssData.maxMonIndex, var1);
+ }
+ else
+ {
+ if (sub_80F9344() == TRUE && IsLinkDoubleBattle() == TRUE)
+ {
+ var3 = sub_809F3CC(var1);
+ }
+ else
+ {
+ var3 = sub_809F284(var1);
+ }
+ }
+
+ if (var3 != -1)
+ {
+ PlaySE(SE_SELECT);
+ if (GetMonStatusAndPokerus(&pssData.loadedMon))
+ {
+ sub_80A12D0(-2);
+ }
+
+ pssData.monIndex = var3;
+ pssData.unk84 = gTasks[taskId].func;
+ gTasks[taskId].func = sub_809F43C;
+ }
+}
+#else
+__attribute__((naked))
+static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r4, r1, 24\n\
+ ldr r0, _0809F1E4 @ =gSharedMem + 0x18000\n\
+ ldrb r1, [r0, 0xE]\n\
+ adds r2, r0, 0\n\
+ cmp r1, 0x1\n\
+ bne _0809F202\n\
+ ldrb r0, [r2, 0xB]\n\
+ cmp r0, 0\n\
+ beq _0809F1E8\n\
+ lsls r1, r4, 24\n\
+ asrs r1, 24\n\
+ movs r4, 0x1\n\
+ eors r1, r4\n\
+ negs r0, r1\n\
+ orrs r0, r1\n\
+ lsrs r4, r0, 31\n\
+ b _0809F1F4\n\
+ .align 2, 0\n\
+_0809F1E4: .4byte gSharedMem + 0x18000\n\
+_0809F1E8:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r4, 0x3\n\
+ cmp r0, 0x1\n\
+ bne _0809F1F4\n\
+ movs r4, 0x2\n\
+_0809F1F4:\n\
+ ldr r0, [r2]\n\
+ ldrb r1, [r2, 0x9]\n\
+ ldrb r2, [r2, 0xA]\n\
+ adds r3, r4, 0\n\
+ bl StorageSystemGetNextMonIndex\n\
+ b _0809F22C\n\
+_0809F202:\n\
+ bl sub_80F9344\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _0809F224\n\
+ bl IsLinkDoubleBattle\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _0809F224\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ bl sub_809F3CC\n\
+ b _0809F22C\n\
+_0809F224:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ bl sub_809F284\n\
+_0809F22C:\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ beq _0809F270\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ ldr r5, _0809F278 @ =gSharedMem + 0x18010\n\
+ adds r0, r5, 0\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0809F258\n\
+ movs r0, 0x2\n\
+ negs r0, r0\n\
+ bl sub_80A12D0\n\
+_0809F258:\n\
+ adds r0, r5, 0\n\
+ subs r0, 0x10\n\
+ strb r4, [r0, 0x9]\n\
+ ldr r1, _0809F27C @ =gTasks\n\
+ lsls r0, r6, 2\n\
+ adds r0, r6\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldr r1, [r0]\n\
+ str r1, [r5, 0x74]\n\
+ ldr r1, _0809F280 @ =sub_809F43C\n\
+ str r1, [r0]\n\
+_0809F270:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0809F278: .4byte gSharedMem + 0x18010\n\
+_0809F27C: .4byte gTasks\n\
+_0809F280: .4byte sub_809F43C\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+#ifdef NONMATCHING
+s8 sub_809F284(s8 a)
+{
+ struct Pokemon *mons = pssData.monList.partyMons;
+ s8 r6 = 0;
+
+ if (pssData.page == PSS_PAGE_INFO)
+ {
+ if (a == -1 && pssData.monIndex == 0)
+ return -1;
+ if (a == 1 && pssData.monIndex >= pssData.maxMonIndex)
+ return -1;
+ return pssData.monIndex + a;
+ }
+ else
+ {
+ do
+ {
+ r6 += a;
+ if (pssData.monIndex + r6 < 0 || pssData.monIndex + r6 > pssData.maxMonIndex)
+ return -1;
+ } while (GetMonData(&mons[pssData.monIndex + r6], MON_DATA_IS_EGG) != 0);
+ return pssData.monIndex + r6;
+ }
+}
+#else
+__attribute__((naked))
+s8 sub_809F284(s8 a)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ ldr r0, _0809F2C0 @ =gSharedMem + 0x18000\n\
+ ldr r7, [r0]\n\
+ movs r6, 0\n\
+ ldrb r1, [r0, 0xB]\n\
+ adds r4, r0, 0\n\
+ cmp r1, 0\n\
+ bne _0809F2C4\n\
+ lsls r0, r3, 24\n\
+ asrs r2, r0, 24\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ adds r5, r0, 0\n\
+ cmp r2, r1\n\
+ bne _0809F2AC\n\
+ ldrb r0, [r4, 0x9]\n\
+ cmp r0, 0\n\
+ beq _0809F2E4\n\
+_0809F2AC:\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x1\n\
+ bne _0809F2BA\n\
+ ldrb r0, [r4, 0x9]\n\
+ ldrb r1, [r4, 0xA]\n\
+ cmp r0, r1\n\
+ bcs _0809F2E4\n\
+_0809F2BA:\n\
+ ldrb r0, [r4, 0x9]\n\
+ adds r0, r3\n\
+ b _0809F304\n\
+ .align 2, 0\n\
+_0809F2C0: .4byte gSharedMem + 0x18000\n\
+_0809F2C4:\n\
+ lsls r5, r3, 24\n\
+_0809F2C6:\n\
+ lsls r0, r6, 24\n\
+ asrs r0, 24\n\
+ asrs r1, r5, 24\n\
+ adds r0, r1\n\
+ lsls r0, 24\n\
+ ldr r4, _0809F2EC @ =gSharedMem + 0x18000\n\
+ lsrs r6, r0, 24\n\
+ asrs r0, 24\n\
+ ldrb r2, [r4, 0x9]\n\
+ adds r1, r0, r2\n\
+ cmp r1, 0\n\
+ blt _0809F2E4\n\
+ ldrb r0, [r4, 0xA]\n\
+ cmp r1, r0\n\
+ ble _0809F2F0\n\
+_0809F2E4:\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ b _0809F308\n\
+ .align 2, 0\n\
+_0809F2EC: .4byte gSharedMem + 0x18000\n\
+_0809F2F0:\n\
+ movs r0, 0x64\n\
+ muls r0, r1\n\
+ adds r0, r7, r0\n\
+ movs r1, 0x2D\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ bne _0809F2C6\n\
+ ldrb r0, [r4, 0x9]\n\
+ adds r0, r6\n\
+_0809F304:\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+_0809F308:\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+bool8 sub_809F310(struct Pokemon *mon)
+{
+ if (GetMonData(mon, MON_DATA_SPECIES))
+ {
+ if (pssData.page != PSS_PAGE_INFO || !GetMonData(mon, MON_DATA_IS_EGG))
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+s8 sub_809F344(u8 partyIndex)
+{
+ while (1)
+ {
+ partyIndex++;
+ if (partyIndex == PARTY_SIZE)
+ {
+ return -1;
+ }
+
+ if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE)
+ {
+ return sDoubleBattlePartyOrder[partyIndex];
+ }
+ }
+}
+
+s8 sub_809F388(u8 partyIndex)
+{
+ while (1)
+ {
+ if (partyIndex == 0)
+ {
+ return -1;
+ }
+
+ partyIndex--;
+ if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE)
+ {
+ return sDoubleBattlePartyOrder[partyIndex];
+ }
+ }
+}
+
+s8 sub_809F3CC(s8 direction)
+{
+ u8 i;
+ u8 monIndex = 0;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (sDoubleBattlePartyOrder[i] == pssData.monIndex)
+ {
+ monIndex = i;
+ break;
+ }
+ }
+
+ if ((direction == -1 && monIndex == 0) || (direction == 1 && monIndex == 5))
+ {
+ return -1;
+ }
+
+ if (direction != 1)
+ {
+ return sub_809F388(monIndex);
+ }
+ else if (monIndex != 5)
+ {
+ return sub_809F344(monIndex);
+ }
+
+ return -1;
+}
+
+void sub_809F43C(u8 taskId)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ StopCryAndClearCrySongs();
+ gMain.state++;
+ break;
+ case 1:
+ DestroySpriteAndFreeResources(&gSprites[pssData.monSpriteId]);
+ gMain.state++;
+ break;
+ case 2:
+ DestroySpriteAndFreeResources(&gSprites[pssData.ballSpriteId]);
+ gMain.state++;
+ break;
+ case 3:
+ pssData.loadGfxState = 0;
+ pssData.selectedMoveIndex = 0;
+ gMain.state++;
+ break;
+ case 4:
+ sub_809F678(&pssData.loadedMon);
+ if (GetMonStatusAndPokerus(&pssData.loadedMon))
+ {
+ sub_80A12D0(2);
+ }
+
+ DrawPokerusSurvivorDot(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 5:
+ if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF)
+ {
+ pssData.loadGfxState = 0;
+ if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ gUnknown_030041B0 = 256;
+ }
+ else
+ {
+ gUnknown_030041B0 = 0;
+ }
+
+ gMain.state++;
+ }
+ break;
+ case 6:
+ sub_80A1DCC(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 7:
+ sub_80A1DE8(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 8:
+ if (sub_809F5F8())
+ {
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ }
+ break;
+ default:
+ if (sub_8055870() != TRUE)
+ {
+ gMain.state = 0;
+ gTasks[taskId].func = pssData.unk84;
+ }
+ break;
+ }
+}
+
+static bool8 sub_809F5F8(void)
+{
+ if (pssData.loadGfxState == 0)
+ {
+ sub_809FAC8(&pssData.loadedMon);
+ pssData.loadGfxState++;
+ return FALSE;
+ }
+ else
+ {
+ sUnknown_083C1588[pssData.page](&pssData.loadedMon);
+ return TRUE;
+ }
+}
+
+static void sub_809F63C(struct Pokemon *mon)
+{
+ sub_809FE80();
+ sub_809FC34(mon);
+}
+
+static void sub_809F650(struct Pokemon *mon)
+{
+ sub_80A00A4();
+ sub_809FF64(mon);
+}
+
+static void sub_809F664(struct Pokemon *mon)
+{
+ sub_80A0390();
+ sub_80A015C(mon);
+}
+
+static void sub_809F678(struct Pokemon *mon)
+{
+ if (pssData.usingPC == FALSE)
+ {
+ struct Pokemon *mons = pssData.monList.partyMons;
+ *mon = mons[pssData.monIndex];
+ }
+ else
+ {
+ struct BoxPokemon *mons = pssData.monList.boxMons;
+ sub_803B4B4(&mons[pssData.monIndex], mon);
+ }
+}
+
+static u8 sub_809F6B4(struct Pokemon *mon, u8 *b)
+{
+ u16 species;
+ u32 personality;
+ u32 otId;
+ const struct CompressedSpritePalette *palette;
+
+ switch (*b)
+ {
+ default:
+ return sub_80A1808(mon);
+ case 0:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+
+ HandleLoadSpecialPokePic(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].coords,
+ gMonFrontPicCoords[species].y_offset,
+ ewram_addr,
+ gUnknown_081FAF4C[1],
+ species,
+ personality);
+ *b += 1;
+ return 0xFF;
+ case 1:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+ otId = GetMonData(mon, MON_DATA_OT_ID);
+
+ palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
+ LoadCompressedObjectPalette(palette);
+ GetMonSpriteTemplate_803C56C(palette->tag, 1);
+ *b += 1;
+ return 0xFF;
+ }
+}
+
+static u16 GetMonMove(struct Pokemon *mon, u8 moveId)
+{
+ switch (moveId)
+ {
+ case 0:
+ return GetMonData(mon, MON_DATA_MOVE1);
+ case 1:
+ return GetMonData(mon, MON_DATA_MOVE2);
+ case 2:
+ return GetMonData(mon, MON_DATA_MOVE3);
+ default:
+ return GetMonData(mon, MON_DATA_MOVE4);
+ }
+}
+
+static u16 GetMonMovePP(struct Pokemon *mon, u8 moveId)
+{
+ switch (moveId)
+ {
+ case 0:
+ return GetMonData(mon, MON_DATA_PP1);
+ case 1:
+ return GetMonData(mon, MON_DATA_PP2);
+ case 2:
+ return GetMonData(mon, MON_DATA_PP3);
+ default:
+ return GetMonData(mon, MON_DATA_PP4);
+ }
+}
+
+static bool8 sub_809F7D0(u8 taskId)
+{
+ struct Pokemon mon;
+ u16 move;
+
+ sub_809F678(&mon);
+ move = GetMonMove(&mon, pssData.selectedMoveIndex);
+ if (IsHMMove(move) == TRUE && pssData.mode != PSS_MODE_UNKNOWN)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+#ifdef NONMATCHING // The two "pssData.selectedMoveIndex = taskData[15];" lines have small register differences.
+void sub_809F814(u8 taskId)
+{
+ u16 var1;
+
+ s16 *taskData = gTasks[taskId].data;
+
+ var1 = taskData[14];
+ if (taskData[14] < 4)
+ {
+ taskData[14] = var1 + 1;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].func = sub_809E260;
+ taskData[0] = 4;
+ taskData[13] = 1;
+ pssData.selectedMoveIndex = taskData[15];
+ sub_809E8F0(taskId, -1);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].func = sub_809E260;
+ taskData[0] = 4;
+ taskData[13] = 1;
+ pssData.selectedMoveIndex = taskData[15];
+ sub_809E8F0(taskId, 1);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1)
+ {
+ if (pssData.page != PSS_PAGE_BATTLE_MOVES)
+ {
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ gTasks[taskId].func = sub_809E260;
+
+ SummaryScreenHandleLeftRightInput(taskId, -1);
+ sub_80A1488(1, taskData[15]);
+ sub_80A1654(1, taskData[15]);
+ }
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2)
+ {
+ if (pssData.page != pssData.lastPage)
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ gTasks[taskId].func = sub_809E260;
+
+ SummaryScreenHandleLeftRightInput(taskId, 1);
+ sub_80A1488(1, taskData[15]);
+ sub_80A1654(1, taskData[15]);
+ }
+ }
+ else if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ sub_80A1488(2, taskData[15]);
+ sub_80A1654(2, taskData[15]);
+
+ gTasks[taskId].func = sub_809E260;
+ }
+}
+
+#else
+__attribute__((naked))
+void sub_809F814(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r6, r0, 3\n\
+ ldr r0, _0809F83C @ =gTasks + 0x8\n\
+ mov r8, r0\n\
+ adds r4, r6, r0\n\
+ ldrh r1, [r4, 0x1C]\n\
+ movs r2, 0x1C\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0x3\n\
+ bgt _0809F840\n\
+ adds r0, r1, 0x1\n\
+ strh r0, [r4, 0x1C]\n\
+ b _0809F9C0\n\
+ .align 2, 0\n\
+_0809F83C: .4byte gTasks + 0x8\n\
+_0809F840:\n\
+ ldr r7, _0809F874 @ =gMain\n\
+ ldrh r1, [r7, 0x2E]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809F880\n\
+ mov r0, r8\n\
+ subs r0, 0x8\n\
+ adds r0, r6, r0\n\
+ ldr r1, _0809F878 @ =sub_809E260\n\
+ str r1, [r0]\n\
+ movs r0, 0x4\n\
+ strh r0, [r4]\n\
+ movs r0, 0x1\n\
+ strh r0, [r4, 0x1A]\n\
+ ldr r2, _0809F87C @ =gSharedMem + 0x18000\n\
+ ldrh r0, [r4, 0x1E]\n\
+ adds r2, 0x79\n\
+ strb r0, [r2]\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ adds r0, r5, 0\n\
+ bl sub_809E8F0\n\
+ b _0809F9C0\n\
+ .align 2, 0\n\
+_0809F874: .4byte gMain\n\
+_0809F878: .4byte sub_809E260\n\
+_0809F87C: .4byte gSharedMem + 0x18000\n\
+_0809F880:\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809F8B4\n\
+ mov r0, r8\n\
+ subs r0, 0x8\n\
+ adds r0, r6, r0\n\
+ ldr r1, _0809F8AC @ =sub_809E260\n\
+ str r1, [r0]\n\
+ movs r0, 0x4\n\
+ strh r0, [r4]\n\
+ movs r0, 0x1\n\
+ strh r0, [r4, 0x1A]\n\
+ ldr r2, _0809F8B0 @ =gSharedMem + 0x18000\n\
+ ldrh r0, [r4, 0x1E]\n\
+ adds r2, 0x79\n\
+ strb r0, [r2]\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x1\n\
+ bl sub_809E8F0\n\
+ b _0809F9C0\n\
+ .align 2, 0\n\
+_0809F8AC: .4byte sub_809E260\n\
+_0809F8B0: .4byte gSharedMem + 0x18000\n\
+_0809F8B4:\n\
+ movs r0, 0x20\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0809F8C8\n\
+ bl sub_80F9284\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _0809F918\n\
+_0809F8C8:\n\
+ ldr r1, _0809F90C @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r1, 0xB]\n\
+ cmp r0, 0x2\n\
+ beq _0809F9C0\n\
+ cmp r0, 0x3\n\
+ bne _0809F8F4\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x79\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x4\n\
+ bne _0809F8E8\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x7C\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _0809F8F4\n\
+_0809F8E8:\n\
+ movs r0, 0\n\
+ movs r1, 0xE\n\
+ movs r2, 0x9\n\
+ movs r3, 0x12\n\
+ bl MenuZeroFillWindowRect\n\
+_0809F8F4:\n\
+ ldr r1, _0809F910 @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldr r1, _0809F914 @ =sub_809E260\n\
+ str r1, [r0]\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ adds r0, r5, 0\n\
+ b _0809F972\n\
+ .align 2, 0\n\
+_0809F90C: .4byte gSharedMem + 0x18000\n\
+_0809F910: .4byte gTasks\n\
+_0809F914: .4byte sub_809E260\n\
+_0809F918:\n\
+ ldrh r1, [r7, 0x2E]\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0809F92E\n\
+ bl sub_80F9284\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x2\n\
+ bne _0809F994\n\
+_0809F92E:\n\
+ ldr r1, _0809F988 @ =gSharedMem + 0x18000\n\
+ adds r2, r1, 0\n\
+ adds r2, 0x76\n\
+ ldrb r0, [r1, 0xB]\n\
+ ldrb r2, [r2]\n\
+ cmp r0, r2\n\
+ beq _0809F9C0\n\
+ cmp r0, 0x2\n\
+ bne _0809F960\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x79\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x4\n\
+ bne _0809F954\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x7C\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _0809F960\n\
+_0809F954:\n\
+ movs r0, 0\n\
+ movs r1, 0xE\n\
+ movs r2, 0x9\n\
+ movs r3, 0x12\n\
+ bl MenuZeroFillWindowRect\n\
+_0809F960:\n\
+ ldr r1, _0809F98C @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldr r1, _0809F990 @ =sub_809E260\n\
+ str r1, [r0]\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x1\n\
+_0809F972:\n\
+ bl SummaryScreenHandleLeftRightInput\n\
+ ldrb r1, [r4, 0x1E]\n\
+ movs r0, 0x1\n\
+ bl sub_80A1488\n\
+ ldrb r1, [r4, 0x1E]\n\
+ movs r0, 0x1\n\
+ bl sub_80A1654\n\
+ b _0809F9C0\n\
+ .align 2, 0\n\
+_0809F988: .4byte gSharedMem + 0x18000\n\
+_0809F98C: .4byte gTasks\n\
+_0809F990: .4byte sub_809E260\n\
+_0809F994:\n\
+ ldrh r1, [r7, 0x2E]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0809F9A6\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809F9C0\n\
+_0809F9A6:\n\
+ ldrb r1, [r4, 0x1E]\n\
+ movs r0, 0x2\n\
+ bl sub_80A1488\n\
+ ldrb r1, [r4, 0x1E]\n\
+ movs r0, 0x2\n\
+ bl sub_80A1654\n\
+ mov r0, r8\n\
+ subs r0, 0x8\n\
+ adds r0, r6, r0\n\
+ ldr r1, _0809F9CC @ =sub_809E260\n\
+ str r1, [r0]\n\
+_0809F9C0:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0809F9CC: .4byte sub_809E260\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+static void sub_809F9D0(u8 taskId, u8 b)
+{
+ s16 *taskData = gTasks[taskId].data;
+ taskData[14] = 0;
+ taskData[15] = b;
+
+ sub_80A1488(-2, 4);
+ sub_80A1654(-2, 4);
+ MenuZeroFillWindowRect(11, 15, 28, 18);
+ MenuPrint(gOtherText_CantForgetHMs, 11, 15);
+
+ gTasks[taskId].func = sub_809F814;
+}
+
+u8 sub_809FA30(void)
+{
+ return pssData.switchMoveIndex;
+}
+
+// void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d)
+// {
+// u16 *vramAddr = (u16 *)(VRAM + 0xF000);
+
+// vramAddr[(d * 32) + c] = (b * 0x1000) + (a * 2) + 0x200 + 0x80;
+// vramAddr[(d * 32) + c + 32] = (b * 0x1000) + (a * 2) + 0x200 + 0x81;
+// }
+__attribute__((naked))
+void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsls r1, 24\n\
+ lsls r2, 24\n\
+ lsls r3, 24\n\
+ lsrs r2, 23\n\
+ lsrs r3, 18\n\
+ ldr r4, _0809FA70 @ =0x0600f000\n\
+ adds r3, r4\n\
+ adds r2, r3\n\
+ lsrs r1, 12\n\
+ lsrs r0, 23\n\
+ movs r4, 0x80\n\
+ lsls r4, 2\n\
+ adds r3, r4, 0\n\
+ adds r0, r3\n\
+ adds r1, r0\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x80\n\
+ strh r0, [r2]\n\
+ adds r2, 0x40\n\
+ adds r1, 0x81\n\
+ strh r1, [r2]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0809FA70: .4byte 0x0600f000\n\
+ .syntax divided\n");
+}
+
+void GetStringCenterAlignXOffset(u8 a, u8 b, u8 c)
+{
+ GetStringCenterAlignXOffsetWithLetterSpacing(a, 15, b, c);
+}
+
+bool8 sub_809FA94(struct Pokemon *mon)
+{
+ if (!IsShiny(mon))
+ {
+ LoadPalette(sUnknown_083C157C, 4, 2);
+ return FALSE;
+ }
+ else
+ {
+ LoadPalette(sUnknown_083C157E, 4, 2);
+ return TRUE;
+ }
+}
+
+static void sub_809FAC8(struct Pokemon *mon)
+{
+ bool8 shinyDexNum;
+ u16 dexNum;
+ u8 *buffer;
+
+ if (GetMonData(mon, MON_DATA_IS_EGG))
+ {
+ MenuZeroFillWindowRect(1, 2, 4, 3);
+ MenuZeroFillWindowRect(3, 16, 9, 17);
+ MenuZeroFillWindowRect(0, 12, 11, 15);
+ GetMonNickname(mon, gStringVar1);
+ sub_80A1FF8(gStringVar1, 13, 3, 16);
+ LoadPalette(sUnknown_083C157C, 4, 2);
+ }
+ else
+ {
+ shinyDexNum = sub_809FA94(mon);
+ dexNum = SpeciesToPokedexNum(GetMonData(mon, MON_DATA_SPECIES));
+ if (dexNum != 0xFFFF)
+ {
+ if (!shinyDexNum)
+ {
+ GetStringCenterAlignXOffset(2, 1, 2);
+ sub_80A1F98(dexNum, 13, 3, 2, 17, 16, 1);
+ }
+ else
+ {
+ GetStringCenterAlignXOffsetWithLetterSpacing(2, 8, 1, 2);
+ sub_80A1F98(dexNum, 8, 3, 2, 17, 16, 1);
+ }
+ }
+ else
+ {
+ MenuZeroFillWindowRect(1, 2, 4, 3);
+ }
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = GetMonNickname(mon, buffer);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x3C;
+ buffer[3] = EOS;
+ MenuPrint(gStringVar1, 1, 12);
+
+ sub_80A0958(mon);
+ }
+}
+
+static void sub_809FBE4(void)
+{
+ u8 i;
+
+ for (i = 0; i < 28; i++)
+ {
+ sub_80A1918(i, 1);
+ }
+
+ MenuZeroFillWindowRect(11, 4, 29, 18);
+}
+
+static void sub_809FC0C(void)
+{
+ MenuPrint(gOtherText_Type2, 11, 6);
+ GetStringCenterAlignXOffset(0, 22, 4);
+ GetStringCenterAlignXOffset(2, 23, 4);
+}
+
+static void sub_809FC34(struct Pokemon *mon)
+{
+ u8 i;
+ u8 *buffer;
+ u16 friendship;
+ u8 language;
+ u16 species;
+ u8 ability;
+
+ for (i = 0; i < 5; i++)
+ {
+ sub_80A1918(i, 1);
+ }
+
+ MenuZeroFillWindowRect(11, 9, 28, 12);
+ if (GetMonData(mon, MON_DATA_IS_EGG))
+ {
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, gOtherText_OriginalTrainer);
+ buffer = StringCopy(buffer, gOtherText_FiveQuestionsAndSlash);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x4E;
+ buffer[3] = EOS;
+ MenuPrint(gStringVar1, 11, 4);
+
+ sub_80A1EF8(gOtherText_FiveQuestionsAndSlash, 13, 193, 32, 1);
+ sub_80A198C(9, 120, 48, 0);
+
+ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);
+ if (friendship < 6)
+ {
+ MenuPrint(gOtherText_EggAbout, 11, 9);
+ }
+ else if (friendship < 11)
+ {
+ MenuPrint(gOtherText_EggSoon, 11, 9);
+ }
+ else if (friendship < 41)
+ {
+ MenuPrint(gOtherText_EggSomeTime, 11, 9);
+ }
+ else
+ {
+ MenuPrint(gOtherText_EggLongTime, 11, 9);
+ }
+
+ PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14);
+ }
+ else
+ {
+ GetMonData(mon, MON_DATA_OT_NAME, gStringVar2);
+ language = GetMonData(mon, MON_DATA_LANGUAGE);
+ ConvertInternationalString(gStringVar2, language);
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, gOtherText_OriginalTrainer);
+
+ if (GetMonData(mon, MON_DATA_OT_GENDER) == MALE)
+ {
+ buffer = sub_80A1E58(buffer, 9);
+ }
+ else
+ {
+ buffer = sub_80A1E58(buffer, 10);
+ }
+
+ buffer = StringCopy(buffer, gStringVar2);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x4E;
+ buffer[3] = EOS;
+ MenuPrint(gStringVar1, 11, 4);
+
+ sub_80A1F98(GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF, 13, 5, 2, 193, 32, 1);
+
+ species = GetMonData(mon, MON_DATA_SPECIES);
+ sub_80A198C(gBaseStats[species].type1, 120, 48, 0);
+ if (gBaseStats[species].type1 != gBaseStats[species].type2)
+ {
+ sub_80A198C(gBaseStats[species].type2, 160, 48, 1);
+ }
+
+ ability = GetAbilityBySpecies(GetMonData(mon, MON_DATA_SPECIES), GetMonData(mon, MON_DATA_ALT_ABILITY));
+ sub_80A1FF8(gAbilityNames[ability], 13, 11, 9);
+ MenuPrint(gAbilityDescriptions[ability], 11, 11);
+
+ PokemonSummaryScreen_PrintTrainerMemo(mon, 11, 14);
+ }
+}
+
+static void sub_809FE6C(struct Pokemon *mon)
+{
+ sub_809FC0C();
+ sub_809FC34(mon);
+}
+
+static void sub_809FE80(void)
+{
+ MenuZeroFillWindowRect(14, 4, 18, 5);
+ MenuZeroFillWindowRect(25, 4, 30, 5);
+ MenuZeroFillWindowRect(11, 9, 28, 12);
+ MenuZeroFillWindowRect(11, 14, 28, 17);
+}
+
+static void sub_809FEB8(void)
+{
+ sub_80A1FF8(gOtherText_ExpPoints, 13, 11, 14);
+ sub_80A1FF8(gOtherText_NextLv, 13, 11, 16);
+ MenuPrint(gOtherText_Terminator18, 21, 16);
+
+ sub_80A1F48(gOtherText_HP, 13, 11, 7, 42);
+ sub_80A1F48(gOtherText_Attack, 13, 11, 9, 42);
+ sub_80A1F48(gOtherText_Defense, 13, 11, 11, 42);
+ sub_80A1F48(gOtherText_SpAtk, 13, 22, 7, 36);
+ sub_80A1F48(gOtherText_SpDef, 13, 22, 9, 36);
+ sub_80A1F48(gOtherText_Speed, 13, 22, 11, 36);
+}
+
+static void sub_809FF64(struct Pokemon *mon)
+{
+ u8 i;
+ u16 heldItem;
+ u8 *buffer;
+
+ for (i = 0; i < 5; i++)
+ {
+ sub_80A1918(i, 1);
+ }
+
+ heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
+ PrintHeldItemName(heldItem, 11, 4);
+ PrintNumRibbons(mon);
+
+ buffer = gStringVar1;
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_EXP));
+ MenuPrint_RightAligned(buffer, 29, 14);
+ DrawExperienceProgressBar(mon, 23, 16);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_ATK));
+ sub_8072BD8(buffer, 16, 9, 50);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_DEF));
+ sub_8072BD8(buffer, 16, 11, 50);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPATK));
+ sub_8072BD8(buffer, 27, 7, 18);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPDEF));
+ sub_8072BD8(buffer, 27, 9, 18);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPEED));
+ sub_8072BD8(buffer, 27, 11, 18);
+
+ buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_HP), 24, 1);
+ *buffer++ = CHAR_SLASH;
+ buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_MAX_HP), 48, 1);
+
+ MenuPrint_PixelCoords(gStringVar1, 126, 56, 1);
+}
+
+static void sub_80A0090(struct Pokemon *mon)
+{
+ sub_809FEB8();
+ sub_809FF64(mon);
+}
+
+static void sub_80A00A4(void)
+{
+ MenuZeroFillWindowRect(11, 4, 19, 5);
+ MenuZeroFillWindowRect(16, 7, 21, 8);
+ MenuZeroFillWindowRect(17, 9, 21, 12);
+ MenuZeroFillWindowRect(27, 7, 29, 12);
+ MenuZeroFillWindowRect(22, 14, 28, 15);
+ MenuZeroFillWindowRect(23, 16, 28, 17);
+}
+
+static void sub_80A00F4(u8 a)
+{
+ if (pssData.moveToLearn != 0 || a != 4)
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A1FF8(gOtherText_Power2, 13, 1, 15);
+ sub_80A1FF8(gOtherText_Accuracy2, 13, 1, 17);
+ }
+ else
+ {
+ sub_80A1FF8(gOtherText_Appeal2, 13, 1, 15);
+ sub_80A1FF8(gOtherText_Jam2, 13, 1, 17);
+ }
+ }
+}
+
+static void sub_80A015C(struct Pokemon *mon)
+{
+ u8 i;
+ u16 move;
+ u16 curPP;
+ u8 ppBonuses;
+ u8 maxPP;
+ u8 *buffer;
+
+ for (i = 0; i < 4; i++)
+ {
+ move = GetMonMove(mon, i);
+ curPP = GetMonMovePP(mon, i);
+
+ if (move == 0)
+ {
+ sub_80A1918(i, 1);
+ sub_80A1FF8(gOtherText_OneDash, 13, 15, (2 * i) + 4);
+ MenuPrint(gOtherText_TwoDashes, 26, (2 * i) + 4);
+ }
+ else
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A198C(gBattleMoves[move].type, 87, ((2 * i) + 4) * 8, i);
+ }
+ else
+ {
+ sub_80A198C(gContestMoves[move].contestCategory + 18, 87, ((2 * i) + 4) * 8, i);
+ }
+
+ sub_80A1FF8(gMoveNames[move], 13, 15, (2 * i) + 4);
+ GetStringCenterAlignXOffset(1, 24, (2 * i) + 4);
+
+ ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
+ maxPP = CalculatePPWithBonus(move, ppBonuses, i);
+
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, curPP, 14, 1);
+ *buffer++ = CHAR_SLASH;
+ sub_8072C14(buffer, maxPP, 32, 1);
+ MenuPrint(gStringVar1, 25, (2 * i) + 4);
+ }
+ }
+}
+
+static void sub_80A029C(struct Pokemon *mon)
+{
+ u8 *buffer;
+ u16 move;
+ u8 pp;
+
+ if (pssData.moveToLearn == 0)
+ {
+ sub_80A1FF8(gOtherText_CancelNoTerminator, 13, 15, 12);
+ return;
+ }
+
+ move = pssData.moveToLearn;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ sub_80A198C(gBattleMoves[move].type, 87, 96, 4);
+ else
+ sub_80A198C(gContestMoves[move].contestCategory + 18, 87, 96, 4);
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ sub_80A1FF8(gMoveNames[move], 10, 15, 12);
+ else
+ sub_80A1FF8(gMoveNames[move], 9, 15, 12);
+
+ GetStringCenterAlignXOffset(1, 24, 12);
+
+ buffer = gStringVar1;
+ pp = gBattleMoves[move].pp;
+ buffer = sub_8072C14(buffer, pp, 14, 1);
+ *buffer++ = CHAR_SLASH;
+ buffer = sub_8072C14(buffer, pp, 32, 1);
+ MenuPrint(gStringVar1, 25, 12);
+}
+
+static void sub_80A0390(void)
+{
+ u8 i;
+
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ MenuZeroFillWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5);
+ }
+}
+
+u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex)
+{
+ u16 move;
+
+ if (selectedMoveIndex != MAX_MON_MOVES)
+ {
+ move = GetMonMove(mon, selectedMoveIndex);
+ }
+ else
+ {
+ if (pssData.moveToLearn != 0)
+ {
+ move = pssData.moveToLearn;
+ }
+ else
+ {
+ move = 0xFFFF;
+ }
+ }
+
+ return move;
+}
+
+void sub_80A03F0(struct Pokemon *mon, u8 *selectedMoveIndex)
+{
+ u16 move = sub_80A03BC(mon, *selectedMoveIndex);
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A04CC(move);
+ sub_80A057C(0xFFFF);
+ }
+ else
+ {
+ sub_80A057C(move);
+ }
+}
+
+static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex)
+{
+ u16 move = sub_80A03BC(mon, *selectedMoveIndex);
+ MenuZeroFillWindowRect(11, 15, 28, 18);
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A046C(move);
+ }
+ else
+ {
+ sub_80A0498(move);
+ }
+
+ sub_80A03F0(mon, selectedMoveIndex);
+}
+
+static void sub_80A046C(u16 move)
+{
+ if (move == 0xFFFF) return;
+
+ MenuPrint(gMoveDescriptions[move - 1], 11, 15);
+}
+
+static void sub_80A0498(u16 move)
+{
+ if (move == 0xFFFF) return;
+
+ MenuPrint(gContestEffectStrings[gContestMoves[move].effect], 11, 15);
+}
+
+static void sub_80A04CC(u16 move)
+{
+ u8 *buffer;
+
+ if (move == 0xFFFF) return;
+
+ if (gBattleMoves[move].power <= 1)
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1);
+ MenuPrint(gStringVar1, 7, 15);
+ }
+ else
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1);
+ MenuPrint(gStringVar1, 7, 15);
+ }
+
+ if (gBattleMoves[move].accuracy == 0)
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1);
+ MenuPrint(gStringVar1, 7, 17);
+ }
+ else
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1);
+ MenuPrint(gStringVar1, 7, 17);
+ }
+}
+
+#ifdef NONMATCHING // The two vramAddr lines are non-matching.
+static void sub_80A057C(u16 move)
+{
+ u8 appeal;
+ u8 jam;
+ u8 i;
+ u16 *vramAddr = (u16 *)(VRAM + 0x6800);
+
+ if (move == 0xFFFF) return;
+
+ appeal = gContestEffects[gContestMoves[move].effect].appeal;
+ if (appeal != 0xFF)
+ {
+ appeal = appeal / 10;
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ u16 tile = 0x1039;
+ int and = 3;
+ int offset = 0x3CC / 2;
+ if (appeal != 0xFF && i < appeal)
+ {
+ tile = 0x103A;
+ }
+
+ *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile;
+ }
+
+ if (move == 0xFFFF) return;
+
+ jam = gContestEffects[gContestMoves[move].effect].jam;
+ if (jam != 0xFF)
+ {
+ jam = jam / 10;
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ u16 tile = 0x103D;
+ int and = 3;
+ int offset = 0x226;
+ if (jam != 0xFF && i < jam)
+ {
+ tile = 0x103C;
+ }
+
+ *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile;
+ }
+}
+#else
+__attribute__((naked))
+static void sub_80A057C(u16 move)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ ldr r0, _080A0648 @ =0x06006800\n\
+ mov r8, r0\n\
+ ldr r0, _080A064C @ =0x0000ffff\n\
+ cmp r5, r0\n\
+ beq _080A063A\n\
+ ldr r1, _080A0650 @ =gContestEffects\n\
+ ldr r2, _080A0654 @ =gContestMoves\n\
+ lsls r3, r5, 3\n\
+ adds r0, r3, r2\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r4, [r0, 0x1]\n\
+ mov r10, r2\n\
+ mov r9, r3\n\
+ cmp r4, 0xFF\n\
+ beq _080A05B8\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xA\n\
+ bl __udivsi3\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+_080A05B8:\n\
+ movs r2, 0\n\
+ movs r7, 0x3\n\
+ movs r6, 0xF3\n\
+ lsls r6, 2\n\
+_080A05C0:\n\
+ ldr r3, _080A0658 @ =0x00001039\n\
+ cmp r4, 0xFF\n\
+ beq _080A05CC\n\
+ cmp r2, r4\n\
+ bcs _080A05CC\n\
+ adds r3, 0x1\n\
+_080A05CC:\n\
+ lsrs r0, r2, 2\n\
+ lsls r0, 5\n\
+ adds r1, r2, 0\n\
+ ands r1, r7\n\
+ adds r1, r0\n\
+ lsls r1, 1\n\
+ add r1, r8\n\
+ adds r1, r6\n\
+ strh r3, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0x7\n\
+ bls _080A05C0\n\
+ ldr r0, _080A064C @ =0x0000ffff\n\
+ cmp r5, r0\n\
+ beq _080A063A\n\
+ mov r0, r9\n\
+ add r0, r10\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ ldr r1, _080A0650 @ =gContestEffects\n\
+ adds r0, r1\n\
+ ldrb r4, [r0, 0x2]\n\
+ cmp r4, 0xFF\n\
+ beq _080A060C\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xA\n\
+ bl __udivsi3\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+_080A060C:\n\
+ movs r2, 0\n\
+ movs r6, 0x3\n\
+ ldr r5, _080A065C @ =0x0000044c\n\
+_080A0612:\n\
+ ldr r3, _080A0660 @ =0x0000103d\n\
+ cmp r4, 0xFF\n\
+ beq _080A061E\n\
+ cmp r2, r4\n\
+ bcs _080A061E\n\
+ subs r3, 0x1\n\
+_080A061E:\n\
+ lsrs r0, r2, 2\n\
+ lsls r0, 5\n\
+ adds r1, r2, 0\n\
+ ands r1, r6\n\
+ adds r1, r0\n\
+ lsls r1, 1\n\
+ add r1, r8\n\
+ adds r1, r5\n\
+ strh r3, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0x7\n\
+ bls _080A0612\n\
+_080A063A:\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\
+_080A0648: .4byte 0x06006800\n\
+_080A064C: .4byte 0x0000ffff\n\
+_080A0650: .4byte gContestEffects\n\
+_080A0654: .4byte gContestMoves\n\
+_080A0658: .4byte 0x00001039\n\
+_080A065C: .4byte 0x0000044c\n\
+_080A0660: .4byte 0x0000103d\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon)
{
@@ -37,7 +3372,7 @@ bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon)
return FALSE;
}
-void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top)
+static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top)
{
u8 locationMet;
u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME);
@@ -74,12 +3409,12 @@ void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 t
MenuPrint(gOtherText_EggDayCare, left, top);
}
-void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top)
+static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, u8 top)
{
u8 locationMet;
u8 gameMet;
u8 *ptr = gStringVar4;
- u8 nature = GetNature(pokemon);
+ u8 nature = GetNature(mon);
#if ENGLISH
ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14);
@@ -96,11 +3431,11 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
ptr = StringCopy(ptr, gOtherText_Terminator4);
#endif
- if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE)
+ if (PokemonSummaryScreen_CheckOT(mon) == TRUE)
{
- locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION);
+ locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);
- if (GetMonData(pokemon, MON_DATA_MET_LEVEL) == 0)
+ if (GetMonData(mon, MON_DATA_MET_LEVEL) == 0)
{
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5);
*ptr = CHAR_NEWLINE;
@@ -119,7 +3454,7 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
}
else
{
- u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
+ u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL);
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
*ptr = CHAR_NEWLINE;
@@ -132,7 +3467,7 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
}
else
{
- gameMet = GetMonData(pokemon, MON_DATA_MET_GAME);
+ gameMet = GetMonData(mon, MON_DATA_MET_GAME);
if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD))
{
@@ -143,10 +3478,10 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
}
else
{
- locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION);
+ locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);
if (locationMet == 0xFF)
{
- u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
+ u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL);
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
*ptr = CHAR_NEWLINE;
@@ -163,7 +3498,7 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
}
else
{
- u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
+ u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL);
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
*ptr = CHAR_NEWLINE;
@@ -178,3 +3513,2065 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
MenuPrint(gStringVar4, left++, top++);
}
+
+static void sub_80A0958(struct Pokemon *mon)
+{
+ u16 species;
+ u8 *buffer;
+ u8 level;
+
+ species = GetMonData(mon, MON_DATA_SPECIES);
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x11;
+ buffer[2] = 0x7;
+ buffer[3] = CHAR_SLASH;
+ buffer += 4;
+ buffer = StringCopy(buffer, gSpeciesNames[species]);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x50;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 0, 14);
+ MenuZeroFillWindowRect(3, 16, 9, 17);
+
+ level = GetMonData(mon, MON_DATA_LEVEL);
+
+ buffer = sub_80A1E58(gStringVar1, 13);
+ buffer[0] = 0x34;
+ buffer += 1;
+ buffer = ConvertIntToDecimalString(buffer, level);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x20;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 3, 16);
+ sub_80A0A2C(mon, 7, 16);
+}
+
+static void sub_80A0A2C(struct Pokemon *mon, u8 left, u8 top)
+{
+ const u8 *genderSymbol;
+ u8 var1;
+ u8 bottom;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2);
+
+ if (species != SPECIES_NIDORAN_M && species != SPECIES_NIDORAN_F)
+ {
+ u8 gender = GetMonGender(mon);
+ switch (gender)
+ {
+ default:
+ bottom = top + 1;
+ MenuZeroFillWindowRect(left, top, left, bottom);
+ return;
+ case MON_MALE:
+ genderSymbol = gOtherText_MaleSymbol2;
+ var1 = 11;
+ break;
+ case MON_FEMALE:
+ genderSymbol = gOtherText_FemaleSymbolAndLv;
+ var1 = 12;
+ break;
+ }
+
+ sub_80A1FF8(genderSymbol, var1, left, top);
+ }
+}
+
+u8 GetNumRibbons(struct Pokemon *mon)
+{
+ u8 numRibbons = GetMonData(mon, MON_DATA_COOL_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_BEAUTY_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_CUTE_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_SMART_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_TOUGH_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_CHAMPION_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_WINNING_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_VICTORY_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_ARTIST_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_EFFORT_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_1);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_2);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_3);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_4);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_5);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_6);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_7);
+
+ return numRibbons;
+}
+
+static void PrintNumRibbons(struct Pokemon *mon)
+{
+ u8 numRibbons = GetNumRibbons(mon);
+
+ if (numRibbons == 0)
+ {
+ StringCopy(gStringVar1, gOtherText_None);
+ }
+ else
+ {
+ u8 ribbonsStringLength;
+ u8 *text;
+
+ StringCopy(gStringVar1, gOtherText_Ribbons00);
+ ribbonsStringLength = StringLength(gStringVar1);
+
+ text = &gStringVar1[ribbonsStringLength - 2];
+
+ text[0] = EXT_CTRL_CODE_BEGIN;
+ text[1] = 0x14;
+ text[2] = 6;
+ ConvertIntToDecimalStringN(&text[3], numRibbons, 1, 2);
+ }
+
+ MenuPrint(sUnknown_083C15AE, 21, 4);
+}
+
+static void PrintHeldItemName(u16 itemId, u8 left, u8 top)
+{
+ if (itemId == ITEM_ENIGMA_BERRY
+ && sub_80F9344() == TRUE
+ && IsLinkDoubleBattle() == TRUE
+ && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5))
+ {
+ StringCopy(gStringVar1, ItemId_GetItem(itemId)->name);
+ }
+ else if (itemId == 0)
+ {
+ StringCopy(gStringVar1, gOtherText_None);
+ }
+ else
+ {
+ CopyItemName(itemId, gStringVar1);
+ }
+
+ MenuPrint(sUnknown_083C15B4, left, top);
+}
+
+static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top)
+{
+ u32 curExperience;
+ u8 level;
+ u16 species;
+ u8 i;
+ u16 *vramAddr;
+ u32 expToNextLevel = 0;
+ s64 numExpProgressBarTicks = 0;
+
+ curExperience = GetMonData(mon, MON_DATA_EXP);
+ level = GetMonData(mon, MON_DATA_LEVEL);
+ species = GetMonData(mon, MON_DATA_SPECIES);
+
+ // The experience progress bar is shown as empty when the Pokemon is already level 100.
+ if (level < 100)
+ {
+ u32 nextLevelExp;
+ u32 expSinceLastLevel;
+ u32 expBetweenLevels;
+ u32 curLevelExperience;
+
+ nextLevelExp = gExperienceTables[gBaseStats[species].growthRate][level + 1];
+ expToNextLevel = nextLevelExp - curExperience;
+ curLevelExperience = gExperienceTables[gBaseStats[species].growthRate][level];
+ expBetweenLevels = (nextLevelExp - curLevelExperience);
+ expSinceLastLevel = curExperience - curLevelExperience;
+
+ // Calculate the number of 1-pixel "ticks" to illuminate in the experience progress bar.
+ // There are 8 tiles that make up the bar, and each tile has 8 "ticks". Hence, the numerator
+ // is multiplied by 64.
+ numExpProgressBarTicks = (expSinceLastLevel * 64) / expBetweenLevels;
+ if (numExpProgressBarTicks == 0 && expSinceLastLevel != 0)
+ {
+ // Ensure sure some exp. gain is visible in the progress bar.
+ numExpProgressBarTicks = 1;
+ }
+ }
+
+ ConvertIntToDecimalString(gStringVar1, expToNextLevel);
+ MenuPrint_RightAligned(gStringVar1, left + 6, top);
+
+
+ // Draw each of the 8 tiles that make up the experience progress bar.
+ vramAddr = (u16 *)(VRAM + 0x4CAA);
+ for (i = 0; i < 8; i++)
+ {
+ u16 tile;
+ u16 baseTile = 0x2062;
+
+ if (numExpProgressBarTicks > 7)
+ {
+ tile = 0x206A; // full exp. bar block
+ }
+ else
+ {
+ tile = (numExpProgressBarTicks % 8) + baseTile;
+ }
+
+ vramAddr[i] = tile;
+
+ numExpProgressBarTicks -= 8;
+ if (numExpProgressBarTicks < 0)
+ {
+ numExpProgressBarTicks = 0;
+ }
+ }
+}
+
+// Prints the text displayed in the top-left or top-right of the screen.
+// Each of the 4 summary screens displays different text.
+static void PrintSummaryWindowHeaderText(void)
+{
+ u8 *buffer = gStringVar1;
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x12;
+ buffer[2] = 0x2;
+
+ buffer += 3;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerTextId]);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x58;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 0, 0);
+
+ if (pssData.headerActionTextId != 0)
+ {
+ GetStringCenterAlignXOffset(5, 23, 0);
+ GetStringCenterAlignXOffset(6, 24, 0);
+ }
+ else
+ {
+ MenuZeroFillWindowRect(23, 0, 24, 1);
+ }
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerActionTextId]);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x28;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 25, 0);
+}
+
+// If the given pokemon previously had the pokerus virus, a small
+// dot will be drawn in between the pokeball and the mon's level.
+static void DrawPokerusSurvivorDot(struct Pokemon *mon)
+{
+ u16 *vram1 = (u16 *)(VRAM + 0xE444);
+ u16 *vram2 = (u16 *)(VRAM + 0xEC44);
+
+ if (!CheckPartyPokerus(mon, 0) && CheckPartyHasHadPokerus(mon, 0))
+ {
+ *vram1 = 0x2C;
+ *vram2 = 0x2C;
+ }
+ else
+ {
+ *vram1 = 0x081A;
+ *vram2 = 0x081A;
+ }
+}
+
+// Draws the 4 small navigation circles at the top of the pokemon summary screen.
+#ifdef NONMATCHING
+static void DrawSummaryScreenNavigationDots(void)
+{
+ void *dest;
+ u16 arr[8];
+ u8 i = 0;
+ struct PokemonSummaryScreenStruct *SS = (struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000);
+ u16 var1 = 0x4040;
+ u16 var2 = 0x404A;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (i < SS->unk75)
+ {
+ arr[i * 2] = var1;
+ arr[(i * 2) + 1] = var1 + 1;
+ }
+ else if (i > SS->unk76)
+ {
+ arr[i * 2] = var2;
+ arr[(i * 2) + 1] = var2 + 1;
+ }
+ else
+ {
+ if (i < SS->unkB)
+ {
+ arr[i * 2] = 0x4046;
+ arr[(i * 2) + 1] = 0x4046 + 1;
+ }
+
+ if (i == SS->unkB)
+ {
+ if (i != SS->unk76)
+ {
+ arr[i * 2] = 0x4041;
+ arr[(i * 2) + 1] = 0x4041 + 1;
+ }
+ else
+ {
+ arr[i * 2] = 0x404B;
+ arr[(i * 2) + 1] = 0x404B + 1;
+ }
+ }
+
+ if (i > SS->unkB)
+ {
+ if (i != SS->unk76)
+ {
+ arr[i * 2] = 0x4043;
+ arr[(i * 2) + 1] = 0x4043 + 1;
+ }
+ else
+ {
+ arr[i * 2] = 0x4048;
+ arr[(i * 2) + 1] = 0x4048 + 1;
+ }
+ }
+ }
+ }
+
+ dest = (void *)(VRAM + 0xE016);
+ DmaCopy16(3, arr, dest, 16);
+
+ for (i = 0; i < 8; i++)
+ {
+ arr[i] += 0x10;
+ }
+
+ dest = (void *)(VRAM + 0xE056);
+ DmaCopy16(3, arr, dest, 16);
+}
+#else
+__attribute__((naked))
+static void DrawSummaryScreenNavigationDots(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x10\n\
+ movs r3, 0\n\
+ ldr r6, _080A0F24 @ =gSharedMem + 0x18000\n\
+ adds r5, r6, 0\n\
+ ldr r1, _080A0F28 @ =0x00004040\n\
+ mov r8, r1\n\
+ ldr r2, _080A0F2C @ =0x0000404a\n\
+ mov r10, r2\n\
+_080A0F02:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0x75\n\
+ ldrb r0, [r0]\n\
+ cmp r3, r0\n\
+ bcs _080A0F30\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ add r0, sp\n\
+ mov r4, r8\n\
+ strh r4, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ mov r7, sp\n\
+ adds r0, r7, r1\n\
+ strh r4, [r0]\n\
+ b _080A0FE2\n\
+ .align 2, 0\n\
+_080A0F24: .4byte gSharedMem + 0x18000\n\
+_080A0F28: .4byte 0x00004040\n\
+_080A0F2C: .4byte 0x0000404a\n\
+_080A0F30:\n\
+ movs r0, 0x76\n\
+ adds r0, r6\n\
+ mov r12, r0\n\
+ ldrb r1, [r0]\n\
+ cmp r3, r1\n\
+ bls _080A0F52\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ add r0, sp\n\
+ mov r2, r10\n\
+ strh r2, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ mov r4, sp\n\
+ adds r0, r4, r1\n\
+ strh r2, [r0]\n\
+ b _080A0FE2\n\
+_080A0F52:\n\
+ ldrb r4, [r5, 0xB]\n\
+ cmp r3, r4\n\
+ bcs _080A0F6E\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r7, sp\n\
+ adds r2, r7, r0\n\
+ ldr r0, _080A0F88 @ =0x00004046\n\
+ strh r0, [r2]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ add r1, sp\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080A0F6E:\n\
+ cmp r3, r4\n\
+ bne _080A0FA6\n\
+ mov r0, r12\n\
+ ldrb r0, [r0]\n\
+ cmp r3, r0\n\
+ beq _080A0F90\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r4, sp\n\
+ adds r2, r4, r0\n\
+ ldr r0, _080A0F8C @ =0x00004041\n\
+ b _080A0F9A\n\
+ .align 2, 0\n\
+_080A0F88: .4byte 0x00004046\n\
+_080A0F8C: .4byte 0x00004041\n\
+_080A0F90:\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r7, sp\n\
+ adds r2, r7, r0\n\
+ ldr r0, _080A0FC4 @ =0x0000404b\n\
+_080A0F9A:\n\
+ strh r0, [r2]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ add r1, sp\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080A0FA6:\n\
+ ldrb r0, [r5, 0xB]\n\
+ cmp r3, r0\n\
+ bls _080A0FE2\n\
+ adds r0, r6, 0\n\
+ adds r0, 0x76\n\
+ ldrb r0, [r0]\n\
+ cmp r3, r0\n\
+ beq _080A0FCC\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r4, sp\n\
+ adds r2, r4, r0\n\
+ ldr r0, _080A0FC8 @ =0x00004043\n\
+ b _080A0FD6\n\
+ .align 2, 0\n\
+_080A0FC4: .4byte 0x0000404b\n\
+_080A0FC8: .4byte 0x00004043\n\
+_080A0FCC:\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r7, sp\n\
+ adds r2, r7, r0\n\
+ ldr r0, _080A1034 @ =0x00004048\n\
+_080A0FD6:\n\
+ strh r0, [r2]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ add r1, sp\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080A0FE2:\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ cmp r3, 0x3\n\
+ bls _080A0F02\n\
+ ldr r1, _080A1038 @ =0x0600e016\n\
+ ldr r0, _080A103C @ =0x040000d4\n\
+ mov r2, sp\n\
+ str r2, [r0]\n\
+ str r1, [r0, 0x4]\n\
+ ldr r1, _080A1040 @ =0x80000008\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ movs r3, 0\n\
+_080A0FFE:\n\
+ lsls r0, r3, 1\n\
+ mov r4, sp\n\
+ adds r1, r4, r0\n\
+ ldrh r0, [r1]\n\
+ adds r0, 0x10\n\
+ strh r0, [r1]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ cmp r3, 0x7\n\
+ bls _080A0FFE\n\
+ ldr r1, _080A1044 @ =0x0600e056\n\
+ ldr r0, _080A103C @ =0x040000d4\n\
+ str r4, [r0]\n\
+ str r1, [r0, 0x4]\n\
+ ldr r1, _080A1040 @ =0x80000008\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ add sp, 0x10\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\
+_080A1034: .4byte 0x00004048\n\
+_080A1038: .4byte 0x0600e016\n\
+_080A103C: .4byte 0x040000d4\n\
+_080A1040: .4byte 0x80000008\n\
+_080A1044: .4byte 0x0600e056\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+__attribute__((naked))
+void sub_80A1048(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ lsls r0, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ ldr r1, _080A10A0 @ =gTasks + 0x8\n\
+ adds r6, r0, r1\n\
+ ldrh r0, [r6]\n\
+ ldrh r1, [r6, 0x2]\n\
+ adds r0, r1\n\
+ strh r0, [r6, 0x2]\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bne _080A106E\n\
+ b _080A1224\n\
+_080A106E:\n\
+ movs r5, 0x2\n\
+ ldrsh r2, [r6, r5]\n\
+ ldr r0, _080A10A4 @ =0x0000024a\n\
+ subs r0, r2\n\
+ lsls r0, 1\n\
+ ldr r1, _080A10A8 @ =gUnknown_08E73508\n\
+ adds r4, r0, r1\n\
+ ldr r5, _080A10AC @ =0x0600e480\n\
+ lsls r2, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r7, r1, 0\n\
+ cmp r2, r0\n\
+ bhi _080A10B4\n\
+ ldr r0, _080A10B0 @ =0x040000d4\n\
+ str r4, [r0]\n\
+ str r5, [r0, 0x4]\n\
+ lsrs r1, r2, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A10E0\n\
+ .align 2, 0\n\
+_080A10A0: .4byte gTasks + 0x8\n\
+_080A10A4: .4byte 0x0000024a\n\
+_080A10A8: .4byte gUnknown_08E73508\n\
+_080A10AC: .4byte 0x0600e480\n\
+_080A10B0: .4byte 0x040000d4\n\
+_080A10B4:\n\
+ ldr r3, _080A110C @ =0x040000d4\n\
+ str r4, [r3]\n\
+ str r5, [r3, 0x4]\n\
+ ldr r0, _080A1110 @ =0x80000800\n\
+ str r0, [r3, 0x8]\n\
+ ldr r0, [r3, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r4, r0\n\
+ adds r5, r0\n\
+ ldr r1, _080A1114 @ =0xfffff000\n\
+ adds r2, r1\n\
+ cmp r2, r0\n\
+ bhi _080A10B4\n\
+ str r4, [r3]\n\
+ str r5, [r3, 0x4]\n\
+ lsrs r0, r2, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r3, 0x8]\n\
+ ldr r0, [r3, 0x8]\n\
+_080A10E0:\n\
+ movs r5, 0x2\n\
+ ldrsh r0, [r6, r5]\n\
+ ldr r1, _080A1118 @ =0x0000026a\n\
+ subs r1, r0\n\
+ lsls r1, 1\n\
+ adds r3, r1, r7\n\
+ ldr r4, _080A111C @ =0x0600e4c0\n\
+ lsls r1, r0, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ cmp r1, r0\n\
+ bhi _080A1120\n\
+ ldr r0, _080A110C @ =0x040000d4\n\
+ str r3, [r0]\n\
+ str r4, [r0, 0x4]\n\
+ lsrs r1, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A114C\n\
+ .align 2, 0\n\
+_080A110C: .4byte 0x040000d4\n\
+_080A1110: .4byte 0x80000800\n\
+_080A1114: .4byte 0xfffff000\n\
+_080A1118: .4byte 0x0000026a\n\
+_080A111C: .4byte 0x0600e4c0\n\
+_080A1120:\n\
+ ldr r2, _080A1178 @ =0x040000d4\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ ldr r0, _080A117C @ =0x80000800\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r3, r0\n\
+ adds r4, r0\n\
+ ldr r5, _080A1180 @ =0xfffff000\n\
+ adds r1, r5\n\
+ cmp r1, r0\n\
+ bhi _080A1120\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ lsrs r0, r1, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+_080A114C:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r6, r1]\n\
+ ldr r1, _080A1184 @ =0x0000024a\n\
+ subs r1, r0\n\
+ lsls r1, 1\n\
+ adds r3, r1, r7\n\
+ ldr r4, _080A1188 @ =0x0600ec80\n\
+ lsls r1, r0, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ cmp r1, r0\n\
+ bhi _080A118C\n\
+ ldr r0, _080A1178 @ =0x040000d4\n\
+ str r3, [r0]\n\
+ str r4, [r0, 0x4]\n\
+ lsrs r1, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A11B8\n\
+ .align 2, 0\n\
+_080A1178: .4byte 0x040000d4\n\
+_080A117C: .4byte 0x80000800\n\
+_080A1180: .4byte 0xfffff000\n\
+_080A1184: .4byte 0x0000024a\n\
+_080A1188: .4byte 0x0600ec80\n\
+_080A118C:\n\
+ ldr r2, _080A11E4 @ =0x040000d4\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ ldr r0, _080A11E8 @ =0x80000800\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r3, r0\n\
+ adds r4, r0\n\
+ ldr r5, _080A11EC @ =0xfffff000\n\
+ adds r1, r5\n\
+ cmp r1, r0\n\
+ bhi _080A118C\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ lsrs r0, r1, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+_080A11B8:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r6, r1]\n\
+ ldr r1, _080A11F0 @ =0x0000026a\n\
+ subs r1, r0\n\
+ lsls r1, 1\n\
+ adds r3, r1, r7\n\
+ ldr r4, _080A11F4 @ =0x0600ecc0\n\
+ lsls r1, r0, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ cmp r1, r0\n\
+ bhi _080A11F8\n\
+ ldr r0, _080A11E4 @ =0x040000d4\n\
+ str r3, [r0]\n\
+ str r4, [r0, 0x4]\n\
+ lsrs r1, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A1224\n\
+ .align 2, 0\n\
+_080A11E4: .4byte 0x040000d4\n\
+_080A11E8: .4byte 0x80000800\n\
+_080A11EC: .4byte 0xfffff000\n\
+_080A11F0: .4byte 0x0000026a\n\
+_080A11F4: .4byte 0x0600ecc0\n\
+_080A11F8:\n\
+ ldr r2, _080A12B0 @ =0x040000d4\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ ldr r0, _080A12B4 @ =0x80000800\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r3, r0\n\
+ adds r4, r0\n\
+ ldr r5, _080A12B8 @ =0xfffff000\n\
+ adds r1, r5\n\
+ cmp r1, r0\n\
+ bhi _080A11F8\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ lsrs r0, r1, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+_080A1224:\n\
+ ldrb r4, [r6, 0x2]\n\
+ ldrh r7, [r6, 0x2]\n\
+ ldrh r0, [r6]\n\
+ mov r12, r0\n\
+ cmp r4, 0x9\n\
+ bhi _080A1272\n\
+ adds r3, r6, 0x4\n\
+ ldr r2, _080A12B0 @ =0x040000d4\n\
+ ldr r5, _080A12BC @ =0x80000001\n\
+_080A1236:\n\
+ lsls r1, r4, 1\n\
+ ldr r6, _080A12C0 @ =0x0600e480\n\
+ adds r0, r1, r6\n\
+ str r3, [r2]\n\
+ str r0, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ adds r6, 0x40\n\
+ adds r0, r1, r6\n\
+ str r3, [r2]\n\
+ str r0, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ ldr r6, _080A12C4 @ =0x0600ec80\n\
+ adds r0, r1, r6\n\
+ str r3, [r2]\n\
+ str r0, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ ldr r0, _080A12C8 @ =0x0600ecc0\n\
+ adds r1, r0\n\
+ str r3, [r2]\n\
+ str r1, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x9\n\
+ bls _080A1236\n\
+_080A1272:\n\
+ mov r1, r12\n\
+ lsls r0, r1, 16\n\
+ cmp r0, 0\n\
+ beq _080A1286\n\
+ lsls r0, r7, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0\n\
+ ble _080A1286\n\
+ cmp r0, 0x9\n\
+ ble _080A12A4\n\
+_080A1286:\n\
+ lsls r0, r7, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x9\n\
+ ble _080A129A\n\
+ ldr r0, _080A12CC @ =gOtherText_Status\n\
+ movs r1, 0xD\n\
+ movs r2, 0x1\n\
+ movs r3, 0x12\n\
+ bl sub_80A1FF8\n\
+_080A129A:\n\
+ bl sub_80A1D18\n\
+ mov r0, r8\n\
+ bl DestroyTask\n\
+_080A12A4:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080A12B0: .4byte 0x040000d4\n\
+_080A12B4: .4byte 0x80000800\n\
+_080A12B8: .4byte 0xfffff000\n\
+_080A12BC: .4byte 0x80000001\n\
+_080A12C0: .4byte 0x0600e480\n\
+_080A12C4: .4byte 0x0600ec80\n\
+_080A12C8: .4byte 0x0600ecc0\n\
+_080A12CC: .4byte gOtherText_Status\n\
+ .syntax divided\n");
+}
+
+static void sub_80A12D0(s8 a)
+{
+ u8 newTaskId;
+
+ MenuZeroFillWindowRect(1, 18, 5, 19);
+ sub_80A18E4(29);
+
+ newTaskId = CreateTask(sub_80A1048, 0);
+ gTasks[newTaskId].data[0] = a;
+
+ if (a < 0)
+ {
+ gTasks[newTaskId].data[1] = 10;
+ }
+ else
+ {
+ gTasks[newTaskId].data[1] = 0;
+ }
+
+ gTasks[newTaskId].data[2] = 1;
+}
+
+// void sub_80A1334(u8 taskId)
+// {
+// u8 i;
+// s16 var1;
+
+// gTasks[taskId].data[1] += gTasks[taskId].data[0];
+
+// var1 = 0;
+// if (gTasks[taskId].data[1] >= 0)
+// {
+// var1 = 10;
+// if (gTasks[taskId].data[1] < 10)
+// {
+// var1 = gTasks[taskId].data[1];
+// }
+// }
+
+// if (var1 > 0)
+// {
+// u8 *vramAddr = (u8 *)(VRAM + 0x5B40);
+// for (i = 0; i < 7; i++)
+// {
+// CpuSet(&gUnknown_08E73E88[(i + 13) * 64], vramAddr, var1 & 0x1FFFFF);
+// vramAddr += 64;
+// }
+// }
+
+// if (var1 <= 9)
+// {
+// u8 *vramAddr = (u8 *)(VRAM + 0x5B40);
+// for (i = 0; i < 64; i++)
+// {
+// u16 val = gTasks[taskId].data[2];
+// CpuSet(&val, vramAddr, ((10 - var1) & 0x1FFFFF) | 0x800000);
+// }
+// }
+// else
+// {
+// MenuZeroFillWindowRect(0, 19, 9, 19);
+// }
+
+// if (gTasks[taskId].data[0] == 0 || gTasks[taskId].data[1] < 0)
+// {
+// if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+// {
+// MenuZeroFillWindowRect(0, 14, 9, 18);
+// sub_80A0958(pssData.loadedMon);
+
+// if (GetMonStatusAndPokerus(pssData.loadedMon))
+// {
+// sub_80A1FF8(gOtherText_Status, 13, 1, 18);
+// }
+
+// DestroyTask(taskId);
+// }
+// }
+
+// if (gTasks[taskId].data[1] > 9)
+// {
+// if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+// {
+// sub_80A00F4(gTasks[taskId].data[3]);
+// }
+
+// sub_80A0428(pssData.loadedMon, &gTasks[taskId].data[3]);
+// DestroyTask(taskId);
+// }
+// }
+__attribute__((naked))
+static void sub_80A1334(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r0, 2\n\
+ add r0, r10\n\
+ lsls r0, 3\n\
+ ldr r1, _080A13E4 @ =gTasks + 0x8\n\
+ adds r7, r0, r1\n\
+ ldrh r0, [r7]\n\
+ ldrh r1, [r7, 0x2]\n\
+ adds r0, r1\n\
+ strh r0, [r7, 0x2]\n\
+ lsls r0, 16\n\
+ asrs r1, r0, 16\n\
+ movs r0, 0\n\
+ cmp r1, 0\n\
+ blt _080A136A\n\
+ movs r0, 0xA\n\
+ cmp r1, 0xA\n\
+ bgt _080A136A\n\
+ ldrh r0, [r7, 0x2]\n\
+_080A136A:\n\
+ lsls r0, 16\n\
+ asrs r2, r0, 16\n\
+ mov r9, r0\n\
+ cmp r2, 0\n\
+ ble _080A13A6\n\
+ movs r0, 0xA\n\
+ subs r0, r2\n\
+ lsls r0, 1\n\
+ ldr r1, _080A13E8 @ =0x06005b40\n\
+ adds r4, r0, r1\n\
+ movs r5, 0\n\
+ adds r6, r2, 0\n\
+ ldr r0, _080A13EC @ =0x001fffff\n\
+ mov r8, r0\n\
+_080A1386:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xD\n\
+ lsls r0, 6\n\
+ ldr r1, _080A13F0 @ =gUnknown_08E73E88\n\
+ adds r0, r1\n\
+ adds r1, r4, 0\n\
+ mov r2, r8\n\
+ ands r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A1386\n\
+_080A13A6:\n\
+ mov r1, r9\n\
+ asrs r2, r1, 16\n\
+ cmp r2, 0x9\n\
+ bgt _080A13F4\n\
+ ldr r4, _080A13E8 @ =0x06005b40\n\
+ movs r5, 0\n\
+ mov r8, sp\n\
+ movs r0, 0xA\n\
+ subs r6, r0, r2\n\
+ ldr r0, _080A13EC @ =0x001fffff\n\
+ ands r6, r0\n\
+ movs r0, 0x80\n\
+ lsls r0, 17\n\
+ mov r9, r0\n\
+_080A13C2:\n\
+ ldrh r0, [r7, 0x4]\n\
+ mov r1, r8\n\
+ strh r0, [r1]\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ mov r2, r9\n\
+ orrs r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A13C2\n\
+ b _080A1400\n\
+ .align 2, 0\n\
+_080A13E4: .4byte gTasks + 0x8\n\
+_080A13E8: .4byte 0x06005b40\n\
+_080A13EC: .4byte 0x001fffff\n\
+_080A13F0: .4byte gUnknown_08E73E88\n\
+_080A13F4:\n\
+ movs r0, 0\n\
+ movs r1, 0x13\n\
+ movs r2, 0x9\n\
+ movs r3, 0x13\n\
+ bl MenuZeroFillWindowRect\n\
+_080A1400:\n\
+ movs r1, 0\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ beq _080A1410\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ bge _080A144A\n\
+_080A1410:\n\
+ ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x2\n\
+ bne _080A1444\n\
+ movs r0, 0\n\
+ movs r1, 0xE\n\
+ movs r2, 0x9\n\
+ movs r3, 0x12\n\
+ bl MenuZeroFillWindowRect\n\
+ adds r4, 0x10\n\
+ adds r0, r4, 0\n\
+ bl sub_80A0958\n\
+ adds r0, r4, 0\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080A1444\n\
+ ldr r0, _080A1484 @ =gOtherText_Status\n\
+ movs r1, 0xD\n\
+ movs r2, 0x1\n\
+ movs r3, 0x12\n\
+ bl sub_80A1FF8\n\
+_080A1444:\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A144A:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0x9\n\
+ ble _080A1470\n\
+ ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x2\n\
+ bne _080A1460\n\
+ ldrb r0, [r7, 0x6]\n\
+ bl sub_80A00F4\n\
+_080A1460:\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x10\n\
+ adds r1, r7, 0x6\n\
+ bl sub_80A0428\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A1470:\n\
+ add sp, 0x4\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\
+_080A1480: .4byte gSharedMem + 0x18000\n\
+_080A1484: .4byte gOtherText_Status\n\
+ .syntax divided\n");
+}
+
+// Related to re-drawing the summary area underneath the pokemon's picture
+// in all of the summary screen tabs.
+static void sub_80A1488(s8 a, u8 b)
+{
+ u8 taskId;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 19);
+ }
+
+ taskId = FindTaskIdByFunc(sub_80A1334);
+ if (taskId == 0xFF)
+ {
+ taskId = CreateTask(sub_80A1334, 0);
+ }
+
+ gTasks[taskId].data[0] = (s8)a;
+
+ if ((s8)a < 0)
+ {
+ gTasks[taskId].data[1] = 10;
+ }
+ else
+ {
+ gTasks[taskId].data[1] = 0;
+ }
+
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = b;
+}
+
+__attribute__((naked))
+static void sub_80A1500(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r0, 2\n\
+ add r0, r10\n\
+ lsls r0, 3\n\
+ ldr r1, _080A15B0 @ =gTasks + 0x8\n\
+ adds r7, r0, r1\n\
+ ldrh r0, [r7]\n\
+ ldrh r1, [r7, 0x2]\n\
+ adds r0, r1\n\
+ strh r0, [r7, 0x2]\n\
+ lsls r0, 16\n\
+ asrs r1, r0, 16\n\
+ movs r0, 0\n\
+ cmp r1, 0\n\
+ blt _080A1536\n\
+ movs r0, 0xA\n\
+ cmp r1, 0xA\n\
+ bgt _080A1536\n\
+ ldrh r0, [r7, 0x2]\n\
+_080A1536:\n\
+ lsls r0, 16\n\
+ asrs r2, r0, 16\n\
+ mov r9, r0\n\
+ cmp r2, 0\n\
+ ble _080A1572\n\
+ movs r0, 0xA\n\
+ subs r0, r2\n\
+ lsls r0, 1\n\
+ ldr r1, _080A15B4 @ =0x06006b40\n\
+ adds r4, r0, r1\n\
+ movs r5, 0\n\
+ adds r6, r2, 0\n\
+ ldr r0, _080A15B8 @ =0x001fffff\n\
+ mov r8, r0\n\
+_080A1552:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xD\n\
+ lsls r0, 6\n\
+ ldr r1, _080A15BC @ =gUnknown_08E74688\n\
+ adds r0, r1\n\
+ adds r1, r4, 0\n\
+ mov r2, r8\n\
+ ands r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A1552\n\
+_080A1572:\n\
+ mov r1, r9\n\
+ asrs r2, r1, 16\n\
+ cmp r2, 0x9\n\
+ bgt _080A15C0\n\
+ ldr r4, _080A15B4 @ =0x06006b40\n\
+ movs r5, 0\n\
+ mov r8, sp\n\
+ movs r0, 0xA\n\
+ subs r6, r0, r2\n\
+ ldr r0, _080A15B8 @ =0x001fffff\n\
+ ands r6, r0\n\
+ movs r0, 0x80\n\
+ lsls r0, 17\n\
+ mov r9, r0\n\
+_080A158E:\n\
+ ldrh r0, [r7, 0x4]\n\
+ mov r1, r8\n\
+ strh r0, [r1]\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ mov r2, r9\n\
+ orrs r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A158E\n\
+ b _080A15CC\n\
+ .align 2, 0\n\
+_080A15B0: .4byte gTasks + 0x8\n\
+_080A15B4: .4byte 0x06006b40\n\
+_080A15B8: .4byte 0x001fffff\n\
+_080A15BC: .4byte gUnknown_08E74688\n\
+_080A15C0:\n\
+ movs r0, 0\n\
+ movs r1, 0x13\n\
+ movs r2, 0x9\n\
+ movs r3, 0x13\n\
+ bl MenuZeroFillWindowRect\n\
+_080A15CC:\n\
+ movs r1, 0\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ beq _080A15DC\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ bge _080A1616\n\
+_080A15DC:\n\
+ ldr r4, _080A164C @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x3\n\
+ bne _080A1610\n\
+ movs r0, 0\n\
+ movs r1, 0xE\n\
+ movs r2, 0x9\n\
+ movs r3, 0x12\n\
+ bl MenuZeroFillWindowRect\n\
+ adds r4, 0x10\n\
+ adds r0, r4, 0\n\
+ bl sub_80A0958\n\
+ adds r0, r4, 0\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080A1610\n\
+ ldr r0, _080A1650 @ =gOtherText_Status\n\
+ movs r1, 0xD\n\
+ movs r2, 0x1\n\
+ movs r3, 0x12\n\
+ bl sub_80A1FF8\n\
+_080A1610:\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A1616:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0x9\n\
+ ble _080A163C\n\
+ ldr r4, _080A164C @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x3\n\
+ bne _080A162C\n\
+ ldrb r0, [r7, 0x6]\n\
+ bl sub_80A00F4\n\
+_080A162C:\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x10\n\
+ adds r1, r7, 0x6\n\
+ bl sub_80A0428\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A163C:\n\
+ add sp, 0x4\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\
+_080A164C: .4byte gSharedMem + 0x18000\n\
+_080A1650: .4byte gOtherText_Status\n\
+ .syntax divided\n");
+}
+
+static void sub_80A1654(s8 a, u8 b)
+{
+ u8 taskId;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 19);
+ }
+
+ taskId = FindTaskIdByFunc(sub_80A1500);
+ if (taskId == 0xFF)
+ {
+ taskId = CreateTask(sub_80A1500, 0);
+ }
+
+ gTasks[taskId].data[0] = (s8)a;
+
+ if ((s8)a < 0)
+ {
+ gTasks[taskId].data[1] = 10;
+ }
+ else
+ {
+ gTasks[taskId].data[1] = 0;
+ }
+
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = b;
+}
+
+#ifdef NONMATCHING
+static void sub_80A16CC(u8 a)
+{
+ u8 i;
+ u16 *vramAddr = (u16 *)(VRAM + 0x6AD4);
+
+ if (a == 0)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94510[i] + 0x1000;
+ vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x1000;
+ vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x1000;
+ }
+ }
+ else
+ {
+ i = 0;
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94550[i] + 0x1000;
+ vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x1000;
+ vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x1000;
+ }
+ }
+
+ vramAddr = (u16 *)(VRAM + 0x5AD4);
+
+ if (a == 0)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94510[i] + 0x3000;
+ vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x3000;
+ vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x3000;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94550[i] + 0x3000;
+ vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x3000;
+ vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x3000;
+ }
+ }
+}
+#else
+__attribute__((naked))
+static void sub_80A16CC(u8 a)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+ ldr r0, _080A1724 @ =0x06006ad4\n\
+ mov r12, r0\n\
+ mov r1, r9\n\
+ cmp r1, 0\n\
+ bne _080A172C\n\
+ movs r5, 0\n\
+ ldr r7, _080A1728 @ =gUnknown_08E94510\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r6, r0, 0\n\
+ movs r1, 0x40\n\
+ adds r1, r7\n\
+ mov r8, r1\n\
+_080A16F4:\n\
+ lsls r2, r5, 1\n\
+ mov r0, r12\n\
+ adds r3, r2, r0\n\
+ adds r4, r2, r7\n\
+ ldrh r1, [r4]\n\
+ adds r0, r6, r1\n\
+ strh r0, [r3]\n\
+ adds r1, r3, 0\n\
+ adds r1, 0x40\n\
+ ldrh r4, [r4]\n\
+ adds r0, r6, r4\n\
+ strh r0, [r1]\n\
+ adds r3, 0x80\n\
+ add r2, r8\n\
+ ldrh r2, [r2]\n\
+ adds r0, r6, r2\n\
+ strh r0, [r3]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A16F4\n\
+ b _080A1768\n\
+ .align 2, 0\n\
+_080A1724: .4byte 0x06006ad4\n\
+_080A1728: .4byte gUnknown_08E94510\n\
+_080A172C:\n\
+ movs r5, 0\n\
+ ldr r6, _080A17B0 @ =gUnknown_08E94550\n\
+ movs r7, 0x80\n\
+ lsls r7, 5\n\
+ adds r4, r7, 0\n\
+ movs r0, 0x40\n\
+ adds r0, r6\n\
+ mov r8, r0\n\
+_080A173C:\n\
+ lsls r1, r5, 1\n\
+ mov r7, r12\n\
+ adds r2, r1, r7\n\
+ adds r0, r1, r6\n\
+ ldrh r0, [r0]\n\
+ adds r0, r4, r0\n\
+ strh r0, [r2]\n\
+ adds r3, r2, 0\n\
+ adds r3, 0x40\n\
+ add r1, r8\n\
+ ldrh r7, [r1]\n\
+ adds r0, r4, r7\n\
+ strh r0, [r3]\n\
+ adds r2, 0x80\n\
+ ldrh r1, [r1]\n\
+ adds r0, r4, r1\n\
+ strh r0, [r2]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A173C\n\
+_080A1768:\n\
+ ldr r0, _080A17B4 @ =0x06005ad4\n\
+ mov r12, r0\n\
+ mov r1, r9\n\
+ cmp r1, 0\n\
+ bne _080A17BC\n\
+ movs r5, 0\n\
+ ldr r7, _080A17B8 @ =gUnknown_08E94510\n\
+ movs r0, 0xC0\n\
+ lsls r0, 6\n\
+ adds r6, r0, 0\n\
+ movs r1, 0x40\n\
+ adds r1, r7\n\
+ mov r8, r1\n\
+_080A1782:\n\
+ lsls r2, r5, 1\n\
+ mov r0, r12\n\
+ adds r3, r2, r0\n\
+ adds r4, r2, r7\n\
+ ldrh r1, [r4]\n\
+ adds r0, r6, r1\n\
+ strh r0, [r3]\n\
+ adds r1, r3, 0\n\
+ adds r1, 0x40\n\
+ ldrh r4, [r4]\n\
+ adds r0, r6, r4\n\
+ strh r0, [r1]\n\
+ adds r3, 0x80\n\
+ add r2, r8\n\
+ ldrh r2, [r2]\n\
+ adds r0, r6, r2\n\
+ strh r0, [r3]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A1782\n\
+ b _080A17F8\n\
+ .align 2, 0\n\
+_080A17B0: .4byte gUnknown_08E94550\n\
+_080A17B4: .4byte 0x06005ad4\n\
+_080A17B8: .4byte gUnknown_08E94510\n\
+_080A17BC:\n\
+ movs r5, 0\n\
+ ldr r6, _080A1804 @ =gUnknown_08E94550\n\
+ movs r7, 0xC0\n\
+ lsls r7, 6\n\
+ adds r4, r7, 0\n\
+ movs r0, 0x40\n\
+ adds r0, r6\n\
+ mov r8, r0\n\
+_080A17CC:\n\
+ lsls r1, r5, 1\n\
+ mov r7, r12\n\
+ adds r2, r1, r7\n\
+ adds r0, r1, r6\n\
+ ldrh r0, [r0]\n\
+ adds r0, r4, r0\n\
+ strh r0, [r2]\n\
+ adds r3, r2, 0\n\
+ adds r3, 0x40\n\
+ add r1, r8\n\
+ ldrh r7, [r1]\n\
+ adds r0, r4, r7\n\
+ strh r0, [r3]\n\
+ adds r2, 0x80\n\
+ ldrh r1, [r1]\n\
+ adds r0, r4, r1\n\
+ strh r0, [r2]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A17CC\n\
+_080A17F8:\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\
+_080A1804: .4byte gUnknown_08E94550\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+u8 sub_80A1808(struct Pokemon *mon)
+{
+ u16 species;
+ u8 spriteId;
+
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ spriteId = CreateSprite(&gUnknown_02024E8C, 40, 64, 5);
+
+ FreeSpriteOamMatrix(&gSprites[spriteId]);
+
+ gSprites[spriteId].data[0] = species;
+ gSprites[spriteId].callback = sub_80A1888;
+
+ if (!IsPokeSpriteNotFlipped(species))
+ {
+ gSprites[spriteId].hFlip = 1;
+ }
+ else
+ {
+ gSprites[spriteId].hFlip = 0;
+ }
+
+ return spriteId;
+}
+
+static void sub_80A1888(struct Sprite *sprite)
+{
+ if (!gPaletteFade.active)
+ {
+ sprite->callback = SpriteCallbackDummy;
+
+ if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ PlayCry1(sprite->data[0], 0);
+ }
+ }
+}
+
+static void sub_80A18C4(void)
+{
+ u8 i;
+
+ for (i = 0; i < 30; i++)
+ {
+ ewram1A000[i] = 0xFF;
+ }
+}
+
+static void sub_80A18E4(u8 a)
+{
+ if (ewram1A000[a] != 0xFF)
+ {
+ DestroySprite(&gSprites[ewram1A000[a]]);
+ ewram1A000[a] = 0xFF;
+ }
+}
+
+static void sub_80A1918(u8 a, u8 invisible)
+{
+ gSprites[ewram1A000[a]].invisible = invisible;
+}
+
+static void sub_80A1950(void)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (ewram1A000[i] == 0xFF)
+ {
+ ewram1A000[i] = CreateSprite(&sSpriteTemplate_83C11C0, 0, 0, 2);
+ }
+
+ sub_80A1918(i, 1);
+ }
+}
+
+static void sub_80A198C(u8 animNum, u8 x, u8 y, u8 d)
+{
+ StartSpriteAnim(&gSprites[ewram1A000[d]], animNum);
+
+ gSprites[ewram1A000[d]].oam.paletteNum = sUnknown_PaletteNums[animNum];
+ gSprites[ewram1A000[d]].pos1.x = x + 16;
+ gSprites[ewram1A000[d]].pos1.y = y + 8;
+
+ sub_80A1918(d, 0);
+}
+
+static void sub_80A1A30(u8 a)
+{
+ u8 i;
+ s16 x;
+ u8 subPriority = 0;
+
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES)
+ {
+ if (a == 9)
+ {
+ subPriority = 1;
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ x = (i * 16) + 0x58;
+ ewram1A000[a + i] = CreateSprite(&sSpriteTemplate_83C1280, x, 40, subPriority);
+
+ if (i == 0)
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[a]], 4);
+ }
+ else if (i == 9)
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[a + i]], 5);
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[a + i]], 6);
+ }
+
+ gSprites[ewram1A000[a + i]].callback = sub_80A1BC0;
+ gSprites[ewram1A000[a + i]].data[0] = a;
+ gSprites[ewram1A000[a + i]].data[1] = 0;
+ }
+ }
+}
+
+static void sub_80A1B1C(u8 a)
+{
+ u8 i;
+
+ for (i = 0; i < 10; i++)
+ {
+ sub_80A18E4(a + i);
+ }
+}
+
+static void sub_80A1B40(u8 a)
+{
+ u8 i;
+ a *= 3;
+
+ StartSpriteAnim(&gSprites[ewram1A000[9]], a + 4);
+
+ for (i = 0; i < 8; i++)
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[10 + i]], a + 6);
+ }
+
+ StartSpriteAnim(&gSprites[ewram1A000[18]], a + 5);
+}
+
+static void sub_80A1BC0(struct Sprite *sprite)
+{
+ u8 animNum = sprite->animNum - 4;
+ if (animNum < 3)
+ {
+ sprite->data[1] = (sprite->data[1] + 1) & 0x1F;
+
+ if (sprite->data[1] > 24)
+ {
+ sprite->invisible = 1;
+ }
+ else
+ {
+ sprite->invisible = 0;
+ }
+ }
+ else
+ {
+ sprite->data[1] = 0;
+ sprite->invisible = 0;
+ }
+
+ if (sprite->data[0] == 9)
+ {
+ sprite->pos2.y = pssData.selectedMoveIndex * 16;
+ }
+ else
+ {
+ sprite->pos2.y = pssData.switchMoveIndex * 16;
+ }
+}
+
+__attribute__((naked))
+void sub_80A1C30(u8 a)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r0, r4, 2\n\
+ adds r0, r4\n\
+ lsls r0, 25\n\
+ lsrs r3, r0, 24\n\
+ adds r4, r3, 0\n\
+ adds r0, r3, 0\n\
+ adds r0, 0xA\n\
+ cmp r3, r0\n\
+ bge _080A1C82\n\
+ ldr r5, _080A1C88 @ =gSprites\n\
+ movs r7, 0x5\n\
+ negs r7, r7\n\
+ ldr r6, _080A1C8C @ =gSharedMem + 0x1A009\n\
+_080A1C50:\n\
+ adds r2, r3, r6\n\
+ ldrb r1, [r2]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r5\n\
+ movs r1, 0\n\
+ strh r1, [r0, 0x30]\n\
+ ldrb r0, [r2]\n\
+ lsls r1, r0, 4\n\
+ adds r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r5\n\
+ adds r1, 0x3E\n\
+ ldrb r2, [r1]\n\
+ adds r0, r7, 0\n\
+ ands r0, r2\n\
+ strb r0, [r1]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ adds r0, r4, 0\n\
+ adds r0, 0xA\n\
+ cmp r3, r0\n\
+ blt _080A1C50\n\
+_080A1C82:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080A1C88: .4byte gSprites\n\
+_080A1C8C: .4byte gSharedMem + 0x1A009\n\
+ .syntax divided\n");
+}
+
+u8 pokemon_ailments_get_primary(u32 status)
+{
+ if (status & 0x88)
+ return 1;
+ if (status & 0x40)
+ return 2;
+ if (status & 0x7)
+ return 3;
+ if (status & 0x20)
+ return 4;
+ if (status & 0x10)
+ return 5;
+
+ return 0;
+}
+
+u8 GetMonStatusAndPokerus(struct Pokemon *mon)
+{
+ u8 statusAilment;
+
+ if (GetMonData(mon, MON_DATA_HP) == 0)
+ {
+ return 7;
+ }
+
+ statusAilment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS));
+ if (statusAilment == 0)
+ {
+ if (!CheckPartyPokerus(mon, 0))
+ {
+ return 0;
+ }
+ else
+ {
+ return 6;
+ }
+ }
+
+ return statusAilment;
+}
+
+#ifdef NONMATCHING
+void sub_80A1D18(void)
+{
+ struct Pokemon mon;
+ u8 statusAndPkrs;
+ u8 statusAndPkrs2;
+
+ sub_809F678(&mon);
+ statusAndPkrs = GetMonStatusAndPokerus(&mon);
+
+ if (statusAndPkrs)
+ {
+ statusAndPkrs2 = statusAndPkrs - 1;
+
+ if (ewram1A000[29] == 0xFF)
+ {
+ ewram1A000[29] = CreateSprite(&sSpriteTemplate_83C1304, 64, 152, 0);
+ }
+ }
+ else
+ {
+ sub_80A18E4(29);
+ return;
+ }
+
+ StartSpriteAnim(&gSprites[ewram1A000[29]], statusAndPkrs2);
+}
+#else
+__attribute__((naked))
+void sub_80A1D18(void)
+{
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ sub sp, 0x64\n\
+ mov r0, sp\n\
+ bl sub_809F678\n\
+ mov r0, sp\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0\n\
+ beq _080A1D58\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ ldr r4, _080A1D50 @ =gSharedMem + 0x1A01D\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0xFF\n\
+ bne _080A1D60\n\
+ ldr r0, _080A1D54 @ =sSpriteTemplate_83C1304\n\
+ movs r1, 0x40\n\
+ movs r2, 0x98\n\
+ movs r3, 0\n\
+ bl CreateSprite\n\
+ strb r0, [r4]\n\
+ b _080A1D60\n\
+ .align 2, 0\n\
+_080A1D50: .4byte gSharedMem + 0x1A01D\n\
+_080A1D54: .4byte sSpriteTemplate_83C1304\n\
+_080A1D58:\n\
+ movs r0, 0x1D\n\
+ bl sub_80A18E4\n\
+ b _080A1D74\n\
+_080A1D60:\n\
+ ldr r0, _080A1D7C @ =gSharedMem + 0x1A01D\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ ldr r1, _080A1D80 @ =gSprites\n\
+ adds r0, r1\n\
+ adds r1, r5, 0\n\
+ bl StartSpriteAnim\n\
+_080A1D74:\n\
+ add sp, 0x64\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080A1D7C: .4byte gSharedMem + 0x1A01D\n\
+_080A1D80: .4byte gSprites\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+static void sub_80A1D84(struct Pokemon *mon)
+{
+ struct Sprite *sprite;
+
+ sprite = sub_80F7920(0x7533, 0x7533, sSummaryScreenMonMarkingsPalette);
+ gUnknown_020384F4 = sprite;
+
+ if (sprite != NULL)
+ {
+ u8 markings = GetMonData(mon, MON_DATA_MARKINGS);
+ StartSpriteAnim(sprite, markings);
+
+ gUnknown_020384F4->pos1.x = 60;
+ gUnknown_020384F4->pos1.y = 26;
+ }
+}
+
+static void sub_80A1DCC(struct Pokemon *mon)
+{
+ DestroySprite(gUnknown_020384F4);
+ sub_80A1D84(mon);
+}
+
+static void sub_80A1DE8(struct Pokemon *mon)
+{
+ u8 ball = ball_number_to_ball_processing_index(GetMonData(mon, MON_DATA_POKEBALL));
+ sub_80478DC(ball);
+
+ pssData.ballSpriteId = CreateSprite(&gBallSpriteTemplates[ball], 6, 136, 0);
+ gSprites[pssData.ballSpriteId].callback = SpriteCallbackDummy;
+ gSprites[pssData.ballSpriteId].oam.priority = 3;
+}
+
+static u8 *sub_80A1E58(u8 *text, u8 id)
+{
+ if (id != 0xFF)
+ {
+ const u8 *ptr = sUnknown_083C15BC;
+ while (*ptr != 0xFF && *ptr != id)
+ {
+ ptr += 4;
+ }
+
+ text[0] = EXT_CTRL_CODE_BEGIN;
+ text[1] = 4;
+ text[2] = ptr[1];
+ text[3] = ptr[2];
+ text[4] = ptr[3];
+
+ text += 5;
+ }
+
+ return text;
+}
+
+u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8 id)
+{
+ u8 arr[3];
+
+ sub_8072CD4(&arr[0], &arr[1], &arr[2]);
+
+ dest = sub_80A1E58(dest, id);
+ dest = StringCopy(dest, src);
+
+ if (id != 0xFF)
+ {
+ dest[0] = EXT_CTRL_CODE_BEGIN;
+ dest[1] = 4;
+ dest[2] = arr[0];
+ dest[3] = arr[1];
+ dest[4] = arr[2];
+ dest[5] = 0xFF;
+
+ dest += 5;
+ }
+
+ return dest;
+}
+
+static void sub_80A1EF8(const u8 *text, u8 id, u8 left, u16 top, s32 e)
+{
+ sub_80A1E9C(gStringVar4, text, id);
+ MenuPrint_PixelCoords(gStringVar4, left, top, (bool8)e);
+}
+
+static void sub_80A1F48(const u8 *text, u8 id, u8 c, u8 d, u16 e)
+{
+ sub_80A1E9C(gStringVar4, text, id);
+ sub_8072BD8(gStringVar4, c, d, e);
+}
+
+static void sub_80A1F98(s32 value, u8 id, u8 n, u8 mode, u8 left, u16 top, s32 e)
+{
+ ConvertIntToDecimalStringN(gStringVar1, value, mode, n);
+ sub_80A1EF8(gStringVar1, id, left, top, e);
+}
+
+static void sub_80A1FF8(const u8 *text, u8 id, u8 left, u8 top)
+{
+ sub_80A1E9C(gStringVar4, text, id);
+ MenuPrint(gStringVar4, left, top);
+}
+
+u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level)
+{
+ u8 buffer[12];
+
+ dest[0] = 0x34;
+ dest++;
+
+ if (level == 0)
+ {
+ level = 5;
+ }
+
+ ConvertIntToDecimalString(buffer, level);
+ dest = sub_80A1E9C(dest, buffer, 14);
+ dest = StringCopy(dest, gOtherText_Comma);
+
+ return dest;
+}
+
+static void sub_80A2078(int taskId)
+{
+ gUnknown_03005CF0 = gTasks[taskId].func;
+ gTasks[taskId].func = sub_80A20A8;
+ gTasks[taskId].func((u8)taskId);
+}
+
+static void sub_80A20A8(u8 taskId)
+{
+ if (sub_8055870() != TRUE)
+ {
+ gTasks[taskId].func = gUnknown_03005CF0;
+ }
+}
diff --git a/src/scene/berry_blender.c b/src/scene/berry_blender.c
index 42c79bc99..91b5c10bc 100644
--- a/src/scene/berry_blender.c
+++ b/src/scene/berry_blender.c
@@ -15,7 +15,7 @@
#include "overworld.h"
#include "item.h"
#include "items.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "menu_cursor.h"
#include "trig.h"
diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c
index 2600076c3..442d8ec26 100644
--- a/src/scene/contest_painting.c
+++ b/src/scene/contest_painting.c
@@ -6,7 +6,7 @@
#include "main.h"
#include "menu.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
diff --git a/src/scene/credits.c b/src/scene/credits.c
index ccd4cebc6..fed1d993a 100644
--- a/src/scene/credits.c
+++ b/src/scene/credits.c
@@ -9,7 +9,7 @@
#include "menu.h"
#include "palette.h"
#include "pokedex.h"
-#include "rng.h"
+#include "random.h"
#include "songs.h"
#include "sound.h"
#include "species.h"
diff --git a/src/scene/egg_hatch.c b/src/scene/egg_hatch.c
index 49cced46a..3675b42cf 100644
--- a/src/scene/egg_hatch.c
+++ b/src/scene/egg_hatch.c
@@ -11,7 +11,7 @@
#include "overworld.h"
#include "palette.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/scene/evolution_graphics.c b/src/scene/evolution_graphics.c
index 66b506fb5..dc0e219c5 100644
--- a/src/scene/evolution_graphics.c
+++ b/src/scene/evolution_graphics.c
@@ -2,7 +2,7 @@
#include "evolution_graphics.h"
#include "sprite.h"
#include "trig.h"
-#include "rng.h"
+#include "random.h"
#include "decompress.h"
#include "task.h"
#include "sound.h"
diff --git a/src/scene/evolution_scene.c b/src/scene/evolution_scene.c
index 1bbb8d485..d4c6417c7 100644
--- a/src/scene/evolution_scene.c
+++ b/src/scene/evolution_scene.c
@@ -817,7 +817,7 @@ static void Task_EvolutionScene(u8 taskID)
case 5:
if (!gPaletteFade.active)
{
- sub_809D9F0(gPlayerParty, gTasks[taskID].tPartyID,
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID,
gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics,
gMoveToLearn);
gTasks[taskID].tLearnMoveState++;
@@ -1137,7 +1137,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 5:
if (!gPaletteFade.active)
{
- sub_809D9F0(gPlayerParty, gTasks[taskID].tPartyID,
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID,
gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics,
gMoveToLearn);
gTasks[taskID].tLearnMoveState++;
diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c
index a1de26c32..63aaf79c9 100644
--- a/src/scene/hall_of_fame.c
+++ b/src/scene/hall_of_fame.c
@@ -15,7 +15,7 @@
#include "m4a.h"
#include "data2.h"
#include "decompress.h"
-#include "rng.h"
+#include "random.h"
#include "trig.h"
#include "ewram.h"
diff --git a/src/scene/intro.c b/src/scene/intro.c
index b52fbb3a9..c713071e7 100644
--- a/src/scene/intro.c
+++ b/src/scene/intro.c
@@ -11,7 +11,7 @@
#include "main.h"
#include "new_game.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c
index a150e8dc9..bb80ef3b6 100755
--- a/src/scene/intro_credits_graphics.c
+++ b/src/scene/intro_credits_graphics.c
@@ -11,7 +11,7 @@
#include "main.h"
#include "new_game.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
#include "songs.h"
#include "sound.h"
diff --git a/src/scene/new_game.c b/src/scene/new_game.c
index b15282960..ee042a0de 100644
--- a/src/scene/new_game.c
+++ b/src/scene/new_game.c
@@ -18,7 +18,7 @@
#include "pokedex.h"
#include "pokemon_size_record.h"
#include "pokemon_storage_system.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
#include "overworld.h"
#include "rtc.h"
diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c
index 1462a985d..9b6265308 100644
--- a/src/script_pokemon_util_80C4BF0.c
+++ b/src/script_pokemon_util_80C4BF0.c
@@ -17,7 +17,7 @@
#include "menu.h"
#include "pokedex.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "overworld.h"
#include "script_pokemon_80C4.h"
#include "species.h"
diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c
index 21ff220d2..d95a0ed39 100644
--- a/src/script_pokemon_util_80F99CC.c
+++ b/src/script_pokemon_util_80F99CC.c
@@ -272,7 +272,7 @@ void HandleMoveTutorPartyMenu(u8 var)
void sub_80F9EEC(void)
{
- sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0);
+ ShowSelectMovePokemonSummaryScreen(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0);
UNK_2018000_STRUCT.unk8 = 3;
gFieldCallback = sub_8080990;
}
diff --git a/src/strings.c b/src/strings.c
index 6c8dce9d6..06bbadb8f 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -409,7 +409,7 @@ const u8 OtherText_Switch[] = _("SWITCH");
const u8 OtherText_PokeInfo[] = _("POKéMON INFO");
const u8 OtherText_PokeSkills[] = _("POKéMON SKILLS");
const u8 OtherText_BattleMoves[] = _("BATTLE MOVES");
-const u8 OtherText_ContestMoves[] = _("C0NTEST MOVES"); // why the l33t 0, that's stupid
+const u8 OtherText_ContestMoves[] = _("C0NTEST MOVES"); // The "O" in "CONTEST" is actually a 0.
const u8 OtherText_Info[] = _("INFO");
const u8 gOtherText_EggLongTime[] = _("It looks like this EGG will\ntake a long time to hatch.");