summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/flying.s265
-rw-r--r--src/battle/anim/flying.c119
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;
+
+}