diff options
Diffstat (limited to 'src/wonder_mail_main_menu.c')
-rw-r--r-- | src/wonder_mail_main_menu.c | 438 |
1 files changed, 418 insertions, 20 deletions
diff --git a/src/wonder_mail_main_menu.c b/src/wonder_mail_main_menu.c index d8207c4..288d352 100644 --- a/src/wonder_mail_main_menu.c +++ b/src/wonder_mail_main_menu.c @@ -1,44 +1,442 @@ #include "global.h" -#include "input.h" +#include "save.h" -extern u8 *gUnknown_203B3E8; +#define EXIT_TO_MAIN_MENU 5 +#define PASSWORD_SUCCESS 13 +#define PASSWORD_INVALID 19 +#define PASSWORD_ENTRY_SCREEN 18 + +struct unkWonderMailData +{ + u8 unk0[20]; +}; + +struct unkStruct_203B3E8 +{ + // size: 0x49C + u8 unk0; // state variable? + u8 PasswordEntryBuffer[0x36]; // Wonder Mail Buffer... + struct unkWonderMailData unk38; // 0x30 - 0x14 + u8 unk38_1[0x30 - 20]; // TODO: split for the ldm/stm stuff (fix dumb hack) + u8 fill68[0x1EC - 0x68]; + u32 unk1EC; + u8 fill1F0[0x24C - 0x1F0]; + u32 unk24C; + u32 unk250; + u8 fill254[0x3C0 - 0x254]; + struct unkWonderMailData unk3C0; // 0x3C0 + 0x14 + u8 fill3D0[0x490 - 0x3D4]; + u32 unk490; + u32 unk494; + u8 unk498; + u8 unk499; + u8 unk49A; + u8 unk49B; +}; + +extern u32 sub_8095324(u32); +extern u32 sub_80144A4(s32 *); +extern u32 sub_8011C1C(void); +extern struct unkStruct_203B3E8 *gUnknown_203B3E8; +extern void* MemoryAlloc(u32, u32); +extern void MemoryFree(void *); +extern void MemoryFill8(u8 *dest, u8 value, s32 size); +extern void sub_803A1C0(u8); +extern void ResetUnusedInputStruct(void); extern void sub_800641C(void *, u32, u32); -extern void nullsub_54(); -extern void sub_8039E18(); +extern void sub_8030DE4(void); +extern void sub_801B450(void); +extern void sub_803084C(void); +extern void sub_801CBB8(void); +extern void sub_80155F0(void); +extern void sub_8031E10(void); + +extern u32 sub_802D0E0(); +extern u8 sub_802D178(); +extern void sub_802D184(); + +extern s32 sub_80154F0(); +extern bool8 sub_803D358(u8 *, void *); +extern bool8 sub_80959C0(void *); +extern void sub_80141B4(u32 *r0, u32, u32 *r1, u32); + +void sub_8039BAC(u32); +void sub_8039A18(void); +void sub_8039AA8(void); +void sub_8039B14(void); +void sub_8039B20(void); +void sub_8039B58(void); +void sub_8039D88(void); +void sub_8039D28(void); +void sub_8039D68(void); +void sub_8039DA4(void); +void sub_8039DCC(void); +void sub_8039B3C(void); +void sub_8039D0C(void); +void sub_8039C60(void); +void sub_8039DE8(void); + + +extern u32 gUnknown_80E7914; +extern u32 gUnknown_80E7938; +extern u32 gUnknown_80E7994; +extern u32 gUnknown_80E79E4; +extern u32 gUnknown_80E7A48; + +bool8 sub_8039880(void) +{ + return (sub_8095324(1) != 0 || sub_8095324(7) != 0 || sub_8011C1C() == 2); +} + +bool8 CreateWonderMailMenu(void) +{ + int iVar2; + + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + + gUnknown_203B3E8 = MemoryAlloc(sizeof(struct unkStruct_203B3E8), 8); + MemoryFill8((u8 *)gUnknown_203B3E8, 0, sizeof(struct unkStruct_203B3E8)); + + for(iVar2 = 0; iVar2 < 0x36; iVar2++){ + gUnknown_203B3E8->PasswordEntryBuffer[iVar2] = 0; + } + + gUnknown_203B3E8->unk490 = 3; + gUnknown_203B3E8->unk494 = 2; + gUnknown_203B3E8->unk498 = 1; + gUnknown_203B3E8->unk490 = 5; // ??? Why? + sub_803A1C0(0x11); // 0x11 -> Display "Enter Wonder Mail Password" + return 1; +} + +u8 UpdateWonderMailMenu(void) +{ + switch(gUnknown_203B3E8->unk0) { + case 4: + sub_8039A18(); + break; + case EXIT_TO_MAIN_MENU: // When you exit out of the menu + return 3; + case 8: + sub_8039AA8(); + break; + case 11: + break; + case 12: + sub_8039B14(); + break; + case 6: + sub_8039B20(); + break; + case 9: + sub_8039B58(); + break; + case 7: + sub_8039D88(); + break; + case PASSWORD_SUCCESS: + sub_8039D28(); + break; + case 14: + sub_8039D68(); + break; + case 15: // Saving adventure + sub_8039DA4(); + break; + case 16: // Display "Recieved Wonder Mail was added" and go back to main menu + sub_8039DCC(); + break; + case 10: + sub_8039B3C(); + break; + case 17: // "Please enter the Wonder Mail Password" Screen + sub_8039D0C(); + break; + case PASSWORD_ENTRY_SCREEN: // Password Entry + sub_8039C60(); + break; + case PASSWORD_INVALID: + sub_8039DE8(); + } + return 0; +} + +void CleanWonderMailMenu(void) +{ + if (gUnknown_203B3E8 != NULL) { + MemoryFree(gUnknown_203B3E8); + gUnknown_203B3E8 = NULL; + sub_8030DE4(); // Frees 203B324 + sub_801B450(); // Frees 203B230 + sub_803084C(); // Frees 203B320 + sub_801CBB8(); // Frees 203B244 + sub_80155F0(); // Frees 203B1FC + sub_8031E10(); // Frees 203B334 + } +} + +void sub_8039A18(void) +{ + s32 local_8; + + if (sub_80144A4(&local_8) == 0) { + gUnknown_203B3E8->unk24C = 10; + switch(local_8) { + case 3: + case 4: + gUnknown_203B3E8->unk490 = 3; + sub_803A1C0(8); + break; + case 5: + gUnknown_203B3E8->unk490 = 5; + sub_803A1C0(17); + break; + case 0: + case 8: + sub_803A1C0(EXIT_TO_MAIN_MENU); + break; + } + } +} + +void sub_8039AA8(void) +{ + s32 local_8; + + if (sub_80144A4(&local_8) == 0) { + switch(local_8){ + case 6: + if (gUnknown_203B3E8->unk494 == 1) { + sub_803A1C0(2); + } + else { + sub_803A1C0(12); + } + break; + case 0: + if (gUnknown_203B3E8->unk494 == 1) { + sub_803A1C0(1); + } + else { + sub_803A1C0(4); + } + break; + } + } +} + +void sub_8039B14(void) +{ + sub_803A1C0(6); +} + +void sub_8039B20(void) +{ + s32 local_8; + + if (sub_80144A4(&local_8) == 0) { + sub_803A1C0(9); + } +} + +void sub_8039B3C(void) +{ + s32 local_8; + + if (sub_80144A4(&local_8) == 0) { + sub_803A1C0(4); + } +} + +void sub_8039B58(void) +{ + s32 temp; + + if (sub_80144A4(&temp) == 0) { + if (gUnknown_203B3E8->unk250 == 0) { + switch(gUnknown_203B3E8->unk24C){ + case 9: + sub_803A1C0(7); + break; + case 10: + sub_803A1C0(PASSWORD_SUCCESS); + break; + } + } + else { + sub_8039BAC(gUnknown_203B3E8->unk250); + sub_803A1C0(10); + } + } +} + +void sub_8039BAC(u32 arg) +{ + switch(arg) + { + case 0: + break; + case 1: + // "Communication Error" + sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101); + break; + case 3: + // Incorrect number of GBA Systems + sub_80141B4(&gUnknown_80E7938, 0, 0, 0x101); + break; + case 2: + // No response from friend. Redo from start + sub_80141B4(&gUnknown_80E7994, 0, 0, 0x101); + break; + case 4: + // Sender and receiver in different modes + sub_80141B4(&gUnknown_80E79E4, 0, 0, 0x101); + break; + case 5: + // "Communication Error" + sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101); + break; + case 14: + // "Communication Error" + sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101); + break; + case 15: // "No response from your friend. Make sure sender and receiver are ready" + sub_80141B4(&gUnknown_80E7A48, 0, 0, 0x101); + break; + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case PASSWORD_SUCCESS: + default: + // "Communication Error" + sub_80141B4(&gUnknown_80E7914, 0, 0, 0x101); + break; + + } +} + +void sub_8039C60(void) +{ + int iVar2; + + iVar2 = sub_80154F0(); + MemoryFill8((u8 *)&gUnknown_203B3E8->unk38, 0, 0x30); + switch(iVar2){ + case 3: + sub_80155F0(); + ResetUnusedInputStruct(); + sub_800641C(&gUnknown_203B3E8->unk1EC,1,1); + if ( !sub_803D358(gUnknown_203B3E8->PasswordEntryBuffer, &gUnknown_203B3E8->unk38) || !sub_80959C0(&gUnknown_203B3E8->unk38) ) + { + // Invalid password + sub_803A1C0(PASSWORD_INVALID); + } + else { + // Successful password + // Copy the decoded data to another buffer? + gUnknown_203B3E8->unk3C0 = gUnknown_203B3E8->unk38; + + gUnknown_203B3E8->unk498 = 1; + sub_803A1C0(PASSWORD_SUCCESS); + } + break; + case 2: + sub_80155F0(); + ResetUnusedInputStruct(); + sub_800641C(&gUnknown_203B3E8->unk1EC,1,1); + sub_803A1C0(EXIT_TO_MAIN_MENU); + break; + } +} + +void sub_8039D0C(void) +{ + int iVar2; + if(sub_80144A4(&iVar2) == 0) + { + sub_803A1C0(PASSWORD_ENTRY_SCREEN); + } +} -void sub_803A1C0(u8 r0) +void sub_8039D28(void) { - *gUnknown_203B3E8 = r0; - nullsub_54(); - sub_8039E18(); + if (sub_802D0E0() == 3) { + gUnknown_203B3E8->unk498 = sub_802D178(); + sub_802D184(); + if (gUnknown_203B3E8->unk498 != 0) { + sub_803A1C0(0xe); + } + else { + sub_803A1C0(0x10); + } + } } -u32 sub_803A1D8(void) +void sub_8039D68(void) { - return 1; + int iVar2; + if(sub_80144A4(&iVar2) == 0) + { + sub_803A1C0(0xF); + sub_8012574(0); // "Saving Adventure.." + } } -u32 sub_803A1DC(void) +void sub_8039D88(void) { - return 0; + int iVar2; + if(sub_80144A4(&iVar2) == 0) + { + sub_803A1C0(8); + } } -void nullsub_55() +void sub_8039DA4(void) { + int iVar2; + if(sub_80144A4(&iVar2) == 0) + { + if(!sub_8012600()) + { + sub_8012750(); + sub_803A1C0(0x10); + } + } } -u32 sub_803A1E4(void) +void sub_8039DCC(void) { - return 1; + int iVar2; + if(sub_80144A4(&iVar2) == 0) + { + sub_803A1C0(EXIT_TO_MAIN_MENU); + } } -u32 sub_803A1E8(void) +void sub_8039DE8(void) { - return 2; + int iVar2; + + // Prompt to re-enter password + if(sub_80144A4(&iVar2) == 0) + { + switch(iVar2) + { + case 6: // Yes + sub_803A1C0(0x11); + break; + case 0: // No + sub_803A1C0(EXIT_TO_MAIN_MENU); + break; + } + } } -void sub_803A1EC(void) +void nullsub_54(void) { - ResetUnusedInputStruct(); - sub_800641C(NULL, 1, 1); } |