diff options
author | shinny456 <shinny456@users.noreply.github.com> | 2019-03-03 03:54:44 -0500 |
---|---|---|
committer | huderlem <huderlem@gmail.com> | 2019-03-03 09:33:19 -0600 |
commit | 1e7f4a80c77832d952688206bd7c98e11dba25ba (patch) | |
tree | 7c1ad515b1e080fd13957ece2e133f1a2b91807c /src | |
parent | 4ea5e85bed767a8cffea1fdcfac8669dff06c632 (diff) |
port the rest of flying (leave 2 nonmatchings to egg)
Diffstat (limited to 'src')
-rw-r--r-- | src/flying.c | 1209 |
1 files changed, 1199 insertions, 10 deletions
diff --git a/src/flying.c b/src/flying.c index 48df12a06..7f48e57cb 100644 --- a/src/flying.c +++ b/src/flying.c @@ -4,6 +4,9 @@ #include "trig.h" #include "constants/battle_anim.h" #include "constants/rgb.h" +#include "random.h" + +extern const struct SpriteTemplate gUnknown_085973E8; void sub_810DE70(struct Sprite *); void sub_810DFA8(struct Sprite *); @@ -11,22 +14,29 @@ void sub_810E044(struct Sprite *); void sub_810E13C(struct Sprite *); void sub_810E1C8(struct Sprite *); void sub_810E314(struct Sprite *); -extern void sub_810EA4C(struct Sprite *); -extern void sub_810EAA0(struct Sprite *); -extern void sub_810EC34(struct Sprite *); -extern void sub_810EC94(struct Sprite *); -extern void sub_810ED28(struct Sprite *); -extern void sub_810EE14(struct Sprite *); -extern void sub_810EEF8(struct Sprite *); -extern void sub_810F004(struct Sprite *); -extern void sub_810F084(struct Sprite *); +void sub_810E520(struct Sprite *); +void sub_810EB40(struct Sprite *); +void sub_810EA4C(struct Sprite *); +void sub_810EAA0(struct Sprite *); +void sub_810EC34(struct Sprite *); +void sub_810EC94(struct Sprite *); +void sub_810ED28(struct Sprite *); +void sub_810ED70(struct Sprite *); +void sub_810EDD0(struct Sprite *); +void sub_810EE14(struct Sprite *); +void sub_810EEF8(struct Sprite *); +void sub_810EFA8(struct Sprite *); +void sub_810F004(struct Sprite *); +void sub_810F018(struct Sprite *); +void sub_810F084(struct Sprite *); +void sub_810F140(struct Sprite *); static void sub_810DE98(struct Sprite *); static void sub_810DF18(u8); static void sub_810E028(struct Sprite *); static void sub_810E184(struct Sprite *); static void sub_810E24C(struct Sprite *); -void sub_810E520(struct Sprite *); + const struct SpriteTemplate gUnknown_08596270 = { @@ -626,3 +636,1182 @@ void sub_810E314(struct Sprite *sprite) sprite->callback = sub_810E520; } + +NAKED +void sub_810E520(struct Sprite *sprite) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + adds r5, r0, 0\n\ + movs r6, 0\n\ + adds r4, r5, 0\n\ + adds r4, 0x2E\n\ + ldrb r2, [r4]\n\ + movs r7, 0x1\n\ + movs r0, 0x1\n\ + mov r9, r0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _0810E55A\n\ + ldrb r0, [r4, 0x1]\n\ + adds r1, r0, 0\n\ + adds r1, 0xFF\n\ + strb r1, [r4, 0x1]\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0810E54E\n\ + b _0810EA36\n\ +_0810E54E:\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + ands r0, r2\n\ + strb r0, [r4]\n\ + strb r6, [r4, 0x1]\n\ + b _0810EA36\n\ +_0810E55A:\n\ + ldrh r0, [r4, 0x2]\n\ + lsrs r1, r0, 6\n\ + mov r12, r0\n\ + cmp r1, 0x1\n\ + bne _0810E566\n\ + b _0810E68A\n\ +_0810E566:\n\ + cmp r1, 0x1\n\ + bgt _0810E570\n\ + cmp r1, 0\n\ + beq _0810E57E\n\ + b _0810E97C\n\ +_0810E570:\n\ + cmp r1, 0x2\n\ + bne _0810E576\n\ + b _0810E77E\n\ +_0810E576:\n\ + cmp r1, 0x3\n\ + bne _0810E57C\n\ + b _0810E872\n\ +_0810E57C:\n\ + b _0810E97C\n\ +_0810E57E:\n\ + lsls r1, r2, 24\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0x1\n\ + bne _0810E592\n\ + movs r0, 0x8\n\ + orrs r0, r2\n\ + orrs r0, r7\n\ + strb r0, [r4]\n\ + strb r6, [r4, 0x1]\n\ + b _0810E680\n\ +_0810E592:\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0x3\n\ + bne _0810E5B4\n\ + lsls r0, r2, 30\n\ + lsrs r0, 31\n\ + movs r1, 0x1\n\ + eors r0, r1\n\ + ands r0, r7\n\ + lsls r0, 1\n\ + movs r1, 0x3\n\ + negs r1, r1\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + orrs r1, r7\n\ + strb r1, [r4]\n\ + strb r6, [r4, 0x1]\n\ + b _0810E680\n\ +_0810E5B4:\n\ + movs r0, 0x8\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _0810E680\n\ + adds r3, r5, 0\n\ + adds r3, 0x3F\n\ + ldrb r2, [r3]\n\ + lsls r1, r2, 31\n\ + lsrs r1, 31\n\ + movs r6, 0x1\n\ + eors r1, r6\n\ + ands r1, r7\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + lsls r0, 31\n\ + lsrs r0, 31\n\ + adds r1, r5, 0\n\ + adds r1, 0x2A\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + movs r1, 0x11\n\ + negs r1, r1\n\ + ands r0, r1\n\ + strb r0, [r3]\n\ + ldrb r1, [r4]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0810E672\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0810E642\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E628\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + subs r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E660\n\ +_0810E628:\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + adds r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E660\n\ +_0810E642:\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E656\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + subs r0, 0xC\n\ + b _0810E65E\n\ +_0810E656:\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + adds r0, 0xC\n\ +_0810E65E:\n\ + strb r0, [r1]\n\ +_0810E660:\n\ + ldrb r2, [r4, 0xE]\n\ + lsls r0, r2, 31\n\ + lsrs r0, 31\n\ + eors r0, r6\n\ + ands r0, r7\n\ + mov r1, r8\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r4, 0xE]\n\ +_0810E672:\n\ + ldrb r1, [r4]\n\ + movs r0, 0x9\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r4]\n\ + ldrh r1, [r4, 0x2]\n\ + mov r12, r1\n\ +_0810E680:\n\ + ldrb r1, [r4]\n\ + movs r0, 0xF\n\ + ands r0, r1\n\ + strb r0, [r4]\n\ + b _0810E97C\n\ +_0810E68A:\n\ + lsls r1, r2, 24\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0\n\ + bne _0810E698\n\ + movs r0, 0x8\n\ + orrs r0, r2\n\ + b _0810E6A0\n\ +_0810E698:\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0x2\n\ + bne _0810E6A8\n\ + adds r0, r2, 0\n\ +_0810E6A0:\n\ + orrs r0, r7\n\ + strb r0, [r4]\n\ + strb r6, [r4, 0x1]\n\ + b _0810E774\n\ +_0810E6A8:\n\ + movs r0, 0x8\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _0810E774\n\ + adds r3, r5, 0\n\ + adds r3, 0x3F\n\ + ldrb r2, [r3]\n\ + lsls r1, r2, 31\n\ + lsrs r1, 31\n\ + movs r6, 0x1\n\ + eors r1, r6\n\ + ands r1, r7\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + lsls r0, 31\n\ + lsrs r0, 31\n\ + adds r1, r5, 0\n\ + adds r1, 0x2A\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + movs r1, 0x11\n\ + negs r1, r1\n\ + ands r0, r1\n\ + strb r0, [r3]\n\ + ldrb r1, [r4]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0810E766\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0810E736\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E71C\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + subs r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E754\n\ +_0810E71C:\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + adds r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E754\n\ +_0810E736:\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E74A\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + subs r0, 0xC\n\ + b _0810E752\n\ +_0810E74A:\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + adds r0, 0xC\n\ +_0810E752:\n\ + strb r0, [r1]\n\ +_0810E754:\n\ + ldrb r2, [r4, 0xE]\n\ + lsls r0, r2, 31\n\ + lsrs r0, 31\n\ + eors r0, r6\n\ + ands r0, r7\n\ + mov r1, r8\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r4, 0xE]\n\ +_0810E766:\n\ + ldrb r1, [r4]\n\ + movs r0, 0x9\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r4]\n\ + ldrh r1, [r4, 0x2]\n\ + mov r12, r1\n\ +_0810E774:\n\ + ldrb r0, [r4]\n\ + movs r1, 0xF\n\ + ands r1, r0\n\ + movs r0, 0x10\n\ + b _0810E978\n\ +_0810E77E:\n\ + lsls r1, r2, 24\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0x3\n\ + bne _0810E78C\n\ + movs r0, 0x8\n\ + orrs r0, r2\n\ + b _0810E794\n\ +_0810E78C:\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0x1\n\ + bne _0810E79C\n\ + adds r0, r2, 0\n\ +_0810E794:\n\ + orrs r0, r7\n\ + strb r0, [r4]\n\ + strb r6, [r4, 0x1]\n\ + b _0810E868\n\ +_0810E79C:\n\ + movs r0, 0x8\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _0810E868\n\ + adds r3, r5, 0\n\ + adds r3, 0x3F\n\ + ldrb r2, [r3]\n\ + lsls r1, r2, 31\n\ + lsrs r1, 31\n\ + movs r6, 0x1\n\ + eors r1, r6\n\ + ands r1, r7\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + lsls r0, 31\n\ + lsrs r0, 31\n\ + adds r1, r5, 0\n\ + adds r1, 0x2A\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + movs r1, 0x11\n\ + negs r1, r1\n\ + ands r0, r1\n\ + strb r0, [r3]\n\ + ldrb r1, [r4]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0810E85A\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0810E82A\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E810\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + subs r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E848\n\ +_0810E810:\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + adds r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E848\n\ +_0810E82A:\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E83E\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + subs r0, 0xC\n\ + b _0810E846\n\ +_0810E83E:\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + adds r0, 0xC\n\ +_0810E846:\n\ + strb r0, [r1]\n\ +_0810E848:\n\ + ldrb r2, [r4, 0xE]\n\ + lsls r0, r2, 31\n\ + lsrs r0, 31\n\ + eors r0, r6\n\ + ands r0, r7\n\ + mov r1, r8\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r4, 0xE]\n\ +_0810E85A:\n\ + ldrb r1, [r4]\n\ + movs r0, 0x9\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r4]\n\ + ldrh r1, [r4, 0x2]\n\ + mov r12, r1\n\ +_0810E868:\n\ + ldrb r0, [r4]\n\ + movs r1, 0xF\n\ + ands r1, r0\n\ + movs r0, 0x20\n\ + b _0810E978\n\ +_0810E872:\n\ + lsls r1, r2, 24\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0x2\n\ + bne _0810E882\n\ + movs r0, 0x8\n\ + orrs r0, r2\n\ + strb r0, [r4]\n\ + b _0810E970\n\ +_0810E882:\n\ + lsrs r0, r1, 28\n\ + cmp r0, 0\n\ + bne _0810E8A4\n\ + lsls r0, r2, 30\n\ + lsrs r0, 31\n\ + movs r1, 0x1\n\ + eors r0, r1\n\ + ands r0, r7\n\ + lsls r0, 1\n\ + movs r1, 0x3\n\ + negs r1, r1\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + orrs r1, r7\n\ + strb r1, [r4]\n\ + strb r6, [r4, 0x1]\n\ + b _0810E970\n\ +_0810E8A4:\n\ + movs r0, 0x8\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _0810E970\n\ + adds r3, r5, 0\n\ + adds r3, 0x3F\n\ + ldrb r2, [r3]\n\ + lsls r1, r2, 31\n\ + lsrs r1, 31\n\ + movs r6, 0x1\n\ + eors r1, r6\n\ + ands r1, r7\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + mov r8, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r3]\n\ + lsls r0, 31\n\ + lsrs r0, 31\n\ + adds r1, r5, 0\n\ + adds r1, 0x2A\n\ + strb r0, [r1]\n\ + ldrb r0, [r3]\n\ + movs r1, 0x4\n\ + orrs r0, r1\n\ + movs r1, 0x11\n\ + negs r1, r1\n\ + ands r0, r1\n\ + strb r0, [r3]\n\ + ldrb r1, [r4]\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0810E962\n\ + bl IsContest\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0810E932\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E918\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + subs r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E950\n\ +_0810E918:\n\ + ldrb r2, [r5, 0x5]\n\ + lsls r1, r2, 28\n\ + lsrs r1, 30\n\ + adds r1, 0x1\n\ + movs r0, 0x3\n\ + ands r1, r0\n\ + lsls r1, 2\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + orrs r0, r1\n\ + strb r0, [r5, 0x5]\n\ + b _0810E950\n\ +_0810E932:\n\ + ldrb r1, [r4, 0xE]\n\ + mov r0, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0810E946\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + subs r0, 0xC\n\ + b _0810E94E\n\ +_0810E946:\n\ + adds r1, r5, 0\n\ + adds r1, 0x43\n\ + ldrb r0, [r1]\n\ + adds r0, 0xC\n\ +_0810E94E:\n\ + strb r0, [r1]\n\ +_0810E950:\n\ + ldrb r2, [r4, 0xE]\n\ + lsls r0, r2, 31\n\ + lsrs r0, 31\n\ + eors r0, r6\n\ + ands r0, r7\n\ + mov r1, r8\n\ + ands r1, r2\n\ + orrs r1, r0\n\ + strb r1, [r4, 0xE]\n\ +_0810E962:\n\ + ldrb r1, [r4]\n\ + movs r0, 0x9\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r4]\n\ + ldrh r1, [r4, 0x2]\n\ + mov r12, r1\n\ +_0810E970:\n\ + ldrb r0, [r4]\n\ + movs r1, 0xF\n\ + ands r1, r0\n\ + movs r0, 0x30\n\ +_0810E978:\n\ + orrs r1, r0\n\ + strb r1, [r4]\n\ +_0810E97C:\n\ + ldrb r1, [r4]\n\ + lsls r1, 30\n\ + lsrs r1, 31\n\ + adds r0, r4, 0\n\ + adds r0, 0xC\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + ldr r3, =gSineTable\n\ + mov r2, r12\n\ + lsls r0, r2, 1\n\ + adds r0, r3\n\ + movs r2, 0\n\ + ldrsh r0, [r0, r2]\n\ + muls r0, r1\n\ + asrs r0, 8\n\ + strh r0, [r5, 0x24]\n\ + ldrb r2, [r5, 0x3]\n\ + lsls r2, 26\n\ + lsrs r2, 27\n\ + movs r1, 0x24\n\ + ldrsh r0, [r5, r1]\n\ + negs r0, r0\n\ + asrs r0, 1\n\ + ldrb r1, [r4, 0xA]\n\ + adds r0, r1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 1\n\ + adds r1, r3\n\ + ldrh r6, [r1]\n\ + ldr r1, =gOamMatrices\n\ + lsls r2, 3\n\ + adds r2, r1\n\ + adds r0, 0x40\n\ + lsls r0, 1\n\ + adds r0, r3\n\ + ldrh r0, [r0]\n\ + strh r0, [r2, 0x6]\n\ + strh r0, [r2]\n\ + strh r6, [r2, 0x2]\n\ + lsls r0, r6, 16\n\ + asrs r0, 16\n\ + negs r0, r0\n\ + strh r0, [r2, 0x4]\n\ + ldrh r0, [r4, 0x6]\n\ + ldrh r2, [r4, 0x8]\n\ + adds r0, r2\n\ + strh r0, [r4, 0x8]\n\ + lsls r0, 16\n\ + lsrs r0, 24\n\ + strh r0, [r5, 0x22]\n\ + movs r1, 0x4\n\ + ldrsh r0, [r4, r1]\n\ + movs r1, 0x80\n\ + lsls r1, 8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0810EA0C\n\ + ldrh r0, [r4, 0x4]\n\ + subs r1, 0x1\n\ + ands r1, r0\n\ + ldrh r0, [r4, 0x2]\n\ + subs r0, r1\n\ + movs r1, 0xFF\n\ + ands r0, r1\n\ + strh r0, [r4, 0x2]\n\ + b _0810EA1C\n\ + .pool\n\ +_0810EA0C:\n\ + ldrh r0, [r4, 0x4]\n\ + ldr r1, =0x00007fff\n\ + ands r1, r0\n\ + ldrh r2, [r4, 0x2]\n\ + adds r1, r2\n\ + movs r0, 0xFF\n\ + ands r1, r0\n\ + strh r1, [r4, 0x2]\n\ +_0810EA1C:\n\ + movs r0, 0x22\n\ + ldrsh r1, [r5, r0]\n\ + movs r2, 0x26\n\ + ldrsh r0, [r5, r2]\n\ + adds r1, r0\n\ + ldrh r0, [r4, 0xE]\n\ + lsrs r0, 1\n\ + cmp r1, r0\n\ + blt _0810EA36\n\ + movs r0, 0\n\ + strh r0, [r5, 0x2E]\n\ + ldr r0, =sub_810E2C8\n\ + str r0, [r5, 0x1C]\n\ +_0810EA36:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + "); +} + +void sub_810EA4C(struct Sprite *sprite) +{ + sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + sprite->callback = TranslateAnimSpriteToTargetMonLocation; +} + +void sub_810EAA0(struct Sprite * sprite) +{ + u16 arg; + u8 mult; + + if (!gBattleAnimArgs[2]) + InitSpritePosToAnimAttacker(sprite, 0); + else + InitSpritePosToAnimTarget(sprite, FALSE); + + if ((!gBattleAnimArgs[2] && !GetBattlerSide(gBattleAnimAttacker)) + || (gBattleAnimArgs[2] == 1 && !GetBattlerSide(gBattleAnimTarget))) + { + sprite->pos1.x += 8; + } + + SeekSpriteAnim(sprite, gBattleAnimArgs[4]); + sprite->pos1.x -= 32; + sprite->data[1] = 0x0ccc; + + arg = gBattleAnimArgs[4]; + mult = 12; + sprite->pos2.x += mult * arg; + sprite->data[0] = arg; + sprite->data[7] = gBattleAnimArgs[3]; + sprite->callback = sub_810EB40; +} + +void sub_810EB40(struct Sprite *sprite) +{ + sprite->pos2.x += sprite->data[1] >> 8; + + if (++sprite->data[0] == 6) + { + sprite->data[0] = 0; + sprite->pos2.x = 0; + StartSpriteAnim(sprite, 0); + } + + if (--sprite->data[7] == -1) + DestroyAnimSprite(sprite); +} + +void sub_810EB88(u8 task) +{ + if (!(gTasks[task].data[0] % 32)) + { + gAnimVisualTaskCount++; + + gBattleAnimArgs[0] = Sin(gTasks[task].data[0], -13); + gBattleAnimArgs[1] = Cos(gTasks[task].data[0], -13); + gBattleAnimArgs[2] = 1; + gBattleAnimArgs[3] = 3; + + CreateSpriteAndAnimate(&gUnknown_085973E8, + GetBattlerSpriteCoord(gBattleAnimTarget, 2), + GetBattlerSpriteCoord(gBattleAnimTarget, 3), + 3); + } + + gTasks[task].data[0] += 8; + + if (gTasks[task].data[0] > 255) + DestroyAnimVisualTask(task); +} + +void sub_810EC34(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + InitSpritePosToAnimAttacker(sprite, 1); + gSprites[GetAnimBattlerSpriteId(0)].invisible = 1; + ++sprite->data[0]; + break; + case 1: + if (sprite->affineAnimEnded) + DestroyAnimSprite(sprite); + } +} + +void sub_810EC94(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); + sprite->pos2.y = -sprite->pos1.y - 32; + sprite->data[0]++; + break; + case 1: + sprite->pos2.y += 10; + if (sprite->pos2.y >= 0) + ++sprite->data[0]; + break; + case 2: + sprite->pos2.y -= 10; + if (sprite->pos1.y + sprite->pos2.y < -32) + { + gSprites[GetAnimBattlerSpriteId(0)].invisible = 0; + DestroyAnimSprite(sprite); + } + } +} + +void sub_810ED28(struct Sprite *sprite) +{ + InitSpritePosToAnimAttacker(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = gBattleAnimArgs[3]; + sprite->callback = sub_810ED70; + gSprites[GetAnimBattlerSpriteId(0)].invisible = 1; +} + +void sub_810ED70(struct Sprite *sprite) +{ + if (sprite->data[0] > 0) + sprite->data[0]--; + else if (sprite->pos1.y + sprite->pos2.y > -32) + { + sprite->data[2] += sprite->data[1]; + sprite->pos2.y -= (sprite->data[2] >> 8); + } + else + { + sprite->invisible = 1; + if (sprite->data[3]++ > 20) + sprite->callback = sub_810EDD0; + } +} + +void sub_810EDD0(struct Sprite *sprite) +{ + sprite->pos2.y += sprite->data[2] >> 8; + + if (sprite->pos1.y + sprite->pos2.y > -32) + sprite->invisible = 0; + + if (sprite->pos2.y > 0) + DestroyAnimSprite(sprite); +} + +#ifdef NONMATCHING +void sub_810EE14(struct Sprite *sprite) +{ + // NONMATCHING - Functionally equivalent - slight register swap at end + + u32 matrixNum; + int t1, t2; + + switch (sprite->data[0]) + { + case 0: + if (!gBattleAnimArgs[0]) + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); + } + else + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); + } + + sprite->data[1] = 512; + + TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); + sprite->data[0]++; + break; + case 1: + if (sprite->data[2] <= 11) + sprite->data[1] -= 40; + else + sprite->data[1] += 40; + + sprite->data[2]++; + + TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); + + matrixNum = sprite->oam.matrixNum; + + t1 = 15616; + t2 = t1 / gOamMatrices[matrixNum].d + 1; + + if (t2 > 128) + t2 = 128; + + + /* NONMATCHING + * compiles to: + * asr r0, r0, #0x1 + strh r0, [r5, #0x26] + * needed: + * asrs r1, r0, 1 + * strh r1, [r5, 0x26] */ + sprite->pos2.y = (64 - t2) / 2; + + if (sprite->data[2] == 24) + { + sub_80A749C(sprite); + DestroyAnimSprite(sprite); + } + } +} + +#else +NAKED +void sub_810EE14(struct Sprite *sprite) +{ + asm_unified("push {r4,r5,lr}\n\ + sub sp, 0x4\n\ + adds r5, r0, 0\n\ + movs r1, 0x2E\n\ + ldrsh r0, [r5, r1]\n\ + cmp r0, 0\n\ + beq _0810EE28\n\ + cmp r0, 0x1\n\ + beq _0810EE80\n\ + b _0810EEEC\n\ +_0810EE28:\n\ + ldr r0, =gBattleAnimArgs\n\ + movs r2, 0\n\ + ldrsh r0, [r0, r2]\n\ + cmp r0, 0\n\ + bne _0810EE40\n\ + ldr r4, =gBattleAnimAttacker\n\ + b _0810EE42\n\ + .pool\n\ +_0810EE40:\n\ + ldr r4, =gBattleAnimTarget\n\ +_0810EE42:\n\ + ldrb r0, [r4]\n\ + movs r1, 0\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + strh r0, [r5, 0x20]\n\ + ldrb r0, [r4]\n\ + movs r1, 0x1\n\ + bl GetBattlerSpriteCoord\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + strh r0, [r5, 0x22]\n\ + movs r0, 0\n\ + movs r3, 0x80\n\ + lsls r3, 2\n\ + strh r3, [r5, 0x30]\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + str r0, [sp]\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ + bl TrySetSpriteRotScale\n\ + ldrh r0, [r5, 0x2E]\n\ + adds r0, 0x1\n\ + strh r0, [r5, 0x2E]\n\ + b _0810EEEC\n\ + .pool\n\ +_0810EE80:\n\ + movs r1, 0x32\n\ + ldrsh r0, [r5, r1]\n\ + cmp r0, 0xB\n\ + bgt _0810EE8E\n\ + ldrh r0, [r5, 0x30]\n\ + subs r0, 0x28\n\ + b _0810EE92\n\ +_0810EE8E:\n\ + ldrh r0, [r5, 0x30]\n\ + adds r0, 0x28\n\ +_0810EE92:\n\ + strh r0, [r5, 0x30]\n\ + ldrh r0, [r5, 0x32]\n\ + adds r0, 0x1\n\ + movs r1, 0\n\ + strh r0, [r5, 0x32]\n\ + movs r2, 0x80\n\ + lsls r2, 1\n\ + movs r0, 0x30\n\ + ldrsh r3, [r5, r0]\n\ + str r1, [sp]\n\ + adds r0, r5, 0\n\ + bl TrySetSpriteRotScale\n\ + ldrb r1, [r5, 0x3]\n\ + lsls r1, 26\n\ + lsrs r1, 27\n\ + movs r0, 0xF4\n\ + lsls r0, 6\n\ + ldr r2, =gOamMatrices\n\ + lsls r1, 3\n\ + adds r1, r2\n\ + movs r2, 0x6\n\ + ldrsh r1, [r1, r2]\n\ + bl __divsi3\n\ + adds r1, r0, 0x1\n\ + cmp r1, 0x80\n\ + ble _0810EECC\n\ + movs r1, 0x80\n\ +_0810EECC:\n\ + movs r0, 0x40\n\ + subs r0, r1\n\ + lsrs r1, r0, 31\n\ + adds r0, r1\n\ + asrs r1, r0, 1\n\ + strh r1, [r5, 0x26]\n\ + movs r1, 0x32\n\ + ldrsh r0, [r5, r1]\n\ + cmp r0, 0x18\n\ + bne _0810EEEC\n\ + adds r0, r5, 0\n\ + bl sub_80A749C\n\ + adds r0, r5, 0\n\ + bl DestroyAnimSprite\n\ +_0810EEEC:\n\ + add sp, 0x4\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n"); +} +#endif + +void sub_810EEF8(struct Sprite *sprite) +{ + int v1, v2; + + v1 = 0x1ff & Random2(); + v2 = 0x7f & Random2(); + + if (v1 % 2) + sprite->data[0] = 736 + v1; + + else + sprite->data[0] = 736 - v1; + + + if (v2 % 2) + sprite->data[1] = 896 + v2; + + else + sprite->data[1] = 896 - v2; + + sprite->data[2] = gBattleAnimArgs[0]; + + if (sprite->data[2]) + sprite->oam.matrixNum = 8; + + + if (gBattleAnimArgs[1] == 0) + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 32; + } + else + { + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 32; + } + + sprite->callback = sub_810EFA8; +} + +void sub_810EFA8(struct Sprite *sprite) +{ + if (sprite->data[2] == 0) + { + sprite->pos2.x += sprite->data[0] >> 8; + sprite->pos2.y -= sprite->data[1] >> 8; + } + else + { + sprite->pos2.x -= sprite->data[0] >> 8; + sprite->pos2.y -= sprite->data[1] >> 8; + } + + sprite->data[0] = sprite->data[0]; + sprite->data[1] -= 32; + + if (sprite->data[0] < 0) + sprite->data[0] = 0; + + + if (++sprite->data[3] == 31) + DestroyAnimSprite(sprite); +} + +void sub_810F004(struct Sprite *sprite) +{ + sprite->data[6] = 0; + sprite->data[7] = 64; + sprite->callback = sub_810F018; +} + +void sub_810F018(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (++sprite->data[1] > 8) + { + sprite->data[1] = 0; + sprite->invisible ^= 1; + if (++sprite->data[2] > 5 && sprite->invisible) + sprite->data[0]++; + } + break; + case 1: + DestroyAnimSprite(sprite); + } +} + +void sub_810F084(struct Sprite *sprite) +{ + s16 posx, posy; + u16 rotation; + + posx = sprite->pos1.x; + posy = sprite->pos1.y; + + sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); + sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); + + sprite->data[4] = sprite->pos1.x << 4; + sprite->data[5] = sprite->pos1.y << 4; + + sprite->data[6] = ((posx - sprite->pos1.x) << 4) / 12; + sprite->data[7] = ((posy - sprite->pos1.y) << 4) / 12; + + rotation = ArcTan2Neg(posx - sprite->pos1.x, posy - sprite->pos1.y); + rotation += 49152; + + TrySetSpriteRotScale(sprite, 1, 0x100, 0x100, rotation); + + sprite->callback = sub_810F140; +} + +void sub_810F140(struct Sprite *sprite) +{ + sprite->data[4] += sprite->data[6]; + sprite->data[5] += sprite->data[7]; + + sprite->pos1.x = sprite->data[4] >> 4; + sprite->pos1.y = sprite->data[5] >> 4; + + if ((u16) (sprite->pos1.x + 0x2d) > 0x14a || sprite->pos1.y > 0x9d || sprite->pos1.y < -0x2d) + DestroySpriteAndMatrix(sprite); +} + +void unref_sub_810F184(u8 taskId) +{ + if (gBattleAnimArgs[0] == 0) + { + u8 spriteId = GetAnimBattlerSpriteId(0); + gSprites[spriteId].invisible = 1; + } + else + { + u8 spriteId = GetAnimBattlerSpriteId(0); + gSprites[spriteId].invisible = 0; + } + DestroyAnimVisualTask(taskId); +} |