From e67d2dbd3839c507c83d39a04615f05900c0ddbc Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 15 Aug 2022 22:49:13 +0300 Subject: [PATCH] Match sub_08078D60 --- asm/non_matching/playerUtils/sub_08078D60.inc | 152 ------------------ include/physics.h | 1 + src/playerItem/playerItemHeldObject.c | 1 - src/playerUtils.c | 47 +++++- 4 files changed, 47 insertions(+), 154 deletions(-) delete mode 100644 asm/non_matching/playerUtils/sub_08078D60.inc diff --git a/asm/non_matching/playerUtils/sub_08078D60.inc b/asm/non_matching/playerUtils/sub_08078D60.inc deleted file mode 100644 index 2ffb6b39..00000000 --- a/asm/non_matching/playerUtils/sub_08078D60.inc +++ /dev/null @@ -1,152 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - ldr r1, _08078DCC @ =gPlayerEntity - ldr r0, [r1, #0x74] - ldr r4, [r0, #0x54] - ldrb r0, [r4, #0xc] - adds r6, r1, #0 - cmp r0, #2 - beq _08078D72 - b _08078E82 -_08078D72: - adds r0, r6, #0 - adds r0, #0x63 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r1, [r6, #0x36] - adds r0, r0, r1 - strh r0, [r4, #0x36] - ldrb r1, [r6, #0x1b] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r4, #0x1b] - movs r0, #0x3f - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x1b] - adds r0, r6, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r6, #0 - adds r0, #0x5a - ldrb r0, [r0] - movs r2, #0x7f - ands r2, r0 - ldr r1, _08078DD0 @ =gUnk_0811C0E8 - ldrb r0, [r4, #0x16] - lsrs r0, r0, #4 - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - ldrb r0, [r6, #0x18] - lsls r0, r0, #0x19 - cmp r0, #0 - bge _08078DD4 - adds r2, r1, r2 - movs r1, #0 - ldrsb r1, [r2, r1] - ldrh r0, [r6, #0x2e] - subs r0, r0, r1 - strh r0, [r4, #0x2e] - adds r1, r2, #0 - b _08078DE0 - .align 2, 0 -_08078DCC: .4byte gPlayerEntity -_08078DD0: .4byte gUnk_0811C0E8 -_08078DD4: - adds r1, r1, r2 - movs r0, #0 - ldrsb r0, [r1, r0] - ldrh r2, [r6, #0x2e] - adds r0, r0, r2 - strh r0, [r4, #0x2e] -_08078DE0: - movs r0, #1 - ldrsb r0, [r1, r0] - ldrh r1, [r4, #0x36] - adds r0, r0, r1 - strh r0, [r4, #0x36] - adds r5, r6, #0 - ldrh r0, [r5, #0x32] - strh r0, [r4, #0x32] - adds r0, r5, #0 - adds r1, r4, #0 - bl SortEntityAbove - ldr r0, _08078E34 @ =gPlayerState - ldrb r0, [r0, #5] - cmp r0, #4 - bne _08078E4C - ldrb r1, [r5, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r4, #0x19] - movs r0, #0x3f - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x19] - adds r0, r4, #0 - bl sub_0806F8DC - ldrb r1, [r4, #0x16] - movs r0, #0xf - ands r0, r1 - cmp r0, #2 - bne _08078E82 - ldr r0, _08078E38 @ =gRoomTransition - ldr r1, [r0] - movs r0, #3 - ands r1, r0 - cmp r1, #1 - beq _08078E3C - cmp r1, #3 - beq _08078E44 - b _08078E82 - .align 2, 0 -_08078E34: .4byte gPlayerState -_08078E38: .4byte gRoomTransition -_08078E3C: - ldrh r0, [r4, #0x2e] - adds r0, #1 - strh r0, [r4, #0x2e] - b _08078E82 -_08078E44: - ldrh r0, [r4, #0x2e] - subs r0, #1 - strh r0, [r4, #0x2e] - b _08078E82 -_08078E4C: - ldrb r0, [r5, #0x14] - lsrs r0, r0, #1 - cmp r0, #0 - beq _08078E62 - adds r0, r5, #0 - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - lsrs r1, r1, #0x1d - subs r1, #1 - b _08078E6E -_08078E62: - adds r0, r6, #0 - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - lsrs r1, r1, #0x1d - adds r1, #1 -_08078E6E: - adds r3, r4, #0 - adds r3, #0x29 - movs r0, #7 - ands r1, r0 - ldrb r2, [r3] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r2 - orrs r0, r1 - strb r0, [r3] -_08078E82: - pop {r4, r5, r6, pc} - .syntax divided diff --git a/include/physics.h b/include/physics.h index 9389ea22..9afd0f9e 100644 --- a/include/physics.h +++ b/include/physics.h @@ -43,6 +43,7 @@ void sub_0806FF48(Entity*, u32, u32); void sub_0806FCF4(Entity*, s32, s32, s32); void sub_0806FD3C(Entity*); bool32 sub_0806FDA0(Entity*); +bool32 sub_0806F8DC(Entity*); void sub_0806FEBC(Entity*, u32, Entity*); extern bool32 ProcessMovement1(Entity*); extern bool32 ProcessMovement12(Entity*); diff --git a/src/playerItem/playerItemHeldObject.c b/src/playerItem/playerItemHeldObject.c index 8421c8fa..b470c242 100644 --- a/src/playerItem/playerItemHeldObject.c +++ b/src/playerItem/playerItemHeldObject.c @@ -34,7 +34,6 @@ void sub_080ACF2C(PlayerItemHeldObjectEntity*); void sub_080ACFCC(PlayerItemHeldObjectEntity*); void sub_080AD040(PlayerItemHeldObjectEntity*); void sub_080AD274(PlayerItemHeldObjectEntity*); -bool32 sub_0806F8DC(Entity*); void PlayerItemHeldObject(Entity* this) { static void (*const subActionFuncs[])(PlayerItemHeldObjectEntity*) = { diff --git a/src/playerUtils.c b/src/playerUtils.c index df6022b8..bda35fd8 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -32,6 +32,7 @@ void sub_08079064(Entity*); extern u8 gMapData; extern const u8 gUnk_020176E0[]; extern const ScreenTransitionData gUnk_0813AD88[]; +extern const s8* gUnk_0811C0E8[]; bool32 IsAbleToUseItem(PlayerEntity*); bool32 IsPreventedFromUsingItem(); @@ -1207,7 +1208,51 @@ void sub_08078CD0(PlayerEntity* this) { } } -ASM_FUNC("asm/non_matching/playerUtils/sub_08078D60.inc", void sub_08078D60()) +void sub_08078D60(void) { + const s8* puVar2; + u32 uVar3; + Entity* iVar4; + Entity* player; + + player = &gPlayerEntity; + iVar4 = (*(Entity**)&((GenericEntity*)player)->field_0x74)->child; + if (iVar4->action != 2) + return; + + iVar4->z.HALF.HI = gPlayerEntity.spriteOffsetY + gPlayerEntity.z.HALF.HI; + iVar4->spriteOrientation.flipY = gPlayerEntity.spriteOrientation.flipY; + iVar4->collisionLayer = gPlayerEntity.collisionLayer; + uVar3 = gPlayerEntity.frame & 0x7f; + puVar2 = gUnk_0811C0E8[iVar4->carryFlags >> 4]; + if (gPlayerEntity.spriteSettings.flipX) { + iVar4->x.HALF.HI = gPlayerEntity.x.HALF.HI - puVar2[uVar3]; + } else { + iVar4->x.HALF.HI = gPlayerEntity.x.HALF.HI + puVar2[uVar3]; + } + iVar4->z.HALF.HI = puVar2[uVar3 + 1] + iVar4->z.HALF.HI; + iVar4->y.HALF.HI = gPlayerEntity.y.HALF.HI; + SortEntityAbove(&gPlayerEntity, iVar4); + if (gPlayerState.heldObject == 4) { + iVar4->spriteRendering.b3 = gPlayerEntity.spriteRendering.b3; + sub_0806F8DC(iVar4); + if ((iVar4->carryFlags & 0xf) == 2) { + switch (gRoomTransition.frameCount & 3) { + case 1: + iVar4->x.HALF.HI++; + break; + case 3: + iVar4->x.HALF.HI--; + break; + } + } + } else { + if (gPlayerEntity.animationState >> 1 != 0) { + iVar4->spritePriority.b0 = gPlayerEntity.spritePriority.b0 - 1; + } else { + iVar4->spritePriority.b0 = gPlayerEntity.spritePriority.b0 + 1; + } + } +} void sub_08078E84(Entity* param_1, Entity* param_2) { SpriteFrame* frame;