summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_anim_mon_movement.c360
1 files changed, 360 insertions, 0 deletions
diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c
index 84e7395af..27e6ef28c 100644
--- a/src/battle_anim_mon_movement.c
+++ b/src/battle_anim_mon_movement.c
@@ -4,6 +4,8 @@
#include "task.h"
#include "trig.h"
+#define abs(x) ((x) < 0 ? -(x) : (x))
+
void sub_8098A6C(u8 taskId);
void sub_8098C08(u8 taskId);
void sub_8098D54(u8 taskId);
@@ -18,6 +20,13 @@ void sub_8099270(struct Sprite * sprite);
void sub_80992E0(struct Sprite * sprite);
void sub_8099394(struct Sprite * sprite);
void sub_809946C(struct Sprite * sprite);
+void sub_8099530(u8 taskId);
+void sub_8099594(u8 taskId);
+void sub_80996B8(u8 taskId);
+void sub_8099788(u8 taskId);
+void sub_8099908(u8 taskId);
+void sub_8099B54(u8 taskId);
+void sub_8099CB8(u8 taskId);
const struct SpriteTemplate gUnknown_83D4E4C[] = {
{
@@ -447,3 +456,354 @@ void sub_809946C(struct Sprite * sprite)
gSprites[sprite->data[5]].pos2.y = 0;
DestroyAnimSprite(sprite);
}
+
+void sub_809949C(u8 taskId)
+{
+ u16 r7 = 0x8000 / gBattleAnimArgs[3];
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[5] = -gBattleAnimArgs[5];
+ }
+ gTasks[taskId].data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ gTasks[taskId].data[4] = gBattleAnimArgs[4];
+ gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];
+ gTasks[taskId].data[6] = gBattleAnimArgs[6];
+ gTasks[taskId].data[7] = r7;
+ gTasks[taskId].func = sub_8099530;
+}
+
+void sub_8099530(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+ gTasks[taskId].data[11] += gTasks[taskId].data[1];
+ gSprites[spriteId].pos2.x = gTasks[taskId].data[11] >> 8;
+ gSprites[spriteId].pos2.y = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]);
+ gTasks[taskId].data[10] += gTasks[taskId].data[7];
+ if (--gTasks[taskId].data[3] == 0)
+ gTasks[taskId].func = sub_8099594;
+}
+
+void sub_8099594(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[4] > 0)
+ gTasks[taskId].data[4]--;
+ else
+ {
+ spriteId = gTasks[taskId].data[0];
+ gTasks[taskId].data[12] += gTasks[taskId].data[5];
+ gSprites[spriteId].pos2.x = (gTasks[taskId].data[12] >> 8) + (gTasks[taskId].data[11] >> 8);
+ if (--gTasks[taskId].data[6] == 0)
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80995FC(u8 taskId)
+{
+ u8 spriteId;
+
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ case 1:
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ break;
+ case 2:
+ if (!sub_8072DF0(gBattleAnimAttacker ^ BIT_FLANK))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];
+ break;
+ case 3:
+ if (!sub_8072DF0(gBattleAnimTarget ^ BIT_FLANK))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ spriteId = gBattlerSpriteIds[gBattleAnimTarget ^ BIT_FLANK];
+ break;
+ default:
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ gTasks[taskId].data[0] = spriteId;
+ if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ else
+ gTasks[taskId].data[1] = -gBattleAnimArgs[1];
+ gTasks[taskId].func = sub_80996B8;
+}
+
+void sub_80996B8(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[0];
+ gSprites[spriteId].pos2.x += gTasks[taskId].data[1];
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x < -0x20 || gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x > 0x110)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_8099704(u8 taskId)
+{
+ u8 spriteId;
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ gTasks[taskId].data[4] = spriteId;
+ if (gBattleAnimArgs[4] == 0)
+ gTasks[taskId].data[5] = gBattleAnimAttacker;
+ else
+ gTasks[taskId].data[5] = gBattleAnimTarget;
+ gTasks[taskId].data[12] = 1;
+ gTasks[taskId].func = sub_8099788;
+}
+
+void sub_8099788(u8 taskId)
+{
+ u8 spriteId;
+ u32 r8;
+ s16 r5;
+ u16 tmp;
+
+ spriteId = gTasks[taskId].data[4];
+ tmp = gTasks[taskId].data[10] + gTasks[taskId].data[2];
+ gTasks[taskId].data[10] = tmp;
+ r8 = tmp >> 8;
+ r5 = Sin(r8, gTasks[taskId].data[1]);
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gSprites[spriteId].pos2.x = r5;
+ }
+ else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER)
+ {
+ gSprites[spriteId].pos2.y = abs(r5);
+ }
+ else
+ gSprites[spriteId].pos2.y = -abs(r5);
+ if ((r8 > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (r8 < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0))
+ {
+ gTasks[taskId].data[11] ^= 1;
+ gTasks[taskId].data[12] ^= 1;
+ if (--gTasks[taskId].data[3] == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void sub_80998B0(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
+ sub_80758E0(spriteId, gBattleAnimArgs[4]);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].data[3] = gBattleAnimArgs[2];
+ gTasks[taskId].data[4] = spriteId;
+ gTasks[taskId].data[10] = 0x100;
+ gTasks[taskId].data[11] = 0x100;
+ gTasks[taskId].func = sub_8099908;
+}
+
+void sub_8099908(u8 taskId)
+{
+ u8 spriteId;
+ gTasks[taskId].data[10] += gTasks[taskId].data[0];
+ gTasks[taskId].data[11] += gTasks[taskId].data[1];
+ spriteId = gTasks[taskId].data[4];
+ obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);
+ if (--gTasks[taskId].data[2] == 0)
+ {
+ if (gTasks[taskId].data[3] > 0)
+ {
+ gTasks[taskId].data[0] = -gTasks[taskId].data[0];
+ gTasks[taskId].data[1] = -gTasks[taskId].data[1];
+ gTasks[taskId].data[2] = gTasks[taskId].data[3];
+ gTasks[taskId].data[3] = 0;
+ }
+ else
+ {
+ sub_8075980(spriteId);
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+void sub_8099980(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sub_80758E0(spriteId, 0);
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[3] != 1)
+ gTasks[taskId].data[3] = 0;
+ else
+ gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ gTasks[taskId].data[4] = gBattleAnimArgs[1];
+ gTasks[taskId].data[5] = spriteId;
+ gTasks[taskId].data[6] = gBattleAnimArgs[3];
+ if (sub_8073788())
+ gTasks[taskId].data[7] = 1;
+ else
+ {
+ if (gBattleAnimArgs[2] == 0)
+ gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0;
+ else
+ gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0;
+ }
+ if (gTasks[taskId].data[7] && !sub_8073788())
+ {
+ s16 tmp;
+ tmp = gTasks[taskId].data[3];
+ gTasks[taskId].data[3] = -tmp;
+ tmp = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -tmp;
+ }
+ gTasks[taskId].func = sub_8099B54;
+}
+
+void sub_8099A78(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sub_80758E0(spriteId, 0);
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] == 0)
+ {
+ if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ else
+ {
+ if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ if (gBattleAnimArgs[3] != 1)
+ gTasks[taskId].data[3] = 0;
+ else
+ gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ gTasks[taskId].data[4] = gBattleAnimArgs[1];
+ gTasks[taskId].data[5] = spriteId;
+ gTasks[taskId].data[6] = gBattleAnimArgs[3];
+ gTasks[taskId].data[7] = 1;
+ if (gTasks[taskId].data[7] )
+ {
+ s16 tmp;
+ tmp = gTasks[taskId].data[3];
+ gTasks[taskId].data[3] = -tmp;
+ tmp = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -tmp;
+ }
+ gTasks[taskId].func = sub_8099B54;
+}
+
+void sub_8099B54(u8 taskId)
+{
+ s16 tmp;
+ gTasks[taskId].data[3] += gTasks[taskId].data[4];
+ obj_id_set_rotscale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
+ if (gTasks[taskId].data[7])
+ sub_80759DC(gTasks[taskId].data[5]);
+ if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
+ {
+ switch (gTasks[taskId].data[6])
+ {
+ case 1:
+ sub_8075980(gTasks[taskId].data[5]);
+ // fallthrough
+ case 0:
+ default:
+ DestroyAnimVisualTask(taskId);
+ break;
+ case 2:
+ gTasks[taskId].data[1] = 0;
+ tmp = gTasks[taskId].data[4];
+ gTasks[taskId].data[4] = -tmp;
+ gTasks[taskId].data[6] = 1;
+ break;
+ }
+ }
+}
+
+void sub_8099BD4(u8 taskId)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ gTasks[taskId].data[15] = gUnknown_2037EEC / 12;
+ if (gTasks[taskId].data[15] < 1)
+ gTasks[taskId].data[15] = 1;
+ if (gTasks[taskId].data[15] > 16)
+ gTasks[taskId].data[15] = 16;
+ }
+ else
+ {
+ gTasks[taskId].data[15] = gUnknown_2037EE8 / 12;
+ if (gTasks[taskId].data[15] < 1)
+ gTasks[taskId].data[15] = 1;
+ if (gTasks[taskId].data[15] > 16)
+ gTasks[taskId].data[15] = 16;
+ }
+ gTasks[taskId].data[14] = gTasks[taskId].data[15] / 2;
+ gTasks[taskId].data[13] = gTasks[taskId].data[14] + (gTasks[taskId].data[15] & 1);
+ gTasks[taskId].data[12] = 0;
+ gTasks[taskId].data[10] = gBattleAnimArgs[3];
+ gTasks[taskId].data[11] = gBattleAnimArgs[4];
+ gTasks[taskId].data[7] = GetAnimBankSpriteId(1);
+ gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].pos2.x;
+ gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].pos2.y;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[2] = gBattleAnimArgs[2];
+ gTasks[taskId].func = sub_8099CB8;
+}
+
+void sub_8099CB8(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ if (++task->data[0] > task->data[1])
+ {
+ task->data[0] = 0;
+ task->data[12] = (task->data[12] + 1) & 1;
+ if (task->data[10])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14];
+ }
+ }
+ if (task->data[11])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.y = task->data[15];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.y = 0;
+ }
+ }
+ if (!--task->data[2])
+ {
+ gSprites[task->data[7]].pos2.x = 0;
+ gSprites[task->data[7]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+}