From d3e620e958903d3f9a919b7f3cf1c935cbdae49e Mon Sep 17 00:00:00 2001 From: tgsm Date: Thu, 26 Dec 2024 14:44:12 -0600 Subject: [PATCH 1/6] heap: Add a heap ID for the main menu app --- include/heap.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/heap.h b/include/heap.h index 972c0b8cc..957c9882e 100644 --- a/include/heap.h +++ b/include/heap.h @@ -30,6 +30,7 @@ typedef enum HeapID { HEAP_ID_CREDITS = 73, HEAP_ID_INTRO_MOVIE = 74, HEAP_ID_OV36 = 75, + HEAP_ID_MAIN_MENU = 79, HEAP_ID_OAKS_SPEECH = 80, HEAP_ID_CERTIFICATES = 82, HEAP_ID_DELETE_SAVEDATA = 86, From 70525fdd07ba825cdf319a43ce274b82a7c2c4eb Mon Sep 17 00:00:00 2001 From: tgsm Date: Mon, 13 Jan 2025 16:43:54 -0600 Subject: [PATCH 2/6] bg_window, font: Fix a couple of function prototypes --- include/bg_window.h | 2 +- include/font.h | 2 +- src/bg_window.c | 2 +- src/font.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/bg_window.h b/include/bg_window.h index bbaf66562..7355d3d06 100644 --- a/include/bg_window.h +++ b/include/bg_window.h @@ -277,6 +277,6 @@ void DoScheduledBgGpuUpdates(BgConfig *bgConfig); void ScheduleBgTilemapBufferTransfer(BgConfig *bgConfig, u8 bgId); void ScheduleSetBgPosText(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, int value); void ScheduleSetBgAffineScale(BgConfig *bgConfig, u8 bgId, enum BgPosAdjustOp op, int value); -BOOL DoesPixelAtScreenXYMatchPtrVal(BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u16 *src); +BOOL DoesPixelAtScreenXYMatchPtrVal(BgConfig *bgConfig, u8 bgId, u16 x, u16 y, u16 *src); #endif // POKEHEARTGOLD_BG_WINDOW_H diff --git a/include/font.h b/include/font.h index f36006562..d9b487803 100644 --- a/include/font.h +++ b/include/font.h @@ -19,7 +19,7 @@ BOOL FontID_String_AllCharsValid(FontID fontId, String *str0, String *str1); u8 GetFontAttribute(FontID fontId, int attr); void LoadFontPal0(enum GFPalLoadLocation location, enum GFPalSlotOffset palSlotOffset, HeapID heapId); void LoadFontPal1(enum GFPalLoadLocation location, enum GFPalSlotOffset palSlotOffset, HeapID heapId); -u32 FontID_String_GetWidthMultiline(FontID fontId, String *string, u32 letterSpacing); +u32 FontID_String_GetWidthMultiline(u32 fontId, String *string, u32 letterSpacing); u32 FontID_String_GetCenterAlignmentX(FontID fontId, String *string, u32 letterSpacing, u32 windowWidth); u32 FontID_GetGlyphWidth(FontID fontId, u16 glyph); diff --git a/src/bg_window.c b/src/bg_window.c index b63f2358d..3e9b21216 100644 --- a/src/bg_window.c +++ b/src/bg_window.c @@ -2298,7 +2298,7 @@ static void Bg_SetAffineScale(Background *bg, enum BgPosAdjustOp op, int value) } } -BOOL DoesPixelAtScreenXYMatchPtrVal(BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u16 *src) { +BOOL DoesPixelAtScreenXYMatchPtrVal(BgConfig *bgConfig, u8 bgId, u16 x, u16 y, u16 *src) { u8 *bgCharPtr; u16 tilemapIdx; u8 xPixOffs; diff --git a/src/font.c b/src/font.c index 37c9717e7..580c7cf3f 100644 --- a/src/font.c +++ b/src/font.c @@ -179,7 +179,7 @@ void LoadFontPal1(enum GFPalLoadLocation location, enum GFPalSlotOffset palSlotO GfGfxLoader_GXLoadPal(NARC_graphic_font, 8, location, palSlotOffset, 0x20, heapId); } -u32 FontID_String_GetWidthMultiline(FontID fontId, String *string, u32 letterSpacing) { +u32 FontID_String_GetWidthMultiline(u32 fontId, String *string, u32 letterSpacing) { GF_ASSERT(sFontWork->fontDataMan[fontId] != NULL); return GetStringWidthMultiline(sFontWork->fontDataMan[fontId], String_cstr(string), letterSpacing); } From b01c79559668c05316e9f1db999d845b8d3a73e1 Mon Sep 17 00:00:00 2001 From: tgsm Date: Mon, 13 Jan 2025 21:34:42 -0600 Subject: [PATCH 3/6] Start decompiling overlay 74 (main menu + other things) --- asm/overlay_74_thumb.s | 3650 +-------------------- include/application/main_menu/main_menu.h | 14 + include/overlay_36.h | 3 + main.lsf | 1 + src/application/check_savedata.c | 3 +- src/application/main_menu/main_menu.c | 1525 +++++++++ 6 files changed, 1556 insertions(+), 3640 deletions(-) create mode 100644 include/application/main_menu/main_menu.h create mode 100644 src/application/main_menu/main_menu.c diff --git a/asm/overlay_74_thumb.s b/asm/overlay_74_thumb.s index 5b8ff583c..bab43b6bb 100644 --- a/asm/overlay_74_thumb.s +++ b/asm/overlay_74_thumb.s @@ -8,3574 +8,18 @@ .public gApplication_TitleScreen .public sub_020342C0 - .text - - thumb_func_start ov74_02227060 -ov74_02227060: ; 0x02227060 - push {r4, lr} - ldr r1, _02227090 ; =gSystem - add r4, r0, #0 - ldr r2, [r1, #0x48] - ldr r0, _02227094 ; =0x00000CF3 - tst r0, r2 - beq _0222707A - mov r0, #0x6b - mov r2, #0 - lsl r0, r0, #2 - str r2, [r4, r0] - ldr r0, [r1, #0x48] - pop {r4, pc} -_0222707A: - bl System_GetTouchNew - cmp r0, #0 - beq _0222708C - mov r1, #0x6b - mov r0, #1 - lsl r1, r1, #2 - str r0, [r4, r1] - pop {r4, pc} -_0222708C: - mov r0, #0 - pop {r4, pc} - .balign 4, 0 -_02227090: .word gSystem -_02227094: .word 0x00000CF3 - thumb_func_end ov74_02227060 - - thumb_func_start ov74_02227098 -ov74_02227098: ; 0x02227098 - push {r3, r4} - mov r3, #0 - add r4, r3, #0 -_0222709E: - add r2, r0, #0 - add r2, #0xec - ldr r2, [r2] - cmp r2, #0 - beq _022270B6 - add r2, r4, #0 - add r4, r4, #1 - cmp r2, r1 - bne _022270B6 - add r0, r3, #0 - pop {r3, r4} - bx lr -_022270B6: - add r3, r3, #1 - add r0, r0, #4 - cmp r3, #9 - blo _0222709E - mov r0, #0 - pop {r3, r4} - bx lr - thumb_func_end ov74_02227098 - - thumb_func_start ov74_022270C4 -ov74_022270C4: ; 0x022270C4 - push {r3, r4, r5, lr} - add r5, r0, #0 - add r4, r1, #0 - cmp r2, #0 - ldr r0, _02227158 ; =SEQ_SE_DP_SELECT - bne _02227106 - bl PlaySE - add r0, r5, #0 - add r0, #0x54 - ldrh r0, [r0] - lsl r0, r0, #2 - add r0, r5, r0 - add r0, #0xec - ldr r0, [r0] - str r0, [r5, #0x58] - cmp r0, #6 - bne _02227114 - bl CTRDG_IsPulledOut - cmp r0, #1 - bne _02227114 - mov r0, #0x4f - lsl r0, r0, #2 - ldr r0, [r5, r0] - cmp r0, #0xc - beq _022270FE - bl sub_02038D64 -_022270FE: - mov r0, #0x4f - bl ShowGBACartRemovedError - b _02227114 -_02227106: - bl PlaySE - mov r0, #0 - str r0, [r5, #0x58] - mov r0, #1 - bl ov74_02235390 -_02227114: - ldr r0, [r5, #0x58] - cmp r0, #2 - bne _0222712E - ldr r1, [r5, #0x40] - mov r0, #0x80 - orr r1, r0 - str r1, [r5, #0x40] - mov r1, #1 - add r0, #0xc8 - str r1, [r5, r0] - mov r0, #6 - str r0, [r4] - b _02227144 -_0222712E: - cmp r0, #7 - bne _02227138 - mov r0, #1 - bl ov74_02235390 -_02227138: - mov r0, #0 - mov r1, #7 - add r2, r4, #0 - mov r3, #8 - bl ov74_0223539C -_02227144: - mov r0, #0x4f - lsl r0, r0, #2 - ldr r1, [r5, r0] - cmp r1, #0xd - bne _02227152 - mov r1, #0xe - str r1, [r5, r0] -_02227152: - mov r0, #1 - pop {r3, r4, r5, pc} - nop -_02227158: .word SEQ_SE_DP_SELECT - thumb_func_end ov74_022270C4 - - thumb_func_start ov74_0222715C -ov74_0222715C: ; 0x0222715C - push {r3, r4} - mov r4, #0 - add r3, r4, #0 - cmp r1, #0 - ble _0222717A -_02227166: - add r2, r0, #0 - add r2, #0xec - ldr r2, [r2] - cmp r2, #0 - beq _02227172 - add r4, r4, #1 -_02227172: - add r3, r3, #1 - add r0, r0, #4 - cmp r3, r1 - blt _02227166 -_0222717A: - add r0, r4, #0 - pop {r3, r4} - bx lr - thumb_func_end ov74_0222715C - - thumb_func_start ov74_02227180 -ov74_02227180: ; 0x02227180 - push {r3, r4, r5, r6, r7, lr} - add r3, r1, #0 - ldr r1, _02227238 ; =gSystem - add r5, r0, #0 - ldr r2, [r1, #0x48] - ldr r1, _0222723C ; =0x00000CF3 - mov r4, #0 - tst r1, r2 - beq _022271AA - mov r7, #0x6b - lsl r7, r7, #2 - ldr r1, [r5, r7] - cmp r1, #1 - bne _022271AA - str r4, [r5, r7] - add r5, #0x54 - ldrh r1, [r5] - bl ov74_0222841C - add r0, r4, #0 - pop {r3, r4, r5, r6, r7, pc} -_022271AA: - mov r0, #1 - tst r0, r2 - beq _022271BC - add r0, r5, #0 - add r1, r3, #0 - mov r2, #0 - bl ov74_022270C4 - pop {r3, r4, r5, r6, r7, pc} -_022271BC: - mov r0, #2 - tst r0, r2 - beq _022271CE - add r0, r5, #0 - add r1, r3, #0 - mov r2, #1 - bl ov74_022270C4 - pop {r3, r4, r5, r6, r7, pc} -_022271CE: - ldr r0, [r5, #0x48] - cmp r0, #0 - beq _022271D8 - mov r0, #0 - pop {r3, r4, r5, r6, r7, pc} -_022271D8: - add r0, r5, #0 - add r0, #0x54 - ldrh r7, [r0] - mov r1, #0x40 - add r0, r2, #0 - tst r0, r1 - beq _02227210 - add r0, r5, #0 - sub r1, #0x41 - bl ov74_02228698 - cmp r0, #0 - beq _02227226 - add r0, r5, #0 - add r1, r7, #0 - bl ov74_0222715C - add r6, r0, #0 - cmp r6, #7 - bne _02227206 - mov r6, #3 - mov r4, #1 - b _02227226 -_02227206: - cmp r6, #3 - bne _02227226 - mov r6, #0 - mov r4, #1 - b _02227226 -_02227210: - mov r0, #0x80 - tst r0, r2 - beq _02227226 - add r0, r5, #0 - mov r1, #1 - bl ov74_02228698 - add r4, r0, #0 - add r0, r5, #0 - add r0, #0x54 - ldrh r6, [r0] -_02227226: - cmp r4, #0 - beq _02227232 - add r0, r5, #0 - add r1, r6, #0 - bl ov74_022286F8 -_02227232: - mov r0, #0 - pop {r3, r4, r5, r6, r7, pc} - nop -_02227238: .word gSystem -_0222723C: .word 0x00000CF3 - thumb_func_end ov74_02227180 - - thumb_func_start ov74_02227240 -ov74_02227240: ; 0x02227240 - push {r4, r5, r6, r7, lr} - sub sp, #0xc - mov r6, #0 - add r5, r0, #0 - str r1, [sp, #4] - add r4, r2, #0 - mvn r6, r6 - mov r7, #0 - bl System_GetTouchNew - cmp r0, #0 - bne _0222725E - add sp, #0xc - add r0, r7, #0 - pop {r4, r5, r6, r7, pc} -_0222725E: - ldr r0, [r5, #0x48] - cmp r0, #0 - bne _02227276 - mov r0, #0x6d - lsl r0, r0, #2 - ldr r0, [r5, r0] - cmp r0, #0 - bne _02227276 - ldr r0, _0222741C ; =_0223B2C0 - bl TouchscreenHitbox_FindRectAtTouchNew - add r6, r0, #0 -_02227276: - cmp r6, #0 - bne _022272DA - mov r0, #0x1a - lsl r0, r0, #4 - ldr r0, [r5, r0] - bl Sprite_GetAnimationNumber - lsr r0, r0, #1 - beq _022272DA - mov r0, #0x1a - lsl r0, r0, #4 - ldr r0, [r5, r0] - mov r1, #1 - bl Sprite_SetAnimActiveFlag - mov r0, #0x1a - lsl r0, r0, #4 - ldr r0, [r5, r0] - bl Sprite_ResetAnimCtrlState - add r0, r5, #0 - add r0, #0x54 - ldrh r0, [r0] - cmp r0, #3 - bls _022272C6 - mov r0, #0x4e - lsl r0, r0, #2 - ldr r1, [r5, r0] - mov r0, #3 - lsl r0, r0, #0x12 - cmp r1, r0 - ble _022272C6 - add r0, r5, #0 - mov r1, #3 - bl ov74_02227098 - add r1, r5, #0 - add r1, #0x54 - strh r0, [r1] - b _022272D4 -_022272C6: - add r0, r5, #0 - mov r1, #0 - bl ov74_02227098 - add r1, r5, #0 - add r1, #0x54 - strh r0, [r1] -_022272D4: - mov r7, #1 - str r7, [r4] - b _02227328 -_022272DA: - cmp r6, #1 - bne _02227328 - mov r0, #0x69 - lsl r0, r0, #2 - ldr r0, [r5, r0] - bl Sprite_GetAnimationNumber - lsr r0, r0, #1 - beq _02227328 - mov r0, #0x69 - lsl r0, r0, #2 - ldr r0, [r5, r0] - mov r1, #1 - bl Sprite_SetAnimActiveFlag - mov r0, #0x69 - lsl r0, r0, #2 - ldr r0, [r5, r0] - bl Sprite_ResetAnimCtrlState - add r0, r5, #0 - add r0, #0x54 - ldrh r0, [r0] - cmp r0, #3 - bhs _02227316 - add r0, r5, #0 - mov r1, #3 - bl ov74_02227098 - b _0222731E -_02227316: - add r0, r5, #0 - mov r1, #7 - bl ov74_02227098 -_0222731E: - add r1, r5, #0 - add r1, #0x54 - strh r0, [r1] - mov r7, #1 - str r7, [r4] -_02227328: - cmp r7, #0 - beq _0222735A - mov r0, #0x6b - mov r1, #1 - lsl r0, r0, #2 - str r1, [r5, r0] - add r1, r5, #0 - add r1, #0x54 - ldrh r1, [r1] - add r0, r5, #0 - bl ov74_0222841C - add r1, r5, #0 - add r1, #0x54 - ldrh r1, [r1] - add r0, r5, #0 - bl ov74_022286F8 - mov r0, #0x6d - mov r1, #6 - lsl r0, r0, #2 - str r1, [r5, r0] - add sp, #0xc - mov r0, #0 - pop {r4, r5, r6, r7, pc} -_0222735A: - ldr r1, _02227420 ; =0x0000FFFE - add r0, sp, #8 - strh r1, [r0] - mov r0, #0x4e - lsl r0, r0, #2 - ldr r1, [r5, r0] - ldr r2, _02227424 ; =gSystem + 0x40 - asr r6, r1, #0xb - lsr r6, r6, #0x14 - add r6, r1, r6 - ldrh r3, [r2, #0x22] - asr r1, r6, #0xc - add r0, #0xc8 - add r1, r3, r1 - lsl r1, r1, #0x10 - lsr r3, r1, #0x10 - cmp r3, r0 - blo _02227384 - add sp, #0xc - mov r0, #0 - pop {r4, r5, r6, r7, pc} -_02227384: - add r0, sp, #8 - str r0, [sp] - ldrh r2, [r2, #0x20] - ldr r0, [r5] - mov r1, #0 - bl DoesPixelAtScreenXYMatchPtrVal - cmp r0, #0 - bne _0222739C - add sp, #0xc - mov r0, #0 - pop {r4, r5, r6, r7, pc} -_0222739C: - mov r0, #1 - str r0, [r4] - ldr r0, _02227424 ; =gSystem + 0x40 - mov r1, #0x30 - ldrh r0, [r0, #0x22] - bl _s32_div_f - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 - mov r0, #0x4e - lsl r0, r0, #2 - ldr r2, [r5, r0] - cmp r2, #0 - bne _022273C4 - cmp r1, #0 - beq _022273DA - sub r0, r1, #1 - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 - b _022273DA -_022273C4: - mov r0, #3 - lsl r0, r0, #0x12 - cmp r2, r0 - bne _022273D4 - add r0, r1, #3 - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 - b _022273DA -_022273D4: - add r0, r1, #7 - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 -_022273DA: - mov r0, #0x1b - lsl r0, r0, #4 - ldr r0, [r5, r0] - cmp r1, r0 - blt _022273EA - add sp, #0xc - mov r0, #0 - pop {r4, r5, r6, r7, pc} -_022273EA: - lsl r1, r1, #0x18 - add r0, r5, #0 - lsr r1, r1, #0x18 - bl ov74_02227098 - add r1, r5, #0 - add r1, #0x54 - strh r0, [r1] - mov r0, #0x6b - mov r1, #1 - lsl r0, r0, #2 - str r1, [r5, r0] - add r1, r5, #0 - add r1, #0x54 - ldrh r1, [r1] - add r0, r5, #0 - bl ov74_0222841C - ldr r1, [sp, #4] - add r0, r5, #0 - mov r2, #0 - bl ov74_022270C4 - add sp, #0xc - pop {r4, r5, r6, r7, pc} - .balign 4, 0 -_0222741C: .word _0223B2C0 -_02227420: .word 0x0000FFFE -_02227424: .word gSystem + 0x40 - thumb_func_end ov74_02227240 - - thumb_func_start ov74_02227428 -ov74_02227428: ; 0x02227428 - push {r3, r4, r5, r6, lr} - sub sp, #4 - mov r2, #0 - str r2, [sp] - add r2, sp, #0 - add r5, r0, #0 - add r4, r1, #0 - bl ov74_02227240 - add r6, r0, #0 - ldr r0, [sp] - cmp r0, #0 - beq _02227460 - mov r0, #0x6b - mov r1, #1 - lsl r0, r0, #2 - str r1, [r5, r0] - add r0, #8 - ldr r0, [r5, r0] - cmp r0, #6 - beq _0222745A - add r0, r5, #0 - mov r1, #0xff - bl ov74_0222841C -_0222745A: - add sp, #4 - add r0, r6, #0 - pop {r3, r4, r5, r6, pc} -_02227460: - add r0, r5, #0 - add r1, r4, #0 - bl ov74_02227180 - add sp, #4 - pop {r3, r4, r5, r6, pc} - thumb_func_end ov74_02227428 - - thumb_func_start ov74_0222746C -ov74_0222746C: ; 0x0222746C - push {r4, r5, r6, lr} - sub sp, #8 - add r5, r0, #0 - add r4, r1, #0 - bl System_GetTouchNew - cmp r0, #0 - bne _02227482 - add sp, #8 - mov r0, #0 - pop {r4, r5, r6, pc} -_02227482: - ldr r0, _022274C8 ; =_0223B2CC - bl TouchscreenHitbox_FindRectAtTouchNew - add r6, r0, #0 - mov r0, #0 - mvn r0, r0 - cmp r6, r0 - bne _02227498 - add sp, #8 - mov r0, #0 - pop {r4, r5, r6, pc} -_02227498: - ldr r1, _022274CC ; =0x0000FFFE - add r0, sp, #4 - strh r1, [r0] - add r0, sp, #4 - str r0, [sp] - ldr r3, _022274D0 ; =gSystem + 0x40 - ldr r0, [r5] - ldrh r2, [r3, #0x20] - ldrh r3, [r3, #0x22] - mov r1, #1 - bl DoesPixelAtScreenXYMatchPtrVal - cmp r0, #0 - bne _022274BA - add sp, #8 - mov r0, #0 - pop {r4, r5, r6, pc} -_022274BA: - mov r0, #1 - str r0, [r4] - cmp r6, #0 - beq _022274C4 - mov r0, #2 -_022274C4: - add sp, #8 - pop {r4, r5, r6, pc} - .balign 4, 0 -_022274C8: .word _0223B2CC -_022274CC: .word 0x0000FFFE -_022274D0: .word gSystem + 0x40 - thumb_func_end ov74_0222746C - - thumb_func_start ov74_022274D4 -ov74_022274D4: ; 0x022274D4 - push {r3, r4, r5, lr} - mov r1, #0 - str r1, [sp] - add r1, sp, #0 - add r4, r0, #0 - bl ov74_0222746C - add r5, r0, #0 - ldr r0, [sp] - cmp r0, #0 - beq _022274FE - mov r0, #0x6b - mov r1, #1 - lsl r0, r0, #2 - str r1, [r4, r0] - add r0, r4, #0 - mov r1, #0xff - bl ov74_02228548 - add r0, r5, #0 - pop {r3, r4, r5, pc} -_022274FE: - ldr r0, _02227574 ; =gSystem - ldr r1, [r0, #0x48] - cmp r1, #0 - bne _0222750A - mov r0, #0 - pop {r3, r4, r5, pc} -_0222750A: - ldr r0, _02227578 ; =0x00000CF3 - tst r0, r1 - beq _0222752C - mov r0, #0x6b - lsl r0, r0, #2 - ldr r2, [r4, r0] - cmp r2, #1 - bne _0222752C - mov r1, #0 - str r1, [r4, r0] - add r0, r4, #0 - add r4, #0x56 - ldrh r1, [r4] - bl ov74_02228548 - mov r0, #0 - pop {r3, r4, r5, pc} -_0222752C: - mov r0, #0xc0 - tst r0, r1 - beq _02227556 - add r0, r4, #0 - add r0, #0x56 - ldrh r1, [r0] - mov r0, #1 - eor r1, r0 - add r0, r4, #0 - add r0, #0x56 - strh r1, [r0] - add r0, r4, #0 - add r4, #0x56 - ldrh r1, [r4] - bl ov74_02228548 - ldr r0, _0222757C ; =SEQ_SE_DP_SELECT - bl PlaySE - mov r0, #0 - pop {r3, r4, r5, pc} -_02227556: - mov r0, #1 - add r2, r1, #0 - tst r2, r0 - beq _0222756A - add r4, #0x56 - ldrh r1, [r4] - cmp r1, #0 - beq _02227572 - mov r0, #2 - pop {r3, r4, r5, pc} -_0222756A: - mov r0, #2 - tst r1, r0 - bne _02227572 - mov r0, #0 -_02227572: - pop {r3, r4, r5, pc} - .balign 4, 0 -_02227574: .word gSystem -_02227578: .word 0x00000CF3 -_0222757C: .word SEQ_SE_DP_SELECT - thumb_func_end ov74_022274D4 - - thumb_func_start ov74_02227580 -ov74_02227580: ; 0x02227580 - mov r0, #0 - bx lr - thumb_func_end ov74_02227580 - - thumb_func_start ov74_02227584 -ov74_02227584: ; 0x02227584 - push {r4, r5, r6, r7, lr} - sub sp, #0x5c - add r5, r0, #0 - mov r0, #0x19 - lsl r0, r0, #4 - add r0, r5, r0 - bl WindowIsInUse - cmp r0, #0 - bne _022275FC - mov r1, #0x63 - mov r0, #0 - add r3, r5, #0 - lsl r1, r1, #2 -_022275A0: - ldr r2, [r3, r1] - cmp r2, #1 - bne _022275F2 - lsl r1, r0, #2 - add r3, r5, r1 - mov r1, #0x63 - add r6, r0, #0 - mov r2, #0 - lsl r1, r1, #2 - str r2, [r3, r1] - ldr r0, _02227630 ; =0x000003F7 - mov r3, #0x1c - str r0, [sp] - mov r0, #2 - str r0, [sp, #4] - add r1, r1, #4 - ldr r7, _02227634 ; =ov74_0223BBD4 - mul r6, r3 - add r4, r7, r6 - ldr r3, [r4, #0x10] - add r0, sp, #8 - add r1, r5, r1 - bl ov74_02235414 - ldr r1, [r4, #8] - ldr r2, [r4, #0xc] - add r0, sp, #8 - mov r3, #1 - bl ov74_02235464 - ldr r0, [r4, #0x14] - add r1, sp, #8 - str r0, [sp] - ldr r0, [r5] - ldr r2, [r7, r6] - ldr r3, [r4, #4] - bl ov74_02235568 - add sp, #0x5c - mov r0, #1 - pop {r4, r5, r6, r7, pc} -_022275F2: - add r0, r0, #1 - add r3, r3, #4 - cmp r0, #1 - blt _022275A0 - b _0222762A -_022275FC: - add r0, r5, #0 - bl ov74_02227060 - mov r1, #3 - tst r0, r1 - beq _02227624 - ldr r0, _02227638 ; =SEQ_SE_DP_SELECT - bl PlaySE - mov r0, #0x19 - lsl r0, r0, #4 - add r0, r5, r0 - mov r1, #0 - bl sub_0200E5D4 - mov r0, #0x19 - lsl r0, r0, #4 - add r0, r5, r0 - bl RemoveWindow -_02227624: - add sp, #0x5c - mov r0, #1 - pop {r4, r5, r6, r7, pc} -_0222762A: - mov r0, #0 - add sp, #0x5c - pop {r4, r5, r6, r7, pc} - .balign 4, 0 -_02227630: .word 0x000003F7 -_02227634: .word ov74_0223BBD4 -_02227638: .word SEQ_SE_DP_SELECT - thumb_func_end ov74_02227584 - - thumb_func_start ov74_0222763C -ov74_0222763C: ; 0x0222763C - push {r3, r4, r5, lr} - add r5, r0, #0 - mov r0, #0 - bl PmAgbCartridgeGetOffsets - mov r4, #0 - str r4, [r5, #0x24] - cmp r0, #0 - bne _022276A6 - bl PmAgbCartridge_GetVersionInternal - cmp r0, #4 - bhi _0222767E - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_02227662: ; jump table - .short _0222766C - _02227662 - 2 ; case 0 - .short _02227670 - _02227662 - 2 ; case 1 - .short _02227674 - _02227662 - 2 ; case 2 - .short _02227678 - _02227662 - 2 ; case 3 - .short _0222767C - _02227662 - 2 ; case 4 -_0222766C: - mov r4, #VERSION_RUBY - b _0222767E -_02227670: - mov r4, #VERSION_SAPPHIRE - b _0222767E -_02227674: - mov r4, #VERSION_LEAF_GREEN - b _0222767E -_02227678: - mov r4, #VERSION_FIRE_RED - b _0222767E -_0222767C: - mov r4, #VERSION_EMERALD -_0222767E: - add r0, r4, #0 - bl sub_0201A4B0 - ldr r0, [r5, #8] - bl Pokedex_GetNatDexFlag - cmp r0, #0 - beq _022276A6 - bl PmAgbCartridge_GetLanguage - ldr r1, _022276A8 ; =gGameLanguage - ldrb r1, [r1] - cmp r1, r0 - bne _022276A6 - bl PmAgbCartridge_GetVersionInternal - add r0, r0, #1 - str r0, [r5, #0x24] - bl ov74_02236074 -_022276A6: - pop {r3, r4, r5, pc} - .balign 4, 0 -_022276A8: .word gGameLanguage - thumb_func_end ov74_0222763C - - thumb_func_start ov74_022276AC -ov74_022276AC: ; 0x022276AC - push {r4, lr} - mov r1, #0x4f - add r4, r0, #0 - lsl r1, r1, #2 - ldr r0, [r4, r1] - sub r0, #0xa - cmp r0, #4 - bhi _0222779A - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_022276C8: ; jump table - .short _022276D2 - _022276C8 - 2 ; case 0 - .short _022276D8 - _022276C8 - 2 ; case 1 - .short _0222779A - _022276C8 - 2 ; case 2 - .short _0222770A - _022276C8 - 2 ; case 3 - .short _0222778E - _022276C8 - 2 ; case 4 -_022276D2: - mov r0, #0xb - str r0, [r4, r1] - pop {r4, pc} -_022276D8: - ldr r0, [r4, #4] - bl sub_02038D28 - mov r1, #0x78 - add r0, r1, #0 - add r0, #0xc8 - str r1, [r4, r0] - mov r0, #0xd - add r1, #0xc4 - str r0, [r4, r1] - mov r0, #0 - str r0, [r4, #0x40] - ldr r0, [r4, #0x14] - bl SaveMysteryGift_TestFlagx7FF - cmp r0, #1 - bne _0222779A - ldr r1, [r4, #0x40] - mov r0, #1 - orr r1, r0 - str r1, [r4, #0x40] - ldr r1, [r4, #0x44] - orr r0, r1 - str r0, [r4, #0x44] - pop {r4, pc} -_0222770A: - add r1, #0xc - ldr r0, [r4, r1] - cmp r0, #0 - bne _0222779A - bl sub_02038D80 - ldr r1, [r4, #0x40] - bic r0, r1 - beq _02227770 - mov r2, #0x51 - lsl r2, r2, #2 - ldr r3, [r4, r2] - cmp r3, #0xf - bne _02227770 - add r2, r2, #4 - ldr r2, [r4, r2] - cmp r2, #0 - bne _02227770 - cmp r1, r0 - beq _02227770 - mov r2, #1 - add r1, r0, #0 - str r2, [r4, #0x48] - tst r1, r2 - beq _02227740 - str r2, [r4, #0x34] - add r0, r2, #0 -_02227740: - mov r1, #2 - add r2, r0, #0 - tst r2, r1 - beq _0222774E - mov r0, #1 - str r0, [r4, #0x2c] - add r0, r1, #0 -_0222774E: - mov r1, #4 - add r2, r0, #0 - tst r2, r1 - beq _0222775C - mov r0, #1 - str r0, [r4, #0x30] - add r0, r1, #0 -_0222775C: - mov r1, #3 - tst r1, r0 - beq _0222776A - mov r1, #0x62 - mov r2, #1 - lsl r1, r1, #2 - str r2, [r4, r1] -_0222776A: - ldr r1, [r4, #0x40] - orr r0, r1 - str r0, [r4, #0x40] -_02227770: - mov r0, #5 - lsl r0, r0, #6 - ldr r1, [r4, r0] - sub r1, r1, #1 - str r1, [r4, r0] - ldr r0, [r4, r0] - cmp r0, #0 - bne _0222779A - bl sub_02038D64 - mov r0, #0x4f - mov r1, #0xc - lsl r0, r0, #2 - str r1, [r4, r0] - pop {r4, pc} -_0222778E: - bl sub_02038D64 - mov r0, #0x4f - mov r1, #0xc - lsl r0, r0, #2 - str r1, [r4, r0] -_0222779A: - pop {r4, pc} - thumb_func_end ov74_022276AC - - thumb_func_start ov74_0222779C -ov74_0222779C: ; 0x0222779C - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x70 - mov r1, #0x51 - add r4, r0, #0 - lsl r1, r1, #2 - ldr r2, [r4, r1] - sub r2, #0xf - cmp r2, #5 - bls _022277B0 - b _02227ABE -_022277B0: - add r2, r2, r2 - add r2, pc - ldrh r2, [r2, #6] - lsl r2, r2, #0x10 - asr r2, r2, #0x10 - add pc, r2 -_022277BC: ; jump table - .short _022277C8 - _022277BC - 2 ; case 0 - .short _022277F0 - _022277BC - 2 ; case 1 - .short _0222782E - _022277BC - 2 ; case 2 - .short _022279CA - _022277BC - 2 ; case 3 - .short _02227A26 - _022277BC - 2 ; case 4 - .short _02227A9E - _022277BC - 2 ; case 5 -_022277C8: - add r0, r1, #4 - ldr r0, [r4, r0] - cmp r0, #0 - bne _022277D6 - add sp, #0x70 - mov r0, #0 - pop {r3, r4, r5, r6, r7, pc} -_022277D6: - add r0, r1, #4 - ldr r0, [r4, r0] - sub r2, r0, #1 - add r0, r1, #4 - str r2, [r4, r0] - ldr r0, [r4, r0] - cmp r0, #0 - bne _022277EA - mov r0, #0x10 - str r0, [r4, r1] -_022277EA: - add sp, #0x70 - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} -_022277F0: - mov r0, #0 - str r0, [sp] - mov r0, #0x4f - str r0, [sp, #4] - ldr r0, [r4] - ldr r2, _02227AC4 ; =0x000003F7 - mov r1, #1 - mov r3, #2 - bl LoadUserFrameGfx1 - mov r1, #1 - str r1, [sp] - mov r0, #0x4f - str r0, [sp, #4] - ldr r0, [r4] - ldr r2, _02227AC8 ; =0x000003EE - mov r3, #3 - bl LoadUserFrameGfx1 - ldr r0, [r4] - mov r1, #1 - bl BgClearTilemapBufferAndCommit - ldr r1, _02227ACC ; =0x00006B5A - ldr r0, _02227AD0 ; =0x05000042 - strh r1, [r0] - mov r0, #0x51 - mov r1, #0x11 - lsl r0, r0, #2 - str r1, [r4, r0] - b _02227ABE -_0222782E: - ldr r0, _02227AC4 ; =0x000003F7 - add r1, #0x10 - str r0, [sp] - mov r0, #2 - str r0, [sp, #4] - add r0, sp, #0x1c - add r1, r4, r1 - mov r2, #0 - mov r3, #0x11 - bl ov74_02235414 - ldr r1, [r4, #0x40] - ldr r0, [r4, #0x44] - add r6, r1, #0 - mvn r0, r0 - and r6, r0 - mov r0, #1 - add r1, r6, #0 - tst r1, r0 - beq _02227864 - ldr r1, [r4, #0x38] - tst r0, r1 - beq _02227860 - ldr r5, _02227AD4 ; =ov74_0223BC30 - b _022278BC -_02227860: - ldr r5, _02227AD8 ; =ov74_0223BC44 - b _022278BC -_02227864: - mov r2, #2 - add r1, r6, #0 - tst r1, r2 - beq _0222787A - ldr r0, [r4, #0x38] - tst r0, r2 - beq _02227876 - ldr r5, _02227ADC ; =ov74_0223BC58 - b _022278BC -_02227876: - ldr r5, _02227AE0 ; =ov74_0223BC6C - b _022278BC -_0222787A: - mov r1, #0x80 - tst r1, r6 - beq _022278BC - str r2, [sp, #0x1c] - ldr r5, _02227AE4 ; =ov74_0223BC80 - ldr r2, [sp, #0x50] - mov r1, #0x1b - mov r3, #0x4f - bl NewMsgDataFromNarc - ldr r1, [r5, #0x10] - add r7, r0, #0 - bl NewString_ReadMsgData - str r0, [sp, #0x10] - ldr r0, [sp, #0x5c] - ldr r1, [sp, #0x10] - mov r2, #0 - bl FontID_String_GetWidthMultiline - ldr r1, [r5, #8] - lsl r1, r1, #3 - sub r0, r1, r0 - lsr r0, r0, #1 - str r0, [sp, #0x3c] - ldr r0, [sp, #0x10] - bl String_Delete - add r0, r7, #0 - bl DestroyMsgData - mov r0, #4 - str r0, [sp, #0x40] -_022278BC: - ldr r1, [r5, #8] - ldr r2, [r5, #0xc] - add r0, sp, #0x1c - mov r3, #0x91 - bl ov74_02235464 - mov r0, #1 - str r0, [sp, #0x48] - ldr r0, [r5, #0x10] - add r1, sp, #0x1c - str r0, [sp] - ldr r0, [r4] - ldr r2, [r5] - ldr r3, [r5, #4] - bl ov74_02235568 - ldr r0, [sp, #0x2c] - bl GetWindowX - add r7, r0, #0 - ldr r0, [sp, #0x2c] - bl GetWindowY - str r0, [sp, #0x14] - ldr r0, [sp, #0x2c] - bl GetWindowWidth - add r5, r0, #0 - ldr r0, [sp, #0x2c] - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #0 - str r0, [sp, #8] - ldr r0, [r4] - ldr r3, [sp, #0x14] - mov r1, #1 - add r2, r7, #0 - bl BgTilemapRectChangePalette - mov r1, #0x80 - add r0, r6, #0 - tst r0, r1 - beq _0222799C - mov r0, #3 - tst r0, r6 - bne _0222799C - add r1, #0xe4 - add r0, r4, r1 - mov r6, #0 - str r0, [sp, #0xc] - mov r7, #1 -_02227926: - ldr r0, _02227AC4 ; =0x000003F7 - ldr r1, [sp, #0xc] - str r0, [sp] - mov r0, #2 - str r0, [sp, #4] - add r0, sp, #0x1c - mov r2, #0 - mov r3, #0x11 - bl ov74_02235414 - add r1, r6, #5 - mov r0, #0x14 - mul r0, r1 - ldr r1, _02227AD4 ; =ov74_0223BC30 - str r0, [sp, #0x18] - add r5, r1, r0 - mov r0, #4 - str r0, [sp, #0x40] - ldr r1, [r5, #8] - ldr r2, [r5, #0xc] - add r0, sp, #0x1c - add r3, r7, #0 - bl ov74_02235464 - mov r0, #1 - str r0, [sp, #0x48] - ldr r0, [r5, #0x10] - ldr r3, _02227AD4 ; =ov74_0223BC30 - str r0, [sp] - ldr r2, [sp, #0x18] - ldr r0, [r4] - ldr r2, [r3, r2] - ldr r3, [r5, #4] - add r1, sp, #0x1c - bl ov74_02235568 - ldr r0, [sp, #0xc] - add r6, r6, #1 - add r0, #0x10 - add r7, #0x48 - str r0, [sp, #0xc] - cmp r6, #2 - blt _02227926 - add r0, r4, #0 - mov r1, #0 - add r0, #0x56 - strh r1, [r0] - add r0, r4, #0 - sub r1, r1, #1 - bl ov74_02228548 - mov r0, #0x51 - mov r1, #0x13 - lsl r0, r0, #2 - str r1, [r4, r0] - mov r1, #0x1e - add r0, #8 - str r1, [r4, r0] - b _022279B0 -_0222799C: - ldr r0, [r4, #0x44] - mov r1, #0x12 - orr r0, r6 - str r0, [r4, #0x44] - mov r0, #0x51 - lsl r0, r0, #2 - str r1, [r4, r0] - mov r1, #0x1e - add r0, #8 - str r1, [r4, r0] -_022279B0: - mov r0, #1 - mov r1, #0 - bl GfGfx_EngineATogglePlanes - mov r0, #4 - mov r1, #0 - bl GfGfx_EngineATogglePlanes - mov r0, #2 - mov r1, #1 - bl GfGfx_EngineATogglePlanes - b _02227ABE -_022279CA: - add r2, r1, #0 - add r2, #8 - ldr r2, [r4, r2] - cmp r2, #0 - beq _022279E2 - add r0, r1, #0 - add r0, #8 - ldr r0, [r4, r0] - add r1, #8 - sub r0, r0, #1 - str r0, [r4, r1] - b _02227ABE -_022279E2: - add r1, #0x68 - ldr r5, [r4, r1] - bl ov74_02227060 - add r6, r0, #0 - mov r0, #3 - tst r0, r6 - beq _02227ABE - mov r0, #0x6b - lsl r0, r0, #2 - ldr r0, [r4, r0] - cmp r5, r0 - beq _02227A08 - add r1, r4, #0 - add r1, #0x54 - ldrh r1, [r1] - add r0, r4, #0 - bl ov74_0222841C -_02227A08: - mov r0, #0x55 - lsl r0, r0, #2 - add r0, r4, r0 - bl RemoveWindow - mov r0, #0x51 - mov r1, #0x14 - lsl r0, r0, #2 - str r1, [r4, r0] - add r0, #0xc - str r6, [r4, r0] - ldr r0, _02227AE8 ; =SEQ_SE_DP_SELECT - bl PlaySE - b _02227ABE -_02227A26: - add r2, r1, #0 - add r2, #8 - ldr r2, [r4, r2] - cmp r2, #0 - beq _02227A4E - add r2, r1, #0 - add r2, #8 - ldr r2, [r4, r2] - sub r3, r2, #1 - add r2, r1, #0 - add r2, #8 - str r3, [r4, r2] - add r1, #8 - ldr r1, [r4, r1] - cmp r1, #0 - bne _02227ABE - mov r1, #0 - bl ov74_02228548 - b _02227ABE -_02227A4E: - bl ov74_022274D4 - add r5, r0, #0 - add r0, r4, #0 - bl ov74_022288C4 - mov r0, #3 - tst r0, r5 - beq _02227ABE - mov r0, #0x55 - lsl r0, r0, #2 - add r0, r4, r0 - bl RemoveWindow - mov r0, #0x59 - lsl r0, r0, #2 - add r0, r4, r0 - bl RemoveWindow - mov r0, #0x5d - lsl r0, r0, #2 - add r0, r4, r0 - bl RemoveWindow - add r1, r4, #0 - add r1, #0x54 - ldrh r1, [r1] - add r0, r4, #0 - bl ov74_0222841C - mov r0, #0x51 - mov r1, #0x14 - lsl r0, r0, #2 - str r1, [r4, r0] - add r0, #0xc - str r5, [r4, r0] - ldr r0, _02227AE8 ; =SEQ_SE_DP_SELECT - bl PlaySE - b _02227ABE -_02227A9E: - mov r0, #1 - add r1, r0, #0 - bl GfGfx_EngineATogglePlanes - mov r0, #4 - mov r1, #1 - bl GfGfx_EngineATogglePlanes - mov r0, #2 - mov r1, #0 - bl GfGfx_EngineATogglePlanes - mov r0, #0x51 - mov r1, #0xf - lsl r0, r0, #2 - str r1, [r4, r0] -_02227ABE: - mov r0, #1 - add sp, #0x70 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_02227AC4: .word 0x000003F7 -_02227AC8: .word 0x000003EE -_02227ACC: .word 0x00006B5A -_02227AD0: .word 0x05000042 -_02227AD4: .word ov74_0223BC30 -_02227AD8: .word ov74_0223BC44 -_02227ADC: .word ov74_0223BC58 -_02227AE0: .word ov74_0223BC6C -_02227AE4: .word ov74_0223BC80 -_02227AE8: .word SEQ_SE_DP_SELECT - thumb_func_end ov74_0222779C - - thumb_func_start ov74_02227AEC -ov74_02227AEC: ; 0x02227AEC - push {r3, r4, r5, lr} - add r4, r0, #0 - mov r0, #0x4e - lsl r0, r0, #2 - ldr r1, [r4, r0] - sub r0, r0, #4 - ldr r0, [r4, r0] - cmp r0, r1 - beq _02227B74 - sub r1, r1, r0 - asr r0, r1, #1 - lsr r0, r0, #0x1e - add r0, r1, r0 - asr r0, r0, #2 - asr r2, r0, #0x1f - add r1, r0, #0 - eor r1, r2 - sub r2, r1, r2 - mov r1, #3 - lsl r1, r1, #0xe - cmp r2, r1 - ble _02227B22 - cmp r0, #0 - ble _02227B20 - add r0, r1, #0 - b _02227B22 -_02227B20: - ldr r0, _02227B78 ; =0xFFFF4000 -_02227B22: - mov r1, #0x4d - lsl r1, r1, #2 - ldr r2, [r4, r1] - add r0, r2, r0 - str r0, [r4, r1] - add r0, r1, #4 - ldr r0, [r4, r0] - ldr r2, [r4, r1] - sub r2, r0, r2 - asr r3, r2, #0x1f - eor r2, r3 - sub r3, r2, r3 - add r2, r1, #0 - add r2, #0xcc - cmp r3, r2 - bge _02227B44 - str r0, [r4, r1] -_02227B44: - mov r3, #0x4d - lsl r3, r3, #2 - ldr r5, [r4, r3] - ldr r0, [r4] - asr r3, r5, #0xb - lsr r3, r3, #0x14 - add r3, r5, r3 - mov r1, #0 - mov r2, #3 - asr r3, r3, #0xc - bl ScheduleSetBgPosText - mov r3, #0x4d - lsl r3, r3, #2 - ldr r0, [r4] - ldr r4, [r4, r3] - mov r1, #2 - asr r3, r4, #0xb - lsr r3, r3, #0x14 - add r3, r4, r3 - mov r2, #3 - asr r3, r3, #0xc - bl ScheduleSetBgPosText -_02227B74: - pop {r3, r4, r5, pc} - nop -_02227B78: .word 0xFFFF4000 - thumb_func_end ov74_02227AEC - - thumb_func_start ov74_02227B7C -ov74_02227B7C: ; 0x02227B7C - push {r3, r4, r5, lr} - sub sp, #0x40 - ldr r5, _02227C9C ; =_0223B2E8 - add r4, r0, #0 - add r3, sp, #0x18 - mov r2, #5 -_02227B88: - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - sub r2, r2, #1 - bne _02227B88 - ldr r3, _02227CA0 ; =_0223B2D8 - add r2, sp, #8 - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - ldmia r3!, {r0, r1} - stmia r2!, {r0, r1} - add r0, sp, #0x18 - bl GfGfx_SetBanks - add r0, sp, #8 - bl SetBothScreensModesAndDisable - ldr r2, _02227CA4 ; =0x04000304 - mov r3, #0xf - ldrh r1, [r2] - ldr r0, _02227CA8 ; =0xFFFF7FFF - lsl r3, r3, #0xc - and r0, r1 - strh r0, [r2] - mov r1, #0 - str r1, [sp] - ldr r0, [r4] - mov r2, #2 - bl ov74_02235308 - ldr r1, _02227CAC ; =0x04000008 - mov r0, #3 - ldrh r2, [r1] - mov r3, #0x4f - bic r2, r0 - mov r0, #2 - orr r0, r2 - strh r0, [r1] - mov r0, #0 - mov r1, #0x20 - add r2, r0, #0 - bl BG_ClearCharDataRange - ldr r0, [r4] - mov r1, #0 - bl BgClearTilemapBufferAndCommit - mov r0, #2 - lsl r0, r0, #0xe - str r0, [sp] - mov r1, #1 - mov r3, #0x36 - ldr r0, [r4] - add r2, r1, #0 - lsl r3, r3, #0xa - bl ov74_02235308 - ldr r1, _02227CB0 ; =0x0400000A - mov r0, #3 - ldrh r2, [r1] - mov r3, #0x4f - bic r2, r0 - mov r0, #1 - orr r2, r0 - strh r2, [r1] - mov r1, #0x20 - mov r2, #0 - bl BG_ClearCharDataRange - ldr r0, [r4] - mov r1, #1 - bl BgClearTilemapBufferAndCommit - mov r0, #0 - str r0, [sp] - mov r1, #2 - mov r3, #0xe - ldr r0, [r4] - add r2, r1, #0 - lsl r3, r3, #0xc - bl ov74_02235308 - ldr r1, _02227CB4 ; =0x0400000C - mov r0, #3 - ldrh r2, [r1] - bic r2, r0 - strh r2, [r1] - mov r0, #2 - mov r1, #0x20 - mov r2, #0 - mov r3, #0x4f - bl BG_ClearCharDataRange - ldr r0, [r4] - mov r1, #2 - bl BgClearTilemapBufferAndCommit - bl ResetAllTextPrinters - mov r0, #0 - mov r1, #0x20 - mov r2, #0x4f - bl LoadFontPal0 - mov r0, #0 - add r1, r0, #0 - mov r2, #0x4f - bl LoadFontPal0 - mov r2, #5 - mov r1, #0 - lsl r2, r2, #0x18 - ldr r0, _02227CB8 ; =0x00006B5A - strh r1, [r2] - strh r0, [r2, #0x3e] - str r1, [sp] - mov r0, #0x4f - str r0, [sp, #4] - ldr r0, [r4] - ldr r2, _02227CBC ; =0x000003F7 - mov r3, #2 - bl LoadUserFrameGfx1 - mov r0, #1 - str r0, [sp] - mov r0, #0x4f - str r0, [sp, #4] - ldr r0, [r4] - ldr r2, _02227CC0 ; =0x000003EE - mov r1, #0 - mov r3, #3 - bl LoadUserFrameGfx1 - ldr r1, _02227CB8 ; =0x00006B5A - ldr r0, _02227CC4 ; =0x05000042 - strh r1, [r0] - add sp, #0x40 - pop {r3, r4, r5, pc} - nop -_02227C9C: .word _0223B2E8 -_02227CA0: .word _0223B2D8 -_02227CA4: .word 0x04000304 -_02227CA8: .word 0xFFFF7FFF -_02227CAC: .word 0x04000008 -_02227CB0: .word 0x0400000A -_02227CB4: .word 0x0400000C -_02227CB8: .word 0x00006B5A -_02227CBC: .word 0x000003F7 -_02227CC0: .word 0x000003EE -_02227CC4: .word 0x05000042 - thumb_func_end ov74_02227B7C - - thumb_func_start ov74_02227CC8 -ov74_02227CC8: ; 0x02227CC8 - push {r4, lr} - sub sp, #8 - add r4, r0, #0 - bl ov74_0223563C - bl ov74_02235690 - mov r0, #0x2d - str r0, [sp] - mov r0, #0 - str r0, [sp, #4] - mov r0, #0x71 - mov r1, #0x2f - mov r2, #0x2c - mov r3, #0x2e - bl ov74_02235728 - mov r0, #0 - mov r1, #0x1a - str r0, [sp] - lsl r1, r1, #4 - ldr r1, [r4, r1] - mov r2, #0xec - mov r3, #0x14 - bl ov74_02235930 - mov r1, #0x1a - lsl r1, r1, #4 - str r0, [r4, r1] - ldr r0, [r4, r1] - mov r1, #1 - bl Sprite_SetVisibleFlag - mov r0, #0x1a - lsl r0, r0, #4 - ldr r0, [r4, r0] - mov r1, #0 - bl Sprite_SetAnimActiveFlag - mov r0, #1 - mov r1, #0x69 - str r0, [sp] - lsl r1, r1, #2 - ldr r1, [r4, r1] - mov r0, #0 - mov r2, #0xec - mov r3, #0xac - bl ov74_02235930 - mov r1, #0x69 - lsl r1, r1, #2 - str r0, [r4, r1] - ldr r0, [r4, r1] - mov r1, #1 - bl Sprite_SetVisibleFlag - mov r0, #0x69 - lsl r0, r0, #2 - ldr r0, [r4, r0] - mov r1, #0 - bl Sprite_SetAnimActiveFlag - add sp, #8 - pop {r4, pc} - thumb_func_end ov74_02227CC8 - - thumb_func_start ov74_02227D48 -ov74_02227D48: ; 0x02227D48 - push {r4, lr} - sub sp, #0x10 - add r4, r0, #0 - mov r0, #0x20 - str r0, [sp] - mov r0, #0x4f - str r0, [sp, #4] - mov r0, #0x71 - mov r1, #0x31 - mov r2, #0 - mov r3, #0x80 - bl GfGfxLoader_GXLoadPal - ldr r0, _02227D84 ; =0x000003E6 - mov r1, #0x30 - str r0, [sp] - mov r0, #1 - lsl r0, r0, #8 - str r0, [sp, #4] - mov r0, #0 - str r0, [sp, #8] - mov r0, #0x4f - str r0, [sp, #0xc] - ldr r2, [r4] - mov r0, #0x71 - mov r3, #2 - bl GfGfxLoader_LoadCharData - add sp, #0x10 - pop {r4, pc} - .balign 4, 0 -_02227D84: .word 0x000003E6 - thumb_func_end ov74_02227D48 - - thumb_func_start ov74_02227D88 -ov74_02227D88: ; 0x02227D88 - push {r3, r4, r5, r6, r7, lr} - add r5, r0, #0 - ldr r0, [r5] - add r4, r1, #0 - mov r1, #2 - add r6, r2, #0 - add r7, r3, #0 - bl GetBgTilemapBuffer - ldr r1, _02227DD0 ; =0x000043E6 - cmp r7, #2 - bne _02227DA2 - add r1, r1, #4 -_02227DA2: - lsl r2, r6, #5 - add r3, r4, r2 - lsl r2, r3, #1 - add r3, r3, #1 - strh r1, [r0, r2] - add r2, r1, #1 - lsl r3, r3, #1 - strh r2, [r0, r3] - add r2, r6, #1 - lsl r2, r2, #5 - add r4, r4, r2 - add r3, r1, #2 - lsl r2, r4, #1 - strh r3, [r0, r2] - add r2, r1, #3 - add r1, r4, #1 - lsl r1, r1, #1 - strh r2, [r0, r1] - ldr r0, [r5] - mov r1, #2 - bl BgCommitTilemapBufferToVram - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_02227DD0: .word 0x000043E6 - thumb_func_end ov74_02227D88 - - thumb_func_start ov74_02227DD4 -ov74_02227DD4: ; 0x02227DD4 - push {r4, r5, r6, lr} - add r5, r0, #0 - ldr r0, [r5] - add r4, r1, #0 - add r6, r2, #0 - mov r1, #2 - bl GetBgTilemapBuffer - lsl r1, r6, #5 - add r3, r4, r1 - mov r1, #0 - lsl r2, r3, #1 - strh r1, [r0, r2] - add r2, r3, #1 - lsl r2, r2, #1 - strh r1, [r0, r2] - add r2, r6, #1 - lsl r2, r2, #5 - add r3, r4, r2 - lsl r2, r3, #1 - strh r1, [r0, r2] - add r2, r3, #1 - lsl r2, r2, #1 - strh r1, [r0, r2] - ldr r0, [r5] - mov r1, #2 - bl BgCommitTilemapBufferToVram - pop {r4, r5, r6, pc} - .balign 4, 0 - thumb_func_end ov74_02227DD4 - - thumb_func_start ov74_02227E10 -ov74_02227E10: ; 0x02227E10 - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x10 - add r6, r0, #0 - add r0, r2, #0 - add r7, r3, #0 - ldr r2, [sp, #0x28] - mov r3, #0x4f - bl ReadMsgData_ExpandPlaceholders - add r5, r0, #0 - mov r0, #0 - mov r1, #2 - bl GetFontAttribute - add r2, r0, #0 - mov r0, #0 - add r1, r5, #0 - bl FontID_String_GetWidth - add r4, r0, #0 - add r0, r6, #0 - bl GetWindowWidth - lsl r0, r0, #3 - add r4, #0x20 - sub r3, r0, r4 - ldr r0, [sp, #0x2c] - mov r1, #0 - str r0, [sp] - mov r0, #0xff - str r0, [sp, #4] - str r7, [sp, #8] - add r0, r6, #0 - add r2, r5, #0 - str r1, [sp, #0xc] - bl AddTextPrinterParameterizedWithColor - add r0, r5, #0 - bl String_Delete - add sp, #0x10 - pop {r3, r4, r5, r6, r7, pc} - thumb_func_end ov74_02227E10 - - thumb_func_start ov74_02227E64 -ov74_02227E64: ; 0x02227E64 - push {r3, lr} - sub sp, #8 - add r2, r1, #0 - cmp r2, #0x64 - blt _02227E74 - mov r3, #3 - mov r1, #0 - b _02227E82 -_02227E74: - cmp r2, #0xa - blt _02227E7E - mov r3, #3 - mov r1, #1 - b _02227E82 -_02227E7E: - mov r3, #2 - mov r1, #1 -_02227E82: - str r1, [sp] - mov r1, #1 - str r1, [sp, #4] - mov r1, #0 - bl BufferIntegerAsString - add sp, #8 - pop {r3, pc} - .balign 4, 0 - thumb_func_end ov74_02227E64 - - thumb_func_start ov74_MainMenu_PrintContinueButton -ov74_MainMenu_PrintContinueButton: ; 0x02227E94 - push {r4, r5, r6, r7, lr} - sub sp, #0x2c - str r2, [sp, #0x18] - str r0, [sp, #0x10] - str r1, [sp, #0x14] - add r4, r3, #0 - ldr r2, _02228028 ; =0x000001BA - mov r0, #1 - mov r1, #0x1b - mov r3, #0x4f - bl NewMsgDataFromNarc - str r0, [sp, #0x24] - mov r0, #0x4f - bl MessageFormat_New - str r0, [sp, #0x28] - ldr r0, [sp, #0x10] - ldr r0, [r0, #0xc] - bl PlayerProfile_GetTrainerGender - cmp r0, #1 - bne _02227EC8 - ldr r0, _0222802C ; =0x0003040F - str r0, [sp, #0x1c] - b _02227ECC -_02227EC8: - ldr r0, _02228030 ; =0x0007080F - str r0, [sp, #0x1c] -_02227ECC: - ldr r0, [sp, #0x14] - ldr r1, _02228034 ; =ov74_0223BCBC + 8 - lsl r0, r0, #4 - str r0, [sp, #0x20] - ldr r0, [r1, r0] - ldr r1, [sp, #0x18] - str r0, [sp] - ldr r0, [sp, #0x10] - mov r2, #3 - ldr r0, [r0] - add r3, r4, #0 - bl ov74_02235568 - ldr r4, _02228038 ; =ov74_0223BBC4 - mov r6, #1 - mov r5, #0x10 -_02227EEC: - cmp r6, #4 - bne _02227EF8 - ldr r0, [sp, #0x10] - ldr r0, [r0, #0x4c] - cmp r0, #0 - beq _02227F28 -_02227EF8: - ldr r0, [sp, #0x28] - ldr r1, [sp, #0x24] - ldr r2, [r4] - mov r3, #0x4f - bl ReadMsgData_ExpandPlaceholders - add r7, r0, #0 - str r5, [sp] - mov r0, #0xff - str r0, [sp, #4] - ldr r0, [sp, #0x1c] - mov r1, #0 - str r0, [sp, #8] - mov r0, #0 - str r0, [sp, #0xc] - ldr r0, [sp, #0x18] - add r2, r7, #0 - ldr r0, [r0, #0x10] - mov r3, #0x20 - bl AddTextPrinterParameterizedWithColor - add r0, r7, #0 - bl String_Delete -_02227F28: - add r6, r6, #1 - add r4, r4, #4 - add r5, #0x10 - cmp r6, #5 - blo _02227EEC - ldr r2, [sp, #0x10] - ldr r0, [sp, #0x28] - ldr r2, [r2, #0xc] - mov r1, #0 - bl BufferPlayersName - mov r0, #0x11 - str r0, [sp] - mov r0, #0x10 - str r0, [sp, #4] - ldr r0, [sp, #0x18] - ldr r1, [sp, #0x24] - ldr r0, [r0, #0x10] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x1c] - bl ov74_02227E10 - ldr r0, [sp, #0x10] - ldr r0, [r0, #0x10] - bl GetIGTHours - add r1, r0, #0 - ldr r0, [sp, #0x28] - bl ov74_02227E64 - ldr r0, [sp, #0x10] - ldr r0, [r0, #0x10] - bl GetIGTMinutes - add r2, r0, #0 - mov r3, #2 - ldr r0, [sp, #0x28] - str r3, [sp] - mov r1, #1 - str r1, [sp, #4] - bl BufferIntegerAsString - mov r0, #0x12 - str r0, [sp] - mov r0, #0x20 - str r0, [sp, #4] - ldr r0, [sp, #0x18] - ldr r1, [sp, #0x24] - ldr r0, [r0, #0x10] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x1c] - bl ov74_02227E10 - mov r1, #0 - str r1, [sp] - mov r0, #1 - str r0, [sp, #4] - ldr r2, [sp, #0x10] - ldr r0, [sp, #0x28] - ldr r2, [r2, #0x50] - mov r3, #2 - bl BufferIntegerAsString - mov r0, #0x14 - str r0, [sp] - mov r0, #0x30 - str r0, [sp, #4] - ldr r0, [sp, #0x18] - ldr r1, [sp, #0x24] - ldr r0, [r0, #0x10] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x1c] - bl ov74_02227E10 - ldr r0, [sp, #0x10] - ldr r0, [r0, #0x4c] - cmp r0, #0 - beq _02227FEA - ldr r0, [sp, #0x10] - ldr r0, [r0, #8] - bl Pokedex_CountDexOwned - add r1, r0, #0 - ldr r0, [sp, #0x28] - bl ov74_02227E64 - mov r0, #0x13 - str r0, [sp] - mov r0, #0x40 - str r0, [sp, #4] - ldr r0, [sp, #0x18] - ldr r1, [sp, #0x24] - ldr r0, [r0, #0x10] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x1c] - bl ov74_02227E10 -_02227FEA: - ldr r2, [sp, #0x18] - ldr r3, [sp, #0x18] - ldr r0, [sp, #0x18] - ldr r2, [r2, #0x38] - ldr r3, [r3, #0x3c] - lsl r2, r2, #0x10 - lsl r3, r3, #0x18 - ldr r0, [r0, #0x10] - mov r1, #0 - lsr r2, r2, #0x10 - lsr r3, r3, #0x18 - bl DrawFrameAndWindow1 - ldr r1, _0222803C ; =ov74_0223BCBC - ldr r0, [sp, #0x20] - ldr r2, [r1, r0] - ldr r0, [sp, #0x14] - lsl r1, r0, #2 - ldr r0, [sp, #0x10] - add r0, r0, r1 - add r0, #0xec - str r2, [r0] - ldr r0, [sp, #0x28] - bl MessageFormat_Delete - ldr r0, [sp, #0x24] - bl DestroyMsgData - mov r0, #1 - add sp, #0x2c - pop {r4, r5, r6, r7, pc} - .balign 4, 0 -_02228028: .word 0x000001BA -_0222802C: .word 0x0003040F -_02228030: .word 0x0007080F -_02228034: .word ov74_0223BCBC + 8 -_02228038: .word ov74_0223BBC4 -_0222803C: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintContinueButton - - thumb_func_start ov74_MainMenu_PrintMigrateFromAgbButton -ov74_MainMenu_PrintMigrateFromAgbButton: ; 0x02228040 - push {r3, r4, r5, r6, lr} - sub sp, #4 - add r4, r0, #0 - add r5, r1, #0 - add r1, r2, #0 - ldr r2, [r4, #0x24] - add r6, r3, #0 - cmp r2, #0 - bne _02228058 - add sp, #4 - mov r0, #0 - pop {r3, r4, r5, r6, pc} -_02228058: - sub r2, r2, #1 - cmp r2, #4 - bhi _02228086 - add r2, r2, r2 - add r2, pc - ldrh r2, [r2, #6] - lsl r2, r2, #0x10 - asr r2, r2, #0x10 - add pc, r2 -_0222806A: ; jump table - .short _02228074 - _0222806A - 2 ; case 0 - .short _02228078 - _0222806A - 2 ; case 1 - .short _0222807C - _0222806A - 2 ; case 2 - .short _02228080 - _0222806A - 2 ; case 3 - .short _02228084 - _0222806A - 2 ; case 4 -_02228074: - mov r0, #msg_0442_00004 - b _02228086 -_02228078: - mov r0, #msg_0442_00005 - b _02228086 -_0222807C: - mov r0, #msg_0442_00006 - b _02228086 -_02228080: - mov r0, #msg_0442_00007 - b _02228086 -_02228084: - mov r0, #msg_0442_00008 -_02228086: - str r0, [sp] - ldr r0, [r4] - mov r2, #3 - add r3, r6, #0 - bl ov74_02235568 - add r0, r4, #0 - mov r1, #0x17 - add r2, r6, #0 - bl ov74_02227DD4 - ldr r0, _022280B0 ; =ov74_0223BCBC - lsl r1, r5, #4 - ldr r1, [r0, r1] - lsl r0, r5, #2 - add r0, r4, r0 - add r0, #0xec - str r1, [r0] - mov r0, #1 - add sp, #4 - pop {r3, r4, r5, r6, pc} - .balign 4, 0 -_022280B0: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintMigrateFromAgbButton - - thumb_func_start ov74_MainMenu_PrintMysteryGiftButton -ov74_MainMenu_PrintMysteryGiftButton: ; 0x022280B4 - push {r3, r4, r5, r6, r7, lr} - sub sp, #8 - add r5, r0, #0 - ldr r0, [r5, #0x34] - add r4, r1, #0 - add r7, r3, #0 - str r2, [sp, #4] - cmp r0, #0 - bne _022280FC - ldr r0, [r5, #0x14] - bl SaveMysteryGift_TestFlagx7FF - cmp r0, #1 - bne _022280D4 - mov r0, #1 - str r0, [r5, #0x34] -_022280D4: - ldr r0, [r5, #4] - bl Save_SysInfo_Get - bl Save_SysInfo_GetMysteryGiftActive - cmp r0, #1 - bne _022280E6 - mov r0, #1 - str r0, [r5, #0x34] -_022280E6: - mov r0, #0x4f - bl ov74_0223512C - bl ov74_02235230 - cmp r0, #0 - beq _022280FC - mov r0, #1 - str r0, [r5, #0x34] - bl ov74_02236034 -_022280FC: - ldr r0, [r5, #0x34] - cmp r0, #1 - bne _0222810C - ldr r0, [r5, #0x4c] - cmp r0, #0 - bne _0222810C - mov r0, #0 - str r0, [r5, #0x34] -_0222810C: - ldr r0, [r5, #0x34] - cmp r0, #1 - bne _02228150 - ldr r0, _02228158 ; =ov74_0223BCBC + 8 - lsl r6, r4, #4 - ldr r0, [r0, r6] - ldr r1, [sp, #4] - str r0, [sp] - ldr r0, [r5] - mov r2, #3 - add r3, r7, #0 - bl ov74_02235568 - add r0, r5, #0 - mov r1, #0x17 - add r2, r7, #0 - bl ov74_02227DD4 - ldr r0, _0222815C ; =ov74_0223BCBC - ldr r1, [r0, r6] - lsl r0, r4, #2 - add r0, r5, r0 - add r0, #0xec - str r1, [r0] - ldr r1, [r5, #0x38] - mov r0, #1 - orr r0, r1 - str r0, [r5, #0x38] - ldr r0, [r5, #0x14] - bl SaveMysteryGift_SetFlagx7FF - add sp, #8 - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} -_02228150: - mov r0, #0 - add sp, #8 - pop {r3, r4, r5, r6, r7, pc} - nop -_02228158: .word ov74_0223BCBC + 8 -_0222815C: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintMysteryGiftButton - - thumb_func_start ov74_MainMenu_PrintConnectToRangerButton -ov74_MainMenu_PrintConnectToRangerButton: ; 0x02228160 - push {r3, r4, r5, r6, r7, lr} - add r5, r0, #0 - ldr r0, [r5, #0x2c] - add r4, r1, #0 - add r7, r3, #0 - cmp r0, #1 - bne _022281B0 - ldr r0, [r5, #0x4c] - cmp r0, #1 - bne _022281B0 - ldr r0, _022281B4 ; =ov74_0223BCBC + 8 - lsl r6, r4, #4 - ldr r0, [r0, r6] - add r1, r2, #0 - str r0, [sp] - ldr r0, [r5] - mov r2, #3 - bl ov74_02235568 - add r0, r5, #0 - mov r1, #0x17 - add r2, r7, #0 - mov r3, #1 - bl ov74_02227D88 - lsl r1, r4, #2 - add r2, r5, r1 - mov r1, #0x11 - mov r0, #1 - lsl r1, r1, #4 - str r0, [r2, r1] - ldr r1, _022281B8 ; =ov74_0223BCBC - add r2, #0xec - ldr r1, [r1, r6] - str r1, [r2] - ldr r2, [r5, #0x38] - mov r1, #2 - orr r1, r2 - str r1, [r5, #0x38] - pop {r3, r4, r5, r6, r7, pc} -_022281B0: - mov r0, #0 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_022281B4: .word ov74_0223BCBC + 8 -_022281B8: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintConnectToRangerButton - - thumb_func_start ov74_MainMenu_PrintConnectToWiiButton -ov74_MainMenu_PrintConnectToWiiButton: ; 0x022281BC - push {r3, r4, r5, r6, r7, lr} - add r4, r0, #0 - ldr r0, [r4, #0x30] - add r5, r1, #0 - add r7, r3, #0 - cmp r0, #1 - bne _02228200 - ldr r0, _02228204 ; =ov74_0223BCBC + 8 - lsl r6, r5, #4 - ldr r0, [r0, r6] - add r1, r2, #0 - str r0, [sp] - ldr r0, [r4] - mov r2, #3 - bl ov74_02235568 - lsl r5, r5, #2 - mov r0, #0x11 - mov r3, #1 - add r1, r4, r5 - lsl r0, r0, #4 - str r3, [r1, r0] - add r0, r4, #0 - mov r1, #0x17 - add r2, r7, #0 - bl ov74_02227D88 - ldr r0, _02228208 ; =ov74_0223BCBC - ldr r1, [r0, r6] - add r0, r4, r5 - add r0, #0xec - str r1, [r0] - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} -_02228200: - mov r0, #0 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_02228204: .word ov74_0223BCBC + 8 -_02228208: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintConnectToWiiButton - - thumb_func_start ov74_MainMenu_PrintNintendoWFCSetupButton -ov74_MainMenu_PrintNintendoWFCSetupButton: ; 0x0222820C - push {r3, r4, r5, r6, r7, lr} - add r4, r1, #0 - add r5, r0, #0 - ldr r0, _0222824C ; =ov74_0223BCBC + 8 - lsl r6, r4, #4 - ldr r0, [r0, r6] - add r1, r2, #0 - str r0, [sp] - ldr r0, [r5] - mov r2, #3 - add r7, r3, #0 - bl ov74_02235568 - lsl r4, r4, #2 - mov r0, #0x11 - mov r3, #2 - add r1, r5, r4 - lsl r0, r0, #4 - str r3, [r1, r0] - add r0, r5, #0 - mov r1, #0x17 - add r2, r7, #0 - bl ov74_02227D88 - ldr r0, _02228250 ; =ov74_0223BCBC - ldr r1, [r0, r6] - add r0, r5, r4 - add r0, #0xec - str r1, [r0] - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} - nop -_0222824C: .word ov74_0223BCBC + 8 -_02228250: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintNintendoWFCSetupButton - - thumb_func_start ov74_MainMenu_PrintConnectToPokewalkerButton -ov74_MainMenu_PrintConnectToPokewalkerButton: ; 0x02228254 - push {r3, r4, r5, r6, r7, lr} - add r6, r1, #0 - add r5, r0, #0 - ldr r0, _02228288 ; =ov74_0223BCBC + 8 - lsl r4, r6, #4 - ldr r0, [r0, r4] - add r1, r2, #0 - str r0, [sp] - ldr r0, [r5] - add r7, r3, #0 - mov r2, #3 - bl ov74_02235568 - add r0, r5, #0 - mov r1, #0x17 - add r2, r7, #0 - bl ov74_02227DD4 - ldr r0, _0222828C ; =ov74_0223BCBC - ldr r1, [r0, r4] - lsl r0, r6, #2 - add r0, r5, r0 - add r0, #0xec - str r1, [r0] - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_02228288: .word ov74_0223BCBC + 8 -_0222828C: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintConnectToPokewalkerButton - - thumb_func_start ov74_MainMenu_PrintWiiMessageSettingsButton -ov74_MainMenu_PrintWiiMessageSettingsButton: ; 0x02228290 - push {r3, r4, r5, r6, r7, lr} - add r6, r1, #0 - add r5, r0, #0 - ldr r0, _022282C4 ; =ov74_0223BCBC + 8 - lsl r4, r6, #4 - ldr r0, [r0, r4] - add r1, r2, #0 - str r0, [sp] - ldr r0, [r5] - add r7, r3, #0 - mov r2, #3 - bl ov74_02235568 - add r0, r5, #0 - mov r1, #0x17 - add r2, r7, #0 - bl ov74_02227DD4 - ldr r0, _022282C8 ; =ov74_0223BCBC - ldr r1, [r0, r4] - lsl r0, r6, #2 - add r0, r5, r0 - add r0, #0xec - str r1, [r0] - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_022282C4: .word ov74_0223BCBC + 8 -_022282C8: .word ov74_0223BCBC - thumb_func_end ov74_MainMenu_PrintWiiMessageSettingsButton - - thumb_func_start ov74_022282CC -ov74_022282CC: ; 0x022282CC - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x70 - mov r1, #0x1b - add r7, r0, #0 - mov r0, #0 - lsl r1, r1, #4 - str r0, [sp, #0xc] - str r0, [r7, r1] - str r0, [sp, #0x10] - add r0, r7, #0 - str r0, [sp, #8] - add r0, #0x5c - str r0, [sp, #8] - add r0, r7, #0 - mov r5, #1 - str r0, [sp, #0x14] - add r0, #0x20 - ldr r4, _02228410 ; =ov74_0223BCBC - str r5, [r7, #0x20] - str r7, [sp, #0x18] - str r0, [sp, #0x14] -_022282F6: - ldr r0, _02228414 ; =0x000003F7 - ldr r1, [sp, #8] - str r0, [sp] - mov r0, #2 - str r0, [sp, #4] - ldr r3, _02228418 ; =0x000001BA - add r0, sp, #0x1c - mov r2, #1 - bl ov74_02235414 - ldr r2, [r4, #4] - ldr r3, [r7, #0x20] - add r0, sp, #0x1c - mov r1, #0x17 - bl ov74_02235464 - ldr r0, [r4, #0xc] - mov ip, r0 - cmp r0, #0 - beq _02228398 - ldr r0, [sp, #0x18] - add r0, #0xec - ldr r0, [r0] - cmp r0, #0 - beq _0222837C - ldr r0, [sp, #0x2c] - mov r1, #3 - bl SetWindowX - lsl r1, r5, #0x18 - ldr r0, [sp, #0x2c] - lsr r1, r1, #0x18 - bl SetWindowY - ldr r2, [sp, #0x54] - ldr r3, [sp, #0x58] - lsl r2, r2, #0x10 - lsl r3, r3, #0x18 - ldr r0, [sp, #0x2c] - mov r1, #0 - lsr r2, r2, #0x10 - lsr r3, r3, #0x18 - bl DrawFrameAndWindow1 - mov r1, #0x11 - ldr r0, [sp, #0x18] - lsl r1, r1, #4 - ldr r3, [r0, r1] - cmp r3, #0 - beq _02228366 - add r0, r7, #0 - mov r1, #0x17 - add r2, r5, #0 - bl ov74_02227D88 - b _02228370 -_02228366: - add r0, r7, #0 - mov r1, #0x17 - add r2, r5, #0 - bl ov74_02227DD4 -_02228370: - ldr r0, [r4, #4] - add r0, r0, #2 - add r5, r5, r0 - mov r0, #1 - str r0, [sp, #0xc] - b _022283B6 -_0222837C: - ldr r1, [sp, #0x10] - add r0, r7, #0 - add r2, sp, #0x1c - add r3, r5, #0 - mov r6, ip - blx r6 - cmp r0, #1 - bne _022283B6 - ldr r0, [r4, #4] - add r0, r0, #2 - add r5, r5, r0 - mov r0, #1 - str r0, [sp, #0xc] - b _022283B6 -_02228398: - ldr r0, [r4, #8] - add r1, sp, #0x1c - str r0, [sp] - ldr r0, [r7] - mov r2, #3 - add r3, r5, #0 - bl ov74_02235568 - ldr r0, [sp, #0x18] - ldr r1, [r4] - add r0, #0xec - str r1, [r0] - ldr r0, [r4, #4] - add r0, r0, #2 - add r5, r5, r0 -_022283B6: - ldr r0, [sp, #0x14] - ldr r1, [r4, #4] - ldr r2, [r0] - mov r0, #0x17 - mul r0, r1 - add r1, r2, r0 - ldr r0, [sp, #0x14] - str r1, [r0] - ldr r0, [sp, #0x18] - add r0, #0xec - ldr r0, [r0] - cmp r0, #0 - beq _022283DE - mov r0, #0x1b - lsl r0, r0, #4 - ldr r0, [r7, r0] - add r1, r0, #1 - mov r0, #0x1b - lsl r0, r0, #4 - str r1, [r7, r0] -_022283DE: - ldr r0, [sp, #8] - add r4, #0x10 - add r0, #0x10 - str r0, [sp, #8] - ldr r0, [sp, #0x18] - add r0, r0, #4 - str r0, [sp, #0x18] - ldr r0, [sp, #0x10] - add r0, r0, #1 - str r0, [sp, #0x10] - cmp r0, #9 - bhs _022283F8 - b _022282F6 -_022283F8: - add r0, r7, #0 - bl ov74_0222879C - add r0, r7, #0 - add r7, #0x54 - ldrh r1, [r7] - bl ov74_0222841C - ldr r0, [sp, #0xc] - add sp, #0x70 - pop {r3, r4, r5, r6, r7, pc} - nop -_02228410: .word ov74_0223BCBC -_02228414: .word 0x000003F7 -_02228418: .word 0x000001BA - thumb_func_end ov74_022282CC - - thumb_func_start ov74_0222841C -ov74_0222841C: ; 0x0222841C - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x30 - add r7, r0, #0 - add r0, r1, #0 - add r0, r0, #5 - str r0, [sp, #0x14] - add r0, r1, #0 - add r4, r7, #0 - sub r0, r0, #5 - str r1, [sp, #0xc] - mov r6, #0 - add r4, #0x5c - str r0, [sp, #0x10] -_02228436: - add r0, r4, #0 - bl WindowIsInUse - cmp r0, #0 - beq _0222852C - cmp r6, #0 - bne _02228452 - mov r0, #0x4e - lsl r0, r0, #2 - ldr r1, [r7, r0] - mov r0, #6 - lsl r0, r0, #0x12 - cmp r1, r0 - beq _0222852C -_02228452: - ldr r0, [sp, #0x10] - cmp r6, r0 - blt _0222852C - ldr r0, [sp, #0x14] - cmp r6, r0 - bgt _0222852C - mov r0, #0x6b - lsl r0, r0, #2 - ldr r0, [r7, r0] - cmp r0, #1 - bne _022284A8 - ldr r2, _02228540 ; =0x000003EE - add r0, r4, #0 - mov r1, #1 - mov r3, #2 - bl DrawFrameAndWindow1 - add r0, r4, #0 - bl GetWindowX - str r0, [sp, #0x18] - add r0, r4, #0 - bl GetWindowY - str r0, [sp, #0x1c] - add r0, r4, #0 - bl GetWindowWidth - add r5, r0, #0 - add r0, r4, #0 - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #0 - str r0, [sp, #8] - ldr r0, [r7] - ldr r2, [sp, #0x18] - ldr r3, [sp, #0x1c] - mov r1, #0 - bl BgTilemapRectChangePalette - b _0222852C -_022284A8: - ldr r0, [sp, #0xc] - cmp r6, r0 - bne _022284EE - ldr r2, _02228540 ; =0x000003EE - add r0, r4, #0 - mov r1, #1 - mov r3, #3 - bl DrawFrameAndWindow1 - add r0, r4, #0 - bl GetWindowX - str r0, [sp, #0x20] - add r0, r4, #0 - bl GetWindowY - str r0, [sp, #0x24] - add r0, r4, #0 - bl GetWindowWidth - add r5, r0, #0 - add r0, r4, #0 - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #0 - str r0, [sp, #8] - ldr r0, [r7] - ldr r2, [sp, #0x20] - ldr r3, [sp, #0x24] - mov r1, #0 - bl BgTilemapRectChangePalette - b _0222852C -_022284EE: - ldr r2, _02228544 ; =0x000003F7 - add r0, r4, #0 - mov r1, #1 - mov r3, #2 - bl DrawFrameAndWindow1 - add r0, r4, #0 - bl GetWindowX - str r0, [sp, #0x28] - add r0, r4, #0 - bl GetWindowY - str r0, [sp, #0x2c] - add r0, r4, #0 - bl GetWindowWidth - add r5, r0, #0 - add r0, r4, #0 - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - ldr r0, [r7] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x2c] - mov r1, #0 - bl BgTilemapRectChangePalette -_0222852C: - add r6, r6, #1 - add r4, #0x10 - cmp r6, #9 - blo _02228436 - ldr r0, [r7] - mov r1, #0 - bl BgCommitTilemapBufferToVram - add sp, #0x30 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_02228540: .word 0x000003EE -_02228544: .word 0x000003F7 - thumb_func_end ov74_0222841C - - thumb_func_start ov74_02228548 -ov74_02228548: ; 0x02228548 - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x30 - add r6, r0, #0 - mov r0, #0x59 - lsl r0, r0, #2 - str r1, [sp, #0xc] - mov r7, #0 - add r4, r6, r0 -_02228558: - add r0, r4, #0 - bl WindowIsInUse - cmp r0, #0 - bne _02228564 - b _02228678 -_02228564: - ldr r0, [sp, #0xc] - cmp r0, #0 - bge _022285AA - ldr r2, _02228690 ; =0x000003F7 - add r0, r4, #0 - mov r1, #1 - mov r3, #2 - bl DrawFrameAndWindow1 - add r0, r4, #0 - bl GetWindowX - str r0, [sp, #0x10] - add r0, r4, #0 - bl GetWindowY - str r0, [sp, #0x14] - add r0, r4, #0 - bl GetWindowWidth - add r5, r0, #0 - add r0, r4, #0 - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - ldr r0, [r6] - ldr r2, [sp, #0x10] - ldr r3, [sp, #0x14] - mov r1, #1 - bl BgTilemapRectChangePalette - b _02228678 -_022285AA: - mov r0, #0x6b - lsl r0, r0, #2 - ldr r0, [r6, r0] - cmp r0, #1 - bne _022285F4 - ldr r2, _02228694 ; =0x000003EE - add r0, r4, #0 - mov r1, #1 - mov r3, #2 - bl DrawFrameAndWindow1 - add r0, r4, #0 - bl GetWindowX - str r0, [sp, #0x18] - add r0, r4, #0 - bl GetWindowY - str r0, [sp, #0x1c] - add r0, r4, #0 - bl GetWindowWidth - add r5, r0, #0 - add r0, r4, #0 - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #0 - str r0, [sp, #8] - ldr r0, [r6] - ldr r2, [sp, #0x18] - ldr r3, [sp, #0x1c] - mov r1, #1 - bl BgTilemapRectChangePalette - b _02228678 -_022285F4: - ldr r0, [sp, #0xc] - cmp r7, r0 - bne _0222863A - ldr r2, _02228694 ; =0x000003EE - add r0, r4, #0 - mov r1, #1 - mov r3, #3 - bl DrawFrameAndWindow1 - add r0, r4, #0 - bl GetWindowX - str r0, [sp, #0x20] - add r0, r4, #0 - bl GetWindowY - str r0, [sp, #0x24] - add r0, r4, #0 - bl GetWindowWidth - add r5, r0, #0 - add r0, r4, #0 - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #0 - str r0, [sp, #8] - ldr r0, [r6] - ldr r2, [sp, #0x20] - ldr r3, [sp, #0x24] - mov r1, #1 - bl BgTilemapRectChangePalette - b _02228678 -_0222863A: - ldr r2, _02228690 ; =0x000003F7 - add r0, r4, #0 - mov r1, #1 - mov r3, #2 - bl DrawFrameAndWindow1 - add r0, r4, #0 - bl GetWindowX - str r0, [sp, #0x28] - add r0, r4, #0 - bl GetWindowY - str r0, [sp, #0x2c] - add r0, r4, #0 - bl GetWindowWidth - add r5, r0, #0 - add r0, r4, #0 - bl GetWindowHeight - str r5, [sp] - str r0, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - ldr r0, [r6] - ldr r2, [sp, #0x28] - ldr r3, [sp, #0x2c] - mov r1, #1 - bl BgTilemapRectChangePalette -_02228678: - add r7, r7, #1 - add r4, #0x10 - cmp r7, #2 - bge _02228682 - b _02228558 -_02228682: - ldr r0, [r6] - mov r1, #1 - bl BgCommitTilemapBufferToVram - add sp, #0x30 - pop {r3, r4, r5, r6, r7, pc} - nop -_02228690: .word 0x000003F7 -_02228694: .word 0x000003EE - thumb_func_end ov74_02228548 - - thumb_func_start ov74_02228698 -ov74_02228698: ; 0x02228698 - push {r3, r4, r5, r6, r7, lr} - add r5, r0, #0 - add r0, #0x54 - ldrh r6, [r0] - mov r7, #8 - add r3, r7, #0 - add r4, r6, #0 - mov r0, #0 - sub r3, #9 -_022286AA: - add r4, r4, r1 - cmp r4, r3 - bne _022286B2 - add r4, r0, #0 -_022286B2: - cmp r4, #9 - bne _022286B8 - add r4, r7, #0 -_022286B8: - cmp r4, r6 - beq _022286CE - lsl r2, r4, #2 - add r2, r5, r2 - add r2, #0xec - ldr r2, [r2] - cmp r2, #0 - beq _022286AA - ldr r0, _022286F4 ; =SEQ_SE_DP_SELECT - bl PlaySE -_022286CE: - add r0, r5, #0 - add r0, #0x54 - strh r4, [r0] - add r0, r5, #0 - add r0, #0x54 - ldrh r1, [r0] - cmp r1, r6 - beq _022286F0 - add r0, r5, #0 - bl ov74_0222841C - mov r0, #0x6d - mov r1, #6 - lsl r0, r0, #2 - str r1, [r5, r0] - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} -_022286F0: - mov r0, #0 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 -_022286F4: .word SEQ_SE_DP_SELECT - thumb_func_end ov74_02228698 - - thumb_func_start ov74_022286F8 -ov74_022286F8: ; 0x022286F8 - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x10 - add r5, r0, #0 - add r6, r5, #0 - add r6, #0x5c - lsl r7, r1, #4 - add r0, r6, r7 - bl GetWindowY - sub r0, r0, #1 - lsl r4, r0, #3 - add r0, r6, r7 - bl GetWindowHeight - mov r0, #0x4e - lsl r0, r0, #2 - ldr r1, [r5, r0] - asr r0, r1, #0xb - lsr r0, r0, #0x14 - add r0, r1, r0 - asr r0, r0, #0xc - cmp r0, r4 - bgt _0222872C - add r0, #0xc0 - cmp r0, r4 - bgt _02228796 -_0222872C: - mov r0, #0x4e - lsl r1, r4, #0xc - lsl r0, r0, #2 - str r1, [r5, r0] - add r0, r5, #0 - bl ov74_0222879C - mov r0, #0x4e - lsl r0, r0, #2 - ldr r1, [r5, r0] - mov r0, #6 - lsl r0, r0, #0x12 - cmp r1, r0 - bne _0222878C - mov r1, #0 - str r1, [sp] - mov r0, #0x20 - str r0, [sp, #4] - mov r0, #0xc - str r0, [sp, #8] - str r1, [sp, #0xc] - ldr r0, [r5] - add r2, r1, #0 - add r3, r1, #0 - bl FillBgTilemapRect - mov r2, #0 - str r2, [sp] - mov r0, #0x20 - str r0, [sp, #4] - mov r0, #0xc - str r0, [sp, #8] - str r2, [sp, #0xc] - ldr r0, [r5] - mov r1, #2 - add r3, r2, #0 - bl FillBgTilemapRect - ldr r0, [r5] - mov r1, #0 - bl ScheduleBgTilemapBufferTransfer - ldr r0, [r5] - mov r1, #2 - bl ScheduleBgTilemapBufferTransfer - add sp, #0x10 - pop {r3, r4, r5, r6, r7, pc} -_0222878C: - cmp r1, #0 - bne _02228796 - add r0, r5, #0 - bl ov74_022282CC -_02228796: - add sp, #0x10 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 - thumb_func_end ov74_022286F8 - - thumb_func_start ov74_0222879C -ov74_0222879C: ; 0x0222879C - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x10 - str r0, [sp] - mov r0, #0 - str r0, [sp, #4] - str r0, [sp, #8] - mov r1, #0x4e - ldr r0, [sp] - lsl r1, r1, #2 - ldr r1, [r0, r1] - ldr r5, [sp] - asr r0, r1, #0xb - lsr r0, r0, #0x14 - add r0, r1, r0 - asr r7, r0, #0xc - add r0, r7, #0 - str r0, [sp, #0xc] - add r0, #0xc0 - ldr r6, [sp, #4] - add r5, #0x5c - str r0, [sp, #0xc] -_022287C6: - add r0, r5, #0 - bl WindowIsInUse - cmp r0, #0 - beq _022287F2 - add r0, r5, #0 - bl GetWindowY - sub r0, r0, #1 - lsl r4, r0, #3 - add r0, r5, #0 - bl GetWindowHeight - cmp r7, r4 - ble _022287E8 - mov r0, #1 - str r0, [sp, #8] -_022287E8: - ldr r0, [sp, #0xc] - cmp r0, r4 - bgt _022287F2 - mov r0, #1 - str r0, [sp, #4] -_022287F2: - add r6, r6, #1 - add r5, #0x10 - cmp r6, #9 - blo _022287C6 - mov r1, #0x1a - ldr r0, [sp] - lsl r1, r1, #4 - ldr r0, [r0, r1] - ldr r1, [sp, #8] - lsl r1, r1, #1 - bl Sprite_SetAnimCtrlSeq - mov r1, #0x1a - ldr r0, [sp] - lsl r1, r1, #4 - ldr r0, [r0, r1] - mov r1, #0 - bl Sprite_SetAnimActiveFlag - mov r1, #0x69 - ldr r0, [sp] - lsl r1, r1, #2 - ldr r0, [r0, r1] - ldr r1, [sp, #4] - lsl r1, r1, #1 - add r1, r1, #1 - bl Sprite_SetAnimCtrlSeq - mov r1, #0x69 - ldr r0, [sp] - lsl r1, r1, #2 - ldr r0, [r0, r1] - mov r1, #0 - bl Sprite_SetAnimActiveFlag - add sp, #0x10 - pop {r3, r4, r5, r6, r7, pc} - thumb_func_end ov74_0222879C - - thumb_func_start ov74_0222883C -ov74_0222883C: ; 0x0222883C - push {r3, r4, r5, r6, r7, lr} - bl OverlayManager_GetData - mov r1, #0x1a - add r7, r0, #0 - lsl r1, r1, #4 - ldr r0, [r7, r1] - cmp r0, #0 - bne _02228856 - add r1, r1, #4 - ldr r1, [r7, r1] - cmp r1, #0 - beq _02228868 -_02228856: - bl Sprite_Delete - mov r0, #0x69 - lsl r0, r0, #2 - ldr r0, [r7, r0] - bl Sprite_Delete - bl ov74_022359BC -_02228868: - add r5, r7, #0 - mov r6, #0 - add r4, r7, #0 - add r5, #0x5c -_02228870: - ldr r0, [r4, #0x5c] - cmp r0, #0 - beq _02228882 - add r0, r5, #0 - bl ClearWindowTilemapAndCopyToVram - add r0, r5, #0 - bl RemoveWindow -_02228882: - add r6, r6, #1 - add r4, #0x10 - add r5, #0x10 - cmp r6, #9 - blo _02228870 - ldr r0, [r7] - mov r1, #0 - bl FreeBgTilemapBuffer - ldr r0, [r7] - mov r1, #1 - bl FreeBgTilemapBuffer - ldr r0, [r7] - mov r1, #2 - bl FreeBgTilemapBuffer - ldr r2, _022288C0 ; =0x04000304 - ldrh r1, [r2] - lsr r0, r2, #0xb - orr r0, r1 - strh r0, [r2] - ldr r0, [r7] - bl FreeToHeap - mov r0, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - pop {r3, r4, r5, r6, r7, pc} - nop -_022288C0: .word 0x04000304 - thumb_func_end ov74_0222883C - - thumb_func_start ov74_022288C4 -ov74_022288C4: ; 0x022288C4 - mov r1, #0x6a - lsl r1, r1, #2 - ldr r2, [r0, r1] - lsl r3, r2, #1 - ldr r2, _022288F0 ; =ov74_0223BBF0 - ldrh r2, [r2, r3] - cmp r2, #0 - bne _022288D8 - mov r2, #0 - str r2, [r0, r1] -_022288D8: - mov r1, #0x6a - lsl r1, r1, #2 - ldr r3, [r0, r1] - add r2, r3, #1 - str r2, [r0, r1] - ldr r0, _022288F0 ; =ov74_0223BBF0 - lsl r1, r3, #1 - ldrh r1, [r0, r1] - ldr r0, _022288F4 ; =0x0500006C - strh r1, [r0] - bx lr - nop -_022288F0: .word ov74_0223BBF0 -_022288F4: .word 0x0500006C - thumb_func_end ov74_022288C4 - - thumb_func_start ov74_022288F8 -ov74_022288F8: ; 0x022288F8 - push {r4, lr} - add r4, r0, #0 - bl GF_RunVramTransferTasks - bl OamManager_ApplyAndResetBuffers - add r0, r4, #0 - bl DoScheduledBgGpuUpdates - ldr r3, _02228918 ; =0x027E0000 - ldr r1, _0222891C ; =0x00003FF8 - mov r0, #1 - ldr r2, [r3, r1] - orr r0, r2 - str r0, [r3, r1] - pop {r4, pc} - .balign 4, 0 -_02228918: .word 0x027E0000 -_0222891C: .word 0x00003FF8 - thumb_func_end ov74_022288F8 - - thumb_func_start ov74_MainMenu_AppInit -ov74_MainMenu_AppInit: ; 0x02228920 - push {r3, r4, r5, lr} - mov r2, #1 - add r5, r0, #0 - mov r0, #3 - mov r1, #0x4f - lsl r2, r2, #0x12 - bl CreateHeap - mov r1, #0x6e - add r0, r5, #0 - lsl r1, r1, #2 - mov r2, #0x4f - bl OverlayManager_CreateAndGetData - mov r2, #0x6e - mov r1, #0 - lsl r2, r2, #2 - add r4, r0, #0 - bl memset - mov r0, #0x4f - bl BgConfig_Alloc - str r0, [r4] - mov r0, #0 - add r1, r0, #0 - bl sub_0200FBF4 - mov r0, #1 - mov r1, #0 - bl sub_0200FBF4 - add r0, r5, #0 - bl OverlayManager_GetArgs - ldr r0, [r0, #8] - str r0, [r4, #4] - bl Save_MysteryGift_Get - str r0, [r4, #0x14] - mov r0, #0x4d - mov r1, #0 - lsl r0, r0, #2 - str r1, [r4, r0] - add r0, r0, #4 - str r1, [r4, r0] - ldr r0, [r4, #4] - bl Save_PlayerData_GetProfileAddr - str r0, [r4, #0xc] - ldr r0, [r4, #4] - bl Save_Pokedex_Get - str r0, [r4, #8] - ldr r0, [r4, #4] - bl Save_PlayerData_GetIGTAddr - str r0, [r4, #0x10] - ldr r0, [r4, #8] - bl Pokedex_IsEnabled - str r0, [r4, #0x4c] - ldr r0, [r4, #0xc] - bl PlayerProfile_CountBadges - str r0, [r4, #0x50] - mov r0, #0x51 - mov r1, #0xf - lsl r0, r0, #2 - str r1, [r4, r0] - mov r0, #0x4f - bl ov74_022352A0 - ldr r0, [r4, #4] - bl Save_FileExists - cmp r0, #0 - bne _022289C4 - mov r0, #0x61 - mov r1, #1 - lsl r0, r0, #2 - str r1, [r4, r0] -_022289C4: - mov r0, #0 - bl sub_02005AF8 - mov r0, #0 - bl sub_02004AD8 - mov r0, #1 - pop {r3, r4, r5, pc} - thumb_func_end ov74_MainMenu_AppInit - - thumb_func_start ov74_MainMenu_AppExec -ov74_MainMenu_AppExec: ; 0x022289D4 - push {r4, r5, r6, lr} - add r6, r0, #0 - add r5, r1, #0 - bl OverlayManager_GetData - add r4, r0, #0 - ldr r0, [r4, #0x18] - add r0, r0, #1 - str r0, [r4, #0x18] - bl CTRDG_IsExisting - add r0, r4, #0 - bl ov74_0222779C - cmp r0, #1 - bne _02228A04 - add r0, r4, #0 - bl ov74_022276AC - add r0, r4, #0 - bl ov74_02227AEC - mov r0, #0 - pop {r4, r5, r6, pc} -_02228A04: - add r0, r4, #0 - bl ov74_022288C4 - mov r0, #0x6d - lsl r0, r0, #2 - ldr r1, [r4, r0] - cmp r1, #0 - beq _02228A18 - sub r1, r1, #1 - str r1, [r4, r0] -_02228A18: - ldr r0, [r5] - cmp r0, #9 - bls _02228A20 - b _02228B70 -_02228A20: - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_02228A2C: ; jump table - .short _02228A40 - _02228A2C - 2 ; case 0 - .short _02228A4C - _02228A2C - 2 ; case 1 - .short _02228A72 - _02228A2C - 2 ; case 2 - .short _02228A8A - _02228A2C - 2 ; case 3 - .short _02228AB8 - _02228A2C - 2 ; case 4 - .short _02228AFC - _02228A2C - 2 ; case 5 - .short _02228B32 - _02228A2C - 2 ; case 6 - .short _02228B5A - _02228A2C - 2 ; case 7 - .short _02228B64 - _02228A2C - 2 ; case 8 - .short _02228B6C - _02228A2C - 2 ; case 9 -_02228A40: - add r0, r4, #0 - bl ov74_02227B7C - mov r0, #1 - str r0, [r5] - b _02228B70 -_02228A4C: - add r0, r4, #0 - bl ov74_02227580 - cmp r0, #0 - bne _02228A5C - mov r0, #3 - str r0, [r5] - b _02228B70 -_02228A5C: - mov r0, #1 - mov r1, #2 - add r2, r5, #0 - mov r3, #8 - bl ov74_0223539C - mov r0, #5 - ldr r1, _02228B84 ; =0x00007D8C - lsl r0, r0, #0x18 - strh r1, [r0] - b _02228B70 -_02228A72: - add r0, r4, #0 - bl ov74_02227584 - cmp r0, #0 - bne _02228B70 - mov r0, #0 - mov r1, #3 - add r2, r5, #0 - mov r3, #8 - bl ov74_0223539C - b _02228B70 -_02228A8A: - mov r0, #0x4f - mov r1, #0xc - lsl r0, r0, #2 - str r1, [r4, r0] - add r0, #0x48 - ldr r0, [r4, r0] - cmp r0, #1 - bne _02228AAC - mov r0, #2 - str r0, [r4, #0x58] - mov r0, #0 - mov r1, #7 - add r2, r5, #0 - mov r3, #8 - bl ov74_0223539C - b _02228B70 -_02228AAC: - add r0, r4, #0 - bl ov74_0222763C - mov r0, #4 - str r0, [r5] - b _02228B70 -_02228AB8: - add r0, r4, #0 - bl ov74_02227CC8 - add r0, r4, #0 - bl ov74_02227D48 - ldr r0, _02228B88 ; =ov74_022288F8 - ldr r1, [r4] - bl Main_SetVBlankIntrCB - add r0, r4, #0 - bl ov74_022282CC - add r1, r4, #0 - add r1, #0x54 - ldrh r1, [r1] - add r0, r4, #0 - bl ov74_0222841C - mov r0, #1 - mov r1, #5 - add r2, r5, #0 - mov r3, #8 - bl ov74_0223539C - mov r0, #5 - ldr r1, _02228B84 ; =0x00007D8C - lsl r0, r0, #0x18 - strh r1, [r0] - mov r0, #0x4f - mov r1, #0xa - lsl r0, r0, #2 - str r1, [r4, r0] - b _02228B70 -_02228AFC: - add r0, r4, #0 - add r1, r5, #0 - bl ov74_02227428 - ldr r0, [r4, #0x48] - cmp r0, #1 - bne _02228B16 - add r0, r4, #0 - bl ov74_022282CC - mov r0, #0 - str r0, [r4, #0x48] - b _02228B70 -_02228B16: - ldr r0, [r5] - cmp r0, #5 - bne _02228B70 - mov r0, #0x62 - lsl r0, r0, #2 - ldr r1, [r4, r0] - cmp r1, #1 - bne _02228B70 - mov r1, #0 - str r1, [r4, r0] - mov r1, #1 - sub r0, #0x40 - str r1, [r4, r0] - b _02228B70 -_02228B32: - mov r0, #0x51 - lsl r0, r0, #2 - ldr r1, [r4, r0] - cmp r1, #0xf - bne _02228B70 - add r0, #0xc - ldr r1, [r4, r0] - mov r0, #2 - tst r0, r1 - beq _02228B4C - mov r0, #5 - str r0, [r5] - b _02228B70 -_02228B4C: - mov r0, #0 - mov r1, #7 - add r2, r5, #0 - mov r3, #8 - bl ov74_0223539C - b _02228B70 -_02228B5A: - add r0, r6, #0 - bl ov74_0222883C - mov r0, #1 - pop {r4, r5, r6, pc} -_02228B64: - add r0, r5, #0 - bl ov74_022353FC - b _02228B70 -_02228B6C: - mov r0, #1 - pop {r4, r5, r6, pc} -_02228B70: - add r0, r4, #0 - bl ov74_022276AC - add r0, r4, #0 - bl ov74_02227AEC - bl ov74_022358BC - mov r0, #0 - pop {r4, r5, r6, pc} - .balign 4, 0 -_02228B84: .word 0x00007D8C -_02228B88: .word ov74_022288F8 - thumb_func_end ov74_MainMenu_AppExec - - .public ov36_App_MainMenu_SelectOption_Continue - .public ov36_App_MainMenu_SelectOption_NewGame - .public gApp_MainMenu_SelectOption_NintendoWFCSetup - .public ov112_App_MainMenu_SelectOption_ConnectToPokewalker - .public gApp_MainMenu_SelectOption_NintendoWFCSetup - .public ov75_App_MainMenu_SelectOption_WiiMessageSettings + .public MainMenuApp_Init + .public MainMenuApp_Main + .public MainMenuApp_Exit + .public ov74_0223B2C0 + .public ov74_0223B2CC + .public ov74_0223B2D8 + .public ov74_0223B2E8 + .public gApp_MainMenu_SelectOption_ConnectToRanger + .public gApp_MainMenu_SelectOption_MigrateFromAgb + .public gApp_MainMenu_SelectOption_MysteryGift - thumb_func_start ov74_MainMenu_QueueSelectedApp -ov74_MainMenu_QueueSelectedApp: ; 0x02228B8C - push {r3, lr} - ldr r0, [r0, #0x58] - cmp r0, #9 - bhi _02228C22 - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_02228BA0: ; jump table - .short _02228C1A - _02228BA0 - 2 ; case 0 - .short _02228BB4 - _02228BA0 - 2 ; case 1 - .short _02228BBE - _02228BA0 - 2 ; case 2 - .short _02228BFE - _02228BA0 - 2 ; case 3 - .short _02228BC8 - _02228BA0 - 2 ; case 4 - .short _02228BDC - _02228BA0 - 2 ; case 5 - .short _02228BD2 - _02228BA0 - 2 ; case 6 - .short _02228BE6 - _02228BA0 - 2 ; case 7 - .short _02228BEE - _02228BA0 - 2 ; case 8 - .short _02228C0C - _02228BA0 - 2 ; case 9 -_02228BB4: - ldr r0, _02228C24 ; =FS_OVERLAY_ID(OVY_36) - ldr r1, _02228C28 ; =ov36_App_MainMenu_SelectOption_Continue - bl RegisterMainOverlay - pop {r3, pc} -_02228BBE: - ldr r0, _02228C24 ; =FS_OVERLAY_ID(OVY_36) - ldr r1, _02228C2C ; =ov36_App_MainMenu_SelectOption_NewGame - bl RegisterMainOverlay - pop {r3, pc} -_02228BC8: - ldr r0, _02228C30 ; =FS_OVERLAY_ID(OVY_74) - ldr r1, _02228C34 ; =gApp_MainMenu_SelectOption_MysteryGift - bl RegisterMainOverlay - pop {r3, pc} -_02228BD2: - ldr r0, _02228C30 ; =FS_OVERLAY_ID(OVY_74) - ldr r1, _02228C38 ; =gApp_MainMenu_SelectOption_MigrateFromAgb - bl RegisterMainOverlay - pop {r3, pc} -_02228BDC: - ldr r0, _02228C30 ; =FS_OVERLAY_ID(OVY_74) - ldr r1, _02228C3C ; =gApp_MainMenu_SelectOption_ConnectToRanger - bl RegisterMainOverlay - pop {r3, pc} -_02228BE6: - ldr r0, _02228C40 ; =ov74_0223BD4C ; "data/eoo.dat" - bl sub_02027098 - pop {r3, pc} -_02228BEE: - bl Sound_Stop - mov r0, #0 - ldr r1, _02228C44 ; =gApp_MainMenu_SelectOption_NintendoWFCSetup - mvn r0, r0 - bl RegisterMainOverlay - pop {r3, pc} -_02228BFE: - bl Sound_Stop - ldr r0, _02228C48 ; =FS_OVERLAY_ID(OVY_112) - ldr r1, _02228C4C ; =ov112_App_MainMenu_SelectOption_ConnectToPokewalker - bl RegisterMainOverlay - pop {r3, pc} -_02228C0C: - bl Sound_Stop - ldr r0, _02228C50 ; =FS_OVERLAY_ID(OVY_75) - ldr r1, _02228C54 ; =ov75_App_MainMenu_SelectOption_WiiMessageSettings - bl RegisterMainOverlay - pop {r3, pc} -_02228C1A: - ldr r0, _02228C58 ; =FS_OVERLAY_ID(intro_title) - ldr r1, _02228C5C ; =gApplication_TitleScreen - bl RegisterMainOverlay -_02228C22: - pop {r3, pc} - .balign 4, 0 -_02228C24: .word FS_OVERLAY_ID(OVY_36) -_02228C28: .word ov36_App_MainMenu_SelectOption_Continue -_02228C2C: .word ov36_App_MainMenu_SelectOption_NewGame -_02228C30: .word FS_OVERLAY_ID(OVY_74) -_02228C34: .word gApp_MainMenu_SelectOption_MysteryGift -_02228C38: .word gApp_MainMenu_SelectOption_MigrateFromAgb -_02228C3C: .word gApp_MainMenu_SelectOption_ConnectToRanger -_02228C40: .word ov74_0223BD4C -_02228C44: .word gApp_MainMenu_SelectOption_NintendoWFCSetup -_02228C48: .word FS_OVERLAY_ID(OVY_112) -_02228C4C: .word ov112_App_MainMenu_SelectOption_ConnectToPokewalker -_02228C50: .word FS_OVERLAY_ID(OVY_75) -_02228C54: .word ov75_App_MainMenu_SelectOption_WiiMessageSettings -_02228C58: .word FS_OVERLAY_ID(intro_title) -_02228C5C: .word gApplication_TitleScreen - thumb_func_end ov74_MainMenu_QueueSelectedApp - - thumb_func_start ov74_MainMenu_AppExit -ov74_MainMenu_AppExit: ; 0x02228C60 - push {r4, lr} - add r4, r0, #0 - bl OverlayManager_GetData - bl ov74_MainMenu_QueueSelectedApp - add r0, r4, #0 - bl OverlayManager_FreeData - mov r0, #0x4f - bl DestroyHeap - mov r0, #0 - bl ov74_02236034 - mov r0, #1 - pop {r4, pc} - .balign 4, 0 - thumb_func_end ov74_MainMenu_AppExit + .text thumb_func_start ov74_02228C84 ov74_02228C84: ; 0x02228C84 @@ -32782,22 +29226,9 @@ _02237068: .word 0x0000FFFF .rodata -_0223B2C0: - .byte 0x06, 0x22, 0xDE, 0xFA, 0x9E, 0xBA, 0xDE, 0xFA, 0xFF, 0x00, 0x00, 0x00 -_0223B2CC: - .byte 0x70, 0x88, 0x20, 0xE0 - .byte 0x98, 0xB0, 0x20, 0xE0, 0xFF, 0x00, 0x00, 0x00 -_0223B2D8: - .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -_0223B2E8: - .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00 - .public gApp_MainMenu gApp_MainMenu: - .word ov74_MainMenu_AppInit, ov74_MainMenu_AppExec, ov74_MainMenu_AppExit, 0xFFFFFFFF + .word MainMenuApp_Init, MainMenuApp_Main, MainMenuApp_Exit, 0xFFFFFFFF gApp_MainMenu_SelectOption_ConnectToRanger: .word ov74_02229200, ov74_02229294, ov74_02229450, 0xFFFFFFFF _0223B330: @@ -33092,63 +29523,6 @@ _0223B760: .data -_0223BBC0: - .byte 0x00, 0x00, 0x00, 0x00 - -ov74_0223BBC4: ; 0x0223BBC4 - .word msg_0442_00013 - .word msg_0442_00014 - .word msg_0442_00016 - .word msg_0442_00015 - -ov74_0223BBD4: ; 0x0223BBD4 - .byte 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00 - .byte 0x0E, 0x00, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -ov74_0223BBF0: ; 0x0223BBF0 - .byte 0x81, 0x53, 0x83, 0x53, 0x85, 0x53, 0x87, 0x53, 0x89, 0x53, 0x8B, 0x53, 0x8D, 0x53, 0x8F, 0x53 - .byte 0x91, 0x53, 0x93, 0x53, 0x95, 0x53, 0x97, 0x53, 0x99, 0x53, 0x9B, 0x53, 0x9D, 0x53, 0x9F, 0x53 - .byte 0x9D, 0x53, 0x9B, 0x53, 0x99, 0x53, 0x97, 0x53, 0x95, 0x53, 0x93, 0x53, 0x91, 0x53, 0x8F, 0x53 - .byte 0x8D, 0x53, 0x8B, 0x53, 0x89, 0x53, 0x87, 0x53, 0x85, 0x53, 0x83, 0x53, 0x00, 0x00, 0x00, 0x00 - -ov74_0223BC30: ; 0x0223BC30 - .byte 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 - .byte 0x01, 0x00, 0x00, 0x00 - -ov74_0223BC44: ; 0x0223BC44 - .byte 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 - .byte 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 - -ov74_0223BC58: ; 0x0223BC58 - .byte 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 - .byte 0x18, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -ov74_0223BC6C: ; 0x0223BC6C - .byte 0x04, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 - -ov74_0223BC80: ; 0x0223BC80 - .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00 - .byte 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00 - .byte 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00 - -ov74_0223BCBC: ; 0x0223BCBC - ; internal code, button height, button text, print function - .word 1, 10, msg_0442_00000, ov74_MainMenu_PrintContinueButton - .word 2, 4, msg_0442_00001, 0 ; New Game - .word 3, 4, msg_0442_00009, ov74_MainMenu_PrintConnectToPokewalkerButton - .word 4, 4, msg_0442_00002, ov74_MainMenu_PrintMysteryGiftButton - .word 5, 4, msg_0442_00003, ov74_MainMenu_PrintConnectToRangerButton - .word 6, 4, msg_0442_00000, ov74_MainMenu_PrintMigrateFromAgbButton ; 4, 5, 6, 7, or 8 depending on crtdg - .word 7, 4, msg_0442_00011, ov74_MainMenu_PrintConnectToWiiButton - .word 8, 4, msg_0442_00012, ov74_MainMenu_PrintNintendoWFCSetupButton - .word 9, 4, msg_0442_00010, ov74_MainMenu_PrintWiiMessageSettingsButton - -ov74_0223BD4C: ; 0x0223BD4C - .asciz "data/eoo.dat" - .balign 4, 0 - ov74_0223BD5C: ; 0x0223BD5C .word 0x00150116 ; bitfield .word ov74_0223D090 diff --git a/include/application/main_menu/main_menu.h b/include/application/main_menu/main_menu.h new file mode 100644 index 000000000..c0a6fe06d --- /dev/null +++ b/include/application/main_menu/main_menu.h @@ -0,0 +1,14 @@ +#ifndef POKEHEARTGOLD_APPLICATION_MAIN_MENU_MAIN_MENU_H +#define POKEHEARTGOLD_APPLICATION_MAIN_MENU_MAIN_MENU_H + +#include "overlay_manager.h" + +FS_EXTERN_OVERLAY(OVY_74); + +extern const OVY_MGR_TEMPLATE gApp_MainMenu; + +BOOL MainMenuApp_Init(OVY_MANAGER *manager, int *state); +BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state); +BOOL MainMenuApp_Exit(OVY_MANAGER *manager, int *state); + +#endif diff --git a/include/overlay_36.h b/include/overlay_36.h index d99e10596..180bb287b 100644 --- a/include/overlay_36.h +++ b/include/overlay_36.h @@ -3,6 +3,9 @@ #include "overlay_manager.h" +FS_EXTERN_OVERLAY(OVY_36); +extern const OVY_MGR_TEMPLATE ov36_App_MainMenu_SelectOption_Continue; +extern const OVY_MGR_TEMPLATE ov36_App_MainMenu_SelectOption_NewGame; extern const OVY_MGR_TEMPLATE ov36_App_InitGameState_AfterOakSpeech; #endif // GUARD_POKEHEARTGOLD_OVERLAY_36_H diff --git a/main.lsf b/main.lsf index fc75a8761..1f1c8d52a 100644 --- a/main.lsf +++ b/main.lsf @@ -920,6 +920,7 @@ Overlay OVY_73 Overlay OVY_74 { After OVY_38 + Object src/application/main_menu/main_menu.o Object asm/overlay_74_thumb.o Object asm/nitrocrypto.o } diff --git a/src/application/check_savedata.c b/src/application/check_savedata.c index 0276ec1f7..a7c5deaed 100644 --- a/src/application/check_savedata.c +++ b/src/application/check_savedata.c @@ -4,6 +4,7 @@ #include "global.h" +#include "application/main_menu/main_menu.h" #include "msgdata/msg.naix" #include "msgdata/msg/msg_0229.h" @@ -184,8 +185,6 @@ BOOL CheckSavedataApp_Exit(OVY_MANAGER *manager, int *state) { OverlayManager_FreeData(manager); DestroyHeap(heapId); - FS_EXTERN_OVERLAY(OVY_74); - extern const OVY_MGR_TEMPLATE gApp_MainMenu; RegisterMainOverlay(FS_OVERLAY_ID(OVY_74), &gApp_MainMenu); return TRUE; diff --git a/src/application/main_menu/main_menu.c b/src/application/main_menu/main_menu.c new file mode 100644 index 000000000..15674143f --- /dev/null +++ b/src/application/main_menu/main_menu.c @@ -0,0 +1,1525 @@ +#include "application/main_menu/main_menu.h" + +#include "global.h" + +#include "msgdata/msg.naix" +#include "msgdata/msg/msg_0017.h" +#include "msgdata/msg/msg_0442.h" + +#include "bg_window.h" +#include "font.h" +#include "gf_gfx_loader.h" +#include "main.h" +#include "msgdata.h" +#include "mystery_gift.h" +#include "overlay_36.h" +#include "player_data.h" +#include "pokedex.h" +#include "render_window.h" +#include "sav_system_info.h" +#include "save.h" +#include "save_arrays.h" +#include "save_data_read_error.h" +#include "sound_02004A44.h" +#include "sprite.h" +#include "system.h" +#include "text.h" +#include "title_screen.h" +#include "touchscreen.h" +#include "unk_02005D10.h" +#include "unk_0200B150.h" +#include "unk_0200FA24.h" +#include "vram_transfer_manager.h" + +typedef enum MainMenu_SelectedApp { + SELECTEDAPP_TITLE_SCREEN, + SELECTEDAPP_CONTINUE, + SELECTEDAPP_NEW_GAME, + SELECTEDAPP_POKEWALKER, + SELECTEDAPP_MYSTERY_GIFT, + SELECTEDAPP_RANGER, + SELECTEDAPP_MIGRATE_AGB, + SELECTEDAPP_CONNECT_TO_WII, + SELECTEDAPP_WFC, + SELECTEDAPP_WII_SETTINGS, +} MainMenu_SelectedApp; + +typedef struct { + BgConfig *bgConfig; + SaveData *saveData; + Pokedex *pokedex; + PlayerProfile *profile; + IGT *igt; + MysteryGiftSave *mysteryGift; + u32 unk18; + u32 unused1C; + u32 unk20; + u32 connectedAgbGame; + u32 unused28; + BOOL drawConnectToRangerButton; + BOOL drawConnectToWiiButton; + BOOL drawMysteryGiftButton; + u32 unk38; + u32 unused3C; + u32 unk40; + u32 unk44; + u32 unk48; + BOOL hasPokedex; + u32 badges; + u16 unk54; + u16 unk56; + MainMenu_SelectedApp selectedApp; + Window unk5C[9]; + u32 unkEC[18]; + fx32 unk134; + fx32 unk138; + u32 unk13C; + u32 unk140; + u32 unk144; + u32 unk148; + u32 unk14C; + u32 unk150; + Window unk154[3]; + BOOL dontHaveSavedata; + u32 unk188; + u32 unk18C[1]; + Window unk190; + Sprite *upArrowSprite; + Sprite *downArrowSprite; + u32 unk1A8; + u32 unk1AC; + int unk1B0; + u32 unk1B4; +} MainMenuAppData; + +typedef struct UnkStruct_ov74_02235414 { + u32 unk0; + u8 unk4[0xC]; + Window *window; + u8 unk14[0x20 - 0x14]; + u32 textX; + u32 textY; + u8 unk28[4]; + u32 layer; + u32 paletteNum1; + u32 gmmId; + u32 baseTile; + u32 paletteNum2; + u32 fontId; + u8 unk44[0x10]; +} UnkStruct_ov74_02235414; + +typedef BOOL (*MainMenuPrintFunction)(MainMenuAppData *, u32, UnkStruct_ov74_02235414 *, u32); + +typedef struct MainMenuButton { + MainMenu_SelectedApp id; + u32 buttonHeight; + u32 msgId; + MainMenuPrintFunction printFunction; +} MainMenuButton; + +extern void sub_02005AF8(u32 a0); +extern void sub_02027098(const char *path); +extern void sub_02038D28(SaveData *saveData); +extern void sub_02038D64(void); +extern u32 sub_02038D80(void); + +extern u32 PmAgbCartridgeGetOffsets(u32 a0); +extern u32 PmAgbCartridge_GetVersionInternal(void); +extern u32 PmAgbCartridge_GetLanguage(void); +extern void ov74_0223512C(HeapID heapId); +extern u32 ov74_02235230(void); +extern void ov74_022352A0(HeapID heapId); +extern void ov74_02235308(BgConfig *bgConfig, u8 bgId, u32 screenSize, u32 screenBase, u32 charBase); +extern void ov74_02235390(u32 a0); +extern void ov74_0223539C(u32 a0, u32 a1, int *state, u32 a3); +extern void ov74_022353FC(int *state); +extern void ov74_02235414(UnkStruct_ov74_02235414 *a0, Window *window, u32 palette1, u32 gmmId, u32 baseTile, u32 palette2); +extern void ov74_02235464(UnkStruct_ov74_02235414 *a0, u32 width, u32 height, u32 baseTile); +extern void ov74_02235568(BgConfig *bgConfig, UnkStruct_ov74_02235414 *a1, u32 x, u32 y, u32 msgId); +extern void ov74_0223563C(void); +extern void ov74_02235690(void); +extern void ov74_02235728(NarcId narcId, u32 charFileId, u32 plttFileId, u32 cellFileId, u32 animFileId, u32 a5); +extern void ov74_022358BC(void); +extern Sprite *ov74_02235930(u32 a0, Sprite *sprite, u32 x, u32 y, u32 ctrlSeq); +extern void ov74_022359BC(void); +extern void ov74_02236034(BOOL enable); +extern void ov74_02236074(void); + +extern CTRDG_IsExisting(); + +static void ov74_0222841C(MainMenuAppData *data, int a1); +static void ov74_02228548(MainMenuAppData *data, int a1); +static BOOL ov74_02228698(MainMenuAppData *data, int offset); +static void ov74_022286F8(MainMenuAppData *data, int a1); +static void ov74_0222879C(MainMenuAppData *data); +static void ov74_022288C4(MainMenuAppData *data); + +static BOOL MainMenu_PrintContinueButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); +static BOOL MainMenu_PrintMigrateFromAgbButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); +static BOOL MainMenu_PrintMysteryGiftButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); +static BOOL MainMenu_PrintConnectToRangerButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); +static BOOL MainMenu_PrintConnectToWiiButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); +static BOOL MainMenu_PrintNintendoWFCSetupButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); +static BOOL MainMenu_PrintConnectToPokewalkerButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); +static BOOL MainMenu_PrintWiiMessageSettingsButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); + +static MainMenuButton sMainMenuButtons[] = { + { .id = SELECTEDAPP_CONTINUE, .buttonHeight = 10, .msgId = msg_0442_00000, .printFunction = MainMenu_PrintContinueButton }, + { .id = SELECTEDAPP_NEW_GAME, .buttonHeight = 4, .msgId = msg_0442_00001, .printFunction = NULL }, + { .id = SELECTEDAPP_POKEWALKER, .buttonHeight = 4, .msgId = msg_0442_00009, .printFunction = MainMenu_PrintConnectToPokewalkerButton }, + { .id = SELECTEDAPP_MYSTERY_GIFT, .buttonHeight = 4, .msgId = msg_0442_00002, .printFunction = MainMenu_PrintMysteryGiftButton }, + { .id = SELECTEDAPP_RANGER, .buttonHeight = 4, .msgId = msg_0442_00003, .printFunction = MainMenu_PrintConnectToRangerButton }, + { .id = SELECTEDAPP_MIGRATE_AGB, .buttonHeight = 4, .msgId = 0, .printFunction = MainMenu_PrintMigrateFromAgbButton }, // msgId can be 4, 5, 6, 7 or 8 depending on the inserted cartridge + { .id = SELECTEDAPP_CONNECT_TO_WII, .buttonHeight = 4, .msgId = msg_0442_00011, .printFunction = MainMenu_PrintConnectToWiiButton }, + { .id = SELECTEDAPP_WFC, .buttonHeight = 4, .msgId = msg_0442_00012, .printFunction = MainMenu_PrintNintendoWFCSetupButton }, + { .id = SELECTEDAPP_WII_SETTINGS, .buttonHeight = 4, .msgId = msg_0442_00010, .printFunction = MainMenu_PrintWiiMessageSettingsButton }, +}; + +static const TouchscreenHitbox sNewGameButtonHitboxes[] = { + { .rect = { .top = 112, .bottom = 112 + 24, .left = 32, .right = GX_LCD_SIZE_X - 32 } }, + { .rect = { .top = 152, .bottom = 152 + 24, .left = 32, .right = GX_LCD_SIZE_X - 32 } }, + { TOUCHSCREEN_RECTLIST_END }, +}; + +static const TouchscreenHitbox sArrowButtonHitboxes[] = { + { .rect = { .top = 6, .bottom = 6 + 28, .left = 222, .right = 222 + 28 } }, + { .rect = { .top = 158, .bottom = 158 + 28, .left = 222, .right = 222 + 28 } }, + { TOUCHSCREEN_RECTLIST_END }, +}; + +extern const OVY_MGR_TEMPLATE gApp_MainMenu_SelectOption_MysteryGift; +extern const OVY_MGR_TEMPLATE gApp_MainMenu_SelectOption_MigrateFromAgb; +extern const OVY_MGR_TEMPLATE gApp_MainMenu_SelectOption_ConnectToRanger; +extern const OVY_MGR_TEMPLATE gApp_MainMenu_SelectOption_NintendoWFCSetup; +extern const OVY_MGR_TEMPLATE ov112_App_MainMenu_SelectOption_ConnectToPokewalker; +extern const OVY_MGR_TEMPLATE ov75_App_MainMenu_SelectOption_WiiMessageSettings; + +static u32 ov74_02227060(MainMenuAppData *data) { + if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A)) { + data->unk1AC = 0; + return gSystem.newKeys; + } else if (System_GetTouchNew()) { + data->unk1AC = 1; + return PAD_BUTTON_A; + } + + return 0; +} + +static u32 ov74_02227098(MainMenuAppData *data, u32 a1) { + for (u32 i = 0, j = 0; i < 9; i++) { + if (data->unkEC[i] != 0 && j++ == a1) { + return i; + } + } + return 0; +} + +static u32 ov74_022270C4(MainMenuAppData *data, int *state, BOOL a2) { + if (!a2) { + PlaySE(SEQ_SE_DP_SELECT); + data->selectedApp = (MainMenu_SelectedApp)data->unkEC[data->unk54]; + if (data->selectedApp == SELECTEDAPP_MIGRATE_AGB && CTRDG_IsPulledOut() == TRUE) { + if (data->unk13C != 12) { + sub_02038D64(); + } + ShowGBACartRemovedError(HEAP_ID_MAIN_MENU); + } + } else { + PlaySE(SEQ_SE_DP_SELECT); + data->selectedApp = SELECTEDAPP_TITLE_SCREEN; + ov74_02235390(1); + } + + if (data->selectedApp == SELECTEDAPP_NEW_GAME) { + data->unk40 |= (1 << 7); + data->unk148 = 1; + *state = 6; + } else { + if (data->selectedApp == SELECTEDAPP_CONNECT_TO_WII) { + ov74_02235390(1); + } + ov74_0223539C(0, 7, state, 8); + } + + if (data->unk13C == 13) { + data->unk13C = 14; + } + + return TRUE; +} + +static int ov74_0222715C(MainMenuAppData *data, int a1) { + int i; + int j = 0; + for (i = 0; i < a1; i++) { + if (data->unkEC[i] != 0) { + j++; + } + } + return j; +} + +static BOOL ov74_02227180(MainMenuAppData *data, int *state) { + BOOL BVar4 = FALSE; + + if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A) && data->unk1AC == 1) { + data->unk1AC = 0; + ov74_0222841C(data, data->unk54); + return FALSE; + } + + if (gSystem.newKeys & PAD_BUTTON_A) { + return ov74_022270C4(data, state, FALSE); + } else if (gSystem.newKeys & PAD_BUTTON_B) { + return ov74_022270C4(data, state, TRUE); + } + + if (data->unk48 != 0) { + return FALSE; + } + + u32 unaff_r6; + u32 uVar1 = data->unk54; + if (gSystem.newKeys & PAD_KEY_UP) { + if (ov74_02228698(data, -1)) { + unaff_r6 = ov74_0222715C(data, uVar1); + if (unaff_r6 == 7) { + unaff_r6 = 3; + BVar4 = TRUE; + } else if (unaff_r6 == 3) { + unaff_r6 = 0; + BVar4 = TRUE; + } + } + } else if (gSystem.newKeys & PAD_KEY_DOWN) { + BVar4 = ov74_02228698(data, 1); + unaff_r6 = data->unk54; + } + + if (BVar4) { + ov74_022286F8(data, unaff_r6); + } + + return FALSE; +} + +static BOOL ov74_02227240(MainMenuAppData *data, int *state, BOOL *a2) { + BOOL bVar1; + + int hitboxNum = -1; + bVar1 = FALSE; + + if (!System_GetTouchNew()) { + return FALSE; + } + + if (data->unk48 == 0 && data->unk1B4 == 0) { + hitboxNum = TouchscreenHitbox_FindRectAtTouchNew(sArrowButtonHitboxes); + } + + if (hitboxNum == 0 && Sprite_GetAnimationNumber(data->upArrowSprite) / 2 != 0) { + Sprite_SetAnimActiveFlag(data->upArrowSprite, TRUE); + Sprite_ResetAnimCtrlState(data->upArrowSprite); + if (data->unk54 > 3 && data->unk138 > FX32_CONST(192)) { + data->unk54 = ov74_02227098(data, 3); + } else { + data->unk54 = ov74_02227098(data, 0); + } + bVar1 = TRUE; + *a2 = TRUE; + } else if (hitboxNum == 1 && Sprite_GetAnimationNumber(data->downArrowSprite) / 2 != 0) { + Sprite_SetAnimActiveFlag(data->downArrowSprite, TRUE); + Sprite_ResetAnimCtrlState(data->downArrowSprite); + if (data->unk54 < 3) { + data->unk54 = ov74_02227098(data, 3); + } else { + data->unk54 = ov74_02227098(data, 7); + } + bVar1 = TRUE; + *a2 = TRUE; + } + + if (bVar1) { + data->unk1AC = 1; + ov74_0222841C(data, data->unk54); + ov74_022286F8(data, data->unk54); + data->unk1B4 = 6; + return FALSE; + } + + u16 unk = 0xFFFE; + u16 uVar5 = gSystem.touchY + (data->unk138 / FX32_ONE); + if (uVar5 >= 0x200) { + return FALSE; + } + + if (!DoesPixelAtScreenXYMatchPtrVal(data->bgConfig, GF_BG_LYR_MAIN_0, gSystem.touchX, uVar5, &unk)) { + return FALSE; + } + + *a2 = TRUE; + + uVar5 = gSystem.touchY / 48; + if (data->unk138 == 0) { + if (uVar5 != 0) { + uVar5--; + } + } else if (data->unk138 == FX32_CONST(192)) { + uVar5 += 3; + } else { + uVar5 += 7; + } + + if (uVar5 >= data->unk1B0) { + return FALSE; + } + + data->unk54 = ov74_02227098(data, (u8)uVar5); + + data->unk1AC = 1; + ov74_0222841C(data, data->unk54); + return ov74_022270C4(data, state, 0); +} + +static BOOL ov74_02227428(MainMenuAppData *data, int *state) { + BOOL unk = FALSE; + BOOL unk2 = ov74_02227240(data, state, &unk); + if (unk) { + data->unk1AC = 1; + if (data->unk1B4 != 6) { + ov74_0222841C(data, 0xFF); + } + return unk2; + } + return ov74_02227180(data, state); +} + +static u32 ov74_0222746C(MainMenuAppData *data, BOOL *a1) { + if (!System_GetTouchNew()) { + return 0; + } + + int hitboxId = TouchscreenHitbox_FindRectAtTouchNew(sNewGameButtonHitboxes); + if (hitboxId == -1) { + return 0; + } + + u16 something = 0xFFFE; + if (!DoesPixelAtScreenXYMatchPtrVal(data->bgConfig, GF_BG_LYR_MAIN_1, gSystem.touchX, gSystem.touchY, &something)) { + return 0; + } + + u32 ret = 1; + *a1 = TRUE; + if (hitboxId != 0) { + ret = 2; + } + + return ret; +} + +static u32 ov74_022274D4(MainMenuAppData *data) { + BOOL local_10 = FALSE; + u32 uVar1 = ov74_0222746C(data, &local_10); + if (local_10) { + data->unk1AC = 1; + ov74_02228548(data, 0xFF); + return uVar1; + } + + if (gSystem.newKeys == 0) { + return 0; + } + + if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A) && data->unk1AC == 1) { + data->unk1AC = 0; + ov74_02228548(data, data->unk56); + return 0; + } + + if (gSystem.newKeys & (PAD_KEY_UP | PAD_KEY_DOWN)) { + data->unk56 ^= 1; + ov74_02228548(data, data->unk56); + PlaySE(SEQ_SE_DP_SELECT); + return 0; + } + + u32 ret = 1; + if (gSystem.newKeys & PAD_BUTTON_A) { + if (data->unk56 != 0) { + ret = 2; + } + } else { + ret = 2; + if (!(gSystem.newKeys & PAD_BUTTON_B)) { + ret = 0; + } + } + + return ret; +} + +static u32 ov74_02227580(MainMenuAppData *data) { + return 0; +} + +typedef struct { + u32 x; + u32 y; + u32 width; + u32 height; + u32 gmmId; + u32 msgId; + u32 unused18; +} UnkStruct_ov74_0223BBD4; + +static BOOL ov74_02227584(MainMenuAppData *data) { + static UnkStruct_ov74_0223BBD4 ov74_0223BBD4[] = { + { + .x = 5, + .y = 5, + .width = 22, + .height = 14, + .gmmId = NARC_msg_msg_0800_bin, + .msgId = msg_0442_00016, + .unused18 = 0, + }, + }; + + if (!WindowIsInUse(&data->unk190)) { + for (int i = 0; i < 1; i++) { + if (data->unk18C[i] == 1) { + data->unk18C[i] = 0; + UnkStruct_ov74_02235414 unk; + const UnkStruct_ov74_0223BBD4 *unk2 = &ov74_0223BBD4[i]; + ov74_02235414(&unk, &data->unk190, 0, unk2->gmmId, 0x3F7, 2); + ov74_02235464(&unk, unk2->width, unk2->height, 1); + ov74_02235568(data->bgConfig, &unk, unk2->x, unk2->y, unk2->msgId); + return TRUE; + } + } + } else { + if (ov74_02227060(data) & (PAD_BUTTON_B | PAD_BUTTON_A)) { + PlaySE(SEQ_SE_DP_SELECT); + sub_0200E5D4(&data->unk190, FALSE); + RemoveWindow(&data->unk190); + } + return TRUE; + } + + return FALSE; +} + +static void ov74_0222763C(MainMenuAppData *data) { + u32 offsets = PmAgbCartridgeGetOffsets(0); + u32 version = 0; + data->connectedAgbGame = 0; + + if (offsets != 0) { + return; + } + + switch (PmAgbCartridge_GetVersionInternal()) { + case 0: + version = VERSION_RUBY; + break; + case 1: + version = VERSION_SAPPHIRE; + break; + case 2: + version = VERSION_LEAF_GREEN; + break; + case 3: + version = VERSION_FIRE_RED; + break; + case 4: + version = VERSION_EMERALD; + break; + } + sub_0201A4B0(version); + + if (Pokedex_GetNatDexFlag(data->pokedex) && gGameLanguage == PmAgbCartridge_GetLanguage()) { + data->connectedAgbGame = PmAgbCartridge_GetVersionInternal() + 1; + ov74_02236074(); + } +} + +static void ov74_022276AC(MainMenuAppData *data) { + switch (data->unk13C) { + case 10: + data->unk13C = 11; + break; + case 11: + sub_02038D28(data->saveData); + data->unk140 = 120; + data->unk13C = 13; + data->unk40 = 0; + if (SaveMysteryGift_TestFlagx7FF(data->mysteryGift) == TRUE) { + data->unk40 |= (1 << 0); + data->unk44 |= (1 << 0); + } + break; + case 13: { + if (data->unk148 != 0) { + break; + } + + u32 unk = sub_02038D80(); + u32 uVar2 = ~data->unk40 & unk; + if (uVar2 != 0 && data->unk144 == 15 && data->unk148 == 0 && data->unk40 != uVar2) { + data->unk48 = 1; + + if (uVar2 & (1 << 0)) { + data->drawMysteryGiftButton = TRUE; + uVar2 = (1 << 0); + } + + if (uVar2 & (1 << 1)) { + data->drawConnectToRangerButton = TRUE; + uVar2 = (1 << 1); + } + + if (uVar2 & (1 << 2)) { + data->drawConnectToWiiButton = TRUE; + uVar2 = (1 << 2); + } + + if (uVar2 & (1 << 1 | 1 << 0)) { + data->unk188 = 1; + } + + data->unk40 |= uVar2; + } + + data->unk140--; + if (data->unk140 == 0) { + sub_02038D64(); + data->unk13C = 12; + } + + break; + } + case 14: + sub_02038D64(); + data->unk13C = 12; + break; + } +} + +typedef struct { + u32 unk0; + u32 unk4; + u32 unk8; + u32 unkC; + u32 msgId; +} UnkStruct_ov74_0223BC30; + +static BOOL ov74_0222779C(MainMenuAppData *data) { + static UnkStruct_ov74_0223BC30 ov74_0223BC30[] = { + { .unk0 = 4, .unk4 = 2, .unk8 = 24, .unkC = 20, .msgId = msg_0017_00001 }, + { .unk0 = 4, .unk4 = 4, .unk8 = 24, .unkC = 16, .msgId = msg_0017_00003 }, + { .unk0 = 4, .unk4 = 1, .unk8 = 24, .unkC = 22, .msgId = msg_0017_00000 }, + { .unk0 = 4, .unk4 = 3, .unk8 = 24, .unkC = 18, .msgId = msg_0017_00002 }, + { .unk0 = 0, .unk4 = 1, .unk8 = 32, .unkC = 11, .msgId = msg_0017_00005 }, + { .unk0 = 4, .unk4 = 14, .unk8 = 24, .unkC = 3, .msgId = msg_0017_00006 }, + { .unk0 = 4, .unk4 = 19, .unk8 = 24, .unkC = 3, .msgId = msg_0017_00007 }, + }; + + switch (data->unk144) { + case 15: + if (data->unk148 == 0) { + return FALSE; + } + + data->unk148--; + if (data->unk148 == 0) { + data->unk144 = 16; + } + return TRUE; + case 16: + LoadUserFrameGfx1(data->bgConfig, GF_BG_LYR_MAIN_1, 0x3F7, 2, 0, HEAP_ID_MAIN_MENU); + LoadUserFrameGfx1(data->bgConfig, GF_BG_LYR_MAIN_1, 0x3EE, 3, 1, HEAP_ID_MAIN_MENU); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_1); + ((vu16 *)HW_PLTT)[33] = RGB(26, 26, 26); + data->unk144 = 17; + break; + case 17: { + UnkStruct_ov74_02235414 unk; + ov74_02235414(&unk, &data->unk154[0], 0, NARC_msg_msg_0017_bin, 0x3F7, 2); + UnkStruct_ov74_0223BC30 *something; + u32 uVar3 = data->unk40 & ~data->unk44; + if (uVar3 & (1 << 0)) { + something = (data->unk38 & (1 << 0)) ? &ov74_0223BC30[0] : &ov74_0223BC30[1]; + } else if (uVar3 & (1 << 1)) { + something = (data->unk38 & (1 << 1)) ? &ov74_0223BC30[2] : &ov74_0223BC30[3]; + } else if (uVar3 & (1 << 7)) { + unk.unk0 = 2; + something = &ov74_0223BC30[4]; + MsgData *msgData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, unk.gmmId, HEAP_ID_MAIN_MENU); + String *string = NewString_ReadMsgData(msgData, something->msgId); + u32 width = FontID_String_GetWidthMultiline(unk.fontId, string, 0); + unk.textX = (something->unk8 * 8 - width) / 2; + String_Delete(string); + DestroyMsgData(msgData); + unk.textY = 4; + } + ov74_02235464(&unk, something->unk8, something->unkC, 0x91); + unk.layer = GF_BG_LYR_MAIN_1; + ov74_02235568(data->bgConfig, &unk, something->unk0, something->unk4, something->msgId); + + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_1, GetWindowX(unk.window), GetWindowY(unk.window), GetWindowWidth(unk.window), GetWindowHeight(unk.window), 0); + + if ((uVar3 & (1 << 7)) && !(uVar3 & (1 << 1 | 1 << 0))) { + for (int i = 0; i < 2; i++) { + Window *window = &data->unk154[i] + 1; // ??? + ov74_02235414(&unk, window, 0, 17, 0x3F7, 2); + UnkStruct_ov74_0223BC30 *unk2 = &ov74_0223BC30[i + 5]; + unk.textY = 4; + ov74_02235464(&unk, unk2->unk8, unk2->unkC, (i * 72) + 1); + unk.layer = GF_BG_LYR_MAIN_1; + ov74_02235568(data->bgConfig, &unk, unk2->unk0, unk2->unk4, unk2->msgId); + } + data->unk56 = 0; + ov74_02228548(data, -1); + data->unk144 = 19; + data->unk14C = 30; + } else { + data->unk44 |= uVar3; + data->unk144 = 18; + data->unk14C = 30; + } + + GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG0, GF_PLANE_TOGGLE_OFF); + GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG2, GF_PLANE_TOGGLE_OFF); + GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG1, GF_PLANE_TOGGLE_ON); + break; + } + case 18: { + if (data->unk14C != 0) { + data->unk14C--; + break; + } + + u32 unk1ac = data->unk1AC; + u32 uVar3 = ov74_02227060(data); + if (uVar3 & (PAD_BUTTON_B | PAD_BUTTON_A)) { + if (unk1ac != data->unk1AC) { + ov74_0222841C(data, data->unk54); + } + RemoveWindow(&data->unk154[0]); + data->unk144 = 20; + data->unk150 = uVar3; + PlaySE(SEQ_SE_DP_SELECT); + } + break; + } + case 19: + if (data->unk14C != 0) { + data->unk14C--; + if (data->unk14C == 0) { + ov74_02228548(data, 0); + } + } else { + u32 uVar3 = ov74_022274D4(data); + ov74_022288C4(data); + if (uVar3 & 3) { + RemoveWindow(&data->unk154[0]); + RemoveWindow(&data->unk154[1]); + RemoveWindow(&data->unk154[2]); + ov74_0222841C(data, data->unk54); + data->unk144 = 20; + data->unk150 = uVar3; + PlaySE(SEQ_SE_DP_SELECT); + } + } + break; + case 20: + GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG0, GF_PLANE_TOGGLE_ON); + GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG2, GF_PLANE_TOGGLE_ON); + GfGfx_EngineATogglePlanes(GX_PLANEMASK_BG1, GF_PLANE_TOGGLE_OFF); + data->unk144 = 15; + break; + } + + return TRUE; +} + +static void ov74_02227AEC(MainMenuAppData *data) { + if (data->unk134 == data->unk138) { + return; + } + +#define ABS(x) (((x) ^ ((x) >> 31)) - ((x) >> 31)) + + fx32 unk1 = (data->unk138 - data->unk134) / 4; + if (ABS(unk1) > FX32_CONST(12)) { + if (unk1 > 0) { + unk1 = FX32_CONST(12); + } else { + unk1 = FX32_CONST(-12); + } + } + data->unk134 += unk1; + + if (ABS(data->unk138 - data->unk134) < FX32_CONST(0.125f)) { + data->unk134 = data->unk138; + } + + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_0, BG_POS_OP_SET_Y, data->unk134 / FX32_ONE); + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_2, BG_POS_OP_SET_Y, data->unk134 / FX32_ONE); +} + +static void ov74_02227B7C(MainMenuAppData *data) { + static const GraphicsBanks ov74_0223B2E8 = { + .bg = GX_VRAM_BG_128_A, + .subbg = GX_VRAM_SUB_BG_128_C, + .obj = GX_VRAM_OBJ_64_E, + .subobj = GX_VRAM_SUB_OBJ_16_I, + .tex = GX_VRAM_TEX_0_B, + .texpltt = GX_VRAM_TEXPLTT_01_FG, + }; + GraphicsBanks banks = ov74_0223B2E8; + static const GraphicsModes ov74_0223B2D8 = { + .dispMode = GX_DISPMODE_GRAPHICS, + .bgMode = GX_BGMODE_0, + .subMode = GX_BGMODE_0, + ._2d3dMode = GX_BG0_AS_2D, + }; + GraphicsModes modes = ov74_0223B2D8; + GfGfx_SetBanks(&banks); + SetBothScreensModesAndDisable(&modes); + + GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN); + + ov74_02235308(data->bgConfig, GF_BG_LYR_MAIN_0, GF_BG_SCR_SIZE_256x512, 0xF000, 0x0); + G2_SetBG0Priority(2); + BG_ClearCharDataRange(GF_BG_LYR_MAIN_0, 32, 0, HEAP_ID_MAIN_MENU); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_0); + + ov74_02235308(data->bgConfig, GF_BG_LYR_MAIN_1, GF_BG_SCR_SIZE_256x256, 0xD800, 0x8000); + G2_SetBG1Priority(1); + BG_ClearCharDataRange(GF_BG_LYR_MAIN_1, 32, 0, HEAP_ID_MAIN_MENU); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_1); + + ov74_02235308(data->bgConfig, GF_BG_LYR_MAIN_2, GF_BG_SCR_SIZE_256x512, 0xE000, 0x0); + G2_SetBG2Priority(0); + BG_ClearCharDataRange(GF_BG_LYR_MAIN_2, 32, 0, HEAP_ID_MAIN_MENU); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_2); + + ResetAllTextPrinters(); + + LoadFontPal0(GF_PAL_LOCATION_MAIN_BG, GF_PAL_SLOT_1_OFFSET, HEAP_ID_MAIN_MENU); + LoadFontPal0(GF_PAL_LOCATION_MAIN_BG, GF_PAL_SLOT_0_OFFSET, HEAP_ID_MAIN_MENU); + + ((vu16 *)HW_PLTT)[0] = RGB_BLACK; + ((vu16 *)HW_PLTT)[31] = RGB(26, 26, 26); + + LoadUserFrameGfx1(data->bgConfig, GF_BG_LYR_MAIN_0, 0x3F7, 2, 0, HEAP_ID_MAIN_MENU); + LoadUserFrameGfx1(data->bgConfig, GF_BG_LYR_MAIN_0, 0x3EE, 3, 1, HEAP_ID_MAIN_MENU); + + ((vu16 *)HW_PLTT)[33] = RGB(26, 26, 26); +} + +static void ov74_02227CC8(MainMenuAppData *data) { + ov74_0223563C(); + ov74_02235690(); + ov74_02235728(NARC_a_1_1_3, 47, 44, 46, 45, 0); + + data->upArrowSprite = ov74_02235930(0, data->upArrowSprite, 236, 20, 0); + Sprite_SetVisibleFlag(data->upArrowSprite, TRUE); + Sprite_SetAnimActiveFlag(data->upArrowSprite, FALSE); + + data->downArrowSprite = ov74_02235930(0, data->downArrowSprite, 236, 172, 1); + Sprite_SetVisibleFlag(data->downArrowSprite, TRUE); + Sprite_SetAnimActiveFlag(data->downArrowSprite, FALSE); +} + +static void ov74_02227D48(MainMenuAppData *data) { + GfGfxLoader_GXLoadPal(NARC_a_1_1_3, 49, GF_PAL_LOCATION_MAIN_BG, GF_PAL_SLOT_4_OFFSET, 32, HEAP_ID_MAIN_MENU); + GfGfxLoader_LoadCharData(NARC_a_1_1_3, 48, data->bgConfig, GF_BG_LYR_MAIN_2, 0x3E6, 0x100, FALSE, HEAP_ID_MAIN_MENU); +} + +static void ov74_02227D88(MainMenuAppData *data, u32 a1, u32 a2, u32 a3) { + u16 *buffer = GetBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_2); + + u32 unk = 0x43E6; + if (a3 == 2) { + unk += 4; + } + + u32 offset = a1 + (a2 + 0) * 32; + buffer[offset++] = unk + 0; + buffer[offset++] = unk + 1; + offset = a1 + (a2 + 1) * 32; + buffer[offset++] = unk + 2; + buffer[offset++] = unk + 3; + + BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_2); +} + +static void ov74_02227DD4(MainMenuAppData *data, u32 a1, u32 a2) { + u16 *buffer = GetBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_2); + + u32 offset = a1 + (a2 + 0) * 32; + buffer[offset++] = 0; + buffer[offset++] = 0; + offset = a1 + (a2 + 1) * 32; + buffer[offset++] = 0; + buffer[offset++] = 0; + + BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_2); +} + +static void ov74_02227E10(Window *window, MsgData *msgData, MessageFormat *msgFmt, u32 color, u32 msgId, u32 y) { + String *string = ReadMsgData_ExpandPlaceholders(msgFmt, msgData, msgId, HEAP_ID_MAIN_MENU); + int stringPixelWidth = FontID_String_GetWidth(0, string, GetFontAttribute(0, 2)); + u32 x = GetWindowWidth(window) * 8 - (stringPixelWidth + 32); + AddTextPrinterParameterizedWithColor(window, 0, string, x, y, TEXT_SPEED_NOTRANSFER, color, NULL); + String_Delete(string); +} + +static void ov74_02227E64(MessageFormat *messageFormat, int number) { + u32 digits; + PrintingMode printingMode; + + if (number >= 100) { + digits = 3; + printingMode = PRINTING_MODE_LEFT_ALIGN; + } else if (number >= 10) { + digits = 3; + printingMode = PRINTING_MODE_RIGHT_ALIGN; + } else { + digits = 2; + printingMode = PRINTING_MODE_RIGHT_ALIGN; + } + + BufferIntegerAsString(messageFormat, 0, number, digits, printingMode, 1); +} + +static BOOL MainMenu_PrintContinueButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + MessageFormat *messageFormat; + MsgData *msgData; + + msgData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, NARC_msg_msg_0442_bin, HEAP_ID_MAIN_MENU); + messageFormat = MessageFormat_New(HEAP_ID_MAIN_MENU); + u32 textColor = (PlayerProfile_GetTrainerGender(data->profile) == PLAYER_GENDER_FEMALE) ? MAKE_TEXT_COLOR(3, 4, 15) : MAKE_TEXT_COLOR(7, 8, 15); + + ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); + + static u32 sContinueButtonMsgs[] = { + msg_0442_00000, + msg_0442_00013, + msg_0442_00014, + msg_0442_00016, + msg_0442_00015, + }; + for (u32 i = 1; i < NELEMS(sContinueButtonMsgs); i++) { + if (i == 4 && !data->hasPokedex) { + continue; + } + + String *string = ReadMsgData_ExpandPlaceholders(messageFormat, msgData, sContinueButtonMsgs[i], HEAP_ID_MAIN_MENU); + AddTextPrinterParameterizedWithColor(a2->window, 0, string, 32, i * 16, TEXT_SPEED_NOTRANSFER, textColor, NULL); + String_Delete(string); + } + + BufferPlayersName(messageFormat, 0, data->profile); + ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00017, 16); + + ov74_02227E64(messageFormat, GetIGTHours(data->igt)); + BufferIntegerAsString(messageFormat, 1, GetIGTMinutes(data->igt), 2, PRINTING_MODE_LEADING_ZEROS, 1); + ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00018, 32); + + BufferIntegerAsString(messageFormat, 0, data->badges, 2, PRINTING_MODE_LEFT_ALIGN, 1); + ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00020, 48); + + if (data->hasPokedex) { + ov74_02227E64(messageFormat, Pokedex_CountDexOwned(data->pokedex)); + ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00019, 64); + } + + DrawFrameAndWindow1(a2->window, FALSE, a2->baseTile, a2->paletteNum2); + + data->unkEC[a1] = sMainMenuButtons[a1].id; + MessageFormat_Delete(messageFormat); + DestroyMsgData(msgData); + + return TRUE; +} + +static BOOL MainMenu_PrintMigrateFromAgbButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + if (data->connectedAgbGame == 0) { + return FALSE; + } + + u32 msgId; + switch (data->connectedAgbGame - 1) { + case 0: + msgId = msg_0442_00004; + break; + case 1: + msgId = msg_0442_00005; + break; + case 2: + msgId = msg_0442_00006; + break; + case 3: + msgId = msg_0442_00007; + break; + case 4: + msgId = msg_0442_00008; + break; + } + + ov74_02235568(data->bgConfig, a2, 3, a3, msgId); + ov74_02227DD4(data, 23, a3); + data->unkEC[a1] = sMainMenuButtons[a1].id; + + return TRUE; +} + +static BOOL MainMenu_PrintMysteryGiftButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + if (!data->drawMysteryGiftButton) { + if (SaveMysteryGift_TestFlagx7FF(data->mysteryGift) == TRUE) { + data->drawMysteryGiftButton = TRUE; + } + + if (Save_SysInfo_GetMysteryGiftActive(Save_SysInfo_Get(data->saveData)) == TRUE) { + data->drawMysteryGiftButton = TRUE; + } + + ov74_0223512C(HEAP_ID_MAIN_MENU); + + if (ov74_02235230() != 0) { + data->drawMysteryGiftButton = TRUE; + ov74_02236034(TRUE); + } + } + + if (data->drawMysteryGiftButton == TRUE && !data->hasPokedex) { + data->drawMysteryGiftButton = FALSE; + } + + if (data->drawMysteryGiftButton == TRUE) { + ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); + ov74_02227DD4(data, 23, a3); + data->unkEC[a1] = sMainMenuButtons[a1].id; + data->unk38 |= (1 << 0); + SaveMysteryGift_SetFlagx7FF(data->mysteryGift); + + return TRUE; + } + + return FALSE; +} + +static BOOL MainMenu_PrintConnectToRangerButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + if (data->drawConnectToRangerButton == TRUE && data->hasPokedex == TRUE) { + ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); + ov74_02227D88(data, 23, a3, 1); + data->unkEC[a1 + 9] = 1; + data->unkEC[a1] = sMainMenuButtons[a1].id; + data->unk38 |= (1 << 1); + + return TRUE; + } + + return FALSE; +} + +static BOOL MainMenu_PrintConnectToWiiButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + if (data->drawConnectToWiiButton == TRUE) { + ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); + data->unkEC[a1 + 9] = 1; + ov74_02227D88(data, 23, a3, 1); + data->unkEC[a1] = sMainMenuButtons[a1].id; + + return TRUE; + } + + return FALSE; +} + +static BOOL MainMenu_PrintNintendoWFCSetupButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); + data->unkEC[a1 + 9] = 2; + ov74_02227D88(data, 23, a3, 2); + data->unkEC[a1] = sMainMenuButtons[a1].id; + + return TRUE; +} + +static BOOL MainMenu_PrintConnectToPokewalkerButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); + ov74_02227DD4(data, 23, a3); + data->unkEC[a1] = sMainMenuButtons[a1].id; + + return TRUE; +} + +static BOOL MainMenu_PrintWiiMessageSettingsButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { + ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); + ov74_02227DD4(data, 23, a3); + data->unkEC[a1] = sMainMenuButtons[a1].id; + + return TRUE; +} + +static BOOL ov74_022282CC(MainMenuAppData *data) { + u32 uVar3; + u32 i; + + BOOL ret = FALSE; + + data->unk1B0 = 0; + data->unk20 = 1; + + for (i = 0, uVar3 = 1; i < 9; i++) { + const MainMenuButton *button = &sMainMenuButtons[i]; + UnkStruct_ov74_02235414 unk; + ov74_02235414(&unk, &data->unk5C[i], 1, 0x1BA, 0x3F7, 2); + ov74_02235464(&unk, 23, button->buttonHeight, data->unk20); + if (button->printFunction != NULL) { + if (data->unkEC[i] != 0) { + SetWindowX(unk.window, 3); + SetWindowY(unk.window, uVar3); + DrawFrameAndWindow1(unk.window, FALSE, unk.baseTile, unk.paletteNum2); + + if (data->unkEC[9 + i] != 0) { + ov74_02227D88(data, 23, uVar3, data->unkEC[9 + i]); + } else { + ov74_02227DD4(data, 23, uVar3); + } + uVar3 += button->buttonHeight + 2; + ret = TRUE; + } else { + if (button->printFunction(data, i, &unk, uVar3) == TRUE) { + uVar3 += button->buttonHeight + 2; + ret = TRUE; + } + } + } else { + ov74_02235568(data->bgConfig, &unk, 3, uVar3, button->msgId); + data->unkEC[i] = button->id; + uVar3 += button->buttonHeight + 2; + } + + data->unk20 += button->buttonHeight * 23; + if (data->unkEC[i] != 0) { + data->unk1B0++; + } + } + + ov74_0222879C(data); + ov74_0222841C(data, data->unk54); + + return ret; +} + +static void ov74_0222841C(MainMenuAppData *data, int a1) { + for (int i = 0; i < NELEMS(data->unk5C); i++) { + Window *window = &data->unk5C[i]; + if (!WindowIsInUse(window)) { + continue; + } + + if (i == 0 && data->unk138 == FX32_CONST(384)) { + continue; + } + + if (i < a1 - 5 || i > a1 + 5) { + continue; + } + + if (data->unk1AC == 1) { + DrawFrameAndWindow1(window, TRUE, 0x3EE, 2); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_0, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); + } else if (i == a1) { + DrawFrameAndWindow1(window, TRUE, 0x3EE, 3); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_0, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); + } else { + DrawFrameAndWindow1(window, TRUE, 0x3F7, 2); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_0, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 1); + } + } + + BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_0); +} + +static void ov74_02228548(MainMenuAppData *data, int a1) { + for (int i = 0; i < 2; i++) { + Window *window = &data->unk154[i] + 1; // ??? + if (!WindowIsInUse(window)) { + continue; + } + + if (a1 < 0) { + DrawFrameAndWindow1(window, TRUE, 0x3F7, 2); + BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 1); + } else if (data->unk1AC == 1) { + DrawFrameAndWindow1(window, TRUE, 0x3EE, 2); + BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); + } else if (i == a1) { + DrawFrameAndWindow1(window, TRUE, 0x3EE, 3); + BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); + } else { + DrawFrameAndWindow1(window, TRUE, 0x3F7, 2); + BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 1); + } + } + BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_1); +} + +static BOOL ov74_02228698(MainMenuAppData *data, int offset) { + int unk = data->unk54; + int old54 = data->unk54; + + while (TRUE) { + unk += offset; + + if (unk == -1) { + unk = 0; + } + + if (unk == 9) { + unk = 8; + } + + if (unk == data->unk54) { + break; + } + + if (data->unkEC[unk] != 0) { + PlaySE(SEQ_SE_DP_SELECT); + break; + } + } + data->unk54 = unk; + + if (data->unk54 != old54) { + ov74_0222841C(data, data->unk54); + data->unk1B4 = 6; + return TRUE; + } + + return FALSE; +} + +static void ov74_022286F8(MainMenuAppData *data, int a1) { + int iStack_20; + int iStack_24; + + iStack_24 = 0; + iStack_20 = 0; + + Window *window = &data->unk5C[a1]; + + int iVar4 = GetWindowY(window) - 1; + int iVar5 = iVar4 * 8; + int height = GetWindowHeight(window); // unused + int iVar6 = data->unk138 / FX32_ONE; + + if (iVar6 <= iVar5 && iVar6 + 192 > iVar5) { + return; + } + + data->unk138 = iVar5 * FX32_ONE; + + ov74_0222879C(data); + if (data->unk138 == FX32_CONST(384)) { + FillBgTilemapRect(data->bgConfig, GF_BG_LYR_MAIN_0, 0x0, 0, 0, 32, 12, 0); + FillBgTilemapRect(data->bgConfig, GF_BG_LYR_MAIN_2, 0x0, 0, 0, 32, 12, 0); + ScheduleBgTilemapBufferTransfer(data->bgConfig, GF_BG_LYR_MAIN_0); + ScheduleBgTilemapBufferTransfer(data->bgConfig, GF_BG_LYR_MAIN_2); + } else if (data->unk138 == 0) { + ov74_022282CC(data); + } +} + +static void ov74_0222879C(MainMenuAppData *data) { + int iStack_20; + int iStack_24; + + iStack_24 = 0; + iStack_20 = 0; + int iVar6 = data->unk138 / FX32_ONE; + + for (int i = 0; i < NELEMS(data->unk5C); i++) { + Window *window = &data->unk5C[i]; + if (!WindowIsInUse(window)) { + continue; + } + + int iVar4 = GetWindowY(window) - 1; + int iVar5 = iVar4 * 8; + int height = GetWindowHeight(window); // unused + + if (iVar6 > iVar5) { + iStack_20 = 1; + } + + if (iVar6 + 192 <= iVar5) { + iStack_24 = 1; + } + } + + Sprite_SetAnimCtrlSeq(data->upArrowSprite, iStack_20 * 2); + Sprite_SetAnimActiveFlag(data->upArrowSprite, FALSE); + Sprite_SetAnimCtrlSeq(data->downArrowSprite, iStack_24 * 2 + 1); + Sprite_SetAnimActiveFlag(data->downArrowSprite, FALSE); +} + +static void ov74_0222883C(OVY_MANAGER *manager) { + MainMenuAppData *data = OverlayManager_GetData(manager); + + if (data->upArrowSprite != NULL || data->downArrowSprite != NULL) { + Sprite_Delete(data->upArrowSprite); + Sprite_Delete(data->downArrowSprite); + ov74_022359BC(); + } + + for (u32 i = 0; i < NELEMS(data->unk5C); i++) { + if (data->unk5C[i].bgConfig != NULL) { + ClearWindowTilemapAndCopyToVram(&data->unk5C[i]); + RemoveWindow(&data->unk5C[i]); + } + } + + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_0); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_1); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_2); + + GX_SetDispSelect(GX_DISP_SELECT_MAIN_SUB); + + FreeToHeap(data->bgConfig); + Main_SetVBlankIntrCB(NULL, NULL); +} + +static void ov74_022288C4(MainMenuAppData *data) { + static u16 ov74_0223BBF0[] = { + RGB(1, 28, 20), + RGB(3, 28, 20), + RGB(5, 28, 20), + RGB(7, 28, 20), + RGB(9, 28, 20), + RGB(11, 28, 20), + RGB(13, 28, 20), + RGB(15, 28, 20), + RGB(17, 28, 20), + RGB(19, 28, 20), + RGB(21, 28, 20), + RGB(23, 28, 20), + RGB(25, 28, 20), + RGB(27, 28, 20), + RGB(29, 28, 20), + RGB(31, 28, 20), + RGB(29, 28, 20), + RGB(27, 28, 20), + RGB(25, 28, 20), + RGB(23, 28, 20), + RGB(21, 28, 20), + RGB(19, 28, 20), + RGB(17, 28, 20), + RGB(15, 28, 20), + RGB(13, 28, 20), + RGB(11, 28, 20), + RGB(9, 28, 20), + RGB(7, 28, 20), + RGB(5, 28, 20), + RGB(3, 28, 20), + 0, + }; + + if (ov74_0223BBF0[data->unk1A8] == 0) { + data->unk1A8 = 0; + } + ((vu16 *)HW_PLTT)[54] = ov74_0223BBF0[data->unk1A8++]; +} + +static void MainMenu_OnVBlank(BgConfig *bgConfig) { + GF_RunVramTransferTasks(); + OamManager_ApplyAndResetBuffers(); + DoScheduledBgGpuUpdates(bgConfig); + OS_SetIrqCheckFlag(OS_IE_VBLANK); +} + +BOOL MainMenuApp_Init(OVY_MANAGER *manager, int *state) { + CreateHeap(HEAP_ID_3, HEAP_ID_MAIN_MENU, 0x40000); + + MainMenuAppData *data = OverlayManager_CreateAndGetData(manager, sizeof(MainMenuAppData), HEAP_ID_MAIN_MENU); + memset(data, 0, sizeof(MainMenuAppData)); + + data->bgConfig = BgConfig_Alloc(HEAP_ID_MAIN_MENU); + + sub_0200FBF4(PM_LCD_TOP, 0); + sub_0200FBF4(PM_LCD_BOTTOM, 0); + + UnkStruct_02111868_sub *args = OverlayManager_GetArgs(manager); + data->saveData = args->saveData; + + data->mysteryGift = Save_MysteryGift_Get(data->saveData); + data->unk134 = 0; + data->unk138 = 0; + data->profile = Save_PlayerData_GetProfileAddr(data->saveData); + data->pokedex = Save_Pokedex_Get(data->saveData); + data->igt = Save_PlayerData_GetIGTAddr(data->saveData); + data->hasPokedex = Pokedex_IsEnabled(data->pokedex); + data->badges = PlayerProfile_CountBadges(data->profile); + data->unk144 = 15; + + ov74_022352A0(HEAP_ID_MAIN_MENU); + if (!Save_FileExists(data->saveData)) { + data->dontHaveSavedata = TRUE; + } + sub_02005AF8(0); + sub_02004AD8(0); + + return TRUE; +} + +#define MAIN_MENU_BACKGROUND_COLOR RGB(12, 12, 31) + +BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state) { + MainMenuAppData *data = OverlayManager_GetData(manager); + data->unk18++; + BOOL cartInserted = CTRDG_IsExisting(); // unused + + if (ov74_0222779C(data) == TRUE) { + ov74_022276AC(data); + ov74_02227AEC(data); + return FALSE; + } + + ov74_022288C4(data); + if (data->unk1B4 != 0) { + data->unk1B4--; + } + + switch (*state) { + case 0: + ov74_02227B7C(data); + *state = 1; + break; + case 1: + if (ov74_02227580(data) == 0) { + *state = 3; + } else { + ov74_0223539C(1, 2, state, 8); + ((vu16 *)HW_PLTT)[0] = MAIN_MENU_BACKGROUND_COLOR; + } + break; + case 2: + if (!ov74_02227584(data)) { + ov74_0223539C(0, 3, state, 8); + } + break; + case 3: + data->unk13C = 12; + if (data->dontHaveSavedata == TRUE) { + data->selectedApp = SELECTEDAPP_NEW_GAME; + ov74_0223539C(0, 7, state, 8); + } else { + ov74_0222763C(data); + *state = 4; + } + break; + case 4: + ov74_02227CC8(data); + ov74_02227D48(data); + Main_SetVBlankIntrCB((GFIntrCB)MainMenu_OnVBlank, data->bgConfig); + ov74_022282CC(data); + ov74_0222841C(data, data->unk54); + ov74_0223539C(1, 5, state, 8); + ((vu16 *)HW_PLTT)[0] = MAIN_MENU_BACKGROUND_COLOR; + data->unk13C = 10; + break; + case 5: + ov74_02227428(data, state); + if (data->unk48 == 1) { + ov74_022282CC(data); + data->unk48 = 0; + } else if (*state == 5 && data->unk188 == 1) { + data->unk188 = 0; + data->unk148 = 1; + } + break; + case 6: + if (data->unk144 == 15) { + if (data->unk150 & (1 << 1)) { + *state = 5; + } else { + ov74_0223539C(0, 7, state, 8); + } + } + break; + case 7: + ov74_0222883C(manager); + return TRUE; + case 8: + ov74_022353FC(state); + break; + case 9: + return TRUE; + } + + ov74_022276AC(data); + ov74_02227AEC(data); + ov74_022358BC(); + return FALSE; +} + +static void MainMenu_QueueSelectedApp(MainMenuAppData *data) { + FS_EXTERN_OVERLAY(OVY_75); + FS_EXTERN_OVERLAY(OVY_112); + + switch (data->selectedApp) { + case SELECTEDAPP_CONTINUE: + RegisterMainOverlay(FS_OVERLAY_ID(OVY_36), &ov36_App_MainMenu_SelectOption_Continue); + break; + case SELECTEDAPP_NEW_GAME: + RegisterMainOverlay(FS_OVERLAY_ID(OVY_36), &ov36_App_MainMenu_SelectOption_NewGame); + break; + case SELECTEDAPP_MYSTERY_GIFT: + RegisterMainOverlay(FS_OVERLAY_ID(OVY_74), &gApp_MainMenu_SelectOption_MysteryGift); + break; + case SELECTEDAPP_MIGRATE_AGB: + RegisterMainOverlay(FS_OVERLAY_ID(OVY_74), &gApp_MainMenu_SelectOption_MigrateFromAgb); + break; + case SELECTEDAPP_RANGER: + RegisterMainOverlay(FS_OVERLAY_ID(OVY_74), &gApp_MainMenu_SelectOption_ConnectToRanger); + break; + case SELECTEDAPP_CONNECT_TO_WII: + sub_02027098("data/eoo.dat"); + break; + case SELECTEDAPP_WFC: + Sound_Stop(); + RegisterMainOverlay(FS_OVERLAY_ID_NONE, &gApp_MainMenu_SelectOption_NintendoWFCSetup); + break; + case SELECTEDAPP_POKEWALKER: + Sound_Stop(); + RegisterMainOverlay(FS_OVERLAY_ID(OVY_112), &ov112_App_MainMenu_SelectOption_ConnectToPokewalker); + break; + case SELECTEDAPP_WII_SETTINGS: + Sound_Stop(); + RegisterMainOverlay(FS_OVERLAY_ID(OVY_75), &ov75_App_MainMenu_SelectOption_WiiMessageSettings); + break; + case SELECTEDAPP_TITLE_SCREEN: + RegisterMainOverlay(FS_OVERLAY_ID(intro_title), &gApplication_TitleScreen); + break; + } +} + +BOOL MainMenuApp_Exit(OVY_MANAGER *manager, int *state) { + MainMenuAppData *data = OverlayManager_GetData(manager); + + MainMenu_QueueSelectedApp(data); + + OverlayManager_FreeData(manager); + DestroyHeap(HEAP_ID_MAIN_MENU); + + ov74_02236034(FALSE); + + return TRUE; +} From 8953f7517e74ce82ea4ec85d978887708d9d1a15 Mon Sep 17 00:00:00 2001 From: tgsm Date: Sat, 8 Feb 2025 22:47:13 -0600 Subject: [PATCH 4/6] application/main_menu: More documentation, fix some fakematches --- src/application/main_menu/main_menu.c | 745 +++++++++++++------------- 1 file changed, 376 insertions(+), 369 deletions(-) diff --git a/src/application/main_menu/main_menu.c b/src/application/main_menu/main_menu.c index 15674143f..6cd8265b4 100644 --- a/src/application/main_menu/main_menu.c +++ b/src/application/main_menu/main_menu.c @@ -5,6 +5,7 @@ #include "msgdata/msg.naix" #include "msgdata/msg/msg_0017.h" #include "msgdata/msg/msg_0442.h" +#include "msgdata/msg/msg_0800.h" #include "bg_window.h" #include "font.h" @@ -17,6 +18,7 @@ #include "pokedex.h" #include "render_window.h" #include "sav_system_info.h" +#include "menu_input_state.h" #include "save.h" #include "save_arrays.h" #include "save_data_read_error.h" @@ -31,27 +33,29 @@ #include "unk_0200FA24.h" #include "vram_transfer_manager.h" -typedef enum MainMenu_SelectedApp { - SELECTEDAPP_TITLE_SCREEN, - SELECTEDAPP_CONTINUE, - SELECTEDAPP_NEW_GAME, - SELECTEDAPP_POKEWALKER, - SELECTEDAPP_MYSTERY_GIFT, - SELECTEDAPP_RANGER, - SELECTEDAPP_MIGRATE_AGB, - SELECTEDAPP_CONNECT_TO_WII, - SELECTEDAPP_WFC, - SELECTEDAPP_WII_SETTINGS, -} MainMenu_SelectedApp; - -typedef struct { +typedef enum MainMenu_AppOption { + APPOPTION_TITLE_SCREEN, + APPOPTION_CONTINUE, + APPOPTION_NEW_GAME, + APPOPTION_POKEWALKER, + APPOPTION_MYSTERY_GIFT, + APPOPTION_RANGER, + APPOPTION_MIGRATE_AGB, + APPOPTION_CONNECT_TO_WII, + APPOPTION_WFC, + APPOPTION_WII_SETTINGS, + + APPOPTION_COUNT = APPOPTION_WII_SETTINGS, +} MainMenu_AppOption; + +typedef struct MainMenuAppData { BgConfig *bgConfig; SaveData *saveData; Pokedex *pokedex; PlayerProfile *profile; IGT *igt; MysteryGiftSave *mysteryGift; - u32 unk18; + u32 frames; // actual purpose unknown, this is incremented in the main function but never read anywhere u32 unused1C; u32 unk20; u32 connectedAgbGame; @@ -63,38 +67,41 @@ typedef struct { u32 unused3C; u32 unk40; u32 unk44; - u32 unk48; + BOOL unk48; BOOL hasPokedex; u32 badges; - u16 unk54; - u16 unk56; - MainMenu_SelectedApp selectedApp; - Window unk5C[9]; - u32 unkEC[18]; - fx32 unk134; - fx32 unk138; + u16 currentOption; + u16 currentNewGameOption; + MainMenu_AppOption selectedApp; + Window unk5C[APPOPTION_COUNT]; + u32 unkEC[APPOPTION_COUNT]; + u32 unk110[APPOPTION_COUNT]; + fx32 currentScreenY; + fx32 effectiveScreenY; u32 unk13C; u32 unk140; u32 unk144; u32 unk148; u32 unk14C; u32 unk150; - Window unk154[3]; + Window unk154; + Window unk164[2]; BOOL dontHaveSavedata; - u32 unk188; + BOOL unk188; u32 unk18C[1]; Window unk190; Sprite *upArrowSprite; Sprite *downArrowSprite; - u32 unk1A8; - u32 unk1AC; + u32 buttonBorderAnimFrame; + MenuInputStateMgr menuInputState; int unk1B0; u32 unk1B4; } MainMenuAppData; typedef struct UnkStruct_ov74_02235414 { u32 unk0; - u8 unk4[0xC]; + BOOL unk4; + u8 unk8[0x8]; Window *window; u8 unk14[0x20 - 0x14]; u32 textX; @@ -112,8 +119,8 @@ typedef struct UnkStruct_ov74_02235414 { typedef BOOL (*MainMenuPrintFunction)(MainMenuAppData *, u32, UnkStruct_ov74_02235414 *, u32); typedef struct MainMenuButton { - MainMenu_SelectedApp id; - u32 buttonHeight; + MainMenu_AppOption id; + u32 height; u32 msgId; MainMenuPrintFunction printFunction; } MainMenuButton; @@ -132,7 +139,7 @@ extern u32 ov74_02235230(void); extern void ov74_022352A0(HeapID heapId); extern void ov74_02235308(BgConfig *bgConfig, u8 bgId, u32 screenSize, u32 screenBase, u32 charBase); extern void ov74_02235390(u32 a0); -extern void ov74_0223539C(u32 a0, u32 a1, int *state, u32 a3); +extern void ov74_0223539C(u32 a0, u32 newState, int *state, u32 waitingState); extern void ov74_022353FC(int *state); extern void ov74_02235414(UnkStruct_ov74_02235414 *a0, Window *window, u32 palette1, u32 gmmId, u32 baseTile, u32 palette2); extern void ov74_02235464(UnkStruct_ov74_02235414 *a0, u32 width, u32 height, u32 baseTile); @@ -146,14 +153,14 @@ extern void ov74_022359BC(void); extern void ov74_02236034(BOOL enable); extern void ov74_02236074(void); -extern CTRDG_IsExisting(); +extern BOOL CTRDG_IsExisting(); -static void ov74_0222841C(MainMenuAppData *data, int a1); +static void ov74_0222841C(MainMenuAppData *data, int currentOption); static void ov74_02228548(MainMenuAppData *data, int a1); -static BOOL ov74_02228698(MainMenuAppData *data, int offset); +static BOOL ChangeCurrentAppOption(MainMenuAppData *data, int offset); static void ov74_022286F8(MainMenuAppData *data, int a1); -static void ov74_0222879C(MainMenuAppData *data); -static void ov74_022288C4(MainMenuAppData *data); +static void MainMenu_UpdateArrowSprites(MainMenuAppData *data); +static void AdvanceButtonBorderAnimation(MainMenuAppData *data); static BOOL MainMenu_PrintContinueButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); static BOOL MainMenu_PrintMigrateFromAgbButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); @@ -165,15 +172,15 @@ static BOOL MainMenu_PrintConnectToPokewalkerButton(MainMenuAppData *data, u32 a static BOOL MainMenu_PrintWiiMessageSettingsButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3); static MainMenuButton sMainMenuButtons[] = { - { .id = SELECTEDAPP_CONTINUE, .buttonHeight = 10, .msgId = msg_0442_00000, .printFunction = MainMenu_PrintContinueButton }, - { .id = SELECTEDAPP_NEW_GAME, .buttonHeight = 4, .msgId = msg_0442_00001, .printFunction = NULL }, - { .id = SELECTEDAPP_POKEWALKER, .buttonHeight = 4, .msgId = msg_0442_00009, .printFunction = MainMenu_PrintConnectToPokewalkerButton }, - { .id = SELECTEDAPP_MYSTERY_GIFT, .buttonHeight = 4, .msgId = msg_0442_00002, .printFunction = MainMenu_PrintMysteryGiftButton }, - { .id = SELECTEDAPP_RANGER, .buttonHeight = 4, .msgId = msg_0442_00003, .printFunction = MainMenu_PrintConnectToRangerButton }, - { .id = SELECTEDAPP_MIGRATE_AGB, .buttonHeight = 4, .msgId = 0, .printFunction = MainMenu_PrintMigrateFromAgbButton }, // msgId can be 4, 5, 6, 7 or 8 depending on the inserted cartridge - { .id = SELECTEDAPP_CONNECT_TO_WII, .buttonHeight = 4, .msgId = msg_0442_00011, .printFunction = MainMenu_PrintConnectToWiiButton }, - { .id = SELECTEDAPP_WFC, .buttonHeight = 4, .msgId = msg_0442_00012, .printFunction = MainMenu_PrintNintendoWFCSetupButton }, - { .id = SELECTEDAPP_WII_SETTINGS, .buttonHeight = 4, .msgId = msg_0442_00010, .printFunction = MainMenu_PrintWiiMessageSettingsButton }, + { .id = APPOPTION_CONTINUE, .height = 10, .msgId = msg_0442_00000, .printFunction = MainMenu_PrintContinueButton }, + { .id = APPOPTION_NEW_GAME, .height = 4, .msgId = msg_0442_00001, .printFunction = NULL }, + { .id = APPOPTION_POKEWALKER, .height = 4, .msgId = msg_0442_00009, .printFunction = MainMenu_PrintConnectToPokewalkerButton }, + { .id = APPOPTION_MYSTERY_GIFT, .height = 4, .msgId = msg_0442_00002, .printFunction = MainMenu_PrintMysteryGiftButton }, + { .id = APPOPTION_RANGER, .height = 4, .msgId = msg_0442_00003, .printFunction = MainMenu_PrintConnectToRangerButton }, + { .id = APPOPTION_MIGRATE_AGB, .height = 4, .msgId = 0, .printFunction = MainMenu_PrintMigrateFromAgbButton }, // msgId can be 4, 5, 6, 7 or 8 depending on the inserted cartridge + { .id = APPOPTION_CONNECT_TO_WII, .height = 4, .msgId = msg_0442_00011, .printFunction = MainMenu_PrintConnectToWiiButton }, + { .id = APPOPTION_WFC, .height = 4, .msgId = msg_0442_00012, .printFunction = MainMenu_PrintNintendoWFCSetupButton }, + { .id = APPOPTION_WII_SETTINGS, .height = 4, .msgId = msg_0442_00010, .printFunction = MainMenu_PrintWiiMessageSettingsButton }, }; static const TouchscreenHitbox sNewGameButtonHitboxes[] = { @@ -197,19 +204,19 @@ extern const OVY_MGR_TEMPLATE ov75_App_MainMenu_SelectOption_WiiMessageSettings; static u32 ov74_02227060(MainMenuAppData *data) { if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A)) { - data->unk1AC = 0; + data->menuInputState.state = MENU_INPUT_STATE_BUTTONS; return gSystem.newKeys; } else if (System_GetTouchNew()) { - data->unk1AC = 1; + data->menuInputState.state = MENU_INPUT_STATE_TOUCH; return PAD_BUTTON_A; } return 0; } -static u32 ov74_02227098(MainMenuAppData *data, u32 a1) { - for (u32 i = 0, j = 0; i < 9; i++) { - if (data->unkEC[i] != 0 && j++ == a1) { +static u32 GetNthAvailableApp(MainMenuAppData *data, u8 a1) { + for (u32 i = 0, apps = 0; i < APPOPTION_COUNT; i++) { + if (data->unkEC[i] != 0 && apps++ == a1) { return i; } } @@ -219,8 +226,8 @@ static u32 ov74_02227098(MainMenuAppData *data, u32 a1) { static u32 ov74_022270C4(MainMenuAppData *data, int *state, BOOL a2) { if (!a2) { PlaySE(SEQ_SE_DP_SELECT); - data->selectedApp = (MainMenu_SelectedApp)data->unkEC[data->unk54]; - if (data->selectedApp == SELECTEDAPP_MIGRATE_AGB && CTRDG_IsPulledOut() == TRUE) { + data->selectedApp = (MainMenu_AppOption)data->unkEC[data->currentOption]; + if (data->selectedApp == APPOPTION_MIGRATE_AGB && CTRDG_IsPulledOut() == TRUE) { if (data->unk13C != 12) { sub_02038D64(); } @@ -228,16 +235,16 @@ static u32 ov74_022270C4(MainMenuAppData *data, int *state, BOOL a2) { } } else { PlaySE(SEQ_SE_DP_SELECT); - data->selectedApp = SELECTEDAPP_TITLE_SCREEN; + data->selectedApp = APPOPTION_TITLE_SCREEN; ov74_02235390(1); } - if (data->selectedApp == SELECTEDAPP_NEW_GAME) { + if (data->selectedApp == APPOPTION_NEW_GAME) { data->unk40 |= (1 << 7); data->unk148 = 1; *state = 6; } else { - if (data->selectedApp == SELECTEDAPP_CONNECT_TO_WII) { + if (data->selectedApp == APPOPTION_CONNECT_TO_WII) { ov74_02235390(1); } ov74_0223539C(0, 7, state, 8); @@ -250,23 +257,23 @@ static u32 ov74_022270C4(MainMenuAppData *data, int *state, BOOL a2) { return TRUE; } -static int ov74_0222715C(MainMenuAppData *data, int a1) { +static int CountAvailableAppsBefore(MainMenuAppData *data, int a1) { int i; - int j = 0; + int apps = 0; for (i = 0; i < a1; i++) { if (data->unkEC[i] != 0) { - j++; + apps++; } } - return j; + return apps; } -static BOOL ov74_02227180(MainMenuAppData *data, int *state) { - BOOL BVar4 = FALSE; +static BOOL MainMenu_HandleKeyInput(MainMenuAppData *data, int *state) { + BOOL changedOption = FALSE; - if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A) && data->unk1AC == 1) { - data->unk1AC = 0; - ov74_0222841C(data, data->unk54); + if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A) && data->menuInputState.state == MENU_INPUT_STATE_TOUCH) { + data->menuInputState.state = MENU_INPUT_STATE_BUTTONS; + ov74_0222841C(data, data->currentOption); return FALSE; } @@ -276,127 +283,128 @@ static BOOL ov74_02227180(MainMenuAppData *data, int *state) { return ov74_022270C4(data, state, TRUE); } - if (data->unk48 != 0) { + if (data->unk48) { return FALSE; } - u32 unaff_r6; - u32 uVar1 = data->unk54; + u32 unk; + u32 oldOption = data->currentOption; if (gSystem.newKeys & PAD_KEY_UP) { - if (ov74_02228698(data, -1)) { - unaff_r6 = ov74_0222715C(data, uVar1); - if (unaff_r6 == 7) { - unaff_r6 = 3; - BVar4 = TRUE; - } else if (unaff_r6 == 3) { - unaff_r6 = 0; - BVar4 = TRUE; + if (ChangeCurrentAppOption(data, -1)) { + unk = CountAvailableAppsBefore(data, oldOption); + if (unk == 7) { + unk = 3; + changedOption = TRUE; + } else if (unk == 3) { + unk = 0; + changedOption = TRUE; } } } else if (gSystem.newKeys & PAD_KEY_DOWN) { - BVar4 = ov74_02228698(data, 1); - unaff_r6 = data->unk54; + changedOption = ChangeCurrentAppOption(data, 1); + unk = data->currentOption; } - if (BVar4) { - ov74_022286F8(data, unaff_r6); + if (changedOption) { + ov74_022286F8(data, unk); } return FALSE; } -static BOOL ov74_02227240(MainMenuAppData *data, int *state, BOOL *a2) { - BOOL bVar1; +static BOOL MainMenu_HandleTouchInput(MainMenuAppData *data, int *state, BOOL *validInput) { + BOOL hitArrowButton; int hitboxNum = -1; - bVar1 = FALSE; + hitArrowButton = FALSE; if (!System_GetTouchNew()) { return FALSE; } - if (data->unk48 == 0 && data->unk1B4 == 0) { + if (!data->unk48 && data->unk1B4 == 0) { hitboxNum = TouchscreenHitbox_FindRectAtTouchNew(sArrowButtonHitboxes); } if (hitboxNum == 0 && Sprite_GetAnimationNumber(data->upArrowSprite) / 2 != 0) { Sprite_SetAnimActiveFlag(data->upArrowSprite, TRUE); Sprite_ResetAnimCtrlState(data->upArrowSprite); - if (data->unk54 > 3 && data->unk138 > FX32_CONST(192)) { - data->unk54 = ov74_02227098(data, 3); + if (data->currentOption > 3 && data->effectiveScreenY > FX32_CONST(192)) { + data->currentOption = GetNthAvailableApp(data, 3); } else { - data->unk54 = ov74_02227098(data, 0); + data->currentOption = GetNthAvailableApp(data, 0); } - bVar1 = TRUE; - *a2 = TRUE; + hitArrowButton = TRUE; + *validInput = TRUE; } else if (hitboxNum == 1 && Sprite_GetAnimationNumber(data->downArrowSprite) / 2 != 0) { Sprite_SetAnimActiveFlag(data->downArrowSprite, TRUE); Sprite_ResetAnimCtrlState(data->downArrowSprite); - if (data->unk54 < 3) { - data->unk54 = ov74_02227098(data, 3); + if (data->currentOption < 3) { + data->currentOption = GetNthAvailableApp(data, 3); } else { - data->unk54 = ov74_02227098(data, 7); + data->currentOption = GetNthAvailableApp(data, 7); } - bVar1 = TRUE; - *a2 = TRUE; + hitArrowButton = TRUE; + *validInput = TRUE; } - if (bVar1) { - data->unk1AC = 1; - ov74_0222841C(data, data->unk54); - ov74_022286F8(data, data->unk54); + if (hitArrowButton) { + data->menuInputState.state = MENU_INPUT_STATE_TOUCH; + ov74_0222841C(data, data->currentOption); + ov74_022286F8(data, data->currentOption); data->unk1B4 = 6; return FALSE; } - u16 unk = 0xFFFE; - u16 uVar5 = gSystem.touchY + (data->unk138 / FX32_ONE); - if (uVar5 >= 0x200) { + u16 pixel = 0xFFFF & ~(1 << 0); + u16 effectiveTouchY = gSystem.touchY + (data->effectiveScreenY / FX32_ONE); + if (effectiveTouchY >= 512) { return FALSE; } - - if (!DoesPixelAtScreenXYMatchPtrVal(data->bgConfig, GF_BG_LYR_MAIN_0, gSystem.touchX, uVar5, &unk)) { + if (!DoesPixelAtScreenXYMatchPtrVal(data->bgConfig, GF_BG_LYR_MAIN_0, gSystem.touchX, effectiveTouchY, &pixel)) { return FALSE; } - *a2 = TRUE; + *validInput = TRUE; - uVar5 = gSystem.touchY / 48; - if (data->unk138 == 0) { - if (uVar5 != 0) { - uVar5--; + // Button heights are 48 pixels. + u16 touchedOption = gSystem.touchY / 48; + if (data->effectiveScreenY == 0) { + // The continue button is twice the height of the other buttons, so we need to account for one button being two buttons tall. + if (touchedOption != 0) { + touchedOption--; } - } else if (data->unk138 == FX32_CONST(192)) { - uVar5 += 3; + } else if (data->effectiveScreenY == FX32_CONST(GX_LCD_SIZE_Y)) { + touchedOption += 3; } else { - uVar5 += 7; + touchedOption += 7; } - if (uVar5 >= data->unk1B0) { + if (touchedOption >= data->unk1B0) { return FALSE; } - data->unk54 = ov74_02227098(data, (u8)uVar5); + data->currentOption = GetNthAvailableApp(data, touchedOption); - data->unk1AC = 1; - ov74_0222841C(data, data->unk54); - return ov74_022270C4(data, state, 0); + data->menuInputState.state = MENU_INPUT_STATE_TOUCH; + ov74_0222841C(data, data->currentOption); + return ov74_022270C4(data, state, FALSE); } -static BOOL ov74_02227428(MainMenuAppData *data, int *state) { - BOOL unk = FALSE; - BOOL unk2 = ov74_02227240(data, state, &unk); - if (unk) { - data->unk1AC = 1; +static BOOL MainMenu_HandleInput(MainMenuAppData *data, int *newState) { + BOOL hadTouchInput = FALSE; + BOOL touchResult = MainMenu_HandleTouchInput(data, newState, &hadTouchInput); + if (hadTouchInput) { + data->menuInputState.state = MENU_INPUT_STATE_TOUCH; if (data->unk1B4 != 6) { ov74_0222841C(data, 0xFF); } - return unk2; + return touchResult; } - return ov74_02227180(data, state); + return MainMenu_HandleKeyInput(data, newState); } -static u32 ov74_0222746C(MainMenuAppData *data, BOOL *a1) { +static u32 MainMenu_NewGame_HandleTouchInput(MainMenuAppData *data, BOOL *validInput) { if (!System_GetTouchNew()) { return 0; } @@ -406,13 +414,14 @@ static u32 ov74_0222746C(MainMenuAppData *data, BOOL *a1) { return 0; } - u16 something = 0xFFFE; - if (!DoesPixelAtScreenXYMatchPtrVal(data->bgConfig, GF_BG_LYR_MAIN_1, gSystem.touchX, gSystem.touchY, &something)) { + // Make sure the player didn't touch a transparent pixel (because of the hitbox sizes and positions, this will always be true) + u16 pixel = 0xFFFF & ~(1 << 0); + if (!DoesPixelAtScreenXYMatchPtrVal(data->bgConfig, GF_BG_LYR_MAIN_1, gSystem.touchX, gSystem.touchY, &pixel)) { return 0; } u32 ret = 1; - *a1 = TRUE; + *validInput = TRUE; if (hitboxId != 0) { ret = 2; } @@ -420,35 +429,35 @@ static u32 ov74_0222746C(MainMenuAppData *data, BOOL *a1) { return ret; } -static u32 ov74_022274D4(MainMenuAppData *data) { - BOOL local_10 = FALSE; - u32 uVar1 = ov74_0222746C(data, &local_10); - if (local_10) { - data->unk1AC = 1; +static u32 MainMenu_NewGame_HandleInput(MainMenuAppData *data) { + BOOL hadTouchInput = FALSE; + u32 touchResult = MainMenu_NewGame_HandleTouchInput(data, &hadTouchInput); + if (hadTouchInput) { + data->menuInputState.state = MENU_INPUT_STATE_TOUCH; ov74_02228548(data, 0xFF); - return uVar1; + return touchResult; } if (gSystem.newKeys == 0) { return 0; } - if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A) && data->unk1AC == 1) { - data->unk1AC = 0; - ov74_02228548(data, data->unk56); + if (gSystem.newKeys & (PAD_BUTTON_Y | PAD_BUTTON_X | PAD_KEY_UP | PAD_KEY_DOWN | PAD_KEY_LEFT | PAD_KEY_RIGHT | PAD_BUTTON_B | PAD_BUTTON_A) && data->menuInputState.state == MENU_INPUT_STATE_TOUCH) { + data->menuInputState.state = MENU_INPUT_STATE_BUTTONS; + ov74_02228548(data, data->currentNewGameOption); return 0; } if (gSystem.newKeys & (PAD_KEY_UP | PAD_KEY_DOWN)) { - data->unk56 ^= 1; - ov74_02228548(data, data->unk56); + data->currentNewGameOption ^= 1; + ov74_02228548(data, data->currentNewGameOption); PlaySE(SEQ_SE_DP_SELECT); return 0; } u32 ret = 1; if (gSystem.newKeys & PAD_BUTTON_A) { - if (data->unk56 != 0) { + if (data->currentNewGameOption != 0) { ret = 2; } } else { @@ -465,7 +474,7 @@ static u32 ov74_02227580(MainMenuAppData *data) { return 0; } -typedef struct { +typedef struct UnkStruct_ov74_0223BBD4 { u32 x; u32 y; u32 width; @@ -475,6 +484,7 @@ typedef struct { u32 unused18; } UnkStruct_ov74_0223BBD4; +// Unused warning screen for wifi user info static BOOL ov74_02227584(MainMenuAppData *data) { static UnkStruct_ov74_0223BBD4 ov74_0223BBD4[] = { { @@ -483,13 +493,15 @@ static BOOL ov74_02227584(MainMenuAppData *data) { .width = 22, .height = 14, .gmmId = NARC_msg_msg_0800_bin, - .msgId = msg_0442_00016, + // clang-format off + .msgId = msg_0800_00016, // "Your Nintendo Wi-Fi Connection User Information may have been erased. [...]" .unused18 = 0, - }, + // clang-format on + }, }; if (!WindowIsInUse(&data->unk190)) { - for (int i = 0; i < 1; i++) { + for (int i = 0; i < (int)NELEMS(data->unk18C); i++) { if (data->unk18C[i] == 1) { data->unk18C[i] = 0; UnkStruct_ov74_02235414 unk; @@ -512,7 +524,7 @@ static BOOL ov74_02227584(MainMenuAppData *data) { return FALSE; } -static void ov74_0222763C(MainMenuAppData *data) { +static void DetectInsertedGBACart(MainMenuAppData *data) { u32 offsets = PmAgbCartridgeGetOffsets(0); u32 version = 0; data->connectedAgbGame = 0; @@ -567,30 +579,30 @@ static void ov74_022276AC(MainMenuAppData *data) { } u32 unk = sub_02038D80(); - u32 uVar2 = ~data->unk40 & unk; - if (uVar2 != 0 && data->unk144 == 15 && data->unk148 == 0 && data->unk40 != uVar2) { - data->unk48 = 1; + u32 unk2 = ~data->unk40 & unk; + if (unk2 != 0 && data->unk144 == 15 && data->unk148 == 0 && data->unk40 != unk2) { + data->unk48 = TRUE; - if (uVar2 & (1 << 0)) { + if (unk2 & (1 << 0)) { data->drawMysteryGiftButton = TRUE; - uVar2 = (1 << 0); + unk2 = (1 << 0); } - if (uVar2 & (1 << 1)) { + if (unk2 & (1 << 1)) { data->drawConnectToRangerButton = TRUE; - uVar2 = (1 << 1); + unk2 = (1 << 1); } - if (uVar2 & (1 << 2)) { + if (unk2 & (1 << 2)) { data->drawConnectToWiiButton = TRUE; - uVar2 = (1 << 2); + unk2 = (1 << 2); } - if (uVar2 & (1 << 1 | 1 << 0)) { - data->unk188 = 1; + if (unk2 & (1 << 1 | 1 << 0)) { + data->unk188 = TRUE; } - data->unk40 |= uVar2; + data->unk40 |= unk2; } data->unk140--; @@ -608,23 +620,23 @@ static void ov74_022276AC(MainMenuAppData *data) { } } -typedef struct { - u32 unk0; - u32 unk4; - u32 unk8; - u32 unkC; +typedef struct UnkStruct_ov74_0223BC30 { + u32 x; + u32 y; + u32 width; + u32 height; u32 msgId; } UnkStruct_ov74_0223BC30; static BOOL ov74_0222779C(MainMenuAppData *data) { static UnkStruct_ov74_0223BC30 ov74_0223BC30[] = { - { .unk0 = 4, .unk4 = 2, .unk8 = 24, .unkC = 20, .msgId = msg_0017_00001 }, - { .unk0 = 4, .unk4 = 4, .unk8 = 24, .unkC = 16, .msgId = msg_0017_00003 }, - { .unk0 = 4, .unk4 = 1, .unk8 = 24, .unkC = 22, .msgId = msg_0017_00000 }, - { .unk0 = 4, .unk4 = 3, .unk8 = 24, .unkC = 18, .msgId = msg_0017_00002 }, - { .unk0 = 0, .unk4 = 1, .unk8 = 32, .unkC = 11, .msgId = msg_0017_00005 }, - { .unk0 = 4, .unk4 = 14, .unk8 = 24, .unkC = 3, .msgId = msg_0017_00006 }, - { .unk0 = 4, .unk4 = 19, .unk8 = 24, .unkC = 3, .msgId = msg_0017_00007 }, + { .x = 4, .y = 2, .width = 24, .height = 20, .msgId = msg_0017_00001 }, // Found a mystery gift + { .x = 4, .y = 4, .width = 24, .height = 16, .msgId = msg_0017_00003 }, // Found a mystery gift, but don't have the Pokédex + { .x = 4, .y = 1, .width = 24, .height = 22, .msgId = msg_0017_00000 }, // Got a recruitment message from Ranger + { .x = 4, .y = 3, .width = 24, .height = 18, .msgId = msg_0017_00002 }, // Got a recruitment message from Ranger, but don't have the Pokédex + { .x = 0, .y = 1, .width = 32, .height = 11, .msgId = msg_0017_00005 }, // "WARNING! There's already a saved game file. [...]" + { .x = 4, .y = 14, .width = 24, .height = 3, .msgId = msg_0017_00006 }, // "Begin adventure" + { .x = 4, .y = 19, .width = 24, .height = 3, .msgId = msg_0017_00007 }, // "Return to the menu" }; switch (data->unk144) { @@ -647,46 +659,46 @@ static BOOL ov74_0222779C(MainMenuAppData *data) { break; case 17: { UnkStruct_ov74_02235414 unk; - ov74_02235414(&unk, &data->unk154[0], 0, NARC_msg_msg_0017_bin, 0x3F7, 2); - UnkStruct_ov74_0223BC30 *something; - u32 uVar3 = data->unk40 & ~data->unk44; - if (uVar3 & (1 << 0)) { - something = (data->unk38 & (1 << 0)) ? &ov74_0223BC30[0] : &ov74_0223BC30[1]; - } else if (uVar3 & (1 << 1)) { - something = (data->unk38 & (1 << 1)) ? &ov74_0223BC30[2] : &ov74_0223BC30[3]; - } else if (uVar3 & (1 << 7)) { + ov74_02235414(&unk, &data->unk154, 0, NARC_msg_msg_0017_bin, 0x3F7, 2); + UnkStruct_ov74_0223BC30 *unk2; + u32 unk3 = data->unk40 & ~data->unk44; + if (unk3 & (1 << 0)) { + unk2 = (data->unk38 & (1 << 0)) ? &ov74_0223BC30[0] : &ov74_0223BC30[1]; + } else if (unk3 & (1 << 1)) { + unk2 = (data->unk38 & (1 << 1)) ? &ov74_0223BC30[2] : &ov74_0223BC30[3]; + } else if (unk3 & (1 << 7)) { unk.unk0 = 2; - something = &ov74_0223BC30[4]; + unk2 = &ov74_0223BC30[4]; MsgData *msgData = NewMsgDataFromNarc(MSGDATA_LOAD_LAZY, NARC_msgdata_msg, unk.gmmId, HEAP_ID_MAIN_MENU); - String *string = NewString_ReadMsgData(msgData, something->msgId); + String *string = NewString_ReadMsgData(msgData, unk2->msgId); u32 width = FontID_String_GetWidthMultiline(unk.fontId, string, 0); - unk.textX = (something->unk8 * 8 - width) / 2; + unk.textX = (unk2->width * 8 - width) / 2; String_Delete(string); DestroyMsgData(msgData); unk.textY = 4; } - ov74_02235464(&unk, something->unk8, something->unkC, 0x91); + ov74_02235464(&unk, unk2->width, unk2->height, 0x91); unk.layer = GF_BG_LYR_MAIN_1; - ov74_02235568(data->bgConfig, &unk, something->unk0, something->unk4, something->msgId); + ov74_02235568(data->bgConfig, &unk, unk2->x, unk2->y, unk2->msgId); BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_1, GetWindowX(unk.window), GetWindowY(unk.window), GetWindowWidth(unk.window), GetWindowHeight(unk.window), 0); - if ((uVar3 & (1 << 7)) && !(uVar3 & (1 << 1 | 1 << 0))) { - for (int i = 0; i < 2; i++) { - Window *window = &data->unk154[i] + 1; // ??? - ov74_02235414(&unk, window, 0, 17, 0x3F7, 2); - UnkStruct_ov74_0223BC30 *unk2 = &ov74_0223BC30[i + 5]; + if ((unk3 & (1 << 7)) && !(unk3 & (1 << 1 | 1 << 0))) { + for (int i = 0; i < (int)NELEMS(data->unk164); i++) { + Window *window = &data->unk164[i]; + ov74_02235414(&unk, window, 0, NARC_msg_msg_0017_bin, 0x3F7, 2); + UnkStruct_ov74_0223BC30 *unk3 = &ov74_0223BC30[i + 5]; unk.textY = 4; - ov74_02235464(&unk, unk2->unk8, unk2->unkC, (i * 72) + 1); + ov74_02235464(&unk, unk3->width, unk3->height, (i * 72) + 1); unk.layer = GF_BG_LYR_MAIN_1; - ov74_02235568(data->bgConfig, &unk, unk2->unk0, unk2->unk4, unk2->msgId); + ov74_02235568(data->bgConfig, &unk, unk3->x, unk3->y, unk3->msgId); } - data->unk56 = 0; + data->currentNewGameOption = 0; ov74_02228548(data, -1); data->unk144 = 19; data->unk14C = 30; } else { - data->unk44 |= uVar3; + data->unk44 |= unk3; data->unk144 = 18; data->unk14C = 30; } @@ -702,15 +714,15 @@ static BOOL ov74_0222779C(MainMenuAppData *data) { break; } - u32 unk1ac = data->unk1AC; - u32 uVar3 = ov74_02227060(data); - if (uVar3 & (PAD_BUTTON_B | PAD_BUTTON_A)) { - if (unk1ac != data->unk1AC) { - ov74_0222841C(data, data->unk54); + u32 oldInputState = data->menuInputState.state; + u32 unk = ov74_02227060(data); + if (unk & (PAD_BUTTON_B | PAD_BUTTON_A)) { + if (oldInputState != data->menuInputState.state) { + ov74_0222841C(data, data->currentOption); } - RemoveWindow(&data->unk154[0]); + RemoveWindow(&data->unk154); data->unk144 = 20; - data->unk150 = uVar3; + data->unk150 = unk; PlaySE(SEQ_SE_DP_SELECT); } break; @@ -722,15 +734,15 @@ static BOOL ov74_0222779C(MainMenuAppData *data) { ov74_02228548(data, 0); } } else { - u32 uVar3 = ov74_022274D4(data); - ov74_022288C4(data); - if (uVar3 & 3) { - RemoveWindow(&data->unk154[0]); - RemoveWindow(&data->unk154[1]); - RemoveWindow(&data->unk154[2]); - ov74_0222841C(data, data->unk54); + u32 inputResult = MainMenu_NewGame_HandleInput(data); + AdvanceButtonBorderAnimation(data); + if (inputResult & 3) { + RemoveWindow(&data->unk154); + RemoveWindow(&data->unk164[0]); + RemoveWindow(&data->unk164[1]); + ov74_0222841C(data, data->currentOption); data->unk144 = 20; - data->unk150 = uVar3; + data->unk150 = inputResult; PlaySE(SEQ_SE_DP_SELECT); } } @@ -747,32 +759,32 @@ static BOOL ov74_0222779C(MainMenuAppData *data) { } static void ov74_02227AEC(MainMenuAppData *data) { - if (data->unk134 == data->unk138) { + if (data->currentScreenY == data->effectiveScreenY) { return; } #define ABS(x) (((x) ^ ((x) >> 31)) - ((x) >> 31)) - fx32 unk1 = (data->unk138 - data->unk134) / 4; - if (ABS(unk1) > FX32_CONST(12)) { - if (unk1 > 0) { - unk1 = FX32_CONST(12); + fx32 scrollStep = (data->effectiveScreenY - data->currentScreenY) / 4; + if (ABS(scrollStep) > FX32_CONST(12)) { + if (scrollStep > 0) { + scrollStep = FX32_CONST(12); } else { - unk1 = FX32_CONST(-12); + scrollStep = FX32_CONST(-12); } } - data->unk134 += unk1; + data->currentScreenY += scrollStep; - if (ABS(data->unk138 - data->unk134) < FX32_CONST(0.125f)) { - data->unk134 = data->unk138; + if (ABS(data->effectiveScreenY - data->currentScreenY) < FX32_CONST(0.125f)) { + data->currentScreenY = data->effectiveScreenY; } - ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_0, BG_POS_OP_SET_Y, data->unk134 / FX32_ONE); - ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_2, BG_POS_OP_SET_Y, data->unk134 / FX32_ONE); + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_0, BG_POS_OP_SET_Y, data->currentScreenY / FX32_ONE); + ScheduleSetBgPosText(data->bgConfig, GF_BG_LYR_MAIN_2, BG_POS_OP_SET_Y, data->currentScreenY / FX32_ONE); } -static void ov74_02227B7C(MainMenuAppData *data) { - static const GraphicsBanks ov74_0223B2E8 = { +static void MainMenu_SetupGraphics(MainMenuAppData *data) { + static const GraphicsBanks sMainMenuGraphicsBanks = { .bg = GX_VRAM_BG_128_A, .subbg = GX_VRAM_SUB_BG_128_C, .obj = GX_VRAM_OBJ_64_E, @@ -780,14 +792,14 @@ static void ov74_02227B7C(MainMenuAppData *data) { .tex = GX_VRAM_TEX_0_B, .texpltt = GX_VRAM_TEXPLTT_01_FG, }; - GraphicsBanks banks = ov74_0223B2E8; - static const GraphicsModes ov74_0223B2D8 = { + GraphicsBanks banks = sMainMenuGraphicsBanks; + static const GraphicsModes sMainMenuGraphicsModes = { .dispMode = GX_DISPMODE_GRAPHICS, .bgMode = GX_BGMODE_0, .subMode = GX_BGMODE_0, ._2d3dMode = GX_BG0_AS_2D, }; - GraphicsModes modes = ov74_0223B2D8; + GraphicsModes modes = sMainMenuGraphicsModes; GfGfx_SetBanks(&banks); SetBothScreensModesAndDisable(&modes); @@ -822,9 +834,10 @@ static void ov74_02227B7C(MainMenuAppData *data) { ((vu16 *)HW_PLTT)[33] = RGB(26, 26, 26); } -static void ov74_02227CC8(MainMenuAppData *data) { +static void MainMenu_SetupSprites(MainMenuAppData *data) { ov74_0223563C(); ov74_02235690(); + // FIXME: Unpack a/1/1/3 and use NAIX constants here. ov74_02235728(NARC_a_1_1_3, 47, 44, 46, 45, 0); data->upArrowSprite = ov74_02235930(0, data->upArrowSprite, 236, 20, 0); @@ -836,43 +849,45 @@ static void ov74_02227CC8(MainMenuAppData *data) { Sprite_SetAnimActiveFlag(data->downArrowSprite, FALSE); } -static void ov74_02227D48(MainMenuAppData *data) { +static void MainMenu_SetupWifiTiles(MainMenuAppData *data) { + // FIXME: Unpack a/1/1/3 and use NAIX constants here. GfGfxLoader_GXLoadPal(NARC_a_1_1_3, 49, GF_PAL_LOCATION_MAIN_BG, GF_PAL_SLOT_4_OFFSET, 32, HEAP_ID_MAIN_MENU); GfGfxLoader_LoadCharData(NARC_a_1_1_3, 48, data->bgConfig, GF_BG_LYR_MAIN_2, 0x3E6, 0x100, FALSE, HEAP_ID_MAIN_MENU); } -static void ov74_02227D88(MainMenuAppData *data, u32 a1, u32 a2, u32 a3) { +static void DrawWirelessIcon(MainMenuAppData *data, u32 x, u32 y, u32 type) { u16 *buffer = GetBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_2); - u32 unk = 0x43E6; - if (a3 == 2) { - unk += 4; + // Bits 15-12: palette, 11-0: tile number + u32 tileId = (4 << 12) | 0x3E6; + if (type == 2) { + tileId += 4; } - u32 offset = a1 + (a2 + 0) * 32; - buffer[offset++] = unk + 0; - buffer[offset++] = unk + 1; - offset = a1 + (a2 + 1) * 32; - buffer[offset++] = unk + 2; - buffer[offset++] = unk + 3; + u32 offset = (y + 0) * 32 + x; + buffer[offset++] = tileId + 0; + buffer[offset++] = tileId + 1; + offset = (y + 1) * 32 + x; + buffer[offset++] = tileId + 2; + buffer[offset++] = tileId + 3; BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_2); } -static void ov74_02227DD4(MainMenuAppData *data, u32 a1, u32 a2) { +static void ClearWirelessIcon(MainMenuAppData *data, u32 x, u32 y) { u16 *buffer = GetBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_2); - u32 offset = a1 + (a2 + 0) * 32; + u32 offset = (y + 0) * 32 + x; buffer[offset++] = 0; buffer[offset++] = 0; - offset = a1 + (a2 + 1) * 32; + offset = (y + 1) * 32 + x; buffer[offset++] = 0; buffer[offset++] = 0; BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_2); } -static void ov74_02227E10(Window *window, MsgData *msgData, MessageFormat *msgFmt, u32 color, u32 msgId, u32 y) { +static void PrintPlayerInfoField(Window *window, MsgData *msgData, MessageFormat *msgFmt, u32 color, u32 msgId, u32 y) { String *string = ReadMsgData_ExpandPlaceholders(msgFmt, msgData, msgId, HEAP_ID_MAIN_MENU); int stringPixelWidth = FontID_String_GetWidth(0, string, GetFontAttribute(0, 2)); u32 x = GetWindowWidth(window) * 8 - (stringPixelWidth + 32); @@ -909,11 +924,11 @@ static BOOL MainMenu_PrintContinueButton(MainMenuAppData *data, u32 a1, UnkStruc ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); static u32 sContinueButtonMsgs[] = { - msg_0442_00000, - msg_0442_00013, - msg_0442_00014, - msg_0442_00016, - msg_0442_00015, + msg_0442_00000, // "CONTINUE" + msg_0442_00013, // "PLAYER" + msg_0442_00014, // "TIME" + msg_0442_00016, // "BADGES" + msg_0442_00015, // "POKéDEX" }; for (u32 i = 1; i < NELEMS(sContinueButtonMsgs); i++) { if (i == 4 && !data->hasPokedex) { @@ -926,18 +941,18 @@ static BOOL MainMenu_PrintContinueButton(MainMenuAppData *data, u32 a1, UnkStruc } BufferPlayersName(messageFormat, 0, data->profile); - ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00017, 16); + PrintPlayerInfoField(a2->window, msgData, messageFormat, textColor, msg_0442_00017, 16); ov74_02227E64(messageFormat, GetIGTHours(data->igt)); BufferIntegerAsString(messageFormat, 1, GetIGTMinutes(data->igt), 2, PRINTING_MODE_LEADING_ZEROS, 1); - ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00018, 32); + PrintPlayerInfoField(a2->window, msgData, messageFormat, textColor, msg_0442_00018, 32); BufferIntegerAsString(messageFormat, 0, data->badges, 2, PRINTING_MODE_LEFT_ALIGN, 1); - ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00020, 48); + PrintPlayerInfoField(a2->window, msgData, messageFormat, textColor, msg_0442_00020, 48); if (data->hasPokedex) { ov74_02227E64(messageFormat, Pokedex_CountDexOwned(data->pokedex)); - ov74_02227E10(a2->window, msgData, messageFormat, textColor, msg_0442_00019, 64); + PrintPlayerInfoField(a2->window, msgData, messageFormat, textColor, msg_0442_00019, 64); } DrawFrameAndWindow1(a2->window, FALSE, a2->baseTile, a2->paletteNum2); @@ -957,30 +972,30 @@ static BOOL MainMenu_PrintMigrateFromAgbButton(MainMenuAppData *data, u32 a1, Un u32 msgId; switch (data->connectedAgbGame - 1) { case 0: - msgId = msg_0442_00004; + msgId = msg_0442_00004; // "MIGRATE FROM RUBY" break; case 1: - msgId = msg_0442_00005; + msgId = msg_0442_00005; // "MIGRATE FROM SAPPHIRE" break; case 2: - msgId = msg_0442_00006; + msgId = msg_0442_00006; // "MIGRATE FROM LEAFGREEN" break; case 3: - msgId = msg_0442_00007; + msgId = msg_0442_00007; // "MIGRATE FROM FIRERED" break; case 4: - msgId = msg_0442_00008; + msgId = msg_0442_00008; // "MIGRATE FROM EMERALD" break; } ov74_02235568(data->bgConfig, a2, 3, a3, msgId); - ov74_02227DD4(data, 23, a3); + ClearWirelessIcon(data, 23, a3); data->unkEC[a1] = sMainMenuButtons[a1].id; return TRUE; } -static BOOL MainMenu_PrintMysteryGiftButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { +static BOOL MainMenu_PrintMysteryGiftButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 y) { if (!data->drawMysteryGiftButton) { if (SaveMysteryGift_TestFlagx7FF(data->mysteryGift) == TRUE) { data->drawMysteryGiftButton = TRUE; @@ -1003,8 +1018,8 @@ static BOOL MainMenu_PrintMysteryGiftButton(MainMenuAppData *data, u32 a1, UnkSt } if (data->drawMysteryGiftButton == TRUE) { - ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); - ov74_02227DD4(data, 23, a3); + ov74_02235568(data->bgConfig, a2, 3, y, sMainMenuButtons[a1].msgId); + ClearWirelessIcon(data, 23, y); data->unkEC[a1] = sMainMenuButtons[a1].id; data->unk38 |= (1 << 0); SaveMysteryGift_SetFlagx7FF(data->mysteryGift); @@ -1018,8 +1033,8 @@ static BOOL MainMenu_PrintMysteryGiftButton(MainMenuAppData *data, u32 a1, UnkSt static BOOL MainMenu_PrintConnectToRangerButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { if (data->drawConnectToRangerButton == TRUE && data->hasPokedex == TRUE) { ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); - ov74_02227D88(data, 23, a3, 1); - data->unkEC[a1 + 9] = 1; + DrawWirelessIcon(data, 23, a3, 1); + data->unk110[a1] = 1; data->unkEC[a1] = sMainMenuButtons[a1].id; data->unk38 |= (1 << 1); @@ -1032,8 +1047,8 @@ static BOOL MainMenu_PrintConnectToRangerButton(MainMenuAppData *data, u32 a1, U static BOOL MainMenu_PrintConnectToWiiButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { if (data->drawConnectToWiiButton == TRUE) { ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); - data->unkEC[a1 + 9] = 1; - ov74_02227D88(data, 23, a3, 1); + data->unk110[a1] = 1; + DrawWirelessIcon(data, 23, a3, 1); data->unkEC[a1] = sMainMenuButtons[a1].id; return TRUE; @@ -1044,8 +1059,8 @@ static BOOL MainMenu_PrintConnectToWiiButton(MainMenuAppData *data, u32 a1, UnkS static BOOL MainMenu_PrintNintendoWFCSetupButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); - data->unkEC[a1 + 9] = 2; - ov74_02227D88(data, 23, a3, 2); + data->unk110[a1] = 2; + DrawWirelessIcon(data, 23, a3, 2); data->unkEC[a1] = sMainMenuButtons[a1].id; return TRUE; @@ -1053,7 +1068,7 @@ static BOOL MainMenu_PrintNintendoWFCSetupButton(MainMenuAppData *data, u32 a1, static BOOL MainMenu_PrintConnectToPokewalkerButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); - ov74_02227DD4(data, 23, a3); + ClearWirelessIcon(data, 23, a3); data->unkEC[a1] = sMainMenuButtons[a1].id; return TRUE; @@ -1061,14 +1076,14 @@ static BOOL MainMenu_PrintConnectToPokewalkerButton(MainMenuAppData *data, u32 a static BOOL MainMenu_PrintWiiMessageSettingsButton(MainMenuAppData *data, u32 a1, UnkStruct_ov74_02235414 *a2, u32 a3) { ov74_02235568(data->bgConfig, a2, 3, a3, sMainMenuButtons[a1].msgId); - ov74_02227DD4(data, 23, a3); + ClearWirelessIcon(data, 23, a3); data->unkEC[a1] = sMainMenuButtons[a1].id; return TRUE; } static BOOL ov74_022282CC(MainMenuAppData *data) { - u32 uVar3; + u32 y; u32 i; BOOL ret = FALSE; @@ -1076,67 +1091,67 @@ static BOOL ov74_022282CC(MainMenuAppData *data) { data->unk1B0 = 0; data->unk20 = 1; - for (i = 0, uVar3 = 1; i < 9; i++) { + for (i = 0, y = 1; i < APPOPTION_COUNT; i++) { const MainMenuButton *button = &sMainMenuButtons[i]; UnkStruct_ov74_02235414 unk; - ov74_02235414(&unk, &data->unk5C[i], 1, 0x1BA, 0x3F7, 2); - ov74_02235464(&unk, 23, button->buttonHeight, data->unk20); + ov74_02235414(&unk, &data->unk5C[i], 1, NARC_msg_msg_0442_bin, 0x3F7, 2); + ov74_02235464(&unk, 23, button->height, data->unk20); if (button->printFunction != NULL) { if (data->unkEC[i] != 0) { SetWindowX(unk.window, 3); - SetWindowY(unk.window, uVar3); + SetWindowY(unk.window, y); DrawFrameAndWindow1(unk.window, FALSE, unk.baseTile, unk.paletteNum2); - if (data->unkEC[9 + i] != 0) { - ov74_02227D88(data, 23, uVar3, data->unkEC[9 + i]); + if (data->unk110[i] != 0) { + DrawWirelessIcon(data, 23, y, data->unk110[i]); } else { - ov74_02227DD4(data, 23, uVar3); + ClearWirelessIcon(data, 23, y); } - uVar3 += button->buttonHeight + 2; + y += button->height + 2; ret = TRUE; } else { - if (button->printFunction(data, i, &unk, uVar3) == TRUE) { - uVar3 += button->buttonHeight + 2; + if (button->printFunction(data, i, &unk, y) == TRUE) { + y += button->height + 2; ret = TRUE; } } } else { - ov74_02235568(data->bgConfig, &unk, 3, uVar3, button->msgId); + ov74_02235568(data->bgConfig, &unk, 3, y, button->msgId); data->unkEC[i] = button->id; - uVar3 += button->buttonHeight + 2; + y += button->height + 2; } - data->unk20 += button->buttonHeight * 23; + data->unk20 += button->height * 23; if (data->unkEC[i] != 0) { data->unk1B0++; } } - ov74_0222879C(data); - ov74_0222841C(data, data->unk54); + MainMenu_UpdateArrowSprites(data); + ov74_0222841C(data, data->currentOption); return ret; } -static void ov74_0222841C(MainMenuAppData *data, int a1) { +static void ov74_0222841C(MainMenuAppData *data, int currentOption) { for (int i = 0; i < NELEMS(data->unk5C); i++) { Window *window = &data->unk5C[i]; if (!WindowIsInUse(window)) { continue; } - if (i == 0 && data->unk138 == FX32_CONST(384)) { + if (i == 0 && data->effectiveScreenY == FX32_CONST(GX_LCD_SIZE_Y * 2)) { continue; } - if (i < a1 - 5 || i > a1 + 5) { + if (i < currentOption - 5 || i > currentOption + 5) { continue; } - if (data->unk1AC == 1) { + if (data->menuInputState.state == MENU_INPUT_STATE_TOUCH) { DrawFrameAndWindow1(window, TRUE, 0x3EE, 2); BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_0, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); - } else if (i == a1) { + } else if (i == currentOption) { DrawFrameAndWindow1(window, TRUE, 0x3EE, 3); BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_0, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); } else { @@ -1149,57 +1164,57 @@ static void ov74_0222841C(MainMenuAppData *data, int a1) { } static void ov74_02228548(MainMenuAppData *data, int a1) { - for (int i = 0; i < 2; i++) { - Window *window = &data->unk154[i] + 1; // ??? + for (int i = 0; i < (int)NELEMS(data->unk164); i++) { + Window *window = &data->unk164[i]; if (!WindowIsInUse(window)) { continue; } if (a1 < 0) { DrawFrameAndWindow1(window, TRUE, 0x3F7, 2); - BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 1); - } else if (data->unk1AC == 1) { + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 1); + } else if (data->menuInputState.state == MENU_INPUT_STATE_TOUCH) { DrawFrameAndWindow1(window, TRUE, 0x3EE, 2); - BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); } else if (i == a1) { DrawFrameAndWindow1(window, TRUE, 0x3EE, 3); - BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 0); } else { DrawFrameAndWindow1(window, TRUE, 0x3F7, 2); - BgTilemapRectChangePalette(data->bgConfig, 1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 1); + BgTilemapRectChangePalette(data->bgConfig, GF_BG_LYR_MAIN_1, GetWindowX(window), GetWindowY(window), GetWindowWidth(window), GetWindowHeight(window), 1); } } BgCommitTilemapBufferToVram(data->bgConfig, GF_BG_LYR_MAIN_1); } -static BOOL ov74_02228698(MainMenuAppData *data, int offset) { - int unk = data->unk54; - int old54 = data->unk54; +static BOOL ChangeCurrentAppOption(MainMenuAppData *data, int offset) { + int option = data->currentOption; + int oldOption = data->currentOption; while (TRUE) { - unk += offset; + option += offset; - if (unk == -1) { - unk = 0; + if (option == -1) { + option = 0; } - if (unk == 9) { - unk = 8; + if (option == NELEMS(sMainMenuButtons)) { + option = NELEMS(sMainMenuButtons) - 1; } - if (unk == data->unk54) { + if (option == data->currentOption) { break; } - if (data->unkEC[unk] != 0) { + if (data->unkEC[option] != 0) { PlaySE(SEQ_SE_DP_SELECT); break; } } - data->unk54 = unk; + data->currentOption = option; - if (data->unk54 != old54) { - ov74_0222841C(data, data->unk54); + if (data->currentOption != oldOption) { + ov74_0222841C(data, data->currentOption); data->unk1B4 = 6; return TRUE; } @@ -1208,43 +1223,36 @@ static BOOL ov74_02228698(MainMenuAppData *data, int offset) { } static void ov74_022286F8(MainMenuAppData *data, int a1) { - int iStack_20; - int iStack_24; - - iStack_24 = 0; - iStack_20 = 0; - Window *window = &data->unk5C[a1]; - int iVar4 = GetWindowY(window) - 1; - int iVar5 = iVar4 * 8; - int height = GetWindowHeight(window); // unused - int iVar6 = data->unk138 / FX32_ONE; + int optionY = (GetWindowY(window) - 1) * 8; + int optionHeight = GetWindowHeight(window); // unused + int screenY = data->effectiveScreenY / FX32_ONE; - if (iVar6 <= iVar5 && iVar6 + 192 > iVar5) { + if (screenY <= optionY && screenY + GX_LCD_SIZE_Y > optionY) { return; } - data->unk138 = iVar5 * FX32_ONE; + data->effectiveScreenY = optionY * FX32_ONE; - ov74_0222879C(data); - if (data->unk138 == FX32_CONST(384)) { + MainMenu_UpdateArrowSprites(data); + if (data->effectiveScreenY == FX32_CONST(GX_LCD_SIZE_Y * 2)) { FillBgTilemapRect(data->bgConfig, GF_BG_LYR_MAIN_0, 0x0, 0, 0, 32, 12, 0); FillBgTilemapRect(data->bgConfig, GF_BG_LYR_MAIN_2, 0x0, 0, 0, 32, 12, 0); ScheduleBgTilemapBufferTransfer(data->bgConfig, GF_BG_LYR_MAIN_0); ScheduleBgTilemapBufferTransfer(data->bgConfig, GF_BG_LYR_MAIN_2); - } else if (data->unk138 == 0) { + } else if (data->effectiveScreenY == 0) { ov74_022282CC(data); } } -static void ov74_0222879C(MainMenuAppData *data) { - int iStack_20; - int iStack_24; +static void MainMenu_UpdateArrowSprites(MainMenuAppData *data) { + BOOL upArrowEnabled; + BOOL downArrowEnabled; - iStack_24 = 0; - iStack_20 = 0; - int iVar6 = data->unk138 / FX32_ONE; + downArrowEnabled = FALSE; + upArrowEnabled = FALSE; + int screenY = data->effectiveScreenY / FX32_ONE; for (int i = 0; i < NELEMS(data->unk5C); i++) { Window *window = &data->unk5C[i]; @@ -1252,26 +1260,25 @@ static void ov74_0222879C(MainMenuAppData *data) { continue; } - int iVar4 = GetWindowY(window) - 1; - int iVar5 = iVar4 * 8; - int height = GetWindowHeight(window); // unused + int optionY = (GetWindowY(window) - 1) * 8; + int optionHeight = GetWindowHeight(window); // unused - if (iVar6 > iVar5) { - iStack_20 = 1; + if (screenY > optionY) { + upArrowEnabled = TRUE; } - if (iVar6 + 192 <= iVar5) { - iStack_24 = 1; + if (screenY + GX_LCD_SIZE_Y <= optionY) { + downArrowEnabled = TRUE; } } - Sprite_SetAnimCtrlSeq(data->upArrowSprite, iStack_20 * 2); + Sprite_SetAnimCtrlSeq(data->upArrowSprite, upArrowEnabled * 2); Sprite_SetAnimActiveFlag(data->upArrowSprite, FALSE); - Sprite_SetAnimCtrlSeq(data->downArrowSprite, iStack_24 * 2 + 1); + Sprite_SetAnimCtrlSeq(data->downArrowSprite, downArrowEnabled * 2 + 1); Sprite_SetAnimActiveFlag(data->downArrowSprite, FALSE); } -static void ov74_0222883C(OVY_MANAGER *manager) { +static void MainMenu_FreeGraphics(OVY_MANAGER *manager) { MainMenuAppData *data = OverlayManager_GetData(manager); if (data->upArrowSprite != NULL || data->downArrowSprite != NULL) { @@ -1297,8 +1304,8 @@ static void ov74_0222883C(OVY_MANAGER *manager) { Main_SetVBlankIntrCB(NULL, NULL); } -static void ov74_022288C4(MainMenuAppData *data) { - static u16 ov74_0223BBF0[] = { +static void AdvanceButtonBorderAnimation(MainMenuAppData *data) { + static u16 sButtonBorderAnimation[] = { RGB(1, 28, 20), RGB(3, 28, 20), RGB(5, 28, 20), @@ -1332,10 +1339,10 @@ static void ov74_022288C4(MainMenuAppData *data) { 0, }; - if (ov74_0223BBF0[data->unk1A8] == 0) { - data->unk1A8 = 0; + if (sButtonBorderAnimation[data->buttonBorderAnimFrame] == 0) { + data->buttonBorderAnimFrame = 0; } - ((vu16 *)HW_PLTT)[54] = ov74_0223BBF0[data->unk1A8++]; + ((vu16 *)HW_PLTT)[54] = sButtonBorderAnimation[data->buttonBorderAnimFrame++]; } static void MainMenu_OnVBlank(BgConfig *bgConfig) { @@ -1360,8 +1367,8 @@ BOOL MainMenuApp_Init(OVY_MANAGER *manager, int *state) { data->saveData = args->saveData; data->mysteryGift = Save_MysteryGift_Get(data->saveData); - data->unk134 = 0; - data->unk138 = 0; + data->currentScreenY = 0; + data->effectiveScreenY = 0; data->profile = Save_PlayerData_GetProfileAddr(data->saveData); data->pokedex = Save_Pokedex_Get(data->saveData); data->igt = Save_PlayerData_GetIGTAddr(data->saveData); @@ -1383,7 +1390,7 @@ BOOL MainMenuApp_Init(OVY_MANAGER *manager, int *state) { BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state) { MainMenuAppData *data = OverlayManager_GetData(manager); - data->unk18++; + data->frames++; BOOL cartInserted = CTRDG_IsExisting(); // unused if (ov74_0222779C(data) == TRUE) { @@ -1392,18 +1399,18 @@ BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state) { return FALSE; } - ov74_022288C4(data); + AdvanceButtonBorderAnimation(data); if (data->unk1B4 != 0) { data->unk1B4--; } switch (*state) { case 0: - ov74_02227B7C(data); + MainMenu_SetupGraphics(data); *state = 1; break; case 1: - if (ov74_02227580(data) == 0) { + if (ov74_02227580(data) == 0) { // always 0 *state = 3; } else { ov74_0223539C(1, 2, state, 8); @@ -1418,36 +1425,36 @@ BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state) { case 3: data->unk13C = 12; if (data->dontHaveSavedata == TRUE) { - data->selectedApp = SELECTEDAPP_NEW_GAME; + data->selectedApp = APPOPTION_NEW_GAME; ov74_0223539C(0, 7, state, 8); } else { - ov74_0222763C(data); + DetectInsertedGBACart(data); *state = 4; } break; case 4: - ov74_02227CC8(data); - ov74_02227D48(data); + MainMenu_SetupSprites(data); + MainMenu_SetupWifiTiles(data); Main_SetVBlankIntrCB((GFIntrCB)MainMenu_OnVBlank, data->bgConfig); ov74_022282CC(data); - ov74_0222841C(data, data->unk54); + ov74_0222841C(data, data->currentOption); ov74_0223539C(1, 5, state, 8); ((vu16 *)HW_PLTT)[0] = MAIN_MENU_BACKGROUND_COLOR; data->unk13C = 10; break; case 5: - ov74_02227428(data, state); - if (data->unk48 == 1) { + MainMenu_HandleInput(data, state); + if (data->unk48 == TRUE) { ov74_022282CC(data); - data->unk48 = 0; - } else if (*state == 5 && data->unk188 == 1) { - data->unk188 = 0; + data->unk48 = FALSE; + } else if (*state == 5 && data->unk188 == TRUE) { + data->unk188 = FALSE; data->unk148 = 1; } break; case 6: if (data->unk144 == 15) { - if (data->unk150 & (1 << 1)) { + if (data->unk150 & PAD_BUTTON_B) { *state = 5; } else { ov74_0223539C(0, 7, state, 8); @@ -1455,12 +1462,12 @@ BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state) { } break; case 7: - ov74_0222883C(manager); + MainMenu_FreeGraphics(manager); return TRUE; - case 8: + case 8: // Wait for palette fade ov74_022353FC(state); break; - case 9: + case 9: // Unused exit state return TRUE; } @@ -1475,37 +1482,37 @@ static void MainMenu_QueueSelectedApp(MainMenuAppData *data) { FS_EXTERN_OVERLAY(OVY_112); switch (data->selectedApp) { - case SELECTEDAPP_CONTINUE: + case APPOPTION_CONTINUE: RegisterMainOverlay(FS_OVERLAY_ID(OVY_36), &ov36_App_MainMenu_SelectOption_Continue); break; - case SELECTEDAPP_NEW_GAME: + case APPOPTION_NEW_GAME: RegisterMainOverlay(FS_OVERLAY_ID(OVY_36), &ov36_App_MainMenu_SelectOption_NewGame); break; - case SELECTEDAPP_MYSTERY_GIFT: + case APPOPTION_MYSTERY_GIFT: RegisterMainOverlay(FS_OVERLAY_ID(OVY_74), &gApp_MainMenu_SelectOption_MysteryGift); break; - case SELECTEDAPP_MIGRATE_AGB: + case APPOPTION_MIGRATE_AGB: RegisterMainOverlay(FS_OVERLAY_ID(OVY_74), &gApp_MainMenu_SelectOption_MigrateFromAgb); break; - case SELECTEDAPP_RANGER: + case APPOPTION_RANGER: RegisterMainOverlay(FS_OVERLAY_ID(OVY_74), &gApp_MainMenu_SelectOption_ConnectToRanger); break; - case SELECTEDAPP_CONNECT_TO_WII: + case APPOPTION_CONNECT_TO_WII: sub_02027098("data/eoo.dat"); break; - case SELECTEDAPP_WFC: + case APPOPTION_WFC: Sound_Stop(); RegisterMainOverlay(FS_OVERLAY_ID_NONE, &gApp_MainMenu_SelectOption_NintendoWFCSetup); break; - case SELECTEDAPP_POKEWALKER: + case APPOPTION_POKEWALKER: Sound_Stop(); RegisterMainOverlay(FS_OVERLAY_ID(OVY_112), &ov112_App_MainMenu_SelectOption_ConnectToPokewalker); break; - case SELECTEDAPP_WII_SETTINGS: + case APPOPTION_WII_SETTINGS: Sound_Stop(); RegisterMainOverlay(FS_OVERLAY_ID(OVY_75), &ov75_App_MainMenu_SelectOption_WiiMessageSettings); break; - case SELECTEDAPP_TITLE_SCREEN: + case APPOPTION_TITLE_SCREEN: RegisterMainOverlay(FS_OVERLAY_ID(intro_title), &gApplication_TitleScreen); break; } From cb184f04907c05fe01480eaa6384d9558efe4f4e Mon Sep 17 00:00:00 2001 From: tgsm Date: Sat, 8 Feb 2025 23:23:35 -0600 Subject: [PATCH 5/6] application/main_menu: Slightly more documentation --- src/application/main_menu/main_menu.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/application/main_menu/main_menu.c b/src/application/main_menu/main_menu.c index 6cd8265b4..a70f95a34 100644 --- a/src/application/main_menu/main_menu.c +++ b/src/application/main_menu/main_menu.c @@ -214,9 +214,9 @@ static u32 ov74_02227060(MainMenuAppData *data) { return 0; } -static u32 GetNthAvailableApp(MainMenuAppData *data, u8 a1) { +static u32 GetNthAvailableApp(MainMenuAppData *data, u8 n) { for (u32 i = 0, apps = 0; i < APPOPTION_COUNT; i++) { - if (data->unkEC[i] != 0 && apps++ == a1) { + if (data->unkEC[i] != 0 && apps++ == n) { return i; } } @@ -329,7 +329,7 @@ static BOOL MainMenu_HandleTouchInput(MainMenuAppData *data, int *state, BOOL *v if (hitboxNum == 0 && Sprite_GetAnimationNumber(data->upArrowSprite) / 2 != 0) { Sprite_SetAnimActiveFlag(data->upArrowSprite, TRUE); Sprite_ResetAnimCtrlState(data->upArrowSprite); - if (data->currentOption > 3 && data->effectiveScreenY > FX32_CONST(192)) { + if (data->currentOption > 3 && data->effectiveScreenY > FX32_CONST(GX_LCD_SIZE_Y)) { data->currentOption = GetNthAvailableApp(data, 3); } else { data->currentOption = GetNthAvailableApp(data, 0); @@ -758,7 +758,7 @@ static BOOL ov74_0222779C(MainMenuAppData *data) { return TRUE; } -static void ov74_02227AEC(MainMenuAppData *data) { +static void HandleScreenScroll(MainMenuAppData *data) { if (data->currentScreenY == data->effectiveScreenY) { return; } @@ -1395,11 +1395,12 @@ BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state) { if (ov74_0222779C(data) == TRUE) { ov74_022276AC(data); - ov74_02227AEC(data); + HandleScreenScroll(data); return FALSE; } AdvanceButtonBorderAnimation(data); + if (data->unk1B4 != 0) { data->unk1B4--; } @@ -1472,7 +1473,7 @@ BOOL MainMenuApp_Main(OVY_MANAGER *manager, int *state) { } ov74_022276AC(data); - ov74_02227AEC(data); + HandleScreenScroll(data); ov74_022358BC(); return FALSE; } From 53b4a67f1dfdc844961ced0579703bc5c3eae7ac Mon Sep 17 00:00:00 2001 From: tgsm Date: Sun, 9 Feb 2025 12:01:06 -0600 Subject: [PATCH 6/6] application/main_menu: Run clang-format --- src/application/main_menu/main_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/application/main_menu/main_menu.c b/src/application/main_menu/main_menu.c index a70f95a34..07da8aa30 100644 --- a/src/application/main_menu/main_menu.c +++ b/src/application/main_menu/main_menu.c @@ -11,6 +11,7 @@ #include "font.h" #include "gf_gfx_loader.h" #include "main.h" +#include "menu_input_state.h" #include "msgdata.h" #include "mystery_gift.h" #include "overlay_36.h" @@ -18,7 +19,6 @@ #include "pokedex.h" #include "render_window.h" #include "sav_system_info.h" -#include "menu_input_state.h" #include "save.h" #include "save_arrays.h" #include "save_data_read_error.h"