diff options
-rw-r--r-- | asm/battle_anim_80CA710.s | 418 | ||||
-rwxr-xr-x | src/battle_anim_80CA710.c | 233 |
2 files changed, 232 insertions, 419 deletions
diff --git a/asm/battle_anim_80CA710.s b/asm/battle_anim_80CA710.s index da2250042..ddfce03a8 100644 --- a/asm/battle_anim_80CA710.s +++ b/asm/battle_anim_80CA710.s @@ -6,424 +6,6 @@ .text - thumb_func_start sub_80CB4CC -sub_80CB4CC: @ 80CB4CC - push {r4-r6,lr} - adds r5, r0, 0 - movs r1, 0x2E - ldrsh r0, [r5, r1] - cmp r0, 0 - beq _080CB4DE - cmp r0, 0x1 - beq _080CB538 - b _080CB58A -_080CB4DE: - ldr r6, _080CB530 @ =gBattleAnimEnemyMonIndex - ldrb r0, [r6] - bl GetBankSide - lsls r0, 24 - cmp r0, 0 - bne _080CB4F6 - ldr r1, _080CB534 @ =gBattleAnimArgs - movs r2, 0 - ldrsh r0, [r1, r2] - negs r0, r0 - strh r0, [r1] -_080CB4F6: - ldrb r0, [r6] - movs r1, 0 - bl sub_8077ABC - lsls r0, 24 - ldr r4, _080CB534 @ =gBattleAnimArgs - lsrs r0, 24 - ldrh r1, [r4] - adds r0, r1 - strh r0, [r5, 0x20] - ldrb r0, [r6] - movs r1, 0x1 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - ldrh r4, [r4, 0x2] - adds r0, r4 - strh r0, [r5, 0x22] - adds r2, r5, 0 - adds r2, 0x3E - ldrb r0, [r2] - movs r1, 0x4 - orrs r0, r1 - strb r0, [r2] - ldrh r0, [r5, 0x2E] - adds r0, 0x1 - strh r0, [r5, 0x2E] - b _080CB58A - .align 2, 0 -_080CB530: .4byte gBattleAnimEnemyMonIndex -_080CB534: .4byte gBattleAnimArgs -_080CB538: - adds r2, r5, 0 - adds r2, 0x3E - ldrb r1, [r2] - movs r0, 0x5 - negs r0, r0 - ands r0, r1 - strb r0, [r2] - adds r0, r5, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _080CB58A - adds r0, r5, 0 - movs r1, 0x1 - bl ChangeSpriteAffineAnim - movs r0, 0x19 - strh r0, [r5, 0x2E] - ldr r4, _080CB590 @ =gBattleAnimPlayerMonIndex - ldrb r0, [r4] - movs r1, 0x2 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x32] - ldrb r0, [r4] - movs r1, 0x3 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x36] - ldr r0, _080CB594 @ =sub_8078CC0 - str r0, [r5, 0x1C] - ldr r1, _080CB598 @ =move_anim_8072740 - adds r0, r5, 0 - bl oamt_set_x3A_32 -_080CB58A: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080CB590: .4byte gBattleAnimPlayerMonIndex -_080CB594: .4byte sub_8078CC0 -_080CB598: .4byte move_anim_8072740 - thumb_func_end sub_80CB4CC - - thumb_func_start sub_80CB59C -sub_80CB59C: @ 80CB59C - push {r4,r5,lr} - adds r5, r0, 0 - movs r1, 0x2E - ldrsh r0, [r5, r1] - cmp r0, 0 - bne _080CB608 - ldr r4, _080CB614 @ =gBattleAnimPlayerMonIndex - ldrb r0, [r4] - movs r1, 0x2 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x20] - ldrb r0, [r4] - movs r1, 0x1 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - strh r0, [r5, 0x22] - ldr r4, _080CB618 @ =gBattleAnimArgs - ldrh r0, [r4] - strh r0, [r5, 0x24] - ldrh r0, [r4, 0x2] - strh r0, [r5, 0x26] - ldrb r0, [r4, 0x4] - adds r0, 0x1E - adds r1, r5, 0 - adds r1, 0x43 - strb r0, [r1] - ldrb r1, [r4, 0x6] - adds r0, r5, 0 - bl StartSpriteAnim - ldrh r0, [r4, 0x8] - strh r0, [r5, 0x32] - ldrh r0, [r5, 0x2E] - adds r0, 0x1 - strh r0, [r5, 0x2E] - movs r2, 0x22 - ldrsh r0, [r5, r2] - movs r2, 0x26 - ldrsh r1, [r5, r2] - adds r0, r1 - cmp r0, 0x78 - ble _080CB608 - ldrh r0, [r5, 0x22] - adds r1, r0, 0 - subs r1, 0x78 - ldrh r2, [r5, 0x26] - adds r0, r2 - adds r1, r0 - strh r1, [r5, 0x22] -_080CB608: - ldr r0, _080CB61C @ =sub_80CB710 - str r0, [r5, 0x1C] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080CB614: .4byte gBattleAnimPlayerMonIndex -_080CB618: .4byte gBattleAnimArgs -_080CB61C: .4byte sub_80CB710 - thumb_func_end sub_80CB59C - - thumb_func_start sub_80CB620 -sub_80CB620: @ 80CB620 - push {r4-r6,lr} - mov r6, r10 - mov r5, r9 - mov r4, r8 - push {r4-r6} - sub sp, 0x4 - mov r9, r0 - ldr r4, _080CB6FC @ =gBattleAnimPlayerMonIndex - ldrb r0, [r4] - movs r1, 0x2 - bl sub_8077ABC - adds r5, r0, 0 - lsls r5, 24 - lsrs r5, 24 - ldrb r0, [r4] - movs r1, 0x3 - bl sub_8077ABC - mov r8, r0 - mov r0, r8 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - ldr r6, _080CB700 @ =gBattleAnimEnemyMonIndex - ldrb r0, [r6] - movs r1, 0x2 - bl sub_8077ABC - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldrb r0, [r6] - movs r1, 0x3 - bl sub_8077ABC - adds r2, r0, 0 - lsls r2, 24 - subs r4, r5 - lsls r4, 16 - lsrs r2, 24 - mov r1, r8 - subs r2, r1 - lsls r2, 16 - lsrs r2, 16 - lsrs r3, r4, 16 - mov r10, r3 - asrs r4, 16 - ldr r6, _080CB704 @ =gBattleAnimArgs - movs r1, 0 - ldrsh r0, [r6, r1] - muls r0, r4 - movs r1, 0x64 - str r2, [sp] - bl __divsi3 - adds r5, r0 - mov r3, r9 - strh r5, [r3, 0x20] - ldr r2, [sp] - lsls r0, r2, 16 - asrs r0, 16 - movs r3, 0 - ldrsh r1, [r6, r3] - muls r0, r1 - movs r1, 0x64 - bl __divsi3 - add r8, r0 - mov r1, r8 - mov r0, r9 - strh r1, [r0, 0x22] - ldrh r0, [r6, 0x2] - mov r3, r9 - strh r0, [r3, 0x24] - ldrh r0, [r6, 0x4] - strh r0, [r3, 0x26] - ldrb r0, [r6, 0x6] - adds r0, 0x1E - mov r1, r9 - adds r1, 0x43 - strb r0, [r1] - ldrb r1, [r6, 0x8] - mov r0, r9 - bl StartSpriteAnim - ldrh r0, [r6, 0xA] - mov r1, r9 - strh r0, [r1, 0x32] - ldr r0, _080CB708 @ =sub_80CB710 - str r0, [r1, 0x1C] - ldr r1, _080CB70C @ =gUnknown_03000728 - mov r3, r9 - ldrh r0, [r3, 0x20] - strh r0, [r1] - ldrh r0, [r3, 0x22] - strh r0, [r1, 0x2] - mov r0, r10 - strh r0, [r1, 0x4] - ldr r2, [sp] - strh r2, [r1, 0x6] - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080CB6FC: .4byte gBattleAnimPlayerMonIndex -_080CB700: .4byte gBattleAnimEnemyMonIndex -_080CB704: .4byte gBattleAnimArgs -_080CB708: .4byte sub_80CB710 -_080CB70C: .4byte gUnknown_03000728 - thumb_func_end sub_80CB620 - - thumb_func_start sub_80CB710 -sub_80CB710: @ 80CB710 - push {lr} - adds r3, r0, 0 - ldrh r1, [r3, 0x2E] - adds r1, 0x1 - strh r1, [r3, 0x2E] - lsls r1, 16 - asrs r1, 16 - movs r2, 0x32 - ldrsh r0, [r3, r2] - subs r0, 0xA - cmp r1, r0 - ble _080CB750 - movs r0, 0x2E - ldrsh r1, [r3, r0] - lsrs r0, r1, 31 - adds r0, r1, r0 - asrs r0, 1 - lsls r0, 1 - subs r1, r0 - movs r2, 0x3E - adds r2, r3 - mov r12, r2 - movs r0, 0x1 - ands r1, r0 - lsls r1, 2 - ldrb r2, [r2] - movs r0, 0x5 - negs r0, r0 - ands r0, r2 - orrs r0, r1 - mov r1, r12 - strb r0, [r1] -_080CB750: - movs r2, 0x2E - ldrsh r1, [r3, r2] - movs r2, 0x32 - ldrsh r0, [r3, r2] - cmp r1, r0 - ble _080CB762 - adds r0, r3, 0 - bl move_anim_8072740 -_080CB762: - pop {r0} - bx r0 - thumb_func_end sub_80CB710 - - thumb_func_start sub_80CB768 -sub_80CB768: @ 80CB768 - push {r4-r6,lr} - adds r6, r0, 0 - movs r1, 0x2E - ldrsh r0, [r6, r1] - cmp r0, 0 - bne _080CB7A8 - ldr r5, _080CB7E4 @ =gBattleAnimPlayerMonIndex - ldrb r0, [r5] - movs r1, 0x2 - bl sub_8077ABC - lsls r0, 24 - ldr r4, _080CB7E8 @ =gBattleAnimArgs - lsrs r0, 24 - ldrh r2, [r4] - adds r0, r2 - strh r0, [r6, 0x20] - ldrb r0, [r5] - movs r1, 0x1 - bl sub_8077ABC - lsls r0, 24 - lsrs r0, 24 - ldrh r1, [r4, 0x2] - adds r0, r1 - strh r0, [r6, 0x22] - ldrh r0, [r4, 0x4] - strh r0, [r6, 0x30] - ldrh r0, [r4, 0x6] - strh r0, [r6, 0x32] - ldrh r0, [r4, 0x8] - strh r0, [r6, 0x34] -_080CB7A8: - ldrh r0, [r6, 0x2E] - adds r0, 0x1 - strh r0, [r6, 0x2E] - ldrh r1, [r6, 0x30] - muls r0, r1 - strh r0, [r6, 0x24] - movs r2, 0x2E - ldrsh r1, [r6, r2] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - movs r1, 0xFF - ands r0, r1 - movs r2, 0x32 - ldrsh r1, [r6, r2] - bl Sin - strh r0, [r6, 0x26] - movs r0, 0x2E - ldrsh r1, [r6, r0] - movs r2, 0x34 - ldrsh r0, [r6, r2] - cmp r1, r0 - ble _080CB7DE - adds r0, r6, 0 - bl move_anim_8072740 -_080CB7DE: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080CB7E4: .4byte gBattleAnimPlayerMonIndex -_080CB7E8: .4byte gBattleAnimArgs - thumb_func_end sub_80CB768 - - thumb_func_start sub_80CB7EC -sub_80CB7EC: @ 80CB7EC - push {r4,r5,lr} - movs r2, 0x20 - ldrsh r4, [r0, r2] - lsls r4, 8 - movs r3, 0x22 - ldrsh r2, [r0, r3] - orrs r4, r2 - movs r5, 0x3A - ldrsh r2, [r0, r5] - lsls r2, 8 - movs r5, 0x3C - ldrsh r3, [r0, r5] - orrs r2, r3 - lsls r1, 8 - strh r4, [r0, 0x38] - strh r2, [r0, 0x3A] - strh r1, [r0, 0x3C] - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_80CB7EC - thumb_func_start sub_80CB814 sub_80CB814: @ 80CB814 push {r4-r7,lr} diff --git a/src/battle_anim_80CA710.c b/src/battle_anim_80CA710.c index 191280e7b..50bdb3005 100755 --- a/src/battle_anim_80CA710.c +++ b/src/battle_anim_80CA710.c @@ -14,6 +14,7 @@ extern s16 gBattleAnimArgs[8]; extern u8 gBattleAnimPlayerMonIndex; extern u8 gBattleAnimEnemyMonIndex; extern struct SpriteTemplate gSpriteTemplate_83D631C; +extern s16 gUnknown_03000728[]; void sub_80CA768(struct Sprite* sprite); void sub_80CA8B4(struct Sprite* sprite); @@ -30,6 +31,7 @@ void sub_80CB09C(struct Sprite* sprite); void sub_80CB1A4(struct Sprite* sprite); void sub_80CB298(struct Sprite* sprite); void sub_80CB2D4(struct Sprite* sprite); +void sub_80CB710(struct Sprite* sprite); void sub_80787B0(struct Sprite *sprite, u8 a2); void sub_8078764(struct Sprite *sprite, u8 a2); @@ -37,6 +39,7 @@ void sub_8078B34(struct Sprite *sprite); void sub_8078D60(struct Sprite *sprite); void sub_80786EC(struct Sprite *sprite); void sub_80782D8(struct Sprite *sprite); +void sub_8078CC0(struct Sprite *sprite); void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4); u8 sub_8079ED4(u8 slot); @@ -828,4 +831,232 @@ _080CB4C2:\n\ _080CB4C8: .4byte gTasks\n\ .syntax divided\n"); } -#endif
\ No newline at end of file +#endif + +void sub_80CB4CC(struct Sprite* sprite) +{ + switch(sprite->data0) + { + case 0: + { + if(GetBankSide(gBattleAnimEnemyMonIndex) == 0) + { + s16 a = gBattleAnimArgs[0]; + gBattleAnimArgs[0] = -a; + } + sprite->pos1.x = sub_8077ABC(gBattleAnimEnemyMonIndex, 0) + gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077ABC(gBattleAnimEnemyMonIndex, 1) + gBattleAnimArgs[1]; + sprite->invisible = 1; + sprite->data0++; + break; + } + case 1: + { + sprite->invisible = 0; + if(sprite->affineAnimEnded) + { + ChangeSpriteAffineAnim(sprite, 1); + sprite->data0 = 25; + sprite->data2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); + sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + sprite->callback = sub_8078CC0; + oamt_set_x3A_32(sprite, move_anim_8072740); + break; + } + } + } +} + +void sub_80CB59C(struct Sprite* sprite) +{ + if(!sprite->data0) + { + sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 1); + sprite->pos2.x = gBattleAnimArgs[0]; + sprite->pos2.y = gBattleAnimArgs[1]; + sprite->subpriority = gBattleAnimArgs[2] + 30; + StartSpriteAnim(sprite, gBattleAnimArgs[3]); + sprite->data2 = gBattleAnimArgs[4]; + sprite->data0++; + if((sprite->pos1.y + sprite->pos2.y) > 120) + { + sprite->pos1.y += -120 + (sprite->pos2.y + sprite->pos1.y); + } + } + sprite->callback = sub_80CB710; +} + +#ifdef NONMATCHING +void sub_80CB620(struct Sprite* sprite) +{ + u8 p1 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); + u8 p2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + u8 e1 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); + u8 e2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); + e1 -= p1; + e2 -= p2; + sprite->pos1.x = p1 + ((gBattleAnimArgs[0] * e1) / 100); + sprite->pos1.y = p2 + ((gBattleAnimArgs[0] * e2) / 100); + sprite->pos2.x = gBattleAnimArgs[1]; + sprite->pos2.y = gBattleAnimArgs[2]; + sprite->subpriority = gBattleAnimArgs[3] + 30; + StartSpriteAnim(sprite, gBattleAnimArgs[4]); + sprite->data2 = gBattleAnimArgs[5]; + sprite->callback = sub_80CB710; + gUnknown_03000728[0] = sprite->pos1.x; + gUnknown_03000728[1] = sprite->pos1.y; + gUnknown_03000728[2] = e1; + gUnknown_03000728[3] = e2; +} +#else +__attribute__((naked)) +void sub_80CB620(struct Sprite* sprite) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + mov r6, r10\n\ + mov r5, r9\n\ + mov r4, r8\n\ + push {r4-r6}\n\ + sub sp, 0x4\n\ + mov r9, r0\n\ + ldr r4, _080CB6FC @ =gBattleAnimPlayerMonIndex\n\ + ldrb r0, [r4]\n\ + movs r1, 0x2\n\ + bl sub_8077ABC\n\ + adds r5, r0, 0\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + ldrb r0, [r4]\n\ + movs r1, 0x3\n\ + bl sub_8077ABC\n\ + mov r8, r0\n\ + mov r0, r8\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + ldr r6, _080CB700 @ =gBattleAnimEnemyMonIndex\n\ + ldrb r0, [r6]\n\ + movs r1, 0x2\n\ + bl sub_8077ABC\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldrb r0, [r6]\n\ + movs r1, 0x3\n\ + bl sub_8077ABC\n\ + adds r2, r0, 0\n\ + lsls r2, 24\n\ + subs r4, r5\n\ + lsls r4, 16\n\ + lsrs r2, 24\n\ + mov r1, r8\n\ + subs r2, r1\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + lsrs r3, r4, 16\n\ + mov r10, r3\n\ + asrs r4, 16\n\ + ldr r6, _080CB704 @ =gBattleAnimArgs\n\ + movs r1, 0\n\ + ldrsh r0, [r6, r1]\n\ + muls r0, r4\n\ + movs r1, 0x64\n\ + str r2, [sp]\n\ + bl __divsi3\n\ + adds r5, r0\n\ + mov r3, r9\n\ + strh r5, [r3, 0x20]\n\ + ldr r2, [sp]\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + movs r3, 0\n\ + ldrsh r1, [r6, r3]\n\ + muls r0, r1\n\ + movs r1, 0x64\n\ + bl __divsi3\n\ + add r8, r0\n\ + mov r1, r8\n\ + mov r0, r9\n\ + strh r1, [r0, 0x22]\n\ + ldrh r0, [r6, 0x2]\n\ + mov r3, r9\n\ + strh r0, [r3, 0x24]\n\ + ldrh r0, [r6, 0x4]\n\ + strh r0, [r3, 0x26]\n\ + ldrb r0, [r6, 0x6]\n\ + adds r0, 0x1E\n\ + mov r1, r9\n\ + adds r1, 0x43\n\ + strb r0, [r1]\n\ + ldrb r1, [r6, 0x8]\n\ + mov r0, r9\n\ + bl StartSpriteAnim\n\ + ldrh r0, [r6, 0xA]\n\ + mov r1, r9\n\ + strh r0, [r1, 0x32]\n\ + ldr r0, _080CB708 @ =sub_80CB710\n\ + str r0, [r1, 0x1C]\n\ + ldr r1, _080CB70C @ =gUnknown_03000728\n\ + mov r3, r9\n\ + ldrh r0, [r3, 0x20]\n\ + strh r0, [r1]\n\ + ldrh r0, [r3, 0x22]\n\ + strh r0, [r1, 0x2]\n\ + mov r0, r10\n\ + strh r0, [r1, 0x4]\n\ + ldr r2, [sp]\n\ + strh r2, [r1, 0x6]\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080CB6FC: .4byte gBattleAnimPlayerMonIndex\n\ +_080CB700: .4byte gBattleAnimEnemyMonIndex\n\ +_080CB704: .4byte gBattleAnimArgs\n\ +_080CB708: .4byte sub_80CB710\n\ +_080CB70C: .4byte gUnknown_03000728\n\ + .syntax divided\n"); +} +#endif + +void sub_80CB710(struct Sprite* sprite) +{ + if(++sprite->data0 > (sprite->data2 - 10)) + { + sprite->invisible = sprite->data0 % 2; + } + if(sprite->data0 > sprite->data2) move_anim_8072740(sprite); +} + +void sub_80CB768(struct Sprite* sprite) +{ + if(!sprite->data0) + { + sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2) + gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 1) + gBattleAnimArgs[1]; + sprite->data1 = gBattleAnimArgs[2]; + sprite->data2 = gBattleAnimArgs[3]; + sprite->data3 = gBattleAnimArgs[4]; + } + sprite->data0++; + sprite->pos2.x = sprite->data1 * sprite->data0; + sprite->pos2.y = Sin((sprite->data0 * 20) & 0xFF, sprite->data2); + if(sprite->data0 > sprite->data3) move_anim_8072740(sprite); +} + +void sub_80CB7EC(struct Sprite* sprite, s16 c) +{ + s32 a = (sprite->pos1.x * 256) | sprite->pos1.y; + s32 b = (sprite->data6 * 256) | sprite->data7; + c *= 256; + sprite->data5 = a; + sprite->data6 = b; + sprite->data7 = c; +}
\ No newline at end of file |