From 2555185721729cc950c89f7a3cf6cef485e566e1 Mon Sep 17 00:00:00 2001 From: theo3 Date: Tue, 21 Jul 2020 23:02:19 -0700 Subject: [PATCH] menu main func OK --- asm/sub_080AD380.s | 65 ------------ asm/sub_080AD3F4.s | 68 ------------ asm/sub_080AD474.s | 224 --------------------------------------- include/functions.h | 10 ++ include/main.h | 36 ++++++- include/menu.h | 8 +- include/screen.h | 3 +- linker.ld | 3 - src/introSetTransition.c | 204 ++++++++++++++++++++++++++++++++--- src/room.c | 14 +-- 10 files changed, 236 insertions(+), 399 deletions(-) delete mode 100644 asm/sub_080AD380.s delete mode 100644 asm/sub_080AD3F4.s delete mode 100644 asm/sub_080AD474.s diff --git a/asm/sub_080AD380.s b/asm/sub_080AD380.s deleted file mode 100644 index 56400499..00000000 --- a/asm/sub_080AD380.s +++ /dev/null @@ -1,65 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080AD380 -sub_080AD380: @ 0x080AD380 - push {r4, lr} - bl sub_080AD90C - ldr r4, _080AD398 @ =gUnk_03001000 - ldrb r0, [r4, #3] - cmp r0, #1 - beq _080AD3BC - cmp r0, #1 - bgt _080AD39C - cmp r0, #0 - beq _080AD3A2 - b _080AD3EA - .align 2, 0 -_080AD398: .4byte gUnk_03001000 -_080AD39C: - cmp r0, #2 - beq _080AD3D8 - b _080AD3EA -_080AD3A2: - bl sub_08056418 - ldr r0, _080AD3B8 @ =gUnk_02032EC0 - movs r1, #0xed - lsls r1, r1, #2 - bl _DmaZero - movs r0, #0 - bl IntroSetTransition - b _080AD3EA - .align 2, 0 -_080AD3B8: .4byte gUnk_02032EC0 -_080AD3BC: - ldr r1, _080AD3D0 @ =gUnk_081320F0 - ldr r0, _080AD3D4 @ =gUnk_02032EC0 - ldrb r0, [r0, #2] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - b _080AD3EA - .align 2, 0 -_080AD3D0: .4byte gUnk_081320F0 -_080AD3D4: .4byte gUnk_02032EC0 -_080AD3D8: - ldr r0, _080AD3F0 @ =gUnk_03000FD0 - ldrb r0, [r0] - cmp r0, #0 - bne _080AD3EE - movs r0, #1 - bl sub_0801DA90 - movs r0, #1 - strb r0, [r4, #3] -_080AD3EA: - bl sub_080AD918 -_080AD3EE: - pop {r4, pc} - .align 2, 0 -_080AD3F0: .4byte gUnk_03000FD0 \ No newline at end of file diff --git a/asm/sub_080AD3F4.s b/asm/sub_080AD3F4.s deleted file mode 100644 index 756016c5..00000000 --- a/asm/sub_080AD3F4.s +++ /dev/null @@ -1,68 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080AD3F4 -sub_080AD3F4: @ 0x080AD3F4 - push {r4, r5, lr} - bl sub_080AD84C - adds r1, r0, #0 - ldr r4, _080AD450 @ =gMenu - ldrb r0, [r4, #5] - cmp r0, #0 - bne _080AD458 - movs r0, #1 - bl sub_0801DA90 - movs r5, #1 - strb r5, [r4, #5] - movs r0, #0x78 - strh r0, [r4, #8] - movs r0, #0x10 - bl sub_0801D7EC - movs r0, #1 - bl sub_0801D7EC - movs r0, #0x80 - lsls r0, r0, #0x12 - ldrb r0, [r0, #7] - movs r1, #2 - cmp r0, #0 - bne _080AD42C - movs r1, #1 -_080AD42C: - adds r0, r1, #0 - bl LoadPalettesByPaletteGroupIndex - ldr r0, _080AD454 @ =gScreen - ldrh r1, [r0] - movs r3, #0x80 - lsls r3, r3, #3 - adds r2, r3, #0 - orrs r1, r2 - strh r1, [r0] - strh r5, [r0, #0x1a] - movs r0, #6 - movs r1, #8 - bl DoFade - movs r1, #0 - b _080AD45E - .align 2, 0 -_080AD450: .4byte gMenu -_080AD454: .4byte gScreen -_080AD458: - cmp r1, #1 - bne _080AD45E - movs r1, #2 -_080AD45E: - cmp r1, #2 - bne _080AD46C - ldr r1, _080AD470 @ =gUnk_02000010 - movs r0, #1 - strb r0, [r1, #5] - bl IntroSetTransition -_080AD46C: - pop {r4, r5, pc} - .align 2, 0 -_080AD470: .4byte gUnk_02000010 \ No newline at end of file diff --git a/asm/sub_080AD474.s b/asm/sub_080AD474.s deleted file mode 100644 index 135ce2f7..00000000 --- a/asm/sub_080AD474.s +++ /dev/null @@ -1,224 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080AD474 -sub_080AD474: @ 0x080AD474 - push {r4, r5, r6, lr} - ldr r5, _080AD490 @ =gMenu - ldrb r0, [r5, #0x12] - adds r0, #1 - strb r0, [r5, #0x12] - ldrb r0, [r5, #5] - cmp r0, #1 - bne _080AD486 - b _080AD588 -_080AD486: - cmp r0, #1 - bgt _080AD494 - cmp r0, #0 - beq _080AD49C - b _080AD5C8 - .align 2, 0 -_080AD490: .4byte gMenu -_080AD494: - cmp r0, #2 - bne _080AD49A - b _080AD5AA -_080AD49A: - b _080AD5C8 -_080AD49C: - movs r4, #1 - strb r4, [r5, #5] - strb r0, [r5, #6] - movs r6, #0 - movs r0, #0x1e - strh r0, [r5, #8] - movs r0, #7 - strb r0, [r5, #4] - bl EraseAllEntities - movs r0, #0 - bl sub_0801CFA8 - bl sub_080ADD30 - ldr r0, _080AD50C @ =gUnk_02024490 - strb r4, [r0] - movs r0, #2 - bl sub_0801D7EC - movs r4, #0x80 - lsls r4, r4, #0x12 - ldrb r0, [r4, #7] - movs r1, #4 - cmp r0, #0 - bne _080AD4D2 - movs r1, #3 -_080AD4D2: - adds r0, r1, #0 - bl LoadPalettesByPaletteGroupIndex - ldrb r0, [r4, #7] - cmp r0, #0 - bne _080AD524 - ldr r2, _080AD510 @ =gScreen - adds r1, r2, #0 - adds r1, #0x66 - ldr r0, _080AD514 @ =0x00000844 - strh r0, [r1] - adds r1, #2 - adds r0, #0xc5 - strh r0, [r1] - ldr r0, _080AD518 @ =0x00001C09 - strh r0, [r2, #0x14] - adds r0, #0xf9 - strh r0, [r2, #0x20] - ldr r0, _080AD51C @ =0x00001E03 - strh r0, [r2, #0x2c] - ldrh r0, [r2] - movs r3, #0xf0 - lsls r3, r3, #5 - adds r1, r3, #0 - orrs r0, r1 - strh r0, [r2] - ldr r0, _080AD520 @ =0x0000FF60 - strh r0, [r2, #0x18] - b _080AD55A - .align 2, 0 -_080AD50C: .4byte gUnk_02024490 -_080AD510: .4byte gScreen -_080AD514: .4byte 0x00000844 -_080AD518: .4byte 0x00001C09 -_080AD51C: .4byte 0x00001E03 -_080AD520: .4byte 0x0000FF60 -_080AD524: - ldr r2, _080AD570 @ =gScreen - adds r1, r2, #0 - adds r1, #0x66 - ldr r0, _080AD574 @ =0x00000241 - strh r0, [r1] - adds r1, #2 - ldr r0, _080AD578 @ =0x00000909 - strh r0, [r1] - ldr r0, _080AD57C @ =0x00001D02 - strh r0, [r2, #8] - ldr r0, _080AD580 @ =0x00001E03 - strh r0, [r2, #0x14] - ldr r0, _080AD584 @ =0x00007C89 - strh r0, [r2, #0x20] - ldrh r0, [r2] - movs r1, #1 - orrs r0, r1 - orrs r0, r6 - movs r3, #0x98 - lsls r3, r3, #5 - adds r1, r3, #0 - orrs r0, r1 - strh r0, [r2] - movs r0, #0x10 - str r0, [r5, #0x2c] - bl sub_080AD670 -_080AD55A: - bl sub_080A3210 - movs r0, #3 - bl PlaySFX - movs r0, #6 - movs r1, #8 - bl DoFade - b _080AD610 - .align 2, 0 -_080AD570: .4byte gScreen -_080AD574: .4byte 0x00000241 -_080AD578: .4byte 0x00000909 -_080AD57C: .4byte 0x00001D02 -_080AD580: .4byte 0x00001E03 -_080AD584: .4byte 0x00007C89 -_080AD588: - ldr r0, _080AD5A0 @ =gUnk_03000FD0 - ldrb r0, [r0] - cmp r0, #0 - bne _080AD632 - movs r0, #0x80 - lsls r0, r0, #0x12 - ldrb r0, [r0, #7] - cmp r0, #0 - bne _080AD5A4 - bl sub_080AD6AC - b _080AD610 - .align 2, 0 -_080AD5A0: .4byte gUnk_03000FD0 -_080AD5A4: - bl sub_080AD76C - b _080AD610 -_080AD5AA: - ldrh r0, [r5, #8] - subs r0, #1 - strh r0, [r5, #8] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _080AD5C2 - movs r0, #0xe1 - lsls r0, r0, #4 - strh r0, [r5, #8] - ldrb r0, [r5, #5] - adds r0, #1 - strb r0, [r5, #5] -_080AD5C2: - bl sub_080AD644 - b _080AD610 -_080AD5C8: - bl sub_080AD84C - adds r4, r0, #0 - cmp r4, #0 - beq _080AD5EC - cmp r4, #2 - bne _080AD5DE - movs r0, #0x6a - bl PlaySFX - b _080AD5E0 -_080AD5DE: - movs r4, #0 -_080AD5E0: - adds r0, r4, #0 - bl IntroSetTransition - ldr r0, _080AD634 @ =0x80080000 - bl PlaySFX -_080AD5EC: - bl sub_080AD644 - ldr r0, _080AD638 @ =gMenu - ldrh r1, [r0, #8] - movs r0, #0x20 - ands r0, r1 - cmp r0, #0 - bne _080AD610 - ldr r1, _080AD63C @ =gUnk_03001010 - movs r0, #0xe0 - lsls r0, r0, #8 - strh r0, [r1, #8] - movs r0, #0x84 - strh r0, [r1, #2] - ldr r0, _080AD640 @ =0x000001FF - movs r1, #0 - bl sub_080ADA14 -_080AD610: - ldr r2, _080AD638 @ =gMenu - movs r0, #0x80 - lsls r0, r0, #0x12 - ldrb r1, [r0, #7] - ldrb r0, [r2, #4] - cmp r0, r1 - beq _080AD626 - strb r1, [r2, #4] - movs r0, #3 - bl sub_0801D7EC -_080AD626: - bl sub_080AD89C - bl sub_0805E5C0 - bl sub_080AD9B0 -_080AD632: - pop {r4, r5, r6, pc} - .align 2, 0 -_080AD634: .4byte 0x80080000 -_080AD638: .4byte gMenu -_080AD63C: .4byte gUnk_03001010 -_080AD640: .4byte 0x000001FF diff --git a/include/functions.h b/include/functions.h index 36aa73c7..caace6ff 100644 --- a/include/functions.h +++ b/include/functions.h @@ -159,4 +159,14 @@ extern void sub_080AF2E4(void); extern void sub_0805ADD8(u32); extern void sub_0804F578(void); extern void sub_08059994(void); +extern u32 sub_080AD84C(); +extern void sub_0801D7EC(u32); +extern s32 sub_0801CFA8(u32); +extern void sub_080AD670(); +extern void sub_080A3210(); +extern void sub_080AD6AC(); +extern void sub_080AD76C(); +extern void sub_080AD644(); +extern void sub_080ADA14(u32, u32); +extern void sub_080AD89C(); #endif diff --git a/include/main.h b/include/main.h index c1ef4b5b..16888e29 100644 --- a/include/main.h +++ b/include/main.h @@ -14,6 +14,35 @@ typedef struct { // 0x03001000 u32 spritePriority; } MainStruct; +typedef struct { + u8 interruptFlag; + u8 field_0x1; + u8 funcIndex; + u8 field_0x3; + u8 transition; + u8 field_0x5; + u8 muteAudio; + u8 field_0x8; + u8 countdown; +} Main; + +typedef struct { + u16 nextToLoad; + u8 transitionType; + u8 field_0x3; + u8 state; + u8 field_0x5; + u8 field_0x6; + u8 pauseFadeIn; + u16 isLoading; + u16 fadeInTime; +} UI; + +extern Main gUnk_03001000; +extern UI gUnk_02032EC0; + + + extern s32 sub_08055F70(); extern s32 sub_080A3204(s32); extern s32 sub_0805616C(s32); @@ -21,10 +50,9 @@ extern s32 sub_0807CE90(s32); extern s32 sub_080560B8(s32); extern void sub_08056208(s32); extern void sub_0804FFE4(); -extern s32 sub_0804FF84(s32); -extern s32 sub_08056418(s32); +extern s32 sub_08056418(); extern void sub_080ADD30(s32); -extern s32 _DmaZero(s32, u32, u32); + extern s32 sub_08056010(s32); extern s32 sub_08016E78(s32); extern s32 ReadKeyInput(); @@ -37,8 +65,6 @@ extern s32 sub_08056458(s32); extern s32 sub_08050154(s32); extern s32 sub_080A3480(s32); -extern s32 gUnk_02000010; extern s32 gRand; -extern MainStruct gUnk_03001000; extern s32 gUnk_08100CBC; #endif \ No newline at end of file diff --git a/include/menu.h b/include/menu.h index cfd6c3d6..e3053783 100644 --- a/include/menu.h +++ b/include/menu.h @@ -24,10 +24,12 @@ typedef struct { u8 secret; u8 overlayType; u8 storyPanelIndex; - u8 field_0x7; - u8 transitionTimer; + u16 transitionTimer; + u8 field_0xa[8]; + u8 field_0x12; + u8 field_0x13[22]; + u32 field_0x2c; } Menu; extern Menu gMenu; - #endif \ No newline at end of file diff --git a/include/screen.h b/include/screen.h index 442eee84..1eafcf76 100644 --- a/include/screen.h +++ b/include/screen.h @@ -15,7 +15,8 @@ typedef struct { u16 bg0xOffset; u16 bg0yOffset; u16 bg0Updated; - u32 unk; + u16 unk; + u16 unk2; } BgSettings; typedef struct { diff --git a/linker.ld b/linker.ld index 460b91b4..f18fab06 100644 --- a/linker.ld +++ b/linker.ld @@ -883,9 +883,6 @@ SECTIONS { src/sub_080A554C.o(.text); asm/code_080A5574.o(.text); src/introSetTransition.o(.text); - asm/sub_080AD380.o(.text); - asm/sub_080AD3F4.o(.text); - asm/sub_080AD474.o(.text); src/sub_080AD644.o(.text); asm/sub_080AD670.o(.text); asm/sub_080AD6Ac.o(.text); diff --git a/src/introSetTransition.c b/src/introSetTransition.c index 6d71480f..3bb850e2 100644 --- a/src/introSetTransition.c +++ b/src/introSetTransition.c @@ -1,27 +1,197 @@ #include "global.h" #include "menu.h" +#include "main.h" +#include "entity.h" +#include "functions.h" +#include "screen.h" + +extern void (*const gUnk_081320F0[])(); + +extern u8 gUnk_03000FD0; + +typedef struct { + char header[4]; + u8 saveFile; + u8 field_0x5; + u8 brightnessPref; + u8 gameLanguage; +} struct_02000000; typedef struct { - u8 unk; - u8 unk2; - u8 unk3; - u8 functionIndex; - u16 unk6; u8 filler[5]; - u32 ticks; - u16 unk7; -} TransitionStruct; + u8 field_0x5; +} struct_02000010; -extern u32 DoFade(u32, u32); -extern void _DmaZero(u32*, u32, u32); -extern TransitionStruct gUnk_03001000; -extern MenuControls gUnk_02032EC0; - -u32 IntroSetTransition(u8 transition, u32 param_2, u32 param_3) +extern struct_02000010 gUnk_02000010; +u32 IntroSetTransition(u32 transition) { gUnk_02032EC0.transitionType = transition; - gUnk_03001000.functionIndex = 2; - _DmaZero((u32 *)&gMenu, 48, param_3); - return DoFade(7, 8); + gUnk_03001000.field_0x3 = 2; + _DmaZero((u32 *)&gMenu, 48); + DoFade(7, 8); } + +void sub_080AD380() +{ + sub_080AD90C(); + switch (gUnk_03001000.field_0x3) { + case 0: + sub_08056418(); + _DmaZero(&gUnk_02032EC0, 0x3b4); + IntroSetTransition(0); + break; + case 1: + gUnk_081320F0[gUnk_02032EC0.transitionType](); + break; + case 2: + if (gUnk_03000FD0 != 0) { + return; + } + sub_0801DA90(1); + gUnk_03001000.field_0x3 = 1; + break; + } + sub_080AD918(); +} + +void sub_080AD3F4(void) +{ + u32 iVar1; + u32 uVar2; + + iVar1 = sub_080AD84C(); + if (gMenu.secret == 0) { + sub_0801DA90(1); + gMenu.secret = 1; + gMenu.transitionTimer = 0x78; + sub_0801D7EC(0x10); + sub_0801D7EC(1); + if (((struct_02000000 *)0x2000000)->gameLanguage == 0) { + uVar2 = 1; + } + else { + uVar2 = 2; + } + LoadPalettesByPaletteGroupIndex(uVar2); + gScreen.lcd.lcdControl2 |= 0x400; + gScreen.bg2.bg0xOffset = 1; + DoFade(6, 8); + iVar1 = 0; + } + else { + if (iVar1 == 1) { + iVar1 = 2; + } + } + if (iVar1 == 2) { + gUnk_02000010.field_0x5 = 1; + IntroSetTransition(1); + } +} + +typedef struct { + u16 field_0x0; + u16 field_0x2; + u16 field_0x4[2]; + u16 field_0x8; +} struct_03001010; + +extern struct_03001010 gUnk_03001010; + +extern u8 gUnk_02024490; +extern u8 gUnk_03000FD0; + +void sub_080AD474(void) +{ + int iVar2; + u32 uVar3; + + gMenu.field_0x12++; + switch (gMenu.secret) { + case 0: + gMenu.secret = 1; + gMenu.overlayType = 0; + gMenu.transitionTimer = 0x1e; + gMenu.field_0x2 = 7; + EraseAllEntities(); + sub_080ADD30(sub_0801CFA8(0)); + gUnk_02024490 = 1; + sub_0801D7EC(2); + if (((struct_02000000*)0x2000000)->gameLanguage == 0) { + uVar3 = 3; + } + else { + uVar3 = 4; + } + LoadPalettesByPaletteGroupIndex(uVar3); + if (((struct_02000000*)0x2000000)->gameLanguage == 0) { + gScreen.controls.windowOutsideControl = 0x844; + gScreen.controls.mosaicSize = 0x909; + gScreen.bg1.unk = 0x1c09; + gScreen.bg2.unk = 0x1d02; + gScreen.affine.unk2 = 0x1e03; + gScreen.lcd.lcdControl2 |= 0x1e00; + gScreen.bg2.bg0Control = 0xff60; + } + else { + gScreen.controls.windowOutsideControl = 0x241; + gScreen.controls.mosaicSize = 0x909; + gScreen.lcd.lcdControl1 = 0x1d02; + gScreen.bg1.unk = 0x1E03; + gScreen.bg2.unk = 0x7C89; + gScreen.lcd.lcdControl2 |= 1; + gScreen.lcd.lcdControl2 |= 0x1300; + gMenu.field_0x2c = 0x10; + sub_080AD670(); + } + sub_080A3210(); + PlaySFX(3); + DoFade(6, 8); + break; + case 1: + if (gUnk_03000FD0 != 0) { + return; + } + if (((struct_02000000*)0x2000000)->gameLanguage == 0) { + sub_080AD6AC(); + } + else { + sub_080AD76C(); + } + break; + case 2: + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + gMenu.transitionTimer = 0xe10; + gMenu.secret++; + } + sub_080AD644(); + break; + default: + iVar2 = sub_080AD84C(); + if (iVar2 != 0) { + if (iVar2 == 2) { + PlaySFX(0x6a); + } + else { + iVar2 = 0; + } + IntroSetTransition(iVar2); + PlaySFX(0x80080000); + } + sub_080AD644(); + if ((gMenu.transitionTimer & 0x20) == 0) { + gUnk_03001010.field_0x8 = 0xe000; + gUnk_03001010.field_0x2 = 0x84; + sub_080ADA14(0x1ff,0); + } + } + if (gMenu.field_0x2 != ((struct_02000000*)0x2000000)->gameLanguage) { + gMenu.field_0x2 = ((struct_02000000*)0x2000000)->gameLanguage; + sub_0801D7EC(3); + } + sub_080AD89C(); + sub_0805E5C0(); + sub_080AD9B0(); +} \ No newline at end of file diff --git a/src/room.c b/src/room.c index 4f2a658b..64bf1c23 100644 --- a/src/room.c +++ b/src/room.c @@ -6,6 +6,7 @@ #include "flags.h" #include "link.h" #include "screen.h" +#include "main.h" typedef struct { u8 field_0x0[8]; @@ -37,21 +38,8 @@ typedef struct { Stats stats; } struct_02002A40; -typedef struct { - u8 interruptFlag; - u8 field_0x1; - u8 funcIndex; - u8 field_0x3; - u8 transition; - u8 field_0x5; - u8 muteAudio; - u8 field_0x8; - u8 countdown; -} Main; - extern struct_030010A0 gUnk_030010A0; extern struct_02002A40 gUnk_02002A40; -extern Main gUnk_03001000; void sub_0804B3C4(u32 arg0) { sub_0804B29C(arg0);