diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/flying.c | 209 | 
1 files changed, 44 insertions, 165 deletions
| diff --git a/src/flying.c b/src/flying.c index 951906448..b48538706 100644 --- a/src/flying.c +++ b/src/flying.c @@ -548,7 +548,6 @@ void sub_810E2C8(struct Sprite *sprite)      }  } -// FAKEMATCHING  struct FeatherDanceData  {      u8 unk0_0a:1; @@ -654,6 +653,13 @@ void sub_810E314(struct Sprite *sprite)  }  #ifndef NONMATCHING +/* +Things I can't get to match: +1. data->unk0_1 bitfield behaviour. The way bits are read is different. +2. sprite->oam.priority--; sprite->oam.priority++; Nonmatching version tail-merges these, original does not. +3. sprite->pos2.x = (gSineTable[data->unk2] * var) >> 8; data->unk2 is very weirdly read at seemingly random moments inside the switch. +4. sinVal r6/r7 mismatch. +*/  void sub_810E520(struct Sprite *sprite)  {      u8 matrixNum, sinIndex, var; @@ -1722,191 +1728,64 @@ void sub_810EDD0(struct Sprite *sprite)          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; +    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); +        } -            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[1] = 512; -            sprite->data[2]++; +        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; -            TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); +        sprite->data[2]++; -            matrixNum = sprite->oam.matrixNum; +        TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); -            t1 = 15616; -            t2 = t1 / gOamMatrices[matrixNum].d + 1; +        matrixNum = sprite->oam.matrixNum; -            if (t2 > 128) -                t2 = 128; +        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; +        t2 = (64 - t2) / 2; +        sprite->pos2.y = t2; -            if (sprite->data[2] == 24) -            { -                sub_80A749C(sprite); -                DestroyAnimSprite(sprite); -            } +        if (sprite->data[2] == 24) +        { +            sub_80A749C(sprite); +            DestroyAnimSprite(sprite); +        } +        break;      }  } -#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(); +    int v1 = 0x1ff & Random2(); +    int v2 = 0x7f & Random2();      if (v1 % 2)          sprite->data[0] = 736 + v1; | 
