summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThothWhatsThis <leon.meiser42@gmail.com>2023-11-30 08:15:13 +0000
committerThothWhatsThis <leon.meiser42@gmail.com>2023-11-30 08:15:13 +0000
commite82c26c3d5c0c9432c44cf4068e551c42931a166 (patch)
tree4ad172d6ad25712d0e856794aed2945e2ea6bc3c
parentf54509dd5d944ed49524378618b3453d9e7b53d6 (diff)
Match sub_080789A8
-rw-r--r--asm/non_matching/playerUtils/sub_080789A8.inc116
-rw-r--r--src/playerUtils.c57
2 files changed, 56 insertions, 117 deletions
diff --git a/asm/non_matching/playerUtils/sub_080789A8.inc b/asm/non_matching/playerUtils/sub_080789A8.inc
deleted file mode 100644
index bb9a4674..00000000
--- a/asm/non_matching/playerUtils/sub_080789A8.inc
+++ /dev/null
@@ -1,116 +0,0 @@
- .syntax unified
- push {r4, r5, r6, r7, lr}
- mov r7, r8
- push {r7}
- ldr r1, _080789BC @ =gCarriedEntity
- ldrb r0, [r1]
- cmp r0, #0
- beq _080789C0
- ldrb r0, [r1, #1]
- b _08078A88
- .align 2, 0
-_080789BC: .4byte gCarriedEntity
-_080789C0:
- ldr r0, _08078A5C @ =gPlayerState
- ldr r0, [r0, #0x30]
- movs r1, #0x80
- ands r0, r1
- cmp r0, #0
- bne _08078A56
- ldr r0, _08078A60 @ =gPlayerEntity
- bl sub_080B1B0C
- adds r4, r0, #0
- cmp r4, #0xf
- bls _080789E6
- ldr r0, _08078A64 @ =gUnk_080084BC
- adds r1, r4, #0
- subs r1, #0x10
- adds r1, r1, r0
- ldrb r0, [r1]
- cmp r0, #0xf
- beq _08078A56
-_080789E6:
- ldr r0, _08078A5C @ =gPlayerState
- ldrb r0, [r0, #0x12]
- cmp r0, #0x12
- beq _08078A56
- ldr r3, _08078A68 @ =gCarriedEntity
- movs r0, #1
- strb r0, [r3]
- ldrb r4, [r3, #2]
- cmp r4, #0
- beq _08078A2E
- ldr r2, _08078A60 @ =gPlayerEntity
- ldrb r1, [r2, #0x14]
- movs r0, #6
- ands r0, r1
- ldr r1, _08078A6C @ =gUnk_0811BFE0
- adds r6, r0, r1
- adds r7, r2, #0
- adds r3, #8
- mov r8, r3
-_08078A0C:
- lsls r0, r4, #2
- mov r1, r8
- adds r5, r0, r1
- ldr r1, [r5]
- cmp r1, #0
- beq _08078A26
- ldrb r2, [r6]
- ldrb r3, [r6, #1]
- adds r0, r7, #0
- bl sub_0807A180
- cmp r0, #0
- bne _08078A74
-_08078A26:
- subs r4, #1
- ldr r7, _08078A60 @ =gPlayerEntity
- cmp r4, #0
- bne _08078A0C
-_08078A2E:
- ldr r0, _08078A60 @ =gPlayerEntity
- ldrb r1, [r0, #0x14]
- movs r2, #6
- ands r2, r1
- ldr r1, _08078A70 @ =gUnk_08007DF4
- adds r2, r2, r1
- movs r1, #0
- ldrsb r1, [r2, r1]
- ldrb r2, [r2, #1]
- lsls r2, r2, #0x18
- asrs r2, r2, #0x18
- bl sub_080B1A0C
- ldr r4, _08078A68 @ =gCarriedEntity
- strh r0, [r4, #4]
- movs r1, #6
- bl sub_0806FC24
- cmp r0, #0
- bne _08078A84
-_08078A56:
- movs r0, #0
- b _08078A88
- .align 2, 0
-_08078A5C: .4byte gPlayerState
-_08078A60: .4byte gPlayerEntity
-_08078A64: .4byte gUnk_080084BC
-_08078A68: .4byte gCarriedEntity
-_08078A6C: .4byte gUnk_0811BFE0
-_08078A70: .4byte gUnk_08007DF4
-_08078A74:
- mov r0, r8
- subs r0, #8
- ldr r1, [r5]
- str r1, [r0, #8]
- movs r1, #2
- strb r1, [r0, #1]
- movs r0, #2
- b _08078A88
-_08078A84:
- movs r0, #1
- strb r0, [r4, #1]
-_08078A88:
- pop {r3}
- mov r8, r3
- pop {r4, r5, r6, r7, pc}
- .align 2, 0
- .syntax divided
diff --git a/src/playerUtils.c b/src/playerUtils.c
index 5a3c0225..c2c28364 100644
--- a/src/playerUtils.c
+++ b/src/playerUtils.c
@@ -148,6 +148,15 @@ extern u32 sub_08004202(Entity*, u8*, u32);
extern u32 gUnk_02022830[];
extern u16* gUnk_0800823C[];
+extern bool32 sub_0806FC24(u32, u32);
+
+extern const u8 gUnk_0800845C[];
+extern const u8 gUnk_0811BFE0[];
+extern const u8 gUnk_08007DF4[];
+extern const u8 gUnk_080084BC[];
+
+u32 sub_0807A180(Entity*, Entity*, u32, u32);
+
void UpdateActiveItems(PlayerEntity* this) {
u32 index;
@@ -1277,7 +1286,53 @@ void FreeCarryEntity(Entity* this) {
}
}
-ASM_FUNC("asm/non_matching/playerUtils/sub_080789A8.inc", u32 sub_080789A8())
+u32 sub_080789A8(void) {
+ u32 uVar2;
+ Entity* entity;
+ u32 uVar4;
+ const u8* ptr;
+ const u8* ptr2;
+ Entity** tmp1;
+
+ if (gCarriedEntity.unk_0)
+ return (u32)gCarriedEntity.unk_1;
+
+ if (!(gPlayerState.flags & PL_MINISH)) {
+ uVar4 = sub_080B1B0C(&gPlayerEntity);
+ if (uVar4 >= 0x10 && (gUnk_080084BC[uVar4 - 0x10] == 0xf))
+ return 0;
+ if (gPlayerState.floor_type == 0x12)
+ return 0;
+
+ gCarriedEntity.unk_0 = 1;
+ uVar4 = (u32)gCarriedEntity.count;
+
+ if (uVar4 > 0) {
+ ptr2 = &gUnk_0811BFE0[gPlayerEntity.animationState & 6];
+ while (uVar4 > 0) {
+ tmp1 = &gCarriedEntity.unk_8 + uVar4;
+ entity = *tmp1;
+ if ((entity != NULL) && (sub_0807A180(&gPlayerEntity, entity, ptr2[0], ptr2[1]) != 0)) {
+ gCarriedEntity.unk_8 = *tmp1;
+ gCarriedEntity.unk_1 = 2;
+ return 2;
+ }
+ uVar4--;
+ }
+ }
+
+ ptr = &gUnk_08007DF4[gPlayerEntity.animationState & 6];
+ gCarriedEntity.unk_4 = uVar2 = sub_080B1A0C(&gPlayerEntity, (s8)ptr[0], (s8)ptr[1]);
+
+ if (!sub_0806FC24(uVar2, 6))
+ return 0;
+
+ } else
+ return 0;
+
+ gCarriedEntity.unk_1 = 1;
+ return 1;
+}
void SetPlayerControl(PlayerControlMode mode) {
if (gPlayerState.controlMode != CONTROL_DISABLED) {