From 22fec43f1812cb863ad699b357bd593222ae140c Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Sat, 3 Apr 2021 20:44:48 -0500 Subject: More menu work (#33) * split adventure log menu out and decompile * add most adventure log matchings w/ 2 nonmatchings and move some relevant data * more work on other menus * fully decomp debug stuff around 203B3F0 * more debug menu work * fix CreatePartnerSelectionMenu nonmatch * move more data and clean some data up --- src/adventure_log.c | 425 ++++++++++++++++++++++++++++++++++++++ src/adventure_log_menu.c | 40 ++++ src/data/formatted_type_names.h | 18 ++ src/debug_menu_mid.c | 439 ++++++++++++++++++++++++++++++++++++++++ src/load_screen.c | 22 ++ src/main_menu.c | 4 +- src/main_menu_1.c | 22 -- src/main_menu_mid.c | 4 +- src/other_menus.c | 413 +++++++++++++++++++++++++++++++++++++ src/personality_test.c | 112 +--------- src/text_util.c | 44 +++- src/unk_menu_203B360.c | 104 ++++++++++ src/unk_menu_203B360_1.c | 36 ++++ src/unk_menu_203B364.c | 85 ++++++++ 14 files changed, 1639 insertions(+), 129 deletions(-) create mode 100644 src/adventure_log.c create mode 100644 src/adventure_log_menu.c create mode 100644 src/data/formatted_type_names.h create mode 100644 src/debug_menu_mid.c create mode 100644 src/load_screen.c delete mode 100644 src/main_menu_1.c create mode 100644 src/other_menus.c create mode 100644 src/unk_menu_203B360.c create mode 100644 src/unk_menu_203B360_1.c create mode 100644 src/unk_menu_203B364.c (limited to 'src') diff --git a/src/adventure_log.c b/src/adventure_log.c new file mode 100644 index 0000000..2a02840 --- /dev/null +++ b/src/adventure_log.c @@ -0,0 +1,425 @@ +#include "global.h" +#include "input.h" +#include "gba/io_reg.h" + +struct unkData +{ + u8 unk0[14]; + u16 unkD; + u16 unk10; + u16 unk12; + u8 *unk14; +}; + +struct AdventureLog +{ + // size: 0xA0 + u8 fill0[0x1A]; + /* 0x1A */ s16 unk1A; + /* 0x1C */ s16 unk1C; + /* 0x1E */ s16 currPage; + u16 unk20; + u8 fill22[0x34 - 0x22]; + u32 unk34; + struct unkData *unk38; + struct unkData unk3C[3]; + u8 fill84[0x9C - 0x84]; + u8 unk9C; + /* 0x9D */ u8 currPage_u8; + u8 unk9E; + u8 unk9F; +}; + +extern struct AdventureLog *gAdventureLog; +extern struct unkData gUnknown_80E2008; +extern struct unkData gUnknown_80E1FF0; + +// Adventure Log Text +const u8 gAdventureLogHeaderText[] = "Adventure Log"; +const u8 gUnknown_80E2030[] = "~95~95~95~95~95~95~95~95~95~95~95~95~95~95~95 "; // string of ??????? +const u8 fill_adven[] = "pksdir0"; + +extern void *MemoryAlloc(u32, u32); +extern void MemoryFree(void *); +extern void sub_8006518(struct unkData *); +extern void sub_800641C(void *, u32, u32); +extern void sub_8032084(); +extern void DisplayAdventureLog(); +extern void sub_8013818(void *, u32, u32, u32); +extern u8 sub_8013938(void *); +extern void sub_8013660(void *); +extern void PlayMenuSoundEffect(u32); +extern u32 GetKeyPress(void *); +extern u8 sub_8097710(u8); + +extern s16 sub_80978B8(); +extern s16 sub_8097880(); +extern s16 sub_8097838(); +extern s16 sub_8097870(); +extern s32 sub_80977B8(); +extern s32 sub_80977F8(); +extern void xxx_call_draw_string(s32, u32, u32 *, u32, u32); +extern u32 gUnknown_202DE30; + +u32 CreateAdventureLogScreen(u32 param_1) +{ + gAdventureLog = MemoryAlloc(0xa0,8); + gAdventureLog->unk34 = param_1; + gAdventureLog->unk38 = &gAdventureLog->unk3C[param_1]; + sub_8006518(gAdventureLog->unk3C); + gAdventureLog->unk3C[gAdventureLog->unk34] = gUnknown_80E2008; + gAdventureLog->unk38->unk14 = &gAdventureLog->unk9C; + + ResetUnusedInputStruct(); + sub_800641C(gAdventureLog->unk3C,1,1); + sub_8013818(gAdventureLog,0x20,8,param_1); + sub_8032084(); + DisplayAdventureLog(); + return 1; +} + +u32 HandleAdventureLogInput(u8 param_1) +{ + if (param_1 == 0) { + sub_8013660(gAdventureLog); + return 0; + } + else { + switch(GetKeyPress(gAdventureLog)) + { + case B_BUTTON: + PlayMenuSoundEffect(1); + return 2; + case A_BUTTON: + PlayMenuSoundEffect(0); + return 3; + default: + if (sub_8013938(gAdventureLog) != '\0') { + sub_8032084(); + DisplayAdventureLog(); + return 1; + } + else { + return 0; + } + } + } +} + +void CleanAdventureLogScreen(void) +{ + if (gAdventureLog != NULL) { + gAdventureLog->unk3C[gAdventureLog->unk34] = gUnknown_80E1FF0; + ResetUnusedInputStruct(); + sub_800641C(gAdventureLog->unk3C,1,1); + MemoryFree(gAdventureLog); + gAdventureLog = 0; + } +} + + +#ifdef NONMATCHING +void sub_8032084(void) +{ + u32 sVar2; + + gAdventureLog->unk9C = gAdventureLog->unk20; + gAdventureLog->currPage_u8 = gAdventureLog->currPage; + gAdventureLog->unk9E = 0xb; + gAdventureLog->unk9F = 0; + // So a sign extend.. + sVar2 = sub_80095E4(gAdventureLog->unk1A,0xc) + 2 << 0x10; + // TODO needs asr r3, r0, r16 + // and lsr r0, r0, r16 + gAdventureLog->unk3C[gAdventureLog->unk34].unkD = sVar2; + // Good past here except regs for this store + gAdventureLog->unk3C[gAdventureLog->unk34].unk10 = sVar2 + 2; + ResetUnusedInputStruct(); + sub_800641C(gAdventureLog->unk3C,1,1); +} +#else +NAKED +void sub_8032084(void) +{ + asm_unified("\tpush {r4,lr}\n" + "\tldr r4, _080320F4\n" + "\tldr r0, [r4]\n" + "\tldrh r1, [r0, 0x20]\n" + "\tadds r0, 0x9C\n" + "\tmovs r2, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tldrh r1, [r0, 0x1E]\n" + "\tadds r0, 0x9D\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x9E\n" + "\tmovs r1, 0xB\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x9F\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r4]\n" + "\tmovs r1, 0x1A\n" + "\tldrsh r0, [r0, r1]\n" + "\tmovs r1, 0xC\n" + "\tbl sub_80095E4\n" + "\tadds r0, 0x2\n" + "\tlsls r0, 16\n" + "\tldr r2, [r4]\n" + "\tldr r3, [r2, 0x34]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x4A\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x34]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x4C\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x3C\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_080320F4: .4byte gAdventureLog"); +} +#endif + +// Uses 1 too many regs +#ifdef NONMATCHING +void DisplayAdventureLog(void) +{ + s32 counter; + s32 iVar5; + u32 uVar6; + u8 temp; + + sub_8008C54(gAdventureLog->unk34); + sub_80073B8(gAdventureLog->unk34); + iVar5 = gAdventureLog->currPage * 8; + iVar5 += 10; + // Draw Header + xxx_call_draw_string(iVar5, 0, &gAdventureLogHeaderText, gAdventureLog->unk34, 0); + iVar5 += 4; + iVar5 += gAdventureLog->unk9E * 8; + // Draw Page # + sub_8012BC4(iVar5, 0, gAdventureLog->currPage + 1, 1, 7, gAdventureLog->unk34); + counter = 0; + do { + uVar6 = gAdventureLog->currPage * gAdventureLog->unk1C + counter; + temp = uVar6; // Having another var in middle gets close (does a u8 cast) + if(sub_8097710(temp) != 0){ + switch(temp) { + case 0xc: + gUnknown_202DE30 = sub_80978B8(); + break; + case 7: + gUnknown_202DE30 = sub_8097880(); + break; + case 0xb: + gUnknown_202DE30 = sub_8097838(); + break; + case 8: + gUnknown_202DE30 = sub_80977B8(); + break; + case 9: + gUnknown_202DE30 = sub_80977F8(); + break; + case 10: + gUnknown_202DE30 = sub_8097870(); + break; + default: + break; + } + sub_8014FF0(8, sub_8013800(gAdventureLog, counter), GetAdventureLogLine(uVar6), gAdventureLog->unk34, 0); + } + else + { + // Draw the ?????????? across the row + xxx_call_draw_string(8, sub_8013800(gAdventureLog, counter), &gUnknown_80E2030, gAdventureLog->unk34, 0); + } + counter++; + } while(counter < gAdventureLog->unk1A); + sub_80073E0(gAdventureLog->unk34); +} +#else +NAKED +void DisplayAdventureLog(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tsub sp, 0x8\n" + "\tldr r5, _08032158\n" + "\tldr r0, [r5]\n" + "\tldr r0, [r0, 0x34]\n" + "\tbl sub_8008C54\n" + "\tldr r0, [r5]\n" + "\tldr r0, [r0, 0x34]\n" + "\tbl sub_80073B8\n" + "\tldr r0, [r5]\n" + "\tmovs r1, 0x1E\n" + "\tldrsh r4, [r0, r1]\n" + "\tlsls r4, 3\n" + "\tadds r6, r4, 0\n" + "\tadds r6, 0xA\n" + "\tldr r2, _0803215C\n" + "\tldr r3, [r0, 0x34]\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp]\n" + "\tadds r0, r6, 0\n" + "\tmovs r1, 0\n" + "\tbl xxx_call_draw_string\n" + "\tadds r4, 0x4\n" + "\tldr r1, [r5]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x9E\n" + "\tldrb r0, [r0]\n" + "\tlsls r0, 3\n" + "\tadds r6, r4, r0\n" + "\tmovs r0, 0x1E\n" + "\tldrsh r2, [r1, r0]\n" + "\tadds r2, 0x1\n" + "\tmovs r0, 0x7\n" + "\tstr r0, [sp]\n" + "\tldr r0, [r1, 0x34]\n" + "\tstr r0, [sp, 0x4]\n" + "\tadds r0, r6, 0\n" + "\tmovs r1, 0\n" + "\tmovs r3, 0x1\n" + "\tbl sub_8012BC4\n" + "\tmovs r7, 0\n" + "\tldr r0, [r5]\n" + "\tb _0803223A\n" + "\t.align 2, 0\n" +"_08032158: .4byte gAdventureLog\n" +"_0803215C: .4byte gAdventureLogHeaderText\n" +"_08032160:\n" + "\tldr r5, _08032194\n" + "\tldr r0, [r5]\n" + "\tmovs r2, 0x1E\n" + "\tldrsh r1, [r0, r2]\n" + "\tmovs r2, 0x1C\n" + "\tldrsh r0, [r0, r2]\n" + "\tmuls r0, r1\n" + "\tadds r0, r7\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tadds r0, r6, 0\n" + "\tbl sub_8097710\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tcmp r4, 0\n" + "\tbeq _0803221C\n" + "\tsubs r0, r6, 0x7\n" + "\tcmp r0, 0x5\n" + "\tbhi _080321EC\n" + "\tlsls r0, 2\n" + "\tldr r1, _08032198\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" +"_08032194: .4byte gAdventureLog\n" +"_08032198: .4byte _0803219C\n" + "\t.align 2, 0\n" +"_0803219C:\n" + "\t.4byte _080321BA\n" + "\t.4byte _080321C6\n" + "\t.4byte _080321D4\n" + "\t.4byte _080321E0\n" + "\t.4byte _080321C0\n" + "\t.4byte _080321B4\n" +"_080321B4:\n" + "\tbl sub_80978B8\n" + "\tb _080321E4\n" +"_080321BA:\n" + "\tbl sub_8097880\n" + "\tb _080321E4\n" +"_080321C0:\n" + "\tbl sub_8097838\n" + "\tb _080321E4\n" +"_080321C6:\n" + "\tbl sub_80977B8\n" + "\tldr r1, _080321D0\n" + "\tb _080321EA\n" + "\t.align 2, 0\n" +"_080321D0: .4byte gUnknown_202DE30\n" +"_080321D4:\n" + "\tbl sub_80977F8\n" + "\tldr r1, _080321DC\n" + "\tb _080321EA\n" + "\t.align 2, 0\n" +"_080321DC: .4byte gUnknown_202DE30\n" +"_080321E0:\n" + "\tbl sub_8097870\n" +"_080321E4:\n" + "\tldr r1, _08032214\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" +"_080321EA:\n" + "\tstr r0, [r1]\n" +"_080321EC:\n" + "\tldr r4, _08032218\n" + "\tldr r0, [r4]\n" + "\tadds r1, r7, 0\n" + "\tbl sub_8013800\n" + "\tadds r5, r0, 0\n" + "\tadds r0, r6, 0\n" + "\tbl GetAdventureLogLine\n" + "\tadds r2, r0, 0\n" + "\tldr r0, [r4]\n" + "\tldr r3, [r0, 0x34]\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp]\n" + "\tmovs r0, 0x8\n" + "\tadds r1, r5, 0\n" + "\tbl sub_8014FF0\n" + "\tb _08032234\n" + "\t.align 2, 0\n" +"_08032214: .4byte gUnknown_202DE30\n" +"_08032218: .4byte gAdventureLog\n" +"_0803221C:\n" + "\tldr r0, [r5]\n" + "\tadds r1, r7, 0\n" + "\tbl sub_8013800\n" + "\tadds r1, r0, 0\n" + "\tldr r2, _08032254\n" + "\tldr r0, [r5]\n" + "\tldr r3, [r0, 0x34]\n" + "\tstr r4, [sp]\n" + "\tmovs r0, 0x8\n" + "\tbl xxx_call_draw_string\n" +"_08032234:\n" + "\tadds r7, 0x1\n" + "\tldr r0, _08032258\n" + "\tldr r0, [r0]\n" +"_0803223A:\n" + "\tmovs r1, 0x1A\n" + "\tldrsh r0, [r0, r1]\n" + "\tcmp r7, r0\n" + "\tblt _08032160\n" + "\tldr r0, _08032258\n" + "\tldr r0, [r0]\n" + "\tldr r0, [r0, 0x34]\n" + "\tbl sub_80073E0\n" + "\tadd sp, 0x8\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08032254: .4byte gUnknown_80E2030\n" +"_08032258: .4byte gAdventureLog"); +} +#endif diff --git a/src/adventure_log_menu.c b/src/adventure_log_menu.c new file mode 100644 index 0000000..b935716 --- /dev/null +++ b/src/adventure_log_menu.c @@ -0,0 +1,40 @@ +#include "global.h" +#include "input.h" +#include "main_menu.h" +#include "adventure_log.h" + +extern void sub_800641C(u8 *, u32, u32); +extern void CreateAdventureLogScreen(u32); +extern u32 HandleAdventureLogInput(u32); +extern void CleanAdventureLogScreen(); + +void CreateAdventureLogMenu(void) +{ + CreateAdventureLogScreen(0); +} + +void CleanAdventureLogMenu(void) +{ + ResetUnusedInputStruct(); + sub_800641C(0, 1, 1); +} + +u32 UpdateAdventureLogMenu(void) +{ + u32 nextMenu; + nextMenu = MENU_NO_SCREEN_CHANGE; + + switch(HandleAdventureLogInput(1)) + { + case 0: + case 1: + break; + case 2: + case 3: + CleanAdventureLogScreen(); + nextMenu = MENU_MAIN_SCREEN; + default: + break; + } + return nextMenu; +} diff --git a/src/data/formatted_type_names.h b/src/data/formatted_type_names.h new file mode 100644 index 0000000..e973056 --- /dev/null +++ b/src/data/formatted_type_names.h @@ -0,0 +1,18 @@ +ALIGNED(4) const char gFormattedSteelText[] = "#c6Steel#r"; +ALIGNED(4) const char gFormattedDarkText[] = "#c6Dark#r"; +ALIGNED(4) const char gFormattedDragonText[] = "#c6Dragon#r"; +ALIGNED(4) const char gFormattedGhostText[] = "#c6Ghost#r"; +ALIGNED(4) const char gFormattedRockText[] = "#c6Rock#r"; +ALIGNED(4) const char gFormattedBugText[] = "#c6Bug#r"; +ALIGNED(4) const char gFormattedPsychicText[] = "#c6Psychic#r"; +ALIGNED(4) const char gFormattedFlyingText[] = "#c6Flying#r"; +ALIGNED(4) const char gFormattedGroundText[] = "#c6Ground#r"; +ALIGNED(4) const char gFormattedPoisonText[] = "#c6Poison#r"; +ALIGNED(4) const char gFormattedFightingText[] = "#c6Fighting#r"; +ALIGNED(4) const char gFormattedIceText[] = "#c6Ice#r "; +ALIGNED(4) const char gFormattedElectricText[] = "#c6Electric#r"; +ALIGNED(4) const char gFormattedGrassText[] = "#c6Grass#r"; +ALIGNED(4) const char gFormattedWaterText[] = "#c6Water#r"; +ALIGNED(4) const char gFormattedFireText[] = "#c6Fire#r "; +ALIGNED(4) const char gFormattedNormalText[] = "#c6Normal#r"; +ALIGNED(4) const char gFormattedNoneText[] = "#c6None#r"; diff --git a/src/debug_menu_mid.c b/src/debug_menu_mid.c new file mode 100644 index 0000000..7bd3d74 --- /dev/null +++ b/src/debug_menu_mid.c @@ -0,0 +1,439 @@ +#include "global.h" +#include "input.h" + +struct unkData +{ + u8 unk0[14]; + u16 unkD; + u16 unk10; + u16 unk12; + u8 *unk14; +}; + +struct unkStruct_203B3F0 +{ + // size: 0x138 + u32 unk0; + u8 unk4; + u8 fill5[0x8 - 5]; + u32 unk8; + u32 *unkC; + u32 unk10; + u32 unk14; + u32 unk18; + u32 unk1C; + u32 unk20; + u8 fill24[0x4C - 0x24]; + u32 unk4C; + u8 fill50[0x9C - 0x50]; + u32 unk9C; + u32 unkA0; + u32 unkA4; + u32 unkA8; + u32 unkAC; + u32 unkB0; + struct unkData *unkB4; + u32 unkB8; + u32 unkBC; + u8 fill4[0xD8 - 0xC0]; + struct unkData unkD8[4]; +}; + +extern struct unkStruct_203B3F0 *gUnknown_203B3F0; + +struct unkStruct_203B3F4 +{ + // size: 0xFC + u32 unk0; + u8 unk4; + u8 fill5[0x8 - 5]; + u32 unk8; + u32 *unkC; + u32 unk10; + u32 unk14; + u32 unk18; + u32 unk1C; + u32 unk20; + u8 fill24[0x4C - 0x24]; + u32 unk4C; + u8 fill50[0x9C - 0x50]; + struct unkData unk9C[4]; +}; + +extern struct unkStruct_203B3F4 *gUnknown_203B3F4; + + +struct unkStruct_203B460 +{ + u8 unk0[0x50]; + u16 unk50[10]; +}; +extern struct unkStruct_203B460 *gUnknown_203B460; // TODO unify this +extern void sub_801B3C0(u8 *); +extern void sub_8090A8C(u8 *, u8, u32); +extern void sub_8013AA0(u32 *); + +extern struct unkData gUnknown_80E7E4C; +extern struct unkData gUnknown_80E7E34; +extern struct unkData gUnknown_80E7E64; +extern struct unkData gUnknown_80E7EA4; +extern struct unkData gUnknown_80E7E8C; + +extern u32 gDebug_NumberText; +extern u32 gDebug_NumberText; +extern u32 gUnknown_80D4970; + + +extern void *MemoryAlloc(u32, u32); +extern void MemoryFree(void *); +extern void sub_800641C(void *, u32, u32); +extern void sub_8006518(void *); +extern void sub_801C8C4(u32, u32, u32, u32); +extern void sub_801CB5C(u32); +extern void sub_801CCD8(); +extern void sub_8012D60(u32 *, u32 **, u32, u32, u32, u32); +extern void sub_8008C54(u32); +extern void sub_80073B8(u32); +extern void sub_8012EA4(u32 *, u32); +extern void sub_80073E0(u32); +extern void sub_8013C68(u32 *); +extern void xxx_call_draw_string(s32, u32, u32 *, u32, u32); +extern u8 sub_8091524(u8); +extern u32 sub_801CA08(u32); +extern u8 sub_801CB24(); +extern void sub_801CBB8(); +extern u8 sub_8012FD8(u32 *); +extern void sub_8013114(u32 *, s32 *); +extern u32 sub_8013BBC(u32 *); +extern u32 sub_801B410(); +extern void sub_801B450(); +extern void sub_80211AC(u32, u32); +extern void sub_8021354(u32); +extern void sub_8021494(); +extern void sub_803AA34(); +extern void sub_8021774(u8,u32, u32); + + +extern void sub_803AAC4(); +extern void sub_803AB34(); +extern void sub_803ABAC(); + +void sub_803A924(u32); +void sub_803A93C(); +void sub_803A9AC(); + +void sub_803A504(u32); +void sub_803A51C(); +void sub_803A5A0(); +void sub_803A690(); +void sub_803A6F0(); +void sub_803A740(); +void sub_803A7B0(); +void sub_803A810(); +void sub_803A86C(); + + +u32 sub_803A45C(void) +{ + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + gUnknown_203B3F0 = MemoryAlloc(sizeof(struct unkStruct_203B3F0), 8); + sub_803A504(0); + return 1; +} + +u32 sub_803A48C(void) +{ + switch(gUnknown_203B3F0->unk0) { + case 0: + case 1: + sub_803A740(); + break; + case 2: + sub_803A7B0(); + break; + case 3: + sub_803A810(); + break; + case 4: + sub_803A86C(); + break; + case 5: + return 3; + } + return 0; +} + +void sub_803A4E8(void) +{ + if(gUnknown_203B3F0 != NULL) + { + MemoryFree(gUnknown_203B3F0); + gUnknown_203B3F0 = NULL; + } +} + +void sub_803A504(u32 newState) +{ + gUnknown_203B3F0->unk0 = newState; + sub_803A51C(); + sub_803A5A0(); +} + +void sub_803A51C(void) +{ + s32 iVar4; + + sub_8006518(gUnknown_203B3F0->unkD8); + switch(gUnknown_203B3F0->unk0) + { + case 3: + gUnknown_203B3F0->unkD8[1] = gUnknown_80E7E64; + break; + case 2: + gUnknown_203B3F0->unkD8[2] = gUnknown_80E7E4C; + break; + default: + for(iVar4 = 0; iVar4 < 4; iVar4++) + { + gUnknown_203B3F0->unkD8[iVar4] = gUnknown_80E7E34; + } + break; + } + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B3F0->unkD8, 1, 1); +} + +void sub_803A5A0(void) +{ + u8 auStack8 [4]; + + switch(gUnknown_203B3F0->unk0) { + case 0: + sub_801C8C4(2,3,0,10); + break; + case 1: + sub_801CB5C(1); + break; + case 2: + sub_801CCD8(); + sub_803A6F0(); + sub_8012D60(&gUnknown_203B3F0->unk4C, &gUnknown_203B3F0->unkC, 0, 0, gUnknown_203B3F0->unk8, 2); + break; + case 3: + gUnknown_203B3F0->unkAC = 3; + gUnknown_203B3F0->unkA4 = 0; + gUnknown_203B3F0->unkA8 = 0x3e7; + gUnknown_203B3F0->unkA0 = gUnknown_203B460->unk50[gUnknown_203B3F0->unk4]; + gUnknown_203B3F0->unkB0 = 1; + gUnknown_203B3F0->unkB4 = &gUnknown_203B3F0->unkD8[1]; + gUnknown_203B3F0->unkB8 = 0x2C; + gUnknown_203B3F0->unkBC = 0x12; + sub_8013AA0(&gUnknown_203B3F0->unk9C); + sub_803A690(); + break; + case 4: + sub_8090A8C(auStack8,gUnknown_203B3F0->unk4,0); + sub_801B3C0(auStack8); + break; + case 5: + break; + } +} + +void sub_803A690(void) +{ + sub_8008C54(gUnknown_203B3F0->unkB0); + sub_80073B8(gUnknown_203B3F0->unkB0); + xxx_call_draw_string(4, 0, &gDebug_NumberText, gUnknown_203B3F0->unkB0, 0); + sub_8013C68(&gUnknown_203B3F0->unk9C); + sub_80073E0(gUnknown_203B3F0->unkB0); + sub_801CCD8(); + sub_8012EA4(&gUnknown_203B3F0->unk4C,0); +} + +void sub_803A6F0(void) +{ + s32 temp1; + struct unkStruct_203B3F0 *preload; + + gUnknown_203B3F0->unkC = &gDebug_NumberText; + gUnknown_203B3F0->unk10 = 2; + gUnknown_203B3F0->unk8 = 2; + if (sub_8091524(gUnknown_203B3F0->unk4) == 0) { + gUnknown_203B3F0->unk10 = -1; + gUnknown_203B3F0->unk8 = 3; + } + preload = gUnknown_203B3F0; + // this var gets loaded in between the sets... very dumb + temp1 = 1; + preload->unk14 = gUnknown_80D4970; + preload->unk18 = 3; + preload->unk1C = 0; + preload->unk20 = temp1; +} + +void sub_803A740(void) +{ + switch(sub_801CA08(1)) { + case 0: + case 1: + break; + case 3: + gUnknown_203B3F0->unk4 = sub_801CB24(); + sub_803A504(2); + break; + case 4: + gUnknown_203B3F0->unk4 = sub_801CB24(); + sub_803A504(4); + break; + case 2: + sub_801CBB8(); + sub_803A504(5); + break; + } +} + +void sub_803A7B0(void) +{ + s32 local_c; + + local_c = 0; + sub_801CA08(0); + if (sub_8012FD8(&gUnknown_203B3F0->unk4C) == '\0') { + sub_8013114(&gUnknown_203B3F0->unk4C,&local_c); + } + switch(local_c) + { + case 2: + sub_803A504(3); + break; + case 3: + sub_803A504(4); + break; + case 1: + sub_803A504(1); + break; + + } +} + +void sub_803A810(void) +{ + sub_801CA08(0); + sub_8012FD8(&gUnknown_203B3F0->unk4C); + switch(sub_8013BBC(&gUnknown_203B3F0->unk9C)) + { + case 3: + gUnknown_203B460->unk50[gUnknown_203B3F0->unk4] = gUnknown_203B3F0->unk9C; + // Fallthrough needed to match + case 2: + sub_803A504(1); + break; + case 1: + sub_803A690(); + break; + } +} + +void sub_803A86C(void) +{ + switch(sub_801B410()) + { + case 1: + case 0: + break; + case 2: + case 3: + sub_801B450(); + sub_803A504(1); + break; + } +} + +////////////////////////////////////////// + +u32 sub_803A888(void) +{ + ResetUnusedInputStruct(); + sub_800641C(0, 1, 1); + gUnknown_203B3F4 = MemoryAlloc(0xFC, 8); + sub_803A924(0); + return 1; +} + +u32 sub_803A8B8(void) +{ + switch(gUnknown_203B3F4->unk0) { + case 0: + case 1: + sub_803AAC4(); + break; + case 2: + sub_803AB34(); + break; + case 3: + sub_803ABAC(); + break; + case 4: + return 3; + } + return 0; +} + +void sub_803A908(void) +{ + if(gUnknown_203B3F4 != NULL) + { + MemoryFree(gUnknown_203B3F4); + gUnknown_203B3F4 = NULL; + } +} + +void sub_803A924(u32 newState) +{ + gUnknown_203B3F4->unk0 = newState; + sub_803A93C(); + sub_803A9AC(); +} + +void sub_803A93C(void) +{ + s32 iVar4; + sub_8006518(gUnknown_203B3F4->unk9C); + if(gUnknown_203B3F4->unk0 == 2) + { + gUnknown_203B3F4->unk9C[2] = gUnknown_80E7EA4; + } + else + { + for(iVar4 = 0; iVar4 < 4; iVar4++) + { + gUnknown_203B3F4->unk9C[iVar4] = gUnknown_80E7E8C; + } + } + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B3F4->unk9C, 1, 1); +} + +void sub_803A9AC(void) +{ + switch(gUnknown_203B3F4->unk0) { + case 0: + sub_80211AC(0,3); + break; + case 1: + sub_8021354(1); + break; + case 2: + sub_8021494(); + sub_803AA34(); + sub_8012D60(&gUnknown_203B3F4->unk4C,&gUnknown_203B3F4->unkC,0,0,gUnknown_203B3F4->unk8,2); + break; + case 3: + sub_8021774(gUnknown_203B3F4->unk4,1,0); + break; + case 4: + break; + } +} diff --git a/src/load_screen.c b/src/load_screen.c new file mode 100644 index 0000000..d79a420 --- /dev/null +++ b/src/load_screen.c @@ -0,0 +1,22 @@ +#include "global.h" + +s32 sub_8011FA8(void); +s32 sub_8095324(u32); +s32 sub_8011C1C(void); + +bool8 sub_8039844(void) +{ + int iVar1; + bool8 return_var; + + iVar1 = sub_8011FA8(); + return_var = 0; + if (sub_8095324(1) != 0 || sub_8095324(7) != 0) + { + if (iVar1 == 0xf1207) + return_var = 1; + } + else if (sub_8011C1C() == 2 && iVar1 == 0xf1207) + return_var = 1; + return return_var; +} diff --git a/src/main_menu.c b/src/main_menu.c index 3c0840a..3b405ae 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -1,6 +1,7 @@ #include "global.h" #include "debug_menu.h" #include "main_menu.h" +#include "adventure_log.h" // NOTE: 0x13 and 0x14 // Communication Screen? @@ -31,7 +32,6 @@ extern void sub_803A1E4(void); extern void CreateFriendRescueMenu(void); extern void sub_803A1D8(void); extern void CreateWonderMailMenu(void); -extern void CreateAdventureLogMenu(void); extern void CreateLoadScreen(u32); extern s32 sub_8035DB4(u32); extern void CreateRescuePasswordMenu(u32); @@ -44,7 +44,6 @@ extern s32 UpdateWonderMailMenu(void); extern s32 sub_803A1DC(void); extern s32 sub_803A1E8(void); extern s32 UpdateRescuePasswordMenu(void); -extern s32 UpdateAdventureLogMenu(void); extern s32 sub_80383D4(void); extern s32 sub_8038630(void); @@ -57,7 +56,6 @@ extern void CleanWonderMailMenu(void); extern void nullsub_55(void); extern void sub_803A1EC(void); extern void CleanRescuePasswordMenu(void); -extern void CleanAdventureLogMenu(void); extern void sub_80383A8(void); extern void sub_8038604(void); diff --git a/src/main_menu_1.c b/src/main_menu_1.c deleted file mode 100644 index d79a420..0000000 --- a/src/main_menu_1.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "global.h" - -s32 sub_8011FA8(void); -s32 sub_8095324(u32); -s32 sub_8011C1C(void); - -bool8 sub_8039844(void) -{ - int iVar1; - bool8 return_var; - - iVar1 = sub_8011FA8(); - return_var = 0; - if (sub_8095324(1) != 0 || sub_8095324(7) != 0) - { - if (iVar1 == 0xf1207) - return_var = 1; - } - else if (sub_8011C1C() == 2 && iVar1 == 0xf1207) - return_var = 1; - return return_var; -} diff --git a/src/main_menu_mid.c b/src/main_menu_mid.c index d606e4d..4d36edf 100644 --- a/src/main_menu_mid.c +++ b/src/main_menu_mid.c @@ -59,9 +59,9 @@ s16 sub_8035D3C(void) return gMainMenu->unk38; } -s32 *sub_8035D4C(void) +struct MainMenu *GetMainMenu(void) { - return &gMainMenu->currMenu; + return gMainMenu; } void sub_8035D58(void) diff --git a/src/other_menus.c b/src/other_menus.c new file mode 100644 index 0000000..8b5eca3 --- /dev/null +++ b/src/other_menus.c @@ -0,0 +1,413 @@ +#include "global.h" +#include "input.h" +#include "main_menu.h" + +struct unkData +{ + u8 unk0[14]; + u16 unkD; + u16 unk10; + u16 unk12; + u8 *unk14; +}; + + +struct unkStruct_203B35C +{ + // size: 0x504 + u32 unk0; + u32 unk4; // link status? + u32 unk8; // state var? + u8 fillC[0x1C - 0xC]; + u32 unk1C; + u8 fill20[0x15C - 0x20]; + struct unkData unk15C[4]; + u8 unk1BC[4]; + u32 unk1C0[9]; +}; +extern struct unkStruct_203B35C *gUnknown_203B35C; + +extern struct unkData gUnknown_80E653C; + +extern u32 gUnknown_80E66BC; +extern u32 gUnknown_80E66D4; +extern u32 gUnknown_80E6748; +extern u32 gUnknown_80E6760; +extern u32 gUnknown_80E67D4; +extern u32 gUnknown_80E67EC; +extern u32 gUnknown_80E689C; +extern u32 gUnknown_80E68B4; +extern u32 gUnknown_80E6938; +extern u32 gUnknown_80E6950; +extern u32 gUnknown_80E69B0; +extern u32 gUnknown_80E69C8; +extern u32 gUnknown_80E6A10; +extern u32 gUnknown_80E6A28; +extern u32 gUnknown_80E6A74; +extern u32 gUnknown_80E6A8C; +extern u32 gUnknown_80E6B78; +extern u32 gUnknown_80E6B90; +extern u32 gUnknown_80E6BF4; +extern u32 gUnknown_80E6C0C; +extern u32 gUnknown_80E6C50; +extern u32 gUnknown_80E6C68; +extern u32 gUnknown_80E6CD0; +extern u32 gUnknown_80E6CE8; +extern u32 gUnknown_80E6DDC; +extern u32 gUnknown_80E6DF4; +extern u32 gUnknown_80E6D54; +extern u32 gUnknown_80E6D6C; + +struct unkStruct_8035D94 +{ + u8 unk0; + u8 fill[0x3]; + u32 unk4; +}; + +extern struct unkStruct_8035D94 *sub_8035D94(); + +struct unkStruct_203B460 +{ + u8 unk0[0x50]; + u16 unk50[10]; +}; +extern struct unkStruct_203B460 *gUnknown_203B460; // TODO unify this + +extern void sub_8037400(void); +extern void sub_800641C(void *, u32, u32); +extern void ResetSprites(u32); +extern void *MemoryAlloc(u32, u32); +extern void MemoryFill8(u8 *, u8, s32); +extern void MemoryFree(void *); +extern void sub_8035CF4(u32 *,u32, u32); +extern void sub_80376CC(); +extern void sub_8035CC0(void *, u32); + +extern u8 sub_80130A8(u32 *); +extern void sub_8013114(u32 *, u32 *); +extern u32 sub_8037C10(u32); +extern void sub_8037748(void); +extern void sub_80371B8(void); +extern void sub_8037900(void); +extern void PlayMenuSoundEffect(u32); +extern u32 sub_8037798(void); +extern void SetMenuItems(void *, void *, u32, u32 *, u32 *, u32, u32, u32); +extern void sub_8005838(u32, u32); +extern void sub_80060EC(); +extern void sub_800CB20(); +extern void TransferBGPaletteBuffer(); +extern void xxx_call_update_bg_vram(); +extern void sub_8009908(); +extern void xxx_call_update_bg_sound_input(); + + +#ifdef NONMATCHING +void sub_8036FDC(s32 param_1) +{ + int iVar3; + int iVar4; + + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + ResetSprites(0); + if (gUnknown_203B35C == NULL) { + gUnknown_203B35C = MemoryAlloc(0x504,8); + MemoryFill8((u8 *)gUnknown_203B35C,0,0x504); + } + + gUnknown_203B35C->unk0 = param_1; + gUnknown_203B35C->unk4 = 0; + gUnknown_203B35C->unk8 = 0; + iVar3 = 0; + do { + gUnknown_203B35C->unk1C0[iVar3 * 2] = 0; + // Add statements of index flip but ends in same result + gUnknown_203B35C->unk1BC[iVar3 * 8] = 0; + iVar3 = iVar3 + 1; + } while (iVar3 < 2); + for(iVar4 = 0; iVar4 < 4; iVar4++){ + gUnknown_203B35C->unk15C[iVar4] = gUnknown_80E653C; + } + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B35C->unk15C,1,1); + SetMenuItems(&gUnknown_203B35C->unk1C,gUnknown_203B35C->unk15C,0,&gUnknown_80E6CD0,&gUnknown_80E6CE8,0, + 6,0); + sub_8035CF4(&gUnknown_203B35C->unk1C,0,1); + sub_80376CC(); +} +#else +NAKED +void sub_8036FDC(s32 param_1) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tsub sp, 0x10\n" + "\tadds r6, r0, 0\n" + "\tbl ResetUnusedInputStruct\n" + "\tmovs r0, 0\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tmovs r0, 0\n" + "\tbl ResetSprites\n" + "\tldr r5, _080370C0\n" + "\tldr r0, [r5]\n" + "\tcmp r0, 0\n" + "\tbne _08037016\n" + "\tldr r4, _080370C4\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x8\n" + "\tbl MemoryAlloc\n" + "\tstr r0, [r5]\n" + "\tmovs r1, 0\n" + "\tadds r2, r4, 0\n" + "\tbl MemoryFill8\n" +"_08037016:\n" + "\tldr r0, [r5]\n" + "\tstr r6, [r0]\n" + "\tmovs r1, 0\n" + "\tstr r1, [r0, 0x4]\n" + "\tstr r1, [r0, 0x8]\n" + "\tmovs r3, 0\n" + "\tadds r7, r5, 0\n" + "\tmovs r6, 0xE0\n" + "\tlsls r6, 1\n" + "\tmovs r4, 0\n" + "\tmovs r5, 0xDE\n" + "\tlsls r5, 1\n" +"_0803702E:\n" + "\tldr r0, [r7]\n" + "\tlsls r2, r3, 3\n" + "\tadds r1, r0, r6\n" + "\tadds r1, r2\n" + "\tstr r4, [r1]\n" + "\tadds r0, r2\n" + "\tadds r0, r5\n" + "\tstrb r4, [r0]\n" + "\tadds r3, 0x1\n" + "\tcmp r3, 0x1\n" + "\tble _0803702E\n" + "\tldr r0, _080370C0\n" + "\tmov r12, r0\n" + "\tmovs r5, 0xAE\n" + "\tlsls r5, 1\n" + "\tmov r8, r5\n" + "\tldr r4, _080370C8\n" + "\tmovs r3, 0\n" + "\tmovs r2, 0x3\n" +"_08037054:\n" + "\tmov r6, r12\n" + "\tldr r1, [r6]\n" + "\tadds r1, r3\n" + "\tadd r1, r8\n" + "\tadds r0, r4, 0\n" + "\tldm r0!, {r5-r7}\n" + "\tstm r1!, {r5-r7}\n" + "\tldm r0!, {r5-r7}\n" + "\tstm r1!, {r5-r7}\n" + "\tadds r3, 0x18\n" + "\tsubs r2, 0x1\n" + "\tcmp r2, 0\n" + "\tbge _08037054\n" + "\tmovs r6, 0\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r5, _080370C0\n" + "\tldr r0, [r5]\n" + "\tmovs r4, 0xAE\n" + "\tlsls r4, 1\n" + "\tadds r0, r4\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tldr r1, [r5]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x1C\n" + "\tadds r1, r4\n" + "\tldr r3, _080370CC\n" + "\tldr r2, _080370D0\n" + "\tstr r2, [sp]\n" + "\tstr r6, [sp, 0x4]\n" + "\tmovs r2, 0x6\n" + "\tstr r2, [sp, 0x8]\n" + "\tstr r6, [sp, 0xC]\n" + "\tmovs r2, 0\n" + "\tbl SetMenuItems\n" + "\tldr r0, [r5]\n" + "\tadds r0, 0x1C\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x1\n" + "\tbl sub_8035CF4\n" + "\tbl sub_80376CC\n" + "\tadd sp, 0x10\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_080370C0: .4byte gUnknown_203B35C\n" +"_080370C4: .4byte 0x00000504\n" +"_080370C8: .4byte gUnknown_80E653C\n" +"_080370CC: .4byte gUnknown_80E6CD0\n" +"_080370D0: .4byte gUnknown_80E6CE8"); +} +#endif + +void sub_80370D4(void) +{ + if(gUnknown_203B35C != NULL) + { + MemoryFree(gUnknown_203B35C); + gUnknown_203B35C = NULL; + } +} + +// Unused +u32 sub_80370F0(void) +{ + u32 nextMenu; + int local_10; + + local_10 = 4; + nextMenu = MENU_NO_SCREEN_CHANGE; + switch(gUnknown_203B35C->unk8){ + case 0: + if (sub_80130A8(&gUnknown_203B35C->unk1C) == '\0') { + sub_8013114(&gUnknown_203B35C->unk1C,&local_10); + } + if (local_10 == 4) { + sub_8037748(); + } + else { + gUnknown_203B35C->unk8 = 1; + sub_8037900(); + } + break; + case 1: + sub_80376CC(); + gUnknown_203B35C->unk8 = 2; + sub_80371B8(); + break; + case 2: + if (((gUnknown_203B35C->unk0 < 2) && (gUnknown_203B35C->unk4 == 0)) && (sub_8037C10(0) == 0) ) { + return 0x29; // TODO: what screen is this? + } + else { + if (sub_80130A8(&gUnknown_203B35C->unk1C) == '\0') { + sub_8013114(&gUnknown_203B35C->unk1C,&local_10); + } + if (local_10 != 4) { + PlayMenuSoundEffect(3); + nextMenu = sub_8037798(); + gUnknown_203B35C->unk8 = 4; + } + sub_8037748(); + } + break; + } + return nextMenu; +} + +void sub_80371B8(void) +{ + struct unkStruct_8035D94 *pbVar2; + u32 *ppuVar4; + u32 *puVar5; + + puVar5 = NULL; + ppuVar4 = NULL; + sub_8037400(); + if ((gUnknown_203B35C->unk0 < 2) &&(gUnknown_203B35C->unk4 == 0)) { + if (sub_8037C10(0) != 0) { + sub_80376CC(); + sub_8035CC0(&gUnknown_203B35C->unk15C,0); + SetMenuItems(&gUnknown_203B35C->unk1C, gUnknown_203B35C->unk15C, 0, &gUnknown_80E6C50, + &gUnknown_80E6C68, 0, 6, 0); + sub_8035CF4(&gUnknown_203B35C->unk1C, 0, 1); + } + } + else { + sub_80376CC(); + sub_8035CC0(&gUnknown_203B35C->unk15C, 0); + switch(gUnknown_203B35C->unk4) { + case 0: + puVar5 = &gUnknown_80E66BC; + ppuVar4 = &gUnknown_80E66D4; + break; + case 3: + puVar5 = &gUnknown_80E6D54; + ppuVar4 = &gUnknown_80E6D6C; + break; + case 2: + puVar5 = &gUnknown_80E6DDC; + ppuVar4 = &gUnknown_80E6DF4; + break; + case 4: + puVar5 = &gUnknown_80E67D4; + ppuVar4 = &gUnknown_80E67EC; + break; + case 1: + case 5: + puVar5 = &gUnknown_80E6748; + ppuVar4 = &gUnknown_80E6760; + break; + case 6: + puVar5 = &gUnknown_80E689C; + ppuVar4 = &gUnknown_80E68B4; + break; + case 7: + puVar5 = &gUnknown_80E6938; + ppuVar4 = &gUnknown_80E6950; + break; + case 9: + puVar5 = &gUnknown_80E69B0; + ppuVar4 = &gUnknown_80E69C8; + break; + case 0xb: + puVar5 = &gUnknown_80E6A10; + ppuVar4 = &gUnknown_80E6A28; + break; + case 0xd: + puVar5 = &gUnknown_80E6A74; + ppuVar4 = &gUnknown_80E6A8C; + break; + case 0xe: + puVar5 = &gUnknown_80E6B78; + ppuVar4 = &gUnknown_80E6B90; + break; + case 0xf: + puVar5 = &gUnknown_80E6BF4; + ppuVar4 = &gUnknown_80E6C0C; + break; + } + SetMenuItems(&gUnknown_203B35C->unk1C, gUnknown_203B35C->unk15C, 0, puVar5, ppuVar4, 0, 6, 0); + sub_8035CF4(&gUnknown_203B35C->unk1C, 0, 1); + // TODO clean this if statement up... + if ((((gUnknown_203B35C->unk4 != 0) &&(gUnknown_203B35C->unk0 == 0)) && + (pbVar2 = sub_8035D94(), pbVar2->unk0 != 0)) && (pbVar2->unk4 != 0)) { + // We received something.. + gUnknown_203B460->unk50[pbVar2->unk0] += pbVar2->unk4; + } + } +} + +void sub_80373C4(void) +{ + sub_8005838(0,0); + sub_80060EC(); + sub_800CB20(); + LoadBufferedInputs(); + TransferBGPaletteBuffer(); + xxx_call_update_bg_vram(); + sub_8009908(); + xxx_call_update_bg_sound_input(); + ResetSprites(0); +} + +// Unused +struct unkStruct_203B35C *sub_80373F4(void) +{ + return gUnknown_203B35C; +} diff --git a/src/personality_test.c b/src/personality_test.c index 3f5bfa6..67f0f9f 100644 --- a/src/personality_test.c +++ b/src/personality_test.c @@ -40,7 +40,7 @@ extern void sub_800836C(u32, u8 *r0, u32); extern void SetBGPaletteBufferColorArray(s32 index, u8 *colorArray); extern void RedrawPartnerSelectionMenu(void); -extern void sub_8013818(u32 *r0, s32, u32, u32); +extern void sub_8013818(struct UnkInputStruct **r0, s32, u32, u32); extern u32 GetKeyPress(struct UnkInputStruct **r0); extern u8 sub_80138B8(struct UnkInputStruct **r0, u32); @@ -142,7 +142,7 @@ struct unkData gUnknown_80F4244 = 0xC, 6, 5, 5, 5,0, - 0, 0 + NULL }; const char filler[] = "pksdir0"; // CHUNSOFT inserted for aligning data @@ -168,7 +168,7 @@ const struct unkData gUnknown_80F4278 = 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00 + NULL }; const struct unkData gUnknown_80F4290 = @@ -178,7 +178,7 @@ const struct unkData gUnknown_80F4290 = 0x02, 0x02, 0x09, 0x0B, 0x0D, 0x00, - 0x00, 0x00 + NULL }; const struct unkData gUnknown_80F42A8 = @@ -188,7 +188,7 @@ const struct unkData gUnknown_80F42A8 = 0x0E, 0x04, 0x05, 0x05, 0x05, 0x00, - 0x00, 0x00 + NULL }; @@ -586,7 +586,6 @@ void sub_803CB5C(void) void sub_803CB7C(void) { - CopyStringtoBuffer(gUnknown_203B400->PartnerNick, GetMonSpecies(gUnknown_203B400->PartnerID)); sub_801602C(3, gUnknown_203B400->PartnerNick); gUnknown_203B400->TestState = 13; @@ -652,7 +651,6 @@ void PersonalityTest_DisplayStarterSprite(void) sub_80073E0(1); } -#ifdef NONMATCHING void CreatePartnerSelectionMenu(s16 starterID) { s32 starterID_s32; @@ -661,114 +659,26 @@ void CreatePartnerSelectionMenu(s16 starterID) sub_803CEAC(); // creates 203B404 gUnknown_203B404->StarterID = starterID_s32; gUnknown_203B404->unk4C = 0; - gUnknown_203B404->unk50 = &gUnknown_203B404->unk54; + gUnknown_203B404->unk50 = gUnknown_203B404->unk54; gUnknown_203B404->unk54[0] = gUnknown_80F4290; gUnknown_203B404->unk54[1] = gUnknown_80F42A8; gUnknown_203B404->unk54[2] = gUnknown_80F4278; gUnknown_203B404->unk54[3] = gUnknown_80F4278; - // TODO this is the problem area - //gUnknown_203B404->unk50[5] = (u32 *) &gUnknown_203B404->sub; // so weird but think they store the substruct + gUnknown_203B404->unk50->unk14 = gUnknown_203B404->unkb4; - gUnknown_203B404->sub.unkb4 = 1; - gUnknown_203B404->sub.unkb5 = 0; - gUnknown_203B404->sub.unkb6 = 6; - gUnknown_203B404->sub.unkb7 = 0; + gUnknown_203B404->unkb4[0] = 1; + gUnknown_203B404->unkb4[1] = 0; + gUnknown_203B404->unkb4[2] = 6; + gUnknown_203B404->unkb4[3] = 0; ResetUnusedInputStruct(); sub_800641C(gUnknown_203B404->unk54, 1, 1); sub_8013818(&gUnknown_203B404->unk18, GetValidPartners(), 0xA, gUnknown_203B404->unk4C); RedrawPartnerSelectionMenu(); PersonalityTest_DisplayPartnerSprite(); } -#else -NAKED -void CreatePartnerSelectionMenu(s16 starterID) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tadds r4, r0, 0\n" - "\tlsls r4, 16\n" - "\tasrs r4, 16\n" - "\tbl sub_803CEAC\n" - "\tldr r5, _0803CDB0\n" - "\tldr r0, [r5]\n" - "\tmovs r3, 0\n" - "\tmovs r1, 0\n" - "\tstrh r4, [r0]\n" - "\tstr r1, [r0, 0x4C]\n" - "\tadds r1, r0, 0\n" - "\tadds r1, 0x54\n" - "\tstr r1, [r0, 0x50]\n" - "\tldr r0, _0803CDB4\n" - "\tldm r0!, {r2,r4,r6}\n" - "\tstm r1!, {r2,r4,r6}\n" - "\tldm r0!, {r2,r4,r7}\n" - "\tstm r1!, {r2,r4,r7}\n" - "\tldr r1, [r5]\n" - "\tadds r1, 0x6C\n" - "\tldr r0, _0803CDB8\n" - "\tldm r0!, {r2,r6,r7}\n" - "\tstm r1!, {r2,r6,r7}\n" - "\tldm r0!, {r4,r6,r7}\n" - "\tstm r1!, {r4,r6,r7}\n" - "\tldr r1, [r5]\n" - "\tldr r2, _0803CDBC\n" - "\tadds r1, 0x84\n" - "\tadds r0, r2, 0\n" - "\tldm r0!, {r4,r6,r7}\n" - "\tstm r1!, {r4,r6,r7}\n" - "\tldm r0!, {r4,r6,r7}\n" - "\tstm r1!, {r4,r6,r7}\n" - "\tldr r0, [r5]\n" - "\tadds r0, 0x9C\n" - "\tldm r2!, {r1,r4,r6}\n" - "\tstm r0!, {r1,r4,r6}\n" - "\tldm r2!, {r1,r4,r7}\n" - "\tstm r0!, {r1,r4,r7}\n" - "\tldr r0, [r5]\n" - "\tldr r1, [r0, 0x50]\n" - "\tadds r0, 0xB4\n" - "\tstr r0, [r1, 0x14]\n" - "\tmovs r1, 0x1\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r5]\n" - "\tadds r0, 0xB5\n" - "\tstrb r3, [r0]\n" - "\tldr r0, [r5]\n" - "\tadds r0, 0xB6\n" - "\tmovs r1, 0x6\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r5]\n" - "\tadds r0, 0xB7\n" - "\tstrb r3, [r0]\n" - "\tbl ResetUnusedInputStruct\n" - "\tldr r0, [r5]\n" - "\tadds r0, 0x54\n" - "\tmovs r1, 0x1\n" - "\tmovs r2, 0x1\n" - "\tbl sub_800641C\n" - "\tldr r4, [r5]\n" - "\tadds r4, 0x18\n" - "\tbl GetValidPartners\n" - "\tadds r1, r0, 0\n" - "\tldr r0, [r5]\n" - "\tldr r3, [r0, 0x4C]\n" - "\tadds r0, r4, 0\n" - "\tmovs r2, 0xA\n" - "\tbl sub_8013818\n" - "\tbl RedrawPartnerSelectionMenu\n" - "\tbl PersonalityTest_DisplayPartnerSprite\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" -"_0803CDB0: .4byte gUnknown_203B404\n" -"_0803CDB4: .4byte gUnknown_80F4290\n" -"_0803CDB8: .4byte gUnknown_80F42A8\n" -"_0803CDBC: .4byte gUnknown_80F4278"); -} -#endif u16 HandlePartnerSelectionInput(void) { diff --git a/src/text_util.c b/src/text_util.c index 02c4239..1de233c 100644 --- a/src/text_util.c +++ b/src/text_util.c @@ -21,6 +21,26 @@ extern const char gDragonText[]; extern const char gDarkText[]; extern const char gSteelText[]; +extern const char gFormattedNoneText[]; +extern const char gFormattedNormalText[]; +extern const char gFormattedFireText[]; +extern const char gFormattedWaterText[]; +extern const char gFormattedGrassText[]; +extern const char gFormattedElectricText[]; +extern const char gFormattedIceText[]; +extern const char gFormattedFightingText[]; +extern const char gFormattedPoisonText[]; +extern const char gFormattedGroundText[]; +extern const char gFormattedFlyingText[]; +extern const char gFormattedPsychicText[]; +extern const char gFormattedBugText[]; +extern const char gFormattedRockText[]; +extern const char gFormattedGhostText[]; +extern const char gFormattedDragonText[]; +extern const char gFormattedDarkText[]; +extern const char gFormattedSteelText[]; + + const char * const gUnformattedTypeStrings[NUM_POKEMON_TYPES] = { gNoneText, @@ -45,7 +65,29 @@ const char * const gUnformattedTypeStrings[NUM_POKEMON_TYPES] = #include "data/unformatted_type_names.h" -extern const char * gFormattedTypeStrings[NUM_POKEMON_TYPES]; // formatted type names +const char * const gFormattedTypeStrings[NUM_POKEMON_TYPES] = +{ + gFormattedNoneText, + gFormattedNormalText, + gFormattedFireText, + gFormattedWaterText, + gFormattedGrassText, + gFormattedElectricText, + gFormattedIceText, + gFormattedFightingText, + gFormattedPoisonText, + gFormattedGroundText, + gFormattedFlyingText, + gFormattedPsychicText, + gFormattedBugText, + gFormattedRockText, + gFormattedGhostText, + gFormattedDragonText, + gFormattedDarkText, + gFormattedSteelText, +}; + +#include "data/formatted_type_names.h" extern u8 *gAbilityNames[]; diff --git a/src/unk_menu_203B360.c b/src/unk_menu_203B360.c new file mode 100644 index 0000000..6d778c2 --- /dev/null +++ b/src/unk_menu_203B360.c @@ -0,0 +1,104 @@ +#include "global.h" +#include "input.h" +#include "main_menu.h" + +struct unkData +{ + u8 unk0[14]; + u16 unkD; + u16 unk10; + u16 unk12; + u8 *unk14; +}; + +struct unkStruct_203B360 +{ + // size: 0x1b4 + u32 currMenu; + u32 unk4; // state + u32 unk8; + u8 fill8[0x148 - 0xC]; + struct unkData unk148[4]; + u32 unk1A8; + u32 unk1AC; + u32 unk1B0; // sprite count? +}; + +extern struct unkStruct_203B360 *gUnknown_203B360; +extern struct unkData gUnknown_80E6E7C; +extern u32 gUnknown_80E6E94; +extern u32 gUnknown_80E6EAC; + +extern void *MemoryAlloc(u32, u32); +extern void MemoryFill8(u8 *, u8, u32); +extern void MemoryFree(void *); +extern void sub_8038440(); +extern void sub_8035CF4(u32 *, u32, u32); +extern void sub_800641C(void *, u32, u32); +extern void SetMenuItems(void *, void *, u32, u32 *, u32 *, u32, u32, u32); +extern u8 sub_80130A8(u32 *); +extern void sub_8013114(u32 *, u32 *); +extern void sub_80384D0(); + +void sub_80382E4(s32 param_1) +{ + s32 iVar4; + + if (gUnknown_203B360 == NULL) { + gUnknown_203B360 = MemoryAlloc(sizeof(struct unkStruct_203B360), 8); + MemoryFill8((u8 *)gUnknown_203B360, 0, sizeof(struct unkStruct_203B360)); + } + for(iVar4 = 0; iVar4 < 4; iVar4++){ + gUnknown_203B360->unk148[iVar4] = gUnknown_80E6E7C; + } + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B360->unk148,1,1); + if (param_1 == 0x25) { + SetMenuItems(&gUnknown_203B360->unk8,gUnknown_203B360->unk148,0,&gUnknown_80E6E94,&gUnknown_80E6EAC, + 0,4,0); + } + sub_8035CF4(&gUnknown_203B360->unk8,0,1); + gUnknown_203B360->currMenu = param_1; + gUnknown_203B360->unk4 = 0; + sub_8038440(); +} + +void sub_80383A8(void) +{ + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + if (gUnknown_203B360 != 0) { + MemoryFree(gUnknown_203B360); + gUnknown_203B360 = 0; + } +} + +u32 sub_80383D4(void) +{ + u32 nextMenu; + u32 menuAction; + + menuAction = 2; + nextMenu = MENU_NO_SCREEN_CHANGE; + + if (gUnknown_203B360->unk4 == 0){ + if (sub_80130A8(&gUnknown_203B360->unk8) == '\0') { + sub_8013114(&gUnknown_203B360->unk8, &menuAction); + } + switch(menuAction) + { + case 3: + case 1: + gUnknown_203B360->unk4 = 0; + nextMenu = MENU_MAIN_SCREEN; + break; + case 2: + gUnknown_203B360->unk4 = 0; + default: + break; + } + sub_80384D0(); + } + + return nextMenu; +} diff --git a/src/unk_menu_203B360_1.c b/src/unk_menu_203B360_1.c new file mode 100644 index 0000000..1b84f52 --- /dev/null +++ b/src/unk_menu_203B360_1.c @@ -0,0 +1,36 @@ +#include "global.h" + +struct unkData +{ + u8 unk0[14]; + u16 unkD; + u16 unk10; + u16 unk12; + u8 *unk14; +}; + +struct unkStruct_203B360 +{ + // size: 0x1b4 + u32 currMenu; + u32 unk4; + u32 unk8; + u8 fill8[0x148 - 0xC]; + struct unkData unk148[4]; + u16 unk1A8; + u16 unk1AA; + u16 unk1AC; + u16 unk1AE; + u32 unk1B0; // Sprite count? +}; + +extern struct unkStruct_203B360 *gUnknown_203B360; +extern void AddSprite(u16 *, u32, u32, u32); + +void sub_80384D0(void) +{ + if ((gUnknown_203B360->unk1B0 & 8) != 0) { + AddSprite(&gUnknown_203B360->unk1A8, 0x100, 0, 0); + } + gUnknown_203B360->unk1B0++; +} diff --git a/src/unk_menu_203B364.c b/src/unk_menu_203B364.c new file mode 100644 index 0000000..f6f6766 --- /dev/null +++ b/src/unk_menu_203B364.c @@ -0,0 +1,85 @@ +#include "global.h" +#include "input.h" + +struct unkData +{ + u8 unk0[14]; + u16 unkD; + u16 unk10; + u16 unk12; + u8 *unk14; +}; + +struct unkStruct_203B360 +{ + // size: 0x1b4 + u32 currMenu; + u32 unk4; + u32 unk8; + u8 fill8[0x148 - 0xC]; + struct unkData unk148[4]; + u16 unk1A8; + u16 unk1AA; + u16 unk1AC; + u16 unk1AE; + u32 unk1B0; // Sprite count? +}; + +extern struct unkStruct_203B360 *gUnknown_203B364; +extern struct unkData gUnknown_80E6F20; +extern u32 gUnknown_80E6F38; +extern u32 gUnknown_80E7090; +extern u32 gUnknown_80E6F50; + +extern void *MemoryAlloc(u32, u32); +extern void MemoryFill8(u8 *, u8, u32); +extern void MemoryFree(void *); +extern void sub_8038440(); +extern void sub_8035CF4(u32 *, u32, u32); +extern void sub_800641C(void *, u32, u32); +extern void SetMenuItems(void *, void *, u32, u32 *, u32 *, u32, u32, u32); +extern u8 sub_80130A8(u32 *); +extern void sub_8013114(u32 *, u32 *); +extern void sub_80384D0(); +extern void sub_8038830(); + +void sub_803850C(s32 param_1) +{ + s32 iVar4; + + if (gUnknown_203B364 == NULL) { + gUnknown_203B364 = MemoryAlloc(sizeof(struct unkStruct_203B360),8); + MemoryFill8((u8 *)gUnknown_203B364,0,sizeof(struct unkStruct_203B360)); + } + for(iVar4 = 0; iVar4 < 4; iVar4++){ + gUnknown_203B364->unk148[iVar4] = gUnknown_80E6F20; + } + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B364->unk148,1,1); + + if (param_1 == 0x2e) { + // Beware, Deleting your Adventure + SetMenuItems(&gUnknown_203B364->unk8,gUnknown_203B364->unk148,0,&gUnknown_80E6F38,&gUnknown_80E7090, + 0,6,0); + } + else { + // Saving your Adventure + SetMenuItems(&gUnknown_203B364->unk8,gUnknown_203B364->unk148,0,&gUnknown_80E6F38,&gUnknown_80E6F50, + 0,6,0); + } + sub_8035CF4(&gUnknown_203B364->unk8,0,1); + gUnknown_203B364->unk4 = 0; + gUnknown_203B364->currMenu = param_1; + sub_8038830(); +} + +void sub_8038604(void) +{ + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + if (gUnknown_203B364 != 0) { + MemoryFree(gUnknown_203B364); + gUnknown_203B364 = 0; + } +} + -- cgit v1.2.3