summaryrefslogtreecommitdiff
path: root/src/battle/anim/hop.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle/anim/hop.c')
-rwxr-xr-xsrc/battle/anim/hop.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/battle/anim/hop.c b/src/battle/anim/hop.c
new file mode 100755
index 000000000..60f3b8a48
--- /dev/null
+++ b/src/battle/anim/hop.c
@@ -0,0 +1,160 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBattleAnimBankAttacker;
+extern u8 gBattleAnimBankTarget;
+
+// hop (where a sprite "hops" across the screen)
+// Used by Present, Trick, and the item knock off effect.
+
+void sub_80CB7EC(struct Sprite* sprite, s16 c)
+{
+ s32 a = (sprite->pos1.x * 256) | sprite->pos1.y;
+ s32 b = (sprite->data[6] * 256) | sprite->data[7];
+ c *= 256;
+ sprite->data[5] = a;
+ sprite->data[6] = b;
+ sprite->data[7] = c;
+}
+
+bool8 sub_80CB814(struct Sprite* sprite)
+{
+ u16 r10 = (u8)(sprite->data[5] >> 8);
+ u16 r9 = (u8)sprite->data[5];
+ s32 r2 = (u8)(sprite->data[6] >> 8);
+ s32 r4 = (u8)sprite->data[6];
+ s16 r6 = sprite->data[7] >> 8;
+ s16 r3 = sprite->data[7] & 0xFF;
+ s16 r4_2;
+ s16 r0;
+ s32 var1;
+ s32 var2;
+
+ if (r2 == 0)
+ {
+ r2 = -32;
+ }
+ else if (r2 == 255)
+ {
+ r2 = 0x110;
+ }
+
+ r4_2 = r4 - r9;
+ r0 = r2 - r10;
+ var1 = r0 * r3 / r6;
+ var2 = r4_2 * r3 / r6;
+ sprite->pos1.x = var1 + r10;
+ sprite->pos1.y = var2 + r9;
+ if (++r3 == r6)
+ return TRUE;
+
+ sprite->data[7] = (r6 << 8) | r3;
+ return FALSE;
+}
+
+void sub_80CB8B8(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 10)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ }
+
+ sprite->data[0]++;
+ if (sprite->data[0] > 50)
+ {
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CB8E8(struct Sprite* sprite)
+{
+ sprite->data[0] += sprite->data[3] * 128 / sprite->data[4];
+ if (sprite->data[0] >= 128)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = 0;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 128, 30 - sprite->data[1] * 8);
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = 0;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CB8B8;
+ }
+}
+
+void sub_80CB94C(struct Sprite* sprite)
+{
+ s16 e1;
+ s16 e2;
+ sub_80787B0(sprite, 0);
+ e1 = sub_8077ABC(gBattleAnimBankTarget, 0);
+ e2 = sub_8077ABC(gBattleAnimBankTarget, 1);
+ if ((gBattleAnimBankAttacker ^ 2) == gBattleAnimBankTarget)
+ {
+ sprite->data[6] = e1;
+ sprite->data[7] = e2 + 10;
+ sub_80CB7EC(sprite, 0x3C);
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->data[6] = e1;
+ sprite->data[7] = e2 + 10;
+ sub_80CB7EC(sprite, 0x3C);
+ sprite->data[3] = 3;
+ }
+
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB8E8;
+}
+
+void sub_80CB9C4(struct Sprite* sprite)
+{
+ int zero;
+ sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
+ zero = 0;
+ if (sprite->data[0] > 0x7F)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = zero;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = zero;
+ sprite->data[0] = zero;
+ move_anim_8072740(sprite);
+ }
+}
+
+void sub_80CBA28(struct Sprite* sprite)
+{
+ s16 e = sub_8077ABC(gBattleAnimBankTarget, 1);
+ if (GetBankSide(gBattleAnimBankTarget) == 0)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = e + 10;
+ sub_80CB7EC(sprite, 0x28);
+ sprite->data[3] = 3;
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB8E8;
+ }
+ else
+ {
+ sprite->data[6] = 255;
+ sprite->data[7] = e + 10;
+ if (NotInBattle())
+ sprite->data[6] = 0;
+
+ sub_80CB7EC(sprite, 0x28);
+ sprite->data[3] = 3;
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB9C4;
+ }
+}