diff options
-rwxr-xr-x | asm/liquid_ball.s | 353 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/battle/anim/energy_wave.c | 162 |
3 files changed, 163 insertions, 354 deletions
diff --git a/asm/liquid_ball.s b/asm/liquid_ball.s deleted file mode 100755 index 6af030ecf..000000000 --- a/asm/liquid_ball.s +++ /dev/null @@ -1,353 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - @ liquid_ball - - thumb_func_start sub_80D3554 -sub_80D3554: @ 80D3554 - push {r4,r5,lr} - adds r5, r0, 0 - movs r1, 0x1 - bl sub_80787B0 - movs r0, 0x1E - strh r0, [r5, 0x2E] - ldrh r0, [r5, 0x20] - strh r0, [r5, 0x30] - ldr r4, _080D35BC @ =gBattleAnimBankTarget - ldrb r0, [r4] - movs r1, 0x2 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x32] - ldrh r0, [r5, 0x22] - strh r0, [r5, 0x34] - ldrb r0, [r4] - movs r1, 0x3 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x36] - adds r0, r5, 0 - bl obj_translate_based_on_private_1_2_3_4 - movs r0, 0x2E - ldrsh r1, [r5, r0] - movs r0, 0xD2 - lsls r0, 8 - bl __divsi3 - strh r0, [r5, 0x38] - ldr r0, _080D35C0 @ =gBattleAnimArgs - ldrh r2, [r0, 0x6] - strh r2, [r5, 0x3C] - ldrh r1, [r0, 0xE] - movs r3, 0xE - ldrsh r0, [r0, r3] - cmp r0, 0x7F - ble _080D35C4 - adds r0, r1, 0 - subs r0, 0x7F - lsls r0, 8 - strh r0, [r5, 0x3A] - negs r0, r2 - strh r0, [r5, 0x3C] - b _080D35C8 - .align 2, 0 -_080D35BC: .4byte gBattleAnimBankTarget -_080D35C0: .4byte gBattleAnimArgs -_080D35C4: - lsls r0, r1, 8 - strh r0, [r5, 0x3A] -_080D35C8: - ldr r1, _080D35D8 @ =sub_80D35DC - str r1, [r5, 0x1C] - adds r0, r5, 0 - bl _call_via_r1 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080D35D8: .4byte sub_80D35DC - thumb_func_end sub_80D3554 - - thumb_func_start sub_80D35DC -sub_80D35DC: @ 80D35DC - push {r4,lr} - adds r4, r0, 0 - bl sub_8078B5C - lsls r0, 24 - cmp r0, 0 - beq _080D35F0 - adds r0, r4, 0 - bl move_anim_8072740 -_080D35F0: - ldrh r0, [r4, 0x3A] - lsls r0, 16 - asrs r0, 24 - movs r2, 0x3C - ldrsh r1, [r4, r2] - bl Sin - ldrh r1, [r4, 0x26] - adds r0, r1 - strh r0, [r4, 0x26] - movs r2, 0x3A - ldrsh r0, [r4, r2] - movs r2, 0x38 - ldrsh r1, [r4, r2] - adds r0, r1 - asrs r0, 8 - cmp r0, 0x7F - ble _080D3620 - movs r0, 0 - strh r0, [r4, 0x3A] - ldrh r0, [r4, 0x3C] - negs r0, r0 - strh r0, [r4, 0x3C] - b _080D3628 -_080D3620: - ldrh r0, [r4, 0x38] - ldrh r1, [r4, 0x3A] - adds r0, r1 - strh r0, [r4, 0x3A] -_080D3628: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80D35DC - - thumb_func_start sub_80D3630 -sub_80D3630: @ 80D3630 - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080D3650 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - ldr r3, _080D3654 @ =gBattleAnimArgs - ldrh r0, [r3] - movs r2, 0 - strh r0, [r1, 0x8] - strh r2, [r3, 0xE] - ldr r0, _080D3658 @ =sub_80D365C - str r0, [r1] - bx lr - .align 2, 0 -_080D3650: .4byte gTasks -_080D3654: .4byte gBattleAnimArgs -_080D3658: .4byte sub_80D365C - thumb_func_end sub_80D3630 - - thumb_func_start sub_80D365C -sub_80D365C: @ 80D365C - push {lr} - lsls r0, 24 - lsrs r3, r0, 24 - ldr r2, _080D3690 @ =gBattleAnimArgs - ldrh r0, [r2, 0xE] - adds r0, 0x3 - movs r1, 0xFF - ands r0, r1 - strh r0, [r2, 0xE] - ldr r1, _080D3694 @ =gTasks - lsls r0, r3, 2 - adds r0, r3 - lsls r0, 3 - adds r0, r1 - ldrh r1, [r0, 0x8] - subs r1, 0x1 - strh r1, [r0, 0x8] - lsls r1, 16 - cmp r1, 0 - bne _080D368A - adds r0, r3, 0 - bl DestroyAnimVisualTask -_080D368A: - pop {r0} - bx r0 - .align 2, 0 -_080D3690: .4byte gBattleAnimArgs -_080D3694: .4byte gTasks - thumb_func_end sub_80D365C - - thumb_func_start sub_80D3698 -sub_80D3698: @ 80D3698 - push {r4-r7,lr} - adds r4, r0, 0 - ldr r7, _080D36E4 @ =gBattleAnimBankAttacker - ldrb r0, [r7] - movs r1, 0 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0x20] - ldrb r0, [r7] - movs r1, 0x1 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0x22] - ldr r6, _080D36E8 @ =0x0000fff6 - strh r6, [r4, 0x26] - ldrb r0, [r7] - bl sub_8079E90 - lsls r0, 24 - lsrs r5, r0, 24 - bl NotInBattle - lsls r0, 24 - cmp r0, 0 - bne _080D36F2 - ldrb r0, [r7] - bl GetBankSide - lsls r0, 24 - cmp r0, 0 - bne _080D36EC - movs r0, 0xA - strh r0, [r4, 0x24] - b _080D36F4 - .align 2, 0 -_080D36E4: .4byte gBattleAnimBankAttacker -_080D36E8: .4byte 0x0000fff6 -_080D36EC: - strh r6, [r4, 0x24] - subs r0, r5, 0x2 - b _080D36F6 -_080D36F2: - strh r6, [r4, 0x24] -_080D36F4: - adds r0, r5, 0x2 -_080D36F6: - adds r1, r4, 0 - adds r1, 0x43 - strb r0, [r1] - ldr r0, _080D3708 @ =sub_80D370C - str r0, [r4, 0x1C] - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080D3708: .4byte sub_80D370C - thumb_func_end sub_80D3698 - - thumb_func_start sub_80D370C -sub_80D370C: @ 80D370C - push {lr} - adds r2, r0, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _080D3722 - adds r0, r2, 0 - bl move_anim_8072740 -_080D3722: - pop {r0} - bx r0 - thumb_func_end sub_80D370C - - thumb_func_start sub_80D3728 -sub_80D3728: @ 80D3728 - push {r4-r7,lr} - adds r6, r0, 0 - ldr r5, _080D37E8 @ =gBattleAnimBankAttacker - ldrb r0, [r5] - bl GetBankSide - adds r4, r0, 0 - ldr r0, _080D37EC @ =gBattleAnimBankTarget - ldrb r0, [r0] - bl GetBankSide - lsls r4, 24 - lsls r0, 24 - cmp r4, r0 - bne _080D3772 - ldr r4, _080D37F0 @ =gBattleAnimArgs - movs r1, 0 - ldrsh r0, [r4, r1] - negs r0, r0 - strh r0, [r4] - ldrb r0, [r5] - bl GetBankIdentity - lsls r0, 24 - cmp r0, 0 - beq _080D376A - ldrb r0, [r5] - bl GetBankIdentity - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080D3772 -_080D376A: - movs r1, 0 - ldrsh r0, [r4, r1] - negs r0, r0 - strh r0, [r4] -_080D3772: - ldr r5, _080D37F0 @ =gBattleAnimArgs - movs r1, 0xA - ldrsh r0, [r5, r1] - movs r1, 0xFF - lsls r1, 8 - ands r0, r1 - movs r1, 0 - cmp r0, 0 - bne _080D3786 - movs r1, 0x1 -_080D3786: - ldrb r0, [r5, 0xA] - movs r7, 0x1 - cmp r0, 0 - bne _080D3790 - movs r7, 0x3 -_080D3790: - adds r0, r6, 0 - bl sub_80787B0 - ldr r0, _080D37E8 @ =gBattleAnimBankAttacker - ldrb r0, [r0] - bl GetBankSide - lsls r0, 24 - cmp r0, 0 - beq _080D37AA - ldrh r0, [r5, 0x4] - negs r0, r0 - strh r0, [r5, 0x4] -_080D37AA: - ldrh r0, [r5, 0x8] - strh r0, [r6, 0x2E] - ldr r4, _080D37EC @ =gBattleAnimBankTarget - ldrb r0, [r4] - movs r1, 0x2 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - ldrh r1, [r5, 0x4] - adds r0, r1 - strh r0, [r6, 0x32] - ldrb r0, [r4] - adds r1, r7, 0 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - ldrh r5, [r5, 0x6] - adds r0, r5 - strh r0, [r6, 0x36] - ldr r0, _080D37F4 @ =sub_8078B34 - str r0, [r6, 0x1C] - ldr r1, _080D37F8 @ =move_anim_8072740 - adds r0, r6, 0 - bl StoreSpriteCallbackInData - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080D37E8: .4byte gBattleAnimBankAttacker -_080D37EC: .4byte gBattleAnimBankTarget -_080D37F0: .4byte gBattleAnimArgs -_080D37F4: .4byte sub_8078B34 -_080D37F8: .4byte move_anim_8072740 - thumb_func_end sub_80D3728 - - .align 2, 0 @ Don't pad with nop. diff --git a/ld_script.txt b/ld_script.txt index 9bef7726d..440490a69 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -275,7 +275,7 @@ SECTIONS { src/battle/anim/rain.o(.text); src/battle/anim/bubble.o(.text); src/battle/anim/aurora.o(.text); - asm/liquid_ball.o(.text); + src/battle/anim/energy_wave.o(.text); src/battle/anim/water.o(.text); asm/water.o(.text); asm/fire.o(.text); 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); +} |