summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTal Hayon <talhayon1@gmail.com>2022-08-15 22:49:13 +0300
committerTal Hayon <talhayon1@gmail.com>2022-08-15 22:49:13 +0300
commite67d2dbd3839c507c83d39a04615f05900c0ddbc (patch)
tree21797ce9971b558515f8c8daf1135a9f63ee18c6
parent52e3382791186d899e130fcf185e56e0bbdc377b (diff)
Match sub_08078D60
-rw-r--r--asm/non_matching/playerUtils/sub_08078D60.inc152
-rw-r--r--include/physics.h1
-rw-r--r--src/playerItem/playerItemHeldObject.c1
-rw-r--r--src/playerUtils.c47
4 files changed, 47 insertions, 154 deletions
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;