summaryrefslogtreecommitdiff
path: root/src/battle/anim/espeed.c
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-11-26 21:18:19 -0800
committerGitHub <noreply@github.com>2017-11-26 21:18:19 -0800
commite6500d12a21e9833e08ad25cc6a76b075cff42dd (patch)
treeebd886d19c3a3257b21590d558ec724ca7d6e849 /src/battle/anim/espeed.c
parent0793afb9e8eeb508375344ca683f97bbc797771a (diff)
parent85dc553b949b05ec4fdc0e223c29161465a132b7 (diff)
Merge pull request #473 from ProjectRevoTPP/split_80C
split battle_anim_80CA710
Diffstat (limited to 'src/battle/anim/espeed.c')
-rwxr-xr-xsrc/battle/anim/espeed.c241
1 files changed, 241 insertions, 0 deletions
diff --git a/src/battle/anim/espeed.c b/src/battle/anim/espeed.c
new file mode 100755
index 000000000..621d386e1
--- /dev/null
+++ b/src/battle/anim/espeed.c
@@ -0,0 +1,241 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+extern s8 gUnknown_083D7A00[4][2];
+
+extern struct AffineAnimFrameCmd gUnknown_083D79BC;
+extern struct SpriteTemplate gSpriteTemplate_83D79E8;
+
+static void sub_80D15E0(u8 taskId);
+static void sub_80D16A0(u8 taskId);
+static void sub_80D1808(u8 taskId);
+static void sub_80D1930(u8 taskId);
+
+// espeed (the Pokemon's width decreases as the sprite becomes vertically compressed)
+// Used in Extremespeed.
+
+// apply espeed
+void sub_80D15A4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ sub_80798F4(task, spriteId, &gUnknown_083D79BC);
+ task->func = sub_80D15E0;
+}
+
+void sub_80D15E0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (sub_807992C(task) == 0)
+ {
+ gSprites[task->data[0]].pos2.y = 0;
+ gSprites[task->data[0]].invisible = 1;
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// espeed hit effect
+void sub_80D1638(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[12] = 3;
+ if (GetBankSide(gBattleAnimBankTarget) == 0)
+ {
+ task->data[13] = 0xFFFF;
+ task->data[14] = 8;
+ }
+ else
+ {
+ task->data[13] = 1;
+ task->data[14] = -8;
+ }
+
+ task->data[15] = GetAnimBankSpriteId(1);
+ task->func = sub_80D16A0;
+}
+
+void sub_80D16A0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ gSprites[task->data[15]].pos2.x += task->data[14];
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ break;
+ case 1:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.x += 6;
+ else
+ gSprites[task->data[15]].pos2.x -= 6;
+
+ if (++task->data[3] > 4)
+ {
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.x -= 6;
+
+ task->data[0]++;
+ }
+ }
+ break;
+ case 2:
+ if (--task->data[12] != 0)
+ task->data[0] = 0;
+ else
+ task->data[0]++;
+ break;
+ case 3:
+ gSprites[task->data[15]].pos2.x += task->data[13];
+ if (gSprites[task->data[15]].pos2.x == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// espeed poke flicker in
+void sub_80D17C4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 1;
+ task->data[13] = 14;
+ task->data[14] = 2;
+ task->data[15] = GetAnimBankSpriteId(0);
+ task->func = sub_80D1808;
+}
+
+void sub_80D1808(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (task->data[0] == 0 && ++task->data[1] > task->data[4])
+ {
+ task->data[1] = 0;
+ if (++task->data[2] & 1)
+ gSprites[task->data[15]].invisible = 0;
+ else
+ gSprites[task->data[15]].invisible = 1;
+
+ if (++task->data[3] >= task->data[13])
+ {
+ if (++task->data[4] < task->data[14])
+ {
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ }
+ else
+ {
+ gSprites[task->data[15]].invisible = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ }
+}
+
+// espeed smoke flicker
+void sub_80D18D4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[5] = 0;
+ task->data[6] = 0;
+ task->data[7] = 0;
+ task->data[8] = 0;
+ task->data[13] = 0;
+ task->data[14] = sub_8077ABC(gBattleAnimBankAttacker, 0);
+ task->data[15] = sub_8077ABC(gBattleAnimBankAttacker, 1);
+ task->func = sub_80D1930;
+}
+
+void sub_80D1930(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[8])
+ {
+ case 0:
+ if (++task->data[4] > 1)
+ {
+ task->data[4] = 0;
+ task->data[5] = (task->data[5] + 1) & 1;
+ if (++task->data[6] > 20)
+ {
+ if (task->data[7] == 0)
+ {
+ task->data[6] = 0;
+ task->data[8] = 1;
+ }
+ else
+ task->data[8] = 2;
+ }
+ }
+ break;
+ case 1:
+ task->data[5] = 0;
+ if (++task->data[4] > 20)
+ {
+ task->data[7] = 1;
+ task->data[8] = 0;
+ }
+ break;
+ case 2:
+ task->data[5] = 1;
+ break;
+ }
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 4)
+ {
+ u8 spriteId;
+ task->data[1] = 0;
+ spriteId = CreateSprite(&gSpriteTemplate_83D79E8, task->data[14], task->data[15], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 13;
+ gSprites[spriteId].pos2.x = gUnknown_083D7A00[task->data[2]][0];
+ gSprites[spriteId].pos2.y = gUnknown_083D7A00[task->data[2]][1];
+ task->data[13]++;
+ if (++task->data[2] > 3)
+ {
+ task->data[2] = 0;
+ if (++task->data[3] > 5)
+ task->data[0]++;
+ }
+ }
+ }
+ break;
+ case 1:
+ if (task->data[13] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}