diff options
author | YamaArashi <shadow962@live.com> | 2016-09-04 01:15:12 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-09-04 01:15:12 -0700 |
commit | 55bfe3ca016304235d5d117a35d8973b10ecc657 (patch) | |
tree | 499d36b5493c1df1658fa79af42d76a37188cc27 | |
parent | 4d518e8ea5c93c669eb14de89b5baf6eba1ac9b0 (diff) |
WIP main_menu.c
-rw-r--r-- | asm/rom3.s | 1386 | ||||
-rw-r--r-- | asm/rom5.s | 2 | ||||
-rw-r--r-- | data/data2.s | 42 | ||||
-rw-r--r-- | iwram_syms.txt | 2 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/main_menu.c | 605 |
6 files changed, 626 insertions, 1412 deletions
diff --git a/asm/rom3.s b/asm/rom3.s index a32cec299..94b6d2b21 100644 --- a/asm/rom3.s +++ b/asm/rom3.s @@ -6,1392 +6,6 @@ .text - thumb_func_start CB2_MainMenu -CB2_MainMenu: @ 80096C4 - push {lr} - bl RunTasks - bl AnimateSprites - bl BuildOamBuffer - bl UpdatePaletteFade - pop {r0} - bx r0 - thumb_func_end CB2_MainMenu - - thumb_func_start VBlankCB_MainMenu -VBlankCB_MainMenu: @ 80096DC - push {lr} - bl LoadOam - bl ProcessSpriteCopyRequests - bl TransferPlttBuffer - pop {r0} - bx r0 - thumb_func_end VBlankCB_MainMenu - - thumb_func_start CB2_InitMainMenu -CB2_InitMainMenu: @ 80096F0 - push {lr} - movs r0, 0 - bl InitMainMenu - pop {r0} - bx r0 - thumb_func_end CB2_InitMainMenu - - thumb_func_start sub_80096FC -sub_80096FC: @ 80096FC - push {lr} - movs r0, 0x1 - bl InitMainMenu - pop {r0} - bx r0 - thumb_func_end sub_80096FC - - thumb_func_start InitMainMenu -InitMainMenu: @ 8009708 - push {r4,r5,lr} - sub sp, 0xC - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - movs r0, 0 - bl SetVBlankCallback - movs r0, 0x80 - lsls r0, 19 - movs r1, 0 - strh r1, [r0] - adds r0, 0xC - strh r1, [r0] - subs r0, 0x2 - strh r1, [r0] - subs r0, 0x2 - strh r1, [r0] - adds r0, 0x10 - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - subs r0, 0x6 - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - subs r0, 0x6 - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - add r0, sp, 0x4 - strh r1, [r0] - ldr r1, _080097BC - str r0, [r1] - movs r0, 0xC0 - lsls r0, 19 - str r0, [r1, 0x4] - ldr r0, _080097C0 - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - movs r5, 0 - str r5, [sp, 0x8] - add r0, sp, 0x8 - str r0, [r1] - movs r0, 0xE0 - lsls r0, 19 - str r0, [r1, 0x4] - ldr r0, _080097C4 - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - add r0, sp, 0x4 - strh r5, [r0] - str r0, [r1] - ldr r0, _080097C8 - str r0, [r1, 0x4] - ldr r0, _080097CC - str r0, [r1, 0x8] - ldr r0, [r1, 0x8] - bl ResetPaletteFade - ldr r0, _080097D0 - movs r1, 0 - movs r2, 0x20 - bl LoadPalette - bl remove_some_task - bl ResetTasks - bl ResetSpriteData - bl FreeAllSpritePalettes - ldr r0, _080097D4 - bl SetUpWindowConfig - ldr r0, _080097D8 - bl sub_8071C4C - cmp r4, 0 - beq _080097DC - movs r0, 0x1 - negs r0, r0 - str r5, [sp] - movs r1, 0 - movs r2, 0x10 - movs r3, 0 - bl BeginNormalPaletteFade - b _080097EE - .align 2, 0 -_080097BC: .4byte 0x040000d4 -_080097C0: .4byte 0x8100c000 -_080097C4: .4byte 0x85000100 -_080097C8: .4byte 0x05000002 -_080097CC: .4byte 0x810001ff -_080097D0: .4byte gUnknown_081E797C -_080097D4: .4byte gWindowConfig_81E6C3C -_080097D8: .4byte gWindowConfig_81E6CE4 -_080097DC: - movs r0, 0x1 - negs r0, r0 - ldr r1, _08009858 - str r1, [sp] - movs r1, 0 - movs r2, 0x10 - movs r3, 0 - bl BeginNormalPaletteFade -_080097EE: - ldr r0, _0800985C - movs r1, 0 - strh r1, [r0] - adds r0, 0x4 - strh r1, [r0] - adds r0, 0x4 - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - adds r0, 0x6 - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - adds r0, 0x2 - strh r1, [r0] - ldr r3, _08009860 - ldrh r2, [r3] - strh r1, [r3] - ldr r4, _08009864 - ldrh r0, [r4] - movs r1, 0x1 - orrs r0, r1 - strh r0, [r4] - strh r2, [r3] - ldr r0, _08009868 - bl SetVBlankCallback - ldr r0, _0800986C - bl SetMainCallback2 - movs r1, 0x80 - lsls r1, 19 - movs r2, 0xC5 - lsls r2, 6 - adds r0, r2, 0 - strh r0, [r1] - ldr r0, _08009870 - movs r1, 0 - bl CreateTask - lsls r0, 24 - lsrs r0, 24 - ldr r2, _08009874 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - movs r0, 0 - strh r0, [r1, 0xA] - add sp, 0xC - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08009858: .4byte 0x0000ffff -_0800985C: .4byte REG_WIN0H -_08009860: .4byte 0x04000208 -_08009864: .4byte 0x04000200 -_08009868: .4byte VBlankCB_MainMenu -_0800986C: .4byte CB2_MainMenu -_08009870: .4byte Task_CheckSave -_08009874: .4byte 0x03004b20 - thumb_func_end InitMainMenu - - thumb_func_start Task_CheckSave -Task_CheckSave: @ 8009878 - push {r4-r7,lr} - mov r7, r8 - push {r7} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _080098D4 - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0 - beq _08009894 - b _080099FC -_08009894: - ldr r7, _080098D8 - strh r6, [r7] - ldr r0, _080098DC - mov r8, r0 - strh r6, [r0] - ldr r1, _080098E0 - ldr r2, _080098E4 - adds r0, r2, 0 - strh r0, [r1] - adds r1, 0x2 - movs r0, 0x31 - strh r0, [r1] - adds r1, 0x6 - movs r0, 0xF1 - strh r0, [r1] - ldr r0, _080098E8 - strh r6, [r0] - adds r1, 0x4 - movs r0, 0x7 - strh r0, [r1] - ldr r0, _080098EC - ldrh r4, [r0] - cmp r4, 0x2 - beq _0800993C - cmp r4, 0x2 - bgt _080098F0 - cmp r4, 0 - beq _080099AC - cmp r4, 0x1 - beq _080098FA - b _080099AC - .align 2, 0 -_080098D4: .4byte 0x0202f388 -_080098D8: .4byte REG_WIN0H -_080098DC: .4byte REG_WIN0V -_080098E0: .4byte REG_WININ -_080098E4: .4byte 0x00001111 -_080098E8: .4byte REG_BLDALPHA -_080098EC: .4byte 0x03005eb8 -_080098F0: - cmp r4, 0x4 - beq _080099C8 - cmp r4, 0xFF - beq _08009950 - b _080099AC -_080098FA: - bl sub_806918C - cmp r0, 0x1 - bne _0800991C - ldr r2, _08009918 - lsls r3, r5, 2 - adds r0, r3, r5 - lsls r0, 3 - adds r0, r2 - movs r1, 0x2 - strh r1, [r0, 0x8] - adds r1, r2, 0 - adds r2, r3, 0 - b _0800992A - .align 2, 0 -_08009918: .4byte 0x03004b20 -_0800991C: - ldr r0, _08009934 - lsls r2, r5, 2 - adds r1, r2, r5 - lsls r1, 3 - adds r1, r0 - strh r4, [r1, 0x8] - adds r1, r0, 0 -_0800992A: - adds r0, r2, r5 - lsls r0, 3 - adds r0, r1 - ldr r1, _08009938 - b _080099FA - .align 2, 0 -_08009934: .4byte 0x03004b20 -_08009938: .4byte Task_CheckRtc -_0800993C: - movs r0, 0x2 - movs r1, 0xE - movs r2, 0x1B - movs r3, 0x13 - bl DrawDefaultWindow - ldr r0, _0800994C - b _080099D6 - .align 2, 0 -_0800994C: .4byte gUnknown_0840DEC2 -_08009950: - movs r0, 0x2 - movs r1, 0xE - movs r2, 0x1B - movs r3, 0x13 - bl DrawDefaultWindow - ldr r0, _08009994 - movs r1, 0x3 - movs r2, 0xF - bl AddTextPrinterWithCallbackForMessage - ldr r2, _08009998 - adds r0, r2, 0 - strh r0, [r7] - ldr r1, _0800999C - adds r0, r1, 0 - mov r2, r8 - strh r0, [r2] - ldr r1, _080099A0 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - adds r4, r0, r1 - movs r5, 0x1 - strh r5, [r4, 0x8] - ldr r0, _080099A4 - str r0, [r4] - bl sub_806918C - cmp r0, 0x1 - bne _080099A8 - movs r0, 0x2 - strh r0, [r4, 0x8] - b _080099FC - .align 2, 0 -_08009994: .4byte gUnknown_0840DE81 -_08009998: .4byte 0x000011df -_0800999C: .4byte 0x0000719f -_080099A0: .4byte 0x03004b20 -_080099A4: .4byte Task_WaitForSaveErrorAck -_080099A8: - strh r5, [r4, 0x8] - b _080099FC -_080099AC: - ldr r1, _080099C0 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - adds r0, r1 - movs r1, 0 - strh r1, [r0, 0x8] - ldr r1, _080099C4 - b _080099FA - .align 2, 0 -_080099C0: .4byte 0x03004b20 -_080099C4: .4byte Task_CheckRtc -_080099C8: - movs r0, 0x2 - movs r1, 0xE - movs r2, 0x1B - movs r3, 0x13 - bl DrawDefaultWindow - ldr r0, _08009A08 -_080099D6: - movs r1, 0x3 - movs r2, 0xF - bl AddTextPrinterWithCallbackForMessage - ldr r1, _08009A0C - adds r0, r1, 0 - strh r0, [r7] - ldr r2, _08009A10 - adds r0, r2, 0 - mov r1, r8 - strh r0, [r1] - ldr r1, _08009A14 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - adds r0, r1 - strh r6, [r0, 0x8] - ldr r1, _08009A18 -_080099FA: - str r1, [r0] -_080099FC: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08009A08: .4byte gUnknown_0840DEE5 -_08009A0C: .4byte 0x000011df -_08009A10: .4byte 0x0000719f -_08009A14: .4byte 0x03004b20 -_08009A18: .4byte Task_WaitForSaveErrorAck - thumb_func_end Task_CheckSave - - thumb_func_start Task_WaitForSaveErrorAck -Task_WaitForSaveErrorAck: @ 8009A1C - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - bl sub_8072080 - lsls r0, 24 - cmp r0, 0 - beq _08009A52 - ldr r0, _08009A58 - ldrh r1, [r0, 0x2E] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08009A52 - movs r0, 0x2 - movs r1, 0xE - movs r2, 0x1B - movs r3, 0x13 - bl Reset - ldr r0, _08009A5C - lsls r1, r4, 2 - adds r1, r4 - lsls r1, 3 - adds r1, r0 - ldr r0, _08009A60 - str r0, [r1] -_08009A52: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08009A58: .4byte 0x03001770 -_08009A5C: .4byte 0x03004b20 -_08009A60: .4byte Task_CheckRtc - thumb_func_end Task_WaitForSaveErrorAck - - thumb_func_start Task_CheckRtc -Task_CheckRtc: @ 8009A64 - push {r4-r7,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r5, r4, 0 - ldr r0, _08009AC0 - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0 - bne _08009B10 - ldr r6, _08009AC4 - strh r2, [r6] - ldr r7, _08009AC8 - strh r2, [r7] - ldr r1, _08009ACC - ldr r3, _08009AD0 - adds r0, r3, 0 - strh r0, [r1] - adds r1, 0x2 - movs r0, 0x31 - strh r0, [r1] - adds r1, 0x6 - movs r0, 0xF1 - strh r0, [r1] - ldr r0, _08009AD4 - strh r2, [r0] - adds r1, 0x4 - movs r0, 0x7 - strh r0, [r1] - bl RtcGetErrorStatus - movs r1, 0xFF - lsls r1, 4 - ands r1, r0 - cmp r1, 0 - bne _08009AE0 - ldr r0, _08009AD8 - lsls r1, r4, 2 - adds r1, r4 - lsls r1, 3 - adds r1, r0 - ldr r0, _08009ADC - str r0, [r1] - b _08009B10 - .align 2, 0 -_08009AC0: .4byte 0x0202f388 -_08009AC4: .4byte REG_WIN0H -_08009AC8: .4byte REG_WIN0V -_08009ACC: .4byte REG_WININ -_08009AD0: .4byte 0x00001111 -_08009AD4: .4byte REG_BLDALPHA -_08009AD8: .4byte 0x03004b20 -_08009ADC: .4byte Task_DrawMainMenu -_08009AE0: - movs r0, 0x2 - movs r1, 0xE - movs r2, 0x1B - movs r3, 0x13 - bl DrawDefaultWindow - ldr r0, _08009B18 - movs r1, 0x3 - movs r2, 0xF - bl AddTextPrinterWithCallbackForMessage - ldr r1, _08009B1C - adds r0, r1, 0 - strh r0, [r6] - ldr r3, _08009B20 - adds r0, r3, 0 - strh r0, [r7] - ldr r1, _08009B24 - lsls r0, r5, 2 - adds r0, r5 - lsls r0, 3 - adds r0, r1 - ldr r1, _08009B28 - str r1, [r0] -_08009B10: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08009B18: .4byte gUnknown_0840DF10 -_08009B1C: .4byte 0x000011df -_08009B20: .4byte 0x0000719f -_08009B24: .4byte 0x03004b20 -_08009B28: .4byte Task_WaitForRtcErrorAck - thumb_func_end Task_CheckRtc - - thumb_func_start Task_WaitForRtcErrorAck -Task_WaitForRtcErrorAck: @ 8009B2C - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - bl sub_8072080 - lsls r0, 24 - cmp r0, 0 - beq _08009B62 - ldr r0, _08009B68 - ldrh r1, [r0, 0x2E] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08009B62 - movs r0, 0x2 - movs r1, 0xE - movs r2, 0x1B - movs r3, 0x13 - bl Reset - ldr r0, _08009B6C - lsls r1, r4, 2 - adds r1, r4 - lsls r1, 3 - adds r1, r0 - ldr r0, _08009B70 - str r0, [r1] -_08009B62: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08009B68: .4byte 0x03001770 -_08009B6C: .4byte 0x03004b20 -_08009B70: .4byte Task_DrawMainMenu - thumb_func_end Task_WaitForRtcErrorAck - - thumb_func_start Task_DrawMainMenu -Task_DrawMainMenu: @ 8009B74 - push {r4,r5,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _08009BDC - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0 - beq _08009B8E - b _08009D20 -_08009B8E: - ldr r0, _08009BE0 - strh r2, [r0] - adds r0, 0x4 - strh r2, [r0] - ldr r1, _08009BE4 - ldr r3, _08009BE8 - adds r0, r3, 0 - strh r0, [r1] - adds r1, 0x2 - movs r0, 0x31 - strh r0, [r1] - adds r1, 0x6 - movs r0, 0xF1 - strh r0, [r1] - ldr r0, _08009BEC - strh r2, [r0] - adds r1, 0x4 - movs r0, 0x7 - strh r0, [r1] - mov r0, sp - strh r2, [r0] - movs r1, 0xFE - movs r2, 0x2 - bl LoadPalette - ldr r0, _08009BF0 - ldrb r0, [r0, 0x8] - cmp r0, 0 - bne _08009BF8 - mov r1, sp - ldr r2, _08009BF4 - adds r0, r2, 0 - strh r0, [r1] - mov r0, sp - movs r1, 0xF1 - movs r2, 0x2 - bl LoadPalette - b _08009C0A - .align 2, 0 -_08009BDC: .4byte 0x0202f388 -_08009BE0: .4byte REG_WIN0H -_08009BE4: .4byte REG_WININ -_08009BE8: .4byte 0x00001111 -_08009BEC: .4byte REG_BLDALPHA -_08009BF0: .4byte gSaveBlock2 -_08009BF4: .4byte 0x00007e04 -_08009BF8: - mov r1, sp - ldr r3, _08009C54 - adds r0, r3, 0 - strh r0, [r1] - mov r0, sp - movs r1, 0xF1 - movs r2, 0x2 - bl LoadPalette -_08009C0A: - ldr r2, _08009C58 - lsls r1, r4, 2 - adds r0, r1, r4 - lsls r0, 3 - adds r0, r2 - movs r2, 0x8 - ldrsh r0, [r0, r2] - adds r5, r1, 0 - cmp r0, 0x1 - beq _08009C64 - cmp r0, 0x1 - ble _08009C26 - cmp r0, 0x2 - beq _08009CB8 -_08009C26: - movs r0, 0x1 - movs r1, 0 - movs r2, 0x1C - movs r3, 0x3 - bl DrawDefaultWindow - ldr r0, _08009C5C - movs r1, 0x2 - movs r2, 0x1 - bl PrintMainMenuItem - movs r0, 0x1 - movs r1, 0x4 - movs r2, 0x1C - movs r3, 0x7 - bl DrawDefaultWindow - ldr r0, _08009C60 - movs r1, 0x2 - movs r2, 0x5 - bl PrintMainMenuItem - b _08009D14 - .align 2, 0 -_08009C54: .4byte 0x0000547f -_08009C58: .4byte 0x03004b20 -_08009C5C: .4byte gUnknown_0840DCD0 -_08009C60: .4byte gUnknown_0840DCE2 -_08009C64: - movs r0, 0x1 - movs r1, 0 - movs r2, 0x1C - movs r3, 0x7 - bl DrawDefaultWindow - ldr r0, _08009CAC - movs r1, 0x2 - movs r2, 0x1 - bl PrintMainMenuItem - movs r0, 0x1 - movs r1, 0x8 - movs r2, 0x1C - movs r3, 0xB - bl DrawDefaultWindow - ldr r0, _08009CB0 - movs r1, 0x2 - movs r2, 0x9 - bl PrintMainMenuItem - movs r0, 0x1 - movs r1, 0xC - movs r2, 0x1C - movs r3, 0xF - bl DrawDefaultWindow - ldr r0, _08009CB4 - movs r1, 0x2 - movs r2, 0xD - bl PrintMainMenuItem - bl PrintSaveFileInfo - b _08009D14 - .align 2, 0 -_08009CAC: .4byte gUnknown_0840DCD9 -_08009CB0: .4byte gUnknown_0840DCD0 -_08009CB4: .4byte gUnknown_0840DCE2 -_08009CB8: - movs r0, 0x1 - movs r1, 0 - movs r2, 0x1C - movs r3, 0x7 - bl DrawDefaultWindow - ldr r0, _08009D28 - movs r1, 0x2 - movs r2, 0x1 - bl PrintMainMenuItem - movs r0, 0x1 - movs r1, 0x8 - movs r2, 0x1C - movs r3, 0xB - bl DrawDefaultWindow - ldr r0, _08009D2C - movs r1, 0x2 - movs r2, 0x9 - bl PrintMainMenuItem - movs r0, 0x1 - movs r1, 0xC - movs r2, 0x1C - movs r3, 0xF - bl DrawDefaultWindow - ldr r0, _08009D30 - movs r1, 0x2 - movs r2, 0xD - bl PrintMainMenuItem - movs r0, 0x1 - movs r1, 0x10 - movs r2, 0x1C - movs r3, 0x13 - bl DrawDefaultWindow - ldr r0, _08009D34 - movs r1, 0x2 - movs r2, 0x11 - bl PrintMainMenuItem - bl PrintSaveFileInfo -_08009D14: - ldr r0, _08009D38 - adds r1, r5, r4 - lsls r1, 3 - adds r1, r0 - ldr r0, _08009D3C - str r0, [r1] -_08009D20: - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08009D28: .4byte gUnknown_0840DCD9 -_08009D2C: .4byte gUnknown_0840DCD0 -_08009D30: .4byte gUnknown_0840DCE9 -_08009D34: .4byte gUnknown_0840DCE2 -_08009D38: .4byte 0x03004b20 -_08009D3C: .4byte Task_HighlightCurrentMenuItem - thumb_func_end Task_DrawMainMenu - - thumb_func_start Task_HighlightCurrentMenuItem -Task_HighlightCurrentMenuItem: @ 8009D40 - push {r4,lr} - lsls r0, 24 - lsrs r0, 24 - ldr r1, _08009D64 - lsls r4, r0, 2 - adds r4, r0 - lsls r4, 3 - adds r4, r1 - ldrb r0, [r4, 0x8] - ldrb r1, [r4, 0xA] - bl HighlightCurrentMenuItem - ldr r0, _08009D68 - str r0, [r4] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08009D64: .4byte 0x03004b20 -_08009D68: .4byte Task_MainMenuProcessKeyInput - thumb_func_end Task_HighlightCurrentMenuItem - - thumb_func_start MainMenuProcessKeyInput -MainMenuProcessKeyInput: @ 8009D6C - push {r4-r7,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r4, r0, 24 - ldr r1, _08009DA8 - ldrh r2, [r1, 0x2E] - movs r0, 0x1 - ands r0, r2 - mov r12, r1 - cmp r0, 0 - beq _08009DB4 - movs r0, 0x5 - bl audio_play - movs r0, 0x1 - negs r0, r0 - movs r1, 0 - str r1, [sp] - movs r2, 0 - movs r3, 0x10 - bl BeginNormalPaletteFade - ldr r1, _08009DAC - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - adds r0, r1 - ldr r1, _08009DB0 - str r1, [r0] - b _08009E74 - .align 2, 0 -_08009DA8: .4byte 0x03001770 -_08009DAC: .4byte 0x03004b20 -_08009DB0: .4byte MainMenuPressedA -_08009DB4: - movs r0, 0x2 - ands r0, r2 - cmp r0, 0 - beq _08009E00 - movs r0, 0x5 - bl audio_play - movs r0, 0x1 - negs r0, r0 - ldr r1, _08009DF0 - str r1, [sp] - movs r1, 0 - movs r2, 0 - movs r3, 0x10 - bl BeginNormalPaletteFade - ldr r1, _08009DF4 - movs r0, 0xF0 - strh r0, [r1] - adds r1, 0x4 - movs r0, 0xA0 - strh r0, [r1] - ldr r1, _08009DF8 - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - adds r0, r1 - ldr r1, _08009DFC - str r1, [r0] - b _08009E74 - .align 2, 0 -_08009DF0: .4byte 0x0000ffff -_08009DF4: .4byte REG_WIN0H -_08009DF8: .4byte 0x03004b20 -_08009DFC: .4byte MainMenuPressedB -_08009E00: - ldr r0, _08009E20 - lsls r2, r4, 2 - adds r1, r2, r4 - lsls r1, 3 - adds r1, r0 - movs r3, 0x8 - ldrsh r1, [r1, r3] - adds r6, r0, 0 - cmp r1, 0x1 - beq _08009E24 - cmp r1, 0x1 - ble _08009E1C - cmp r1, 0x2 - beq _08009E28 -_08009E1C: - movs r5, 0x2 - b _08009E2A - .align 2, 0 -_08009E20: .4byte 0x03004b20 -_08009E24: - movs r5, 0x3 - b _08009E2A -_08009E28: - movs r5, 0x4 -_08009E2A: - mov r7, r12 - ldrh r1, [r7, 0x2E] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08009E4E - adds r0, r2, r4 - lsls r0, 3 - adds r1, r0, r6 - ldrh r3, [r1, 0xA] - movs r7, 0xA - ldrsh r0, [r1, r7] - cmp r0, 0 - ble _08009E4E - subs r0, r3, 0x1 - strh r0, [r1, 0xA] - movs r0, 0x1 - b _08009E76 -_08009E4E: - mov r0, r12 - ldrh r1, [r0, 0x2E] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08009E74 - adds r0, r2, r4 - lsls r0, 3 - adds r2, r0, r6 - movs r3, 0xA - ldrsh r1, [r2, r3] - subs r0, r5, 0x1 - cmp r1, r0 - bge _08009E74 - ldrh r0, [r2, 0xA] - adds r0, 0x1 - strh r0, [r2, 0xA] - movs r0, 0x1 - b _08009E76 -_08009E74: - movs r0, 0 -_08009E76: - add sp, 0x4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end MainMenuProcessKeyInput - - thumb_func_start Task_MainMenuProcessKeyInput -Task_MainMenuProcessKeyInput: @ 8009E80 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r4, 0 - bl MainMenuProcessKeyInput - lsls r0, 24 - cmp r0, 0 - beq _08009EA0 - ldr r0, _08009EA8 - lsls r1, r4, 2 - adds r1, r4 - lsls r1, 3 - adds r1, r0 - ldr r0, _08009EAC - str r0, [r1] -_08009EA0: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08009EA8: .4byte 0x03004b20 -_08009EAC: .4byte Task_HighlightCurrentMenuItem - thumb_func_end Task_MainMenuProcessKeyInput - - thumb_func_start MainMenuPressedA -MainMenuPressedA: @ 8009EB0 - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _08009EEC - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _08009FA4 - ldr r0, _08009EF0 - lsls r2, r4, 2 - adds r1, r2, r4 - lsls r1, 3 - adds r1, r0 - movs r5, 0x8 - ldrsh r3, [r1, r5] - adds r5, r0, 0 - cmp r3, 0x1 - beq _08009EF4 - cmp r3, 0x1 - ble _08009EDE - cmp r3, 0x2 - beq _08009F06 -_08009EDE: - movs r0, 0xA - ldrsh r1, [r1, r0] - cmp r1, 0 - beq _08009F1E - cmp r1, 0x1 - bne _08009F1E - b _08009F26 - .align 2, 0 -_08009EEC: .4byte 0x0202f388 -_08009EF0: .4byte 0x03004b20 -_08009EF4: - movs r0, 0xA - ldrsh r1, [r1, r0] - cmp r1, 0x1 - beq _08009F1E - cmp r1, 0x1 - ble _08009F1A - cmp r1, 0x2 - bne _08009F1A - b _08009F26 -_08009F06: - movs r0, 0xA - ldrsh r1, [r1, r0] - cmp r1, 0x1 - beq _08009F1E - cmp r1, 0x1 - ble _08009F1A - cmp r1, 0x2 - beq _08009F22 - cmp r1, 0x3 - beq _08009F26 -_08009F1A: - movs r0, 0x1 - b _08009F28 -_08009F1E: - movs r0, 0 - b _08009F28 -_08009F22: - movs r0, 0x3 - b _08009F28 -_08009F26: - movs r0, 0x2 -_08009F28: - cmp r0, 0x1 - beq _08009F5C - cmp r0, 0x1 - ble _08009F38 - cmp r0, 0x2 - beq _08009F78 - cmp r0, 0x3 - beq _08009F98 -_08009F38: - ldr r0, _08009F50 - movs r1, 0 - strh r1, [r0] - ldr r0, _08009F54 - strh r1, [r0] - adds r0, r2, r4 - lsls r0, 3 - adds r0, r5 - ldr r1, _08009F58 - str r1, [r0] - b _08009FA4 - .align 2, 0 -_08009F50: .4byte 0x0202eac8 -_08009F54: .4byte 0x0202eec8 -_08009F58: .4byte Task_Birch1 -_08009F5C: - ldr r0, _08009F6C - movs r1, 0 - strh r1, [r0] - ldr r0, _08009F70 - strh r1, [r0] - ldr r0, _08009F74 - b _08009F80 - .align 2, 0 -_08009F6C: .4byte 0x0202eac8 -_08009F70: .4byte 0x0202eec8 -_08009F74: .4byte CB2_ContinueSavedGame -_08009F78: - ldr r0, _08009F8C - ldr r1, _08009F90 - str r1, [r0, 0x8] - ldr r0, _08009F94 -_08009F80: - bl SetMainCallback2 - adds r0, r4, 0 - bl DestroyTask - b _08009FA4 - .align 2, 0 -_08009F8C: .4byte 0x03001770 -_08009F90: .4byte sub_80096FC -_08009F94: .4byte CB2_InitOptionMenu -_08009F98: - ldr r0, _08009FAC - bl SetMainCallback2 - adds r0, r4, 0 - bl DestroyTask -_08009FA4: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08009FAC: .4byte CB2_InitMysteryEventMenu - thumb_func_end MainMenuPressedA - - thumb_func_start MainMenuPressedB -MainMenuPressedB: @ 8009FB0 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - ldr r0, _08009FD4 - ldrb r1, [r0, 0x7] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - bne _08009FCE - ldr r0, _08009FD8 - bl SetMainCallback2 - adds r0, r4, 0 - bl DestroyTask -_08009FCE: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08009FD4: .4byte 0x0202f388 -_08009FD8: .4byte CB2_InitTitleScreen - thumb_func_end MainMenuPressedB - - thumb_func_start HighlightCurrentMenuItem -HighlightCurrentMenuItem: @ 8009FDC - push {r4,lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 24 - lsrs r2, r1, 24 - ldr r1, _0800A008 - ldr r4, _0800A00C - adds r0, r4, 0 - strh r0, [r1] - cmp r3, 0x1 - beq _0800A028 - cmp r3, 0x1 - ble _08009FFA - cmp r3, 0x2 - beq _0800A064 -_08009FFA: - cmp r2, 0 - beq _0800A002 - cmp r2, 0x1 - beq _0800A018 -_0800A002: - ldr r1, _0800A010 - ldr r2, _0800A014 - b _0800A0A8 - .align 2, 0 -_0800A008: .4byte REG_WIN0H -_0800A00C: .4byte 0x000009e7 -_0800A010: .4byte REG_WIN0V -_0800A014: .4byte 0x0000011f -_0800A018: - ldr r1, _0800A020 - ldr r4, _0800A024 - adds r0, r4, 0 - b _0800A0AA - .align 2, 0 -_0800A020: .4byte REG_WIN0V -_0800A024: .4byte 0x0000213f -_0800A028: - cmp r2, 0x1 - beq _0800A044 - cmp r2, 0x1 - ble _0800A034 - cmp r2, 0x2 - beq _0800A054 -_0800A034: - ldr r1, _0800A03C - ldr r2, _0800A040 - b _0800A0A8 - .align 2, 0 -_0800A03C: .4byte REG_WIN0V -_0800A040: .4byte 0x0000013f -_0800A044: - ldr r1, _0800A04C - ldr r4, _0800A050 - adds r0, r4, 0 - b _0800A0AA - .align 2, 0 -_0800A04C: .4byte REG_WIN0V -_0800A050: .4byte 0x0000415f -_0800A054: - ldr r1, _0800A05C - ldr r2, _0800A060 - b _0800A0A8 - .align 2, 0 -_0800A05C: .4byte REG_WIN0V -_0800A060: .4byte 0x0000617f -_0800A064: - cmp r2, 0x1 - beq _0800A084 - cmp r2, 0x1 - ble _0800A074 - cmp r2, 0x2 - beq _0800A094 - cmp r2, 0x3 - beq _0800A0A4 -_0800A074: - ldr r1, _0800A07C - ldr r4, _0800A080 - adds r0, r4, 0 - b _0800A0AA - .align 2, 0 -_0800A07C: .4byte REG_WIN0V -_0800A080: .4byte 0x0000013f -_0800A084: - ldr r1, _0800A08C - ldr r2, _0800A090 - b _0800A0A8 - .align 2, 0 -_0800A08C: .4byte REG_WIN0V -_0800A090: .4byte 0x0000415f -_0800A094: - ldr r1, _0800A09C - ldr r4, _0800A0A0 - adds r0, r4, 0 - b _0800A0AA - .align 2, 0 -_0800A09C: .4byte REG_WIN0V -_0800A0A0: .4byte 0x0000617f -_0800A0A4: - ldr r1, _0800A0B4 - ldr r2, _0800A0B8 -_0800A0A8: - adds r0, r2, 0 -_0800A0AA: - strh r0, [r1] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0800A0B4: .4byte REG_WIN0V -_0800A0B8: .4byte 0x0000819f - thumb_func_end HighlightCurrentMenuItem - - thumb_func_start PrintMainMenuItem -PrintMainMenuItem: @ 800A0BC - push {r4-r6,lr} - sub sp, 0x20 - adds r4, r0, 0 - lsls r1, 24 - lsrs r5, r1, 24 - lsls r2, 24 - lsrs r2, 24 - mov r1, sp - movs r0, 0xFC - strb r0, [r1] - movs r0, 0x1 - strb r0, [r1, 0x1] - movs r0, 0xE - strb r0, [r1, 0x2] - movs r3, 0 -_0800A0DA: - adds r0, r3, 0x3 - mov r6, sp - adds r1, r6, r0 - adds r0, r4, r3 - ldrb r0, [r0] - strb r0, [r1] - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 - cmp r3, 0x19 - bls _0800A0DA - mov r1, sp - movs r0, 0xFF - strb r0, [r1, 0x1D] - mov r0, sp - adds r1, r5, 0 - bl Print - add sp, 0x20 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end PrintMainMenuItem - - thumb_func_start PrintSaveFileInfo -PrintSaveFileInfo: @ 800A108 - push {lr} - bl PrintPlayerName - bl PrintPokedexCount - bl PrintPlayTime - bl PrintBadgeCount - pop {r0} - bx r0 - thumb_func_end PrintSaveFileInfo - - thumb_func_start PrintPlayerName -PrintPlayerName: @ 800A120 - push {lr} - ldr r0, _0800A13C - movs r1, 0x2 - movs r2, 0x3 - bl Print - ldr r0, _0800A140 - movs r1, 0x9 - movs r2, 0x3 - bl Print - pop {r0} - bx r0 - .align 2, 0 -_0800A13C: .4byte gUnknown_0840DF7C -_0800A140: .4byte gSaveBlock2 - thumb_func_end PrintPlayerName - - thumb_func_start PrintPlayTime -PrintPlayTime: @ 800A144 - push {r4,lr} - sub sp, 0x30 - ldr r0, _0800A180 - movs r1, 0x10 - movs r2, 0x3 - bl Print - ldr r0, _0800A184 - ldrh r1, [r0, 0xE] - ldrb r2, [r0, 0x10] - mov r0, sp - movs r3, 0x1 - bl FormatPlayTime - add r4, sp, 0x10 - adds r0, r4, 0 - mov r1, sp - movs r2, 0x30 - movs r3, 0x1 - bl sub_8072C74 - adds r0, r4, 0 - movs r1, 0x16 - movs r2, 0x3 - bl Print - add sp, 0x30 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0800A180: .4byte gUnknown_0840DF8B -_0800A184: .4byte gSaveBlock2 - thumb_func_end PrintPlayTime - - thumb_func_start PrintPokedexCount -PrintPokedexCount: @ 800A188 - push {lr} - sub sp, 0x10 - ldr r0, _0800A1BC - movs r1, 0x2 - movs r2, 0x5 - bl Print - bl GetPokedexSeenCount - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r0, sp - movs r2, 0x12 - movs r3, 0 - bl sub_8072C14 - mov r0, sp - movs r1, 0x9 - movs r2, 0x5 - bl Print - add sp, 0x10 - pop {r0} - bx r0 - .align 2, 0 -_0800A1BC: .4byte gUnknown_0840DF83 - thumb_func_end PrintPokedexCount - - thumb_func_start PrintBadgeCount -PrintBadgeCount: @ 800A1C0 - push {lr} - sub sp, 0x10 - ldr r0, _0800A1F0 - movs r1, 0x10 - movs r2, 0x5 - bl Print - bl GetBadgeCount - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - mov r0, sp - bl ConvertIntToDecimalString - mov r0, sp - movs r1, 0xCD - movs r2, 0x28 - movs r3, 0x1 - bl sub_80729D8 - add sp, 0x10 - pop {r0} - bx r0 - .align 2, 0 -_0800A1F0: .4byte gUnknown_0840DF90 - thumb_func_end PrintBadgeCount - thumb_func_start Task_Birch1 Task_Birch1: @ 800A1F4 push {r4,r5,lr} diff --git a/asm/rom5.s b/asm/rom5.s index f7fcad083..573d4e7ca 100644 --- a/asm/rom5.s +++ b/asm/rom5.s @@ -411385,7 +411385,7 @@ _081433CC: .4byte gUnknown_0840E559 _081433D0: .4byte gSaveBlock2 _081433D4: .4byte gUnknown_0840E560 _081433D8: .4byte 0x020231cc -_081433DC: .4byte gUnknown_0840DF8B +_081433DC: .4byte gMainMenuString_Time thumb_func_end sub_8143300 thumb_func_start sub_81433E0 diff --git a/data/data2.s b/data/data2.s index 191542eed..3da8512eb 100644 --- a/data/data2.s +++ b/data/data2.s @@ -27,7 +27,7 @@ gUnknown_081E796C:: @ 81E796C .space 16 .align 2 -gUnknown_081E797C:: @ 81E797C +gMainMenuPalette:: @ 81E797C .incbin "graphics/misc/main_menu.gbapal" .align 2 @@ -28868,60 +28868,52 @@ gUnknown_0840DCC8:: @ 840DCC8 SystemText_Pokemon2: .string "POKéMON$" -gUnknown_0840DCD0:: @ 840DCD0 -SystemText_NewGame: +gMainMenuString_NewGame:: @ 840DCD0 .string "NEW GAME$" -gUnknown_0840DCD9:: @ 840DCD9 -SystemText_Continue: +gMainMenuString_Continue:: @ 840DCD9 .string "CONTINUE$" -gUnknown_0840DCE2:: @ 840DCE2 -SystemText_Option2: +gMainMenuString_Option:: @ 840DCE2 .string "OPTION$" -gUnknown_0840DCE9:: @ 840DCE9 -SystemText_MysteryEvents: +gMainMenuString_MysteryEvents:: @ 840DCE9 .string "MYSTERY EVENTS$" + SystemText_UpdatingSaveExternal: .string "Updating save file using external\ndata. Please wait.$" + SystemText_SaveUpdated: .string "The save file has been updated.$" + SystemText_SaveUpdatedExchangeBackup: .string "The save file has been updated.\pFurther game data cannot be saved\nto the backup memory.\pPlease exchange the backup memory.\pFor details, please contact the\nNintendo Service Center.$" + SystemText_SaveNotUpdated: .string "The save file could not be updated.\pPlease exchange the backup\nmemory.\pFor details, please contact the\nNintendo Service Center.$" -gUnknown_0840DE81:: @ 840DE81 -SystemText_SaveCorrupt: +gSaveFileCorruptMessage:: @ 840DE81 .string "The save file is corrupt. The\nprevious save file will be loaded.$" -gUnknown_0840DEC2:: @ 840DEC2 -SystemText_SaveDeleted: +gSaveFileDeletedMessage:: @ 840DEC2 .string " The save file has been deleted...$" -gUnknown_0840DEE5:: @ 840DEE5 -SystemText_1MSubCircuitNotInstalled: +gBoardNotInstalledMessage:: @ 840DEE5 .string "The 1M sub-circuit board is\nnot installed.$" -gUnknown_0840DF10:: @ 840DF10 -SystemText_InternalBatteryIsDry: +gBatteryDryMessage:: @ 840DF10 .string "The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur.$" -gUnknown_0840DF7C:: @ 840DF7C -SystemText_Player2:: +gMainMenuString_Player:: @ 840DF7C .string "PLAYER$" -gUnknown_0840DF83:: @ 840DF83 -SystemText_Pokedex2:: +gMainMenuString_Pokedex:: @ 840DF83 .string "POKéDEX$" -gUnknown_0840DF8B:: @ 840DF8B -SystemText_Time:: +gMainMenuString_Time:: @ 840DF8B .string "TIME$" -gUnknown_0840DF90:: @ 840DF90 -SystemText_Badges:: +gMainMenuString_Badges:: @ 840DF90 .string "BADGES$" gBirchText_Boy:: diff --git a/iwram_syms.txt b/iwram_syms.txt index 954308adb..a151b6eee 100644 --- a/iwram_syms.txt +++ b/iwram_syms.txt @@ -16,4 +16,6 @@ word_3004858 = 0x3004858; gTasks = 0x3004B20; +gSaveFileStatus = 0x3005EB8; + gMPlayMemAccArea = 0x3007440; diff --git a/ld_script.txt b/ld_script.txt index fbd9bafbb..2c7565e80 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -69,6 +69,7 @@ SECTIONS { src/string_util.o(.text); src/link.o(.text); src/rtc.o(.text); + src/main_menu.o(.text); asm/rom3.o(.text); src/rng.o(.text); asm/rom_8040EB4.o(.text); diff --git a/src/main_menu.c b/src/main_menu.c new file mode 100644 index 000000000..d6f62bac8 --- /dev/null +++ b/src/main_menu.c @@ -0,0 +1,605 @@ +#include "global.h" +#include "text.h" +#include "sprite.h" +#include "task.h" +#include "main.h" +#include "rtc.h" +#include "songs.h" +#include "palette.h" + +extern u8 sub_8072080(void); +extern void Print(u8 *, u8, u8); +extern void CB2_ContinueSavedGame(void); +extern void CB2_InitMysteryEventMenu(void); +extern void CB2_InitOptionMenu(void); +extern void CB2_InitTitleScreen(void); +extern void FormatPlayTime(u8 *str, u16 hours, u16 minutes, bool16 colon); +extern u8 *sub_8072C74(u8 *, u8 *, u8, u8); +extern u16 GetPokedexSeenCount(void); +extern u8 *sub_8072C14(u8 *, s32, u8, u8); +extern u8 sub_80729D8(u8 *, u8, u16, u8); +extern u8 GetBadgeCount(void); +extern void Task_Birch1(u8); + +extern struct PaletteFadeControl gPaletteFade; +extern u8 gSaveFileDeletedMessage[]; +extern u8 gSaveFileCorruptMessage[]; +extern u8 gBoardNotInstalledMessage[]; +extern u8 gBatteryDryMessage[]; +extern u16 gSaveFileStatus; +extern u8 gMainMenuString_Continue[]; +extern u8 gMainMenuString_NewGame[]; +extern u8 gMainMenuString_MysteryEvents[]; +extern u8 gMainMenuString_Option[]; +extern u8 gMainMenuString_Player[]; +extern u8 gMainMenuString_Time[]; +extern u8 gMainMenuString_Pokedex[]; +extern u8 gMainMenuString_Badges[]; + +void CB2_MainMenu(void); +void VBlankCB_MainMenu(void); +void CB2_InitMainMenu(void); +static void sub_80096FC(void); +static u32 InitMainMenu(bool8 a1); +static void Task_CheckSave(u8 taskId); +static void Task_WaitForSaveErrorAck(u8 taskId); +static void Task_CheckRtc(u8 taskId); +static void Task_WaitForRtcErrorAck(u8 taskId); +static void Task_DrawMainMenu(u8 taskId); +static void Task_HighlightCurrentMenuItem(u8 taskId); +static bool8 MainMenuProcessKeyInput(u8 taskId); +static void Task_MainMenuProcessKeyInput(u8 taskId); +static void MainMenuPressedA(u8 taskId); +static void MainMenuPressedB(u8 taskId); +static void HighlightCurrentMenuItem(u8, u8); +static void PrintMainMenuItem(u8 *text, u8, u8); +static void PrintSaveFileInfo(void); +static void PrintPlayerName(void); +static void PrintPlayTime(void); +static void PrintPokedexCount(void); +static void PrintBadgeCount(void); + +extern u16 gMainMenuPalette[]; + +void CB2_MainMenu(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void VBlankCB_MainMenu(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_InitMainMenu(void) +{ + InitMainMenu(FALSE); +} + +static void sub_80096FC(void) +{ + InitMainMenu(TRUE); +} + +u32 InitMainMenu(u8 a1) +{ + u16 savedIme; + u8 taskId; + + SetVBlankCallback(NULL); + + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + + ResetPaletteFade(); + LoadPalette(gMainMenuPalette, 0, 32); + remove_some_task(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + sub_8071C4C(&gWindowConfig_81E6CE4); + + if (a1) + BeginNormalPaletteFade(-1, 0, 0x10u, 0, 0); + else + BeginNormalPaletteFade(-1, 0, 0x10u, 0, -1); + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0; + REG_WINOUT = 0; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + REG_BLDY = 0; + + savedIme = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = savedIme; + + SetVBlankCallback(VBlankCB_MainMenu); + SetMainCallback2(CB2_MainMenu); + + REG_DISPCNT = DISPCNT_OBJ_1D_MAP + | DISPCNT_BG0_ON + | DISPCNT_OBJ_ON + | DISPCNT_WIN0_ON; + + taskId = CreateTask(Task_CheckSave, 0); + gTasks[taskId].data[1] = 0; + + return 0; +} + +void Task_CheckSave(u8 taskId) +{ + if (gPaletteFade.active) + return; + + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 0x1111; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + switch (gSaveFileStatus) + { + case 1: + if (sub_806918C() == TRUE) + gTasks[taskId].data[0] = 2; + else + gTasks[taskId].data[0] = 1; + + gTasks[taskId].func = Task_CheckRtc; + break; + case 2: + DrawDefaultWindow(2, 14, 27, 19); + AddTextPrinterWithCallbackForMessage(gSaveFileDeletedMessage, 3, 15); + REG_WIN0H = 4575; + REG_WIN0V = 29087; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_WaitForSaveErrorAck; + break; + case 255: + DrawDefaultWindow(2, 14, 27, 19); + AddTextPrinterWithCallbackForMessage(gSaveFileCorruptMessage, 3, 15); + REG_WIN0H = 4575; + REG_WIN0V = 29087; + gTasks[taskId].data[0] = 1; + gTasks[taskId].func = Task_WaitForSaveErrorAck; + + if (sub_806918C() == TRUE) + gTasks[taskId].data[0] = 2; + else + gTasks[taskId].data[0] = 1; + break; + case 0: + default: + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_CheckRtc; + break; + case 4: + DrawDefaultWindow(2, 14, 27, 19); + AddTextPrinterWithCallbackForMessage(gBoardNotInstalledMessage, 3, 15); + REG_WIN0H = 4575; + REG_WIN0V = 29087; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_WaitForSaveErrorAck; + return; + } +} + +void Task_WaitForSaveErrorAck(u8 taskId) +{ + if (sub_8072080()) + { + if (gMain.newKeys & A_BUTTON) + { + Reset(2, 14, 27, 19); + gTasks[taskId].func = Task_CheckRtc; + } + } +} + +void Task_CheckRtc(u8 taskId) +{ + if (!gPaletteFade.active) + { + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 4369; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK)) + { + gTasks[taskId].func = Task_DrawMainMenu; + } + else + { + DrawDefaultWindow(2, 14, 27, 19); + AddTextPrinterWithCallbackForMessage(gBatteryDryMessage, 3, 15); + REG_WIN0H = 4575; + REG_WIN0V = 29087; + gTasks[taskId].func = Task_WaitForRtcErrorAck; + } + } +} + +void Task_WaitForRtcErrorAck(u8 taskId) +{ + if (sub_8072080()) + { + if ( gMain.newKeys & 1 ) + { + Reset(2, 14, 27, 19); + gTasks[taskId].func = Task_DrawMainMenu; + } + } +} + +void Task_DrawMainMenu(u8 taskId) +{ + u16 palette; + + if (!gPaletteFade.active) + { + REG_WIN0H = 0; + REG_WIN0V = 0; + REG_WININ = 4369; + REG_WINOUT = 49; + REG_BLDCNT = 241; + REG_BLDALPHA = 0; + REG_BLDY = 7; + + palette = RGB(0, 0, 0); + LoadPalette(&palette, 254, 2); + + if (gSaveBlock2.playerGender == MALE) + { + palette = RGB(4, 16, 31); + LoadPalette(&palette, 241, 2); + } + else + { + palette = RGB(31, 3, 21); + LoadPalette(&palette, 241, 2); + } + + switch (gTasks[taskId].data[0]) + { + case 0: + default: + DrawDefaultWindow(1, 0, 28, 3); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 1); + DrawDefaultWindow(1, 4, 28, 7); + PrintMainMenuItem(gMainMenuString_Option, 2, 5); + break; + case 1: + DrawDefaultWindow(1, 0, 28, 7); + PrintMainMenuItem(gMainMenuString_Continue, 2, 1); + DrawDefaultWindow(1, 8, 28, 11); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); + DrawDefaultWindow(1, 12, 28, 15); + PrintMainMenuItem(gMainMenuString_Option, 2, 13); + PrintSaveFileInfo(); + break; + case 2: + DrawDefaultWindow(1, 0, 28, 7); + PrintMainMenuItem(gMainMenuString_Continue, 2, 1); + DrawDefaultWindow(1, 8, 28, 11); + PrintMainMenuItem(gMainMenuString_NewGame, 2, 9); + DrawDefaultWindow(1, 12, 28, 15); + PrintMainMenuItem(gMainMenuString_MysteryEvents, 2, 13); + DrawDefaultWindow(1, 16, 28, 19); + PrintMainMenuItem(gMainMenuString_Option, 2, 0x11); + PrintSaveFileInfo(); + break; + } + + gTasks[taskId].func = Task_HighlightCurrentMenuItem; + } +} + +void Task_HighlightCurrentMenuItem(u8 taskId) +{ + HighlightCurrentMenuItem(gTasks[taskId].data[0], gTasks[taskId].data[1]); + gTasks[taskId].func = Task_MainMenuProcessKeyInput; +} + +bool8 MainMenuProcessKeyInput(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + audio_play(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gTasks[taskId].func = MainMenuPressedA; + } + else if (gMain.newKeys & B_BUTTON) + { + audio_play(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); + REG_WIN0H = 240; + REG_WIN0V = 160; + gTasks[taskId].func = MainMenuPressedB; + } + else + { + s32 menuItemCount; + + switch (gTasks[taskId].data[0]) + { + case 0: + default: + menuItemCount = 2; + break; + case 1: + menuItemCount = 3; + break; + case 2: + menuItemCount = 4; + break; + } + + if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].data[1] > 0) + { + gTasks[taskId].data[1]--; + return TRUE; + } + } + if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].data[1] < menuItemCount - 1) + { + gTasks[taskId].data[1]++; + return TRUE; + } + } + } + + return FALSE; +} + +void Task_MainMenuProcessKeyInput(u8 taskId) +{ + bool8 currentMenuItemChanged = MainMenuProcessKeyInput(taskId); + if (currentMenuItemChanged) + gTasks[taskId].func = Task_HighlightCurrentMenuItem; +} + +void MainMenuPressedA(u8 taskId) +{ + enum + { + NEW_GAME, + CONTINUE, + OPTION, + MYSTERY_EVENTS, + } action; + + if (gPaletteFade.active) + return; + + switch (gTasks[taskId].data[0]) + { + case 0: + default: + switch (gTasks[taskId].data[1]) + { + case 0: + default: + action = NEW_GAME; + break; + case 1: + action = OPTION; + break; + } + break; + case 1: + switch (gTasks[taskId].data[1]) + { + case 0: + default: + action = CONTINUE; + break; + case 1: + action = NEW_GAME; + break; + case 2: + action = OPTION; + break; + } + break; + case 2: + switch (gTasks[taskId].data[1]) + { + case 0: + default: + action = CONTINUE; + break; + case 1: + action = NEW_GAME; + break; + case 2: + action = MYSTERY_EVENTS; + break; + case 3: + action = OPTION; + break; + } + break; + } + + switch ((int)action) + { + case 0: + default: + gPlttBufferUnfaded[0] = 0; + gPlttBufferFaded[0] = 0; + gTasks[taskId].func = Task_Birch1; + break; + case 1: + gPlttBufferUnfaded[0] = 0; + gPlttBufferFaded[0] = 0; + SetMainCallback2(CB2_ContinueSavedGame); + DestroyTask(taskId); + break; + case 2: + gMain.field_8 = (u32)sub_80096FC; + SetMainCallback2(CB2_InitOptionMenu); + DestroyTask(taskId); + break; + case 3: + SetMainCallback2(CB2_InitMysteryEventMenu); + DestroyTask(taskId); + break; + } +} + +void MainMenuPressedB(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_InitTitleScreen); + DestroyTask(taskId); + } +} + +void HighlightCurrentMenuItem(u8 layout, u8 menuItem) +{ + REG_WIN0H = 2535; + + switch (layout) + { + case 0: + default: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = 287; + break; + case 1: + REG_WIN0V = 8511; + break; + } + break; + case 1: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = 319; + break; + case 1: + REG_WIN0V = 16735; + break; + case 2: + REG_WIN0V = 24959; + break; + } + break; + case 2: + switch (menuItem) + { + case 0: + default: + REG_WIN0V = 319; + break; + case 1: + REG_WIN0V = 16735; + break; + case 2: + REG_WIN0V = 24959; + break; + case 3: + REG_WIN0V = 33183; + break; + } + break; + } +} + +void PrintMainMenuItem(u8 *text, u8 left, u8 top) +{ + u8 i; + u8 buffer[32]; + + buffer[0] = 0xFC; + buffer[1] = 1; + buffer[2] = 14; + + for (i = 0; i < 26; i++) + buffer[3 + i] = text[i]; + + buffer[29] = EOS; + + Print(buffer, left, top); +} + +void PrintSaveFileInfo(void) +{ + PrintPlayerName(); + PrintPokedexCount(); + PrintPlayTime(); + PrintBadgeCount(); +} + +void PrintPlayerName(void) +{ + Print(gMainMenuString_Player, 2, 3); + Print(gSaveBlock2.playerName, 9, 3); +} + +void PrintPlayTime(void) +{ + u8 playTime[16]; + u8 alignedPlayTime[32]; + + Print(gMainMenuString_Time, 16, 3); + FormatPlayTime(playTime, gSaveBlock2.playTimeHours, gSaveBlock2.playTimeMinutes, 1); + sub_8072C74(alignedPlayTime, playTime, 48, 1); + Print(alignedPlayTime, 22, 3); +} + +void PrintPokedexCount(void) +{ + u8 buffer[16]; + + Print(gMainMenuString_Pokedex, 2, 5); + sub_8072C14(buffer, GetPokedexSeenCount(), 18, 0); + Print(buffer, 9, 5); +} + +void PrintBadgeCount(void) +{ + u8 buffer[16]; + + Print(gMainMenuString_Badges, 16, 5); + ConvertIntToDecimalString(buffer, GetBadgeCount()); + sub_80729D8(buffer, 205, 40, 1); +} |