diff options
-rw-r--r-- | asm/current.s | 492 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rwxr-xr-x | src/battle/anim/current.c | 143 |
3 files changed, 144 insertions, 492 deletions
diff --git a/asm/current.s b/asm/current.s index 2010b0336..666e2132b 100644 --- a/asm/current.s +++ b/asm/current.s @@ -7,498 +7,6 @@ @ current - thumb_func_start sub_80D648C -sub_80D648C: @ 80D648C - push {r4-r6,lr} - adds r4, r0, 0 - movs r1, 0x1 - bl InitAnimSpritePos - ldr r5, _080D6500 @ =gBattleAnimArgs - ldrh r0, [r5, 0x6] - strh r0, [r4, 0x2E] - ldrh r0, [r4, 0x20] - strh r0, [r4, 0x30] - ldr r6, _080D6504 @ =gAnimBankTarget - ldrb r0, [r6] - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0x32] - ldrh r0, [r4, 0x22] - strh r0, [r4, 0x34] - ldrb r0, [r6] - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - strh r0, [r4, 0x36] - adds r0, r4, 0 - bl InitAnimSpriteTranslationDeltas - ldrh r0, [r5, 0x4] - strh r0, [r4, 0x38] - ldrh r0, [r5, 0xA] - strh r0, [r4, 0x3A] - ldrh r0, [r5, 0x8] - strh r0, [r4, 0x3C] - ldrh r2, [r4, 0x4] - lsls r1, r2, 22 - lsrs r1, 22 - movs r3, 0xC - ldrsh r0, [r5, r3] - lsls r0, 2 - adds r1, r0 - ldr r3, _080D6508 @ =0x000003ff - adds r0, r3, 0 - ands r1, r0 - ldr r0, _080D650C @ =0xfffffc00 - ands r0, r2 - orrs r0, r1 - strh r0, [r4, 0x4] - ldr r1, _080D6510 @ =sub_80D6514 - str r1, [r4, 0x1C] - adds r0, r4, 0 - bl _call_via_r1 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080D6500: .4byte gBattleAnimArgs -_080D6504: .4byte gAnimBankTarget -_080D6508: .4byte 0x000003ff -_080D650C: .4byte 0xfffffc00 -_080D6510: .4byte sub_80D6514 - thumb_func_end sub_80D648C - - thumb_func_start sub_80D6514 -sub_80D6514: @ 80D6514 - push {r4,lr} - adds r4, r0, 0 - bl TranslateAnimSpriteByDeltas - lsls r0, 24 - cmp r0, 0 - bne _080D657E - movs r1, 0x3C - ldrsh r0, [r4, r1] - movs r2, 0x38 - ldrsh r1, [r4, r2] - bl Sin - ldrh r1, [r4, 0x24] - adds r0, r1 - strh r0, [r4, 0x24] - movs r2, 0x3C - ldrsh r0, [r4, r2] - movs r2, 0x38 - ldrsh r1, [r4, r2] - bl Cos - ldrh r1, [r4, 0x26] - adds r0, r1 - strh r0, [r4, 0x26] - ldrh r0, [r4, 0x3A] - ldrh r2, [r4, 0x3C] - adds r0, r2 - movs r1, 0xFF - ands r0, r1 - strh r0, [r4, 0x3C] - movs r1, 0x3C - ldrsh r0, [r4, r1] - movs r1, 0x3 - bl __modsi3 - lsls r0, 16 - cmp r0, 0 - bne _080D6584 - adds r3, r4, 0 - adds r3, 0x3E - ldrb r2, [r3] - lsls r0, r2, 29 - lsrs r0, 31 - movs r1, 0x1 - eors r1, r0 - lsls r1, 2 - movs r0, 0x5 - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - b _080D6584 -_080D657E: - adds r0, r4, 0 - bl DestroyAnimSprite -_080D6584: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80D6514 - - thumb_func_start sub_80D658C -sub_80D658C: @ 80D658C - push {lr} - adds r3, r0, 0 - ldrh r0, [r3, 0x38] - subs r0, 0x1 - strh r0, [r3, 0x38] - lsls r0, 16 - asrs r0, 16 - movs r1, 0x1 - negs r1, r1 - cmp r0, r1 - bne _080D65C4 - movs r0, 0x3E - adds r0, r3 - mov r12, r0 - ldrb r2, [r0] - lsls r0, r2, 29 - lsrs r0, 31 - movs r1, 0x1 - eors r1, r0 - lsls r1, 2 - movs r0, 0x5 - negs r0, r0 - ands r0, r2 - orrs r0, r1 - mov r1, r12 - strb r0, [r1] - ldrh r0, [r3, 0x36] - strh r0, [r3, 0x38] -_080D65C4: - ldrh r0, [r3, 0x34] - subs r1, r0, 0x1 - strh r1, [r3, 0x34] - lsls r0, 16 - cmp r0, 0 - bgt _080D65D6 - adds r0, r3, 0 - bl DestroyAnimSprite -_080D65D6: - pop {r0} - bx r0 - thumb_func_end sub_80D658C - - thumb_func_start sub_80D65DC -sub_80D65DC: @ 80D65DC - push {r4-r6,lr} - adds r6, r0, 0 - ldr r0, _080D6644 @ =gMain - ldr r1, _080D6648 @ =0x0000043d - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080D65FE - ldr r0, _080D664C @ =gAnimBankTarget - ldrb r0, [r0] - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - bne _080D6606 -_080D65FE: - ldr r1, _080D6650 @ =gBattleAnimArgs - ldrh r0, [r1, 0x2] - negs r0, r0 - strh r0, [r1, 0x2] -_080D6606: - ldr r5, _080D664C @ =gAnimBankTarget - ldrb r0, [r5] - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - ldr r4, _080D6650 @ =gBattleAnimArgs - lsrs r0, 24 - ldrh r1, [r4, 0x2] - adds r0, r1 - strh r0, [r6, 0x20] - ldrb r0, [r5] - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - ldrh r1, [r4, 0x4] - adds r0, r1 - strh r0, [r6, 0x22] - ldrh r0, [r4] - strh r0, [r6, 0x34] - ldrh r0, [r4, 0x6] - strh r0, [r6, 0x36] - strh r0, [r6, 0x38] - ldr r0, _080D6654 @ =sub_80D658C - str r0, [r6, 0x1C] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080D6644: .4byte gMain -_080D6648: .4byte 0x0000043d -_080D664C: .4byte gAnimBankTarget -_080D6650: .4byte gBattleAnimArgs -_080D6654: .4byte sub_80D658C - thumb_func_end sub_80D65DC - - thumb_func_start sub_80D6658 -sub_80D6658: @ 80D6658 - push {r4-r6,lr} - adds r5, r0, 0 - ldr r1, _080D6674 @ =gBattleAnimArgs - ldrh r0, [r1, 0x6] - strh r0, [r5, 0x2E] - movs r2, 0xE - ldrsh r0, [r1, r2] - movs r1, 0x80 - lsls r1, 8 - ands r0, r1 - cmp r0, 0 - beq _080D667C - ldr r0, _080D6678 @ =gAnimBankTarget - b _080D667E - .align 2, 0 -_080D6674: .4byte gBattleAnimArgs -_080D6678: .4byte gAnimBankTarget -_080D667C: - ldr r0, _080D670C @ =gAnimBankAttacker -_080D667E: - ldrb r6, [r0] - ldr r0, _080D6710 @ =gMain - ldr r3, _080D6714 @ =0x0000043d - adds r0, r3 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080D669C - adds r0, r6, 0 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - bne _080D66A4 -_080D669C: - ldr r1, _080D6718 @ =gBattleAnimArgs - ldrh r0, [r1] - negs r0, r0 - strh r0, [r1] -_080D66A4: - adds r0, r6, 0 - movs r1, 0x2 - bl GetBattlerSpriteCoord - lsls r0, 24 - ldr r4, _080D6718 @ =gBattleAnimArgs - lsrs r0, 24 - ldrh r1, [r4] - adds r0, r1 - strh r0, [r5, 0x20] - adds r0, r6, 0 - movs r1, 0x3 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - ldrh r2, [r4, 0x2] - adds r0, r2 - strh r0, [r5, 0x22] - ldrh r1, [r4, 0xE] - ldr r0, _080D671C @ =0x00007fff - ands r0, r1 - strh r0, [r5, 0x36] - ldrh r0, [r4, 0x4] - strh r0, [r5, 0x38] - ldrh r0, [r4, 0xA] - strh r0, [r5, 0x3A] - ldrh r0, [r4, 0x8] - strh r0, [r5, 0x3C] - ldrh r2, [r5, 0x4] - lsls r1, r2, 22 - lsrs r1, 22 - movs r3, 0xC - ldrsh r0, [r4, r3] - lsls r0, 2 - adds r1, r0 - ldr r3, _080D6720 @ =0x000003ff - adds r0, r3, 0 - ands r1, r0 - ldr r0, _080D6724 @ =0xfffffc00 - ands r0, r2 - orrs r0, r1 - strh r0, [r5, 0x4] - ldr r1, _080D6728 @ =sub_80D672C - str r1, [r5, 0x1C] - adds r0, r5, 0 - bl _call_via_r1 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080D670C: .4byte gAnimBankAttacker -_080D6710: .4byte gMain -_080D6714: .4byte 0x0000043d -_080D6718: .4byte gBattleAnimArgs -_080D671C: .4byte 0x00007fff -_080D6720: .4byte 0x000003ff -_080D6724: .4byte 0xfffffc00 -_080D6728: .4byte sub_80D672C - thumb_func_end sub_80D6658 - - thumb_func_start sub_80D672C -sub_80D672C: @ 80D672C - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x3C - ldrsh r0, [r4, r1] - movs r2, 0x38 - ldrsh r1, [r4, r2] - bl Sin - strh r0, [r4, 0x24] - movs r1, 0x3C - ldrsh r0, [r4, r1] - movs r2, 0x38 - ldrsh r1, [r4, r2] - bl Cos - strh r0, [r4, 0x26] - ldrh r0, [r4, 0x3A] - ldrh r1, [r4, 0x3C] - adds r0, r1 - movs r1, 0xFF - ands r0, r1 - strh r0, [r4, 0x3C] - movs r2, 0x3C - ldrsh r0, [r4, r2] - movs r2, 0x36 - ldrsh r1, [r4, r2] - bl __modsi3 - cmp r0, 0 - bne _080D6782 - adds r3, r4, 0 - adds r3, 0x3E - ldrb r2, [r3] - lsls r0, r2, 29 - lsrs r0, 31 - movs r1, 0x1 - eors r1, r0 - lsls r1, 2 - movs r0, 0x5 - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] -_080D6782: - ldrh r0, [r4, 0x2E] - subs r1, r0, 0x1 - strh r1, [r4, 0x2E] - lsls r0, 16 - cmp r0, 0 - bgt _080D6794 - adds r0, r4, 0 - bl DestroyAnimSprite -_080D6794: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80D672C - - thumb_func_start sub_80D679C -sub_80D679C: @ 80D679C - push {r4,r5,lr} - adds r4, r0, 0 - movs r1, 0 - bl sub_8078764 - ldrh r2, [r4, 0x4] - lsls r1, r2, 22 - lsrs r1, 22 - ldr r3, _080D67D8 @ =gBattleAnimArgs - movs r5, 0x6 - ldrsh r0, [r3, r5] - lsls r0, 2 - adds r1, r0 - ldr r5, _080D67DC @ =0x000003ff - adds r0, r5, 0 - ands r1, r0 - ldr r0, _080D67E0 @ =0xfffffc00 - ands r0, r2 - orrs r0, r1 - strh r0, [r4, 0x4] - movs r1, 0x6 - ldrsh r0, [r3, r1] - cmp r0, 0x1 - bne _080D67E4 - ldrb r0, [r4, 0x3] - movs r1, 0x3F - negs r1, r1 - ands r1, r0 - movs r0, 0x10 - b _080D67F2 - .align 2, 0 -_080D67D8: .4byte gBattleAnimArgs -_080D67DC: .4byte 0x000003ff -_080D67E0: .4byte 0xfffffc00 -_080D67E4: - cmp r0, 0x2 - bne _080D67F6 - ldrb r0, [r4, 0x3] - movs r1, 0x3F - negs r1, r1 - ands r1, r0 - movs r0, 0x20 -_080D67F2: - orrs r1, r0 - strb r1, [r4, 0x3] -_080D67F6: - ldr r0, _080D6810 @ =gBattleAnimArgs - ldrh r0, [r0, 0x4] - strh r0, [r4, 0x2E] - ldr r0, _080D6814 @ =WaitAnimForDuration - str r0, [r4, 0x1C] - ldr r1, _080D6818 @ =DestroyAnimSprite - adds r0, r4, 0 - bl StoreSpriteCallbackInData - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080D6810: .4byte gBattleAnimArgs -_080D6814: .4byte WaitAnimForDuration -_080D6818: .4byte DestroyAnimSprite - thumb_func_end sub_80D679C - - thumb_func_start sub_80D681C -sub_80D681C: @ 80D681C - push {r4-r6,lr} - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - ldr r6, _080D6864 @ =gAnimBankTarget - ldrb r0, [r6] - movs r1, 0 - bl GetBattlerSpriteCoord - ldr r1, _080D6868 @ =gTasks - lsls r4, r5, 2 - adds r4, r5 - lsls r4, 3 - adds r4, r1 - lsls r0, 24 - ldr r5, _080D686C @ =gBattleAnimArgs - lsrs r0, 24 - ldrh r1, [r5] - adds r0, r1 - strh r0, [r4, 0x8] - ldrb r0, [r6] - movs r1, 0x1 - bl GetBattlerSpriteCoord - lsls r0, 24 - lsrs r0, 24 - ldrh r1, [r5, 0x2] - adds r0, r1 - strh r0, [r4, 0xA] - ldrh r0, [r5, 0x4] - strh r0, [r4, 0xC] - ldr r0, _080D6870 @ =sub_80D6874 - str r0, [r4] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080D6864: .4byte gAnimBankTarget -_080D6868: .4byte gTasks -_080D686C: .4byte gBattleAnimArgs -_080D6870: .4byte sub_80D6874 - thumb_func_end sub_80D681C - thumb_func_start sub_80D6874 sub_80D6874: @ 80D6874 push {r4-r7,lr} diff --git a/ld_script.txt b/ld_script.txt index 688682a34..8628f5331 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -293,6 +293,7 @@ SECTIONS { src/battle/anim/thunder.o(.text); src/battle/anim/beta_beat_up.o(.text); src/battle/anim/shock.o(.text); + src/battle/anim/current.o(.text); asm/current.o(.text); asm/ice.o(.text); src/battle/anim/fight.o(.text); diff --git a/src/battle/anim/current.c b/src/battle/anim/current.c new file mode 100755 index 000000000..d38ae94a7 --- /dev/null +++ b/src/battle/anim/current.c @@ -0,0 +1,143 @@ +#include "global.h" +#include "battle_anim.h" +#include "main.h" +#include "rom_8077ABC.h" +#include "trig.h" +#include "constants/battle_constants.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; + +static void sub_80D6514(struct Sprite *sprite); +static void sub_80D672C(struct Sprite *sprite); +extern void sub_80D6874(u8 taskId); + + +void sub_80D648C(struct Sprite *sprite) +{ + InitAnimSpritePos(sprite, 1); + + sprite->data[0] = gBattleAnimArgs[3]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); + + InitAnimSpriteTranslationDeltas(sprite); + sprite->data[5] = gBattleAnimArgs[2]; + sprite->data[6] = gBattleAnimArgs[5]; + sprite->data[7] = gBattleAnimArgs[4]; + sprite->oam.tileNum += gBattleAnimArgs[6] * 4; + + sprite->callback = sub_80D6514; + sprite->callback(sprite); +} + +static void sub_80D6514(struct Sprite *sprite) +{ + if (!TranslateAnimSpriteByDeltas(sprite)) + { + sprite->pos2.x += Sin(sprite->data[7], sprite->data[5]); + sprite->pos2.y += Cos(sprite->data[7], sprite->data[5]); + + sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; + if (sprite->data[7] % 3 == 0) + { + sprite->invisible ^= 1; + } + } + else + { + DestroyAnimSprite(sprite); + } +} + +static void sub_80D658C(struct Sprite *sprite) +{ + if (--sprite->data[5] == -1) + { + sprite->invisible ^= 1; + sprite->data[5] = sprite->data[4]; + } + + if (sprite->data[3]-- <= 0) + { + DestroyAnimSprite(sprite); + } +} + +void sub_80D65DC(struct Sprite *sprite) +{ + if (!gMain.inBattle || GetBattlerSide(gAnimBankTarget) == B_SIDE_PLAYER) + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + + sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[1]; + sprite->pos1.y = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[2]; + sprite->data[3] = gBattleAnimArgs[0]; + sprite->data[4] = gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[3]; + sprite->callback = sub_80D658C; +} + +void sub_80D6658(struct Sprite *sprite) +{ + u8 bank; + + sprite->data[0] = gBattleAnimArgs[3]; + if (gBattleAnimArgs[7] & 0x8000) + bank = gAnimBankTarget; + else + bank = gAnimBankAttacker; + + if (!gMain.inBattle || GetBattlerSide(bank) == B_SIDE_PLAYER) + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + + sprite->pos1.x = GetBattlerSpriteCoord(bank, 2) + gBattleAnimArgs[0]; + sprite->pos1.y = GetBattlerSpriteCoord(bank, 3) + gBattleAnimArgs[1]; + + sprite->data[4] = gBattleAnimArgs[7] & 0x7FFF; + sprite->data[5] = gBattleAnimArgs[2]; + sprite->data[6] = gBattleAnimArgs[5]; + sprite->data[7] = gBattleAnimArgs[4]; + + sprite->oam.tileNum += gBattleAnimArgs[6] * 4; + sprite->callback = sub_80D672C; + sprite->callback(sprite); +} + +static void sub_80D672C(struct Sprite *sprite) +{ + sprite->pos2.x = Sin(sprite->data[7], sprite->data[5]); + sprite->pos2.y = Cos(sprite->data[7], sprite->data[5]); + + sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; + if (sprite->data[7] % sprite->data[4] == 0) + sprite->invisible ^= 1; + + if (sprite->data[0]-- <= 0) + DestroyAnimSprite(sprite); +} + +void sub_80D679C(struct Sprite *sprite) +{ + sub_8078764(sprite, 0); + sprite->oam.tileNum += gBattleAnimArgs[3] * 4; + + if (gBattleAnimArgs[3] == 1) + sprite->oam.matrixNum = 8; + else if (gBattleAnimArgs[3] == 2) + sprite->oam.matrixNum = 16; + + sprite->data[0] = gBattleAnimArgs[2]; + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80D681C(u8 taskId) +{ + gTasks[taskId].data[0] = GetBattlerSpriteCoord(gAnimBankTarget, 0) + gBattleAnimArgs[0]; + gTasks[taskId].data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 1) + gBattleAnimArgs[1]; + gTasks[taskId].data[2] = gBattleAnimArgs[2]; + gTasks[taskId].func = sub_80D6874; +} |