summaryrefslogtreecommitdiff
path: root/src/battle/battle_anim_812C144.c
diff options
context:
space:
mode:
authorultima-soul <akshayjhanji@hotmail.com>2019-04-07 14:19:02 -0700
committerhuderlem <huderlem@gmail.com>2019-04-07 16:36:15 -0500
commit0a16dd0df08213b58a804b0711a7fdeb79377ce6 (patch)
treee55162aca184cb88ed0e47e95a35a4b343e2c4ea /src/battle/battle_anim_812C144.c
parent963d165e06f4428605fca5c1369c9f417e8e7156 (diff)
Decompile/port rest of battle_anim plus fix 1 NONMATCHING.
Diffstat (limited to 'src/battle/battle_anim_812C144.c')
-rw-r--r--src/battle/battle_anim_812C144.c1570
1 files changed, 1217 insertions, 353 deletions
diff --git a/src/battle/battle_anim_812C144.c b/src/battle/battle_anim_812C144.c
index 4a5533dce..90e7d8e2c 100644
--- a/src/battle/battle_anim_812C144.c
+++ b/src/battle/battle_anim_812C144.c
@@ -29,6 +29,7 @@ extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
+extern u16 gWeatherMoveAnim;
extern const struct SpriteTemplate gBattleAnimSpriteTemplate_83D7220;
extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7C18[];
@@ -76,7 +77,7 @@ static void sub_812E8B4(u8 taskId);
static void sub_812ED24(struct Sprite *sprite);
static void sub_812EE00(struct Sprite *sprite);
static void sub_812EEEC(struct Sprite *sprite);
-/*static*/ void sub_812F238(u8 taskId);
+static void AnimTask_RolePlaySilhouetteStep1(u8 taskId);
static void sub_812F290(u8 taskId);
static void sub_812F474(u8 taskId);
static void sub_812F76C(u8 taskId);
@@ -135,10 +136,13 @@ static void sub_8130F5C(struct Sprite *sprite);
static void sub_8131264(struct Sprite *sprite);
extern void sub_80D1FDC(struct Sprite *sprite);// kiss_fountain.c
static void sub_8131564(struct Sprite *sprite);
+static void AnimTask_TeeterDanceMovementStep(u8);
/*static*/ void sub_8131EB8(struct Sprite *sprite);// rest not yet decompiled
-/*static*/ void sub_8132370(struct Sprite *sprite);
-/*static*/ void sub_81323E0(struct Sprite *sprite);
+void AnimKnockOffStrike(struct Sprite *sprite);
+void AnimRecycle(struct Sprite *sprite);
+static void AnimRecycleStep(struct Sprite *sprite);
+static void AnimTask_SlackOffSquishStep(u8 taskId);
const union AnimCmd gSpriteAnim_8402164[] =
{
@@ -1142,7 +1146,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_8402AE4 =
.anims = gSpriteAnimTable_8402AA8,
.images = NULL,
.affineAnims = gSpriteAffineAnimTable_8402ADC,
- .callback = sub_8132370,
+ .callback = AnimKnockOffStrike,
};
const union AffineAnimCmd gSpriteAffineAnim_8402AFC[] =
@@ -1164,10 +1168,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_8402B10 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gSpriteAffineAnimTable_8402B0C,
- .callback = sub_81323E0,
+ .callback = AnimRecycle,
};
-const union AffineAnimCmd gUnknown_08402B28[] =
+const union AffineAnimCmd gSlackOffSquishAffineAnimCmds[] =
{
AFFINEANIMCMD_FRAME(0, 16, 0, 4),
AFFINEANIMCMD_FRAME(-2, 0, 0, 8),
@@ -1945,12 +1949,12 @@ static void sub_812D06C(u8 taskId)
task->data[5] -= 6;
}
- sub_80798F4(task, task->data[15], gUnknown_08402400);
+ PrepareAffineAnimInTaskData(task, task->data[15], gUnknown_08402400);
task->data[1]++;
task->data[0] = 1;
break;
case 1:
- if (sub_807992C(task) == 0)
+ if (RunAffineAnimFromTaskData(task) == 0)
{
if (task->data[1] == 6)
{
@@ -2051,11 +2055,11 @@ void sub_812D350(u8 taskId)
switch (gTasks[taskId].data[0])
{
case 0:
- sub_80798F4(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_084024B0);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_084024B0);
gTasks[taskId].data[0]++;
break;
case 1:
- if (sub_807992C(&gTasks[taskId]) == 0)
+ if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0)
DestroyAnimVisualTask(taskId);
break;
}
@@ -2193,12 +2197,12 @@ void sub_812D674(u8 taskId)
{
if (gTasks[taskId].data[0] == 0)
{
- sub_80798F4(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402518);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402518);
gTasks[taskId].data[0]++;
}
else
{
- if (sub_807992C(&gTasks[taskId]) == 0)
+ if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0)
DestroyAnimVisualTask(taskId);
}
}
@@ -2207,12 +2211,12 @@ void sub_812D6CC(u8 taskId)
{
if (gTasks[taskId].data[0] == 0)
{
- sub_80798F4(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402540);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402540);
gTasks[taskId].data[0]++;
}
else
{
- if (sub_807992C(&gTasks[taskId]) == 0)
+ if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0)
DestroyAnimVisualTask(taskId);
}
}
@@ -2240,12 +2244,12 @@ void sub_812D790(u8 taskId)
{
if (gTasks[taskId].data[0] == 0)
{
- sub_80798F4(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402590);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402590);
gTasks[taskId].data[0]++;
}
else
{
- if (sub_807992C(&gTasks[taskId]) == 0)
+ if (RunAffineAnimFromTaskData(&gTasks[taskId]) == 0)
DestroyAnimVisualTask(taskId);
}
}
@@ -2682,12 +2686,12 @@ void sub_812E498(u8 taskId)
{
if (gTasks[taskId].data[0] == 0)
{
- sub_80798F4(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402610);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], GetAnimBattlerSpriteId(0), &gUnknown_08402610);
gTasks[taskId].data[0]++;
}
else
{
- if (!sub_807992C(&gTasks[taskId]))
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
{
DestroyAnimVisualTask(taskId);
}
@@ -3175,8 +3179,8 @@ static void sub_812EEEC(struct Sprite *sprite)
}
}
-#ifdef NONMATCHING // functionally equivalent, but seems to be missing a temporary variable
-void sub_812EFC8(u8 taskId)
+// Copies the target mon's sprite, and makes a white silhouette that shrinks away.
+void AnimTask_RolePlaySilhouette(u8 taskId)
{
u8 isBackPic;
u32 personality;
@@ -3187,7 +3191,7 @@ void sub_812EFC8(u8 taskId)
u8 spriteId;
s16 coord1, coord2;
- GetAnimBattlerSpriteId(0);
+ GetAnimBattlerSpriteId(ANIM_BATTLER_ATTACKER);
if (IsContest())
{
isBackPic = 1;
@@ -3195,6 +3199,7 @@ void sub_812EFC8(u8 taskId)
otId = eWRAM_19348Struct->otId;
species = eWRAM_19348Struct->species;
xOffset = 20;
+ priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
}
else
{
@@ -3216,6 +3221,7 @@ void sub_812EFC8(u8 taskId)
}
xOffset = 20;
+ priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
}
else
{
@@ -3235,325 +3241,26 @@ void sub_812EFC8(u8 taskId)
}
xOffset = -20;
+ priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
}
}
- priority = sub_8079ED4(gBattleAnimAttacker);
coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
spriteId = sub_8079F44(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId);
gSprites[spriteId].oam.priority = priority;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
- FillPalette(RGB(31, 31, 31), (gSprites[spriteId].oam.paletteNum << 4) + 0x100, 32);
+ FillPalette(RGB_WHITE, (gSprites[spriteId].oam.paletteNum << 4) + 0x100, 32);
gSprites[spriteId].oam.priority = priority;
- REG_BLDCNT = 0x3F40;
- REG_BLDALPHA = ((16 - gTasks[taskId].data[1]) << 8) | gTasks[taskId].data[1];
+ REG_BLDCNT = BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL;
+ REG_BLDALPHA = BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]);
gTasks[taskId].data[0] = spriteId;
- gTasks[taskId].func = sub_812F238;
+ gTasks[taskId].func = AnimTask_RolePlaySilhouetteStep1;
}
-#else
-NAKED
-void sub_812EFC8(u8 taskId)
-{
- asm(".syntax unified\n\
- .equ REG_BLDCNT, 0x4000050\n\
- .equ REG_BLDALPHA, 0x4000052\n\
- push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, 0x18\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0x10]\n\
- movs r0, 0\n\
- bl GetAnimBattlerSpriteId\n\
- bl IsContest\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0812F004\n\
- movs r0, 0x1\n\
- str r0, [sp, 0x14]\n\
- ldr r0, _0812F000 @ =gSharedMem + 0x19348\n\
- ldr r1, [r0, 0x10]\n\
- mov r9, r1\n\
- ldr r2, [r0, 0xC]\n\
- mov r8, r2\n\
- ldrh r6, [r0, 0x2]\n\
- movs r3, 0x14\n\
- b _0812F13C\n\
- .align 2, 0\n\
-_0812F000: .4byte gSharedMem + 0x19348\n\
-_0812F004:\n\
- ldr r0, _0812F070 @ =gBattleAnimAttacker\n\
- ldrb r0, [r0]\n\
- bl GetBattlerSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0812F0AC\n\
- movs r0, 0\n\
- str r0, [sp, 0x14]\n\
- ldr r6, _0812F074 @ =gBattlerPartyIndexes\n\
- ldr r4, _0812F078 @ =gBattleAnimTarget\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- movs r5, 0x64\n\
- muls r0, r5\n\
- ldr r7, _0812F07C @ =gPlayerParty\n\
- adds r0, r7\n\
- movs r1, 0\n\
- bl GetMonData\n\
- mov r9, r0\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- muls r0, r5\n\
- adds r0, r7\n\
- movs r1, 0x1\n\
- bl GetMonData\n\
- mov r8, r0\n\
- ldrb r2, [r4]\n\
- lsls r1, r2, 2\n\
- ldr r0, _0812F080 @ =gSharedMem + 0x17800\n\
- adds r1, r0\n\
- ldrh r0, [r1, 0x2]\n\
- cmp r0, 0\n\
- bne _0812F0A4\n\
- adds r0, r2, 0\n\
- bl GetBattlerSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0812F084\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- muls r0, r5\n\
- adds r0, r7\n\
- b _0812F092\n\
- .align 2, 0\n\
-_0812F070: .4byte gBattleAnimAttacker\n\
-_0812F074: .4byte gBattlerPartyIndexes\n\
-_0812F078: .4byte gBattleAnimTarget\n\
-_0812F07C: .4byte gPlayerParty\n\
-_0812F080: .4byte gSharedMem + 0x17800\n\
-_0812F084:\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- muls r0, r5\n\
- ldr r1, _0812F0A0 @ =gEnemyParty\n\
- adds r0, r1\n\
-_0812F092:\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- b _0812F0A6\n\
- .align 2, 0\n\
-_0812F0A0: .4byte gEnemyParty\n\
-_0812F0A4:\n\
- ldrh r6, [r1, 0x2]\n\
-_0812F0A6:\n\
- movs r1, 0x14\n\
- mov r10, r1\n\
- b _0812F13E\n\
-_0812F0AC:\n\
- movs r2, 0x1\n\
- str r2, [sp, 0x14]\n\
- ldr r6, _0812F10C @ =gBattlerPartyIndexes\n\
- ldr r4, _0812F110 @ =gBattleAnimTarget\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- movs r5, 0x64\n\
- muls r0, r5\n\
- ldr r7, _0812F114 @ =gEnemyParty\n\
- adds r0, r7\n\
- movs r1, 0\n\
- bl GetMonData\n\
- mov r9, r0\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- muls r0, r5\n\
- adds r0, r7\n\
- movs r1, 0x1\n\
- bl GetMonData\n\
- mov r8, r0\n\
- ldrb r2, [r4]\n\
- lsls r1, r2, 2\n\
- ldr r0, _0812F118 @ =gSharedMem + 0x17800\n\
- adds r1, r0\n\
- ldrh r0, [r1, 0x2]\n\
- cmp r0, 0\n\
- bne _0812F138\n\
- adds r0, r2, 0\n\
- bl GetBattlerSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0812F120\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- muls r0, r5\n\
- ldr r1, _0812F11C @ =gPlayerParty\n\
- adds r0, r1\n\
- b _0812F12C\n\
- .align 2, 0\n\
-_0812F10C: .4byte gBattlerPartyIndexes\n\
-_0812F110: .4byte gBattleAnimTarget\n\
-_0812F114: .4byte gEnemyParty\n\
-_0812F118: .4byte gSharedMem + 0x17800\n\
-_0812F11C: .4byte gPlayerParty\n\
-_0812F120:\n\
- ldrb r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- muls r0, r5\n\
- adds r0, r7\n\
-_0812F12C:\n\
- movs r1, 0xB\n\
- bl GetMonData\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- b _0812F13A\n\
-_0812F138:\n\
- ldrh r6, [r1, 0x2]\n\
-_0812F13A:\n\
- ldr r3, _0812F218 @ =0x0000ffec\n\
-_0812F13C:\n\
- mov r10, r3\n\
-_0812F13E:\n\
- ldr r0, _0812F21C @ =gBattleAnimAttacker\n\
- ldrb r0, [r0]\n\
- bl sub_8079ED4\n\
- lsls r0, 24\n\
- lsrs r7, r0, 24\n\
- ldr r5, _0812F21C @ =gBattleAnimAttacker\n\
- ldrb r0, [r5]\n\
- movs r1, 0\n\
- bl GetBattlerSpriteCoord\n\
- adds r4, r0, 0\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- ldrb r0, [r5]\n\
- movs r1, 0x1\n\
- bl GetBattlerSpriteCoord\n\
- lsls r0, 24\n\
- mov r2, r10\n\
- lsls r1, r2, 16\n\
- asrs r1, 16\n\
- adds r4, r1\n\
- lsls r4, 16\n\
- asrs r4, 16\n\
- lsrs r0, 24\n\
- str r0, [sp]\n\
- movs r0, 0x5\n\
- str r0, [sp, 0x4]\n\
- mov r3, r9\n\
- str r3, [sp, 0x8]\n\
- mov r0, r8\n\
- str r0, [sp, 0xC]\n\
- adds r0, r6, 0\n\
- ldr r1, [sp, 0x14]\n\
- movs r2, 0\n\
- adds r3, r4, 0\n\
- bl sub_8079F44\n\
- adds r6, r0, 0\n\
- lsls r6, 24\n\
- lsrs r6, 24\n\
- ldr r0, _0812F220 @ =gSprites\n\
- lsls r5, r6, 4\n\
- adds r5, r6\n\
- lsls r5, 2\n\
- adds r5, r0\n\
- movs r0, 0x3\n\
- ands r7, r0\n\
- lsls r7, 2\n\
- mov r8, r7\n\
- ldrb r0, [r5, 0x5]\n\
- movs r4, 0xD\n\
- negs r4, r4\n\
- adds r1, r4, 0\n\
- ands r1, r0\n\
- mov r2, r8\n\
- orrs r1, r2\n\
- strb r1, [r5, 0x5]\n\
- ldrb r2, [r5, 0x1]\n\
- adds r0, r4, 0\n\
- ands r0, r2\n\
- movs r2, 0x4\n\
- orrs r0, r2\n\
- strb r0, [r5, 0x1]\n\
- ldr r0, _0812F224 @ =0x00007fff\n\
- lsrs r1, 4\n\
- lsls r1, 4\n\
- movs r3, 0x80\n\
- lsls r3, 1\n\
- adds r2, r3, 0\n\
- orrs r1, r2\n\
- movs r2, 0x20\n\
- bl FillPalette\n\
- ldrb r0, [r5, 0x5]\n\
- ands r4, r0\n\
- mov r0, r8\n\
- orrs r4, r0\n\
- strb r4, [r5, 0x5]\n\
- ldr r1, _0812F228 @ =REG_BLDCNT\n\
- movs r2, 0xFD\n\
- lsls r2, 6\n\
- adds r0, r2, 0\n\
- strh r0, [r1]\n\
- ldr r3, _0812F22C @ =REG_BLDALPHA\n\
- ldr r0, _0812F230 @ =gTasks\n\
- ldr r2, [sp, 0x10]\n\
- lsls r1, r2, 2\n\
- adds r1, r2\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- ldrh r2, [r1, 0xA]\n\
- movs r0, 0x10\n\
- subs r0, r2\n\
- lsls r0, 8\n\
- orrs r0, r2\n\
- strh r0, [r3]\n\
- strh r6, [r1, 0x8]\n\
- ldr r0, _0812F234 @ =sub_812F238\n\
- str r0, [r1]\n\
- add sp, 0x18\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0812F218: .4byte 0x0000ffec\n\
-_0812F21C: .4byte gBattleAnimAttacker\n\
-_0812F220: .4byte gSprites\n\
-_0812F224: .4byte 0x00007fff\n\
-_0812F228: .4byte REG_BLDCNT\n\
-_0812F22C: .4byte REG_BLDALPHA\n\
-_0812F230: .4byte gTasks\n\
-_0812F234: .4byte sub_812F238\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
-/*static*/ void sub_812F238(u8 taskId)
+static void AnimTask_RolePlaySilhouetteStep1(u8 taskId)
{
if (gTasks[taskId].data[10]++ > 1)
{
@@ -3579,7 +3286,7 @@ static void sub_812F290(u8 taskId)
if (++gTasks[taskId].data[12] == 9)
{
sub_8079098(&gSprites[spriteId]);
- sub_807A0F4(&gSprites[spriteId]);
+ DestroySpriteAndFreeResources_(&gSprites[spriteId]);
gTasks[taskId].func = sub_8078634;
}
}
@@ -3765,7 +3472,7 @@ void sub_812F724(u8 taskId)
struct Task *task = &gTasks[taskId];
task->data[0] = 0;
task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
- sub_80798F4(&gTasks[taskId], task->data[15], &gUnknown_08402750);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], task->data[15], &gUnknown_08402750);
task->func = sub_812F76C;
}
@@ -3794,7 +3501,7 @@ static void sub_812F76C(u8 taskId)
gSprites[task->data[15]].pos2.x = 0;
}
- if (!sub_807992C(&gTasks[taskId]))
+ if (!RunAffineAnimFromTaskData(&gTasks[taskId]))
DestroyAnimVisualTask(taskId);
}
@@ -3844,7 +3551,7 @@ static void sub_812F8DC(struct Sprite *sprite)
sprite->data[2]++;
sprite->invisible = sprite->data[2] & 1;
if (sprite->data[2] > 3)
- move_anim_8074EE0(sprite);
+ DestroySpriteAndMatrix(sprite);
}
}
}
@@ -4019,7 +3726,7 @@ void sub_812FD7C(u8 taskId)
task->data[5] = GetBattlerSpriteCoord(battler, 1);
task->data[6] = GetBattlerSubpriority(battler);
task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
- sub_80798F4(task, task->data[15], &gUnknown_084028AC);
+ PrepareAffineAnimInTaskData(task, task->data[15], &gUnknown_084028AC);
task->func = sub_812FE20;
}
@@ -4036,7 +3743,7 @@ static void sub_812FE20(u8 taskId)
if (task->data[1] == 18)
sub_812FEB8(taskId, FALSE);
- if (!sub_807992C(task))
+ if (!RunAffineAnimFromTaskData(task))
{
if (--task->data[3] == 0)
{
@@ -4045,7 +3752,7 @@ static void sub_812FE20(u8 taskId)
else
{
task->data[1] = 0;
- sub_80798F4(task, task->data[15], &gUnknown_084028AC);
+ PrepareAffineAnimInTaskData(task, task->data[15], &gUnknown_084028AC);
}
}
break;
@@ -4214,11 +3921,11 @@ void sub_81301EC(u8 taskId)
}
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
- task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + sub_807A100(gBattleAnimAttacker, 0) / 4;
+ task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 0) / 4;
else
- task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - sub_807A100(gBattleAnimAttacker, 0) / 4;
+ task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 0) / 4;
- task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - sub_807A100(gBattleAnimAttacker, 0) / 4;
+ task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 0) / 4;
task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
task->func = sub_81302E4;
@@ -4345,7 +4052,7 @@ void sub_8130554(u8 taskId)
task->data[11] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
task->data[12] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
task->data[13] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
- task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + sub_807A100(gBattleAnimTarget, 0) / 4;
+ task->data[14] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + GetBattlerSpriteCoordAttr(gBattleAnimTarget, 0) / 4;
task->data[15] = CreateSprite(&gSpriteTemplate_84029AC, task->data[11], task->data[12], GetBattlerSubpriority(gBattleAnimTarget) - 5);
if (task->data[15] != MAX_SPRITES)
{
@@ -4424,11 +4131,11 @@ static void sub_81307B0(struct Sprite *sprite)
if (gBattleAnimArgs[1] == 0)
{
sprite->oam.matrixNum |= 0x8;
- sprite->pos1.x = sub_807A100(battler, 4) - 8;
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, 4) - 8;
}
else
{
- sprite->pos1.x = sub_807A100(battler, 5) + 8;
+ sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, 5) + 8;
}
sprite->callback = sub_813085C;
@@ -4490,7 +4197,7 @@ void sub_8130918(u8 taskId)
{
gTasks[taskId].data[0] = gBattleAnimArgs[1];
gTasks[taskId].data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
- sub_80798F4(&gTasks[taskId], gTasks[taskId].data[15], &gUnknown_084029DC);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], &gUnknown_084029DC);
gTasks[taskId].func = sub_8130970;
}
}
@@ -4508,12 +4215,12 @@ static void sub_8130970(u8 taskId)
gSprites[task->data[15]].pos2.x = -2;
}
- if (!sub_807992C(task))
+ if (!RunAffineAnimFromTaskData(task))
{
gSprites[task->data[15]].pos2.x = 0;
if (--task->data[0])
{
- sub_80798F4(&gTasks[taskId], gTasks[taskId].data[15], &gUnknown_084029DC);
+ PrepareAffineAnimInTaskData(&gTasks[taskId], gTasks[taskId].data[15], &gUnknown_084029DC);
task->data[1] = 0;
task->data[2] = 0;
}
@@ -4529,12 +4236,12 @@ static void sub_8130A2C(struct Sprite *sprite)
if (gBattleAnimArgs[0] == 0)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
- sprite->pos1.y = sub_807A100(gBattleAnimAttacker, 2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, 2);
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
- sprite->pos1.y = sub_807A100(gBattleAnimTarget, 2);
+ sprite->pos1.y = GetBattlerSpriteCoordAttr(gBattleAnimTarget, 2);
}
if (sprite->pos1.y < 8)
@@ -4789,7 +4496,7 @@ static void sub_8130F5C(struct Sprite *sprite)
if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT)
sprite->oam.matrixNum = 8;
- sprite->oam.priority = sub_8079ED4(sprite->data[7]);
+ sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);
sprite->oam.objMode = ST_OAM_OBJ_BLEND;
sprite->callback = sub_8130FE0;
}
@@ -4807,20 +4514,20 @@ static void sub_8130FE0(struct Sprite *sprite)
sprite->data[6] = 0;
case 0:
case 4:
- x = sub_807A100(sprite->data[7], 5) - 4;
- y = sub_807A100(sprite->data[7], 3) - 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4;
break;
case 1:
- x = sub_807A100(sprite->data[7], 5) - 4;
- y = sub_807A100(sprite->data[7], 2) + 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 5) - 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) + 4;
break;
case 2:
- x = sub_807A100(sprite->data[7], 4) + 4;
- y = sub_807A100(sprite->data[7], 3) - 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 3) - 4;
break;
case 3:
- x = sub_807A100(sprite->data[7], 4) + 4;
- y = sub_807A100(sprite->data[7], 2) - 4;
+ x = GetBattlerSpriteCoordAttr(sprite->data[7], 4) + 4;
+ y = GetBattlerSpriteCoordAttr(sprite->data[7], 2) - 4;
break;
case 5:
x = GetBattlerSpriteCoord(sprite->data[7], 2);
@@ -5199,3 +4906,1160 @@ static void sub_8131838(struct Sprite *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);
+}
+
+#ifdef NONMATCHING
+// 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;
+ u8 isBackPic;
+ s16 x;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ spriteId = GetAnimBattlerSpriteId(ANIM_BATTLER_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:
+ if (IsContest())
+ {
+ personality = eWRAM_19348Struct->personality;
+ otId = eWRAM_19348Struct->otId;
+ species = eWRAM_19348Struct->species;
+ subpriority = GetBattlerSubpriority(gBattleAnimAttacker);
+ isBackPic = 0;
+ x = -32;
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);
+ if (eTransformStatuses[gBattleAnimTarget].species == SPECIES_NONE)
+ species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ else
+ species = eTransformStatuses[gBattleAnimTarget].species;
+
+ subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_BATTLER_TARGET)].subpriority + 1;
+ isBackPic = 0;
+ x = 272;
+ }
+ else
+ {
+ personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_PERSONALITY);
+ otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_OT_ID);
+ if (eTransformStatuses[gBattleAnimTarget].species == SPECIES_NONE)
+ species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
+ else
+ species = eTransformStatuses[gBattleAnimTarget].species;
+
+ subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_BATTLER_TARGET)].subpriority - 1;
+ isBackPic = 1;
+ x = -32;
+ }
+ }
+
+ spriteId2 = sub_8079F44(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId);
+ if (eTransformStatuses[gBattleAnimTarget].species != 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_BATTLER_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_BATTLER_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;
+ }
+}
+#else
+NAKED
+void AnimTask_SnatchOpposingMonMove(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x14\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ ldr r1, _08131974 @ =gTasks\n\
+ lsls r0, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ movs r1, 0x8\n\
+ ldrsh r0, [r0, r1]\n\
+ cmp r0, 0x4\n\
+ bls _0813196A\n\
+ b _08131EA0\n\
+_0813196A:\n\
+ lsls r0, 2\n\
+ ldr r1, _08131978 @ =_0813197C\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08131974: .4byte gTasks\n\
+_08131978: .4byte _0813197C\n\
+ .align 2, 0\n\
+_0813197C:\n\
+ .4byte _08131990\n\
+ .4byte _08131A44\n\
+ .4byte _08131C20\n\
+ .4byte _08131D40\n\
+ .4byte _08131DC4\n\
+_08131990:\n\
+ movs r0, 0\n\
+ bl GetAnimBattlerSpriteId\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ ldr r1, _081319DC @ =gTasks\n\
+ mov r2, r8\n\
+ lsls r4, r2, 2\n\
+ adds r0, r4, r2\n\
+ lsls r0, 3\n\
+ adds r6, r0, r1\n\
+ movs r3, 0x80\n\
+ lsls r3, 4\n\
+ adds r0, r3, 0\n\
+ ldrh r1, [r6, 0xA]\n\
+ adds r0, r1\n\
+ strh r0, [r6, 0xA]\n\
+ ldr r0, _081319E0 @ =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ mov r9, r4\n\
+ cmp r0, 0\n\
+ bne _081319E8\n\
+ ldr r2, _081319E4 @ =gSprites\n\
+ lsls r3, r7, 4\n\
+ adds r1, r3, r7\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ ldrh r0, [r6, 0xA]\n\
+ lsls r0, 16\n\
+ asrs r0, 24\n\
+ ldrh r4, [r1, 0x24]\n\
+ adds r0, r4\n\
+ strh r0, [r1, 0x24]\n\
+ b _08131A02\n\
+ .align 2, 0\n\
+_081319DC: .4byte gTasks\n\
+_081319E0: .4byte gBattleAnimAttacker\n\
+_081319E4: .4byte gSprites\n\
+_081319E8:\n\
+ ldr r3, _08131A3C @ =gSprites\n\
+ lsls r4, r7, 4\n\
+ adds r2, r4, r7\n\
+ lsls r2, 2\n\
+ adds r2, r3\n\
+ ldrh r1, [r6, 0xA]\n\
+ lsls r1, 16\n\
+ asrs r1, 24\n\
+ ldrh r0, [r2, 0x24]\n\
+ subs r0, r1\n\
+ strh r0, [r2, 0x24]\n\
+ adds r2, r3, 0\n\
+ adds r3, r4, 0\n\
+_08131A02:\n\
+ ldr r1, _08131A40 @ =gTasks\n\
+ mov r0, r9\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r4, r0, r1\n\
+ ldrb r0, [r4, 0xA]\n\
+ strh r0, [r4, 0xA]\n\
+ adds r1, r3, r7\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ ldrh r0, [r1, 0x24]\n\
+ ldrh r1, [r1, 0x20]\n\
+ adds r0, r1\n\
+ lsls r0, 16\n\
+ movs r1, 0x80\n\
+ lsls r1, 14\n\
+ adds r0, r1\n\
+ movs r1, 0x98\n\
+ lsls r1, 17\n\
+ cmp r0, r1\n\
+ bhi _08131A2E\n\
+ b _08131EA0\n\
+_08131A2E:\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0xA]\n\
+ ldrh r0, [r4, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x8]\n\
+ b _08131EA0\n\
+ .align 2, 0\n\
+_08131A3C: .4byte gSprites\n\
+_08131A40: .4byte gTasks\n\
+_08131A44:\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08131A74\n\
+ ldr r0, _08131A6C @ =gSharedMem + 0x19348\n\
+ ldr r2, [r0, 0x8]\n\
+ mov r10, r2\n\
+ ldr r3, [r0, 0xC]\n\
+ mov r9, r3\n\
+ ldrh r5, [r0]\n\
+ ldr r0, _08131A70 @ =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSubpriority\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ movs r7, 0\n\
+ b _08131B92\n\
+ .align 2, 0\n\
+_08131A6C: .4byte gSharedMem + 0x19348\n\
+_08131A70: .4byte gBattleAnimAttacker\n\
+_08131A74:\n\
+ ldr r4, _08131AD4 @ =gBattleAnimAttacker\n\
+ ldrb r0, [r4]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08131B10\n\
+ ldr r7, _08131AD8 @ =gBattlerPartyIndexes\n\
+ ldrb r0, [r4]\n\
+ lsls r0, 1\n\
+ adds r0, r7\n\
+ ldrh r0, [r0]\n\
+ movs r6, 0x64\n\
+ muls r0, r6\n\
+ ldr r5, _08131ADC @ =gPlayerParty\n\
+ adds r0, r5\n\
+ movs r1, 0\n\
+ bl GetMonData\n\
+ mov r10, r0\n\
+ ldrb r0, [r4]\n\
+ lsls r0, 1\n\
+ adds r0, r7\n\
+ ldrh r0, [r0]\n\
+ muls r0, r6\n\
+ adds r0, r5\n\
+ movs r1, 0x1\n\
+ bl GetMonData\n\
+ mov r9, r0\n\
+ ldrb r2, [r4]\n\
+ lsls r1, r2, 2\n\
+ ldr r0, _08131AE0 @ =gSharedMem + 0x17800\n\
+ adds r1, r0\n\
+ ldrh r0, [r1, 0x2]\n\
+ cmp r0, 0\n\
+ bne _08131AE4\n\
+ lsls r0, r2, 1\n\
+ adds r0, r7\n\
+ ldrh r0, [r0]\n\
+ muls r0, r6\n\
+ adds r0, r5\n\
+ movs r1, 0xB\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ b _08131AE6\n\
+ .align 2, 0\n\
+_08131AD4: .4byte gBattleAnimAttacker\n\
+_08131AD8: .4byte gBattlerPartyIndexes\n\
+_08131ADC: .4byte gPlayerParty\n\
+_08131AE0: .4byte gSharedMem + 0x17800\n\
+_08131AE4:\n\
+ ldrh r5, [r1, 0x2]\n\
+_08131AE6:\n\
+ movs r0, 0x1\n\
+ bl GetAnimBattlerSpriteId\n\
+ ldr r2, _08131B0C @ =gSprites\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r0, 4\n\
+ adds r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ adds r1, 0x43\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ movs r7, 0\n\
+ movs r6, 0x88\n\
+ lsls r6, 1\n\
+ b _08131B94\n\
+ .align 2, 0\n\
+_08131B0C: .4byte gSprites\n\
+_08131B10:\n\
+ ldr r7, _08131B64 @ =gBattlerPartyIndexes\n\
+ ldrb r0, [r4]\n\
+ lsls r0, 1\n\
+ adds r0, r7\n\
+ ldrh r0, [r0]\n\
+ movs r6, 0x64\n\
+ muls r0, r6\n\
+ ldr r5, _08131B68 @ =gEnemyParty\n\
+ adds r0, r5\n\
+ movs r1, 0\n\
+ bl GetMonData\n\
+ mov r10, r0\n\
+ ldrb r0, [r4]\n\
+ lsls r0, 1\n\
+ adds r0, r7\n\
+ ldrh r0, [r0]\n\
+ muls r0, r6\n\
+ adds r0, r5\n\
+ movs r1, 0x1\n\
+ bl GetMonData\n\
+ mov r9, r0\n\
+ ldrb r2, [r4]\n\
+ lsls r1, r2, 2\n\
+ ldr r0, _08131B6C @ =gSharedMem + 0x17800\n\
+ adds r1, r0\n\
+ ldrh r0, [r1, 0x2]\n\
+ cmp r0, 0\n\
+ bne _08131B70\n\
+ lsls r0, r2, 1\n\
+ adds r0, r7\n\
+ ldrh r0, [r0]\n\
+ muls r0, r6\n\
+ adds r0, r5\n\
+ movs r1, 0xB\n\
+ bl GetMonData\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ b _08131B72\n\
+ .align 2, 0\n\
+_08131B64: .4byte gBattlerPartyIndexes\n\
+_08131B68: .4byte gEnemyParty\n\
+_08131B6C: .4byte gSharedMem + 0x17800\n\
+_08131B70:\n\
+ ldrh r5, [r1, 0x2]\n\
+_08131B72:\n\
+ movs r0, 0x1\n\
+ bl GetAnimBattlerSpriteId\n\
+ ldr r2, _08131C04 @ =gSprites\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r0, 4\n\
+ adds r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ adds r1, 0x43\n\
+ ldrb r0, [r1]\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ movs r7, 0x1\n\
+_08131B92:\n\
+ ldr r6, _08131C08 @ =0x0000ffe0\n\
+_08131B94:\n\
+ ldr r0, _08131C0C @ =gBattleAnimTarget\n\
+ ldrb r0, [r0]\n\
+ movs r1, 0x1\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r3, r6, 16\n\
+ asrs r3, 16\n\
+ str r0, [sp]\n\
+ str r4, [sp, 0x4]\n\
+ mov r4, r10\n\
+ str r4, [sp, 0x8]\n\
+ mov r0, r9\n\
+ str r0, [sp, 0xC]\n\
+ adds r0, r5, 0\n\
+ adds r1, r7, 0\n\
+ movs r2, 0\n\
+ bl sub_8079F44\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ ldr r0, _08131C10 @ =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ ldr r1, _08131C14 @ =gSharedMem + 0x17800\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x2]\n\
+ cmp r0, 0\n\
+ beq _08131BF2\n\
+ ldr r1, _08131C04 @ =gSprites\n\
+ lsls r0, r5, 4\n\
+ adds r0, r5\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x5]\n\
+ lsrs r0, 4\n\
+ lsls r0, 4\n\
+ movs r2, 0x80\n\
+ lsls r2, 1\n\
+ adds r1, r2, 0\n\
+ orrs r0, r1\n\
+ ldr r3, _08131C18 @ =0x00007fff\n\
+ movs r1, 0x10\n\
+ movs r2, 0x6\n\
+ bl BlendPalette\n\
+_08131BF2:\n\
+ ldr r0, _08131C1C @ =gTasks\n\
+ mov r3, r8\n\
+ lsls r1, r3, 2\n\
+ add r1, r8\n\
+ lsls r1, 3\n\
+ adds r1, r0\n\
+ strh r5, [r1, 0x26]\n\
+ b _08131DB6\n\
+ .align 2, 0\n\
+_08131C04: .4byte gSprites\n\
+_08131C08: .4byte 0x0000ffe0\n\
+_08131C0C: .4byte gBattleAnimTarget\n\
+_08131C10: .4byte gBattleAnimAttacker\n\
+_08131C14: .4byte gSharedMem + 0x17800\n\
+_08131C18: .4byte 0x00007fff\n\
+_08131C1C: .4byte gTasks\n\
+_08131C20:\n\
+ ldr r1, _08131C6C @ =gTasks\n\
+ mov r0, r8\n\
+ lsls r4, r0, 2\n\
+ adds r0, r4, r0\n\
+ lsls r0, 3\n\
+ adds r6, r0, r1\n\
+ ldrh r0, [r6, 0x26]\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r1, 0x80\n\
+ lsls r1, 4\n\
+ adds r0, r1, 0\n\
+ ldrh r2, [r6, 0xA]\n\
+ adds r0, r2\n\
+ strh r0, [r6, 0xA]\n\
+ ldr r0, _08131C70 @ =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ mov r9, r4\n\
+ cmp r0, 0\n\
+ bne _08131C78\n\
+ ldr r3, _08131C74 @ =gSprites\n\
+ lsls r4, r5, 4\n\
+ adds r2, r4, r5\n\
+ lsls r2, 2\n\
+ adds r2, r3\n\
+ ldrh r1, [r6, 0xA]\n\
+ lsls r1, 16\n\
+ asrs r1, 24\n\
+ ldrh r0, [r2, 0x24]\n\
+ subs r0, r1\n\
+ strh r0, [r2, 0x24]\n\
+ adds r2, r3, 0\n\
+ adds r3, r4, 0\n\
+ b _08131C8E\n\
+ .align 2, 0\n\
+_08131C6C: .4byte gTasks\n\
+_08131C70: .4byte gBattleAnimAttacker\n\
+_08131C74: .4byte gSprites\n\
+_08131C78:\n\
+ ldr r2, _08131CDC @ =gSprites\n\
+ lsls r3, r5, 4\n\
+ adds r1, r3, r5\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ ldrh r0, [r6, 0xA]\n\
+ lsls r0, 16\n\
+ asrs r0, 24\n\
+ ldrh r4, [r1, 0x24]\n\
+ adds r0, r4\n\
+ strh r0, [r1, 0x24]\n\
+_08131C8E:\n\
+ ldr r1, _08131CE0 @ =gTasks\n\
+ mov r0, r9\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r6, r0, r1\n\
+ ldrb r0, [r6, 0xA]\n\
+ strh r0, [r6, 0xA]\n\
+ adds r1, r3, r5\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ ldrh r0, [r1, 0x24]\n\
+ ldrh r1, [r1, 0x20]\n\
+ adds r0, r1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ movs r1, 0x24\n\
+ ldrsh r0, [r6, r1]\n\
+ cmp r0, 0\n\
+ bne _08131D0E\n\
+ ldr r0, _08131CE4 @ =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08131CEC\n\
+ lsls r4, r5, 16\n\
+ asrs r4, 16\n\
+ ldr r0, _08131CE8 @ =gBattleAnimTarget\n\
+ ldrb r0, [r0]\n\
+ movs r1, 0\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r4, r0\n\
+ bge _08131D0E\n\
+ b _08131D02\n\
+ .align 2, 0\n\
+_08131CDC: .4byte gSprites\n\
+_08131CE0: .4byte gTasks\n\
+_08131CE4: .4byte gBattleAnimAttacker\n\
+_08131CE8: .4byte gBattleAnimTarget\n\
+_08131CEC:\n\
+ lsls r4, r5, 16\n\
+ asrs r4, 16\n\
+ ldr r0, _08131D30 @ =gBattleAnimTarget\n\
+ ldrb r0, [r0]\n\
+ movs r1, 0\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r4, r0\n\
+ ble _08131D0E\n\
+_08131D02:\n\
+ ldrh r0, [r6, 0x24]\n\
+ adds r0, 0x1\n\
+ strh r0, [r6, 0x24]\n\
+ ldr r1, _08131D34 @ =gBattleAnimArgs\n\
+ ldr r0, _08131D38 @ =0x0000ffff\n\
+ strh r0, [r1, 0xE]\n\
+_08131D0E:\n\
+ lsls r0, r5, 16\n\
+ movs r2, 0x80\n\
+ lsls r2, 14\n\
+ adds r0, r2\n\
+ movs r1, 0x98\n\
+ lsls r1, 17\n\
+ cmp r0, r1\n\
+ bhi _08131D20\n\
+ b _08131EA0\n\
+_08131D20:\n\
+ ldr r0, _08131D3C @ =gTasks\n\
+ mov r1, r9\n\
+ add r1, r8\n\
+ lsls r1, 3\n\
+ adds r1, r0\n\
+ movs r0, 0\n\
+ strh r0, [r1, 0xA]\n\
+ b _08131DB6\n\
+ .align 2, 0\n\
+_08131D30: .4byte gBattleAnimTarget\n\
+_08131D34: .4byte gBattleAnimArgs\n\
+_08131D38: .4byte 0x0000ffff\n\
+_08131D3C: .4byte gTasks\n\
+_08131D40:\n\
+ movs r0, 0\n\
+ bl GetAnimBattlerSpriteId\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ ldr r1, _08131D8C @ =gTasks\n\
+ mov r3, r8\n\
+ lsls r4, r3, 2\n\
+ adds r0, r4, r3\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x26]\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ lsls r0, r5, 4\n\
+ adds r0, r5\n\
+ lsls r0, 2\n\
+ ldr r5, _08131D90 @ =gSprites\n\
+ adds r0, r5\n\
+ bl DestroySpriteAndFreeResources_\n\
+ ldr r0, _08131D94 @ =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ mov r9, r4\n\
+ cmp r0, 0\n\
+ bne _08131D98\n\
+ lsls r1, r7, 4\n\
+ adds r1, r7\n\
+ lsls r1, 2\n\
+ adds r1, r5\n\
+ ldrh r0, [r1, 0x20]\n\
+ negs r0, r0\n\
+ subs r0, 0x20\n\
+ strh r0, [r1, 0x24]\n\
+ b _08131DAC\n\
+ .align 2, 0\n\
+_08131D8C: .4byte gTasks\n\
+_08131D90: .4byte gSprites\n\
+_08131D94: .4byte gBattleAnimAttacker\n\
+_08131D98:\n\
+ lsls r0, r7, 4\n\
+ adds r0, r7\n\
+ lsls r0, 2\n\
+ adds r0, r5\n\
+ ldrh r2, [r0, 0x20]\n\
+ movs r4, 0x88\n\
+ lsls r4, 1\n\
+ adds r1, r4, 0\n\
+ subs r1, r2\n\
+ strh r1, [r0, 0x24]\n\
+_08131DAC:\n\
+ ldr r0, _08131DC0 @ =gTasks\n\
+ mov r1, r9\n\
+ add r1, r8\n\
+ lsls r1, 3\n\
+ adds r1, r0\n\
+_08131DB6:\n\
+ ldrh r0, [r1, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1, 0x8]\n\
+ b _08131EA0\n\
+ .align 2, 0\n\
+_08131DC0: .4byte gTasks\n\
+_08131DC4:\n\
+ movs r0, 0\n\
+ bl GetAnimBattlerSpriteId\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ ldr r1, _08131E38 @ =gTasks\n\
+ mov r0, r8\n\
+ lsls r4, r0, 2\n\
+ adds r0, r4, r0\n\
+ lsls r0, 3\n\
+ adds r2, r0, r1\n\
+ movs r1, 0x80\n\
+ lsls r1, 4\n\
+ adds r0, r1, 0\n\
+ ldrh r3, [r2, 0xA]\n\
+ adds r0, r3\n\
+ strh r0, [r2, 0xA]\n\
+ ldr r0, _08131E3C @ =gBattleAnimAttacker\n\
+ mov r10, r0\n\
+ ldrb r0, [r0]\n\
+ str r2, [sp, 0x10]\n\
+ bl GetBattlerSide\n\
+ lsls r0, 24\n\
+ mov r9, r4\n\
+ ldr r2, [sp, 0x10]\n\
+ cmp r0, 0\n\
+ bne _08131E44\n\
+ ldr r1, _08131E40 @ =gSprites\n\
+ lsls r5, r7, 4\n\
+ adds r0, r5, r7\n\
+ lsls r0, 2\n\
+ adds r6, r0, r1\n\
+ ldrh r0, [r2, 0xA]\n\
+ lsls r0, 16\n\
+ asrs r0, 24\n\
+ ldrh r1, [r6, 0x24]\n\
+ adds r0, r1\n\
+ strh r0, [r6, 0x24]\n\
+ movs r2, 0x24\n\
+ ldrsh r4, [r6, r2]\n\
+ movs r3, 0x20\n\
+ ldrsh r0, [r6, r3]\n\
+ adds r4, r0\n\
+ mov r1, r10\n\
+ ldrb r0, [r1]\n\
+ movs r1, 0\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r3, r5, 0\n\
+ cmp r4, r0\n\
+ blt _08131E7C\n\
+ movs r2, 0\n\
+ strh r2, [r6, 0x24]\n\
+ b _08131E7C\n\
+ .align 2, 0\n\
+_08131E38: .4byte gTasks\n\
+_08131E3C: .4byte gBattleAnimAttacker\n\
+_08131E40: .4byte gSprites\n\
+_08131E44:\n\
+ ldr r1, _08131EB0 @ =gSprites\n\
+ lsls r5, r7, 4\n\
+ adds r0, r5, r7\n\
+ lsls r0, 2\n\
+ adds r6, r0, r1\n\
+ ldrh r1, [r2, 0xA]\n\
+ lsls r1, 16\n\
+ asrs r1, 24\n\
+ ldrh r0, [r6, 0x24]\n\
+ subs r0, r1\n\
+ strh r0, [r6, 0x24]\n\
+ movs r3, 0x24\n\
+ ldrsh r4, [r6, r3]\n\
+ movs r1, 0x20\n\
+ ldrsh r0, [r6, r1]\n\
+ adds r4, r0\n\
+ mov r2, r10\n\
+ ldrb r0, [r2]\n\
+ movs r1, 0\n\
+ bl GetBattlerSpriteCoord\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r3, r5, 0\n\
+ cmp r4, r0\n\
+ bgt _08131E7C\n\
+ movs r4, 0\n\
+ strh r4, [r6, 0x24]\n\
+_08131E7C:\n\
+ ldr r1, _08131EB4 @ =gTasks\n\
+ mov r0, r9\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldrb r1, [r0, 0xA]\n\
+ strh r1, [r0, 0xA]\n\
+ ldr r1, _08131EB0 @ =gSprites\n\
+ adds r0, r3, r7\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ movs r1, 0x24\n\
+ ldrsh r0, [r0, r1]\n\
+ cmp r0, 0\n\
+ bne _08131EA0\n\
+ mov r0, r8\n\
+ bl DestroyAnimVisualTask\n\
+_08131EA0:\n\
+ add sp, 0x14\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08131EB0: .4byte gSprites\n\
+_08131EB4: .4byte gTasks\n\
+ .syntax divided");
+}
+#endif // NONMATCHING
+
+void sub_8131EB8(struct Sprite *sprite)
+{
+ switch (sprite->data[7])
+ {
+ case 0:
+ if (gBattleAnimArgs[7] == -1)
+ {
+ PlaySE12WithPanning(SE_W233, BattleAnimAdjustPanning(63));
+ sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 16;
+ sprite->data[0] = -32;
+ sprite->data[7]++;
+ sprite->invisible = 0;
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT && !IsContest())
+ sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_BATTLER_TARGET)].subpriority - 1;
+ }
+ else
+ {
+ sprite->invisible = 1;
+ }
+ 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 = gBankSpriteIds[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 = gBankSpriteIds[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 = gBankSpriteIds[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_BATTLER_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)
+{
+ // These two cases are identical.
+ 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;
+ REG_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]++;
+ REG_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]++;
+ REG_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], gSlackOffSquishAffineAnimCmds);
+ 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);
+} \ No newline at end of file