diff options
author | scnorton <scnorton@biociphers.org> | 2017-06-07 15:45:12 -0400 |
---|---|---|
committer | scnorton <scnorton@biociphers.org> | 2017-06-07 15:45:12 -0400 |
commit | 585cab7a47066e5e70d89180e7e7154652058400 (patch) | |
tree | 5ad0c41bfd21b07a14c23ced90599f92cba45a55 | |
parent | bbc25771031be86bf19f11ddf2b078dd5364ca30 (diff) |
sub_8086870 (nonmatching)
-rwxr-xr-x | asm/field_effect.s | 75 | ||||
-rw-r--r-- | include/global.h | 2 | ||||
-rwxr-xr-x | src/field_effect.c | 94 |
3 files changed, 93 insertions, 78 deletions
diff --git a/asm/field_effect.s b/asm/field_effect.s index e78d0af3b..c23d85338 100755 --- a/asm/field_effect.s +++ b/asm/field_effect.s @@ -6,81 +6,6 @@ .text - thumb_func_start sub_8086854 -sub_8086854: @ 8086854 - push {r4,lr} - adds r4, r0, 0 - bl sub_807D770 - lsls r0, 24 - cmp r0, 0 - beq _08086868 - ldrh r0, [r4, 0x8] - adds r0, 0x1 - strh r0, [r4, 0x8] -_08086868: - movs r0, 0 - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_8086854 - - thumb_func_start sub_8086870 -sub_8086870: @ 8086870 - push {r4-r6,lr} - adds r5, r0, 0 - ldr r6, _080868D4 @ =gPlayerAvatar - ldrb r0, [r6, 0x4] - lsls r2, r0, 4 - adds r2, r0 - lsls r2, 2 - ldr r0, _080868D8 @ =gSprites - adds r2, r0 - adds r0, r2, 0 - adds r0, 0x29 - movs r4, 0 - ldrsb r4, [r0, r4] - lsls r0, r4, 17 - negs r0, r0 - ldrh r1, [r2, 0x22] - ldr r3, _080868DC @ =gSpriteCoordOffsetY - adds r1, r4 - ldrh r3, [r3] - adds r1, r3 - asrs r0, 16 - adds r0, r1 - negs r0, r0 - movs r1, 0 - strh r0, [r2, 0x26] - movs r0, 0x1 - strh r0, [r5, 0xA] - strh r1, [r5, 0xC] - ldr r2, _080868E0 @ =gMapObjects - ldrb r0, [r6, 0x5] - lsls r1, r0, 3 - adds r1, r0 - lsls r1, 2 - adds r1, r2 - ldrb r2, [r1, 0x1] - movs r0, 0x21 - negs r0, r0 - ands r0, r2 - strb r0, [r1, 0x1] - movs r0, 0x2B - bl PlaySE - ldrh r0, [r5, 0x8] - adds r0, 0x1 - strh r0, [r5, 0x8] - movs r0, 0 - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_080868D4: .4byte gPlayerAvatar -_080868D8: .4byte gSprites -_080868DC: .4byte gSpriteCoordOffsetY -_080868E0: .4byte gMapObjects - thumb_func_end sub_8086870 - thumb_func_start sub_80868E4 sub_80868E4: @ 80868E4 push {r4-r6,lr} diff --git a/include/global.h b/include/global.h index 716aae15f..67a9548b6 100644 --- a/include/global.h +++ b/include/global.h @@ -10,6 +10,8 @@ // to help in decompiling #define asm_comment(x) asm volatile("@ -- " x " -- ") +#define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided\n") + #define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0])) #define POKEMON_NAME_LENGTH 10 diff --git a/src/field_effect.c b/src/field_effect.c index ad8fa3648..a40b6d0cb 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -894,10 +894,10 @@ void sub_8086774(u8 taskId) { struct Task *task; task = &gTasks[taskId]; - while (gUnknown_0839F2CC[task->data[0]](task)); + while (gUnknown_0839F2CC[task->data[0]](task)); // return code signifies whether to continue blocking here } -bool8 sub_80867AC(struct Task *task) +bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] { struct MapObject *playerObject; struct Sprite *playerSprite; @@ -908,9 +908,97 @@ bool8 sub_80867AC(struct Task *task) gPlayerAvatar.unk6 = 1; FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); task->data[4] = playerSprite->subspriteMode; - playerObject->mapobj_bit_27 = 1; + playerObject->mapobj_bit_26 = 1; playerSprite->oam.priority = 1; playerSprite->subspriteMode = 2; task->data[0]++; + return TRUE; +} + +bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] +{ + if (sub_807D770()) + { + task->data[0]++; + } + return FALSE; +} + +#ifdef NONMATCHING +bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + int ctcvy; + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = sprite->centerToCornerVecY; + ctcvy = -(centerToCornerVecY << 17); + sprite->pos2.y = -((sprite->pos1.y + centerToCornerVecY + gSpriteCoordOffsetY) + (ctcvy >> 16)); + task->data[1] = 1; + task->data[2] = 0; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + PlaySE(SE_RU_HYUU); + task->data[0]++; + return FALSE; } +#else +__attribute__((naked)) +bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r5, r0, 0\n" + "\tldr r6, _080868D4 @ =gPlayerAvatar\n" + "\tldrb r0, [r6, 0x4]\n" + "\tlsls r2, r0, 4\n" + "\tadds r2, r0\n" + "\tlsls r2, 2\n" + "\tldr r0, _080868D8 @ =gSprites\n" + "\tadds r2, r0\n" + "\tadds r0, r2, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r4, 0\n" + "\tldrsb r4, [r0, r4] @ =gSprites[gPlayerAvatar.spriteId].centerToCornerVecY\n" + "\tlsls r0, r4, 17\n" + "\tnegs r0, r0\n" + "\tldrh r1, [r2, 0x22] @ =gSprites[gPlayerAvatar.spriteId].pos1.y\n" + "\tldr r3, _080868DC @ =gSpriteCoordOffsetY\n" + "\tadds r1, r4\n" + "\tldrh r3, [r3]\n" + "\tadds r1, r3\n" + "\tasrs r0, 16\n" + "\tadds r0, r1\n" + "\tnegs r0, r0\n" + "\tmovs r1, 0\n" + "\tstrh r0, [r2, 0x26]\n" + "\tmovs r0, 0x1\n" + "\tstrh r0, [r5, 0xA]\n" + "\tstrh r1, [r5, 0xC]\n" + "\tldr r2, _080868E0 @ =gMapObjects\n" + "\tldrb r0, [r6, 0x5]\n" + "\tlsls r1, r0, 3\n" + "\tadds r1, r0\n" + "\tlsls r1, 2\n" + "\tadds r1, r2\n" + "\tldrb r2, [r1, 0x1]\n" + "\tmovs r0, 0x21\n" + "\tnegs r0, r0\n" + "\tands r0, r2\n" + "\tstrb r0, [r1, 0x1]\n" + "\tmovs r0, 0x2B\n" + "\tbl PlaySE\n" + "\tldrh r0, [r5, 0x8]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r5, 0x8]\n" + "\tmovs r0, 0\n" + "\tpop {r4-r6}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_080868D4: .4byte gPlayerAvatar\n" + "_080868D8: .4byte gSprites\n" + "_080868DC: .4byte gSpriteCoordOffsetY\n" + "_080868E0: .4byte gMapObjects"); +} +#endif + |