From 60eb3e1d9201ad07fb184dd0de6c51bc3c136817 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Wed, 23 Mar 2022 16:11:07 +0200 Subject: [PATCH] Decompile some scroll functions --- asm/beanstalkSubtask.s | 2 +- asm/non_matching/scroll/sub_0807FDF8.inc | 110 --------- asm/non_matching/scroll/sub_0807FF6C.inc | 57 ----- asm/non_matching/scroll/sub_0807FFE4.inc | 39 ---- asm/non_matching/scroll/sub_08080040.inc | 102 --------- asm/non_matching/scroll/sub_08080108.inc | 56 ----- asm/non_matching/scroll/sub_080801BC.inc | 100 -------- data/data_0811E750.s | 22 +- include/manager.h | 2 +- linker.ld | 1 + src/manager/manager4.c | 12 +- src/scroll.c | 278 ++++++++++++++++++++--- 12 files changed, 257 insertions(+), 524 deletions(-) delete mode 100644 asm/non_matching/scroll/sub_0807FDF8.inc delete mode 100644 asm/non_matching/scroll/sub_0807FF6C.inc delete mode 100644 asm/non_matching/scroll/sub_0807FFE4.inc delete mode 100644 asm/non_matching/scroll/sub_08080040.inc delete mode 100644 asm/non_matching/scroll/sub_08080108.inc delete mode 100644 asm/non_matching/scroll/sub_080801BC.inc diff --git a/asm/beanstalkSubtask.s b/asm/beanstalkSubtask.s index 8086e86e..0d925e49 100644 --- a/asm/beanstalkSubtask.s +++ b/asm/beanstalkSubtask.s @@ -3181,7 +3181,7 @@ sub_0801AE44: @ 0x0801AE44 bl LoadRoomGfx _0801AE5A: bl sub_080809D4 - bl sub_080805F8 + bl UpdateIsDiggingCave ldr r0, _0801AEE4 @ =gRoomTransition adds r0, #0x2d ldrb r0, [r0] diff --git a/asm/non_matching/scroll/sub_0807FDF8.inc b/asm/non_matching/scroll/sub_0807FDF8.inc deleted file mode 100644 index 2bd0510a..00000000 --- a/asm/non_matching/scroll/sub_0807FDF8.inc +++ /dev/null @@ -1,110 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0807FE18 @ =gUpdateVisibleTiles - movs r0, #2 - strb r0, [r1] - ldrh r0, [r4, #0x18] - adds r0, #1 - strh r0, [r4, #0x18] - ldrb r0, [r4, #0x10] - cmp r0, #1 - beq _0807FE44 - cmp r0, #1 - bgt _0807FE1C - cmp r0, #0 - beq _0807FE26 - b _0807FEB6 - .align 2, 0 -_0807FE18: .4byte gUpdateVisibleTiles -_0807FE1C: - cmp r0, #2 - beq _0807FE68 - cmp r0, #3 - beq _0807FE94 - b _0807FEB6 -_0807FE26: - ldrh r0, [r4, #0xc] - subs r0, #4 - strh r0, [r4, #0xc] - ldr r1, [r4, #0x30] - ldr r0, _0807FE3C @ =gPlayerEntity - cmp r1, r0 - bne _0807FE80 - ldr r0, [r1, #0x30] - ldr r2, _0807FE40 @ =0xFFFFA000 - b _0807FE7C - .align 2, 0 -_0807FE3C: .4byte gPlayerEntity -_0807FE40: .4byte 0xFFFFA000 -_0807FE44: - ldrh r0, [r4, #0xa] - adds r0, #4 - strh r0, [r4, #0xa] - ldr r1, [r4, #0x30] - ldr r0, _0807FE64 @ =gPlayerEntity - cmp r1, r0 - bne _0807FE5C - ldr r0, [r1, #0x2c] - movs r2, #0x80 - lsls r2, r2, #7 - adds r0, r0, r2 - str r0, [r1, #0x2c] -_0807FE5C: - ldrh r0, [r4, #0x18] - cmp r0, #0x3c - bne _0807FEB6 - b _0807FE86 - .align 2, 0 -_0807FE64: .4byte gPlayerEntity -_0807FE68: - ldrh r0, [r4, #0xc] - adds r0, #4 - strh r0, [r4, #0xc] - ldr r1, [r4, #0x30] - ldr r0, _0807FE90 @ =gPlayerEntity - cmp r1, r0 - bne _0807FE80 - ldr r0, [r1, #0x30] - movs r2, #0xc0 - lsls r2, r2, #7 -_0807FE7C: - adds r0, r0, r2 - str r0, [r1, #0x30] -_0807FE80: - ldrh r0, [r4, #0x18] - cmp r0, #0x28 - bne _0807FEB6 -_0807FE86: - adds r0, r4, #0 - bl sub_0807FEC8 - b _0807FEB6 - .align 2, 0 -_0807FE90: .4byte gPlayerEntity -_0807FE94: - ldrh r0, [r4, #0xa] - subs r0, #4 - strh r0, [r4, #0xa] - ldr r1, [r4, #0x30] - ldr r0, _0807FEC0 @ =gPlayerEntity - cmp r1, r0 - bne _0807FEAA - ldr r0, [r1, #0x2c] - ldr r2, _0807FEC4 @ =0xFFFFC000 - adds r0, r0, r2 - str r0, [r1, #0x2c] -_0807FEAA: - ldrh r0, [r4, #0x18] - cmp r0, #0x3c - bne _0807FEB6 - adds r0, r4, #0 - bl sub_0807FEC8 -_0807FEB6: - movs r0, #0 - strh r0, [r4, #0x16] - bl sub_08080BC4 - pop {r4, pc} - .align 2, 0 -_0807FEC0: .4byte gPlayerEntity -_0807FEC4: .4byte 0xFFFFC000 - .syntax divided diff --git a/asm/non_matching/scroll/sub_0807FF6C.inc b/asm/non_matching/scroll/sub_0807FF6C.inc deleted file mode 100644 index 665d72e0..00000000 --- a/asm/non_matching/scroll/sub_0807FF6C.inc +++ /dev/null @@ -1,57 +0,0 @@ - .syntax unified - push {r4, lr} - movs r1, #1 - strb r1, [r0, #3] - ldr r3, _0807FFC8 @ =gScreen - ldrh r1, [r3] - movs r2, #0x80 - lsls r2, r2, #7 - adds r0, r2, #0 - orrs r0, r1 - strh r0, [r3] - adds r2, r3, #0 - adds r2, #0x60 - ldrb r0, [r2] - movs r4, #0xb8 - lsls r4, r4, #5 - adds r1, r4, #0 - orrs r0, r1 - strh r0, [r2] - adds r2, #2 - ldrh r1, [r2] - movs r0, #0xff - lsls r0, r0, #8 - ands r0, r1 - movs r1, #7 - movs r4, #0 - orrs r0, r1 - strh r0, [r2] - adds r0, r3, #0 - adds r0, #0x5a - movs r1, #0xf0 - strh r1, [r0] - adds r0, #4 - strh r1, [r0] - bl ResetPlayer - bl ResetPlayerAnimationAndAction - ldr r0, _0807FFCC @ =gUnk_03004030 - ldrb r0, [r0, #8] - cmp r0, #0 - beq _0807FFD4 - ldr r1, _0807FFD0 @ =gPlayerEntity - movs r0, #4 - strb r0, [r1, #0x14] - b _0807FFD8 - .align 2, 0 -_0807FFC8: .4byte gScreen -_0807FFCC: .4byte gUnk_03004030 -_0807FFD0: .4byte gPlayerEntity -_0807FFD4: - ldr r0, _0807FFE0 @ =gPlayerEntity - strb r4, [r0, #0x14] -_0807FFD8: - bl sub_080809D4 - pop {r4, pc} - .align 2, 0 -_0807FFE0: .4byte gPlayerEntity - .syntax divided diff --git a/asm/non_matching/scroll/sub_0807FFE4.inc b/asm/non_matching/scroll/sub_0807FFE4.inc deleted file mode 100644 index b7bf033b..00000000 --- a/asm/non_matching/scroll/sub_0807FFE4.inc +++ /dev/null @@ -1,39 +0,0 @@ - .syntax unified - push {r4, r5, lr} - adds r5, r0, #0 - movs r0, #2 - strb r0, [r5, #3] - bl sub_080803D0 - adds r0, #6 - strh r0, [r5, #0x18] - ldr r4, _0808002C @ =gUnk_0200B640 - bl sub_08080278 - strh r0, [r4] - ldr r1, _08080030 @ =gUnk_08109194 - ldr r0, _08080034 @ =gUnk_03004030 - ldr r0, [r0] - ldrb r0, [r0, #3] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - ldr r0, [r0] - bl sub_080197D4 - ldr r4, _08080038 @ =gMapDataTop - ldrh r1, [r5, #0x1e] - lsrs r1, r1, #4 - ldrh r2, [r5, #0x20] - lsrs r2, r2, #4 - adds r0, r4, #0 - bl sub_0807C8B0 - ldr r0, _0808003C @ =gMapDataTopSpecial - subs r4, #4 - adds r1, r4, #0 - bl sub_0801AB08 - pop {r4, r5, pc} - .align 2, 0 -_0808002C: .4byte gUnk_0200B640 -_08080030: .4byte gUnk_08109194 -_08080034: .4byte gUnk_03004030 -_08080038: .4byte gMapDataTop -_0808003C: .4byte gMapDataTopSpecial - .syntax divided diff --git a/asm/non_matching/scroll/sub_08080040.inc b/asm/non_matching/scroll/sub_08080040.inc deleted file mode 100644 index 36ecbde3..00000000 --- a/asm/non_matching/scroll/sub_08080040.inc +++ /dev/null @@ -1,102 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldrh r4, [r5, #0x18] - subs r4, #6 - strh r4, [r5, #0x18] - ldrh r0, [r5, #0x18] - lsls r0, r0, #1 - movs r1, #3 - bl __divsi3 - strh r0, [r5, #0x1a] - lsls r4, r4, #0x10 - lsrs r4, r4, #0x10 - cmp r4, #0x2a - bls _080800C6 - ldr r3, [r5, #0x30] - movs r1, #0x2e - ldrsh r0, [r3, r1] - movs r2, #0xa - ldrsh r1, [r5, r2] - subs r2, r0, r1 - ldrh r1, [r5, #0x18] - subs r0, r2, r1 - adds r7, r0, #0 - adds r7, #8 - cmp r7, #0 - bge _08080078 - movs r7, #0 -_08080078: - adds r0, r2, r1 - adds r6, r0, #0 - subs r6, #8 - cmp r6, #0xf0 - ble _08080084 - movs r6, #0xf0 -_08080084: - movs r1, #0x32 - ldrsh r0, [r3, r1] - movs r2, #0xc - ldrsh r1, [r5, r2] - subs r2, r0, r1 - ldrh r1, [r5, #0x1a] - subs r0, r2, r1 - adds r4, r0, #0 - adds r4, #8 - cmp r4, #0 - bge _0808009C - movs r4, #0 -_0808009C: - adds r0, r2, r1 - adds r3, r0, #0 - subs r3, #8 - cmp r3, #0xa0 - ble _080800A8 - movs r3, #0xa0 -_080800A8: - ldr r2, _080800F0 @ =gScreen - movs r1, #0xff - ands r7, r1 - lsls r0, r7, #8 - ands r6, r1 - orrs r0, r6 - adds r6, r2, #0 - adds r6, #0x5a - strh r0, [r6] - ands r4, r1 - lsls r0, r4, #8 - ands r3, r1 - orrs r0, r3 - adds r2, #0x5e - strh r0, [r2] -_080800C6: - ldrh r0, [r5, #0x18] - cmp r0, #0 - bne _080800FC - movs r0, #3 - strb r0, [r5, #3] - bl DeleteSleepingEntities - bl sub_0807C810 - ldr r1, _080800F4 @ =gUnk_08109194 - ldr r0, _080800F8 @ =gUnk_03004030 - ldr r0, [r0] - ldrb r0, [r0, #3] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - ldr r0, [r0, #4] - bl sub_08080C80 - b _08080102 - .align 2, 0 -_080800F0: .4byte gScreen -_080800F4: .4byte gUnk_08109194 -_080800F8: .4byte gUnk_03004030 -_080800FC: - ldr r1, _08080104 @ =gUpdateVisibleTiles - movs r0, #4 - strb r0, [r1] -_08080102: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08080104: .4byte gUpdateVisibleTiles - .syntax divided diff --git a/asm/non_matching/scroll/sub_08080108.inc b/asm/non_matching/scroll/sub_08080108.inc deleted file mode 100644 index 195a563e..00000000 --- a/asm/non_matching/scroll/sub_08080108.inc +++ /dev/null @@ -1,56 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - movs r1, #4 - strb r1, [r0, #3] - ldr r5, _08080178 @ =gMapDataBottom - movs r0, #0xc0 - lsls r0, r0, #6 - adds r1, r5, r0 - movs r6, #0x80 - lsls r6, r6, #6 - adds r0, r5, #0 - adds r2, r6, #0 - bl MemCopy - ldr r4, _0808017C @ =gMapDataTop - movs r0, #0xc0 - lsls r0, r0, #6 - adds r1, r4, r0 - adds r0, r4, #0 - adds r2, r6, #0 - bl MemCopy - bl sub_08080368 - ldr r1, _08080180 @ =gUnk_02034480 - ldr r0, _08080184 @ =gUnk_0200B640 - ldrh r0, [r0] - strh r0, [r1] - ldr r0, _08080188 @ =gUnk_02022830 - ldr r1, _0808018C @ =gUnk_020246B0 - movs r2, #0xc0 - lsls r2, r2, #5 - bl MemCopy - subs r5, #4 - adds r0, r5, #0 - bl sub_08080B60 - subs r4, #4 - adds r0, r4, #0 - bl sub_08080B60 - bl sub_0807BBE4 - bl sub_0807BC84 - bl sub_0805E248 - ldr r0, _08080190 @ =gMapDataBottomSpecial - adds r1, r5, #0 - bl sub_0801AB08 - ldr r0, _08080194 @ =gMapDataTopSpecial - adds r1, r4, #0 - bl sub_0801AB08 - pop {r4, r5, r6, pc} - .align 2, 0 -_08080178: .4byte gMapDataBottom -_0808017C: .4byte gMapDataTop -_08080180: .4byte gUnk_02034480 -_08080184: .4byte gUnk_0200B640 -_08080188: .4byte gUnk_02022830 -_0808018C: .4byte gUnk_020246B0 -_08080190: .4byte gMapDataBottomSpecial -_08080194: .4byte gMapDataTopSpecial - .syntax divided diff --git a/asm/non_matching/scroll/sub_080801BC.inc b/asm/non_matching/scroll/sub_080801BC.inc deleted file mode 100644 index efa96fb5..00000000 --- a/asm/non_matching/scroll/sub_080801BC.inc +++ /dev/null @@ -1,100 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - ldrh r4, [r5, #0x18] - adds r4, #6 - strh r4, [r5, #0x18] - ldrh r0, [r5, #0x18] - lsls r0, r0, #1 - movs r1, #3 - bl __divsi3 - strh r0, [r5, #0x1a] - lsls r4, r4, #0x10 - lsrs r4, r4, #0x10 - cmp r4, #0x1e - bls _08080232 - ldr r2, [r5, #0x30] - movs r0, #0x2e - ldrsh r1, [r2, r0] - movs r3, #0xa - ldrsh r0, [r5, r3] - subs r0, r1, r0 - ldrh r1, [r5, #0x18] - subs r7, r0, r1 - cmp r7, #0 - bge _080801F0 - movs r7, #0 -_080801F0: - adds r6, r0, r1 - cmp r6, #0xf0 - ble _080801F8 - movs r6, #0xf0 -_080801F8: - movs r0, #0x32 - ldrsh r1, [r2, r0] - movs r2, #0xc - ldrsh r0, [r5, r2] - subs r0, r1, r0 - ldrh r1, [r5, #0x1a] - subs r4, r0, r1 - cmp r4, #0 - bge _0808020C - movs r4, #0 -_0808020C: - adds r3, r0, r1 - cmp r3, #0xa0 - ble _08080214 - movs r3, #0xa0 -_08080214: - ldr r2, _08080260 @ =gScreen - movs r1, #0xff - ands r7, r1 - lsls r0, r7, #8 - ands r6, r1 - orrs r0, r6 - adds r6, r2, #0 - adds r6, #0x5a - strh r0, [r6] - ands r4, r1 - lsls r0, r4, #8 - ands r3, r1 - orrs r0, r3 - adds r2, #0x5e - strh r0, [r2] -_08080232: - ldrh r0, [r5, #0x1c] - cmp r0, #0 - bne _08080268 - strb r0, [r5, #2] - strh r0, [r5] - bl ResetSystemPriority - ldr r1, _08080260 @ =gScreen - ldrh r2, [r1] - ldr r0, _08080264 @ =0x0000BFFF - ands r0, r2 - strh r0, [r1] - adds r2, r1, #0 - adds r2, #0x60 - ldrb r0, [r2] - strh r0, [r2] - adds r1, #0x62 - ldrh r2, [r1] - movs r0, #0xff - lsls r0, r0, #8 - ands r0, r2 - strh r0, [r1] - b _08080272 - .align 2, 0 -_08080260: .4byte gScreen -_08080264: .4byte 0x0000BFFF -_08080268: - ldr r0, _08080274 @ =gUpdateVisibleTiles - movs r1, #4 - strb r1, [r0] - movs r0, #0 - strh r0, [r5, #0x1c] -_08080272: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08080274: .4byte gUpdateVisibleTiles - .syntax divided diff --git a/data/data_0811E750.s b/data/data_0811E750.s index df1745c8..fe86f629 100644 --- a/data/data_0811E750.s +++ b/data/data_0811E750.s @@ -4,30 +4,10 @@ .section .rodata .align 2 -gUnk_0811E768:: @ 0811E768 - .4byte sub_0807FC64 - .4byte sub_0807FC7C - .4byte sub_0807FDB0 - .4byte 00000000 - .4byte sub_0807FEF0 - .4byte sub_0807FF54 -gUnk_0811E780:: @ 0811E780 - .4byte sub_0807FDC8 - .4byte sub_0807FDE4 - .4byte sub_0807FDF8 -gUnk_0811E78C:: @ 0811E78C - .4byte sub_0807FF08 - .4byte sub_0807FF1C -gUnk_0811E794:: @ 0811E794 - .4byte sub_0807FF6C - .4byte sub_0807FFE4 - .4byte sub_08080040 - .4byte sub_08080108 - .4byte sub_08080198 - .4byte sub_080801BC + gUnk_0811E7AC:: @ 0811E7AC .4byte sub_08080794 diff --git a/include/manager.h b/include/manager.h index 4835a712..131e9967 100644 --- a/include/manager.h +++ b/include/manager.h @@ -141,7 +141,7 @@ typedef struct { DiggingCaveEntrance* unk_00; u16 unk_04; u16 unk_06; - u8 unk_08; + u8 isDiggingCave; u8 unk_09; u8 unk_0a; u8 unk_0b; diff --git a/linker.ld b/linker.ld index e1eee1ea..10439cb4 100644 --- a/linker.ld +++ b/linker.ld @@ -1329,6 +1329,7 @@ SECTIONS { src/flags.o(.rodata); src/save.o(.rodata); src/script.o(.rodata); + src/scroll.o(.rodata); data/data_0811E750.o(.rodata); data/const/object/itemOnGround.o(.rodata); src/object/deathFx.o(.rodata); diff --git a/src/manager/manager4.c b/src/manager/manager4.c index 7568960d..7ed53807 100644 --- a/src/manager/manager4.c +++ b/src/manager/manager4.c @@ -12,7 +12,7 @@ void Manager4_Main(Manager* this) { gUnk_08107C70[this->action](this); } -extern void sub_080805F8(void); +extern void UpdateIsDiggingCave(void); extern DiggingCaveEntrance* sub_08057AA8(DiggingCaveEntrance*, int); @@ -21,8 +21,8 @@ void sub_0805786C(Manager* this) { u8 room; u8 area; u16 uVar = 0x81 << 7; - sub_080805F8(); - if (gUnk_03004030.unk_08 != 0) { + UpdateIsDiggingCave(); + if (gUnk_03004030.isDiggingCave != 0) { if (gUnk_03004030.unk_00 == 0) { gUnk_03004030.unk_0a = 0xFF; room = gRoomControls.room; @@ -66,7 +66,7 @@ void sub_08057A18(Manager*, DiggingCaveEntrance*); u32 sub_0805795C(Manager* this, DiggingCaveEntrance* entr) { u16 offsetX, offsetY, offsetX2, offsetY2; u32 tmp, tmp2; - if (gUnk_03004030.unk_08) { + if (gUnk_03004030.isDiggingCave) { offsetX = gPlayerEntity.x.HALF.HI - gRoomControls.origin_x; offsetY = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y; offsetX2 = (entr->unk_00 & 0x3F) * 16 + 8; @@ -105,10 +105,10 @@ void sub_08057A18(Manager* this, DiggingCaveEntrance* entr) { gUnk_03004030.unk_06 = gPlayerEntity.y.HALF.HI - gRoomControls.origin_y - ((entr->unk_00 & 0xFC0) >> 2); #ifndef EU - tmp = gUnk_03004030.unk_08; + tmp = gUnk_03004030.isDiggingCave; if (!tmp) { if ((entr->target_room | 0x80) != gUnk_03004030.unk_0b) { - gUnk_02034480.unk_00 = gUnk_03004030.unk_08; + gUnk_02034480.unk_00 = gUnk_03004030.isDiggingCave; } gUnk_03004030.unk_0b = entr->target_room | 0x80; } diff --git a/src/scroll.c b/src/scroll.c index e751a412..e1f2050e 100644 --- a/src/scroll.c +++ b/src/scroll.c @@ -7,23 +7,58 @@ #include "asm.h" #include "common.h" #include "fileselect.h" +#include "screen.h" extern void sub_08080BC4(void); +extern void sub_080197D4(const void*); +extern void sub_0807C8B0(u8*, u32, u32); +extern void sub_0801AB08(u8*, u8*); +extern void sub_0807C810(); +extern void DeleteSleepingEntities(void); +extern void sub_0807BBE4(); +extern void sub_0807BC84(); +extern void sub_0805E248(); extern u8 gUpdateVisibleTiles; +extern u16 gUnk_0200B640; +extern u32** gUnk_08109194[]; +extern u8 gMapDataTop[]; +extern u8 gMapDataBottom[]; +extern u8 gUnk_02022830[]; +extern u8 gUnk_020246B0[]; -extern void (*const gUnk_0811E768[])(RoomControls*); - +void sub_0807FC64(RoomControls*); void sub_0807FC7C(RoomControls*); -void sub_080805F8(void); +void sub_0807FDB0(RoomControls*); +void sub_0807FEF0(RoomControls*); +void sub_0807FF54(RoomControls*); +void sub_0807FDC8(RoomControls*); +void sub_0807FDE4(RoomControls*); +void sub_0807FDF8(RoomControls*); +void sub_0807FEC8(RoomControls*); +void sub_0807FF08(RoomControls*); +void sub_0807FF1C(RoomControls*); -extern void (*const gUnk_0811E780[])(RoomControls*); - -extern void (*const gUnk_0811E794[])(RoomControls*); +void sub_0807FF6C(RoomControls*); +void sub_0807FFE4(RoomControls*); +void sub_08080040(RoomControls*); +void sub_08080108(RoomControls*); +void sub_08080198(RoomControls*); +void sub_080801BC(RoomControls*); +void UpdateIsDiggingCave(void); +u32 sub_080803D0(); +u32 sub_08080278(); +void sub_08080C80(u32*); +void sub_08080368(); +void sub_08080B60(u8*); extern u8 gMapDataTopSpecial[]; void UpdateScroll(void) { + static void (*const gUnk_0811E768[])(RoomControls*) = { + sub_0807FC64, sub_0807FC7C, sub_0807FDB0, NULL, sub_0807FEF0, sub_0807FF54, + }; + gRoomControls.scroll_flags &= 0xfb; gUnk_0811E768[gRoomControls.unk3](&gRoomControls); } @@ -33,12 +68,17 @@ void sub_0807FC64(RoomControls* controls) { controls->reload_flags = 0; controls->unk5 = 4; sub_0807FC7C(controls); - sub_080805F8(); + UpdateIsDiggingCave(); } ASM_FUNC("asm/non_matching/scroll/sub_0807FC7C.inc", void sub_0807FC7C(RoomControls* controls)) void sub_0807FDB0(RoomControls* controls) { + static void (*const gUnk_0811E780[])(RoomControls*) = { + sub_0807FDC8, + sub_0807FDE4, + sub_0807FDF8, + }; gUnk_0811E780[controls->unk4](controls); } @@ -55,17 +95,70 @@ void sub_0807FDE4(RoomControls* controls) { gUpdateVisibleTiles = 2; } -ASM_FUNC("asm/non_matching/scroll/sub_0807FDF8.inc", void sub_0807FDF8()) +void sub_0807FDF8(RoomControls* controls) { + u32 bVar1; + Entity* pEVar2; + int iVar3; + + gUpdateVisibleTiles = 2; + controls->filler2[0]++; + switch (controls->scroll_direction) { + case 0: + controls->scroll_y -= 4; + pEVar2 = controls->camera_target; + if (pEVar2 == &gPlayerEntity) { + pEVar2->y.WORD = gPlayerEntity.y.WORD - 0x6000; + } + if (controls->filler2[0] == 0x28) { + sub_0807FEC8(controls); + } + break; + case 1: + controls->scroll_x = controls->scroll_x + 4; + if (controls->camera_target == &gPlayerEntity) { + gPlayerEntity.x.WORD += 0x4000; + } + if (controls->filler2[0] == 0x3c) { + sub_0807FEC8(controls); + } + break; + case 2: + controls->scroll_y = controls->scroll_y + 4; + pEVar2 = controls->camera_target; + if (pEVar2 == &gPlayerEntity) { + pEVar2->y.WORD = gPlayerEntity.y.WORD + 0x6000; + } + if (controls->filler2[0] == 0x28) { + sub_0807FEC8(controls); + } + break; + case 3: + controls->scroll_x -= 4; + if (controls->camera_target == &gPlayerEntity) { + gPlayerEntity.x.WORD -= 0x4000; + } + if (controls->filler2[0] == 0x3c) { + sub_0807FEC8(controls); + } + break; + } + + controls->shake_duration = 0; + sub_08080BC4(); +} void sub_0807FEC8(RoomControls* this) { this->unk3 = 0; - MemFill32(0xffffffff, gPlayerState.path_memory, 0x40); + MemFill32(0xffffffff, gPlayerState.path_memory, sizeof(gPlayerState.path_memory)); gPlayerState.startPosX = this->camera_target->x.HALF.HI; gPlayerState.startPosY = this->camera_target->y.HALF.HI; } void sub_0807FEF0(RoomControls* controls) { - extern void (*const gUnk_0811E78C[])(RoomControls*); + static void (*const gUnk_0811E78C[])(RoomControls*) = { + sub_0807FF08, + sub_0807FF1C, + }; gUnk_0811E78C[controls->unk4](controls); } @@ -86,16 +179,95 @@ void sub_0807FF1C(RoomControls* controls) { } void sub_0807FF54(RoomControls* controls) { + static void (*const gUnk_0811E794[])(RoomControls*) = { + sub_0807FF6C, sub_0807FFE4, sub_08080040, sub_08080108, sub_08080198, sub_080801BC, + }; gUnk_0811E794[controls->unk4](controls); } -ASM_FUNC("asm/non_matching/scroll/sub_0807FF6C.inc", void sub_0807FF6C()) +void sub_0807FF6C(RoomControls* controls) { + controls->unk4 = 1; + gScreen.lcd.displayControl |= DISPCNT_WIN1_ON; + gScreen.controls.windowInsideControl = (u8)gScreen.controls.windowInsideControl | 0x1700; + gScreen.controls.windowOutsideControl = (gScreen.controls.windowOutsideControl & 0xff00) | 7; + gScreen.controls.window1HorizontalDimensions = 0xf0; + gScreen.controls.window1VerticalDimensions = 0xf0; + ResetPlayer(); + ResetPlayerAnimationAndAction(); + if (gUnk_03004030.isDiggingCave) { + gPlayerEntity.animationState = 4; + } else { + gPlayerEntity.animationState = 0; + } + sub_080809D4(); +} -ASM_FUNC("asm/non_matching/scroll/sub_0807FFE4.inc", void sub_0807FFE4()) +void sub_0807FFE4(RoomControls* controls) { + controls->unk4 = 2; + controls->filler2[0] = sub_080803D0() + 6; + gUnk_0200B640 = sub_08080278(); + sub_080197D4(*gUnk_08109194[gUnk_03004030.unk_00->unk_03]); + sub_0807C8B0(gMapDataTop, controls->width >> 4, controls->height >> 4); + sub_0801AB08(gMapDataTopSpecial, gMapDataTop - 4); +} -ASM_FUNC("asm/non_matching/scroll/sub_08080040.inc", void sub_08080040()) +void sub_08080040(RoomControls* controls) { + int iVar2; + int iVar3; + int uVar5; + int uVar6; + int iVar7; + int temp; -ASM_FUNC("asm/non_matching/scroll/sub_08080108.inc", void sub_08080108()) + controls->filler2[0] -= 6; + controls->filler2[1] = (controls->filler2[0] << 1) / 3; + if (0x2a < controls->filler2[0]) { + iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; + uVar6 = (iVar2 - controls->filler2[0]) + 8; + if (uVar6 < 0) { + uVar6 = 0; + } + iVar7 = iVar2 + controls->filler2[0] - 8; + if (0xf0 < iVar7) { + iVar7 = 0xf0; + } + temp = controls->camera_target->y.HALF.HI - controls->scroll_y; + uVar5 = (temp - controls->filler2[1]) + 8; + if (uVar5 < 0) { + uVar5 = 0; + } + iVar3 = temp + controls->filler2[1] - 8; + if (0xa0 < iVar3) { + iVar3 = 0xa0; + } + gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); + gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); + } + if (controls->filler2[0] == 0) { + controls->unk4 = 3; + DeleteSleepingEntities(); + sub_0807C810(); + sub_08080C80(*(gUnk_08109194[gUnk_03004030.unk_00->unk_03] + 1)); + } else { + gUpdateVisibleTiles = 4; + } +} + +void sub_08080108(RoomControls* controls) { + controls->unk4 = 4; + MemCopy(gMapDataBottom, gMapDataBottom + 0x3000, 0x2000); + MemCopy(gMapDataTop, gMapDataTop + 0x3000, 0x2000); + sub_08080368(); + gUnk_02034480.unk_00 = gUnk_0200B640; + MemCopy(gUnk_02022830, gUnk_020246B0, 0x1800); + sub_08080B60(gMapDataBottom - 4); + sub_08080B60(gMapDataTop - 4); + sub_0807BBE4(); + sub_0807BC84(); + sub_0805E248(); + sub_0801AB08((u8*)&gMapDataBottomSpecial, gMapDataBottom - 4); + sub_0801AB08(gMapDataTopSpecial, gMapDataTop - 4); +} void sub_08080198(RoomControls* controls) { controls->unk4 = 5; @@ -103,35 +275,79 @@ void sub_08080198(RoomControls* controls) { LoadRoom(); CallRoomProp5And7(); gUpdateVisibleTiles = 0; - sub_080805F8(); + UpdateIsDiggingCave(); } -ASM_FUNC("asm/non_matching/scroll/sub_080801BC.inc", void sub_080801BC()) +void sub_080801BC(RoomControls* controls) { + int iVar2; + int iVar3; + int uVar5; + int uVar6; + int iVar7; + int temp; -ASM_FUNC("asm/non_matching/scroll/sub_08080278.inc", void sub_08080278()) + controls->filler2[0] += 6; + controls->filler2[1] = (controls->filler2[0] << 1) / 3; + if (0x1e < controls->filler2[0]) { + iVar2 = controls->camera_target->x.HALF.HI - controls->scroll_x; + uVar6 = (iVar2 - controls->filler2[0]); + if (uVar6 < 0) { + uVar6 = 0; + } + iVar7 = iVar2 + controls->filler2[0]; + if (0xf0 < iVar7) { + iVar7 = 0xf0; + } + temp = controls->camera_target->y.HALF.HI - controls->scroll_y; + uVar5 = (temp - controls->filler2[1]); + if (uVar5 < 0) { + uVar5 = 0; + } + iVar3 = temp + controls->filler2[1]; + if (0xa0 < iVar3) { + iVar3 = 0xa0; + } + gScreen.controls.window1HorizontalDimensions = ((uVar6 & 0xff) << 8) | (iVar7 & 0xff); + gScreen.controls.window1VerticalDimensions = ((uVar5 & 0xff) << 8) | (iVar3 & 0xff); + } + if (controls->filler2[2] == 0) { + controls->unk3 = 0; + controls->reload_flags = 0; + ResetSystemPriority(); + gScreen.lcd.displayControl &= ~DISPCNT_WIN1_ON; + gScreen.controls.windowInsideControl &= 0xff; + gScreen.controls.windowOutsideControl &= 0xff00; + } else { + gUpdateVisibleTiles = 4; + controls->filler2[2] = 0; + } +} + +ASM_FUNC("asm/non_matching/scroll/sub_08080278.inc", u32 sub_08080278()) ASM_FUNC("asm/non_matching/scroll/sub_08080368.inc", void sub_08080368()) -ASM_FUNC("asm/non_matching/scroll/sub_080803D0.inc", void sub_080803D0()) +ASM_FUNC("asm/non_matching/scroll/sub_080803D0.inc", u32 sub_080803D0()) -void sub_080805F8(void) { +void UpdateIsDiggingCave(void) { switch (gRoomControls.area) { - case 0xc: - case 0x0f: - case 0x13: - case 0x14: - case 0x16: - case 0x17: - case 0x19: - gUnk_03004030.unk_08 = 1; + case AREA_LAKE_WOODS_CAVE: + case AREA_HYRULE_DIG_CAVES: + case AREA_DIG_CAVES_1: + case AREA_CRENEL_DIG_CAVE: + case AREA_VEIL_FALLS_DIG_CAVE: + case AREA_CASTOR_WILDS_DIG_CAVE: + case AREA_HYLIA_DIG_CAVES: + gUnk_03004030.isDiggingCave = 1; return; } - gUnk_03004030.unk_08 = 0; + gUnk_03004030.isDiggingCave = 0; } void ClearTilemaps(void) { + // Is gRoomControls 4 bytes bigger? MemClear(&gRoomControls, 0x38); - MemClear(&gUnk_03004030, 0xc); + MemClear(&gUnk_03004030, sizeof(gUnk_03004030)); gRoomControls.filler3 = 0xffff; gUnk_03004030.unk_0a = 0xff; gUnk_02034480.unk_00 = 0; @@ -265,10 +481,10 @@ void sub_080809D4(void) { ASM_FUNC("asm/non_matching/scroll/UpdateDoorTransition.inc", void UpdateDoorTransition()) -ASM_FUNC("asm/non_matching/scroll/sub_08080B60.inc", void sub_08080B60()) +ASM_FUNC("asm/non_matching/scroll/sub_08080B60.inc", void sub_08080B60(u8* param_1)) ASM_FUNC("asm/non_matching/scroll/sub_08080BC4.inc", void sub_08080BC4()) -ASM_FUNC("asm/non_matching/scroll/sub_08080C80.inc", void sub_08080C80()) +ASM_FUNC("asm/non_matching/scroll/sub_08080C80.inc", void sub_08080C80(u32* param_1)) ASM_FUNC("asm/non_matching/scroll/sub_08080CB4.inc", void sub_08080CB4(Entity* a))