summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorwho-knows-who <j.williams.8@warwick.ac.uk>2018-07-31 19:38:03 +0100
committerwho-knows-who <j.williams.8@warwick.ac.uk>2018-07-31 19:38:03 +0100
commit4f5409b7082570879ff78f4f0963a5a7cff2edfa (patch)
tree60c62bb601bd3b1213b58e0f98796ca8318c6aec /src
parentd99b457ce5e77a65cc49e8b03e9fae563756b207 (diff)
sub_80DA4D8 fakematching
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/flying.c119
1 files changed, 119 insertions, 0 deletions
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;
+
+}