From d1685379681008d41f78fa4a6ae17ace5ee2dbfa Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 23 Jun 2021 17:35:37 -0500 Subject: Finish out game options and FatalError Some data cleanup as well. Thanks pika for the noreturn tip for FatalError. --- src/code_8009804.c | 26 +++++ src/code_8090208.c | 36 ++++++ src/code_8097670.c | 28 +++-- src/code_809D148.c | 10 +- src/debug.c | 6 +- src/game_options.c | 271 +++++++++++++++++++++++++++++++++++++++++++- src/load_screen.c | 18 +-- src/main_menu.c | 13 +-- src/save.c | 6 +- src/trade_items_menu.c | 4 +- src/wonder_mail_main_menu.c | 20 ++-- 11 files changed, 383 insertions(+), 55 deletions(-) create mode 100644 src/code_8090208.c (limited to 'src') diff --git a/src/code_8009804.c b/src/code_8009804.c index 23407a7..845192a 100644 --- a/src/code_8009804.c +++ b/src/code_8009804.c @@ -16,7 +16,19 @@ struct unkStruct_202D240 }; extern struct unkStruct_202D240 gUnknown_202D240[8]; +struct unkStruct_202D038 +{ + // size: 0x40 + u32 unk0; + u32 unk4; + u8 fill[0x40 - 0x8]; +}; + +extern struct unkStruct_202D038 gUnknown_202D038[8]; + extern void CpuCopy(void* dest, void *src, s32 size); +extern void sub_8009A1C(u32); + void vram_related_8009804(void) { @@ -123,3 +135,17 @@ void sub_80099C0(void) // TODO shouldn't this be 202B838? It didn't match... might need raw address CpuCopy(BG_SCREEN_ADDR(13),gUnknown_202B038 + 0x1, BG_SCREEN_SIZE); } + +void sub_80099F0(u32 r0) +{ + s32 iVar2; + for(iVar2 = 0; iVar2 < 8; iVar2++) + { + gUnknown_202D038[iVar2].unk4 = r0; + } +} + +void sub_8009A10(u32 *r0) +{ + sub_8009A1C(r0[1]); +} diff --git a/src/code_8090208.c b/src/code_8090208.c new file mode 100644 index 0000000..b64b551 --- /dev/null +++ b/src/code_8090208.c @@ -0,0 +1,36 @@ +#include "global.h" +#include "dungeon.h" + +extern const char gUnknown_8108F10[]; +extern const char gUnknown_8108F18[]; +extern const char gUnknown_8108F2C[]; + +void ExpandPlaceholdersBuffer(u8 *buffer, const char *text, ...); + + +struct unkDungeonStruct +{ + u8 index; + u8 floor; +}; + +void sub_8090208(u8 *buffer, struct unkDungeonStruct *dungeonLocation) +{ + ExpandPlaceholdersBuffer(buffer, gUnknown_8108F10, gDungeonNames[dungeonLocation->index].name1); // #cD%s#r (normal floor print (no B) +} + +void PrintDungeonLocationtoBuffer(u8 *buffer, struct unkDungeonStruct *dungeonLocation) +{ + if(gDungeons[dungeonLocation->index].stairDirection != 0){ + ExpandPlaceholdersBuffer(buffer, gUnknown_8108F18, gDungeonNames[dungeonLocation->index].name1, dungeonLocation->floor); //_F + } + else + { + ExpandPlaceholdersBuffer(buffer, gUnknown_8108F2C, gDungeonNames[dungeonLocation->index].name1, dungeonLocation->floor); // B _F + } +} + +void CopyDungeonName1toBuffer(u8 *buffer, struct unkDungeonStruct *dungeonLocation) +{ + strncpy(buffer, gDungeonNames[dungeonLocation->index].name1, 0x50); +} diff --git a/src/code_8097670.c b/src/code_8097670.c index 388bce6..d9af468 100644 --- a/src/code_8097670.c +++ b/src/code_8097670.c @@ -1,5 +1,11 @@ #include "global.h" +struct unkDungeonStruct +{ + u8 index; + u8 floor; +}; + struct unkStruct_203B494 { // size: 0xC8? @@ -7,9 +13,7 @@ struct unkStruct_203B494 s32 numAdventures; s32 unk8; s32 unkC; - u8 unk10; // location? - u8 unk11; - u8 fill12[2]; + struct unkDungeonStruct dungeonLocation; s16 unk14; s16 unk16; s16 unk18; @@ -36,15 +40,15 @@ struct unkStruct_203B494 *sub_8097680(void) return &gUnknown_2039778; } -void sub_8097688(u8 *r0) +void SetDungeonLocationInfo(struct unkDungeonStruct *r0) { - gUnknown_203B494->unk10 = r0[0]; - gUnknown_203B494->unk11 = r0[1]; + gUnknown_203B494->dungeonLocation.index = r0->index; + gUnknown_203B494->dungeonLocation.floor = r0->floor; } -u8 *sub_809769C(void) +struct unkDungeonStruct *GetDungeonLocationInfo(void) { - return &gUnknown_203B494->unk10; + return &gUnknown_203B494->dungeonLocation; } void sub_80976A8(void) @@ -63,7 +67,7 @@ void sub_80976A8(void) { gUnknown_203B494->unk1C[iVar2] = 0; } - + for(iVar2 = 0; iVar2 < 0xD; iVar2++) { gUnknown_203B494->unk8C[iVar2] = 0; @@ -150,7 +154,7 @@ void sub_8097810(void) { if(gUnknown_203B494->unk14 < 9999) gUnknown_203B494->unk14++; - sub_80976F8(0xB); + sub_80976F8(11); } s16 sub_8097838(void) @@ -162,7 +166,7 @@ void sub_8097848(void) { if(gUnknown_203B494->unk16 < 9999) gUnknown_203B494->unk16++; - sub_80976F8(0xA); + sub_80976F8(10); } s16 sub_8097870(void) @@ -179,7 +183,7 @@ void sub_8097890(void) { if(gUnknown_203B494->UNKC0.unkC0 < 99999) gUnknown_203B494->UNKC0.unkC0++; - sub_80976F8(0xC); + sub_80976F8(12); } s16 sub_80978B8(void) diff --git a/src/code_809D148.c b/src/code_809D148.c index 5d3c908..5a33674 100644 --- a/src/code_809D148.c +++ b/src/code_809D148.c @@ -255,15 +255,9 @@ void sub_809D220(u32 r0, u32 r1, u32 r2) gUnknown_20399E8.unk4 = r1; } -u32 sub_809D234(void) +bool32 sub_809D234(void) { - u32 temp; - temp = gUnknown_20399E8.unk8; - if(temp != 0) - { - temp = 1; - } - return temp; + return gUnknown_20399E8.unk8 != 0; } // TODO regswap but matches otherwise diff --git a/src/debug.c b/src/debug.c index 59fdc1a..aeccbe8 100644 --- a/src/debug.c +++ b/src/debug.c @@ -5,6 +5,7 @@ #include "debug.h" extern void Hang(); +void FatalErrorHang(void) __attribute__((noreturn)); extern bool32 gNDS_DebugEnabled; extern u8 gUnknown_203B150; @@ -236,8 +237,7 @@ void FatalErrorHang() Hang(); } -/*void -FatalError(struct DebugLocation *debug, const char *text, ...) +void FatalError(struct DebugLocation *debug, const char *text, ...) { char buf[0x100]; va_list vArgv; @@ -248,4 +248,4 @@ FatalError(struct DebugLocation *debug, const char *text, ...) va_end(vArgv); FatalErrorFormatMessage(gUnknown_80D42D4, buf); FatalErrorHang(); -}*/ +} diff --git a/src/game_options.c b/src/game_options.c index 8f549f7..5328916 100644 --- a/src/game_options.c +++ b/src/game_options.c @@ -1,9 +1,26 @@ #include "global.h" #include "gUnknown_203B46C.h" +struct unkStruct_8109954 +{ + // size: 0x10 + u32 unk0[4]; +}; + +struct unkStruct_8094CB0 +{ + u16 unk0; + s16 unk2; +}; + +extern struct unkStruct_8109954 gUnknown_8109954; + extern struct UnkSaveStruct1 *gUnknown_203B46C; extern struct UnkSaveStruct1 gUnknown_2038C70; -extern void sub_8094C14(); +extern void sub_8094C14(void); +extern void sub_80099F0(u32); +extern void sub_809488C(u8 *r0, u8 *r1, u32 r2); +extern void sub_8094924(u8 *r0, u8 *r1, u32 r2); void LoadGameOptions(void) { @@ -32,3 +49,255 @@ void InitializeGameOptions(u8 r0) gUnknown_203B46C->unkC = 0; sub_8094C14(); } + +bool32 GameOptionsNotChange(struct UnkSaveStruct1 *r0) +{ + // NOTE: had to nest to match + if(gUnknown_203B46C->unk8 == r0->unk8) + if(gUnknown_203B46C->unk9 == r0->unk9) + if(gUnknown_203B46C->unkA == r0->unkA) + if(gUnknown_203B46C->playerGender == r0->playerGender) + if(gUnknown_203B46C->unk0 == r0->unk0) + if(gUnknown_203B46C->unk1 == r0->unk1) + if(gUnknown_203B46C->unk2 == r0->unk2) + if(gUnknown_203B46C->unk3 == r0->unk3) + if(gUnknown_203B46C->unk4 == r0->unk4) + if(gUnknown_203B46C->unkC == r0->unkC) + return TRUE; + return FALSE; +} + +void WriteGameOptions(u8 *param_1) +{ + u8 zero; + u8 neg_1; + u8 *puVar2; + + + neg_1 = -1; + zero = 0; + + sub_809488C(param_1, &gUnknown_203B46C->unk8, 2); + + if(gUnknown_203B46C->unk9 != 0) + { + puVar2 = &neg_1; + } + else + { + puVar2 = &zero; + } + sub_809488C(param_1, puVar2, 1); + + if(gUnknown_203B46C->unkA != 0) + { + puVar2 = &neg_1; + } + else + { + puVar2 = &zero; + } + sub_809488C(param_1, puVar2, 1); + + if(gUnknown_203B46C->playerGender != 0) + { + puVar2 = &neg_1; + } + else + { + puVar2 = &zero; + } + sub_809488C(param_1, puVar2, 1); + + if(gUnknown_203B46C->unk0 != 0) + { + puVar2 = &neg_1; + } + else + { + puVar2 = &zero; + } + sub_809488C(param_1, puVar2, 1); + + if(gUnknown_203B46C->unk1 != 0) + { + puVar2 = &neg_1; + } + else + { + puVar2 = &zero; + } + sub_809488C(param_1, puVar2, 1); + + if(gUnknown_203B46C->unk2 != 0) + { + puVar2 = &neg_1; + } + else + { + puVar2 = &zero; + } + sub_809488C(param_1, puVar2, 1); + + if(gUnknown_203B46C->unk3 != 0) + { + puVar2 = &neg_1; + } + else + { + puVar2 = &zero; + } + sub_809488C(param_1, puVar2, 1); + + sub_809488C(param_1, &gUnknown_203B46C->unk4, 3); + sub_809488C(param_1, &gUnknown_203B46C->unkC, 2); +} + +void ReadGameOptions(u8 *param_1) +{ + u8 byteArray[4]; + sub_8094924(param_1, byteArray, 2); + gUnknown_203B46C->unk8 = byteArray[0] & 3; + + sub_8094924(param_1, byteArray, 1); + gUnknown_203B46C->unk9 = byteArray[0] & 1; + + sub_8094924(param_1, byteArray, 1); + gUnknown_203B46C->unkA = byteArray[0] & 1; + + sub_8094924(param_1, byteArray, 1); + gUnknown_203B46C->playerGender = byteArray[0] & 1; + + sub_8094924(param_1, byteArray, 1); + gUnknown_203B46C->unk0 = byteArray[0] & 1; + + sub_8094924(param_1, byteArray, 1); + gUnknown_203B46C->unk1 = byteArray[0] & 1; + + sub_8094924(param_1, byteArray, 1); + gUnknown_203B46C->unk2 = byteArray[0] & 1; + + sub_8094924(param_1, byteArray, 1); + gUnknown_203B46C->unk3 = byteArray[0] & 1; + + sub_8094924(param_1, byteArray, 3); + gUnknown_203B46C->unk4 = byteArray[0] & 7; + + sub_8094924(param_1, byteArray, 2); + gUnknown_203B46C->unkC = byteArray[0] & 3; + + sub_8094C14(); +} + +void sub_8094C14(void) +{ + struct unkStruct_8109954 temp; + + temp = gUnknown_8109954; + + sub_80099F0(temp.unk0[gUnknown_203B46C->unk8 & 3]); +} + +u32 sub_8094C48(void) +{ + switch(gUnknown_203B46C->unk4) + { + default: + return 1; + case 0: + case 3: + return 0; + } +} + +u32 sub_8094C68(void) +{ + switch(gUnknown_203B46C->unk4) + { + default: + return 1; + case 2: + case 5: + return 0; + } +} + +void sub_8094C88(void) +{ + if(gUnknown_203B46C->unk4 < 3) + gUnknown_203B46C->unk4 = 1; + else + { + if((u8)(gUnknown_203B46C->unk4 - 3) > 2) + return; + else + gUnknown_203B46C->unk4 = 4; + } +} + +void sub_8094CB0(struct unkStruct_8094CB0 *r0) +{ + r0->unk0 = -1; + r0->unk2 = -1; +} + +void sub_8094CC0(struct unkStruct_8094CB0 *r0) +{ + r0->unk0 = -1; + r0->unk2 = -1; +} + +void sub_8094CD0(struct unkStruct_8094CB0 *r0) +{ + r0->unk0 = -1; + r0->unk2 = -1; +} + +void sub_8094CE0(struct unkStruct_8094CB0 *r0) +{ + r0->unk0 = -1; + r0->unk2 = -1; +} + +void sub_8094CF0(struct unkStruct_8094CB0 *r0) +{ + r0->unk0 = -1; + r0->unk2 = -1; +} + +void sub_8094D00(struct unkStruct_8094CB0 *r0) +{ + r0->unk0 = -1; + r0->unk2 = -1; +} + +u32 sub_8094D10(void) +{ + return 0; +} + +u32 sub_8094D14(void) +{ + return 0; +} + +u32 sub_8094D18(void) +{ + return 0; +} + +u32 sub_8094D1C(void) +{ + return 0; +} + +u32 sub_8094D20(void) +{ + return 0; +} + +u32 sub_8094D24(void) +{ + return 0; +} + diff --git a/src/load_screen.c b/src/load_screen.c index 6271dbc..c0ff22d 100644 --- a/src/load_screen.c +++ b/src/load_screen.c @@ -93,10 +93,10 @@ extern u8 sub_80023E4(u32); extern u8 *sub_8098FB4(); extern void ExpandPlaceholdersBuffer(u8 *buffer, u8 *text, ...); extern s32 sub_8011C1C(void); -extern u8 *sub_809769C(void); +extern u8 *GetDungeonLocationInfo(void); extern u32 GetNumAdventures(void); extern void xxx_call_draw_string(u32 x, u32 y, u8 *, u32, u32); -extern void sub_8090228(u8 *, u8 *); +extern void PrintDungeonLocationtoBuffer(u8 *, u8 *); extern void sub_80922B4(u8 *, u8 *, u32); extern s32 sub_8095324(u32); extern u32 sub_8001658(u32, u32); @@ -257,7 +257,7 @@ void DrawLoadScreenText(void) // TODO: fix these branches.. correct logic but branching isn't right if ((sub_8095324(1) != 0) || (sub_8095324(7) != 0)) { if (iVar2 == 0xf1207) { - sub_8090228(gUnknown_203B374->formattedLocation,sub_809769C()); + PrintDungeonLocationtoBuffer(gUnknown_203B374->formattedLocation,GetDungeonLocationInfo()); } else { ExpandPlaceholdersBuffer(gUnknown_203B374->formattedLocation,&gUnknown_80E780C); // Quicksave data deleted @@ -266,9 +266,6 @@ void DrawLoadScreenText(void) else { switch(sub_8011C1C()) { - default: - ExpandPlaceholdersBuffer(gUnknown_203B374->formattedLocation,&gUnknown_80E7824); // Location unknown - break; case 1: switch(sub_8001658(0,24)) { @@ -285,11 +282,14 @@ void DrawLoadScreenText(void) case 2: if (iVar2 == 0xf1207) { - sub_8090228(gUnknown_203B374->formattedLocation,sub_809769C()); + PrintDungeonLocationtoBuffer(gUnknown_203B374->formattedLocation,GetDungeonLocationInfo()); } else { ExpandPlaceholdersBuffer(gUnknown_203B374->formattedLocation,&gUnknown_80E780C); // Quicksave data deleted } break; + default: + ExpandPlaceholdersBuffer(gUnknown_203B374->formattedLocation,&gUnknown_80E7824); // Location unknown + break; } } xxx_call_draw_string(64,24,gUnknown_203B374->formattedLocation,0,0); @@ -529,10 +529,10 @@ void DrawLoadScreenText(void) "\tlsls r2, 1\n" "\tadds r4, r2\n" "_08039676:\n" - "\tbl sub_809769C\n" + "\tbl GetDungeonLocationInfo\n" "\tadds r1, r0, 0\n" "\tadds r0, r4, 0\n" - "\tbl sub_8090228\n" + "\tbl PrintDungeonLocationtoBuffer\n" "\tb _08039696\n" "\t.align 2, 0\n" "_08039684: .4byte 0x000f1207\n" diff --git a/src/main_menu.c b/src/main_menu.c index 81b7525..cf0524a 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -6,6 +6,7 @@ #include "menu.h" #include "memory.h" #include "text.h" +#include "trade_items_menu.h" // NOTE: 0x13 and 0x14 // Communication Screen? @@ -26,20 +27,16 @@ void sub_8035DA0(void); extern void sub_8094C14(void); extern void sub_8099690(u32); -extern void DrawMainMenu(void); -extern void CreateTradeItemsMenu(void); extern void sub_8036FDC(s32); extern void CreateWirelessCommsMenu(void); extern void CreateFriendRescueMenu(void); extern void CreateDualSlotMenu(void); extern void CreateWonderMailMenu(void); extern void CreateLoadScreen(u32); -extern s32 sub_8035DB4(u32); extern void CreateRescuePasswordMenu(u32); extern void CreateSaveMenu(u32); extern s32 UpdateMainMenu(void); extern s32 UpdateLoadScreenMenu(void); -extern s32 UpdateTradeItemsMenu(void); extern s32 UpdateFriendRescueMenu(void); extern s32 UpdateWonderMailMenu(void); extern s32 UpdateDualSlotMenu(void); @@ -47,10 +44,7 @@ extern s32 UpdateWirelessCommsMenu(void); extern s32 UpdateRescuePasswordMenu(void); extern s32 sub_80383D4(void); extern s32 UpdateSaveMenu(void); - -extern void CleanMainMenu(void); extern void CleanLoadScreen(void); -extern void CleanTradeItemsMenu(void); extern void sub_80370D4(void); extern void CleanFriendRescueMenu(void); extern void CleanWonderMailMenu(void); @@ -60,6 +54,10 @@ extern void CleanRescuePasswordMenu(void); extern void sub_80383A8(void); extern void CleanSaveMenu(void); +void CleanMainMenu(void); +void DrawMainMenu(void); +s32 sub_8035DB4(u32); + struct unkSubStruct { u32 unk0; @@ -485,6 +483,7 @@ s32 sub_8035DB4(u32 currMenu) break; case 0x1a: returnVar = 7; + break; } return returnVar; } diff --git a/src/save.c b/src/save.c index a5bc356..ef09572 100644 --- a/src/save.c +++ b/src/save.c @@ -15,7 +15,7 @@ struct unk_struct u8 unk4[0x10]; // has "POKE_DUNGEON__05 u32 unk14; u32 unk18; - u32 unk1C; + u32 dungeonLocation; u32 unk20; u32 padding[503]; }; @@ -179,7 +179,7 @@ extern u32 sub_80958F8(void); extern void sub_8095900(void); extern void sub_80972F4(void); extern u32 sub_8097680(void); -extern u32 *sub_809769C(void); +extern u32 *GetDungeonLocationInfo(void); extern void sub_80974E8(void); extern void ResetNumAdventures(void); extern void sub_80993D8(void); @@ -529,7 +529,7 @@ u32 sub_80121E0(u32 r0) temp = 0x1F; r4->unk18 = r0; - r4->unk1C = *sub_809769C(); + r4->dungeonLocation = *GetDungeonLocationInfo(); r4->unk14 = 0x5071412; string = sub_8011C4C(); diff --git a/src/trade_items_menu.c b/src/trade_items_menu.c index 0e1d171..da5abbc 100644 --- a/src/trade_items_menu.c +++ b/src/trade_items_menu.c @@ -114,7 +114,7 @@ enum TradeItemsModes }; -u32 CreateTradeItemsMenu(void) +s32 CreateTradeItemsMenu(void) { ResetUnusedInputStruct(); @@ -128,7 +128,7 @@ u32 CreateTradeItemsMenu(void) return 1; } -u32 UpdateTradeItemsMenu(void) +s32 UpdateTradeItemsMenu(void) { switch(gTradeItemsMenu->currMenu) { diff --git a/src/wonder_mail_main_menu.c b/src/wonder_mail_main_menu.c index d6d6c2d..d2e1fca 100644 --- a/src/wonder_mail_main_menu.c +++ b/src/wonder_mail_main_menu.c @@ -62,7 +62,7 @@ extern bool8 DecodeWonderMailPassword(u8 *, struct WonderMail *); extern bool8 IsValidWonderMail(struct WonderMail *WonderMailData); extern void sub_80141B4(u32 *r0, u32, u32 *r1, u32); -void sub_8039BAC(u32); +void PrintWonderMailMainMenuError(u32); void HandleWonderMailMainScreen(void); void sub_8039AA8(void); void sub_8039B14(void); @@ -73,8 +73,8 @@ void HandlePasswordSuccess(void); void HandlePrepareSaveScreen(void); void HandleSaveAdventureScreen(void); void HandleWonderMailAddedScreen(void); -void sub_8039B3C(void); -void sub_8039D0C(void); +void ReturnToWonderMailMainScreen(void); +void AdvanceToPasswordEntryScreen(void); void HandlePasswordEntryScreen(void); void HandleInvalidPasswordMenu(void); @@ -150,10 +150,10 @@ u8 UpdateWonderMailMenu(void) HandleWonderMailAddedScreen(); break; case COMMUNICATION_ERROR: - sub_8039B3C(); + ReturnToWonderMailMainScreen(); break; case PROMPT_PASSWORD_ENTRY: // "Please enter the Wonder Mail Password" Screen - sub_8039D0C(); + AdvanceToPasswordEntryScreen(); break; case PASSWORD_ENTRY_SCREEN: // Password Entry HandlePasswordEntryScreen(); @@ -242,7 +242,7 @@ void sub_8039B20(void) } } -void sub_8039B3C(void) +void ReturnToWonderMailMainScreen(void) { s32 local_8; @@ -267,15 +267,15 @@ void sub_8039B58(void) } } else { - sub_8039BAC(gUnknown_203B3E8->wonderMailStatus); + PrintWonderMailMainMenuError(gUnknown_203B3E8->wonderMailStatus); SetWonderMailMainMenuState(COMMUNICATION_ERROR); } } } -void sub_8039BAC(u32 arg) +void PrintWonderMailMainMenuError(u32 status) { - switch(arg) + switch(status) { case 0: break; @@ -356,7 +356,7 @@ void HandlePasswordEntryScreen(void) } } -void sub_8039D0C(void) +void AdvanceToPasswordEntryScreen(void) { int iVar2; if(sub_80144A4(&iVar2) == 0) -- cgit v1.2.3