diff options
Diffstat (limited to 'src/battle/anim/bubble.c')
-rw-r--r-- | src/battle/anim/bubble.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/battle/anim/bubble.c b/src/battle/anim/bubble.c new file mode 100644 index 000000000..5da0d9929 --- /dev/null +++ b/src/battle/anim/bubble.c @@ -0,0 +1,102 @@ +#include "global.h" +#include "battle_anim.h" +#include "rom_8077ABC.h" +#include "trig.h" +#include "util.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; + +static void sub_80D32E8(struct Sprite *sprite); +static void sub_80D3370(struct Sprite *sprite); +static void sub_80D3398(struct Sprite *sprite); + +// bubble (indidivual bubble that floats around) +// Used in Bubble and Bubblebeam + +void sub_80D31C8(struct Sprite* sprite) +{ + u8 newSpriteId; + + if (GetBankSide(gBattleAnimBankAttacker) != 0) + { + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) - gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[1]; + } + else + { + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2) + gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3) + gBattleAnimArgs[1]; + } + + sprite->animPaused = 1; + + if (GetBankSide(gBattleAnimBankAttacker) != 0) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + + sprite->data[0] = gBattleAnimArgs[6]; + 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); + + newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + sprite->data[5] = newSpriteId; + + sprite->pos1.x -= Sin((u8)gBattleAnimArgs[4], gBattleAnimArgs[2]); + sprite->pos1.y -= Cos((u8)gBattleAnimArgs[4], gBattleAnimArgs[3]); + + gSprites[newSpriteId].data[0] = gBattleAnimArgs[2]; + gSprites[newSpriteId].data[1] = gBattleAnimArgs[3]; + gSprites[newSpriteId].data[2] = gBattleAnimArgs[5]; + gSprites[newSpriteId].data[3] = (u8)gBattleAnimArgs[4] * 256; + gSprites[newSpriteId].data[4] = gBattleAnimArgs[6]; + + sprite->callback = sub_80D32E8; + sprite->callback(sprite); +} + +static void sub_80D32E8(struct Sprite *sprite) +{ + u8 spriteId = sprite->data[5]; + + u8 counter = gSprites[spriteId].data[4]; + u16 index = gSprites[spriteId].data[3]; + + sprite->data[0] = 1; + sub_8078B5C(sprite); + + sprite->pos2.x += Sin(index / 256, gSprites[spriteId].data[0]); + sprite->pos2.y += Cos(index / 256, gSprites[spriteId].data[1]); + + gSprites[spriteId].data[3] = gSprites[spriteId].data[2] + index; + + if (--counter != 0) + { + gSprites[spriteId].data[4] = counter; + } + else + { + sprite->callback = sub_80D3370; + DestroySprite(&gSprites[spriteId]); + } +} + +static void sub_80D3370(struct Sprite *sprite) +{ + sprite->animPaused = 0; + sprite->callback = sub_8078600; + StoreSpriteCallbackInData(sprite, sub_80D3398); +} + +static void sub_80D3398(struct Sprite *sprite) +{ + sprite->data[0] = 10; + sprite->callback = sub_80782D8; + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); +} |