From e82c26c3d5c0c9432c44cf4068e551c42931a166 Mon Sep 17 00:00:00 2001 From: ThothWhatsThis Date: Thu, 30 Nov 2023 08:15:13 +0000 Subject: [PATCH 1/4] Match sub_080789A8 --- asm/non_matching/playerUtils/sub_080789A8.inc | 116 ------------------ src/playerUtils.c | 57 ++++++++- 2 files changed, 56 insertions(+), 117 deletions(-) delete mode 100644 asm/non_matching/playerUtils/sub_080789A8.inc 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) { From 2e2b63521a37e05635e5ffbdf10b80a33903075b Mon Sep 17 00:00:00 2001 From: ThothWhatsThis Date: Thu, 30 Nov 2023 08:15:30 +0000 Subject: [PATCH 2/4] Match sub_0807BFD0 --- asm/non_matching/playerUtils/sub_0807BFD0.inc | 123 ------------------ src/playerUtils.c | 58 ++++++++- 2 files changed, 57 insertions(+), 124 deletions(-) delete mode 100644 asm/non_matching/playerUtils/sub_0807BFD0.inc diff --git a/asm/non_matching/playerUtils/sub_0807BFD0.inc b/asm/non_matching/playerUtils/sub_0807BFD0.inc deleted file mode 100644 index f53eb74d..00000000 --- a/asm/non_matching/playerUtils/sub_0807BFD0.inc +++ /dev/null @@ -1,123 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - bl ClearBgAnimations - bl sub_0807BFA8 - ldr r7, _0807C0B8 @ =0x0000FFFF - ldr r6, _0807C0BC @ =gMapBottom+0x5004 - movs r0, #0x80 - lsls r0, r0, #5 - mov r8, r0 - adds r0, r7, #0 - adds r1, r6, #0 - mov r2, r8 - bl MemFill16 - movs r5, #0 - strh r5, [r6] - ldr r4, _0807C0C0 @ =gMapTop+0x5004 - adds r0, r7, #0 - adds r1, r4, #0 - mov r2, r8 - bl MemFill16 - strh r5, [r4] - ldr r2, _0807C0C4 @ =gRoomControls - ldr r0, _0807C0C8 @ =gArea - ldr r1, _0807C0CC @ =0x0000085C - adds r4, r0, r1 - ldr r0, [r4] - ldr r1, [r2, #0x34] - ldr r0, [r0, #8] - cmp r1, r0 - beq _0807C01C - str r0, [r2, #0x34] - bl sub_080197D4 -_0807C01C: - ldr r0, [r4] - ldr r0, [r0, #0x10] - bl sub_080197D4 - ldr r1, _0807C0D0 @ =gPaletteBuffer - adds r0, r1, #0 - adds r0, #0x60 - movs r2, #0xa8 - lsls r2, r2, #2 - adds r1, r1, r2 - movs r2, #0x20 - bl MemCopy - ldr r2, _0807C0D4 @ =gUsedPalettes - ldr r0, [r2] - movs r1, #0x80 - lsls r1, r1, #0xe - orrs r0, r1 - str r0, [r2] - ldr r0, [r4] - ldr r0, [r0, #0x14] - cmp r0, #0 - beq _0807C04E - bl LoadBgAnimations -_0807C04E: - adds r5, r6, #0 - movs r0, #0x80 - lsls r0, r0, #5 - adds r6, r5, r0 - adds r0, r7, #0 - adds r1, r6, #0 - mov r2, r8 - bl MemFill16 - movs r2, #0 - ldr r3, _0807C0D8 @ =0x000007FF - adds r4, r7, #0 -_0807C066: - ldrh r0, [r5] - cmp r0, r3 - bhi _0807C078 - lsls r0, r0, #1 - adds r1, r0, r6 - ldrh r0, [r1] - cmp r0, r4 - bne _0807C078 - strh r2, [r1] -_0807C078: - adds r2, #1 - adds r5, #2 - cmp r2, r3 - ble _0807C066 - movs r2, #0x80 - lsls r2, r2, #5 - ldr r5, _0807C0C0 @ =gMapTop+0x5004 - adds r6, r5, r2 - ldr r4, _0807C0B8 @ =0x0000FFFF - adds r0, r4, #0 - adds r1, r6, #0 - bl MemFill16 - movs r2, #0 - ldr r3, _0807C0D8 @ =0x000007FF -_0807C096: - ldrh r0, [r5] - cmp r0, r3 - bhi _0807C0A8 - lsls r0, r0, #1 - adds r1, r0, r6 - ldrh r0, [r1] - cmp r0, r4 - bne _0807C0A8 - strh r2, [r1] -_0807C0A8: - adds r2, #1 - adds r5, #2 - cmp r2, r3 - ble _0807C096 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0807C0B8: .4byte 0x0000FFFF -_0807C0BC: .4byte gMapBottom+0x5004 -_0807C0C0: .4byte gMapTop+0x5004 -_0807C0C4: .4byte gRoomControls -_0807C0C8: .4byte gArea -_0807C0CC: .4byte 0x0000085C -_0807C0D0: .4byte gPaletteBuffer -_0807C0D4: .4byte gUsedPalettes -_0807C0D8: .4byte 0x000007FF - .syntax divided diff --git a/src/playerUtils.c b/src/playerUtils.c index c2c28364..d1769c0c 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -18,6 +18,7 @@ #include "save.h" #include "screen.h" #include "screenTransitions.h" +#include "main.h" static void sub_08077E54(ItemBehavior* beh); @@ -157,6 +158,14 @@ extern const u8 gUnk_080084BC[]; u32 sub_0807A180(Entity*, Entity*, u32, u32); +extern u32 gUsedPalettes; + +extern void ClearBgAnimations(void); +extern void sub_080197D4(const void*); +extern void LoadBgAnimations(u16*); + +void sub_0807BFA8(void); + void UpdateActiveItems(PlayerEntity* this) { u32 index; @@ -3577,7 +3586,54 @@ void sub_0807BFA8(void) { gRoomControls.height = (gArea.pCurrentRoomInfo)->pixel_height; } -ASM_FUNC("asm/non_matching/playerUtils/sub_0807BFD0.inc", void sub_0807BFD0()) +void sub_0807BFD0(void) { + s32 index; + u16* puVar2; + u16* puVar3; + u16* ptr; + typeof(gMapTop)* newptr; + + ClearBgAnimations(); + sub_0807BFA8(); + MemFill16(0xffff, gMapBottom.metatileTypes, 0x1000); + gMapBottom.metatileTypes[0] = 0; + MemFill16(0xffff, gMapTop.metatileTypes, 0x1000); + gMapTop.metatileTypes[0] = 0; + + if ((void*)gRoomControls.unk_34 != (gArea.pCurrentRoomInfo)->tileset) { + gRoomControls.unk_34 = (u32)(gArea.pCurrentRoomInfo)->tileset; + sub_080197D4((gArea.pCurrentRoomInfo)->tileset); + } + + sub_080197D4((gArea.pCurrentRoomInfo)->metatiles); + ptr = gPaletteBuffer; + MemCopy(&ptr[0x30], &ptr[0x150], 0x20); + gUsedPalettes |= 0x200000; + + if ((gArea.pCurrentRoomInfo)->bg_anim != NULL) { + LoadBgAnimations((gArea.pCurrentRoomInfo)->bg_anim); + } + + puVar2 = gMapBottom.metatileTypes; + puVar3 = gMapBottom.unkData2; + MemFill16(0xffff, puVar3, 0x1000); + + for (index = 0; index < 0x800; index++, puVar2++) { + if ((*puVar2 < 0x800) && (puVar3[*puVar2] == 0xffff)) { + puVar3[*puVar2] = index; + } + } + + puVar2 = gMapTop.metatileTypes; + puVar3 = gMapTop.unkData2; + MemFill16(0xffff, puVar3, 0x1000); + + for (index = 0; index < 0x800; index++, puVar2++) { + if ((*puVar2 < 0x800) && (puVar3[*puVar2] == 0xffff)) { + puVar3[*puVar2] = index; + } + } +} void LoadRoomGfx(void) { RoomControls* roomControls; From de847d45ba9c9abe3510a2ab146e3612b88f19eb Mon Sep 17 00:00:00 2001 From: ThothWhatsThis Date: Thu, 30 Nov 2023 08:15:47 +0000 Subject: [PATCH 3/4] Match sub_0807C8B0 --- asm/non_matching/playerUtils/sub_0807C8B0.inc | 98 ------------------- src/playerUtils.c | 40 +++++++- 2 files changed, 39 insertions(+), 99 deletions(-) delete mode 100644 asm/non_matching/playerUtils/sub_0807C8B0.inc diff --git a/asm/non_matching/playerUtils/sub_0807C8B0.inc b/asm/non_matching/playerUtils/sub_0807C8B0.inc deleted file mode 100644 index 90f1d5db..00000000 --- a/asm/non_matching/playerUtils/sub_0807C8B0.inc +++ /dev/null @@ -1,98 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sb - mov r6, r8 - push {r6, r7} - mov r8, r0 - adds r4, r1, #0 - mov ip, r2 - mov r0, ip - muls r0, r4, r0 - lsls r0, r0, #1 - add r0, r8 - subs r7, r0, #2 - mov r0, ip - subs r0, #1 - lsls r0, r0, #7 - add r0, r8 - lsls r3, r4, #1 - subs r1, r3, #2 - adds r0, r0, r1 - movs r5, #0 - cmp r5, ip - bhs _0807C906 - mov sb, r3 -_0807C8DE: - movs r2, #0 - adds r6, r0, #0 - subs r6, #0x80 - cmp r2, r4 - bhs _0807C8FA - adds r1, r7, #0 - adds r3, r0, #0 -_0807C8EC: - ldrh r0, [r1] - strh r0, [r3] - subs r1, #2 - subs r3, #2 - adds r2, #1 - cmp r2, r4 - blo _0807C8EC -_0807C8FA: - adds r0, r6, #0 - mov r1, sb - subs r7, r7, r1 - adds r5, #1 - cmp r5, ip - blo _0807C8DE -_0807C906: - movs r0, #0x40 - subs r6, r0, r4 - movs r5, #0 - lsls r0, r4, #1 - mov r2, ip - lsls r7, r2, #7 - mov r2, r8 - adds r1, r2, r0 -_0807C916: - lsls r0, r5, #7 - adds r0, r1, r0 - movs r2, #0 - adds r3, r5, #1 - cmp r2, r6 - bhs _0807C92E - movs r4, #0 -_0807C924: - strh r4, [r0] - adds r0, #2 - adds r2, #1 - cmp r2, r6 - blo _0807C924 -_0807C92E: - adds r5, r3, #0 - cmp r5, #0x3f - bls _0807C916 - movs r0, #0x40 - mov r1, ip - subs r6, r0, r1 - mov r2, r8 - adds r0, r2, r7 - movs r5, #0 - cmp r5, r6 - bhs _0807C956 - adds r4, r0, #0 -_0807C946: - adds r0, r4, #0 - movs r1, #0x80 - bl MemClear - adds r4, #0x80 - adds r5, #1 - cmp r5, r6 - blo _0807C946 -_0807C956: - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - .syntax divided diff --git a/src/playerUtils.c b/src/playerUtils.c index d1769c0c..1f9305b6 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -4001,7 +4001,45 @@ void sub_0807C898(void) { gRoomTransition.field2d = 0; } -ASM_FUNC("asm/non_matching/playerUtils/sub_0807C8B0.inc", void sub_0807C8B0(u16* a, u32 b, u32 c)) +void sub_0807C8B0(u16* data, u32 width, u32 height) { + u16* dst_ptr; + u16* src_ptr; + u16* dst_ptr_cpy; + u16* src_ptr_cpy; + u32 innerIndex; + u32 index; + u16* prev_line; + u32 diff; + + src_ptr = data + width * height - 1; + dst_ptr = data + (height - 1) * 0x40 + (width - 1); + + for (index = 0; index < height; index++) { + src_ptr_cpy = src_ptr; //[index * -width]; + dst_ptr_cpy = dst_ptr; //[index * -0x40]; + for (innerIndex = 0; innerIndex < width; innerIndex++) { + dst_ptr_cpy[-innerIndex] = src_ptr_cpy[-innerIndex]; + } + dst_ptr -= 0x40; + src_ptr -= width; + } + + diff = 0x40 - width; + for (index = 0; index < 0x40; index++) { + dst_ptr = data + width - index * -0x40; + + for (innerIndex = 0; innerIndex < diff; innerIndex++) { + dst_ptr[innerIndex] = 0; + } + } + + diff = 0x40 - height; + dst_ptr = data + height * 0x40; + for (index = 0; index < diff; index++) { + MemClear(&dst_ptr[index * 0x40], 0x80); + // dst_ptr += 0x40; + } +} void LoadCompressedMapData(void* dest, u32 offset) { void* src; From 0918be7801655f4a1942b296722f0124070c7cf6 Mon Sep 17 00:00:00 2001 From: ThothWhatsThis Date: Thu, 30 Nov 2023 08:33:35 +0000 Subject: [PATCH 4/4] Fix function signatures --- src/playerUtils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/playerUtils.c b/src/playerUtils.c index 1f9305b6..0b1a1f67 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -26,7 +26,7 @@ extern void sub_0800857C(Entity*); extern void SetDefaultPriorityForKind(Entity*); extern void sub_0809D738(Entity*); extern s32 Mod(s32, s32); -extern void sub_08003FDE(Entity*, u32, u32, u32); +extern u32 sub_08003FDE(Entity*, Entity*, u32, u32); extern u32 sub_080B1B84(u32, u32); extern void sub_08080BC4(void); void sub_080790E4(Entity* this); @@ -2446,11 +2446,11 @@ bool32 HasSwordEquipped(void) { } } -void sub_0807A180(Entity* param_1, u32 param_2, u32 param_3, u32 param_4) { +u32 sub_0807A180(Entity* param_1, Entity* param_2, u32 param_3, u32 param_4) { GenericEntity stackEntity; PositionRelative(param_1, &stackEntity.base, 0, -0x40000); stackEntity.base.animationState = param_1->animationState; - sub_08003FDE(&stackEntity.base, param_2, param_3, param_4); + return sub_08003FDE(&stackEntity.base, param_2, param_3, param_4); } void UpdateFloorType(void) {