summaryrefslogtreecommitdiff
path: root/src/battle_anim.c
diff options
context:
space:
mode:
authorJaceCearK1 <JaceCearK1@users.noreply.github.com>2017-07-01 21:04:18 +0200
committerGitHub <noreply@github.com>2017-07-01 21:04:18 +0200
commit0dd804a99e5455a0eac8ff6ed87d9de16c7380b7 (patch)
tree7b3567978b63ee6548a7b945e075ea8ba37bef51 /src/battle_anim.c
parentf1344efd2aff92292f58f7323bd9297a38fe9b02 (diff)
parent8d82578d3a101b06f9d2ced31738021007c4e533 (diff)
Merge pull request #1 from pret/master
Update fork to match main fork.
Diffstat (limited to 'src/battle_anim.c')
-rw-r--r--src/battle_anim.c2268
1 files changed, 2268 insertions, 0 deletions
diff --git a/src/battle_anim.c b/src/battle_anim.c
new file mode 100644
index 000000000..55ede1788
--- /dev/null
+++ b/src/battle_anim.c
@@ -0,0 +1,2268 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "battle.h"
+#include "battle_anim_80CA710.h"
+#include "battle_interface.h"
+#include "contest.h"
+#include "decompress.h"
+#include "m4a.h"
+#include "main.h"
+#include "palette.h"
+#include "rom_8077ABC.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+
+// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index.
+#define GET_TRUE_SPRITE_INDEX(i) (i - 10000)
+
+extern u8 unk_2000000[];
+extern u16 gBattlePartyID[4];
+extern u8 gObjectBankIDs[];
+extern u8 gBankAttacker;
+extern u8 gBankTarget;
+EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL;
+EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL;
+EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL;
+EWRAM_DATA s8 gAnimFramesToWait = 0;
+EWRAM_DATA u8 gAnimScriptActive = FALSE;
+EWRAM_DATA u8 gAnimVisualTaskCount = 0;
+EWRAM_DATA u8 gAnimSoundTaskCount = 0;
+EWRAM_DATA u32 gDisableStructMoveAnim = 0;
+EWRAM_DATA u32 gMoveDmgMoveAnim = 0;
+EWRAM_DATA u16 gMovePowerMoveAnim = 0;
+EWRAM_DATA u8 gHappinessMoveAnim = 0;
+EWRAM_DATA u16 gWeatherMoveAnim = 0;
+EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0};
+EWRAM_DATA u8 gUnknown_0202F7C4 = 0;
+EWRAM_DATA u8 gUnknown_0202F7C5 = 0;
+EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused.
+EWRAM_DATA u8 gBattleAnimPlayerMonIndex = 0;
+EWRAM_DATA u8 gBattleAnimEnemyMonIndex = 0;
+EWRAM_DATA u16 gUnknown_0202F7CA[4] = {0};
+EWRAM_DATA u8 gUnknown_0202F7D2 = 0;
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_03004200;
+extern u16 gUnknown_03004240;
+extern u16 gUnknown_03004244;
+extern u16 gUnknown_03004280;
+extern u16 gUnknown_03004288;
+extern u16 gUnknown_030042C0;
+extern u16 gUnknown_030042C4;
+extern u16 gSoundAnimFramesToWait;
+extern u16 gAnimSpriteIndexArray[8];
+extern s16 gBattleAnimArgs[8];
+extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlay_SE1;
+extern struct MusicPlayerInfo gMPlay_SE2;
+
+extern const u16 gUnknown_081C7160[];
+extern const u8 *const gBattleAnims_Moves[];
+extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
+extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
+extern const struct BattleAnimBackground gBattleAnimBackgroundTable[];
+
+static void RunAnimScriptCommand(void);
+static void ScriptCmd_loadsprite(void);
+static void ScriptCmd_unloadsprite(void);
+static void ScriptCmd_sprite(void);
+static void ScriptCmd_createtask(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 sub_8076380(void);
+static void task_pA_ma0A_obj_to_bg_pal(u8);
+static void ScriptCmd_clearmonbg(void);
+static void sub_807672C(u8);
+static void ScriptCmd_monbg_22(void);
+static void ScriptCmd_clearmonbg_23(void);
+static void sub_80769A4(u8);
+static void ScriptCmd_setalpha(void);
+static void ScriptCmd_setbldcnt(void);
+static void ScriptCmd_blendoff(void);
+static void ScriptCmd_call(void);
+static void ScriptCmd_return(void);
+static void ScriptCmd_setvar(void);
+static void ScriptCmd_ifelse(void);
+static void ScriptCmd_jumpif(void);
+static void ScriptCmd_jump(void);
+static void ScriptCmd_fadetobg(void);
+static void ScriptCmd_fadetobg_25(void);
+static void task_p5_load_battle_screen_elements(u8);
+static void sub_8076DB8(u16);
+static void dp01t_11_3_message_for_player_only(void);
+static void ScriptCmd_restorebg(void);
+static void ScriptCmd_waitbgfadeout(void);
+static void ScriptCmd_waitbgfadein(void);
+static void ScriptCmd_changebg(void);
+static void ScriptCmd_panse_19(void);
+static void ScriptCmd_setpan(void);
+static void ScriptCmd_panse_1B(void);
+static void c3_08073CEC(u8);
+static void ScriptCmd_panse_26(void);
+static void ScriptCmd_panse_27(void);
+static void ScriptCmd_panse_1C(void);
+static void sub_80774FC(u8);
+static void ScriptCmd_panse_1D(void);
+static void sub_80775CC(u8);
+static void ScriptCmd_createtask_1F(void);
+static void ScriptCmd_waitsound(void);
+static void ScriptCmd_jumpvareq(void);
+static void ScriptCmd_jumpunkcond(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);
+
+static void (*const sScriptCmdTable[])(void) = {
+ ScriptCmd_loadsprite,
+ ScriptCmd_unloadsprite,
+ ScriptCmd_sprite,
+ ScriptCmd_createtask,
+ 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_setvar,
+ ScriptCmd_ifelse,
+ ScriptCmd_jumpif,
+ ScriptCmd_jump,
+ ScriptCmd_fadetobg,
+ ScriptCmd_restorebg,
+ ScriptCmd_waitbgfadeout,
+ ScriptCmd_waitbgfadein,
+ ScriptCmd_changebg,
+ ScriptCmd_panse_19,
+ ScriptCmd_setpan,
+ ScriptCmd_panse_1B,
+ ScriptCmd_panse_1C,
+ ScriptCmd_panse_1D,
+ ScriptCmd_setbldcnt,
+ ScriptCmd_createtask_1F,
+ ScriptCmd_waitsound,
+ ScriptCmd_jumpvareq,
+ ScriptCmd_monbg_22,
+ ScriptCmd_clearmonbg_23,
+ ScriptCmd_jumpunkcond,
+ ScriptCmd_fadetobg_25,
+ 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,
+};
+
+void battle_anim_clear_some_data(void)
+{
+ s32 i;
+
+ gAnimFramesToWait = 0;
+ gAnimScriptActive = FALSE;
+ gAnimVisualTaskCount = 0;
+ gAnimSoundTaskCount = 0;
+ gDisableStructMoveAnim = 0;
+ gMoveDmgMoveAnim = 0;
+ gMovePowerMoveAnim = 0;
+ gHappinessMoveAnim = 0;
+
+ // clear index array.
+ for (i = 0; i < 8; i++)
+ gAnimSpriteIndexArray[i] |= 0xFFFF;
+
+ // clear anim args.
+ for (i = 0; i < 8; i++)
+ gBattleAnimArgs[i] = 0;
+
+ gMonAnimTaskIdArray[0] = 0xFF;
+ gMonAnimTaskIdArray[1] = 0xFF;
+ gUnknown_0202F7C4 = 0;
+ gUnknown_0202F7C5 = 0;
+ gAnimMoveIndex = 0;
+ gBattleAnimPlayerMonIndex = 0;
+ gBattleAnimEnemyMonIndex = 0;
+ gUnknown_0202F7D2 = 0;
+}
+
+void ExecuteMoveAnim(u16 move)
+{
+ gBattleAnimPlayerMonIndex = gBankAttacker;
+ gBattleAnimEnemyMonIndex = gBankTarget;
+ DoMoveAnim(gBattleAnims_Moves, move, 1);
+}
+
+void DoMoveAnim(const u8 *const moveAnims[], u16 move, u8 c)
+{
+ s32 i;
+
+ if (IsContest() == 0)
+ {
+ sub_8079E24();
+ sub_8043EB4(0);
+ for (i = 0; i < 4; i++)
+ {
+ if (GetBankSide(i) != 0)
+ gUnknown_0202F7CA[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES);
+ else
+ gUnknown_0202F7CA[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ gUnknown_0202F7CA[i] = EWRAM_19348;
+ }
+
+ if (c == 0)
+ gAnimMoveIndex = 0;
+ else
+ gAnimMoveIndex = move;
+
+ for (i = 0; i < 8; i++)
+ gBattleAnimArgs[i] = 0;
+
+ gMonAnimTaskIdArray[0] = 0xFF;
+ gMonAnimTaskIdArray[1] = 0xFF;
+ gBattleAnimScriptPtr = moveAnims[move];
+ gAnimScriptActive = TRUE;
+ gAnimFramesToWait = 0;
+ gAnimScriptCallback = RunAnimScriptCommand;
+
+ for (i = 0; i < 8; i++)
+ gAnimSpriteIndexArray[i] |= 0xFFFF;
+
+ if (c != 0)
+ {
+ for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++)
+ {
+ if (move == gUnknown_081C7160[i])
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
+ break;
+ }
+ }
+ }
+
+ gUnknown_030042C4 = 0;
+ gUnknown_03004240 = 0;
+ gUnknown_03004200 = 0;
+ gUnknown_03004244 = 0;
+}
+
+void move_anim_8072740(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 < 8; i++)
+ {
+ if (gAnimSpriteIndexArray[i] == 0xFFFF)
+ {
+ gAnimSpriteIndexArray[i] = index;
+ return;
+ }
+ }
+}
+
+static void ClearSpriteIndex(u16 index)
+{
+ s32 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (gAnimSpriteIndexArray[i] == index)
+ {
+ gAnimSpriteIndexArray[i] |= 0xFFFF;
+ return;
+ }
+ }
+}
+
+static void WaitAnimFrameCount(void)
+{
+ if (gAnimFramesToWait <= 0)
+ {
+ gAnimScriptCallback = RunAnimScriptCommand;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait--;
+ }
+}
+
+static void RunAnimScriptCommand(void)
+{
+ do
+ {
+ sScriptCmdTable[SCRIPT_READ_8(gBattleAnimScriptPtr)]();
+ } while (gAnimFramesToWait == 0 && gAnimScriptActive != FALSE);
+}
+
+static void ScriptCmd_loadsprite(void)
+{
+ u16 index;
+
+ gBattleAnimScriptPtr++;
+ index = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
+ LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
+ gBattleAnimScriptPtr += 2;
+ AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+ gAnimFramesToWait = 1;
+ gAnimScriptCallback = WaitAnimFrameCount;
+}
+
+static void ScriptCmd_unloadsprite(void)
+{
+ u16 index;
+
+ gBattleAnimScriptPtr++;
+ index = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
+ gBattleAnimScriptPtr += 2;
+ ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+}
+
+#ifdef NONMATCHING
+static void ScriptCmd_sprite(void)
+{
+ s32 i;
+ struct SpriteTemplate *r7;
+ u8 r4;
+ u8 r0;
+ u8 _r0;
+ u16 r6;
+ u8 r2;
+ s8 r1;
+
+ gBattleAnimScriptPtr++;
+ r7 = (struct SpriteTemplate *)(SCRIPT_READ_32(gBattleAnimScriptPtr));
+ gBattleAnimScriptPtr += 4;
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ for (i = 0; i < r0; i++)
+ {
+ gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 2;
+ }
+ if (r4 & 0x80)
+ {
+ r4 ^= 0x80;
+ if (r4 > 0x3F)
+ r4 -= 0x40;
+ else
+ r4 = -r4;
+ _r0 = sub_8079E90(gBattleAnimEnemyMonIndex);
+ r1 = r4;
+
+ }
+ else
+ {
+ //_08075B44
+ if (r4 > 0x3F)
+ r4 -= 0x40;
+ else
+ r4 = -r4;
+ _r0 = sub_8079E90(gBattleAnimPlayerMonIndex);
+ r1 = r4;
+ }
+ r6 = _r0 + r1;
+ if ((s16)r6 < 3)
+ r6 = 3;
+
+ r4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
+ r2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3);
+ CreateSpriteAndAnimate(r7, r4, r2, r6);
+ gAnimVisualTaskCount++;
+}
+#else
+__attribute__((naked))
+static void ScriptCmd_sprite(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ ldr r5, _08075B2C @ =gBattleAnimScriptPtr\n\
+ ldr r1, [r5]\n\
+ adds r3, r1, 0x1\n\
+ str r3, [r5]\n\
+ ldrb r2, [r1, 0x1]\n\
+ ldrb r0, [r3, 0x1]\n\
+ lsls r0, 8\n\
+ adds r2, r0\n\
+ ldrb r0, [r3, 0x2]\n\
+ lsls r0, 16\n\
+ adds r2, r0\n\
+ ldrb r0, [r3, 0x3]\n\
+ lsls r0, 24\n\
+ adds r7, r2, r0\n\
+ adds r0, r1, 0x5\n\
+ str r0, [r5]\n\
+ ldrb r4, [r1, 0x5]\n\
+ adds r0, r1, 0x6\n\
+ str r0, [r5]\n\
+ ldrb r0, [r1, 0x6]\n\
+ adds r1, 0x7\n\
+ str r1, [r5]\n\
+ cmp r0, 0\n\
+ beq _08075B14\n\
+ adds r6, r5, 0\n\
+ ldr r5, _08075B30 @ =gBattleAnimArgs\n\
+ adds r3, r0, 0\n\
+_08075AFC:\n\
+ ldr r2, [r6]\n\
+ ldrb r1, [r2]\n\
+ ldrb r0, [r2, 0x1]\n\
+ lsls r0, 8\n\
+ orrs r1, r0\n\
+ strh r1, [r5]\n\
+ adds r2, 0x2\n\
+ str r2, [r6]\n\
+ adds r5, 0x2\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bne _08075AFC\n\
+_08075B14:\n\
+ movs r0, 0x80\n\
+ ands r0, r4\n\
+ cmp r0, 0\n\
+ beq _08075B44\n\
+ movs r0, 0x80\n\
+ eors r4, r0\n\
+ cmp r4, 0x3F\n\
+ bls _08075B34\n\
+ adds r0, r4, 0\n\
+ subs r0, 0x40\n\
+ b _08075B36\n\
+ .align 2, 0\n\
+_08075B2C: .4byte gBattleAnimScriptPtr\n\
+_08075B30: .4byte gBattleAnimArgs\n\
+_08075B34:\n\
+ negs r0, r4\n\
+_08075B36:\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldr r0, _08075B40 @ =gBattleAnimEnemyMonIndex\n\
+ b _08075B56\n\
+ .align 2, 0\n\
+_08075B40: .4byte gBattleAnimEnemyMonIndex\n\
+_08075B44:\n\
+ cmp r4, 0x3F\n\
+ bls _08075B4E\n\
+ adds r0, r4, 0\n\
+ subs r0, 0x40\n\
+ b _08075B50\n\
+_08075B4E:\n\
+ negs r0, r4\n\
+_08075B50:\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldr r0, _08075BAC @ =gBattleAnimPlayerMonIndex\n\
+_08075B56:\n\
+ ldrb r0, [r0]\n\
+ bl sub_8079E90\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r4, 24\n\
+ asrs r1, 24\n\
+ adds r0, r1\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ lsls r0, r6, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x2\n\
+ bgt _08075B74\n\
+ movs r6, 0x3\n\
+_08075B74:\n\
+ ldr r5, _08075BB0 @ =gBattleAnimEnemyMonIndex\n\
+ ldrb r0, [r5]\n\
+ movs r1, 0x2\n\
+ bl sub_8077ABC\n\
+ adds r4, r0, 0\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ ldrb r0, [r5]\n\
+ movs r1, 0x3\n\
+ bl sub_8077ABC\n\
+ adds r2, r0, 0\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ lsls r3, r6, 24\n\
+ lsrs r3, 24\n\
+ adds r0, r7, 0\n\
+ adds r1, r4, 0\n\
+ bl CreateSpriteAndAnimate\n\
+ ldr r1, _08075BB4 @ =gAnimVisualTaskCount\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08075BAC: .4byte gBattleAnimPlayerMonIndex\n\
+_08075BB0: .4byte gBattleAnimEnemyMonIndex\n\
+_08075BB4: .4byte gAnimVisualTaskCount\n\
+ .syntax divided\n");
+}
+#endif
+
+static void ScriptCmd_createtask(void)
+{
+ TaskFunc taskFunc;
+ u8 taskPriority;
+ u8 taskId;
+ u8 numArgs;
+ s32 i;
+
+ gBattleAnimScriptPtr++;
+ taskFunc = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 4;
+ taskPriority = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 2;
+ }
+
+ taskId = CreateTask(taskFunc, taskPriority);
+ taskFunc(taskId);
+ gAnimVisualTaskCount++;
+}
+
+static void ScriptCmd_delay(void)
+{
+ gBattleAnimScriptPtr++;
+ gAnimFramesToWait = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (gAnimFramesToWait == 0)
+ gAnimFramesToWait = -1;
+ gBattleAnimScriptPtr++;
+ gAnimScriptCallback = WaitAnimFrameCount;
+}
+
+// wait for visual tasks to finish.
+static void ScriptCmd_waitforvisualfinish(void)
+{
+ if (gAnimVisualTaskCount == 0)
+ {
+ gBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 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 is animations to be done.
+ if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0
+ || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF)
+ {
+ gSoundAnimFramesToWait = 0;
+ gAnimFramesToWait = 1;
+ return;
+ }
+
+ // finish the sound effects.
+ if (IsSEPlaying())
+ {
+ if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect.
+ {
+ gAnimFramesToWait = 1;
+ return;
+ }
+ else
+ {
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ }
+ }
+
+ // the SE has halted, so set the SE Frame Counter to 0 and continue.
+ gSoundAnimFramesToWait = 0;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (gAnimSpriteIndexArray[i] != 0xFFFF)
+ {
+ FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag);
+ gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator.
+ }
+ }
+
+ if (continuousAnim == FALSE) // may have been used for debug?
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
+ if (IsContest() == 0)
+ {
+ sub_8079E24();
+ sub_8043EB4(1);
+ }
+ gAnimScriptActive = FALSE;
+ }
+}
+
+static void ScriptCmd_playse(void)
+{
+ gBattleAnimScriptPtr++;
+ PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr));
+ gBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_monbg(void)
+{
+ u8 r6;
+ u8 r5;
+ u8 r0;
+ u8 r7;
+ u16 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r6 == 0)
+ r6 = 2;
+ else if (r6 == 1)
+ r6 = 3;
+ if (r6 == 0 || r6 == 2)
+ r5 = gBattleAnimPlayerMonIndex;
+ else
+ r5 = gBattleAnimEnemyMonIndex;
+ if (b_side_obj__get_some_boolean(r5))
+ {
+ r0 = GetBankIdentity(r5);
+ r0 += 0xFF;
+ if (r0 <= 1 || IsContest() != 0)
+ r7 = 0;
+ else
+ r7 = 1;
+ sub_8076034(r5, r7);
+ r4 = gObjectBankIDs[r5];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
+ gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
+ if (r7 == 0)
+ {
+ gTasks[taskId].data[3] = gUnknown_030042C0;
+ gTasks[taskId].data[4] = gUnknown_030041B4;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gUnknown_03004288;
+ gTasks[taskId].data[4] = gUnknown_03004280;
+ }
+ gTasks[taskId].data[5] = r7;
+ gTasks[taskId].data[6] = r5;
+ gMonAnimTaskIdArray[0] = taskId;
+
+ }
+ r5 ^= 2;
+ if (r6 > 1 && b_side_obj__get_some_boolean(r5))
+ {
+ r0 = GetBankIdentity(r5);
+ r0 += 0xFF;
+ if (r0 <= 1 || IsContest() != 0)
+ r7 = 0;
+ else
+ r7 = 1;
+ sub_8076034(r5, r7);
+ r4 = gObjectBankIDs[r5];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
+ gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
+ if (r7 == 0)
+ {
+ gTasks[taskId].data[3] = gUnknown_030042C0;
+ gTasks[taskId].data[4] = gUnknown_030041B4;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gUnknown_03004288;
+ gTasks[taskId].data[4] = gUnknown_03004280;
+ }
+ gTasks[taskId].data[5] = r7;
+ gTasks[taskId].data[6] = r5;
+ gMonAnimTaskIdArray[1] = taskId;
+ }
+ gBattleAnimScriptPtr++;
+}
+
+#ifdef NONMATCHING
+bool8 b_side_obj__get_some_boolean(u8 a)
+{
+ if (IsContest() != 0)
+ {
+ if (a == gBattleAnimPlayerMonIndex)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ if (sub_8078874(a) == 0)
+ return FALSE;
+ if (IsContest() != 0)
+ return TRUE; // this line wont ever be reached.
+ if ((EWRAM_17800[a].unk0 & 1) == 0)
+ return TRUE;
+ if (gSprites[gObjectBankIDs[a]].invisible)
+ return FALSE;
+ return TRUE;
+}
+#else
+__attribute__((naked))
+bool8 b_side_obj__get_some_boolean(u8 a)
+{
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ adds r5, r4, 0\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08075FDC\n\
+ ldr r0, _08075FD8 @ =gBattleAnimPlayerMonIndex\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ beq _0807601C\n\
+ b _0807602C\n\
+ .align 2, 0\n\
+_08075FD8: .4byte gBattleAnimPlayerMonIndex\n\
+_08075FDC:\n\
+ adds r0, r4, 0\n\
+ bl sub_8078874\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0807602C\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0807601C\n\
+ lsls r0, r5, 2\n\
+ ldr r1, _08076020 @ =0x02017800\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0807601C\n\
+ ldr r2, _08076024 @ =gSprites\n\
+ ldr r0, _08076028 @ =gObjectBankIDs\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r2\n\
+ adds r0, 0x3E\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 29\n\
+ cmp r0, 0\n\
+ blt _0807602C\n\
+_0807601C:\n\
+ movs r0, 0x1\n\
+ b _0807602E\n\
+ .align 2, 0\n\
+_08076020: .4byte 0x02017800\n\
+_08076024: .4byte gSprites\n\
+_08076028: .4byte gObjectBankIDs\n\
+_0807602C:\n\
+ movs r0, 0\n\
+_0807602E:\n\
+ pop {r4,r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_8076034(u8 a, u8 b)
+{
+ volatile u8 pointlessZero;
+ u16 *addr2;
+ u8 spriteId;
+
+ if (b == 0)
+ {
+ struct UnknownStruct2 s;
+ u8 *addr;
+ u32 size;
+ u8 r2;
+ u16 *addr3;
+
+ sub_8078914(&s);
+ addr = s.unk0;
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)s.unk4;
+ DmaFill16(3, 0xFF, addr2, 0x1000);
+
+ REG_BG1CNT_BITFIELD.priority = 2;
+ REG_BG1CNT_BITFIELD.screenSize = 1;
+ REG_BG1CNT_BITFIELD.areaOverflowMode = 0;
+
+ spriteId = gObjectBankIDs[a];
+ gUnknown_030042C0 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
+ if (IsContest() != 0 && sub_80AEB1C(EWRAM_19348) != 0)
+ gUnknown_030042C0--;
+ gUnknown_030041B4 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
+ gSprites[gObjectBankIDs[a]].invisible = TRUE;
+
+ REG_BG1HOFS = gUnknown_030042C0;
+ REG_BG1VOFS = gUnknown_030041B4;
+
+ LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32);
+ addr3 = (u16 *)PLTT + s.unk8 * 16;
+ DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
+
+ if (IsContest() != 0)
+ r2 = 0;
+ else
+ r2 = GetBankIdentity(a);
+ sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock);
+ if (IsContest() != 0)
+ sub_8076380();
+ }
+ else
+ {
+ u8 *addr;
+ u32 size;
+ u16 *addr3;
+
+ addr = (void *)(VRAM + 0x6000);
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)(VRAM + 0xF000);
+ DmaFill32(3, 0, addr2, 0x800);
+
+ REG_BG2CNT_BITFIELD.priority = 2;
+ REG_BG2CNT_BITFIELD.screenSize = 1;
+ REG_BG2CNT_BITFIELD.areaOverflowMode = 0;
+
+ spriteId = gObjectBankIDs[a];
+ gUnknown_03004288 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
+ gUnknown_03004280 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
+ gSprites[gObjectBankIDs[a]].invisible = TRUE;
+
+ REG_BG2HOFS = gUnknown_03004288;
+ REG_BG2VOFS = gUnknown_03004280;
+
+ LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32);
+ addr3 = (void *)(PLTT + 0x120);
+ DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
+
+ sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock);
+ }
+}
+
+static void sub_8076380(void)
+{
+ int i;
+ int j;
+ struct UnknownStruct2 s;
+ u16 *ptr;
+
+ if (sub_80AEB1C(EWRAM_19348) != 0)
+ {
+ sub_8078914(&s);
+ ptr = s.unk4;
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ u16 temp = ptr[j + i * 32];
+
+ ptr[j + i * 32] = ptr[7 - j + i * 32];
+ ptr[7 - j + i * 32] = temp;
+ }
+ }
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ ptr[j + i * 32] ^= 0x400;
+ }
+ }
+}
+
+void sub_80763FC(u16 a, u16 *b, u32 c, u8 d)
+{
+ u8 i;
+ u8 j;
+ u32 r9;
+
+ if (d == 0)
+ r9 = 32;
+ else
+ r9 = 64;
+ a <<= 12;
+ for (i = 0; i < r9; i++)
+ {
+ for (j = 0; j < 32; j++)
+ b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c;
+ }
+}
+
+void sub_8076464(u8 a)
+{
+ u8 *addr;
+ u32 size;
+ volatile u8 pointlessZero;
+ struct UnknownStruct2 s;
+
+ sub_8078914(&s);
+ if (a == 0 || IsContest() != 0)
+ {
+ u16 *addr2;
+
+ addr = s.unk0;
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = s.unk4;
+ DmaFill32(3, 0, addr2, 0x800);
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ }
+ else
+ {
+ u16 *addr2;
+
+ addr = (void *)(VRAM + 0x6000);
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)(VRAM + 0xF000);
+ DmaFill32(3, 0, addr2, 0x800);
+ gUnknown_03004288 = 0;
+ gUnknown_03004280 = 0;
+ }
+}
+
+static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
+{
+ u8 r4;
+ u8 r6;
+ s16 r3;
+ s16 r2;
+ struct UnknownStruct2 s;
+
+ r4 = gTasks[taskId].data[0];
+ r6 = gTasks[taskId].data[6];
+ sub_8078914(&s);
+ r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x);
+ r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y);
+ if (gTasks[taskId].data[5] == 0)
+ {
+ u16 *src;
+ u16 *dst;
+
+ gUnknown_030042C0 = r3 + gTasks[taskId].data[3];
+ gUnknown_030041B4 = r2 + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + r6 * 16;
+ dst = gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256;
+ DmaCopy32(3, src, dst, 32);
+ }
+ else
+ {
+ u16 *src;
+ u16 *dst;
+
+ gUnknown_03004288 = r3 + gTasks[taskId].data[3];
+ gUnknown_03004280 = r2 + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + r6 * 16;
+ dst = gPlttBufferFaded + 0x100 - 112;
+ DmaCopy32(3, src, dst, 32);
+ }
+}
+
+static void ScriptCmd_clearmonbg(void)
+{
+ u8 r4;
+ u8 r5;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r4 == 0)
+ r4 = 2;
+ else if (r4 == 1)
+ r4 = 3;
+ if (r4 == 0 || r4 == 2)
+ r5 = gBattleAnimPlayerMonIndex;
+ else
+ r5 = gBattleAnimEnemyMonIndex;
+ if (gMonAnimTaskIdArray[0] != 0xFF)
+ gSprites[gObjectBankIDs[r5]].invisible = FALSE;
+ if (r4 > 1 && gMonAnimTaskIdArray[1] != 0xFF)
+ gSprites[gObjectBankIDs[r5 ^ 2]].invisible = FALSE;
+ else
+ r4 = 0;
+ taskId = CreateTask(sub_807672C, 5);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[2] = r5;
+ gBattleAnimScriptPtr++;
+}
+
+static void sub_807672C(u8 taskId)
+{
+ u8 var;
+ u8 r4;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ var = GetBankIdentity(gTasks[taskId].data[2]);
+ var += 0xFF;
+ if (var <= 1 || IsContest() != 0)
+ r4 = 0;
+ else
+ r4 = 1;
+ if (gMonAnimTaskIdArray[0] != 0xFF)
+ {
+ sub_8076464(r4);
+ DestroyTask(gMonAnimTaskIdArray[0]);
+ gMonAnimTaskIdArray[0] = 0xFF;
+ }
+ if (gTasks[taskId].data[0] > 1)
+ {
+ sub_8076464(r4 ^ 1);
+ DestroyTask(gMonAnimTaskIdArray[1]);
+ gMonAnimTaskIdArray[1] = 0xFF;
+ }
+ DestroyTask(taskId);
+ }
+}
+
+static void ScriptCmd_monbg_22(void)
+{
+ u8 r5;
+ u8 r4;
+ u8 r0;
+ u8 r1;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r5 == 0)
+ r5 = 2;
+ else if (r5 == 1)
+ r5 = 3;
+ if (r5 == 0 || r5 == 2)
+ r4 = gBattleAnimPlayerMonIndex;
+ else
+ r4 = gBattleAnimEnemyMonIndex;
+ if (b_side_obj__get_some_boolean(r4))
+ {
+ r0 = GetBankIdentity(r4);
+ r0 += 0xFF;
+ if (r0 <= 1 || IsContest() != 0)
+ r1 = 0;
+ else
+ r1 = 1;
+ sub_8076034(r4, r1);
+ gSprites[gObjectBankIDs[r4]].invisible = FALSE;
+ }
+ r4 ^= 2;
+ if (r5 > 1 && b_side_obj__get_some_boolean(r4))
+ {
+ r0 = GetBankIdentity(r4);
+ r0 += 0xFF;
+ if (r0 <= 1 || IsContest() != 0)
+ r1 = 0;
+ else
+ r1 = 1;
+ sub_8076034(r4, r1);
+ gSprites[gObjectBankIDs[r4]].invisible = FALSE;
+ }
+ gBattleAnimScriptPtr++;
+}
+
+static void ScriptCmd_clearmonbg_23(void)
+{
+ u8 r5;
+ u8 r6;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r5 == 0)
+ r5 = 2;
+ else if (r5 == 1)
+ r5 = 3;
+ if (r5 == 0 || r5 == 2)
+ r6 = gBattleAnimPlayerMonIndex;
+ else
+ r6 = gBattleAnimEnemyMonIndex;
+ if (b_side_obj__get_some_boolean(r6))
+ gSprites[gObjectBankIDs[r6]].invisible = FALSE;
+ if (r5 > 1 && b_side_obj__get_some_boolean(r6 ^ 2))
+ gSprites[gObjectBankIDs[r6 ^ 2]].invisible = FALSE;
+ else
+ r5 = 0;
+ taskId = CreateTask(sub_80769A4, 5);
+ gTasks[taskId].data[0] = r5;
+ gTasks[taskId].data[2] = r6;
+ gBattleAnimScriptPtr++;
+}
+
+static void sub_80769A4(u8 taskId)
+{
+ u8 r0;
+ u8 r4;
+ u8 r5;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ r4 = gTasks[taskId].data[2];
+ r0 = GetBankIdentity(r4);
+ r0 += 0xFF;
+ if (r0 <= 1 || IsContest() != 0)
+ r5 = 0;
+ else
+ r5 = 1;
+ if (b_side_obj__get_some_boolean(r4))
+ sub_8076464(r5);
+ if (gTasks[taskId].data[0] > 1 && b_side_obj__get_some_boolean(r4 ^ 2))
+ sub_8076464(r5 ^ 1);
+ DestroyTask(taskId);
+ }
+}
+
+static void ScriptCmd_setalpha(void)
+{
+ u16 r3;
+ u16 r1;
+
+ gBattleAnimScriptPtr++;
+ r3 = *(gBattleAnimScriptPtr++);
+ r1 = *(gBattleAnimScriptPtr++) << 8;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = r3 | r1;
+}
+
+static void ScriptCmd_setbldcnt(void)
+{
+ u16 r3;
+ u16 r1;
+
+ gBattleAnimScriptPtr++;
+ r3 = *(gBattleAnimScriptPtr++);
+ r1 = *(gBattleAnimScriptPtr++) << 8;
+ REG_BLDCNT = r3 | r1;
+}
+
+static void ScriptCmd_blendoff(void)
+{
+ gBattleAnimScriptPtr++;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+}
+
+static void ScriptCmd_call(void)
+{
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4;
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+}
+
+static void ScriptCmd_return(void)
+{
+ gBattleAnimScriptPtr = gBattleAnimScriptRetAddr;
+}
+
+static void ScriptCmd_setvar(void)
+{
+ const u8 *addr = gBattleAnimScriptPtr;
+ u16 r4;
+ u8 r2;
+
+ gBattleAnimScriptPtr++;
+ r2 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = addr + 4;
+ gBattleAnimArgs[r2] = r4;
+}
+
+static void ScriptCmd_ifelse(void)
+{
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ if (gUnknown_0202F7C4 & 1)
+ gBattleAnimScriptPtr += 4;
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+}
+
+static void ScriptCmd_jumpif(void)
+{
+ u8 r1;
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ r1 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ if (r1 == gUnknown_0202F7C4)
+ {
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+ }
+ else
+ {
+ gBattleAnimScriptPtr += 4;
+ }
+}
+
+static void ScriptCmd_jump(void)
+{
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+}
+
+// Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior.
+bool8 IsContest(void)
+{
+ if (!gMain.inBattle)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void ScriptCmd_fadetobg(void)
+{
+ u8 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
+ gTasks[taskId].data[0] = r4;
+ gUnknown_0202F7C5 = 1;
+}
+
+static void ScriptCmd_fadetobg_25(void)
+{
+ u8 r8;
+ u8 r7;
+ u8 r6;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r8 = gBattleAnimScriptPtr[0];
+ r7 = gBattleAnimScriptPtr[1];
+ r6 = gBattleAnimScriptPtr[2];
+ gBattleAnimScriptPtr += 3;
+ taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
+ if (IsContest() != 0)
+ gTasks[taskId].data[0] = r6;
+ else if (GetBankSide(gBattleAnimEnemyMonIndex) == 0)
+ gTasks[taskId].data[0] = r7;
+ else
+ gTasks[taskId].data[0] = r8;
+ gUnknown_0202F7C5 = 1;
+}
+
+static void task_p5_load_battle_screen_elements(u8 taskId)
+{
+ if (gTasks[taskId].data[10] == 0)
+ {
+ BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0);
+ gTasks[taskId].data[10]++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].data[10] == 1)
+ {
+ gTasks[taskId].data[10]++;
+ gUnknown_0202F7C5 = 2;
+ }
+ else if (gTasks[taskId].data[10] == 2)
+ {
+ s16 data0 = (u16)gTasks[taskId].data[0];
+
+ if (data0 == -1)
+ dp01t_11_3_message_for_player_only();
+ else
+ sub_8076DB8(data0);
+ BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1);
+ gTasks[taskId].data[10]++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].data[10] == 3)
+ {
+ DestroyTask(taskId);
+ gUnknown_0202F7C5 = 0;
+ }
+}
+
+static void sub_8076DB8(u16 a)
+{
+ if (IsContest())
+ {
+ void *tilemap = gBattleAnimBackgroundTable[a].tilemap;
+ void *dmaSrc;
+ void *dmaDest;
+
+ sub_800D238(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000);
+ sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0);
+ dmaSrc = IsContest() ? EWRAM_14800 : EWRAM_18000;
+ dmaDest = (void *)(VRAM + 0xD000);
+ DmaCopy32(3, dmaSrc, dmaDest, 0x800);
+ LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x2000));
+ LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, sub_80789BC() * 16, 32);
+ }
+ else
+ {
+ LZDecompressVram(gBattleAnimBackgroundTable[a].tilemap, (void *)(VRAM + 0xD000));
+ LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x8000));
+ LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, 32, 32);
+ }
+}
+
+static void dp01t_11_3_message_for_player_only(void)
+{
+ if (IsContest())
+ sub_80AB2AC();
+ else
+ sub_800D7B8();
+}
+
+static void ScriptCmd_restorebg(void)
+{
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
+ gTasks[taskId].data[0] = 0xFFFF;
+ gUnknown_0202F7C5 = 1;
+}
+
+static void ScriptCmd_waitbgfadeout(void)
+{
+ if (gUnknown_0202F7C5 == 2)
+ {
+ gBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_waitbgfadein(void)
+{
+ if (gUnknown_0202F7C5 == 0)
+ {
+ gBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_changebg(void)
+{
+ gBattleAnimScriptPtr++;
+ sub_8076DB8(SCRIPT_READ_8(gBattleAnimScriptPtr));
+ gBattleAnimScriptPtr++;
+}
+
+//Weird control flow
+/*
+s8 sub_8076F98(s8 a)
+{
+ if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10))
+ {
+ a = GetBankSide(gBattleAnimPlayerMonIndex) ? 0xC0 : 0x3F;
+ }
+ //_08076FDC
+ else
+ {
+ if (IsContest())
+ {
+ if (gBattleAnimPlayerMonIndex == gBattleAnimEnemyMonIndex && gBattleAnimPlayerMonIndex == 2
+ && a == 0x3F)
+ {
+ //jump to _0807707A
+ if (a < -0x40)
+ a = 0xC0;
+ return a;
+ }
+ }
+ //_08077004
+ else
+ {
+ if (GetBankSide(gBattleAnimPlayerMonIndex) == 0)
+ {
+ if (GetBankSide(gBattleAnimEnemyMonIndex) == 0)
+ }
+ //_08077042
+ else
+ {
+
+ }
+ //_0807706C
+ }
+ }
+ //_0807706E
+}
+*/
+__attribute__((naked))
+s8 sub_8076F98(s8 a)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08076FDC\n\
+ ldr r0, _08076FD4 @ =gBattleAnimPlayerMonIndex\n\
+ ldrb r2, [r0]\n\
+ lsls r0, r2, 1\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ ldr r1, _08076FD8 @ =0x02017810\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08076FDC\n\
+ adds r0, r2, 0\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ movs r4, 0xC0\n\
+ cmp r0, 0\n\
+ beq _0807706E\n\
+ movs r4, 0x3F\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_08076FD4: .4byte gBattleAnimPlayerMonIndex\n\
+_08076FD8: .4byte 0x02017810\n\
+_08076FDC:\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08077004\n\
+ ldr r0, _08076FFC @ =gBattleAnimPlayerMonIndex\n\
+ ldr r1, _08077000 @ =gBattleAnimEnemyMonIndex\n\
+ ldrb r0, [r0]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bne _08077068\n\
+ cmp r0, 0x2\n\
+ bne _08077068\n\
+ cmp r4, 0x3F\n\
+ beq _0807707A\n\
+ b _08077068\n\
+ .align 2, 0\n\
+_08076FFC: .4byte gBattleAnimPlayerMonIndex\n\
+_08077000: .4byte gBattleAnimEnemyMonIndex\n\
+_08077004:\n\
+ ldr r0, _0807702C @ =gBattleAnimPlayerMonIndex\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08077042\n\
+ ldr r0, _08077030 @ =gBattleAnimEnemyMonIndex\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0807706E\n\
+ lsls r0, r4, 24\n\
+ asrs r1, r0, 24\n\
+ cmp r1, 0x3F\n\
+ bne _08077034\n\
+ movs r4, 0xC0\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_0807702C: .4byte gBattleAnimPlayerMonIndex\n\
+_08077030: .4byte gBattleAnimEnemyMonIndex\n\
+_08077034:\n\
+ movs r0, 0x40\n\
+ negs r0, r0\n\
+ cmp r1, r0\n\
+ beq _0807706E\n\
+ negs r0, r1\n\
+ lsls r0, 24\n\
+ b _0807706C\n\
+_08077042:\n\
+ ldr r0, _08077064 @ =gBattleAnimEnemyMonIndex\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _08077068\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x40\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bne _0807706E\n\
+ movs r4, 0x3F\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_08077064: .4byte gBattleAnimEnemyMonIndex\n\
+_08077068:\n\
+ lsls r0, r4, 24\n\
+ negs r0, r0\n\
+_0807706C:\n\
+ lsrs r4, r0, 24\n\
+_0807706E:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x3F\n\
+ ble _0807707A\n\
+ movs r4, 0x3F\n\
+ b _08077088\n\
+_0807707A:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x40\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bge _08077088\n\
+ movs r4, 0xC0\n\
+_08077088:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+
+s8 sub_8077094(s8 a)
+{
+ if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10))
+ {
+ if (GetBankSide(gBattleAnimPlayerMonIndex) != 0)
+ a = 0x3F;
+ else
+ a = 0xC0;
+ }
+ else
+ {
+ if (GetBankSide(gBattleAnimPlayerMonIndex) != 0 || IsContest() != 0)
+ a = -a;
+ }
+ return a;
+}
+
+s16 sub_8077104(s16 a)
+{
+ s16 var = a;
+
+ if (var > 63)
+ var = 63;
+ else if (var < -64)
+ var = -64;
+ return var;
+}
+
+s16 sub_807712C(s16 a, s16 b, s16 c)
+{
+ u16 var;
+
+ if (a < b)
+ var = ((c < 0) ? -c : c);
+ else if (a > b)
+ var = -((c < 0) ? -c : c);
+ else
+ var = 0;
+ return var;
+}
+
+static void ScriptCmd_panse_19(void)
+{
+ u16 r4;
+ s8 r0;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ PlaySE12WithPanning(r4, sub_8076F98(r0));
+ gBattleAnimScriptPtr += 3;
+}
+
+static void ScriptCmd_setpan(void)
+{
+ s8 r0;
+
+ gBattleAnimScriptPtr++;
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ SE12PanpotControl(sub_8076F98(r0));
+ gBattleAnimScriptPtr++;
+}
+
+static void ScriptCmd_panse_1B(void)
+{
+ u16 songNum;
+ s8 r0;
+ s8 r4;
+ s8 r6;
+ u8 r7;
+ s8 panning;
+ s8 r8;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ songNum = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5);
+ panning = sub_8076F98(r0);
+ r8 = sub_8076F98(r4);
+ r4 = sub_807712C(panning, r8, r6);
+ taskId = CreateTask(c3_08073CEC, 1);
+ gTasks[taskId].data[0] = panning;
+ gTasks[taskId].data[1] = r8;
+ gTasks[taskId].data[2] = r4;
+ gTasks[taskId].data[3] = r7;
+ gTasks[taskId].data[4] = panning;
+ PlaySE12WithPanning(songNum, panning);
+ gAnimSoundTaskCount++;
+ gBattleAnimScriptPtr += 6;
+}
+
+#ifdef NONMATCHING
+static void c3_08073CEC(u8 taskId)
+{
+ u16 r7 = 0;
+ s16 r0;
+ s16 r6;
+ s16 r3;
+ s16 r4;
+ int foo;
+
+ r0 = gTasks[taskId].data[8];
+ gTasks[taskId].data[8]++;
+ if (r0 >= gTasks[taskId].data[3])
+ {
+ gTasks[taskId].data[8] = r7;
+ r6 = gTasks[taskId].data[0];
+ r3 = gTasks[taskId].data[1];
+ foo = gTasks[taskId].data[4] + gTasks[taskId].data[2];
+ r4 = foo;
+ gTasks[taskId].data[4] = r4;
+ if (gTasks[taskId].data[2] == 0)
+ {
+ r4 = r3;
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+ //_080772D8
+ else
+ {
+ if (r6 < r3)
+ {
+ if (r4 < r3)
+ goto check;
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+ else
+ {
+ if (r4 <= r3)
+ r7 = 1;
+ check:
+ if (r7 != 0)
+ {
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+ }
+ }
+ //_080772F8
+ SE12PanpotControl(r4);
+ }
+ //_08077314
+}
+#else
+__attribute__((naked))
+static void c3_08073CEC(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r7, 0\n\
+ ldr r1, _080772D4 @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r2, r0, r1\n\
+ ldrh r0, [r2, 0x18]\n\
+ adds r1, r0, 0x1\n\
+ strh r1, [r2, 0x18]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r3, 0xE\n\
+ ldrsh r1, [r2, r3]\n\
+ cmp r0, r1\n\
+ blt _08077314\n\
+ strh r7, [r2, 0x18]\n\
+ ldrh r6, [r2, 0x8]\n\
+ ldrh r3, [r2, 0xA]\n\
+ movs r4, 0x10\n\
+ ldrsh r0, [r2, r4]\n\
+ movs r4, 0xC\n\
+ ldrsh r1, [r2, r4]\n\
+ adds r0, r1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ strh r4, [r2, 0x10]\n\
+ cmp r1, 0\n\
+ bne _080772D8\n\
+ lsls r2, r3, 16\n\
+ b _080772FC\n\
+ .align 2, 0\n\
+_080772D4: .4byte gTasks\n\
+_080772D8:\n\
+ lsls r1, r6, 16\n\
+ lsls r0, r3, 16\n\
+ asrs r3, r0, 16\n\
+ adds r2, r0, 0\n\
+ cmp r1, r2\n\
+ bge _080772EE\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r3\n\
+ blt _080772F8\n\
+ b _080772FC\n\
+_080772EE:\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r3\n\
+ bgt _080772F8\n\
+ movs r7, 0x1\n\
+_080772F8:\n\
+ cmp r7, 0\n\
+ beq _0807730C\n\
+_080772FC:\n\
+ lsrs r4, r2, 16\n\
+ adds r0, r5, 0\n\
+ bl DestroyTask\n\
+ ldr r1, _0807731C @ =gAnimSoundTaskCount\n\
+ ldrb r0, [r1]\n\
+ subs r0, 0x1\n\
+ strb r0, [r1]\n\
+_0807730C:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ bl SE12PanpotControl\n\
+_08077314:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0807731C: .4byte gAnimSoundTaskCount\n\
+ .syntax divided\n");
+}
+#endif
+
+static void ScriptCmd_panse_26(void)
+{
+ u16 r8;
+ s8 r4;
+ s8 r5;
+ s8 r6;
+ u8 r10;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r8 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r5 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r10 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5);
+ taskId = CreateTask(c3_08073CEC, 1);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = r5;
+ gTasks[taskId].data[2] = r6;
+ gTasks[taskId].data[3] = r10;
+ gTasks[taskId].data[4] = r4;
+ PlaySE12WithPanning(r8, r4);
+ gAnimSoundTaskCount++;
+ gBattleAnimScriptPtr += 6;
+}
+
+static void ScriptCmd_panse_27(void)
+{
+ u16 r9;
+ u8 r4;
+ u8 r8;
+ u8 r7;
+ u8 r0;
+ s8 r6;
+ s8 r5;
+ s8 r4_2;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r9 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5);
+ r6 = sub_8077094(r0);
+ r5 = sub_8077094(r4);
+ r4_2 = sub_8077094(r8);
+ taskId = CreateTask(c3_08073CEC, 1);
+ gTasks[taskId].data[0] = r6;
+ gTasks[taskId].data[1] = r5;
+ gTasks[taskId].data[2] = r4_2;
+ gTasks[taskId].data[3] = r7;
+ gTasks[taskId].data[4] = r6;
+ PlaySE12WithPanning(r9, r6);
+ gAnimSoundTaskCount++;
+ gBattleAnimScriptPtr += 6;
+}
+
+static void ScriptCmd_panse_1C(void)
+{
+ u16 r5;
+ u8 r0;
+ u8 r8;
+ u8 r9;
+ s8 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r9 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r4 = sub_8076F98(r0);
+ taskId = CreateTask(sub_80774FC, 1);
+ gTasks[taskId].data[0] = r5;
+ gTasks[taskId].data[1] = r4;
+ gTasks[taskId].data[2] = r8;
+ gTasks[taskId].data[3] = r9;
+ gTasks[taskId].data[8] = r8;
+ gTasks[taskId].func(taskId);
+ gAnimSoundTaskCount++;
+ gBattleAnimScriptPtr += 5;
+}
+
+static void sub_80774FC(u8 taskId)
+{
+ s16 data8;
+ u16 r0;
+ s8 r1;
+ u8 r4;
+
+ data8 = gTasks[taskId].data[8];
+ gTasks[taskId].data[8]++;
+ if (data8 >= gTasks[taskId].data[2])
+ {
+ gTasks[taskId].data[8] = 0;
+ r0 = gTasks[taskId].data[0];
+ r1 = gTasks[taskId].data[1];
+ gTasks[taskId].data[3]--;
+ r4 = gTasks[taskId].data[3];
+ PlaySE12WithPanning(r0, r1);
+ if (r4 == 0)
+ {
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+ }
+}
+
+static void ScriptCmd_panse_1D(void)
+{
+ u16 r5;
+ u8 r0;
+ u8 r8;
+ s8 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r4 = sub_8076F98(r0);
+ taskId = CreateTask(sub_80775CC, 1);
+ gTasks[taskId].data[0] = r5;
+ gTasks[taskId].data[1] = r4;
+ gTasks[taskId].data[2] = r8;
+ gAnimSoundTaskCount++;
+ gBattleAnimScriptPtr += 4;
+}
+
+static void sub_80775CC(u8 taskId)
+{
+ s16 r0;
+
+ r0 = gTasks[taskId].data[2];
+ gTasks[taskId].data[2]--;
+ if (r0 <= 0)
+ {
+ PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+}
+
+static void ScriptCmd_createtask_1F(void)
+{
+ TaskFunc func;
+ u8 numArgs;
+ int i;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ func = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 4;
+ numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 2;
+ }
+ taskId = CreateTask(func, 1);
+ func(taskId);
+ gAnimSoundTaskCount++;
+}
+
+static void ScriptCmd_waitsound(void)
+{
+ if (gAnimSoundTaskCount != 0)
+ {
+ gSoundAnimFramesToWait = 0;
+ gAnimFramesToWait = 1;
+ }
+ else if (IsSEPlaying())
+ {
+ if (++gSoundAnimFramesToWait > 90)
+ {
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ gSoundAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 1;
+ }
+ }
+ else
+ {
+ gSoundAnimFramesToWait = 0;
+ gBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+}
+
+static void ScriptCmd_jumpvareq(void)
+{
+ u8 r2;
+ s16 r1;
+ u8 *addr;
+
+ gBattleAnimScriptPtr++;
+ r2 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ r1 = SCRIPT_READ_16(gBattleAnimScriptPtr + 1);
+ if (r1 == gBattleAnimArgs[r2])
+ {
+ addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr + 3);
+ gBattleAnimScriptPtr = addr;
+ }
+ else
+ {
+ gBattleAnimScriptPtr += 7;
+ }
+}
+
+static void ScriptCmd_jumpunkcond(void)
+{
+ u8 *addr;
+
+ gBattleAnimScriptPtr++;
+ if (IsContest())
+ {
+ addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = addr;
+ }
+ else
+ {
+ gBattleAnimScriptPtr += 4;
+ }
+}
+
+static void ScriptCmd_monbgprio_28(void)
+{
+ u8 r2;
+ u8 r0;
+ u8 r4;
+
+ r2 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (r2 != 0)
+ r0 = gBattleAnimEnemyMonIndex;
+ else
+ r0 = gBattleAnimPlayerMonIndex;
+ r4 = GetBankIdentity(r0);
+ if (!IsContest() && (r4 == 0 || r4 == 3))
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+}
+
+static void ScriptCmd_monbgprio_29(void)
+{
+ gBattleAnimScriptPtr++;
+ if (!IsContest())
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+}
+
+static void ScriptCmd_monbgprio_2A(void)
+{
+ u8 r6;
+ u8 r4;
+ u8 r0;
+
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (GetBankSide(gBattleAnimPlayerMonIndex) != GetBankSide(gBattleAnimEnemyMonIndex))
+ {
+ if (r6 != 0)
+ r0 = gBattleAnimEnemyMonIndex;
+ else
+ r0 = gBattleAnimPlayerMonIndex;
+ r4 = GetBankIdentity(r0);
+ if (!IsContest() && (r4 == 0 || r4 == 3))
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+ }
+}
+
+static void ScriptCmd_invisible(void)
+{
+ u8 r0;
+ u8 spriteId;
+
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ spriteId = obj_id_for_side_relative_to_move(r0);
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = TRUE;
+ }
+ gBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_visible(void)
+{
+ u8 r0;
+ u8 spriteId;
+
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ spriteId = obj_id_for_side_relative_to_move(r0);
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = FALSE;
+ }
+ gBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_doublebattle_2D(void)
+{
+ u8 r7;
+ u8 r4;
+ u8 spriteId;
+
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (!IsContest() && IsDoubleBattle()
+ && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex))
+ {
+ if (r7 == 0)
+ {
+ r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex);
+ spriteId = obj_id_for_side_relative_to_move(0);
+ }
+ else
+ {
+ r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex);
+ spriteId = obj_id_for_side_relative_to_move(1);
+ }
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = FALSE;
+ if (r4 == 2)
+ gSprites[spriteId].oam.priority = 3;
+ if (r4 == 1)
+ sub_8076464(0);
+ else
+ sub_8076464(1);
+ }
+ }
+}
+
+static void ScriptCmd_doublebattle_2E(void)
+{
+ u8 r7;
+ u8 r4;
+ u8 spriteId;
+
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (!IsContest() && IsDoubleBattle()
+ && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex))
+ {
+ if (r7 == 0)
+ {
+ r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex);
+ spriteId = obj_id_for_side_relative_to_move(0);
+ }
+ else
+ {
+ r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex);
+ spriteId = obj_id_for_side_relative_to_move(1);
+ }
+ if (spriteId != 0xFF && r4 == 2)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ }
+ }
+}
+
+static void ScriptCmd_stopsound(void)
+{
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ gBattleAnimScriptPtr++;
+}