summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/battle_anim_80CA710.c831
1 files changed, 831 insertions, 0 deletions
diff --git a/src/battle_anim_80CA710.c b/src/battle_anim_80CA710.c
new file mode 100755
index 000000000..191280e7b
--- /dev/null
+++ b/src/battle_anim_80CA710.c
@@ -0,0 +1,831 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "blend_palette.h"
+#include "decompress.h"
+#include "palette.h"
+#include "rng.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gBattleAnimPlayerMonIndex;
+extern u8 gBattleAnimEnemyMonIndex;
+extern struct SpriteTemplate gSpriteTemplate_83D631C;
+
+void sub_80CA768(struct Sprite* sprite);
+void sub_80CA8B4(struct Sprite* sprite);
+void sub_80CA9F8(struct Sprite* sprite);
+void sub_80CAACC(struct Sprite* sprite);
+void sub_80CAB88(struct Sprite* sprite);
+void sub_80CABC0(struct Sprite* sprite);
+void sub_80CAC44(struct Sprite* sprite);
+void sub_80CADA8(struct Sprite* sprite);
+void sub_80CAE74(struct Sprite* sprite);
+void sub_80CAF20(struct Sprite* sprite);
+void sub_80CAF6C(struct Sprite* sprite);
+void sub_80CB09C(struct Sprite* sprite);
+void sub_80CB1A4(struct Sprite* sprite);
+void sub_80CB298(struct Sprite* sprite);
+void sub_80CB2D4(struct Sprite* sprite);
+
+void sub_80787B0(struct Sprite *sprite, u8 a2);
+void sub_8078764(struct Sprite *sprite, u8 a2);
+void sub_8078B34(struct Sprite *sprite);
+void sub_8078D60(struct Sprite *sprite);
+void sub_80786EC(struct Sprite *sprite);
+void sub_80782D8(struct Sprite *sprite);
+void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4);
+u8 sub_8079ED4(u8 slot);
+
+void move_anim_8074EE0(struct Sprite *sprite);
+bool8 sub_8078718(struct Sprite *sprite);
+bool8 sub_8078CE8(struct Sprite *sprite);
+
+void sub_80CB3A8(u8 taskId);
+void sub_80CB438(u8 taskId);
+
+void sub_80CA710(struct Sprite* sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data0 = gBattleAnimArgs[2];
+ sprite->data1 = gBattleAnimArgs[3];
+ if (GetBankSide(gBattleAnimPlayerMonIndex))
+ {
+ sprite->data3 = -gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->data3 = gBattleAnimArgs[4];
+ }
+ sprite->data4 = gBattleAnimArgs[5];
+ sprite->callback = sub_80CA768;
+}
+
+void sub_80CA768(struct Sprite* sprite)
+{
+ if (sprite->data0 > 0)
+ {
+ sprite->data0--;
+ sprite->pos2.y = sprite->data2 >> 8;
+ sprite->data2 += sprite->data1;
+ sprite->pos2.x = Sin(sprite->data5, sprite->data3);
+ sprite->data5 = (sprite->data5 + sprite->data4) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CA7B0(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data0 = gBattleAnimArgs[2];
+ sprite->data2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2);
+ sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3);
+ sprite->callback = sub_8078B34;
+ oamt_set_x3A_32(sprite, move_anim_8074EE0);
+}
+
+void sub_80CA800(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->data0 = gBattleAnimArgs[2];
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3);
+ sprite->callback = sub_8078B34;
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+}
+
+void sub_80CA858(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data0 = gBattleAnimArgs[2];
+ sprite->data1 = sprite->pos1.x;
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
+ sprite->data3 = sprite->pos1.y;
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3);
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data5 = gBattleAnimArgs[3];
+ sprite->callback = sub_80CA8B4;
+ sub_80CA8B4(sprite);
+}
+
+void sub_80CA8B4(struct Sprite* sprite)
+{
+ if(sub_8078B5C(sprite))
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ if(sprite->data5 > 0x7F)
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimEnemyMonIndex) + 1;
+ }
+ else
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimEnemyMonIndex) + 6;
+ }
+ sprite->pos2.x += Sin(sprite->data5, 5);
+ sprite->pos2.y += Cos(sprite->data5, 14);
+ sprite->data5 = (sprite->data5 + 15) & 0xFF;
+ }
+}
+
+void sub_80CA928(u8 taskId)
+{
+ gTasks[taskId].data[0]--;
+ if (gTasks[taskId].data[0] == -1)
+ {
+ gTasks[taskId].data[1]++;
+ gTasks[taskId].data[0] = 6;
+ gBattleAnimArgs[0] = 15;
+ gBattleAnimArgs[1] = 0;
+ gBattleAnimArgs[2] = 80;
+ gBattleAnimArgs[3] = 0;
+ CreateSpriteAndAnimate(&gSpriteTemplate_83D631C, 0, 0, sub_8079E90(gBattleAnimEnemyMonIndex) + 1);
+ }
+ if (gTasks[taskId].data[1] == 15) DestroyAnimVisualTask(taskId);
+}
+
+void sub_80CA9A8(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 1);
+ sprite->data0 = gBattleAnimArgs[3];
+ sprite->data2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2);
+ sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3);
+ sprite->data5 = gBattleAnimArgs[2];
+ sub_80786EC(sprite);
+ sprite->callback = sub_80CA9F8;
+}
+
+void sub_80CA9F8(struct Sprite* sprite)
+{
+ if (sub_8078718(sprite)) move_anim_8072740(sprite);
+}
+
+void sub_80CAA14(struct Sprite* sprite)
+{
+ u16 a = Random();
+ u16 b;
+
+ StartSpriteAnim(sprite, a & 7);
+ sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3);
+ if (GetBankSide(gBattleAnimPlayerMonIndex))
+ {
+ sprite->pos1.x -= 20;
+ }
+ else
+ {
+ sprite->pos1.x += 20;
+ }
+ b = Random();
+ sprite->data0 = (b & 31) + 64;
+ sprite->data1 = sprite->pos1.x;
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
+ sprite->data3 = sprite->pos1.y;
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3);
+ sub_8078D60(sprite);
+ sprite->data5 = Random() & 0xFF;
+ sprite->data6 = sprite->subpriority;
+ sprite->callback = sub_80CAACC;
+ sub_80CAACC(sprite);
+}
+
+void sub_80CAACC(struct Sprite* sprite)
+{
+ if (sub_8078CE8(sprite))
+ {
+ move_anim_8072740(sprite);
+ }
+ else
+ {
+ sprite->pos2.y += Cos(sprite->data5, 12);
+ if (sprite->data5 <= 0x7E)
+ {
+ sprite->subpriority = sprite->data6;
+ }
+ else
+ {
+ sprite->subpriority = sprite->data6 + 1;
+ }
+ sprite->data5 = (sprite->data5 + 24) & 0xFF;
+ }
+}
+
+void sub_80CAB18(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ if(GetBankSide(gBattleAnimPlayerMonIndex))
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ sprite->data0 = gBattleAnimArgs[4];
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 0) + gBattleAnimArgs[2];
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 1) + gBattleAnimArgs[3];
+ sprite->data5 = gBattleAnimArgs[5];
+ sub_80786EC(sprite);
+ sprite->callback = sub_80CAB88;
+}
+
+void sub_80CAB88(struct Sprite* sprite)
+{
+ if(sub_8078718(sprite))
+ {
+ sprite->invisible = 1;
+ sprite->data0 = 10;
+ sprite->callback = sub_80782D8;
+ oamt_set_x3A_32(sprite, sub_80CABC0);
+ }
+}
+
+void sub_80CABC0(struct Sprite* sprite)
+{
+ sprite->invisible = 0;
+ StartSpriteAnim(sprite, 1);
+ sprite->data0 = 60;
+ sprite->callback = sub_80782D8;
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+}
+
+void sub_80CABF8(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ if (gBattleAnimArgs[4] == 1)
+ {
+ sprite->oam.objMode = 1;
+ }
+ sprite->data0 = gBattleAnimArgs[3];
+ sprite->data1 = gBattleAnimArgs[2];
+ sprite->callback = sub_80CAC44;
+ sub_80CAC44(sprite);
+}
+
+void sub_80CAC44(struct Sprite* sprite)
+{
+
+ u8 b;
+
+ sprite->pos2.x = Sin(sprite->data1, 32);
+ sprite->pos2.y = Cos(sprite->data1, -3) + ((sprite->data2 += 24) >> 8);
+ if ((u16)(sprite->data1 - 0x40) < 0x80)
+ {
+ sprite->oam.priority = (sub_8079ED4(gBattleAnimEnemyMonIndex) & 3);
+ }
+ else
+ {
+ b = sub_8079ED4(gBattleAnimEnemyMonIndex) + 1;
+ if ( b > 3)
+ {
+ b = 3;
+ }
+ sprite->oam.priority = b;
+ }
+ sprite->data1 = (sprite->data1 + 2) & 0xFF;
+ sprite->data0--;
+ if (sprite->data0 == -1) move_anim_8072740(sprite);
+}
+
+void sub_80CACEC(u8 taskId)
+{
+ if(IsContest() || !IsDoubleBattle())
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ if (GetBankIdentity_permutated(gBattleAnimEnemyMonIndex) == 1)
+ {
+ REG_BG2CNT_BITFIELD.priority = 3;
+ }
+ else
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ }
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80CAD54(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->data0 = gBattleAnimArgs[3];
+ sprite->data1 = sprite->pos1.x;
+ sprite->data2 = sprite->pos1.x;
+ sprite->data3 = sprite->pos1.y;
+ sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3) + gBattleAnimArgs[2];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data5 = 0x40;
+ sprite->callback = sub_80CADA8;
+ sub_80CADA8(sprite);
+}
+
+void sub_80CADA8(struct Sprite* sprite)
+{
+ if(!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data5, 32);
+ sprite->pos2.y += Cos(sprite->data5, -5);
+ if ((u16)(sprite->data5 - 0x40) < 0x80)
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimPlayerMonIndex) - 1;
+ }
+ else
+ {
+ sprite->subpriority = sub_8079E90(gBattleAnimPlayerMonIndex) + 1;
+ }
+ sprite->data5 = (sprite->data5 + 5) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CAE20(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data0 = gBattleAnimArgs[3];
+ sprite->data1 = sprite->pos1.x;
+ sprite->data2 = sprite->pos1.x;
+ sprite->data3 = sprite->pos1.y;
+ sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3) + gBattleAnimArgs[2];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data5 = 0x40;
+ sprite->callback = sub_80CAE74;
+ sub_80CAE74(sprite);
+}
+
+void sub_80CAE74(struct Sprite* sprite)
+{
+ if(!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data5, 8);
+ if ((u16)(sprite->data5 - 0x3B) < 5 || (u16)(sprite->data5 - 0xBB) < 5)
+ {
+ sprite->oam.matrixNum ^= 8;
+ }
+ sprite->data5 = (sprite->data5 + 5) & 0xFF;
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CAED8(struct Sprite* sprite)
+{
+ sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2);
+ sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3);
+ sprite->data0 = gBattleAnimArgs[0];
+ sprite->data1 = gBattleAnimArgs[1];
+ sprite->data2 = gBattleAnimArgs[2];
+ sprite->callback = sub_80CAF20;
+}
+
+void sub_80CAF20(struct Sprite* sprite)
+{
+ if(!sprite->data2)
+ {
+ if(sprite->data1 & 1)
+ {
+ sprite->data0 = 0x80;
+ sprite->data1 = 0;
+ sprite->data2 = 0;
+ }
+ else
+ {
+ sprite->data0 = sprite->data1 & 1;
+ sprite->data1 = sprite->data1 & 1;
+ sprite->data2 = sprite->data1 & 1;
+ }
+ sprite->callback = sub_80CAF6C;
+ }
+ else
+ {
+ sprite->data2--;
+ sprite->pos1.x += sprite->data0;
+ sprite->pos1.y += sprite->data1;
+ }
+}
+
+void sub_80CAF6C(struct Sprite* sprite)
+{
+ if(GetBankSide(gBattleAnimPlayerMonIndex))
+ {
+ sprite->pos2.x = -Sin(sprite->data0, 0x19);
+ }
+ else
+ {
+ sprite->pos2.x = Sin(sprite->data0, 0x19);
+ }
+ sprite->data0 = (sprite->data0 + 2) & 0xFF;
+ sprite->data1++;
+ if(!(sprite->data1 & 1))
+ {
+ sprite->pos2.y++;
+ }
+ if(sprite->data1 > 0x50)
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CAFD0(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ if(GetBankSide(gBattleAnimPlayerMonIndex))
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ sprite->data0 = gBattleAnimArgs[4];
+ if(!(gBattleAnimArgs[6]))
+ {
+ sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2];
+ sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + gBattleAnimArgs[3];
+ }
+ else
+ {
+ sub_807A3FC(gBattleAnimEnemyMonIndex, 1, &sprite->data2, &sprite->data4);
+ sprite->data2 += gBattleAnimArgs[2];
+ sprite->data4 += gBattleAnimArgs[3];
+ }
+ sprite->data5 = gBattleAnimArgs[5];
+ sub_80786EC(sprite);
+ if(GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex))
+ {
+ sprite->data0 = 1;
+ }
+ else
+ {
+ sprite->data0 = 0;
+ }
+ sprite->callback = sub_80CB09C;
+}
+
+#ifdef NONMATCHING
+void sub_80CB09C(struct Sprite* sprite)
+{
+ s16 c = 0;
+ s16 a = sprite->data0;
+ s16 b = sprite->data7;
+ sprite->data0 = 1;
+ sub_8078718(sprite);
+ sprite->data0 = a;
+ if (b > 0xC8 && sprite->data7 <= 0x37 && sprite->oam.affineParam == 0)
+ sprite->oam.affineParam++;
+ if (sprite->oam.affineParam != 0 && sprite->data0 != 0)
+ {
+ sprite->invisible ^= 1;
+ sprite->oam.affineParam++;
+ if(sprite->oam.affineParam == 0x1E)
+ {
+ c = 1;
+ }
+ }
+ if((sprite->pos1.x + sprite->pos2.x + 16) <= 0x110 && (sprite->pos1.y + sprite->pos2.y) <= 0xA0 && (sprite->pos1.y + sprite->pos2.y) < -16)
+ {
+ c = 1;
+ }
+ if (!c) move_anim_8072740(sprite);
+}
+#else
+__attribute__((naked))
+void sub_80CB09C(struct Sprite* sprite)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ adds r6, r0, 0\n\
+ movs r7, 0\n\
+ ldrh r5, [r6, 0x2E]\n\
+ ldrh r4, [r6, 0x3C]\n\
+ movs r0, 0x1\n\
+ strh r0, [r6, 0x2E]\n\
+ adds r0, r6, 0\n\
+ bl sub_8078718\n\
+ ldrh r0, [r6, 0x3C]\n\
+ strh r5, [r6, 0x2E]\n\
+ lsls r4, 16\n\
+ asrs r4, 16\n\
+ cmp r4, 0xC8\n\
+ ble _080CB0CE\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x37\n\
+ bgt _080CB0CE\n\
+ ldrh r0, [r6, 0x6]\n\
+ cmp r0, 0\n\
+ bne _080CB0D4\n\
+ adds r0, 0x1\n\
+ strh r0, [r6, 0x6]\n\
+_080CB0CE:\n\
+ ldrh r0, [r6, 0x6]\n\
+ cmp r0, 0\n\
+ beq _080CB106\n\
+_080CB0D4:\n\
+ movs r1, 0x2E\n\
+ ldrsh r0, [r6, r1]\n\
+ cmp r0, 0\n\
+ beq _080CB106\n\
+ adds r3, r6, 0\n\
+ adds r3, 0x3E\n\
+ ldrb r2, [r3]\n\
+ lsls r0, r2, 29\n\
+ lsrs r0, 31\n\
+ movs r1, 0x1\n\
+ eors 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\
+ ldrh r0, [r6, 0x6]\n\
+ adds r0, 0x1\n\
+ strh r0, [r6, 0x6]\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1E\n\
+ bne _080CB106\n\
+ movs r7, 0x1\n\
+_080CB106:\n\
+ movs r2, 0x20\n\
+ ldrsh r0, [r6, r2]\n\
+ movs r2, 0x24\n\
+ ldrsh r1, [r6, r2]\n\
+ adds r0, r1\n\
+ adds r0, 0x10\n\
+ movs r1, 0x88\n\
+ lsls r1, 1\n\
+ cmp r0, r1\n\
+ bhi _080CB130\n\
+ movs r0, 0x22\n\
+ ldrsh r1, [r6, r0]\n\
+ movs r2, 0x26\n\
+ ldrsh r0, [r6, r2]\n\
+ adds r1, r0\n\
+ cmp r1, 0xA0\n\
+ bgt _080CB130\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ cmp r1, r0\n\
+ bge _080CB132\n\
+_080CB130:\n\
+ movs r7, 0x1\n\
+_080CB132:\n\
+ cmp r7, 0\n\
+ beq _080CB13C\n\
+ adds r0, r6, 0\n\
+ bl move_anim_8072740\n\
+_080CB13C:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_80CB144(struct Sprite* sprite)
+{
+ if(!IsContest() && IsDoubleBattle() == TRUE)
+ {
+ sub_807A3FC(gBattleAnimEnemyMonIndex, 1, &sprite->pos1.x, &sprite->pos1.y);
+ }
+ sprite->pos1.y += 32;
+ sprite->data0 = gBattleAnimArgs[0];
+ sprite->data1 = gBattleAnimArgs[1];
+ sprite->data2 = gBattleAnimArgs[2];
+ sprite->data3 = gBattleAnimArgs[3];
+ sprite->data4 = gBattleAnimArgs[4];
+ sprite->callback = sub_80CB1A4;
+}
+
+void sub_80CB1A4(struct Sprite* sprite)
+{
+ if(sprite->data1 == 0xFF)
+ {
+ sprite->pos1.y -= 2;
+ }
+ else if(sprite->data1 > 0)
+ {
+ sprite->pos1.y -= 2;
+ sprite->data1 -= 2;
+ }
+ sprite->data5 += sprite->data2;
+ if(sprite->data0 < sprite->data4) sprite->data5 += sprite->data2;
+ sprite->data5 &= 0xFF;
+ sprite->pos2.x = Cos(sprite->data5, sprite->data3);
+ sprite->pos2.y = Sin(sprite->data5, 5);
+ if(sprite->data5 <= 0x7F)
+ {
+ sprite->oam.priority = sub_8079ED4(gBattleAnimEnemyMonIndex) - 1;
+ }
+ else
+ {
+ sprite->oam.priority = sub_8079ED4(gBattleAnimEnemyMonIndex) + 1;
+ }
+ sprite->data0--;
+ if(!sprite->data0) move_anim_8072740(sprite);
+}
+
+void sub_80CB25C(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 0);
+ sprite->affineAnimPaused = 1;
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data6 = gBattleAnimArgs[2];
+ sprite->data7 = gBattleAnimArgs[3];
+ sprite->callback = sub_80CB298;
+}
+
+void sub_80CB298(struct Sprite* sprite)
+{
+ if((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->affineAnimPaused = 0;
+ obj_id_for_side_relative_to_move(1);
+ sprite->data0 = 0x100;
+ sprite->callback = sub_80CB2D4;
+ }
+}
+
+void sub_80CB2D4(struct Sprite* sprite)
+{
+ obj_id_for_side_relative_to_move(1);
+ if(!sprite->data2)
+ {
+ sprite->data0 += 11;
+ }
+ else
+ {
+ sprite->data0 -= 11;
+ }
+ sprite->data1++;
+ if(sprite->data1 == 6)
+ {
+ sprite->data1 = 0;
+ sprite->data2 ^= 1;
+ }
+ if(sprite->affineAnimEnded)
+ {
+ sprite->data7--;
+ if(sprite->data7 > 0)
+ {
+ StartSpriteAffineAnim(sprite, sprite->data6);
+ }
+ else
+ {
+ move_anim_8072740(sprite);
+ }
+ }
+}
+
+void sub_80CB340(u8 taskId)
+{
+ u8 spriteId = obj_id_for_side_relative_to_move(1);
+ if(gSprites[spriteId].invisible)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ sub_8078E70(spriteId, 1);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[11] = 256;
+ gTasks[taskId].func = sub_80CB3A8;
+ }
+}
+
+void sub_80CB3A8(u8 taskId)
+{
+ u8 spriteId = obj_id_for_side_relative_to_move(1);
+ gTasks[taskId].data[10] += gTasks[taskId].data[0];
+ gSprites[spriteId].pos2.x = gTasks[taskId].data[10] >> 8;
+ if(GetBankSide(gBattleAnimEnemyMonIndex))
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ }
+ gTasks[taskId].data[11] += 16;
+ obj_id_set_rotscale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0);
+ sub_8079A64(spriteId);
+ gTasks[taskId].data[1]--;
+ if(!gTasks[taskId].data[1])
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80CB438;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80CB438(u8 taskId)
+{
+ if((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ if(!gTasks[taskId].data[0])
+ {
+ u8 spriteId = obj_id_for_side_relative_to_move(1);
+ sub_8078F40(spriteId);
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+
+ }
+ }
+ else if(gTasks[taskId].data[0])
+ {
+ gTasks[taskId].data[0]++;
+ }
+ if(gTasks[taskId].data[0] == 3) DestroyAnimVisualTask(taskId);
+}
+#else
+__attribute__((naked))
+void sub_80CB438(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ ldr r0, _080CB484 @ =gBattleAnimArgs\n\
+ ldrh r1, [r0, 0xE]\n\
+ ldr r0, _080CB488 @ =0x0000ffff\n\
+ cmp r1, r0\n\
+ bne _080CB494\n\
+ ldr r0, _080CB48C @ =gTasks\n\
+ lsls r2, r3, 2\n\
+ adds r1, r2, r3\n\
+ lsls r1, 3\n\
+ adds r6, r1, r0\n\
+ movs r1, 0x8\n\
+ ldrsh r5, [r6, r1]\n\
+ adds r4, r0, 0\n\
+ cmp r5, 0\n\
+ bne _080CB4A8\n\
+ movs r0, 0x1\n\
+ bl obj_id_for_side_relative_to_move\n\
+ adds r4, r0, 0\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ adds r0, r4, 0\n\
+ bl sub_8078F40\n\
+ ldr r1, _080CB490 @ =gSprites\n\
+ lsls r0, r4, 4\n\
+ adds r0, r4\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ strh r5, [r0, 0x24]\n\
+ strh r5, [r0, 0x26]\n\
+ ldrh r0, [r6, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r6, 0x8]\n\
+ b _080CB4C2\n\
+ .align 2, 0\n\
+_080CB484: .4byte gBattleAnimArgs\n\
+_080CB488: .4byte 0x0000ffff\n\
+_080CB48C: .4byte gTasks\n\
+_080CB490: .4byte gSprites\n\
+_080CB494:\n\
+ ldr r1, _080CB4C8 @ =gTasks\n\
+ lsls r2, r3, 2\n\
+ adds r0, r2, r3\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ movs r4, 0x8\n\
+ ldrsh r0, [r0, r4]\n\
+ adds r4, r1, 0\n\
+ cmp r0, 0\n\
+ beq _080CB4C2\n\
+_080CB4A8:\n\
+ adds r1, r2, r3\n\
+ lsls r1, 3\n\
+ adds r1, r4\n\
+ ldrh r0, [r1, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1, 0x8]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x3\n\
+ bne _080CB4C2\n\
+ adds r0, r3, 0\n\
+ bl DestroyAnimVisualTask\n\
+_080CB4C2:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080CB4C8: .4byte gTasks\n\
+ .syntax divided\n");
+}
+#endif \ No newline at end of file