#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); }