From 53dd89e3b60af04f4b9fbcdfc6111ec05ed10431 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sat, 2 Apr 2022 20:42:30 +0300 Subject: [PATCH] Decompile some subtask2 functions --- .../subtask2/Subtask_LocalMapHint.inc | 33 -- asm/non_matching/subtask2/Subtask_MapHint.inc | 25 -- asm/non_matching/subtask2/sub_080A5A90.inc | 40 -- asm/non_matching/subtask2/sub_080A5AD8.inc | 14 - asm/non_matching/subtask2/sub_080A5AF4.inc | 48 --- asm/non_matching/subtask2/sub_080A5BB8.inc | 26 -- asm/non_matching/subtask2/sub_080A5BF0.inc | 38 -- asm/non_matching/subtask2/sub_080A5C9C.inc | 47 --- asm/non_matching/subtask2/sub_080A612C.inc | 42 --- asm/non_matching/subtask2/sub_080A6290.inc | 32 -- asm/non_matching/subtask2/sub_080A6438.inc | 97 ----- asm/non_matching/subtask2/sub_080A6608.inc | 32 -- asm/non_matching/subtask2/sub_080A667C.inc | 44 --- asm/non_matching/subtask2/sub_080A698C.inc | 42 --- asm/non_matching/subtask2/sub_080A6A80.inc | 34 -- asm/non_matching/subtask2/sub_080A6F40.inc | 24 -- asm/non_matching/subtask2/sub_080A6F6C.inc | 34 -- include/game.h | 10 + include/save.h | 4 +- src/game.c | 10 - src/menu/pause_menu.c | 20 +- src/subtask2.c | 342 ++++++++++++++++-- src/title.c | 2 +- 23 files changed, 338 insertions(+), 702 deletions(-) delete mode 100644 asm/non_matching/subtask2/Subtask_LocalMapHint.inc delete mode 100644 asm/non_matching/subtask2/Subtask_MapHint.inc delete mode 100644 asm/non_matching/subtask2/sub_080A5A90.inc delete mode 100644 asm/non_matching/subtask2/sub_080A5AD8.inc delete mode 100644 asm/non_matching/subtask2/sub_080A5AF4.inc delete mode 100644 asm/non_matching/subtask2/sub_080A5BB8.inc delete mode 100644 asm/non_matching/subtask2/sub_080A5BF0.inc delete mode 100644 asm/non_matching/subtask2/sub_080A5C9C.inc delete mode 100644 asm/non_matching/subtask2/sub_080A612C.inc delete mode 100644 asm/non_matching/subtask2/sub_080A6290.inc delete mode 100644 asm/non_matching/subtask2/sub_080A6438.inc delete mode 100644 asm/non_matching/subtask2/sub_080A6608.inc delete mode 100644 asm/non_matching/subtask2/sub_080A667C.inc delete mode 100644 asm/non_matching/subtask2/sub_080A698C.inc delete mode 100644 asm/non_matching/subtask2/sub_080A6A80.inc delete mode 100644 asm/non_matching/subtask2/sub_080A6F40.inc delete mode 100644 asm/non_matching/subtask2/sub_080A6F6C.inc diff --git a/asm/non_matching/subtask2/Subtask_LocalMapHint.inc b/asm/non_matching/subtask2/Subtask_LocalMapHint.inc deleted file mode 100644 index a0840e43..00000000 --- a/asm/non_matching/subtask2/Subtask_LocalMapHint.inc +++ /dev/null @@ -1,33 +0,0 @@ - .syntax unified - push {r4, lr} - bl FlushSprites - ldr r1, _080A6AF4 @ =gUnk_08128F1C - ldr r4, _080A6AF8 @ =gMenu - ldrb r0, [r4, #5] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - ldrb r1, [r4, #3] - lsls r1, r1, #3 - ldr r0, _080A6AFC @ =gUnk_08128E94 - adds r1, r1, r0 - ldr r2, _080A6B00 @ =gScreen - movs r0, #5 - ldrsb r0, [r1, r0] - rsbs r0, r0, #0 - strh r0, [r2, #0x18] - ldrb r1, [r1, #6] - lsls r1, r1, #0x18 - asrs r1, r1, #0x18 - ldrh r0, [r4, #0xa] - subs r0, r0, r1 - strh r0, [r2, #0x24] - bl CopyOAM - pop {r4, pc} - .align 2, 0 -_080A6AF4: .4byte gUnk_08128F1C -_080A6AF8: .4byte gMenu -_080A6AFC: .4byte gUnk_08128E94 -_080A6B00: .4byte gScreen - .syntax divided diff --git a/asm/non_matching/subtask2/Subtask_MapHint.inc b/asm/non_matching/subtask2/Subtask_MapHint.inc deleted file mode 100644 index 9b2b6641..00000000 --- a/asm/non_matching/subtask2/Subtask_MapHint.inc +++ /dev/null @@ -1,25 +0,0 @@ - .syntax unified - push {r4, lr} - bl FlushSprites - ldr r1, _080A652C @ =gUnk_08128E70 - ldr r4, _080A6530 @ =gMenu - ldrb r0, [r4, #5] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - adds r4, #0x2c - ldrb r1, [r4] - movs r0, #0x20 - ands r0, r1 - cmp r0, #0 - beq _080A6522 - bl sub_080A6438 -_080A6522: - bl sub_080A6498 - bl CopyOAM - pop {r4, pc} - .align 2, 0 -_080A652C: .4byte gUnk_08128E70 -_080A6530: .4byte gMenu - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A5A90.inc b/asm/non_matching/subtask2/sub_080A5A90.inc deleted file mode 100644 index 9600a2a3..00000000 --- a/asm/non_matching/subtask2/sub_080A5A90.inc +++ /dev/null @@ -1,40 +0,0 @@ - .syntax unified - push {lr} - ldr r2, _080A5AA4 @ =gMenu - ldrh r0, [r2, #8] - cmp r0, #0 - beq _080A5AA8 - cmp r0, #0xff - beq _080A5AC0 - subs r0, #1 - strh r0, [r2, #8] - b _080A5AD2 - .align 2, 0 -_080A5AA4: .4byte gMenu -_080A5AA8: - ldr r0, _080A5ABC @ =gInput - ldrh r1, [r0, #2] - movs r0, #0xb - ands r0, r1 - cmp r0, #0 - beq _080A5AD2 - movs r0, #0xff - strh r0, [r2, #8] - b _080A5AD2 - .align 2, 0 -_080A5ABC: .4byte gInput -_080A5AC0: - ldr r0, _080A5AD4 @ =gPauseMenuOptions - ldrb r0, [r0, #1] - movs r1, #1 - cmp r0, #0xa - bne _080A5ACC - movs r1, #2 -_080A5ACC: - adds r0, r1, #0 - bl sub_080A4E84 -_080A5AD2: - pop {pc} - .align 2, 0 -_080A5AD4: .4byte gPauseMenuOptions - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A5AD8.inc b/asm/non_matching/subtask2/sub_080A5AD8.inc deleted file mode 100644 index d5cbe09d..00000000 --- a/asm/non_matching/subtask2/sub_080A5AD8.inc +++ /dev/null @@ -1,14 +0,0 @@ - .syntax unified - push {lr} - ldr r1, _080A5AEC @ =gUnk_08128D24 - ldr r0, _080A5AF0 @ =gMenu - ldrb r0, [r0, #5] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - pop {pc} - .align 2, 0 -_080A5AEC: .4byte gUnk_08128D24 -_080A5AF0: .4byte gMenu - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A5AF4.inc b/asm/non_matching/subtask2/sub_080A5AF4.inc deleted file mode 100644 index 5d3d6723..00000000 --- a/asm/non_matching/subtask2/sub_080A5AF4.inc +++ /dev/null @@ -1,48 +0,0 @@ - .syntax unified -.ifdef EU - push {lr} - ldr r1, _080A5B18 @ =gMenu - movs r0, #0 - strb r0, [r1, #3] -.else - push {r4, lr} - ldr r0, _080A5B18 @ =gMenu - movs r4, #0 - strb r4, [r0, #3] -.endif - movs r0, #2 - movs r1, #0 - bl SetPopupState -.ifndef EU - movs r0, #0x80 - lsls r0, r0, #0x12 - ldrb r0, [r0, #7] - cmp r0, #0 - bne _080A5B24 - ldr r1, _080A5B1C @ =gScreen - ldr r0, _080A5B20 @ =0x0000FFFC - strh r0, [r1, #0x18] - b _080A5B28 - .align 2, 0 -_080A5B18: .4byte gMenu -_080A5B1C: .4byte gScreen -_080A5B20: .4byte 0x0000FFFC -_080A5B24: - ldr r0, _080A5B30 @ =gScreen - strh r4, [r0, #0x18] -.endif -_080A5B28: - movs r0, #1 - bl SetMenuType -.ifdef EU - pop {pc} -.else - pop {r4, pc} -.endif - .align 2, 0 -.ifdef EU -_080A5B18: .4byte gMenu -.else -_080A5B30: .4byte gScreen -.endif - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A5BB8.inc b/asm/non_matching/subtask2/sub_080A5BB8.inc deleted file mode 100644 index da36b8c5..00000000 --- a/asm/non_matching/subtask2/sub_080A5BB8.inc +++ /dev/null @@ -1,26 +0,0 @@ - .syntax unified - push {lr} - ldr r0, _080A5BE4 @ =gFadeControl - ldrb r0, [r0] - cmp r0, #0 - bne _080A5BE2 - bl sub_08050384 - ldr r1, _080A5BE8 @ =gMain - ldrb r0, [r1, #1] - movs r0, #1 - strb r0, [r1, #1] - movs r0, #6 - movs r1, #8 - bl SetFade - movs r0, #2 - bl sub_080A4E84 - ldr r1, _080A5BEC @ =gPauseMenuOptions - movs r0, #0x10 - strb r0, [r1, #0x16] -_080A5BE2: - pop {pc} - .align 2, 0 -_080A5BE4: .4byte gFadeControl -_080A5BE8: .4byte gMain -_080A5BEC: .4byte gPauseMenuOptions - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A5BF0.inc b/asm/non_matching/subtask2/sub_080A5BF0.inc deleted file mode 100644 index 33bc2c30..00000000 --- a/asm/non_matching/subtask2/sub_080A5BF0.inc +++ /dev/null @@ -1,38 +0,0 @@ - .syntax unified - push {r4, r5, lr} - ldr r1, _080A5C30 @ =gUnk_08128D30 - ldr r0, _080A5C34 @ =gMenu - ldrb r0, [r0, #5] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - bl sub_080A5D1C - ldr r0, _080A5C38 @ =gMain - ldrh r0, [r0, #0xc] - movs r1, #7 - ands r0, r1 - cmp r0, #0 - bne _080A5C2E - ldr r4, _080A5C3C @ =gUnk_02017830 - ldrh r5, [r4] - adds r0, r4, #2 - adds r1, r4, #0 - movs r2, #0xe - bl MemCopy - strh r5, [r4, #0xe] - ldr r2, _080A5C40 @ =gUsedPalettes - ldr r0, [r2] - movs r1, #0x80 - lsls r1, r1, #5 - orrs r0, r1 - str r0, [r2] -_080A5C2E: - pop {r4, r5, pc} - .align 2, 0 -_080A5C30: .4byte gUnk_08128D30 -_080A5C34: .4byte gMenu -_080A5C38: .4byte gMain -_080A5C3C: .4byte gUnk_02017830 -_080A5C40: .4byte gUsedPalettes - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A5C9C.inc b/asm/non_matching/subtask2/sub_080A5C9C.inc deleted file mode 100644 index 85900078..00000000 --- a/asm/non_matching/subtask2/sub_080A5C9C.inc +++ /dev/null @@ -1,47 +0,0 @@ - .syntax unified - push {lr} - bl sub_080A51F4 - cmp r0, #0 - beq _080A5CFA - ldr r0, _080A5CC4 @ =gArea - ldrb r0, [r0, #3] - lsls r0, r0, #2 - ldr r1, _080A5CC8 @ =gUnk_080C9C6C - adds r3, r0, r1 - ldr r1, _080A5CCC @ =gMenu - ldrb r2, [r1, #3] - ldr r0, _080A5CD0 @ =gInput - ldrh r0, [r0, #2] - cmp r0, #0x40 - beq _080A5CD4 - cmp r0, #0x80 - beq _080A5CDC - b _080A5CE6 - .align 2, 0 -_080A5CC4: .4byte gArea -_080A5CC8: .4byte gUnk_080C9C6C -_080A5CCC: .4byte gMenu -_080A5CD0: .4byte gInput -_080A5CD4: - cmp r2, #0 - ble _080A5CE6 - subs r2, #1 - b _080A5CE6 -_080A5CDC: - ldrb r0, [r3] - subs r0, #1 - cmp r0, r2 - ble _080A5CE6 - adds r2, #1 -_080A5CE6: - ldrb r0, [r1, #3] - cmp r0, r2 - beq _080A5CFA - strb r2, [r1, #3] - adds r0, r2, #0 - bl sub_080A5CFC - movs r0, #0x69 - bl SoundReq -_080A5CFA: - pop {pc} - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A612C.inc b/asm/non_matching/subtask2/sub_080A612C.inc deleted file mode 100644 index ae8c6e9f..00000000 --- a/asm/non_matching/subtask2/sub_080A612C.inc +++ /dev/null @@ -1,42 +0,0 @@ - .syntax unified - push {lr} - bl sub_080A51F4 - cmp r0, #0 - beq _080A6178 - ldr r1, _080A614C @ =gMenu - ldrb r2, [r1, #3] - ldr r0, _080A6150 @ =gInput - ldrh r0, [r0, #2] - cmp r0, #0x10 - beq _080A6154 - cmp r0, #0x20 - bne _080A6156 - subs r2, #1 - b _080A6156 - .align 2, 0 -_080A614C: .4byte gMenu -_080A6150: .4byte gInput -_080A6154: - adds r2, #1 -_080A6156: - adds r3, r2, #0 - adds r3, #8 - adds r0, r3, #0 - cmp r3, #0 - bge _080A6164 - adds r0, r2, #0 - adds r0, #0xf -_080A6164: - asrs r2, r0, #3 - lsls r0, r2, #3 - subs r2, r3, r0 - ldrb r0, [r1, #3] - cmp r0, r2 - beq _080A6178 - strb r2, [r1, #3] - movs r0, #0x69 - bl SoundReq -_080A6178: - pop {pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A6290.inc b/asm/non_matching/subtask2/sub_080A6290.inc deleted file mode 100644 index c8e9b217..00000000 --- a/asm/non_matching/subtask2/sub_080A6290.inc +++ /dev/null @@ -1,32 +0,0 @@ - .syntax unified - push {r4, lr} - ldr r0, _080A62C4 @ =gUnk_08128DD8 - bl sub_080A70AC - ldr r4, _080A62C8 @ =gMenu - ldr r0, _080A62CC @ =gUnk_08128DD4 - str r0, [r4, #0xc] - movs r0, #0x81 - bl LoadGfxGroup - ldr r1, _080A62D0 @ =gScreen - ldr r0, _080A62D4 @ =0x0000FFFC - strh r0, [r1, #0x18] - strh r0, [r1, #0x24] - ldr r2, _080A62D8 @ =gSave - ldr r0, [r2, #0x40] - ldr r1, _080A62DC @ =0x00010780 - orrs r0, r1 - str r0, [r2, #0x40] - bl sub_080A6F40 - strh r0, [r4, #0x10] - movs r0, #1 - strb r0, [r4, #5] - pop {r4, pc} - .align 2, 0 -_080A62C4: .4byte gUnk_08128DD8 -_080A62C8: .4byte gMenu -_080A62CC: .4byte gUnk_08128DD4 -_080A62D0: .4byte gScreen -_080A62D4: .4byte 0x0000FFFC -_080A62D8: .4byte gSave -_080A62DC: .4byte 0x00010780 - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A6438.inc b/asm/non_matching/subtask2/sub_080A6438.inc deleted file mode 100644 index 7ace4eb4..00000000 --- a/asm/non_matching/subtask2/sub_080A6438.inc +++ /dev/null @@ -1,97 +0,0 @@ - .syntax unified -.ifdef EU - push {r4, r5, r6, r7, lr} - ldr r2, _080A5C7C @ =gOamCmd - movs r1, #0 - movs r0, #0x80 - lsls r0, r0, #3 - strh r0, [r2, #4] - strh r1, [r2, #6] - strh r1, [r2, #8] - ldr r0, _080A5C80 @ =gSave - ldr r1, _080A5C84 @ =gMenu - ldrh r0, [r0, #0x20] - ldrh r5, [r1, #0x10] - ands r5, r0 - ldr r4, _080A5C88EU @ =gUnk_08128F58 - movs r6, #0 - ldrb r0, [r4] - cmp r0, #0 - beq _080A5C78 - adds r7, r2, #0 -_080A5C52: - movs r0, #1 - lsls r0, r6 - ands r0, r5 - cmp r0, #0 - beq _080A5C6E - ldrb r0, [r4, #1] - strh r0, [r7] - ldrb r0, [r4, #2] - strh r0, [r7, #2] - ldrb r1, [r4] - movs r0, #0xfd - lsls r0, r0, #1 - bl DrawDirect -_080A5C6E: - adds r6, #1 - adds r4, #8 - ldrb r0, [r4] - cmp r0, #0 - bne _080A5C52 -_080A5C78: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080A5C7C: .4byte gOamCmd -_080A5C80: .4byte gSave -_080A5C84: .4byte gMenu -_080A5C88EU: .4byte gUnk_08128F58 -.else - push {r4, r5, r6, r7, lr} - ldr r2, _080A6484 @ =gOamCmd - movs r1, #0 - movs r0, #0x80 - lsls r0, r0, #3 - strh r0, [r2, #4] - strh r1, [r2, #6] - strh r1, [r2, #8] - ldr r0, _080A6488 @ =gSave - ldr r1, _080A648C @ =gMenu - ldrh r0, [r0, #0x20] - ldrh r5, [r1, #0x10] - ands r5, r0 - ldr r4, _080A6490 @ =gUnk_08128F58 - movs r6, #0 - ldrb r0, [r4] - cmp r0, #0 - beq _080A6482 - adds r7, r2, #0 -_080A645E: - movs r0, #1 - lsls r0, r6 - ands r0, r5 - cmp r0, #0 - beq _080A6478 - ldrb r0, [r4, #1] - strh r0, [r7] - ldrb r0, [r4, #2] - strh r0, [r7, #2] - ldrb r1, [r4] - ldr r0, _080A6494 @ =0x000001FB - bl DrawDirect -_080A6478: - adds r6, #1 - adds r4, #8 - ldrb r0, [r4] - cmp r0, #0 - bne _080A645E -_080A6482: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080A6484: .4byte gOamCmd -_080A6488: .4byte gSave -_080A648C: .4byte gMenu -_080A6490: .4byte gUnk_08128F58 -_080A6494: .4byte 0x000001FB -.endif - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A6608.inc b/asm/non_matching/subtask2/sub_080A6608.inc deleted file mode 100644 index 49ba94c3..00000000 --- a/asm/non_matching/subtask2/sub_080A6608.inc +++ /dev/null @@ -1,32 +0,0 @@ - .syntax unified - push {r4, lr} - ldr r1, _080A6640 @ =gUnk_08128E78 - ldr r4, _080A6644 @ =gMenu - ldrb r0, [r4, #5] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - ldrb r1, [r4, #3] - lsls r1, r1, #3 - ldr r0, _080A6648 @ =gUnk_08128E94 - adds r1, r1, r0 - ldr r2, _080A664C @ =gScreen - movs r0, #5 - ldrsb r0, [r1, r0] - rsbs r0, r0, #0 - strh r0, [r2, #0x18] - ldrb r1, [r1, #6] - lsls r1, r1, #0x18 - asrs r1, r1, #0x18 - ldrh r0, [r4, #0xa] - subs r0, r0, r1 - strh r0, [r2, #0x24] - bl sub_080A66D0 - pop {r4, pc} - .align 2, 0 -_080A6640: .4byte gUnk_08128E78 -_080A6644: .4byte gMenu -_080A6648: .4byte gUnk_08128E94 -_080A664C: .4byte gScreen - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A667C.inc b/asm/non_matching/subtask2/sub_080A667C.inc deleted file mode 100644 index 208923f0..00000000 --- a/asm/non_matching/subtask2/sub_080A667C.inc +++ /dev/null @@ -1,44 +0,0 @@ - .syntax unified - push {lr} - ldr r2, _080A669C @ =gMenu - ldr r0, _080A66A0 @ =gUnk_08128E80 - str r0, [r2, #0xc] - ldrb r0, [r2, #3] - lsls r0, r0, #3 - ldr r1, _080A66A4 @ =gUnk_08128E94 - adds r3, r0, r1 - ldrh r1, [r2, #0xa] - ldr r0, _080A66A8 @ =gInput - ldrh r0, [r0] - cmp r0, #0x40 - beq _080A66AC - cmp r0, #0x80 - beq _080A66B4 - b _080A66C2 - .align 2, 0 -_080A669C: .4byte gMenu -_080A66A0: .4byte gUnk_08128E80 -_080A66A4: .4byte gUnk_08128E94 -_080A66A8: .4byte gInput -_080A66AC: - cmp r1, #0 - beq _080A66C2 - subs r1, #2 - b _080A66C2 -_080A66B4: - ldrb r0, [r3, #2] - cmp r0, r1 - bls _080A66BC - adds r1, #2 -_080A66BC: - cmp r0, r1 - bhs _080A66C2 - adds r1, r0, #0 -_080A66C2: - strh r1, [r2, #0xa] - ldrb r0, [r2, #3] - movs r1, #0 - bl sub_080A6FB4 - pop {pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A698C.inc b/asm/non_matching/subtask2/sub_080A698C.inc deleted file mode 100644 index 6fa80645..00000000 --- a/asm/non_matching/subtask2/sub_080A698C.inc +++ /dev/null @@ -1,42 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r6, r2, #0 - adds r5, r3, #0 - bl sub_080A69E0 - adds r4, r0, #0 - cmp r4, #0 - ble _080A69D4 - ldr r2, _080A69D8 @ =gMenu - adds r2, #0x2d - ldrb r0, [r2] - lsls r0, r0, #3 - ldr r3, _080A69DC @ =gMapDataBottomSpecial - adds r0, r0, r3 - lsrs r1, r5, #8 - strb r1, [r0] - ldrb r0, [r2] - lsls r0, r0, #3 - adds r0, r0, r3 - strb r5, [r0, #1] - ldrb r0, [r2] - lsls r0, r0, #3 - adds r0, r0, r3 - strh r6, [r0, #2] - ldrb r0, [r2] - lsls r0, r0, #3 - adds r0, r0, r3 - strh r4, [r0, #4] - ldrb r0, [r2] - lsls r0, r0, #3 - adds r0, r0, r3 - asrs r1, r4, #0x10 - strh r1, [r0, #6] - ldrb r0, [r2] - adds r0, #1 - strb r0, [r2] -_080A69D4: - pop {r4, r5, r6, pc} - .align 2, 0 -_080A69D8: .4byte gMenu -_080A69DC: .4byte gMapDataBottomSpecial - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A6A80.inc b/asm/non_matching/subtask2/sub_080A6A80.inc deleted file mode 100644 index 6fa64c28..00000000 --- a/asm/non_matching/subtask2/sub_080A6A80.inc +++ /dev/null @@ -1,34 +0,0 @@ - .syntax unified - push {lr} - adds r3, r0, #0 - lsrs r3, r3, #4 - lsrs r1, r1, #4 - ldr r2, _080A6A8C @ =gUnk_08127F94 - b _080A6AAE - .align 2, 0 -_080A6A8C: .4byte gUnk_08127F94 -_080A6A90: - ldrb r0, [r2] - cmp r0, r3 - bhi _080A6AAC - ldrb r0, [r2, #2] - cmp r0, r3 - blo _080A6AAC - ldrb r0, [r2, #1] - cmp r0, r1 - bhi _080A6AAC - ldrb r0, [r2, #3] - cmp r0, r1 - blo _080A6AAC - adds r0, r2, #0 - b _080A6AB6 -_080A6AAC: - adds r2, #8 -_080A6AAE: - ldrb r0, [r2] - cmp r0, #0xff - bne _080A6A90 - movs r0, #0 -_080A6AB6: - pop {pc} - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A6F40.inc b/asm/non_matching/subtask2/sub_080A6F40.inc deleted file mode 100644 index 2b85ee7f..00000000 --- a/asm/non_matching/subtask2/sub_080A6F40.inc +++ /dev/null @@ -1,24 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - movs r5, #0 - ldr r4, _080A6F4C @ =gUnk_08128F38 - movs r6, #0 - b _080A6F60 - .align 2, 0 -_080A6F4C: .4byte gUnk_08128F38 -_080A6F50: - ldrb r0, [r4] - ldrb r1, [r4, #1] - bl sub_0807CB24 - lsls r0, r5 - orrs r6, r0 - adds r5, #1 - adds r4, #2 -_080A6F60: - ldrb r0, [r4] - cmp r0, #0 - bne _080A6F50 - mvns r0, r6 - pop {r4, r5, r6, pc} - .align 2, 0 - .syntax divided diff --git a/asm/non_matching/subtask2/sub_080A6F6C.inc b/asm/non_matching/subtask2/sub_080A6F6C.inc deleted file mode 100644 index 0e65b62e..00000000 --- a/asm/non_matching/subtask2/sub_080A6F6C.inc +++ /dev/null @@ -1,34 +0,0 @@ - .syntax unified - push {r4, lr} - adds r4, r0, #0 - ldr r1, _080A6FA4 @ =gMenu - ldrh r0, [r1, #0x2e] - cmp r0, r4 - beq _080A6F9A - strh r4, [r1, #0x2e] - ldr r0, _080A6FA8 @ =gUnk_020350F0 - movs r1, #0x80 - lsls r1, r1, #1 - bl MemClear - movs r0, #0xff - ands r0, r4 - cmp r0, #0 - beq _080A6F94 - ldr r1, _080A6FAC @ =gUnk_08128FA8 - adds r0, r4, #0 - bl sub_0805F46C -_080A6F94: - ldr r1, _080A6FB0 @ =gScreen - movs r0, #1 - strh r0, [r1, #0xe] -_080A6F9A: - ldr r1, _080A6FB0 @ =gScreen - movs r0, #2 - strh r0, [r1, #0xc] - pop {r4, pc} - .align 2, 0 -_080A6FA4: .4byte gMenu -_080A6FA8: .4byte gUnk_020350F0 -_080A6FAC: .4byte gUnk_08128FA8 -_080A6FB0: .4byte gScreen - .syntax divided diff --git a/include/game.h b/include/game.h index ca722d7c..46a82750 100644 --- a/include/game.h +++ b/include/game.h @@ -285,4 +285,14 @@ typedef enum { GAMEMAIN_SUBTASK, } EGameMainState; +typedef struct { + u8 _0; + u8 _1; + u8 _2; + u8 _3; + u8 _4; + u16 _6; +} struct_08127F94; +extern struct_08127F94 gUnk_08127F94[]; + #endif // GAME_H diff --git a/include/save.h b/include/save.h index 487c499a..6536cc76 100644 --- a/include/save.h +++ b/include/save.h @@ -41,7 +41,9 @@ typedef struct { /*0x006*/ u8 saw_staffroll; /*0x007*/ u8 unk7; /*0x008*/ u8 global_progress; /**< @see UpdateGlobalProgress */ - /*0x009*/ u8 field_0x9[0x37]; + /*0x009*/ u8 field_0x9[0x17]; + /*0x020*/ u16 field_0x20; + /*0x022*/ u8 field_0x22[0x1e]; /*0x040*/ u32 windcrests; /**< Windcrest flags. */ /*0x044*/ u8 filler44[0xC]; /*0x050*/ u32 unk50; diff --git a/src/game.c b/src/game.c index 4ba8eb61..781f1acf 100644 --- a/src/game.c +++ b/src/game.c @@ -157,16 +157,6 @@ static void InitRoomResInfo(RoomResInfo* info, RoomHeader* hdr, u32 area, u32 ro static void sub_080532E4(void); static void ResetTimerFlags(void); -typedef struct { - u8 _0; - u8 _1; - u8 _2; - u8 _3; - u8 _4; - u16 _6; -} struct_08127F94; -extern struct_08127F94 gUnk_08127F94[]; - typedef struct { u8 dest_off[8]; u8 _8; diff --git a/src/menu/pause_menu.c b/src/menu/pause_menu.c index 1509b683..4952837d 100644 --- a/src/menu/pause_menu.c +++ b/src/menu/pause_menu.c @@ -16,7 +16,7 @@ extern void sub_080A4DB8(u32); void sub_080A5128(void); void sub_080A51D4(void); -u32 sub_080A51F4(void); +bool32 sub_080A51F4(void); void sub_080A5F48(u32, u32); Subtask PauseMenu_Variant0; @@ -53,14 +53,6 @@ void Subtask_PauseMenu(void) { } } -typedef struct { - u8 _0; - u8 _1; - u8 _2; - u8 _3; - u8 _4; - u16 _6; -} struct_08127F94; struct_08127F94* sub_080A6A80(u32, u32); extern u8 gUnk_02034492[]; @@ -110,7 +102,7 @@ void PauseMenu_Variant2(void) { int iVar4; s32 bVar5; - if ((sub_080A51F4() != 0) && (gMenu.field_0xc != NULL)) { + if (sub_080A51F4() && (gMenu.field_0xc != NULL)) { iVar1 = -1; switch (gInput.newKeys) { case START_BUTTON: @@ -263,12 +255,12 @@ void sub_080A51D4(void) { } } -u32 sub_080A51F4(void) { - u32 retval = 1; +bool32 sub_080A51F4(void) { + bool32 retval = TRUE; if (gFadeControl.active != 0) - retval = 0; + retval = FALSE; if (gPauseMenuOptions.unk11 != 2) - retval = 0; + retval = FALSE; return retval; } diff --git a/src/subtask2.c b/src/subtask2.c index 8432d418..8dae20fb 100644 --- a/src/subtask2.c +++ b/src/subtask2.c @@ -13,9 +13,19 @@ extern u8 gUnk_08128D38[]; extern u8 gUnk_08128D43[]; +extern u16 gUnk_02017830[]; +extern u8 gUnk_080C9C6C[]; +extern u8 gUnk_020350F0[]; void sub_080A5CFC(u32, void*, u32); void sub_080A6FB4(u32, u32); +void sub_080A66D0(); +void sub_080A5D1C(); +void sub_080A70AC(const KeyButtonLayout* layout); +u32 sub_080A6F40(); +void sub_080A67C4(u32); +void sub_080A68D4(); +u32 sub_080A69E0(); extern void DrawDungeonMap(u32 floor, struct_02019EE0* data, u32 size); extern void LoadDungeonMap(void); @@ -31,6 +41,8 @@ void sub_080A617C(void); void sub_080A7040(u32); extern u8 gUnk_08128DB8[]; +extern u8 gUnk_08128E80[]; +extern u8 gUnk_08128F58[]; extern KeyButtonLayout gUnk_08128DBC; extern void (*const gUnk_08128DCC[])(void); @@ -49,6 +61,8 @@ void sub_080A71F4(ScreenTransitionData*); extern void DeleteAllEntities(void); extern void sub_0805E974(void); +extern bool32 sub_080A51F4(void); +extern u32 sub_0807CB24(u32, u32); extern void (*const gUnk_0812901C[])(void); @@ -59,6 +73,19 @@ extern void UpdateCarriedObject(void); extern void (*const gSubtasks[])(void); +typedef struct { + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; + s8 unk5; + u8 unk6; + u8 unk7; +} struct_gUnk_08128E94; + +extern const struct_gUnk_08128E94 gUnk_08128E94[]; + ASM_FUNC("asm/non_matching/subtask2/sub_080A5594.inc", void sub_080A5594()) ASM_FUNC("asm/non_matching/subtask2/sub_080A56A0.inc", void sub_080A56A0()) @@ -92,17 +119,77 @@ void sub_080A5A54(void) { } } -ASM_FUNC("asm/non_matching/subtask2/sub_080A5A90.inc", void sub_080A5A90()) +void sub_080A5A90(void) { + u32 uVar1; -ASM_FUNC("asm/non_matching/subtask2/sub_080A5AD8.inc", void sub_080A5AD8()) + switch (gMenu.transitionTimer) { + case 0: + if ((gInput.newKeys & (START_BUTTON | B_BUTTON | A_BUTTON)) != 0) { + gMenu.transitionTimer = 0xff; + } + break; + case 0xff: + if (gPauseMenuOptions.unk1 == 10) { + uVar1 = 2; + } else { + uVar1 = 1; + } + sub_080A4E84(uVar1); + break; + default: + gMenu.transitionTimer--; + break; + } +} -ASM_FUNC("asm/non_matching/subtask2/sub_080A5AF4.inc", void sub_080A5AF4()) +void sub_080A5AD8() { + extern void (*const gUnk_08128D24[])(void); + gUnk_08128D24[gMenu.menuType](); +} + +void sub_080A5AF4(void) { + gMenu.field_0x3 = 0; + SetPopupState(2, 0); +#ifndef EU + if (gSaveHeader->language == 0) { + gScreen.bg1.yOffset = 0xfffc; + } else { + gScreen.bg1.yOffset = 0; + } +#endif + SetMenuType(1); +} ASM_FUNC("asm/non_matching/subtask2/sub_080A5B34.inc", void sub_080A5B34()) -ASM_FUNC("asm/non_matching/subtask2/sub_080A5BB8.inc", void sub_080A5BB8()) +void sub_080A5BB8(void) { + Main* m; + if (!gFadeControl.active) { + sub_08050384(); + m = &gMain; + *(vu8*)&m->sleepStatus; // force a read + m->sleepStatus = SLEEP; + SetFade(6, 8); + sub_080A4E84(2); + gPauseMenuOptions.unk16 = 16; + } +} -ASM_FUNC("asm/non_matching/subtask2/sub_080A5BF0.inc", void sub_080A5BF0()) +void sub_080A5BF0(void) { + extern void (*const gUnk_08128D30[])(void); + u32 uVar1; + u32 temp; + + gUnk_08128D30[gMenu.menuType](); + sub_080A5D1C(); + temp = gMain.ticks.HWORD; + if ((temp & 7) == 0) { + uVar1 = *gUnk_02017830; + MemCopy(gUnk_02017830 + 1, gUnk_02017830, 0xe); + gUnk_02017830[7] = uVar1; + gUsedPalettes |= 0x1000; + } +} void sub_080A5C44(u32 param_1, u32 param_2, u32 param_3) { s8* ptr; @@ -116,7 +203,32 @@ void sub_080A5C44(u32 param_1, u32 param_2, u32 param_3) { gScreen.bg1.yOffset += ptr[0]; } -ASM_FUNC("asm/non_matching/subtask2/sub_080A5C9C.inc", void sub_080A5C9C()) +void sub_080A5C9C(void) { + s32 newChoice; + u8* ptr; + + if (sub_080A51F4()) { + ptr = &gUnk_080C9C6C[gArea.dungeon_idx * 4]; + newChoice = gMenu.field_0x3; + switch (gInput.newKeys) { + case DPAD_UP: + if (newChoice > 0) { + newChoice--; + } + break; + case DPAD_DOWN: + if (*ptr - 1 > newChoice) { + newChoice++; + } + break; + } + if (gMenu.field_0x3 != newChoice) { + gMenu.field_0x3 = newChoice; + sub_080A5CFC(newChoice, &gMenu, newChoice); + SoundReq(SFX_TEXTBOX_CHOICE); + } + } +} void sub_080A5CFC(u32 menuType, void* param_2, u32 param_3) { DrawDungeonFeatures(menuType, param_2, param_3); @@ -161,7 +273,29 @@ void sub_080A6108(void) { SetMenuType(1); } -ASM_FUNC("asm/non_matching/subtask2/sub_080A612C.inc", void sub_080A612C()) +void sub_080A612C(void) { + u32 newChoice; + int iVar3; + + if (sub_080A51F4()) { + newChoice = gMenu.field_0x3; + switch (gInput.newKeys) { + case DPAD_LEFT: + newChoice--; + break; + case DPAD_RIGHT: + newChoice++; + break; + } + iVar3 = newChoice + 8; + newChoice = iVar3 / 8; + newChoice = iVar3 - newChoice * 8; + if (gMenu.field_0x3 != newChoice) { + gMenu.field_0x3 = newChoice; + SoundReq(SFX_TEXTBOX_CHOICE); + } + } +} ASM_FUNC("asm/non_matching/subtask2/sub_080A617C.inc", void sub_080A617C()) @@ -170,41 +304,166 @@ void sub_080A6270(void) { sub_080A6378(); } -ASM_FUNC("asm/non_matching/subtask2/sub_080A6290.inc", void sub_080A6290()) +extern u8 gUnk_08128DD8[]; +extern u8 gUnk_08128DD4[]; + +void sub_080A6290(void) { + sub_080A70AC((KeyButtonLayout*)gUnk_08128DD8); + gMenu.field_0xc = gUnk_08128DD4; + LoadGfxGroup(0x81); + gScreen.bg1.yOffset = -4; + gScreen.bg2.yOffset = -4; + gSave.windcrests = gSave.windcrests | 0x10780; + gGenericMenu.unk10.h[0] = sub_080A6F40(); + gMenu.menuType = 1; +} ASM_FUNC("asm/non_matching/subtask2/sub_080A62E0.inc", void sub_080A62E0()) ASM_FUNC("asm/non_matching/subtask2/sub_080A6378.inc", void sub_080A6378()) -ASM_FUNC("asm/non_matching/subtask2/sub_080A6438.inc", void sub_080A6438()) +void sub_080A6438(void) { + u32 uVar1; + u8* pcVar2; + u32 uVar3; + + gOamCmd._4 = 0x400; + gOamCmd._6 = 0; + gOamCmd._8 = 0; + uVar1 = gSave.field_0x20 & gGenericMenu.unk10.h[0]; + for (pcVar2 = gUnk_08128F58, uVar3 = 0; *pcVar2 != 0; uVar3++, pcVar2 += 8) { + if ((1 << uVar3 & uVar1) != 0) { + gOamCmd.x = pcVar2[1]; + gOamCmd.y = pcVar2[2]; +#ifdef EU + DrawDirect(0x1fa, *pcVar2); +#else + DrawDirect(0x1fb, *pcVar2); +#endif + } + } +} ASM_FUNC("asm/non_matching/subtask2/sub_080A6498.inc", void sub_080A6498()) -ASM_FUNC("asm/non_matching/subtask2/Subtask_MapHint.inc", void Subtask_MapHint()) +void Subtask_MapHint(void) { + extern void (*const gUnk_08128E70[])(void); + FlushSprites(); + gUnk_08128E70[gMenu.menuType](); + if ((gGenericMenu.unk2c & 0x20) != 0) { + sub_080A6438(); + } + sub_080A6498(); + CopyOAM(); +} ASM_FUNC("asm/non_matching/subtask2/sub_080A6534.inc", void sub_080A6534()) ASM_FUNC("asm/non_matching/subtask2/sub_080A65AC.inc", void sub_080A65AC()) -ASM_FUNC("asm/non_matching/subtask2/sub_080A6608.inc", void sub_080A6608()) +void sub_080A6608(void) { + extern void (*const gUnk_08128E78[])(void); + const struct_gUnk_08128E94* ptr; + gUnk_08128E78[gMenu.menuType](); + ptr = &gUnk_08128E94[gMenu.field_0x3]; + gScreen.bg1.yOffset = -ptr->unk5; + gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6; + sub_080A66D0(); +} -ASM_FUNC("asm/non_matching/subtask2/sub_080A6650.inc", void sub_080A6650()) +void sub_080A6650(void) { + extern u8 gUnk_08128E84[]; + u32 temp; + sub_080A70AC((KeyButtonLayout*)gUnk_08128E84); + temp = gPauseMenuOptions.unk2[4]; + gMenu.field_0x3 = temp; + sub_080A67C4(temp); + sub_080A68D4(); + SetMenuType(1); +} -ASM_FUNC("asm/non_matching/subtask2/sub_080A667C.inc", void sub_080A667C()) +void sub_080A667C(void) { + u32 uVar1; + u32 uVar2; + const struct_gUnk_08128E94* ptr; + + gMenu.field_0xc = gUnk_08128E80; + ptr = &gUnk_08128E94[gMenu.field_0x3]; + uVar2 = gMenu.field_0xa; + switch (gInput.heldKeys) { + case DPAD_UP: + if (uVar2 != 0) { + uVar2 -= 2; + } + break; + case DPAD_DOWN: + uVar1 = ptr->unk2; + if (uVar1 > uVar2) { + uVar2 += 2; + } + if (uVar1 < uVar2) { + uVar2 = uVar1; + } + break; + } + + gMenu.field_0xa = uVar2; + sub_080A6FB4(gMenu.field_0x3, 0); +} ASM_FUNC("asm/non_matching/subtask2/sub_080A66D0.inc", void sub_080A66D0()) -ASM_FUNC("asm/non_matching/subtask2/sub_080A67C4.inc", void sub_080A67C4()) +ASM_FUNC("asm/non_matching/subtask2/sub_080A67C4.inc", void sub_080A67C4(u32 param_1)) ASM_FUNC("asm/non_matching/subtask2/sub_080A68D4.inc", void sub_080A68D4()) -ASM_FUNC("asm/non_matching/subtask2/sub_080A698C.inc", void sub_080A698C()) +typedef struct { + u8 unk0; + u8 unk1; + u16 unk2; + u16 unk4; + u16 unk6; +} struct_sub_080A698C; -ASM_FUNC("asm/non_matching/subtask2/sub_080A69E0.inc", void sub_080A69E0()) +void sub_080A698C(u32 param_1, u32 param_2, u32 param_3, u32 param_4) { + int iVar1; -ASM_FUNC("asm/non_matching/subtask2/sub_080A6A80.inc", void sub_080A6A80()) + iVar1 = sub_080A69E0(); + if (0 < iVar1) { + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk0 = param_4 >> 8; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk1 = param_4; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk2 = param_3; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk4 = iVar1; + ((struct_sub_080A698C*)&gMapDataBottomSpecial)[gGenericMenu.unk2d].unk6 = iVar1 >> 0x10; + gGenericMenu.unk2d++; + } +} -ASM_FUNC("asm/non_matching/subtask2/Subtask_LocalMapHint.inc", void Subtask_LocalMapHint()) +ASM_FUNC("asm/non_matching/subtask2/sub_080A69E0.inc", u32 sub_080A69E0()) + +struct_08127F94* sub_080A6A80(u32 param_1, u32 param_2) { + struct_08127F94* pbVar1; + param_1 >>= 4; + param_2 >>= 4; + + for (pbVar1 = gUnk_08127F94; pbVar1->_0 != 0xff; pbVar1++) { + if (pbVar1->_0 <= param_1 && pbVar1->_2 >= param_1 && pbVar1->_1 <= param_2 && pbVar1->_3 >= param_2) { + return pbVar1; + } + } + return NULL; +} + +void Subtask_LocalMapHint() { + extern void (*const gUnk_08128F1C[])(void); + const struct_gUnk_08128E94* ptr; + FlushSprites(); + gUnk_08128F1C[gMenu.menuType](); + ptr = &gUnk_08128E94[gMenu.field_0x3]; + gScreen.bg1.yOffset = -ptr->unk5; + gScreen.bg2.yOffset = gMenu.field_0xa - (s8)ptr->unk6; + CopyOAM(); +} ASM_FUNC("asm/non_matching/subtask2/sub_080A6B04.inc", void sub_080A6B04()) @@ -233,12 +492,25 @@ ASM_FUNC("asm/non_matching/subtask2/sub_080A6CD8.inc", void sub_080A6CD8()) ASM_FUNC("asm/non_matching/subtask2/sub_080A6D74.inc", u32 sub_080A6D74(u32 a)) -#ifdef EU -ASM_FUNC("asm/non_matching/subtask2/sub_080A6DD0.inc", u32 sub_080A6DD0(void)) -#else void sub_080A6DD0(void) { u32 tmp; switch (sub_08056338()) { +#ifdef EU + case 0: + gMenu.field_0x0 = 2; + break; + case 1: + gMenu.field_0x0 = 3; + tmp = 1; + break; + default: + return; + } + + if (tmp) { + SetMenuType(3); + } +#else case 0: gMenu.field_0x0 = 2; tmp = 3; @@ -250,8 +522,8 @@ void sub_080A6DD0(void) { return; } SetMenuType(tmp); -} #endif +} void sub_080A6DF8(void) { if (gMenu.field_0x0 == 2) { @@ -276,9 +548,31 @@ ASM_FUNC("asm/non_matching/subtask2/sub_080A6E70.inc", void sub_080A6E70()) ASM_FUNC("asm/non_matching/subtask2/sub_080A6EE0.inc", void sub_080A6EE0()) -ASM_FUNC("asm/non_matching/subtask2/sub_080A6F40.inc", void sub_080A6F40()) +u32 sub_080A6F40(void) { + extern u8 gUnk_08128F38[]; + int iVar1; + u8* pcVar2; + u32 uVar3; + u32 uVar4; -ASM_FUNC("asm/non_matching/subtask2/sub_080A6F6C.inc", void sub_080A6F6C()) + for (uVar3 = 0, pcVar2 = gUnk_08128F38, uVar4 = 0; *pcVar2 != 0; uVar3++, pcVar2 += 2) { + uVar4 |= sub_0807CB24(*pcVar2, pcVar2[1]) << uVar3; + } + return ~uVar4; +} + +void sub_080A6F6C(u32 param_1) { + extern Font gUnk_08128FA8; + if (gGenericMenu.unk2e.HWORD != param_1) { + gGenericMenu.unk2e.HWORD = param_1; + MemClear(gUnk_020350F0, 0x100); + if ((param_1 & 0xff) != 0) { + sub_0805F46C(param_1, &gUnk_08128FA8); + } + gScreen.bg0.updated = 1; + } + gScreen.bg0.yOffset = 2; +} ASM_FUNC("asm/non_matching/subtask2/sub_080A6FB4.inc", void sub_080A6FB4(u32 a, u32 b)) diff --git a/src/title.c b/src/title.c index 3329f80e..5868f50a 100644 --- a/src/title.c +++ b/src/title.c @@ -72,7 +72,7 @@ static const SaveFile gDemoSave = { .msg_speed = 1, .brightness = 1, .global_progress = 1, - .field_0x9 = { [23] = 0x1F }, + .field_0x20 = 0x1F, .windcrests = 0x00013780, .unk50 = 7, .areaVisitFlags = { 0x0114C300 },