From b7855b4de50471a4fd6c670806f6259060f9a11f Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 6 Jul 2025 12:11:25 -0700 Subject: [PATCH 1/6] initial work --- asm/code_803B050.s | 379 ----------------------------------------- include/code_803B050.h | 2 +- ld_script.ld | 1 + src/code_803B050.c | 206 +++++++++++++++++++++- 4 files changed, 207 insertions(+), 381 deletions(-) diff --git a/asm/code_803B050.s b/asm/code_803B050.s index e833be34c..dc23ffc5d 100644 --- a/asm/code_803B050.s +++ b/asm/code_803B050.s @@ -5,385 +5,6 @@ .text - thumb_func_start sub_803B050 -sub_803B050: - push {r4-r7,lr} - ldr r4, _0803B0F4 - movs r0, 0xF4 - lsls r0, 2 - movs r1, 0x8 - bl MemoryAlloc - str r0, [r4] - movs r1, 0x3 - str r1, [r0, 0x34] - adds r1, r0, 0 - adds r1, 0x84 - str r1, [r0, 0x38] - adds r0, 0x3C - bl RestoreSavedWindows - ldr r1, [r4] - ldr r2, [r1, 0x34] - lsls r0, r2, 1 - adds r0, r2 - lsls r0, 3 - adds r1, r0 - adds r1, 0x3C - ldr r0, _0803B0F8 - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldr r0, [r4] - ldr r1, [r0, 0x38] - adds r0, 0x9C - str r0, [r1, 0x14] - bl ResetUnusedInputStruct - ldr r0, [r4] - adds r0, 0x3C - movs r1, 0x1 - movs r2, 0x1 - bl ShowWindows - movs r2, 0 - movs r3, 0 - movs r7, 0xCB - lsls r7, 1 - movs r6, 0x80 - lsls r6, 9 - movs r5, 0 -_0803B0AE: - ldr r0, _0803B0FC - adds r0, r5, r0 - movs r1, 0x2 - ldrsh r0, [r0, r1] - ldr r4, _0803B0F4 - cmp r0, 0xA - bne _0803B0C8 - ldr r0, [r4] - lsls r1, r2, 1 - adds r0, 0xA0 - adds r0, r1 - strh r3, [r0] - adds r2, 0x1 -_0803B0C8: - adds r0, r6, 0 - movs r3, 0x80 - lsls r3, 9 - adds r6, r3 - adds r5, 0xC - asrs r3, r0, 16 - cmp r3, r7 - ble _0803B0AE - ldr r0, [r4] - ldr r3, [r0, 0x34] - adds r1, r2, 0 - movs r2, 0xA - bl CreateMenuOnWindow - bl sub_803B204 - bl sub_803B284 - movs r0, 0x1 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0803B0F4: .4byte gUnknown_203B3FC -_0803B0F8: .4byte gUnknown_80E7F54 -_0803B0FC: .4byte gFunctionScriptTable - thumb_func_end sub_803B050 - - thumb_func_start sub_803B100 -sub_803B100: - push {lr} - adds r1, r0, 0 - lsls r1, 16 - asrs r1, 16 - ldr r0, _0803B11C - ldr r0, [r0] - bl MoveMenuToEntryId - bl sub_803B204 - bl sub_803B284 - pop {r0} - bx r0 - .align 2, 0 -_0803B11C: .4byte gUnknown_203B3FC - thumb_func_end sub_803B100 - - thumb_func_start sub_803B120 -sub_803B120: - push {r4,lr} - ldr r4, _0803B13C - ldr r0, [r4] - bl GetKeyPress - cmp r0, 0x1 - beq _0803B140 - cmp r0, 0x2 - bne _0803B144 - movs r0, 0x1 - bl PlayMenuSoundEffect - movs r0, 0x2 - b _0803B160 - .align 2, 0 -_0803B13C: .4byte gUnknown_203B3FC -_0803B140: - movs r0, 0x3 - b _0803B160 -_0803B144: - ldr r0, [r4] - movs r1, 0x1 - bl MenuCursorUpdate - lsls r0, 24 - cmp r0, 0 - bne _0803B156 - movs r0, 0 - b _0803B160 -_0803B156: - bl sub_803B204 - bl sub_803B284 - movs r0, 0x1 -_0803B160: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_803B120 - - thumb_func_start sub_803B168 -sub_803B168: - ldr r0, _0803B188 - ldr r0, [r0] - movs r1, 0x1E - ldrsh r2, [r0, r1] - movs r3, 0x1C - ldrsh r1, [r0, r3] - muls r1, r2 - movs r3, 0x18 - ldrsh r2, [r0, r3] - adds r1, r2 - lsls r1, 1 - adds r0, 0xA0 - adds r0, r1 - movs r1, 0 - ldrsh r0, [r0, r1] - bx lr - .align 2, 0 -_0803B188: .4byte gUnknown_203B3FC - thumb_func_end sub_803B168 - - thumb_func_start sub_803B18C -sub_803B18C: - push {r4,r5,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - ldr r5, _0803B1B8 - ldr r0, [r5] - movs r1, 0xE5 - strh r1, [r0, 0x22] - bl MenuUpdatePagesData - bl sub_803B204 - bl sub_803B284 - cmp r4, 0 - beq _0803B1B2 - ldr r0, [r5] - bl AddMenuCursorSprite -_0803B1B2: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803B1B8: .4byte gUnknown_203B3FC - thumb_func_end sub_803B18C - - thumb_func_start sub_803B1BC -sub_803B1BC: - push {r4,r5,lr} - ldr r4, _0803B1FC - ldr r2, [r4] - cmp r2, 0 - beq _0803B1F6 - ldr r0, [r2, 0x34] - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 3 - adds r1, r2, r1 - adds r1, 0x3C - ldr r0, _0803B200 - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - ldm r0!, {r2,r3,r5} - stm r1!, {r2,r3,r5} - bl ResetUnusedInputStruct - ldr r0, [r4] - adds r0, 0x3C - movs r1, 0x1 - movs r2, 0x1 - bl ShowWindows - ldr r0, [r4] - bl MemoryFree - movs r0, 0 - str r0, [r4] -_0803B1F6: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803B1FC: .4byte gUnknown_203B3FC -_0803B200: .4byte gUnknown_80E7F3C - thumb_func_end sub_803B1BC - - thumb_func_start sub_803B204 -sub_803B204: - push {r4,lr} - ldr r4, _0803B280 - ldr r0, [r4] - adds r0, 0x9C - movs r2, 0 - movs r1, 0x1 - strb r1, [r0] - ldr r0, [r4] - adds r0, 0x9D - strb r2, [r0] - ldr r0, [r4] - adds r0, 0x9E - movs r1, 0x8 - strb r1, [r0] - ldr r0, [r4] - adds r0, 0x9F - strb r2, [r0] - bl ResetUnusedInputStruct - ldr r0, [r4] - adds r0, 0x3C - movs r1, 0x1 - movs r2, 0x1 - bl ShowWindows - ldr r0, [r4] - movs r1, 0x1A - ldrsh r0, [r0, r1] - movs r1, 0xC - bl CalcEntriesTotalHeight - adds r0, 0x2 - lsls r0, 16 - ldr r2, [r4] - ldr r3, [r2, 0x34] - lsls r1, r3, 1 - adds r1, r3 - lsls r1, 3 - adds r1, r2, r1 - adds r1, 0x4A - asrs r3, r0, 16 - lsrs r0, 16 - strh r0, [r1] - ldr r1, [r2, 0x34] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 3 - adds r2, r0 - adds r3, 0x2 - adds r2, 0x4C - strh r3, [r2] - bl ResetUnusedInputStruct - ldr r0, [r4] - adds r0, 0x3C - movs r1, 0x1 - movs r2, 0x1 - bl ShowWindows - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0803B280: .4byte gUnknown_203B3FC - thumb_func_end sub_803B204 - - thumb_func_start sub_803B284 -sub_803B284: - push {r4-r6,lr} - sub sp, 0x8 - ldr r6, _0803B338 - ldr r0, [r6] - ldr r0, [r0, 0x34] - bl CallPrepareTextbox_8008C54 - ldr r0, [r6] - ldr r0, [r0, 0x34] - bl sub_80073B8 - ldr r2, _0803B33C - ldr r0, [r6] - ldr r3, [r0, 0x34] - movs r0, 0 - str r0, [sp] - movs r0, 0xA - movs r1, 0 - bl PrintStringOnWindow - ldr r1, [r6] - adds r0, r1, 0 - adds r0, 0x9E - ldrb r4, [r0] - lsls r4, 3 - subs r4, 0x2 - movs r0, 0x1E - ldrsh r2, [r1, r0] - adds r2, 0x1 - movs r0, 0x7 - str r0, [sp] - ldr r0, [r1, 0x34] - str r0, [sp, 0x4] - adds r0, r4, 0 - movs r1, 0 - movs r3, 0x2 - bl PrintNumOnWindow - movs r5, 0 - ldr r0, [r6] - movs r1, 0x1A - ldrsh r0, [r0, r1] - cmp r5, r0 - bge _0803B324 -_0803B2DC: - ldr r0, [r6] - movs r3, 0x1E - ldrsh r2, [r0, r3] - movs r3, 0x1C - ldrsh r1, [r0, r3] - muls r2, r1 - adds r2, r5 - lsls r2, 1 - adds r1, r0, 0 - adds r1, 0xA0 - adds r1, r2 - movs r2, 0 - ldrsh r1, [r1, r2] - lsls r4, r1, 1 - adds r4, r1 - lsls r4, 2 - ldr r1, _0803B340 - adds r4, r1 - adds r1, r5, 0 - bl GetMenuEntryYCoord - adds r1, r0, 0 - ldr r2, [r4, 0x4] - ldr r0, [r6] - ldr r3, [r0, 0x34] - movs r0, 0 - str r0, [sp] - movs r0, 0x8 - bl PrintStringOnWindow - adds r5, 0x1 - ldr r0, [r6] - movs r3, 0x1A - ldrsh r0, [r0, r3] - cmp r5, r0 - blt _0803B2DC -_0803B324: - ldr r0, _0803B338 - ldr r0, [r0] - ldr r0, [r0, 0x34] - bl sub_80073E0 - add sp, 0x8 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0803B338: .4byte gUnknown_203B3FC -_0803B33C: .4byte gUnknown_80E7F6C -_0803B340: .4byte gFunctionScriptTable - thumb_func_end sub_803B284 - thumb_func_start sub_803B344 sub_803B344: adds r1, r0, 0 diff --git a/include/code_803B050.h b/include/code_803B050.h index a0e14ff16..bb2a48608 100644 --- a/include/code_803B050.h +++ b/include/code_803B050.h @@ -7,4 +7,4 @@ extern unkStruct_803B344 *sub_803B344(u8); extern void sub_803B35C(WonderMail *, unkStruct_802C39C *); -#endif // GUARD_CODE_803B050_H \ No newline at end of file +#endif // GUARD_CODE_803B050_H diff --git a/ld_script.ld b/ld_script.ld index 20018bfcd..ae8e072b2 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -186,6 +186,7 @@ SECTIONS { src/debug_menu2.o(.text); src/debug_menu3.o(.text); src/debug_menu4.o(.text); + src/code_803B050.o(.text); asm/code_803B050.o(.text); src/pokemon_mail.o(.text); src/code_803C1B4.o(.text); diff --git a/src/code_803B050.c b/src/code_803B050.c index 86981ae61..1cffa8feb 100644 --- a/src/code_803B050.c +++ b/src/code_803B050.c @@ -1,3 +1,207 @@ #include "global.h" +#include "globaldata.h" +#include "structs/str_ground_script.h" +#include "input.h" +#include "memory.h" +#include "menu_input.h" +#include "music_util.h" +#include "text_1.h" +#include "text_2.h" +#include "text_3.h" -EWRAM_INIT void *gUnknown_203B3FC = NULL; +struct unkStruct_203B3FC +{ + // size: 0x3D0 + MenuHeaderWindow mh; + s16 unkA0[10]; +}; +EWRAM_INIT struct unkStruct_203B3FC *gUnknown_203B3FC = NULL; + +extern WindowTemplate gUnknown_80E7F3C; + +NAKED +bool8 sub_803B050(void) +{ + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tldr r4, _0803B0F4\n" + "\tmovs r0, 0xF4\n" + "\tlsls r0, 2\n" + "\tmovs r1, 0x8\n" + "\tbl MemoryAlloc\n" + "\tstr r0, [r4]\n" + "\tmovs r1, 0x3\n" + "\tstr r1, [r0, 0x34]\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0x84\n" + "\tstr r1, [r0, 0x38]\n" + "\tadds r0, 0x3C\n" + "\tbl RestoreSavedWindows\n" + "\tldr r1, [r4]\n" + "\tldr r2, [r1, 0x34]\n" + "\tlsls r0, r2, 1\n" + "\tadds r0, r2\n" + "\tlsls r0, 3\n" + "\tadds r1, r0\n" + "\tadds r1, 0x3C\n" + "\tldr r0, _0803B0F8\n" + "\tldm r0!, {r2,r3,r5}\n" + "\tstm r1!, {r2,r3,r5}\n" + "\tldm r0!, {r2,r3,r5}\n" + "\tstm r1!, {r2,r3,r5}\n" + "\tldr r0, [r4]\n" + "\tldr r1, [r0, 0x38]\n" + "\tadds r0, 0x9C\n" + "\tstr r0, [r1, 0x14]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x3C\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl ShowWindows\n" + "\tmovs r2, 0\n" + "\tmovs r3, 0\n" + "\tmovs r7, 0xCB\n" + "\tlsls r7, 1\n" + "\tmovs r6, 0x80\n" + "\tlsls r6, 9\n" + "\tmovs r5, 0\n" +"_0803B0AE:\n" + "\tldr r0, _0803B0FC\n" + "\tadds r0, r5, r0\n" + "\tmovs r1, 0x2\n" + "\tldrsh r0, [r0, r1]\n" + "\tldr r4, _0803B0F4\n" + "\tcmp r0, 0xA\n" + "\tbne _0803B0C8\n" + "\tldr r0, [r4]\n" + "\tlsls r1, r2, 1\n" + "\tadds r0, 0xA0\n" + "\tadds r0, r1\n" + "\tstrh r3, [r0]\n" + "\tadds r2, 0x1\n" +"_0803B0C8:\n" + "\tadds r0, r6, 0\n" + "\tmovs r3, 0x80\n" + "\tlsls r3, 9\n" + "\tadds r6, r3\n" + "\tadds r5, 0xC\n" + "\tasrs r3, r0, 16\n" + "\tcmp r3, r7\n" + "\tble _0803B0AE\n" + "\tldr r0, [r4]\n" + "\tldr r3, [r0, 0x34]\n" + "\tadds r1, r2, 0\n" + "\tmovs r2, 0xA\n" + "\tbl CreateMenuOnWindow\n" + "\tbl sub_803B204\n" + "\tbl sub_803B284\n" + "\tmovs r0, 0x1\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" +"_0803B0F4: .4byte gUnknown_203B3FC\n" +"_0803B0F8: .4byte gUnknown_80E7F54\n" +"_0803B0FC: .4byte gFunctionScriptTable"); +} + +void sub_803B204(void); +void sub_803B284(void); + +void sub_803B100(s32 _id) { + s32 id = (s16)_id; + + MoveMenuToEntryId(&gUnknown_203B3FC->mh.m.input, id); + sub_803B204(); + sub_803B284(); +} + +s32 sub_803B120(void) +{ + switch(GetKeyPress(&gUnknown_203B3FC->mh.m.input)) + { + case 2: + PlayMenuSoundEffect(1); + return 2; + case 1: + return 3; + default: + break; + } + if((MenuCursorUpdate(&gUnknown_203B3FC->mh.m.input, TRUE) != FALSE)) + { + sub_803B204(); + sub_803B284(); + return 1; + } + else + return 0; +} + +s16 sub_803B168(void) +{ + return gUnknown_203B3FC->unkA0[GET_CURRENT_MENU_ENTRY(gUnknown_203B3FC->mh.m.input)]; +} + +void sub_803B18C(u8 r0) +{ + gUnknown_203B3FC->mh.m.input.totalEntriesCount = 0xE5; + MenuUpdatePagesData(&gUnknown_203B3FC->mh.m.input); + sub_803B204(); + sub_803B284(); + + if(r0) + AddMenuCursorSprite(&gUnknown_203B3FC->mh.m.input); +} + +void sub_803B1BC(void) +{ + if(gUnknown_203B3FC) + { + gUnknown_203B3FC->mh.m.windows.id[gUnknown_203B3FC->mh.m.menuWinId] = gUnknown_80E7F3C; + ResetUnusedInputStruct(); + ShowWindows(&gUnknown_203B3FC->mh.m.windows, TRUE, TRUE); + MemoryFree(gUnknown_203B3FC); + gUnknown_203B3FC = NULL; + } +} + +void sub_803B204(void) +{ + gUnknown_203B3FC->mh.header.count = 1; + gUnknown_203B3FC->mh.header.currId = 0; + gUnknown_203B3FC->mh.header.width = 8; + gUnknown_203B3FC->mh.header.f3 = 0; + ResetUnusedInputStruct(); + ShowWindows(&gUnknown_203B3FC->mh.m.windows, TRUE, TRUE); + UPDATE_MENU_WINDOW_HEIGHT(gUnknown_203B3FC->mh.m); +} + +extern u8 gUnknown_80E7F6C[]; + +void sub_803B284(void) +{ + s32 x, y, i; + s32 pageNum; + const ScriptRef *ptr; + + CallPrepareTextbox_8008C54(gUnknown_203B3FC->mh.m.menuWinId); + sub_80073B8(gUnknown_203B3FC->mh.m.menuWinId); + PrintStringOnWindow(0xA, 0, gUnknown_80E7F6C, gUnknown_203B3FC->mh.m.menuWinId, 0); + + x = (gUnknown_203B3FC->mh.header.width * 8) - 2; + pageNum = gUnknown_203B3FC->mh.m.input.currPage + 1; + PrintNumOnWindow(x, 0, pageNum, 2, 7, gUnknown_203B3FC->mh.m.menuWinId); + + // This line has no real effect. It's a magic 'fakematch' to fool agb into generating the same asm. It can be removed if you don't care about matching. + if (x) { i = 0; } + + for (i = 0; i < gUnknown_203B3FC->mh.m.input.currPageEntries; i++) { + ptr = &gFunctionScriptTable[gUnknown_203B3FC->unkA0[(gUnknown_203B3FC->mh.m.input.currPage * gUnknown_203B3FC->mh.m.input.entriesPerPage) + i]]; + y = GetMenuEntryYCoord(&gUnknown_203B3FC->mh.m.input, i); + PrintStringOnWindow(8, y, ptr->name, gUnknown_203B3FC->mh.m.menuWinId, 0); + } + + sub_80073E0(gUnknown_203B3FC->mh.m.menuWinId); +} From a0dbdc84f9e23f9233e7f5366c1067397251e781 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sun, 6 Jul 2025 13:55:59 -0700 Subject: [PATCH 2/6] more work --- asm/code_803B050.s | 398 ---------------------------------- include/structs/str_802C39C.h | 13 +- src/code_803B050.c | 201 +++++++++++++++++ src/pokemon_mail.c | 14 +- src/wonder_mail_4.c | 2 +- src/wonder_mail_5.c | 6 +- 6 files changed, 216 insertions(+), 418 deletions(-) diff --git a/asm/code_803B050.s b/asm/code_803B050.s index dc23ffc5d..7b92d5155 100644 --- a/asm/code_803B050.s +++ b/asm/code_803B050.s @@ -5,404 +5,6 @@ .text - thumb_func_start sub_803B344 -sub_803B344: - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - ldr r1, _0803B358 - adds r0, r1 - bx lr - .align 2, 0 -_0803B358: .4byte gUnknown_80E7F94 - thumb_func_end sub_803B344 - - thumb_func_start sub_803B35C -sub_803B35C: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - adds r1, 0x18 - bl sub_803C21C - ldrb r0, [r5, 0x2] - subs r0, 0x1 - cmp r0, 0x8 - bls _0803B372 - b _0803B4FA -_0803B372: - lsls r0, 2 - ldr r1, _0803B37C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0803B37C: .4byte _0803B380 - .align 2, 0 -_0803B380: - .4byte _0803B3A4 - .4byte _0803B3BE - .4byte _0803B3D8 - .4byte _0803B3F2 - .4byte _0803B414 - .4byte _0803B442 - .4byte _0803B470 - .4byte _0803B49E - .4byte _0803B4CC -_0803B3A4: - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0 - strb r1, [r0] - adds r0, 0x1 - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x6 - strb r0, [r1] - subs r1, 0x14 - movs r0, 0x5 - b _0803B576 -_0803B3BE: - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0x1 - strb r1, [r0] - adds r0, 0x1 - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x6 - strb r0, [r1] - subs r1, 0x14 - movs r0, 0x5 - b _0803B576 -_0803B3D8: - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0x2 - strb r1, [r0] - adds r0, 0x1 - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x6 - strb r0, [r1] - subs r1, 0x14 - movs r0, 0x5 - b _0803B576 -_0803B3F2: - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0x3 - strb r1, [r0] - adds r0, 0x1 - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x6 - strb r0, [r1] - bl sub_8096DD8 - str r0, [r4, 0x4C] - bl sub_8096DE8 - str r0, [r4, 0x50] - b _0803B578 -_0803B414: - ldrb r0, [r5, 0x1] - cmp r0, 0x3 - bne _0803B42A - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0xB - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x1 - b _0803B438 -_0803B42A: - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0xC - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x2 -_0803B438: - strb r0, [r1] - adds r1, r4, 0 - adds r1, 0x41 - movs r0, 0x4 - b _0803B576 -_0803B442: - ldrb r0, [r5, 0x1] - cmp r0, 0x3 - bne _0803B458 - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0xB - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x1 - b _0803B466 -_0803B458: - adds r0, r4, 0 - adds r0, 0x40 - movs r1, 0xC - strb r1, [r0] - adds r1, r4, 0 - adds r1, 0x42 - movs r0, 0x2 -_0803B466: - strb r0, [r1] - adds r1, r4, 0 - adds r1, 0x41 - movs r0, 0x5 - b _0803B576 -_0803B470: - adds r0, r5, 0 - bl sub_803B600 - str r0, [r4, 0x4] - movs r1, 0x1 - negs r1, r1 - cmp r0, r1 - bne _0803B488 - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0x9 - b _0803B48E -_0803B488: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0x4 -_0803B48E: - strb r0, [r1] - adds r1, r4, 0 - adds r1, 0x41 - movs r0, 0x6 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x4 - b _0803B576 -_0803B49E: - adds r0, r5, 0 - bl sub_803B628 - str r0, [r4, 0x4] - movs r1, 0x1 - negs r1, r1 - cmp r0, r1 - bne _0803B4B6 - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0x9 - b _0803B4BC -_0803B4B6: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0x5 -_0803B4BC: - strb r0, [r1] - adds r1, r4, 0 - adds r1, 0x41 - movs r0, 0x7 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x4 - b _0803B576 -_0803B4CC: - adds r0, r5, 0 - bl sub_803B66C - str r0, [r4, 0x4] - movs r1, 0x1 - negs r1, r1 - cmp r0, r1 - bne _0803B4E4 - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0xA - b _0803B4EA -_0803B4E4: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0x6 -_0803B4EA: - strb r0, [r1] - adds r1, r4, 0 - adds r1, 0x41 - movs r0, 0x8 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x5 - b _0803B576 -_0803B4FA: - ldrb r0, [r5, 0x1] - cmp r0, 0x2 - beq _0803B528 - cmp r0, 0x2 - bgt _0803B50A - cmp r0, 0x1 - beq _0803B514 - b _0803B564 -_0803B50A: - cmp r0, 0x3 - beq _0803B53C - cmp r0, 0x4 - beq _0803B550 - b _0803B564 -_0803B514: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0x9 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0xD - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x4 - b _0803B576 -_0803B528: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0xA - strb r0, [r1] - adds r1, 0x1 - movs r0, 0xE - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x5 - b _0803B576 -_0803B53C: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0xB - strb r0, [r1] - adds r1, 0x1 - movs r0, 0xF - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x1 - b _0803B576 -_0803B550: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0xC - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x10 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x2 - b _0803B576 -_0803B564: - adds r1, r4, 0 - adds r1, 0x40 - movs r0, 0x8 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0xC - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x3 -_0803B576: - strb r0, [r1] -_0803B578: - adds r0, r5, 0x4 - str r0, [r4, 0x8] - movs r0, 0 - str r0, [r4, 0xC] - ldrh r0, [r5, 0xC] - movs r1, 0 - strh r0, [r4, 0x10] - ldrh r0, [r5, 0xE] - strh r0, [r4, 0x12] - ldrb r0, [r5, 0x10] - strb r0, [r4, 0x14] - ldrb r0, [r5] - subs r0, 0x2 - cmp r0, 0x7 - bhi _0803B5EC - lsls r0, 2 - ldr r1, _0803B5A0 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0803B5A0: .4byte _0803B5A4 - .align 2, 0 -_0803B5A4: - .4byte _0803B5C4 - .4byte _0803B5C4 - .4byte _0803B5C4 - .4byte _0803B5C4 - .4byte _0803B5DC - .4byte _0803B5CC - .4byte _0803B5DC - .4byte _0803B5DC -_0803B5C4: - adds r0, r4, 0 - adds r0, 0x43 - movs r1, 0x1 - b _0803B5F0 -_0803B5CC: - adds r1, r4, 0 - adds r1, 0x43 - movs r0, 0 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x3 - strb r0, [r1] - b _0803B5F6 -_0803B5DC: - adds r1, r4, 0 - adds r1, 0x43 - movs r0, 0x3 - strb r0, [r1] - adds r1, 0x1 - movs r0, 0x2 - strb r0, [r1] - b _0803B5F6 -_0803B5EC: - adds r0, r4, 0 - adds r0, 0x43 -_0803B5F0: - strb r1, [r0] - adds r0, 0x1 - strb r1, [r0] -_0803B5F6: - str r5, [r4, 0x54] - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_803B35C - - thumb_func_start sub_803B600 -sub_803B600: - push {lr} - ldr r2, _0803B614 - movs r1, 0 - ldr r3, [r0, 0xC] -_0803B608: - ldr r0, [r2] - cmp r0, r3 - bne _0803B618 - adds r0, r1, 0 - b _0803B624 - .align 2, 0 -_0803B614: .4byte gUnknown_80E9920 -_0803B618: - adds r2, 0x8 - adds r1, 0x1 - cmp r1, 0x14 - ble _0803B608 - movs r0, 0x1 - negs r0, r0 -_0803B624: - pop {r1} - bx r1 - thumb_func_end sub_803B600 - thumb_func_start sub_803B628 sub_803B628: push {r4,r5,lr} diff --git a/include/structs/str_802C39C.h b/include/structs/str_802C39C.h index 4ebd77648..4995ae427 100644 --- a/include/structs/str_802C39C.h +++ b/include/structs/str_802C39C.h @@ -12,15 +12,10 @@ typedef struct unkStruct_802C39C /* 0x10 */ s16 clientSpecies; /* 0x12 */ s16 targetSpecies; /* 0x14 */ u8 targetItem; - /* 0x15 */ u8 fill15[0x2E - 0x15]; - /* 0x2E */ u8 rewardType; - u8 *unk30; - /* 0x34 */ u8 rewardItem; - u8 fill35[0x38 - 0x35]; - /* 0x38 */ u8 unk38[0x40 - 0x38]; - u8 mailTitleType; - u8 mailDescriptionType; - u8 mailMissionType; + /* 0x18 */ unkStruct_802F204 unk18; + /* 0x40 */ u8 mailTitleType; + /* 0x41 */ u8 mailDescriptionType; + /* 0x42 */ u8 mailMissionType; u8 unk43; u8 mailStatus; // mail status (suspend / take job / done) /* 0x48 */ u32 y; diff --git a/src/code_803B050.c b/src/code_803B050.c index 1cffa8feb..aaa517be0 100644 --- a/src/code_803B050.c +++ b/src/code_803B050.c @@ -1,10 +1,12 @@ #include "global.h" #include "globaldata.h" #include "structs/str_ground_script.h" +#include "code_803C1D0.h" #include "input.h" #include "memory.h" #include "menu_input.h" #include "music_util.h" +#include "pokemon_mail.h" #include "text_1.h" #include "text_2.h" #include "text_3.h" @@ -19,6 +21,8 @@ EWRAM_INIT struct unkStruct_203B3FC *gUnknown_203B3FC = NULL; extern WindowTemplate gUnknown_80E7F3C; + +// https://decomp.me/scratch/xx1GB - 91.35% matched (Seth) NAKED bool8 sub_803B050(void) { @@ -205,3 +209,200 @@ void sub_803B284(void) sub_80073E0(gUnknown_203B3FC->mh.m.menuWinId); } + +NAKED +unkStruct_803B344 *sub_803B344(u8 r0) +{ + asm_unified( + "\tadds r1, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _0803B358\n" + "\tadds r0, r1\n" + "\tbx lr\n" + "\t.align 2, 0\n" +"_0803B358: .4byte gUnknown_80E7F94"); +} + +u8 *sub_8096DD8(void); +u8 *sub_8096DE8(void); +static s32 sub_803B600(WonderMail *); +s32 sub_803B628(WonderMail *); +s32 sub_803B66C(WonderMail *); + +void sub_803B35C(WonderMail *mail,unkStruct_802C39C *param_2) +{ + u8 uVar2; + + sub_803C21C(mail, ¶m_2->unk18); + switch(mail->unk2) { + case '\x01': + param_2->mailTitleType = 0; + param_2->mailDescriptionType = 0; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk18.rewardType = 5; + break; + case '\x02': + param_2->mailTitleType = 1; + param_2->mailDescriptionType = 1; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk18.rewardType = 5; + break; + case '\x03': + param_2->mailTitleType = 2; + param_2->mailDescriptionType = 2; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk18.rewardType = 5; + break; + case '\x04': + param_2->mailTitleType = 3; + param_2->mailDescriptionType = 3; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk4C = sub_8096DD8(); + param_2->unk50 = sub_8096DE8(); + break; + case '\x05': + if (mail->missionType == MISSION_TYPE_RESCUE_CLIENT) { + param_2->mailTitleType = '\v'; + param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; + } + else { + param_2->mailTitleType = '\f'; + param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; + } + + param_2->mailDescriptionType = 4; + break; + case '\x06': + if (mail->missionType == 3) { + param_2->mailTitleType = '\v'; + param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; + } + else { + param_2->mailTitleType = '\f'; + param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; + } + + param_2->mailDescriptionType = 5; + break; + case '\a': + param_2->unk0[1] = sub_803B600(mail); + if (param_2->unk0[1] == -1) { + param_2->mailTitleType = 9; + } + else { + param_2->mailTitleType = 4; + } + + param_2->mailDescriptionType = 6; + param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; + break; + case '\b': + param_2->unk0[1] = sub_803B628(mail); + if (param_2->unk0[1] == -1) { + param_2->mailTitleType = 9; + } + else { + param_2->mailTitleType = 5; + } + param_2->mailDescriptionType = 7; + param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; + break; + case '\t': + param_2->unk0[1] = sub_803B66C(mail); + if (param_2->unk0[1] == -1) { + param_2->mailTitleType = 0xA; + } + else { + param_2->mailTitleType = 6; + } + + param_2->mailDescriptionType = '\b'; + param_2->mailMissionType = MISSION_TYPE_ESCORT_CLIENT; + break; + default: + switch(mail->missionType) + { + case 1: + param_2->mailTitleType = '\t'; + param_2->mailDescriptionType = '\r'; + param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; + break; + case 2: + param_2->mailTitleType = '\n'; + param_2->mailDescriptionType = '\x0e'; + param_2->mailMissionType = MISSION_TYPE_ESCORT_CLIENT; + break; + + case 3: + param_2->mailTitleType = '\v'; + param_2->mailDescriptionType = '\x0f'; + param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; + break; + case 4: + param_2->mailTitleType = '\f'; + param_2->mailDescriptionType = '\x10'; + param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; + break; + default: + param_2->mailTitleType = 8; + param_2->mailDescriptionType = 0xC; + param_2->mailMissionType = MISSION_TYPE_RESCUE_CLIENT; + break; + } + break; + + } + param_2->dungeonSeed = &mail->dungeonSeed; + param_2->playerName = NULL; + uVar2 = 0; + param_2->clientSpecies = mail->clientSpecies; + param_2->targetSpecies = mail->targetSpecies; + param_2->targetItem = mail->targetItem; + switch(mail->mailType) { + case 2: + case 3: + case 4: + case 5: + param_2->unk43 = 1; + param_2->mailStatus = 1; + break; + case 7: + param_2->unk43 = 0; + param_2->mailStatus = 3; + break; + case 6: + case 8: + case 9: + param_2->unk43 = 3; + param_2->mailStatus = 2; + break; + + default: + param_2->unk43 = uVar2; + param_2->mailStatus = uVar2; + break; + + + } + param_2->mail = mail; + return; +} + +static s32 sub_803B600(WonderMail *mail) +{ + s32 index; + const unkStruct_80E9920 *ptr; + + for(ptr = &gUnknown_80E9920[0], index = 0; index < ARRAY_COUNT_INT(gUnknown_80E9920); ptr++, index++) + { + if ((ptr->parentSpecies == mail->clientSpecies) && (ptr->childSpecies == mail->targetSpecies)) { + return index; + } + } + + return -1; +} diff --git a/src/pokemon_mail.c b/src/pokemon_mail.c index 1cf8c93c5..b720bb476 100644 --- a/src/pokemon_mail.c +++ b/src/pokemon_mail.c @@ -334,26 +334,26 @@ void CreateRescueDescription(unkStruct_802C39C *param_1) y += 12; PrintStringOnWindow(10, y, gRewardText, param_1->unk0[0], 0); - switch (param_1->rewardType) { + switch (param_1->unk18.rewardType) { case MONEY: - sprintfStatic(buf_1, gMissionRewardText[param_1->rewardType], param_1->unk30); + sprintfStatic(buf_1, gMissionRewardText[param_1->unk18.rewardType], param_1->unk18.moneyReward); PrintStringOnWindow(68, y, buf_1, param_1->unk0[0], 0); break; case MONEY_EXTRA: - sprintfStatic(buf_1, gMissionRewardText[param_1->rewardType], param_1->unk30); + sprintfStatic(buf_1, gMissionRewardText[param_1->unk18.rewardType], param_1->unk18.moneyReward); PrintStringOnWindow(68, y, buf_1, param_1->unk0[0], 0); break; case ITEM: // Item case ITEM_EXTRA: // Item + ? - BufferItemName(gFormatBuffer_Items[0], param_1->rewardItem, NULL); - sprintfStatic(buf_1, gMissionRewardText[param_1->rewardType], gFormatBuffer_Items[0]); + BufferItemName(gFormatBuffer_Items[0], param_1->unk18.itemRewards[0], NULL); + sprintfStatic(buf_1, gMissionRewardText[param_1->unk18.rewardType], gFormatBuffer_Items[0]); PrintStringOnWindow(68, y, buf_1, param_1->unk0[0], 0); break; case 4: // Friend Area - PrintStringOnWindow(68, y, gMissionRewardText[param_1->rewardType], param_1->unk0[0], 0); + PrintStringOnWindow(68, y, gMissionRewardText[param_1->unk18.rewardType], param_1->unk0[0], 0); break; default: - PrintStringOnWindow(68, y, gMissionRewardText[param_1->rewardType], param_1->unk0[0], 0); + PrintStringOnWindow(68, y, gMissionRewardText[param_1->unk18.rewardType], param_1->unk0[0], 0); break; } diff --git a/src/wonder_mail_4.c b/src/wonder_mail_4.c index 0faa7df88..350b6c012 100644 --- a/src/wonder_mail_4.c +++ b/src/wonder_mail_4.c @@ -212,7 +212,7 @@ void sub_803092C(void) local.clientSpecies = mail->clientSpecies; local.targetSpecies = mail->clientSpecies; local.targetItem = ITEM_NOTHING; - local.rewardType = MONEY1; + local.unk18.rewardType = MONEY1; switch(mail->mailType) { diff --git a/src/wonder_mail_5.c b/src/wonder_mail_5.c index 46b3f036f..467e54045 100644 --- a/src/wonder_mail_5.c +++ b/src/wonder_mail_5.c @@ -129,11 +129,11 @@ void sub_8030E48(void) stack.targetSpecies = mail->clientSpecies; stack.targetItem = ITEM_NOTHING; if (mail->item.id == ITEM_NOTHING) { - stack.rewardType = MONEY1; + stack.unk18.rewardType = MONEY1; } else { - stack.rewardType = ITEM; - stack.rewardItem = mail->item.id; + stack.unk18.rewardType = ITEM; + stack.unk18.itemRewards[0] = mail->item.id; } switch(mail->mailType) { From ed93854769119b6bfc226eac3d93a9c1808f0095 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 7 Jul 2025 22:46:41 -0700 Subject: [PATCH 3/6] move more data and split files accordingly --- data/data_80E7D40.s | 44 +------ include/code_803B050.h | 11 +- include/code_80958E8.h | 4 +- ld_script.ld | 6 + src/code_803B050.c | 239 +++++-------------------------------- src/code_803B050_unused1.c | 2 + src/code_803B050_unused2.c | 2 + src/code_803B050_unused3.c | 2 + src/code_803B344.c | 203 +++++++++++++++++++++++++++++++ src/textbox.c | 122 ++++++------------- 10 files changed, 292 insertions(+), 343 deletions(-) create mode 100644 src/code_803B050_unused1.c create mode 100644 src/code_803B050_unused2.c create mode 100644 src/code_803B050_unused3.c create mode 100644 src/code_803B344.c diff --git a/data/data_80E7D40.s b/data/data_80E7D40.s index 6ddf8c91d..edae342ed 100644 --- a/data/data_80E7D40.s +++ b/data/data_80E7D40.s @@ -1,47 +1,7 @@ .section .rodata -@ code_803B050 #1 - .align 2,0 - .string "pksdir0\0" - .global gUnknown_80E7F3C -gUnknown_80E7F3C: @ 80E7F3C - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x03, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 +@ code_803B344 - .global gUnknown_80E7F54 -gUnknown_80E7F54: @ 80E7F54 - .byte 0x00, 0x00, 0x00, 0x00 - .byte 0x06, 0x00, 0x00, 0x00 - .byte 0x02, 0x00, 0x02, 0x00 - .byte 0x18, 0x00, 0x11, 0x00 - .byte 0x11, 0x00, 0x00, 0x00 - .byte 0x00, 0x00, 0x00, 0x00 - - .global gUnknown_80E7F6C -gUnknown_80E7F6C: @ 80E7F6C - .string "Script\0" - -@ code_803B050 #2 - .align 2,0 - .string "pksdir0\0" - -@ code_803B050 #3 - .align 2,0 - .string "pksdir0\0" - -@ code_803B050 #4 - .align 2,0 - .string "pksdir0\0" - -@ code_803B050 #5 - .align 2,0 - .string "pksdir0\0" - - .align 2,0 .global gUnknown_80E7F94 gUnknown_80E7F94: @ 80E7F94 .macro st_80E7F94 a, b, c, e, f, g, h, i, j, k, m, n @@ -84,4 +44,4 @@ sUnknown_80E8070: @ 80E8070 sUnknown_80E8088: @ 80E8088 .string "SHOW TITLE00\0" - .align 2, 0 \ No newline at end of file + .align 2, 0 diff --git a/include/code_803B050.h b/include/code_803B050.h index bb2a48608..05dcabea2 100644 --- a/include/code_803B050.h +++ b/include/code_803B050.h @@ -3,8 +3,13 @@ #include "structs/str_802C39C.h" -// code_803B050.s -extern unkStruct_803B344 *sub_803B344(u8); -extern void sub_803B35C(WonderMail *, unkStruct_802C39C *); +bool8 sub_803B050(void); +void sub_803B100(s32 _id); +u32 sub_803B120(void); +s16 sub_803B168(void); +void sub_803B1BC(void); + +unkStruct_803B344 *sub_803B344(u8 r0); +void sub_803B35C(WonderMail *mail, unkStruct_802C39C *param_2); #endif // GUARD_CODE_803B050_H diff --git a/include/code_80958E8.h b/include/code_80958E8.h index 97b033703..199409aea 100644 --- a/include/code_80958E8.h +++ b/include/code_80958E8.h @@ -17,8 +17,8 @@ typedef struct subStruct_203B490 struct unkStruct_8096AF8 { bool8 unk0; - /* 0x2 */ u16 clientSpecies; - /* 0x4 */ u16 targetSpecies; + /* 0x2 */ s16 clientSpecies; + /* 0x4 */ s16 targetSpecies; }; // size: 0x32C? diff --git a/ld_script.ld b/ld_script.ld index ae8e072b2..57e66c1d6 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -187,6 +187,7 @@ SECTIONS { src/debug_menu3.o(.text); src/debug_menu4.o(.text); src/code_803B050.o(.text); + src/code_803B344.o(.text); asm/code_803B050.o(.text); src/pokemon_mail.o(.text); src/code_803C1B4.o(.text); @@ -563,6 +564,11 @@ SECTIONS { src/debug_menu2.o(.rodata); src/debug_menu3.o(.rodata); src/debug_menu4.o(.rodata); + src/code_803B050.o(.rodata); + src/code_803B050_unused1.o(.rodata); + src/code_803B050_unused2.o(.rodata); + src/code_803B050_unused3.o(.rodata); + src/code_803B344.o(.rodata); data/data_80E7D40.o(.rodata); src/pokemon_mail_pre.o(.rodata); src/pokemon_mail.o(.rodata); diff --git a/src/code_803B050.c b/src/code_803B050.c index aaa517be0..aaf0c0354 100644 --- a/src/code_803B050.c +++ b/src/code_803B050.c @@ -1,12 +1,10 @@ #include "global.h" #include "globaldata.h" #include "structs/str_ground_script.h" -#include "code_803C1D0.h" #include "input.h" #include "memory.h" #include "menu_input.h" #include "music_util.h" -#include "pokemon_mail.h" #include "text_1.h" #include "text_2.h" #include "text_3.h" @@ -19,8 +17,28 @@ struct unkStruct_203B3FC }; EWRAM_INIT struct unkStruct_203B3FC *gUnknown_203B3FC = NULL; -extern WindowTemplate gUnknown_80E7F3C; +const WindowTemplate gUnknown_80E7F3C = +{ + 0, + 0x03, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + NULL +}; +const WindowTemplate gUnknown_80E7F54 = +{ + 0, + 0x06, + 0x02, 0x02, + 0x18, 0x11, + 0x11, 0x00, + NULL +}; + +static void sub_803B204(void); +static void sub_803B284(void); // https://decomp.me/scratch/xx1GB - 91.35% matched (Seth) NAKED @@ -110,10 +128,8 @@ bool8 sub_803B050(void) "_0803B0FC: .4byte gFunctionScriptTable"); } -void sub_803B204(void); -void sub_803B284(void); - -void sub_803B100(s32 _id) { +void sub_803B100(s32 _id) +{ s32 id = (s16)_id; MoveMenuToEntryId(&gUnknown_203B3FC->mh.m.input, id); @@ -121,7 +137,7 @@ void sub_803B100(s32 _id) { sub_803B284(); } -s32 sub_803B120(void) +u32 sub_803B120(void) { switch(GetKeyPress(&gUnknown_203B3FC->mh.m.input)) { @@ -148,7 +164,7 @@ s16 sub_803B168(void) return gUnknown_203B3FC->unkA0[GET_CURRENT_MENU_ENTRY(gUnknown_203B3FC->mh.m.input)]; } -void sub_803B18C(u8 r0) +UNUSED static void sub_803B18C(u8 r0) { gUnknown_203B3FC->mh.m.input.totalEntriesCount = 0xE5; MenuUpdatePagesData(&gUnknown_203B3FC->mh.m.input); @@ -171,7 +187,7 @@ void sub_803B1BC(void) } } -void sub_803B204(void) +static void sub_803B204(void) { gUnknown_203B3FC->mh.header.count = 1; gUnknown_203B3FC->mh.header.currId = 0; @@ -182,9 +198,7 @@ void sub_803B204(void) UPDATE_MENU_WINDOW_HEIGHT(gUnknown_203B3FC->mh.m); } -extern u8 gUnknown_80E7F6C[]; - -void sub_803B284(void) +static void sub_803B284(void) { s32 x, y, i; s32 pageNum; @@ -192,7 +206,7 @@ void sub_803B284(void) CallPrepareTextbox_8008C54(gUnknown_203B3FC->mh.m.menuWinId); sub_80073B8(gUnknown_203B3FC->mh.m.menuWinId); - PrintStringOnWindow(0xA, 0, gUnknown_80E7F6C, gUnknown_203B3FC->mh.m.menuWinId, 0); + PrintStringOnWindow(0xA, 0, "Script", gUnknown_203B3FC->mh.m.menuWinId, 0); x = (gUnknown_203B3FC->mh.header.width * 8) - 2; pageNum = gUnknown_203B3FC->mh.m.input.currPage + 1; @@ -209,200 +223,3 @@ void sub_803B284(void) sub_80073E0(gUnknown_203B3FC->mh.m.menuWinId); } - -NAKED -unkStruct_803B344 *sub_803B344(u8 r0) -{ - asm_unified( - "\tadds r1, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r0, r1, 3\n" - "\tsubs r0, r1\n" - "\tlsls r0, 2\n" - "\tldr r1, _0803B358\n" - "\tadds r0, r1\n" - "\tbx lr\n" - "\t.align 2, 0\n" -"_0803B358: .4byte gUnknown_80E7F94"); -} - -u8 *sub_8096DD8(void); -u8 *sub_8096DE8(void); -static s32 sub_803B600(WonderMail *); -s32 sub_803B628(WonderMail *); -s32 sub_803B66C(WonderMail *); - -void sub_803B35C(WonderMail *mail,unkStruct_802C39C *param_2) -{ - u8 uVar2; - - sub_803C21C(mail, ¶m_2->unk18); - switch(mail->unk2) { - case '\x01': - param_2->mailTitleType = 0; - param_2->mailDescriptionType = 0; - param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; - param_2->unk18.rewardType = 5; - break; - case '\x02': - param_2->mailTitleType = 1; - param_2->mailDescriptionType = 1; - param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; - param_2->unk18.rewardType = 5; - break; - case '\x03': - param_2->mailTitleType = 2; - param_2->mailDescriptionType = 2; - param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; - param_2->unk18.rewardType = 5; - break; - case '\x04': - param_2->mailTitleType = 3; - param_2->mailDescriptionType = 3; - param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; - param_2->unk4C = sub_8096DD8(); - param_2->unk50 = sub_8096DE8(); - break; - case '\x05': - if (mail->missionType == MISSION_TYPE_RESCUE_CLIENT) { - param_2->mailTitleType = '\v'; - param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; - } - else { - param_2->mailTitleType = '\f'; - param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; - } - - param_2->mailDescriptionType = 4; - break; - case '\x06': - if (mail->missionType == 3) { - param_2->mailTitleType = '\v'; - param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; - } - else { - param_2->mailTitleType = '\f'; - param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; - } - - param_2->mailDescriptionType = 5; - break; - case '\a': - param_2->unk0[1] = sub_803B600(mail); - if (param_2->unk0[1] == -1) { - param_2->mailTitleType = 9; - } - else { - param_2->mailTitleType = 4; - } - - param_2->mailDescriptionType = 6; - param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; - break; - case '\b': - param_2->unk0[1] = sub_803B628(mail); - if (param_2->unk0[1] == -1) { - param_2->mailTitleType = 9; - } - else { - param_2->mailTitleType = 5; - } - param_2->mailDescriptionType = 7; - param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; - break; - case '\t': - param_2->unk0[1] = sub_803B66C(mail); - if (param_2->unk0[1] == -1) { - param_2->mailTitleType = 0xA; - } - else { - param_2->mailTitleType = 6; - } - - param_2->mailDescriptionType = '\b'; - param_2->mailMissionType = MISSION_TYPE_ESCORT_CLIENT; - break; - default: - switch(mail->missionType) - { - case 1: - param_2->mailTitleType = '\t'; - param_2->mailDescriptionType = '\r'; - param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; - break; - case 2: - param_2->mailTitleType = '\n'; - param_2->mailDescriptionType = '\x0e'; - param_2->mailMissionType = MISSION_TYPE_ESCORT_CLIENT; - break; - - case 3: - param_2->mailTitleType = '\v'; - param_2->mailDescriptionType = '\x0f'; - param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; - break; - case 4: - param_2->mailTitleType = '\f'; - param_2->mailDescriptionType = '\x10'; - param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; - break; - default: - param_2->mailTitleType = 8; - param_2->mailDescriptionType = 0xC; - param_2->mailMissionType = MISSION_TYPE_RESCUE_CLIENT; - break; - } - break; - - } - param_2->dungeonSeed = &mail->dungeonSeed; - param_2->playerName = NULL; - uVar2 = 0; - param_2->clientSpecies = mail->clientSpecies; - param_2->targetSpecies = mail->targetSpecies; - param_2->targetItem = mail->targetItem; - switch(mail->mailType) { - case 2: - case 3: - case 4: - case 5: - param_2->unk43 = 1; - param_2->mailStatus = 1; - break; - case 7: - param_2->unk43 = 0; - param_2->mailStatus = 3; - break; - case 6: - case 8: - case 9: - param_2->unk43 = 3; - param_2->mailStatus = 2; - break; - - default: - param_2->unk43 = uVar2; - param_2->mailStatus = uVar2; - break; - - - } - param_2->mail = mail; - return; -} - -static s32 sub_803B600(WonderMail *mail) -{ - s32 index; - const unkStruct_80E9920 *ptr; - - for(ptr = &gUnknown_80E9920[0], index = 0; index < ARRAY_COUNT_INT(gUnknown_80E9920); ptr++, index++) - { - if ((ptr->parentSpecies == mail->clientSpecies) && (ptr->childSpecies == mail->targetSpecies)) { - return index; - } - } - - return -1; -} diff --git a/src/code_803B050_unused1.c b/src/code_803B050_unused1.c new file mode 100644 index 000000000..0f93bd676 --- /dev/null +++ b/src/code_803B050_unused1.c @@ -0,0 +1,2 @@ +#include "global.h" +#include "globaldata.h" diff --git a/src/code_803B050_unused2.c b/src/code_803B050_unused2.c new file mode 100644 index 000000000..0f93bd676 --- /dev/null +++ b/src/code_803B050_unused2.c @@ -0,0 +1,2 @@ +#include "global.h" +#include "globaldata.h" diff --git a/src/code_803B050_unused3.c b/src/code_803B050_unused3.c new file mode 100644 index 000000000..0f93bd676 --- /dev/null +++ b/src/code_803B050_unused3.c @@ -0,0 +1,2 @@ +#include "global.h" +#include "globaldata.h" diff --git a/src/code_803B344.c b/src/code_803B344.c new file mode 100644 index 000000000..b55cdc64f --- /dev/null +++ b/src/code_803B344.c @@ -0,0 +1,203 @@ +#include "global.h" +#include "globaldata.h" +#include "structs/str_802C39C.h" +#include "code_803C1D0.h" +#include "code_80958E8.h" +#include "pokemon_mail.h" + +static s32 sub_803B600(WonderMail *); +extern s32 sub_803B628(WonderMail *); +extern s32 sub_803B66C(WonderMail *); + + +NAKED +unkStruct_803B344 *sub_803B344(u8 r0) +{ + asm_unified( + "\tadds r1, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _0803B358\n" + "\tadds r0, r1\n" + "\tbx lr\n" + "\t.align 2, 0\n" +"_0803B358: .4byte gUnknown_80E7F94"); +} + +void sub_803B35C(WonderMail *mail, unkStruct_802C39C *param_2) +{ + u8 uVar2; + + sub_803C21C(mail, ¶m_2->unk18); + switch(mail->unk2) { + case '\x01': + param_2->mailTitleType = 0; + param_2->mailDescriptionType = 0; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk18.rewardType = 5; + break; + case '\x02': + param_2->mailTitleType = 1; + param_2->mailDescriptionType = 1; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk18.rewardType = 5; + break; + case '\x03': + param_2->mailTitleType = 2; + param_2->mailDescriptionType = 2; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk18.rewardType = 5; + break; + case '\x04': + param_2->mailTitleType = 3; + param_2->mailDescriptionType = 3; + param_2->mailMissionType = MISSION_TYPE_SPECIAL_MISSION; + param_2->unk4C = sub_8096DD8(); + param_2->unk50 = sub_8096DE8(); + break; + case '\x05': + if (mail->missionType == MISSION_TYPE_RESCUE_CLIENT) { + param_2->mailTitleType = '\v'; + param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; + } + else { + param_2->mailTitleType = '\f'; + param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; + } + + param_2->mailDescriptionType = 4; + break; + case '\x06': + if (mail->missionType == 3) { + param_2->mailTitleType = '\v'; + param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; + } + else { + param_2->mailTitleType = '\f'; + param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; + } + + param_2->mailDescriptionType = 5; + break; + case '\a': + param_2->unk0[1] = sub_803B600(mail); + if (param_2->unk0[1] == -1) { + param_2->mailTitleType = 9; + } + else { + param_2->mailTitleType = 4; + } + + param_2->mailDescriptionType = 6; + param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; + break; + case '\b': + param_2->unk0[1] = sub_803B628(mail); + if (param_2->unk0[1] == -1) { + param_2->mailTitleType = 9; + } + else { + param_2->mailTitleType = 5; + } + param_2->mailDescriptionType = 7; + param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; + break; + case '\t': + param_2->unk0[1] = sub_803B66C(mail); + if (param_2->unk0[1] == -1) { + param_2->mailTitleType = 0xA; + } + else { + param_2->mailTitleType = 6; + } + + param_2->mailDescriptionType = '\b'; + param_2->mailMissionType = MISSION_TYPE_ESCORT_CLIENT; + break; + default: + switch(mail->missionType) + { + case 1: + param_2->mailTitleType = '\t'; + param_2->mailDescriptionType = '\r'; + param_2->mailMissionType = MISSION_TYPE_RESCUE_TARGET; + break; + case 2: + param_2->mailTitleType = '\n'; + param_2->mailDescriptionType = '\x0e'; + param_2->mailMissionType = MISSION_TYPE_ESCORT_CLIENT; + break; + + case 3: + param_2->mailTitleType = '\v'; + param_2->mailDescriptionType = '\x0f'; + param_2->mailMissionType = MISSION_TYPE_FIND_ITEM; + break; + case 4: + param_2->mailTitleType = '\f'; + param_2->mailDescriptionType = '\x10'; + param_2->mailMissionType = MISSION_TYPE_DELIVER_ITEM; + break; + default: + param_2->mailTitleType = 8; + param_2->mailDescriptionType = 0xC; + param_2->mailMissionType = MISSION_TYPE_RESCUE_CLIENT; + break; + } + break; + + } + param_2->dungeonSeed = &mail->dungeonSeed; + param_2->playerName = NULL; + uVar2 = 0; + param_2->clientSpecies = mail->clientSpecies; + param_2->targetSpecies = mail->targetSpecies; + param_2->targetItem = mail->targetItem; + switch(mail->mailType) { + case 2: + case 3: + case 4: + case 5: + param_2->unk43 = 1; + param_2->mailStatus = 1; + break; + case 7: + param_2->unk43 = 0; + param_2->mailStatus = 3; + break; + case 6: + case 8: + case 9: + param_2->unk43 = 3; + param_2->mailStatus = 2; + break; + + default: + param_2->unk43 = uVar2; + param_2->mailStatus = uVar2; + break; + + + } + param_2->mail = mail; + return; +} + +static s32 sub_803B600(WonderMail *mail) +{ + s32 index; + const unkStruct_80E9920 *ptr; + + for(ptr = &gUnknown_80E9920[0], index = 0; index < ARRAY_COUNT_INT(gUnknown_80E9920); ptr++, index++) + { + if ((ptr->parentSpecies == mail->clientSpecies) && (ptr->childSpecies == mail->targetSpecies)) { + return index; + } + } + + return -1; +} + diff --git a/src/textbox.c b/src/textbox.c index 37274caa5..6dde1907c 100644 --- a/src/textbox.c +++ b/src/textbox.c @@ -5,8 +5,17 @@ #include "constants/monster.h" #include "code_800558C.h" #include "code_800D090.h" +#include "code_801602C.h" +#include "code_801B60C.h" +#include "code_802DB28.h" +#include "code_80958E8.h" +#include "code_80A26CC.h" +#include "luminous_cave.h" +#include "makuhita_dojo1.h" +#include "makuhita_dojo2.h" #include "music_util.h" #include "code_801D014.h" +#include "code_803B050.h" #include "code_8099360.h" #include "credits2.h" #include "event_flag.h" @@ -24,9 +33,11 @@ #include "kecleon_bros4.h" #include "main_loops.h" #include "memory.h" +#include "palette_util.h" #include "personality_test1.h" #include "portrait_placement.h" #include "pokemon.h" +#include "save_write.h" #include "string_format.h" #include "text_1.h" #include "text_2.h" @@ -102,91 +113,36 @@ static IWRAM_INIT struct Textbox *sTextbox = { NULL }; extern bool8 sub_802FCF0(void); bool8 IsTextboxOpen_809B40C(struct TextboxText *); -extern s32 sub_803B168(void); -extern void sub_803B1BC(void); - -struct unkStruct_8096AF8 -{ - bool8 unk0; - /* 0x2 */ s16 clientSpecies; - /* 0x4 */ s16 targetSpecies; -}; extern void sub_80A8EC0(u8 *, u32); -Pokemon *sub_808D3BC(void); -Pokemon *sub_808D3F8(void); Pokemon *sub_80A8D54(s16); void sub_80A7DDC(s16 *, s16*); u8 IsStarterMonster(s16); s16 sub_80A8BFC(s32); void sub_809B028(const MenuItem *, s32 a1_, s32 a2, s32 a3, s32 a4_, const char *text); bool8 sub_809B18C(s32 *sp); -extern void sub_8099A34(s32 a0); -extern void sub_8099A48(s32 a0); extern void GroundScriptLock(s16 index, s32 r1); extern void GroundScriptLockJumpZero(s16 index); extern u8 sub_802B2D4(void); extern void sub_802B3B8(void); extern u32 sub_802B358(void); -void sub_8096AF8(struct unkStruct_8096AF8 *, u8 slotIndex, u8 dungeon); -u8 sub_802DB28(u8, u8); -void sub_8096BD0(); -void ScenarioCalc(s16 varId, s32 main, s32 sub); -void MakuhitaDojo_Delete(); -u32 HandleMakuhitaDojoState(); -s16 sub_802FED0(); -u8 sub_801FB50(); -s32 sub_80160D8(); -s32 sub_801A8AC(); -void sub_801A928(); -s32 sub_8016080(); -void CleanConfirmNameMenu(); -u32 CreateConfirmNameMenu(u32 mode, u8 *name); +void sub_8096BD0(void); bool8 DrawCredits(s32 creditsCategoryIndex, s32); u32 sub_8035574(); -void sub_803565C(); -u8 sub_8094D14(); -void sub_802465C(); -s32 sub_80246F0(); -s32 GetScriptVarValue(u8 *localVarBuf, s32 varId); -bool8 HasEvolutionCompleted(); -void GroundMap_ExecuteEvent(); -void SetScriptVarValue(u8 *localVarBuf, s32 varId, s32 val); -void CleanLuminousCave(); -u8 sub_80023E4(); -u8 CreateFriendListMenu(); -void PlayMenuSoundEffect(); +void sub_803565C(void); +u8 sub_8094D14(void); +void GroundMap_ExecuteEvent(s16, u32); bool8 sub_8015080(u8 *buffer, const MenuItem *menuItems); s32 sub_801516C(); void sub_80151A4(); s32 sub_8015198(); -u8 sub_80211AC(); -void sub_80213A0(); -u8 sub_802132C(); -u8 MakuhitaDojo_New(); -u8 sub_803B050(); -void sub_803B100(); -u8 sub_801B60C(); -u8 CreateKecleonBros(); -s16 sub_80A2654(s16); u8 sub_802F73C(); u8 sub_802F848(); s32 sub_802F8A0(); void sub_802F974(); s16 sub_802F90C(); -s16 sub_80A26B8(); -u8 sub_80302E8(); -s32 sub_80303AC(); -void sub_8030480(); -s16 sub_8030418(); -void PrepareSavePakWrite(); -u8 WriteSavePak(); -void FinishWriteSavePak(); -u8 CreateKangaskhanStorage(); -void sub_8011C28(); -u8 CreateHelperPelipperMenu(); -u8 CreateWigglytuffShop(); -u8 sub_8099328(); +void sub_8011C28(u32); +bool8 CreateHelperPelipperMenu(s16); u32 sub_802E90C(); void sub_802E918(); u32 sub_80282DC(u8 *r0); @@ -198,27 +154,15 @@ extern u8 sub_802DFB0(void); extern void CleanThankYouMailPelipper(void); extern void CleanHelperPelipper(void); extern void sub_802E06C(void); -extern void sub_802DC00(void); -extern void sub_801B72C(void); extern u32 ThankYouMailPelipperCallback(void); extern u32 HelperPelipperCallback(void); extern u32 sub_802E890(void); extern u32 sub_802DFD8(void); -extern u32 sub_802DBD4(void); -extern u32 sub_803B120(void); -extern u32 sub_801B6AC(void); -u8 *sub_809B428(u8 *a0, s32 a1, u8 *a2); -bool8 sub_809B648(void); void sub_809B57C(void); bool8 sub_809B1D4(s32 a0, u32 kind, s32 a2, u8 *a3); -void sub_809C39C(void); -void sub_809C3D8(void); -void sub_809C504(void); -void sub_809C464(void); -void sub_809C478(void); -void sub_809C414(void); -void sub_809C4B0(void); -void sub_809C550(void); + +u8 *sub_809B428(u8 *a0, s32 a1, u8 *a2); +bool8 sub_809B648(void); #define TEXTBOX_FLAG_UNUSED_x2 0x2 // Unused, but set for almost all flag sets #define TEXTBOX_FLAG_INSTANT_TEXT 0x20 @@ -305,6 +249,14 @@ static void ResetAllTextboxPortraits(void); static bool8 ScriptPrintTextInternal(struct TextboxText *ptr, u32 flags_, s32 a2_, const char *text); static u32 SetTextboxType(u32 textboxType, bool8 unused); static void ResetTextbox(void); +static void sub_809C39C(void); +static void sub_809C3D8(void); +static void sub_809C504(void); +static void sub_809C464(void); +static void sub_809C478(void); +static void sub_809C414(void); +static void sub_809C4B0(void); +static void sub_809C550(void); void TextboxInit(void) { @@ -1980,7 +1932,7 @@ bool8 sub_809B648(void) return 0; } -void sub_809C39C(void) +static void sub_809C39C(void) { sTextbox->unk430 = sub_801D178(); if(sTextbox->unk430 == 3) @@ -1988,7 +1940,7 @@ void sub_809C39C(void) sub_801D1E0(); } -void sub_809C3D8(void) +static void sub_809C3D8(void) { sTextbox->unk430 = sub_801D178(); if(sTextbox->unk430 == 3) @@ -1996,7 +1948,7 @@ void sub_809C3D8(void) sub_801D1E0(); } -void sub_809C414(void) +static void sub_809C414(void) { u8 val; @@ -2015,14 +1967,14 @@ void sub_809C414(void) } -void sub_809C464(void) +static void sub_809C464(void) { DeleteTestTracker(); sub_8001064(); sub_809965C(); } -void sub_809C478(void) +static void sub_809C478(void) { s32 temp; s32 temp1; @@ -2040,13 +1992,13 @@ void sub_809C478(void) sub_80993C0(0); } -void sub_809C4B0(void) +static void sub_809C4B0(void) { s16 scriptIndex_s16; s32 scriptIndex = -1; if (sTextbox->unk430 == 0) { - scriptIndex = (s16) sub_803B168(); + scriptIndex = sub_803B168(); ASM_MATCH_TRICK(sTextbox->unk5A4); scriptIndex_s16 = scriptIndex; @@ -2064,7 +2016,7 @@ void sub_809C4B0(void) GroundMap_ExecuteEvent(scriptIndex, 0); } -void sub_809C504(void) +static void sub_809C504(void) { u8 temp; @@ -2080,7 +2032,7 @@ void sub_809C504(void) sub_80282FC(); } -void sub_809C550(void) +static void sub_809C550(void) { u32 ret; s32 val; From 7acae3ac35342c83b642331c82b532d91af59efc Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Mon, 14 Jul 2025 21:52:32 -0700 Subject: [PATCH 4/6] fix: sub_803B344 struct is wrong.. and now it's matching --- src/code_803B344.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/code_803B344.c b/src/code_803B344.c index b55cdc64f..2ab7baba2 100644 --- a/src/code_803B344.c +++ b/src/code_803B344.c @@ -10,21 +10,21 @@ extern s32 sub_803B628(WonderMail *); extern s32 sub_803B66C(WonderMail *); -NAKED -unkStruct_803B344 *sub_803B344(u8 r0) +typedef struct unkStruct_80E7F94 { - asm_unified( - "\tadds r1, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r1, 24\n" - "\tlsls r0, r1, 3\n" - "\tsubs r0, r1\n" - "\tlsls r0, 2\n" - "\tldr r1, _0803B358\n" - "\tadds r0, r1\n" - "\tbx lr\n" - "\t.align 2, 0\n" -"_0803B358: .4byte gUnknown_80E7F94"); + /* 0x0 */ WonderMail mail; + u8 *unk14; + u8 *unk18; +} unkStruct_80E7F94; + +extern unkStruct_80E7F94 gUnknown_80E7F94[5]; + +// TODO: unkStruct_803B344 isn't what we thought it is +unkStruct_80E7F94 *sub_803B344(s32 _r0) +{ + u32 r0 = (u8)_r0; + + return &gUnknown_80E7F94[r0]; } void sub_803B35C(WonderMail *mail, unkStruct_802C39C *param_2) From 81f28e81e642952be337aa35b6685dac35eb8e6a Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 17 Jul 2025 19:16:40 -0700 Subject: [PATCH 5/6] thanks to @DizzyEggg for matching the two funcs --- asm/code_803B050.s | 90 ------------------------------------------ include/pokemon_mail.h | 4 +- ld_script.ld | 1 - src/code_803B344.c | 31 +++++++++++++++ src/code_803C1B4.c | 10 ++--- 5 files changed, 38 insertions(+), 98 deletions(-) delete mode 100644 asm/code_803B050.s diff --git a/asm/code_803B050.s b/asm/code_803B050.s deleted file mode 100644 index 7b92d5155..000000000 --- a/asm/code_803B050.s +++ /dev/null @@ -1,90 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_803B628 -sub_803B628: - push {r4,r5,lr} - adds r4, r0, 0 - ldr r2, _0803B654 - movs r3, 0 -_0803B630: - ldr r1, [r2] - ldr r0, [r4, 0xC] - cmp r1, r0 - beq _0803B650 - movs r0, 0x2 - ldrsh r1, [r2, r0] - movs r5, 0xC - ldrsh r0, [r4, r5] - cmp r1, r0 - bne _0803B658 - movs r0, 0 - ldrsh r1, [r2, r0] - movs r5, 0xE - ldrsh r0, [r4, r5] - cmp r1, r0 - bne _0803B658 -_0803B650: - adds r0, r3, 0 - b _0803B664 - .align 2, 0 -_0803B654: .4byte gUnknown_80E9F8C -_0803B658: - adds r2, 0xC - adds r3, 0x1 - cmp r3, 0x2C - ble _0803B630 - movs r0, 0x1 - negs r0, r0 -_0803B664: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_803B628 - - thumb_func_start sub_803B66C -sub_803B66C: - push {r4,r5,lr} - adds r4, r0, 0 - ldr r2, _0803B698 - movs r3, 0 -_0803B674: - ldr r1, [r2] - ldr r0, [r4, 0xC] - cmp r1, r0 - beq _0803B694 - movs r0, 0x2 - ldrsh r1, [r2, r0] - movs r5, 0xC - ldrsh r0, [r4, r5] - cmp r1, r0 - bne _0803B69C - movs r0, 0 - ldrsh r1, [r2, r0] - movs r5, 0xE - ldrsh r0, [r4, r5] - cmp r1, r0 - bne _0803B69C -_0803B694: - adds r0, r3, 0 - b _0803B6A8 - .align 2, 0 -_0803B698: .4byte gUnknown_80E8168 -_0803B69C: - adds r2, 0x4 - adds r3, 0x1 - cmp r3, 0x5 - ble _0803B674 - movs r0, 0x1 - negs r0, r0 -_0803B6A8: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_803B66C - - .align 2,0 diff --git a/include/pokemon_mail.h b/include/pokemon_mail.h index 4595b6763..e7ff98c61 100644 --- a/include/pokemon_mail.h +++ b/include/pokemon_mail.h @@ -2,6 +2,7 @@ #define POKEMON_MAIL_H #include "structs/str_802C39C.h" +#include "pokemon_mail_pre.h" // size: 0x8 typedef struct PokemonMail @@ -21,8 +22,7 @@ typedef struct unkStruct_80E9920 // size: 0xC typedef struct unkStruct_80E9F8C { - /* 0x0 */ s16 speciesA; - /* 0x2 */ s16 speciesB; + /* 0x0 */ struct PokemonPair species; /* 0x4 */ const u8 *headline; /* 0x8 */ const u8 *text; } unkStruct_80E9F8C; diff --git a/ld_script.ld b/ld_script.ld index 57e66c1d6..ec8afa19d 100755 --- a/ld_script.ld +++ b/ld_script.ld @@ -188,7 +188,6 @@ SECTIONS { src/debug_menu4.o(.text); src/code_803B050.o(.text); src/code_803B344.o(.text); - asm/code_803B050.o(.text); src/pokemon_mail.o(.text); src/code_803C1B4.o(.text); src/personality_test1.o(.text); diff --git a/src/code_803B344.c b/src/code_803B344.c index 2ab7baba2..ab7e3ea01 100644 --- a/src/code_803B344.c +++ b/src/code_803B344.c @@ -201,3 +201,34 @@ static s32 sub_803B600(WonderMail *mail) return -1; } + +s32 sub_803B628(WonderMail *param_1) +{ + const unkStruct_80E9F8C *ptr; + int i; + + ptr = &gUnknown_80E9F8C[0]; + for (i = 0; i < ARRAY_COUNT_INT(gUnknown_80E9F8C); ptr++, i++) { + if (ptr->species.speciesA == param_1->clientSpecies && ptr->species.speciesB == param_1->targetSpecies) + return i; + if (ptr->species.speciesB == param_1->clientSpecies && ptr->species.speciesA == param_1->targetSpecies) + return i; + } + return -1; + +} + +s32 sub_803B66C(WonderMail *param_1) +{ + const struct PokemonPair *ptr; + int i; + + ptr = &gUnknown_80E8168[0]; + for (i = 0; i < ARRAY_COUNT_INT(gUnknown_80E8168); ptr++, i++) { + if (ptr->speciesA == param_1->clientSpecies && ptr->speciesB == param_1->targetSpecies) + return i; + if (ptr->speciesB == param_1->clientSpecies && ptr->speciesA == param_1->targetSpecies) + return i; + } + return -1; +} diff --git a/src/code_803C1B4.c b/src/code_803C1B4.c index 1b97489bb..a24dbb409 100644 --- a/src/code_803C1B4.c +++ b/src/code_803C1B4.c @@ -176,7 +176,7 @@ bool8 sub_803C45C(WonderMail *mail) counter = 0; ptr = &gUnknown_80E9F8C[0]; for (id = 0; id < ARRAY_COUNT_INT(gUnknown_80E9F8C); ptr++, id++) { - if (sub_803C110(ptr->speciesA) && sub_803C110(ptr->speciesB)) { + if (sub_803C110(ptr->species.speciesA) && sub_803C110(ptr->species.speciesB)) { stack[counter++] = id; } } @@ -186,12 +186,12 @@ bool8 sub_803C45C(WonderMail *mail) ptr = &gUnknown_80E9F8C[id]; if ((Rand32Bit() & 0x10)) { - mail->clientSpecies = ptr->speciesA; - mail->targetSpecies = ptr->speciesB; + mail->clientSpecies = ptr->species.speciesA; + mail->targetSpecies = ptr->species.speciesB; } else { - mail->clientSpecies = ptr->speciesB; - mail->targetSpecies = ptr->speciesA; + mail->clientSpecies = ptr->species.speciesB; + mail->targetSpecies = ptr->species.speciesA; } mail->unk2 = 8; From 7c129f8037bc1660dd56d2b260ad8df84c438b71 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Thu, 17 Jul 2025 20:09:18 -0700 Subject: [PATCH 6/6] More more data to src --- data/data_80E7D40.s | 23 ++++++----------------- src/code_803B344.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/data/data_80E7D40.s b/data/data_80E7D40.s index edae342ed..de265c30b 100644 --- a/data/data_80E7D40.s +++ b/data/data_80E7D40.s @@ -2,46 +2,35 @@ @ code_803B344 - .global gUnknown_80E7F94 -gUnknown_80E7F94: @ 80E7F94 -.macro st_80E7F94 a, b, c, e, f, g, h, i, j, k, m, n - .byte \a, \b, \c - .align 2, 0 - .4byte \e, \f - .2byte \g, \h - .byte \i, \j, \k - .align 2, 0 - .4byte \m, \n -.endm - st_80E7F94 5, 1, 4, 0xC2B, 0x123456, 0x19, 0x182, 0x38, 8, 0x3A, sUnknown_80E8088, sUnknown_80E8070 - st_80E7F94 5, 1, 4, 0x112C, 0x123456, 4, 0x115, 0x38, 8, 0x3A, sUnknown_80E8060, sUnknown_80E8048 - st_80E7F94 5, 1, 4, 0x112D, 0x123456, 1, 0x118, 0x38, 8, 0x3A, sUnknown_80E8038, sUnknown_80E8020 - st_80E7F94 5, 1, 0, 0x1B2E, 0x123456, 7, 0x9B, 0x38, 8, 0x3A, 0, 0 - st_80E7F94 5, 1, 0, 0x903, 0x123456, 0x98, 0x9E, 0x38, 8, 0x3A, 0, 0 - + .global sUnknown_80E8020 sUnknown_80E8020: @ 80E8020 .string "SHOW RESCUE 00\n" .string " EVENT02\0" .align 2, 0 + .global sUnknown_80E8038 sUnknown_80E8038: @ 80E8038 .string "SHOW TITLE02\0" .align 2, 0 + .global sUnknown_80E8048 sUnknown_80E8048: @ 80E8048 .string "SHOW RESCUE 00\n" .string " EVENT01\0" .align 2, 0 + .global sUnknown_80E8060 sUnknown_80E8060: @ 80E8060 .string "SHOW TITLE01\0" .align 2, 0 + .global sUnknown_80E8070 sUnknown_80E8070: @ 80E8070 .string "SHOW RESCUE 00\n" .string " EVENT00\0" .align 2, 0 + .global sUnknown_80E8088 sUnknown_80E8088: @ 80E8088 .string "SHOW TITLE00\0" .align 2, 0 diff --git a/src/code_803B344.c b/src/code_803B344.c index ab7e3ea01..7bb814da8 100644 --- a/src/code_803B344.c +++ b/src/code_803B344.c @@ -1,5 +1,10 @@ #include "global.h" #include "globaldata.h" +#include "constants/dungeon.h" +#include "constants/friend_area.h" +#include "constants/item.h" +#include "constants/monster.h" +#include "constants/wonder_mail.h" #include "structs/str_802C39C.h" #include "code_803C1D0.h" #include "code_80958E8.h" @@ -17,10 +22,44 @@ typedef struct unkStruct_80E7F94 u8 *unk18; } unkStruct_80E7F94; -extern unkStruct_80E7F94 gUnknown_80E7F94[5]; +extern u8 sUnknown_80E8020[]; +extern u8 sUnknown_80E8038[]; +extern u8 sUnknown_80E8048[]; +extern u8 sUnknown_80E8060[]; +extern u8 sUnknown_80E8070[]; +extern u8 sUnknown_80E8088[]; + +const unkStruct_80E7F94 gUnknown_80E7F94[5] = { + + { + {0x5, MISSION_TYPE_FIND_ITEM, 0x4, DUNGEON_ODDITY_CAVE, 0xC, 0x123456, MONSTER_PIKACHU, MONSTER_CHIMECHO, ITEM_SITRUS_BERRY, ITEM1_EXTRA, ITEM_REVIVER_SEED, FRIEND_AREA_NONE}, + sUnknown_80E8088, + sUnknown_80E8070, + }, + { + {0x5, MISSION_TYPE_FIND_ITEM, 0x4, DUNGEON_REMAINS_ISLAND, 0x11, 0x123456,MONSTER_CHARMANDER, MONSTER_TREECKO, ITEM_SITRUS_BERRY, ITEM1_EXTRA, ITEM_REVIVER_SEED, FRIEND_AREA_NONE}, + sUnknown_80E8060, + sUnknown_80E8048, + }, + { + {0x5, MISSION_TYPE_FIND_ITEM, 0x4, DUNGEON_MARVELOUS_SEA, 0x11, 0x123456,MONSTER_BULBASAUR, MONSTER_TORCHIC, ITEM_SITRUS_BERRY, ITEM1_EXTRA, ITEM_REVIVER_SEED, FRIEND_AREA_NONE}, + sUnknown_80E8038, + sUnknown_80E8020, + }, + { + {0x5, MISSION_TYPE_FIND_ITEM, 0x0, DUNGEON_FANTASY_STRAIT, 0x1B, 0x123456, MONSTER_SQUIRTLE, MONSTER_CYNDAQUIL, ITEM_SITRUS_BERRY, ITEM1_EXTRA, ITEM_REVIVER_SEED, FRIEND_AREA_NONE}, + NULL, + NULL, + }, + { + {0x5, MISSION_TYPE_FIND_ITEM, 0x0, DUNGEON_SINISTER_WOODS, 0x9, 0x123456, MONSTER_CHIKORITA, MONSTER_TOTODILE, ITEM_SITRUS_BERRY, ITEM1_EXTRA, ITEM_REVIVER_SEED, FRIEND_AREA_NONE}, + NULL, + NULL, + }, +}; // TODO: unkStruct_803B344 isn't what we thought it is -unkStruct_80E7F94 *sub_803B344(s32 _r0) +const unkStruct_80E7F94 *sub_803B344(s32 _r0) { u32 r0 = (u8)_r0;