summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@users.noreply.github.com>2019-12-07 20:20:57 -0500
committerGitHub <noreply@github.com>2019-12-07 20:20:57 -0500
commitf21b113bc6caee136d696aadfe8dc13d6e8f3622 (patch)
treedfa380ca2de409279e0ee0c7ecc06d704a84858a /src
parent22a73c654b33878d8861109a3898bddc0d30c6b3 (diff)
parent88fae7ed40e47eff562b70cd0a504aeed5bb7102 (diff)
Merge pull request #177 from ghoulslash/battle-anim
battle_anim*
Diffstat (limited to 'src')
-rw-r--r--src/battle_anim.c3347
-rw-r--r--src/battle_anim_effects_1.c5619
-rw-r--r--src/battle_anim_effects_2.c3824
-rw-r--r--src/battle_anim_effects_3.c5320
-rw-r--r--src/battle_anim_mons.c6
-rw-r--r--src/battle_anim_special.c2318
-rw-r--r--src/battle_anim_status_effects.c533
-rw-r--r--src/battle_anim_utility_funcs.c4
-rw-r--r--src/bug.c18
-rw-r--r--src/dark.c10
-rw-r--r--src/dragon.c12
-rw-r--r--src/electric.c36
-rw-r--r--src/fighting.c40
-rw-r--r--src/fire.c38
-rw-r--r--src/flying.c32
-rw-r--r--src/ghost.c24
-rw-r--r--src/ground.c14
-rw-r--r--src/ice.c38
-rw-r--r--src/mevent_8145654.c5
-rw-r--r--src/normal.c20
-rw-r--r--src/oak_speech.c20
-rw-r--r--src/poison.c14
-rw-r--r--src/psychic.c32
-rw-r--r--src/rock.c32
-rw-r--r--src/text.c4
25 files changed, 21160 insertions, 200 deletions
diff --git a/src/battle_anim.c b/src/battle_anim.c
new file mode 100644
index 000000000..0cb88219a
--- /dev/null
+++ b/src/battle_anim.c
@@ -0,0 +1,3347 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "battle_controllers.h"
+#include "battle_interface.h"
+#include "battle_bg.h"
+#include "bg.h"
+#include "decompress.h"
+#include "dma3.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "main.h"
+#include "m4a.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "constants/battle_anim.h"
+
+#define ANIM_SPRITE_INDEX_COUNT 8
+
+// RAM
+EWRAM_DATA static const u8 *sBattleAnimScriptPtr = NULL;
+EWRAM_DATA static const u8 *sBattleAnimScriptRetAddr = NULL;
+EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL;
+EWRAM_DATA static s8 sAnimFramesToWait = 0;
+EWRAM_DATA bool8 gAnimScriptActive = FALSE;
+EWRAM_DATA u8 gAnimVisualTaskCount = 0;
+EWRAM_DATA u8 gAnimSoundTaskCount = 0;
+EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL;
+EWRAM_DATA s32 gAnimMoveDmg = 0;
+EWRAM_DATA u16 gAnimMovePower = 0;
+EWRAM_DATA static u16 sAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0};
+EWRAM_DATA u8 gAnimFriendship = 0;
+EWRAM_DATA u16 gWeatherMoveAnim = 0;
+EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0};
+EWRAM_DATA static u16 sSoundAnimFramesToWait = 0;
+EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0};
+EWRAM_DATA u8 gAnimMoveTurn = 0;
+EWRAM_DATA static u8 sAnimBackgroundFadeState = 0;
+EWRAM_DATA static u16 sAnimMoveIndex = 0;
+EWRAM_DATA u8 gBattleAnimAttacker = 0;
+EWRAM_DATA u8 gBattleAnimTarget = 0;
+EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0};
+EWRAM_DATA u8 gUnknown_2037F24 = 0;
+
+// Function Declarations
+static void AddSpriteIndex(u16 index);
+static void ClearSpriteIndex(u16 index);
+static void WaitAnimFrameCount(void);
+static void RunAnimScriptCommand(void);
+static void sub_8073558(u8 taskId);
+static void Task_FadeToBg(u8 taskId);
+static void Task_PanFromInitialToTarget(u8 taskId);
+static void task_pA_ma0A_obj_to_bg_pal(u8 taskId);
+static void LoadMoveBg(u16 bgId);
+static void LoadDefaultBg(void);
+static void Task_LoopAndPlaySE(u8 taskId);
+static void Task_WaitAndPlaySE(u8 taskId);
+static void sub_807331C(u8 taskId);
+
+static void ScriptCmd_loadspritegfx(void);
+static void ScriptCmd_unloadspritegfx(void);
+static void ScriptCmd_createsprite(void);
+static void ScriptCmd_createvisualtask(void);
+static void ScriptCmd_delay(void);
+static void ScriptCmd_waitforvisualfinish(void);
+static void ScriptCmd_hang1(void);
+static void ScriptCmd_hang2(void);
+static void ScriptCmd_end(void);
+static void ScriptCmd_playse(void);
+static void ScriptCmd_monbg(void);
+static void ScriptCmd_clearmonbg(void);
+static void ScriptCmd_setalpha(void);
+static void ScriptCmd_blendoff(void);
+static void ScriptCmd_call(void);
+static void ScriptCmd_return(void);
+static void ScriptCmd_setarg(void);
+static void ScriptCmd_choosetwoturnanim(void);
+static void ScriptCmd_jumpifmoveturn(void);
+static void ScriptCmd_goto(void);
+static void ScriptCmd_fadetobg(void);
+static void ScriptCmd_restorebg(void);
+static void ScriptCmd_waitbgfadeout(void);
+static void ScriptCmd_waitbgfadein(void);
+static void ScriptCmd_changebg(void);
+static void ScriptCmd_playsewithpan(void);
+static void ScriptCmd_setpan(void);
+static void ScriptCmd_panse_1B(void);
+static void ScriptCmd_loopsewithpan(void);
+static void ScriptCmd_waitplaysewithpan(void);
+static void ScriptCmd_setbldcnt(void);
+static void ScriptCmd_createsoundtask(void);
+static void ScriptCmd_waitsound(void);
+static void ScriptCmd_jumpargeq(void);
+static void ScriptCmd_monbg_22(void);
+static void ScriptCmd_clearmonbg_23(void);
+static void ScriptCmd_jumpifcontest(void);
+static void ScriptCmd_fadetobgfromset(void);
+static void ScriptCmd_panse_26(void);
+static void ScriptCmd_panse_27(void);
+static void ScriptCmd_monbgprio_28(void);
+static void ScriptCmd_monbgprio_29(void);
+static void ScriptCmd_monbgprio_2A(void);
+static void ScriptCmd_invisible(void);
+static void ScriptCmd_visible(void);
+static void ScriptCmd_doublebattle_2D(void);
+static void ScriptCmd_doublebattle_2E(void);
+static void ScriptCmd_stopsound(void);
+
+// Data
+const struct OamData gOamData_AffineOff_ObjNormal_8x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_16x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_32x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_64x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_16x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_32x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_32x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_64x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_8x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_8x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x32),
+ .x = 0,
+ .size = SPRITE_SIZE(8x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_16x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x32),
+ .x = 0,
+ .size = SPRITE_SIZE(16x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjNormal_32x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x64),
+ .x = 0,
+ .size = SPRITE_SIZE(32x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_8x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_16x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_32x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_64x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_16x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_32x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_32x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_64x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_8x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_8x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x32),
+ .x = 0,
+ .size = SPRITE_SIZE(8x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_16x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x32),
+ .x = 0,
+ .size = SPRITE_SIZE(16x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjNormal_32x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x64),
+ .x = 0,
+ .size = SPRITE_SIZE(32x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_8x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_16x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_32x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_64x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_16x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_32x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_32x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_64x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_8x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_8x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x32),
+ .x = 0,
+ .size = SPRITE_SIZE(8x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_16x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x32),
+ .x = 0,
+ .size = SPRITE_SIZE(16x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjNormal_32x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x64),
+ .x = 0,
+ .size = SPRITE_SIZE(32x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_8x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_16x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_32x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_64x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_16x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_32x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_32x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_64x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_8x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_8x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x32),
+ .x = 0,
+ .size = SPRITE_SIZE(8x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_16x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x32),
+ .x = 0,
+ .size = SPRITE_SIZE(16x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineOff_ObjBlend_32x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x64),
+ .x = 0,
+ .size = SPRITE_SIZE(32x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_8x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_16x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_32x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_64x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_16x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_32x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_32x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_64x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_8x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_8x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x32),
+ .x = 0,
+ .size = SPRITE_SIZE(8x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_16x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x32),
+ .x = 0,
+ .size = SPRITE_SIZE(16x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineNormal_ObjBlend_32x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_NORMAL,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x64),
+ .x = 0,
+ .size = SPRITE_SIZE(32x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_8x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x8),
+ .x = 0,
+ .size = SPRITE_SIZE(8x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_16x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x16),
+ .x = 0,
+ .size = SPRITE_SIZE(16x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_32x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_64x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x64),
+ .x = 0,
+ .size = SPRITE_SIZE(64x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_16x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_32x8 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x8),
+ .x = 0,
+ .size = SPRITE_SIZE(32x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_32x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x16),
+ .x = 0,
+ .size = SPRITE_SIZE(32x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_64x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(64x32),
+ .x = 0,
+ .size = SPRITE_SIZE(64x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_8x16 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_8x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(8x32),
+ .x = 0,
+ .size = SPRITE_SIZE(8x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_16x32 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(16x32),
+ .x = 0,
+ .size = SPRITE_SIZE(16x32),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct OamData gOamData_AffineDouble_ObjBlend_32x64 =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .objMode = ST_OAM_OBJ_BLEND,
+ .bpp = ST_OAM_4BPP,
+ .shape = SPRITE_SHAPE(32x64),
+ .x = 0,
+ .size = SPRITE_SIZE(32x64),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+};
+
+const struct CompressedSpriteSheet gBattleAnimPicTable[] =
+{
+ {gBattleAnimSpriteGfx_Bone, 0x0200, ANIM_TAG_BONE},
+ {gBattleAnimSpriteGfx_Spark, 0x0300, ANIM_TAG_SPARK},
+ {gBattleAnimSpriteGfx_Pencil, 0x0200, ANIM_TAG_PENCIL},
+ {gBattleAnimSpriteGfx_AirWave, 0x0100, ANIM_TAG_AIR_WAVE},
+ {gBattleAnimSpriteGfx_Orb, 0x0200, ANIM_TAG_ORB},
+ {gBattleAnimSpriteGfx_Sword, 0x0400, ANIM_TAG_SWORD},
+ {gBattleAnimSpriteGfx_Seed, 0x0180, ANIM_TAG_SEED},
+ {gBattleAnimSpriteGfx_Explosion6, 0x0800, ANIM_TAG_EXPLOSION_6},
+ {gBattleAnimSpriteGfx_PinkOrb, 0x0020, ANIM_TAG_PINK_ORB},
+ {gBattleAnimSpriteGfx_Gust, 0x0400, ANIM_TAG_GUST},
+ {gBattleAnimSpriteGfx_IceCube, 0x1200, ANIM_TAG_ICE_CUBE},
+ {gBattleAnimSpriteGfx_Spark2, 0x0180, ANIM_TAG_SPARK_2},
+ {gBattleAnimSpriteGfx_Orange, 0x0080, ANIM_TAG_ORANGE},
+ {gBattleAnimSpriteGfx_YellowBall, 0x0080, ANIM_TAG_YELLOW_BALL},
+ {gBattleAnimSpriteGfx_LockOn, 0x0280, ANIM_TAG_LOCK_ON},
+ {gBattleAnimSpriteGfx_TiedBag, 0x0080, ANIM_TAG_TIED_BAG},
+ {gBattleAnimSpriteGfx_BlackSmoke, 0x0100, ANIM_TAG_BLACK_SMOKE},
+ {gBattleAnimSpriteGfx_BlackBall, 0x0020, ANIM_TAG_BLACK_BALL},
+ {gBattleAnimSpriteGfx_Conversion, 0x0080, ANIM_TAG_CONVERSION},
+ {gBattleAnimSpriteGfx_Glass, 0x0400, ANIM_TAG_GLASS},
+ {gBattleAnimSpriteGfx_HornHit, 0x0200, ANIM_TAG_HORN_HIT},
+ {gBattleAnimSpriteGfx_Hit, 0x0A00, ANIM_TAG_HIT},
+ {gBattleAnimSpriteGfx_Hit, 0x0A00, ANIM_TAG_HIT_2},
+ {gBattleAnimSpriteGfx_BlueShards, 0x0380, ANIM_TAG_BLUE_SHARDS},
+ {gBattleAnimSpriteGfx_ClosingEye, 0x0300, ANIM_TAG_CLOSING_EYE},
+ {gBattleAnimSpriteGfx_WavingHand, 0x0A00, ANIM_TAG_WAVING_HAND},
+ {gBattleAnimSpriteGfx_HitDuplicate, 0x0A00, ANIM_TAG_HIT_DUPLICATE},
+ {gBattleAnimSpriteGfx_Leer, 0x0A00, ANIM_TAG_LEER},
+ {gBattleAnimSpriteGfx_BlueBurst, 0x0A00, ANIM_TAG_BLUE_BURST},
+ {gBattleAnimSpriteGfx_SmallEmber, 0x0A00, ANIM_TAG_SMALL_EMBER},
+ {gBattleAnimSpriteGfx_GraySmoke, 0x0A00, ANIM_TAG_GRAY_SMOKE},
+ {gBattleAnimSpriteGfx_BlueStar, 0x0E00, ANIM_TAG_BLUE_STAR},
+ {gBattleAnimSpriteGfx_BubbleBurst, 0x0380, ANIM_TAG_BUBBLE_BURST},
+ {gBattleAnimSpriteGfx_Fire, 0x1000, ANIM_TAG_FIRE},
+ {gBattleAnimSpriteGfx_SpinningFire, 0x0800, ANIM_TAG_SPINNING_FIRE},
+ {gBattleAnimSpriteGfx_FirePlume, 0x0A00, ANIM_TAG_FIRE_PLUME},
+ {gBattleAnimSpriteGfx_Lightning2, 0x0800, ANIM_TAG_LIGHTNING_2},
+ {gBattleAnimSpriteGfx_Lightning, 0x0A00, ANIM_TAG_LIGHTNING},
+ {gBattleAnimSpriteGfx_ClawSlash2, 0x0A00, ANIM_TAG_CLAW_SLASH_2},
+ {gBattleAnimSpriteGfx_ClawSlash, 0x0A00, ANIM_TAG_CLAW_SLASH},
+ {gBattleAnimSpriteGfx_Scratch3, 0x0A00, ANIM_TAG_SCRATCH_3},
+ {gBattleAnimSpriteGfx_Scratch2, 0x0A00, ANIM_TAG_SCRATCH_2},
+ {gBattleAnimSpriteGfx_BubbleBurst2, 0x0A00, ANIM_TAG_BUBBLE_BURST_2},
+ {gBattleAnimSpriteGfx_IceChunk, 0x0A00, ANIM_TAG_ICE_CHUNK},
+ {gBattleAnimSpriteGfx_Glass2, 0x0A00, ANIM_TAG_GLASS_2},
+ {gBattleAnimSpriteGfx_PinkHeart2, 0x0A00, ANIM_TAG_PINK_HEART_2},
+ {gBattleAnimSpriteGfx_SapDrip, 0x1000, ANIM_TAG_SAP_DRIP},
+ {gBattleAnimSpriteGfx_SapDrip, 0x1000, ANIM_TAG_SAP_DRIP_2},
+ {gBattleAnimSpriteGfx_Sparkle1, 0x1000, ANIM_TAG_SPARKLE_1},
+ {gBattleAnimSpriteGfx_Sparkle1, 0x1000, ANIM_TAG_SPARKLE_2},
+ {gBattleAnimSpriteGfx_HumanoidFoot, 0x0200, ANIM_TAG_HUMANOID_FOOT},
+ {gBattleAnimSpriteGfx_MonsterFoot, 0x0200, ANIM_TAG_MONSTER_FOOT},
+ {gBattleAnimSpriteGfx_HumanoidHand, 0x0200, ANIM_TAG_HUMANOID_HAND},
+ {gBattleAnimSpriteGfx_NoiseLine, 0x0800, ANIM_TAG_NOISE_LINE},
+ {gBattleAnimSpriteGfx_YellowUnk, 0x0080, ANIM_TAG_YELLOW_UNK},
+ {gBattleAnimSpriteGfx_RedFist, 0x0200, ANIM_TAG_RED_FIST},
+ {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_SLAM_HIT},
+ {gBattleAnimSpriteGfx_Ring, 0x0180, ANIM_TAG_RING},
+ {gBattleAnimSpriteGfx_Rocks, 0x0C00, ANIM_TAG_ROCKS},
+ {gBattleAnimSpriteGfx_Z, 0x0100, ANIM_TAG_Z},
+ {gBattleAnimSpriteGfx_YellowUnk2, 0x0040, ANIM_TAG_YELLOW_UNK_2},
+ {gBattleAnimSpriteGfx_AirSlash, 0x0180, ANIM_TAG_AIR_SLASH},
+ {gBattleAnimSpriteGfx_SpinningGreenOrbs, 0x0800, ANIM_TAG_SPINNING_GREEN_ORBS},
+ {gBattleAnimSpriteGfx_Leaf, 0x0480, ANIM_TAG_LEAF},
+ {gBattleAnimSpriteGfx_Finger, 0x0200, ANIM_TAG_FINGER},
+ {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_POISON_POWDER},
+ {gBattleAnimSpriteGfx_BrownTriangle, 0x0100, ANIM_TAG_BROWN_TRIANGLE},
+ {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_SLEEP_POWDER},
+ {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_STUN_SPORE},
+ {gBattleAnimSpriteGfx_PoisonPowder, 0x0200, ANIM_TAG_POWDER},
+ {gBattleAnimSpriteGfx_Sparkle3, 0x0200, ANIM_TAG_SPARKLE_3},
+ {gBattleAnimSpriteGfx_Sparkle4, 0x0A00, ANIM_TAG_SPARKLE_4},
+ {gBattleAnimSpriteGfx_MusicNotes, 0x0300, ANIM_TAG_MUSIC_NOTES},
+ {gBattleAnimSpriteGfx_Duck, 0x0180, ANIM_TAG_DUCK},
+ {gBattleAnimSpriteGfx_MudSand, 0x00A0, ANIM_TAG_MUD_SAND},
+ {gBattleAnimSpriteGfx_Alert, 0x0700, ANIM_TAG_ALERT},
+ {gBattleAnimSpriteGfx_BlueFlames, 0x0400, ANIM_TAG_BLUE_FLAMES},
+ {gBattleAnimSpriteGfx_BlueFlames2, 0x0200, ANIM_TAG_BLUE_FLAMES_2},
+ {gBattleAnimSpriteGfx_Shock4, 0x0300, ANIM_TAG_SHOCK_4},
+ {gBattleAnimSpriteGfx_Shock, 0x0C00, ANIM_TAG_SHOCK},
+ {gBattleAnimSpriteGfx_Bell2, 0x0A00, ANIM_TAG_BELL_2},
+ {gBattleAnimSpriteGfx_PinkGlove, 0x0080, ANIM_TAG_PINK_GLOVE},
+ {gBattleAnimSpriteGfx_BlueLines, 0x0040, ANIM_TAG_BLUE_LINES},
+ {gBattleAnimSpriteGfx_Impact3, 0x0E00, ANIM_TAG_IMPACT_3},
+ {gBattleAnimSpriteGfx_Impact2, 0x0E00, ANIM_TAG_IMPACT_2},
+ {gBattleAnimSpriteGfx_Reticle, 0x0280, ANIM_TAG_RETICLE},
+ {gBattleAnimSpriteGfx_Breath, 0x0200, ANIM_TAG_BREATH},
+ {gBattleAnimSpriteGfx_Anger, 0x0080, ANIM_TAG_ANGER},
+ {gBattleAnimSpriteGfx_Snowball, 0x00C0, ANIM_TAG_SNOWBALL},
+ {gBattleAnimSpriteGfx_Vine, 0x0A00, ANIM_TAG_VINE},
+ {gBattleAnimSpriteGfx_Sword2, 0x0200, ANIM_TAG_SWORD_2},
+ {gBattleAnimSpriteGfx_Clapping, 0x0180, ANIM_TAG_CLAPPING},
+ {gBattleAnimSpriteGfx_RedTube, 0x0080, ANIM_TAG_RED_TUBE},
+ {gBattleAnimSpriteGfx_Amnesia, 0x1000, ANIM_TAG_AMNESIA},
+ {gBattleAnimSpriteGfx_String2, 0x0A00, ANIM_TAG_STRING_2},
+ {gBattleAnimSpriteGfx_Pencil2, 0x0180, ANIM_TAG_PENCIL_2},
+ {gBattleAnimSpriteGfx_Petal, 0x0380, ANIM_TAG_PETAL},
+ {gBattleAnimSpriteGfx_BentSpoon, 0x0C00, ANIM_TAG_BENT_SPOON},
+ {gBattleAnimSpriteGfx_Web, 0x0200, ANIM_TAG_WEB},
+ {gBattleAnimSpriteGfx_MilkBottle, 0x0200, ANIM_TAG_MILK_BOTTLE},
+ {gBattleAnimSpriteGfx_Coin, 0x0200, ANIM_TAG_COIN},
+ {gBattleAnimSpriteGfx_CrackedEgg, 0x0200, ANIM_TAG_CRACKED_EGG},
+ {gBattleAnimSpriteGfx_HatchedEgg, 0x0400, ANIM_TAG_HATCHED_EGG},
+ {gBattleAnimSpriteGfx_FreshEgg, 0x0080, ANIM_TAG_FRESH_EGG},
+ {gBattleAnimSpriteGfx_Fangs, 0x0400, ANIM_TAG_FANGS},
+ {gBattleAnimSpriteGfx_Explosion2, 0x0c00, ANIM_TAG_EXPLOSION_2},
+ {gBattleAnimSpriteGfx_Explosion3, 0x0200, ANIM_TAG_EXPLOSION_3},
+ {gBattleAnimSpriteGfx_WaterDroplet, 0x1000, ANIM_TAG_WATER_DROPLET},
+ {gBattleAnimSpriteGfx_WaterDroplet2, 0x0a00, ANIM_TAG_WATER_DROPLET_2},
+ {gBattleAnimSpriteGfx_Seed2, 0x0020, ANIM_TAG_SEED_2},
+ {gBattleAnimSpriteGfx_Sprout, 0x0e00, ANIM_TAG_SPROUT},
+ {gBattleAnimSpriteGfx_RedWand, 0x0080, ANIM_TAG_RED_WAND},
+ {gBattleAnimSpriteGfx_PurpleGreenUnk, 0x0a00, ANIM_TAG_PURPLE_GREEN_UNK},
+ {gBattleAnimSpriteGfx_WaterColumn, 0x0400, ANIM_TAG_WATER_COLUMN},
+ {gBattleAnimSpriteGfx_MudUnk, 0x0200, ANIM_TAG_MUD_UNK},
+ {gBattleAnimSpriteGfx_RainDrops, 0x0700, ANIM_TAG_RAIN_DROPS},
+ {gBattleAnimSpriteGfx_FurySwipes, 0x0800, ANIM_TAG_FURY_SWIPES},
+ {gBattleAnimSpriteGfx_Vine2, 0x0a00, ANIM_TAG_VINE_2},
+ {gBattleAnimSpriteGfx_Teeth, 0x0600, ANIM_TAG_TEETH},
+ {gBattleAnimSpriteGfx_Bone2, 0x0800, ANIM_TAG_BONE_2},
+ {gBattleAnimSpriteGfx_WhiteBag, 0x0200, ANIM_TAG_WHITE_BAG},
+ {gBattleAnimSpriteGfx_Unknown, 0x0040, ANIM_TAG_UNKNOWN},
+ {gBattleAnimSpriteGfx_PurpleCoral, 0x0180, ANIM_TAG_PURPLE_CORAL},
+ {gBattleAnimSpriteGfx_PurpleDroplet, 0x0600, ANIM_TAG_PURPLE_DROPLET},
+ {gBattleAnimSpriteGfx_Shock2, 0x0600, ANIM_TAG_SHOCK_2},
+ {gBattleAnimSpriteGfx_ClosingEye2, 0x0200, ANIM_TAG_CLOSING_EYE_2},
+ {gBattleAnimSpriteGfx_MetalBall, 0x0080, ANIM_TAG_METAL_BALL},
+ {gBattleAnimSpriteGfx_MonsterDoll, 0x0200, ANIM_TAG_MONSTER_DOLL},
+ {gBattleAnimSpriteGfx_Whirlwind, 0x0800, ANIM_TAG_WHIRLWIND},
+ {gBattleAnimSpriteGfx_Whirlwind2, 0x0080, ANIM_TAG_WHIRLWIND_2},
+ {gBattleAnimSpriteGfx_Explosion4, 0x0a00, ANIM_TAG_EXPLOSION_4},
+ {gBattleAnimSpriteGfx_Explosion5, 0x0280, ANIM_TAG_EXPLOSION_5},
+ {gBattleAnimSpriteGfx_Tongue, 0x0280, ANIM_TAG_TONGUE},
+ {gBattleAnimSpriteGfx_Smoke, 0x0100, ANIM_TAG_SMOKE},
+ {gBattleAnimSpriteGfx_Smoke2, 0x0200, ANIM_TAG_SMOKE_2},
+ {gBattleAnimSpriteGfx_Impact, 0x0200, ANIM_TAG_IMPACT},
+ {gBattleAnimSpriteGfx_CircleImpact, 0x0020, ANIM_TAG_CIRCLE_IMPACT},
+ {gBattleAnimSpriteGfx_Scratch, 0x0a00, ANIM_TAG_SCRATCH},
+ {gBattleAnimSpriteGfx_Cut, 0x0800, ANIM_TAG_CUT},
+ {gBattleAnimSpriteGfx_SharpTeeth, 0x0800, ANIM_TAG_SHARP_TEETH},
+ {gBattleAnimSpriteGfx_RainbowRings, 0x00c0, ANIM_TAG_RAINBOW_RINGS},
+ {gBattleAnimSpriteGfx_IceCrystals, 0x01c0, ANIM_TAG_ICE_CRYSTALS},
+ {gBattleAnimSpriteGfx_IceSpikes, 0x0100, ANIM_TAG_ICE_SPIKES},
+ {gBattleAnimSpriteGfx_HandsAndFeet, 0x0800, ANIM_TAG_HANDS_AND_FEET},
+ {gBattleAnimSpriteGfx_MistCloud, 0x0200, ANIM_TAG_MIST_CLOUD},
+ {gBattleAnimSpriteGfx_Clamp, 0x0800, ANIM_TAG_CLAMP},
+ {gBattleAnimSpriteGfx_Bubble, 0x0180, ANIM_TAG_BUBBLE},
+ {gBattleAnimSpriteGfx_Orbs, 0x0180, ANIM_TAG_ORBS},
+ {gBattleAnimSpriteGfx_WaterImpact, 0x0200, ANIM_TAG_WATER_IMPACT},
+ {gBattleAnimSpriteGfx_WaterOrb, 0x0200, ANIM_TAG_WATER_ORB},
+ {gBattleAnimSpriteGfx_PoisonBubble, 0x0180, ANIM_TAG_POISON_BUBBLE},
+ {gBattleAnimSpriteGfx_ToxicBubble, 0x0400, ANIM_TAG_TOXIC_BUBBLE},
+ {gBattleAnimSpriteGfx_Spikes, 0x0080, ANIM_TAG_SPIKES},
+ {gBattleAnimSpriteGfx_HornHit2, 0x0100, ANIM_TAG_HORN_HIT_2},
+ {gBattleAnimSpriteGfx_AirWave2, 0x0100, ANIM_TAG_AIR_WAVE_2},
+ {gBattleAnimSpriteGfx_SmallBubbles, 0x0140, ANIM_TAG_SMALL_BUBBLES},
+ {gBattleAnimSpriteGfx_RoundShadow, 0x0800, ANIM_TAG_ROUND_SHADOW},
+ {gBattleAnimSpriteGfx_Sunlight, 0x0200, ANIM_TAG_SUNLIGHT},
+ {gBattleAnimSpriteGfx_Spore, 0x0100, ANIM_TAG_SPORE},
+ {gBattleAnimSpriteGfx_Flower, 0x00a0, ANIM_TAG_FLOWER},
+ {gBattleAnimSpriteGfx_RazorLeaf, 0x0100, ANIM_TAG_RAZOR_LEAF},
+ {gBattleAnimSpriteGfx_Needle, 0x0080, ANIM_TAG_NEEDLE},
+ {gBattleAnimSpriteGfx_WhirlwindLines, 0x0300, ANIM_TAG_WHIRLWIND_LINES},
+ {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_GOLD_RING},
+ {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_PURPLE_RING},
+ {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_BLUE_RING},
+ {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_GREEN_LIGHT_WALL},
+ {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_BLUE_LIGHT_WALL},
+ {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_RED_LIGHT_WALL},
+ {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_GRAY_LIGHT_WALL},
+ {gBattleAnimSpriteGfx_GreenLightWall, 0x0800, ANIM_TAG_ORANGE_LIGHT_WALL},
+ {gBattleAnimSpriteGfx_BlackBall2, 0x0080, ANIM_TAG_BLACK_BALL_2},
+ {gBattleAnimSpriteGfx_MistCloud, 0x0200, ANIM_TAG_PURPLE_GAS_CLOUD},
+ {gBattleAnimSpriteGfx_SparkH, 0x0200, ANIM_TAG_SPARK_H},
+ {gBattleAnimSpriteGfx_YellowStar, 0x0200, ANIM_TAG_YELLOW_STAR},
+ {gBattleAnimSpriteGfx_LargeFreshEgg, 0x0080, ANIM_TAG_LARGE_FRESH_EGG},
+ {gBattleAnimSpriteGfx_ShadowBall, 0x0200, ANIM_TAG_SHADOW_BALL},
+ {gBattleAnimSpriteGfx_Lick, 0x0500, ANIM_TAG_LICK},
+ {gBattleAnimSpriteGfx_VoidLines, 0x0800, ANIM_TAG_VOID_LINES},
+ {gBattleAnimSpriteGfx_String, 0x0400, ANIM_TAG_STRING},
+ {gBattleAnimSpriteGfx_WebThread, 0x0020, ANIM_TAG_WEB_THREAD},
+ {gBattleAnimSpriteGfx_SpiderWeb, 0x0800, ANIM_TAG_SPIDER_WEB},
+ {gBattleAnimSpriteGfx_Lightbulb, 0x0100, ANIM_TAG_LIGHTBULB},
+ {gBattleAnimSpriteGfx_Slash, 0x0800, ANIM_TAG_SLASH},
+ {gBattleAnimSpriteGfx_FocusEnergy, 0x0400, ANIM_TAG_FOCUS_ENERGY},
+ {gBattleAnimSpriteGfx_SphereToCube, 0x0a00, ANIM_TAG_SPHERE_TO_CUBE},
+ {gBattleAnimSpriteGfx_Tendrils, 0x1000, ANIM_TAG_TENDRILS},
+ {gBattleAnimSpriteGfx_Eye, 0x0800, ANIM_TAG_EYE},
+ {gBattleAnimSpriteGfx_WhiteShadow, 0x0400, ANIM_TAG_WHITE_SHADOW},
+ {gBattleAnimSpriteGfx_TealAlert, 0x0200, ANIM_TAG_TEAL_ALERT},
+ {gBattleAnimSpriteGfx_OpeningEye, 0x0800, ANIM_TAG_OPENING_EYE},
+ {gBattleAnimSpriteGfx_RoundWhiteHalo, 0x0800, ANIM_TAG_ROUND_WHITE_HALO},
+ {gBattleAnimSpriteGfx_FangAttack, 0x0800, ANIM_TAG_FANG_ATTACK},
+ {gBattleAnimSpriteGfx_PurpleHandOutline, 0x0200, ANIM_TAG_PURPLE_HAND_OUTLINE},
+ {gBattleAnimSpriteGfx_Moon, 0x0800, ANIM_TAG_MOON},
+ {gBattleAnimSpriteGfx_GreenSparkle, 0x0200, ANIM_TAG_GREEN_SPARKLE},
+ {gBattleAnimSpriteGfx_Spiral, 0x0800, ANIM_TAG_SPIRAL},
+ {gBattleAnimSpriteGfx_SnoreZ, 0x0200, ANIM_TAG_SNORE_Z},
+ {gBattleAnimSpriteGfx_Explosion, 0x0800, ANIM_TAG_EXPLOSION},
+ {gBattleAnimSpriteGfx_Nail, 0x0400, ANIM_TAG_NAIL},
+ {gBattleAnimSpriteGfx_GhostlySpirit, 0x0200, ANIM_TAG_GHOSTLY_SPIRIT},
+ {gBattleAnimSpriteGfx_WarmRock, 0x0a80, ANIM_TAG_WARM_ROCK},
+ {gBattleAnimSpriteGfx_BreakingEgg, 0x0600, ANIM_TAG_BREAKING_EGG},
+ {gBattleAnimSpriteGfx_ThinRing, 0x0800, ANIM_TAG_THIN_RING},
+ {gBattleAnimSpriteGfx_PunchImpact, 0x0200, ANIM_TAG_PUNCH_IMPACT},
+ {gBattleAnimSpriteGfx_Bell, 0x0600, ANIM_TAG_BELL},
+ {gBattleAnimSpriteGfx_MusicNotes2, 0x0800, ANIM_TAG_MUSIC_NOTES_2},
+ {gBattleAnimSpriteGfx_SpeedDust, 0x0180, ANIM_TAG_SPEED_DUST},
+ {gBattleAnimSpriteGfx_TornMetal, 0x0800, ANIM_TAG_TORN_METAL},
+ {gBattleAnimSpriteGfx_ThoughtBubble, 0x0800, ANIM_TAG_THOUGHT_BUBBLE},
+ {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_MAGENTA_HEART},
+ {gBattleAnimSpriteGfx_ElectricOrbs, 0x0080, ANIM_TAG_ELECTRIC_ORBS},
+ {gBattleAnimSpriteGfx_CircleOfLight, 0x0800, ANIM_TAG_CIRCLE_OF_LIGHT},
+ {gBattleAnimSpriteGfx_Electricity, 0x0800, ANIM_TAG_ELECTRICITY},
+ {gBattleAnimSpriteGfx_Finger2, 0x0600, ANIM_TAG_FINGER_2},
+ {gBattleAnimSpriteGfx_MovementWaves, 0x0600, ANIM_TAG_MOVEMENT_WAVES},
+ {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_RED_HEART},
+ {gBattleAnimSpriteGfx_RedOrb, 0x0080, ANIM_TAG_RED_ORB},
+ {gBattleAnimSpriteGfx_EyeSparkle, 0x0180, ANIM_TAG_EYE_SPARKLE},
+ {gBattleAnimSpriteGfx_MagentaHeart, 0x0080, ANIM_TAG_PINK_HEART},
+ {gBattleAnimSpriteGfx_Angel, 0x0200, ANIM_TAG_ANGEL},
+ {gBattleAnimSpriteGfx_Devil, 0x0400, ANIM_TAG_DEVIL},
+ {gBattleAnimSpriteGfx_Swipe, 0x0a00, ANIM_TAG_SWIPE},
+ {gBattleAnimSpriteGfx_Roots, 0x0800, ANIM_TAG_ROOTS},
+ {gBattleAnimSpriteGfx_ItemBag, 0x0200, ANIM_TAG_ITEM_BAG},
+ {gBattleAnimSpriteGfx_JaggedMusicNote, 0x0400, ANIM_TAG_JAGGED_MUSIC_NOTE},
+ {gBattleAnimSpriteGfx_Pokeball, 0x0080, ANIM_TAG_POKEBALL},
+ {gBattleAnimSpriteGfx_Spotlight, 0x0800, ANIM_TAG_SPOTLIGHT},
+ {gBattleAnimSpriteGfx_LetterZ, 0x0200, ANIM_TAG_LETTER_Z},
+ {gBattleAnimSpriteGfx_RapidSpin, 0x0300, ANIM_TAG_RAPID_SPIN},
+ {gBattleAnimSpriteGfx_TriForceTriangle, 0x0800, ANIM_TAG_TRI_FORCE_TRIANGLE},
+ {gBattleAnimSpriteGfx_WispOrb, 0x0380, ANIM_TAG_WISP_ORB},
+ {gBattleAnimSpriteGfx_WispFire, 0x0800, ANIM_TAG_WISP_FIRE},
+ {gBattleAnimSpriteGfx_GoldStars, 0x00c0, ANIM_TAG_GOLD_STARS},
+ {gBattleAnimSpriteGfx_EclipsingOrb, 0x0800, ANIM_TAG_ECLIPSING_ORB},
+ {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_GRAY_ORB},
+ {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_BLUE_ORB},
+ {gBattleAnimSpriteGfx_GrayOrb, 0x0060, ANIM_TAG_RED_ORB_2},
+ {gBattleAnimSpriteGfx_PinkPetal, 0x0080, ANIM_TAG_PINK_PETAL},
+ {gBattleAnimSpriteGfx_PainSplit, 0x0180, ANIM_TAG_PAIN_SPLIT},
+ {gBattleAnimSpriteGfx_Confetti, 0x0180, ANIM_TAG_CONFETTI},
+ {gBattleAnimSpriteGfx_GreenStar, 0x0200, ANIM_TAG_GREEN_STAR},
+ {gBattleAnimSpriteGfx_PinkCloud, 0x0200, ANIM_TAG_PINK_CLOUD},
+ {gBattleAnimSpriteGfx_SweatDrop, 0x0020, ANIM_TAG_SWEAT_DROP},
+ {gBattleAnimSpriteGfx_GuardRing, 0x0400, ANIM_TAG_GUARD_RING},
+ {gBattleAnimSpriteGfx_PurpleScratch, 0x0600, ANIM_TAG_PURPLE_SCRATCH},
+ {gBattleAnimSpriteGfx_PurpleSwipe, 0x1000, ANIM_TAG_PURPLE_SWIPE},
+ {gBattleAnimSpriteGfx_TagHand, 0x0400, ANIM_TAG_TAG_HAND},
+ {gBattleAnimSpriteGfx_SmallRedEye, 0x0020, ANIM_TAG_SMALL_RED_EYE},
+ {gBattleAnimSpriteGfx_HollowOrb, 0x0080, ANIM_TAG_HOLLOW_ORB},
+ {gBattleAnimSpriteGfx_XSign, 0x0800, ANIM_TAG_X_SIGN},
+ {gBattleAnimSpriteGfx_BluegreenOrb, 0x0080, ANIM_TAG_BLUEGREEN_ORB},
+ {gBattleAnimSpriteGfx_PawPrint, 0x0200, ANIM_TAG_PAW_PRINT},
+ {gBattleAnimSpriteGfx_PurpleFlame, 0x0400, ANIM_TAG_PURPLE_FLAME},
+ {gBattleAnimSpriteGfx_RedBall, 0x0200, ANIM_TAG_RED_BALL},
+ {gBattleAnimSpriteGfx_SmellingsaltEffect, 0x0200, ANIM_TAG_SMELLINGSALT_EFFECT},
+ {gBattleAnimSpriteGfx_Meteor, 0x0800, ANIM_TAG_METEOR},
+ {gBattleAnimSpriteGfx_FlatRock, 0x0280, ANIM_TAG_FLAT_ROCK},
+ {gBattleAnimSpriteGfx_MagnifyingGlass, 0x0200, ANIM_TAG_MAGNIFYING_GLASS},
+ {gBattleAnimSpriteGfx_WaterOrb, 0x0200, ANIM_TAG_BROWN_ORB},
+ {gBattleAnimSpriteGfx_MetalSoundWaves, 0x0400, ANIM_TAG_METAL_SOUND_WAVES},
+ {gBattleAnimSpriteGfx_FlyingDirt, 0x0200, ANIM_TAG_FLYING_DIRT},
+ {gBattleAnimSpriteGfx_IcicleSpear, 0x0200, ANIM_TAG_ICICLE_SPEAR},
+ {gBattleAnimSpriteGfx_Hail, 0x0080, ANIM_TAG_HAIL},
+ {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_RED_ORB},
+ {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_GREEN_ORB},
+ {gBattleAnimSpriteGfx_GreenSpike, 0x0080, ANIM_TAG_GREEN_SPIKE},
+ {gBattleAnimSpriteGfx_CircleOfLight, 0x0800, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT},
+ {gBattleAnimSpriteGfx_GlowyRedOrb, 0x0020, ANIM_TAG_GLOWY_BLUE_ORB},
+ {gBattleAnimSpriteGfx_Pokeblock, 0x0080, ANIM_TAG_POKEBLOCK},
+ {gBattleAnimSpriteGfx_WhiteFeather, 0x0400, ANIM_TAG_WHITE_FEATHER},
+ {gBattleAnimSpriteGfx_Sparkle6, 0x0080, ANIM_TAG_SPARKLE_6},
+ {gBattleAnimSpriteGfx_Splash, 0x0800, ANIM_TAG_SPLASH},
+ {gBattleAnimSpriteGfx_SweatBead, 0x0020, ANIM_TAG_SWEAT_BEAD},
+ {gBattleAnimSpriteGfx_Gem1, 0x0800, ANIM_TAG_GEM_1},
+ {gBattleAnimSpriteGfx_Gem2, 0x0800, ANIM_TAG_GEM_2},
+ {gBattleAnimSpriteGfx_Gem3, 0x0800, ANIM_TAG_GEM_3},
+ {gBattleAnimSpriteGfx_SlamHit2, 0x1000, ANIM_TAG_SLAM_HIT_2},
+ {gBattleAnimSpriteGfx_Recycle, 0x0800, ANIM_TAG_RECYCLE},
+ {gBattleAnimSpriteGfx_RedParticles, 0x00a0, ANIM_TAG_RED_PARTICLES},
+ {gBattleAnimSpriteGfx_Protect, 0x0800, ANIM_TAG_PROTECT},
+ {gBattleAnimSpriteGfx_DirtMound, 0x0200, ANIM_TAG_DIRT_MOUND},
+ {gBattleAnimSpriteGfx_Shock3, 0x0600, ANIM_TAG_SHOCK_3},
+ {gBattleAnimSpriteGfx_WeatherBall, 0x0200, ANIM_TAG_WEATHER_BALL},
+ {gBattleAnimSpriteGfx_Bird, 0x0800, ANIM_TAG_BIRD},
+ {gBattleAnimSpriteGfx_CrossImpact, 0x0200, ANIM_TAG_CROSS_IMPACT},
+ {gBattleAnimSpriteGfx_Slash, 0x0800, ANIM_TAG_SLASH_2},
+ {gBattleAnimSpriteGfx_SlamHit, 0x1000, ANIM_TAG_WHIP_HIT},
+ {gBattleAnimSpriteGfx_GoldRing, 0x0100, ANIM_TAG_BLUE_RING_2},
+};
+
+const struct CompressedSpritePalette gBattleAnimPaletteTable[] =
+{
+ {gBattleAnimSpritePal_Bone, ANIM_TAG_BONE},
+ {gBattleAnimSpritePal_Spark, ANIM_TAG_SPARK},
+ {gBattleAnimSpritePal_Pencil, ANIM_TAG_PENCIL},
+ {gBattleAnimSpritePal_AirWave, ANIM_TAG_AIR_WAVE},
+ {gBattleAnimSpritePal_Orb, ANIM_TAG_ORB},
+ {gBattleAnimSpritePal_Sword, ANIM_TAG_SWORD},
+ {gBattleAnimSpritePal_Seed, ANIM_TAG_SEED},
+ {gBattleAnimSpritePal_Explosion6, ANIM_TAG_EXPLOSION_6},
+ {gBattleAnimSpritePal_PinkOrb, ANIM_TAG_PINK_ORB},
+ {gBattleAnimSpritePal_Gust, ANIM_TAG_GUST},
+ {gBattleAnimSpritePal_IceCube, ANIM_TAG_ICE_CUBE},
+ {gBattleAnimSpritePal_Spark2, ANIM_TAG_SPARK_2},
+ {gBattleAnimSpritePal_Orange, ANIM_TAG_ORANGE},
+ {gBattleAnimSpritePal_YellowBall, ANIM_TAG_YELLOW_BALL},
+ {gBattleAnimSpritePal_LockOn, ANIM_TAG_LOCK_ON},
+ {gBattleAnimSpritePal_TiedBag, ANIM_TAG_TIED_BAG},
+ {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_SMOKE},
+ {gBattleAnimSpritePal_BlackSmoke, ANIM_TAG_BLACK_BALL},
+ {gBattleAnimSpritePal_Conversion, ANIM_TAG_CONVERSION},
+ {gBattleAnimSpritePal_Glass, ANIM_TAG_GLASS},
+ {gBattleAnimSpritePal_HornHit, ANIM_TAG_HORN_HIT},
+ {gBattleAnimSpritePal_Hit, ANIM_TAG_HIT},
+ {gBattleAnimSpritePal_Hit2, ANIM_TAG_HIT_2},
+ {gBattleAnimSpritePal_BlueShards, ANIM_TAG_BLUE_SHARDS},
+ {gBattleAnimSpritePal_ClosingEye, ANIM_TAG_CLOSING_EYE},
+ {gBattleAnimSpritePal_WavingHand, ANIM_TAG_WAVING_HAND},
+ {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_HIT_DUPLICATE},
+ {gBattleAnimSpritePal_Leer, ANIM_TAG_LEER},
+ {gBattleAnimSpritePal_BlueBurst, ANIM_TAG_BLUE_BURST},
+ {gBattleAnimSpritePal_SmallEmber, ANIM_TAG_SMALL_EMBER},
+ {gBattleAnimSpritePal_GraySmoke, ANIM_TAG_GRAY_SMOKE},
+ {gBattleAnimSpritePal_BlueStar, ANIM_TAG_BLUE_STAR},
+ {gBattleAnimSpritePal_BubbleBurst, ANIM_TAG_BUBBLE_BURST},
+ {gBattleAnimSpritePal_Fire, ANIM_TAG_FIRE},
+ {gBattleAnimSpritePal_Fire, ANIM_TAG_SPINNING_FIRE},
+ {gBattleAnimSpritePal_Fire, ANIM_TAG_FIRE_PLUME},
+ {gBattleAnimSpritePal_Lightning2, ANIM_TAG_LIGHTNING_2},
+ {gBattleAnimSpritePal_Lightning2, ANIM_TAG_LIGHTNING},
+ {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_CLAW_SLASH_2},
+ {gBattleAnimSpritePal_ClawSlash, ANIM_TAG_CLAW_SLASH},
+ {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_SCRATCH_3},
+ {gBattleAnimSpritePal_ClawSlash2, ANIM_TAG_SCRATCH_2},
+ {gBattleAnimSpritePal_BubbleBurst2, ANIM_TAG_BUBBLE_BURST_2},
+ {gBattleAnimSpritePal_IceChunk, ANIM_TAG_ICE_CHUNK},
+ {gBattleAnimSpritePal_Glass2, ANIM_TAG_GLASS_2},
+ {gBattleAnimSpritePal_PinkHeart2, ANIM_TAG_PINK_HEART_2},
+ {gBattleAnimSpritePal_SapDrip, ANIM_TAG_SAP_DRIP},
+ {gBattleAnimSpritePal_SapDrip2, ANIM_TAG_SAP_DRIP},
+ {gBattleAnimSpritePal_Sparkle1, ANIM_TAG_SPARKLE_1},
+ {gBattleAnimSpritePal_Sparkle2, ANIM_TAG_SPARKLE_2},
+ {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_HUMANOID_FOOT},
+ {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_MONSTER_FOOT},
+ {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_HUMANOID_HAND},
+ {gBattleAnimSpritePal_HitDuplicate, ANIM_TAG_NOISE_LINE},
+ {gBattleAnimSpritePal_YellowUnk, ANIM_TAG_YELLOW_UNK},
+ {gBattleAnimSpritePal_HumanoidFoot, ANIM_TAG_RED_FIST},
+ {gBattleAnimSpritePal_SlamHit, ANIM_TAG_SLAM_HIT},
+ {gBattleAnimSpritePal_Ring, ANIM_TAG_RING},
+ {gBattleAnimSpritePal_Rocks, ANIM_TAG_ROCKS},
+ {gBattleAnimSpritePal_Z, ANIM_TAG_Z},
+ {gBattleAnimSpritePal_YellowUnk2, ANIM_TAG_YELLOW_UNK_2},
+ {gBattleAnimSpritePal_AirSlash, ANIM_TAG_AIR_SLASH},
+ {gBattleAnimSpritePal_SpinningGreenOrbs, ANIM_TAG_SPINNING_GREEN_ORBS},
+ {gBattleAnimSpritePal_Leaf, ANIM_TAG_LEAF},
+ {gBattleAnimSpritePal_Finger, ANIM_TAG_FINGER},
+ {gBattleAnimSpritePal_PoisonPowder, ANIM_TAG_POISON_POWDER},
+ {gBattleAnimSpritePal_BrownTriangle, ANIM_TAG_BROWN_TRIANGLE},
+ {gBattleAnimSpritePal_SleepPowder, ANIM_TAG_SLEEP_POWDER},
+ {gBattleAnimSpritePal_StunSpore, ANIM_TAG_STUN_SPORE},
+ {gBattleAnimSpritePal_PoisonPowder, ANIM_TAG_POWDER},
+ {gBattleAnimSpritePal_Sparkle3, ANIM_TAG_SPARKLE_3},
+ {gBattleAnimSpritePal_Sparkle3, ANIM_TAG_SPARKLE_4},
+ {gBattleAnimSpritePal_MusicNotes, ANIM_TAG_MUSIC_NOTES},
+ {gBattleAnimSpritePal_Duck, ANIM_TAG_DUCK},
+ {gBattleAnimSpritePal_MudSand, ANIM_TAG_MUD_SAND},
+ {gBattleAnimSpritePal_Alert, ANIM_TAG_ALERT},
+ {gBattleAnimSpritePal_BlueFlames, ANIM_TAG_BLUE_FLAMES},
+ {gBattleAnimSpritePal_BlueFlames, ANIM_TAG_BLUE_FLAMES_2},
+ {gBattleAnimSpritePal_Shock4, ANIM_TAG_SHOCK_4},
+ {gBattleAnimSpritePal_Shock4, ANIM_TAG_SHOCK},
+ {gBattleAnimSpritePal_Bell2, ANIM_TAG_BELL_2},
+ {gBattleAnimSpritePal_PinkGlove, ANIM_TAG_PINK_GLOVE},
+ {gBattleAnimSpritePal_BlueLines, ANIM_TAG_BLUE_LINES},
+ {gBattleAnimSpritePal_Impact3, ANIM_TAG_IMPACT_3},
+ {gBattleAnimSpritePal_Impact2, ANIM_TAG_IMPACT_2},
+ {gBattleAnimSpritePal_Reticle, ANIM_TAG_RETICLE},
+ {gBattleAnimSpritePal_Breath, ANIM_TAG_BREATH},
+ {gBattleAnimSpritePal_Anger, ANIM_TAG_ANGER},
+ {gBattleAnimSpritePal_Snowball, ANIM_TAG_SNOWBALL},
+ {gBattleAnimSpritePal_Vine, ANIM_TAG_VINE},
+ {gBattleAnimSpritePal_Sword2, ANIM_TAG_SWORD_2},
+ {gBattleAnimSpritePal_Clapping, ANIM_TAG_CLAPPING},
+ {gBattleAnimSpritePal_RedTube, ANIM_TAG_RED_TUBE},
+ {gBattleAnimSpritePal_Amnesia, ANIM_TAG_AMNESIA},
+ {gBattleAnimSpritePal_String2, ANIM_TAG_STRING_2},
+ {gBattleAnimSpritePal_Pencil2, ANIM_TAG_PENCIL_2},
+ {gBattleAnimSpritePal_Petal, ANIM_TAG_PETAL},
+ {gBattleAnimSpritePal_BentSpoon, ANIM_TAG_BENT_SPOON},
+ {gBattleAnimSpritePal_String2, ANIM_TAG_WEB},
+ {gBattleAnimSpritePal_MilkBottle, ANIM_TAG_MILK_BOTTLE},
+ {gBattleAnimSpritePal_Coin, ANIM_TAG_COIN},
+ {gBattleAnimSpritePal_CrackedEgg, ANIM_TAG_CRACKED_EGG},
+ {gBattleAnimSpritePal_CrackedEgg, ANIM_TAG_HATCHED_EGG},
+ {gBattleAnimSpritePal_FreshEgg, ANIM_TAG_FRESH_EGG},
+ {gBattleAnimSpritePal_Fangs, ANIM_TAG_FANGS},
+ {gBattleAnimSpritePal_Explosion2, ANIM_TAG_EXPLOSION_2},
+ {gBattleAnimSpritePal_Explosion2, ANIM_TAG_EXPLOSION_3},
+ {gBattleAnimSpritePal_WaterDroplet, ANIM_TAG_WATER_DROPLET},
+ {gBattleAnimSpritePal_WaterDroplet, ANIM_TAG_WATER_DROPLET_2},
+ {gBattleAnimSpritePal_Seed2, ANIM_TAG_SEED_2},
+ {gBattleAnimSpritePal_Seed2, ANIM_TAG_SPROUT},
+ {gBattleAnimSpritePal_RedWand, ANIM_TAG_RED_WAND},
+ {gBattleAnimSpritePal_PurpleGreenUnk, ANIM_TAG_PURPLE_GREEN_UNK},
+ {gBattleAnimSpritePal_WaterColumn, ANIM_TAG_WATER_COLUMN},
+ {gBattleAnimSpritePal_MudUnk, ANIM_TAG_MUD_UNK},
+ {gBattleAnimSpritePal_RainDrops, ANIM_TAG_RAIN_DROPS},
+ {gBattleAnimSpritePal_FurySwipes, ANIM_TAG_FURY_SWIPES},
+ {gBattleAnimSpritePal_Vine2, ANIM_TAG_VINE_2},
+ {gBattleAnimSpritePal_Teeth, ANIM_TAG_TEETH},
+ {gBattleAnimSpritePal_Bone2, ANIM_TAG_BONE_2},
+ {gBattleAnimSpritePal_WhiteBag, ANIM_TAG_WHITE_BAG},
+ {gBattleAnimSpritePal_Unknown, ANIM_TAG_UNKNOWN},
+ {gBattleAnimSpritePal_PurpleCoral, ANIM_TAG_PURPLE_CORAL},
+ {gBattleAnimSpritePal_PurpleCoral, ANIM_TAG_PURPLE_DROPLET},
+ {gBattleAnimSpritePal_Shock2, ANIM_TAG_SHOCK_2},
+ {gBattleAnimSpritePal_ClosingEye2, ANIM_TAG_CLOSING_EYE_2},
+ {gBattleAnimSpritePal_MetalBall, ANIM_TAG_METAL_BALL},
+ {gBattleAnimSpritePal_MonsterDoll, ANIM_TAG_MONSTER_DOLL},
+ {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND},
+ {gBattleAnimSpritePal_Whirlwind, ANIM_TAG_WHIRLWIND_2},
+ {gBattleAnimSpritePal_Explosion4, ANIM_TAG_EXPLOSION_4},
+ {gBattleAnimSpritePal_Explosion4, ANIM_TAG_EXPLOSION_5},
+ {gBattleAnimSpritePal_Tongue, ANIM_TAG_TONGUE},
+ {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE},
+ {gBattleAnimSpritePal_Smoke, ANIM_TAG_SMOKE_2},
+ {gBattleAnimSpritePal_Impact, ANIM_TAG_IMPACT},
+ {gBattleAnimSpritePal_CircleImpact, ANIM_TAG_CIRCLE_IMPACT},
+ {gBattleAnimSpritePal_Impact, ANIM_TAG_SCRATCH},
+ {gBattleAnimSpritePal_Impact, ANIM_TAG_CUT},
+ {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_SHARP_TEETH},
+ {gBattleAnimSpritePal_RainbowRings, ANIM_TAG_RAINBOW_RINGS},
+ {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_CRYSTALS},
+ {gBattleAnimSpritePal_IceCrystals, ANIM_TAG_ICE_SPIKES},
+ {gBattleAnimSpritePal_HandsAndFeet, ANIM_TAG_HANDS_AND_FEET},
+ {gBattleAnimSpritePal_MistCloud, ANIM_TAG_MIST_CLOUD},
+ {gBattleAnimSpritePal_SharpTeeth, ANIM_TAG_CLAMP},
+ {gBattleAnimSpritePal_RainDrops, ANIM_TAG_BUBBLE},
+ {gBattleAnimSpritePal_Orbs, ANIM_TAG_ORBS},
+ {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_IMPACT},
+ {gBattleAnimSpritePal_WaterImpact, ANIM_TAG_WATER_ORB},
+ {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_POISON_BUBBLE},
+ {gBattleAnimSpritePal_PoisonBubble, ANIM_TAG_TOXIC_BUBBLE},
+ {gBattleAnimSpritePal_Spikes, ANIM_TAG_SPIKES},
+ {gBattleAnimSpritePal_HornHit2, ANIM_TAG_HORN_HIT_2},
+ {gBattleAnimSpritePal_AirWave2, ANIM_TAG_AIR_WAVE_2},
+ {gBattleAnimSpritePal_SmallBubbles, ANIM_TAG_SMALL_BUBBLES},
+ {gBattleAnimSpritePal_RoundShadow, ANIM_TAG_ROUND_SHADOW},
+ {gBattleAnimSpritePal_Sunlight, ANIM_TAG_SUNLIGHT},
+ {gBattleAnimSpritePal_Spore, ANIM_TAG_SPORE},
+ {gBattleAnimSpritePal_Flower, ANIM_TAG_FLOWER},
+ {gBattleAnimSpritePal_RazorLeaf, ANIM_TAG_RAZOR_LEAF},
+ {gBattleAnimSpritePal_Needle, ANIM_TAG_NEEDLE},
+ {gBattleAnimSpritePal_WhirlwindLines, ANIM_TAG_WHIRLWIND_LINES},
+ {gBattleAnimSpritePal_GoldRing, ANIM_TAG_GOLD_RING},
+ {gBattleAnimSpritePal_PurpleRing, ANIM_TAG_PURPLE_RING},
+ {gBattleAnimSpritePal_BlueRing, ANIM_TAG_BLUE_RING},
+ {gBattleAnimSpritePal_GreenLightWall, ANIM_TAG_GREEN_LIGHT_WALL},
+ {gBattleAnimSpritePal_BlueLightWall, ANIM_TAG_BLUE_LIGHT_WALL},
+ {gBattleAnimSpritePal_RedLightWall, ANIM_TAG_RED_LIGHT_WALL},
+ {gBattleAnimSpritePal_GrayLightWall, ANIM_TAG_GRAY_LIGHT_WALL},
+ {gBattleAnimSpritePal_OrangeLightWall, ANIM_TAG_ORANGE_LIGHT_WALL},
+ {gBattleAnimSpritePal_BlackBall2, ANIM_TAG_BLACK_BALL_2},
+ {gBattleAnimSpritePal_PurpleGasCloud, ANIM_TAG_PURPLE_GAS_CLOUD},
+ {gBattleAnimSpritePal_Spark, ANIM_TAG_SPARK_H},
+ {gBattleAnimSpritePal_YellowStar, ANIM_TAG_YELLOW_STAR},
+ {gBattleAnimSpritePal_LargeFreshEgg, ANIM_TAG_LARGE_FRESH_EGG},
+ {gBattleAnimSpritePal_ShadowBall, ANIM_TAG_SHADOW_BALL},
+ {gBattleAnimSpritePal_Lick, ANIM_TAG_LICK},
+ {gBattleAnimSpritePal_VoidLines, ANIM_TAG_VOID_LINES},
+ {gBattleAnimSpritePal_String, ANIM_TAG_STRING},
+ {gBattleAnimSpritePal_String, ANIM_TAG_WEB_THREAD},
+ {gBattleAnimSpritePal_String, ANIM_TAG_SPIDER_WEB},
+ {gBattleAnimSpritePal_Lightbulb, ANIM_TAG_LIGHTBULB},
+ {gBattleAnimSpritePal_Slash, ANIM_TAG_SLASH},
+ {gBattleAnimSpritePal_FocusEnergy, ANIM_TAG_FOCUS_ENERGY},
+ {gBattleAnimSpritePal_SphereToCube, ANIM_TAG_SPHERE_TO_CUBE},
+ {gBattleAnimSpritePal_Tendrils, ANIM_TAG_TENDRILS},
+ {gBattleAnimSpritePal_Eye, ANIM_TAG_EYE},
+ {gBattleAnimSpritePal_WhiteShadow, ANIM_TAG_WHITE_SHADOW},
+ {gBattleAnimSpritePal_TealAlert, ANIM_TAG_TEAL_ALERT},
+ {gBattleAnimSpritePal_OpeningEye, ANIM_TAG_OPENING_EYE},
+ {gBattleAnimSpritePal_RoundWhiteHalo, ANIM_TAG_ROUND_WHITE_HALO},
+ {gBattleAnimSpritePal_FangAttack, ANIM_TAG_FANG_ATTACK},
+ {gBattleAnimSpritePal_PurpleHandOutline, ANIM_TAG_PURPLE_HAND_OUTLINE},
+ {gBattleAnimSpritePal_Moon, ANIM_TAG_MOON},
+ {gBattleAnimSpritePal_GreenSparkle, ANIM_TAG_GREEN_SPARKLE},
+ {gBattleAnimSpritePal_Spiral, ANIM_TAG_SPIRAL},
+ {gBattleAnimSpritePal_SnoreZ, ANIM_TAG_SNORE_Z},
+ {gBattleAnimSpritePal_Explosion, ANIM_TAG_EXPLOSION},
+ {gBattleAnimSpritePal_Nail, ANIM_TAG_NAIL},
+ {gBattleAnimSpritePal_GhostlySpirit, ANIM_TAG_GHOSTLY_SPIRIT},
+ {gBattleAnimSpritePal_WarmRock, ANIM_TAG_WARM_ROCK},
+ {gBattleAnimSpritePal_BreakingEgg, ANIM_TAG_BREAKING_EGG},
+ {gBattleAnimSpritePal_ThinRing, ANIM_TAG_THIN_RING},
+ {gBattleAnimSpritePal_PunchImpact, ANIM_TAG_PUNCH_IMPACT},
+ {gBattleAnimSpritePal_Bell, ANIM_TAG_BELL},
+ {gBattleAnimSpritePal_MusicNotes2, ANIM_TAG_MUSIC_NOTES_2},
+ {gBattleAnimSpritePal_SpeedDust, ANIM_TAG_SPEED_DUST},
+ {gBattleAnimSpritePal_BlueLightWall, ANIM_TAG_TORN_METAL},
+ {gBattleAnimSpritePal_ThoughtBubble, ANIM_TAG_THOUGHT_BUBBLE},
+ {gBattleAnimSpritePal_MagentaHeart, ANIM_TAG_MAGENTA_HEART},
+ {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_ELECTRIC_ORBS},
+ {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_CIRCLE_OF_LIGHT},
+ {gBattleAnimSpritePal_ElectricOrbs, ANIM_TAG_ELECTRICITY},
+ {gBattleAnimSpritePal_Finger, ANIM_TAG_FINGER_2},
+ {gBattleAnimSpritePal_MovementWaves, ANIM_TAG_MOVEMENT_WAVES},
+ {gBattleAnimSpritePal_RedHeart, ANIM_TAG_RED_HEART},
+ {gBattleAnimSpritePal_RedOrb, ANIM_TAG_RED_ORB},
+ {gBattleAnimSpritePal_EyeSparkle, ANIM_TAG_EYE_SPARKLE},
+ {gBattleAnimSpritePal_PinkHeart, ANIM_TAG_PINK_HEART},
+ {gBattleAnimSpritePal_Angel, ANIM_TAG_ANGEL},
+ {gBattleAnimSpritePal_Devil, ANIM_TAG_DEVIL},
+ {gBattleAnimSpritePal_Swipe, ANIM_TAG_SWIPE},
+ {gBattleAnimSpritePal_Roots, ANIM_TAG_ROOTS},
+ {gBattleAnimSpritePal_ItemBag, ANIM_TAG_ITEM_BAG},
+ {gBattleAnimSpritePal_JaggedMusicNote, ANIM_TAG_JAGGED_MUSIC_NOTE},
+ {gBattleAnimSpritePal_Pokeball, ANIM_TAG_POKEBALL},
+ {gBattleAnimSpritePal_Pokeball, ANIM_TAG_SPOTLIGHT},
+ {gBattleAnimSpritePal_LetterZ, ANIM_TAG_LETTER_Z},
+ {gBattleAnimSpritePal_RapidSpin, ANIM_TAG_RAPID_SPIN},
+ {gBattleAnimSpritePal_TriForceTriangle, ANIM_TAG_TRI_FORCE_TRIANGLE},
+ {gBattleAnimSpritePal_WispOrb, ANIM_TAG_WISP_ORB},
+ {gBattleAnimSpritePal_WispOrb, ANIM_TAG_WISP_FIRE},
+ {gBattleAnimSpritePal_GoldStars, ANIM_TAG_GOLD_STARS},
+ {gBattleAnimSpritePal_EclipsingOrb, ANIM_TAG_ECLIPSING_ORB},
+ {gBattleAnimSpritePal_GrayOrb, ANIM_TAG_GRAY_ORB},
+ {gBattleAnimSpritePal_BlueOrb, ANIM_TAG_BLUE_ORB},
+ {gBattleAnimSpritePal_RedOrb2, ANIM_TAG_RED_ORB_2},
+ {gBattleAnimSpritePal_PinkPetal, ANIM_TAG_PINK_PETAL},
+ {gBattleAnimSpritePal_PainSplit, ANIM_TAG_PAIN_SPLIT},
+ {gBattleAnimSpritePal_Confetti, ANIM_TAG_CONFETTI},
+ {gBattleAnimSpritePal_GreenStar, ANIM_TAG_GREEN_STAR},
+ {gBattleAnimSpritePal_PinkCloud, ANIM_TAG_PINK_CLOUD},
+ {gBattleAnimSpritePal_SweatDrop, ANIM_TAG_SWEAT_DROP},
+ {gBattleAnimSpritePal_GuardRing, ANIM_TAG_GUARD_RING},
+ {gBattleAnimSpritePal_PurpleScratch, ANIM_TAG_PURPLE_SCRATCH},
+ {gBattleAnimSpritePal_PurpleScratch, ANIM_TAG_PURPLE_SWIPE},
+ {gBattleAnimSpritePal_Finger, ANIM_TAG_TAG_HAND},
+ {gBattleAnimSpritePal_SmallRedEye, ANIM_TAG_SMALL_RED_EYE},
+ {gBattleAnimSpritePal_HollowOrb, ANIM_TAG_HOLLOW_ORB},
+ {gBattleAnimSpritePal_HollowOrb, ANIM_TAG_X_SIGN},
+ {gBattleAnimSpritePal_BluegreenOrb, ANIM_TAG_BLUEGREEN_ORB},
+ {gBattleAnimSpritePal_PawPrint, ANIM_TAG_PAW_PRINT},
+ {gBattleAnimSpritePal_PurpleFlame, ANIM_TAG_PURPLE_FLAME},
+ {gBattleAnimSpritePal_RedBall, ANIM_TAG_RED_BALL},
+ {gBattleAnimSpritePal_SmellingsaltEffect, ANIM_TAG_SMELLINGSALT_EFFECT},
+ {gBattleAnimSpritePal_Meteor, ANIM_TAG_METEOR},
+ {gBattleAnimSpritePal_FlatRock, ANIM_TAG_FLAT_ROCK},
+ {gBattleAnimSpritePal_MagnifyingGlass, ANIM_TAG_MAGNIFYING_GLASS},
+ {gBattleAnimSpritePal_BrownOrb, ANIM_TAG_BROWN_ORB},
+ {gBattleAnimSpritePal_MetalSoundWaves, ANIM_TAG_METAL_SOUND_WAVES},
+ {gBattleAnimSpritePal_FlyingDirt, ANIM_TAG_FLYING_DIRT},
+ {gBattleAnimSpritePal_IcicleSpear, ANIM_TAG_ICICLE_SPEAR},
+ {gBattleAnimSpritePal_Hail, ANIM_TAG_HAIL},
+ {gBattleAnimSpritePal_GlowyRedOrb, ANIM_TAG_GLOWY_RED_ORB},
+ {gBattleAnimSpritePal_GlowyGreenOrb, ANIM_TAG_GLOWY_GREEN_ORB},
+ {gBattleAnimSpritePal_GreenSpike, ANIM_TAG_GREEN_SPIKE},
+ {gBattleAnimSpritePal_WhiteCircleOfLight, ANIM_TAG_WHITE_CIRCLE_OF_LIGHT},
+ {gBattleAnimSpritePal_GlowyBlueOrb, ANIM_TAG_GLOWY_BLUE_ORB},
+ {gBattleAnimSpritePal_Pokeblock, ANIM_TAG_POKEBLOCK},
+ {gBattleAnimSpritePal_WhiteFeather, ANIM_TAG_WHITE_FEATHER},
+ {gBattleAnimSpritePal_Sparkle6, ANIM_TAG_SPARKLE_6},
+ {gBattleAnimSpritePal_Splash, ANIM_TAG_SPLASH},
+ {gBattleAnimSpritePal_Splash, ANIM_TAG_SWEAT_BEAD},
+ {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_1},
+ {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_2},
+ {gBattleAnimSpritePal_Gem1, ANIM_TAG_GEM_3},
+ {gBattleAnimSpritePal_SlamHit2, ANIM_TAG_SLAM_HIT_2},
+ {gBattleAnimSpritePal_Recycle, ANIM_TAG_RECYCLE},
+ {gBattleAnimSpritePal_RedParticles, ANIM_TAG_RED_PARTICLES},
+ {gBattleAnimSpritePal_Protect, ANIM_TAG_PROTECT},
+ {gBattleAnimSpritePal_DirtMound, ANIM_TAG_DIRT_MOUND},
+ {gBattleAnimSpritePal_Shock3, ANIM_TAG_SHOCK_3},
+ {gBattleAnimSpritePal_WeatherBall, ANIM_TAG_WEATHER_BALL},
+ {gBattleAnimSpritePal_Bird, ANIM_TAG_BIRD},
+ {gBattleAnimSpritePal_CrossImpact, ANIM_TAG_CROSS_IMPACT},
+ {gBattleAnimSpritePal_Slash2, ANIM_TAG_SLASH_2},
+ {gBattleAnimSpritePal_WhipHit, ANIM_TAG_WHIP_HIT},
+ {gBattleAnimSpritePal_BlueRing2, ANIM_TAG_BLUE_RING_2},
+};
+
+const struct BattleAnimBackground gBattleAnimBackgroundTable[] =
+{
+ [BG_DARK_] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark},
+ [BG_DARK] = {gBattleAnimBgImage_Dark, gBattleAnimBgPalette_Dark, gBattleAnimBgTilemap_Dark},
+ [BG_GHOST] = {gBattleAnimBgImage_Ghost, gBattleAnimBgPalette_Ghost, gBattleAnimBgTilemap_Ghost},
+ [BG_PSYCHIC] = {gBattleAnimBgImage_Psychic, gBattleAnimBgPalette_Psychic, gBattleAnimBgTilemap_Psychic},
+ [BG_IMPACT_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactOpponent},
+ [BG_IMPACT_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactPlayer},
+ [BG_IMPACT_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Impact, gBattleAnimBgTilemap_ImpactContests},
+ [BG_DRILL] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_Drill},
+ [BG_DRILL_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Drill, gBattleAnimBgTilemap_DrillContests},
+ [BG_HIGHSPEED_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedOpponent},
+ [BG_HIGHSPEED_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Highspeed, gBattleAnimBgTilemap_HighspeedPlayer},
+ [BG_THUNDER] = {gBattleAnimBgImage_Thunder, gBattleAnimBgPalette_Thunder, gBattleAnimBgTilemap_Thunder},
+ [BG_GUILLOTINE_OPPONENT] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineOpponent},
+ [BG_GUILLOTINE_PLAYER] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotinePlayer},
+ [BG_GUILLOTINE_CONTESTS] = {gBattleAnimBgImage_Guillotine, gBattleAnimBgPalette_Guillotine, gBattleAnimBgTilemap_GuillotineContests},
+ [BG_ICE] = {gBattleAnimBgImage_Ice, gBattleAnimBgPalette_Ice, gBattleAnimBgTilemap_Ice},
+ [BG_COSMIC] = {gBattleAnimBgImage_Cosmic, gBattleAnimBgPalette_Cosmic, gBattleAnimBgTilemap_Cosmic},
+ [BG_IN_AIR] = {gBattleAnimBgImage_InAir, gBattleAnimBgPalette_InAir, gBattleAnimBgTilemap_InAir},
+ [BG_SKY] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_Drill},
+ [BG_SKY_CONTESTS] = {gBattleAnimBgImage_Drill, gBattleAnimBgPalette_Sky, gBattleAnimBgTilemap_DrillContests},
+ [BG_AURORA] = {gBattleAnimBgImage_Aurora, gBattleAnimBgPalette_Aurora, gBattleAnimBgTilemap_Aurora},
+ [BG_FISSURE] = {gBattleAnimBgImage_Fissure, gBattleAnimBgPalette_Fissure, gBattleAnimBgTilemap_Fissure},
+ [BG_BUG_OPPONENT] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedOpponent},
+ [BG_BUG_PLAYER] = {gBattleAnimBgImage_Highspeed, gBattleAnimBgPalette_Bug, gBattleAnimBgTilemap_HighspeedPlayer},
+ [BG_SOLARBEAM_OPPONENT] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactOpponent},
+ [BG_SOLARBEAM_PLAYER] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactPlayer},
+ [BG_SOLARBEAM_CONTESTS] = {gBattleAnimBgImage_Impact, gBattleAnimBgPalette_Solarbeam, gBattleAnimBgTilemap_ImpactContests},
+};
+
+static void (*const sScriptCmdTable[])(void) =
+{
+ ScriptCmd_loadspritegfx,
+ ScriptCmd_unloadspritegfx,
+ ScriptCmd_createsprite,
+ ScriptCmd_createvisualtask,
+ ScriptCmd_delay,
+ ScriptCmd_waitforvisualfinish,
+ ScriptCmd_hang1,
+ ScriptCmd_hang2,
+ ScriptCmd_end,
+ ScriptCmd_playse,
+ ScriptCmd_monbg,
+ ScriptCmd_clearmonbg,
+ ScriptCmd_setalpha,
+ ScriptCmd_blendoff,
+ ScriptCmd_call,
+ ScriptCmd_return,
+ ScriptCmd_setarg,
+ ScriptCmd_choosetwoturnanim,
+ ScriptCmd_jumpifmoveturn,
+ ScriptCmd_goto,
+ ScriptCmd_fadetobg,
+ ScriptCmd_restorebg,
+ ScriptCmd_waitbgfadeout,
+ ScriptCmd_waitbgfadein,
+ ScriptCmd_changebg,
+ ScriptCmd_playsewithpan,
+ ScriptCmd_setpan,
+ ScriptCmd_panse_1B,
+ ScriptCmd_loopsewithpan,
+ ScriptCmd_waitplaysewithpan,
+ ScriptCmd_setbldcnt,
+ ScriptCmd_createsoundtask,
+ ScriptCmd_waitsound,
+ ScriptCmd_jumpargeq,
+ ScriptCmd_monbg_22,
+ ScriptCmd_clearmonbg_23,
+ ScriptCmd_jumpifcontest,
+ ScriptCmd_fadetobgfromset,
+ ScriptCmd_panse_26,
+ ScriptCmd_panse_27,
+ ScriptCmd_monbgprio_28,
+ ScriptCmd_monbgprio_29,
+ ScriptCmd_monbgprio_2A,
+ ScriptCmd_invisible,
+ ScriptCmd_visible,
+ ScriptCmd_doublebattle_2D,
+ ScriptCmd_doublebattle_2E,
+ ScriptCmd_stopsound
+};
+
+// Functions
+void ClearBattleAnimationVars(void)
+{
+ s32 i;
+
+ sAnimFramesToWait = 0;
+ gAnimScriptActive = FALSE;
+ gAnimVisualTaskCount = 0;
+ gAnimSoundTaskCount = 0;
+ gAnimDisableStructPtr = NULL;
+ gAnimMoveDmg = 0;
+ gAnimMovePower = 0;
+ gAnimFriendship = 0;
+
+ // Clear index array.
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ sAnimSpriteIndexArray[i] |= 0xFFFF;
+
+ // Clear anim args.
+ for (i = 0; i < ANIM_ARGS_COUNT; i++)
+ gBattleAnimArgs[i] = 0;
+
+ sMonAnimTaskIdArray[0] = 0xFF;
+ sMonAnimTaskIdArray[1] = (s8)0xFF;
+ gAnimMoveTurn = 0;
+ sAnimBackgroundFadeState = 0;
+ sAnimMoveIndex = 0;
+ gBattleAnimAttacker = 0;
+ gBattleAnimTarget = 0;
+ gUnknown_2037F24 = 0;
+}
+
+void DoMoveAnim(u16 move)
+{
+ gBattleAnimAttacker = gBattlerAttacker;
+ gBattleAnimTarget = gBattlerTarget;
+ LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE);
+}
+
+void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim)
+{
+ s32 i;
+
+ sub_80767F0();
+ UpdateOamPriorityInAllHealthboxes(0);
+ for (i = 0; i < MAX_BATTLERS_COUNT; i++)
+ {
+ if (GetBattlerSide(i) != B_SIDE_PLAYER)
+ gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
+ else
+ gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
+ }
+
+ if (!isMoveAnim)
+ sAnimMoveIndex = 0;
+ else
+ sAnimMoveIndex = tableId;
+
+ for (i = 0; i < ANIM_ARGS_COUNT; i++)
+ gBattleAnimArgs[i] = 0;
+
+ sMonAnimTaskIdArray[0] = 0xFF;
+ sMonAnimTaskIdArray[1] = (s8)-1;
+ sBattleAnimScriptPtr = animsTable[tableId];
+ gAnimScriptActive = TRUE;
+ sAnimFramesToWait = 0;
+ gAnimScriptCallback = RunAnimScriptCommand;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ sAnimSpriteIndexArray[i] = 0xFFFF;
+
+ if (isMoveAnim)
+ {
+ for (i = 0; gMovesWithQuietBGM[i] != 0xFFFF; i++)
+ {
+ if (tableId == gMovesWithQuietBGM[i])
+ {
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 128);
+ break;
+ }
+ }
+ }
+
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ gBattle_WIN1H = 0;
+ gBattle_WIN1V = 0;
+}
+
+void DestroyAnimSprite(struct Sprite *sprite)
+{
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ gAnimVisualTaskCount--;
+}
+
+void DestroyAnimVisualTask(u8 taskId)
+{
+ DestroyTask(taskId);
+ gAnimVisualTaskCount--;
+}
+
+void DestroyAnimSoundTask(u8 taskId)
+{
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+}
+
+static void AddSpriteIndex(u16 index)
+{
+ s32 i;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ {
+ if (sAnimSpriteIndexArray[i] == 0xFFFF)
+ {
+ sAnimSpriteIndexArray[i] = index;
+ return;
+ }
+ }
+}
+
+static void ClearSpriteIndex(u16 index)
+{
+ s32 i;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ {
+ if (sAnimSpriteIndexArray[i] == index)
+ {
+ sAnimSpriteIndexArray[i] = 0xFFFF;
+ return;
+ }
+ }
+}
+
+static void WaitAnimFrameCount(void)
+{
+ if (sAnimFramesToWait <= 0)
+ {
+ gAnimScriptCallback = RunAnimScriptCommand;
+ sAnimFramesToWait = 0;
+ }
+ else
+ {
+ sAnimFramesToWait--;
+ }
+}
+
+static void RunAnimScriptCommand(void)
+{
+ do
+ {
+ sScriptCmdTable[sBattleAnimScriptPtr[0]]();
+ } while (sAnimFramesToWait == 0 && gAnimScriptActive);
+}
+
+static void ScriptCmd_loadspritegfx(void)
+{
+ u16 index;
+
+ sBattleAnimScriptPtr++;
+ index = T1_READ_16(sBattleAnimScriptPtr);
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
+ sBattleAnimScriptPtr += 2;
+ AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+ sAnimFramesToWait = 1;
+ gAnimScriptCallback = WaitAnimFrameCount;
+}
+
+static void ScriptCmd_unloadspritegfx(void)
+{
+ u16 index;
+
+ sBattleAnimScriptPtr++;
+ index = T1_READ_16(sBattleAnimScriptPtr);
+ FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
+ sBattleAnimScriptPtr += 2;
+ ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+}
+
+static void ScriptCmd_createsprite(void)
+{
+ s32 i;
+ const struct SpriteTemplate *template;
+ u8 argVar;
+ u8 argsCount;
+ s16 subpriority;
+
+ sBattleAnimScriptPtr++;
+ template = (const struct SpriteTemplate *)(T2_READ_32(sBattleAnimScriptPtr));
+ sBattleAnimScriptPtr += 4;
+
+ argVar = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+
+ argsCount = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+ for (i = 0; i < argsCount; i++)
+ {
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 2;
+ }
+
+ if (argVar & 0x80)
+ {
+ argVar ^= 0x80;
+ if (argVar >= 0x40)
+ argVar -= 0x40;
+ else
+ argVar *= -1;
+
+ subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (s8)(argVar);
+ }
+ else
+ {
+ if (argVar >= 0x40)
+ argVar -= 0x40;
+ else
+ argVar *= -1;
+
+ subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + (s8)(argVar);
+ }
+
+ if (subpriority < 3)
+ subpriority = 3;
+
+ CreateSpriteAndAnimate(
+ template,
+ GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2),
+ GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET),
+ subpriority);
+ gAnimVisualTaskCount++;
+}
+
+static void ScriptCmd_createvisualtask(void)
+{
+ TaskFunc taskFunc;
+ u8 taskPriority;
+ u8 taskId;
+ u8 numArgs;
+ s32 i;
+
+ sBattleAnimScriptPtr++;
+
+ taskFunc = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 4;
+
+ taskPriority = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+
+ numArgs = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 2;
+ }
+
+ taskId = CreateTask(taskFunc, taskPriority);
+ taskFunc(taskId);
+ gAnimVisualTaskCount++;
+}
+
+static void ScriptCmd_delay(void)
+{
+ sBattleAnimScriptPtr++;
+ sAnimFramesToWait = sBattleAnimScriptPtr[0];
+ if (sAnimFramesToWait == 0)
+ sAnimFramesToWait = -1;
+ sBattleAnimScriptPtr++;
+ gAnimScriptCallback = WaitAnimFrameCount;
+}
+
+static void ScriptCmd_waitforvisualfinish(void)
+{
+ if (gAnimVisualTaskCount == 0)
+ {
+ sBattleAnimScriptPtr++;
+ sAnimFramesToWait = 0;
+ }
+ else
+ {
+ sAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_hang1(void)
+{
+}
+
+static void ScriptCmd_hang2(void)
+{
+}
+
+static void ScriptCmd_end(void)
+{
+ s32 i;
+ bool32 continuousAnim = FALSE;
+
+ // Keep waiting as long as there are animations to be done.
+ if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0
+ || sMonAnimTaskIdArray[0] != 0xFF || sMonAnimTaskIdArray[1] != 0xFF)
+ {
+ sSoundAnimFramesToWait = 0;
+ sAnimFramesToWait = 1;
+ return;
+ }
+
+ // Finish the sound effects.
+ if (IsSEPlaying())
+ {
+ if (++sSoundAnimFramesToWait <= 90) // Wait 90 frames, then halt the sound effect.
+ {
+ sAnimFramesToWait = 1;
+ return;
+ }
+ else
+ {
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ }
+ }
+
+ // The SE has halted, so set the SE Frame Counter to 0 and continue.
+ sSoundAnimFramesToWait = 0;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ {
+ if (sAnimSpriteIndexArray[i] != 0xFFFF)
+ {
+ FreeSpriteTilesByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag);
+ sAnimSpriteIndexArray[i] = 0xFFFF; // set terminator.
+ }
+ }
+
+ if (!continuousAnim)
+ {
+ m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256);
+ sub_80767F0();
+ UpdateOamPriorityInAllHealthboxes(1);
+ gAnimScriptActive = FALSE;
+ }
+}
+
+static void ScriptCmd_playse(void)
+{
+ sBattleAnimScriptPtr++;
+ PlaySE(T1_READ_16(sBattleAnimScriptPtr));
+ sBattleAnimScriptPtr += 2;
+}
+
+#define t1_MONBG_BATTLER 0
+#define t1_MON_IN_BG2 1
+#define t1_CREATE_ANOTHER_TASK 2
+#define t1_IS_SECONDMON_BG 3
+
+#define t2_BATTLER_SPRITE_ID 0
+#define t2_MON_IN_BG2 5
+#define t2_MONBG_BATTLER 6
+
+static void ScriptCmd_monbg(void)
+{
+ bool8 toBG_2;
+ u8 taskId;
+ u8 battlerId;
+ u8 animBattler;
+ u8 position;
+ u8 spriteId;
+
+ sBattleAnimScriptPtr++;
+ animBattler = sBattleAnimScriptPtr[0];
+ if (animBattler == ANIM_ATTACKER)
+ animBattler = ANIM_ATK_PARTNER;
+ else if (animBattler == ANIM_TARGET)
+ animBattler = ANIM_DEF_PARTNER;
+
+ if (animBattler == ANIM_ATTACKER || animBattler == ANIM_ATK_PARTNER)
+ battlerId = gBattleAnimAttacker;
+ else
+ battlerId = gBattleAnimTarget;
+
+ if (IsBattlerSpriteVisible(battlerId))
+ {
+ position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)
+ toBG_2 = FALSE;
+ else
+ toBG_2 = TRUE;
+
+ MoveBattlerSpriteToBG(battlerId, toBG_2);
+ spriteId = gBattlerSpriteIds[battlerId];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId;
+ gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ if (!toBG_2)
+ {
+ gTasks[taskId].data[3] = gBattle_BG1_X;
+ gTasks[taskId].data[4] = gBattle_BG1_Y;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gBattle_BG2_X;
+ gTasks[taskId].data[4] = gBattle_BG2_Y;
+ }
+
+ gTasks[taskId].data[5] = toBG_2;
+ gTasks[taskId].data[6] = battlerId;
+ sMonAnimTaskIdArray[0] = taskId;
+ }
+
+ battlerId ^= BIT_FLANK;
+ if (animBattler > ANIM_TARGET && IsBattlerSpriteVisible(battlerId))
+ {
+ position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)
+ toBG_2 = FALSE;
+ else
+ toBG_2 = TRUE;
+
+ MoveBattlerSpriteToBG(battlerId, toBG_2);
+ spriteId = gBattlerSpriteIds[battlerId];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId;
+ gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ if (!toBG_2)
+ {
+ gTasks[taskId].data[3] = gBattle_BG1_X;
+ gTasks[taskId].data[4] = gBattle_BG1_Y;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gBattle_BG2_X;
+ gTasks[taskId].data[4] = gBattle_BG2_Y;
+ }
+
+ gTasks[taskId].data[5] = toBG_2;
+ gTasks[taskId].data[6] = battlerId;
+ sMonAnimTaskIdArray[1] = taskId;
+ }
+
+ sBattleAnimScriptPtr++;
+}
+
+bool8 IsBattlerSpriteVisible(u8 battlerId)
+{
+ u8 battler = battlerId;
+
+ if (!IsBattlerSpritePresent(battler))
+ return FALSE;
+
+ if (!gBattleSpritesDataPtr->battlerData[battler].invisible || !gSprites[gBattlerSpriteIds[battler]].invisible)
+ return TRUE;
+
+ return FALSE;
+}
+
+void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2)
+{
+ struct BattleAnimBgData animBg;
+ u8 battlerSpriteId;
+ struct Sprite *sprite;
+
+ if (!toBG_2)
+ {
+
+ RequestDma3Fill(0, (void*)(BG_SCREEN_ADDR(8)), 0x2000, 1);
+ RequestDma3Fill(0, (void*)(BG_SCREEN_ADDR(28)), 0x1000, 1);
+ sub_80752A0(&animBg);
+ CpuFill16(toBG_2, animBg.bgTiles, 0x1000);
+ CpuFill16(toBG_2, animBg.bgTilemap, 0x800);
+
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1);
+ SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0);
+
+ battlerSpriteId = gBattlerSpriteIds[battlerId];
+ gBattle_BG1_X = -(gSprites[battlerSpriteId].pos1.x + gSprites[battlerSpriteId].pos2.x) + 0x20;
+ gBattle_BG1_Y = -(gSprites[battlerSpriteId].pos1.y + gSprites[battlerSpriteId].pos2.y) + 0x20;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+
+ LoadPalette(&gPlttBufferUnfaded[0x100 + battlerId * 16], animBg.paletteId * 16, 0x20);
+ CpuCopy32(&gPlttBufferUnfaded[0x100 + battlerId * 16], (void*)(BG_PLTT + animBg.paletteId * 32), 0x20);
+
+ sub_80BCEF4(1, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles, animBg.bgTilemap, animBg.tilesOffset);
+ }
+ else
+ {
+ RequestDma3Fill(0, (void*)(BG_SCREEN_ADDR(12)), 0x2000, 1);
+ RequestDma3Fill(0, (void*)(BG_SCREEN_ADDR(30)), 0x1000, 1);
+ sub_80752C8(&animBg, 2);
+ CpuFill16(0, animBg.bgTiles + 0x1000, 0x1000);
+ CpuFill16(0, animBg.bgTilemap + 0x400, 0x800);
+ SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
+ SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1);
+ SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0);
+
+ battlerSpriteId = gBattlerSpriteIds[battlerId];
+ gBattle_BG2_X = -(gSprites[battlerSpriteId].pos1.x + gSprites[battlerSpriteId].pos2.x) + 0x20;
+ gBattle_BG2_Y = -(gSprites[battlerSpriteId].pos1.y + gSprites[battlerSpriteId].pos2.y) + 0x20;
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE;
+
+ SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);
+ SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);
+
+ LoadPalette(&gPlttBufferUnfaded[0x100 + battlerId * 16], 0x90, 0x20);
+ CpuCopy32(&gPlttBufferUnfaded[0x100 + battlerId * 16], (void*)(BG_PLTT + 0x120), 0x20);
+
+ sub_80BCEF4(2, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles + 0x1000, animBg.bgTilemap + 0x400, animBg.tilesOffset);
+ }
+}
+
+void sub_80730C0(u16 a, u16 *b, s32 c, u8 d)
+{
+ u8 i, j;
+ u32 var;
+
+ if (d == 0)
+ var = 32;
+ else
+ var = 64;
+
+ a <<= 12;
+ for (i = 0; i < var; i++)
+ {
+ for (j = 0; j < 32; j++)
+ {
+ b[32 * i + j] = ((b[32 * i + j] & 0xFFF) | a) + c;
+ }
+ }
+}
+
+void sub_8073128(bool8 to_BG2)
+{
+ struct BattleAnimBgData animBg;
+ sub_80752A0(&animBg);
+
+ if (!to_BG2)
+ {
+ sub_8075358(1);
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ }
+ else
+ {
+ sub_8075358(2);
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ }
+}
+
+static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
+{
+ u8 spriteId, palIndex;
+ s16 x, y;
+ struct BattleAnimBgData animBg;
+
+ spriteId = gTasks[taskId].data[0];
+ palIndex = gTasks[taskId].data[6];
+ sub_80752A0(&animBg);
+ x = gTasks[taskId].data[1] - (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x);
+ y = gTasks[taskId].data[2] - (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y);
+
+ if (gTasks[taskId].data[5] == 0)
+ {
+ u16 *src;
+ u16 *dst;
+
+ gBattle_BG1_X = x + gTasks[taskId].data[3];
+ gBattle_BG1_Y = y + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + palIndex * 16;
+ dst = gPlttBufferFaded + 0x100 + animBg.paletteId * 16 - 256;
+ CpuCopy32(src, dst, 0x20);
+ }
+ else
+ {
+ u16 *src;
+ u16 *dst;
+
+ gBattle_BG2_X = x + gTasks[taskId].data[3];
+ gBattle_BG2_Y = y + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + palIndex * 16;
+ dst = gPlttBufferFaded + 0x100 - 112;
+ CpuCopy32(src, dst, 0x20);
+ }
+}
+
+static void ScriptCmd_clearmonbg(void)
+{
+ u8 animBattlerId;
+ u8 battlerId;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ animBattlerId = sBattleAnimScriptPtr[0];
+ if (animBattlerId == ANIM_ATTACKER)
+ animBattlerId = ANIM_ATK_PARTNER;
+ else if (animBattlerId == ANIM_TARGET)
+ animBattlerId = ANIM_DEF_PARTNER;
+
+ if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)
+ battlerId = gBattleAnimAttacker;
+ else
+ battlerId = gBattleAnimTarget;
+
+ if (sMonAnimTaskIdArray[0] != 0xFF)
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;
+ if (animBattlerId > ANIM_TARGET && sMonAnimTaskIdArray[1] != 0xFF)
+ gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = FALSE;
+ else
+ animBattlerId = ANIM_ATTACKER;
+
+ taskId = CreateTask(sub_807331C, 5);
+ gTasks[taskId].data[0] = animBattlerId;
+ gTasks[taskId].data[2] = battlerId;
+
+ sBattleAnimScriptPtr++;
+}
+
+static void sub_807331C(u8 taskId)
+{
+ u8 toBG_2;
+ u8 position;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ position = GetBattlerPosition((u8)gTasks[taskId].data[2]);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)
+ toBG_2 = FALSE;
+ else
+ toBG_2 = TRUE;
+
+ if (sMonAnimTaskIdArray[0] != 0xFF)
+ {
+ sub_8073128(toBG_2);
+ DestroyTask(sMonAnimTaskIdArray[0]);
+ sMonAnimTaskIdArray[0] = 0xFF;
+ }
+ if (gTasks[taskId].data[0] > 1)
+ {
+ sub_8073128(toBG_2 ^ 1);
+ DestroyTask(sMonAnimTaskIdArray[1]);
+ sMonAnimTaskIdArray[1] = 0xFF;
+ }
+ DestroyTask(taskId);
+ }
+}
+
+static void ScriptCmd_monbg_22(void)
+{
+ bool8 toBG_2;
+ u8 battlerId;
+ u8 animBattlerId;
+ u8 position;
+
+ sBattleAnimScriptPtr++;
+ animBattlerId = sBattleAnimScriptPtr[0];
+ if (animBattlerId == ANIM_ATTACKER)
+ animBattlerId = ANIM_ATK_PARTNER;
+ else if (animBattlerId == ANIM_TARGET)
+ animBattlerId = ANIM_DEF_PARTNER;
+
+ if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)
+ battlerId = gBattleAnimAttacker;
+ else
+ battlerId = gBattleAnimTarget;
+
+ if (IsBattlerSpriteVisible(battlerId))
+ {
+ position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)
+ toBG_2 = FALSE;
+ else
+ toBG_2 = TRUE;
+
+ MoveBattlerSpriteToBG(battlerId, toBG_2);
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;
+ }
+
+ battlerId ^= BIT_FLANK;
+ if (animBattlerId > ANIM_TARGET && IsBattlerSpriteVisible(battlerId))
+ {
+ position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)
+ toBG_2 = FALSE;
+ else
+ toBG_2 = TRUE;
+
+ MoveBattlerSpriteToBG(battlerId, toBG_2);
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;
+ }
+
+ sBattleAnimScriptPtr++;
+}
+
+static void ScriptCmd_clearmonbg_23(void)
+{
+ u8 animBattlerId;
+ u8 battlerId;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ animBattlerId = sBattleAnimScriptPtr[0];
+
+ if (animBattlerId == ANIM_ATTACKER)
+ animBattlerId = ANIM_ATK_PARTNER;
+ else if (animBattlerId == ANIM_TARGET)
+ animBattlerId = ANIM_DEF_PARTNER;
+
+ if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER)
+ battlerId = gBattleAnimAttacker;
+ else
+ battlerId = gBattleAnimTarget;
+
+ if (IsBattlerSpriteVisible(battlerId))
+ gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE;
+ if (animBattlerId > ANIM_TARGET && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK))
+ gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = FALSE;
+ else
+ animBattlerId = ANIM_ATTACKER;
+
+ taskId = CreateTask(sub_8073558, 5);
+ gTasks[taskId].data[0] = animBattlerId;
+ gTasks[taskId].data[2] = battlerId;
+
+ sBattleAnimScriptPtr++;
+}
+
+static void sub_8073558(u8 taskId)
+{
+ bool8 to_BG2;
+ u8 position;
+ u8 battlerId;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ bool8 toBG_2;
+ battlerId = gTasks[taskId].data[2];
+ position = GetBattlerPosition(battlerId);
+ if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT)
+ toBG_2 = FALSE;
+ else
+ toBG_2 = TRUE;
+
+ if (IsBattlerSpriteVisible(battlerId))
+ sub_8073128(toBG_2);
+
+ if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK))
+ sub_8073128(toBG_2 ^ 1);
+
+ DestroyTask(taskId);
+ }
+}
+
+#undef t1_MONBG_BATTLER
+#undef t1_MON_IN_BG2
+#undef t1_CREATE_ANOTHER_TASK
+#undef t1_IS_SECONDMON_BG
+
+#undef t2_BATTLER_SPRITE_ID
+#undef t2_MON_IN_BG2
+#undef t2_MONBG_BATTLER
+
+static void ScriptCmd_setalpha(void)
+{
+ u16 half1, half2;
+
+ sBattleAnimScriptPtr++;
+ half1 = *(sBattleAnimScriptPtr++);
+ half2 = *(sBattleAnimScriptPtr++) << 8;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2);
+}
+
+static void ScriptCmd_setbldcnt(void)
+{
+ u16 half1, half2;
+
+ sBattleAnimScriptPtr++;
+ half1 = *(sBattleAnimScriptPtr++);
+ half2 = *(sBattleAnimScriptPtr++) << 8;
+ SetGpuReg(REG_OFFSET_BLDCNT, half1 | half2);
+}
+
+static void ScriptCmd_blendoff(void)
+{
+ sBattleAnimScriptPtr++;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+}
+
+static void ScriptCmd_call(void)
+{
+ sBattleAnimScriptPtr++;
+ sBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4;
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+}
+
+static void ScriptCmd_return(void)
+{
+ sBattleAnimScriptPtr = sBattleAnimScriptRetAddr;
+}
+
+static void ScriptCmd_setarg(void)
+{
+ const u8 *addr = sBattleAnimScriptPtr;
+ u16 value;
+ u8 argId;
+
+ sBattleAnimScriptPtr++;
+ argId = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+ value = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr = addr + 4;
+ gBattleAnimArgs[argId] = value;
+}
+
+static void ScriptCmd_choosetwoturnanim(void)
+{
+ sBattleAnimScriptPtr++;
+ if (gAnimMoveTurn & 1)
+ sBattleAnimScriptPtr += 4;
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+}
+
+static void ScriptCmd_jumpifmoveturn(void)
+{
+ u8 toCheck;
+
+ sBattleAnimScriptPtr++;
+ toCheck = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+
+ if (toCheck == gAnimMoveTurn)
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+ else
+ sBattleAnimScriptPtr += 4;
+}
+
+static void ScriptCmd_goto(void)
+{
+ sBattleAnimScriptPtr++;
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+}
+
+bool8 IsContest(void)
+{
+ return FALSE;
+}
+
+// Unused
+static bool8 sub_807378C(u16 a)
+{
+ if (a == 0xC9)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+#define tBackgroundId data[0]
+#define tState data[10]
+
+static void ScriptCmd_fadetobg(void)
+{
+ u8 backgroundId;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ backgroundId = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+ taskId = CreateTask(Task_FadeToBg, 5);
+ gTasks[taskId].tBackgroundId = backgroundId;
+ sAnimBackgroundFadeState = 1;
+}
+
+static void ScriptCmd_fadetobgfromset(void)
+{
+ u8 bg1, bg2, bg3;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ bg1 = sBattleAnimScriptPtr[0];
+ bg2 = sBattleAnimScriptPtr[1];
+ bg3 = sBattleAnimScriptPtr[2];
+ sBattleAnimScriptPtr += 3;
+ taskId = CreateTask(Task_FadeToBg, 5);
+
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ gTasks[taskId].tBackgroundId = bg2;
+ else
+ gTasks[taskId].tBackgroundId = bg1;
+
+ sAnimBackgroundFadeState = 1;
+}
+
+static void Task_FadeToBg(u8 taskId)
+{
+ if (gTasks[taskId].tState == 0)
+ {
+ BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0);
+ gTasks[taskId].tState++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].tState == 1)
+ {
+ gTasks[taskId].tState++;
+ sAnimBackgroundFadeState = 2;
+ }
+ else if (gTasks[taskId].tState == 2)
+ {
+ s16 bgId = gTasks[taskId].tBackgroundId;
+
+ if (bgId == -1)
+ LoadDefaultBg();
+ else
+ LoadMoveBg(bgId);
+
+ BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1);
+ gTasks[taskId].tState++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].tState == 3)
+ {
+ DestroyTask(taskId);
+ sAnimBackgroundFadeState = 0;
+ }
+}
+
+static void LoadMoveBg(u16 bgId)
+{
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(BG_SCREEN_ADDR(26)));
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(BG_CHAR_ADDR(2)));
+ LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, 32, 32);
+}
+
+static void LoadDefaultBg(void)
+{
+ DrawMainBattleBackground();
+}
+
+static void ScriptCmd_restorebg(void)
+{
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ taskId = CreateTask(Task_FadeToBg, 5);
+ gTasks[taskId].tBackgroundId = -1;
+ sAnimBackgroundFadeState = 1;
+}
+
+#undef tBackgroundId
+#undef tState
+
+static void ScriptCmd_waitbgfadeout(void)
+{
+ if (sAnimBackgroundFadeState == 2)
+ {
+ sBattleAnimScriptPtr++;
+ sAnimFramesToWait = 0;
+ }
+ else
+ {
+ sAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_waitbgfadein(void)
+{
+ if (sAnimBackgroundFadeState == 0)
+ {
+ sBattleAnimScriptPtr++;
+ sAnimFramesToWait = 0;
+ }
+ else
+ {
+ sAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_changebg(void)
+{
+ sBattleAnimScriptPtr++;
+ LoadMoveBg(sBattleAnimScriptPtr[0]);
+ sBattleAnimScriptPtr++;
+}
+
+s8 BattleAnimAdjustPanning(s8 pan)
+{
+ if (gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ pan = SOUND_PAN_TARGET;
+ else
+ pan = SOUND_PAN_ATTACKER;
+ }
+ else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ if (pan == SOUND_PAN_TARGET)
+ pan = SOUND_PAN_ATTACKER;
+ else if (pan != SOUND_PAN_ATTACKER)
+ pan *= -1;
+ }
+ }
+ else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
+ {
+ if (pan == SOUND_PAN_ATTACKER)
+ pan = SOUND_PAN_TARGET;
+ }
+ else
+ {
+ pan *= -1;
+ }
+
+ if (pan > SOUND_PAN_TARGET)
+ pan = SOUND_PAN_TARGET;
+ else if (pan < SOUND_PAN_ATTACKER)
+ pan = SOUND_PAN_ATTACKER;
+
+ return pan;
+}
+
+s8 BattleAnimAdjustPanning2(s8 pan)
+{
+ if (gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ pan = SOUND_PAN_TARGET;
+ else
+ pan = SOUND_PAN_ATTACKER;
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ pan = -pan;
+ }
+ return pan;
+}
+
+s16 KeepPanInRange(s16 panArg, int oldPan)
+{
+ s16 pan = panArg;
+
+ if (pan > SOUND_PAN_TARGET)
+ pan = SOUND_PAN_TARGET;
+ else if (pan < SOUND_PAN_ATTACKER)
+ pan = SOUND_PAN_ATTACKER;
+
+ return pan;
+}
+
+s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan)
+{
+ s16 ret;
+
+ if (sourcePan < targetPan)
+ ret = ((incrementPan < 0) ? -incrementPan : incrementPan);
+ else if (sourcePan > targetPan)
+ ret = -((incrementPan < 0) ? -incrementPan : incrementPan);
+ else
+ ret = 0;
+
+ return ret;
+}
+
+static void ScriptCmd_playsewithpan(void)
+{
+ u16 songId;
+ s8 pan;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ pan = sBattleAnimScriptPtr[2];
+ PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan));
+ sBattleAnimScriptPtr += 3;
+}
+
+static void ScriptCmd_setpan(void)
+{
+ s8 pan;
+
+ sBattleAnimScriptPtr++;
+ pan = sBattleAnimScriptPtr[0];
+ SE12PanpotControl(BattleAnimAdjustPanning(pan));
+ sBattleAnimScriptPtr++;
+}
+
+#define tInitialPan data[0]
+#define tTargetPan data[1]
+#define tIncrementPan data[2]
+#define tFramesToWait data[3]
+#define tCurrentPan data[4]
+#define tFrameCounter data[8]
+
+static void ScriptCmd_panse_1B(void)
+{
+ u16 songNum;
+ s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan;
+ u8 framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songNum = T1_READ_16(sBattleAnimScriptPtr);
+ currentPanArg = sBattleAnimScriptPtr[2];
+ incrementPan = sBattleAnimScriptPtr[3];
+ incrementPanArg = sBattleAnimScriptPtr[4];
+ framesToWait = sBattleAnimScriptPtr[5];
+
+ currentPan = BattleAnimAdjustPanning(currentPanArg);
+ targetPan = BattleAnimAdjustPanning(incrementPan);
+ incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg);
+ taskId = CreateTask(Task_PanFromInitialToTarget, 1);
+ gTasks[taskId].tInitialPan = currentPan;
+ gTasks[taskId].tTargetPan = targetPan;
+ gTasks[taskId].tIncrementPan = incrementPan;
+ gTasks[taskId].tFramesToWait = framesToWait;
+ gTasks[taskId].tCurrentPan = currentPan;
+
+ PlaySE12WithPanning(songNum, currentPan);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 6;
+}
+
+static void Task_PanFromInitialToTarget(u8 taskId)
+{
+ bool32 destroyTask = FALSE;
+ if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait)
+ {
+ s16 pan;
+ s16 initialPanning, targetPanning, currentPan, incrementPan;
+
+ gTasks[taskId].tFrameCounter = 0;
+ initialPanning = gTasks[taskId].tInitialPan;
+ targetPanning = gTasks[taskId].tTargetPan;
+ currentPan = gTasks[taskId].tCurrentPan;
+ incrementPan = gTasks[taskId].tIncrementPan;
+ pan = currentPan + incrementPan;
+ gTasks[taskId].tCurrentPan = pan;
+
+ if (incrementPan == 0)
+ {
+ destroyTask = TRUE;
+ }
+ else if (initialPanning < targetPanning)
+ {
+ if (pan >= targetPanning)
+ destroyTask = TRUE;
+ }
+ else // Panning decreasing.
+ {
+ if (pan <= targetPanning)
+ destroyTask = TRUE;
+ }
+
+ if (destroyTask)
+ {
+ pan = targetPanning;
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+
+ SE12PanpotControl(pan);
+ }
+}
+
+static void ScriptCmd_panse_26(void)
+{
+ u16 songId;
+ s8 currentPan, targetPan, incrementPan;
+ u8 framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ currentPan = sBattleAnimScriptPtr[2];
+ targetPan = sBattleAnimScriptPtr[3];
+ incrementPan = sBattleAnimScriptPtr[4];
+ framesToWait = sBattleAnimScriptPtr[5];
+
+ taskId = CreateTask(Task_PanFromInitialToTarget, 1);
+ gTasks[taskId].tInitialPan = currentPan;
+ gTasks[taskId].tTargetPan = targetPan;
+ gTasks[taskId].tIncrementPan = incrementPan;
+ gTasks[taskId].tFramesToWait = framesToWait;
+ gTasks[taskId].tCurrentPan = currentPan;
+
+ PlaySE12WithPanning(songId, currentPan);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 6;
+}
+
+static void ScriptCmd_panse_27(void)
+{
+ u16 songId;
+ s8 targetPanArg, incrementPanArg, currentPanArg, currentPan, targetPan, incrementPan;
+ u8 framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ currentPanArg = sBattleAnimScriptPtr[2];
+ targetPanArg = sBattleAnimScriptPtr[3];
+ incrementPanArg = sBattleAnimScriptPtr[4];
+ framesToWait = sBattleAnimScriptPtr[5];
+
+ currentPan = BattleAnimAdjustPanning2(currentPanArg);
+ targetPan = BattleAnimAdjustPanning2(targetPanArg);
+ incrementPan = BattleAnimAdjustPanning2(incrementPanArg);
+
+ taskId = CreateTask(Task_PanFromInitialToTarget, 1);
+ gTasks[taskId].tInitialPan = currentPan;
+ gTasks[taskId].tTargetPan = targetPan;
+ gTasks[taskId].tIncrementPan = incrementPan;
+ gTasks[taskId].tFramesToWait = framesToWait;
+ gTasks[taskId].tCurrentPan = currentPan;
+
+ PlaySE12WithPanning(songId, currentPan);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 6;
+}
+
+#undef tInitialPan
+#undef tTargetPan
+#undef tIncrementPan
+#undef tFramesToWait
+#undef tCurrentPan
+#undef tFrameCounter
+
+#define tSongId data[0]
+#define tPanning data[1]
+#define tFramesToWait data[2]
+#define tNumberOfPlays data[3]
+#define tFrameCounter data[8]
+
+static void ScriptCmd_loopsewithpan(void)
+{
+ u16 songId;
+ s8 panningArg, panning;
+ u8 framesToWait, numberOfPlays;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ panningArg = sBattleAnimScriptPtr[2];
+ framesToWait = sBattleAnimScriptPtr[3];
+ numberOfPlays = sBattleAnimScriptPtr[4];
+ panning = BattleAnimAdjustPanning(panningArg);
+
+ taskId = CreateTask(Task_LoopAndPlaySE, 1);
+ gTasks[taskId].tSongId = songId;
+ gTasks[taskId].tPanning = panning;
+ gTasks[taskId].tFramesToWait = framesToWait;
+ gTasks[taskId].tNumberOfPlays = numberOfPlays;
+ gTasks[taskId].tFrameCounter = framesToWait;
+ gTasks[taskId].func(taskId);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 5;
+}
+
+static void Task_LoopAndPlaySE(u8 taskId)
+{
+ if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait)
+ {
+ u16 songId;
+ s8 panning;
+ u8 numberOfPlays;
+
+ gTasks[taskId].tFrameCounter = 0;
+ songId = gTasks[taskId].tSongId;
+ panning = gTasks[taskId].tPanning;
+ numberOfPlays = --gTasks[taskId].tNumberOfPlays;
+ PlaySE12WithPanning(songId, panning);
+ if (numberOfPlays == 0)
+ {
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+ }
+}
+
+#undef tSongId
+#undef tPanning
+#undef tFramesToWait
+#undef tNumberOfPlays
+#undef tFrameCounter
+
+#define tSongId data[0]
+#define tPanning data[1]
+#define tFramesToWait data[2]
+
+static void ScriptCmd_waitplaysewithpan(void)
+{
+ u16 songId;
+ s8 panningArg, panning;
+ u8 framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ panningArg = sBattleAnimScriptPtr[2];
+ framesToWait = sBattleAnimScriptPtr[3];
+ panning = BattleAnimAdjustPanning(panningArg);
+
+ taskId = CreateTask(Task_WaitAndPlaySE, 1);
+ gTasks[taskId].tSongId = songId;
+ gTasks[taskId].tPanning = panning;
+ gTasks[taskId].tFramesToWait = framesToWait;
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 4;
+}
+
+static void Task_WaitAndPlaySE(u8 taskId)
+{
+ if (gTasks[taskId].tFramesToWait-- <= 0)
+ {
+ PlaySE12WithPanning(gTasks[taskId].tSongId, gTasks[taskId].tPanning);
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+}
+
+#undef tSongId
+#undef tPanning
+#undef tFramesToWait
+
+static void ScriptCmd_createsoundtask(void)
+{
+ TaskFunc func;
+ u8 numArgs, taskId;
+ s32 i;
+
+ sBattleAnimScriptPtr++;
+ func = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 4;
+ numArgs = sBattleAnimScriptPtr[0];
+ sBattleAnimScriptPtr++;
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 2;
+ }
+ taskId = CreateTask(func, 1);
+ func(taskId);
+ gAnimSoundTaskCount++;
+}
+
+static void ScriptCmd_waitsound(void)
+{
+ if (gAnimSoundTaskCount != 0)
+ {
+ sSoundAnimFramesToWait = 0;
+ sAnimFramesToWait = 1;
+ }
+ else if (IsSEPlaying())
+ {
+ if (++sSoundAnimFramesToWait > 90)
+ {
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ sSoundAnimFramesToWait = 0;
+ }
+ else
+ {
+ sAnimFramesToWait = 1;
+ }
+ }
+ else
+ {
+ sSoundAnimFramesToWait = 0;
+ sBattleAnimScriptPtr++;
+ sAnimFramesToWait = 0;
+ }
+}
+
+static void ScriptCmd_jumpargeq(void)
+{
+ u8 argId;
+ s16 valueToCheck;
+
+ sBattleAnimScriptPtr++;
+ argId = sBattleAnimScriptPtr[0];
+ valueToCheck = T1_READ_16(sBattleAnimScriptPtr + 1);
+
+ if (valueToCheck == gBattleAnimArgs[argId])
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr + 3);
+ else
+ sBattleAnimScriptPtr += 7;
+}
+
+static void ScriptCmd_jumpifcontest(void)
+{
+ sBattleAnimScriptPtr += 5;
+}
+
+static void ScriptCmd_monbgprio_28(void)
+{
+ u8 wantedBattler;
+ u8 battlerId;
+ u8 battlerPosition;
+
+ wantedBattler = sBattleAnimScriptPtr[1];
+ sBattleAnimScriptPtr += 2;
+
+ if (wantedBattler != ANIM_ATTACKER)
+ battlerId = gBattleAnimTarget;
+ else
+ battlerId = gBattleAnimAttacker;
+
+ battlerPosition = GetBattlerPosition(battlerId);
+ if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT)
+ {
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
+ }
+}
+
+static void ScriptCmd_monbgprio_29(void)
+{
+ sBattleAnimScriptPtr++;
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
+}
+
+static void ScriptCmd_monbgprio_2A(void)
+{
+ u8 wantedBattler;
+ u8 battlerPosition;
+ u8 battlerId;
+
+ wantedBattler = sBattleAnimScriptPtr[1];
+ sBattleAnimScriptPtr += 2;
+ if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget))
+ {
+ if (wantedBattler != ANIM_ATTACKER)
+ battlerId = gBattleAnimTarget;
+ else
+ battlerId = gBattleAnimAttacker;
+
+ battlerPosition = GetBattlerPosition(battlerId);
+ if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT)
+ {
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
+ }
+ }
+}
+
+static void ScriptCmd_invisible(void)
+{
+ u8 spriteId;
+
+ spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
+ if (spriteId != 0xFF)
+ gSprites[spriteId].invisible = TRUE;
+
+ sBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_visible(void)
+{
+ u8 spriteId;
+
+ spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
+ if (spriteId != 0xFF)
+ gSprites[spriteId].invisible = FALSE;
+
+ sBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_doublebattle_2D(void)
+{
+ u8 wantedBattler;
+ u8 priority;
+ u8 spriteId;
+
+ wantedBattler = sBattleAnimScriptPtr[1];
+ sBattleAnimScriptPtr += 2;
+ if (IsDoubleBattle()
+ && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
+ {
+ if (wantedBattler == ANIM_ATTACKER)
+ {
+ priority = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ }
+ else
+ {
+ priority = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
+ spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+ }
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = FALSE;
+ if (priority == 2)
+ gSprites[spriteId].oam.priority = 3;
+
+ if (priority == 1)
+ sub_8073128(FALSE);
+ else
+ sub_8073128(TRUE);
+ }
+ }
+}
+
+static void ScriptCmd_doublebattle_2E(void)
+{
+ u8 wantedBattler;
+ u8 priority;
+ u8 spriteId;
+
+ wantedBattler = sBattleAnimScriptPtr[1];
+ sBattleAnimScriptPtr += 2;
+ if (IsDoubleBattle()
+ && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
+ {
+ if (wantedBattler == ANIM_ATTACKER)
+ {
+ priority = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ }
+ else
+ {
+ priority = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
+ spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+ }
+
+ if (spriteId != 0xFF && priority == 2)
+ gSprites[spriteId].oam.priority = 2;
+ }
+}
+
+static void ScriptCmd_stopsound(void)
+{
+ m4aMPlayStop(&gMPlayInfo_SE1);
+ m4aMPlayStop(&gMPlayInfo_SE2);
+ sBattleAnimScriptPtr++;
+}
diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c
new file mode 100644
index 000000000..647d2f367
--- /dev/null
+++ b/src/battle_anim_effects_1.c
@@ -0,0 +1,5619 @@
+#include "global.h"
+#include "malloc.h"
+#include "battle_anim.h"
+#include "battle_interface.h"
+#include "decompress.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "main.h"
+#include "math_util.h"
+#include "palette.h"
+#include "random.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "trig.h"
+#include "util.h"
+#include "constants/songs.h"
+
+// RAM
+EWRAM_DATA static s16 gUnknown_203999C[4] = {0};
+
+// Function Declarations
+static void AnimMovePowderParticleStep(struct Sprite *);
+static void AnimSolarbeamSmallOrbStep(struct Sprite *);
+static void AnimAbsorptionOrbStep(struct Sprite *);
+static void AnimHyperBeamOrbStep(struct Sprite *);
+static void AnimLeechSeedStep(struct Sprite *);
+static void AnimLeechSeedSprouts(struct Sprite *);
+static void AnimSporeParticleStep(struct Sprite *);
+static void AnimPetalDanceBigFlowerStep(struct Sprite *);
+static void AnimPetalDanceSmallFlowerStep(struct Sprite *);
+static void AnimRazorLeafParticleStep1(struct Sprite *);
+static void AnimRazorLeafParticleStep2(struct Sprite *);
+static void AnimTranslateLinearSingleSineWaveStep(struct Sprite *);
+static void AnimMoveTwisterParticleStep(struct Sprite *);
+static void AnimConstrictBindingStep1(struct Sprite *);
+static void AnimConstrictBindingStep2(struct Sprite *);
+static void AnimTask_DuplicateAndShrinkToPosStep1(u8);
+static void AnimTask_DuplicateAndShrinkToPosStep2(u8);
+static void AnimItemStealStep3(struct Sprite *);
+static void AnimRootFlickerOut(struct Sprite *);
+static void AnimTrickBagStep1(struct Sprite *);
+static void AnimTrickBagStep2(struct Sprite *);
+static void AnimTrickBagStep3(struct Sprite *);
+static void AnimTask_LeafBladeStep(u8);
+static s16 LeafBladeGetPosFactor(struct Sprite *);
+static void AnimTask_LeafBladeStep2(struct Task *, u8);
+static void AnimTask_LeafBladeStep2_Callback(struct Sprite *);
+static void AnimFlyingParticleStep(struct Sprite *);
+static void AnimNeedleArmSpikeStep(struct Sprite *);
+static void AnimSliceStep(struct Sprite *);
+static void sub_80A4880(struct Sprite *);
+static void AnimProtectStep(struct Sprite *);
+static void AnimMilkBottleStep1(struct Sprite *);
+static void AnimMilkBottleStep2(struct Sprite *, int, int);
+static void sub_80A4EA0(struct Sprite *);
+static void AnimSleepLetterZStep(struct Sprite *);
+static void AnimLockOnTargetStep1(struct Sprite *);
+static void AnimLockOnTargetStep2(struct Sprite *);
+static void AnimLockOnTargetStep3(struct Sprite *);
+static void AnimLockOnTargetStep4(struct Sprite *);
+static void AnimLockOnTargetStep5(struct Sprite *);
+static void AnimLockOnTargetStep6(struct Sprite *);
+static void AnimBowMonStep1(struct Sprite *);
+static void AnimBowMonStep1_Callback(struct Sprite *);
+static void AnimBowMonStep2(struct Sprite *);
+static void AnimBowMonStep3(struct Sprite *);
+static void AnimBowMonStep4(struct Sprite *);
+static void AnimBowMonStep3_Callback(struct Sprite *);
+static void sub_80A55A0(struct Sprite *);
+static void AnimTask_SkullBashPositionSet(u8);
+static void AnimTask_SkullBashPositionReset(u8);
+static void AnimFalseSwipeSliceStep1(struct Sprite *);
+static void AnimFalseSwipeSliceStep2(struct Sprite *);
+static void AnimFalseSwipeSliceStep3(struct Sprite *);
+static void AnimEndureEnergyStep(struct Sprite *);
+static void AnimSharpenSphereStep(struct Sprite *);
+static void AnimConversion2Step(struct Sprite *);
+static void AnimMoonStep(struct Sprite *);
+static void AnimMoonlightSparkleStep(struct Sprite *);
+static void AnimHornHitStep(struct Sprite *);
+static void AnimTask_DoubleTeamStep(u8);
+static void AnimTask_DoubleTeamCallback(struct Sprite *);
+static void AnimWavyMusicNotesGetNextPos(s16, s16, s16 *, s16 *, s8);
+static void AnimWavyMusicNotesStep(struct Sprite *);
+static void AnimFlyingMusicNotesStep(struct Sprite *);
+static void AnimSlowFlyingMusicNotesStep(struct Sprite *);
+static void AnimThoughtBubbleStep(struct Sprite *);
+static void AnimMetronomeFingerStep(struct Sprite *);
+static void AnimFollowMeFingerStep1(struct Sprite *);
+static void AnimFollowMeFingerStep2(struct Sprite *);
+static void AnimTauntFingerStep1(struct Sprite *);
+static void AnimTauntFingerStep2(struct Sprite *);
+
+// Unused
+static const u8 sUnknown_83E2964[] = {0x02, 0x04, 0x01, 0x03};
+
+static const union AnimCmd sPowderParticlesAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_FRAME(6, 5),
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_FRAME(10, 5),
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_FRAME(14, 5),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sPowderParticlesAnimTable[] =
+{
+ sPowderParticlesAnimCmds,
+};
+
+const struct SpriteTemplate gSleepPowderParticleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SLEEP_POWDER,
+ .paletteTag = ANIM_TAG_SLEEP_POWDER,
+ .oam = &gOamData_AffineOff_ObjNormal_8x16,
+ .anims = sPowderParticlesAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMovePowderParticle,
+};
+
+const struct SpriteTemplate gStunSporeParticleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_STUN_SPORE,
+ .paletteTag = ANIM_TAG_STUN_SPORE,
+ .oam = &gOamData_AffineOff_ObjNormal_8x16,
+ .anims = sPowderParticlesAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMovePowderParticle,
+};
+
+const struct SpriteTemplate gPoisonPowderParticleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_POISON_POWDER,
+ .paletteTag = ANIM_TAG_POISON_POWDER,
+ .oam = &gOamData_AffineOff_ObjNormal_8x16,
+ .anims = sPowderParticlesAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMovePowderParticle,
+};
+
+static const union AnimCmd sSolarbeamBigOrbAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSolarbeamBigOrbAnimCmds2[] =
+{
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSolarbeamBigOrbAnimCmds3[] =
+{
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSolarbeamBigOrbAnimCmds4[] =
+{
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSolarbeamBigOrbAnimCmds5[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSolarbeamBigOrbAnimCmds6[] =
+{
+ ANIMCMD_FRAME(5, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSolarbeamBigOrbAnimCmds7[] =
+{
+ ANIMCMD_FRAME(6, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSolarbeamSmallOrbAnimCms[] =
+{
+ ANIMCMD_FRAME(7, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sPowerAbsorptionOrbAnimCmds[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSolarbeamBigOrbAnimTable[] =
+{
+ sSolarbeamBigOrbAnimCmds1,
+ sSolarbeamBigOrbAnimCmds2,
+ sSolarbeamBigOrbAnimCmds3,
+ sSolarbeamBigOrbAnimCmds4,
+ sSolarbeamBigOrbAnimCmds5,
+ sSolarbeamBigOrbAnimCmds6,
+ sSolarbeamBigOrbAnimCmds7,
+};
+
+static const union AnimCmd *const sSolarbeamSmallOrbAnimTable[] =
+{
+ sSolarbeamSmallOrbAnimCms,
+};
+
+static const union AnimCmd *const sPowerAbsorptionOrbAnimTable[] =
+{
+ sPowerAbsorptionOrbAnimCmds,
+};
+
+static const union AffineAnimCmd sPowerAbsorptionOrbAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-5, -5, 0, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sPowerAbsorptionOrbAffineAnimTable[] =
+{
+ sPowerAbsorptionOrbAffineAnimCmds,
+};
+
+const struct SpriteTemplate gPowerAbsorptionOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ORBS,
+ .paletteTag = ANIM_TAG_ORBS,
+ .oam = &gOamData_AffineNormal_ObjBlend_16x16,
+ .anims = sPowerAbsorptionOrbAnimTable,
+ .images = NULL,
+ .affineAnims = sPowerAbsorptionOrbAffineAnimTable,
+ .callback = AnimPowerAbsorptionOrb,
+};
+
+const struct SpriteTemplate gSolarbeamBigOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ORBS,
+ .paletteTag = ANIM_TAG_ORBS,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sSolarbeamBigOrbAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSolarbeamBigOrb,
+};
+
+const struct SpriteTemplate gSolarbeamSmallOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ORBS,
+ .paletteTag = ANIM_TAG_ORBS,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sSolarbeamSmallOrbAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSolarbeamSmallOrb,
+};
+
+static const union AffineAnimCmd sStockpileAbsorptionOrbAffineCmds[] =
+{
+ AFFINEANIMCMD_FRAME(320, 320, 0, 0),
+ AFFINEANIMCMD_FRAME(-14, -14, 0, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd *const sStockpileAbsorptionOrbAffineAnimTable[] =
+{
+ sStockpileAbsorptionOrbAffineCmds,
+};
+
+const struct SpriteTemplate gStockpileAbsorptionOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GRAY_ORB,
+ .paletteTag = ANIM_TAG_GRAY_ORB,
+ .oam = &gOamData_AffineDouble_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sStockpileAbsorptionOrbAffineAnimTable,
+ .callback = AnimPowerAbsorptionOrb,
+};
+
+static const union AffineAnimCmd sAbsorptionOrbAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-5, -5, 0, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sAbsorptionOrbAffineAnimTable[] =
+{
+ sAbsorptionOrbAffineAnimCmds,
+};
+
+const struct SpriteTemplate gAbsorptionOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ORBS,
+ .paletteTag = ANIM_TAG_ORBS,
+ .oam = &gOamData_AffineNormal_ObjBlend_16x16,
+ .anims = sPowerAbsorptionOrbAnimTable,
+ .images = NULL,
+ .affineAnims = sAbsorptionOrbAffineAnimTable,
+ .callback = AnimAbsorptionOrb,
+};
+
+const struct SpriteTemplate gHyperBeamOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ORBS,
+ .paletteTag = ANIM_TAG_ORBS,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sSolarbeamBigOrbAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimHyperBeamOrb,
+};
+
+static const union AnimCmd sLeechSeedAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sLeechSeedAnimCmds2[] =
+{
+ ANIMCMD_FRAME(4, 7),
+ ANIMCMD_FRAME(8, 7),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sLeechSeedAnimTable[] =
+{
+ sLeechSeedAnimCmds1,
+ sLeechSeedAnimCmds2,
+};
+
+const struct SpriteTemplate gLeechSeedSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SEED,
+ .paletteTag = ANIM_TAG_SEED,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sLeechSeedAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimLeechSeed,
+};
+
+static const union AnimCmd sSporeParticleAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSporeParticleAnimCmds2[] =
+{
+ ANIMCMD_FRAME(4, 7),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSporeParticleAnimTable[] =
+{
+ sSporeParticleAnimCmds1,
+ sSporeParticleAnimCmds2,
+};
+
+const struct SpriteTemplate gSporeParticleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPORE,
+ .paletteTag = ANIM_TAG_SPORE,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sSporeParticleAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSporeParticle,
+};
+
+static const union AnimCmd sPetalDanceBigFlowerAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sPetalDanceSmallFlowerAnimCmds[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sPetalDanceBigFlowerAnimTable[] =
+{
+ sPetalDanceBigFlowerAnimCmds,
+};
+
+static const union AnimCmd *const sPetalDanceSmallFlowerAnimTable[] =
+{
+ sPetalDanceSmallFlowerAnimCmds,
+};
+
+const struct SpriteTemplate gPetalDanceBigFlowerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FLOWER,
+ .paletteTag = ANIM_TAG_FLOWER,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sPetalDanceBigFlowerAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimPetalDanceBigFlower,
+};
+
+const struct SpriteTemplate gPetalDanceSmallFlowerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FLOWER,
+ .paletteTag = ANIM_TAG_FLOWER,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sPetalDanceSmallFlowerAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimPetalDanceSmallFlower,
+};
+
+static const union AnimCmd sRazorLeafParticleAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_FRAME(20, 5),
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sRazorLeafParticleAnimCmds2[] =
+{
+ ANIMCMD_FRAME(24, 5),
+ ANIMCMD_FRAME(28, 5),
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sRazorLeafParticleAnimTable[] =
+{
+ sRazorLeafParticleAnimCmds1,
+ sRazorLeafParticleAnimCmds2,
+};
+
+const struct SpriteTemplate gRazorLeafParticleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LEAF,
+ .paletteTag = ANIM_TAG_LEAF,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sRazorLeafParticleAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimRazorLeafParticle,
+};
+
+const struct SpriteTemplate gTwisterLeafParticleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LEAF,
+ .paletteTag = ANIM_TAG_LEAF,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sRazorLeafParticleAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMoveTwisterParticle,
+};
+
+static const union AnimCmd sRazorLeafCutterAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(0, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 3, .vFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sRazorLeafCutterAnimTable[] =
+{
+ sRazorLeafCutterAnimCmds,
+};
+
+const struct SpriteTemplate gRazorLeafCutterSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RAZOR_LEAF,
+ .paletteTag = ANIM_TAG_RAZOR_LEAF,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
+ .anims = sRazorLeafCutterAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimTranslateLinearSingleSineWave,
+};
+
+static const union AffineAnimCmd sSwiftStarAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 0, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sSwiftStarAffineAnimTable[] =
+{
+ sSwiftStarAffineAnimCmds,
+};
+
+const struct SpriteTemplate gSwiftStarSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_YELLOW_STAR,
+ .paletteTag = ANIM_TAG_YELLOW_STAR,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSwiftStarAffineAnimTable,
+ .callback = AnimTranslateLinearSingleSineWave,
+};
+
+static const union AnimCmd sConstrictBindingAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(96, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sConstrictBindingAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(64, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(96, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sConstrictBindingAnimTable[] =
+{
+ sConstrictBindingAnimCmds1,
+ sConstrictBindingAnimCmds2,
+};
+
+static const union AffineAnimCmd sConstrictBindingAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(-11, 0, 0, 6),
+ AFFINEANIMCMD_FRAME(11, 0, 0, 6),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sConstrictBindingAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(11, 0, 0, 6),
+ AFFINEANIMCMD_FRAME(-11, 0, 0, 6),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sConstrictBindingAffineAnimTable[] =
+{
+ sConstrictBindingAffineAnimCmds1,
+ sConstrictBindingAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gConstrictBindingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_TENDRILS,
+ .paletteTag = ANIM_TAG_TENDRILS,
+ .oam = &gOamData_AffineNormal_ObjNormal_64x32,
+ .anims = sConstrictBindingAnimTable,
+ .images = NULL,
+ .affineAnims = sConstrictBindingAffineAnimTable,
+ .callback = AnimConstrictBinding,
+};
+
+static const union AffineAnimCmd sMimicOrbAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 0, 0),
+ AFFINEANIMCMD_FRAME(48, 48, 0, 14),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sMimicOrbAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(-16, -16, 0, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sMimicOrbAffineAnimTable[] =
+{
+ sMimicOrbAffineAnimCmds1,
+ sMimicOrbAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gMimicOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ORBS,
+ .paletteTag = ANIM_TAG_ORBS,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
+ .anims = sPowerAbsorptionOrbAnimTable,
+ .images = NULL,
+ .affineAnims = sMimicOrbAffineAnimTable,
+ .callback = AnimMimicOrb,
+};
+
+static const union AnimCmd sIngrainRootAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 7),
+ ANIMCMD_FRAME(16, 7),
+ ANIMCMD_FRAME(32, 7),
+ ANIMCMD_FRAME(48, 7),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sIngrainRootAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 7, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 7, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 7, .hFlip = TRUE),
+ ANIMCMD_FRAME(48, 7, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sIngrainRootAnimCmds3[] =
+{
+ ANIMCMD_FRAME(0, 7),
+ ANIMCMD_FRAME(16, 7),
+ ANIMCMD_FRAME(32, 7),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sIngrainRootAnimCmds4[] =
+{
+ ANIMCMD_FRAME(0, 7, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 7, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 7, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sIngrainRootAnimTable[] =
+{
+ sIngrainRootAnimCmds1,
+ sIngrainRootAnimCmds2,
+ sIngrainRootAnimCmds3,
+ sIngrainRootAnimCmds4,
+};
+
+const struct SpriteTemplate gIngrainRootSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ROOTS,
+ .paletteTag = ANIM_TAG_ROOTS,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sIngrainRootAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimIngrainRoot,
+};
+
+const struct SpriteTemplate gFrenzyPlantRootSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ROOTS,
+ .paletteTag = ANIM_TAG_ROOTS,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sIngrainRootAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimFrenzyPlantRoot,
+};
+
+static const union AnimCmd sIngrainOrbAnimCmds[] =
+{
+ ANIMCMD_FRAME(3, 3),
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sIngrainOrbAnimTable[] =
+{
+ sIngrainOrbAnimCmds,
+};
+
+const struct SpriteTemplate gIngrainOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ORBS,
+ .paletteTag = ANIM_TAG_ORBS,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sIngrainOrbAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimIngrainOrb,
+};
+
+static const union AnimCmd sFallingBagAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sFallingBagAnimTable[] =
+{
+ sFallingBagAnimCmds,
+};
+
+static const union AffineAnimCmd sFallingBagAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -4, 10),
+ AFFINEANIMCMD_FRAME(0, 0, 4, 20),
+ AFFINEANIMCMD_FRAME(0, 0, -4, 10),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sFallingBagAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -1, 2),
+ AFFINEANIMCMD_FRAME(0, 0, 1, 4),
+ AFFINEANIMCMD_FRAME(0, 0, -1, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 1, 4),
+ AFFINEANIMCMD_FRAME(0, 0, -1, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 1, 2),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sFallingBagAffineAnimTable[] =
+{
+ sFallingBagAffineAnimCmds1,
+ sFallingBagAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gPresentSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ITEM_BAG,
+ .paletteTag = ANIM_TAG_ITEM_BAG,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = sFallingBagAnimTable,
+ .images = NULL,
+ .affineAnims = sFallingBagAffineAnimTable,
+ .callback = AnimPresent,
+};
+
+const struct SpriteTemplate gKnockOffItemSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ITEM_BAG,
+ .paletteTag = ANIM_TAG_ITEM_BAG,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = sFallingBagAnimTable,
+ .images = NULL,
+ .affineAnims = sFallingBagAffineAnimTable,
+ .callback = AnimKnockOffItem,
+};
+
+static const union AnimCmd sPresentHealParticleAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(12, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sPresentHealParticleAnimTable[] =
+{
+ sPresentHealParticleAnimCmds,
+};
+
+const struct SpriteTemplate gPresentHealParticleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GREEN_SPARKLE,
+ .paletteTag = ANIM_TAG_GREEN_SPARKLE,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sPresentHealParticleAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimPresentHealParticle,
+};
+
+const struct SpriteTemplate gItemStealSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ITEM_BAG,
+ .paletteTag = ANIM_TAG_ITEM_BAG,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = sFallingBagAnimTable,
+ .images = NULL,
+ .affineAnims = sFallingBagAffineAnimTable,
+ .callback = AnimItemSteal,
+};
+
+static const union AffineAnimCmd sTrickBagAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 0, 3),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sTrickBagAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0, -10, 0, 3),
+ AFFINEANIMCMD_FRAME(0, -6, 0, 3),
+ AFFINEANIMCMD_FRAME(0, -2, 0, 3),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 3),
+ AFFINEANIMCMD_FRAME(0, 2, 0, 3),
+ AFFINEANIMCMD_FRAME(0, 6, 0, 3),
+ AFFINEANIMCMD_FRAME(0, 10, 0, 3),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sTrickBagAffineAnimTable[] =
+{
+ sTrickBagAffineAnimCmds1,
+ sTrickBagAffineAnimCmds2,
+ sFallingBagAffineAnimCmds1,
+ sFallingBagAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gTrickBagSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ITEM_BAG,
+ .paletteTag = ANIM_TAG_ITEM_BAG,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = sFallingBagAnimTable,
+ .images = NULL,
+ .affineAnims = sTrickBagAffineAnimTable,
+ .callback = AnimTrickBag,
+};
+
+static const s8 gTrickBagCoordinates[][3] =
+{
+ {5, 24, 1},
+ {0, 4, 0},
+ {8, 16, -1},
+ {0, 2, 0},
+ {8, 16, 1},
+ {0, 2, 0},
+ {8, 16, 1},
+ {0, 2, 0},
+ {8, 16, 1},
+ {0, 16, 0},
+ {0, 0, 127},
+};
+
+static const union AnimCmd sLeafBladeAnimCmds1[] =
+{
+ ANIMCMD_FRAME(28, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sLeafBladeAnimCmds2[] =
+{
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sLeafBladeAnimCmds3[] =
+{
+ ANIMCMD_FRAME(20, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sLeafBladeAnimCmds4[] =
+{
+ ANIMCMD_FRAME(28, 1, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sLeafBladeAnimCmds5[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sLeafBladeAnimCmds6[] =
+{
+ ANIMCMD_FRAME(16, 1, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sLeafBladeAnimCmds7[] =
+{
+ ANIMCMD_FRAME(28, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sLeafBladeAnimTable[] =
+{
+ sLeafBladeAnimCmds1,
+ sLeafBladeAnimCmds2,
+ sLeafBladeAnimCmds3,
+ sLeafBladeAnimCmds4,
+ sLeafBladeAnimCmds5,
+ sLeafBladeAnimCmds6,
+ sLeafBladeAnimCmds7,
+};
+
+const struct SpriteTemplate gLeafBladeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LEAF,
+ .paletteTag = ANIM_TAG_LEAF,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sLeafBladeAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const union AffineAnimCmd sAromatherapyBigFlowerAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 4, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd *const sAromatherapyBigFlowerAffineAnimTable[] =
+{
+ sAromatherapyBigFlowerAffineAnimCmds,
+};
+
+const struct SpriteTemplate gAromatherapySmallFlowerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FLOWER,
+ .paletteTag = ANIM_TAG_FLOWER,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sPetalDanceSmallFlowerAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimFlyingParticle,
+};
+
+const struct SpriteTemplate gAromatherapyBigFlowerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FLOWER,
+ .paletteTag = ANIM_TAG_FLOWER,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = sPetalDanceBigFlowerAnimTable,
+ .images = NULL,
+ .affineAnims = sAromatherapyBigFlowerAffineAnimTable,
+ .callback = AnimFlyingParticle,
+};
+
+static const union AffineAnimCmd sSilverWindBigSparkAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, -10, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd sSilverWindMediumSparkAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(192, 192, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, -12, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd sSilverWindSmallSparkAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(143, 143, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, -15, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd *const sSilverWindBigSparkAffineAnimTable[] =
+{
+ sSilverWindBigSparkAffineAnimCmds,
+};
+
+static const union AffineAnimCmd *const sSilverWindMediumSparkAffineAnimTable[] =
+{
+ sSilverWindMediumSparkAffineAnimCmds,
+};
+
+static const union AffineAnimCmd *const sSilverWindSmallSparkAffineAnimTable[] =
+{
+ sSilverWindSmallSparkAffineAnimCmds,
+};
+
+const struct SpriteTemplate gSilverWindBigSparkSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPARKLE_6,
+ .paletteTag = ANIM_TAG_SPARKLE_6,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSilverWindBigSparkAffineAnimTable,
+ .callback = AnimFlyingParticle,
+};
+
+const struct SpriteTemplate gSilverWindMediumSparkSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPARKLE_6,
+ .paletteTag = ANIM_TAG_SPARKLE_6,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSilverWindMediumSparkAffineAnimTable,
+ .callback = AnimFlyingParticle,
+};
+
+const struct SpriteTemplate gSilverWindSmallSparkSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPARKLE_6,
+ .paletteTag = ANIM_TAG_SPARKLE_6,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSilverWindSmallSparkAffineAnimTable,
+ .callback = AnimFlyingParticle,
+};
+
+static const u16 sMagicalLeafBlendColors[] =
+{
+ RGB(31, 0, 0),
+ RGB(31, 19, 0),
+ RGB(31, 31, 0),
+ RGB(0, 31, 0),
+ RGB(5, 14, 31),
+ RGB(22, 10, 31),
+ RGB(22, 21, 31),
+};
+
+const struct SpriteTemplate gNeedleArmSpikeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GREEN_SPIKE,
+ .paletteTag = ANIM_TAG_GREEN_SPIKE,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimNeedleArmSpike,
+};
+
+static const union AnimCmd sWhipAnimCmds1[] =
+{
+ ANIMCMD_FRAME(64, 3),
+ ANIMCMD_FRAME(80, 3),
+ ANIMCMD_FRAME(96, 3),
+ ANIMCMD_FRAME(112, 6),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWhipAnimCmds2[] =
+{
+ ANIMCMD_FRAME(64, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(80, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(96, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(112, 6, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sWhipAnimTable[] =
+{
+ sWhipAnimCmds1,
+ sWhipAnimCmds2,
+};
+
+const struct SpriteTemplate gSlamHitSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SLAM_HIT,
+ .paletteTag = ANIM_TAG_SLAM_HIT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sWhipAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimWhipHit,
+};
+
+const struct SpriteTemplate gVineWhipSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_WHIP_HIT,
+ .paletteTag = ANIM_TAG_WHIP_HIT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sWhipAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimWhipHit,
+};
+
+static const union AnimCmd sUnknown_83E3178[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(48, 4),
+ ANIMCMD_FRAME(64, 5),
+ ANIMCMD_END,
+};
+
+// Unused
+static const union AnimCmd *const sUnknown_83E3190[] =
+{
+ sUnknown_83E3178,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3194 =
+{
+ .tileTag = ANIM_TAG_HIT,
+ .paletteTag = ANIM_TAG_HIT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sUnknown_83E3190,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A43F8,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E31AC =
+{
+ .tileTag = ANIM_TAG_HIT_2,
+ .paletteTag = ANIM_TAG_HIT_2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sUnknown_83E3190,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A43F8,
+};
+
+static const union AffineAnimCmd sUnknown_83E31C4[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sUnknown_83E31D4[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 32, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sUnknown_83E31E4[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 64, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sUnknown_83E31F4[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 96, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sUnknown_83E3204[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, -128, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sUnknown_83E3214[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, -96, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sUnknown_83E3224[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, -64, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sUnknown_83E3234[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, -32, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sUnknown_83E3244[] =
+{
+ sUnknown_83E31C4,
+ sUnknown_83E31D4,
+ sUnknown_83E31E4,
+ sUnknown_83E31F4,
+ sUnknown_83E3204,
+ sUnknown_83E3214,
+ sUnknown_83E3224,
+ sUnknown_83E3234,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3264 =
+{
+ .tileTag = ANIM_TAG_HANDS_AND_FEET,
+ .paletteTag = ANIM_TAG_HANDS_AND_FEET,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sUnknown_83E3244,
+ .callback = sub_80A4494,
+};
+
+static const union AnimCmd sCuttingSliceAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sCuttingSliceAnimTable[] =
+{
+ sCuttingSliceAnimCmds,
+};
+
+const struct SpriteTemplate gCuttingSliceSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_CUT,
+ .paletteTag = ANIM_TAG_CUT,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
+ .anims = sCuttingSliceAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimCuttingSlice,
+};
+
+const struct SpriteTemplate gAirCutterSliceSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_CUT,
+ .paletteTag = ANIM_TAG_CUT,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
+ .anims = sCuttingSliceAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimAirCutterSlice,
+};
+
+static const union AnimCmd sUnknown_83E32C4[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E32CC[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E32D4[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E32DC[] =
+{
+ ANIMCMD_FRAME(12, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E32E4[] =
+{
+ ANIMCMD_FRAME(16, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E32EC[] =
+{
+ ANIMCMD_FRAME(20, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E32F4[] =
+{
+ ANIMCMD_FRAME(0, 1, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E32FC[] =
+{
+ ANIMCMD_FRAME(4, 1, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E3304[] =
+{
+ ANIMCMD_FRAME(8, 1, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E330C[] =
+{
+ ANIMCMD_FRAME(12, 1, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sUnknown_83E3314[] =
+{
+ sUnknown_83E32C4,
+ sUnknown_83E32CC,
+ sUnknown_83E32D4,
+ sUnknown_83E32DC,
+ sUnknown_83E32E4,
+ sUnknown_83E32EC,
+ sUnknown_83E32F4,
+ sUnknown_83E32FC,
+ sUnknown_83E3304,
+ sUnknown_83E330C,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E333C =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sUnknown_83E3314,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A481C,
+};
+
+const struct SpriteTemplate gProtectWallSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PROTECT,
+ .paletteTag = ANIM_TAG_PROTECT,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimProtect,
+};
+
+static const union AffineAnimCmd sMilkBottleAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sMilkBottleAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 24),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sMilkBottleAffineAnimTable[] =
+{
+ sMilkBottleAffineAnimCmds1,
+ sMilkBottleAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gMilkBottleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MILK_BOTTLE,
+ .paletteTag = ANIM_TAG_MILK_BOTTLE,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sMilkBottleAffineAnimTable,
+ .callback = AnimMilkBottle,
+};
+
+static const union AnimCmd sGrantingStarsAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 7),
+ ANIMCMD_FRAME(16, 7),
+ ANIMCMD_FRAME(32, 7),
+ ANIMCMD_FRAME(48, 7),
+ ANIMCMD_FRAME(64, 7),
+ ANIMCMD_FRAME(80, 7),
+ ANIMCMD_FRAME(96, 7),
+ ANIMCMD_FRAME(112, 7),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sGrantingStarsAnimTable[] =
+{
+ sGrantingStarsAnimCmds,
+};
+
+const struct SpriteTemplate gGrantingStarsSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPARKLE_2,
+ .paletteTag = ANIM_TAG_SPARKLE_2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sGrantingStarsAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimGrantingStars,
+};
+
+const struct SpriteTemplate gSparklingStarsSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPARKLE_2,
+ .paletteTag = ANIM_TAG_SPARKLE_2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sGrantingStarsAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSparkingStars,
+};
+
+static const union AnimCmd sUnknown_83E3424[] =
+{
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_FRAME(4, 10),
+ ANIMCMD_FRAME(8, 10),
+ ANIMCMD_FRAME(12, 10),
+ ANIMCMD_FRAME(16, 26),
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_FRAME(20, 5),
+ ANIMCMD_FRAME(24, 15),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sUnknown_83E3448[] =
+{
+ ANIMCMD_FRAME(0, 10, .hFlip = TRUE),
+ ANIMCMD_FRAME(4, 10, .hFlip = TRUE),
+ ANIMCMD_FRAME(8, 10, .hFlip = TRUE),
+ ANIMCMD_FRAME(12, 10, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 26, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 5, .hFlip = TRUE),
+ ANIMCMD_FRAME(20, 5, .hFlip = TRUE),
+ ANIMCMD_FRAME(24, 15, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sUnknown_83E346C[] =
+{
+ sUnknown_83E3424,
+ sUnknown_83E3448,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3474 =
+{
+ .tileTag = ANIM_TAG_BUBBLE_BURST,
+ .paletteTag = ANIM_TAG_BUBBLE_BURST,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sUnknown_83E346C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A4E40,
+};
+
+static const union AnimCmd sSleepLetterZAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 40),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSleepLetterZAnimTable[] =
+{
+ sSleepLetterZAnimCmds,
+};
+
+static const union AffineAnimCmd sSleepLetterZAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x14, 0x14, -30, 0),
+ AFFINEANIMCMD_FRAME(0x8, 0x8, 1, 24),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSleepLetterZAffineAnimCmds1_2[] =
+{
+ AFFINEANIMCMD_LOOP(0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24),
+ AFFINEANIMCMD_LOOP(10),
+};
+
+static const union AffineAnimCmd sSleepLetterZAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0x14, 0x14, 30, 0),
+ AFFINEANIMCMD_FRAME(0x8, 0x8, -1, 24),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSleepLetterZAffineAnimCmds2_2[] =
+{
+ AFFINEANIMCMD_LOOP(0),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 24),
+ AFFINEANIMCMD_LOOP(10),
+};
+
+static const union AffineAnimCmd *const sSleepLetterZAffineAnimTable[] =
+{
+ sSleepLetterZAffineAnimCmds1,
+ sSleepLetterZAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gSleepLetterZSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LETTER_Z,
+ .paletteTag = ANIM_TAG_LETTER_Z,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = sSleepLetterZAnimTable,
+ .images = NULL,
+ .affineAnims = sSleepLetterZAffineAnimTable,
+ .callback = AnimSleepLetterZ,
+};
+
+const struct SpriteTemplate gLockOnTargetSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LOCK_ON,
+ .paletteTag = ANIM_TAG_LOCK_ON,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimLockOnTarget,
+};
+
+const struct SpriteTemplate gLockOnMoveTargetSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LOCK_ON,
+ .paletteTag = ANIM_TAG_LOCK_ON,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimLockOnMoveTarget,
+};
+
+static const s8 sInclineMonCoordTable[][2] =
+{
+ { 64, 64},
+ { 0, -64},
+ {-64, 64},
+ { 32, -32},
+};
+
+const struct SpriteTemplate gBowMonSpriteTemplate =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimBowMon,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3568 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A5590,
+};
+
+static const union AnimCmd sSlashSliceAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(48, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSlashSliceAnimCmds2[] =
+{
+ ANIMCMD_FRAME(48, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSlashSliceAnimTable[] =
+{
+ sSlashSliceAnimCmds1,
+ sSlashSliceAnimCmds2,
+};
+
+const struct SpriteTemplate gSlashSliceSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SLASH,
+ .paletteTag = ANIM_TAG_SLASH,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSlashSliceAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSlashSlice,
+};
+
+const struct SpriteTemplate gFalseSwipeSliceSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SLASH_2,
+ .paletteTag = ANIM_TAG_SLASH_2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSlashSliceAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimFalseSwipeSlice,
+};
+
+const struct SpriteTemplate gFalseSwipePositionedSliceSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SLASH_2,
+ .paletteTag = ANIM_TAG_SLASH_2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSlashSliceAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimFalseSwipePositionedSlice,
+};
+
+static const union AnimCmd sEndureEnergyAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(8, 12),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sEndureEnergyAnimTable[] =
+{
+ sEndureEnergyAnimCmds,
+};
+
+const struct SpriteTemplate gEndureEnergySpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FOCUS_ENERGY,
+ .paletteTag = ANIM_TAG_FOCUS_ENERGY,
+ .oam = &gOamData_AffineOff_ObjNormal_16x32,
+ .anims = sEndureEnergyAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimEndureEnergy,
+};
+
+static const union AnimCmd sSharpenSphereAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 18),
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(16, 18),
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(16, 6),
+ ANIMCMD_FRAME(32, 18),
+ ANIMCMD_FRAME(16, 6),
+ ANIMCMD_FRAME(32, 6),
+ ANIMCMD_FRAME(48, 18),
+ ANIMCMD_FRAME(32, 6),
+ ANIMCMD_FRAME(48, 6),
+ ANIMCMD_FRAME(64, 18),
+ ANIMCMD_FRAME(48, 6),
+ ANIMCMD_FRAME(64, 54),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSharpenSphereAnimTable[] =
+{
+ sSharpenSphereAnimCmds,
+};
+
+const struct SpriteTemplate gSharpenSphereSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPHERE_TO_CUBE,
+ .paletteTag = ANIM_TAG_SPHERE_TO_CUBE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSharpenSphereAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSharpenSphere,
+};
+
+const struct SpriteTemplate gOctazookaBallSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BLACK_BALL,
+ .paletteTag = ANIM_TAG_BLACK_BALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = TranslateAnimSpriteToTargetMonLocation,
+};
+
+static const union AnimCmd sOctazookaAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(48, 3),
+ ANIMCMD_FRAME(64, 3),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sOctazookaAnimTable[] =
+{
+ sOctazookaAnimCmds,
+};
+
+const struct SpriteTemplate gOctazookaSmokeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GRAY_SMOKE,
+ .paletteTag = ANIM_TAG_GRAY_SMOKE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sOctazookaAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+static const union AnimCmd sConversionAnimCmds[] =
+{
+ ANIMCMD_FRAME(3, 5),
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sConversionAnimTable[] =
+{
+ sConversionAnimCmds,
+};
+
+static const union AffineAnimCmd sConversionAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sConversionAffineAnimTable[] =
+{
+ sConversionAffineAnimCmds,
+};
+
+const struct SpriteTemplate gConversionSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_CONVERSION,
+ .paletteTag = ANIM_TAG_CONVERSION,
+ .oam = &gOamData_AffineDouble_ObjBlend_8x8,
+ .anims = sConversionAnimTable,
+ .images = NULL,
+ .affineAnims = sConversionAffineAnimTable,
+ .callback = AnimConversion,
+};
+
+static const union AnimCmd sConversion2AnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_FRAME(3, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sConversion2AnimTable[] =
+{
+ sConversion2AnimCmds,
+};
+
+const struct SpriteTemplate gConversion2SpriteTemplate =
+{
+ .tileTag = ANIM_TAG_CONVERSION,
+ .paletteTag = ANIM_TAG_CONVERSION,
+ .oam = &gOamData_AffineDouble_ObjBlend_8x8,
+ .anims = sConversion2AnimTable,
+ .images = NULL,
+ .affineAnims = sConversionAffineAnimTable,
+ .callback = AnimConversion2,
+};
+
+const struct SpriteTemplate gMoonSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MOON,
+ .paletteTag = ANIM_TAG_MOON,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMoon,
+};
+
+static const union AnimCmd sMoonlightSparkleAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(8, 8),
+ ANIMCMD_FRAME(12, 8),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sMoonlightSparkleAnimTable[] =
+{
+ sMoonlightSparkleAnimCmds,
+};
+
+const struct SpriteTemplate gMoonlightSparkleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GREEN_SPARKLE,
+ .paletteTag = ANIM_TAG_GREEN_SPARKLE,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sMoonlightSparkleAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMoonlightSparkle,
+};
+
+static const union AnimCmd sHealingBlueStarAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(48, 3),
+ ANIMCMD_FRAME(64, 5),
+ ANIMCMD_FRAME(80, 3),
+ ANIMCMD_FRAME(96, 2),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sHealingBlueStarAnimTable[] =
+{
+ sHealingBlueStarAnimCmds,
+};
+
+const struct SpriteTemplate gHealingBlueStarSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BLUE_STAR,
+ .paletteTag = ANIM_TAG_BLUE_STAR,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sHealingBlueStarAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+const struct SpriteTemplate gHornHitSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_HORN_HIT,
+ .paletteTag = ANIM_TAG_HORN_HIT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimHornHit,
+};
+
+static const union AnimCmd sSuperFangAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(48, 2),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSuperFangAnimTable[] =
+{
+ sSuperFangAnimCmds,
+};
+
+const struct SpriteTemplate gSuperFangSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FANG_ATTACK,
+ .paletteTag = ANIM_TAG_FANG_ATTACK,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSuperFangAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSuperFang,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds2[] =
+{
+ ANIMCMD_FRAME(4, 10),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds3[] =
+{
+ ANIMCMD_FRAME(8, 41),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds4[] =
+{
+ ANIMCMD_FRAME(12, 10),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds5[] =
+{
+ ANIMCMD_FRAME(16, 10),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds6[] =
+{
+ ANIMCMD_FRAME(20, 10),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds7[] =
+{
+ ANIMCMD_FRAME(0, 10, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sWavyMusicNotesAnimCmds8[] =
+{
+ ANIMCMD_FRAME(4, 10, .vFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gMusicNotesAnimTable[] =
+{
+ sWavyMusicNotesAnimCmds1,
+ sWavyMusicNotesAnimCmds2,
+ sWavyMusicNotesAnimCmds3,
+ sWavyMusicNotesAnimCmds4,
+ sWavyMusicNotesAnimCmds5,
+ sWavyMusicNotesAnimCmds6,
+ sWavyMusicNotesAnimCmds7,
+ sWavyMusicNotesAnimCmds8,
+};
+
+static const union AffineAnimCmd sWavyMusicNotesAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0xC, 0xC, 0, 16),
+ AFFINEANIMCMD_FRAME(0xFFF4, 0xFFF4, 0, 16),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sMusicNotesAffineAnimTable[] =
+{
+ sWavyMusicNotesAffineAnimCmds,
+};
+
+const struct SpriteTemplate gWavyMusicNotesSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
+ .anims = gMusicNotesAnimTable,
+ .images = NULL,
+ .affineAnims = sMusicNotesAffineAnimTable,
+ .callback = AnimWavyMusicNotes,
+};
+
+static const u16 sParticlesColorBlendTable[][6] =
+{
+ {ANIM_TAG_MUSIC_NOTES, RGB_WHITE, RGB(31, 26, 28), RGB(31, 22, 26), RGB(31, 17, 24), RGB(31, 13, 22)},
+ {ANIM_TAG_BENT_SPOON, RGB_WHITE, RGB(25, 31, 26), RGB(20, 31, 21), RGB(15, 31, 16), RGB(10, 31, 12)},
+ {ANIM_TAG_SPHERE_TO_CUBE, RGB_WHITE, RGB(31, 31, 24), RGB(31, 31, 17), RGB(31, 31, 10), RGB(31, 31, 3)},
+ {ANIM_TAG_LARGE_FRESH_EGG, RGB_WHITE, RGB(26, 28, 31), RGB(21, 26, 31), RGB(16, 24, 31), RGB(12, 22, 31)},
+};
+
+const struct SpriteTemplate gFastFlyingMusicNotesSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
+ .anims = gMusicNotesAnimTable,
+ .images = NULL,
+ .affineAnims = sMusicNotesAffineAnimTable,
+ .callback = AnimFlyingMusicNotes,
+};
+
+const struct SpriteTemplate gBellyDrumHandSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE,
+ .paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimBellyDrumHand,
+};
+
+static const union AffineAnimCmd sSlowFlyingMusicNotesAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0),
+ AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd *const sSlowFlyinsMusicNotesAffineAnimTable[] =
+{
+ sSlowFlyingMusicNotesAffineAnimCmds,
+};
+
+const struct SpriteTemplate gSlowFlyingMusicNotesSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
+ .anims = gMusicNotesAnimTable,
+ .images = NULL,
+ .affineAnims = sSlowFlyinsMusicNotesAffineAnimTable,
+ .callback = AnimSlowFlyingMusicNotes,
+};
+
+static const union AnimCmd sMetronomeThroughtBubbleAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(48, 2, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sMetronomeThroughtBubbleAnimCmds3[] =
+{
+ ANIMCMD_FRAME(48, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 2, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 2, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sMetronomeThroughtBubbleAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(48, 2),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sMetronomeThroughtBubbleAnimCmds4[] =
+{
+ ANIMCMD_FRAME(48, 2),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sMetronomeThroughtBubbleAnimTable[] =
+{
+ sMetronomeThroughtBubbleAnimCmds1,
+ sMetronomeThroughtBubbleAnimCmds2,
+ sMetronomeThroughtBubbleAnimCmds3,
+ sMetronomeThroughtBubbleAnimCmds4,
+};
+
+const struct SpriteTemplate gThoughtBubbleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_THOUGHT_BUBBLE,
+ .paletteTag = ANIM_TAG_THOUGHT_BUBBLE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sMetronomeThroughtBubbleAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimThoughtBubble,
+};
+
+static const union AffineAnimCmd sMetronomeFingerAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
+ AFFINEANIMCMD_FRAME(0x1E, 0x1E, 0, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sMetronomeFingerAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 11),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 11),
+ AFFINEANIMCMD_LOOP(2),
+ AFFINEANIMCMD_FRAME(-0x1E, -0x1E, 0, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sMetronomeFingerAffineAnimCmds2_2[] =
+{
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(30, 30, 0, 8),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 16),
+ AFFINEANIMCMD_LOOP(0),
+ AFFINEANIMCMD_FRAME(0, 0, 4, 11),
+ AFFINEANIMCMD_FRAME(0, 0, -4, 11),
+ AFFINEANIMCMD_LOOP(2),
+ AFFINEANIMCMD_FRAME(-30, -30, 0, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sMetronomeFingerAffineAnimTable[] =
+{
+ sMetronomeFingerAffineAnimCmds1,
+ sMetronomeFingerAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gMetronomeFingerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FINGER,
+ .paletteTag = ANIM_TAG_FINGER,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sMetronomeFingerAffineAnimTable,
+ .callback = AnimMetronomeFinger,
+};
+
+const struct SpriteTemplate gFollowMeFingerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FINGER,
+ .paletteTag = ANIM_TAG_FINGER,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sMetronomeFingerAffineAnimTable,
+ .callback = AnimFollowMeFinger,
+};
+
+static const union AnimCmd sTauntFingerAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sTauntFingerAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 1, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sTauntFingerAnimCmds3[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sTauntFingerAnimCmds4[] =
+{
+ ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sTauntFingerAnimTable[] =
+{
+ sTauntFingerAnimCmds1,
+ sTauntFingerAnimCmds2,
+ sTauntFingerAnimCmds3,
+ sTauntFingerAnimCmds4,
+};
+
+const struct SpriteTemplate gTauntFingerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FINGER_2,
+ .paletteTag = ANIM_TAG_FINGER_2,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sTauntFingerAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimTauntFinger,
+};
+
+// Functions
+// Animates the falling particles that horizontally wave back and forth.
+// Used by Sleep Powder, Stun Spore, and Poison Powder.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: total duration in frames
+// arg 3: vertical movement speed (sub-pixel value)
+// arg 4: wave amplitude
+// arg 5: wave speed
+void AnimMovePowderParticle(struct Sprite* sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+
+ if (GetBattlerSide(gBattleAnimAttacker))
+ {
+ sprite->data[3] = -gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->data[3] = gBattleAnimArgs[4];
+ }
+
+ sprite->data[4] = gBattleAnimArgs[5];
+ sprite->callback = AnimMovePowderParticleStep;
+}
+
+static void AnimMovePowderParticleStep(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
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Moves an energy orb towards the center of the mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: duration
+void AnimPowerAbsorptionOrb(struct Sprite* sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
+}
+
+// Moves an orb in a straight line towards the target mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: duration
+// arg 3: sprite anim number
+void AnimSolarbeamBigOrb(struct Sprite* sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+// Moves a small orb in a wavy pattern towards the target mon.
+// The small orb "circles" the big orbs in AnimSolarbeamBigOrb.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: duration
+// arg 3: initial wave offset
+void AnimSolarbeamSmallOrb(struct Sprite* sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ InitAnimLinearTranslation(sprite);
+ sprite->data[5] = gBattleAnimArgs[3];
+ sprite->callback = AnimSolarbeamSmallOrbStep;
+ sprite->callback(sprite);
+}
+
+static void AnimSolarbeamSmallOrbStep(struct Sprite* sprite)
+{
+ if (AnimTranslateLinear(sprite))
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ if (sprite->data[5] > 0x7F)
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1;
+ else
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 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;
+ }
+}
+
+// Creates 15 small secondary orbs used in the solarbeam anim effect.
+// There is a 7-frame delay between each of them.
+// No args.
+void AnimTask_CreateSmallSolarbeamOrbs(u8 taskId)
+{
+ 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(&gSolarbeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1);
+ }
+
+ if (gTasks[taskId].data[1] == 15)
+ DestroyAnimVisualTask(taskId);
+}
+
+// Moves an orb from the target mon to the attacking mon in an arc-like fashion.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: wave amplitude
+// arg 3: wave period (lower means faster wave)
+void AnimAbsorptionOrb(struct Sprite* sprite)
+{
+ InitSpritePosToAnimTarget(sprite, TRUE);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[5] = gBattleAnimArgs[2];
+ InitAnimArcTranslation(sprite);
+ sprite->callback = AnimAbsorptionOrbStep;
+}
+
+static void AnimAbsorptionOrbStep(struct Sprite* sprite)
+{
+ if (TranslateAnimHorizontalArc(sprite))
+ DestroyAnimSprite(sprite);
+}
+
+// Moves an orb in a wave-like fashion towards the target mon. The wave's
+// properties and the sprite anim are randomly determined.
+void AnimHyperBeamOrb(struct Sprite* sprite)
+{
+ u16 speed;
+ u16 animNum = Random();
+
+ StartSpriteAnim(sprite, animNum % 8);
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->pos1.x -= 20;
+ else
+ sprite->pos1.x += 20;
+
+ speed = Random();
+ sprite->data[0] = (speed & 31) + 64;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ InitAnimFastLinearTranslationWithSpeed(sprite);
+ sprite->data[5] = Random() & 0xFF;
+ sprite->data[6] = sprite->subpriority;
+ sprite->callback = AnimHyperBeamOrbStep;
+ sprite->callback(sprite);
+}
+
+static void AnimHyperBeamOrbStep(struct Sprite* sprite)
+{
+ if (AnimFastTranslateLinear(sprite))
+ {
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ sprite->pos2.y += Cos(sprite->data[5], 12);
+ if (sprite->data[5] < 0x7F)
+ sprite->subpriority = sprite->data[6];
+ else
+ sprite->subpriority = sprite->data[6] + 1;
+
+ sprite->data[5] += 24;
+ sprite->data[5] &= 0xFF;
+ }
+}
+
+// seed (sprouts a sapling from a seed.)
+// Used by Leech Seed.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x pixel offset
+// arg 3: target y pixel offset
+// arg 4: duration
+// arg 5: wave amplitude
+void AnimLeechSeed(struct Sprite* sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[5];
+ InitAnimArcTranslation(sprite);
+ sprite->callback = AnimLeechSeedStep;
+}
+
+static void AnimLeechSeedStep(struct Sprite* sprite)
+{
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ sprite->invisible = TRUE;
+ sprite->data[0] = 10;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimLeechSeedSprouts);
+ }
+}
+
+static void AnimLeechSeedSprouts(struct Sprite* sprite)
+{
+ sprite->invisible = FALSE;
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 60;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+// Moves a spore particle in a halo around the target mon.
+// The sprite's priority is updated to give the effect of going
+// behind the mon's sprite.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: initial wave offset
+// arg 3: duration
+// arg 4: blend (0 = off, 1 = on)
+void AnimSporeParticle(struct Sprite* sprite)
+{
+ InitSpritePosToAnimTarget(sprite, TRUE);
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ if (gBattleAnimArgs[4] == 1)
+ sprite->oam.objMode = ST_OAM_OBJ_BLEND;
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->callback = AnimSporeParticleStep;
+ sprite->callback(sprite);
+}
+
+static void AnimSporeParticleStep(struct Sprite* sprite)
+{
+ 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 = GetBattlerSpriteBGPriority(gBattleAnimTarget);
+ }
+ else
+ {
+ u8 priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;
+ if (priority > 3)
+ priority = 3;
+
+ sprite->oam.priority = priority;
+ }
+
+ sprite->data[1] += 2;
+ sprite->data[1] &= 0xFF;
+ if (--sprite->data[0] == -1)
+ DestroyAnimSprite(sprite);
+}
+
+// In a double battle, Updates the mon sprite background priorities to allow
+// the circling effect controlled by AnimSporeParticle.
+// No args.
+void AnimTask_SporeDoubleBattle(u8 taskId)
+{
+ if (IsContest() || !IsDoubleBattle())
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)
+ SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 3);
+ else
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// Rotates a big flower around the attacking mon, and slowly floats
+// downward.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target y pixel offset
+// arg 3: duration
+void AnimPetalDanceBigFlower(struct Sprite* sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ 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] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
+ InitAnimLinearTranslation(sprite);
+ sprite->data[5] = 0x40;
+ sprite->callback = AnimPetalDanceBigFlowerStep;
+ sprite->callback(sprite);
+}
+
+static void AnimPetalDanceBigFlowerStep(struct Sprite* sprite)
+{
+ if (!AnimTranslateLinear(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 = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;
+ else
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1;
+
+ sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Slowly floats a small flower downard, while swaying from right to left.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target y pixel offset
+// arg 3: duration
+void AnimPetalDanceSmallFlower(struct Sprite* sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ 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] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
+ InitAnimLinearTranslation(sprite);
+ sprite->data[5] = 0x40;
+ sprite->callback = AnimPetalDanceSmallFlowerStep;
+ sprite->callback(sprite);
+}
+
+static void AnimPetalDanceSmallFlowerStep(struct Sprite* sprite)
+{
+ if (!AnimTranslateLinear(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], 8);
+ if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5)
+ sprite->oam.matrixNum ^= ST_OAM_HFLIP;
+
+ sprite->data[5] += 5;
+ sprite->data[5] &= 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Shoots a leaf upward, then floats it downward while swaying back and forth.
+// arg 0: upward x delta per frame
+// arg 1: upward y delta per frame
+// arg 2: upward duration
+void AnimRazorLeafParticle(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ sprite->callback = AnimRazorLeafParticleStep1;
+}
+
+static void AnimRazorLeafParticleStep1(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] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ sprite->callback = AnimRazorLeafParticleStep2;
+ }
+ else
+ {
+ sprite->data[2]--;
+ sprite->pos1.x += sprite->data[0];
+ sprite->pos1.y += sprite->data[1];
+ }
+}
+
+static void AnimRazorLeafParticleStep2(struct Sprite* sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker))
+ sprite->pos2.x = -Sin(sprite->data[0], 25);
+ else
+ sprite->pos2.x = Sin(sprite->data[0], 25);
+
+ sprite->data[0] += 2;
+ sprite->data[0] &= 0xFF;
+ sprite->data[1]++;
+ if (!(sprite->data[1] & 1))
+ sprite->pos2.y++;
+
+ if (sprite->data[1] > 80)
+ DestroyAnimSprite(sprite);
+}
+
+// Animates a sprite that moves linearly from one location to another, with a
+// single-cycle sine wave added to the y position along the way.
+// Used by Razor Leaf and Magical Leaf.
+// arg 0: initial x offset
+// arg 1: initial y offset
+// arg 2: target x offset
+// arg 3: target y offset
+// arg 4: translation duration
+// arg 5: wave amplitude
+// arg 6: target between double battle opponents (boolean)
+void AnimTranslateLinearSingleSineWave(struct Sprite* sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ if (!gBattleAnimArgs[6])
+ {
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
+ }
+ else
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]);
+ sprite->data[2] += gBattleAnimArgs[2];
+ sprite->data[4] += gBattleAnimArgs[3];
+ }
+
+ sprite->data[5] = gBattleAnimArgs[5];
+ InitAnimArcTranslation(sprite);
+ if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
+ sprite->data[0] = 1;
+ else
+ sprite->data[0] = 0;
+
+ sprite->callback = AnimTranslateLinearSingleSineWaveStep;
+}
+
+static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite)
+{
+ bool8 destroy = FALSE;
+ s16 a = sprite->data[0];
+ s16 b = sprite->data[7];
+ s16 r0;
+
+ sprite->data[0] = 1;
+ TranslateAnimHorizontalArc(sprite);
+ r0 = sprite->data[7];
+ sprite->data[0] = a;
+ if (b > 200 && r0 < 56 && 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 == 30)
+ destroy = TRUE;
+ }
+
+ if (sprite->pos1.x + sprite->pos2.x > 256
+ || sprite->pos1.x + sprite->pos2.x < -16
+ || sprite->pos1.y + sprite->pos2.y > 160
+ || sprite->pos1.y + sprite->pos2.y < -16)
+ destroy = TRUE;
+
+ if (destroy)
+ DestroyAnimSprite(sprite);
+}
+
+// Animates particles in the Twister move animation.
+// arg 0: duration
+// arg 1: total y delta (the particles rise upward)
+// arg 2: wave period (higher means faster wave)
+// arg 3: wave amplitude
+// arg 4: speedup frame (particles move faster at the end of the animation)
+void AnimMoveTwisterParticle(struct Sprite* sprite)
+{
+ if (!IsContest() && IsDoubleBattle() == TRUE)
+ SetAverageBattlerPositions(gBattleAnimTarget, 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 = AnimMoveTwisterParticleStep;
+}
+
+static void AnimMoveTwisterParticleStep(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] < 0x80)
+ sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) - 1;
+ else
+ sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;
+
+ if (--sprite->data[0] == 0)
+ DestroyAnimSprite(sprite);
+}
+
+// Squeezes a constricting "rope" several times via affine animations.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: affine anim num
+// arg 3: num squeezes
+void AnimConstrictBinding(struct Sprite* sprite)
+{
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ sprite->affineAnimPaused = TRUE;
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[6] = gBattleAnimArgs[2];
+ sprite->data[7] = gBattleAnimArgs[3];
+ sprite->callback = AnimConstrictBindingStep1;
+}
+
+static void AnimConstrictBindingStep1(struct Sprite* sprite)
+{
+ u8 spriteId;
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->affineAnimPaused = FALSE;
+ spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+ sprite->data[0] = 0x100;
+ sprite->callback = AnimConstrictBindingStep2;
+ }
+}
+
+static void AnimConstrictBindingStep2(struct Sprite* sprite)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+
+ if (!sprite->data[2])
+ sprite->data[0] += 11;
+ else
+ sprite->data[0] -= 11;
+
+ if (++sprite->data[1] == 6)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] ^= 1;
+ }
+
+ if (sprite->affineAnimEnded)
+ {
+ if (--sprite->data[7] > 0)
+ StartSpriteAffineAnim(sprite, sprite->data[6]);
+ else
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80A2F0C(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+
+ if (gSprites[spriteId].invisible)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[11] = 0x100;
+ gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPosStep1;
+ }
+}
+
+static void AnimTask_DuplicateAndShrinkToPosStep1(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+
+ gTasks[taskId].data[10] += gTasks[taskId].data[0];
+ gSprites[spriteId].pos2.x = gTasks[taskId].data[10] >> 8;
+ if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+
+ gTasks[taskId].data[11] += 16;
+ SetSpriteRotScale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0);
+ SetBattlerSpriteYOffsetFromYScale(spriteId);
+ if (--gTasks[taskId].data[1] == 0)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPosStep2;
+ }
+}
+
+static void AnimTask_DuplicateAndShrinkToPosStep2(u8 taskId)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+ ResetSpriteRotScale(spriteId);
+ gSprites[spriteId].pos2.y = gSprites[spriteId].pos2.x = 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);
+}
+
+// Moves an orb from the target mon to the attacking mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+void AnimMimicOrb(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ gBattleAnimArgs[0] *= -1;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1];
+ sprite->invisible = TRUE;
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->invisible = FALSE;
+ if (sprite->affineAnimEnded)
+ {
+ ChangeSpriteAffineAnim(sprite, 1);
+ sprite->data[0] = 25;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->callback = InitAndRunAnimFastLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ break;
+ }
+ }
+}
+
+// Animates a root that flickers away after some time.
+// arg 0: x pixel offset
+// arg 1: y pixel offset
+// arg 2: sprite subpriority offset
+// arg 3: sprite anim num
+// arg 4: duration
+void AnimIngrainRoot(struct Sprite* sprite)
+{
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ 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 += sprite->pos2.y + sprite->pos1.y - 120;
+ }
+ sprite->callback = AnimRootFlickerOut;
+}
+
+// Places a root on the path to the target mon that flickers away after some time.
+// arg 0: percent along the path to the target mon
+// arg 1: x pixel offset
+// arg 2: y pixel offset
+// arg 3: sprite subpriority offset
+// arg 4: sprite anum num
+// arg 5: duration
+void AnimFrenzyPlantRoot(struct Sprite *sprite)
+{
+ s16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ s16 attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ s16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+
+ targetX -= attackerX;
+ targetY -= attackerY;
+ sprite->pos1.x = attackerX + targetX * gBattleAnimArgs[0] / 100;
+ sprite->pos1.y = attackerY + targetY * 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 = AnimRootFlickerOut;
+ gUnknown_203999C[0] = sprite->pos1.x;
+ gUnknown_203999C[1] = sprite->pos1.y;
+ gUnknown_203999C[2] = targetX;
+ gUnknown_203999C[3] = targetY;
+}
+
+static void AnimRootFlickerOut(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > (sprite->data[2] - 10))
+ sprite->invisible = sprite->data[0] % 2;
+
+ if (sprite->data[0] > sprite->data[2])
+ DestroyAnimSprite(sprite);
+}
+
+// Moves an orb in a fast wavy path.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: horizontal velocity
+// arg 3: wave amplitude
+// arg 4: duration
+void AnimIngrainOrb(struct Sprite* sprite)
+{
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 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])
+ DestroyAnimSprite(sprite);
+}
+
+static void sub_80A33B8(struct Sprite* sprite, s16 c)
+{
+ int a = (sprite->pos1.x << 8) | sprite->pos1.y;
+ int b = (sprite->data[6] << 8) | sprite->data[7];
+ c <<= 8;
+ sprite->data[5] = a;
+ sprite->data[6] = b;
+ sprite->data[7] = c;
+}
+
+bool8 MoveAlongLinearPath(struct Sprite* sprite)
+{
+ u16 xStartPos = (u8)(sprite->data[5] >> 8);
+ u16 yStartPos = (u8)sprite->data[5];
+ s32 xEndPos = (u8)(sprite->data[6] >> 8);
+ s32 yEndPos = (u8)sprite->data[6];
+ s16 totalTime = sprite->data[7] >> 8;
+ s16 currentTime = sprite->data[7] & 0xFF;
+ s16 yEndPos_2;
+ s16 r0;
+ s32 var1;
+ s32 vaxEndPos;
+
+ if (xEndPos == 0)
+ xEndPos = -32;
+ else if (xEndPos == 255)
+ xEndPos = 272;
+
+ yEndPos_2 = yEndPos - yStartPos;
+ r0 = xEndPos - xStartPos;
+ var1 = r0 * currentTime / totalTime;
+ vaxEndPos = yEndPos_2 * currentTime / totalTime;
+ sprite->pos1.x = var1 + xStartPos;
+ sprite->pos1.y = vaxEndPos + yStartPos;
+ if (++currentTime == totalTime)
+ return TRUE;
+
+ sprite->data[7] = (totalTime << 8) | currentTime;
+ return FALSE;
+}
+
+void AnimItemStealStep2(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 10)
+ StartSpriteAffineAnim(sprite, 1);
+
+ sprite->data[0]++;
+ if (sprite->data[0] > 50)
+ DestroyAnimSprite(sprite);
+}
+
+static void AnimItemStealStep1(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 (MoveAlongLinearPath(sprite))
+ {
+ sprite->pos2.y = 0;
+ sprite->data[0] = 0;
+ sprite->callback = AnimItemStealStep2;
+ }
+}
+
+void AnimPresent(struct Sprite* sprite)
+{
+ s16 targetX;
+ s16 targetY;
+
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
+ if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)
+ {
+ sprite->data[6] = targetX;
+ sprite->data[7] = targetY + 10;
+ sub_80A33B8(sprite, 60);
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->data[6] = targetX;
+ sprite->data[7] = targetY + 10;
+ sub_80A33B8(sprite, 60);
+ sprite->data[3] = 3;
+ }
+
+ sprite->data[4] = 60;
+ sprite->callback = AnimItemStealStep1;
+}
+
+static void sub_80A3590(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 (MoveAlongLinearPath(sprite))
+ {
+ sprite->pos2.y = zero;
+ sprite->data[0] = zero;
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimKnockOffItem(struct Sprite* sprite)
+{
+ s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
+
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = targetY + 10;
+ sub_80A33B8(sprite, 40);
+ sprite->data[3] = 3;
+ sprite->data[4] = 60;
+ sprite->callback = AnimItemStealStep1;
+ }
+ else
+ {
+ sprite->data[6] = 255;
+ sprite->data[7] = targetY + 10;
+ if (IsContest())
+ sprite->data[6] = 0;
+
+ sub_80A33B8(sprite, 40);
+ sprite->data[3] = 3;
+ sprite->data[4] = 60;
+ sprite->callback = sub_80A3590;
+ }
+}
+
+// Animates a heal particle upward.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: vertical velocity
+// arg 3: unused
+void AnimPresentHealParticle(struct Sprite* sprite)
+{
+ if (!sprite->data[0])
+ {
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ sprite->data[1] = gBattleAnimArgs[2];
+ }
+
+ sprite->data[0]++;
+ sprite->pos2.y = sprite->data[1] * sprite->data[0];
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimItemSteal(struct Sprite* sprite)
+{
+ s16 attackerX;
+ s16 attackerY;
+
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ if (BATTLE_PARTNER(gBattleAnimTarget) == gBattleAnimAttacker)
+ {
+ sprite->data[6] = attackerX;
+ sprite->data[7] = attackerY + 10;
+ sub_80A33B8(sprite, 60);
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->data[6] = attackerX;
+ sprite->data[7] = attackerY + 10;
+ sub_80A33B8(sprite, 60);
+ sprite->data[3] = 3;
+ }
+
+ sprite->data[4] = 60;
+ sprite->callback = AnimItemStealStep3;
+}
+
+static void AnimItemStealStep3(struct Sprite* sprite)
+{
+ int zero;
+
+ sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
+ zero = 0;
+ if (sprite->data[0] > 127)
+ {
+ 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(SE_W145B, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+
+ if (MoveAlongLinearPath(sprite))
+ {
+ sprite->pos2.y = 0;
+ sprite->data[0] = 0;
+ sprite->callback = AnimItemStealStep2;
+ PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));
+ }
+}
+
+// Moves a bag in a circular motion.
+// arg 0: y position
+// arg 1: initial wave offset
+void AnimTrickBag(struct Sprite* sprite)
+{
+ int a;
+ int b;
+
+ if (!sprite->data[0])
+ {
+ if (!IsContest())
+ {
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->pos1.x = 120;
+ }
+ 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 = 70;
+ }
+
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[0];
+ sprite->data[4] = 20;
+ sprite->pos2.x = Cos(sprite->data[1], 60);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ sprite->callback = AnimTrickBagStep1;
+ if (sprite->data[1] > 0 && sprite->data[1] < 192)
+ sprite->subpriority = 31;
+ else
+ sprite->subpriority = 29;
+ }
+}
+
+static void AnimTrickBagStep1(struct Sprite* sprite)
+{
+ switch (sprite->data[3])
+ {
+ case 0:
+ if (sprite->data[2] > 78)
+ {
+ 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 = AnimTrickBagStep2;
+ }
+ break;
+ }
+}
+
+static void AnimTrickBagStep2(struct Sprite* sprite)
+{
+ if (sprite->data[2] == gTrickBagCoordinates[sprite->data[0]][1])
+ {
+ if (gTrickBagCoordinates[sprite->data[0]][2] == 127)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = AnimTrickBagStep3;
+ }
+
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[2]++;
+ sprite->data[1] = (gTrickBagCoordinates[sprite->data[0]][0] * gTrickBagCoordinates[sprite->data[0]][2] + sprite->data[1]) & 0xFF;
+ if (!IsContest())
+ {
+ if ((u16)(sprite->data[1] - 1) < 191)
+ sprite->subpriority = 31;
+ else
+ sprite->subpriority = 29;
+ }
+
+ sprite->pos2.x = Cos(sprite->data[1], 60);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ }
+}
+
+static void AnimTrickBagStep3(struct Sprite* sprite)
+{
+ if (sprite->data[0] > 20)
+ DestroyAnimSprite(sprite);
+
+ sprite->invisible = sprite->data[0] % 2;
+ sprite->data[0]++;
+}
+
+void AnimTask_LeafBlade(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[4] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1;
+ task->data[6] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ task->data[10] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH);
+ task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT);
+ task->data[5] = (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) ? 1 : -1;
+ task->data[9] = 56 - (task->data[5] * 64);
+ task->data[8] = task->data[7] - task->data[9] + task->data[6];
+ task->data[2] = CreateSprite(&gLeafBladeSpriteTemplate, task->data[8], task->data[9], task->data[4]);
+ if (task->data[2] == MAX_SPRITES)
+ 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] = LeafBladeGetPosFactor(&gSprites[task->data[2]]);
+ InitAnimArcTranslation(&gSprites[task->data[2]]);
+ task->func = AnimTask_LeafBladeStep;
+}
+
+static void AnimTask_LeafBladeStep(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ struct Sprite* sprite = &gSprites[task->data[2]];
+ int a = task->data[0];
+
+ switch (a)
+ {
+ case 4:
+ AnimTask_LeafBladeStep2(task, taskId);
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ task->data[15] = 5;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 8:
+ AnimTask_LeafBladeStep2(task, taskId);
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ task->data[15] = 9;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 0:
+ AnimTask_LeafBladeStep2(task, taskId);
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ 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] = LeafBladeGetPosFactor(sprite);
+ task->data[4] += 2;
+ task->data[3] = a;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ InitAnimArcTranslation(sprite);
+ task->data[0]++;
+ break;
+ case 2:
+ AnimTask_LeafBladeStep2(task, taskId);
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ 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] = LeafBladeGetPosFactor(sprite);
+ task->data[3] = 2;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ InitAnimArcTranslation(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] = LeafBladeGetPosFactor(sprite);
+ task->data[4] -= 2;
+ task->data[3] = 3;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ InitAnimArcTranslation(sprite);
+ task->data[0]++;
+ break;
+ case 6:
+ AnimTask_LeafBladeStep2(task, taskId);
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ 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] = LeafBladeGetPosFactor(sprite);
+ task->data[4] += 2;
+ task->data[3] = 4;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ InitAnimArcTranslation(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] = LeafBladeGetPosFactor(sprite);
+ task->data[3] = 5;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ InitAnimArcTranslation(sprite);
+ task->data[0]++;
+ break;
+ case 10:
+ AnimTask_LeafBladeStep2(task, taskId);
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ 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] = LeafBladeGetPosFactor(sprite);
+ task->data[4] -= 2;
+ task->data[3] = 6;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ InitAnimArcTranslation(sprite);
+ task->data[0]++;
+ break;
+ }
+ case 12:
+ AnimTask_LeafBladeStep2(task, taskId);
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ DestroySprite(sprite);
+ task->data[0]++;
+ }
+ break;
+ case 13:
+ if (task->data[12] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ case 0xFF:
+ if (++task->data[1] > 5)
+ {
+ task->data[1] = 0;
+ task->data[0] = task->data[15];
+ }
+ break;
+ }
+}
+
+static s16 LeafBladeGetPosFactor(struct Sprite* sprite)
+{
+ s16 var = 8;
+
+ if (sprite->data[4] < sprite->pos1.y)
+ var = -var;
+
+ return var;
+}
+
+static void AnimTask_LeafBladeStep2(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(&gLeafBladeSpriteTemplate, spriteX, spriteY, task->data[4]);
+ if (spriteId != MAX_SPRITES)
+ {
+ 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 = AnimTask_LeafBladeStep2_Callback;
+ }
+ }
+}
+
+static void AnimTask_LeafBladeStep2_Callback(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 AnimFlyingParticle(struct Sprite* sprite)
+{
+ u8 battler;
+
+ if (!gBattleAnimArgs[6])
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
+ {
+ 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 = GetBattlerSpriteBGPriority(battler);
+ break;
+ case 1:
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;
+ break;
+ case 2:
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0];
+ sprite->oam.priority = GetBattlerSpriteBGPriority(battler);
+ break;
+ case 3:
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[0];
+ GetAnimBattlerSpriteId(ANIM_TARGET);
+ sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;
+ break;
+ }
+
+ sprite->callback = AnimFlyingParticleStep;
+}
+
+static void AnimFlyingParticleStep(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])
+ {
+ if (sprite->pos2.x + sprite->pos1.x <= 0xF7)
+ return;
+ }
+ else
+ {
+ if (sprite->pos2.x + sprite->pos1.x > -16)
+ return;
+ }
+
+ DestroySpriteAndMatrix(sprite);
+}
+
+void sub_80A41C4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[8] = IndexOfSpritePaletteTag(ANIM_TAG_LEAF) * 16 + 256;
+ task->data[12] = IndexOfSpritePaletteTag(ANIM_TAG_RAZOR_LEAF) * 16 + 256;
+ task->data[0]++;
+ break;
+ case 1:
+ if (++task->data[9] >= 0)
+ {
+ task->data[9] = 0;
+ BlendPalette(task->data[8], 16, task->data[10], sMagicalLeafBlendColors[task->data[11]]);
+ BlendPalette(task->data[12], 16, task->data[10], sMagicalLeafBlendColors[task->data[11]]);
+ if (++task->data[10] == 17)
+ {
+ task->data[10] = 0;
+ if (++task->data[11] == 7)
+ task->data[11] = 0;
+ }
+ }
+ break;
+ }
+
+ if (gBattleAnimArgs[7] == -1)
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimNeedleArmSpike(struct Sprite* sprite)
+{
+ u8 a;
+ u8 b;
+ u16 c;
+ u16 x;
+ u16 y;
+
+ if (gBattleAnimArgs[4] == 0)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ if (gBattleAnimArgs[0] == 0)
+ {
+ a = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ b = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ }
+ else
+ {
+ a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ }
+
+ 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 = ArcTan2Neg(sprite->data[5] - x, sprite->data[6] - y);
+ if (IsContest())
+ c -= 0x8000;
+
+ TrySetSpriteRotScale(sprite, 0, 0x100, 0x100, c);
+ sprite->callback = AnimNeedleArmSpikeStep;
+ }
+}
+
+static void AnimNeedleArmSpikeStep(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
+ {
+ DestroySpriteAndMatrix(sprite);
+ }
+}
+
+static void sub_80A43DC(struct Sprite* sprite)
+{
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80A43F8(struct Sprite* sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void AnimWhipHit(struct Sprite* sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ StartSpriteAnim(sprite, 1);
+
+ sprite->callback = sub_80A43DC;
+ SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+}
+
+void sub_80A4494(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]);
+ StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
+ sprite->callback = TranslateSpriteLinearAndFlicker;
+}
+
+// Moves the sprite in a diagonally slashing motion across the target mon.
+// Used by moves such as MOVE_CUT and MOVE_AERIAL_ACE.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: slice direction; 0 = right-to-left, 1 = left-to-right
+void AnimCuttingSlice(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ sprite->pos1.y += 8;
+
+ sprite->callback = AnimSliceStep;
+ 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 AnimAirCutterSlice(struct Sprite* sprite)
+{
+ u8 a;
+ u8 b;
+
+ switch (gBattleAnimArgs[3])
+ {
+ case 1:
+ a = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X);
+ b = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y);
+ break;
+ case 2:
+ a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
+ if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))
+ {
+ a = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), 0) + a) / 2;
+ b = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), 1) + b) / 2;
+ }
+ break;
+ case 0:
+ default:
+ a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
+ break;
+ }
+
+ sprite->pos1.x = a;
+ sprite->pos1.y = b;
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ sprite->pos1.y += 8;
+
+ sprite->callback = AnimSliceStep;
+ 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];
+}
+
+static void AnimSliceStep(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)
+ {
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->data[0] = 3;
+ sprite->callback = WaitAnimForDuration;
+ }
+}
+
+void sub_80A4738(struct Sprite* sprite)
+{
+ if (sprite->data[2] > 1)
+ {
+ if (sprite->data[3] & 1)
+ {
+ sprite->invisible = FALSE;
+ gSprites[sprite->data[0]].invisible = FALSE;
+ gSprites[sprite->data[1]].invisible = FALSE;
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ gSprites[sprite->data[0]].invisible = TRUE;
+ gSprites[sprite->data[1]].invisible = TRUE;
+ }
+
+ 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]]);
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80A481C(struct Sprite* sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[2];
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ 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_80A4880;
+ sprite->callback(sprite);
+}
+
+static void sub_80A4880(struct Sprite* sprite)
+{
+ sprite->pos2.x = Cos(sprite->data[0], 100);
+ sprite->pos2.y = Sin(sprite->data[0], 20);
+ if (sprite->data[0] < 128)
+ 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])
+ DestroyAnimSprite(sprite);
+}
+
+void AnimProtect(struct Sprite* sprite)
+{
+ if (IsContest())
+ gBattleAnimArgs[1] += 8;
+
+ sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest())
+ sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker) + 1;
+ else
+ sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = (IndexOfSpritePaletteTag(ANIM_TAG_PROTECT) << 4) + 0x100;
+ sprite->data[7] = 16;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));
+ sprite->callback = AnimProtectStep;
+}
+
+static void AnimProtectStep(struct Sprite *sprite)
+{
+ int a;
+ int i;
+
+ sprite->data[5] += 96;
+ sprite->pos2.x = -(sprite->data[5] >> 8);
+ 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 < 6);
+
+ 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;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], 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]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));
+ if (sprite->data[7] == 16)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = DestroyAnimSpriteAndDisableBlend;
+ }
+ }
+}
+
+void AnimMilkBottle(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 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;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+ sprite->callback = AnimMilkBottleStep1;
+}
+
+static void AnimMilkBottleStep1(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]--;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+ 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:
+ AnimMilkBottleStep2(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]++;
+ }
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+ 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 = TRUE;
+ sprite->data[0]++;
+ break;
+ case 4:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+static void AnimMilkBottleStep2(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 AnimGrantingStars(struct Sprite* sprite)
+{
+ if (!gBattleAnimArgs[2])
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+
+ SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[5];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = TranslateSpriteLinearFixedPoint;
+}
+
+void AnimSparkingStars(struct Sprite* sprite)
+{
+ u8 battler;
+
+ if (!gBattleAnimArgs[2])
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler)))
+ {
+ SetAverageBattlerPositions(battler, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y);
+ SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ if (!gBattleAnimArgs[6])
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
+ }
+
+ SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
+ }
+
+ sprite->data[0] = gBattleAnimArgs[5];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = TranslateSpriteLinearFixedPoint;
+}
+
+void sub_80A4E40(struct Sprite* sprite)
+{
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ 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_80A4EA0;
+}
+
+static void sub_80A4EA0(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)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimSleepLetterZ(struct Sprite* sprite)
+{
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ 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 = AnimSleepLetterZStep;
+}
+
+static void AnimSleepLetterZStep(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] > 60)
+ DestroySpriteAndMatrix(sprite);
+}
+
+void AnimLockOnTarget(struct Sprite* sprite)
+{
+ sprite->pos1.x -= 32;
+ sprite->pos1.y -= 32;
+ sprite->data[0] = 20;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep1);
+}
+
+static void AnimLockOnTargetStep1(struct Sprite* sprite)
+{
+ switch (sprite->data[5] & 1)
+ {
+ case 0:
+ sprite->data[0] = 1;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep1);
+ 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 + sInclineMonCoordTable[sprite->data[5] >> 8][0];
+ sprite->data[4] = sprite->pos1.y + sInclineMonCoordTable[sprite->data[5] >> 8][1];
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep2);
+ sprite->data[5] += 0x100;
+ PlaySE12WithPanning(SE_W199, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+ break;
+ }
+
+ sprite->data[5] ^= 1;
+}
+
+static void AnimLockOnTargetStep2(struct Sprite* sprite)
+{
+ if ((sprite->data[5] >> 8) == 4)
+ {
+ sprite->data[0] = 10;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep3);
+ }
+ else
+ {
+ sprite->callback = AnimLockOnTargetStep1;
+ }
+}
+
+static void AnimLockOnTargetStep3(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 = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep4);
+ }
+ 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] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + a;
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + b;
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep5);
+ }
+}
+
+static void AnimLockOnTargetStep4(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_8075BE8(1, 1, 1, 1, 1, 0, 0), sprite->data[1], RGB_WHITE);
+ if (sprite->data[1] == 16)
+ {
+ int pal;
+ sprite->data[2]++;
+ pal = sprite->oam.paletteNum;
+ LoadPalette(&gPlttBufferUnfaded[0x108 + pal * 16], pal * 16 | 0x101, 4);
+ PlaySE12WithPanning(SE_W043, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+ }
+ else if (sprite->data[1] == 0)
+ {
+ sprite->callback = AnimLockOnTargetStep5;
+ }
+}
+
+static void AnimLockOnTargetStep5(struct Sprite* sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0] = 0;
+ sprite->callback = AnimLockOnTargetStep6;
+ }
+}
+
+static void AnimLockOnTargetStep6(struct Sprite* sprite)
+{
+ if (sprite->data[0] % 3 == 0)
+ {
+ sprite->data[1]++;
+ sprite->invisible ^= 1;
+ }
+
+ sprite->data[0]++;
+ if (sprite->data[1] == 8)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimLockOnMoveTarget(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 = ST_OAM_VFLIP;
+ }
+ else if ((s16)sprite->oam.affineParam == 3)
+ {
+ sprite->pos1.x += 0x18;
+ sprite->pos1.y -= 0x18;
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
+ }
+ else
+ {
+ sprite->pos1.x += 0x18;
+ sprite->pos1.y += 0x18;
+ sprite->oam.matrixNum = ST_OAM_HFLIP | ST_OAM_VFLIP;
+ }
+
+ sprite->oam.tileNum = (sprite->oam.tileNum + 16);
+ sprite->callback = AnimLockOnTarget;
+ sprite->callback(sprite);
+}
+
+void AnimBowMon(struct Sprite* sprite)
+{
+ sprite->invisible = TRUE;
+ sprite->data[0] = 0;
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ sprite->callback = AnimBowMonStep1;
+ break;
+ case 1:
+ sprite->callback = AnimBowMonStep2;
+ break;
+ case 2:
+ sprite->callback = AnimBowMonStep3;
+ break;
+ default:
+ sprite->callback = AnimBowMonStep4;
+ break;
+ }
+}
+
+static void AnimBowMonStep1(struct Sprite* sprite)
+{
+ sprite->data[0] = 6;
+ sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? 2 : -2;
+ sprite->data[2] = 0;
+ sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
+ StoreSpriteCallbackInData6(sprite, AnimBowMonStep1_Callback);
+ sprite->callback = TranslateMonSpriteLinear;
+}
+
+static void AnimBowMonStep1_Callback(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
+ PrepareBattlerSpriteForRotScale(sprite->data[3], ST_OAM_OBJ_NORMAL);
+ sprite->data[4] = (sprite->data[6] = GetBattlerSide(gBattleAnimAttacker)) ? 0x300 : 0xFFFFFD00;
+ sprite->data[5] = 0;
+ }
+
+ sprite->data[5] += sprite->data[4];
+ SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
+ SetBattlerSpriteYOffsetFromRotation(sprite->data[3]);
+ if (++sprite->data[0] > 3)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = AnimBowMonStep4;
+ }
+}
+
+static void AnimBowMonStep2(struct Sprite* sprite)
+{
+ sprite->data[0] = 4;
+ sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) ? -3 : 3;
+ sprite->data[2] = 0;
+ sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
+ StoreSpriteCallbackInData6(sprite, AnimBowMonStep4);
+ sprite->callback = TranslateMonSpriteLinear;
+}
+
+static void AnimBowMonStep3(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 8)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = AnimBowMonStep3_Callback;
+ }
+}
+
+static void AnimBowMonStep3_Callback(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
+ sprite->data[6] = GetBattlerSide(gBattleAnimAttacker);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ sprite->data[4] = 0xFC00;
+ sprite->data[5] = 0xC00;
+ }
+ else
+ {
+ sprite->data[4] = 0x400;
+ sprite->data[5] = 0xF400;
+ }
+ }
+
+ sprite->data[5] += sprite->data[4];
+ SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
+ SetBattlerSpriteYOffsetFromRotation(sprite->data[3]);
+ if (++sprite->data[0] > 2)
+ {
+ ResetSpriteRotScale(sprite->data[3]);
+ sprite->callback = AnimBowMonStep4;
+ }
+}
+
+static void AnimBowMonStep4(struct Sprite* sprite)
+{
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80A5590(struct Sprite *sprite)
+{
+ sprite->data[0] = 0;
+ sprite->callback = sub_80A55A0;
+}
+
+static void sub_80A55A0(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = 0;
+ sprite->data[2] = gBattlerSpriteIds[gBattleAnimAttacker];
+ sprite->data[3] = GetBattlerSide(gBattleAnimAttacker);
+ sprite->data[4] = (sprite->data[3] != B_SIDE_PLAYER) ? 0x200 : -0x200;
+ sprite->data[5] = 0;
+ PrepareBattlerSpriteForRotScale(sprite->data[2], ST_OAM_OBJ_NORMAL);
+ sprite->data[0]++;
+ // fall through
+ case 1:
+ sprite->data[5] += sprite->data[4];
+ SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
+ SetBattlerSpriteYOffsetFromRotation(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];
+ SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
+ SetBattlerSpriteYOffsetFromRotation(sprite->data[2]);
+ if (++sprite->data[1] > 3)
+ {
+ ResetSpriteRotScale(sprite->data[2]);
+ DestroyAnimSprite(sprite);
+ }
+ break;
+ }
+}
+
+void AnimTask_SkullBashPosition(u8 taskId)
+{
+ u8 side;
+
+ gTasks[taskId].data[0] = gBattlerSpriteIds[gBattleAnimAttacker];
+ side = GetBattlerSide(gBattleAnimAttacker);
+ gTasks[taskId].data[1] = side;
+ 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 (side == B_SIDE_PLAYER)
+ gTasks[taskId].data[5] *= -1;
+
+ gTasks[taskId].func = AnimTask_SkullBashPositionSet;
+ break;
+ case 1:
+ gTasks[taskId].data[3] = 8;
+ gTasks[taskId].data[4] = 0x600;
+ gTasks[taskId].data[5] = 0xC0;
+ if (side == B_SIDE_PLAYER)
+ {
+ gTasks[taskId].data[4] = -gTasks[taskId].data[4];
+ gTasks[taskId].data[5] = -gTasks[taskId].data[5];
+ }
+
+ gTasks[taskId].func = AnimTask_SkullBashPositionReset;
+ break;
+ }
+}
+
+static void AnimTask_SkullBashPositionSet(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;
+ PrepareBattlerSpriteForRotScale(task->data[0], ST_OAM_OBJ_NORMAL);
+ task->data[2]++;
+ }
+ break;
+ case 1:
+ if (task->data[3])
+ {
+ task->data[4] += task->data[5];
+ SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]);
+ SetBattlerSpriteYOffsetFromRotation(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;
+ }
+}
+
+static void AnimTask_SkullBashPositionReset(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ if (task->data[3])
+ {
+ task->data[4] -= task->data[5];
+ SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]);
+ SetBattlerSpriteYOffsetFromRotation(task->data[0]);
+ task->data[3]--;
+ }
+ else
+ {
+ ResetSpriteRotScale(task->data[0]);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void AnimSlashSlice(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSliceStep3);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+}
+
+void AnimFalseSwipeSlice(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 0xFFD0;
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSliceStep1);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+}
+
+void AnimFalseSwipePositionedSlice(struct Sprite* sprite)
+{
+ sprite->pos1.x = sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 0xFFD0 + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = AnimFalseSwipeSliceStep3;
+}
+
+static void AnimFalseSwipeSliceStep1(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 8)
+ {
+ sprite->data[0] = 12;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSliceStep2);
+ sprite->callback = TranslateSpriteLinear;
+ }
+}
+
+static void AnimFalseSwipeSliceStep2(struct Sprite* sprite)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = AnimFalseSwipeSliceStep3;
+}
+
+static void AnimFalseSwipeSliceStep3(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible = !sprite->invisible;
+ if (++sprite->data[1] > 8)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimEndureEnergy(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[2];
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->callback = AnimEndureEnergyStep;
+}
+
+static void AnimEndureEnergyStep(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)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimSharpenSphere(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) - 12;
+ sprite->data[0] = 0;
+ sprite->data[1] = 2;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
+ sprite->callback = AnimSharpenSphereStep;
+}
+
+static void AnimSharpenSphereStep(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)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimConversion(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];
+ if (IsContest())
+ sprite->pos1.y += 10;
+
+ sprite->data[0]++;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTask_ConversionAlphaBlend(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]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - gTasks[taskId].data[1], gTasks[taskId].data[1]));
+ if (gTasks[taskId].data[1] == 16)
+ gTasks[taskId].data[2]++;
+ }
+ }
+}
+
+void AnimConversion2(struct Sprite* sprite)
+{
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ sprite->animPaused = TRUE;
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->callback = AnimConversion2Step;
+}
+
+static void AnimConversion2Step(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ {
+ sprite->data[0]--;
+ }
+ else
+ {
+ sprite->animPaused = FALSE;
+ sprite->data[0] = 30;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ }
+}
+
+void AnimTask_Conversion2AlphaBlend(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 4)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
+ if (gTasks[taskId].data[1] == 16)
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80A5E34(u8 taskId)
+{
+ u8 i;
+
+ for (i = 0; i < gBattlersCount; i++)
+ {
+ if (gBattleAnimArgs[0] == 1 && GetBattlerSide(i) == B_SIDE_PLAYER)
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]);
+
+ if (gBattleAnimArgs[1] == 1 && GetBattlerSide(i) == B_SIDE_OPPONENT)
+ SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80A5EA8(u8 taskId)
+{
+ u8 i;
+
+ for (i = 0; i < gBattlersCount; i++)
+ SetHealthboxSpriteVisible(gHealthboxSpriteIds[i]);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimMoon(struct Sprite* sprite)
+{
+ if (IsContest())
+ {
+ sprite->pos1.x = 48;
+ sprite->pos1.y = 40;
+ }
+ else
+ {
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+ }
+
+ sprite->oam.shape = SPRITE_SHAPE(8x8);
+ sprite->oam.size = SPRITE_SIZE(64x32);
+ sprite->data[0] = 0;
+ sprite->callback = AnimMoonStep;
+}
+
+static void AnimMoonStep(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ DestroyAnimSprite(sprite);
+}
+
+void AnimMoonlightSparkle(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_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 = AnimMoonlightSparkleStep;
+}
+
+static void AnimMoonlightSparkleStep(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ if (sprite->data[2] < 120)
+ {
+ sprite->pos1.y++;
+ sprite->data[2]++;
+ }
+ }
+
+ if (sprite->data[0])
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTask_FadeScreenBlueStep(u8);
+
+
+void AnimTask_FadeScreenBlue(u8 taskId)
+{
+ int a = sub_8075BE8(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_8075CB8(1, 1, 1, 1);
+ c = a | b;
+ StorePointerInVars(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void*)c);
+ b = b | (0x10000 << IndexOfSpritePaletteTag(ANIM_TAG_MOON));
+ d = IndexOfSpritePaletteTag(ANIM_TAG_GREEN_SPARKLE);
+ BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 16, RGB(27, 29, 31));
+ gTasks[taskId].func = AnimTask_FadeScreenBlueStep;
+ gTasks[taskId].func(taskId);
+}
+
+void AnimTask_FadeScreenBlueStep(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 == &gMoonSpriteTemplate || gSprites[spriteId].template == &gMoonlightSparkleSpriteTemplate)
+ gSprites[spriteId].data[0] = 1;
+ }
+
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 30)
+ {
+ BeginNormalPaletteFade((u32)LoadPointerFromVars(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 AnimHornHit(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[2] < 2)
+ gBattleAnimArgs[2] = 2;
+
+ if (gBattleAnimArgs[2] > 0x7F)
+ gBattleAnimArgs[2] = 0x7F;
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1];
+ sprite->data[6] = sprite->pos1.x;
+ sprite->data[7] = sprite->pos1.y;
+ if (IsContest())
+ {
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
+ 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 (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ 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 = (ST_OAM_HFLIP | ST_OAM_VFLIP);
+ }
+
+ sprite->callback = AnimHornHitStep;
+}
+
+static void AnimHornHitStep(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)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTask_DoubleTeam(u8 taskId)
+{
+ u16 i;
+ int obj;
+ u16 r3;
+ u16 r4;
+ struct Task* task = &gTasks[taskId];
+
+ task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ task->data[1] = AllocSpritePalette(ANIM_TAG_BENT_SPOON);
+ 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, RGB_BLACK);
+ task->data[3] = 0;
+ i = 0;
+ while (i < 2 && (obj = CloneBattlerSpriteWithBlend(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 = AnimTask_DoubleTeamCallback;
+ task->data[3]++;
+ i++;
+ }
+
+ task->func = AnimTask_DoubleTeamStep;
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
+ else
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
+}
+
+static void AnimTask_DoubleTeamStep(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ if (!task->data[3])
+ {
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
+ else
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
+
+ FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+static void AnimTask_DoubleTeamCallback(struct Sprite* sprite)
+{
+ if (++sprite->data[3] > 1)
+ {
+ sprite->data[3] = 0;
+ sprite->data[0]++;
+ }
+
+ if (sprite->data[0] > 64)
+ {
+ 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 AnimSuperFang(struct Sprite* sprite)
+{
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+}
+
+void AnimTask_MusicNotesRainbowBlend(u8 taskId)
+{
+ u16 i;
+ u16 j;
+ u16 index;
+
+ index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[0][0]);
+ if (index != 0xFF)
+ {
+ index = (index << 4) + 0x100;
+ for (i = 1; i < NELEMS(sParticlesColorBlendTable[0]); i++)
+ gPlttBufferFaded[index + i] = sParticlesColorBlendTable[0][i];
+ }
+
+ for (j = 1; j < NELEMS(sParticlesColorBlendTable); j++)
+ {
+ index = AllocSpritePalette(sParticlesColorBlendTable[j][0]);
+ if (index != 0xFF)
+ {
+ index = (index << 4) + 0x100;
+ for (i = 1; i < NELEMS(sParticlesColorBlendTable[0]); i++)
+ gPlttBufferFaded[index + i] = sParticlesColorBlendTable[j][i];
+ }
+ }
+ DestroyAnimVisualTask(taskId);
+}
+
+// clears the rainbow effect for musical notes.
+void AnimTask_MusicNotesClearRainbowBlend(u8 taskId)
+{
+ u16 i;
+
+ for (i = 1; i < NELEMS(sParticlesColorBlendTable); i++)
+ FreeSpritePaletteByTag(sParticlesColorBlendTable[i][0]);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimWavyMusicNotes(struct Sprite* sprite)
+{
+ u8 index;
+ u8 a;
+ u8 b;
+
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ if ((index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[gBattleAnimArgs[1]][0])) != 0xFF)
+ sprite->oam.paletteNum = index;
+
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = 0;
+ sprite->data[3] = gBattleAnimArgs[2];
+ if (IsContest())
+ {
+ a = 48;
+ b = 40;
+ }
+ else
+ {
+ a = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ b = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ }
+
+ sprite->data[4] = sprite->pos1.x << 4;
+ sprite->data[5] = sprite->pos1.y << 4;
+ AnimWavyMusicNotesGetNextPos(a - sprite->pos1.x, b - sprite->pos1.y, &sprite->data[6], &sprite->data[7], 40);
+ sprite->callback = AnimWavyMusicNotesStep;
+}
+
+static void AnimWavyMusicNotesGetNextPos(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;
+}
+
+static void AnimWavyMusicNotesStep(struct Sprite* sprite)
+{
+ s16 y, yDelta;
+ u8 index;
+
+ sprite->data[0]++;
+ yDelta = 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(yDelta, 15);
+
+ y = sprite->pos1.y;
+ if (sprite->pos1.x < -16 || sprite->pos1.x > 256 || y < -16 || y > 128)
+ {
+ DestroySpriteAndMatrix(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(sParticlesColorBlendTable[sprite->data[1]][0]);
+ if (index != 0xFF)
+ sprite->oam.paletteNum = index;
+ }
+ }
+}
+
+void AnimFlyingMusicNotes(struct Sprite* sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ gBattleAnimArgs[1] *= -1;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 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 = AnimFlyingMusicNotesStep;
+}
+
+static void AnimFlyingMusicNotesStep(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] == 48)
+ DestroySpriteAndMatrix(sprite);
+}
+
+void AnimBellyDrumHand(struct Sprite* sprite)
+{
+ s16 a;
+
+ if (gBattleAnimArgs[0] == 1)
+ {
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
+ a = 16;
+ }
+ else
+ {
+ a = -16;
+ }
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + a;
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 8;
+ sprite->data[0] = 8;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void AnimSlowFlyingMusicNotes(struct Sprite* sprite)
+{
+ s16 xDiff;
+ u8 index;
+
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ sprite->pos1.y += 8;
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+ index = IndexOfSpritePaletteTag(sParticlesColorBlendTable[gBattleAnimArgs[2]][0]);
+ if (index != 0xFF)
+ sprite->oam.paletteNum = index;
+
+ xDiff = (gBattleAnimArgs[0] == 0) ? -32 : 32;
+ sprite->data[0] = 40;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = xDiff + sprite->data[1];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->data[3] - 40;
+ InitAnimLinearTranslation(sprite);
+ sprite->data[5] = gBattleAnimArgs[3];
+ sprite->callback = AnimSlowFlyingMusicNotesStep;
+}
+
+static void AnimSlowFlyingMusicNotesStep(struct Sprite* sprite)
+{
+ if (!AnimTranslateLinear(sprite))
+ {
+ s16 xDiff;
+
+ xDiff = Sin(sprite->data[5], 8);
+ if (sprite->pos2.x < 0)
+ xDiff = -xDiff;
+
+ sprite->pos2.x += xDiff;
+ sprite->pos2.y += Sin(sprite->data[5], 4);
+ sprite->data[5] = (sprite->data[5] + 8) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite)
+{
+ if (GetBattlerSide(battler) == B_SIDE_PLAYER)
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8;
+ else
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;
+
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;
+}
+
+void AnimThoughtBubble(struct Sprite* sprite)
+{
+ u8 a;
+ u8 battler;
+
+ if (gBattleAnimArgs[0] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ SetSpriteNextToMonHead(battler, sprite);
+ a = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? 0 : 1;
+ sprite->data[0] = gBattleAnimArgs[1];
+ sprite->data[1] = a + 2;
+ StartSpriteAnim(sprite, a);
+ StoreSpriteCallbackInData6(sprite, AnimThoughtBubbleStep);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+}
+
+static void AnimThoughtBubbleStep(struct Sprite* sprite)
+{
+ if (--sprite->data[0] == 0)
+ {
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ StartSpriteAnim(sprite, sprite->data[1]);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+ }
+}
+
+void AnimMetronomeFinger(struct Sprite* sprite)
+{
+ u8 battler;
+
+ if (gBattleAnimArgs[0] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ SetSpriteNextToMonHead(battler, sprite);
+ sprite->data[0] = 0;
+ StoreSpriteCallbackInData6(sprite, AnimMetronomeFingerStep);
+ sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+}
+
+static void AnimMetronomeFingerStep(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 16)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
+ sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+ }
+}
+
+void AnimFollowMeFinger(struct Sprite* sprite)
+{
+ u8 battler;
+
+ if (gBattleAnimArgs[0] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP);
+ 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;
+ StoreSpriteCallbackInData6(sprite, AnimFollowMeFingerStep1);
+ sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+}
+
+static void AnimFollowMeFingerStep1(struct Sprite* sprite)
+{
+ if (++sprite->data[4] > 12)
+ sprite->callback = AnimFollowMeFingerStep2;
+}
+
+static void AnimFollowMeFingerStep2(struct Sprite* sprite)
+{
+ s16 x1, x2;
+
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 254)
+ {
+ if (--sprite->data[0] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->callback = AnimMetronomeFingerStep;
+ 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];
+
+ x1 = gSineTable[sprite->data[1]];
+ x2 = x1 >> 3;
+ sprite->pos2.x = (x1 >> 3) + (x2 >> 1);
+}
+
+void AnimTauntFinger(struct Sprite* sprite)
+{
+ u8 battler;
+
+ if (gBattleAnimArgs[0] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ SetSpriteNextToMonHead(battler, sprite);
+ if (GetBattlerSide(battler) == B_SIDE_PLAYER)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[0] = 2;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 3;
+ }
+
+ sprite->callback = AnimTauntFingerStep1;
+}
+
+static void AnimTauntFingerStep1(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 10)
+ {
+ sprite->data[1] = 0;
+ StartSpriteAnim(sprite, sprite->data[0]);
+ StoreSpriteCallbackInData6(sprite, AnimTauntFingerStep2);
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+ }
+}
+
+static void AnimTauntFingerStep2(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 5)
+ DestroyAnimSprite(sprite);
+}
+
diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c
new file mode 100644
index 000000000..23be07785
--- /dev/null
+++ b/src/battle_anim_effects_2.c
@@ -0,0 +1,3824 @@
+#include "global.h"
+#include "malloc.h"
+#include "battle_anim.h"
+#include "battle_interface.h"
+#include "decompress.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "main.h"
+#include "math_util.h"
+#include "palette.h"
+#include "random.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "trig.h"
+#include "util.h"
+#include "constants/songs.h"
+
+static void sub_80A6ED8(struct Sprite *);
+static void sub_80A7058(struct Sprite *);
+static void sub_80A7080(struct Sprite *);
+static void AnimTask_WithdrawStep(u8);
+static void AnimSwordsDanceBladeStep(struct Sprite *);
+static void sub_80A7A18(struct Sprite *);
+static void AnimFallingCoin_Step(struct Sprite *);
+static void AnimBulletSeed_Step1(struct Sprite *);
+static void AnimBulletSeed_Step2(struct Sprite *);
+static void AnimViceGripPincerStep(struct Sprite *);
+static void AnimGuillotinePincerStep1(struct Sprite *);
+static void AnimGuillotinePincerStep2(struct Sprite *);
+static void AnimGuillotinePincerStep3(struct Sprite *);
+static void AnimTask_GrowAndGreyscaleStep(u8);
+static void AnimTask_MinimizeStep1(u8);
+static void CreateMinimizeSprite(struct Task *, u8);
+static void ClonedMinizeSprite_Step(struct Sprite *);
+static void AnimTask_SplashStep(u8);
+static void AnimTask_GrowAndShrinkStep(u8);
+static void ThrashMoveMonStep(u8);
+static void ThrashMoveMon(u8);
+static void AnimTask_SketchDrawMon(u8);
+static void AnimPencil_Step(struct Sprite *);
+static void AnimSoftBoiledEgg_Step1(struct Sprite *);
+static void AnimSoftBoiledEgg_Step2(struct Sprite *);
+static void AnimSoftBoiledEgg_Step3(struct Sprite *);
+static void AnimSoftBoiledEgg_Step3_Callback1(struct Sprite *);
+static void AnimSoftBoiledEgg_Step3_Callback2(struct Sprite *);
+static void AnimSoftBoiledEgg_Step4(struct Sprite *);
+static void AnimSoftBoiledEgg_Step4_Callback(struct Sprite *);
+static void StretchAttacker_Step(u8);
+static void ExtremeSpeedImpact_Step(u8);
+static void ExtremeSpeedMonReappear_Step(u8);
+static void SpeedDust_Step1(u8);
+static void FakeOutStep1(u8);
+static void FakeOutStep2(u8);
+static void AnimRedHeartProjectile_Step(struct Sprite *);
+static void AnimRedHeartRising_Step(struct Sprite *);
+static void HeartsBackground_Step(u8);
+static void ScaryFace_Step(u8);
+static void AnimOrbitFastStep(struct Sprite *);
+static void AnimOrbitScatterStep(struct Sprite *);
+static void AnimMovementWaves_Step(struct Sprite *);
+static void UproarDistortion_Step(u8);
+static void AnimJaggedMusicNote_Step(struct Sprite *);
+static void AnimPerishSongMusicNote_Step1(struct Sprite *);
+static void AnimPerishSongMusicNote_Step2(struct Sprite *);
+
+// Data
+// Unused
+static const struct SpriteTemplate sUnknown_83E3ADC =
+{
+ .tileTag = ANIM_TAG_FINGER,
+ .paletteTag = ANIM_TAG_FINGER,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A6E48,
+};
+
+static const union AnimCmd sUnknown_83E3AF4[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sUnknown_83E3AFC[] =
+{
+ sUnknown_83E3AF4,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3B00 =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A6E98,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3B18 =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A6F8C,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3B30 =
+{
+ .tileTag = ANIM_TAG_CLAMP,
+ .paletteTag = ANIM_TAG_CLAMP,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gUnknown_83E7910,
+ .callback = sub_80A7020,
+};
+
+static const union AnimCmd sUnknown_83E3B48[] =
+{
+ ANIMCMD_FRAME(0, 9),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(48, 3),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sUnknown_83E3B5C[] =
+{
+ sUnknown_83E3B48,
+};
+
+static const union AffineAnimCmd sUnknown_83E3B60[] =
+{
+ AFFINEANIMCMD_FRAME(80, 80, 0, 0),
+ AFFINEANIMCMD_FRAME(9, 9, 0, 18),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sUnknown_83E3B78[] =
+{
+ sUnknown_83E3B60,
+};
+
+// Unused
+static const struct SpriteTemplate sUnknown_83E3B7C =
+{
+ .tileTag = ANIM_TAG_EXPLOSION_6,
+ .paletteTag = ANIM_TAG_EXPLOSION_6,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = sUnknown_83E3B5C,
+ .images = NULL,
+ .affineAnims = sUnknown_83E3B78,
+ .callback = AnimSpriteOnMonPos,
+};
+
+static const union AnimCmd sKinesisZapEnergyAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(8, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(24, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(40, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(48, 3, .hFlip = TRUE),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sKinesisZapEnergyAnimTable[] =
+{
+ sKinesisZapEnergyAnimCmds,
+};
+
+const struct SpriteTemplate gKinesisZapEnergySpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ALERT,
+ .paletteTag = ANIM_TAG_ALERT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
+ .anims = sKinesisZapEnergyAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = Anim_KinesisZapEnergy,
+};
+
+static const union AffineAnimCmd sSwordsDanceBladeAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(16, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(20, 0, 0, 12),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 32),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sSwordsDanceBladeAffineAnimTable[] =
+{
+ sSwordsDanceBladeAffineAnimCmds,
+};
+
+const struct SpriteTemplate gSwordsDanceBladeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SWORD,
+ .paletteTag = ANIM_TAG_SWORD,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSwordsDanceBladeAffineAnimTable,
+ .callback = Anim_SwordsDanceBlade,
+};
+
+const struct SpriteTemplate gSonicBoomSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_AIR_WAVE,
+ .paletteTag = ANIM_TAG_AIR_WAVE,
+ .oam = &gOamData_AffineDouble_ObjBlend_32x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSonicBoomProjectile,
+};
+
+const struct SpriteTemplate gAirWaveProjectileSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_AIR_WAVE,
+ .paletteTag = ANIM_TAG_AIR_WAVE,
+ .oam = &gOamData_AffineOff_ObjBlend_32x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimAirWaveProjectile,
+};
+
+static const union AffineAnimCmd sGrowingRingAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(32, 32, 0, 0),
+ AFFINEANIMCMD_FRAME(7, 7, 0, -56),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sWaterPulseRingAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(5, 5, 0, 10),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 10),
+ AFFINEANIMCMD_FRAME(10, 10, 0, 10),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 10),
+ AFFINEANIMCMD_FRAME(10, 10, 0, 10),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 10),
+ AFFINEANIMCMD_FRAME(10, 10, 0, 10),
+ AFFINEANIMCMD_END,
+};
+
+const union AffineAnimCmd *const gGrowingRingAffineAnimTable[] =
+{
+ sGrowingRingAffineAnimCmds,
+};
+
+static const union AffineAnimCmd *const sWaterPulseRingAffineAnimTable[] =
+{
+ sWaterPulseRingAffineAnimCmds,
+};
+
+const struct SpriteTemplate gSupersonicWaveSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GOLD_RING,
+ .paletteTag = ANIM_TAG_GOLD_RING,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gGrowingRingAffineAnimTable,
+ .callback = TranslateAnimSpriteToTargetMonLocation,
+};
+
+const struct SpriteTemplate gScreechWaveSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PURPLE_RING,
+ .paletteTag = ANIM_TAG_PURPLE_RING,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gGrowingRingAffineAnimTable,
+ .callback = TranslateAnimSpriteToTargetMonLocation,
+};
+
+const struct SpriteTemplate gMetalSoundSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_METAL_SOUND_WAVES,
+ .paletteTag = ANIM_TAG_METAL_SOUND_WAVES,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gGrowingRingAffineAnimTable,
+ .callback = TranslateAnimSpriteToTargetMonLocation,
+};
+
+const struct SpriteTemplate gWaterPulseRingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BLUE_RING_2,
+ .paletteTag = ANIM_TAG_BLUE_RING_2,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sWaterPulseRingAffineAnimTable,
+ .callback = AnimWaterPulseRing,
+};
+
+const struct SpriteTemplate gEggThrowSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LARGE_FRESH_EGG,
+ .paletteTag = ANIM_TAG_LARGE_FRESH_EGG,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimThrowProjectile,
+};
+
+static const struct SpriteTemplate sUnknown_83E3D18 =
+{
+ .tileTag = ANIM_TAG_VOID_LINES,
+ .paletteTag = ANIM_TAG_VOID_LINES,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A79E8,
+};
+
+static const union AnimCmd sCoinAnimCmds[] =
+{
+ ANIMCMD_FRAME(8, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sCoinAnimTable[] =
+{
+ sCoinAnimCmds,
+};
+
+static const union AffineAnimCmd sFallingCoinAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 10, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sFallingCoinAffineAnimTable[] =
+{
+ sFallingCoinAffineAnimCmds,
+};
+
+const struct SpriteTemplate gCoinThrowSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_COIN,
+ .paletteTag = ANIM_TAG_COIN,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = sCoinAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimCoinThrow,
+};
+
+const struct SpriteTemplate gFallingCoinSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_COIN,
+ .paletteTag = ANIM_TAG_COIN,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = sCoinAnimTable,
+ .images = NULL,
+ .affineAnims = sFallingCoinAffineAnimTable,
+ .callback = AnimFallingCoin,
+};
+
+static const union AffineAnimCmd sBulletSeedAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 20, 1),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sBulletSeedAffineAnimTable[] =
+{
+ sBulletSeedAffineAnimCmds,
+};
+
+const struct SpriteTemplate gBulletSeedSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SEED,
+ .paletteTag = ANIM_TAG_SEED,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sBulletSeedAffineAnimTable,
+ .callback = AnimBulletSeed,
+};
+
+static const union AffineAnimCmd sRazorWindTornadoAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(16, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(4, 0, 0, 40),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sRazorWindTornadoAffineAnimTable[] =
+{
+ sRazorWindTornadoAffineAnimCmds,
+};
+
+const struct SpriteTemplate gRazorWindTornadoSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GUST,
+ .paletteTag = ANIM_TAG_GUST,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sRazorWindTornadoAffineAnimTable,
+ .callback = AnimRazorWindTornado,
+};
+
+static const union AnimCmd sViceGripAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(32, 20),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sViceGripAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 3, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 20, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sViceGripAnimTable[] =
+{
+ sViceGripAnimCmds1,
+ sViceGripAnimCmds2,
+};
+
+const struct SpriteTemplate gViceGripSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_CUT,
+ .paletteTag = ANIM_TAG_CUT,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
+ .anims = sViceGripAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimViceGripPincer,
+};
+
+static const union AnimCmd sGuillotineAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_FRAME(32, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sGuillotineAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 2, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 1, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sGuillotineAnimTable[] =
+{
+ sGuillotineAnimCmds1,
+ sGuillotineAnimCmds2,
+};
+
+const struct SpriteTemplate gGuillotineSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_CUT,
+ .paletteTag = ANIM_TAG_CUT,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
+ .anims = sGuillotineAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimGuillotinePincer,
+};
+
+static const union AffineAnimCmd sSplashEffectAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-6, 4, 0, 8),
+ AFFINEANIMCMD_FRAME(10, -10, 0, 8),
+ AFFINEANIMCMD_FRAME(-4, 6, 0, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sGrowAndShrinkAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-4, -5, 0, 12),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 24),
+ AFFINEANIMCMD_FRAME(4, 5, 0, 12),
+ AFFINEANIMCMD_END,
+};
+
+static const union AnimCmd sBreathPuffAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(4, 40, .hFlip = TRUE),
+ ANIMCMD_FRAME(8, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(12, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sBreathPuffAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(4, 40),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(12, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sBreathPuffAnimTable[] =
+{
+ sBreathPuffAnimCmds1,
+ sBreathPuffAnimCmds2,
+};
+
+const struct SpriteTemplate gBreathPuffSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BREATH,
+ .paletteTag = ANIM_TAG_BREATH,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sBreathPuffAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimBreathPuff,
+};
+
+static const union AffineAnimCmd sAngerMarkAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(11, 11, 0, 8),
+ AFFINEANIMCMD_FRAME(-11, -11, 0, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sAngerMarkAffineAnimTable[] =
+{
+ sAngerMarkAffineAnimCmds,
+};
+
+const struct SpriteTemplate gAngerMarkSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ANGER,
+ .paletteTag = ANIM_TAG_ANGER,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sAngerMarkAffineAnimTable,
+ .callback = AnimAngerMark,
+};
+
+static const union AffineAnimCmd sThrashMoveMonAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-10, 9, 0, 7),
+ AFFINEANIMCMD_FRAME(20, -20, 0, 7),
+ AFFINEANIMCMD_FRAME(-20, 20, 0, 7),
+ AFFINEANIMCMD_FRAME(10, -9, 0, 7),
+ AFFINEANIMCMD_LOOP(2),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gPencilSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PENCIL,
+ .paletteTag = ANIM_TAG_PENCIL,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimPencil,
+};
+
+const struct SpriteTemplate gSnoreZSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SNORE_Z,
+ .paletteTag = ANIM_TAG_SNORE_Z,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSnoreZ,
+};
+
+static const union AnimCmd sExplosionAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sExplosionAnimTable[] =
+{
+ sExplosionAnimCmds,
+};
+
+const struct SpriteTemplate gExplosionSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_EXPLOSION,
+ .paletteTag = ANIM_TAG_EXPLOSION,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sExplosionAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+static const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -8, 2),
+ AFFINEANIMCMD_FRAME(0, 0, 8, 4),
+ AFFINEANIMCMD_FRAME(0, 0, -8, 2),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSoftBoiledEggAffineAnimCmds3[] =
+{
+ AFFINEANIMCMD_FRAME(-8, 4, 0, 8),
+ AFFINEANIMCMD_LOOP(0),
+ AFFINEANIMCMD_FRAME(16, -8, 0, 8),
+ AFFINEANIMCMD_FRAME(-16, 8, 0, 8),
+ AFFINEANIMCMD_LOOP(1),
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 15),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sSoftBoiledEggAffineAnimTable[] =
+{
+ sSoftBoiledEggAffineAnimCmds1,
+ sSoftBoiledEggAffineAnimCmds2,
+ sSoftBoiledEggAffineAnimCmds3,
+};
+
+const struct SpriteTemplate gSoftBoiledEggSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BREAKING_EGG,
+ .paletteTag = ANIM_TAG_BREAKING_EGG,
+ .oam = &gOamData_AffineDouble_ObjBlend_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSoftBoiledEggAffineAnimTable,
+ .callback = AnimSoftBoiledEgg,
+};
+
+static const union AffineAnimCmd sThinRingExpandingAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(16, 16, 0, 30),
+ AFFINEANIMCMD_END_ALT(1),
+};
+
+static const union AffineAnimCmd sThinRingExpandingAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(32, 32, 0, 15),
+ AFFINEANIMCMD_END_ALT(1),
+};
+
+static const union AffineAnimCmd sHyperVoiceRingAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(11, 11, 0, 45),
+ AFFINEANIMCMD_END_ALT(1),
+};
+
+static const union AffineAnimCmd *const sThinRingExpandingAffineAnimTable[] =
+{
+ sThinRingExpandingAffineAnimCmds1,
+ sThinRingExpandingAffineAnimCmds2,
+};
+
+static const union AffineAnimCmd *const sHyperVoiceRingAffineAnimTable[] =
+{
+ sHyperVoiceRingAffineAnimCmds,
+};
+
+const struct SpriteTemplate gThinRingExpandingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_THIN_RING,
+ .paletteTag = ANIM_TAG_THIN_RING,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sThinRingExpandingAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+static const union AffineAnimCmd sThinRingShrinkingAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(512, 512, 0, 0),
+ AFFINEANIMCMD_FRAME(-16, -16, 0, 30),
+ AFFINEANIMCMD_END_ALT(1),
+};
+
+static const union AffineAnimCmd *const sThinRingShrinkingAffineAnimTable[] =
+{
+ sThinRingShrinkingAffineAnimCmds,
+};
+
+const struct SpriteTemplate gThinRingShrinkingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_THIN_RING,
+ .paletteTag = ANIM_TAG_THIN_RING,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sThinRingShrinkingAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+const struct SpriteTemplate gBlendThinRingExpandingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_THIN_RING,
+ .paletteTag = ANIM_TAG_THIN_RING,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sThinRingExpandingAffineAnimTable,
+ .callback = AnimBlendThinRing,
+};
+
+const struct SpriteTemplate gHyperVoiceRingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_THIN_RING,
+ .paletteTag = ANIM_TAG_THIN_RING,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sHyperVoiceRingAffineAnimTable,
+ .callback = AnimHyperVoiceRing,
+};
+
+const struct SpriteTemplate gUproarRingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_THIN_RING,
+ .paletteTag = ANIM_TAG_THIN_RING,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sThinRingExpandingAffineAnimTable,
+ .callback = AnimUproarRing,
+};
+
+static const union AffineAnimCmd sStretchAttackerAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(96, -13, 0, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AnimCmd sSpeedDustAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(4, 3),
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(4, 3),
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpeedDustAnimTable[] =
+{
+ sSpeedDustAnimCmds,
+};
+
+const struct SpriteTemplate gSpeedDustSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPEED_DUST,
+ .paletteTag = ANIM_TAG_SPEED_DUST,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sSpeedDustAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpeedDust,
+};
+
+static const s8 sSpeedDustPosTable[][2] =
+{
+ {30, 28},
+ {-20, 24},
+ {16, 26},
+ {-10, 28},
+};
+
+static const union AnimCmd sBellAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(16, 6),
+ ANIMCMD_FRAME(32, 15),
+ ANIMCMD_FRAME(16, 6),
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(16, 6, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 15, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 6, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(16, 6),
+ ANIMCMD_FRAME(32, 15),
+ ANIMCMD_FRAME(16, 6),
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sBellAnimTable[] =
+{
+ sBellAnimCmds,
+};
+
+const struct SpriteTemplate gBellSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BELL,
+ .paletteTag = ANIM_TAG_BELL,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sBellAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+const u16 gMusicNotePaletteTagsTable[] =
+{
+ ANIM_TAG_MUSIC_NOTES_2,
+ ANIM_SPRITES_START - 1,
+ ANIM_SPRITES_START - 2,
+};
+
+const struct SpriteTemplate gHealBellMusicNoteSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES_2,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES_2,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimHealBellMusicNote,
+};
+
+const struct SpriteTemplate gMagentaHeartSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MAGENTA_HEART,
+ .paletteTag = ANIM_TAG_MAGENTA_HEART,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMagentaHeart,
+};
+
+static const union AffineAnimCmd sUnknown_83E4200[] =
+{
+ AFFINEANIMCMD_FRAME(10, -13, 0, 10),
+ AFFINEANIMCMD_FRAME(-10, 13, 0, 10),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gRedHeartProjectileSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RED_HEART,
+ .paletteTag = ANIM_TAG_RED_HEART,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimRedHeartProjectile,
+};
+
+const struct SpriteTemplate gRedHeartBurstSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RED_HEART,
+ .paletteTag = ANIM_TAG_RED_HEART,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimParticuleBurst,
+};
+
+const struct SpriteTemplate gRedHeartRisingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RED_HEART,
+ .paletteTag = ANIM_TAG_RED_HEART,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimRedHeartRising,
+};
+
+static const union AffineAnimCmd sHiddenPowerOrbAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_FRAME(8, 8, 0, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd *const sHiddenPowerOrbAffineAnimTable[] =
+{
+ sHiddenPowerOrbAffineAnimCmds,
+};
+
+const struct SpriteTemplate gHiddenPowerOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RED_ORB,
+ .paletteTag = ANIM_TAG_RED_ORB,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sHiddenPowerOrbAffineAnimTable,
+ .callback = AnimOrbitFast,
+};
+
+const struct SpriteTemplate gHiddenPowerOrbScatterSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RED_ORB,
+ .paletteTag = ANIM_TAG_RED_ORB,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sHiddenPowerOrbAffineAnimTable,
+ .callback = AnimOrbitScatter,
+};
+
+static const union AffineAnimCmd sSpitUpOrbAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(128, 128, 0, 0),
+ AFFINEANIMCMD_FRAME(8, 8, 0, 1),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd *const sSpitUpOrbAffineAnimTable[] =
+{
+ sSpitUpOrbAffineAnimCmds,
+};
+
+const struct SpriteTemplate gSpitUpOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RED_ORB_2,
+ .paletteTag = ANIM_TAG_RED_ORB_2,
+ .oam = &gOamData_AffineDouble_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSpitUpOrbAffineAnimTable,
+ .callback = AnimSpitUpOrb,
+};
+
+static const union AnimCmd sEyeSparkleAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sEyeSparkleAnimTable[] =
+{
+ sEyeSparkleAnimCmds,
+};
+
+const struct SpriteTemplate gEyeSparkleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_EYE_SPARKLE,
+ .paletteTag = ANIM_TAG_EYE_SPARKLE,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sEyeSparkleAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimEyeSparkle,
+};
+
+static const union AnimCmd sAngelSpriteAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 24),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sAngelSpriteAnimTable[] =
+{
+ sAngelSpriteAnimCmds,
+};
+
+const struct SpriteTemplate gAngelSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ANGEL,
+ .paletteTag = ANIM_TAG_ANGEL,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sAngelSpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimAngel,
+};
+
+const struct SpriteTemplate gPinkHeartSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PINK_HEART,
+ .paletteTag = ANIM_TAG_PINK_HEART,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimPinkHeart,
+};
+
+static const union AnimCmd sDevilAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sDevilAnimCmds2[] =
+{
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sDevilAnimTable[] =
+{
+ sDevilAnimCmds1,
+ sDevilAnimCmds2,
+};
+
+const struct SpriteTemplate gDevilSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_DEVIL,
+ .paletteTag = ANIM_TAG_DEVIL,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sDevilAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimDevil,
+};
+
+static const union AnimCmd sFurySwipesAnimCmd1[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(48, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sFurySwipesAnimCmd2[] =
+{
+ ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
+ ANIMCMD_FRAME(48, 4, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sFurySwipesAnimTable[] =
+{
+ sFurySwipesAnimCmd1,
+ sFurySwipesAnimCmd2,
+};
+
+const struct SpriteTemplate gFurySwipesSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SWIPE,
+ .paletteTag = ANIM_TAG_SWIPE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sFurySwipesAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimFurySwipes,
+};
+
+static const union AnimCmd sMovementWavesAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sMovementWavesAnimCmds2[] =
+{
+ ANIMCMD_FRAME(16, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(32, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sMovementWavesAnimTable[] =
+{
+ sMovementWavesAnimCmds1,
+ sMovementWavesAnimCmds2,
+};
+
+const struct SpriteTemplate gMovementWavesSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MOVEMENT_WAVES,
+ .paletteTag = ANIM_TAG_MOVEMENT_WAVES,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sMovementWavesAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMovementWaves,
+};
+
+static const union AffineAnimCmd sUproarAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-12, 8, 0, 4),
+ AFFINEANIMCMD_FRAME(20, -20, 0, 4),
+ AFFINEANIMCMD_FRAME(-8, 12, 0, 4),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gJaggedMusicNoteSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_JAGGED_MUSIC_NOTE,
+ .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimJaggedMusicNote,
+};
+
+static const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 0, 5),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -8, 16),
+ AFFINEANIMCMD_END_ALT(1),
+};
+
+static const union AffineAnimCmd sPerishSongMusicNoteAffineAnimCmds3[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 8, 16),
+ AFFINEANIMCMD_END_ALT(1),
+};
+
+static const union AffineAnimCmd *const sPerishSongMusicNoteAffineAnimTable[] =
+{
+ sPerishSongMusicNoteAffineAnimCmds1,
+ sPerishSongMusicNoteAffineAnimCmds2,
+ sPerishSongMusicNoteAffineAnimCmds3,
+};
+
+const struct SpriteTemplate gPerishSongMusicNoteSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES_2,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES_2,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gMusicNotesAnimTable,
+ .images = NULL,
+ .affineAnims = sPerishSongMusicNoteAffineAnimTable,
+ .callback = AnimPerishSongMusicNote,
+};
+
+const struct SpriteTemplate gPerishSongMusicNote2SpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MUSIC_NOTES_2,
+ .paletteTag = ANIM_TAG_MUSIC_NOTES_2,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
+ .anims = gMusicNotesAnimTable,
+ .images = NULL,
+ .affineAnims = sPerishSongMusicNoteAffineAnimTable,
+ .callback = AnimPerishSongMusicNote2,
+};
+
+static const union AffineAnimCmd sGuardRingAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sGuardRingAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(512, 256, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sGuardRingAffineAnimTable[] =
+{
+ sGuardRingAffineAnimCmds1,
+ sGuardRingAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gGuardRingSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GUARD_RING,
+ .paletteTag = ANIM_TAG_GUARD_RING,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sGuardRingAffineAnimTable,
+ .callback = AnimGuardRing,
+};
+
+// Functions
+void sub_80A6E48(struct Sprite *sprite)
+{
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ SetAnimSpriteInitialXOffset(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];
+ StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
+ sprite->callback = TranslateSpriteInEllipseOverDuration;
+ sprite->callback(sprite);
+}
+
+void sub_80A6E98(struct Sprite *sprite)
+{
+ u8 battler;
+
+ if (gBattleAnimArgs[0] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ SetSpriteNextToMonHead(battler, sprite);
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = sub_80A6ED8;
+}
+
+static void sub_80A6ED8(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] == 64)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+static void sub_80A6F3C(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;
+ DestroySpriteAndMatrix(sprite);
+ }
+
+ sprite->data[0]--;
+}
+
+void sub_80A6F8C(struct Sprite *sprite)
+{
+ u8 spriteId;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ spriteId = gBattlerSpriteIds[gBattleAnimTarget];
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ 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] = spriteId;
+ sprite->callback = sub_80A6F3C;
+ sprite->invisible = TRUE;
+}
+
+void sub_80A7020(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[4];
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, sub_80A7058);
+}
+
+static void sub_80A7058(struct Sprite *sprite)
+{
+ sprite->data[0] = sprite->data[1];
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y + 15;
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, sub_80A7080);
+}
+
+static void sub_80A7080(struct Sprite *sprite)
+{
+ if (sprite->data[5] == 0)
+ DestroyAnimSprite(sprite);
+ else
+ sprite->data[5]--;
+}
+
+// Rotates the attacking mon sprite downwards and then back upwards to its original position.
+// No args.
+void AnimTask_Withdraw(u8 taskId)
+{
+ PrepareBattlerSpriteForRotScale(gBattlerSpriteIds[gBattleAnimAttacker], ST_OAM_OBJ_NORMAL);
+ gTasks[taskId].func = AnimTask_WithdrawStep;
+}
+
+static void AnimTask_WithdrawStep(u8 taskId)
+{
+ u8 spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ s16 rotation;
+
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ rotation = -gTasks[taskId].data[0];
+ else
+ rotation = gTasks[taskId].data[0];
+
+ SetSpriteRotScale(spriteId, 0x100, 0x100, rotation);
+ if (gTasks[taskId].data[1] == 0)
+ {
+ gTasks[taskId].data[0] += 0xB0;
+ // this y position update gets overwritten by SetBattlerSpriteYOffsetFromRotation()
+ gSprites[spriteId].pos2.y++;
+ }
+ else if (gTasks[taskId].data[1] == 1)
+ {
+ if (++gTasks[taskId].data[3] == 30)
+ gTasks[taskId].data[1] = 2;
+
+ return;
+ }
+ else
+ {
+ gTasks[taskId].data[0] -= 0xB0;
+ // this y position update gets overwritten by SetBattlerSpriteYOffsetFromRotation()
+ gSprites[spriteId].pos2.y--;
+ }
+
+ SetBattlerSpriteYOffsetFromRotation(spriteId);
+ if (gTasks[taskId].data[0] == 0xF20 || gTasks[taskId].data[0] == 0)
+ {
+ if (gTasks[taskId].data[1] == 2)
+ {
+ ResetSpriteRotScale(spriteId);
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[1]++;
+ }
+ }
+}
+
+// Animates a "zap of energy" used in KINESIS.
+// arg 0: x pixel offset
+// arg 1: y pixel offset
+// arg 2: vertical flip
+void Anim_KinesisZapEnergy(struct Sprite *sprite)
+{
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ else
+ sprite->pos1.x += gBattleAnimArgs[0];
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ sprite->hFlip = TRUE;
+ if (gBattleAnimArgs[2])
+ sprite->vFlip = TRUE;
+ }
+ else
+ {
+ if (gBattleAnimArgs[2])
+ sprite->vFlip = TRUE;
+ }
+
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+// Animates a sword that rises into the air after a brief pause.
+// arg 0: x pixel offset
+// arg 1: y pixel offset
+void Anim_SwordsDanceBlade(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+ StoreSpriteCallbackInData6(sprite, AnimSwordsDanceBladeStep);
+}
+
+static void AnimSwordsDanceBladeStep(struct Sprite *sprite)
+{
+ sprite->data[0] = 6;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y - 32;
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+// Moves a projectile towards the target mon. The sprite is rotated to be pointing
+// in the same direction it's moving.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x pixel offset
+// arg 3: target y pixel offset
+// arg 4: duration
+void AnimSonicBoomProjectile(struct Sprite *sprite)
+{
+ s16 targetXPos;
+ s16 targetYPos;
+ u16 rotation;
+
+ if (IsContest())
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ else if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ targetXPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
+ targetYPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
+ rotation = ArcTan2Neg(targetXPos - sprite->pos1.x, targetYPos - sprite->pos1.y);
+ rotation += 0xF000;
+ if (IsContest())
+ rotation -= 0x6000;
+
+ TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation);
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = targetXPos;
+ sprite->data[4] = targetYPos;
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+static void AnimAirWaveProjectile_Step2(struct Sprite *sprite)
+{
+ if (sprite->data[0]-- <= 0)
+ {
+ gTasks[sprite->data[7]].data[1]--;
+ DestroySprite(sprite);
+ }
+}
+
+static void AnimAirWaveProjectile_Step1(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 = AnimAirWaveProjectile_Step2;
+ }
+}
+
+void AnimAirWaveProjectile(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_80D8B90(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_80D8AA0(sub_80D8AA0(b, a), sub_80D8B90(0x1C0));
+ sprite->data[4] = sub_80D8AA0(sub_80D8AA0(c, a), sub_80D8B90(0x1C0));
+ sprite->callback = AnimAirWaveProjectile_Step1;
+ }
+}
+
+static void AirCutterProjectileStep2(u8 taskId)
+{
+ if (gTasks[taskId].data[1] == 0)
+ DestroyAnimVisualTask(taskId);
+}
+
+static void AirCutterProjectileStep1(u8 taskId)
+{
+ if (gTasks[taskId].data[0]-- <= 0)
+ {
+ u8 spriteId;
+ struct Sprite *sprite;
+ spriteId = CreateSprite(&gAirWaveProjectileSpriteTemplate, 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 |= (ST_OAM_HFLIP | ST_OAM_VFLIP);
+ break;
+ case 2:
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
+ 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(SE_W059B, BattleAnimAdjustPanning(-SOUND_PAN_TARGET));
+ if (gTasks[taskId].data[1] > 2)
+ gTasks[taskId].func = AirCutterProjectileStep2;
+ }
+}
+
+void AnimTask_AirCutterProjectile(u8 taskId)
+{
+ s16 attackerY = 0;
+ s16 attackerX = 0;
+ s16 targetX = 0;
+ s16 targetY = 0;
+ s16 xDiff, yDiff;
+
+ if (IsContest())
+ {
+ gTasks[taskId].data[4] = 2;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ else
+ {
+ if ((gBattlerPositions[gBattleAnimTarget] & BIT_SIDE) == B_SIDE_PLAYER)
+ {
+ gTasks[taskId].data[4] = 1;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ }
+
+ attackerX = gTasks[taskId].data[9] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ attackerY = gTasks[taskId].data[10] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))
+ {
+ SetAverageBattlerPositions(gBattleAnimTarget, 0, &targetX, &targetY);
+ }
+ else
+ {
+ targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
+ }
+
+ targetX = gTasks[taskId].data[11] = targetX + gBattleAnimArgs[0];
+ targetY = gTasks[taskId].data[12] = targetY + gBattleAnimArgs[1];
+ if (targetX >= attackerX)
+ xDiff = targetX - attackerX;
+ else
+ xDiff = attackerX - targetX;
+
+ gTasks[taskId].data[5] = sub_80D8AA0(xDiff, sub_80D8B90(gBattleAnimArgs[2] & ~1));
+ gTasks[taskId].data[6] = sub_80D8AA0(gTasks[taskId].data[5], 0x80);
+ gTasks[taskId].data[7] = gBattleAnimArgs[2];
+ if (targetY >= attackerY)
+ {
+ yDiff = targetY - attackerY;
+ gTasks[taskId].data[8] = sub_80D8AA0(yDiff, sub_80D8B90(gTasks[taskId].data[5])) & ~1;
+ }
+ else
+ {
+ yDiff = attackerY - targetY;
+ gTasks[taskId].data[8] = sub_80D8AA0(yDiff, sub_80D8B90(gTasks[taskId].data[5])) | 1;
+ }
+
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ if (gBattleAnimArgs[4] & 0x80)
+ {
+ gBattleAnimArgs[4] ^= 0x80;
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = GetBattlerSpriteSubpriority(gBattleAnimTarget) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+
+ if (gTasks[taskId].data[2] < 3)
+ gTasks[taskId].data[2] = 3;
+
+ gTasks[taskId].func = AirCutterProjectileStep1;
+}
+
+void sub_80A79E8(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(sUnknown_83E3D18.paletteTag) << 4);
+ sprite->callback = sub_80A7A18;
+}
+
+static void sub_80A7A18(struct Sprite *sprite)
+{
+ u16 id, val;
+ int i;
+
+ if (++sprite->data[1] == 2)
+ {
+ sprite->data[1] = 0;
+ id = sprite->data[0];
+ val = gPlttBufferFaded[8 + id];
+ for (i = 8; i < 16; i++)
+ gPlttBufferFaded[i + id] = gPlttBufferFaded[i + id + 1];
+
+ gPlttBufferFaded[id + 15] = val;
+
+ if (++sprite->data[2] == 24)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimCoinThrow(struct Sprite *sprite)
+{
+ s16 r6;
+ s16 r7;
+ u16 var;
+
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ r6 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ r7 = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ r6 += gBattleAnimArgs[2];
+ var = ArcTan2Neg(r6 - sprite->pos1.x, r7 - sprite->pos1.y);
+ var += 0xC000;
+ TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, var);
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = r6;
+ sprite->data[4] = r7;
+ sprite->callback = sub_80756A4;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void AnimFallingCoin(struct Sprite *sprite)
+{
+ sprite->data[2] = -16;
+ sprite->pos1.y += 8;
+ sprite->callback = AnimFallingCoin_Step;
+}
+
+static void AnimFallingCoin_Step(struct Sprite *sprite)
+{
+ sprite->data[0] += 0x80;
+ sprite->pos2.x = sprite->data[0] >> 8;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ sprite->pos2.x = -sprite->pos2.x;
+
+ sprite->pos2.y = Sin(sprite->data[1], sprite->data[2]);
+ sprite->data[1] += 5;
+ if (sprite->data[1] > 126)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] /= 2;
+ if (++sprite->data[3] == 2)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimBulletSeed(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->data[0] = 20;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->callback = StartAnimLinearTranslation;
+ sprite->affineAnimPaused = TRUE;
+ StoreSpriteCallbackInData6(sprite, AnimBulletSeed_Step1);
+}
+
+static void AnimBulletSeed_Step1(struct Sprite *sprite)
+{
+ int i;
+ u16 rand;
+ s16* ptr;
+
+ PlaySE12WithPanning(SE_W030, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+ 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 = AnimBulletSeed_Step2;
+ sprite->affineAnimPaused = FALSE;
+}
+
+static void AnimBulletSeed_Step2(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] > 126)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] /= 2;
+ if (++sprite->data[3] == 1)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Moves a tornado in a circlular motion.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: wave amplitude
+// arg 3: unused
+// arg 4: initial wave offset
+// arg 5: wave period (higher means faster wave)
+// arg 6: duration
+void AnimRazorWindTornado(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ 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 = TranslateSpriteInCircleOverDuration;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback(sprite);
+}
+
+// Animates a single pincer line that extends towards the center of the target mon.
+// arg 0: invert
+void AnimViceGripPincer(struct Sprite *sprite)
+{
+ s16 startXOffset = 32;
+ s16 startYOffset = -32;
+ s16 endXOffset = 16;
+ s16 endYOffset = -16;
+
+ if (gBattleAnimArgs[0])
+ {
+ startXOffset = -32;
+ startYOffset = 32;
+ endXOffset = -16;
+ endYOffset = 16;
+ StartSpriteAnim(sprite, 1);
+ }
+
+ sprite->pos1.x += startXOffset;
+ sprite->pos1.y += startYOffset;
+ sprite->data[0] = 6;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + endXOffset;
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + endYOffset;
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, AnimViceGripPincerStep);
+}
+
+static void AnimViceGripPincerStep(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+// Animates a single pincer line that extends towards the center of the target mon, and then back out.
+// arg 0: animation id
+void AnimGuillotinePincer(struct Sprite *sprite)
+{
+ s16 startXOffset = 32;
+ s16 startYOffset = -32;
+ s16 endXOffset = 16;
+ s16 endYOffset = -16;
+
+ if (gBattleAnimArgs[0])
+ {
+ startXOffset = -32;
+ startYOffset = 32;
+ endXOffset = -16;
+ endYOffset = 16;
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ }
+
+ sprite->pos1.x += startXOffset;
+ sprite->pos1.y += startYOffset;
+ sprite->data[0] = 6;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + endXOffset;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + endYOffset;
+ InitAnimLinearTranslation(sprite);
+ sprite->data[5] = gBattleAnimArgs[0];
+ sprite->data[6] = sprite->data[0];
+ sprite->callback = AnimGuillotinePincerStep1;
+}
+
+static void AnimGuillotinePincerStep1(struct Sprite *sprite)
+{
+ if (AnimTranslateLinear(sprite) && sprite->animEnded)
+ {
+ SeekSpriteAnim(sprite, 0);
+ sprite->animPaused = TRUE;
+ 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 = AnimGuillotinePincerStep2;
+ }
+}
+
+static void AnimGuillotinePincerStep2(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] == 51)
+ {
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ sprite->animPaused = FALSE;
+ StartSpriteAnim(sprite, sprite->data[5] ^ 1);
+ sprite->callback = AnimGuillotinePincerStep3;
+ }
+}
+
+static void AnimGuillotinePincerStep3(struct Sprite *sprite)
+{
+ if (AnimTranslateLinear(sprite))
+ DestroyAnimSprite(sprite);
+}
+
+// Scales up the target mon sprite, and sets the palette to greyscale.
+// Used in MOVE_DISABLE.
+// No args.
+void AnimTask_GrowAndGreyscale(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+
+ PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND);
+ SetSpriteRotScale(spriteId, 0xD0, 0xD0, 0);
+ SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, FALSE);
+ gTasks[taskId].data[0] = 80;
+ gTasks[taskId].func = AnimTask_GrowAndGreyscaleStep;
+}
+
+static void AnimTask_GrowAndGreyscaleStep(u8 taskId)
+{
+ if (--gTasks[taskId].data[0] == -1)
+ {
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+ ResetSpriteRotScale(spriteId);
+ SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, TRUE);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// Shrinks and grows the attacking mon several times. Also creates transparent versions of the
+// mon's sprite while it is shrinking.
+// No args.
+void AnimTask_Minimize(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ task->data[0] = spriteId;
+ PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);
+ 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] = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
+ task->func = AnimTask_MinimizeStep1;
+}
+
+static void AnimTask_MinimizeStep1(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)
+ CreateMinimizeSprite(task, taskId);
+ task->data[2]++;
+ task->data[4] += 0x28;
+ SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0);
+ SetBattlerSpriteYOffsetFromYScale(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;
+ SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0);
+ SetBattlerSpriteYOffsetFromYScale(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;
+ SetSpriteRotScale(task->data[0], task->data[4], task->data[4], 0);
+ SetBattlerSpriteYOffsetFromYScale(task->data[0]);
+ if (task->data[2] == 32)
+ {
+ task->data[2] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 5:
+ ResetSpriteRotScale(task->data[0]);
+ gSprites[task->data[15]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void CreateMinimizeSprite(struct Task* task, u8 taskId)
+{
+ u16 matrixNum;
+ s16 spriteId = CloneBattlerSpriteWithBlend(ANIM_ATTACKER);
+
+ if (spriteId >= 0)
+ {
+ if ((matrixNum = AllocOamMatrix()) == 0xFF)
+ {
+ obj_delete_but_dont_free_vram(&gSprites[spriteId]);
+ }
+ else
+ {
+ gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ gSprites[spriteId].affineAnimPaused = TRUE;
+ gSprites[spriteId].oam.matrixNum = matrixNum;
+ gSprites[spriteId].subpriority = task->data[7] - task->data[3];
+ task->data[3]++;
+ task->data[6]++;
+ gSprites[spriteId].data[0] = 16;
+ gSprites[spriteId].data[1] = taskId;
+ gSprites[spriteId].data[2] = 6;
+ gSprites[spriteId].callback = ClonedMinizeSprite_Step;
+ SetSpriteRotScale(spriteId, task->data[4], task->data[4], 0);
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
+ CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);
+ }
+ }
+}
+
+static void ClonedMinizeSprite_Step(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);
+ }
+}
+
+// Task to facilitate expanding and hopping effect seen in Splash.
+// arg 0: anim battler
+// arg 1: num hops
+void AnimTask_Splash(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ if (gBattleAnimArgs[1] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ task->data[2] = gBattleAnimArgs[1];
+ task->data[3] = 0;
+ task->data[4] = 0;
+ PrepareAffineAnimInTaskData(task, spriteId, sSplashEffectAffineAnimCmds);
+ task->func = AnimTask_SplashStep;
+ }
+}
+
+static void AnimTask_SplashStep(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[1])
+ {
+ case 0:
+ RunAffineAnimFromTaskData(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:
+ RunAffineAnimFromTaskData(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 (!RunAffineAnimFromTaskData(task))
+ {
+ if (--task->data[2] == 0)
+ {
+ gSprites[task->data[0]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ PrepareAffineAnimInTaskData(task, task->data[0], sSplashEffectAffineAnimCmds);
+ task->data[1] = 0;
+ }
+ }
+ break;
+ }
+}
+
+// Grows, pauses, then shrinks the attacking mon.
+// Used by MOVE_SWAGGER and MOVE_BULK_UP
+// No args.
+void AnimTask_GrowAndShrink(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ PrepareAffineAnimInTaskData(task, spriteId, sGrowAndShrinkAffineAnimCmds);
+ task->func = AnimTask_GrowAndShrinkStep;
+}
+
+static void AnimTask_GrowAndShrinkStep(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ if (!RunAffineAnimFromTaskData(task))
+ DestroyAnimVisualTask(taskId);
+}
+
+// Animates a little puff of the mon's breath.
+// Used by MOVE_SWAGGER and MOVE_BULK_UP
+// No args.
+void AnimBreathPuff(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + 32;
+ sprite->data[1] = 64;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - 32;
+ sprite->data[1] = -64;
+ }
+
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[0] = 52;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = TranslateSpriteLinearFixedPoint;
+}
+
+// Animates an "angry" mark above a mon's head.
+// arg 0: target mon (0 = attacker, 1 = target)
+// arg 1: x pixel offset
+// arg 2: y pixel offset
+void AnimAngerMark(struct Sprite *sprite)
+{
+ u8 battler;
+
+ if (!gBattleAnimArgs[0])
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
+ gBattleAnimArgs[1] *= -1;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
+ if (sprite->pos1.y < 8)
+ sprite->pos1.y = 8;
+
+ StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
+ sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
+}
+
+// left/right movements
+void AnimTask_ThrashMoveMonHorizontal(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ PrepareAffineAnimInTaskData(task, spriteId, sThrashMoveMonAffineAnimCmds);
+ task->func = ThrashMoveMonStep;
+}
+
+static void ThrashMoveMonStep(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ if (!RunAffineAnimFromTaskData(task))
+ DestroyAnimVisualTask(taskId);
+}
+
+// up/down movements
+void AnimTask_ThrashMoveMonVertical(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ 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 (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ task->data[2] *= -1;
+
+ task->func = ThrashMoveMon;
+}
+
+static void ThrashMoveMon(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ if (++task->data[7] > 2)
+ {
+ task->data[7] = 0;
+ task->data[8]++;
+ if (task->data[8] & 1)
+ 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_80A8874(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ struct ScanlineEffectParams params;
+ s16 i;
+
+ task->data[0] = GetBattlerYCoordWithElevation(gBattleAnimTarget) + 32;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[5] = 0;
+ task->data[15] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT);
+
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)
+ {
+ task->data[6] = gBattle_BG1_X;
+ params.dmaDest = (u16 *)REG_ADDR_BG1HOFS;
+ }
+ else
+ {
+ task->data[6] = gBattle_BG2_X;
+ params.dmaDest = (u16 *)REG_ADDR_BG2HOFS;
+ }
+
+ for (i = task->data[0] - 0x40; i <= task->data[0]; i++)
+ {
+ if (i >= 0)
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[6] + 0xF0;
+ gScanlineEffectRegBuffers[1][i] = task->data[6] + 0xF0;
+ }
+ }
+
+ params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ params.initState = 1;
+ params.unused9 = 0;
+ ScanlineEffect_SetParams(params);
+ task->func = AnimTask_SketchDrawMon;
+}
+
+static void AnimTask_SketchDrawMon(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)
+ {
+ gScanlineEffectRegBuffers[0][task->data[5]] = task->data[6];
+ gScanlineEffectRegBuffers[1][task->data[5]] = task->data[6];
+ }
+
+ if (++task->data[3] >= task->data[15])
+ {
+ gScanlineEffect.state = 3;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ break;
+ }
+}
+
+void AnimPencil(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) - 16;
+ sprite->pos1.y = GetBattlerYCoordWithElevation(gBattleAnimTarget) + 16;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 16;
+ sprite->data[4] = 0;
+ sprite->data[5] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) + 2;
+ sprite->data[6] = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
+ sprite->callback = AnimPencil_Step;
+}
+
+static void AnimPencil_Step(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 = FALSE;
+ 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(SE_W166, 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 = FALSE;
+ DestroyAnimSprite(sprite);
+ }
+ break;
+ }
+}
+
+void AnimBlendThinRing(struct Sprite *sprite)
+{
+ u8 battler = 0;
+ u16 sp0 = 0;
+ u16 sp1 = 0;
+ u8 r4;
+
+ if (gBattleAnimArgs[2] == 0)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ r4 = gBattleAnimArgs[3] ^ 1;
+ if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler)))
+ {
+ SetAverageBattlerPositions(battler, r4, &sp0, &sp1);
+ if (r4 == 0)
+ r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);
+ else
+ r4 = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2);
+
+ if (GetBattlerSide(battler) != B_SIDE_PLAYER)
+ gBattleAnimArgs[0] -= (sp0 - r4) - gBattleAnimArgs[0];
+ else
+ gBattleAnimArgs[0] = sp0 - r4;
+ }
+
+ sprite->callback = AnimSpriteOnMonPos;
+ sprite->callback(sprite);
+}
+
+void sub_80A8C84(struct Sprite *sprite)
+{
+ if (AnimTranslateLinear(sprite))
+ {
+ FreeSpriteOamMatrix(sprite);
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimHyperVoiceRing(struct Sprite *sprite)
+{
+ u16 r9 = 0;
+ u16 r6 = 0;
+ s16 sp0 = 0;
+ s16 sp1 = 0;
+ u8 sp4;
+ u8 battler1;
+ u8 battler2;
+ u8 r10;
+
+ if (gBattleAnimArgs[5] == 0)
+ {
+ battler1 = gBattleAnimAttacker;
+ battler2 = gBattleAnimTarget;
+ }
+ else
+ {
+ battler1 = gBattleAnimTarget;
+ battler2 = gBattleAnimAttacker;
+ }
+
+ if (!gBattleAnimArgs[6])
+ {
+ r10 = 0;
+ sp4 = 1;
+ }
+ else
+ {
+ r10 = 2;
+ sp4 = 3;
+ }
+
+ if (GetBattlerSide(battler1) != B_SIDE_PLAYER)
+ {
+ r9 = GetBattlerSpriteCoord(battler1, r10) + gBattleAnimArgs[0];
+ if (IsBattlerSpriteVisible(BATTLE_PARTNER(battler2)))
+ sprite->subpriority = gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler2)]].subpriority - 1;
+ else
+ sprite->subpriority = gSprites[gBattlerSpriteIds[battler2]].subpriority - 1;
+ }
+ else
+ {
+ r9 = GetBattlerSpriteCoord(battler1, r10) - gBattleAnimArgs[0];
+ if (!IsContest() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler1)))
+ {
+ if (gSprites[gBattlerSpriteIds[battler1]].pos1.x < gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler1)]].pos1.x)
+ sprite->subpriority = gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler1)]].subpriority + 1;
+ else
+ sprite->subpriority = gSprites[gBattlerSpriteIds[battler1]].subpriority - 1;
+ }
+ else
+ {
+ sprite->subpriority = gSprites[gBattlerSpriteIds[battler1]].subpriority - 1;
+ }
+
+ }
+
+ r6 = GetBattlerSpriteCoord(battler1, sp4) + gBattleAnimArgs[1];
+ if (!IsContest() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler2)))
+ {
+ SetAverageBattlerPositions(battler2, gBattleAnimArgs[6], &sp0, &sp1);
+ }
+ else
+ {
+ sp0 = GetBattlerSpriteCoord(battler2, r10);
+ sp1 = GetBattlerSpriteCoord(battler2, sp4);
+ }
+
+ if (GetBattlerSide(battler2) != B_SIDE_PLAYER)
+ 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];
+ InitAnimLinearTranslation(sprite);
+ sprite->callback = sub_80A8C84;
+ sprite->callback(sprite);
+}
+
+void AnimUproarRing(struct Sprite *sprite)
+{
+ u8 index = IndexOfSpritePaletteTag(ANIM_TAG_THIN_RING);
+
+ if (index != 0xFF)
+ {
+ BlendPalette(((index << 20) + 0x1010000) >> 16, 15, gBattleAnimArgs[5], gBattleAnimArgs[4]);
+ }
+
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = AnimSpriteOnMonPos;
+ sprite->callback(sprite);
+}
+
+void AnimSoftBoiledEgg(struct Sprite *sprite)
+{
+ s16 r1;
+
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ r1 = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? -160 : 160;
+ sprite->data[0] = 0x380;
+ sprite->data[1] = r1;
+ sprite->data[7] = gBattleAnimArgs[2];
+ sprite->callback = AnimSoftBoiledEgg_Step1;
+}
+
+static void AnimSoftBoiledEgg_Step1(struct Sprite *sprite)
+{
+ s16 add;
+
+ sprite->pos2.y -= (sprite->data[0] >> 8);
+ sprite->pos2.x = sprite->data[1] >> 8;
+ sprite->data[0] -= 32;
+ add = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? -160 : 160;
+ 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 = AnimSoftBoiledEgg_Step2;
+ }
+}
+
+static void AnimSoftBoiledEgg_Step2(struct Sprite *sprite)
+{
+ if (sprite->data[0]++ > 19)
+ {
+ StartSpriteAffineAnim(sprite, 2);
+ sprite->callback = AnimSoftBoiledEgg_Step3;
+ }
+}
+
+static void AnimSoftBoiledEgg_Step3(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0] = 0;
+ if (sprite->data[7] == 0)
+ {
+ sprite->oam.tileNum += 16;
+ sprite->callback = AnimSoftBoiledEgg_Step3_Callback1;
+ }
+ else
+ {
+ sprite->oam.tileNum += 32;
+ sprite->callback = AnimSoftBoiledEgg_Step4;
+ }
+ }
+}
+
+static void AnimSoftBoiledEgg_Step3_Callback1(struct Sprite *sprite)
+{
+ sprite->pos2.y -= 2;
+ if (++sprite->data[0] == 9)
+ {
+ sprite->data[0] = 16;
+ sprite->data[1] = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND((u16)sprite->data[0], 0));
+ sprite->callback = AnimSoftBoiledEgg_Step3_Callback2;
+ }
+}
+
+static void AnimSoftBoiledEgg_Step3_Callback2(struct Sprite *sprite)
+{
+ if (sprite->data[1]++ % 3 == 0)
+ {
+ sprite->data[0]--;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));
+ if (sprite->data[0] == 0)
+ sprite->callback = AnimSoftBoiledEgg_Step4;
+ }
+}
+
+static void AnimSoftBoiledEgg_Step4(struct Sprite *sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->invisible = TRUE;
+ if (sprite->data[7] == 0)
+ sprite->callback = AnimSoftBoiledEgg_Step4_Callback;
+ else
+ sprite->callback = DestroyAnimSprite;
+ }
+}
+
+static void AnimSoftBoiledEgg_Step4_Callback(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTask_StretchAttacker(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ task->data[0] = spriteId;
+ PrepareAffineAnimInTaskData(task, spriteId, sStretchAttackerAffineAnimCmds);
+ task->func = StretchAttacker_Step;
+}
+
+static void StretchAttacker_Step(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ if (!RunAffineAnimFromTaskData(task))
+ {
+ gSprites[task->data[0]].pos2.y = 0;
+ gSprites[task->data[0]].invisible = TRUE;
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void AnimTask_ExtremeSpeedImpact(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 (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ task->data[13] = 0xFFFF;
+ task->data[14] = 8;
+ }
+ else
+ {
+ task->data[13] = 1;
+ task->data[14] = -8;
+ }
+
+ task->data[15] = GetAnimBattlerSpriteId(ANIM_TARGET);
+ task->func = ExtremeSpeedImpact_Step;
+}
+
+static void ExtremeSpeedImpact_Step(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 AnimTask_ExtremeSpeedMonReappear(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] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ task->func = ExtremeSpeedMonReappear_Step;
+}
+
+static void ExtremeSpeedMonReappear_Step(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 = FALSE;
+ else
+ gSprites[task->data[15]].invisible = TRUE;
+
+ 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 = FALSE;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ }
+}
+
+void AnimTask_SpeedDust(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] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ task->data[15] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ task->func = SpeedDust_Step1;
+}
+
+static void SpeedDust_Step1(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(&gSpeedDustSpriteTemplate, 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 = sSpeedDustPosTable[task->data[2]][0];
+ gSprites[spriteId].pos2.y = sSpeedDustPosTable[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 AnimSpeedDust(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_80A96B4(u8 taskId)
+{
+ int i;
+ u8 paletteNums[3];
+
+ paletteNums[0] = IndexOfSpritePaletteTag(ANIM_TAG_MUSIC_NOTES_2);
+ for (i = 1; i < 3; i++)
+ paletteNums[i] = AllocSpritePalette(ANIM_SPRITES_START - i);
+
+ gMonSpritesGfxPtr->field_17C = AllocZeroed(0x2000);
+ LZDecompressWram(gBattleAnimSpritePal_MusicNotes2, gMonSpritesGfxPtr->field_17C);
+ for (i = 0; i < 3; i++)
+ LoadPalette(&gMonSpritesGfxPtr->field_17C[i * 32], (u16)((paletteNums[i] << 4) + 0x100), 32);
+
+ FREE_AND_SET_NULL(gMonSpritesGfxPtr->field_17C);
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80A9760(u8 taskId)
+{
+ int i;
+
+ for (i = 0; i < 3; i++)
+ FreeSpritePaletteByTag(gMusicNotePaletteTagsTable[i]);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+static void SetMusicNotePalette(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(gMusicNotePaletteTagsTable[b >> 1]);
+}
+
+void AnimHealBellMusicNote(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[3];
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ SetMusicNotePalette(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]);
+}
+
+void AnimMagentaHeart(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 1)
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+
+ 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] == 60)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTask_FakeOut(u8 taskId)
+{
+ u16 win0h = IsContest() ? 0x98 : 0xF0;
+ u16 win0v = 0;
+
+ gBattle_WIN0H = win0h;
+ gBattle_WIN0V = 0xA0;
+ SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H);
+ SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_CLR | WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL);
+ SetGpuReg(REG_OFFSET_WINOUT, WININ_WIN1_CLR | WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN);
+ SetGpuReg(REG_OFFSET_BLDY, BLDCNT_TGT1_OBJ);
+ gTasks[taskId].data[0] = win0v;
+ gTasks[taskId].data[1] = win0h;
+ gTasks[taskId].func = FakeOutStep1;
+}
+
+static void FakeOutStep1(u8 taskId)
+{
+ gTasks[taskId].data[0] += 13;
+ gTasks[taskId].data[1] -= 13;
+ if (gTasks[taskId].data[0] >= gTasks[taskId].data[1])
+ {
+ gBattle_WIN0H = 0;
+ gTasks[taskId].func = FakeOutStep2;
+ }
+ else
+ {
+ gBattle_WIN0H = gTasks[taskId].data[1] | (gTasks[taskId].data[0] << 8);
+ }
+}
+
+static void FakeOutStep2(u8 taskId)
+{
+ if (++gTasks[taskId].data[10] == 5)
+ {
+ gTasks[taskId].data[11] = 0x88;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_LIGHTEN);
+ BlendPalettes(sub_8075BE8(1, 0, 0, 0, 0, 0, 0), 16, RGB_WHITE);
+ }
+ else if (gTasks[taskId].data[10] > 4)
+ {
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80A9A20(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
+
+ if (++gTasks[taskId].data[0] == 1)
+ {
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_TARGET), sUnknown_83E4200);
+ gSprites[spriteId].pos2.x = 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void sub_80A9AB0(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ if (++gTasks[taskId].data[0] == 1)
+ {
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sUnknown_83E4200);
+ gSprites[spriteId].pos2.x = 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void AnimRedHeartProjectile(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->data[0] = 95;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ InitAnimLinearTranslation(sprite);
+ sprite->callback = AnimRedHeartProjectile_Step;
+}
+
+static void AnimRedHeartProjectile_Step(struct Sprite *sprite)
+{
+ if (!AnimTranslateLinear(sprite))
+ {
+ sprite->pos2.y += Sin(sprite->data[5], 14);
+ sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimParticuleBurst(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] > 100)
+ sprite->invisible = sprite->data[3] % 2;
+
+ if (sprite->data[3] > 120)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimRedHeartRising(struct Sprite *sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = 160;
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimRedHeartRising_Step);
+}
+
+static void AnimRedHeartRising_Step(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 <= 72)
+ {
+ sprite->invisible = sprite->data[3] % 2;
+ if (y <= 64)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimTask_HeartsBackground(u8 taskId)
+{
+ struct BattleAnimBgData animBg;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 3);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+ sub_80752A0(&animBg);
+ AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBg_AttractTilemap);
+ AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBg_AttractGfx, animBg.tilesOffset);
+ LoadCompressedPalette(gBattleAnimBg_AttractPal, animBg.paletteId * 16, 32);
+ if (IsContest())
+ sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0);
+
+ gTasks[taskId].func = HeartsBackground_Step;
+}
+
+static void HeartsBackground_Step(u8 taskId)
+{
+ struct BattleAnimBgData animBg;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 16)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 141)
+ {
+ 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]--;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_80752A0(&animBg);
+ sub_8075358(animBg.bgId);
+ gTasks[taskId].data[12]++;
+ break;
+ case 4:
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void AnimTask_ScaryFace(u8 taskId)
+{
+ struct BattleAnimBgData animBg;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
+ SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
+ sub_80752A0(&animBg);
+
+ if (IsContest())
+ LZDecompressVram(gBattleAnimBgTilemap_ScaryFaceContest, animBg.bgTilemap);
+ else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
+ AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_ScaryFacePlayer);
+ else
+ AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimBgTilemap_ScaryFaceOpponent);
+
+ AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_ScaryFaceGfx, animBg.tilesOffset);
+ LoadCompressedPalette(gBattleAnim_ScaryFacePal, animBg.paletteId * 16, 32);
+ if (IsContest())
+ sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0);
+
+ gTasks[taskId].func = ScaryFace_Step;
+}
+
+static void ScaryFace_Step(u8 taskId)
+{
+ struct BattleAnimBgData animBg;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 2)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 14)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 21)
+ {
+ 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]--;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_80752A0(&animBg);
+ sub_8075358(1);
+ sub_8075358(2);
+ gTasks[taskId].data[12]++;
+ // fall through
+ case 4:
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Orbits a sphere in an ellipse around the mon.
+// Used by MOVE_HIDDEN_POWER
+// arg 0: duration
+// arg 1: initial wave offset
+void AnimOrbitFast(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->affineAnimPaused = TRUE;
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[7] = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
+ sprite->callback = AnimOrbitFastStep;
+ sprite->callback(sprite);
+}
+
+static void AnimOrbitFastStep(struct Sprite *sprite)
+{
+ if (sprite->data[1] >= 64 && sprite->data[1] <= 191)
+ 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)
+ DestroyAnimSprite(sprite);
+}
+
+// Moves orbs away from the mon, based on where they are in their orbit.
+// Used in MOVE_HIDDEN_POWER.
+// arg 0: initial wave offset
+void AnimOrbitScatter(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
+ sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
+ sprite->callback = AnimOrbitScatterStep;
+}
+
+static void AnimOrbitScatterStep(struct Sprite *sprite)
+{
+ sprite->pos2.x += sprite->data[0];
+ sprite->pos2.y += sprite->data[1];
+ if (sprite->pos1.x + sprite->pos2.x + 16 > 272u || sprite->pos1.y + sprite->pos2.y > 160 || sprite->pos1.y + sprite->pos2.y < -16)
+ DestroyAnimSprite(sprite);
+}
+
+static void AnimSpitUpOrb_Step(struct Sprite *sprite)
+{
+ sprite->pos2.x += sprite->data[0];
+ sprite->pos2.y += sprite->data[1];
+ if (sprite->data[3]++ >= sprite->data[2])
+ DestroyAnimSprite(sprite);
+}
+
+void AnimSpitUpOrb(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
+ sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->callback = AnimSpitUpOrb_Step;
+}
+
+static void sub_80AA3D4(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimEyeSparkle(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->callback = sub_80AA3D4;
+}
+
+void AnimAngel(struct Sprite *sprite)
+{
+ s16 var0;
+
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->data[0]++;
+ var0 = (sprite->data[0] * 10) & 0xFF;
+ sprite->pos2.x = Sin(var0, 80) >> 8;
+ if (sprite->data[0] < 80)
+ sprite->pos2.y = (sprite->data[0] / 2) + (Cos(var0, 80) >> 8);
+
+ if (sprite->data[0] > 90)
+ {
+ sprite->data[2]++;
+ sprite->pos2.x -= sprite->data[2] / 2;
+ }
+
+ if (sprite->data[0] > 100)
+ DestroyAnimSprite(sprite);
+}
+
+static void sub_80AA49C(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)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimPinkHeart(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] > 70)
+ {
+ sprite->callback = sub_80AA49C;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[3] = Random() % 180;
+ }
+ }
+}
+
+void AnimDevil(struct Sprite *sprite)
+{
+ if (sprite->data[3] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, 0);
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1;
+ sprite->data[2] = 1;
+ }
+ sprite->data[0] += sprite->data[2];
+ sprite->data[1] = (sprite->data[0] * 4) % 256;
+ if (sprite->data[1] < 0)
+ sprite->data[1] = 0;
+ sprite->pos2.x = Cos(sprite->data[1], 30 - sprite->data[0] / 4);
+ sprite->pos2.y = Sin(sprite->data[1], 10 - sprite->data[0] / 8);
+ if (sprite->data[1] > 128 && sprite->data[2] > 0)
+ sprite->data[2] = -1;
+ if (sprite->data[1] == 0 && sprite->data[2] < 0)
+ sprite->data[2] = 1;
+ sprite->data[3]++;
+ if (sprite->data[3] < 10 || sprite->data[3] > 80)
+ sprite->invisible = sprite->data[0] % 2;
+ else
+ sprite->invisible = FALSE;
+ if (sprite->data[3] > 90)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimFurySwipes(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[0]++;
+ }
+ else if (sprite->animEnded)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimMovementWaves(struct Sprite *sprite)
+{
+ if (!gBattleAnimArgs[2])
+ {
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ if (!gBattleAnimArgs[0])
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ }
+
+ if (!gBattleAnimArgs[1])
+ sprite->pos1.x += 32;
+ else
+ sprite->pos1.x -= 32;
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, sprite->data[1]);
+ sprite->callback = AnimMovementWaves_Step;
+ }
+}
+
+static void AnimMovementWaves_Step(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ if (--sprite->data[0])
+ StartSpriteAnim(sprite, sprite->data[1]);
+ else
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimTask_UproarDistortion(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+
+ PrepareAffineAnimInTaskData(&gTasks[taskId], spriteId, sUproarAffineAnimCmds);
+ gTasks[taskId].func = UproarDistortion_Step;
+}
+
+static void UproarDistortion_Step(u8 taskId)
+{
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimJaggedMusicNote(struct Sprite *sprite)
+{
+ int var1;
+ u8 battler = !gBattleAnimArgs[0] ? gBattleAnimAttacker : gBattleAnimTarget;
+
+ if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
+ gBattleAnimArgs[1] *= -1;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
+ sprite->data[0] = 0;
+ sprite->data[1] = (u16)sprite->pos1.x << 3;
+ sprite->data[2] = (u16)sprite->pos1.y << 3;
+
+ var1 = gBattleAnimArgs[1] << 3;
+ if (var1 < 0)
+ var1 += 7;
+ sprite->data[3] = var1 >> 3;
+
+ var1 = gBattleAnimArgs[2] << 3;
+ if (var1 < 0)
+ var1 += 7;
+ sprite->data[4] = var1 >> 3;
+
+ sprite->oam.tileNum += gBattleAnimArgs[3] * 16;
+ sprite->callback = AnimJaggedMusicNote_Step;
+}
+
+static void AnimJaggedMusicNote_Step(struct Sprite *sprite)
+{
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+ sprite->pos1.x = sprite->data[1] >> 3;
+ sprite->pos1.y = sprite->data[2] >> 3;
+ if (++sprite->data[0] > 16)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimPerishSongMusicNote2(struct Sprite *sprite)
+{
+ if (!sprite->data[0])
+ {
+ sprite->data[1] = 120 - gBattleAnimArgs[0];
+ sprite->invisible = TRUE;
+ }
+
+ if (++sprite->data[0] == sprite->data[1])
+ SetGreyscaleOrOriginalPalette(sprite->oam.paletteNum + 16, 0);
+
+ if (sprite->data[0] == sprite->data[1] + 80)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimPerishSongMusicNote(struct Sprite *sprite)
+{
+ int index;
+ int var2;
+
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x = 120;
+ sprite->pos1.y = (gBattleAnimArgs[0] + (((u16)gBattleAnimArgs[0]) >> 31)) / 2 - 15;
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+
+ sprite->data[5] = 120;
+ sprite->data[3] = gBattleAnimArgs[2];
+ }
+
+ sprite->data[0]++;
+
+ sprite->data[1] = (sprite->data[0] + ((u16)sprite->data[0] >> 31)) / 2;
+ index = ((sprite->data[0] * 3) + (u16)sprite->data[3]);
+ var2 = 0xFF;
+ sprite->data[6] = (sprite->data[6] + 10) & 0xFF;
+
+ index &= var2;
+ sprite->pos2.x = Cos(index, 100);
+
+ sprite->pos2.y = sprite->data[1] + Sin(index, 10) + Cos(sprite->data[6], 4);
+
+ if (sprite->data[0] > sprite->data[5])
+ {
+ sprite->callback = AnimPerishSongMusicNote_Step1;
+
+ sprite->data[0] = 0;
+ SetSpritePrimaryCoordsFromSecondaryCoords(sprite);
+ sprite->data[2] = 5;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+
+ StartSpriteAffineAnim(sprite, 1);
+ }
+}
+
+static void AnimPerishSongMusicNote_Step1(struct Sprite *sprite)
+{
+ if (++sprite->data[0] > 10)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = AnimPerishSongMusicNote_Step2;
+ }
+}
+
+static void AnimPerishSongMusicNote_Step2(struct Sprite *sprite)
+{
+ sprite->data[3] += sprite->data[2];
+ sprite->pos2.y = sprite->data[3];
+
+ sprite->data[2]++;
+
+ if (sprite->data[3] > 48 && sprite->data[2] > 0)
+ {
+ sprite->data[2] = sprite->data[4] - 5;
+ sprite->data[4]++;
+ }
+
+ if (sprite->data[4] > 3)
+ {
+ int var1 = sprite->data[2];
+ sprite->invisible = var1 - (((s32)(var1 + ((u32)var1 >> 31)) >> 1) << 1);
+ DestroyAnimSprite(sprite);
+ }
+
+ if (sprite->data[4] == 4)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimGuardRing(struct Sprite *sprite)
+{
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
+ {
+ SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->pos1.y += 40;
+
+ StartSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 40;
+ }
+
+ sprite->data[0] = 13;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y - 72;
+
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void AnimTask_IsFuryCutterHitRight(u8 taskId)
+{
+ gBattleAnimArgs[7] = gAnimDisableStructPtr->furyCutterCounter & 1;
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_GetFuryCutterHitCount(u8 taskId)
+{
+ gBattleAnimArgs[7] = gAnimDisableStructPtr->furyCutterCounter;
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c
new file mode 100644
index 000000000..69bae2c6f
--- /dev/null
+++ b/src/battle_anim_effects_3.c
@@ -0,0 +1,5320 @@
+#include "global.h"
+#include "malloc.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "bg.h"
+#include "data.h"
+#include "decompress.h"
+#include "dma3.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "palette.h"
+#include "pokemon_icon.h"
+#include "random.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "util.h"
+#include "constants/battle_anim.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "constants/weather.h"
+
+// Function Declarations
+static void AnimBlackSmokeStep(struct Sprite *);
+static void AnimWhiteHalo_Step1(struct Sprite *);
+static void AnimWhiteHalo_Step2(struct Sprite *);
+static void AnimMeanLookEye_Step1(struct Sprite *);
+static void AnimMeanLookEye_Step2(struct Sprite *);
+static void AnimMeanLookEye_Step3(struct Sprite *);
+static void AnimMeanLookEye_Step4(struct Sprite *);
+static void SetPsychicBackground_Step(u8);
+static void FadeScreenToWhite_Step(u8);
+static void AnimSpikes_Step1(struct Sprite *);
+static void AnimSpikes_Step2(struct Sprite *);
+static void AnimSpotlight_Step1(struct Sprite *);
+static void AnimSpotlight_Step2(struct Sprite *);
+static void AnimClappingHand_Step(struct Sprite *);
+static void AnimRapidSpin_Step(struct Sprite *);
+static void RapinSpinMonElevation_Step(u8);
+static void TormentAttacker_Step(u8);
+static void TormentAttacker_Callback(struct Sprite *);
+static void AnimWishStar_Step(struct Sprite *);
+static void AnimMiniTwinklingStar_Step(struct Sprite *);
+static void AnimGreenStar_Step1(struct Sprite *);
+static void AnimGreenStar_Step2(struct Sprite *);
+static void AnimGreenStar_Callback(struct Sprite *);
+static void AnimTask_RockMonBackAndForthStep(u8);
+static void AnimSweetScentPetalStep(struct Sprite *);
+static void AnimTask_FlailMovementStep(u8);
+static void AnimFlatterConfettiStep(struct Sprite *);
+static void AnimFlatterSpotlightStep(struct Sprite *);
+static void AnimReversalOrbStep(struct Sprite *);
+static void AnimTask_RolePlaySilhouetteStep1(u8);
+static void AnimTask_RolePlaySilhouetteStep2(u8);
+static void AnimTask_AcidArmorStep(u8);
+static void AnimTask_DeepInhaleStep(u8);
+static void AnimYawnCloudStep(struct Sprite *);
+static void AnimTask_SquishAndSweatDropletsStep(u8);
+static void CreateSweatDroplets(u8, bool8);
+static void AnimTask_FacadeColorBlendStep(u8);
+static void AnimRoarNoiseLineStep(struct Sprite *);
+static void AnimTask_GlareEyeDotsStep(u8);
+static void GetGlareEyeDotCoords(s16, s16, s16, s16, u8, u8, s16 *, s16 *);
+static void AnimTask_BarrageBallStep(u8);
+static void AnimSmellingSaltsHand_Step(struct Sprite *);
+static void AnimTask_SmellingSaltsSquishStep(u8);
+static void AnimSmellingSaltExclamationStep(struct Sprite *);
+static void AnimHelpingHandClapStep(struct Sprite *);
+static void AnimTask_HelpingHandAttackerMovementStep(u8);
+static void AnimForesightMagnifyingGlassStep(struct Sprite *);
+static void AnimTask_MonToSubstituteDoll(u8);
+static void AnimBlockXStep(struct Sprite *);
+static void AnimTask_OdorSleuthMovementWaitFinish(u8);
+static void MoveOdorSleuthClone(struct Sprite *);
+static void AnimTask_TeeterDanceMovementStep(u8);
+static void AnimRecycleStep(struct Sprite *);
+static void AnimTask_SlackOffSquishStep(u8);
+
+// Data
+static const union AnimCmd sScratchAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(48, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sScratchAnimTable[] =
+{
+ sScratchAnimCmds,
+};
+
+const struct SpriteTemplate gScratchSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SCRATCH,
+ .paletteTag = ANIM_TAG_SCRATCH,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
+ .anims = sScratchAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+const struct SpriteTemplate gBlackSmokeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BLACK_SMOKE,
+ .paletteTag = ANIM_TAG_BLACK_SMOKE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimBlackSmoke,
+};
+
+const struct SpriteTemplate gBlackBallSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BLACK_BALL,
+ .paletteTag = ANIM_TAG_BLACK_BALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimThrowProjectile,
+};
+
+static const union AnimCmd sOpeningEyeAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 40),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(32, 40),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sOpeningEyeAnimTable[] =
+{
+ sOpeningEyeAnimCmds,
+};
+
+const struct SpriteTemplate gOpeningEyeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_OPENING_EYE,
+ .paletteTag = ANIM_TAG_OPENING_EYE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sOpeningEyeAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+const struct SpriteTemplate gWhiteHaloSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ROUND_WHITE_HALO,
+ .paletteTag = ANIM_TAG_ROUND_WHITE_HALO,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimWhiteHalo,
+};
+
+const struct SpriteTemplate gTealAlertSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_TEAL_ALERT,
+ .paletteTag = ANIM_TAG_TEAL_ALERT,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimTealAlert,
+};
+
+static const union AffineAnimCmd sMeanLookEyeAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x180, 0x180, 0, 0),
+ AFFINEANIMCMD_FRAME(-0x20, 0x18, 0, 5),
+ AFFINEANIMCMD_FRAME(0x18, -0x20, 0, 5),
+ AFFINEANIMCMD_JUMP(1),
+};
+
+static const union AffineAnimCmd sMeanLookEyeAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0x30, 0x30, 0, 0),
+ AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 6),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sMeanLookEyeAffineAnimTable[] =
+{
+ sMeanLookEyeAffineAnimCmds1,
+ sMeanLookEyeAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gMeanLookEyeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_EYE,
+ .paletteTag = ANIM_TAG_EYE,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sMeanLookEyeAffineAnimTable,
+ .callback = AnimMeanLookEye,
+};
+
+const struct SpriteTemplate gSpikesSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPIKES,
+ .paletteTag = ANIM_TAG_SPIKES,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpikes,
+};
+
+static const union AnimCmd sLeerAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(48, 3),
+ ANIMCMD_FRAME(64, 3),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sLeerAnimTable[] =
+{
+ sLeerAnimCmds,
+};
+
+const struct SpriteTemplate gLeerSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LEER,
+ .paletteTag = ANIM_TAG_LEER,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sLeerAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimLeer,
+};
+
+static const union AnimCmd sLetterZAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sLetterZAnimTable[] =
+{
+ sLetterZAnimCmds,
+};
+
+static const union AffineAnimCmd sLetterZAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-7, -7, -3, 16),
+ AFFINEANIMCMD_FRAME(7, 7, 3, 16),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sLetterZAffineAnimTable[] =
+{
+ sLetterZAffineAnimCmds,
+};
+
+const struct SpriteTemplate gLetterZSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_LETTER_Z,
+ .paletteTag = ANIM_TAG_LETTER_Z,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = sLetterZAnimTable,
+ .images = NULL,
+ .affineAnims = sLetterZAffineAnimTable,
+ .callback = AnimLetterZ,
+};
+
+static const union AnimCmd sFangAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 16),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(48, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sFangAnimTable[] =
+{
+ sFangAnimCmds,
+};
+
+static const union AffineAnimCmd sFangAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_FRAME(-0x20, -0x20, 0, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sFangAffineAnimTable[] =
+{
+ sFangAffineAnimCmds,
+};
+
+const struct SpriteTemplate gFangSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_FANG_ATTACK,
+ .paletteTag = ANIM_TAG_FANG_ATTACK,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
+ .anims = sFangAnimTable,
+ .images = NULL,
+ .affineAnims = sFangAffineAnimTable,
+ .callback = AnimFang,
+};
+
+static const union AffineAnimCmd sSpotlightAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x0, 0x180, 0, 0),
+ AFFINEANIMCMD_FRAME(0x10, 0x0, 0, 20),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpotlightAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0x140, 0x180, 0, 0),
+ AFFINEANIMCMD_FRAME(-0x10, 0x0, 0, 19),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sSpotlightAffineAnimTable[] =
+{
+ sSpotlightAffineAnimCmds1,
+ sSpotlightAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gSpotlightSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPOTLIGHT,
+ .paletteTag = ANIM_TAG_SPOTLIGHT,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSpotlightAffineAnimTable,
+ .callback = AnimSpotlight,
+};
+
+const struct SpriteTemplate gClappingHandSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_TAG_HAND,
+ .paletteTag = ANIM_TAG_TAG_HAND,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimClappingHand,
+};
+
+const struct SpriteTemplate gClappingHand2SpriteTemplate =
+{
+ .tileTag = ANIM_TAG_TAG_HAND,
+ .paletteTag = ANIM_TAG_TAG_HAND,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimClappingHand2,
+};
+
+static const union AnimCmd sRapidSpinAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(8, 2),
+ ANIMCMD_FRAME(16, 2),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sRapidSpinAnimTable[] =
+{
+ sRapidSpinAnimCmds,
+};
+
+const struct SpriteTemplate gRapidSpinSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RAPID_SPIN,
+ .paletteTag = ANIM_TAG_RAPID_SPIN,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
+ .anims = sRapidSpinAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimRapidSpin,
+};
+
+static const union AffineAnimCmd sUnknown_83FF080[] =
+{
+ AFFINEANIMCMD_FRAME(-12, 8, 0, 4),
+ AFFINEANIMCMD_FRAME(20, -20, 0, 4),
+ AFFINEANIMCMD_FRAME(-8, 12, 0, 4),
+ AFFINEANIMCMD_END,
+};
+
+static const union AnimCmd sTriAttackTriangleAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sTriAttackTriangleAnimTable[] =
+{
+ sTriAttackTriangleAnimCmds,
+};
+
+static const union AffineAnimCmd sTriAttackTriangleAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, 5, 40),
+ AFFINEANIMCMD_FRAME(0, 0, 10, 10),
+ AFFINEANIMCMD_FRAME(0, 0, 15, 10),
+ AFFINEANIMCMD_FRAME(0, 0, 20, 40),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sTriAttackTriangleAffineAnimTable[] =
+{
+ sTriAttackTriangleAffineAnimCmds,
+};
+
+const struct SpriteTemplate gTriAttackTriangleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_TRI_FORCE_TRIANGLE,
+ .paletteTag = ANIM_TAG_TRI_FORCE_TRIANGLE,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
+ .anims = sTriAttackTriangleAnimTable,
+ .images = NULL,
+ .affineAnims = sTriAttackTriangleAffineAnimTable,
+ .callback = AnimTriAttackTriangle,
+};
+
+static const union AnimCmd sEclipsingOrbAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(48, 3),
+ ANIMCMD_FRAME(32, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(16, 3, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 3, .hFlip = TRUE),
+ ANIMCMD_LOOP(1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sEclipsingOrbAnimTable[] =
+{
+ sEclipsingOrbAnimCmds,
+};
+
+const struct SpriteTemplate gEclipsingOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ECLIPSING_ORB,
+ .paletteTag = ANIM_TAG_ECLIPSING_ORB,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sEclipsingOrbAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSpriteOnMonPos,
+};
+
+static const union AffineAnimCmd DefenseCurlDeformMonAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-12, 20, 0, 8),
+ AFFINEANIMCMD_FRAME(12, -20, 0, 8),
+ AFFINEANIMCMD_LOOP(2),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gBatonPassPokeballSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_POKEBALL,
+ .paletteTag = ANIM_TAG_POKEBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimBatonPassPokeball,
+};
+
+const struct SpriteTemplate gWishStarSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GOLD_STARS,
+ .paletteTag = ANIM_TAG_GOLD_STARS,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimWishStar,
+};
+
+const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GOLD_STARS,
+ .paletteTag = ANIM_TAG_GOLD_STARS,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMiniTwinklingStar,
+};
+
+static const union AffineAnimCmd sStockpileDeformMonAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(8, -8, 0, 12),
+ AFFINEANIMCMD_FRAME(-16, 16, 0, 12),
+ AFFINEANIMCMD_FRAME(8, -8, 0, 12),
+ AFFINEANIMCMD_LOOP(1),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sSpitUpDeformMonAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 6, 0, 20),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 20),
+ AFFINEANIMCMD_FRAME(0, -18, 0, 6),
+ AFFINEANIMCMD_FRAME(-18, -18, 0, 3),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 15),
+ AFFINEANIMCMD_FRAME(4, 4, 0, 13),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gSwallowBlueOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BLUE_ORB,
+ .paletteTag = ANIM_TAG_BLUE_ORB,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSwallowBlueOrb,
+};
+
+static const union AffineAnimCmd sSwallowDeformMonAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 6, 0, 20),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 20),
+ AFFINEANIMCMD_FRAME(7, -30, 0, 6),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 20),
+ AFFINEANIMCMD_FRAME(-2, 3, 0, 20),
+ AFFINEANIMCMD_END,
+};
+
+static const s8 sMorningSunLightBeamCoordsTable[] =
+{
+ 0xE8,
+ 0x18,
+ 0xFC,
+ 0x00,
+};
+
+static const union AnimCmd sGreenStarAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(4, 6),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sGreenStarAnimCmds2[] =
+{
+ ANIMCMD_FRAME(8, 6),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sGreenStarAnimCmds3[] =
+{
+ ANIMCMD_FRAME(12, 6),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sGreenStarAnimTable[] =
+{
+ sGreenStarAnimCmds1,
+ sGreenStarAnimCmds2,
+ sGreenStarAnimCmds3,
+};
+
+const struct SpriteTemplate gGreenStarSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GREEN_STAR,
+ .paletteTag = ANIM_TAG_GREEN_STAR,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sGreenStarAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimGreenStar,
+};
+
+static const s8 sDoomDesireLightBeamCoordTable[] =
+{
+ 0x78,
+ 0x50,
+ 0x28,
+ 0x00,
+};
+
+static const u8 sDoomDesireLightBeamDelayTable[] =
+{
+ 0,
+ 0,
+ 0,
+ 0,
+ 50,
+};
+
+static const union AffineAnimCmd sStrongFrustrationAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, -15, 0, 7),
+ AFFINEANIMCMD_FRAME(0, 15, 0, 7),
+ AFFINEANIMCMD_LOOP(2),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gWeakFrustrationAngerMarkSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_ANGER,
+ .paletteTag = ANIM_TAG_ANGER,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimWeakFrustrationAngerMark,
+};
+
+static const union AnimCmd sSweetScentPetalAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(3, 8, .vFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .vFlip = TRUE),
+ ANIMCMD_FRAME(0, 8, .vFlip = TRUE),
+ ANIMCMD_FRAME(1, 8, .vFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSweetScentPetalAnimCmds2[] =
+{
+ ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(3, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(3, 8, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 8, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 8, .vFlip = TRUE, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sSweetScentPetalAnimCmds3[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSweetScentPetalAnimCmdTable[] =
+{
+ sSweetScentPetalAnimCmds1,
+ sSweetScentPetalAnimCmds2,
+ sSweetScentPetalAnimCmds3,
+};
+
+const struct SpriteTemplate gSweetScentPetalSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PINK_PETAL,
+ .paletteTag = ANIM_TAG_PINK_PETAL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sSweetScentPetalAnimCmdTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSweetScentPetal,
+};
+
+static const u16 sUnknown_83FF33C[] = INCBIN_U16("graphics/battle_anims/unk_83FF33C.gbapal"); //Unused
+
+static const union AnimCmd sPainSplitAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_FRAME(4, 9),
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sPainSplitAnimCmdTable[] =
+{
+ sPainSplitAnimCmds,
+};
+
+const struct SpriteTemplate gPainSplitProjectileSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PAIN_SPLIT,
+ .paletteTag = ANIM_TAG_PAIN_SPLIT,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sPainSplitAnimCmdTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimPainSplitProjectile,
+};
+
+const struct SpriteTemplate gFlatterConfettiSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_CONFETTI,
+ .paletteTag = ANIM_TAG_CONFETTI,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimFlatterConfetti,
+};
+
+const struct SpriteTemplate gFlatterSpotlightSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SPOTLIGHT,
+ .paletteTag = ANIM_TAG_SPOTLIGHT,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSpotlightAffineAnimTable,
+ .callback = AnimFlatterSpotlight,
+};
+
+const struct SpriteTemplate gReversalOrbSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_BLUE_ORB,
+ .paletteTag = ANIM_TAG_BLUE_ORB,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimReversalOrb,
+};
+
+static const union AffineAnimCmd sDeepInhaleAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(16, 0, 0, 4),
+ AFFINEANIMCMD_FRAME(0, -3, 0, 16),
+ AFFINEANIMCMD_FRAME(4, 0, 0, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 24),
+ AFFINEANIMCMD_FRAME(-5, 3, 0, 16),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sYawnCloudAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),
+ AFFINEANIMCMD_FRAME(-8, -8, 0, 8),
+ AFFINEANIMCMD_FRAME(8, 8, 0, 8),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sYawnCloudAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),
+ AFFINEANIMCMD_FRAME(8, 8, 0, 8),
+ AFFINEANIMCMD_FRAME(-8, -8, 0, 8),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sYawnCloudAffineAnimCmds3[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(8, 8, 0, 8),
+ AFFINEANIMCMD_FRAME(-8, -8, 0, 8),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sYawnCloudAffineAnimTable[] =
+{
+ sYawnCloudAffineAnimCmds1,
+ sYawnCloudAffineAnimCmds2,
+ sYawnCloudAffineAnimCmds3,
+};
+
+const struct SpriteTemplate gYawnCloudSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PINK_CLOUD,
+ .paletteTag = ANIM_TAG_PINK_CLOUD,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sYawnCloudAffineAnimTable,
+ .callback = AnimYawnCloud,
+};
+
+static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),
+ AFFINEANIMCMD_FRAME(-4, -6, 0, 16),
+ AFFINEANIMCMD_FRAME(4, 6, 0, 16),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),
+ AFFINEANIMCMD_FRAME(4, 6, 0, 16),
+ AFFINEANIMCMD_FRAME(-4, -6, 0, 16),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds3[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(4, 6, 0, 16),
+ AFFINEANIMCMD_FRAME(-4, -6, 0, 16),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd sSmokeBallEscapeCloudAffineAnimCmds4[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(8, 10, 0, 30),
+ AFFINEANIMCMD_FRAME(-8, -10, 0, 16),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sSmokeBallEscapeCloudAffineAnimTable[] =
+{
+ sSmokeBallEscapeCloudAffineAnimCmds1,
+ sSmokeBallEscapeCloudAffineAnimCmds2,
+ sSmokeBallEscapeCloudAffineAnimCmds3,
+ sSmokeBallEscapeCloudAffineAnimCmds4,
+};
+
+const struct SpriteTemplate gSmokeBallEscapeCloudSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PINK_CLOUD,
+ .paletteTag = ANIM_TAG_PINK_CLOUD,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sSmokeBallEscapeCloudAffineAnimTable,
+ .callback = AnimSmokeBallEscapeCloud,
+};
+
+static const union AffineAnimCmd sFacadeSquishAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(-16, 16, 0, 6),
+ AFFINEANIMCMD_FRAME(16, -16, 0, 12),
+ AFFINEANIMCMD_FRAME(-16, 16, 0, 6),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gFacadeSweatDropSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SWEAT_DROP,
+ .paletteTag = ANIM_TAG_SWEAT_DROP,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimFacadeSweatDrop,
+};
+
+static const u16 sFacadeBlendColors[] =
+{
+ RGB(28, 25, 1),
+ RGB(28, 21, 5),
+ RGB(27, 18, 8),
+ RGB(27, 14, 11),
+ RGB(26, 10, 15),
+ RGB(26, 7, 18),
+ RGB(25, 3, 21),
+ RGB(25, 0, 25),
+ RGB(25, 0, 23),
+ RGB(25, 0, 20),
+ RGB(25, 0, 16),
+ RGB(25, 0, 13),
+ RGB(26, 0, 10),
+ RGB(26, 0, 6),
+ RGB(26, 0, 3),
+ RGB(27, 0, 0),
+ RGB(27, 1, 0),
+ RGB(27, 5, 0),
+ RGB(27, 9, 0),
+ RGB(27, 12, 0),
+ RGB(28, 16, 0),
+ RGB(28, 19, 0),
+ RGB(28, 23, 0),
+ RGB(29, 27, 0),
+};
+
+static const union AnimCmd sRoarNoiseLineAnimCmds1[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sRoarNoiseLineAnimCmds2[] =
+{
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(48, 3),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sRoarNoiseLineAnimTable[] =
+{
+ sRoarNoiseLineAnimCmds1,
+ sRoarNoiseLineAnimCmds2,
+};
+
+const struct SpriteTemplate gRoarNoiseLineSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_NOISE_LINE,
+ .paletteTag = ANIM_TAG_NOISE_LINE,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sRoarNoiseLineAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimRoarNoiseLine,
+};
+
+const struct SpriteTemplate gGlareEyeDotSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SMALL_RED_EYE,
+ .paletteTag = ANIM_TAG_SMALL_RED_EYE,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimGlareEyeDot,
+};
+
+const struct SpriteTemplate gAssistPawprintSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_PAW_PRINT,
+ .paletteTag = ANIM_TAG_PAW_PRINT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimAssistPawprint,
+};
+
+static const union AffineAnimCmd sBarrageBallAffineAnimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -4, 24),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sBarrageBallAffineAnimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 4, 24),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sBarrageBallAffineAnimTable[] =
+{
+ sBarrageBallAffineAnimCmds1,
+ sBarrageBallAffineAnimCmds2,
+};
+
+const struct SpriteTemplate gBarrageBallSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RED_BALL,
+ .paletteTag = ANIM_TAG_RED_BALL,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sBarrageBallAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct SpriteTemplate gSmellingSaltsHandSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_TAG_HAND,
+ .paletteTag = ANIM_TAG_TAG_HAND,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSmellingSaltsHand,
+};
+
+static const union AffineAnimCmd sSmellingSaltsSquishAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, -16, 0, 6),
+ AFFINEANIMCMD_FRAME(0, 16, 0, 6),
+ AFFINEANIMCMD_END,
+};
+
+const struct SpriteTemplate gSmellingSaltExclamationSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SMELLINGSALT_EFFECT,
+ .paletteTag = ANIM_TAG_SMELLINGSALT_EFFECT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimSmellingSaltExclamation,
+};
+
+const struct SpriteTemplate gHelpingHandClapSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_TAG_HAND,
+ .paletteTag = ANIM_TAG_TAG_HAND,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimHelpingHandClap,
+};
+
+const struct SpriteTemplate gForesightMagnifyingGlassSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_MAGNIFYING_GLASS,
+ .paletteTag = ANIM_TAG_MAGNIFYING_GLASS,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimForesightMagnifyingGlass,
+};
+
+const struct SpriteTemplate gMeteorMashStarSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_GOLD_STARS,
+ .paletteTag = ANIM_TAG_GOLD_STARS,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimMeteorMashStar,
+};
+
+const struct SpriteTemplate gUnknown_83FF6D4 =
+{
+ .tileTag = ANIM_TAG_GOLD_STARS,
+ .paletteTag = ANIM_TAG_GOLD_STARS,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimParticuleBurst,
+};
+
+const struct SpriteTemplate gBlockXSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_X_SIGN,
+ .paletteTag = ANIM_TAG_X_SIGN,
+ .oam = &gOamData_AffineOff_ObjNormal_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = AnimBlockX,
+};
+
+const struct SpriteTemplate gUnknown_83FF704 =
+{
+ .tileTag = ANIM_TAG_ITEM_BAG,
+ .paletteTag = ANIM_TAG_ITEM_BAG,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E3E84,
+};
+
+static const union AnimCmd sKnockOffStrikeAnimCmds[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sKnockOffStrikeAnimTable[] =
+{
+ sKnockOffStrikeAnimCmds,
+};
+
+static const union AffineAnimCmd sKnockOffStrikeAffineanimCmds1[] =
+{
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, -4, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd sKnockOffStrikeAffineanimCmds2[] =
+{
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(0, 0, 4, 8),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sKnockOffStrikeAffineAnimTable[] =
+{
+ sKnockOffStrikeAffineanimCmds1,
+ sKnockOffStrikeAffineanimCmds2,
+};
+
+const struct SpriteTemplate gKnockOffStrikeSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_SLAM_HIT_2,
+ .paletteTag = ANIM_TAG_SLAM_HIT_2,
+ .oam = &gOamData_AffineNormal_ObjNormal_64x64,
+ .anims = sKnockOffStrikeAnimTable,
+ .images = NULL,
+ .affineAnims = sKnockOffStrikeAffineAnimTable,
+ .callback = AnimKnockOffStrike,
+};
+
+static const union AffineAnimCmd sRecycleSpriteAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -4, 64),
+ AFFINEANIMCMD_JUMP(0),
+};
+
+static const union AffineAnimCmd *const sRecycleSpriteAffineAnimTable[] =
+{
+ sRecycleSpriteAffineAnimCmds,
+};
+
+const struct SpriteTemplate gRecycleSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_RECYCLE,
+ .paletteTag = ANIM_TAG_RECYCLE,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = sRecycleSpriteAffineAnimTable,
+ .callback = AnimRecycle,
+};
+
+static const union AffineAnimCmd sSlackOffSquishAffineAnimCmds[] =
+{
+ AFFINEANIMCMD_FRAME(0, 16, 0, 4),
+ AFFINEANIMCMD_FRAME(-2, 0, 0, 8),
+ AFFINEANIMCMD_FRAME(0, 4, 0, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 0, 24),
+ AFFINEANIMCMD_FRAME(1, -5, 0, 16),
+ AFFINEANIMCMD_END,
+};
+
+// Functions
+void AnimBlackSmoke(struct Sprite *sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ if (!gBattleAnimArgs[3])
+ sprite->data[0] = gBattleAnimArgs[2];
+ else
+ sprite->data[0] = -gBattleAnimArgs[2];
+
+ sprite->data[1] = gBattleAnimArgs[4];
+ sprite->callback = AnimBlackSmokeStep;
+}
+
+static void AnimBlackSmokeStep(struct Sprite *sprite)
+{
+ if (sprite->data[1] > 0)
+ {
+ sprite->pos2.x = sprite->data[2] >> 8;
+ sprite->data[2] += sprite->data[0];
+ sprite->invisible ^= 1;
+ sprite->data[1]--;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimTask_SmokescreenImpact(u8 taskId)
+{
+ SmokescreenImpact(GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + 8, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + 8, 0);
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimWhiteHalo(struct Sprite *sprite)
+{
+ sprite->data[0] = 90;
+ sprite->callback = WaitAnimForDuration;
+ sprite->data[1] = 7;
+ StoreSpriteCallbackInData6(sprite, AnimWhiteHalo_Step1);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));
+}
+
+static void AnimWhiteHalo_Step1(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1]));
+ if (--sprite->data[1] < 0)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = AnimWhiteHalo_Step2;
+ }
+}
+
+static void AnimWhiteHalo_Step2(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTealAlert(struct Sprite *sprite)
+{
+ u16 rotation;
+ u8 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ u8 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+
+ InitSpritePosToAnimTarget(sprite, TRUE);
+ rotation = ArcTan2Neg(sprite->pos1.x - x, sprite->pos1.y - y);
+ rotation += 0x6000;
+ if (IsContest())
+ rotation += 0x4000;
+
+ TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = x;
+ sprite->data[4] = y;
+ sprite->callback = StartAnimLinearTranslation;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void AnimMeanLookEye(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ sprite->data[0] = 4;
+ sprite->callback = AnimMeanLookEye_Step1;
+}
+
+static void AnimMeanLookEye_Step1(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));
+ if (sprite->data[1])
+ sprite->data[0]--;
+ else
+ sprite->data[0]++;
+
+ if (sprite->data[0] == 15 || sprite->data[0] == 4)
+ sprite->data[1] ^= 1;
+
+ if (sprite->data[2]++ > 70)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[2] = 0;
+ sprite->invisible = TRUE;
+ sprite->affineAnimPaused = TRUE;
+ sprite->callback = AnimMeanLookEye_Step2;
+ }
+}
+
+static void AnimMeanLookEye_Step2(struct Sprite *sprite)
+{
+ if (sprite->data[2]++ > 9)
+ {
+ sprite->invisible = FALSE;
+ sprite->affineAnimPaused = FALSE;
+ if (sprite->affineAnimEnded)
+ sprite->callback = AnimMeanLookEye_Step3;
+ }
+}
+
+static void AnimMeanLookEye_Step3(struct Sprite *sprite)
+{
+ switch (sprite->data[3])
+ {
+ case 0:
+ case 1:
+ sprite->pos2.x = 1;
+ sprite->pos2.y = 0;
+ break;
+ case 2:
+ case 3:
+ sprite->pos2.x = -1;
+ sprite->pos2.y = 0;
+ break;
+ case 4:
+ case 5:
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 1;
+ break;
+ case 6:
+ default:
+ sprite->pos2.x = 0;
+ sprite->pos2.y = -1;
+ break;
+ }
+
+ if (++sprite->data[3] > 7)
+ sprite->data[3] = 0;
+
+ if (sprite->data[4]++ > 15)
+ {
+ sprite->data[0] = 16;
+ sprite->data[1] = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 0));
+ sprite->callback = AnimMeanLookEye_Step4;
+ }
+}
+
+static void AnimMeanLookEye_Step4(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));
+ if (sprite->data[1]++ > 1)
+ {
+ sprite->data[0]--;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[0] == 0)
+ sprite->invisible = TRUE;
+
+ if (sprite->data[0] < 0)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimTask_SetPsychicBackground(u8 taskId)
+{
+ gTasks[taskId].func = SetPsychicBackground_Step;
+ gAnimVisualTaskCount--;
+}
+
+static void SetPsychicBackground_Step(u8 taskId)
+{
+ int i;
+ u16 lastColor;
+ u8 paletteIndex = GetBattleBgPaletteNum();
+
+ if (++gTasks[taskId].data[5] == 4)
+ {
+ lastColor = gPlttBufferFaded[paletteIndex * 16 + 11];
+ for (i = 10; i > 0; i--)
+ gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i];
+
+ gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor;
+ gTasks[taskId].data[5] = 0;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ DestroyTask(taskId);
+}
+
+void AnimTask_FadeScreenToWhite(u8 taskId)
+{
+ gTasks[taskId].func = FadeScreenToWhite_Step;
+ gAnimVisualTaskCount--;
+}
+
+static void FadeScreenToWhite_Step(u8 taskId)
+{
+ int i;
+ u16 lastColor;
+ u8 paletteIndex = GetBattleBgPaletteNum();
+
+ if (++gTasks[taskId].data[5] == 4)
+ {
+ lastColor = gPlttBufferFaded[paletteIndex * 16 + 11];
+ for (i = 10; i > 0; i--)
+ gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i];
+ gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor;
+
+ lastColor = gPlttBufferUnfaded[paletteIndex * 16 + 11];
+ for (i = 10; i > 0; i--)
+ gPlttBufferUnfaded[paletteIndex * 16 + i + 1] = gPlttBufferUnfaded[paletteIndex * 16 + i];
+ gPlttBufferUnfaded[paletteIndex * 16 + 1] = lastColor;
+
+ gTasks[taskId].data[5] = 0;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ DestroyTask(taskId);
+}
+
+void AnimSpikes(struct Sprite *sprite)
+{
+ u16 x;
+ u16 y;
+
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &x, &y);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = x + gBattleAnimArgs[2];
+ sprite->data[4] = y + gBattleAnimArgs[3];
+ sprite->data[5] = -50;
+ InitAnimArcTranslation(sprite);
+ sprite->callback = AnimSpikes_Step1;
+}
+
+static void AnimSpikes_Step1(struct Sprite *sprite)
+{
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ sprite->data[0] = 30;
+ sprite->data[1] = 0;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData6(sprite, AnimSpikes_Step2);
+ }
+}
+
+static void AnimSpikes_Step2(struct Sprite *sprite)
+{
+ if (sprite->data[1] & 1)
+ sprite->invisible ^= 1;
+
+ if (++sprite->data[1] == 16)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimLeer(struct Sprite *sprite)
+{
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->callback = RunStoredCallbackWhenAnimEnds;
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+}
+
+void AnimLetterZ(struct Sprite *sprite)
+{
+ int var0;
+
+ if (sprite->data[0] == 0)
+ {
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
+ if (!IsContest())
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ }
+ else
+ {
+ sprite->data[1] = -1 * gBattleAnimArgs[2];
+ sprite->data[2] = -1 * gBattleAnimArgs[3];
+ }
+ }
+ else
+ {
+ sprite->data[1] = -1 * gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ }
+ }
+
+ sprite->data[0]++;
+ var0 = (sprite->data[0] * 20) & 0xFF;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x = sprite->data[3] / 2;
+ sprite->pos2.y = Sin(var0 & 0xFF, 5) + (sprite->data[4] / 2);
+ if ((u16)(sprite->pos1.x + sprite->pos2.x) > 240)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimFang(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimTask_IsTargetPlayerSide(u8 taskId)
+{
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
+ gBattleAnimArgs[7] = 0;
+ else
+ gBattleAnimArgs[7] = 1;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_IsHealingMove(u8 taskId)
+{
+ if (gAnimMoveDmg > 0)
+ gBattleAnimArgs[7] = 0;
+ else
+ gBattleAnimArgs[7] = 1;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimSpotlight(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H);
+ SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ sprite->oam.objMode = ST_OAM_OBJ_WINDOW;
+ sprite->invisible = TRUE;
+ sprite->callback = AnimSpotlight_Step1;
+}
+
+static void AnimSpotlight_Step1(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->invisible = FALSE;
+ if (sprite->affineAnimEnded)
+ sprite->data[0]++;
+ break;
+ case 1:
+ case 3:
+ sprite->data[1] += 117;
+ sprite->pos2.x = sprite->data[1] >> 8;
+ if (++sprite->data[2] == 21)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[1] -= 117;
+ sprite->pos2.x = sprite->data[1] >> 8;
+ if (++sprite->data[2] == 41)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 4:
+ ChangeSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ break;
+ case 5:
+ if (sprite->affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = AnimSpotlight_Step2;
+ }
+ break;
+ }
+}
+
+static void AnimSpotlight_Step2(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
+ SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
+ DestroyAnimSprite(sprite);
+}
+
+void AnimClappingHand(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[3] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ }
+
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->oam.tileNum += 16;
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
+ sprite->pos2.x = -12;
+ sprite->data[1] = 2;
+ }
+ else
+ {
+ sprite->pos2.x = 12;
+ sprite->data[1] = -2;
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ if (sprite->data[3] != 255)
+ sprite->data[3] = gBattleAnimArgs[2];
+
+ sprite->callback = AnimClappingHand_Step;
+}
+
+static void AnimClappingHand_Step(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->pos2.x += sprite->data[1];
+ if (sprite->pos2.x == 0)
+ {
+ sprite->data[2]++;
+ if (sprite->data[3] == 0)
+ {
+ PlaySE1WithPanning(SE_W227, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));
+ }
+ }
+ }
+ else
+ {
+ sprite->pos2.x -= sprite->data[1];
+ if (abs(sprite->pos2.x) == 12)
+ {
+ sprite->data[0]--;
+ sprite->data[2]--;
+ }
+
+ }
+
+ if (sprite->data[0] == 0)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimClappingHand2(struct Sprite *sprite)
+{
+ sprite->oam.objMode = ST_OAM_OBJ_WINDOW;
+ sprite->data[3] = 255;
+ AnimClappingHand(sprite);
+}
+
+void AnimTask_CreateSpotlight(u8 taskId)
+{
+ if (IsContest())
+ {
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_OBJ | WININ_WIN1_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ | WININ_WIN0_BG_ALL);
+ gBattle_WIN1H = WININ_WIN1_OBJ | WININ_WIN1_BG3 | WIN_RANGE(0, 0xF0) | WIN_RANGE(0x80, 0x0);
+ gBattle_WIN1V = WININ_WIN0_CLR | WIN_RANGE(0, 0x80);
+ SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN0H);
+ SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN0V);
+ }
+ else
+ {
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ);
+ gBattle_WIN1H = WIN_RANGE(0, 0xF0);
+ gBattle_WIN1V = WININ_WIN0_CLR | WIN_RANGE(0, 0x80) | WININ_WIN1_BG3 | WININ_WIN1_OBJ | WININ_WIN1_CLR | WIN_RANGE(0x40, 0);
+ SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0, 0xF0));
+ SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_RemoveSpotlight(u8 taskId)
+{
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ gBattle_WIN1H = 0;
+ gBattle_WIN1V = 0;
+ if (!IsContest())
+ ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimRapidSpin(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
+ }
+
+ sprite->pos2.y = gBattleAnimArgs[2];
+ sprite->data[0] = (sprite->pos2.y > gBattleAnimArgs[3]);
+ sprite->data[1] = 0;
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->callback = AnimRapidSpin_Step;
+}
+
+static void AnimRapidSpin_Step(struct Sprite *sprite)
+{
+ sprite->data[1] = (sprite->data[1] + sprite->data[2]) & 0xFF;
+ sprite->pos2.x = gSineTable[sprite->data[1]] >> 4;
+ sprite->pos2.y += sprite->data[3];
+ if (sprite->data[0])
+ {
+ if (sprite->pos2.y < sprite->data[4])
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ if (sprite->pos2.y > sprite->data[4])
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void AnimTask_RapinSpinMonElevation(u8 taskId)
+{
+ s16 var0;
+ u8 toBG2;
+ s16 var2;
+ int var3;
+ int var4;
+ s16 i;
+ struct ScanlineEffectParams scanlineParams;
+ struct Task *task = &gTasks[taskId];
+
+ if (!gBattleAnimArgs[0])
+ {
+ var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
+ toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
+ }
+ else
+ {
+ var0 = GetBattlerYCoordWithElevation(gBattleAnimTarget);
+ toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
+ }
+
+ task->data[0] = var0 + 36;
+ task->data[1] = task->data[0];
+ task->data[2] = var0 - 33;
+ if (task->data[2] < 0)
+ task->data[2] = 0;
+
+ task->data[3] = task->data[0];
+ task->data[4] = 8;
+ task->data[5] = gBattleAnimArgs[1];
+ task->data[6] = 0;
+ task->data[7] = 0;
+ if (toBG2 == 1)
+ {
+ var3 = gBattle_BG1_X;
+ task->data[8] = var3;
+ var4 = var3 + 240;
+ }
+ else
+ {
+ var3 = gBattle_BG2_X;
+ task->data[8] = var3;
+ var4 = var3 + 240;
+ }
+
+ task->data[9] = var4;
+ task->data[10] = gBattleAnimArgs[2];
+ if (!gBattleAnimArgs[2])
+ {
+ task->data[11] = var4;
+ var2 = task->data[8];
+ }
+ else
+ {
+ task->data[11] = var3;
+ var2 = task->data[9];
+ }
+
+ task->data[15] = 0;
+ i = task->data[2];
+ while (i <= task->data[3])
+ {
+ gScanlineEffectRegBuffers[0][i] = var2;
+ gScanlineEffectRegBuffers[1][i] = var2;
+ i++;
+ }
+
+ if (toBG2 == 1)
+ scanlineParams.dmaDest = &REG_BG1HOFS;
+ else
+ scanlineParams.dmaDest = &REG_BG2HOFS;
+
+ scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ ScanlineEffect_SetParams(scanlineParams);
+
+ task->func = RapinSpinMonElevation_Step;
+}
+
+static void RapinSpinMonElevation_Step(u8 taskId)
+{
+ s16 i;
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0] -= task->data[5];
+ if (task->data[0] < task->data[2])
+ task->data[0] = task->data[2];
+
+ if (task->data[4] == 0)
+ {
+ task->data[1] -= task->data[5];
+ if (task->data[1] < task->data[2])
+ {
+ task->data[1] = task->data[2];
+ task->data[15] = 1;
+ }
+ }
+ else
+ {
+ task->data[4]--;
+ }
+
+ if (++task->data[6] > 1)
+ {
+ task->data[6] = 0;
+ task->data[7] = task->data[7] == 0 ? 1 : 0;
+
+ if (task->data[7])
+ task->data[12] = task->data[8];
+ else
+ task->data[12] = task->data[9];
+ }
+
+ i = task->data[0];
+ while (i < task->data[1])
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[12];
+ gScanlineEffectRegBuffers[1][i] = task->data[12];
+ i++;
+ }
+
+ i = task->data[1];
+ while (i <= task->data[3])
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[11];
+ gScanlineEffectRegBuffers[1][i] = task->data[11];
+ i++;
+ }
+
+ if (task->data[15])
+ {
+ if (task->data[10])
+ gScanlineEffect.state = 3;
+
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void AnimTask_TormentAttacker(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ task->data[4] = 32;
+ task->data[5] = -20;
+ task->data[6] = 0;
+ task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ task->func = TormentAttacker_Step;
+}
+
+static void TormentAttacker_Step(u8 taskId)
+{
+ int var0, var1;
+ s16 x, y;
+ u16 i, j;
+ u8 spriteId;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ var0 = task->data[2];
+ if (task->data[1] & 1)
+ {
+ var1 = task->data[4];
+ x = var0 - var1;
+ }
+ else
+ {
+ var1 = task->data[4];
+ x = var0 + var1;
+ }
+
+ y = task->data[3] + task->data[5];
+ spriteId = CreateSprite(&gThoughtBubbleSpriteTemplate, x, y, 6 - task->data[1]);
+ PlaySE12WithPanning(SE_W118, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].hFlip = task->data[1] & 1;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ }
+
+ if (task->data[1] & 1)
+ {
+ task->data[4] -= 6;
+ task->data[5] -= 6;
+ }
+
+ PrepareAffineAnimInTaskData(task, task->data[15], sUnknown_83FF080);
+ task->data[1]++;
+ task->data[0] = 1;
+ break;
+ case 1:
+ if (!RunAffineAnimFromTaskData(task))
+ {
+ if (task->data[1] == 6)
+ {
+ task->data[6] = 8;
+ task->data[0] = 3;
+ }
+ else
+ {
+ if (task->data[1] <= 2)
+ task->data[6] = 10;
+ else
+ task->data[6] = 0;
+
+ task->data[0] = 2;
+ }
+ }
+ break;
+ case 2:
+ if (task->data[6] != 0)
+ task->data[6]--;
+ else
+ task->data[0] = 0;
+ break;
+ case 3:
+ if (task->data[6] != 0)
+ task->data[6]--;
+ else
+ task->data[0] = 4;
+ break;
+ case 4:
+ for (i = 0, j = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].template == &gThoughtBubbleSpriteTemplate)
+ {
+ gSprites[i].data[0] = taskId;
+ gSprites[i].data[1] = 6;
+ StartSpriteAnim(&gSprites[i], 2);
+ gSprites[i].callback = TormentAttacker_Callback;
+ if (++j == 6)
+ break;
+ }
+ }
+
+ task->data[6] = j;
+ task->data[0] = 5;
+ break;
+ case 5:
+ if (task->data[6] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void TormentAttacker_Callback(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ gTasks[sprite->data[0]].data[sprite->data[1]]--;
+ DestroySprite(sprite);
+ }
+}
+
+void AnimTriAttackTriangle(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+
+ if (++sprite->data[0] < 40)
+ {
+ u16 var = sprite->data[0];
+ if ((var & 1) == 0)
+ sprite->invisible = TRUE;
+ else
+ sprite->invisible = FALSE;
+ }
+
+ if (sprite->data[0] > 30)
+ sprite->invisible = FALSE;
+
+ if (sprite->data[0] == 61)
+ {
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 20;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->callback = StartAnimLinearTranslation;
+ }
+}
+
+void AnimTask_DefenseCurlDeformMon(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), DefenseCurlDeformMonAffineAnimCmds);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void AnimBatonPassPokeball(struct Sprite *sprite)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);
+ sprite->data[1] = 256;
+ sprite->data[2] = 256;
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->data[1] += 96;
+ sprite->data[2] -= 26;
+ SetSpriteRotScale(spriteId, sprite->data[1], sprite->data[2], 0);
+
+ if (++sprite->data[3] == 5)
+ sprite->data[0]++;
+ // fall through
+ case 2:
+ sprite->data[1] += 96;
+ sprite->data[2] += 48;
+ SetSpriteRotScale(spriteId, sprite->data[1], sprite->data[2], 0);
+
+ if (++sprite->data[3] == 9)
+ {
+ sprite->data[3] = 0;
+ gSprites[spriteId].invisible = TRUE;
+ ResetSpriteRotScale(spriteId);
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->pos2.y -= 6;
+ if (sprite->pos1.y + sprite->pos2.y < -32)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+void AnimWishStar(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->pos1.x = -16;
+ else
+ sprite->pos1.x = 256;
+
+ sprite->pos1.y = 0;
+ sprite->callback = AnimWishStar_Step;
+}
+
+static void AnimWishStar_Step(struct Sprite *sprite)
+{
+ u32 newX;
+
+ sprite->data[0] += 72;
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->pos2.x = sprite->data[0] >> 4;
+ else
+ sprite->pos2.x = -(sprite->data[0] >> 4);
+
+ sprite->data[1] += 16;
+ sprite->pos2.y += sprite->data[1] >> 8;
+
+ if (++sprite->data[2] % 3 == 0)
+ {
+ CreateSpriteAndAnimate(
+ &gMiniTwinklingStarSpriteTemplate,
+ sprite->pos1.x + sprite->pos2.x,
+ sprite->pos1.y + sprite->pos2.y,
+ sprite->subpriority + 1);
+ }
+
+ newX = sprite->pos1.x + sprite->pos2.x + 32;
+ if (newX > 304)
+ DestroyAnimSprite(sprite);
+}
+
+void AnimMiniTwinklingStar(struct Sprite *sprite)
+{
+ u8 rand;
+ s8 y;
+
+ rand = Random() & 3;
+ if (rand == 0)
+ sprite->oam.tileNum += 4;
+ else
+ sprite->oam.tileNum += 5;
+
+ y = Random() & 7;
+ if (y > 3)
+ y = -y;
+
+ sprite->pos2.y = y;
+ sprite->callback = AnimMiniTwinklingStar_Step;
+}
+
+static void AnimMiniTwinklingStar_Step(struct Sprite *sprite)
+{
+ if (++sprite->data[0] < 30)
+ {
+ if (++sprite->data[1] == 2)
+ {
+ sprite->invisible ^= 1;
+ sprite->data[1] = 0;
+ }
+ }
+ else
+ {
+ if (sprite->data[1] == 2)
+ sprite->invisible = FALSE;
+
+ if (sprite->data[1] == 3)
+ {
+ sprite->invisible = TRUE;
+ sprite->data[1] = -1;
+ }
+
+ sprite->data[1]++;
+ }
+
+ if (sprite->data[0] > 60)
+ DestroySprite(sprite);
+}
+
+void AnimTask_StockpileDeformMon(u8 taskId)
+{
+ if (!gTasks[taskId].data[0])
+ {
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sStockpileDeformMonAffineAnimCmds);
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void AnimTask_SpitUpDeformMon(u8 taskId)
+{
+ if (!gTasks[taskId].data[0])
+ {
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sSpitUpDeformMonAffineAnimCmds);
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void AnimSwallowBlueOrb(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ InitSpritePosToAnimAttacker(sprite, FALSE);
+ sprite->data[1] = 0x900;
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->pos2.y -= sprite->data[1] >> 8;
+ sprite->data[1] -= 96;
+ if (sprite->pos1.y + sprite->pos2.y > sprite->data[2])
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+void AnimTask_SwallowDeformMon(u8 taskId)
+{
+ if (!gTasks[taskId].data[0])
+ {
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sSwallowDeformMonAffineAnimCmds);
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void AnimTask_TransformMon(u8 taskId)
+{
+ int i, j;
+ u8 position;
+ struct BattleAnimBgData animBg;
+ u8 *dest;
+ u8 *src;
+ u16 *bgTilemap;
+ u16 stretch;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
+ SetAnimBgAttribute(1, BG_ANIM_MOSAIC, 1);
+ else
+ SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 1);
+
+ gTasks[taskId].data[10] = gBattleAnimArgs[0];
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (gTasks[taskId].data[2]++ > 1)
+ {
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[1]++;
+ stretch = gTasks[taskId].data[1];
+ SetGpuReg(REG_OFFSET_MOSAIC, (stretch << 4) | stretch);
+ if (stretch == 15)
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10]);
+ sub_8075300(&animBg, gBattleAnimAttacker);
+ if (IsContest())
+ position = 0;
+ else
+ position = GetBattlerPosition(gBattleAnimAttacker);
+
+ src = gMonSpritesGfxPtr->sprites[position] + (gBattleMonForms[gBattleAnimAttacker] << 11);
+ dest = animBg.bgTiles;
+ CpuCopy32(src, dest, 0x800);
+ LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (gTasks[taskId].data[2]++ > 1)
+ {
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[1]--;
+ stretch = gTasks[taskId].data[1];
+ SetGpuReg(REG_OFFSET_MOSAIC, (stretch << 4) | stretch);
+
+ if (stretch == 0)
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
+ SetAnimBgAttribute(1, BG_ANIM_MOSAIC, 0);
+ else
+ SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 0);
+
+ if (!IsContest())
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ {
+ if (gTasks[taskId].data[10] == 0)
+ SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies);
+ }
+ }
+
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void AnimTask_IsMonInvisible(u8 taskId)
+{
+ gBattleAnimArgs[7] = gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible;
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_CastformGfxChange(u8 taskId)
+{
+ HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, TRUE);
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_MorningSunLightBeam(u8 taskId)
+{
+ struct BattleAnimBgData animBg;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+
+ sub_80752A0(&animBg);
+ AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnim_MorningSunTilemap);
+ AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_MorningSunGfx, animBg.tilesOffset);
+ LoadCompressedPalette(gBattleAnim_MorningSunPal, animBg.paletteId * 16, 32);
+ if (IsContest())
+ {
+ sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0);
+ gBattle_BG1_X = -56;
+ gBattle_BG1_Y = 0;
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattle_BG1_X = -135;
+ else
+ gBattle_BG1_X = -10;
+
+ gBattle_BG1_Y = 0;
+ }
+
+ gTasks[taskId].data[10] = gBattle_BG1_X;
+ gTasks[taskId].data[11] = gBattle_BG1_Y;
+
+ gTasks[taskId].data[0]++;
+ PlaySE12WithPanning(SE_W234, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));
+ break;
+ case 1:
+ if (gTasks[taskId].data[4]++ > 0)
+ {
+ gTasks[taskId].data[4] = 0;
+ if (++gTasks[taskId].data[1] > 12)
+ gTasks[taskId].data[1] = 12;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
+ if (gTasks[taskId].data[1] == 12)
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ if (--gTasks[taskId].data[1] < 0)
+ gTasks[taskId].data[1] = 0;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
+ if (!gTasks[taskId].data[1])
+ {
+ gBattle_BG1_X = sMorningSunLightBeamCoordsTable[gTasks[taskId].data[2]] + gTasks[taskId].data[10];
+ if (++gTasks[taskId].data[2] == 4)
+ gTasks[taskId].data[0] = 4;
+ else
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 3:
+ if (++gTasks[taskId].data[3] == 4)
+ {
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[0] = 1;
+ PlaySE12WithPanning(SE_W234, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));
+ }
+ break;
+ case 4:
+ sub_80752A0(&animBg);
+ sub_8075358(animBg.bgId);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void AnimGreenStar(struct Sprite *sprite)
+{
+ s16 xOffset;
+ u8 spriteId1;
+ u8 spriteId2;
+
+ xOffset = Random();
+ xOffset &= 0x3F;
+ if (xOffset > 31)
+ xOffset = 32 - xOffset;
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + xOffset;
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 32;
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+
+ spriteId1 = CreateSprite(&gGreenStarSpriteTemplate, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1);
+ spriteId2 = CreateSprite(&gGreenStarSpriteTemplate, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1);
+ StartSpriteAnim(&gSprites[spriteId1], 1);
+ StartSpriteAnim(&gSprites[spriteId2], 2);
+
+ gSprites[spriteId1].data[1] = gBattleAnimArgs[0];
+ gSprites[spriteId1].data[2] = gBattleAnimArgs[1];
+ gSprites[spriteId2].data[1] = gBattleAnimArgs[0];
+ gSprites[spriteId2].data[2] = gBattleAnimArgs[1];
+ gSprites[spriteId1].data[7] = -1;
+ gSprites[spriteId2].data[7] = -1;
+ gSprites[spriteId1].invisible = TRUE;
+ gSprites[spriteId2].invisible = TRUE;
+ gSprites[spriteId1].callback = AnimGreenStar_Callback;
+ gSprites[spriteId2].callback = AnimGreenStar_Callback;
+
+ sprite->data[6] = spriteId1;
+ sprite->data[7] = spriteId2;
+ sprite->callback = AnimGreenStar_Step1;
+}
+
+static void AnimGreenStar_Step1(struct Sprite *sprite)
+{
+ s16 delta = sprite->data[3] + sprite->data[2];
+
+ sprite->pos2.y -= delta >> 8;
+ sprite->data[3] += sprite->data[2];
+ sprite->data[3] &= 0xFF;
+ if (sprite->data[4] == 0 && sprite->pos2.y < -8)
+ {
+ gSprites[sprite->data[6]].invisible = FALSE;
+ sprite->data[4]++;
+ }
+
+ if (sprite->data[4] == 1 && sprite->pos2.y < -16)
+ {
+ gSprites[sprite->data[7]].invisible = FALSE;
+ sprite->data[4]++;
+ }
+
+ if (--sprite->data[1] == -1)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = AnimGreenStar_Step2;
+ }
+}
+
+static void AnimGreenStar_Step2(struct Sprite *sprite)
+{
+ if (gSprites[sprite->data[6]].callback == SpriteCallbackDummy
+ && gSprites[sprite->data[7]].callback == SpriteCallbackDummy)
+ {
+ DestroySprite(&gSprites[sprite->data[6]]);
+ DestroySprite(&gSprites[sprite->data[7]]);
+ DestroyAnimSprite(sprite);
+ }
+}
+
+static void AnimGreenStar_Callback(struct Sprite *sprite)
+{
+ if (!sprite->invisible)
+ {
+ s16 delta = sprite->data[3] + sprite->data[2];
+ sprite->pos2.y -= delta >> 8;
+ sprite->data[3] += sprite->data[2];
+ sprite->data[3] &= 0xFF;
+ if (--sprite->data[1] == -1)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ }
+}
+
+void AnimTask_DoomDesireLightBeam(u8 taskId)
+{
+ struct BattleAnimBgData animBg;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, 13));
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+
+ sub_80752A0(&animBg);
+ AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnim_MorningSunTilemap);
+ AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnim_MorningSunGfx, animBg.tilesOffset);
+ LoadCompressedPalette(gBattleAnim_MorningSunPal, animBg.paletteId * 16, 32);
+
+ if (IsContest())
+ {
+ sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0);
+ gBattle_BG1_X = -56;
+ gBattle_BG1_Y = 0;
+ }
+ else
+ {
+ u8 position = GetBattlerPosition(gBattleAnimTarget);
+ if (IsDoubleBattle() == TRUE)
+ {
+ if (position == B_POSITION_OPPONENT_LEFT)
+ gBattle_BG1_X = -155;
+ if (position == B_POSITION_OPPONENT_RIGHT)
+ gBattle_BG1_X = -115;
+ if (position == B_POSITION_PLAYER_LEFT)
+ gBattle_BG1_X = 14;
+ if (position == B_POSITION_PLAYER_RIGHT)
+ gBattle_BG1_X = -20;
+ }
+ else
+ {
+ if (position == B_POSITION_OPPONENT_LEFT)
+ gBattle_BG1_X = -135;
+ if (position == B_POSITION_PLAYER_LEFT)
+ gBattle_BG1_X = -10;
+ }
+
+ gBattle_BG1_Y = 0;
+ }
+
+ gTasks[taskId].data[10] = gBattle_BG1_X;
+ gTasks[taskId].data[11] = gBattle_BG1_Y;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ gTasks[taskId].data[3] = 0;
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
+ gBattle_BG1_X = gTasks[taskId].data[10] + sDoomDesireLightBeamCoordTable[gTasks[taskId].data[2]];
+ else
+ gBattle_BG1_X = gTasks[taskId].data[10] - sDoomDesireLightBeamCoordTable[gTasks[taskId].data[2]];
+
+ if (++gTasks[taskId].data[2] == 5)
+ gTasks[taskId].data[0] = 5;
+ else
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ if (--gTasks[taskId].data[1] <= 4)
+ gTasks[taskId].data[1] = 5;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, gTasks[taskId].data[1]));
+ if (gTasks[taskId].data[1] == 5)
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (++gTasks[taskId].data[3] > sDoomDesireLightBeamDelayTable[gTasks[taskId].data[2]])
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ if (++gTasks[taskId].data[1] > 13)
+ gTasks[taskId].data[1] = 13;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(3, gTasks[taskId].data[1]));
+ if (gTasks[taskId].data[1] == 13)
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 5:
+ sub_80752A0(&animBg);
+ sub_8075358(animBg.bgId);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Briefly vertically grows and shrinks the attacking mon's sprite.
+// No args.
+void AnimTask_StrongFrustrationGrowAndShrink(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(ANIM_ATTACKER), sStrongFrustrationAffineAnimCmds);
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// Animates an anger mark near the mon's head.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+void AnimWeakFrustrationAngerMark(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ InitSpritePosToAnimAttacker(sprite, 0);
+ sprite->data[0]++;
+ }
+ else if (sprite->data[0]++ > 20)
+ {
+ sprite->data[1] += 160;
+ sprite->data[2] += 128;
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ sprite->pos2.x = -(sprite->data[1] >> 8);
+ else
+ sprite->pos2.x = sprite->data[1] >> 8;
+
+ sprite->pos2.y += sprite->data[2] >> 8;
+ if (sprite->pos2.y > 64)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Rocks the mon back and forth. This is done on a pivot so it is done via rotation.
+// arg 0: which battler
+// arg 1: number of rocks
+// arg 2: rotation speed increase
+void AnimTask_RockMonBackAndForth(u8 taskId)
+{
+ u8 side;
+ struct Task *task = &gTasks[taskId];
+
+ if (!gBattleAnimArgs[1])
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ if (gBattleAnimArgs[2] < 0)
+ gBattleAnimArgs[2] = 0;
+ if (gBattleAnimArgs[2] > 2)
+ gBattleAnimArgs[2] = 2;
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 8 - (2 * gBattleAnimArgs[2]);
+ task->data[4] = 0x100 + (gBattleAnimArgs[2] * 128);
+ task->data[5] = gBattleAnimArgs[2] + 2;
+ task->data[6] = gBattleAnimArgs[1] - 1;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ side = GetBattlerSide(gBattleAnimAttacker);
+ else
+ side = GetBattlerSide(gBattleAnimTarget);
+
+ if (side == B_SIDE_OPPONENT)
+ {
+ task->data[4] *= -1;
+ task->data[5] *= -1;
+ }
+
+ PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);
+ task->func = AnimTask_RockMonBackAndForthStep;
+}
+
+static void AnimTask_RockMonBackAndForthStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ gSprites[task->data[15]].pos2.x += task->data[5];
+ task->data[2] -= task->data[4];
+ SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);
+ SetBattlerSpriteYOffsetFromRotation(task->data[15]);
+ if (++task->data[1] >= task->data[3])
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ gSprites[task->data[15]].pos2.x -= task->data[5];
+ task->data[2] += task->data[4];
+ SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);
+ SetBattlerSpriteYOffsetFromRotation(task->data[15]);
+ if (++task->data[1] >= task->data[3] * 2)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ gSprites[task->data[15]].pos2.x += task->data[5];
+ task->data[2] -= task->data[4];
+ SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);
+ SetBattlerSpriteYOffsetFromRotation(task->data[15]);
+ if (++task->data[1] >= task->data[3])
+ {
+ if (task->data[6])
+ {
+ task->data[6]--;
+ task->data[1] = 0;
+ task->data[0] = 0;
+ }
+ else
+ {
+ task->data[0]++;
+ }
+ }
+ break;
+ case 3:
+ ResetSpriteRotScale(task->data[15]);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Floats a petal across the screen towards the target mon's side.
+// arg 0: initial y pixel offset
+// arg 1: sprite anim num
+// arg 2: unused
+void AnimSweetScentPetal(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x = 0;
+ sprite->pos1.y = gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x = 240;
+ sprite->pos1.y = gBattleAnimArgs[0] - 30;
+ }
+
+ sprite->data[2] = gBattleAnimArgs[2];
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+ sprite->callback = AnimSweetScentPetalStep;
+}
+
+static void AnimSweetScentPetalStep(struct Sprite *sprite)
+{
+ sprite->data[0] += 3;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x += 5;
+ sprite->pos1.y -= 1;
+
+ if (sprite->pos1.x > 240)
+ DestroyAnimSprite(sprite);
+
+ sprite->pos2.y = Sin(sprite->data[0] & 0xFF, 16);
+ }
+ else
+ {
+ sprite->pos1.x -= 5;
+ sprite->pos1.y += 1;
+
+ if (sprite->pos1.x < 0)
+ DestroyAnimSprite(sprite);
+
+ sprite->pos2.y = Cos(sprite->data[0] & 0xFF, 16);
+ }
+}
+
+// Moves the mon sprite in a flailing back-and-forth motion.
+// arg 0: which battler
+void AnimTask_FlailMovement(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] = 0x20;
+ task->data[13] = 0x40;
+ task->data[14] = 0x800;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+
+ PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);
+ task->func = AnimTask_FlailMovementStep;
+}
+
+static void AnimTask_FlailMovementStep(u8 taskId)
+{
+ int temp;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[2] += 0x200;
+ if (task->data[2] >= task->data[14])
+ {
+ s16 diff = task->data[14] - task->data[2];
+ s16 div = diff / (task->data[14] * 2);
+ s16 mod = diff % (task->data[14] * 2);
+
+ if ((div & 1) == 0)
+ {
+ task->data[2] = task->data[14] - mod;
+ task->data[0] = 1;
+ }
+ else
+ {
+ task->data[2] = mod - task->data[14];
+ }
+ }
+ break;
+ case 1:
+ task->data[2] -= 0x200;
+ if (task->data[2] <= -task->data[14])
+ {
+ s16 diff = task->data[14] - task->data[2];
+ s16 div = diff / (task->data[14] * 2);
+ s16 mod = diff % (task->data[14] * 2);
+
+ if ((1 & div) == 0)
+ {
+ task->data[2] = mod - task->data[14];
+ task->data[0] = 0;
+ }
+ else
+ {
+ task->data[2] = task->data[14] - mod;
+ }
+ }
+ break;
+ case 2:
+ ResetSpriteRotScale(task->data[15]);
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ SetSpriteRotScale(task->data[15], 0x100, 0x100, task->data[2]);
+ SetBattlerSpriteYOffsetFromRotation(task->data[15]);
+ gSprites[task->data[15]].pos2.x = -(((temp = task->data[2]) >= 0 ? task->data[2] : temp + 63) >> 6);
+ if (++task->data[1] > 8)
+ {
+ if (task->data[12])
+ {
+ task->data[12]--;
+ task->data[14] -= task->data[13];
+ if (task->data[14] < 16)
+ task->data[14] = 16;
+ }
+ else
+ {
+ task->data[0] = 2;
+ }
+ }
+}
+
+// Makes a spark-like projectile fall on top of the mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: which battler
+void AnimPainSplitProjectile(struct Sprite *sprite)
+{
+ if (!sprite->data[0])
+ {
+ if (gBattleAnimArgs[2] == ANIM_ATTACKER)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ }
+
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] = 0x80;
+ sprite->data[2] = 0x300;
+ sprite->data[3] = gBattleAnimArgs[1];
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->pos2.x = sprite->data[1] >> 8;
+ sprite->pos2.y += sprite->data[2] >> 8;
+ if (sprite->data[4] == 0 && sprite->pos2.y > -sprite->data[3])
+ {
+ sprite->data[4] = 1;
+ sprite->data[2] = (-sprite->data[2] / 3) * 2;
+ }
+
+ sprite->data[1] += 192;
+ sprite->data[2] += 128;
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Performs one of several affine transformations on the mon sprite.
+// arg 0: which battler
+// arg 1: which transformation
+void AnimTask_PainSplitMovement(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[0] == 0)
+ {
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ gTasks[taskId].data[11] = gBattleAnimAttacker;
+ else
+ gTasks[taskId].data[11] = gBattleAnimTarget;
+
+ spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ gTasks[taskId].data[10] = spriteId;
+ PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);
+
+ switch (gBattleAnimArgs[1])
+ {
+ case 0:
+ SetSpriteRotScale(spriteId, 0xE0, 0x140, 0);
+ SetBattlerSpriteYOffsetFromYScale(spriteId);
+ break;
+ case 1:
+ SetSpriteRotScale(spriteId, 0xD0, 0x130, 0xF00);
+ SetBattlerSpriteYOffsetFromYScale(spriteId);
+ if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.y += 16;
+ break;
+ case 2:
+ SetSpriteRotScale(spriteId, 0xD0, 0x130, 0xF100);
+ SetBattlerSpriteYOffsetFromYScale(spriteId);
+ if (IsContest() || GetBattlerSide(gTasks[taskId].data[11]) == B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.y += 16;
+ break;
+ }
+
+ gSprites[spriteId].pos2.x = 2;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ spriteId = gTasks[taskId].data[10];
+ if (++gTasks[taskId].data[2] == 3)
+ {
+ gTasks[taskId].data[2] = 0;
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ }
+
+ if (++gTasks[taskId].data[1] == 13)
+ {
+ ResetSpriteRotScale(spriteId);
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+// Move a piece of confetti in a slightly-random speed across the screen.
+// arg 0: which battler the confetti starts from
+void AnimFlatterConfetti(struct Sprite *sprite)
+{
+ u8 tileOffset;
+ int rand1;
+ int rand2;
+
+ tileOffset = Random() % 12;
+ sprite->oam.tileNum += tileOffset;
+ rand1 = Random() & 0x1FF;
+ rand2 = Random() & 0xFF;
+
+ if (rand1 & 1)
+ sprite->data[0] = 0x5E0 + rand1;
+ else
+ sprite->data[0] = 0x5E0 - rand1;
+
+ if (rand2 & 1)
+ sprite->data[1] = 0x480 + rand2;
+ else
+ sprite->data[1] = 0x480 - rand2;
+
+ sprite->data[2] = gBattleAnimArgs[0];
+ if (sprite->data[2] == ANIM_ATTACKER)
+ sprite->pos1.x = -8;
+ else
+ sprite->pos1.x = 248;
+
+ sprite->pos1.y = 104;
+ sprite->callback = AnimFlatterConfettiStep;
+}
+
+static void AnimFlatterConfettiStep(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->pos2.x += sprite->data[0] >> 8;
+ sprite->pos2.y -= sprite->data[1] >> 8;
+ }
+ else
+ {
+ sprite->pos2.x -= sprite->data[0] >> 8;
+ sprite->pos2.y -= sprite->data[1] >> 8;
+ }
+
+ sprite->data[0] -= 22;
+ sprite->data[1] -= 48;
+ if (sprite->data[0] < 0)
+ sprite->data[0] = 0;
+
+ if (++sprite->data[3] == 31)
+ DestroyAnimSprite(sprite);
+}
+
+// Uses a spotlight sprite as a light mask to illuminate the target mon. The spotlight grows and shrinks.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: duration of fully-opened spotlight
+void AnimFlatterSpotlight(struct Sprite *sprite)
+{
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H);
+ SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V);
+ sprite->data[0] = gBattleAnimArgs[2];
+ InitSpritePosToAnimTarget(sprite, FALSE);
+ sprite->oam.objMode = ST_OAM_OBJ_WINDOW;
+ sprite->invisible = TRUE;
+ sprite->callback = AnimFlatterSpotlightStep;
+}
+
+static void AnimFlatterSpotlightStep(struct Sprite *sprite)
+{
+ switch (sprite->data[1])
+ {
+ case 0:
+ sprite->invisible = FALSE;
+ if (sprite->affineAnimEnded)
+ sprite->data[1]++;
+ break;
+ case 1:
+ if (--sprite->data[0] == 0)
+ {
+ ChangeSpriteAffineAnim(sprite, 1);
+ sprite->data[1]++;
+ }
+ break;
+ case 2:
+ if (sprite->affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->data[1]++;
+ }
+ break;
+ case 3:
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
+ SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+// Spins an orb around the attacking mon, while its path radius grows and shrinks.
+// arg 0: duration
+// arg 1: initial wave offset
+void AnimReversalOrb(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->callback = AnimReversalOrbStep;
+ sprite->callback(sprite);
+}
+
+static void AnimReversalOrbStep(struct Sprite *sprite)
+{
+ 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;
+
+ if ((u16)sprite->data[1] < 64 || sprite->data[1] > 195)
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;
+ else
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1;
+
+ if (!sprite->data[5])
+ {
+ sprite->data[2] += 0x400;
+ sprite->data[3] += 0x100;
+ sprite->data[4]++;
+ if (sprite->data[4] == sprite->data[0])
+ {
+ sprite->data[4] = 0;
+ sprite->data[5] = 1;
+ }
+ }
+ else if (sprite->data[5] == 1)
+ {
+ sprite->data[2] -= 0x400;
+ sprite->data[3] -= 0x100;
+ sprite->data[4]++;
+ if (sprite->data[4] == sprite->data[0])
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Copies the target mon's sprite, and makes a white silhouette that shrinks away.
+void AnimTask_RolePlaySilhouette(u8 taskId)
+{
+ bool8 isBackPic;
+ u32 personality;
+ u32 otId;
+ u16 species;
+ s16 xOffset;
+ u32 priority;
+ u8 spriteId;
+ s16 coord1, coord2;
+
+ GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ isBackPic = FALSE;
+ personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID);
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE)
+ {
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);
+ else
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);
+ }
+ else
+ {
+ species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies;
+ }
+
+ xOffset = 20;
+ priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
+ }
+ else
+ {
+ isBackPic = TRUE;
+ personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_OT_ID);
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies == SPECIES_NONE)
+ {
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);
+ else
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimTarget]], MON_DATA_SPECIES);
+ }
+ else
+ {
+ species = gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].transformSpecies;
+ }
+
+ xOffset = -20;
+ priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
+ }
+
+ coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ spriteId = sub_80768D0(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId, gBattleAnimTarget, 1);
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
+ FillPalette(RGB_WHITE, (gSprites[spriteId].oam.paletteNum << 4) + 0x100, 32);
+ gSprites[spriteId].oam.priority = priority;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].func = AnimTask_RolePlaySilhouetteStep1;
+}
+
+static void AnimTask_RolePlaySilhouetteStep1(u8 taskId)
+{
+ if (gTasks[taskId].data[10]++ > 1)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[1]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
+ if (gTasks[taskId].data[1] == 10)
+ {
+ gTasks[taskId].data[10] = 256;
+ gTasks[taskId].data[11] = 256;
+ gTasks[taskId].func = AnimTask_RolePlaySilhouetteStep2;
+ }
+ }
+}
+
+static void AnimTask_RolePlaySilhouetteStep2(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+
+ gTasks[taskId].data[10] -= 16;
+ gTasks[taskId].data[11] += 128;
+ gSprites[spriteId].oam.affineMode |= ST_OAM_AFFINE_DOUBLE_MASK;
+ TrySetSpriteRotScale(&gSprites[spriteId], TRUE, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);
+ if (++gTasks[taskId].data[12] == 9)
+ {
+ sub_8075AD8(&gSprites[spriteId]);
+ DestroySpriteAndFreeResources_(&gSprites[spriteId]);
+ gTasks[taskId].func = DestroyAnimVisualTaskAndDisableBlend;
+ }
+}
+
+// Performs a wavy transformation on the mon's sprite, and fades out.
+// arg 0: which battler
+void AnimTask_AcidArmor(u8 taskId)
+{
+ u8 battler;
+ u16 bgX, bgY;
+ s16 y, i;
+ struct ScanlineEffectParams scanlineParams;
+ struct Task *task = &gTasks[taskId];
+
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 16;
+ task->data[4] = 0;
+ task->data[5] = battler;
+ task->data[6] = 32;
+ task->data[7] = 0;
+ task->data[8] = 24;
+
+ if (GetBattlerSide(battler) == B_SIDE_OPPONENT)
+ task->data[8] *= -1;
+
+ task->data[13] = GetBattlerYCoordWithElevation(battler) - 34;
+ if (task->data[13] < 0)
+ task->data[13] = 0;
+
+ task->data[14] = task->data[13] + 66;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ if (GetBattlerSpriteBGPriorityRank(battler) == 1)
+ {
+ scanlineParams.dmaDest = &REG_BG1HOFS;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
+ bgX = gBattle_BG1_X;
+ bgY = gBattle_BG1_Y;
+ }
+ else
+ {
+ scanlineParams.dmaDest = &REG_BG2HOFS;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
+ bgX = gBattle_BG2_X;
+ bgY = gBattle_BG2_Y;
+ }
+
+ for (y = 0, i = 0; y < 160; y++, i += 2)
+ {
+ gScanlineEffectRegBuffers[0][i] = bgX;
+ gScanlineEffectRegBuffers[1][i] = bgX;
+ gScanlineEffectRegBuffers[0][i + 1] = bgY;
+ gScanlineEffectRegBuffers[1][i + 1] = bgY;
+ }
+
+ scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_32BIT;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ ScanlineEffect_SetParams(scanlineParams);
+ task->func = AnimTask_AcidArmorStep;
+}
+
+static void AnimTask_AcidArmorStep(u8 taskId)
+{
+ struct Task *task;
+ s16 var1;
+ s16 var2;
+ s16 bgX, bgY;
+ s16 offset;
+ s16 var0;
+ s16 i;
+ s16 sineIndex;
+ s16 var3;
+
+ task = &gTasks[taskId];
+ if (GetBattlerSpriteBGPriorityRank(task->data[5]) == 1)
+ {
+ bgX = gBattle_BG1_X;
+ bgY = gBattle_BG1_Y;
+ }
+ else
+ {
+ bgX = gBattle_BG2_X;
+ bgY = gBattle_BG2_Y;
+ }
+
+ switch (task->data[0])
+ {
+ case 0:
+ offset = task->data[14] * 2;
+ var1 = 0;
+ var2 = 0;
+ i = 0;
+ task->data[1] = (task->data[1] + 2) & 0xFF;
+ sineIndex = task->data[1];
+ task->data[9] = 0x7E0 / task->data[6];
+ task->data[10] = -((task->data[7] * 2) / task->data[9]);
+ task->data[11] = task->data[7];
+ var3 = task->data[11] >> 5;
+ task->data[12] = var3;
+ var0 = task->data[14];
+ while (var0 > task->data[13])
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset + 1] = (i - var2) + bgY;
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][offset] = bgX + var3 + (gSineTable[sineIndex] >> 5);
+ sineIndex = (sineIndex + 10) & 0xFF;
+ task->data[11] += task->data[10];
+ var3 = task->data[11] >> 5;
+ task->data[12] = var3;
+
+ i++;
+ offset -= 2;
+ var1 += task->data[6];
+ var2 = var1 >> 5;
+ var0--;
+ }
+
+ var0 *= 2;
+ while (var0 >= 0)
+ {
+ gScanlineEffectRegBuffers[0][var0] = bgX + 240;
+ gScanlineEffectRegBuffers[1][var0] = bgX + 240;
+ var0 -= 2;
+ }
+
+ if (++task->data[6] > 63)
+ {
+ task->data[6] = 64;
+ task->data[2]++;
+ if (task->data[2] & 1)
+ task->data[3]--;
+ else
+ task->data[4]++;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));
+ if (task->data[3] == 0 && task->data[4] == 16)
+ {
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+ }
+ else
+ {
+ task->data[7] += task->data[8];
+ }
+ break;
+ case 1:
+ if (++task->data[2] > 12)
+ {
+ gScanlineEffect.state = 3;
+ task->data[2] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ task->data[2]++;
+ if (task->data[2] & 1)
+ task->data[3]++;
+ else
+ task->data[4]--;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4]));
+ if (task->data[3] == 16 && task->data[4] == 0)
+ {
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Runs an affine animation that makes it look like the mon is inhaling deeply.
+// arg 0: which battler
+void AnimTask_DeepInhale(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0] = 0;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], task->data[15], sDeepInhaleAffineAnimCmds);
+ task->func = AnimTask_DeepInhaleStep;
+}
+
+static void AnimTask_DeepInhaleStep(u8 taskId)
+{
+ u16 var0;
+ struct Task *task = &gTasks[taskId];
+
+ var0 = task->data[0];
+ task->data[0]++;
+ var0 -= 20;
+ if (var0 < 23)
+ {
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.x = 1;
+ else
+ gSprites[task->data[15]].pos2.x = -1;
+ }
+ }
+ else
+ {
+ gSprites[task->data[15]].pos2.x = 0;
+ }
+
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+}
+
+static void InitYawnCloudPosition(struct Sprite *sprite, s16 startX, s16 startY, s16 destX, s16 destY, u16 duration)
+{
+ sprite->pos1.x = startX;
+ sprite->pos1.y = startY;
+ sprite->data[4] = startX << 4;
+ sprite->data[5] = startY << 4;
+ sprite->data[6] = ((destX - startX) << 4) / duration;
+ sprite->data[7] = ((destY - startY) << 4) / duration;
+}
+
+static void UpdateYawnCloudPosition(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;
+}
+
+// Drifts a cloud in a wavy path towards the target mon.
+// arg 0: which affine anim
+void AnimYawnCloud(struct Sprite *sprite)
+{
+ s16 destX = sprite->pos1.x;
+ s16 destY = sprite->pos1.y;
+
+ SetSpriteCoordsToAnimAttackerCoords(sprite);
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]);
+ InitYawnCloudPosition(sprite, sprite->pos1.x, sprite->pos1.y, destX, destY, 64);
+ sprite->data[0] = 0;
+ sprite->callback = AnimYawnCloudStep;
+}
+
+static void AnimYawnCloudStep(struct Sprite *sprite)
+{
+ int index;
+
+ sprite->data[0]++;
+ index = (sprite->data[0] * 8) & 0xFF;
+ UpdateYawnCloudPosition(sprite);
+ sprite->pos2.y = Sin(index, 8);
+ if (sprite->data[0] > 58)
+ {
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2]++;
+ sprite->invisible = sprite->data[2] & 1;
+ if (sprite->data[2] > 3)
+ DestroySpriteAndMatrix(sprite);
+ }
+ }
+}
+
+// Animates a cloud coming from the smoke ball.
+// arg 0: ?
+// arg 1: initial x pixel offset
+// arg 2: initial y pixel offset
+// arg 3: ?
+void AnimSmokeBallEscapeCloud(struct Sprite *sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[3];
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[0]);
+ if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
+ sprite->callback = sub_80B1D3C;
+}
+
+static void sub_80E1990(u8 taskId)
+{
+ u16 var0 = 0;
+ u16 var1 = 0;
+
+ gTasks[taskId].data[0]--;
+ if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1))
+ {
+ if (gTasks[taskId].data[9] == 0)
+ {
+ gTasks[taskId].data[9] = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -gTasks[taskId].data[4];
+ }
+ else
+ {
+ gTasks[taskId].data[9] = 0;
+ }
+
+ if (gTasks[taskId].data[10] == 0)
+ {
+ gTasks[taskId].data[10] = gTasks[taskId].data[5];
+ gTasks[taskId].data[5] = -gTasks[taskId].data[5];
+ }
+ else
+ {
+ gTasks[taskId].data[10] = 0;
+ }
+
+ gTasks[taskId].data[1] = gTasks[taskId].data[13];
+ }
+
+ var0 = gTasks[taskId].data[7];
+ var1 = gTasks[taskId].data[8];
+ if (gTasks[taskId].data[2] & 0x8000)
+ gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] - (var0 >> 8);
+ else
+ gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] + (var0 >> 8);
+
+ if (gTasks[taskId].data[3] & 0x8000)
+ gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] - (var1 >> 8);
+ else
+ gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] + (var1 >> 8);
+
+ if (gTasks[taskId].data[0] < 1)
+ {
+ DestroyTask(taskId);
+ gAnimVisualTaskCount--;
+ }
+}
+
+static void sub_80E1AD8(u8 taskId)
+{
+ u16 var0 = 0;
+ u16 var1 = 0;
+
+ gTasks[taskId].data[0]--;
+ if ((gTasks[taskId].data[6] & 0x8000) && (--gTasks[taskId].data[1] == -1))
+ {
+ if (gTasks[taskId].data[9] == 0)
+ {
+ gTasks[taskId].data[9] = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -gTasks[taskId].data[4];
+ }
+ else
+ {
+ gTasks[taskId].data[9] = var0;
+ }
+
+ if (gTasks[taskId].data[10] == 0)
+ {
+ gTasks[taskId].data[10] = gTasks[taskId].data[5];
+ gTasks[taskId].data[5] = -gTasks[taskId].data[5];
+ }
+ else
+ {
+ gTasks[taskId].data[10] = 0;
+ }
+
+ gTasks[taskId].data[1] = gTasks[taskId].data[13];
+ }
+
+ var0 = (gTasks[taskId].data[2] & 0x7FFF) + gTasks[taskId].data[7];
+ var1 = (gTasks[taskId].data[3] & 0x7FFF) + gTasks[taskId].data[8];
+ if (gTasks[taskId].data[2] & 0x8000)
+ gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] - (var0 >> 8);
+ else
+ gSprites[gTasks[taskId].data[15]].pos2.x = gTasks[taskId].data[9] + (var0 >> 8);
+
+ if (gTasks[taskId].data[3] & 0x8000)
+ gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] - (var1 >> 8);
+ else
+ gSprites[gTasks[taskId].data[15]].pos2.y = gTasks[taskId].data[10] + (var1 >> 8);
+
+ gTasks[taskId].data[7] = var0;
+ gTasks[taskId].data[8] = var1;
+ if (gTasks[taskId].data[0] < 1)
+ {
+ gTasks[taskId].data[0] = 30;
+ gTasks[taskId].data[13] = 0;
+ gTasks[taskId].func = sub_80E1990;
+ }
+}
+
+void sub_80E1C48(u8 taskId)
+{
+ gTasks[taskId].data[15] = gBattlerSpriteIds[gBattleAnimAttacker];
+ gTasks[taskId].data[14] = gBattleAnimArgs[0];
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[13] = gBattleAnimArgs[6];
+ if (gBattleAnimArgs[3])
+ gTasks[taskId].data[6] = gTasks[taskId].data[6] | -0x8000;
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ gTasks[taskId].data[2] = gBattleAnimArgs[1];
+ gTasks[taskId].data[3] = gBattleAnimArgs[2];
+ }
+ else
+ {
+ if (gBattleAnimArgs[1] & 0x8000)
+ gTasks[taskId].data[2] = gBattleAnimArgs[1] & 0x7FFF;
+ else
+ gTasks[taskId].data[2] = gBattleAnimArgs[1] | -0x8000;
+
+ if (gBattleAnimArgs[2] & 0x8000)
+ gTasks[taskId].data[3] = gBattleAnimArgs[2] & 0x7FFF;
+ else
+ gTasks[taskId].data[3] = gBattleAnimArgs[2] | -0x8000;
+ }
+
+ gTasks[taskId].data[8] = 0;
+ gTasks[taskId].data[7] = 0;
+ gTasks[taskId].data[4] = gBattleAnimArgs[4];
+ gTasks[taskId].data[5] = gBattleAnimArgs[5];
+ gTasks[taskId].func = sub_80E1AD8;
+}
+
+// Squishes the mon vertically and emits sweat droplets a few times.
+// arg 0: battler
+// arg 1: num squishes
+void AnimTask_SquishAndSweatDroplets(u8 taskId)
+{
+ u8 battler;
+ struct Task *task = &gTasks[taskId];
+
+ if (!gBattleAnimArgs[1])
+ DestroyAnimVisualTask(taskId);
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = gBattleAnimArgs[1];
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ task->data[4] = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);
+ task->data[5] = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y);
+ task->data[6] = GetBattlerSpriteSubpriority(battler);
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ PrepareAffineAnimInTaskData(task, task->data[15], sFacadeSquishAffineAnimCmds);
+ task->func = AnimTask_SquishAndSweatDropletsStep;
+}
+
+static void AnimTask_SquishAndSweatDropletsStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[1]++;
+ if (task->data[1] == 6)
+ CreateSweatDroplets(taskId, TRUE);
+
+ if (task->data[1] == 18)
+ CreateSweatDroplets(taskId, FALSE);
+
+ if (!RunAffineAnimFromTaskData(task))
+ {
+ if (--task->data[3] == 0)
+ {
+ task->data[0]++;
+ }
+ else
+ {
+ task->data[1] = 0;
+ PrepareAffineAnimInTaskData(task, task->data[15], sFacadeSquishAffineAnimCmds);
+ }
+ }
+ break;
+ case 1:
+ if (task->data[2] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void CreateSweatDroplets(u8 taskId, bool8 arg1)
+{
+ u8 i;
+ s8 xOffset, yOffset;
+ struct Task *task;
+ s16 xCoords[4];
+ s16 yCoords[2];
+
+ task = &gTasks[taskId];
+ if (!arg1)
+ {
+ xOffset = 18;
+ yOffset = -20;
+ }
+ else
+ {
+ xOffset = 30;
+ yOffset = 20;
+ }
+
+ xCoords[0] = task->data[4] - xOffset;
+ xCoords[1] = task->data[4] - xOffset - 4;
+ xCoords[2] = task->data[4] + xOffset;
+ xCoords[3] = task->data[4] + xOffset + 4;
+ yCoords[0] = task->data[5] + yOffset;
+ yCoords[1] = task->data[5] + yOffset + 6;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 spriteId = CreateSprite(&gFacadeSweatDropSpriteTemplate, xCoords[i], yCoords[i & 1], task->data[6] - 5);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = i < 2 ? -2 : 2;
+ gSprites[spriteId].data[2] = -1;
+ gSprites[spriteId].data[3] = taskId;
+ gSprites[spriteId].data[4] = 2;
+ task->data[2]++;
+ }
+ }
+}
+
+void AnimFacadeSweatDrop(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->data[1];
+ sprite->pos1.y += sprite->data[2];
+ if (++sprite->data[0] > 6)
+ {
+ gTasks[sprite->data[3]].data[sprite->data[4]]--;
+ DestroySprite(sprite);
+ }
+}
+
+// Blends the mon sprite's color with a rotating set of colors.
+// arg 0: battler
+// arg 1: duration
+void AnimTask_FacadeColorBlend(u8 taskId)
+{
+ u8 spriteId;
+
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ gTasks[taskId].data[2] = 0x100 + gSprites[spriteId].oam.paletteNum * 16;
+ gTasks[taskId].func = AnimTask_FacadeColorBlendStep;
+}
+
+static void AnimTask_FacadeColorBlendStep(u8 taskId)
+{
+ if (gTasks[taskId].data[1])
+ {
+ BlendPalette(gTasks[taskId].data[2], 16, 8, sFacadeBlendColors[gTasks[taskId].data[0]]);
+ if (++gTasks[taskId].data[0] > 23)
+ gTasks[taskId].data[0] = 0;
+
+ gTasks[taskId].data[1]--;
+ }
+ else
+ {
+ BlendPalette(gTasks[taskId].data[2], 16, 0, RGB_BLACK);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80E2084(u8 taskId)
+{
+ sub_80BBA20(taskId, 0, 0x1A0, gBattleAnimAttacker, gBattleAnimArgs[0], 10, 2, 30, gCureBubblesGfx, gCureBubblesTilemap, gCureBubblesPal);
+}
+
+// Moves a noise line from the mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: which direction (0 = upward, 1 = downward, 2 = horizontal)
+void AnimRoarNoiseLine(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1];
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->data[0] = 0x280;
+ sprite->data[1] = -0x280;
+ }
+ else if (gBattleAnimArgs[2] == 1)
+ {
+ sprite->vFlip = TRUE;
+ sprite->data[0] = 0x280;
+ sprite->data[1] = 0x280;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 0x280;
+ }
+
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ sprite->data[0] = -sprite->data[0];
+ sprite->hFlip = TRUE;
+ }
+
+ sprite->callback = AnimRoarNoiseLineStep;
+}
+
+static void AnimRoarNoiseLineStep(struct Sprite *sprite)
+{
+ sprite->data[6] += sprite->data[0];
+ sprite->data[7] += sprite->data[1];
+ sprite->pos2.x = sprite->data[6] >> 8;
+ sprite->pos2.y = sprite->data[7] >> 8;
+ if (++sprite->data[5] == 14)
+ DestroyAnimSprite(sprite);
+}
+
+// Makes a series of dots in a trail from the attacker to the target.
+// arg 0: unused
+void AnimTask_GlareEyeDots(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[5] = 12;
+ task->data[6] = 3;
+ task->data[7] = 0;
+
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;
+ else
+ task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;
+
+ task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 4;
+ task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ task->func = AnimTask_GlareEyeDotsStep;
+}
+
+static void AnimTask_GlareEyeDotsStep(u8 taskId)
+{
+ u8 i;
+ s16 x, y;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 3)
+ {
+ task->data[1] = 0;
+ GetGlareEyeDotCoords(
+ task->data[11],
+ task->data[12],
+ task->data[13],
+ task->data[14],
+ task->data[5],
+ task->data[2],
+ &x,
+ &y);
+
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&gGlareEyeDotSpriteTemplate, x, y, 35);
+ if (spriteId != MAX_SPRITES)
+ {
+ if (task->data[7] == 0)
+ {
+ if (i == 0)
+ gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = -task->data[6];
+ else
+ gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = task->data[6];
+ }
+ else
+ {
+ if (i == 0)
+ {
+ gSprites[spriteId].pos2.x = -task->data[6];
+ gSprites[spriteId].pos2.y = task->data[6];
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x = task->data[6];
+ gSprites[spriteId].pos2.y = -task->data[6];
+ }
+ }
+
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = taskId;
+ gSprites[spriteId].data[2] = 10;
+ task->data[10]++;
+ }
+ }
+
+ if (task->data[2] == task->data[5])
+ task->data[0]++;
+
+ task->data[2]++;
+ }
+ break;
+ case 1:
+ if (task->data[10] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void GetGlareEyeDotCoords(s16 arg0, s16 arg1, s16 arg2, s16 arg3, u8 arg4, u8 arg5, s16 *x, s16 *y)
+{
+ int x2;
+ int y2;
+
+ if (arg5 == 0)
+ {
+ *x = arg0;
+ *y = arg1;
+ return;
+ }
+
+ if (arg5 >= arg4)
+ {
+ *x = arg2;
+ *y = arg3;
+ return;
+ }
+
+ arg4--;
+ x2 = (arg0 << 8) + arg5 * (((arg2 - arg0) << 8) / arg4);
+ y2 = (arg1 << 8) + arg5 * (((arg3 - arg1) << 8) / arg4);
+ *x = x2 >> 8;
+ *y = y2 >> 8;
+}
+
+void AnimGlareEyeDot(struct Sprite *sprite)
+{
+ if (++sprite->data[0] > 36)
+ {
+ gTasks[sprite->data[1]].data[sprite->data[2]]--;
+ DestroySprite(sprite);
+ }
+}
+
+// Moves a pawprint in a straight line.
+// arg 0: initial x position
+// arg 1: initial y position
+// arg 2: destination x position
+// arg 3: destination y position
+// arg 4: duration
+void AnimAssistPawprint(struct Sprite *sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->data[0] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
+ sprite->callback = InitAndRunAnimFastLinearTranslation;
+}
+
+// Moves a ball in an arc twoards the target, and rotates the ball while arcing.
+// No args.
+void AnimTask_BarrageBall(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
+ task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT) / 4;
+ task->data[15] = CreateSprite(&gBarrageBallSpriteTemplate, task->data[11], task->data[12], GetBattlerSpriteSubpriority(gBattleAnimTarget) - 5);
+ if (task->data[15] != MAX_SPRITES)
+ {
+ gSprites[task->data[15]].data[0] = 16;
+ gSprites[task->data[15]].data[2] = task->data[13];
+ gSprites[task->data[15]].data[4] = task->data[14];
+ gSprites[task->data[15]].data[5] = -32;
+ InitAnimArcTranslation(&gSprites[task->data[15]]);
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ StartSpriteAffineAnim(&gSprites[task->data[15]], 1);
+
+ task->func = AnimTask_BarrageBallStep;
+ }
+ else
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+static void AnimTask_BarrageBallStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ TranslateAnimHorizontalArc(&gSprites[task->data[15]]);
+ if (++task->data[2] > 7)
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (TranslateAnimHorizontalArc(&gSprites[task->data[15]]))
+ {
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ gSprites[task->data[15]].invisible = task->data[2] & 1;
+ if (task->data[2] == 16)
+ {
+ FreeOamMatrix(gSprites[task->data[15]].oam.matrixNum);
+ DestroySprite(&gSprites[task->data[15]]);
+ task->data[0]++;
+ }
+ }
+ break;
+ case 3:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Moves a hand back and forth in a squishing motion.
+// arg 0: which battler
+// arg 1: horizontal flip
+// arg 2: num squishes
+void AnimSmellingSaltsHand(struct Sprite *sprite)
+{
+ u8 battler;
+
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ battler = gBattleAnimAttacker;
+ else
+ battler = gBattleAnimTarget;
+
+ sprite->oam.tileNum += 16;
+ sprite->data[6] = gBattleAnimArgs[2];
+ sprite->data[7] = gBattleAnimArgs[1] == 0 ? -1 : 1;
+ sprite->pos1.y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET);
+ if (gBattleAnimArgs[1] == 0)
+ {
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8;
+ }
+
+ sprite->callback = AnimSmellingSaltsHand_Step;
+}
+
+static void AnimSmellingSaltsHand_Step(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ sprite->pos2.x += sprite->data[7];
+ if (++sprite->data[2] == 12)
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] == 8)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->pos2.x -= sprite->data[7] * 4;
+ if (++sprite->data[1] == 6)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->pos2.x += sprite->data[7] * 3;
+ if (++sprite->data[1] == 8)
+ {
+ if (--sprite->data[6])
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]--;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+ }
+ break;
+ }
+}
+
+// Squishes the mon horizontally a few times.
+// arg 0: which mon
+// arg 1: number of squishes
+void AnimTask_SmellingSaltsSquish(u8 taskId)
+{
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[0] = gBattleAnimArgs[1];
+ gTasks[taskId].data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], sSmellingSaltsSquishAffineAnimCmds);
+ gTasks[taskId].func = AnimTask_SmellingSaltsSquishStep;
+ }
+}
+
+static void AnimTask_SmellingSaltsSquishStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ if (!(task->data[2] & 1))
+ gSprites[task->data[15]].pos2.x = 2;
+ else
+ gSprites[task->data[15]].pos2.x = -2;
+ }
+
+ if (!RunAffineAnimFromTaskData(task))
+ {
+ gSprites[task->data[15]].pos2.x = 0;
+ if (--task->data[0])
+ {
+ PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], sSmellingSaltsSquishAffineAnimCmds);
+ task->data[1] = 0;
+ task->data[2] = 0;
+ }
+ else
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+// Blinks an exclamation image over the mon a few times.
+// arg 0: which mon
+// arg 1: blink delay
+// arg 2: number of blinks
+void AnimSmellingSaltExclamation(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP);
+ }
+ else
+ {
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP);
+ }
+
+ if (sprite->pos1.y < 8)
+ sprite->pos1.y = 8;
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = 0;
+ sprite->data[3] = gBattleAnimArgs[2];
+ sprite->callback = AnimSmellingSaltExclamationStep;
+}
+
+static void AnimSmellingSaltExclamationStep(struct Sprite *sprite)
+{
+ if (++sprite->data[0] >= sprite->data[1])
+ {
+ sprite->data[0] = 0;
+ sprite->data[2] = (sprite->data[2] + 1) & 1;
+ sprite->invisible = sprite->data[2];
+ if (sprite->data[2] && --sprite->data[3] == 0)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Claps a hand several times.
+// arg 0: which hand
+// arg 1:
+void AnimHelpingHandClap(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->oam.matrixNum |= ST_OAM_HFLIP;
+ sprite->pos1.x = 100;
+ sprite->data[7] = 1;
+ }
+ else
+ {
+ sprite->pos1.x = 140;
+ sprite->data[7] = -1;
+ }
+
+ sprite->pos1.y = 56;
+ sprite->callback = AnimHelpingHandClapStep;
+}
+
+static void AnimHelpingHandClapStep(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.y -= sprite->data[7] * 2;
+ if (sprite->data[1] & 1)
+ sprite->pos1.x -= sprite->data[7] * 2;
+
+ if (++sprite->data[1] == 9)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] == 4)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[1]++;
+ sprite->pos1.y += sprite->data[7] * 3;
+ sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3);
+ if (sprite->data[1] == 12)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ if (++sprite->data[1] == 2)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 4:
+ sprite->data[1]++;
+ sprite->pos1.y -= sprite->data[7] * 3;
+ sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3);
+ if (sprite->data[1] == 12)
+ sprite->data[0]++;
+ break;
+ case 5:
+ sprite->data[1]++;
+ sprite->pos1.y += sprite->data[7] * 3;
+ sprite->pos2.x = sprite->data[7] * (gSineTable[sprite->data[1] * 10] >> 3);
+ if (sprite->data[1] == 15)
+ sprite->oam.tileNum += 16;
+
+ if (sprite->data[1] == 18)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 6:
+ sprite->pos1.x += sprite->data[7] * 6;
+ if (++sprite->data[1] == 9)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 7:
+ sprite->pos1.x += sprite->data[7] * 2;
+ if (++sprite->data[1] == 1)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 8:
+ sprite->pos1.x -= sprite->data[7] * 3;
+ if (++sprite->data[1] == 5)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+// Repeatedly moves the attacking mon in a horizontal lunging motion.
+// No args.
+void AnimTask_HelpingHandAttackerMovement(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[15] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ if (IsDoubleBattle() == TRUE)
+ {
+ int x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ int y = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X);
+ if (x > y)
+ task->data[14] = 1;
+ else
+ task->data[14] = -1;
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ task->data[14] = -1;
+ else
+ task->data[14] = 1;
+ }
+
+ task->func = AnimTask_HelpingHandAttackerMovementStep;
+}
+
+static void AnimTask_HelpingHandAttackerMovementStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] == 13)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ gSprites[task->data[15]].pos2.x -= task->data[14] * 3;
+ if (++task->data[1] == 6)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ gSprites[task->data[15]].pos2.x += task->data[14] * 3;
+ if (++task->data[1] == 6)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ if (++task->data[1] == 2)
+ {
+ task->data[1] = 0;
+ if (task->data[2] == 0)
+ {
+ task->data[2]++;
+ task->data[0] = 1;
+ }
+ else
+ {
+ task->data[0]++;
+ }
+ }
+ break;
+ case 4:
+ gSprites[task->data[15]].pos2.x += task->data[14];
+ if (++task->data[1] == 3)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 5:
+ if (++task->data[1] == 6)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 6:
+ gSprites[task->data[15]].pos2.x -= task->data[14] * 4;
+ if (++task->data[1] == 5)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 7:
+ gSprites[task->data[15]].pos2.x += task->data[14] * 4;
+ if (++task->data[1] == 5)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 8:
+ gSprites[task->data[15]].pos2.x = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Moves a magnifying glass around in straight lines.
+// arg 0: magnifying glass target mon
+void AnimForesightMagnifyingGlass(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == ANIM_ATTACKER)
+ {
+ InitSpritePosToAnimAttacker(sprite, TRUE);
+ sprite->data[7] = gBattleAnimAttacker;
+ }
+ else
+ {
+ sprite->data[7] = gBattleAnimTarget;
+ }
+
+ if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT)
+ sprite->oam.matrixNum = ST_OAM_HFLIP;
+
+ sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);
+ sprite->oam.objMode = ST_OAM_OBJ_BLEND;
+ sprite->callback = AnimForesightMagnifyingGlassStep;
+}
+
+static void AnimForesightMagnifyingGlassStep(struct Sprite *sprite)
+{
+ u16 x, y;
+
+ switch (sprite->data[5])
+ {
+ case 0:
+ switch (sprite->data[6])
+ {
+ default:
+ sprite->data[6] = 0;
+ case 0:
+ case 4:
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_RIGHT) - 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_BOTTOM) - 4;
+ break;
+ case 1:
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_RIGHT) - 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_TOP) + 4;
+ break;
+ case 2:
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_LEFT) + 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_BOTTOM) - 4;
+ break;
+ case 3:
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_LEFT) + 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], BATTLER_COORD_ATTR_TOP) - 4;
+ break;
+ case 5:
+ x = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_X_2);
+ y = GetBattlerSpriteCoord(sprite->data[7], BATTLER_COORD_Y_PIC_OFFSET);
+ break;
+ }
+
+ if (sprite->data[6] == 4)
+ sprite->data[0] = 24;
+ else if (sprite->data[6] == 5)
+ sprite->data[0] = 6;
+ else
+ sprite->data[0] = 12;
+
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = x;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = y;
+ InitAnimLinearTranslation(sprite);
+ sprite->data[5]++;
+ break;
+ case 1:
+ if (AnimTranslateLinear(sprite))
+ {
+ switch (sprite->data[6])
+ {
+ default:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 0;
+ sprite->data[5]++;
+ sprite->data[6]++;
+ break;
+ case 4:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[5] = 0;
+ sprite->data[6]++;
+ break;
+ case 5:
+ sprite->data[0] = 0;
+ sprite->data[1] = 16;
+ sprite->data[2] = 0;
+ sprite->data[5] = 3;
+ break;
+ }
+ }
+ break;
+ case 2:
+ if (++sprite->data[0] == 4)
+ sprite->data[5] = 0;
+ break;
+ case 3:
+ if (!(sprite->data[0] & 1))
+ sprite->data[1]--;
+ else
+ sprite->data[2]++;
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], sprite->data[2]));
+ if (++sprite->data[0] == 32)
+ {
+ sprite->invisible = TRUE;
+ sprite->data[5]++;
+ }
+ break;
+ case 4:
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+static void AnimMeteorMashStarStep(struct Sprite *sprite)
+{
+ sprite->pos2.x = ((sprite->data[2] - sprite->data[0]) * sprite->data[5]) / sprite->data[4];
+ sprite->pos2.y = ((sprite->data[3] - sprite->data[1]) * sprite->data[5]) / sprite->data[4];
+ if (!(sprite->data[5] & 1))
+ {
+ CreateSprite(
+ &gMiniTwinklingStarSpriteTemplate,
+ sprite->pos1.x + sprite->pos2.x,
+ sprite->pos1.y + sprite->pos2.y, 5);
+ }
+
+ if (sprite->data[5] == sprite->data[4])
+ DestroyAnimSprite(sprite);
+
+ sprite->data[5]++;
+}
+
+// Moves a shooting star across the screen that leaves little twinkling stars behind its path.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: destination x pixel offset
+// arg 3: destination y pixel offset
+// arg 4: duration
+void AnimMeteorMashStar(struct Sprite *sprite)
+{
+ s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
+ s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ sprite->data[0] = sprite->pos1.x - gBattleAnimArgs[0];
+ sprite->data[2] = sprite->pos1.x - gBattleAnimArgs[2];
+ }
+ else
+ {
+ sprite->data[0] = sprite->pos1.x + gBattleAnimArgs[0];
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
+ }
+
+ sprite->data[1] = sprite->pos1.y + gBattleAnimArgs[1];
+ sprite->data[3] = sprite->pos1.y + gBattleAnimArgs[3];
+ sprite->data[4] = gBattleAnimArgs[4];
+ sprite->pos1.x = sprite->data[0];
+ sprite->pos1.y = sprite->data[1];
+ sprite->callback = AnimMeteorMashStarStep;
+}
+
+void AnimTask_MonToSubstitute(u8 taskId)
+{
+ int i;
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ if (gTasks[taskId].data[0] == 0)
+ {
+ PrepareBattlerSpriteForRotScale(spriteId, FALSE);
+ gTasks[taskId].data[1] = 0x100;
+ gTasks[taskId].data[2] = 0x100;
+ gTasks[taskId].data[0]++;
+ }
+ else if (gTasks[taskId].data[0] == 1)
+ {
+ gTasks[taskId].data[1] += 0x60;
+ gTasks[taskId].data[2] -= 0xD;
+ SetSpriteRotScale(spriteId, gTasks[taskId].data[1], gTasks[taskId].data[2], 0);
+ if (++gTasks[taskId].data[3] == 9)
+ {
+ gTasks[taskId].data[3] = 0;
+ ResetSpriteRotScale(spriteId);
+ gSprites[spriteId].invisible = TRUE;
+ gTasks[taskId].data[0]++;
+ }
+ }
+ else
+ {
+ LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, 0, spriteId);
+ for (i = 0; i < 16; i++)
+ gTasks[taskId].data[i] = 0;
+
+ gTasks[taskId].func = AnimTask_MonToSubstituteDoll;
+ }
+}
+
+static void AnimTask_MonToSubstituteDoll(u8 taskId)
+{
+ u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gSprites[spriteId].pos2.y = -200;
+ gSprites[spriteId].pos2.x = 200;
+ gSprites[spriteId].invisible = FALSE;
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ gTasks[taskId].data[10] += 112;
+ gSprites[spriteId].pos2.y += gTasks[taskId].data[10] >> 8;
+ if (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y >= -32)
+ gSprites[spriteId].pos2.x = 0;
+
+ if (gSprites[spriteId].pos2.y > 0)
+ gSprites[spriteId].pos2.y = 0;
+
+ if (gSprites[spriteId].pos2.y == 0)
+ {
+ PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));
+ gTasks[taskId].data[10] -= 0x800;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ gTasks[taskId].data[10] -= 112;
+ if (gTasks[taskId].data[10] < 0)
+ gTasks[taskId].data[10] = 0;
+
+ gSprites[spriteId].pos2.y -= gTasks[taskId].data[10] >> 8;
+ if (gTasks[taskId].data[10] == 0)
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ gTasks[taskId].data[10] += 112;
+ gSprites[spriteId].pos2.y += gTasks[taskId].data[10] >> 8;
+ if (gSprites[spriteId].pos2.y > 0)
+ gSprites[spriteId].pos2.y = 0;
+
+ if (gSprites[spriteId].pos2.y == 0)
+ {
+ PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER));
+ DestroyAnimVisualTask(taskId);
+ }
+ break;
+ }
+}
+
+// Moves down an X that flickers and disappears.
+// No args.
+void AnimBlockX(struct Sprite *sprite)
+{
+ s16 y;
+
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2;
+ y = -144;
+ }
+ else
+ {
+ sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 2;
+ y = -96;
+ }
+
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
+ sprite->pos2.y = y;
+ sprite->callback = AnimBlockXStep;
+}
+
+static void AnimBlockXStep(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos2.y += 10;
+ if (sprite->pos2.y >= 0)
+ {
+ PlaySE12WithPanning(SE_W166, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ sprite->data[1] += 4;
+ sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 3);
+ if (sprite->data[1] > 0x7F)
+ {
+ PlaySE12WithPanning(SE_W166, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+ sprite->data[1] = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[1] += 6;
+ sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 4);
+ if (sprite->data[1] > 0x7F)
+ {
+ sprite->data[1] = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ if (++sprite->data[1] > 8)
+ {
+ PlaySE12WithPanning(SE_W043, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 4:
+ if (++sprite->data[1] > 8)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2]++;
+ sprite->invisible = sprite->data[2] & 1;
+ if (sprite->data[2] == 7)
+ DestroyAnimSprite(sprite);
+ }
+ break;
+ }
+}
+
+// Quickly moves two clones of the target mon back and forth.
+// No args.
+void AnimTask_OdorSleuthMovement(u8 taskId)
+{
+ s16 spriteId1, spriteId2;
+
+ spriteId1 = CloneBattlerSpriteWithBlend(ANIM_TARGET);
+ if (spriteId1 < 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ spriteId2 = CloneBattlerSpriteWithBlend(ANIM_TARGET);
+ if (spriteId2 < 0)
+ {
+ obj_delete_but_dont_free_vram(&gSprites[spriteId1]);
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ gSprites[spriteId2].pos2.x += 24;
+ gSprites[spriteId1].pos2.x -= 24;
+ gSprites[spriteId2].data[0] = 0;
+ gSprites[spriteId1].data[0] = 0;
+ gSprites[spriteId2].data[1] = 0;
+ gSprites[spriteId1].data[1] = 0;
+ gSprites[spriteId2].data[2] = 0;
+ gSprites[spriteId1].data[2] = 0;
+ gSprites[spriteId2].data[3] = 16;
+ gSprites[spriteId1].data[3] = -16;
+ gSprites[spriteId2].data[4] = 0;
+ gSprites[spriteId1].data[4] = 128;
+ gSprites[spriteId2].data[5] = 24;
+ gSprites[spriteId1].data[5] = 24;
+ gSprites[spriteId2].data[6] = taskId;
+ gSprites[spriteId1].data[6] = taskId;
+ gSprites[spriteId2].data[7] = 0;
+ gSprites[spriteId1].data[7] = 0;
+ gTasks[taskId].data[0] = 2;
+
+ if (!gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible)
+ {
+ gSprites[spriteId2].invisible = FALSE;
+ gSprites[spriteId1].invisible = TRUE;
+ }
+ else
+ {
+ gSprites[spriteId2].invisible = TRUE;
+ gSprites[spriteId1].invisible = TRUE;
+ }
+
+ gSprites[spriteId2].oam.objMode = ST_OAM_OBJ_NORMAL;
+ gSprites[spriteId1].oam.objMode = ST_OAM_OBJ_NORMAL;
+ gSprites[spriteId2].callback = MoveOdorSleuthClone;
+ gSprites[spriteId1].callback = MoveOdorSleuthClone;
+ gTasks[taskId].func = AnimTask_OdorSleuthMovementWaitFinish;
+}
+
+static void AnimTask_OdorSleuthMovementWaitFinish(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ DestroyAnimVisualTask(taskId);
+}
+
+static void MoveOdorSleuthClone(struct Sprite *sprite)
+{
+ int zero = 0;
+
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ if (!gBattleSpritesDataPtr->battlerData[gBattleAnimTarget].invisible)
+ sprite->invisible ^= 1;
+ }
+
+ sprite->data[4] = sprite->data[4] + sprite->data[3];
+ sprite->data[4] &= 0xFF;
+ sprite->pos2.x = Cos(sprite->data[4], sprite->data[5]);
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[2] == 60)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[2] > 0)
+ {
+ sprite->data[2] = 0;
+ sprite->data[5] -= 2;
+ if (sprite->data[5] < 0)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ obj_delete_but_dont_free_vram(sprite);
+ }
+ }
+ break;
+ }
+}
+
+void AnimTask_GetReturnPowerLevel(u8 taskId)
+{
+ gBattleAnimArgs[7] = 0;
+ if (gAnimFriendship < 60)
+ gBattleAnimArgs[7] = 0;
+ if (gAnimFriendship > 60 && gAnimFriendship < 92)
+ gBattleAnimArgs[7] = 1;
+ if (gAnimFriendship > 91 && gAnimFriendship < 201)
+ gBattleAnimArgs[7] = 2;
+ if (gAnimFriendship > 200)
+ gBattleAnimArgs[7] = 3;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// Makes the mon run out of screen, run past the opposing mon, and return to its original position.
+// No args.
+void AnimTask_SnatchOpposingMonMove(u8 taskId)
+{
+ u8 spriteId, spriteId2;
+ u32 personality;
+ u32 otId;
+ u16 species;
+ u8 subpriority;
+ bool8 isBackPic;
+ s16 x;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ gTasks[taskId].data[1] += 0x800;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8);
+ else
+ gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8);
+
+ gTasks[taskId].data[1] &= 0xFF;
+ x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ if ((u16)(x + 32) > 304)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ {
+ s16 x;
+
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE)
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ else
+ species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies;
+
+ subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1;
+ isBackPic = FALSE;
+ x = 272;
+ }
+ else
+ {
+ personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies == SPECIES_NONE)
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ else
+ species = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies;
+
+ subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1;
+ isBackPic = TRUE;
+ x = -32;
+ }
+
+ spriteId2 = sub_80768D0(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, 0);
+
+ if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies != SPECIES_NONE)
+ BlendPalette((gSprites[spriteId2].oam.paletteNum * 16) | 0x100, 16, 6, RGB_WHITE);
+ gTasks[taskId].data[15] = spriteId2;
+ gTasks[taskId].data[0]++;
+ break;
+ }
+ case 2:
+ spriteId2 = gTasks[taskId].data[15];
+ gTasks[taskId].data[1] += 0x800;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ gSprites[spriteId2].pos2.x -= (gTasks[taskId].data[1] >> 8);
+ else
+ gSprites[spriteId2].pos2.x += (gTasks[taskId].data[1] >> 8);
+
+ gTasks[taskId].data[1] &= 0xFF;
+ x = gSprites[spriteId2].pos1.x + gSprites[spriteId2].pos2.x;
+ if (gTasks[taskId].data[14] == 0)
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ if (x < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X))
+ {
+ gTasks[taskId].data[14]++;
+ gBattleAnimArgs[7] = 0xFFFF;
+ }
+ }
+ else
+ {
+ if (x > GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X))
+ {
+ gTasks[taskId].data[14]++;
+ gBattleAnimArgs[7] = 0xFFFF;
+ }
+ }
+ }
+ if ((u16)(x + 32) > 304)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ spriteId2 = gTasks[taskId].data[15];
+ DestroySpriteAndFreeResources_(&gSprites[spriteId2]);
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos1.x - 32;
+ else
+ gSprites[spriteId].pos2.x = 272 - gSprites[spriteId].pos1.x;
+
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ gTasks[taskId].data[1] += 0x800;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ gSprites[spriteId].pos2.x += (gTasks[taskId].data[1] >> 8);
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x >= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X))
+ gSprites[spriteId].pos2.x = 0;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x -= (gTasks[taskId].data[1] >> 8);
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x <= GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X))
+ gSprites[spriteId].pos2.x = 0;
+ }
+
+ gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1];
+ if (gSprites[spriteId].pos2.x == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80E3E84(struct Sprite *sprite)
+{
+ switch (sprite->data[7])
+ {
+ case 0:
+ if (gBattleAnimArgs[7] == -1)
+ {
+ PlaySE12WithPanning(SE_W233, BattleAnimAdjustPanning(SOUND_PAN_TARGET));
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 16;
+ sprite->data[0] = -32;
+ sprite->data[7]++;
+ sprite->invisible = FALSE;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
+ sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority - 1;
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ }
+ break;
+ case 1:
+ sprite->pos2.y = Sin(sprite->data[1], sprite->data[0]);
+ sprite->data[1] += 5;
+ if (sprite->data[1] > 0x7F)
+ {
+ sprite->data[0] = sprite->data[0] / 2;
+ sprite->data[3]++;
+ sprite->data[1] -= 0x7F;
+ }
+
+ sprite->data[2] += 0x100;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ sprite->pos2.x -= (sprite->data[2] >> 8);
+ else
+ sprite->pos2.x += (sprite->data[2] >> 8);
+
+ sprite->data[2] &= 0xFF;
+ if (sprite->data[3] == 2)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+// Quickly moves the mon towards its partner and back.
+// No args.
+void AnimTask_SnatchPartnerMove(u8 taskId)
+{
+ s16 attackerX, targetX;
+ u8 spriteId;
+
+ switch (gTasks[taskId].data[15])
+ {
+ case 0:
+ attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ gTasks[taskId].data[0] = 6;
+ if (attackerX > targetX)
+ gTasks[taskId].data[0] *= -1;
+
+ gTasks[taskId].data[1] = attackerX;
+ gTasks[taskId].data[2] = targetX;
+ gTasks[taskId].data[15]++;
+ break;
+ case 1:
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[0];
+ if (gTasks[taskId].data[0] > 0)
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[2])
+ gTasks[taskId].data[15]++;
+ }
+ else
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[2])
+ gTasks[taskId].data[15]++;
+ }
+ break;
+ case 2:
+ gTasks[taskId].data[0] *= -1;
+ gTasks[taskId].data[15]++;
+ break;
+ case 3:
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[0];
+ if (gTasks[taskId].data[0] < 0)
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x <= gTasks[taskId].data[1])
+ gTasks[taskId].data[15]++;
+ }
+ else
+ {
+ if (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x >= gTasks[taskId].data[1])
+ gTasks[taskId].data[15]++;
+ }
+ break;
+ case 4:
+ default:
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ gSprites[spriteId].pos2.x = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// Moves the mon's sprite back and forth in an unpredictable swaying motion.
+// No args.
+void AnimTask_TeeterDanceMovement(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[3] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
+ task->data[4] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : -1;
+ task->data[6] = gSprites[task->data[3]].pos1.y;
+ task->data[5] = gSprites[task->data[3]].pos1.x;
+ task->data[9] = 0;
+ task->data[11] = 0;
+ task->data[10] = 1;
+ task->data[12] = 0;
+ task->func = AnimTask_TeeterDanceMovementStep;
+}
+
+static void AnimTask_TeeterDanceMovementStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[11] += 8;
+ task->data[11] &= 0xFF;
+ gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5;
+ task->data[9] += 2;
+ task->data[9] &= 0xFF;
+ gSprites[task->data[3]].pos1.x = (gSineTable[task->data[9]] >> 3) * task->data[4] + task->data[5];
+ if (task->data[9] == 0)
+ {
+ gSprites[task->data[3]].pos1.x = task->data[5];
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ task->data[11] += 8;
+ task->data[11] &= 0xFF;
+ gSprites[task->data[3]].pos2.x = gSineTable[task->data[11]] >> 5;
+ if (task->data[11] == 0)
+ {
+ gSprites[task->data[3]].pos2.x = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void AnimKnockOffStrikeStep(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ sprite->data[1] += sprite->data[0];
+ sprite->data[1] &= 0xFF;
+ }
+ else
+ {
+ sprite->data[1] += sprite->data[0];
+ sprite->data[1] &= 0xFF;
+ }
+
+ sprite->pos2.x = Cos(sprite->data[1], 20);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+
+ sprite->data[2]++;
+}
+
+// Animates a strike that swipes downard at the target mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+void AnimKnockOffStrike(struct Sprite *sprite)
+{
+ if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = -11;
+ sprite->data[1] = 192;
+ StartSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->data[0] = 11;
+ sprite->data[1] = 192;
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->callback = AnimKnockOffStrikeStep;
+}
+
+// Gradually fades a rotating recyle arrow sprite in and back out.
+// No args.
+void AnimRecycle(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP);
+ if (sprite->pos1.y < 16)
+ sprite->pos1.y = 16;
+
+ sprite->data[6] = 0;
+ sprite->data[7] = 16;
+ sprite->callback = AnimRecycleStep;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+}
+
+static void AnimRecycleStep(struct Sprite *sprite)
+{
+ switch (sprite->data[2])
+ {
+ case 0:
+ if (++sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ if (!(sprite->data[1] & 1))
+ {
+ if (sprite->data[6] < 16)
+ sprite->data[6]++;
+ }
+ else
+ {
+ if (sprite->data[7] != 0)
+ sprite->data[7]--;
+ }
+
+ sprite->data[1]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+ if (sprite->data[7] == 0)
+ sprite->data[2]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[0] == 10)
+ {
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2]++;
+ }
+ break;
+ case 2:
+ if (++sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ if (!(sprite->data[1] & 1))
+ {
+ if (sprite->data[6] != 0)
+ sprite->data[6]--;
+ }
+ else
+ {
+ if (sprite->data[7] < 16)
+ sprite->data[7]++;
+ }
+
+ sprite->data[1]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
+ if (sprite->data[7] == 16)
+ sprite->data[2]++;
+ }
+ break;
+ case 3:
+ DestroySpriteAndMatrix(sprite);
+ break;
+ }
+}
+
+void AnimTask_GetWeather(u8 taskId)
+{
+ gBattleAnimArgs[7] = ANIM_WEATHER_NONE;
+ if (gWeatherMoveAnim & WEATHER_SUN_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_SUN;
+ else if (gWeatherMoveAnim & WEATHER_RAIN_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_RAIN;
+ else if (gWeatherMoveAnim & WEATHER_SANDSTORM_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_SANDSTORM;
+ else if (gWeatherMoveAnim & WEATHER_HAIL_ANY)
+ gBattleAnimArgs[7] = ANIM_WEATHER_HAIL;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// Squishes the mon sprite vertically, and shakes it back and forth.
+// arg 0: which battler
+void AnimTask_SlackOffSquish(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0] = 0;
+ task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
+ PrepareAffineAnimInTaskData(task, task->data[15], sSlackOffSquishAffineAnimCmds);
+ task->func = AnimTask_SlackOffSquishStep;
+}
+
+static void AnimTask_SlackOffSquishStep(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] > 16 && gTasks[taskId].data[0] < 40)
+ {
+ if (++task->data[1] > 2)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ if (!(task->data[2] & 1))
+ gSprites[task->data[15]].pos2.x = -1;
+ else
+ gSprites[task->data[15]].pos2.x = 1;
+ }
+ }
+ else
+ {
+ gSprites[task->data[15]].pos2.x = 0;
+ }
+
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c
index a3bd26898..7f3516670 100644
--- a/src/battle_anim_mons.c
+++ b/src/battle_anim_mons.c
@@ -88,7 +88,7 @@ static const struct SpriteTemplate gUnknown_83AE054[] =
{
.tileTag = 0xD755,
.paletteTag = 0xD755,
- .oam = &gOamData_83ACA40,
+ .oam = &gOamData_AffineNormal_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -97,7 +97,7 @@ static const struct SpriteTemplate gUnknown_83AE054[] =
{
.tileTag = 0xD756,
.paletteTag = 0xD756,
- .oam = &gOamData_83ACA40,
+ .oam = &gOamData_AffineNormal_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -884,7 +884,7 @@ void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src)
CopyBgTilemapBufferToVram(bgId);
}
-u8 sub_8075454(void)
+u8 GetBattleBgPaletteNum(void)
{
return 2;
}
diff --git a/src/battle_anim_special.c b/src/battle_anim_special.c
new file mode 100644
index 000000000..7590c0e58
--- /dev/null
+++ b/src/battle_anim_special.c
@@ -0,0 +1,2318 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "battle_main.h"
+#include "battle_controllers.h"
+#include "battle_interface.h"
+#include "decompress.h"
+#include "dma3.h"
+#include "gpu_regs.h"
+#include "graphics.h"
+#include "m4a.h"
+#include "main.h"
+#include "palette.h"
+#include "pokeball.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "util.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/pokemon.h"
+
+// Defines
+#define TAG_PARTICLES_POKEBALL 55020
+#define TAG_PARTICLES_GREATBALL 55021
+#define TAG_PARTICLES_SAFARIBALL 55022
+#define TAG_PARTICLES_ULTRABALL 55023
+#define TAG_PARTICLES_MASTERBALL 55024
+#define TAG_PARTICLES_NETBALL 55025
+#define TAG_PARTICLES_DIVEBALL 55026
+#define TAG_PARTICLES_NESTBALL 55027
+#define TAG_PARTICLES_REPEATBALL 55028
+#define TAG_PARTICLES_TIMERBALL 55029
+#define TAG_PARTICLES_LUXURYBALL 55030
+#define TAG_PARTICLES_PREMIERBALL 55031
+
+#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
+#define LOHALF(n) ((n) & 0xFFFF)
+
+// RAM
+int sUnknown_3005424;
+u16 sUnknown_3005428;
+u16 sUnknown_300542C;
+
+// Function Declarations
+static void sub_80EEDF4(u8);
+static void sub_80EF1CC(u8);
+static void sub_80EF698(u8);
+static void sub_80EF8C0(struct Sprite *);
+static void sub_80EF7EC(u8);
+static void sub_80EF864(u8);
+static void sub_80EF8F0(struct Sprite *);
+static void sub_80F0478(struct Sprite *);
+static void sub_80EF9B4(struct Sprite *);
+static void sub_80EFA0C(struct Sprite *);
+static void sub_80EFB58(struct Sprite *);
+static void sub_80EFB9C(struct Sprite *);
+static void sub_80EFF80(struct Sprite *);
+static void sub_80EFCA0(struct Sprite *);
+static void sub_80EFCEC(struct Sprite *);
+static void sub_80EFFA4(struct Sprite *);
+static void sub_80F02B0(struct Sprite *);
+static void sub_80EFFC4(struct Sprite *);
+static void sub_80F01B8(struct Sprite *);
+static void sub_80F00A4(struct Sprite *);
+static void sub_80F018C(struct Sprite *);
+static void sub_80F05B4(u8);
+static void sub_80F0278(struct Sprite *);
+static void sub_80F0378(struct Sprite *);
+static void sub_80F04B4(struct Sprite *);
+static void GhostBallDodge(struct Sprite *sprite);
+static void sub_80F0574(struct Sprite *sprite);
+static void PokeBallOpenParticleAnimation_Step1(struct Sprite *);
+static void PokeBallOpenParticleAnimation_Step2(struct Sprite *);
+static void DestroyBallOpenAnimationParticle(struct Sprite *);
+static void FanOutBallOpenParticles_Step1(struct Sprite *);
+static void RepeatBallOpenParticleAnimation_Step1(struct Sprite *);
+static void PremierBallOpenParticleAnimation_Step1(struct Sprite *);
+static void sub_80F12E0(u8);
+static void sub_80F1370(u8);
+static void sub_80F13C0(u8);
+static void sub_80F181C(u8);
+static void sub_80F1A2C(struct Sprite *);
+static void sub_80F1A80(struct Sprite *);
+static void sub_80F19E0(u8);
+static void sub_80F1BCC(struct Sprite *);
+static void sub_80F1C04(struct Sprite *);
+static void sub_80F1C30(struct Sprite *);
+static void PokeBallOpenParticleAnimation(u8);
+static void GreatBallOpenParticleAnimation(u8);
+static void SafariBallOpenParticleAnimation(u8);
+static void UltraBallOpenParticleAnimation(u8);
+static void MasterBallOpenParticleAnimation(u8);
+static void DiveBallOpenParticleAnimation(u8);
+static void RepeatBallOpenParticleAnimation(u8);
+static void TimerBallOpenParticleAnimation(u8);
+static void PremierBallOpenParticleAnimation(u8);
+static void sub_80F1B3C(struct Sprite *);
+
+// Data
+struct BallCaptureSuccessStarData
+{
+ s8 xOffset;
+ s8 yOffset;
+ s8 unk2;
+};
+
+static const struct BallCaptureSuccessStarData sBallCaptureSuccessStarData[] =
+{
+ {
+ .xOffset = 10,
+ .yOffset = 2,
+ .unk2 = -3,
+ },
+ {
+ .xOffset = 15,
+ .yOffset = 0,
+ .unk2 = -4,
+ },
+ {
+ .xOffset = -10,
+ .yOffset = 2,
+ .unk2 = -4,
+ },
+};
+
+const struct CompressedSpriteSheet gBallParticleSpritesheets[] =
+{
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_GREATBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL},
+ {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL},
+};
+
+const struct CompressedSpritePalette gBallParticlePalettes[] =
+{
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_POKEBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_GREATBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL},
+ {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL},
+};
+
+static const union AnimCmd sAnim_RegularBall[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_FRAME(0, 1, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sAnim_MasterBall[] =
+{
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sAnim_NetDiveBall[] =
+{
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sAnim_NestBall[] =
+{
+ ANIMCMD_FRAME(5, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sAnim_LuxuryPremierBall[] =
+{
+ ANIMCMD_FRAME(6, 4),
+ ANIMCMD_FRAME(7, 4),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd sAnim_UltraRepeatTimerBall[] =
+{
+ ANIMCMD_FRAME(7, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sAnims_BallParticles[] =
+{
+ sAnim_RegularBall,
+ sAnim_MasterBall,
+ sAnim_NetDiveBall,
+ sAnim_NestBall,
+ sAnim_LuxuryPremierBall,
+ sAnim_UltraRepeatTimerBall,
+};
+
+static const u8 sBallParticleAnimNums[] =
+{
+ [BALL_POKE] = 0,
+ [BALL_GREAT] = 0,
+ [BALL_SAFARI] = 0,
+ [BALL_ULTRA] = 5,
+ [BALL_MASTER] = 1,
+ [BALL_NET] = 2,
+ [BALL_DIVE] = 2,
+ [BALL_NEST] = 3,
+ [BALL_REPEAT] = 5,
+ [BALL_TIMER] = 5,
+ [BALL_LUXURY] = 4,
+ [BALL_PREMIER] = 4,
+};
+
+static const TaskFunc sBallParticleAnimationFuncs[] =
+{
+ PokeBallOpenParticleAnimation,
+ GreatBallOpenParticleAnimation,
+ SafariBallOpenParticleAnimation,
+ UltraBallOpenParticleAnimation,
+ MasterBallOpenParticleAnimation,
+ SafariBallOpenParticleAnimation,
+ DiveBallOpenParticleAnimation,
+ UltraBallOpenParticleAnimation,
+ RepeatBallOpenParticleAnimation,
+ TimerBallOpenParticleAnimation,
+ GreatBallOpenParticleAnimation,
+ PremierBallOpenParticleAnimation,
+};
+
+static const struct SpriteTemplate sBallParticlesSpriteTemplates[] =
+{
+ {
+ .tileTag = TAG_PARTICLES_POKEBALL,
+ .paletteTag = TAG_PARTICLES_POKEBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_GREATBALL,
+ .paletteTag = TAG_PARTICLES_GREATBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_SAFARIBALL,
+ .paletteTag = TAG_PARTICLES_SAFARIBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_ULTRABALL,
+ .paletteTag = TAG_PARTICLES_ULTRABALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_MASTERBALL,
+ .paletteTag = TAG_PARTICLES_MASTERBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_NETBALL,
+ .paletteTag = TAG_PARTICLES_NETBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_DIVEBALL,
+ .paletteTag = TAG_PARTICLES_DIVEBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_NESTBALL,
+ .paletteTag = TAG_PARTICLES_NESTBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_REPEATBALL,
+ .paletteTag = TAG_PARTICLES_REPEATBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_TIMERBALL,
+ .paletteTag = TAG_PARTICLES_TIMERBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_LUXURYBALL,
+ .paletteTag = TAG_PARTICLES_LUXURYBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+ {
+ .tileTag = TAG_PARTICLES_PREMIERBALL,
+ .paletteTag = TAG_PARTICLES_PREMIERBALL,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = sAnims_BallParticles,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+ },
+};
+
+static const u16 sBallOpenFadeColors[] =
+{
+ [BALL_POKE] = RGB(31, 22, 30),
+ [BALL_GREAT] = RGB(16, 23, 30),
+ [BALL_SAFARI] = RGB(23, 30, 20),
+ [BALL_ULTRA] = RGB(31, 31, 15),
+ [BALL_MASTER] = RGB(23, 20, 28),
+ [BALL_NET] = RGB(21, 31, 25),
+ [BALL_DIVE] = RGB(12, 25, 30),
+ [BALL_NEST] = RGB(30, 27, 10),
+ [BALL_REPEAT] = RGB(31, 24, 16),
+ [BALL_TIMER] = RGB(29, 30, 30),
+ [BALL_LUXURY] = RGB(31, 17, 10),
+ [BALL_PREMIER] = RGB(31, 9, 10),
+
+ // Unused
+ RGB_BLACK,
+ RGB(1, 16, 0),
+ RGB(3, 0, 1),
+ RGB(1, 8, 0),
+ RGB(0, 8, 0),
+ RGB(3, 8, 1),
+ RGB(6, 8, 1),
+ RGB(4, 0, 0),
+};
+
+const struct SpriteTemplate gPokeblockSpriteTemplate =
+{
+ .tileTag = ANIM_TAG_POKEBLOCK,
+ .paletteTag = ANIM_TAG_POKEBLOCK,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80F1B3C,
+};
+
+static const union AnimCmd sUnknown_840C204[] =
+{
+ ANIMCMD_FRAME(64, 1),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_840C20C[] =
+{
+ sUnknown_840C204,
+};
+
+const struct SpriteTemplate gUnknown_840C210 =
+{
+ .tileTag = ANIM_TAG_ROCKS,
+ .paletteTag = ANIM_TAG_ROCKS,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSpriteAnimTable_840C20C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80F1B3C,
+};
+
+// Functions
+void sub_80EEC0C(u8 taskId)
+{
+ struct BattleAnimBgData unknownStruct;
+ u8 healthBoxSpriteId;
+ u8 battler;
+ u8 spriteId1, spriteId2, spriteId3, spriteId4;
+
+ battler = gBattleAnimAttacker;
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);
+ SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
+ SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 1);
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
+ healthBoxSpriteId = gHealthboxSpriteIds[battler];
+ spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam;
+ spriteId2 = gSprites[healthBoxSpriteId].data[5];
+ spriteId3 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
+ spriteId4 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
+ gSprites[healthBoxSpriteId].oam.priority = 1;
+ gSprites[spriteId1].oam.priority = 1;
+ gSprites[spriteId2].oam.priority = 1;
+ gSprites[spriteId3] = gSprites[healthBoxSpriteId];
+ gSprites[spriteId4] = gSprites[spriteId1];
+ gSprites[spriteId3].oam.objMode = ST_OAM_OBJ_WINDOW;
+ gSprites[spriteId4].oam.objMode = ST_OAM_OBJ_WINDOW;
+ gSprites[spriteId3].callback = SpriteCallbackDummy;
+ gSprites[spriteId4].callback = SpriteCallbackDummy;
+ sub_80752A0(&unknownStruct);
+ AnimLoadCompressedBgTilemap(unknownStruct.bgId, gUnknown_D2EC24_Tilemap);
+ AnimLoadCompressedBgGfx(unknownStruct.bgId, gUnknown_D2EC24_Gfx, unknownStruct.tilesOffset);
+ LoadCompressedPalette(gCureBubblesPal, unknownStruct.paletteId << 4, 32);
+ gBattle_BG1_X = -gSprites[spriteId3].pos1.x + 32;
+ gBattle_BG1_Y = -gSprites[spriteId3].pos1.y - 32;
+ gTasks[taskId].data[1] = 640;
+ gTasks[taskId].data[0] = spriteId3;
+ gTasks[taskId].data[2] = spriteId4;
+ gTasks[taskId].func = sub_80EEDF4;
+}
+
+static void sub_80EEDF4(u8 taskId)
+{
+ u8 spriteId1, spriteId2;
+ u8 battler;
+
+ battler = gBattleAnimAttacker;
+ gTasks[taskId].data[13] += gTasks[taskId].data[1];
+ gBattle_BG1_Y += (u16)gTasks[taskId].data[13] >> 8;
+ gTasks[taskId].data[13] &= 0xFF;
+
+ switch (gTasks[taskId].data[15])
+ {
+ case 0:
+ if (gTasks[taskId].data[11]++ > 1)
+ {
+ gTasks[taskId].data[11] = 0;
+ gTasks[taskId].data[12]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
+ if (gTasks[taskId].data[12] == 8)
+ gTasks[taskId].data[15]++;
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[10] == 30)
+ gTasks[taskId].data[15]++;
+ break;
+ case 2:
+ if (gTasks[taskId].data[11]++ > 1)
+ {
+ gTasks[taskId].data[11] = 0;
+ gTasks[taskId].data[12]--;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
+ if (gTasks[taskId].data[12] == 0)
+ {
+ sub_8073128(0);
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
+ SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
+ if (!IsContest())
+ SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));
+ DestroySprite(&gSprites[gTasks[taskId].data[0]]);
+ DestroySprite(&gSprites[gTasks[taskId].data[2]]);
+ SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0);
+ spriteId1 = gSprites[gHealthboxSpriteIds[battler]].oam.affineParam;
+ spriteId2 = gSprites[gHealthboxSpriteIds[battler]].data[5];
+ gSprites[gHealthboxSpriteIds[battler]].oam.priority = 1;
+ gSprites[spriteId1].oam.priority = 1;
+ gSprites[spriteId2].oam.priority = 1;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ break;
+ }
+}
+
+void sub_80EEFC8(u8 *paletteId1, u8 *paletteId2, u8 battler)
+{
+ u8 healthBoxSpriteId;
+ u8 spriteId1, spriteId2;
+ u16 offset1, offset2;
+
+ healthBoxSpriteId = gHealthboxSpriteIds[battler];
+ spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam;
+ spriteId2 = gSprites[healthBoxSpriteId].data[5];
+ *paletteId1 = AllocSpritePalette(0xD709);
+ *paletteId2 = AllocSpritePalette(0xD70A);
+ offset1 = (gSprites[healthBoxSpriteId].oam.paletteNum * 16) + 0x100;
+ offset2 = (gSprites[spriteId2].oam.paletteNum * 16) + 0x100;
+ LoadPalette(&gPlttBufferUnfaded[offset1], *paletteId1 * 16 + 0x100, 0x20);
+ LoadPalette(&gPlttBufferUnfaded[offset2], *paletteId2 * 16 + 0x100, 0x20);
+ gSprites[healthBoxSpriteId].oam.paletteNum = *paletteId1;
+ gSprites[spriteId1].oam.paletteNum = *paletteId1;
+ gSprites[spriteId2].oam.paletteNum = *paletteId2;
+}
+
+void sub_80EF0B4(u8 taskId)
+{
+ u8 paletteId1, paletteId2;
+
+ sub_80EEFC8(&paletteId1, &paletteId2, gBattleAnimAttacker);
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80EF0E0(u8 battler)
+{
+ u8 healthBoxSpriteId;
+ u8 spriteId1, spriteId2;
+ u8 paletteId1, paletteId2;
+
+ healthBoxSpriteId = gHealthboxSpriteIds[battler];
+ spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam;
+ spriteId2 = gSprites[healthBoxSpriteId].data[5];
+ FreeSpritePaletteByTag(0xD709);
+ FreeSpritePaletteByTag(0xD70A);
+ paletteId1 = IndexOfSpritePaletteTag(0xD6FF);
+ paletteId2 = IndexOfSpritePaletteTag(0xD704);
+ gSprites[healthBoxSpriteId].oam.paletteNum = paletteId1;
+ gSprites[spriteId1].oam.paletteNum = paletteId1;
+ gSprites[spriteId2].oam.paletteNum = paletteId2;
+}
+
+void sub_80EF180(u8 taskId)
+{
+ sub_80EF0E0(gBattleAnimAttacker);
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80EF1A0(u8 taskId)
+{
+ gTasks[taskId].data[10] = gBattleAnimArgs[0];
+ gTasks[taskId].data[11] = gBattleAnimArgs[1];
+ gTasks[taskId].func = sub_80EF1CC;
+}
+
+static void sub_80EF1CC(u8 taskId)
+{
+ u8 paletteNum;
+ int paletteOffset, colorOffset;
+
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0]++ >= gTasks[taskId].data[11])
+ {
+ gTasks[taskId].data[0] = 0;
+ paletteNum = IndexOfSpritePaletteTag(0xD709);
+ colorOffset = gTasks[taskId].data[10] == 0 ? 6 : 2;
+ switch (gTasks[taskId].data[1])
+ {
+ case 0:
+ gTasks[taskId].data[2] += 2;
+ if (gTasks[taskId].data[2] > 16)
+ gTasks[taskId].data[2] = 16;
+
+ paletteOffset = paletteNum * 16 + 0x100;
+ BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31));
+ if (gTasks[taskId].data[2] == 16)
+ gTasks[taskId].data[1]++;
+ break;
+ case 1:
+ gTasks[taskId].data[2] -= 2;
+ if (gTasks[taskId].data[2] < 0)
+ gTasks[taskId].data[2] = 0;
+
+ paletteOffset = paletteNum * 16 + 0x100;
+ BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31));
+ if (gTasks[taskId].data[2] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+ }
+}
+
+void sub_80EF298(u8 taskId)
+{
+ u8 spriteId;
+
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);
+ gTasks[taskId].data[10] = 0x100;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ gTasks[taskId].data[10] += 0x30;
+ SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0);
+ SetBattlerSpriteYOffsetFromYScale(spriteId);
+ if (gTasks[taskId].data[10] >= 0x2D0)
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ ResetSpriteRotScale(spriteId);
+ gSprites[spriteId].invisible = TRUE;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80EF344(u8 taskId)
+{
+ u8 spriteId;
+ u16 ball;
+ u8 ballId;
+ u8 x, y;
+ u8 priority, subpriority;
+ u32 selectedPalettes;
+
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ ball = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL);
+ else
+ ball = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_POKEBALL);
+
+ ballId = ItemIdToBallId(ball);
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
+ y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
+ priority = gSprites[spriteId].oam.priority;
+ subpriority = gSprites[spriteId].subpriority;
+ gTasks[taskId].data[10] = LaunchBallStarsTask(x, y + 32, priority, subpriority, ballId);
+ selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
+ gTasks[taskId].data[11] = LaunchBallFadeMonTask(0, gBattleAnimAttacker, selectedPalettes, ballId);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (!gTasks[gTasks[taskId].data[10]].isActive && !gTasks[gTasks[taskId].data[11]].isActive)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80EF490(u8 taskId)
+{
+ u8 ballId = ItemIdToBallId(gLastUsedItem);
+
+ LoadBallGfx(ballId);
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80EF4B8(u8 taskId)
+{
+ u8 ballId = ItemIdToBallId(gLastUsedItem);
+
+ FreeBallGfx(ballId);
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_IsBallBlockedByTrainerOrDodged(u8 taskId)
+{
+ switch (gBattleSpritesDataPtr->animationData->ballThrowCaseId)
+ {
+ case BALL_TRAINER_BLOCK:
+ gBattleAnimArgs[ARG_RET_ID] = -1;
+ break;
+ case BALL_GHOST_DODGE:
+ gBattleAnimArgs[ARG_RET_ID] = -2;
+ break;
+ default:
+ gBattleAnimArgs[ARG_RET_ID] = 0;
+ break;
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+u8 ItemIdToBallId(u16 ballItem)
+{
+ switch (ballItem)
+ {
+ case ITEM_MASTER_BALL:
+ return BALL_MASTER;
+ case ITEM_ULTRA_BALL:
+ return BALL_ULTRA;
+ case ITEM_GREAT_BALL:
+ return BALL_GREAT;
+ case ITEM_SAFARI_BALL:
+ return BALL_SAFARI;
+ case ITEM_NET_BALL:
+ return BALL_NET;
+ case ITEM_DIVE_BALL:
+ return BALL_DIVE;
+ case ITEM_NEST_BALL:
+ return BALL_NEST;
+ case ITEM_REPEAT_BALL:
+ return BALL_REPEAT;
+ case ITEM_TIMER_BALL:
+ return BALL_TIMER;
+ case ITEM_LUXURY_BALL:
+ return BALL_LUXURY;
+ case ITEM_PREMIER_BALL:
+ return BALL_PREMIER;
+ case ITEM_POKE_BALL:
+ default:
+ return BALL_POKE;
+ }
+}
+
+void sub_80EF5AC(u8 taskId)
+{
+ u8 ballId;
+ u8 spriteId;
+
+ ballId = ItemIdToBallId(gLastUsedItem);
+ spriteId = CreateSprite(&gBallSpriteTemplates[ballId], 32, 80, 29);
+ gSprites[spriteId].data[0] = 34;
+ gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16;
+ gSprites[spriteId].callback = sub_80EF8C0;
+ gBattleSpritesDataPtr->animationData->field_9_x2 = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible;
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].func = sub_80EF698;
+}
+
+static void sub_80EF698(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+
+ if ((u16)gSprites[spriteId].data[0] == 0xFFFF)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80EF6D4(u8 taskId)
+{
+ int x, y;
+ u8 ballId;
+ u8 subpriority;
+ u8 spriteId;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL)
+ {
+ x = 28;
+ y = 11;
+ }
+ else
+ {
+ x = 23;
+ y = 11;
+ if (gSaveBlock2Ptr->playerGender == FEMALE)
+ y = 13;
+ }
+
+ ballId = ItemIdToBallId(gLastUsedItem);
+ subpriority = GetBattlerSpriteSubpriority(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + 1;
+ spriteId = CreateSprite(&gBallSpriteTemplates[ballId], x | 32, y | 80, subpriority);
+ gSprites[spriteId].data[0] = 34;
+ gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
+ gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) - 16;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].callback = sub_8012354;
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].func = sub_80EF7EC;
+}
+
+static void sub_80EF7EC(u8 taskId)
+{
+ if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animCmdIndex == 1)
+ {
+ PlaySE12WithPanning(SE_NAGERU, 0);
+ gSprites[gTasks[taskId].data[0]].callback = sub_80EF8C0;
+ CreateTask(sub_80EF864, 10);
+ gTasks[taskId].func = sub_80EF698;
+ }
+}
+
+static void sub_80EF864(u8 taskId)
+{
+ if (gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animEnded)
+ {
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], 0);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80EF8C0(struct Sprite *sprite)
+{
+ u16 temp = sprite->data[1];
+ u16 temp2 = sprite->data[2];
+
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = temp;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = temp2;
+ sprite->data[5] = -40;
+ InitAnimArcTranslation(sprite);
+ sprite->callback = sub_80EF8F0;
+}
+
+static void sub_80EF8F0(struct Sprite *sprite)
+{
+ int i;
+ u8 ballId;
+
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_TRAINER_BLOCK)
+ {
+ sprite->callback = sub_80F0478;
+ }
+ else if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_GHOST_DODGE)
+ {
+ sprite->callback = GhostBallDodge;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+
+ for (i = 0; i < 8; i++)
+ sprite->data[i] = 0;
+
+ sprite->data[5] = 0;
+ sprite->callback = sub_80EF9B4;
+
+ ballId = ItemIdToBallId(gLastUsedItem);
+ switch (ballId)
+ {
+ case 0 ... POKEBALL_COUNT - 1:
+ LaunchBallStarsTask(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballId);
+ LaunchBallFadeMonTask(0, gBattleAnimTarget, 14, ballId);
+ break;
+ }
+ }
+ }
+}
+
+static void sub_80EF9B4(struct Sprite *sprite)
+{
+ if (++sprite->data[5] == 10)
+ {
+ sprite->data[5] = CreateTask(TaskDummy, 50);
+ sprite->callback = sub_80EFA0C;
+ gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0;
+ }
+}
+
+static void sub_80EFA0C(struct Sprite *sprite)
+{
+ u8 spriteId;
+ u8 taskId;
+
+ spriteId = gBattlerSpriteIds[gBattleAnimTarget];
+ taskId = sprite->data[5];
+ if (++gTasks[taskId].data[1] == 11)
+ PlaySE(SE_SUIKOMU);
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);
+ gTasks[taskId].data[10] = 256;
+ sUnknown_3005424 = 28;
+ sUnknown_300542C = (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) - (sprite->pos1.y + sprite->pos2.y);
+ sUnknown_3005428 = (u32)(sUnknown_300542C * 256) / 28;
+ gTasks[taskId].data[2] = sUnknown_3005428;
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ gTasks[taskId].data[10] += 0x20;
+ SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0);
+ gTasks[taskId].data[3] += gTasks[taskId].data[2];
+ gSprites[spriteId].pos2.y = -gTasks[taskId].data[3] >> 8;
+ if (gTasks[taskId].data[10] >= 0x480)
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ ResetSpriteRotScale(spriteId);
+ gSprites[spriteId].invisible = TRUE;
+ gTasks[taskId].data[0]++;
+ break;
+ default:
+ if (gTasks[taskId].data[1] > 10)
+ {
+ DestroyTask(taskId);
+ StartSpriteAnim(sprite, 2);
+ sprite->data[5] = 0;
+ sprite->callback = sub_80EFB58;
+ }
+ break;
+ }
+}
+
+static void sub_80EFB58(struct Sprite *sprite)
+{
+ int angle;
+
+ if (sprite->animEnded)
+ {
+ sprite->data[3] = 0;
+ sprite->data[4] = 40;
+ sprite->data[5] = 0;
+ angle = 0;
+ sprite->pos1.y += Cos(angle, 40);
+ sprite->pos2.y = -Cos(angle, sprite->data[4]);
+ sprite->callback = sub_80EFB9C;
+ }
+}
+
+static void sub_80EFB9C(struct Sprite *sprite)
+{
+ bool8 lastBounce;
+ int bounceCount;
+
+ lastBounce = FALSE;
+ switch (sprite->data[3] & 0xFF)
+ {
+ case 0:
+ sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]);
+ sprite->data[5] += (sprite->data[3] >> 8) + 4;
+ if (sprite->data[5] >= 64)
+ {
+ sprite->data[4] -= 10;
+ sprite->data[3] += 257;
+
+ bounceCount = sprite->data[3] >> 8;
+ if (bounceCount == 4)
+ lastBounce = TRUE;
+
+ // Play a different sound effect for each pokeball bounce.
+ switch (bounceCount)
+ {
+ case 1:
+ PlaySE(SE_KON);
+ break;
+ case 2:
+ PlaySE(SE_KON2);
+ break;
+ case 3:
+ PlaySE(SE_KON3);
+ break;
+ default:
+ PlaySE(SE_KON4);
+ break;
+ }
+ }
+ break;
+ case 1:
+ sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]);
+ sprite->data[5] -= (sprite->data[3] >> 8) + 4;
+ if (sprite->data[5] <= 0)
+ {
+ sprite->data[5] = 0;
+ sprite->data[3] &= -0x100;
+ }
+ break;
+ }
+
+ if (lastBounce)
+ {
+ sprite->data[3] = 0;
+ sprite->pos1.y += Cos(64, 40);
+ sprite->pos2.y = 0;
+ if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_NO_SHAKES)
+ {
+ sprite->data[5] = 0;
+ sprite->callback = sub_80EFF80;
+ }
+ else
+ {
+ sprite->callback = sub_80EFCA0;
+ sprite->data[4] = 1;
+ sprite->data[5] = 0;
+ }
+ }
+}
+
+static void sub_80EFCA0(struct Sprite *sprite)
+{
+ if (++sprite->data[3] == 31)
+ {
+ sprite->data[3] = 0;
+ sprite->affineAnimPaused = TRUE;
+ StartSpriteAffineAnim(sprite, 1);
+ gBattleSpritesDataPtr->animationData->field_C = 0;
+ sprite->callback = sub_80EFCEC;
+ PlaySE(SE_BOWA);
+ }
+}
+
+static void sub_80EFCEC(struct Sprite *sprite)
+{
+ s8 state;
+ u16 var0;
+
+ switch (sprite->data[3] & 0xFF)
+ {
+ case 0:
+ if (gBattleSpritesDataPtr->animationData->field_C > 0xFF)
+ {
+ sprite->pos2.x += sprite->data[4];
+ gBattleSpritesDataPtr->animationData->field_C &= 0xFF;
+ }
+ else
+ {
+ gBattleSpritesDataPtr->animationData->field_C += 0xB0;
+ }
+
+ sprite->data[5]++;
+ sprite->affineAnimPaused = FALSE;
+ var0 = sprite->data[5] + 7;
+ if (var0 > 14)
+ {
+ gBattleSpritesDataPtr->animationData->field_C = 0;
+ sprite->data[3]++;
+ sprite->data[5] = 0;
+ }
+ break;
+ case 1:
+ if (++sprite->data[5] == 1)
+ {
+ sprite->data[5] = 0;
+ sprite->data[4] = -sprite->data[4];
+ sprite->data[3]++;
+ sprite->affineAnimPaused = FALSE;
+ if (sprite->data[4] < 0)
+ ChangeSpriteAffineAnim(sprite, 2);
+ else
+ ChangeSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->affineAnimPaused = TRUE;
+ }
+ break;
+ case 2:
+ if (gBattleSpritesDataPtr->animationData->field_C > 0xFF)
+ {
+ sprite->pos2.x += sprite->data[4];
+ gBattleSpritesDataPtr->animationData->field_C &= 0xFF;
+ }
+ else
+ {
+ gBattleSpritesDataPtr->animationData->field_C += 0xB0;
+ }
+
+ sprite->data[5]++;
+ sprite->affineAnimPaused = FALSE;
+ var0 = sprite->data[5] + 12;
+ if (var0 > 24)
+ {
+ gBattleSpritesDataPtr->animationData->field_C = 0;
+ sprite->data[3]++;
+ sprite->data[5] = 0;
+ }
+ break;
+ case 3:
+ if (sprite->data[5]++ < 0)
+ {
+ sprite->affineAnimPaused = TRUE;
+ break;
+ }
+
+ sprite->data[5] = 0;
+ sprite->data[4] = -sprite->data[4];
+ sprite->data[3]++;
+ sprite->affineAnimPaused = FALSE;
+ if (sprite->data[4] < 0)
+ ChangeSpriteAffineAnim(sprite, 2);
+ else
+ ChangeSpriteAffineAnim(sprite, 1);
+ // fall through
+ case 4:
+ if (gBattleSpritesDataPtr->animationData->field_C > 0xFF)
+ {
+ sprite->pos2.x += sprite->data[4];
+ gBattleSpritesDataPtr->animationData->field_C &= 0xFF;
+ }
+ else
+ {
+ gBattleSpritesDataPtr->animationData->field_C += 0xB0;
+ }
+
+ sprite->data[5]++;
+ sprite->affineAnimPaused = FALSE;
+ var0 = sprite->data[5] + 4;
+ if (var0 > 8)
+ {
+ gBattleSpritesDataPtr->animationData->field_C = 0;
+ sprite->data[3]++;
+ sprite->data[5] = 0;
+ sprite->data[4] = -sprite->data[4];
+ }
+ break;
+ case 5:
+ sprite->data[3] += 0x100;
+ state = sprite->data[3] >> 8;
+ if (state == gBattleSpritesDataPtr->animationData->ballThrowCaseId)
+ {
+ sprite->affineAnimPaused = TRUE;
+ sprite->callback = sub_80EFF80;
+ }
+ else
+ {
+ if (gBattleSpritesDataPtr->animationData->ballThrowCaseId == BALL_3_SHAKES_SUCCESS && state == 3)
+ {
+ sprite->callback = sub_80EFFA4;
+ sprite->affineAnimPaused = TRUE;
+ }
+ else
+ {
+ sprite->data[3]++;
+ sprite->affineAnimPaused = TRUE;
+ }
+ }
+ break;
+ case 6:
+ default:
+ if (++sprite->data[5] == 31)
+ {
+ sprite->data[5] = 0;
+ sprite->data[3] &= -0x100;
+ StartSpriteAffineAnim(sprite, 3);
+ if (sprite->data[4] < 0)
+ StartSpriteAffineAnim(sprite, 2);
+ else
+ StartSpriteAffineAnim(sprite, 1);
+
+ PlaySE(SE_BOWA);
+ }
+ break;
+ }
+}
+
+static void sub_80EFF80(struct Sprite *sprite)
+{
+ if (++sprite->data[5] == 31)
+ {
+ sprite->data[5] = 0;
+ sprite->callback = sub_80F02B0;
+ }
+}
+
+static void sub_80EFFA4(struct Sprite *sprite)
+{
+ sprite->animPaused = TRUE;
+ sprite->callback = sub_80EFFC4;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+}
+
+static void sub_80EFFC4(struct Sprite *sprite)
+{
+ u8 *battler = &gBattleAnimTarget;
+
+ sprite->data[4]++;
+ if (sprite->data[4] == 40)
+ {
+ PlaySE(SE_GETTING);
+ BlendPalettes(0x10000 << sprite->oam.paletteNum, 6, RGB_BLACK);
+ sub_80F01B8(sprite);
+ }
+ else if (sprite->data[4] == 60)
+ {
+ BeginNormalPaletteFade(0x10000 << sprite->oam.paletteNum, 2, 6, 0, RGB_BLACK);
+ }
+ else if (sprite->data[4] == 95)
+ {
+ gDoingBattleAnim = FALSE;
+ UpdateOamPriorityInAllHealthboxes(1);
+ m4aMPlayAllStop();
+ PlaySE(MUS_FAN6);
+ }
+ else if (sprite->data[4] == 315)
+ {
+ FreeOamMatrix(gSprites[gBattlerSpriteIds[*battler]].oam.matrixNum);
+ DestroySprite(&gSprites[gBattlerSpriteIds[*battler]]);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80F00A4;
+ }
+}
+
+static void sub_80F00A4(struct Sprite *sprite)
+{
+ u8 paletteIndex;
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->oam.objMode = ST_OAM_OBJ_BLEND;
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
+ paletteIndex = IndexOfSpritePaletteTag(sprite->template->paletteTag);
+ BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB_WHITE);
+ sprite->data[0]++;
+ break;
+ case 1:
+ if (sprite->data[1]++ > 0)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[2], sprite->data[2]));
+ if (sprite->data[2] == 16)
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->invisible = TRUE;
+ sprite->data[0]++;
+ break;
+ default:
+ if (!gPaletteFade.active)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80F018C;
+ }
+ break;
+ }
+}
+
+static void sub_80F018C(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[0] = -1;
+ }
+ else
+ {
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_80F01B8(struct Sprite *sprite)
+{
+ u32 i;
+ u8 subpriority;
+
+ if (sprite->subpriority)
+ {
+ subpriority = sprite->subpriority - 1;
+ }
+ else
+ {
+ subpriority = 0;
+ sprite->subpriority = 1;
+ }
+
+ sub_80F05B4(4);
+ for (i = 0; i < 3; i++)
+ {
+ u8 spriteId = CreateSprite(&sBallParticlesSpriteTemplates[4], sprite->pos1.x, sprite->pos1.y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = 24;
+ gSprites[spriteId].data[2] = sprite->pos1.x + sBallCaptureSuccessStarData[i].xOffset;
+ gSprites[spriteId].data[4] = sprite->pos1.y + sBallCaptureSuccessStarData[i].yOffset;
+ gSprites[spriteId].data[5] = sBallCaptureSuccessStarData[i].unk2;
+ InitAnimArcTranslation(&gSprites[spriteId]);
+ gSprites[spriteId].callback = sub_80F0278;
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[4]);
+ }
+ }
+}
+
+static void sub_80F0278(struct Sprite *sprite)
+{
+ sprite->invisible = !sprite->invisible;
+ if (TranslateAnimHorizontalArc(sprite))
+ DestroySprite(sprite);
+}
+
+static void sub_80F02B0(struct Sprite *sprite)
+{
+ u8 ballId;
+
+ StartSpriteAnim(sprite, 1);
+ StartSpriteAffineAnim(sprite, 0);
+ sprite->callback = sub_80F0378;
+ ballId = ItemIdToBallId(gLastUsedItem);
+ switch (ballId)
+ {
+ case 0 ... POKEBALL_COUNT - 1:
+ LaunchBallStarsTask(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballId);
+ LaunchBallFadeMonTask(1, gBattleAnimTarget, 14, ballId);
+ break;
+ }
+
+ gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = FALSE;
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 1);
+ AnimateSprite(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]]);
+ gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] = 0x1000;
+}
+
+static void sub_80F0378(struct Sprite *sprite)
+{
+ bool32 next = FALSE;
+
+ if (sprite->animEnded)
+ sprite->invisible = TRUE;
+
+ if (gSprites[gBattlerSpriteIds[gBattleAnimTarget]].affineAnimEnded)
+ {
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 0);
+ next = TRUE;
+ }
+ else
+ {
+ gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] -= 288;
+ gSprites[gBattlerSpriteIds[gBattleAnimTarget]].pos2.y = gSprites[gBattlerSpriteIds[gBattleAnimTarget]].data[1] >> 8;
+ }
+
+ if (sprite->animEnded && next)
+ {
+ gSprites[gBattlerSpriteIds[gBattleAnimTarget]].pos2.y = 0;
+ gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = gBattleSpritesDataPtr->animationData->field_9_x2;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80F018C;
+ gDoingBattleAnim = FALSE;
+ UpdateOamPriorityInAllHealthboxes(1);
+ }
+}
+
+static void sub_80F0478(struct Sprite *sprite)
+{
+ int i;
+
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = sprite->pos2.y = 0;
+ for (i = 0; i < 6; i++)
+ sprite->data[i] = 0;
+
+ sprite->callback = sub_80F04B4;
+}
+
+static void sub_80F04B4(struct Sprite *sprite)
+{
+ s16 var0 = sprite->data[0] + 0x800;
+ s16 var1 = sprite->data[1] + 0x680;
+
+ sprite->pos2.x -= var1 >> 8;
+ sprite->pos2.y += var0 >> 8;
+ sprite->data[0] = (sprite->data[0] + 0x800) & 0xFF;
+ sprite->data[1] = (sprite->data[1] + 0x680) & 0xFF;
+ if (sprite->pos1.y + sprite->pos2.y > 160
+ || sprite->pos1.x + sprite->pos2.x < -8)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80F018C;
+ gDoingBattleAnim = FALSE;
+ UpdateOamPriorityInAllHealthboxes(1);
+ }
+}
+
+static void GhostBallDodge(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = sprite->pos2.y = 0;
+ sprite->data[0] = 0x22;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x - 8;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = 0x90;
+ sprite->data[5] = 0x20;
+ InitAnimArcTranslation(sprite);
+ TranslateAnimVerticalArc(sprite);
+ sprite->callback = sub_80F0574;
+}
+
+static void sub_80F0574(struct Sprite *sprite)
+{
+ if (!TranslateAnimVerticalArc(sprite))
+ {
+ if ((sprite->pos1.y + sprite->pos2.y) < 65)
+ return;
+ }
+
+ sprite->data[0] = 0;
+ sprite->callback = sub_80F018C;
+ gDoingBattleAnim = FALSE;
+ UpdateOamPriorityInAllHealthboxes(1);
+}
+
+static void sub_80F05B4(u8 ballId)
+{
+ u8 taskId;
+
+ if (GetSpriteTileStartByTag(gBallParticleSpritesheets[ballId].tag) == 0xFFFF)
+ {
+ LoadCompressedSpriteSheetUsingHeap(&gBallParticleSpritesheets[ballId]);
+ LoadCompressedSpritePaletteUsingHeap(&gBallParticlePalettes[ballId]);
+ }
+}
+
+u8 LaunchBallStarsTask(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId)
+{
+ u8 taskId;
+
+ sub_80F05B4(ballId);
+ taskId = CreateTask(sBallParticleAnimationFuncs[ballId], 5);
+ gTasks[taskId].data[1] = x;
+ gTasks[taskId].data[2] = y;
+ gTasks[taskId].data[3] = priority;
+ gTasks[taskId].data[4] = subpriority;
+ gTasks[taskId].data[15] = ballId;
+ PlaySE(SE_BOWA2);
+ return taskId;
+}
+
+void sub_80F0674(void)
+{
+ if (gMain.inBattle)
+ gBattleSpritesDataPtr->animationData->field_A++;
+}
+
+static void PokeBallOpenParticleAnimation(u8 taskId)
+{
+ u8 spriteId;
+ u8 x, y;
+ u8 priority, subpriority;
+ u8 ballId;
+ u8 var0;
+
+ ballId = gTasks[taskId].data[15];
+ if (gTasks[taskId].data[0] < 16)
+ {
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = PokeBallOpenParticleAnimation_Step1;
+ gSprites[spriteId].oam.priority = priority;
+
+ var0 = (u8)gTasks[taskId].data[0];
+ if (var0 >= 8)
+ var0 -= 8;
+
+ gSprites[spriteId].data[0] = var0 * 32;
+ }
+
+ if (gTasks[taskId].data[0] == 15)
+ {
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+ return;
+ }
+ }
+
+ gTasks[taskId].data[0]++;
+}
+
+static void PokeBallOpenParticleAnimation_Step1(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ sprite->callback = PokeBallOpenParticleAnimation_Step2;
+ else
+ sprite->data[1]--;
+}
+
+static void PokeBallOpenParticleAnimation_Step2(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[0], sprite->data[1]);
+ sprite->data[1] += 2;
+ if (sprite->data[1] == 50)
+ DestroyBallOpenAnimationParticle(sprite);
+}
+
+static void TimerBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 32;
+ gSprites[spriteId].data[4] = 10;
+ gSprites[spriteId].data[5] = 2;
+ gSprites[spriteId].data[6] = 1;
+ }
+ }
+
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+}
+
+static void DiveBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 32;
+ gSprites[spriteId].data[4] = 10;
+ gSprites[spriteId].data[5] = 1;
+ gSprites[spriteId].data[6] = 2;
+ }
+ }
+
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+}
+
+// Also used for Net Ball
+static void SafariBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 32;
+ gSprites[spriteId].data[4] = 4;
+ gSprites[spriteId].data[5] = 1;
+ gSprites[spriteId].data[6] = 1;
+ }
+ }
+
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+}
+
+// Also used for Nest Ball
+static void UltraBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (i = 0; i < 10; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 25;
+ gSprites[spriteId].data[4] = 5;
+ gSprites[spriteId].data[5] = 1;
+ gSprites[spriteId].data[6] = 1;
+ }
+ }
+
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+}
+
+// Also used for Luxury Ball
+static void GreatBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ if (gTasks[taskId].data[7])
+ {
+ gTasks[taskId].data[7]--;
+ }
+ else
+ {
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 32;
+ gSprites[spriteId].data[4] = 8;
+ gSprites[spriteId].data[5] = 2;
+ gSprites[spriteId].data[6] = 2;
+ }
+ }
+
+ gTasks[taskId].data[7] = 8;
+ if (++gTasks[taskId].data[0] == 2)
+ {
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+ }
+ }
+}
+
+static void FanOutBallOpenParticles_Step1(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[0], sprite->data[2]);
+ sprite->data[0] = (sprite->data[0] + sprite->data[4]) & 0xFF;
+ sprite->data[1] += sprite->data[5];
+ sprite->data[2] += sprite->data[6];
+ if (++sprite->data[3] == 51)
+ DestroyBallOpenAnimationParticle(sprite);
+}
+
+static void RepeatBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (i = 0; i < POKEBALL_COUNT; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = RepeatBallOpenParticleAnimation_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 21;
+ }
+ }
+
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+}
+
+static void RepeatBallOpenParticleAnimation_Step1(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[0], Sin(sprite->data[0], sprite->data[2]));
+ sprite->data[0] = (sprite->data[0] + 6) & 0xFF;
+ sprite->data[1]++;
+ sprite->data[2]++;
+ if (++sprite->data[3] == 51)
+ DestroyBallOpenAnimationParticle(sprite);
+}
+
+static void MasterBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i, j;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (j = 0; j < 2; j++)
+ {
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = FanOutBallOpenParticles_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 32;
+ gSprites[spriteId].data[4] = 8;
+
+ if (j == 0)
+ {
+ gSprites[spriteId].data[5] = 2;
+ gSprites[spriteId].data[6] = 1;
+ }
+ else
+ {
+ gSprites[spriteId].data[5] = 1;
+ gSprites[spriteId].data[6] = 2;
+ }
+ }
+ }
+ }
+
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+}
+
+static void PremierBallOpenParticleAnimation(u8 taskId)
+{
+ u8 i;
+ u8 x, y, priority, subpriority, ballId;
+ u8 spriteId;
+
+ ballId = gTasks[taskId].data[15];
+ x = gTasks[taskId].data[1];
+ y = gTasks[taskId].data[2];
+ priority = gTasks[taskId].data[3];
+ subpriority = gTasks[taskId].data[4];
+
+ for (i = 0; i < 8; i++)
+ {
+ spriteId = CreateSprite(&sBallParticlesSpriteTemplates[ballId], x, y, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ sub_80F0674();
+ StartSpriteAnim(&gSprites[spriteId], sBallParticleAnimNums[ballId]);
+ gSprites[spriteId].callback = PremierBallOpenParticleAnimation_Step1;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = i * 32;
+ }
+ }
+
+ if (!gMain.inBattle)
+ gSprites[spriteId].data[7] = 1;
+
+ DestroyTask(taskId);
+}
+
+static void PremierBallOpenParticleAnimation_Step1(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[0], Sin(sprite->data[0] & 0x3F, sprite->data[2]));
+ sprite->data[0] = (sprite->data[0] + 10) & 0xFF;
+ sprite->data[1]++;
+ sprite->data[2]++;
+ if (++sprite->data[3] == 51)
+ DestroyBallOpenAnimationParticle(sprite);
+}
+
+static void DestroyBallOpenAnimationParticle(struct Sprite *sprite)
+{
+ int i, j;
+
+ if (!gMain.inBattle)
+ {
+ if (sprite->data[7] == 1)
+ DestroySpriteAndFreeResources(sprite);
+ else
+ DestroySprite(sprite);
+ }
+ else
+ {
+ gBattleSpritesDataPtr->animationData->field_A--;
+ if (gBattleSpritesDataPtr->animationData->field_A == 0)
+ {
+ for (j = 0; j < POKEBALL_COUNT; j++)
+ {
+ FreeSpriteTilesByTag(gBallParticleSpritesheets[j].tag);
+ FreeSpritePaletteByTag(gBallParticlePalettes[j].tag);
+ }
+
+ DestroySprite(sprite);
+ }
+ else
+ {
+ DestroySprite(sprite);
+ }
+ }
+}
+
+u8 LaunchBallFadeMonTask(bool8 unfadeLater, u8 battler, u32 selectedPalettes, u8 ballId)
+{
+ u8 taskId;
+
+ taskId = CreateTask(sub_80F12E0, 5);
+ gTasks[taskId].data[15] = ballId;
+ gTasks[taskId].data[3] = battler;
+ gTasks[taskId].data[10] = selectedPalettes;
+ gTasks[taskId].data[11] = selectedPalettes >> 16;
+
+ if (!unfadeLater)
+ {
+ BlendPalette(battler * 16 + 0x100, 16, 0, sBallOpenFadeColors[ballId]);
+ gTasks[taskId].data[1] = 1;
+ }
+ else
+ {
+ BlendPalette(battler * 16 + 0x100, 16, 16, sBallOpenFadeColors[ballId]);
+ gTasks[taskId].data[0] = 16;
+ gTasks[taskId].data[1] = -1;
+ gTasks[taskId].func = sub_80F1370;
+ }
+
+ BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB_WHITE);
+ return taskId;
+}
+
+static void sub_80F12E0(u8 taskId)
+{
+ u8 ballId = gTasks[taskId].data[15];
+
+ if (gTasks[taskId].data[2] <= 16)
+ {
+ BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], sBallOpenFadeColors[ballId]);
+ gTasks[taskId].data[0] += gTasks[taskId].data[1];
+ gTasks[taskId].data[2]++;
+ }
+ else if (!gPaletteFade.active)
+ {
+ u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16);
+ BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80F1370(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16);
+ BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB_WHITE);
+ gTasks[taskId].func = sub_80F13C0;
+ }
+}
+
+static void sub_80F13C0(u8 taskId)
+{
+ u8 ballId = gTasks[taskId].data[15];
+
+ if (gTasks[taskId].data[2] <= 16)
+ {
+ BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], sBallOpenFadeColors[ballId]);
+ gTasks[taskId].data[0] += gTasks[taskId].data[1];
+ gTasks[taskId].data[2]++;
+ }
+ else
+ {
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80F1420(u8 taskId)
+{
+ u8 spriteId;
+ u32 x;
+ bool32 done = FALSE;
+
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ switch (gTasks[taskId].data[10])
+ {
+ case 0:
+ gTasks[taskId].data[11] = gBattleAnimArgs[0];
+ gTasks[taskId].data[0] += 0x500;
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[0] >> 8;
+ else
+ gSprites[spriteId].pos2.x -= gTasks[taskId].data[0] >> 8;
+
+ gTasks[taskId].data[0] &= 0xFF;
+ x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x + 32;
+ if (x > 304)
+ gTasks[taskId].data[10]++;
+ break;
+ case 1:
+ LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, gTasks[taskId].data[11], spriteId);
+ gTasks[taskId].data[10]++;
+ break;
+ case 2:
+ gTasks[taskId].data[0] += 0x500;
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gSprites[spriteId].pos2.x -= gTasks[taskId].data[0] >> 8;
+ else
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[0] >> 8;
+
+ gTasks[taskId].data[0] &= 0xFF;
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ if (gSprites[spriteId].pos2.x <= 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ done = TRUE;
+ }
+ }
+ else
+ {
+ if (gSprites[spriteId].pos2.x >= 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ done = TRUE;
+ }
+ }
+
+ if (done)
+ DestroyAnimVisualTask(taskId);
+
+ break;
+ }
+}
+
+void sub_80F15C8(u8 taskId)
+{
+ u8 spriteId;
+
+ switch (gTasks[taskId].data[15])
+ {
+ case 0:
+ if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == B_POSITION_OPPONENT_LEFT)
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ else
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
+ gTasks[taskId].data[15]++;
+ break;
+ case 1:
+ if (gTasks[taskId].data[1]++ > 1)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - gTasks[taskId].data[0], gTasks[taskId].data[0]));
+ if (gTasks[taskId].data[0] == 16)
+ gTasks[taskId].data[15]++;
+ }
+ break;
+ case 2:
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker];
+ RequestDma3Fill(0, (void *)OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * TILE_SIZE_4BPP, 0x800, 1);
+ ClearBehindSubstituteBit(gBattleAnimAttacker);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void AnimTask_IsAttackerBehindSubstitute(u8 taskId)
+{
+ gBattleAnimArgs[ARG_RET_ID] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].behindSubstitute;
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_TargetToEffectBattler(u8 taskId)
+{
+ gBattleAnimTarget = gEffectBattler;
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80F1720(u8 battler, struct Pokemon *mon)
+{
+ bool32 isShiny;
+ u32 otId, personality;
+ u32 shinyValue;
+ u8 taskId1, taskId2;
+
+ isShiny = FALSE;
+ gBattleSpritesDataPtr->healthBoxesData[battler].flag_x80 = 1;
+ otId = GetMonData(mon, MON_DATA_OT_ID);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+
+ if (IsBattlerSpriteVisible(battler))
+ {
+ shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality);
+ if (shinyValue < SHINY_ODDS)
+ isShiny = TRUE;
+
+ if (isShiny)
+ {
+ if (GetSpriteTileStartByTag(ANIM_TAG_GOLD_STARS) == 0xFFFF)
+ {
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[ANIM_TAG_GOLD_STARS - ANIM_SPRITES_START]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_GOLD_STARS - ANIM_SPRITES_START]);
+ }
+
+ taskId1 = CreateTask(sub_80F181C, 10);
+ taskId2 = CreateTask(sub_80F181C, 10);
+ gTasks[taskId1].data[0] = battler;
+ gTasks[taskId2].data[0] = battler;
+ gTasks[taskId1].data[1] = 0;
+ gTasks[taskId2].data[1] = 1;
+ return;
+ }
+ }
+
+ gBattleSpritesDataPtr->healthBoxesData[battler].field_1_x1 = 1;
+}
+
+static void sub_80F181C(u8 taskId)
+{
+ u8 battler;
+ u8 x, y;
+ u8 spriteId;
+ u16 counter;
+ s16 state;
+ u8 pan;
+
+ if (gTasks[taskId].data[13] < 60)
+ {
+ gTasks[taskId].data[13]++;
+ return;
+ }
+
+ if (gBattleSpritesDataPtr->animationData->field_A)
+ return;
+
+ counter = gTasks[taskId].data[10]++;
+ if (counter & 3)
+ return;
+
+ battler = gTasks[taskId].data[0];
+ x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X);
+ y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y);
+ state = gTasks[taskId].data[11];
+ if (state == 0)
+ {
+ spriteId = CreateSprite(&gWishStarSpriteTemplate, x, y, 5);
+ }
+ else if (state >= 0 && gTasks[taskId].data[11] < 4)
+ {
+ spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5);
+ gSprites[spriteId].oam.tileNum += 4;
+ }
+ else
+ {
+ spriteId = CreateSprite(&gMiniTwinklingStarSpriteTemplate, x, y, 5);
+ gSprites[spriteId].oam.tileNum += 5;
+ }
+
+ if (gTasks[taskId].data[1] == FALSE)
+ {
+ gSprites[spriteId].callback = sub_80F1A2C;
+ }
+ else
+ {
+ gSprites[spriteId].callback = sub_80F1A80;
+ gSprites[spriteId].pos2.x = -32;
+ gSprites[spriteId].pos2.y = 32;
+ gSprites[spriteId].invisible = TRUE;
+ if (gTasks[taskId].data[11] == FALSE)
+ {
+ if (GetBattlerSide(battler) == B_SIDE_PLAYER)
+ pan = SOUND_PAN_ATTACKER;
+ else
+ pan = SOUND_PAN_TARGET;
+
+ PlaySE12WithPanning(SE_REAPOKE, pan);
+ }
+ }
+
+ gSprites[spriteId].data[0] = taskId;
+ gTasks[taskId].data[11]++;
+ if (spriteId != MAX_SPRITES)
+ gTasks[taskId].data[12]++;
+
+ if (gTasks[taskId].data[11] == 5)
+ gTasks[taskId].func = sub_80F19E0;
+}
+
+static void sub_80F19E0(u8 taskId)
+{
+ u8 battler;
+
+ if (gTasks[taskId].data[12] == FALSE)
+ {
+ if (gTasks[taskId].data[1] == TRUE)
+ {
+ battler = gTasks[taskId].data[0];
+ gBattleSpritesDataPtr->healthBoxesData[battler].field_1_x1 = 1;
+ }
+
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80F1A2C(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[1], 24);
+ sprite->pos2.y = Cos(sprite->data[1], 24);
+ sprite->data[1] += 12;
+ if (sprite->data[1] > 0xFF)
+ {
+ gTasks[sprite->data[0]].data[12]--;
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+}
+
+static void sub_80F1A80(struct Sprite *sprite)
+{
+ if (sprite->data[1] < 4)
+ {
+ sprite->data[1]++;
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ sprite->pos2.x += 5;
+ sprite->pos2.y -= 5;
+ if (sprite->pos2.x > 32)
+ {
+ gTasks[sprite->data[0]].data[12]--;
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+ }
+}
+
+void AnimTask_LoadPokeblockGfx(u8 taskId)
+{
+ u8 paletteIndex;
+
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[ANIM_TAG_POKEBLOCK - ANIM_SPRITES_START]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[ANIM_TAG_POKEBLOCK - ANIM_SPRITES_START]);
+ paletteIndex = IndexOfSpritePaletteTag(ANIM_TAG_POKEBLOCK);
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_FreePokeblockGfx(u8 taskId)
+{
+ FreeSpriteTilesByTag(ANIM_TAG_POKEBLOCK);
+ FreeSpritePaletteByTag(ANIM_TAG_POKEBLOCK);
+ DestroyAnimVisualTask(taskId);
+}
+
+static void sub_80F1B3C(struct Sprite *sprite)
+{
+ InitSpritePosToAnimAttacker(sprite, 0);
+ sprite->data[0] = 30;
+ sprite->data[2] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_X) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), BATTLER_COORD_Y) + gBattleAnimArgs[3];
+ sprite->data[5] = -32;
+ InitAnimArcTranslation(sprite);
+ gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].callback = sub_8012354;
+ sprite->callback = sub_80F1BCC;
+}
+
+static void sub_80F1BCC(struct Sprite *sprite)
+{
+ if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animCmdIndex == 1)
+ sprite->callback = sub_80F1C04;
+}
+
+static void sub_80F1C04(struct Sprite *sprite)
+{
+ if (TranslateAnimHorizontalArc(sprite))
+ {
+ sprite->data[0] = 0;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_80F1C30;
+ }
+}
+
+static void sub_80F1C30(struct Sprite *sprite)
+{
+ if (gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].animEnded)
+ {
+ if (++sprite->data[0] > 0)
+ {
+ StartSpriteAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], 0);
+ DestroyAnimSprite(sprite);
+ }
+ }
+}
+
+void sub_80F1C8C(u8 taskId)
+{
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ gBattleAnimAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ gBattleAnimTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ break;
+ case 1:
+ gBattleAnimAttacker = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
+ gBattleAnimTarget = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
+ break;
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80F1CE4(u8 taskId)
+{
+ if (gBattleCommunication[MULTISTRING_CHOOSER] > 2)
+ gBattleAnimArgs[7] = 0;
+ else
+ gBattleAnimArgs[7] = gBattleCommunication[MULTISTRING_CHOOSER];
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_GetTrappedMoveAnimId(u8 taskId)
+{
+ if (gBattleSpritesDataPtr->animationData->animArg == MOVE_FIRE_SPIN)
+ gBattleAnimArgs[0] = TRAP_ANIM_FIRE_SPIN;
+ else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_WHIRLPOOL)
+ gBattleAnimArgs[0] = TRAP_ANIM_WHIRLPOOL;
+ else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_CLAMP)
+ gBattleAnimArgs[0] = TRAP_ANIM_CLAMP;
+ else if (gBattleSpritesDataPtr->animationData->animArg == MOVE_SAND_TOMB)
+ gBattleAnimArgs[0] = TRAP_ANIM_SAND_TOMB;
+ else
+ gBattleAnimArgs[0] = TRAP_ANIM_BIND;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void AnimTask_GetBattlersFromArg(u8 taskId)
+{
+ gBattleAnimAttacker = gBattleSpritesDataPtr->animationData->animArg;
+ gBattleAnimTarget = gBattleSpritesDataPtr->animationData->animArg >> 8;
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c
new file mode 100644
index 000000000..2e7f30ff1
--- /dev/null
+++ b/src/battle_anim_status_effects.c
@@ -0,0 +1,533 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "decompress.h"
+#include "gpu_regs.h"
+#include "palette.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "util.h"
+#include "constants/battle_anim.h"
+#include "constants/pokemon.h"
+
+// Function Declarations
+static u8 sub_8078178(u8 battlerId, bool8 b);
+static void sub_80782BC(u8 taskId);
+static void sub_80784D8(u8 taskId);
+static void sub_8078528(u8 taskId);
+static void sub_80785D8(u8 taskId);
+static void sub_807862C(u8 taskId);
+static void Task_DoStatusAnimation(u8 taskId);
+static void sub_807834C(struct Sprite *sprite);
+static void sub_8078380(struct Sprite *sprite);
+
+// Data
+static const union AnimCmd sUnknown_83BF3E0[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(4, 3),
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(12, 3),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83BF3F4[] =
+{
+ sUnknown_83BF3E0
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF3F8 =
+{
+ .tileTag = ANIM_TAG_ORB,
+ .paletteTag = ANIM_TAG_ORB,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sSpriteAnimTable_83BF3F4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8076F58,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF410 =
+{
+ .tileTag = ANIM_TAG_ORB,
+ .paletteTag = ANIM_TAG_ORB,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
+ .anims = sSpriteAnimTable_83BF3F4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8076ED8,
+};
+
+static const union AnimCmd sUnknown_83BF428[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83BF430[] =
+{
+ sUnknown_83BF428
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF434 =
+{
+ .tileTag = ANIM_TAG_WEATHER_BALL,
+ .paletteTag = ANIM_TAG_WEATHER_BALL,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSpriteAnimTable_83BF430,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807729C,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF44C =
+{
+ .tileTag = ANIM_TAG_WEATHER_BALL,
+ .paletteTag = ANIM_TAG_WEATHER_BALL,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSpriteAnimTable_83BF430,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8077350,
+};
+
+static const union AnimCmd sUnknown_83BF464[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(32, 3),
+ ANIMCMD_FRAME(48, 3),
+ ANIMCMD_FRAME(64, 3),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83BF47C[] =
+{
+ sUnknown_83BF464
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF480 =
+{
+ .tileTag = ANIM_TAG_SPARKLE_4,
+ .paletteTag = ANIM_TAG_SPARKLE_4,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSpriteAnimTable_83BF47C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8076FD0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF498 =
+{
+ .tileTag = ANIM_TAG_MONSTER_FOOT,
+ .paletteTag = ANIM_TAG_MONSTER_FOOT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8076F58,
+};
+
+static const union AnimCmd sUnknown_83BF4B0[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sUnknown_83BF4B8[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd sUnknown_83BF4C0[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAniimTable_83BF4C8[] =
+{
+ sUnknown_83BF4B0,
+ sUnknown_83BF4B8,
+ sUnknown_83BF4C0
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF4D4 =
+{
+ .tileTag = ANIM_TAG_IMPACT,
+ .paletteTag = ANIM_TAG_IMPACT,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
+ .anims = sSpriteAniimTable_83BF4C8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8076F58,
+};
+
+static const union AnimCmd sUnknown_83BF4EC[] =
+{
+ ANIMCMD_FRAME(0, 15),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83BF4F4[] =
+{
+ sUnknown_83BF4EC
+};
+
+static const union AffineAnimCmd sUnknown_83BF4F8[] =
+{
+ AFFINEANIMCMD_FRAME(96, 96, 0, 0),
+ AFFINEANIMCMD_FRAME(2, 2, 0, 1),
+ AFFINEANIMCMD_JUMP(1)
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_83BF510[] =
+{
+ sUnknown_83BF4F8
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BF514 =
+{
+ .tileTag = ANIM_TAG_ORB,
+ .paletteTag = ANIM_TAG_ORB,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
+ .anims = sSpriteAnimTable_83BF4F4,
+ .images = NULL,
+ .affineAnims = sSpriteAffineAnimTable_83BF510,
+ .callback = sub_8076ED8,
+};
+
+static const u8 sUnknown_83BF52C[] = _("TASK OVER\nタスクがオ-バ-しました");
+
+static const struct Subsprite sSubsprites_83BF544[] =
+{
+ {.x = -16, .y = -16, .shape = SPRITE_SHAPE(8x8), .size = 3, .tileOffset = 0, .priority = 2},
+ {.x = -16, .y = 48, .shape = SPRITE_SHAPE(16x8), .size = 3, .tileOffset = 64, .priority = 2},
+ {.x = 48, .y = -16, .shape = SPRITE_SHAPE(8x16), .size = 3, .tileOffset = 96, .priority = 2},
+ {.x = 48, .y = 48, .shape = SPRITE_SHAPE(8x8), .size = 2, .tileOffset = 128, .priority = 2},
+};
+
+static const struct SubspriteTable sUnknown_83BF554[] =
+{
+ {NELEMS(sSubsprites_83BF544), sSubsprites_83BF544},
+};
+
+static const struct SpriteTemplate sUnknown_83BF55C =
+{
+ .tileTag = ANIM_TAG_ICE_CUBE,
+ .paletteTag = ANIM_TAG_ICE_CUBE,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct SpriteTemplate sUnknown_83BF574 =
+{
+ .tileTag = ANIM_TAG_CIRCLE_IMPACT,
+ .paletteTag = ANIM_TAG_CIRCLE_IMPACT,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807834C,
+};
+
+// Functions
+static u8 sub_8078178(u8 battlerId, bool8 b)
+{
+ u8 battlerSpriteId = gBattlerSpriteIds[battlerId];
+ u8 taskId = CreateTask(sub_80782BC, 10);
+ u8 spriteId2;
+ u8 i;
+
+ LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);
+ LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]);
+ gTasks[taskId].data[0] = battlerId;
+ if (b)
+ {
+ gTasks[taskId].data[1] = RGB_RED;
+ for (i = 0; i < 10; i++)
+ {
+ spriteId2 = CreateSprite(&sUnknown_83BF574, gSprites[battlerSpriteId].pos1.x, gSprites[battlerSpriteId].pos1.y + 32, 0);
+ gSprites[spriteId2].data[0] = i * 51;
+ gSprites[spriteId2].data[1] = -256;
+ gSprites[spriteId2].invisible = TRUE;
+ if (i > 4)
+ gSprites[spriteId2].data[6] = 21;
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[1] = RGB_BLUE;
+ for (i = 0; i < 10; i++)
+ {
+ spriteId2 = CreateSprite(&sUnknown_83BF574, gSprites[battlerSpriteId].pos1.x, gSprites[battlerSpriteId].pos1.y - 32, 0);
+ gSprites[spriteId2].data[0] = i * 51;
+ gSprites[spriteId2].data[1] = 256;
+ gSprites[spriteId2].invisible = TRUE;
+ if (i > 4)
+ gSprites[spriteId2].data[6] = 21;
+ }
+ }
+ gSprites[spriteId2].data[7] = 1;
+ return taskId;
+}
+
+static void sub_80782BC(u8 taskId)
+{
+ if (gTasks[taskId].data[2] == 2)
+ {
+ gTasks[taskId].data[2] = 0;
+ BlendPalette(0x100 + gTasks[taskId].data[0] * 16, 16, gTasks[taskId].data[4], gTasks[taskId].data[1]);
+ if (gTasks[taskId].data[5] == 0)
+ {
+ gTasks[taskId].data[4]++;
+ if (gTasks[taskId].data[4] > 8)
+ gTasks[taskId].data[5] ^= 1;
+ }
+ else
+ {
+ u16 var = gTasks[taskId].data[4];
+
+ gTasks[taskId].data[4]--;
+ if (gTasks[taskId].data[4] < 0)
+ {
+ gTasks[taskId].data[4] = var;
+ gTasks[taskId].data[5] ^= 1;
+ gTasks[taskId].data[3]++;
+ if (gTasks[taskId].data[3] == 2)
+ DestroyTask(taskId);
+ }
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[2]++;
+ }
+}
+
+static void sub_807834C(struct Sprite *sprite)
+{
+ if (sprite->data[6] == 0)
+ {
+ sprite->invisible = FALSE;
+ sprite->callback = sub_8078380;
+ sub_8078380(sprite);
+ }
+ else
+ {
+ sprite->data[6]--;
+ }
+}
+
+static void sub_8078380(struct Sprite *sprite)
+{
+ sprite->pos2.x = Cos(sprite->data[0], 32);
+ sprite->pos2.y = Sin(sprite->data[0], 8);
+ if (sprite->data[0] < 128)
+ sprite->subpriority = 29;
+ else
+ sprite->subpriority = 31;
+ sprite->data[0] = (sprite->data[0] + 8) & 0xFF;
+ sprite->data[5] += sprite->data[1];
+ sprite->pos2.y += sprite->data[5] >> 8;
+ sprite->data[2]++;
+ if (sprite->data[2] == 52)
+ {
+ if (sprite->data[7])
+ DestroySpriteAndFreeResources(sprite);
+ else
+ DestroySprite(sprite);
+ }
+}
+
+void sub_80783FC(u8 taskId)
+{
+ s16 x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) - 32;
+ s16 y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) - 36;
+ u8 spriteId;
+
+ if (IsContest())
+ x -= 6;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
+ spriteId = CreateSprite(&sUnknown_83BF55C, x, y, 4);
+ if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == SPRITE_INVALID_TAG)
+ gSprites[spriteId].invisible = TRUE;
+
+ SetSubspriteTables(&gSprites[spriteId], sUnknown_83BF554);
+ gTasks[taskId].data[15] = spriteId;
+ gTasks[taskId].func = sub_80784D8;
+}
+
+static void sub_80784D8(u8 taskId)
+{
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] == 10)
+ {
+ gTasks[taskId].func = sub_8078528;
+ gTasks[taskId].data[1] = 0;
+ }
+ else
+ {
+ u8 var = gTasks[taskId].data[1];
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(var, 16 - var));
+ }
+}
+
+static void sub_8078528(u8 taskId)
+{
+ u8 palIndex = IndexOfSpritePaletteTag(ANIM_TAG_ICE_CUBE);
+
+ if (gTasks[taskId].data[1]++ > 13)
+ {
+ gTasks[taskId].data[2]++;
+ if (gTasks[taskId].data[2] == 3)
+ {
+ u16 temp;
+
+ temp = gPlttBufferFaded[0x100 + palIndex * 16 + 13];
+ gPlttBufferFaded[0x100 + palIndex * 16 + 13] = gPlttBufferFaded[0x100 + palIndex * 16 + 14];
+ gPlttBufferFaded[0x100 + palIndex * 16 + 14] = gPlttBufferFaded[0x100 + palIndex * 16 + 15];
+ gPlttBufferFaded[0x100 + palIndex * 16 + 15] = temp;
+
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3]++;
+ if (gTasks[taskId].data[3] == 3)
+ {
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[4]++;
+ if (gTasks[taskId].data[4] == 2)
+ {
+ gTasks[taskId].data[1] = 9;
+ gTasks[taskId].func = sub_80785D8;
+ }
+ }
+ }
+ }
+}
+
+static void sub_80785D8(u8 taskId)
+{
+ gTasks[taskId].data[1]--;
+ if (gTasks[taskId].data[1] == -1)
+ {
+ gTasks[taskId].func = sub_807862C;
+ gTasks[taskId].data[1] = 0;
+ }
+ else
+ {
+ u8 var = gTasks[taskId].data[1];
+
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(var, 16 - var));
+ }
+}
+
+static void sub_807862C(u8 taskId)
+{
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] == 37)
+ {
+ u8 spriteId = gTasks[taskId].data[15];
+
+ FreeSpriteOamMatrix(&gSprites[spriteId]);
+ DestroySprite(&gSprites[spriteId]);
+ }
+ else if (gTasks[taskId].data[1] == 39)
+ {
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+#define CASE(by, stat) case (STAT_ANIM_##by + stat - 1)
+
+void AnimTask_StatsChange(u8 taskId)
+{
+ bool16 goesDown = FALSE;
+ s16 animStatId = 0;
+ bool16 sharply = FALSE;
+
+ switch (gBattleSpritesDataPtr->animationData->animArg)
+ {
+ CASE(PLUS1, STAT_ATK): goesDown = FALSE; animStatId = 0; break;
+ CASE(PLUS1, STAT_DEF): goesDown = FALSE; animStatId = 1; break;
+ CASE(PLUS1, STAT_SPEED): goesDown = FALSE; animStatId = 3; break;
+ CASE(PLUS1, STAT_SPATK): goesDown = FALSE; animStatId = 5; break;
+ CASE(PLUS1, STAT_SPDEF): goesDown = FALSE; animStatId = 6; break;
+ CASE(PLUS1, STAT_ACC): goesDown = FALSE; animStatId = 2; break;
+ CASE(PLUS1, STAT_EVASION): goesDown = FALSE; animStatId = 4; break;
+
+ CASE(MINUS1, STAT_ATK): goesDown = TRUE; animStatId = 0; break;
+ CASE(MINUS1, STAT_DEF): goesDown = TRUE; animStatId = 1; break;
+ CASE(MINUS1, STAT_SPEED): goesDown = TRUE; animStatId = 3; break;
+ CASE(MINUS1, STAT_SPATK): goesDown = TRUE; animStatId = 5; break;
+ CASE(MINUS1, STAT_SPDEF): goesDown = TRUE; animStatId = 6; break;
+ CASE(MINUS1, STAT_ACC): goesDown = TRUE; animStatId = 2; break;
+ CASE(MINUS1, STAT_EVASION): goesDown = TRUE; animStatId = 4; break;
+
+ CASE(PLUS2, STAT_ATK): goesDown = FALSE; animStatId = 0; sharply = TRUE; break;
+ CASE(PLUS2, STAT_DEF): goesDown = FALSE; animStatId = 1; sharply = TRUE; break;
+ CASE(PLUS2, STAT_SPEED): goesDown = FALSE; animStatId = 3; sharply = TRUE; break;
+ CASE(PLUS2, STAT_SPATK): goesDown = FALSE; animStatId = 5; sharply = TRUE; break;
+ CASE(PLUS2, STAT_SPDEF): goesDown = FALSE; animStatId = 6; sharply = TRUE; break;
+ CASE(PLUS2, STAT_ACC): goesDown = FALSE; animStatId = 2; sharply = TRUE; break;
+ CASE(PLUS2, STAT_EVASION): goesDown = FALSE; animStatId = 4; sharply = TRUE; break;
+
+ CASE(MINUS2, STAT_ATK): goesDown = TRUE; animStatId = 0; sharply = TRUE; break;
+ CASE(MINUS2, STAT_DEF): goesDown = TRUE; animStatId = 1; sharply = TRUE; break;
+ CASE(MINUS2, STAT_SPEED): goesDown = TRUE; animStatId = 3; sharply = TRUE; break;
+ CASE(MINUS2, STAT_SPATK): goesDown = TRUE; animStatId = 5; sharply = TRUE; break;
+ CASE(MINUS2, STAT_SPDEF): goesDown = TRUE; animStatId = 6; sharply = TRUE; break;
+ CASE(MINUS2, STAT_ACC): goesDown = TRUE; animStatId = 2; sharply = TRUE; break;
+ CASE(MINUS2, STAT_EVASION): goesDown = TRUE; animStatId = 4; sharply = TRUE; break;
+
+ case STAT_ANIM_MULTIPLE_PLUS1: goesDown = FALSE; animStatId = 0xFF; sharply = FALSE; break;
+ case STAT_ANIM_MULTIPLE_PLUS2: goesDown = FALSE; animStatId = 0xFF; sharply = TRUE; break;
+ case STAT_ANIM_MULTIPLE_MINUS1: goesDown = TRUE; animStatId = 0xFF; sharply = FALSE; break;
+ case STAT_ANIM_MULTIPLE_MINUS2: goesDown = TRUE; animStatId = 0xFF; sharply = TRUE; break;
+
+ default:
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ gBattleAnimArgs[0] = goesDown;
+ gBattleAnimArgs[1] = animStatId;
+ gBattleAnimArgs[2] = 0;
+ gBattleAnimArgs[3] = 0;
+ gBattleAnimArgs[4] = sharply;
+ gTasks[taskId].func = sub_80BB088;
+ sub_80BB088(taskId);
+}
+
+#undef CASE
+
+void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId)
+{
+ u8 taskId;
+
+ gBattleAnimAttacker = battlerId;
+ gBattleAnimTarget = battlerId;
+ LaunchBattleAnimation(gBattleAnims_StatusConditions, statusAnimId, 0);
+ taskId = CreateTask(Task_DoStatusAnimation, 10);
+ gTasks[taskId].data[0] = battlerId;
+}
+
+static void Task_DoStatusAnimation(u8 taskId)
+{
+ gAnimScriptCallback();
+ if (!gAnimScriptActive)
+ {
+ gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].data[0]].statusAnimActive = FALSE;
+ DestroyTask(taskId);
+ }
+}
diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c
index d9a6754c7..df4a8243b 100644
--- a/src/battle_anim_utility_funcs.c
+++ b/src/battle_anim_utility_funcs.c
@@ -496,9 +496,9 @@ static void sub_80BB2A0(u8 taskId)
gTasks[taskId].data[7] = gBattlerSpriteIds[sAnimStatsChangeData->battler2];
gTasks[taskId].func = sub_80BB4B8;
if (sAnimStatsChangeData->data[0] == 0)
- PlaySE12WithPanning(SE_W287, BattleAnimAdjustPanning2(PAN_SIDE_PLAYER));
+ PlaySE12WithPanning(SE_W287, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER));
else
- PlaySE12WithPanning(SE_W287B, BattleAnimAdjustPanning2(PAN_SIDE_PLAYER));
+ PlaySE12WithPanning(SE_W287B, BattleAnimAdjustPanning2(SOUND_PAN_ATTACKER));
}
static void sub_80BB4B8(u8 taskId)
diff --git a/src/bug.c b/src/bug.c
index b9f1795ab..e3bcb68ab 100644
--- a/src/bug.c
+++ b/src/bug.c
@@ -46,7 +46,7 @@ const struct SpriteTemplate gUnknown_83E7224 =
{
.tileTag = ANIM_TAG_HORN_HIT_2,
.paletteTag = ANIM_TAG_HORN_HIT_2,
- .oam = &gOamData_83ACAB8,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7218,
@@ -82,7 +82,7 @@ const struct SpriteTemplate gUnknown_83E7278 =
{
.tileTag = ANIM_TAG_NEEDLE,
.paletteTag = ANIM_TAG_NEEDLE,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E726C,
@@ -93,7 +93,7 @@ const struct SpriteTemplate gWebThreadSpriteTemplate =
{
.tileTag = ANIM_TAG_WEB_THREAD,
.paletteTag = ANIM_TAG_WEB_THREAD,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -104,7 +104,7 @@ const struct SpriteTemplate gUnknown_83E72A8 =
{
.tileTag = ANIM_TAG_STRING,
.paletteTag = ANIM_TAG_STRING,
- .oam = &gOamData_83ACA00,
+ .oam = &gOamData_AffineOff_ObjNormal_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -127,7 +127,7 @@ const struct SpriteTemplate gSpiderWebSpriteTemplate =
{
.tileTag = ANIM_TAG_SPIDER_WEB,
.paletteTag = ANIM_TAG_SPIDER_WEB,
- .oam = &gOamData_83ACBC0,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E72D8,
@@ -138,7 +138,7 @@ const struct SpriteTemplate gLinearStingerSpriteTemplate =
{
.tileTag = ANIM_TAG_NEEDLE,
.paletteTag = ANIM_TAG_NEEDLE,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -149,7 +149,7 @@ const struct SpriteTemplate gPinMissileSpriteTemplate =
{
.tileTag = ANIM_TAG_NEEDLE,
.paletteTag = ANIM_TAG_NEEDLE,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -160,7 +160,7 @@ const struct SpriteTemplate gIcicleSpearSpriteTemplate =
{
.tileTag = ANIM_TAG_ICICLE_SPEAR,
.paletteTag = ANIM_TAG_ICICLE_SPEAR,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -187,7 +187,7 @@ const struct SpriteTemplate gUnknown_83E7378 =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACB60,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7374,
diff --git a/src/dark.c b/src/dark.c
index 368f5cbd5..e13227316 100644
--- a/src/dark.c
+++ b/src/dark.c
@@ -27,7 +27,7 @@ const struct SpriteTemplate gUnknown_83E7878 =
{
.tileTag = ANIM_TAG_TIED_BAG,
.paletteTag = ANIM_TAG_TIED_BAG,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -98,7 +98,7 @@ const struct SpriteTemplate gUnknown_83E7930 =
{
.tileTag = ANIM_TAG_SHARP_TEETH,
.paletteTag = ANIM_TAG_SHARP_TEETH,
- .oam = &gOamData_83ACB60,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7910,
@@ -109,7 +109,7 @@ const struct SpriteTemplate gUnknown_83E7948 =
{
.tileTag = ANIM_TAG_CLAMP,
.paletteTag = ANIM_TAG_CLAMP,
- .oam = &gOamData_83ACB60,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7910,
@@ -140,7 +140,7 @@ const struct SpriteTemplate gUnknown_83E7998 =
{
.tileTag = ANIM_TAG_SMALL_BUBBLES,
.paletteTag = ANIM_TAG_SMALL_BUBBLES,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7990,
@@ -177,7 +177,7 @@ const struct SpriteTemplate gUnknown_83E79E8 =
{
.tileTag = ANIM_TAG_CLAW_SLASH,
.paletteTag = ANIM_TAG_CLAW_SLASH,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E79E0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
diff --git a/src/dragon.c b/src/dragon.c
index 34f97ba74..d18cf25df 100644
--- a/src/dragon.c
+++ b/src/dragon.c
@@ -35,7 +35,7 @@ const struct SpriteTemplate gUnknown_83E772C =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7728,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -88,7 +88,7 @@ const struct SpriteTemplate gUnknown_83E77A4 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83ACA98,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = gUnknown_83E7764,
.images = NULL,
.affineAnims = gUnknown_83E779C,
@@ -114,7 +114,7 @@ const struct SpriteTemplate gUnknown_83E77D8 =
{
.tileTag = ANIM_TAG_FIRE_PLUME,
.paletteTag = ANIM_TAG_FIRE_PLUME,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E77D4,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -157,7 +157,7 @@ const struct SpriteTemplate gUnknown_83E7830 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83ACA98,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = gUnknown_83E7800,
.images = NULL,
.affineAnims = gUnknown_83E7828,
@@ -168,7 +168,7 @@ const struct SpriteTemplate gUnknown_83E7848 =
{
.tileTag = ANIM_TAG_HOLLOW_ORB,
.paletteTag = ANIM_TAG_HOLLOW_ORB,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -179,7 +179,7 @@ const struct SpriteTemplate gUnknown_83E7860 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7728,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
diff --git a/src/electric.c b/src/electric.c
index 025eac48b..908ce60a4 100644
--- a/src/electric.c
+++ b/src/electric.c
@@ -53,7 +53,7 @@ const struct SpriteTemplate gUnknown_83E5F38 =
{
.tileTag = ANIM_TAG_LIGHTNING,
.paletteTag = ANIM_TAG_LIGHTNING,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5F34,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -77,7 +77,7 @@ const struct SpriteTemplate gUnknown_83E5F74 =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E5F70,
@@ -104,7 +104,7 @@ const struct SpriteTemplate gUnknown_83E5FAC =
{
.tileTag = ANIM_TAG_SHOCK,
.paletteTag = ANIM_TAG_SHOCK,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5FA8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -115,7 +115,7 @@ const struct SpriteTemplate gUnknown_83E5FC4 =
{
.tileTag = ANIM_TAG_SPARK_2,
.paletteTag = ANIM_TAG_SPARK_2,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -126,7 +126,7 @@ const struct SpriteTemplate gUnknown_83E5FDC =
{
.tileTag = ANIM_TAG_BLACK_BALL_2,
.paletteTag = ANIM_TAG_BLACK_BALL_2,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -148,7 +148,7 @@ const struct SpriteTemplate gUnknown_83E6008 =
{
.tileTag = ANIM_TAG_SPARK_2,
.paletteTag = ANIM_TAG_SPARK_2,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6004,
@@ -185,7 +185,7 @@ const struct SpriteTemplate gUnknown_83E6058 =
{
.tileTag = ANIM_TAG_SHOCK_3,
.paletteTag = ANIM_TAG_SHOCK_3,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gUnknown_83E6030,
.images = NULL,
.affineAnims = gUnknown_83E6054,
@@ -196,7 +196,7 @@ const struct SpriteTemplate gUnknown_83E6070 =
{
.tileTag = ANIM_TAG_SPARK_2,
.paletteTag = ANIM_TAG_SPARK_2,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6004,
@@ -207,7 +207,7 @@ const struct SpriteTemplate gElectricitySpriteTemplate =
{
.tileTag = ANIM_TAG_SPARK_2,
.paletteTag = ANIM_TAG_SPARK_2,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -218,7 +218,7 @@ static const struct SpriteTemplate gUnknown_83E60A0 =
{
.tileTag = ANIM_TAG_SPARK,
.paletteTag = ANIM_TAG_SPARK,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -229,7 +229,7 @@ const struct SpriteTemplate gUnknown_83E60B8 =
{
.tileTag = ANIM_TAG_SPARK_H,
.paletteTag = ANIM_TAG_SPARK_H,
- .oam = &gOamData_83AC9F8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -284,7 +284,7 @@ static const struct SpriteTemplate gUnknown_83E6120 =
{
.tileTag = ANIM_TAG_ELECTRIC_ORBS,
.paletteTag = ANIM_TAG_ELECTRIC_ORBS,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gUnknown_83E6118,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -332,7 +332,7 @@ const struct SpriteTemplate gUnknown_83E61D4 =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACB60,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E61C8,
@@ -357,7 +357,7 @@ const struct SpriteTemplate gUnknown_83E6204 =
{
.tileTag = ANIM_TAG_ELECTRICITY,
.paletteTag = ANIM_TAG_ELECTRICITY,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E6200,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -368,7 +368,7 @@ const struct SpriteTemplate gUnknown_83E621C =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACB60,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E61C8,
@@ -422,7 +422,7 @@ static const struct SpriteTemplate gUnknown_83E6278 =
{
.tileTag = ANIM_TAG_SPARK,
.paletteTag = ANIM_TAG_SPARK,
- .oam = &gOamData_83ACAC8,
+ .oam = &gOamData_AffineDouble_ObjNormal_8x16,
.anims = gUnknown_83E6254,
.images = NULL,
.affineAnims = gUnknown_83E6274,
@@ -433,7 +433,7 @@ const struct SpriteTemplate gUnknown_83E6290 =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACB60,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E61C8,
@@ -444,7 +444,7 @@ static const struct SpriteTemplate gUnknown_83E62A8 =
{
.tileTag = ANIM_TAG_SPARK,
.paletteTag = ANIM_TAG_SPARK,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
diff --git a/src/fighting.c b/src/fighting.c
index 496f752ef..7b826594d 100644
--- a/src/fighting.c
+++ b/src/fighting.c
@@ -39,7 +39,7 @@ const struct SpriteTemplate gUnknown_83E668C =
{
.tileTag = ANIM_TAG_HUMANOID_FOOT,
.paletteTag = ANIM_TAG_HUMANOID_FOOT,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -97,7 +97,7 @@ const struct SpriteTemplate gUnknown_83E66E0 =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -108,7 +108,7 @@ const struct SpriteTemplate gUnknown_83E66F8 =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -119,7 +119,7 @@ const struct SpriteTemplate gFistFootSpriteTemplate =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -130,7 +130,7 @@ const struct SpriteTemplate gUnknown_83E6728 =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -141,7 +141,7 @@ const struct SpriteTemplate gUnknown_83E6740 =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66D8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -152,7 +152,7 @@ const struct SpriteTemplate gUnknown_83E6758 =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66D0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -175,7 +175,7 @@ const struct SpriteTemplate gUnknown_83E678C =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83ACA98,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gUnknown_83E6788,
@@ -198,7 +198,7 @@ const struct SpriteTemplate gMegaPunchKickSpriteTemplate =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83ACA98,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gUnknown_83E67BC,
@@ -209,7 +209,7 @@ const struct SpriteTemplate gUnknown_83E67D8 =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66D0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -220,7 +220,7 @@ const struct SpriteTemplate gUnknown_83E67F0 =
{
.tileTag = ANIM_TAG_DUCK,
.paletteTag = ANIM_TAG_DUCK,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -231,7 +231,7 @@ const struct SpriteTemplate gUnknown_83E6808 =
{
.tileTag = ANIM_TAG_BLUE_LIGHT_WALL,
.paletteTag = ANIM_TAG_BLUE_LIGHT_WALL,
- .oam = &gOamData_83ACB00,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -242,7 +242,7 @@ const struct SpriteTemplate gUnknown_83E6820 =
{
.tileTag = ANIM_TAG_TORN_METAL,
.paletteTag = ANIM_TAG_TORN_METAL,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -267,7 +267,7 @@ const struct SpriteTemplate gUnknown_83E6864 =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACBC0,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6860,
@@ -278,7 +278,7 @@ const struct SpriteTemplate gUnknown_83E687C =
{
.tileTag = ANIM_TAG_FLAT_ROCK,
.paletteTag = ANIM_TAG_FLAT_ROCK,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -289,7 +289,7 @@ const struct SpriteTemplate gUnknown_83E6894 =
{
.tileTag = ANIM_TAG_METEOR,
.paletteTag = ANIM_TAG_METEOR,
- .oam = &gOamData_83AC9E0,
+ .oam = &gOamData_AffineOff_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -300,7 +300,7 @@ const struct SpriteTemplate gUnknown_83E68AC =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -342,7 +342,7 @@ const struct SpriteTemplate gUnknown_83E6900 =
{
.tileTag = ANIM_TAG_PURPLE_SCRATCH,
.paletteTag = ANIM_TAG_PURPLE_SCRATCH,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E68F4,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -381,7 +381,7 @@ const struct SpriteTemplate gUnknown_83E6948 =
{
.tileTag = ANIM_TAG_PURPLE_SWIPE,
.paletteTag = ANIM_TAG_PURPLE_SWIPE,
- .oam = &gOamData_83AC9E0,
+ .oam = &gOamData_AffineOff_ObjNormal_64x64,
.anims = gUnknown_83E693C,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -404,7 +404,7 @@ const struct SpriteTemplate gUnknown_83E697C =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
- .oam = &gOamData_83ACA98,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = gUnknown_83E66CC,
.images = NULL,
.affineAnims = gUnknown_83E6978,
diff --git a/src/fire.c b/src/fire.c
index 014413f5b..a5a2ee5f6 100644
--- a/src/fire.c
+++ b/src/fire.c
@@ -64,7 +64,7 @@ const struct SpriteTemplate gUnknown_83E5BE0 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5BD8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -75,7 +75,7 @@ const struct SpriteTemplate gUnknown_83E5BF8 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5BD8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -131,7 +131,7 @@ const struct SpriteTemplate gUnknown_83E5C70 =
{
.tileTag = ANIM_TAG_FIRE,
.paletteTag = ANIM_TAG_FIRE,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gUnknown_83E5C34,
.images = NULL,
.affineAnims = gUnknown_83E5C6C,
@@ -142,7 +142,7 @@ const struct SpriteTemplate gUnknown_83E5C88 =
{
.tileTag = ANIM_TAG_FIRE,
.paletteTag = ANIM_TAG_FIRE,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5C34,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -153,7 +153,7 @@ const struct SpriteTemplate gUnknown_83E5CA0 =
{
.tileTag = ANIM_TAG_FIRE_PLUME,
.paletteTag = ANIM_TAG_FIRE_PLUME,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5C50,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -164,7 +164,7 @@ const struct SpriteTemplate gUnknown_83E5CB8 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5C50,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -188,7 +188,7 @@ const struct SpriteTemplate gUnknown_83E5CE4 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5CE0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -211,7 +211,7 @@ const struct SpriteTemplate gUnknown_83E5D18 =
{
.tileTag = ANIM_TAG_SUNLIGHT,
.paletteTag = ANIM_TAG_SUNLIGHT,
- .oam = &gOamData_83ACB58,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E5D14,
@@ -237,7 +237,7 @@ const struct SpriteTemplate gEmberSpriteTemplate =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -248,7 +248,7 @@ const struct SpriteTemplate gEmberFlareSpriteTemplate =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5D48,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -259,7 +259,7 @@ const struct SpriteTemplate gUnknown_83E5D7C =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5D48,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -270,7 +270,7 @@ const struct SpriteTemplate gUnknown_83E5D94 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5D48,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -311,7 +311,7 @@ const struct SpriteTemplate gUnknown_83E5DE4 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5DB8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -322,7 +322,7 @@ const struct SpriteTemplate gUnknown_83E5DFC =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5D48,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -333,7 +333,7 @@ const struct SpriteTemplate gUnknown_83E5E14 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5D48,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -344,7 +344,7 @@ static const struct SpriteTemplate gUnknown_83E5E2C =
{
.tileTag = ANIM_TAG_WARM_ROCK,
.paletteTag = ANIM_TAG_WARM_ROCK,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -366,7 +366,7 @@ const struct SpriteTemplate gUnknown_83E5E60 =
{
.tileTag = ANIM_TAG_WARM_ROCK,
.paletteTag = ANIM_TAG_WARM_ROCK,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -412,7 +412,7 @@ const struct SpriteTemplate gUnknown_83E5EB4 =
{
.tileTag = ANIM_TAG_WISP_ORB,
.paletteTag = ANIM_TAG_WISP_ORB,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gUnknown_83E5EA4,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -437,7 +437,7 @@ const struct SpriteTemplate gUnknown_83E5EE4 =
{
.tileTag = ANIM_TAG_WISP_FIRE,
.paletteTag = ANIM_TAG_WISP_FIRE,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5EE0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
diff --git a/src/flying.c b/src/flying.c
index 59378c2f1..6d4a1eb56 100644
--- a/src/flying.c
+++ b/src/flying.c
@@ -39,7 +39,7 @@ const struct SpriteTemplate gUnknown_83E6AE8 =
{
.tileTag = ANIM_TAG_GUST,
.paletteTag = ANIM_TAG_GUST,
- .oam = &gOamData_83ACA20,
+ .oam = &gOamData_AffineOff_ObjNormal_32x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -62,7 +62,7 @@ const struct SpriteTemplate gUnknown_83E6B1C =
{
.tileTag = ANIM_TAG_GUST,
.paletteTag = ANIM_TAG_GUST,
- .oam = &gOamData_83ACA80,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6B18,
@@ -87,7 +87,7 @@ const struct SpriteTemplate gUnknown_83E6B4C =
{
.tileTag = ANIM_TAG_AIR_WAVE_2,
.paletteTag = ANIM_TAG_AIR_WAVE_2,
- .oam = &gOamData_83AC9F8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
.anims = gUnknown_83E6B48,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -130,7 +130,7 @@ const struct SpriteTemplate gUnknown_83E6BB8 =
{
.tileTag = ANIM_TAG_ROUND_SHADOW,
.paletteTag = ANIM_TAG_ROUND_SHADOW,
- .oam = &gOamData_83ACAA0,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6B8C,
@@ -141,7 +141,7 @@ const struct SpriteTemplate gUnknown_83E6BD0 =
{
.tileTag = ANIM_TAG_ROUND_SHADOW,
.paletteTag = ANIM_TAG_ROUND_SHADOW,
- .oam = &gOamData_83ACA40,
+ .oam = &gOamData_AffineNormal_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6BB0,
@@ -170,7 +170,7 @@ const struct SpriteTemplate gUnknown_83E6C00 =
{
.tileTag = ANIM_TAG_WHITE_FEATHER,
.paletteTag = ANIM_TAG_WHITE_FEATHER,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gUnknown_83E6BF8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -184,7 +184,7 @@ const struct SpriteTemplate gUnknown_83E6C38 =
{
.tileTag = ANIM_TAG_SMALL_BUBBLES,
.paletteTag = ANIM_TAG_SMALL_BUBBLES,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -195,7 +195,7 @@ const struct SpriteTemplate gUnknown_83E6C50 =
{
.tileTag = ANIM_TAG_WHITE_FEATHER,
.paletteTag = ANIM_TAG_WHITE_FEATHER,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gUnknown_83E6BF8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -221,7 +221,7 @@ const struct SpriteTemplate gUnknown_83E6C84 =
{
.tileTag = ANIM_TAG_WHIRLWIND_LINES,
.paletteTag = ANIM_TAG_WHIRLWIND_LINES,
- .oam = &gOamData_83AC9F8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
.anims = gUnknown_83E6C80,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -247,7 +247,7 @@ const struct SpriteTemplate gUnknown_83E6CD0 =
{
.tileTag = ANIM_TAG_ROUND_SHADOW,
.paletteTag = ANIM_TAG_ROUND_SHADOW,
- .oam = &gOamData_83ACAA0,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6CCC,
@@ -269,7 +269,7 @@ const struct SpriteTemplate gUnknown_83E6CFC =
{
.tileTag = ANIM_TAG_ROUND_SHADOW,
.paletteTag = ANIM_TAG_ROUND_SHADOW,
- .oam = &gOamData_83ACAA0,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6CF8,
@@ -294,7 +294,7 @@ const struct SpriteTemplate gUnknown_83E6D40 =
{
.tileTag = ANIM_TAG_ROUND_SHADOW,
.paletteTag = ANIM_TAG_ROUND_SHADOW,
- .oam = &gOamData_83ACAA0,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6D3C,
@@ -320,7 +320,7 @@ const struct SpriteTemplate gUnknown_83E6D7C =
{
.tileTag = ANIM_TAG_SPLASH,
.paletteTag = ANIM_TAG_SPLASH,
- .oam = &gOamData_83ACAA0,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -331,7 +331,7 @@ const struct SpriteTemplate gUnknown_83E6D94 =
{
.tileTag = ANIM_TAG_SWEAT_BEAD,
.paletteTag = ANIM_TAG_SWEAT_BEAD,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -342,7 +342,7 @@ const struct SpriteTemplate gUnknown_83E6DAC =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACB00,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -353,7 +353,7 @@ const struct SpriteTemplate gUnknown_83E6DB4 =
{
.tileTag = ANIM_TAG_BIRD,
.paletteTag = ANIM_TAG_BIRD,
- .oam = &gOamData_83ACAA0,
+ .oam = &gOamData_AffineDouble_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
diff --git a/src/ghost.c b/src/ghost.c
index 30430309e..793c9838c 100644
--- a/src/ghost.c
+++ b/src/ghost.c
@@ -63,7 +63,7 @@ const struct SpriteTemplate gUnknown_83E75C4 =
{
.tileTag = ANIM_TAG_YELLOW_BALL,
.paletteTag = ANIM_TAG_YELLOW_BALL,
- .oam = &gOamData_83ACA90,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E75C0,
@@ -74,7 +74,7 @@ const struct SpriteTemplate gUnknown_83E75DC =
{
.tileTag = ANIM_TAG_YELLOW_BALL,
.paletteTag = ANIM_TAG_YELLOW_BALL,
- .oam = &gOamData_83ACAF0,
+ .oam = &gOamData_AffineOff_ObjBlend_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -96,7 +96,7 @@ const struct SpriteTemplate gShadowBallSpriteTemplate =
{
.tileTag = ANIM_TAG_SHADOW_BALL,
.paletteTag = ANIM_TAG_SHADOW_BALL,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7604,
@@ -122,7 +122,7 @@ const struct SpriteTemplate gUnknown_83E763C =
{
.tileTag = ANIM_TAG_LICK,
.paletteTag = ANIM_TAG_LICK,
- .oam = &gOamData_83ACA18,
+ .oam = &gOamData_AffineOff_ObjNormal_16x32,
.anims = gUnknown_83E7638,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -146,7 +146,7 @@ const struct SpriteTemplate gUnknown_83E7668 =
{
.tileTag = ANIM_TAG_WHITE_SHADOW,
.paletteTag = ANIM_TAG_WHITE_SHADOW,
- .oam = &gOamData_83ACB20,
+ .oam = &gOamData_AffineOff_ObjBlend_64x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -157,7 +157,7 @@ const struct SpriteTemplate gUnknown_83E7680 =
{
.tileTag = ANIM_TAG_NAIL,
.paletteTag = ANIM_TAG_NAIL,
- .oam = &gOamData_83ACB18,
+ .oam = &gOamData_AffineOff_ObjBlend_32x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -168,7 +168,7 @@ const struct SpriteTemplate gUnknown_83E7698 =
{
.tileTag = ANIM_TAG_GHOSTLY_SPIRIT,
.paletteTag = ANIM_TAG_GHOSTLY_SPIRIT,
- .oam = &gOamData_83ACAF8,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -179,7 +179,7 @@ const struct SpriteTemplate gUnknown_83E76B0 =
{
.tileTag = ANIM_TAG_DEVIL,
.paletteTag = ANIM_TAG_DEVIL,
- .oam = &gOamData_83ACAF8,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -204,7 +204,7 @@ const struct SpriteTemplate gUnknown_83E76E0 =
{
.tileTag = ANIM_TAG_PURPLE_FLAME,
.paletteTag = ANIM_TAG_PURPLE_FLAME,
- .oam = &gOamData_83ACB38,
+ .oam = &gOamData_AffineOff_ObjBlend_16x32,
.anims = gUnknown_83E76DC,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -1319,13 +1319,13 @@ static void sub_80B6BE4(u8 taskId)
SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);
SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);
sub_80752C8(&animBgData, 2);
- AnimLoadCompressedBgGfx(animBgData.bgId, gFile_graphics_battle_anims_backgrounds_scary_face_sheet, animBgData.tilesOffset);
- LoadCompressedPalette(gFile_graphics_battle_anims_backgrounds_scary_face_palette, 16 * animBgData.paletteId, 0x20);
+ AnimLoadCompressedBgGfx(animBgData.bgId, gBattleAnim_ScaryFaceGfx, animBgData.tilesOffset);
+ LoadCompressedPalette(gBattleAnim_ScaryFacePal, 16 * animBgData.paletteId, 0x20);
break;
case 3:
sub_80752C8(&animBgData, 2);
gMonSpritesGfxPtr->field_17C = AllocZeroed(0x2000);
- LZDecompressWram(gFile_graphics_battle_anims_backgrounds_scary_face_player_tilemap, gMonSpritesGfxPtr->field_17C);
+ LZDecompressWram(gBattleAnimBgTilemap_ScaryFacePlayer, gMonSpritesGfxPtr->field_17C);
sub_80730C0(animBgData.paletteId, gMonSpritesGfxPtr->field_17C, 256, 0);
CopyToBgTilemapBufferRect_ChangePalette(animBgData.bgId, gMonSpritesGfxPtr->field_17C, 0, 0, 0x20, 0x20, 0x11);
CopyBgTilemapBufferToVram(2);
diff --git a/src/ground.c b/src/ground.c
index 7ab6b6e95..423671112 100644
--- a/src/ground.c
+++ b/src/ground.c
@@ -52,7 +52,7 @@ const struct SpriteTemplate gUnknown_83E7A28 =
{
.tileTag = ANIM_TAG_BONE,
.paletteTag = ANIM_TAG_BONE,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7A20,
@@ -63,7 +63,7 @@ const struct SpriteTemplate gUnknown_83E7A40 =
{
.tileTag = ANIM_TAG_BONE,
.paletteTag = ANIM_TAG_BONE,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7A24,
@@ -74,7 +74,7 @@ const struct SpriteTemplate gUnknown_83E7A58 =
{
.tileTag = ANIM_TAG_MUD_SAND,
.paletteTag = ANIM_TAG_MUD_SAND,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -96,7 +96,7 @@ const struct SpriteTemplate gUnknown_83E7A7C =
{
.tileTag = ANIM_TAG_MUD_SAND,
.paletteTag = ANIM_TAG_MUD_SAND,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gUnknown_83E7A78,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -107,7 +107,7 @@ const struct SpriteTemplate gUnknown_83E7A94 =
{
.tileTag = ANIM_TAG_MUD_SAND,
.paletteTag = ANIM_TAG_MUD_SAND,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -118,7 +118,7 @@ const struct SpriteTemplate gUnknown_83E7AAC =
{
.tileTag = ANIM_TAG_MUD_SAND,
.paletteTag = ANIM_TAG_MUD_SAND,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -129,7 +129,7 @@ const struct SpriteTemplate gUnknown_83E7AC4 =
{
.tileTag = ANIM_TAG_DIRT_MOUND,
.paletteTag = ANIM_TAG_DIRT_MOUND,
- .oam = &gOamData_83AC9F8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
diff --git a/src/ice.c b/src/ice.c
index 79966e597..4ed6e0ece 100644
--- a/src/ice.c
+++ b/src/ice.c
@@ -66,7 +66,7 @@ static const struct SpriteTemplate gUnknown_83E62D0 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -155,7 +155,7 @@ const struct SpriteTemplate gUnknown_83E6348 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83ACBE8,
+ .oam = &gOamData_AffineDouble_ObjBlend_8x16,
.anims = gUnknown_83E6320,
.images = NULL,
.affineAnims = gUnknown_83E6344,
@@ -166,7 +166,7 @@ const struct SpriteTemplate gUnknown_83E6360 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83ACAE8,
+ .oam = &gOamData_AffineOff_ObjBlend_8x8,
.anims = gUnknown_83E6324,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -188,7 +188,7 @@ const struct SpriteTemplate gUnknown_83E638C =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83ACB88,
+ .oam = &gOamData_AffineNormal_ObjBlend_8x16,
.anims = gUnknown_83E6320,
.images = NULL,
.affineAnims = gUnknown_83E6388,
@@ -199,7 +199,7 @@ const struct SpriteTemplate gUnknown_83E63A4 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83ACAE8,
+ .oam = &gOamData_AffineOff_ObjBlend_8x8,
.anims = gUnknown_83E6324,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -223,7 +223,7 @@ const struct SpriteTemplate gUnknown_83E63E0 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83ACB88,
+ .oam = &gOamData_AffineNormal_ObjBlend_8x16,
.anims = gUnknown_83E6320,
.images = NULL,
.affineAnims = gUnknown_83E63DC,
@@ -234,7 +234,7 @@ const struct SpriteTemplate gUnknown_83E63F8 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83ACB48,
+ .oam = &gOamData_AffineNormal_ObjBlend_8x8,
.anims = gUnknown_83E6324,
.images = NULL,
.affineAnims = gUnknown_83E63DC,
@@ -245,7 +245,7 @@ const struct SpriteTemplate gUnknown_83E6410 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gUnknown_83E6328,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -256,7 +256,7 @@ const struct SpriteTemplate gUnknown_83E6428 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gUnknown_83E632C,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -267,7 +267,7 @@ const struct SpriteTemplate gUnknown_83E6440 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gUnknown_83E6328,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -295,7 +295,7 @@ const struct SpriteTemplate gUnknown_83E647C =
{
.tileTag = ANIM_TAG_ICE_SPIKES,
.paletteTag = ANIM_TAG_ICE_SPIKES,
- .oam = &gOamData_83ACB28,
+ .oam = &gOamData_AffineOff_ObjBlend_8x16,
.anims = gUnknown_83E6478,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -318,7 +318,7 @@ const struct SpriteTemplate gUnknown_83E64A4 =
{
.tileTag = ANIM_TAG_MIST_CLOUD,
.paletteTag = ANIM_TAG_MIST_CLOUD,
- .oam = &gOamData_83ACB18,
+ .oam = &gOamData_AffineOff_ObjBlend_32x16,
.anims = gUnknown_83E64A0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -329,7 +329,7 @@ const struct SpriteTemplate gUnknown_83E64BC =
{
.tileTag = ANIM_TAG_PURPLE_GAS_CLOUD,
.paletteTag = ANIM_TAG_PURPLE_GAS_CLOUD,
- .oam = &gOamData_83ACB18,
+ .oam = &gOamData_AffineOff_ObjBlend_32x16,
.anims = gUnknown_83E64A0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -345,7 +345,7 @@ const struct SpriteTemplate gUnknown_83E64E8 =
{
.tileTag = ANIM_TAG_SMALL_BUBBLES,
.paletteTag = ANIM_TAG_SMALL_BUBBLES,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -361,7 +361,7 @@ const struct SpriteTemplate gUnknown_83E6514 =
{
.tileTag = ANIM_TAG_PURPLE_GAS_CLOUD,
.paletteTag = ANIM_TAG_PURPLE_GAS_CLOUD,
- .oam = &gOamData_83ACB18,
+ .oam = &gOamData_AffineOff_ObjBlend_32x16,
.anims = gUnknown_83E64A0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -422,7 +422,7 @@ static const struct SpriteTemplate gUnknown_83E65A4 =
{
.tileTag = ANIM_TAG_HAIL,
.paletteTag = ANIM_TAG_HAIL,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6594,
@@ -433,7 +433,7 @@ const struct SpriteTemplate gUnknown_83E65BC =
{
.tileTag = ANIM_TAG_HAIL,
.paletteTag = ANIM_TAG_HAIL,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E65A0,
@@ -504,7 +504,7 @@ const struct SpriteTemplate gUnknown_83E665C =
{
.tileTag = ANIM_TAG_ICE_CHUNK,
.paletteTag = ANIM_TAG_ICE_CHUNK,
- .oam = &gOamData_83ACA98,
+ .oam = &gOamData_AffineDouble_ObjNormal_32x32,
.anims = gUnknown_83E65F0,
.images = NULL,
.affineAnims = gUnknown_83E6648,
@@ -515,7 +515,7 @@ const struct SpriteTemplate gUnknown_83E6674 =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
.paletteTag = ANIM_TAG_ICE_CRYSTALS,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gUnknown_83E6324,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c
index 44a40c6ec..3de09ab44 100644
--- a/src/mevent_8145654.c
+++ b/src/mevent_8145654.c
@@ -13,6 +13,7 @@
#include "string_util.h"
#include "link_rfu.h"
#include "mevent.h"
+#include "battle_anim.h"
struct UnkStruct_8467FB8
{
@@ -59,8 +60,6 @@ void sub_8145D18(u8 whichWindow);
void sub_8146060(void);
void sub_81461D8(void);
-extern const struct OamData gOamData_83AC9F8;
-
const u8 gUnknown_8467068[][3] = {
{0, 2, 3},
{0, 1, 2}
@@ -114,7 +113,7 @@ const struct SpritePalette gUnknown_8467F60[] = {
{gUnknown_8467ED4, 0x8000}
};
const struct SpriteTemplate gUnknown_8467FA0 = {
- 0x8000, 0x8000, &gOamData_83AC9F8, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ 0x8000, 0x8000, &gOamData_AffineOff_ObjNormal_32x16, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
};
const struct UnkStruct_8467FB8 gUnknown_8467FB8[8] = {
{1, 0, 0, 0, gUnknown_846718C, gUnknown_8467288, gUnknown_846708C},
diff --git a/src/normal.c b/src/normal.c
index 4d86b55a6..4e045340f 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -63,7 +63,7 @@ const struct SpriteTemplate gConfusionDuckSpriteTemplate =
{
.tileTag = ANIM_TAG_DUCK,
.paletteTag = ANIM_TAG_DUCK,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gUnknown_83E7B04,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -111,7 +111,7 @@ const struct SpriteTemplate gUnknown_83E7B70 =
{
.tileTag = ANIM_TAG_SPARKLE_4,
.paletteTag = ANIM_TAG_SPARKLE_4,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E7B6C,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -168,7 +168,7 @@ const struct SpriteTemplate gBasicHitSplatSpriteTemplate =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
- .oam = &gOamData_83ACB58,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7BF8,
@@ -179,7 +179,7 @@ const struct SpriteTemplate gUnknown_83E7C20 =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
- .oam = &gOamData_83ACB58,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7BF8,
@@ -190,7 +190,7 @@ const struct SpriteTemplate gUnknown_83E7C38 =
{
.tileTag = ANIM_TAG_WATER_IMPACT,
.paletteTag = ANIM_TAG_WATER_IMPACT,
- .oam = &gOamData_83ACB58,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7BF8,
@@ -201,7 +201,7 @@ const struct SpriteTemplate gUnknown_83E7C50 =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
- .oam = &gOamData_83ACB58,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7BF8,
@@ -212,7 +212,7 @@ const struct SpriteTemplate gUnknown_83E7C68 =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
- .oam = &gOamData_83ACB58,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7BF8,
@@ -223,7 +223,7 @@ const struct SpriteTemplate gUnknown_83E7C80 =
{
.tileTag = ANIM_TAG_CROSS_IMPACT,
.paletteTag = ANIM_TAG_CROSS_IMPACT,
- .oam = &gOamData_83ACAF8,
+ .oam = &gOamData_AffineOff_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -234,7 +234,7 @@ const struct SpriteTemplate gUnknown_83E7C98 =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7BF8,
@@ -245,7 +245,7 @@ const struct SpriteTemplate gUnknown_83E7CB0 =
{
.tileTag = ANIM_TAG_IMPACT,
.paletteTag = ANIM_TAG_IMPACT,
- .oam = &gOamData_83ACB58,
+ .oam = &gOamData_AffineNormal_ObjBlend_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7BF8,
diff --git a/src/oak_speech.c b/src/oak_speech.c
index 3f946e13f..79f8b18c7 100644
--- a/src/oak_speech.c
+++ b/src/oak_speech.c
@@ -328,12 +328,12 @@ static const union AnimCmd *const sGrassPlatformAnims3[] = {
sGrassPlatformAnim3
};
-extern const struct OamData gOamData_83ACAF8;
+extern const struct OamData gOamData_AffineOff_ObjBlend_32x32;
static const struct SpriteTemplate sOakSpeech_GrassPlatformSpriteTemplates[3] = {
- { 0x1000, 0x1000, &gOamData_83ACAF8, sGrassPlatformAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
- { 0x1000, 0x1000, &gOamData_83ACAF8, sGrassPlatformAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
- { 0x1000, 0x1000, &gOamData_83ACAF8, sGrassPlatformAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
+ { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
+ { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
+ { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
};
static const union AnimCmd sPikaAnim1[] = {
@@ -389,14 +389,14 @@ static const union AnimCmd *const sPikaAnims3[] = {
sPikaAnim3
};
-extern const struct OamData gOamData_83AC9D8;
-extern const struct OamData gOamData_83AC9F8;
-extern const struct OamData gOamData_83AC9E8;
+extern const struct OamData gOamData_AffineOff_ObjNormal_32x32;
+extern const struct OamData gOamData_AffineOff_ObjNormal_32x16;
+extern const struct OamData gOamData_AffineOff_ObjNormal_16x8;
static const struct SpriteTemplate sOakSpeech_PikaSpriteTemplates[3] = {
- { 0x1001, 0x1001, &gOamData_83AC9D8, sPikaAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
- { 0x1002, 0x1001, &gOamData_83AC9F8, sPikaAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
- { 0x1003, 0x1001, &gOamData_83AC9E8, sPikaAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }
+ { 0x1001, 0x1001, &gOamData_AffineOff_ObjNormal_32x32, sPikaAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
+ { 0x1002, 0x1001, &gOamData_AffineOff_ObjNormal_32x16, sPikaAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy },
+ { 0x1003, 0x1001, &gOamData_AffineOff_ObjNormal_16x8, sPikaAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }
};
static const u8 *const sHelpDocsPtrs[] = {
diff --git a/src/poison.c b/src/poison.c
index 7a0788c29..af7f8ee86 100644
--- a/src/poison.c
+++ b/src/poison.c
@@ -30,7 +30,7 @@ const struct SpriteTemplate gUnknown_83E69AC =
{
.tileTag = ANIM_TAG_TOXIC_BUBBLE,
.paletteTag = ANIM_TAG_TOXIC_BUBBLE,
- .oam = &gOamData_83ACA18,
+ .oam = &gOamData_AffineOff_ObjNormal_16x32,
.anims = gUnknown_83E69A8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -98,7 +98,7 @@ const struct SpriteTemplate gUnknown_83E6A20 =
{
.tileTag = ANIM_TAG_POISON_BUBBLE,
.paletteTag = ANIM_TAG_POISON_BUBBLE,
- .oam = &gOamData_83ACA90,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
.anims = gUnknown_83E69DC,
.images = NULL,
.affineAnims = gUnknown_83E6A18,
@@ -109,7 +109,7 @@ const struct SpriteTemplate gUnknown_83E6A38 =
{
.tileTag = ANIM_TAG_POISON_BUBBLE,
.paletteTag = ANIM_TAG_POISON_BUBBLE,
- .oam = &gOamData_83ACA90,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
.anims = gUnknown_83E69DC,
.images = NULL,
.affineAnims = gUnknown_83E6A18,
@@ -120,7 +120,7 @@ const struct SpriteTemplate gUnknown_83E6A50 =
{
.tileTag = ANIM_TAG_POISON_BUBBLE,
.paletteTag = ANIM_TAG_POISON_BUBBLE,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gUnknown_83E69E4,
.images = NULL,
.affineAnims = gUnknown_83E6A1C,
@@ -143,7 +143,7 @@ const struct SpriteTemplate gUnknown_83E6A84 =
{
.tileTag = ANIM_TAG_POISON_BUBBLE,
.paletteTag = ANIM_TAG_POISON_BUBBLE,
- .oam = &gOamData_83ACA90,
+ .oam = &gOamData_AffineDouble_ObjNormal_16x16,
.anims = gUnknown_83E69E0,
.images = NULL,
.affineAnims = gUnknown_83E6A80,
@@ -166,7 +166,7 @@ const struct SpriteTemplate gPoisonBubbleSpriteTemplate =
{
.tileTag = ANIM_TAG_POISON_BUBBLE,
.paletteTag = ANIM_TAG_POISON_BUBBLE,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gUnknown_83E69DC,
.images = NULL,
.affineAnims = gUnknown_83E6AB4,
@@ -177,7 +177,7 @@ const struct SpriteTemplate gWaterBubbleSpriteTemplate =
{
.tileTag = ANIM_TAG_SMALL_BUBBLES,
.paletteTag = ANIM_TAG_SMALL_BUBBLES,
- .oam = &gOamData_83ACB50,
+ .oam = &gOamData_AffineNormal_ObjBlend_16x16,
.anims = gUnknown_83E5A78,
.images = NULL,
.affineAnims = gUnknown_83E6AB4,
diff --git a/src/psychic.c b/src/psychic.c
index bbb6c3ed5..722ea014f 100644
--- a/src/psychic.c
+++ b/src/psychic.c
@@ -43,7 +43,7 @@ const struct SpriteTemplate gUnknown_83E6DF8 =
{
.tileTag = ANIM_TAG_SPIRAL,
.paletteTag = ANIM_TAG_SPIRAL,
- .oam = &gOamData_83ACB60,
+ .oam = &gOamData_AffineNormal_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E6DF4,
@@ -54,7 +54,7 @@ const struct SpriteTemplate gUnknown_83E6E10 =
{
.tileTag = ANIM_TAG_GREEN_LIGHT_WALL,
.paletteTag = ANIM_TAG_GREEN_LIGHT_WALL,
- .oam = &gOamData_83ACB00,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -65,7 +65,7 @@ const struct SpriteTemplate gUnknown_83E6E28 =
{
.tileTag = ANIM_TAG_BLUE_LIGHT_WALL,
.paletteTag = ANIM_TAG_BLUE_LIGHT_WALL,
- .oam = &gOamData_83ACB00,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -76,7 +76,7 @@ const struct SpriteTemplate gUnknown_83E6E40 =
{
.tileTag = ANIM_TAG_RED_LIGHT_WALL,
.paletteTag = ANIM_TAG_RED_LIGHT_WALL,
- .oam = &gOamData_83ACB00,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -87,7 +87,7 @@ const struct SpriteTemplate gUnknown_83E6E58 =
{
.tileTag = ANIM_TAG_GRAY_LIGHT_WALL,
.paletteTag = ANIM_TAG_GRAY_LIGHT_WALL,
- .oam = &gOamData_83ACB00,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -98,7 +98,7 @@ const struct SpriteTemplate gUnknown_83E6E70 =
{
.tileTag = ANIM_TAG_ORANGE_LIGHT_WALL,
.paletteTag = ANIM_TAG_ORANGE_LIGHT_WALL,
- .oam = &gOamData_83ACB00,
+ .oam = &gOamData_AffineOff_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -124,7 +124,7 @@ const struct SpriteTemplate gUnknown_83E6EA4 =
{
.tileTag = ANIM_TAG_SPARKLE_4,
.paletteTag = ANIM_TAG_SPARKLE_4,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E6EA0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -149,7 +149,7 @@ const struct SpriteTemplate gUnknown_83E6ED4 =
{
.tileTag = ANIM_TAG_SPARKLE_3,
.paletteTag = ANIM_TAG_SPARKLE_3,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gUnknown_83E6ED0,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -160,7 +160,7 @@ const struct SpriteTemplate gUnknown_83E6EEC =
{
.tileTag = ANIM_TAG_GOLD_RING,
.paletteTag = ANIM_TAG_GOLD_RING,
- .oam = &gOamData_83ACA18,
+ .oam = &gOamData_AffineOff_ObjNormal_16x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -217,7 +217,7 @@ const struct SpriteTemplate gUnknown_83E6F8C =
{
.tileTag = ANIM_TAG_BENT_SPOON,
.paletteTag = ANIM_TAG_BENT_SPOON,
- .oam = &gOamData_83ACA18,
+ .oam = &gOamData_AffineOff_ObjNormal_16x32,
.anims = gUnknown_83E6F84,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -259,7 +259,7 @@ const struct SpriteTemplate gUnknown_83E6FF4 =
{
.tileTag = ANIM_TAG_AMNESIA,
.paletteTag = ANIM_TAG_AMNESIA,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E6FC4,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -285,7 +285,7 @@ static const struct SpriteTemplate gUnknown_83E7044 =
{
.tileTag = ANIM_TAG_HOLLOW_ORB,
.paletteTag = ANIM_TAG_HOLLOW_ORB,
- .oam = &gOamData_83ACAF0,
+ .oam = &gOamData_AffineOff_ObjBlend_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -296,7 +296,7 @@ const struct SpriteTemplate gUnknown_83E705C =
{
.tileTag = 0x280A,
.paletteTag = 0x280A,
- .oam = &gOamData_83AC9E0,
+ .oam = &gOamData_AffineOff_ObjNormal_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -349,7 +349,7 @@ static const struct SpriteTemplate gUnknown_83E7114 =
{
.tileTag = ANIM_TAG_BLUEGREEN_ORB,
.paletteTag = ANIM_TAG_BLUEGREEN_ORB,
- .oam = &gOamData_83ACA30,
+ .oam = &gOamData_AffineNormal_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7104,
@@ -372,7 +372,7 @@ const struct SpriteTemplate gUnknown_83E7148 =
{
.tileTag = ANIM_TAG_WHITE_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_WHITE_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACBC0,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E7144,
@@ -410,7 +410,7 @@ const struct SpriteTemplate gUnknown_83E71D0 =
{
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
- .oam = &gOamData_83ACBC0,
+ .oam = &gOamData_AffineDouble_ObjBlend_64x64,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_83E71C8,
diff --git a/src/rock.c b/src/rock.c
index c4b668941..082f3b655 100644
--- a/src/rock.c
+++ b/src/rock.c
@@ -55,7 +55,7 @@ const struct SpriteTemplate gUnknown_83E73B4 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E73A8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -66,7 +66,7 @@ const struct SpriteTemplate gUnknown_83E73CC =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E73A8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -77,7 +77,7 @@ const struct SpriteTemplate gUnknown_83E73E4 =
{
.tileTag = ANIM_TAG_MUD_SAND,
.paletteTag = ANIM_TAG_MUD_SAND,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -101,7 +101,7 @@ const struct SpriteTemplate gUnknown_83E7420 =
{
.tileTag = ANIM_TAG_WATER_ORB,
.paletteTag = ANIM_TAG_WATER_ORB,
- .oam = &gOamData_83ACB50,
+ .oam = &gOamData_AffineNormal_ObjBlend_16x16,
.anims = gUnknown_83E5958,
.images = NULL,
.affineAnims = gUnknown_83E741C,
@@ -112,7 +112,7 @@ const struct SpriteTemplate gUnknown_83E7438 =
{
.tileTag = ANIM_TAG_SMALL_EMBER,
.paletteTag = ANIM_TAG_SMALL_EMBER,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E5D48,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -123,7 +123,7 @@ const struct SpriteTemplate gUnknown_83E7450 =
{
.tileTag = ANIM_TAG_FLYING_DIRT,
.paletteTag = ANIM_TAG_FLYING_DIRT,
- .oam = &gOamData_83AC9F8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -213,7 +213,7 @@ const struct SpriteTemplate gUnknown_83E74C0 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E74A8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -224,7 +224,7 @@ const struct SpriteTemplate gUnknown_83E74D8 =
{
.tileTag = ANIM_TAG_MUD_SAND,
.paletteTag = ANIM_TAG_MUD_SAND,
- .oam = &gOamData_83AC9C8,
+ .oam = &gOamData_AffineOff_ObjNormal_8x8,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -235,7 +235,7 @@ const struct SpriteTemplate gUnknown_83E74F0 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -246,7 +246,7 @@ const struct SpriteTemplate gUnknown_83E7508 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E74A8,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
@@ -275,7 +275,7 @@ const struct SpriteTemplate gUnknown_83E7548 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gUnknown_83E74A8,
.images = NULL,
.affineAnims = gUnknown_83E7540,
@@ -286,7 +286,7 @@ const struct SpriteTemplate gUnknown_83E7560 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gUnknown_83E74A8,
.images = NULL,
.affineAnims = gUnknown_83E7540,
@@ -297,7 +297,7 @@ const struct SpriteTemplate gUnknown_83E7578 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83AC9D8,
+ .oam = &gOamData_AffineOff_ObjNormal_32x32,
.anims = gUnknown_83E74B8,
.images = NULL,
.affineAnims = gUnknown_83E7540,
@@ -308,7 +308,7 @@ const struct SpriteTemplate gUnknown_83E7590 =
{
.tileTag = ANIM_TAG_ROCKS,
.paletteTag = ANIM_TAG_ROCKS,
- .oam = &gOamData_83ACA38,
+ .oam = &gOamData_AffineNormal_ObjNormal_32x32,
.anims = gUnknown_83E74B0,
.images = NULL,
.affineAnims = gUnknown_83E7540,
@@ -583,8 +583,8 @@ void sub_80B4BD0(u8 taskId)
task->data[5] = ((var3 - var1) * 8) / task->data[8];
task->data[6] = 0;
task->data[7] = 0;
- pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
- pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
+ pan1 = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
+ pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
task->data[13] = pan1;
task->data[14] = (pan2 - pan1) / task->data[8];
task->data[1] = var4;
diff --git a/src/text.c b/src/text.c
index b61713ee2..93a35a07d 100644
--- a/src/text.c
+++ b/src/text.c
@@ -15,7 +15,7 @@
#include "constants/songs.h"
extern u8 gGlyphInfo[0x90];
-extern const struct OamData gOamData_83AC9D0;
+extern const struct OamData gOamData_AffineOff_ObjNormal_16x16;
static void DecompressGlyphFont3(u16 glyphId, bool32 isJapanese);
static void DecompressGlyphFont4(u16 glyphId, bool32 isJapanese);
@@ -59,7 +59,7 @@ const struct SpriteTemplate gUnknown_81EA6B4 =
{
.tileTag = 0x8000,
.paletteTag = 0x8000,
- .oam = &gOamData_83AC9D0,
+ .oam = &gOamData_AffineOff_ObjNormal_16x16,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,