diff options
-rw-r--r-- | asm/flying.s | 265 | ||||
-rw-r--r-- | src/battle/anim/flying.c | 119 |
2 files changed, 119 insertions, 265 deletions
diff --git a/asm/flying.s b/asm/flying.s index 126f18206..29192b7b3 100644 --- a/asm/flying.s +++ b/asm/flying.s @@ -7,271 +7,6 @@ @ flying - thumb_func_start sub_80DA4D8 -sub_80DA4D8: @ 80DA4D8 - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r7, r0, 0 - adds r5, r7, 0 - adds r5, 0x2E - ldr r0, _080DA4F8 @ =gBattleAnimArgs - ldrh r1, [r0, 0xE] - movs r0, 0x80 - lsls r0, 1 - ands r0, r1 - cmp r0, 0 - beq _080DA500 - ldr r0, _080DA4FC @ =gAnimBankAttacker - b _080DA502 - .align 2, 0 -_080DA4F8: .4byte gBattleAnimArgs -_080DA4FC: .4byte gAnimBankAttacker -_080DA500: - ldr r0, _080DA5B0 @ =gAnimBankTarget -_080DA502: - ldrb r6, [r0] - adds r0, r6, 0 - bl GetBattlerSide - lsls r0, 24 - cmp r0, 0 - bne _080DA518 - ldr r1, _080DA5B4 @ =gBattleAnimArgs - ldrh r0, [r1] - negs r0, r0 - strh r0, [r1] -_080DA518: - adds r0, r6, 0 - movs r1, 0 - bl GetBattlerSpriteCoord - lsls r0, 24 - ldr r4, _080DA5B4 @ =gBattleAnimArgs - lsrs r0, 24 - ldrh r1, [r4] - adds r0, r1 - strh r0, [r7, 0x20] - adds r0, r6, 0 - movs r1, 0x1 - bl GetBattlerSpriteCoord - lsls r0, 24 - ldrh r1, [r4, 0x2] - lsrs r0, 24 - adds r1, r0, r1 - strh r1, [r7, 0x22] - lsls r1, 8 - strh r1, [r5, 0x8] - ldrh r1, [r4, 0xC] - adds r0, r1 - lsls r0, 1 - ldrh r2, [r5, 0xE] - movs r1, 0x1 - ands r1, r2 - orrs r1, r0 - strh r1, [r5, 0xE] - ldrb r0, [r5] - movs r2, 0x4 - mov r8, r2 - mov r1, r8 - orrs r0, r1 - strb r0, [r5] - ldrh r0, [r4, 0x4] - ldrb r1, [r4, 0x4] - strh r1, [r5, 0x2] - lsls r0, 16 - lsrs r0, 24 - strh r0, [r5, 0xA] - ldrh r0, [r4, 0x6] - strh r0, [r5, 0x4] - ldrh r0, [r4, 0x8] - strh r0, [r5, 0x6] - ldrh r0, [r4, 0xA] - strh r0, [r5, 0xC] - subs r1, 0x40 - lsls r1, 16 - lsrs r1, 16 - cmp r1, 0x7F - bhi _080DA618 - ldr r0, _080DA5B8 @ =gMain - ldr r2, _080DA5BC @ =0x0000043d - adds r0, r2 - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080DA5C0 - adds r0, r6, 0 - bl sub_8079ED4 - lsls r0, 24 - lsrs r0, 24 - adds r0, 0x1 - movs r1, 0x3 - ands r0, r1 - lsls r0, 2 - ldrb r2, [r7, 0x5] - movs r1, 0xD - negs r1, r1 - ands r1, r2 - orrs r1, r0 - strb r1, [r7, 0x5] - b _080DA5D8 - .align 2, 0 -_080DA5B0: .4byte gAnimBankTarget -_080DA5B4: .4byte gBattleAnimArgs -_080DA5B8: .4byte gMain -_080DA5BC: .4byte 0x0000043d -_080DA5C0: - adds r0, r6, 0 - bl sub_8079ED4 - movs r1, 0x3 - ands r1, r0 - lsls r1, 2 - ldrb r2, [r7, 0x5] - movs r0, 0xD - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r7, 0x5] -_080DA5D8: - ldrb r1, [r5, 0xE] - movs r4, 0x2 - negs r4, r4 - adds r0, r4, 0 - ands r0, r1 - strb r0, [r5, 0xE] - movs r1, 0x4 - ldrsh r0, [r5, r1] - movs r1, 0x80 - lsls r1, 8 - ands r0, r1 - cmp r0, 0 - bne _080DA678 - adds r3, r7, 0 - adds r3, 0x3F - ldrb r2, [r3] - lsls r0, r2, 31 - lsrs r0, 31 - movs r1, 0x1 - eors r1, r0 - adds r0, r4, 0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - lsls r0, 31 - lsrs r0, 31 - adds r1, r7, 0 - adds r1, 0x2A - strb r0, [r1] - ldrb r0, [r3] - movs r1, 0x4 - b _080DA66E -_080DA618: - adds r0, r6, 0 - bl sub_8079ED4 - movs r1, 0x3 - ands r1, r0 - lsls r1, 2 - ldrb r2, [r7, 0x5] - movs r0, 0xD - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r7, 0x5] - ldrb r0, [r5, 0xE] - movs r4, 0x1 - orrs r0, r4 - strb r0, [r5, 0xE] - movs r2, 0x4 - ldrsh r0, [r5, r2] - movs r1, 0x80 - lsls r1, 8 - ands r0, r1 - cmp r0, 0 - beq _080DA678 - adds r3, r7, 0 - adds r3, 0x3F - ldrb r2, [r3] - lsls r1, r2, 31 - lsrs r1, 31 - movs r0, 0x1 - eors r1, r0 - ands r1, r4 - movs r0, 0x2 - negs r0, r0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - lsls r0, 31 - lsrs r0, 31 - adds r1, r7, 0 - adds r1, 0x2A - strb r0, [r1] - ldrb r0, [r3] - mov r1, r8 -_080DA66E: - orrs r0, r1 - movs r1, 0x11 - negs r1, r1 - ands r0, r1 - strb r0, [r3] -_080DA678: - ldrh r1, [r5, 0x2] - lsrs r1, 6 - lsls r1, 4 - ldrb r2, [r5] - movs r0, 0xF - ands r0, r2 - orrs r0, r1 - strb r0, [r5] - ldr r3, _080DA6E4 @ =gSineTable - ldrh r0, [r5, 0x2] - lsls r0, 1 - adds r0, r3 - movs r2, 0 - ldrsh r1, [r0, r2] - ldrb r0, [r5, 0xC] - muls r0, r1 - asrs r0, 8 - strh r0, [r7, 0x24] - ldrb r2, [r7, 0x3] - lsls r2, 26 - lsrs r2, 27 - movs r1, 0x24 - ldrsh r0, [r7, r1] - negs r0, r0 - asrs r0, 1 - ldrb r5, [r5, 0xA] - adds r0, r5 - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 1 - adds r1, r3 - ldrh r4, [r1] - ldr r1, _080DA6E8 @ =gOamMatrices - lsls r2, 3 - adds r2, r1 - adds r0, 0x40 - lsls r0, 1 - adds r0, r3 - ldrh r0, [r0] - strh r0, [r2, 0x6] - strh r0, [r2] - strh r4, [r2, 0x2] - lsls r0, r4, 16 - asrs r0, 16 - negs r0, r0 - strh r0, [r2, 0x4] - ldr r0, _080DA6EC @ =sub_80DA6F0 - str r0, [r7, 0x1C] - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080DA6E4: .4byte gSineTable -_080DA6E8: .4byte gOamMatrices -_080DA6EC: .4byte sub_80DA6F0 - thumb_func_end sub_80DA4D8 thumb_func_start sub_80DA6F0 sub_80DA6F0: @ 80DA6F0 diff --git a/src/battle/anim/flying.c b/src/battle/anim/flying.c index 35022db1f..dd3baebb2 100644 --- a/src/battle/anim/flying.c +++ b/src/battle/anim/flying.c @@ -4,11 +4,13 @@ #include "palette.h" #include "rom_8077ABC.h" #include "trig.h" +#include "main.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; extern u8 gAnimVisualTaskCount; +extern struct OamMatrix gOamMatrices[]; void sub_80785E4(struct Sprite *sprite); void sub_80DA034(struct Sprite *sprite); @@ -34,6 +36,8 @@ void sub_80DB5E4(struct Sprite *sprite); void sub_80DA0DC(u8 taskId); +int sub_80DA6F0(int a1); + const struct SpriteTemplate gBattleAnimSpriteTemplate_83DA380 = { .tileTag = 10009, @@ -633,3 +637,118 @@ void sub_80DA48C(struct Sprite *sprite) gAnimVisualTaskCount--; } } + +void sub_80DA4D8(struct Sprite *sprite ) { + + s16 * data; + u8 bank; + s16 spriteCoord; + s16 v6; + + u32 t1, t2; + + int v7; + int v8; + + u32 matrixNum; + + int sinVal1; + int v14; + //s16 sinVal2; + //int temp; + register s16 sinVal2 asm ("r4"); + register int temp asm ("r0"); + + data = sprite->data; + + if (gBattleAnimArgs[7] & 0x100) { + bank = gAnimBankAttacker; + } else { + bank = gAnimBankTarget; + } + + if(!GetBattlerSide(bank)) { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + + sprite->pos1.x = GetBattlerSpriteCoord(bank, 0) + gBattleAnimArgs[0]; + + spriteCoord = (u8) GetBattlerSpriteCoord(bank, 1u); + v6 = spriteCoord + gBattleAnimArgs[1]; + sprite->pos1.y = spriteCoord + gBattleAnimArgs[1]; + data[4] = v6 << 8; + + t1 = 2 * (spriteCoord + (u16)gBattleAnimArgs[6]); + data[7] = (data[7] & 1) | t1; + + *(u8*)data |= 4u; + + v7 = (u16) gBattleAnimArgs[2]; + v8 = (u8) gBattleAnimArgs[2]; + + data[1] = (u8) gBattleAnimArgs[2]; + v7 = v7 << 16; + v7 = ((u32)v7) >> 24; + data[5] = v7; + data[2] = gBattleAnimArgs[3]; + data[3] = gBattleAnimArgs[4]; + data[6] = gBattleAnimArgs[5]; + + if ((u16)(v8 - 64) <= 0x7f){ + + if (gMain.inBattle) { + sprite->oam.priority = sub_8079ED4(bank) + 1; + } else { + sprite->oam.priority = sub_8079ED4(bank); + } + + // set smallest bit to 0 + *(u8*)(data + 7) = data[7] & -0x2; + + if (!(data[2] & 0x8000)) { + + sprite->hFlip ^= 1; + sprite->animNum = sprite->hFlip; + + sprite->animBeginning = 1; + sprite->animEnded = 0; + } + + } else { + + sprite->oam.priority = sub_8079ED4(bank); + + // set smallest bit to 1 + *(u8*)(data + 7) |= 1u; + + if (data[2] & 0x8000) { + + sprite->hFlip ^= 1; + sprite->animNum = sprite->hFlip; + + sprite->animBeginning = 1; + sprite->animEnded = 0; + } + + } + + // bits 1-4 = data[0]0:3 5-8 = and 5-8 = data[1]6:9 + t2 = (u16)data[1] >> 6 << 4; + *(u8*)data = (15 & (u8)data[0]) | t2; + + sinVal1 = gSineTable[(u16)data[1]]; + sprite->pos2.x = (sinVal1 * (u8)data[6]) >> 8; + + matrixNum = sprite->oam.matrixNum; + + v14 = (u8) ((-sprite->pos2.x >> 1) + (u8)data[5]); + sinVal2 = gSineTable[v14]; + + gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[v14 + 64]; + gOamMatrices[matrixNum].b = sinVal2; + temp = - (s16) sinVal2; + gOamMatrices[matrixNum].c = temp; + + sprite->callback = (SpriteCallback) sub_80DA6F0; + +} |