diff options
Diffstat (limited to 'src/battle/anim/hop.c')
-rwxr-xr-x | src/battle/anim/hop.c | 160 |
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; + } +} |