diff --git a/asm/wonder_mail_5.s b/asm/wonder_mail_5.s deleted file mode 100644 index d2dbeb07d..000000000 --- a/asm/wonder_mail_5.s +++ /dev/null @@ -1,142 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8030E48 -sub_8030E48: - push {r4-r6,lr} - mov r6, r8 - push {r6} - sub sp, 0x15C - ldr r3, _08030EA8 - ldr r4, _08030EAC - ldr r2, [r4] - ldrb r1, [r2, 0xC] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 4 - ldr r1, [r3] - adds r5, r1, r0 - ldr r0, [r2, 0x10] - bl sub_80073B8 - ldr r0, [r4] - ldr r0, [r0, 0x10] - str r0, [sp, 0x4] - add r1, sp, 0x44 - movs r2, 0 - movs r0, 0x7 - strb r0, [r1] - mov r0, sp - adds r0, 0x46 - strb r2, [r0] - add r0, sp, 0x48 - strb r2, [r0] - adds r0, r5, 0x4 - str r0, [sp, 0xC] - adds r0, 0x10 - str r0, [sp, 0x10] - add r1, sp, 0x4 - ldrh r0, [r5, 0xC] - strh r0, [r1, 0x10] - ldrh r0, [r5, 0xC] - strh r0, [r1, 0x12] - adds r0, r1, 0 - strb r2, [r0, 0x14] - adds r2, r5, 0 - adds r2, 0x22 - ldrb r0, [r2] - cmp r0, 0 - bne _08030EB0 - adds r1, 0x2E - movs r0, 0x5 - strb r0, [r1] - b _08030EBE - .align 2, 0 -_08030EA8: .4byte gUnknown_203B480 -_08030EAC: .4byte gUnknown_203B324 -_08030EB0: - mov r1, sp - adds r1, 0x32 - movs r0, 0x2 - strb r0, [r1] - ldrb r1, [r2] - add r0, sp, 0x38 - strb r1, [r0] -_08030EBE: - ldrb r0, [r5] - cmp r0, 0x2 - beq _08030ED2 - cmp r0, 0x2 - ble _08030EE2 - cmp r0, 0x4 - beq _08030ED2 - cmp r0, 0x5 - beq _08030EDA - b _08030EE2 -_08030ED2: - mov r1, sp - adds r1, 0x45 - movs r0, 0xA - b _08030EE8 -_08030EDA: - mov r1, sp - adds r1, 0x45 - movs r0, 0xB - b _08030EE8 -_08030EE2: - mov r1, sp - adds r1, 0x45 - movs r0, 0x9 -_08030EE8: - strb r0, [r1] - add r0, sp, 0x4 - bl CreateRescueDescription - ldrh r0, [r5, 0x10] - ldr r1, _08030F48 - bl __umodsi3 - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - ldr r2, _08030F4C - ldr r5, _08030F50 - ldr r0, [r5] - ldr r3, [r0, 0x10] - movs r0, 0 - mov r8, r0 - str r0, [sp] - movs r0, 0xA - movs r1, 0x68 - bl xxx_call_draw_string - add r6, sp, 0x5C - ldr r1, _08030F54 - adds r0, r6, 0 - adds r2, r4, 0 - bl sprintfStatic - ldr r0, [r5] - ldr r3, [r0, 0x10] - mov r0, r8 - str r0, [sp] - movs r0, 0x44 - movs r1, 0x68 - adds r2, r6, 0 - bl xxx_call_draw_string - ldr r0, [r5] - ldr r0, [r0, 0x10] - bl sub_80073E0 - add sp, 0x15C - pop {r3} - mov r8, r3 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08030F48: .4byte 0x00002710 -_08030F4C: .4byte gUnknown_80E0934 -_08030F50: .4byte gUnknown_203B324 -_08030F54: .4byte gUnknown_80E0938 - thumb_func_end sub_8030E48 - - .align 2,0 diff --git a/include/code_8094F88.h b/include/code_8094F88.h index 287ad4c1b..0a0057ab5 100644 --- a/include/code_8094F88.h +++ b/include/code_8094F88.h @@ -11,7 +11,11 @@ struct unkStruct_203B480 /* 0x8 */ u32 unk8; /* 0xC */ s16 clientSpecies; /* 0xE */ s16 targetSpecies; - /* 0x10 */ u32 unk10; + union unk10_temp + { + u32 unk10; + u16 unk10_u16; + } unk10; /* 0x14 */ u8 playerName[0x20 - 0x14];; struct Item unk20; u32 unk24; diff --git a/ld_script.txt b/ld_script.txt index 3de3e10a0..2f523cff6 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -151,7 +151,6 @@ SECTIONS { src/makuhita_dojo_1.o(.text); src/wonder_mail_4.o(.text); src/wonder_mail_5.o(.text); - asm/wonder_mail_5.o(.text); src/wonder_mail_6.o(.text); src/post_office_guide.o(.text); asm/code_8031D70.o(.text); diff --git a/src/code_8095824.c b/src/code_8095824.c index 7ea1bd38b..5e45f4d93 100644 --- a/src/code_8095824.c +++ b/src/code_8095824.c @@ -102,7 +102,7 @@ bool8 sub_80952F0(u8 mailType, u32 param_2) for(index = 0, ptr = &gUnknown_203B480[0]; index < 0x20; ptr++, index++) { - if ((ptr->mailType == mailType) && (ptr->unk10 == param_2)) return TRUE; + if ((ptr->mailType == mailType) && (ptr->unk10.unk10 == param_2)) return TRUE; } return FALSE; } @@ -153,7 +153,7 @@ s32 sub_809539C(u8 mailType, u32 param_2) for(index = 0, ptr = &gUnknown_203B480[0]; index < 0x20; ptr++, index++) { - if ((ptr->mailType == mailType) && (ptr->unk10 == param_2)) return index; + if ((ptr->mailType == mailType) && (ptr->unk10.unk10 == param_2)) return index; } return -1; } @@ -175,7 +175,7 @@ s32 sub_8095400(u32 param_1) u32 *ptr; s32 index; - for(index = 0, ptr = &gUnknown_203B480[0].unk10; index < 0x20; ptr += 0xC, index++) + for(index = 0, ptr = &gUnknown_203B480[0].unk10.unk10; index < 0x20; ptr += 0xC, index++) { if (*ptr == param_1) return index; } @@ -200,7 +200,7 @@ void sub_809542C(struct unkStruct_809542C *param_1) preload->dungeon = param_1->unk0; preload->unk8 = uVar4; sub_8094D28(Rand32Bit()); - gUnknown_203B480->unk10 = sub_8094E4C(); + gUnknown_203B480->unk10.unk10 = sub_8094E4C(); gUnknown_203B480->clientSpecies = GetPlayerPokemonStruct()->speciesNum; PrintPokeNameToBuffer(buffer, GetPlayerPokemonStruct()); CopyStringtoBuffer(gUnknown_203B480->playerName, buffer); @@ -324,7 +324,7 @@ void sub_8095774(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b) RestoreDungeonLocation(a, &b->dungeon); RestoreIntegerBits(a, &b->unk8, 0x18); RestoreIntegerBits(a, &b->clientSpecies, 0x9); - RestoreIntegerBits(a, &b->unk10, 0x20); + RestoreIntegerBits(a, &b->unk10.unk10, 0x20); RestoreIntegerBits(a, &b->playerName, 0x50); RestoreIntegerBits(a, &b->unk20.flags, 0x8); RestoreIntegerBits(a, &b->unk20.quantity, 0x8); @@ -349,7 +349,7 @@ void sub_8095824(struct unkStruct_8094924 * a, struct unkStruct_203B480 *b) SaveDungeonLocation(a, &b->dungeon); SaveIntegerBits(a, &b->unk8, 0x18); SaveIntegerBits(a, &b->clientSpecies, 0x9); - SaveIntegerBits(a, &b->unk10, 0x20); + SaveIntegerBits(a, &b->unk10.unk10, 0x20); SaveIntegerBits(a, &b->playerName, 0x50); SaveIntegerBits(a, &b->unk20.flags, 0x8); SaveIntegerBits(a, &b->unk20.quantity, 0x8); diff --git a/src/friend_rescue_1.c b/src/friend_rescue_1.c index c66a9c8c3..549e9d7ad 100644 --- a/src/friend_rescue_1.c +++ b/src/friend_rescue_1.c @@ -712,7 +712,7 @@ void sub_8033DBC(void) SetFriendRescueMenuState(8); break; case PASSWORD_ENTRY_SOS_MAIL_SUCCESS: - sub_8095274(mail.unk10); + sub_8095274(mail.unk10.unk10); mail.mailType = 2; sub_80951BC(&mail); sub_80141B4(gUnknown_80E4928, 0, 0, 0x101); @@ -729,7 +729,7 @@ void sub_8033DBC(void) case PASSWORD_ENTRY_AOK_MAIL_SUCCESS: mail.mailType = 5; sub_80951FC(&mail); - mail2 = sub_8095228(sub_809539C(1, mail.unk10)); + mail2 = sub_8095228(sub_809539C(1, mail.unk10.unk10)); mail2->mailType = 7; MemoryFill8((u8 *)gUnknown_203B484, 0, sizeof(struct unkStruct_203B484)); SetFriendRescueMenuState(0x40); @@ -1597,10 +1597,10 @@ void sub_8034D74(void) SetFriendRescueMenuState(0x6B); break; case PASSWORD_ENTRY_THANK_YOU_MAIL_SUCCESS: - mail2 = sub_8095228(sub_809539C(4, mail.unk10)); + mail2 = sub_8095228(sub_809539C(4, mail.unk10.unk10)); *mail2 = mail; mail2->mailType = 6; - gUnknown_203B33C->unk420 = mail.unk10; + gUnknown_203B33C->unk420 = mail.unk10.unk10; SetFriendRescueMenuState(0x6D); break; case 7: diff --git a/src/rescue_password_menu.c b/src/rescue_password_menu.c index 397f9b4f9..73b416033 100644 --- a/src/rescue_password_menu.c +++ b/src/rescue_password_menu.c @@ -220,7 +220,7 @@ s32 UpdateRescuePasswordMenu(void) nextMenu = MENU_NO_SCREEN_CHANGE; break; case PASSWORD_ENTRY_SOS_MAIL_SUCCESS: - sub_8095274(local_44.unk10); + sub_8095274(local_44.unk10.unk10); DisplayPasswordAcceptScreen(); gRescuePasswordMenu->state = 9; nextMenu = MENU_NO_SCREEN_CHANGE; @@ -245,7 +245,7 @@ s32 UpdateRescuePasswordMenu(void) nextMenu = MENU_NO_SCREEN_CHANGE; local_44.mailType = 5; sub_80951FC(&local_44); - puVar5 = sub_8095228(sub_809539C(1, local_44.unk10)); + puVar5 = sub_8095228(sub_809539C(1, local_44.unk10.unk10)); puVar5->mailType = WONDER_MAIL_TYPE_OKD; MemoryFill8((u8 *)&gUnknown_203B484, 0, sizeof(struct unkStruct_203B484)); break; @@ -265,7 +265,7 @@ s32 UpdateRescuePasswordMenu(void) DisplayPasswordAcceptScreen(); gRescuePasswordMenu->state = 9; nextMenu = MENU_NO_SCREEN_CHANGE; - puVar6 = sub_8095228(sub_809539C(4, local_44.unk10)); + puVar6 = sub_8095228(sub_809539C(4, local_44.unk10.unk10)); *puVar6 = local_44; puVar6->mailType = 6; iVar9 = GetMainMenu(); @@ -462,7 +462,7 @@ u32 sub_8039068(u32 mailMode, u8 *passwordBuffer, struct unkStruct_203B480 *para if (param_3->mailType != WONDER_MAIL_TYPE_SOS) { return PASSWORD_ENTRY_NOT_SOS_MAIL; } - else if ( (sub_80952F0(2, param_3->unk10)) || (sub_80952F0(WONDER_MAIL_TYPE_AOK, param_3->unk10)) || (sub_80952F0(WONDER_MAIL_TYPE_COMPLETED, param_3->unk10)) || (sub_8095298(param_3->unk10))) { + else if ( (sub_80952F0(2, param_3->unk10.unk10)) || (sub_80952F0(WONDER_MAIL_TYPE_AOK, param_3->unk10.unk10)) || (sub_80952F0(WONDER_MAIL_TYPE_COMPLETED, param_3->unk10.unk10)) || (sub_8095298(param_3->unk10.unk10))) { return PASSWORD_ENTRY_DUPLICATE_SOS_MAIL; } else if (FindOpenMailSlot() == -1) { @@ -476,7 +476,7 @@ u32 sub_8039068(u32 mailMode, u8 *passwordBuffer, struct unkStruct_203B480 *para if (param_3->mailType != WONDER_MAIL_TYPE_AOK) { return PASSWORD_ENTRY_NOT_AOK_MAIL; } - else if (!sub_80952F0(1, param_3->unk10)) { + else if (!sub_80952F0(1, param_3->unk10.unk10)) { return PASSWORD_ENTRY_DUPLICATE_AOK_MAIL; } else { @@ -487,7 +487,7 @@ u32 sub_8039068(u32 mailMode, u8 *passwordBuffer, struct unkStruct_203B480 *para if (param_3->mailType != WONDER_MAIL_TYPE_THANK_YOU) { return PASSWORD_ENTRY_NOT_THANK_YOU_MAIL; } - else if ((!sub_80952F0(4, param_3->unk10)) || (param_3->unk28 != sub_8011C34())) { + else if ((!sub_80952F0(4, param_3->unk10.unk10)) || (param_3->unk28 != sub_8011C34())) { return PASSWORD_ENTRY_DUPLICATE_THANK_YOU_MAIL; } else { diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index 5a1fcc61f..110afd248 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -291,7 +291,7 @@ u32 CreateThankYouMailPelipper(void) mail = sub_8095228(index); gUnknown_203B2C4->unk41C = mail->unk20; gUnknown_203B2C4->mailIndex = index; - gUnknown_203B2C4->unk430 = mail->unk10; + gUnknown_203B2C4->unk430 = mail->unk10.unk10; SetThankYouMailMenuState(5); } else { @@ -841,11 +841,11 @@ void HandleThankYouMailPasswordMenu(void) SetThankYouMailMenuState(PRINT_THANK_YOU_ERROR); break; case PASSWORD_ENTRY_THANK_YOU_MAIL_SUCCESS: - uVar1 = sub_809539C(4,mail1.unk10); + uVar1 = sub_809539C(4,mail1.unk10.unk10); mail = sub_8095228(uVar1); *mail = mail1; mail->mailType = 6; - gUnknown_203B2C4->unk430 = mail1.unk10; + gUnknown_203B2C4->unk430 = mail1.unk10.unk10; SetThankYouMailMenuState(THANK_YOU_PASSWORD_SUCCESS); break; default: @@ -1346,10 +1346,10 @@ void UpdateThankYouMailText(void) case 7: gUnknown_203B2C4->linkError = sub_80381F4(gUnknown_203B2C4->unk40,&gUnknown_203B2C4->unk1B8,&gUnknown_203B2C4->unk1E8); if ( sub_800D588() != '\0') { - gUnknown_203B2C4->unk430 = gUnknown_203B2C4->unk1E8.unk10; + gUnknown_203B2C4->unk430 = gUnknown_203B2C4->unk1E8.unk10.unk10; } else { - gUnknown_203B2C4->unk430 = gUnknown_203B2C4->unk1B8.unk10; + gUnknown_203B2C4->unk430 = gUnknown_203B2C4->unk1B8.unk10.unk10; } break; } diff --git a/src/wonder_mail.c b/src/wonder_mail.c index a19aeab09..1f8ebc377 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -1471,7 +1471,7 @@ void sub_80293F4(void) sub_8028B04(7); break; case PASSWORD_ENTRY_SOS_MAIL_SUCCESS: - sub_8095274(mail.unk10); + sub_8095274(mail.unk10.unk10); mail.mailType = 2; sub_80951BC(&mail); sub_80141B4(gWonderMailAOKMailReceivedText, 0, &gUnknown_203B2C0->faceFile, 0x101); diff --git a/src/wonder_mail_5.c b/src/wonder_mail_5.c index 76a65db86..f882d3ec7 100644 --- a/src/wonder_mail_5.c +++ b/src/wonder_mail_5.c @@ -2,17 +2,49 @@ #include "memory.h" #include "text.h" #include "input.h" +#include "dungeon.h" +#include "pokemon.h" +#include "code_8094F88.h" +#include "code_800D090.h" struct unkStruct_203B324 { // size: 0x78 u8 fill0[0xC]; - u8 unkC; + u8 mailIndex; u32 unk10; struct UnkTextStruct2 *unk14; struct UnkTextStruct2 unk18[4]; }; extern struct unkStruct_203B324 *gUnknown_203B324; +extern struct unkStruct_203B480 *gUnknown_203B480; + + +struct unkStruct_802C39C +{ + /* 0x0 */ u32 unk0[2]; + /* 0x8 */ struct DungeonLocation *dungeon; + /* 0xC */ u8 *playerName; + /* 0x10 */ s16 clientSpecies; + /* 0x12 */ s16 targetSpecies; + /* 0x14 */ u8 unk14; + /* 0x15 */ u8 fill15[0x2E - 0x15]; + u8 unk2E; + u8 fill2F[0x34 - 0x2F]; + u8 unk34; + u8 fill35[0x38 - 0x35]; + /* 0x38 */ u8 unk38[0x40 - 0x38]; + u8 unk40; + u8 unk41; + u8 unk42; + u8 unk43; + u8 unk44; + u8 unk45; + u8 fill46[0x48 - 0x46]; + /* 0x48 */ u32 y; + /* 0x4C */ u8 *unk4C; + /* 0x50 */ u8 *unk50[2]; +}; const struct UnkTextStruct2 gUnknown_80E0900 = { 0x00, 0x00, 0x00, 0x00, @@ -42,14 +74,18 @@ extern void sub_8030DD4(void); extern void sub_801317C(void *); extern void PlayMenuSoundEffect(u32); extern u32 sub_8012A64(void *, u32); +extern void CreateRescueDescription(void *); +extern void xxx_call_draw_string(u32, u32, const char *, u32, u32); +extern void sub_80073E0(u32); +extern void sub_80073B8(u32); void sub_8030E2C(void); void sub_8030E48(void); -bool8 sub_8030D40(u8 param_1, s32 param_2) +bool8 sub_8030D40(u8 mailIndex, s32 param_2) { gUnknown_203B324 = MemoryAlloc(sizeof(struct unkStruct_203B324), 8); - gUnknown_203B324->unkC = param_1; + gUnknown_203B324->mailIndex = mailIndex; sub_801317C(gUnknown_203B324); gUnknown_203B324->unk10 = param_2; gUnknown_203B324->unk14 = &gUnknown_203B324->unk18[param_2]; @@ -98,3 +134,49 @@ void sub_8030E2C(void) sub_800641C(gUnknown_203B324->unk18, 1, 1); } +void sub_8030E48(void) +{ + u16 uVar2; + struct unkStruct_203B480 *mail; + struct unkStruct_802C39C stack; + u8 buffer [256]; + + mail = &gUnknown_203B480[gUnknown_203B324->mailIndex]; + sub_80073B8(gUnknown_203B324->unk10); + stack.unk0[0] = gUnknown_203B324->unk10; + stack.unk40 = 7; + stack.unk42 = 0; + stack.unk44 = 0; + stack.dungeon = &mail->dungeon; + stack.playerName = mail->playerName; + stack.clientSpecies = mail->clientSpecies; + stack.targetSpecies = mail->clientSpecies; + stack.unk14 = 0; + if (mail->unk20.id == ITEM_NOTHING) { + stack.unk2E = 5; + } + else { + stack.unk2E = 2; + stack.unk34 = mail->unk20.id; + } + switch(mail->mailType) + { + case 2: + case 4: + stack.unk41 = 10; + break; + case 5: + stack.unk41 = 0xb; + break; + case 0: + default: + stack.unk41 = 9; + break; + } + CreateRescueDescription(&stack); + uVar2 = mail->unk10.unk10_u16 % 10000; + xxx_call_draw_string(10,0x68,gUnknown_80E0934,gUnknown_203B324->unk10,0); // ID: + sprintfStatic(buffer,gUnknown_80E0938,uVar2); // %-4d + xxx_call_draw_string(0x44,0x68,buffer,gUnknown_203B324->unk10,0); + sub_80073E0(gUnknown_203B324->unk10); +} diff --git a/src/wonder_mail_6.c b/src/wonder_mail_6.c index 2b0cf67a5..9264d8d9f 100644 --- a/src/wonder_mail_6.c +++ b/src/wonder_mail_6.c @@ -13,7 +13,7 @@ struct unkStruct_203B328 { // size: 0x11C u32 state; - u8 unk4; + u8 mailIndex; u32 unk8; u8 fillC[0x58 - 0xC]; u32 unk58; @@ -241,7 +241,7 @@ void sub_8031258(void) sub_8012D60(&gUnknown_203B328->unk58, gUnknown_80E0948, 0, 0, 3, 2); break; case 4: - sub_8030D40(gUnknown_203B328->unk4, 3); + sub_8030D40(gUnknown_203B328->mailIndex, 3); break; case 5: case 6: @@ -255,11 +255,11 @@ void sub_8031300(void) switch(sub_8030768(1)) { case 3: - gUnknown_203B328->unk4 = sub_80307EC(); + gUnknown_203B328->mailIndex = sub_80307EC(); sub_80310E4(1); break; case 4: - gUnknown_203B328->unk4 = sub_80307EC(); + gUnknown_203B328->mailIndex = sub_80307EC(); sub_80310E4(4); break; case 2: @@ -301,7 +301,7 @@ void sub_803136C(void) void sub_80313D8(u32 state) { - s32 iVar2; + s32 index; s32 local_10; struct unkStruct_203B480 *unused; @@ -322,15 +322,15 @@ void sub_80313D8(u32 state) switch(state) { case 2: - sub_8095240(gUnknown_203B328->unk4); + sub_8095240(gUnknown_203B328->mailIndex); break; case 3: - for(iVar2 = 0; iVar2 < 0x20; iVar2++) + for(index = 0; index < 0x20; index++) { - unused = &gUnknown_203B480[iVar2]; - gUnknown_203B480[iVar2].mailType = 0; - unused = &gUnknown_203B480[iVar2]; - gUnknown_203B480[iVar2].unk20.id = 0; + unused = &gUnknown_203B480[index]; + gUnknown_203B480[index].mailType = 0; + unused = &gUnknown_203B480[index]; + gUnknown_203B480[index].unk20.id = ITEM_NOTHING; } break; }