summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/battle_anim_80CA710.c1415
1 files changed, 766 insertions, 649 deletions
diff --git a/src/battle_anim_80CA710.c b/src/battle_anim_80CA710.c
index 74f28c83e..76c74c89a 100755
--- a/src/battle_anim_80CA710.c
+++ b/src/battle_anim_80CA710.c
@@ -6,6 +6,7 @@
#include "palette.h"
#include "rng.h"
#include "rom_8077ABC.h"
+#include "songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
@@ -22,8 +23,10 @@ extern u8 gBattleAnimEnemyMonIndex;
extern struct SpriteTemplate gSpriteTemplate_83D631C;
extern struct SpriteTemplate gSpriteTemplate_83D6884;
extern struct SpriteTemplate gSpriteTemplate_83D74BC;
+extern struct SpriteTemplate gSpriteTemplate_83D75AC;
extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FC8;
extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FF8;
+extern struct AffineAnimFrameCmd gUnknown_083D76F4;
extern s16 gUnknown_03000728[];
extern s8 gUnknown_083D680C[11][3];
extern u16 gUnknown_083D6984[];
@@ -100,6 +103,15 @@ void sub_80CF310(struct Sprite* sprite);
void sub_80CF490(struct Sprite* sprite);
void sub_80CF4B8(struct Sprite* sprite);
void sub_80CF6B4(struct Sprite* sprite);
+void sub_80CFE2C(struct Sprite* sprite);
+void sub_80CFF68(struct Sprite* sprite);
+void sub_80D0030(struct Sprite* sprite);
+void sub_80D00B4(struct Sprite* sprite);
+void sub_80D020C(struct Sprite* sprite);
+void sub_80D02D0(struct Sprite* sprite);
+void sub_80D0344(struct Sprite* sprite);
+void sub_80D03A8(struct Sprite* sprite);
+void sub_80D0704(struct Sprite* sprite);
s16 sub_80CC338(struct Sprite* sprite);
@@ -117,6 +129,9 @@ void sub_8078650(struct Sprite *sprite);
void sub_8078394(struct Sprite *sprite);
void sub_80785E4(struct Sprite *sprite);
void sub_8078278(struct Sprite *sprite);
+void sub_8078C00(struct Sprite *sprite);
+void sub_8078114(struct Sprite *sprite);
+
extern void sub_8043DB0();
extern void sub_8043DFC();
@@ -135,6 +150,8 @@ s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1);
void obj_delete_but_dont_free_vram(struct Sprite *sprite);
s16 sub_81174E0(s16 a);
s16 sub_81174C4(s16 a, s16 b);
+void sub_8079108(u16 a1, bool8 a2);
+void sub_80798F4(struct Task *task, u8 a2, void *a3);
void move_anim_8074EE0(struct Sprite *sprite);
bool8 sub_8078718(struct Sprite *sprite);
@@ -148,9 +165,13 @@ void sub_80CDD20(u8 taskId);
void sub_80CE4D4(u8 taskId);
void sub_80CE910(u8 taskId);
void sub_80CF514(u8 taskId);
-
+void sub_80D0428(u8 taskId);
+void sub_80D04E0(u8 taskId);
+void sub_80D07AC(u8 taskId);
void sub_80CC358(struct Task* task, u8 taskId);
+void sub_80D0614(struct Task* task, u8 taskId);
+
void sub_80CEBC4(s16 a, s16 b, s16* c, s16* d, s8 e);
void sub_80CA710(struct Sprite* sprite)
@@ -876,126 +897,34 @@ void sub_80CB7EC(struct Sprite* sprite, s16 c)
sprite->data7 = c;
}
-#ifdef NONMATCHING
bool8 sub_80CB814(struct Sprite* sprite)
{
- s32 r10 = (u8)(sprite->data5 >> 8);
- s32 r9 = (u8)sprite->data5;
+ u16 r10 = (u8)(sprite->data5 >> 8);
+ u16 r9 = (u8)sprite->data5;
s32 r2 = (u8)(sprite->data6 >> 8);
- s16 r4 = (u8)sprite->data6;
- u16 r6 = sprite->data7 >> 8;
+ s32 r4 = (u8)sprite->data6;
+ s16 r6 = sprite->data7 >> 8;
s16 r3 = sprite->data7 & 0xFF;
+ s16 r4_2;
+ s16 r0;
s32 var1;
s32 var2;
-
+
if (r2 == 0)
r2 = -32;
else if (r2 == 255)
r2 = 0x110;
-
- r4 -= r9;
- var1 = (r2 - r10) * r3 / r6;
- var2 = r4 * r3 / r6;
+ r4_2 = r4 - r9;
+ r0 = r2 - r10;
+ var1 = r0 * r3 / r6;
+ var2 = r4_2 * r3 / r6;
sprite->pos1.x = var1 + r10;
- sprite->pos2.y = var2 + r9;
- r3++;
- if ((u16)r3 == r6)
+ sprite->pos1.y = var2 + r9;
+ if (++r3 == r6)
return TRUE;
- sprite->data7 = r3 | (r6 << 8);
+ sprite->data7 = (r6 << 8) | r3;
return FALSE;
}
-#else
-__attribute__((naked))
-bool8 sub_80CB814(struct Sprite* sprite)
-{
- 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\
- mov r8, r0\n\
- ldrh r0, [r0, 0x38]\n\
- lsrs r1, r0, 8\n\
- mov r10, r1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- mov r1, r8\n\
- ldrh r0, [r1, 0x3A]\n\
- lsrs r2, r0, 8\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- ldrh r1, [r1, 0x3C]\n\
- lsls r0, r1, 16\n\
- asrs r0, 24\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- movs r3, 0xFF\n\
- ands r3, r1\n\
- cmp r2, 0\n\
- bne _080CB84E\n\
- movs r2, 0x20\n\
- negs r2, r2\n\
- b _080CB856\n\
-_080CB84E:\n\
- cmp r2, 0xFF\n\
- bne _080CB856\n\
- movs r2, 0x88\n\
- lsls r2, 1\n\
-_080CB856:\n\
- mov r0, r9\n\
- subs r4, r0\n\
- lsls r4, 16\n\
- lsrs r4, 16\n\
- mov r1, r10\n\
- subs r0, r2, r1\n\
- lsls r5, r3, 16\n\
- asrs r5, 16\n\
- muls r0, r5\n\
- lsls r1, r6, 16\n\
- asrs r7, r1, 16\n\
- adds r1, r7, 0\n\
- bl __divsi3\n\
- adds r6, r0, 0\n\
- lsls r4, 16\n\
- asrs r4, 16\n\
- adds r0, r4, 0\n\
- muls r0, r5\n\
- adds r1, r7, 0\n\
- bl __divsi3\n\
- add r6, r10\n\
- mov r1, r8\n\
- strh r6, [r1, 0x20]\n\
- add r0, r9\n\
- strh r0, [r1, 0x22]\n\
- adds r5, 0x1\n\
- lsls r5, 16\n\
- lsrs r3, r5, 16\n\
- asrs r5, 16\n\
- cmp r5, r7\n\
- beq _080CB8A8\n\
- lsls r1, r7, 8\n\
- lsls r0, r3, 16\n\
- asrs r0, 16\n\
- orrs r0, r1\n\
- mov r1, r8\n\
- strh r0, [r1, 0x3C]\n\
- movs r0, 0\n\
- b _080CB8AA\n\
-_080CB8A8:\n\
- movs r0, 0x1\n\
-_080CB8AA:\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided\n");
-}
-#endif
void sub_80CB8B8(struct Sprite* sprite)
{
@@ -1007,82 +936,22 @@ void sub_80CB8B8(struct Sprite* sprite)
if(sprite->data0 > 50) move_anim_8072740(sprite);
}
-#ifdef NONMATCHING
void sub_80CB8E8(struct Sprite* sprite)
{
- int temp = ((sprite->data3 * 128) / sprite->data4) + sprite->data0;
- int zero = 0;
- sprite->data0 = temp;
- if(sprite->data0 > 0x7F)
+ sprite->data0 += sprite->data3 * 128 / sprite->data4;
+ if (sprite->data0 >= 128)
{
sprite->data1++;
- sprite->data0 = zero;
+ sprite->data0 = 0;
}
- sprite->pos2.y = Sin(sprite->data0 + 0x80, (sprite->data1 * 8) - 30);
- if(!sub_80CB814(sprite))
+ sprite->pos2.y = Sin(sprite->data0 + 128, 30 - sprite->data1 * 8);
+ if (sub_80CB814(sprite))
{
- sprite->pos2.y = zero;
- sprite->data0 = zero;
+ sprite->pos2.y = 0;
+ sprite->data0 = 0;
sprite->callback = sub_80CB8B8;
}
}
-#else
-__attribute__((naked))
-void sub_80CB8E8(struct Sprite* sprite)
-{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- adds r4, r0, 0\n\
- movs r1, 0x34\n\
- ldrsh r0, [r4, r1]\n\
- lsls r0, 7\n\
- movs r2, 0x36\n\
- ldrsh r1, [r4, r2]\n\
- bl __divsi3\n\
- ldrh r1, [r4, 0x2E]\n\
- adds r1, r0\n\
- movs r5, 0\n\
- strh r1, [r4, 0x2E]\n\
- lsls r1, 16\n\
- asrs r1, 16\n\
- cmp r1, 0x7F\n\
- ble _080CB912\n\
- ldrh r0, [r4, 0x30]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x30]\n\
- strh r5, [r4, 0x2E]\n\
-_080CB912:\n\
- ldrh r0, [r4, 0x2E]\n\
- adds r0, 0x80\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- movs r1, 0x30\n\
- ldrsh r2, [r4, r1]\n\
- lsls r2, 3\n\
- movs r1, 0x1E\n\
- subs r1, r2\n\
- lsls r1, 16\n\
- asrs r1, 16\n\
- bl Sin\n\
- strh r0, [r4, 0x26]\n\
- adds r0, r4, 0\n\
- bl sub_80CB814\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080CB942\n\
- strh r5, [r4, 0x26]\n\
- strh r5, [r4, 0x2E]\n\
- ldr r0, _080CB948 @ =sub_80CB8B8\n\
- str r0, [r4, 0x1C]\n\
-_080CB942:\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080CB948: .4byte sub_80CB8B8\n\
- .syntax divided\n");
-}
-#endif
void sub_80CB94C(struct Sprite* sprite)
{
@@ -1735,27 +1604,31 @@ void sub_80CC5F8(u8 taskId)
if(gBattleAnimArgs[7] == -1) DestroyAnimVisualTask(taskId);
}
-#ifdef NONMATCHING
void sub_80CC6CC(struct Sprite* sprite)
{
u8 a;
u8 b;
- u8 bank;
- int c;
+ u16 c;
u16 x;
u16 y;
+
if (gBattleAnimArgs[4] == 0)
{
move_anim_8072740(sprite);
}
else
{
-
- if (gBattleAnimArgs[0] == 0) bank = gBattleAnimPlayerMonIndex;
+
+ if (gBattleAnimArgs[0] == 0)
+ {
+ a = sub_8077ABC(gBattleAnimPlayerMonIndex, 2);
+ b = sub_8077ABC(gBattleAnimPlayerMonIndex, 3);
+ }
else
- bank = gBattleAnimEnemyMonIndex;
- a = sub_8077ABC(bank, 2);
- b = sub_8077ABC(bank, 3);
+ {
+ a = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
+ b = sub_8077ABC(gBattleAnimEnemyMonIndex, 3);
+ }
sprite->data0 = gBattleAnimArgs[4];
if (gBattleAnimArgs[1] == 0)
{
@@ -1775,150 +1648,15 @@ void sub_80CC6CC(struct Sprite* sprite)
sprite->data1 = x * 16;
y = sprite->pos1.y;
sprite->data2 = y * 16;
- sprite->data3 = ((sprite->data5 - sprite->pos1.x) * 16) / gBattleAnimArgs[4];
- sprite->data4 = ((sprite->data6 - sprite->pos1.y) * 16) / gBattleAnimArgs[4];
+ sprite->data3 = (sprite->data5 - sprite->pos1.x) * 16 / gBattleAnimArgs[4];
+ sprite->data4 = (sprite->data6 - sprite->pos1.y) * 16 / gBattleAnimArgs[4];
c = sub_80790F0(sprite->data5 - x, sprite->data6 - y);
- if(IsContest() != 0) c = c + -0x8000;
+ if (IsContest())
+ c -= 0x8000;
sub_8078FDC(sprite, 0, 0x100, 0x100, c);
sprite->callback = sub_80CC7D4;
}
}
-#else
-__attribute__((naked))
-void sub_80CC6CC(struct Sprite* sprite)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- sub sp, 0x4\n\
- adds r6, r0, 0\n\
- ldr r1, _080CC6E4 @ =gBattleAnimArgs\n\
- movs r2, 0x8\n\
- ldrsh r0, [r1, r2]\n\
- cmp r0, 0\n\
- bne _080CC6E8\n\
- adds r0, r6, 0\n\
- bl move_anim_8072740\n\
- b _080CC7C2\n\
- .align 2, 0\n\
-_080CC6E4: .4byte gBattleAnimArgs\n\
-_080CC6E8:\n\
- movs r3, 0\n\
- ldrsh r0, [r1, r3]\n\
- cmp r0, 0\n\
- bne _080CC6F8\n\
- ldr r4, _080CC6F4 @ =gBattleAnimPlayerMonIndex\n\
- b _080CC6FA\n\
- .align 2, 0\n\
-_080CC6F4: .4byte gBattleAnimPlayerMonIndex\n\
-_080CC6F8:\n\
- ldr r4, _080CC734 @ =gBattleAnimEnemyMonIndex\n\
-_080CC6FA:\n\
- ldrb r0, [r4]\n\
- movs r1, 0x2\n\
- bl sub_8077ABC\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- ldrb r0, [r4]\n\
- movs r1, 0x3\n\
- bl sub_8077ABC\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
- ldr r0, _080CC738 @ =gBattleAnimArgs\n\
- ldrh r1, [r0, 0x8]\n\
- strh r1, [r6, 0x2E]\n\
- movs r3, 0x2\n\
- ldrsh r1, [r0, r3]\n\
- adds r7, r0, 0\n\
- cmp r1, 0\n\
- bne _080CC73C\n\
- ldrh r0, [r7, 0x4]\n\
- adds r0, r5\n\
- strh r0, [r6, 0x20]\n\
- ldrh r0, [r7, 0x6]\n\
- adds r0, r2\n\
- strh r0, [r6, 0x22]\n\
- strh r5, [r6, 0x38]\n\
- strh r2, [r6, 0x3A]\n\
- b _080CC74C\n\
- .align 2, 0\n\
-_080CC734: .4byte gBattleAnimEnemyMonIndex\n\
-_080CC738: .4byte gBattleAnimArgs\n\
-_080CC73C:\n\
- strh r5, [r6, 0x20]\n\
- strh r2, [r6, 0x22]\n\
- ldrh r0, [r7, 0x4]\n\
- adds r0, r5\n\
- strh r0, [r6, 0x38]\n\
- ldrh r0, [r7, 0x6]\n\
- adds r0, r2\n\
- strh r0, [r6, 0x3A]\n\
-_080CC74C:\n\
- ldrh r4, [r6, 0x20]\n\
- lsls r0, r4, 4\n\
- strh r0, [r6, 0x30]\n\
- ldrh r5, [r6, 0x22]\n\
- lsls r0, r5, 4\n\
- strh r0, [r6, 0x32]\n\
- movs r1, 0x38\n\
- ldrsh r0, [r6, r1]\n\
- movs r2, 0x20\n\
- ldrsh r1, [r6, r2]\n\
- subs r0, r1\n\
- lsls r0, 4\n\
- movs r3, 0x8\n\
- ldrsh r1, [r7, r3]\n\
- bl __divsi3\n\
- strh r0, [r6, 0x34]\n\
- movs r1, 0x3A\n\
- ldrsh r0, [r6, r1]\n\
- movs r2, 0x22\n\
- ldrsh r1, [r6, r2]\n\
- subs r0, r1\n\
- lsls r0, 4\n\
- movs r3, 0x8\n\
- ldrsh r1, [r7, r3]\n\
- bl __divsi3\n\
- strh r0, [r6, 0x36]\n\
- ldrh r0, [r6, 0x38]\n\
- subs r0, r4\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- ldrh r1, [r6, 0x3A]\n\
- subs r1, r5\n\
- lsls r1, 16\n\
- asrs r1, 16\n\
- bl sub_80790F0\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- bl IsContest\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080CC7AE\n\
- ldr r1, _080CC7CC @ =0xffff8000\n\
- adds r0, r4, r1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
-_080CC7AE:\n\
- movs r3, 0x80\n\
- lsls r3, 1\n\
- str r4, [sp]\n\
- adds r0, r6, 0\n\
- movs r1, 0\n\
- adds r2, r3, 0\n\
- bl sub_8078FDC\n\
- ldr r0, _080CC7D0 @ =sub_80CC7D4\n\
- str r0, [r6, 0x1C]\n\
-_080CC7C2:\n\
- add sp, 0x4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080CC7CC: .4byte 0xffff8000\n\
-_080CC7D0: .4byte sub_80CC7D4\n\
- .syntax divided\n");
-}
-#endif
void sub_80CC7D4(struct Sprite* sprite)
{
@@ -2972,14 +2710,17 @@ void sub_80CDFB0(struct Sprite* sprite)
sprite->callback = sub_80CE000;
}
-#ifdef NONMATCHING
void sub_80CE000(struct Sprite* sprite)
{
if (++sprite->data0 >= sprite->data1)
{
sprite->invisible = !sprite->invisible;
- if (!sprite->invisible && !(++sprite->data4 & 1))
- PlaySE12WithPanning(0xC2, sprite->data5);
+ if (!sprite->invisible)
+ {
+ sprite->data4++;
+ if (!(sprite->data4 & 1))
+ PlaySE12WithPanning(SE_W207B, sprite->data5);
+ }
sprite->data0 = 0;
if (++sprite->data2 > 1)
{
@@ -2990,93 +2731,6 @@ void sub_80CE000(struct Sprite* sprite)
if (sprite->animEnded && sprite->data1 > 16 && sprite->invisible)
move_anim_8072740(sprite);
}
-#else
-__attribute__((naked))
-void sub_80CE000(struct Sprite* sprite)
-{
- asm(".syntax unified\n\
- push {r4,lr}\n\
- adds r4, r0, 0\n\
- ldrh r0, [r4, 0x2E]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x2E]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- movs r2, 0x30\n\
- ldrsh r1, [r4, r2]\n\
- cmp r0, r1\n\
- blt _080CE06C\n\
- adds r3, r4, 0\n\
- adds r3, 0x3E\n\
- ldrb r2, [r3]\n\
- lsrs r1, r2, 2\n\
- movs r0, 0x1\n\
- eors r1, r0\n\
- ands r1, r0\n\
- lsls r1, 2\n\
- movs r0, 0x5\n\
- negs r0, r0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r3]\n\
- movs r1, 0x4\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _080CE052\n\
- ldrh r0, [r4, 0x36]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x36]\n\
- movs r1, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _080CE052\n\
- ldrh r1, [r4, 0x38]\n\
- lsls r1, 24\n\
- asrs r1, 24\n\
- movs r0, 0xC2\n\
- bl PlaySE12WithPanning\n\
-_080CE052:\n\
- movs r1, 0\n\
- strh r1, [r4, 0x2E]\n\
- ldrh r0, [r4, 0x32]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x32]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x1\n\
- ble _080CE06C\n\
- strh r1, [r4, 0x32]\n\
- ldrh r0, [r4, 0x30]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x30]\n\
-_080CE06C:\n\
- adds r0, r4, 0\n\
- adds r0, 0x3F\n\
- ldrb r1, [r0]\n\
- movs r0, 0x10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080CE096\n\
- movs r1, 0x30\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0x10\n\
- ble _080CE096\n\
- adds r0, r4, 0\n\
- adds r0, 0x3E\n\
- ldrb r1, [r0]\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080CE096\n\
- adds r0, r4, 0\n\
- bl move_anim_8072740\n\
-_080CE096:\n\
- pop {r4}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided\n");
-}
-#endif
void sub_80CE09C(struct Sprite* sprite)
{
@@ -3461,131 +3115,31 @@ void sub_80CEA04(struct Sprite* sprite)
}
// grasswhistle
-#ifdef NONMATCHING
void sub_80CEA20(u8 taskId)
{
u16 i;
u16 j;
- u16 a;
u16 index;
- if ((index = IndexOfSpritePaletteTag(gUnknown_083D712C[0][0])) != 0xFF)
+
+ index = IndexOfSpritePaletteTag(gUnknown_083D712C[0][0]);
+ if (index != 0xFF)
{
index = (index << 4) + 0x100;
for (i = 1; i < 6; i++)
gPlttBufferFaded[index + i] = gUnknown_083D712C[0][i];
}
- for (i = 1; i < 4; i++)
+ for (j = 1; j < 4; j++)
{
- a = AllocSpritePalette(gUnknown_083D712C[i][0]);
- if (a != 0xFF)
+ index = AllocSpritePalette(gUnknown_083D712C[j][0]);
+ if (index != 0xFF)
{
- a = (a << 4) + 0x100;
- for (j = 1; j < 6; j++)
- gPlttBufferFaded[a + j] = gUnknown_083D712C[i][j];
+ index = (index << 4) + 0x100;
+ for (i = 1; i < 6; i++)
+ gPlttBufferFaded[index + i] = gUnknown_083D712C[j][i];
}
}
DestroyAnimVisualTask(taskId);
}
-#else
-__attribute__((naked))
-void sub_80CEA20(u8 taskId)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r9, r0\n\
- ldr r4, _080CEAD0 @ =gUnknown_083D712C\n\
- ldrh r0, [r4]\n\
- bl IndexOfSpritePaletteTag\n\
- lsls r0, 24\n\
- lsrs r3, r0, 24\n\
- cmp r3, 0xFF\n\
- beq _080CEA64\n\
- lsls r0, r3, 20\n\
- movs r1, 0x80\n\
- lsls r1, 17\n\
- adds r0, r1\n\
- lsrs r3, r0, 16\n\
- movs r2, 0x1\n\
- ldr r5, _080CEAD4 @ =gPlttBufferFaded\n\
-_080CEA4C:\n\
- adds r1, r3, r2\n\
- lsls r1, 1\n\
- adds r1, r5\n\
- lsls r0, r2, 1\n\
- adds r0, r4\n\
- ldrh r0, [r0]\n\
- strh r0, [r1]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, 0x5\n\
- bls _080CEA4C\n\
-_080CEA64:\n\
- movs r4, 0x1\n\
- ldr r0, _080CEAD0 @ =gUnknown_083D712C\n\
- mov r8, r0\n\
-_080CEA6A:\n\
- lsls r0, r4, 1\n\
- adds r0, r4\n\
- lsls r5, r0, 2\n\
- mov r1, r8\n\
- adds r0, r5, r1\n\
- ldrh r0, [r0]\n\
- bl AllocSpritePalette\n\
- lsls r0, 24\n\
- lsrs r3, r0, 24\n\
- adds r4, 0x1\n\
- mov r12, r4\n\
- cmp r3, 0xFF\n\
- beq _080CEAB2\n\
- lsls r0, r3, 20\n\
- movs r1, 0x80\n\
- lsls r1, 17\n\
- adds r0, r1\n\
- lsrs r3, r0, 16\n\
- movs r2, 0x1\n\
- ldr r7, _080CEAD4 @ =gPlttBufferFaded\n\
- ldr r6, _080CEAD0 @ =gUnknown_083D712C\n\
- adds r4, r5, 0\n\
-_080CEA98:\n\
- adds r1, r3, r2\n\
- lsls r1, 1\n\
- adds r1, r7\n\
- lsls r0, r2, 1\n\
- adds r0, r4\n\
- adds r0, r6\n\
- ldrh r0, [r0]\n\
- strh r0, [r1]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, 0x5\n\
- bls _080CEA98\n\
-_080CEAB2:\n\
- mov r1, r12\n\
- lsls r0, r1, 16\n\
- lsrs r4, r0, 16\n\
- cmp r4, 0x3\n\
- bls _080CEA6A\n\
- mov r0, r9\n\
- bl DestroyAnimVisualTask\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080CEAD0: .4byte gUnknown_083D712C\n\
-_080CEAD4: .4byte gPlttBufferFaded\n\
-.syntax divided\n");
-}
-#endif
void sub_80CEAD8(u8 taskId)
{
@@ -4109,13 +3663,13 @@ void sub_80CF6B4(struct Sprite* sprite)
}
//sonic boom
-#ifdef NONMATCHING
void sub_80CF6DC(struct Sprite* sprite)
{
s16 a;
s16 b;
- s16 c;
- if (IsContest() != 0)
+ u16 c;
+
+ if (IsContest())
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
else if (GetBankSide(gBattleAnimPlayerMonIndex) != 0)
{
@@ -4128,7 +3682,7 @@ void sub_80CF6DC(struct Sprite* sprite)
b = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + gBattleAnimArgs[3];
c = sub_80790F0(a - sprite->pos1.x, b - sprite->pos1.y);
c += 0xF000;
- if (IsContest() != 0)
+ if (IsContest())
c -= 0x6000;
sub_8078FDC(sprite, 0, 0x100, 0x100, c);
sprite->data0 = gBattleAnimArgs[4];
@@ -4137,131 +3691,6 @@ void sub_80CF6DC(struct Sprite* sprite)
sprite->callback = sub_8078B34;
oamt_set_x3A_32(sprite, move_anim_8072740);
}
-#else
-__attribute__((naked))
-void sub_80CF6DC(struct Sprite* sprite)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- sub sp, 0x4\n\
- adds r5, r0, 0\n\
- bl IsContest\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080CF700\n\
- ldr r1, _080CF6FC @ =gBattleAnimArgs\n\
- ldrh r0, [r1, 0x4]\n\
- negs r0, r0\n\
- strh r0, [r1, 0x4]\n\
- b _080CF722\n\
- .align 2, 0\n\
-_080CF6FC: .4byte gBattleAnimArgs\n\
-_080CF700:\n\
- ldr r0, _080CF7C8 @ =gBattleAnimPlayerMonIndex\n\
- ldrb r0, [r0]\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080CF722\n\
- ldr r1, _080CF7CC @ =gBattleAnimArgs\n\
- ldrh r0, [r1, 0x4]\n\
- negs r0, r0\n\
- strh r0, [r1, 0x4]\n\
- ldrh r0, [r1, 0x2]\n\
- negs r0, r0\n\
- strh r0, [r1, 0x2]\n\
- ldrh r0, [r1, 0x6]\n\
- negs r0, r0\n\
- strh r0, [r1, 0x6]\n\
-_080CF722:\n\
- adds r0, r5, 0\n\
- movs r1, 0x1\n\
- bl sub_80787B0\n\
- ldr r4, _080CF7D0 @ =gBattleAnimEnemyMonIndex\n\
- ldrb r0, [r4]\n\
- movs r1, 0x2\n\
- bl sub_8077ABC\n\
- lsls r0, 24\n\
- ldr r6, _080CF7CC @ =gBattleAnimArgs\n\
- lsrs r0, 24\n\
- ldrh r1, [r6, 0x4]\n\
- adds r0, r1\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- ldrb r0, [r4]\n\
- movs r1, 0x3\n\
- bl sub_8077ABC\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- ldrh r2, [r6, 0x6]\n\
- adds r0, r2\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- adds r7, r0, 0\n\
- ldrh r1, [r5, 0x20]\n\
- mov r2, r8\n\
- lsls r0, r2, 16\n\
- asrs r0, 16\n\
- subs r0, r1\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- ldrh r2, [r5, 0x22]\n\
- lsls r1, r7, 16\n\
- asrs r1, 16\n\
- subs r1, r2\n\
- lsls r1, 16\n\
- asrs r1, 16\n\
- bl sub_80790F0\n\
- lsls r0, 16\n\
- movs r1, 0xF0\n\
- lsls r1, 24\n\
- adds r0, r1\n\
- lsrs r4, r0, 16\n\
- bl IsContest\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080CF794\n\
- ldr r2, _080CF7D4 @ =0xffffa000\n\
- adds r0, r4, r2\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
-_080CF794:\n\
- movs r3, 0x80\n\
- lsls r3, 1\n\
- str r4, [sp]\n\
- adds r0, r5, 0\n\
- movs r1, 0\n\
- adds r2, r3, 0\n\
- bl sub_8078FDC\n\
- ldrh r0, [r6, 0x8]\n\
- strh r0, [r5, 0x2E]\n\
- mov r0, r8\n\
- strh r0, [r5, 0x32]\n\
- strh r7, [r5, 0x36]\n\
- ldr r0, _080CF7D8 @ =sub_8078B34\n\
- str r0, [r5, 0x1C]\n\
- ldr r1, _080CF7DC @ =move_anim_8072740\n\
- adds r0, r5, 0\n\
- bl oamt_set_x3A_32\n\
- add sp, 0x4\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080CF7C8: .4byte gBattleAnimPlayerMonIndex\n\
-_080CF7CC: .4byte gBattleAnimArgs\n\
-_080CF7D0: .4byte gBattleAnimEnemyMonIndex\n\
-_080CF7D4: .4byte 0xffffa000\n\
-_080CF7D8: .4byte sub_8078B34\n\
-_080CF7DC: .4byte move_anim_8072740\n\
- .syntax divided\n");
-}
-#endif
void sub_80CF7E0(struct Sprite* sprite)
{
@@ -4379,3 +3808,691 @@ void sub_80CFA20(u8 taskId)
gTasks[taskId].func = sub_80CF9F8;
}
}
+
+void sub_80CFB04(u8 taskId)
+{
+ s16 r9 = 0;
+ s16 r6 = 0;
+ s16 sp1 = 0;
+ s16 sp2 = 0;
+ s16 r4;
+
+ if (IsContest())
+ {
+ gTasks[taskId].data[4] = 2;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ else
+ {
+ if ((gBanksBySide[gBattleAnimEnemyMonIndex] & 1) == 0)
+ {
+ gTasks[taskId].data[4] = 1;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ }
+ r6 = gTasks[taskId].data[9] = sub_8077ABC(gBattleAnimPlayerMonIndex, 0);
+ r9 = gTasks[taskId].data[10] = sub_8077ABC(gBattleAnimPlayerMonIndex, 1);
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ && b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2))
+ {
+ sub_807A3FC(gBattleAnimEnemyMonIndex, 0, &sp1, &sp2);
+ }
+ else
+ {
+ sp1 = sub_8077ABC(gBattleAnimEnemyMonIndex, 0);
+ sp2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 1);
+ }
+ sp1 = gTasks[taskId].data[11] = sp1 + gBattleAnimArgs[0];
+ sp2 = gTasks[taskId].data[12] = sp2 + gBattleAnimArgs[1];
+ if (sp1 >= r6)
+ r4 = sp1 - r6;
+ else
+ r4 = r6 - sp1;
+ gTasks[taskId].data[5] = sub_81174C4(r4, sub_81174E0(gBattleAnimArgs[2] & ~1));
+ gTasks[taskId].data[6] = sub_81174C4(gTasks[taskId].data[5], 0x80);
+ gTasks[taskId].data[7] = gBattleAnimArgs[2];
+ if (sp2 >= r9)
+ {
+ r4 = sp2 - r9;
+ gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) & ~1;
+ }
+ else
+ {
+ r4 = r9 - sp2;
+ gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) | 1;
+ }
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ if (gBattleAnimArgs[4] & 0x80)
+ {
+ gBattleAnimArgs[4] ^= 0x80;
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = sub_8079E90(gBattleAnimEnemyMonIndex) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = sub_8079E90(gBattleAnimEnemyMonIndex) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = sub_8079E90(gBattleAnimEnemyMonIndex) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = sub_8079E90(gBattleAnimEnemyMonIndex) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+ if (gTasks[taskId].data[2] < 3)
+ gTasks[taskId].data[2] = 3;
+ gTasks[taskId].func = sub_80CFA20;
+}
+
+void sub_80CFDFC(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->data0 = 0x100 + (IndexOfSpritePaletteTag(gSpriteTemplate_83D75AC.paletteTag) << 4);
+ sprite->callback = sub_80CFE2C;
+}
+
+#ifdef NONMATCHING
+void sub_80CFE2C(struct Sprite* sprite)
+{
+ u16 r7;
+ u16* r1;
+ u16* r2;
+ int i;
+ if (++sprite->data1 == 2)
+ {
+ sprite->data1 = 0;
+ r7 = gPlttBufferFaded[sprite->data0 + 8];
+ r2 = &gPlttBufferFaded[0x10];
+ r1 = &gPlttBufferFaded[sprite->data0 + 9];
+ for (i = 7; i >= 0; i--)
+ {
+ *r2 = *r1;
+ r1++;
+ r2++;
+ }
+ gPlttBufferFaded[sprite->data0 + 15] = r7;
+ if (++sprite->data2 == 0x18)
+ move_anim_8072740(sprite);
+ }
+}
+#else
+__attribute__((naked))
+void sub_80CFE2C(struct Sprite* sprite)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ adds r4, r0, 0\n\
+ ldrh r0, [r4, 0x30]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x30]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x2\n\
+ bne _080CFE90\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x30]\n\
+ ldrh r5, [r4, 0x2E]\n\
+ ldr r1, _080CFE98 @ =gPlttBufferFaded\n\
+ adds r0, r5, 0\n\
+ adds r0, 0x8\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r7, [r0]\n\
+ adds r6, r1, 0 @puts gPlttBufferFaded in r6\n\
+ adds r1, r5, 0\n\
+ adds r1, 0x9\n\
+ lsls r0, r5, 1\n\
+ adds r0, r6 \n\
+ adds r2, r0, 0\n\
+ adds r2, 0x10\n\
+ movs r3, 0x7\n\
+ lsls r1, 1\n\
+ adds r1, r6 \n\
+_080CFE64:\n\
+ ldrh r0, [r1]\n\
+ strh r0, [r2]\n\
+ adds r1, 0x2\n\
+ adds r2, 0x2\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _080CFE64\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xF\n\
+ lsls r0, 1\n\
+ adds r0, r6\n\
+ strh r7, [r0]\n\
+ ldrh r0, [r4, 0x32]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x32]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x18\n\
+ bne _080CFE90\n\
+ adds r0, r4, 0\n\
+ bl move_anim_8072740\n\
+_080CFE90:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080CFE98: .4byte gPlttBufferFaded\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80CFE9C(struct Sprite* sprite)
+{
+ s16 r6;
+ s16 r7;
+ u16 var;
+
+ sub_80787B0(sprite, 1);
+ r6 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
+ r7 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + gBattleAnimArgs[3];
+ if (GetBankSide(gBattleAnimPlayerMonIndex) != 0)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ r6 += gBattleAnimArgs[2];
+ var = sub_80790F0(r6 - sprite->pos1.x, r7 - sprite->pos1.y);
+ var += 0xC000;
+ sub_8078FDC(sprite, 0, 0x100, 0x100, var);
+ sprite->data0 = gBattleAnimArgs[4];
+ sprite->data2 = r6;
+ sprite->data4 = r7;
+ sprite->callback = sub_8078C00;
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+}
+
+void sub_80CFF50(struct Sprite* sprite)
+{
+ sprite->data2 = -16;
+ sprite->pos1.y += 8;
+ sprite->callback = sub_80CFF68;
+}
+
+void sub_80CFF68(struct Sprite* sprite)
+{
+ sprite->data0 += 0x80;
+ sprite->pos2.x = sprite->data0 >> 8;
+ if (GetBankSide(gBattleAnimPlayerMonIndex) == 0)
+ sprite->pos2.x = -sprite->pos2.x;
+ sprite->pos2.y = Sin(sprite->data1, sprite->data2);
+ sprite->data1 += 5;
+ if (sprite->data1 > 0x7E)
+ {
+ sprite->data1 = 0;
+ sprite->data2 /= 2;
+ if (++sprite->data3 == 2)
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CFFD8(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data0 = 20;
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3);
+ sprite->callback = sub_8078B34;
+ sprite->affineAnimPaused = 1;
+ oamt_set_x3A_32(sprite, sub_80D0030);
+}
+
+void sub_80D0030(struct Sprite* sprite)
+{
+ int i;
+ u16 rand;
+ s16* ptr;
+ PlaySE12WithPanning(0xA6, sub_8076F98(0x3F));
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ ptr = &sprite->data7;
+ for (i = 0; i < 8; i++) {
+ ptr[i - 7] = 0;
+ }
+ rand = Random();
+ sprite->data6 = 0xFFF4 - (rand & 7);
+ rand = Random();
+ sprite->data7 = (rand % 0xA0) + 0xA0;
+ sprite->callback = sub_80D00B4;
+ sprite->affineAnimPaused = 0;
+}
+
+void sub_80D00B4(struct Sprite* sprite)
+{
+ sprite->data0 += sprite->data7;
+ sprite->pos2.x = sprite->data0 >> 8;
+ if (sprite->data7 & 1)
+ sprite->pos2.x = -sprite->pos2.x;
+ sprite->pos2.y = Sin(sprite->data1, sprite->data6);
+ sprite->data1 += 8;
+ if (sprite->data1 > 0x7E)
+ {
+ sprite->data1 = 0;
+ sprite->data2 /= 2;
+ if (++sprite->data3 == 1)
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80D0118(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ if (GetBankSide(gBattleAnimPlayerMonIndex) == 0)
+ sprite->pos1.y += 16;
+ sprite->data0 = gBattleAnimArgs[4];
+ sprite->data1 = gBattleAnimArgs[2];
+ sprite->data2 = gBattleAnimArgs[5];
+ sprite->data3 = gBattleAnimArgs[6];
+ sprite->data4 = gBattleAnimArgs[3];
+ sprite->callback = sub_8078114;
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+ sprite->callback(sprite);
+}
+
+void sub_80D0178(struct Sprite* sprite)
+{
+ s16 r7 = 32;
+ s16 r4 = -32;
+ s16 r8 = 16;
+ s16 r6 = -16;
+ if (gBattleAnimArgs[0] != 0)
+ {
+ r7 = r4;
+ r4 = 32;
+ r8 = r6;
+ r6 = 16;
+ StartSpriteAnim(sprite, 1);
+ }
+ sprite->pos1.x += r7;
+ sprite->pos1.y += r4;
+ sprite->data0 = 6;
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + r8;
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + r6;
+ sprite->callback = sub_8078B34;
+ oamt_set_x3A_32(sprite, sub_80D020C);
+}
+
+void sub_80D020C(struct Sprite* sprite)
+{
+ if (sprite->animEnded == 1)
+ move_anim_8072740(sprite);
+}
+
+void sub_80D0228(struct Sprite* sprite)
+{
+ s16 r8 = 32;
+ s16 r4 = -32;
+ s16 r9 = 16;
+ s16 r6 = -16;
+ if (gBattleAnimArgs[0] != 0)
+ {
+ r8 = r4;
+ r4 = 32;
+ r9 = r6;
+ r6 = 16;
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ }
+ sprite->pos1.x += r8;
+ sprite->pos1.y += r4;
+ sprite->data0 = 6;
+ sprite->data1 = sprite->pos1.x;
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + r9;
+ sprite->data3 = sprite->pos1.y;
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + r6;
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data5 = gBattleAnimArgs[0];
+ sprite->data6 = sprite->data0;
+ sprite->callback = sub_80D02D0;
+}
+
+void sub_80D02D0(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) && sprite->animEnded == 1)
+ {
+ SeekSpriteAnim(sprite, 0);
+ sprite->animPaused = 1;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 2;
+ sprite->pos2.y = -2;
+ sprite->data0 = sprite->data6;
+ sprite->data1 ^= 1;
+ sprite->data2 ^= 1;
+ sprite->data4 = 0;
+ sprite->data3 = 0;
+ sprite->callback = sub_80D0344;
+ }
+}
+
+void sub_80D0344(struct Sprite* sprite)
+{
+ if (sprite->data3)
+ {
+ sprite->pos2.x = -sprite->pos2.x;
+ sprite->pos2.y = -sprite->pos2.y;
+ }
+ sprite->data3 ^= 1;
+ if (++sprite->data4 == 0x33)
+ {
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data4 = 0;
+ sprite->data3 = 0;
+ sprite->animPaused = 0;
+ StartSpriteAnim(sprite, sprite->data5 ^ 1);
+ sprite->callback = sub_80D03A8;
+ }
+}
+
+void sub_80D03A8(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) != 0)
+ move_anim_8072740(sprite);
+}
+
+void sub_80D03C4(u8 taskId)
+{
+ u8 spriteId = obj_id_for_side_relative_to_move(1);
+ sub_8078E70(spriteId, 1);
+ obj_id_set_rotscale(spriteId, 0xD0, 0xD0, 0);
+ sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 0);
+ gTasks[taskId].data[0] = 0x50;
+ gTasks[taskId].func = sub_80D0428;
+}
+
+void sub_80D0428(u8 taskId)
+{
+ if (--gTasks[taskId].data[0] == -1)
+ {
+ u8 spriteId = obj_id_for_side_relative_to_move(1);
+ sub_8078F40(spriteId);
+ sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80D0488(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = obj_id_for_side_relative_to_move(0);
+ task->data[0] = spriteId;
+ sub_8078E70(spriteId, 0);
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0x100;
+ task->data[5] = 0;
+ task->data[6] = 0;
+ task->data[7] = sub_8079E90(gBattleAnimPlayerMonIndex);
+ task->func = sub_80D04E0;
+}
+
+void sub_80D04E0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[1])
+ {
+ case 0:
+ if (task->data[2] == 0 || task->data[2] == 3 || task->data[2] == 6)
+ sub_80D0614(task, taskId);
+ task->data[2]++;
+ task->data[4] += 0x28;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ if (task->data[2] == 32)
+ {
+ task->data[5]++;
+ task->data[1]++;
+ }
+ break;
+ case 1:
+ if (task->data[6] == 0)
+ {
+ if (task->data[5] == 3)
+ {
+ task->data[2] = 0;
+ task->data[1] = 3;
+ }
+ else
+ {
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0x100;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ task->data[1] = 2;
+ }
+ }
+ break;
+ case 2:
+ task->data[1] = 0;
+ break;
+ case 3:
+ if (++task->data[2] > 32)
+ {
+ task->data[2] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 4:
+ task->data[2] += 2;
+ task->data[4] -= 0x50;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ if (task->data[2] == 32)
+ {
+ task->data[2] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 5:
+ sub_8078F40(task->data[0]);
+ gSprites[task->data[15]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80D0614(struct Task* task, u8 taskId)
+{
+ s16 r8 = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
+ if (r8 >= 0)
+ {
+ u8 r6 = AllocOamMatrix();
+ if (r6 == 0xFF)
+ obj_delete_but_dont_free_vram(&gSprites[r8]);
+ else
+ {
+ gSprites[r8].oam.objMode = 1;
+ gSprites[r8].oam.affineMode = 3;
+ gSprites[r8].affineAnimPaused = 1;
+ gSprites[r8].oam.matrixNum = r6;
+ gSprites[r8].subpriority = task->data[7] - task->data[3];
+ task->data[3]++;
+ task->data[6]++;
+ gSprites[r8].data0 = 16;
+ gSprites[r8].data1 = taskId;
+ gSprites[r8].data2 = 6;
+ gSprites[r8].callback = sub_80D0704;
+ obj_id_set_rotscale(r8, task->data[4], task->data[4], 0);
+ gSprites[r8].oam.affineMode = 1;
+ CalcCenterToCornerVec(&gSprites[r8], gSprites[r8].oam.shape, gSprites[r8].oam.size, gSprites[r8].oam.affineMode);
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80D0614(struct Task* task, u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ adds r7, r0, 0 @r7 is task\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r9, r1 @r9 is taskId\n\
+ movs r0, 0\n\
+ bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
+ lsls r0, 16\n\
+ asrs r4, r0, 16\n\
+ cmp r4, 0\n\
+ blt _080D06EE @jump to bottom\n\
+ bl AllocOamMatrix\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r6, 0xFF\n\
+ bne _080D0658\n\
+ lsls r0, r4, 4\n\
+ adds r0, r4\n\
+ lsls r0, 2\n\
+ ldr r1, _080D0654 @ =gSprites\n\
+ adds r0, r1\n\
+ bl obj_delete_but_dont_free_vram\n\
+ b _080D06EE @ jump to bottom\n\
+ .align 2, 0\n\
+_080D0654: .4byte gSprites\n\
+_080D0658:\n\
+ ldr r5, _080D06FC @ =gSprites\n\
+ lsls r3, r4, 4\n\
+ adds r3, r4\n\
+ lsls r3, 2\n\
+ adds r4, r3, r5\n\
+ ldrb r1, [r4, 0x1]\n\
+ movs r0, 0xD\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ movs r1, 0x3\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x1]\n\
+ adds r2, r4, 0\n\
+ adds r2, 0x2C\n\
+ ldrb r0, [r2]\n\
+ movs r1, 0x80\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ movs r0, 0x1F\n\
+ ands r6, r0\n\
+ lsls r2, r6, 1\n\
+ ldrb r1, [r4, 0x3]\n\
+ movs r0, 0x3F\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ orrs r0, r2\n\
+ strb r0, [r4, 0x3]\n\
+ ldrb r0, [r7, 0x16]\n\
+ ldrb r1, [r7, 0xE]\n\
+ subs r0, r1\n\
+ adds r1, r4, 0\n\
+ adds r1, 0x43\n\
+ strb r0, [r1]\n\
+ ldrh r0, [r7, 0xE]\n\
+ adds r0, 0x1\n\
+ strh r0, [r7, 0xE]\n\
+ ldrh r0, [r7, 0x14]\n\
+ adds r0, 0x1\n\
+ strh r0, [r7, 0x14]\n\
+ movs r0, 0x10\n\
+ strh r0, [r4, 0x2E]\n\
+ mov r0, r9\n\
+ strh r0, [r4, 0x30]\n\
+ movs r0, 0x6\n\
+ strh r0, [r4, 0x32]\n\
+ adds r5, 0x1C\n\
+ adds r3, r5\n\
+ ldr r0, _080D0700 @ =sub_80D0704\n\
+ str r0, [r3]\n\
+ mov r1, r8 @duplicate_obj_of_side_rel2move_in_transparent_mode(0)\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ movs r1, 0x10\n\
+ ldrsh r2, [r7, r1]\n\
+ adds r1, r2, 0\n\
+ movs r3, 0\n\
+ bl obj_id_set_rotscale\n\
+ ldrb r0, [r4, 0x1]\n\
+ movs r3, 0x4\n\
+ negs r3, r3\n\
+ ands r3, r0\n\
+ movs r0, 0x1\n\
+ orrs r3, r0\n\
+ strb r3, [r4, 0x1]\n\
+ lsrs r1, r3, 6\n\
+ ldrb r2, [r4, 0x3]\n\
+ lsrs r2, 6\n\
+ lsls r3, 30\n\
+ lsrs r3, 30\n\
+ adds r0, r4, 0\n\
+ bl CalcCenterToCornerVec\n\
+_080D06EE:\n\
+ pop {r3,r4}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080D06FC: .4byte gSprites\n\
+_080D0700: .4byte sub_80D0704\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80D0704(struct Sprite* sprite)
+{
+ if (--sprite->data0 == 0)
+ {
+ gTasks[sprite->data1].data[sprite->data2]--;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ obj_delete_but_dont_free_vram(sprite);
+ }
+}
+
+void sub_80D074C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (gBattleAnimArgs[1] == 0)
+ DestroyAnimVisualTask(taskId);
+ else
+ {
+ u8 spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ task->data[2] = gBattleAnimArgs[1];
+ task->data[3] = 0;
+ task->data[4] = 0;
+ sub_80798F4(task, spriteId, &gUnknown_083D76F4);
+ task->func = sub_80D07AC;
+ }
+}
+
+
+ \ No newline at end of file