diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/energy_wave.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/battle/anim/energy_wave.c b/src/battle/anim/energy_wave.c new file mode 100644 index 000000000..ffba5c300 --- /dev/null +++ b/src/battle/anim/energy_wave.c @@ -0,0 +1,162 @@ +#include "global.h" +#include "battle_anim.h" +#include "rom_8077ABC.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" + +extern s16 gBattleAnimArgs[8]; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; +extern const struct SpriteTemplate gSpriteTemplate_83D9130[]; + +static void sub_80D35DC(struct Sprite *); +static void sub_80D365C(u8); +static void sub_80D370C(struct Sprite *); + +// energy_wave (animates steady "waves" of energy) +// Used in Hydro Pump, Mud Shot, Signal Beam, Flamethrower, Psywave, and +// Hydro Cannon. + +void sub_80D3554(struct Sprite *sprite) +{ + sub_80787B0(sprite, 1); + + sprite->data[0] = 30; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, 3); + + obj_translate_based_on_private_1_2_3_4(sprite); + + sprite->data[5] = 0xD200 / sprite->data[0]; + sprite->data[7] = gBattleAnimArgs[3]; + + if (gBattleAnimArgs[7] > 127) + { + sprite->data[6] = (gBattleAnimArgs[7] - 127) << 8; + sprite->data[7] = -sprite->data[7]; + } + else + { + sprite->data[6] = gBattleAnimArgs[7] << 8; + } + + sprite->callback = sub_80D35DC; + sprite->callback(sprite); +} + +static void sub_80D35DC(struct Sprite *sprite) +{ + if (sub_8078B5C(sprite)) + { + move_anim_8072740(sprite); + } + + sprite->pos2.y += Sin(sprite->data[6] >> 8, sprite->data[7]); + if (((sprite->data[6] + sprite->data[5]) >> 8) > 127) + { + sprite->data[6] = 0; + sprite->data[7] = -sprite->data[7]; + } + else + { + sprite->data[6] += sprite->data[5]; + } +} + +void sub_80D3630(u8 taskId) +{ + gTasks[taskId].data[0] = gBattleAnimArgs[0]; + gBattleAnimArgs[7] = 0; + gTasks[taskId].func = sub_80D365C; +} + +static void sub_80D365C(u8 taskId) +{ + gBattleAnimArgs[7] = (gBattleAnimArgs[7] + 3) & 0xFF; + if (--gTasks[taskId].data[0] == 0) + { + DestroyAnimVisualTask(taskId); + } +} + +void sub_80D3698(struct Sprite *sprite) +{ + u8 subpriority; + + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 0); + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 1); + sprite->pos2.y = -10; + + subpriority = sub_8079E90(gBattleAnimBankAttacker); + + if (!NotInBattle()) + { + if (GetBankSide(gBattleAnimBankAttacker) == 0) + { + sprite->pos2.x = 10; + sprite->subpriority = subpriority + 2; + } + else + { + sprite->pos2.x = -10; + sprite->subpriority = subpriority - 2; + } + } + else + { + sprite->pos2.x = -10; + sprite->subpriority = subpriority + 2; + } + + sprite->callback = sub_80D370C; +} + +static void sub_80D370C(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + move_anim_8072740(sprite); + } +} + +void sub_80D3728(struct Sprite *sprite) +{ + int var1, var2; + + if (GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget)) + { + gBattleAnimArgs[0] *= -1; + + if (GetBankIdentity(gBattleAnimBankAttacker) == 0 || GetBankIdentity(gBattleAnimBankAttacker) == 1) + { + gBattleAnimArgs[0] *= -1; + } + + } + + if ((gBattleAnimArgs[5] & 0xFF00) == 0) + var1 = 1; + else + var1 = 0; + + if ((u8)gBattleAnimArgs[5] == 0) + var2 = 3; + else + var2 = 1; + + sub_80787B0(sprite, var1); + + if (GetBankSide(gBattleAnimBankAttacker) != 0) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = sub_8077ABC(gBattleAnimBankTarget, var2) + gBattleAnimArgs[3]; + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, move_anim_8072740); +} |