diff --git a/asm/non_matching/playerUtils/sub_0807A5B8.inc b/asm/non_matching/playerUtils/sub_0807A5B8.inc deleted file mode 100644 index 2b26569e..00000000 --- a/asm/non_matching/playerUtils/sub_0807A5B8.inc +++ /dev/null @@ -1,204 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - mov sb, r0 - ldr r2, _0807A5F8 @ =gPlayerState - ldrb r3, [r2, #2] - movs r4, #0x80 - adds r0, r4, #0 - ands r0, r3 - cmp r0, #0 - beq _0807A5D2 - b _0807A736 -_0807A5D2: - ldr r1, [r2, #0x30] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _0807A5DE - b _0807A736 -_0807A5DE: - adds r0, r2, #0 - adds r0, #0x26 - ldrb r0, [r0] - cmp r0, #0 - beq _0807A5EA - b _0807A736 -_0807A5EA: - adds r0, r1, #0 - ands r0, r4 - cmp r0, #0 - beq _0807A600 - ldr r7, _0807A5FC @ =gUnk_0800833C - b _0807A63A - .align 2, 0 -_0807A5F8: .4byte gPlayerState -_0807A5FC: .4byte gUnk_0800833C -_0807A600: - movs r0, #0x80 - lsls r0, r0, #0x11 - ands r1, r0 - cmp r1, #0 - bne _0807A60E - cmp r3, #0 - beq _0807A618 -_0807A60E: - ldr r7, _0807A614 @ =gUnk_0800845C - b _0807A63A - .align 2, 0 -_0807A614: .4byte gUnk_0800845C -_0807A618: - ldrb r0, [r2, #5] - cmp r0, #0 - bne _0807A624 - ldrb r0, [r2, #0x1c] - cmp r0, #0 - beq _0807A62C -_0807A624: - ldr r7, _0807A628 @ =gUnk_080084BC - b _0807A63A - .align 2, 0 -_0807A628: .4byte gUnk_080084BC -_0807A62C: - adds r0, r2, #0 - adds r0, #0xaa - ldrb r0, [r0] - ldr r7, _0807A740 @ =gUnk_080082DC - cmp r0, #0 - beq _0807A63A - ldr r7, _0807A744 @ =gUnk_0800851C -_0807A63A: - mov r0, sb - cmp r0, #0 - beq _0807A6B8 - cmp r0, #0x10 - beq _0807A6B8 - ldr r6, _0807A748 @ =gPlayerEntity - ldr r2, [r6, #0x48] - movs r1, #0x2e - ldrsh r0, [r6, r1] - ldrb r3, [r2, #2] - adds r0, r0, r3 - movs r1, #0 - ldrsb r1, [r2, r1] - adds r0, r0, r1 - ldr r1, _0807A74C @ =gRoomControls - mov r8, r1 - ldrh r1, [r1, #6] - subs r5, r0, r1 - movs r3, #0x32 - ldrsh r0, [r6, r3] - movs r1, #1 - ldrsb r1, [r2, r1] - adds r0, r0, r1 - mov r2, r8 - ldrh r1, [r2, #8] - subs r4, r0, r1 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - bl sub_080086B4 - cmp r0, #0 - beq _0807A688 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - movs r3, #1 - bl sub_0807A750 -_0807A688: - movs r3, #0x2e - ldrsh r1, [r6, r3] - ldr r2, [r6, #0x48] - ldrb r0, [r2, #2] - subs r1, r1, r0 - movs r0, #0 - ldrsb r0, [r2, r0] - adds r1, r1, r0 - mov r2, r8 - ldrh r0, [r2, #6] - subs r5, r1, r0 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - bl sub_080086B4 - cmp r0, #0 - beq _0807A6B8 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - movs r3, #3 - bl sub_0807A750 -_0807A6B8: - mov r3, sb - cmp r3, #8 - beq _0807A736 - cmp r3, #0x18 - beq _0807A736 - ldr r6, _0807A748 @ =gPlayerEntity - movs r0, #0x2e - ldrsh r1, [r6, r0] - ldr r2, [r6, #0x48] - movs r0, #0 - ldrsb r0, [r2, r0] - adds r1, r1, r0 - ldr r3, _0807A74C @ =gRoomControls - mov r8, r3 - ldrh r0, [r3, #6] - subs r5, r1, r0 - movs r1, #0x32 - ldrsh r0, [r6, r1] - ldrb r3, [r2, #5] - adds r0, r0, r3 - movs r1, #1 - ldrsb r1, [r2, r1] - adds r0, r0, r1 - mov r2, r8 - ldrh r1, [r2, #8] - subs r4, r0, r1 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - bl sub_080086B4 - cmp r0, #0 - beq _0807A706 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - movs r3, #2 - bl sub_0807A750 -_0807A706: - movs r3, #0x32 - ldrsh r1, [r6, r3] - ldr r2, [r6, #0x48] - ldrb r0, [r2, #5] - subs r1, r1, r0 - movs r0, #1 - ldrsb r0, [r2, r0] - adds r1, r1, r0 - mov r2, r8 - ldrh r0, [r2, #8] - subs r4, r1, r0 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - bl sub_080086B4 - cmp r0, #0 - beq _0807A736 - adds r0, r5, #0 - adds r1, r4, #0 - adds r2, r7, #0 - movs r3, #0 - bl sub_0807A750 -_0807A736: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0807A740: .4byte gUnk_080082DC -_0807A744: .4byte gUnk_0800851C -_0807A748: .4byte gPlayerEntity -_0807A74C: .4byte gRoomControls - .syntax divided diff --git a/include/asm.h b/include/asm.h index 7a05b9b7..837cebca 100644 --- a/include/asm.h +++ b/include/asm.h @@ -30,7 +30,7 @@ extern void sub_08004596(struct Entity_*, u32); extern u32 sub_080045B4(struct Entity_*, u32, u32); extern u32 CalculateDirectionTo(u32, u32, u32, u32); extern u32 sub_080045DA(s32, s32); -extern u32 sub_080086B4(u32, u32, u8*); +extern u32 sub_080086B4(u32, u32, const u8*); extern u32 ResolveCollisionLayer(struct Entity_*); extern void sub_0800417E(struct Entity_*, u32); extern u32 sub_0800442E(struct Entity_*); diff --git a/src/playerUtils.c b/src/playerUtils.c index 89a538f3..f8d2225c 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -33,6 +33,10 @@ extern u8 gMapData; extern const u8 gUnk_020176E0[]; extern const ScreenTransitionData gUnk_0813AD88[]; extern const s8* gUnk_0811C0E8[]; +extern const u8 gUnk_0800851C[]; +extern const u8 gUnk_080084BC[]; +extern const u8 gUnk_0800845C[]; +extern const u8 gUnk_0800833C[]; bool32 IsAbleToUseItem(PlayerEntity*); bool32 IsPreventedFromUsingItem(); @@ -50,6 +54,7 @@ u32 sub_08079FD4(Entity*, u32); void LoadRoomGfx(void); SurfaceType GetSurfaceCalcType(Entity*, s32, s32); void sub_0807AAF8(Entity*, u32); +void sub_0807A750(u32, u32, const u8*, u32); extern ItemDefinition gItemDefinitions[]; extern void (*const gUnk_0811C27C[])(Entity*); @@ -2086,9 +2091,55 @@ u32 GetPlayerTilePos(void) { } } -ASM_FUNC("asm/non_matching/playerUtils/sub_0807A5B8.inc", void sub_0807A5B8(u32 a)) +void sub_0807A5B8(u32 direction) { + u32 uVar2; + u32 uVar3; + const u8* pbVar4; -void sub_0807A750(u32 param_1, u32 param_2, u8* param_3, u32 param_4) { + if ((((gPlayerState.jump_status & 0x80) == 0) && ((gPlayerState.flags & PL_HIDDEN) == 0)) && + (gPlayerState.swim_state == 0)) { + if ((gPlayerState.flags & PL_MINISH) != 0) { + pbVar4 = gUnk_0800833C; + } else if (((gPlayerState.flags & PL_PARACHUTE) != 0) || gPlayerState.jump_status != 0) { + pbVar4 = gUnk_0800845C; + } else if (gPlayerState.heldObject != 0 || gPlayerState.field_0x1c != 0) { + pbVar4 = gUnk_080084BC; + } else if (gPlayerState.attachedBeetleCount != 0) { + pbVar4 = gUnk_0800851C; + } else { + pbVar4 = gUnk_080082DC; + } + + if (direction != DirectionNorth && direction != DirectionSouth) { + uVar3 = (gPlayerEntity.x.HALF.HI + (gPlayerEntity.hitbox)->unk2[0] + (gPlayerEntity.hitbox)->offset_x) - + gRoomControls.origin_x; + uVar2 = (gPlayerEntity.y.HALF.HI + (gPlayerEntity.hitbox)->offset_y) - gRoomControls.origin_y; + if (sub_080086B4(uVar3, uVar2, pbVar4) != 0) { + sub_0807A750(uVar3, uVar2, pbVar4, 1); + } + uVar3 = ((gPlayerEntity.x.HALF.HI - (gPlayerEntity.hitbox)->unk2[0]) + (gPlayerEntity.hitbox)->offset_x) - + gRoomControls.origin_x; + if (sub_080086B4(uVar3, uVar2, pbVar4) != 0) { + sub_0807A750(uVar3, uVar2, pbVar4, 3); + } + } + if (direction != DirectionEast && direction != DirectionWest) { + uVar3 = (gPlayerEntity.x.HALF.HI + (gPlayerEntity.hitbox)->offset_x) - gRoomControls.origin_x; + uVar2 = (gPlayerEntity.y.HALF.HI + (gPlayerEntity.hitbox)->unk2[3] + (gPlayerEntity.hitbox)->offset_y) - + gRoomControls.origin_y; + if (sub_080086B4(uVar3, uVar2, pbVar4) != 0) { + sub_0807A750(uVar3, uVar2, pbVar4, 2); + } + uVar2 = ((gPlayerEntity.y.HALF.HI - (gPlayerEntity.hitbox)->unk2[3]) + (gPlayerEntity.hitbox)->offset_y) - + gRoomControls.origin_y; + if (sub_080086B4(uVar3, uVar2, pbVar4) != 0) { + sub_0807A750(uVar3, uVar2, pbVar4, 0); + } + } + } +} + +void sub_0807A750(u32 param_1, u32 param_2, const u8* param_3, u32 param_4) { u32 uVar2; u16* ptr; u32 uVar5;