From 167710b4d400e47d8be7e6d52dee65b2f3caee12 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Fri, 5 Aug 2022 21:04:33 +0200 Subject: [PATCH] Decompile some functions --- .../common/DrawDungeonFeatures.inc | 179 ------------------ .../playerUtils/RespawnPlayer.inc | 100 ---------- asm/non_matching/playerUtils/sub_08078FB0.inc | 99 ---------- asm/non_matching/playerUtils/sub_0807C740.inc | 111 ----------- .../pushableFurniture/sub_0808F990.inc | 170 ----------------- asm/non_matching/vram/sub_080ADE74.inc | 135 ------------- include/player.h | 7 +- src/common.c | 130 ++++++++++--- src/interrupts.c | 4 +- src/object/lilypadLarge.c | 2 +- src/object/linkAnimation.c | 2 +- src/object/pushableFurniture.c | 96 +++++----- src/objectUtils.c | 2 +- src/physics.c | 3 +- src/player.c | 6 +- src/playerUtils.c | 127 ++++++++----- src/vram.c | 50 ++++- 17 files changed, 291 insertions(+), 932 deletions(-) delete mode 100644 asm/non_matching/common/DrawDungeonFeatures.inc delete mode 100644 asm/non_matching/playerUtils/RespawnPlayer.inc delete mode 100644 asm/non_matching/playerUtils/sub_08078FB0.inc delete mode 100644 asm/non_matching/playerUtils/sub_0807C740.inc delete mode 100644 asm/non_matching/pushableFurniture/sub_0808F990.inc delete mode 100644 asm/non_matching/vram/sub_080ADE74.inc diff --git a/asm/non_matching/common/DrawDungeonFeatures.inc b/asm/non_matching/common/DrawDungeonFeatures.inc deleted file mode 100644 index fcd6f37c..00000000 --- a/asm/non_matching/common/DrawDungeonFeatures.inc +++ /dev/null @@ -1,179 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #0x14 - adds r4, r0, #0 - bl AreaHasMap - cmp r0, #0 - bne _0801DDB8 - b _0801DEEA -_0801DDB8: - ldr r1, _0801DDD8 @ =gUnk_080C9C50 - ldr r0, _0801DDDC @ =gArea - ldrb r0, [r0, #3] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - lsls r0, r4, #2 - adds r0, r0, r1 - ldr r4, [r0] - ldr r0, _0801DDE0 @ =gMapDataBottomSpecial - movs r1, #0x80 - lsls r1, r1, #8 - bl MemClear - b _0801DEE2 - .align 2, 0 -_0801DDD8: .4byte gUnk_080C9C50 -_0801DDDC: .4byte gArea -_0801DDE0: .4byte gMapDataBottomSpecial -_0801DDE4: - ldrb r0, [r4] - ldrb r1, [r4, #1] - movs r2, #3 - bl GetRoomProperty - adds r6, r0, #0 - adds r0, r4, #0 - bl sub_0801DF10 - adds r5, r0, #0 - movs r0, #0 - str r0, [sp, #0xc] - ldrh r2, [r4] - ldr r0, _0801DE14 @ =gUI - ldrh r3, [r0, #0x20] - ldr r1, _0801DE18 @ =0x0000FFFF - ands r1, r2 - ldr r0, _0801DE18 @ =0x0000FFFF - ands r0, r3 - cmp r1, r0 - bne _0801DE1C - movs r3, #8 - b _0801DE36 - .align 2, 0 -_0801DE14: .4byte gUI -_0801DE18: .4byte 0x0000FFFF -_0801DE1C: - bl HasDungeonSmallKey - cmp r0, #0 - beq _0801DE28 - movs r0, #2 - str r0, [sp, #0xc] -_0801DE28: - adds r0, r6, #0 - adds r1, r5, #0 - bl sub_0801DF90 - cmp r0, #0 - beq _0801DE38 - movs r3, #3 -_0801DE36: - str r3, [sp, #0xc] -_0801DE38: - ldrb r1, [r4, #2] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _0801DE46 - movs r0, #0 - str r0, [sp, #0xc] -_0801DE46: - adds r3, r4, #0 - adds r3, #8 - str r3, [sp, #0x10] - ldr r0, [sp, #0xc] - cmp r0, #0 - beq _0801DEE0 - ldr r2, _0801DEF8 @ =0x040000D4 - ldr r0, [r4, #4] - ldr r1, _0801DEFC @ =gMapData - adds r0, r0, r1 - str r0, [r2] - ldr r0, _0801DF00 @ =gMapDataBottomSpecial - str r0, [r2, #4] - ldr r0, _0801DF04 @ =0x84000100 - str r0, [r2, #8] - ldr r0, [r2, #8] - ldr r0, _0801DF08 @ =gAreaRoomHeaders - ldrb r2, [r4] - lsls r2, r2, #2 - adds r2, r2, r0 - ldrb r1, [r4, #1] - lsls r0, r1, #2 - adds r0, r0, r1 - lsls r0, r0, #1 - ldr r2, [r2] - adds r2, r2, r0 - ldrh r0, [r2] - lsrs r0, r0, #4 - str r0, [sp] - ldrh r0, [r2, #2] - ldr r1, _0801DF0C @ =0x000007FF - ands r0, r1 - lsrs r0, r0, #4 - str r0, [sp, #4] - ldrh r0, [r2, #4] - lsrs r7, r0, #4 - ldrh r0, [r2, #6] - lsrs r0, r0, #4 - mov sl, r0 - adds r0, r7, #3 - lsrs r0, r0, #2 - str r0, [sp, #8] - movs r6, #0 - cmp r6, sl - bhs _0801DEE0 -_0801DEA0: - ldr r3, [sp, #8] - adds r1, r6, #0 - muls r1, r3, r1 - ldr r0, _0801DF00 @ =gMapDataBottomSpecial - adds r1, r1, r0 - mov r8, r1 - movs r5, #0 - adds r0, r6, #1 - mov sb, r0 - cmp r5, r7 - bhs _0801DEDA -_0801DEB6: - ldr r3, [sp] - adds r4, r3, r5 - adds r0, r5, #0 - mov r1, r8 - bl sub_0801DF60 - ldr r1, [sp, #0xc] - bl sub_0801DF78 - adds r2, r0, #0 - adds r0, r4, #0 - ldr r3, [sp, #4] - adds r1, r3, r6 - bl sub_0801DF28 - adds r5, #1 - cmp r5, r7 - blo _0801DEB6 -_0801DEDA: - mov r6, sb - cmp r6, sl - blo _0801DEA0 -_0801DEE0: - ldr r4, [sp, #0x10] -_0801DEE2: - ldrb r0, [r4] - cmp r0, #0 - beq _0801DEEA - b _0801DDE4 -_0801DEEA: - add sp, #0x14 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0801DEF8: .4byte 0x040000D4 -_0801DEFC: .4byte gMapData -_0801DF00: .4byte gMapDataBottomSpecial -_0801DF04: .4byte 0x84000100 -_0801DF08: .4byte gAreaRoomHeaders -_0801DF0C: .4byte 0x000007FF - .syntax divided diff --git a/asm/non_matching/playerUtils/RespawnPlayer.inc b/asm/non_matching/playerUtils/RespawnPlayer.inc deleted file mode 100644 index 79e407cc..00000000 --- a/asm/non_matching/playerUtils/RespawnPlayer.inc +++ /dev/null @@ -1,100 +0,0 @@ - .syntax unified - push {r4, r5, lr} - ldr r4, _08079498 @ =gPlayerEntity - movs r1, #0 - movs r0, #0x19 - strb r0, [r4, #0xc] - str r1, [r4, #0x34] - str r1, [r4, #0x20] - adds r0, r4, #0 - adds r0, #0x42 - strb r1, [r0] - bl ResetPlayerPosition - ldr r2, _0807949C @ =gPlayerState - ldr r1, [r2, #0x30] - movs r0, #0x80 - lsls r0, r0, #0xa - ands r0, r1 - cmp r0, #0 - bne _08079514 - movs r0, #0x80 - lsls r0, r0, #9 - ands r1, r0 - cmp r1, #0 - beq _080794E4 - adds r0, r2, #0 - adds r0, #0x84 - ldr r1, [r0] - ldrh r0, [r1, #0x2e] - strh r0, [r4, #0x2e] - ldrh r0, [r1, #0x32] - strh r0, [r4, #0x32] - b _08079514 - .align 2, 0 -_08079498: .4byte gPlayerEntity -_0807949C: .4byte gPlayerState -_080794A0: - ldr r2, _080794DC @ =gPlayerEntity - ldr r0, [r4] - lsrs r0, r0, #0x1e - adds r1, r2, #0 - adds r1, #0x38 - strb r0, [r1] - ldr r3, _080794E0 @ =gRoomControls - ldr r0, [r4] - movs r1, #0x3f - ands r0, r1 - lsls r0, r0, #4 - ldrh r1, [r3, #6] - adds r0, r0, r1 - adds r0, #8 - strh r0, [r2, #0x2e] - ldr r0, [r4] - movs r1, #0xfc - lsls r1, r1, #4 - ands r0, r1 - lsrs r0, r0, #2 - ldrh r3, [r3, #8] - adds r0, r0, r3 - adds r0, #8 - strh r0, [r2, #0x32] - ldrb r1, [r2, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r2, #0x10] - b _08079514 - .align 2, 0 -_080794DC: .4byte gPlayerEntity -_080794E0: .4byte gRoomControls -_080794E4: - movs r5, #0 - ldr r1, [r2, #0x40] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - beq _08079514 - adds r4, r2, #0 - adds r4, #0x40 -_080794F4: - ldr r1, [r4] - ldrh r0, [r4] - lsrs r1, r1, #0x1e - bl sub_080B1B44 - cmp r0, #0xf - bne _080794A0 - adds r4, #4 - adds r5, #1 - cmp r5, #0xf - bhi _08079514 - ldr r1, [r4] - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - bne _080794F4 -_08079514: - ldr r0, _0807951C @ =gPlayerEntity - bl UpdateSpriteForCollisionLayer - pop {r4, r5, pc} - .align 2, 0 -_0807951C: .4byte gPlayerEntity - .syntax divided diff --git a/asm/non_matching/playerUtils/sub_08078FB0.inc b/asm/non_matching/playerUtils/sub_08078FB0.inc deleted file mode 100644 index 4dc70f0c..00000000 --- a/asm/non_matching/playerUtils/sub_08078FB0.inc +++ /dev/null @@ -1,99 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r5, _08078FE0 @ =gPlayerState - ldrb r1, [r5, #6] - movs r6, #0x80 - adds r0, r6, #0 - ands r0, r1 - cmp r0, #0 - bne _08078FCA - adds r1, r5, #0 - adds r1, #0x35 - movs r0, #0xff - strb r0, [r1] -_08078FCA: - adds r0, r4, #0 - bl sub_08079064 - ldr r1, [r5, #0x30] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _08078FE4 - movs r2, #0x58 - b _08078FFA - .align 2, 0 -_08078FE0: .4byte gPlayerState -_08078FE4: - ands r1, r6 - cmp r1, #0 - beq _08078FEE - movs r2, #0x18 - b _08078FFA -_08078FEE: - ldrh r0, [r5, #8] - lsrs r0, r0, #8 - movs r2, #0xb8 - cmp r0, #7 - bne _08078FFA - movs r2, #0x34 -_08078FFA: - ldr r0, _08079014 @ =gPlayerState - adds r3, r0, #0 - ldrb r1, [r0, #8] - cmp r2, r1 - bls _08079040 - ldrb r0, [r4, #0x14] - adds r2, r0, #0 - cmp r2, #4 - bls _08079018 - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 - b _08079020 - .align 2, 0 -_08079014: .4byte gPlayerState -_08079018: - ldrb r1, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r1 -_08079020: - strb r0, [r4, #0x18] - ldr r0, [r3, #0x30] - movs r1, #0x80 - lsls r1, r1, #0xc - ands r0, r1 - cmp r0, #0 - beq _08079036 - ldrh r1, [r3, #8] - ldrb r0, [r4, #0x14] - adds r2, r1, r0 - b _08079042 -_08079036: - lsls r0, r2, #0x18 - lsrs r0, r0, #0x19 - ldrh r3, [r3, #8] - adds r2, r0, r3 - b _08079042 -_08079040: - ldrh r2, [r0, #8] -_08079042: - ldrh r0, [r4, #0x12] - lsls r0, r0, #8 - adds r1, r4, #0 - adds r1, #0x58 - ldrb r1, [r1] - orrs r0, r1 - cmp r2, r0 - beq _08079062 - lsrs r0, r2, #8 - strh r0, [r4, #0x12] - movs r0, #0xff - ands r2, r0 - adds r0, r4, #0 - adds r1, r2, #0 - bl InitAnimationForceUpdate -_08079062: - pop {r4, r5, r6, pc} - .syntax divided diff --git a/asm/non_matching/playerUtils/sub_0807C740.inc b/asm/non_matching/playerUtils/sub_0807C740.inc deleted file mode 100644 index afd175a7..00000000 --- a/asm/non_matching/playerUtils/sub_0807C740.inc +++ /dev/null @@ -1,111 +0,0 @@ - .syntax unified - push {r4, r5, lr} - bl sub_0807BFD0 - bl LoadRoomGfx - ldr r4, _0807C780 @ =gRoomControls - ldr r2, [r4, #0x30] - cmp r2, #0 - beq _0807C788 - ldrh r1, [r2, #0x2e] - lsls r0, r1, #0x10 - cmp r0, #0 - bge _0807C764 - ldr r0, _0807C784 @ =0x00007FFF - ands r0, r1 - ldrh r1, [r4, #6] - subs r0, r0, r1 - strh r0, [r2, #0x2e] -_0807C764: - movs r0, #0x2e - ldrsh r3, [r2, r0] - ldrh r1, [r2, #0x32] - lsls r0, r1, #0x10 - cmp r0, #0 - bge _0807C77A - ldr r0, _0807C784 @ =0x00007FFF - ands r0, r1 - ldrh r1, [r4, #8] - subs r0, r0, r1 - strh r0, [r2, #0x32] -_0807C77A: - movs r0, #0x32 - ldrsh r5, [r2, r0] - b _0807C78C - .align 2, 0 -_0807C780: .4byte gRoomControls -_0807C784: .4byte 0x00007FFF -_0807C788: - movs r3, #0 - movs r5, #0 -_0807C78C: - cmp r3, #0x77 - bgt _0807C794 - movs r0, #0 - b _0807C7A2 -_0807C794: - ldrh r1, [r4, #0x1e] - adds r0, r1, #0 - subs r0, #0x78 - cmp r0, r3 - blt _0807C7A0 - adds r0, r3, #0 -_0807C7A0: - subs r0, #0x78 -_0807C7A2: - strh r0, [r4, #0xa] - ldrh r1, [r4, #6] - ldrh r2, [r4, #0xa] - adds r0, r1, r2 - strh r0, [r4, #0xa] - cmp r5, #0x4f - bgt _0807C7B4 - movs r0, #0 - b _0807C7C2 -_0807C7B4: - ldrh r2, [r4, #0x20] - adds r0, r2, #0 - subs r0, #0x50 - cmp r0, r5 - blt _0807C7C0 - adds r0, r5, #0 -_0807C7C0: - subs r0, #0x50 -_0807C7C2: - strh r0, [r4, #0xc] - ldrh r0, [r4, #8] - ldrh r3, [r4, #0xc] - adds r0, r0, r3 - strh r0, [r4, #0xc] - ldr r2, [r4, #0x30] - cmp r2, #0 - beq _0807C7FC - ldrh r3, [r2, #0x2e] - adds r0, r1, r3 - strh r0, [r2, #0x2e] - ldr r1, [r4, #0x30] - ldrh r0, [r4, #8] - ldrh r2, [r1, #0x32] - adds r0, r0, r2 - strh r0, [r1, #0x32] - ldr r0, _0807C80C @ =gRoomControls - ldrb r1, [r0, #0xf] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _0807C7FC - ldr r0, [r4, #0x30] - adds r0, #0x38 - movs r1, #1 - strb r1, [r0] - ldr r0, [r4, #0x30] - bl UpdateSpriteForCollisionLayer -_0807C7FC: - ldrb r1, [r4, #0xf] - movs r0, #0xfb - ands r0, r1 - strb r0, [r4, #0xf] - bl sub_08080BC4 - pop {r4, r5, pc} - .align 2, 0 -_0807C80C: .4byte gRoomControls - .syntax divided diff --git a/asm/non_matching/pushableFurniture/sub_0808F990.inc b/asm/non_matching/pushableFurniture/sub_0808F990.inc deleted file mode 100644 index 11bf33cd..00000000 --- a/asm/non_matching/pushableFurniture/sub_0808F990.inc +++ /dev/null @@ -1,170 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r4, r0, #0 - movs r2, #1 - strb r2, [r4, #0xc] - movs r3, #0 - movs r0, #0x80 - strh r0, [r4, #0x24] - ldrb r0, [r4, #0xe] - strb r0, [r4, #0xf] - strb r3, [r4, #0xe] - ldrb r1, [r4, #0x11] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r4, #0x11] - adds r0, r4, #0 - adds r0, #0x81 - strb r3, [r0] - adds r0, #2 - strb r3, [r0] - ldrb r1, [r4, #0x19] - movs r0, #0x3f - ands r0, r1 - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x19] - ldrb r0, [r4, #0xa] - cmp r0, #1 - bne _0808F9E8 - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - adds r0, #0x80 - strb r3, [r0] - b _0808FA1C -_0808F9E8: - adds r0, r4, #0 - adds r0, #0x80 - strb r2, [r0] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #5 - orrs r0, r1 - strb r0, [r2] - ldrb r0, [r4, #0xa] - cmp r0, #2 - beq _0808FA0A - cmp r0, #4 - bne _0808FA1C -_0808FA0A: - ldrh r0, [r4, #0x32] - adds r0, #2 - strh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #0xfe - strb r0, [r1] - strb r3, [r4, #0xd] - strb r3, [r4, #0x1e] -_0808FA1C: - ldrb r0, [r4, #0xf] - cmp r0, #0 - beq _0808FAC4 - movs r6, #0 - cmp r0, #0x80 - beq _0808FA84 - ldrh r1, [r4, #0xa] - ldr r0, _0808FA38 @ =0x00000101 - cmp r1, r0 - bne _0808FA3C - movs r0, #0xf - ldrsb r0, [r4, r0] - ldrh r1, [r4, #0x32] - b _0808FA42 - .align 2, 0 -_0808FA38: .4byte 0x00000101 -_0808FA3C: - movs r0, #0xf - ldrsb r0, [r4, r0] - ldrh r1, [r4, #0x2e] -_0808FA42: - adds r0, r0, r1 - adds r1, r4, #0 - adds r1, #0x7e - strh r0, [r1] - adds r5, r1, #0 - ldr r3, [r4, #0x50] - cmp r3, #0 - bne _0808FA5E - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - b _0808FA7C -_0808FA5E: - adds r2, r4, #0 - adds r2, #0x82 - ldrb r1, [r2] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0808FA76 - ldrb r0, [r3, #0xc] - cmp r0, #2 - bne _0808FAA2 - adds r6, #1 - b _0808FAA2 -_0808FA76: - ldrb r0, [r2] - bl CheckLocalFlag -_0808FA7C: - cmp r0, #0 - beq _0808FAA2 - adds r6, #1 - b _0808FAA2 -_0808FA84: - movs r6, #1 - ldrh r1, [r4, #0xa] - ldr r0, _0808FA94 @ =0x00000101 - cmp r1, r0 - bne _0808FA98 - ldrh r1, [r4, #0x32] - b _0808FA9A - .align 2, 0 -_0808FA94: .4byte 0x00000101 -_0808FA98: - ldrh r1, [r4, #0x2e] -_0808FA9A: - adds r0, r4, #0 - adds r0, #0x7e - strh r1, [r0] - adds r5, r0, #0 -_0808FAA2: - cmp r6, #0 - beq _0808FAC4 - adds r1, r4, #0 - adds r1, #0x81 - movs r0, #1 - strb r0, [r1] - ldrh r1, [r4, #0xa] - ldr r0, _0808FABC @ =0x00000101 - cmp r1, r0 - bne _0808FAC0 - ldrh r0, [r5] - strh r0, [r4, #0x32] - b _0808FAC4 - .align 2, 0 -_0808FABC: .4byte 0x00000101 -_0808FAC0: - ldrh r0, [r5] - strh r0, [r4, #0x2e] -_0808FAC4: - adds r0, r4, #0 - bl sub_0808FF50 - pop {r4, r5, r6, pc} - .syntax divided diff --git a/asm/non_matching/vram/sub_080ADE74.inc b/asm/non_matching/vram/sub_080ADE74.inc deleted file mode 100644 index ce864510..00000000 --- a/asm/non_matching/vram/sub_080ADE74.inc +++ /dev/null @@ -1,135 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r2, r0, #0 - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, _080ADF00 @ =gUnk_02024494 - adds r3, r0, r1 - ldrb r1, [r3] - movs r0, #0xf0 - ands r0, r1 - cmp r0, #0 - beq _080ADF7C - movs r0, #0xf - ands r0, r1 - movs r1, #0x10 - orrs r0, r1 - strb r0, [r3] - ldrh r1, [r3, #6] - ldr r0, _080ADF04 @ =0x0000FFFF - cmp r1, r0 - beq _080ADF18 - ldrb r0, [r3, #3] - cmp r0, #0 - beq _080ADF18 - lsls r0, r0, #6 - ldr r1, _080ADF08 @ =gUnk_020000C0 - adds r4, r0, r1 - movs r5, #4 - movs r6, #9 - rsbs r6, r6, #0 -_080ADEB0: - ldrb r1, [r4] - movs r0, #4 - ands r0, r1 - cmp r0, #0 - beq _080ADEF6 - ldr r0, _080ADF0C @ =gGFXSlots - ldrb r0, [r0, #3] - cmp r0, #0 - bne _080ADECA - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _080ADEF6 -_080ADECA: - adds r0, r6, #0 - ands r0, r1 - strb r0, [r4] - ldrb r0, [r4, #9] - lsls r2, r0, #5 - cmp r2, #0 - beq _080ADEF6 - ldrh r0, [r4, #0xa] - lsls r0, r0, #5 - ldr r3, _080ADF10 @ =0x06010000 - adds r1, r0, r3 - ldr r3, _080ADF14 @ =0x040000D4 - ldr r0, [r4, #0xc] - str r0, [r3] - str r1, [r3, #4] - adds r0, r2, #0 - asrs r0, r0, #2 - movs r1, #0x84 - lsls r1, r1, #0x18 - orrs r0, r1 - str r0, [r3, #8] - ldr r0, [r3, #8] -_080ADEF6: - adds r4, #0x10 - subs r5, #1 - cmp r5, #0 - bgt _080ADEB0 - b _080ADF7C - .align 2, 0 -_080ADF00: .4byte gUnk_02024494 -_080ADF04: .4byte 0x0000FFFF -_080ADF08: .4byte gUnk_020000C0 -_080ADF0C: .4byte gGFXSlots -_080ADF10: .4byte 0x06010000 -_080ADF14: .4byte 0x040000D4 -_080ADF18: - lsls r0, r2, #9 - ldr r2, _080ADF4C @ =0x06012800 - adds r1, r0, r2 - ldrh r2, [r3, #6] - cmp r2, #0 - beq _080ADF58 - ldr r0, _080ADF50 @ =0x0000FFFF - cmp r2, r0 - beq _080ADF62 - ldr r2, _080ADF54 @ =0x040000D4 - ldr r0, [r3, #8] - str r0, [r2] - str r1, [r2, #4] - ldrh r0, [r3, #6] - lsls r0, r0, #3 - movs r1, #0x84 - lsls r1, r1, #0x18 - orrs r0, r1 - str r0, [r2, #8] - ldr r0, [r2, #8] - ldrh r2, [r3, #6] - subs r2, #0x10 - cmp r2, #0 - ble _080ADF7C - b _080ADF70 - .align 2, 0 -_080ADF4C: .4byte 0x06012800 -_080ADF50: .4byte 0x0000FFFF -_080ADF54: .4byte 0x040000D4 -_080ADF58: - ldrb r1, [r3] - movs r0, #0xf - ands r0, r1 - strb r0, [r3] - b _080ADF7C -_080ADF62: - ldrb r0, [r3, #3] - cmp r0, #0 - bne _080ADF7C - ldr r0, [r3, #8] - bl LZ77UnCompVram - b _080ADF7C -_080ADF70: - adds r3, #0xc - movs r0, #0 - strh r0, [r3, #6] - subs r2, #0x10 - cmp r2, #0 - bgt _080ADF70 -_080ADF7C: - pop {r4, r5, r6, pc} - .align 2, 0 - .syntax divided diff --git a/include/player.h b/include/player.h index 044cb79a..fb01c268 100644 --- a/include/player.h +++ b/include/player.h @@ -309,7 +309,12 @@ typedef struct { /*0x3f*/ s8 spriteOffsetY; /*0x40*/ u32 path_memory[16]; /*0x80*/ u16 speed_modifier; - /*0x82*/ u8 field_0x82[9]; + /*0x82*/ u8 field_0x82; + /*0x83*/ u8 playerPalette; + /*0x84*/ Entity* lilypad; /**< Last lilypad the player was standing on? */ + /*0x88*/ u8 field_0x88; + /*0x89*/ u8 remainingDiveTime; /**< Frames that the player can continue to dive. */ + /*0x8a*/ u8 field_0x8a; /*0x8b*/ u8 controlMode; /*0x8c*/ u16 vel_x; /*0x8e*/ u16 vel_y; diff --git a/src/common.c b/src/common.c index 2c4bdc1a..a8ee1736 100644 --- a/src/common.c +++ b/src/common.c @@ -1,23 +1,25 @@ -#include "global.h" +#include "area.h" #include "asm.h" #include "common.h" -#include "structures.h" -#include "screen.h" -#include "main.h" -#include "area.h" -#include "room.h" -#include "fileselect.h" -#include "game.h" #include "flags.h" -#include "kinstone.h" #include "functions.h" +#include "game.h" +#include "global.h" +#include "kinstone.h" +#include "main.h" #include "message.h" +#include "room.h" +#include "save.h" +#include "screen.h" +#include "sound.h" +#include "structures.h" typedef struct { - u8 _0; - u8 _1; - u8 _2; - u8 _3; + u8 area; + u8 room; + u8 unk_2; + u8 unk_3; + u32 mapDataOffset; } DungeonLayout; extern u8 gUnk_03003DE0; @@ -71,6 +73,18 @@ extern const u32 gUnk_080C9460[]; void sub_0801E82C(void); +extern void* GetRoomProperty(u32, u32, u32); + +extern u8 gMapData; +extern const DungeonLayout** gUnk_080C9C50[]; +extern u8 gMapDataBottomSpecial[]; + +u32 sub_0801DF10(const DungeonLayout* lyt); +bool32 sub_0801DF90(TileEntity* tileEntity, u32 bank); +u32 sub_0801DF60(u32 a1, u8* p); +u32 sub_0801DF78(u32 a1, u32 a2); +void sub_0801DF28(u32 x, u32 y, s32 color); + u32 DecToHex(u32 value) { u32 result; register u32 r1 asm("r1"); @@ -386,7 +400,7 @@ u32 sub_0801DB94(void) { return gRoomTransition.player_status.dungeon_map_y >> 11; } -ASM_FUNC("asm/non_matching/common/DrawDungeonMap.inc", void DrawDungeonMap(u32 floor, struct_02019EE0* data, u32 size)); +ASM_FUNC("asm/non_matching/common/DrawDungeonMap.inc", void DrawDungeonMap(u32 floor, void* data, u32 size)); void sub_0801DD58(u32 area, u32 room) { RoomHeader* hdr = gAreaRoomHeaders[area] + room; @@ -398,15 +412,81 @@ void LoadDungeonMap(void) { LoadResourceAsync(gUnk_0201AEE0, 0x6006000, sizeof(gUnk_0201AEE0)); } -ASM_FUNC("asm/non_matching/common/DrawDungeonFeatures.inc", void DrawDungeonFeatures(u32 room, void* data, u32 size)); +void DrawDungeonFeatures(u32 floor, void* data, u32 size) { + u32 bankOffset; + u32 width; + u32 height; + u32 x; + u32 y; + u16 mapX; + u16 mapY; + u32 tmp; + u32 tmp2; + u32 color; + u32 features; + TileEntity* tileEntity; + RoomHeader* roomHeader; + const DungeonLayout* layout; + const DungeonLayout* nextLayout; + u8* ptr; + u32 tmp3; + u32 tmp4; -u32 sub_0801DF10(DungeonLayout* lyt) { + if (!AreaHasMap()) { + return; + } + layout = gUnk_080C9C50[gArea.dungeon_idx][floor]; + MemClear(gMapDataBottomSpecial, 0x8000); + while (layout->area != 0) { + tileEntity = (TileEntity*)GetRoomProperty(layout->area, layout->room, 3); + bankOffset = sub_0801DF10(layout); + features = 0; + if (layout->area == gUI.roomControls.area && layout->room == gUI.roomControls.room) { + features = 8; + } else { + if (HasDungeonSmallKey()) { + features = 2; + } + if (sub_0801DF90(tileEntity, bankOffset)) { + features = 3; + } + } + if ((layout->unk_2 & 1) != 0) { + features = 0; + } + nextLayout = layout + 1; + if (features != 0) { + DmaCopy32(3, &gMapData + layout->mapDataOffset, &gMapDataBottomSpecial, 0x400); + + roomHeader = gAreaRoomHeaders[layout->area] + layout->room; + mapX = roomHeader->map_x / 0x10; + tmp3 = roomHeader->map_y; + tmp4 = 0x7ff; + mapY = (tmp3 & tmp4) / 0x10; + width = roomHeader->pixel_width / 0x10; + height = roomHeader->pixel_height / 0x10; + tmp = (width + 3) / 4; + + for (y = 0; y < height; y++) { + ptr = gMapDataBottomSpecial + y * tmp; + for (x = 0; x < width; x++) { + tmp2 = mapX + x; + color = sub_0801DF78(sub_0801DF60(x, ptr), features); + sub_0801DF28(tmp2, mapY + y, color); + } + } + } + layout = nextLayout; + } +} + +u32 sub_0801DF10(const DungeonLayout* lyt) { u32 offset; - if (lyt->_3 == 1) + if (lyt->unk_3 == 1) offset = 0x300; else - offset = GetFlagBankOffset(lyt->_0); + offset = GetFlagBankOffset(lyt->area); return offset; } @@ -435,15 +515,15 @@ u32 sub_0801DF78(u32 a1, u32 a2) { } } -u32 sub_0801DF90(u8* a1, u32 a2) { - if (a1 == NULL) - return 0; +bool32 sub_0801DF90(TileEntity* tileEntity, u32 bank) { + if (tileEntity == NULL) + return FALSE; - for (; *a1 != 0; a1 += 8) { - if (*a1 == 1) - return CheckLocalFlagByBank(a2, a1[1]); + for (; tileEntity->type != 0; tileEntity++) { + if (tileEntity->type == 1) + return CheckLocalFlagByBank(bank, tileEntity->localFlag); } - return 0; + return FALSE; } void sub_0801DFB4(Entity* entity, u32 textIndex, u32 a3, u32 a4) { diff --git a/src/interrupts.c b/src/interrupts.c index b0a6be57..7d5c162d 100644 --- a/src/interrupts.c +++ b/src/interrupts.c @@ -246,8 +246,8 @@ static void HandlePlayerLife(Entity* this) { gPlayerState.framestate_last = gPlayerState.framestate; gPlayerState.framestate = PL_STATE_IDLE; - if (gPlayerState.field_0x82[0x8] != 0) { - gPlayerState.field_0x82[0x8]--; + if (gPlayerState.field_0x8a != 0) { + gPlayerState.field_0x8a--; return; } diff --git a/src/object/lilypadLarge.c b/src/object/lilypadLarge.c index a36f8277..570ffb09 100644 --- a/src/object/lilypadLarge.c +++ b/src/object/lilypadLarge.c @@ -123,7 +123,7 @@ void sub_080855E8(LilypadLargeEntity* this) { gPlayerEntity.collisionFlags &= 0xfb; gPlayerState.swim_state = 0; } - *(u32*)&gPlayerState.field_0x82[2] = (u32)this; // TODO + gPlayerState.lilypad = super; if (super->collisionLayer == 1) { ResetCollisionLayer(&gPlayerEntity); } else { diff --git a/src/object/linkAnimation.c b/src/object/linkAnimation.c index fa76b9dc..7d5d2cae 100644 --- a/src/object/linkAnimation.c +++ b/src/object/linkAnimation.c @@ -113,7 +113,7 @@ void LinkAnimation_Action8(LinkAnimationEntity* this) { gPlayerState.field_0x27[0] = this->unk_6e; gPlayerState.mobility = this->unk_6f; gPlayerState.flags = this->unk_70; - gPlayerState.field_0x82[8] = this->unk_74; + gPlayerState.field_0x8a = this->unk_74; } break; } diff --git a/src/object/pushableFurniture.c b/src/object/pushableFurniture.c index 22efed6f..ff6b627c 100644 --- a/src/object/pushableFurniture.c +++ b/src/object/pushableFurniture.c @@ -58,14 +58,8 @@ void PushableFurniture(PushableFurnitureEntity* this) { } } -NONMATCH("asm/non_matching/pushableFurniture/sub_0808F990.inc", void sub_0808F990(PushableFurnitureEntity* this)) { - s32 uVar1; - bool32 bVar2; - u32 uVar3; - u32 sVar4; - u16 uVar5; - SpritePriority* pSVar6; - Entity* pEVar7; +void sub_0808F990(PushableFurnitureEntity* this) { + bool32 condition; super->action = 1; super->speed = 0x80; @@ -88,58 +82,54 @@ NONMATCH("asm/non_matching/pushableFurniture/sub_0808F990.inc", void sub_0808F99 super->frameIndex = 0; } } - switch (super->subtimer) { - default: - bVar2 = FALSE; - if (*(u16*)&super->type == 0x101) { - uVar1 = (s8)super->subtimer; - sVar4 = super->y.HALF_U.HI; - } else { - uVar1 = (s8)super->subtimer; - sVar4 = super->x.HALF_U.HI; - } - this->unk_7e = sVar4 + (u32)uVar1; - if (super->parent == NULL) { - uVar3 = CheckFlags((u32)this->unk_86); - } else { - if ((this->unk_82 & 0x80) != 0) { - if (super->parent->action == 2) { - bVar2++; - } - break; + if (super->subtimer != 0) { + condition = FALSE; + switch (super->subtimer) { + default: + if (super->type == 1 && super->type2 == 1) { + this->unk_7e = (s8)super->subtimer + super->y.HALF_U.HI; + } else { + this->unk_7e = (s8)super->subtimer + super->x.HALF_U.HI; + } + if (super->parent == NULL) { + if (CheckFlags(this->unk_86)) { + condition++; + } + } else { + if ((this->unk_82 & 0x80) != 0) { + if (super->parent->action == 2) { + condition++; + } + break; + } + if (CheckLocalFlag((u32)this->unk_82)) { + condition++; + } } - uVar3 = CheckLocalFlag((u32)this->unk_82); - } - if (uVar3 != 0) { - bVar2++; - } - break; - case 0: - bVar2 = FALSE; - break; - case 0x80: - bVar2 = TRUE; - if (*(u16*)&super->type == 0x101) { - uVar5 = super->y.HALF.HI; - } else { - uVar5 = super->x.HALF.HI; - } - this->unk_7e = uVar5; - break; - } - if (bVar2) { - this->unk_81 = 1; - if (*(u16*)&super->type == 0x101) { - super->y.HALF.HI = this->unk_7e; - } else { - super->x.HALF.HI = this->unk_7e; + break; + case 0x80: + condition = TRUE; + if (super->type == 1 && super->type2 == 1) { + this->unk_7e = super->y.HALF.HI; + } else { + this->unk_7e = super->x.HALF.HI; + } + break; + } + + if (condition) { + this->unk_81 = 1; + if (super->type == 1 && super->type2 == 1) { + super->y.HALF.HI = this->unk_7e; + } else { + super->x.HALF.HI = this->unk_7e; + } } } sub_0808FF50(this); } -END_NONMATCH void PushableFurniture_Action1(PushableFurnitureEntity* this) { if (this->unk_81 == 0) { diff --git a/src/objectUtils.c b/src/objectUtils.c index 42ef2df5..7b748c6d 100644 --- a/src/objectUtils.c +++ b/src/objectUtils.c @@ -35,7 +35,7 @@ Entity* sub_080A276C(Entity* parent, u32 type, u32 type2) { e->field_0x6e.HALF.LO = gPlayerState.field_0x27[0]; e->field_0x6e.HALF.HI = gPlayerState.mobility; e->field_0x70.WORD = gPlayerState.flags; - e->field_0x74.HALF.LO = gPlayerState.field_0x82[8]; + e->field_0x74.HALF.LO = gPlayerState.field_0x8a; gPlayerEntity.flags &= ~ENT_COLLIDE; gPlayerEntity.spriteSettings.draw = 0; } diff --git a/src/physics.c b/src/physics.c index fbe503c1..064dc466 100644 --- a/src/physics.c +++ b/src/physics.c @@ -399,14 +399,13 @@ bool32 CheckPlayerProximity(u32 x, u32 y, u32 distX, u32 DistY) { } NONMATCH("asm/non_matching/coord/sub_0806FC24.inc", bool32 sub_0806FC24(u32 param_1, u32 param_2)) { - u32 rv; + register u32 rv asm("r0"); u32 val = sub_08007DD6(param_1, gUnk_080046A4); if (val) { rv = (*(gUnk_080047F6 + (val << 2)) >> param_2) & 0x1; } else { rv = 0; } - return rv; } END_NONMATCH diff --git a/src/player.c b/src/player.c index af48dcf4..ce8056b4 100644 --- a/src/player.c +++ b/src/player.c @@ -1977,7 +1977,7 @@ static void sub_080724DC(Entity* this) { this->knockbackDuration = 0; DeleteClones(); if (GetTileUnderEntity(this) != 0x29) { - if ((gPlayerState.field_0x82[7] == 0) && (gPlayerState.swim_state != 0)) { + if ((gPlayerState.remainingDiveTime == 0) && (gPlayerState.swim_state != 0)) { sub_0807AE20(this); } if (gRoomControls.reload_flags == 0) { @@ -2019,7 +2019,7 @@ static void sub_0807258C(Entity* this) { PlayerWaitForScroll(this); } } - if ((gPlayerState.field_0x82[7] == 0) && (gPlayerState.swim_state != 0)) { + if ((gPlayerState.remainingDiveTime == 0) && (gPlayerState.swim_state != 0)) { sub_0807AE20(this); } } @@ -3606,7 +3606,7 @@ static void sub_08074808(Entity* this) { else gPlayerState.swim_state = 8; this->speed = 0; - gPlayerState.field_0x82[7] = 0; + gPlayerState.remainingDiveTime = 0; if ((gPlayerState.flags & PL_MINISH) == 0) CreateFx(this, FX_WATER_SPLASH, 0); SoundReq(SFX_1A5); diff --git a/src/playerUtils.c b/src/playerUtils.c index 31dbb3fc..2f1b806b 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -1163,7 +1163,7 @@ void sub_08078B48(void) { break; } gPlayerEntity.iframes = -2; - gPlayerState.field_0x82[8] = 2; + gPlayerState.field_0x8a = 2; } void ClearPlayerState(void) { @@ -1299,53 +1299,49 @@ bool32 sub_08078F74(Entity* this) { } } -NONMATCH("asm/non_matching/playerUtils/sub_08078FB0.inc", void sub_08078FB0(Entity* this)) { - u32 bVar2; - u32 animation; +void sub_08078FB0(Entity* this) { + u32 animIndex; if ((gPlayerState.pushedObject & 0x80) == 0) { gPlayerState.field_0x35 = 0xff; } sub_08079064(this); if ((gPlayerState.flags & 8) != 0) { - bVar2 = 0x58; + animIndex = 0x58; } else { if ((gPlayerState.flags & 0x80) != 0) { - bVar2 = 0x18; + animIndex = 0x18; } else { if (gPlayerState.animation >> 8 == 7) { - bVar2 = 0x34; + animIndex = 0x34; } else { - bVar2 = 0xb8; + animIndex = 0xb8; } } } - if (bVar2 > gPlayerState.animation) { - u32 temp = this->animationState; - bVar2 = temp; - if (bVar2 >= 5) { + if (animIndex > (u8)gPlayerState.animation) { + if (this->animationState >= 5) { this->spriteSettings.flipX = 1; } else { this->spriteSettings.flipX = 0; } if ((gPlayerState.flags & PL_MOLDWORM_CAPTURED) != 0) { - bVar2 = gPlayerState.animation + this->animationState; + animIndex = gPlayerState.animation + this->animationState; } else { - bVar2 = (((u8)bVar2) >> 1) + gPlayerState.animation; + animIndex = (this->animationState >> 1) + gPlayerState.animation; } } else { - bVar2 = gPlayerState.animation; + animIndex = gPlayerState.animation; } - if (bVar2 != (((u16)this->spriteIndex << 8) | this->animIndex)) { - this->spriteIndex = bVar2 >> 8; - bVar2 &= 0xff; - InitAnimationForceUpdate(this, bVar2); + if (animIndex != (((u16)this->spriteIndex << 8) | this->animIndex)) { + this->spriteIndex = animIndex >> 8; + animIndex &= 0xff; + InitAnimationForceUpdate(this, animIndex); } } -END_NONMATCH void sub_08079064(Entity* this) { u32 i; @@ -1496,7 +1492,47 @@ bool32 sub_080793E4(u32 param_1) { } } -ASM_FUNC("asm/non_matching/playerUtils/RespawnPlayer.inc", void RespawnPlayer()) +void RespawnPlayer(void) { + u32* ptr1; + u32 index; + Entity* player = &gPlayerEntity; + + player->action = PLAYER_080728AC; + player->z.WORD = 0; + player->zVelocity = 0; + player->knockbackDuration = 0; + ResetPlayerPosition(); + if ((gPlayerState.flags & 0x20000) == 0) { + if ((gPlayerState.flags & 0x10000) != 0) { + player->x.HALF.HI = gPlayerState.lilypad->x.HALF.HI; + player->y.HALF.HI = gPlayerState.lilypad->y.HALF.HI; + } else { + goto code_1; + code_0: + gPlayerEntity.collisionLayer = *ptr1 >> 0x1e; + gPlayerEntity.x.HALF.HI = gRoomControls.origin_x + (*ptr1 & 0x3f) * 16 + 8; + gPlayerEntity.y.HALF.HI = gRoomControls.origin_y + (*ptr1 & 0xfc0) / 4 + 8; + COLLISION_ON(&gPlayerEntity); + goto code_3; + code_1: + index = 0; + if (gPlayerState.path_memory[0] != 0xffffffff) { + ptr1 = gPlayerState.path_memory; + while (sub_080B1B44((u16)*ptr1, *ptr1 >> 0x1e) == 0xf) { + ptr1++; + index++; + if ((index > 0xf) || (*ptr1 == -1)) { + goto code_3; + break; + } + } + goto code_0; + } + } + } +code_3: + UpdateSpriteForCollisionLayer(&gPlayerEntity); +} void sub_08079520(Entity* this) { s32 tmp = gPlayerState.field_0xd; @@ -1904,8 +1940,8 @@ void sub_0807A050(void) { gPlayerState.hurtBlinkSpeed--; } palette = sub_0807A094(0); - if (palette != gPlayerState.field_0x82[1]) { - gPlayerState.field_0x82[1] = palette; + if (palette != gPlayerState.playerPalette) { + gPlayerState.playerPalette = palette; ChangeObjPalette(&gPlayerEntity, palette); } } @@ -2199,13 +2235,13 @@ void sub_0807ACCC(Entity* this) { } else { this->speed -= 4; } - if (gPlayerState.field_0x82[7] == 0) { + if (gPlayerState.remainingDiveTime == 0) { if (!sub_0807ADB8(this)) { sub_0807AE20(this); } } else { - gPlayerState.field_0x82[7]--; - if (gPlayerState.field_0x82[7] != 0) { + gPlayerState.remainingDiveTime--; + if (gPlayerState.remainingDiveTime != 0) { sub_0807ADB8(this); } else { gPlayerState.swim_state &= 0x7f; @@ -2227,10 +2263,10 @@ bool32 sub_0807ADB8(Entity* this) { gPlayerState.swim_state ^= 0x80; tmp = (gPlayerState.swim_state & 0x80); if (tmp != 0) { - gPlayerState.field_0x82[7] = 0x78; + gPlayerState.remainingDiveTime = 0x78; } else { this->spritePriority.b0 = 4; - gPlayerState.field_0x82[7] = tmp; + gPlayerState.remainingDiveTime = tmp; } SoundReq(SFX_163); return TRUE; @@ -3291,15 +3327,13 @@ void sub_0807C69C(u8* data, u32 width, u32 height) { } } -NONMATCH("asm/non_matching/playerUtils/sub_0807C740.inc", void InitializeCamera()) { +void InitializeCamera() { s32 targetX; s32 targetY; Entity* target; RoomControls* roomControls; u32 tmp1; u32 tmp2; - u32 tmp3; - u32 tmp4; sub_0807BFD0(); LoadRoomGfx(); @@ -3307,15 +3341,15 @@ NONMATCH("asm/non_matching/playerUtils/sub_0807C740.inc", void InitializeCamera( target = gRoomControls.camera_target; if (target != NULL) { if ((target->x.HALF_U.HI * 0x10000) < 0) { - tmp3 = (target->x.HALF.HI & 0x7fff); - tmp3 -= gRoomControls.origin_x; - target->x.HALF.HI = tmp3; + tmp1 = (target->x.HALF.HI & 0x7fff); + tmp1 -= gRoomControls.origin_x; + target->x.HALF.HI = tmp1; } targetX = target->x.HALF.HI; if ((target->y.HALF_U.HI * 0x10000) < 0) { - tmp4 = (target->y.HALF.HI & 0x7fff); - tmp4 -= gRoomControls.origin_y; - target->y.HALF.HI = tmp4; + tmp2 = (target->y.HALF.HI & 0x7fff); + tmp2 -= gRoomControls.origin_y; + target->y.HALF.HI = tmp2; } targetY = target->y.HALF.HI; } else { @@ -3326,26 +3360,24 @@ NONMATCH("asm/non_matching/playerUtils/sub_0807C740.inc", void InitializeCamera( if (targetX < 0x78) { roomControls->scroll_x = 0; } else { - if (targetX >= (roomControls->width - 0x78)) { - tmp1 = roomControls->width - 0x78; + if ((roomControls->width - 0x78) < targetX) { + roomControls->scroll_x = roomControls->width - 0x78 - 0x78; } else { - tmp1 = targetX; + roomControls->scroll_x = targetX - 0x78; } - roomControls->scroll_x = tmp1 - 0x78; } - roomControls->scroll_x = roomControls->origin_x + roomControls->scroll_x; + roomControls->scroll_x += roomControls->origin_x; if (targetY < 0x50) { roomControls->scroll_y = 0; } else { - if (targetY >= (roomControls->height - 0x50)) { - tmp2 = roomControls->height - 0x50; + if ((roomControls->height - 0x50) < targetY) { + roomControls->scroll_y = roomControls->height - 0x50 - 0x50; } else { - tmp2 = targetY; + roomControls->scroll_y = targetY - 0x50; } - roomControls->scroll_y = tmp2 - 0x50; } - roomControls->scroll_y = roomControls->scroll_y + roomControls->origin_y; + roomControls->scroll_y += roomControls->origin_y; if (roomControls->camera_target != NULL) { roomControls->camera_target->x.HALF.HI += roomControls->origin_x; @@ -3358,7 +3390,6 @@ NONMATCH("asm/non_matching/playerUtils/sub_0807C740.inc", void InitializeCamera( roomControls->scroll_flags &= 0xfb; sub_08080BC4(); } -END_NONMATCH void sub_0807C810(void) { DiggingCaveEntranceTransition* ptr; diff --git a/src/vram.c b/src/vram.c index 736267cd..1e8b04da 100644 --- a/src/vram.c +++ b/src/vram.c @@ -101,7 +101,55 @@ void sub_080ADE24(void) { } // Transfer gfx slot data to vram? -ASM_FUNC("asm/non_matching/vram/sub_080ADE74.inc", void sub_080ADE74(u32 index)) +void sub_080ADE74(u32 index) { + void* dest; + GfxSlot* slot; + struct_gUnk_020000C0_1* ptr1; + s32 palIndex; + s32 loopIndex; + s32 tmp1; + + slot = gGFXSlots.slots + index; + if (slot->vramStatus != 0) { + slot->vramStatus = 1; + if (((slot->paletteIndex != 0xffff) && (slot->unk_3 != 0))) { + ptr1 = (struct_gUnk_020000C0_1*)(gUnk_020000C0 + slot->unk_3); + for (loopIndex = 4; loopIndex > 0; loopIndex--) { + if (ptr1->unk_00.unk2 != 0 && (gGFXSlots.unk_3 != 0 || ptr1->unk_00.unk3 != 0)) { + ptr1->unk_00.unk3 = 0; + palIndex = ptr1->unk_08.BYTES.byte1 << 5; + if (palIndex != 0) { + dest = (void*)(*(u16*)((s32)&ptr1->unk_08 + 2) * 0x20 + OBJ_VRAM0); + DmaCopy32(3, ptr1->unk_0C, dest, palIndex); + } + } + ptr1++; + } + } else { + dest = (void*)(index * 0x200 + OBJ_VRAM0 + 0x2800); + switch (slot->paletteIndex) { + default: + DmaCopy32(3, slot->palettePointer, dest, (u32)slot->paletteIndex << 5); + palIndex = slot->paletteIndex; + palIndex -= 0x10; + break; + case 0: + slot->vramStatus = 0; + return; + case 0xffff: + if (slot->unk_3 == 0) { + LZ77UnCompVram(slot->palettePointer, dest); + } + return; + } + while (palIndex > 0) { + slot++; + slot[0].paletteIndex = 0; + palIndex -= 0x10; + } + } + } +} bool32 LoadFixedGFX(Entity* entity, u32 gfxIndex) { #ifdef EU