mirror of
https://github.com/pret/pmd-red.git
synced 2026-07-21 10:30:55 -05:00
531 lines
12 KiB
C
531 lines
12 KiB
C
#include "global.h"
|
|
#include "debug_menu.h"
|
|
#include "main_menu.h"
|
|
#include "adventure_log.h"
|
|
#include "input.h"
|
|
#include "menu.h"
|
|
#include "memory.h"
|
|
#include "text.h"
|
|
#include "trade_items_menu.h"
|
|
|
|
// NOTE: 0x13 and 0x14
|
|
// Communication Screen?
|
|
// Got Communication warning when I wrote them to the struct
|
|
|
|
// NOTE: 0x29, 0x2A, 0x2B, 0x2C
|
|
// Triggers a save
|
|
|
|
// NOTE: 0x2D
|
|
// Triggers a save and then goes to 0x13 (comms warning)
|
|
|
|
// NOTE: 0x2E
|
|
// Deletes the Save
|
|
|
|
|
|
extern struct MainMenu *gMainMenu;
|
|
void sub_8035DA0(void);
|
|
|
|
extern void sub_8094C14(void);
|
|
extern void sub_8099690(u32);
|
|
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 void CreateRescuePasswordMenu(u32);
|
|
extern void CreateSaveMenu(u32);
|
|
extern s32 UpdateMainMenu(void);
|
|
extern s32 UpdateLoadScreenMenu(void);
|
|
extern s32 UpdateFriendRescueMenu(void);
|
|
extern s32 UpdateWonderMailMenu(void);
|
|
extern s32 UpdateDualSlotMenu(void);
|
|
extern s32 UpdateWirelessCommsMenu(void);
|
|
extern s32 UpdateRescuePasswordMenu(void);
|
|
extern s32 sub_80383D4(void);
|
|
extern s32 UpdateSaveMenu(void);
|
|
extern void CleanLoadScreen(void);
|
|
extern void sub_80370D4(void);
|
|
extern void CleanFriendRescueMenu(void);
|
|
extern void CleanWonderMailMenu(void);
|
|
extern void CleanDualSlotMenu(void);
|
|
extern void CleanWirelessCommsMenu(void);
|
|
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;
|
|
u32 unk4;
|
|
};
|
|
|
|
struct unkStruct_203B34C
|
|
{
|
|
// size: 0x1A8
|
|
u32 unk0;
|
|
u32 unk4;
|
|
struct unkSubStruct *unk8; // Array of menu choices??
|
|
u8 fillC[0x30 - 0xC];
|
|
s16 menuIndex;
|
|
u8 fill32[0x144 - 0x32];
|
|
struct UnkTextStruct2 unk144[4];
|
|
/* 0x1A4 */ u32 currMenuChoice;
|
|
};
|
|
|
|
extern struct unkStruct_203B34C *gUnknown_203B34C;
|
|
|
|
extern struct MainMenu *gMainMenu;
|
|
extern struct UnkTextStruct2 gUnknown_80E59A8;
|
|
extern struct UnkTextStruct2 gUnknown_80E59C8;
|
|
|
|
extern bool8 SetMainMenuText();
|
|
extern void SetMainMenuItems();
|
|
|
|
struct unkStruct_Menu
|
|
{
|
|
// size 0x50;
|
|
u8 fil0[0x4C];
|
|
u8 unk4C;
|
|
u8 fill4D[0x50 - 0x4D];
|
|
};
|
|
|
|
extern void sub_8012D60(struct unkStruct_Menu *, const struct MenuItem *, u32, u32, u32, u32);
|
|
extern void sub_8012E04(struct unkStruct_Menu *, const struct MenuItem *, u32, u32, u32, u32);
|
|
|
|
|
|
void InitMainMenu(void)
|
|
{
|
|
if (gMainMenu == NULL) {
|
|
gMainMenu = MemoryAlloc(sizeof(struct MainMenu),8);
|
|
MemoryFill8((u8 *)gMainMenu, 0, sizeof(struct MainMenu));
|
|
}
|
|
gMainMenu->currMenu = MENU_NO_SCREEN_CHANGE;
|
|
gMainMenu->nextMenu = MENU_MAIN_SCREEN;
|
|
gMainMenu->lastMenu = MENU_MAIN_SCREEN;
|
|
gMainMenu->unk38 = -1;
|
|
gMainMenu->unk3C = -1;
|
|
gMainMenu->sub.unk2E = 0;
|
|
gMainMenu->sub.unk2C = 1;
|
|
gMainMenu->sub.unk2D = 0;
|
|
sub_8035DA0();
|
|
gMainMenu->unk3A = 0;
|
|
}
|
|
|
|
void DeleteMainMenu(void)
|
|
{
|
|
if(gMainMenu){
|
|
MemoryFree(gMainMenu);
|
|
gMainMenu = NULL;
|
|
}
|
|
}
|
|
|
|
void SetUpMenu(void)
|
|
{
|
|
if (gMainMenu->currMenu != gMainMenu->nextMenu) {
|
|
switch(gMainMenu->nextMenu) {
|
|
case MENU_MAIN_SCREEN:
|
|
sub_8094C14();
|
|
sub_8099690(0);
|
|
DrawMainMenu();
|
|
break;
|
|
case MENU_AWAITING_RESCUE:
|
|
case MENU_CONTINUE:
|
|
case MENU_DELETE_SAVE_PROMPT:
|
|
case MENU_DELETE_SAVE_CONFIRM:
|
|
CreateLoadScreen(gMainMenu->nextMenu);
|
|
break;
|
|
case MENU_TRADE_ITEMS:
|
|
CreateTradeItemsMenu();
|
|
break;
|
|
case MENU_COMMUNICATION_1:
|
|
case MENU_COMMUNICATION_2:
|
|
sub_8036FDC(sub_8035DB4(gMainMenu->nextMenu));
|
|
break;
|
|
case MENU_FRIEND_RESCUE:
|
|
CreateFriendRescueMenu();
|
|
break;
|
|
case MENU_WONDER_MAIL:
|
|
CreateWonderMailMenu();
|
|
break;
|
|
case MENU_DUAL_SLOT:
|
|
CreateDualSlotMenu();
|
|
break;
|
|
case MENU_WIRELESS_COMMS:
|
|
CreateWirelessCommsMenu();
|
|
break;
|
|
case MENU_DISPLAY_RESCUE_PASSWORD:
|
|
case MENU_RESCUE_PASSWORD_ENTRY:
|
|
CreateRescuePasswordMenu(gMainMenu->nextMenu);
|
|
break;
|
|
case MENU_ADVENTURE_LOG:
|
|
CreateAdventureLogMenu();
|
|
break;
|
|
case 0x29:
|
|
case 0x2a:
|
|
case 0x2b:
|
|
case 0x2c:
|
|
case 0x2d:
|
|
case MENU_DELETE_SAVE:
|
|
CreateSaveMenu(gMainMenu->nextMenu);
|
|
break;
|
|
case MENU_DEBUG:
|
|
CreateDebugMenu();
|
|
break;
|
|
}
|
|
gMainMenu->currMenu = gMainMenu->nextMenu;
|
|
}
|
|
}
|
|
|
|
s32 UpdateMenu(void)
|
|
{
|
|
s32 iVar1;
|
|
s32 nextMenu;
|
|
|
|
nextMenu = MENU_NO_SCREEN_CHANGE;
|
|
switch(gMainMenu->nextMenu) {
|
|
case MENU_MAIN_SCREEN:
|
|
nextMenu = UpdateMainMenu();
|
|
break;
|
|
case MENU_AWAITING_RESCUE:
|
|
case MENU_CONTINUE:
|
|
case MENU_DELETE_SAVE_PROMPT:
|
|
case MENU_DELETE_SAVE_CONFIRM:
|
|
nextMenu = UpdateLoadScreenMenu();
|
|
break;
|
|
case MENU_TRADE_ITEMS:
|
|
iVar1 = UpdateTradeItemsMenu();
|
|
nextMenu = MENU_MAIN_SCREEN;
|
|
if (iVar1 != 3) {
|
|
nextMenu = MENU_NO_SCREEN_CHANGE;
|
|
}
|
|
break;
|
|
case MENU_FRIEND_RESCUE:
|
|
iVar1 = UpdateFriendRescueMenu();
|
|
nextMenu = MENU_MAIN_SCREEN;
|
|
if (iVar1 != 3) {
|
|
nextMenu = MENU_NO_SCREEN_CHANGE;
|
|
}
|
|
break;
|
|
case MENU_WONDER_MAIL:
|
|
iVar1 = UpdateWonderMailMenu();
|
|
nextMenu = MENU_MAIN_SCREEN;
|
|
if (iVar1 != 3) {
|
|
nextMenu = MENU_NO_SCREEN_CHANGE;
|
|
}
|
|
break;
|
|
case MENU_DUAL_SLOT:
|
|
iVar1 = UpdateDualSlotMenu();
|
|
nextMenu = MENU_MAIN_SCREEN;
|
|
if (iVar1 != 3) {
|
|
nextMenu = MENU_NO_SCREEN_CHANGE;
|
|
}
|
|
break;
|
|
case MENU_WIRELESS_COMMS:
|
|
iVar1 = UpdateWirelessCommsMenu();
|
|
nextMenu = 5;
|
|
if ((iVar1 != 3) && (nextMenu = MENU_NO_SCREEN_CHANGE, iVar1 == 2)) {
|
|
nextMenu = MENU_MAIN_SCREEN;
|
|
}
|
|
break;
|
|
case MENU_DISPLAY_RESCUE_PASSWORD:
|
|
case MENU_RESCUE_PASSWORD_ENTRY:
|
|
nextMenu = UpdateRescuePasswordMenu();
|
|
break;
|
|
case MENU_ADVENTURE_LOG:
|
|
nextMenu = UpdateAdventureLogMenu();
|
|
break;
|
|
case 0x24:
|
|
case 0x25:
|
|
case 0x26:
|
|
case 0x27:
|
|
case 0x28:
|
|
nextMenu = sub_80383D4();
|
|
break;
|
|
case 0x29:
|
|
case 0x2a:
|
|
case 0x2b:
|
|
case 0x2c:
|
|
case 0x2d:
|
|
case MENU_DELETE_SAVE:
|
|
nextMenu = UpdateSaveMenu();
|
|
break;
|
|
case MENU_DEBUG:
|
|
nextMenu = UpdateDebugMenu();
|
|
break;
|
|
}
|
|
if (nextMenu != MENU_NO_SCREEN_CHANGE) {
|
|
gMainMenu->nextMenu = nextMenu;
|
|
}
|
|
return nextMenu;
|
|
}
|
|
|
|
void CleanUpMenu(void)
|
|
{
|
|
if (gMainMenu->lastMenu != gMainMenu->nextMenu) {
|
|
switch(gMainMenu->lastMenu) {
|
|
case MENU_MAIN_SCREEN:
|
|
CleanMainMenu();
|
|
break;
|
|
case MENU_AWAITING_RESCUE:
|
|
case MENU_CONTINUE:
|
|
case MENU_DELETE_SAVE_PROMPT:
|
|
case MENU_DELETE_SAVE_CONFIRM:
|
|
CleanLoadScreen();
|
|
break;
|
|
case MENU_TRADE_ITEMS:
|
|
CleanTradeItemsMenu();
|
|
break;
|
|
case MENU_COMMUNICATION_1:
|
|
case MENU_COMMUNICATION_2:
|
|
sub_80370D4();
|
|
break;
|
|
case MENU_FRIEND_RESCUE:
|
|
CleanFriendRescueMenu();
|
|
break;
|
|
case MENU_WONDER_MAIL:
|
|
CleanWonderMailMenu();
|
|
break;
|
|
case MENU_DUAL_SLOT:
|
|
CleanDualSlotMenu();
|
|
break;
|
|
case MENU_WIRELESS_COMMS:
|
|
CleanWirelessCommsMenu();
|
|
break;
|
|
case MENU_DISPLAY_RESCUE_PASSWORD:
|
|
case MENU_RESCUE_PASSWORD_ENTRY:
|
|
CleanRescuePasswordMenu();
|
|
break;
|
|
case MENU_ADVENTURE_LOG:
|
|
CleanAdventureLogMenu();
|
|
break;
|
|
case 0x24:
|
|
case 0x25:
|
|
case 0x26:
|
|
case 0x27:
|
|
case 0x28:
|
|
sub_80383A8();
|
|
break;
|
|
case 0x29:
|
|
case 0x2a:
|
|
case 0x2b:
|
|
case 0x2c:
|
|
case 0x2d:
|
|
case MENU_DELETE_SAVE:
|
|
CleanSaveMenu();
|
|
break;
|
|
case MENU_DEBUG:
|
|
DeleteDebugMenu();
|
|
break;
|
|
}
|
|
gMainMenu->lastMenu = gMainMenu->nextMenu;
|
|
}
|
|
}
|
|
|
|
// Unused
|
|
void sub_8035C00(struct MainMenuSub *param)
|
|
{
|
|
gMainMenu->sub = *param;
|
|
}
|
|
|
|
// Unused
|
|
struct MainMenuSub *sub_8035C10(void)
|
|
{
|
|
return &gMainMenu->sub;
|
|
}
|
|
|
|
void sub_8035C1C(void)
|
|
{
|
|
gMainMenu->sub.unk2E = 0;
|
|
gMainMenu->sub.unk2C = 1;
|
|
gMainMenu->sub.unk2D = 0;
|
|
}
|
|
|
|
void
|
|
SetMenuItems(struct unkStruct_Menu *param_1, struct UnkTextStruct2 *unkData, int param_3, const struct UnkTextStruct2 *param_4, const struct MenuItem *param_5, char param_6 ,u32 param_7, u32 unused_8)
|
|
{
|
|
unkData[param_3] = *param_4;
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(unkData,1,1);
|
|
if (param_6 != '\0') {
|
|
sub_8012D60(¶m_1[param_3],param_5,0,0,param_7,param_3);
|
|
}
|
|
else {
|
|
sub_8012E04(¶m_1[param_3],param_5,0,0,0,param_3);
|
|
}
|
|
param_1[param_3].unk4C = 1;
|
|
}
|
|
|
|
void sub_8035CC0(struct UnkTextStruct2 *dataArray, u32 index)
|
|
{
|
|
sub_8006518(dataArray);
|
|
dataArray[index] = gUnknown_80E59A8;
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(dataArray, 1, 1);
|
|
}
|
|
|
|
NAKED
|
|
void sub_8035CF4(void * Menu, u32 index, u8 r2)
|
|
{
|
|
asm_unified("\tpush {lr}\n"
|
|
"\tadds r3, r0, 0\n"
|
|
"\tlsls r0, r1, 2\n"
|
|
"\tadds r0, r1\n"
|
|
"\tlsls r0, 4\n"
|
|
"\tadds r0, r3\n"
|
|
"\tadds r1, r0, 0\n"
|
|
"\tadds r1, 0x4C\n"
|
|
"\tstrb r2, [r1]\n"
|
|
"\tadds r2, r0, 0\n"
|
|
"\tadds r2, 0x4D\n"
|
|
"\tmovs r1, 0x1\n"
|
|
"\tstrb r1, [r2]\n"
|
|
"\tsubs r1, 0x2\n"
|
|
"\tstr r1, [r0, 0x48]\n"
|
|
"\tbl sub_8012EBC\n"
|
|
"\tpop {r0}\n"
|
|
"\tbx r0");
|
|
}
|
|
|
|
void sub_8035D1C(void)
|
|
{
|
|
gMainMenu->unk38 = -1;
|
|
}
|
|
|
|
void sub_8035D30(s32 r0)
|
|
{
|
|
gMainMenu->unk38 = r0;
|
|
}
|
|
|
|
s16 sub_8035D3C(void)
|
|
{
|
|
return gMainMenu->unk38;
|
|
}
|
|
|
|
struct MainMenu *GetMainMenu(void)
|
|
{
|
|
return gMainMenu;
|
|
}
|
|
|
|
void sub_8035D58(void)
|
|
{
|
|
gMainMenu->unk3C = -1;
|
|
}
|
|
|
|
void sub_8035D68(s32 r0)
|
|
{
|
|
gMainMenu->unk3C = r0;
|
|
}
|
|
|
|
s32 sub_8035D74(void)
|
|
{
|
|
return gMainMenu->unk3C;
|
|
}
|
|
|
|
|
|
// Unused
|
|
NAKED
|
|
void sub_8035D80(void *r0)
|
|
{
|
|
asm_unified(
|
|
"\tldr r1, _08035D90\n"
|
|
"\tldr r2, [r1]\n"
|
|
"\tldr r1, [r0, 0x4]\n"
|
|
"\tldr r0, [r0]\n"
|
|
"\tstr r0, [r2, 0x30]\n"
|
|
"\tstr r1, [r2, 0x34]\n"
|
|
"\tbx lr\n"
|
|
"\t.align 2, 0\n"
|
|
"_08035D90: .4byte gMainMenu");
|
|
}
|
|
|
|
u8 *sub_8035D94(void)
|
|
{
|
|
return &gMainMenu->unk30;
|
|
}
|
|
|
|
|
|
void sub_8035DA0(void)
|
|
{
|
|
gMainMenu->unk30 = 0;
|
|
gMainMenu->unk34 = 0;
|
|
}
|
|
|
|
s32 sub_8035DB4(u32 currMenu)
|
|
{
|
|
s32 returnVar = 8;
|
|
switch(currMenu)
|
|
{
|
|
case MENU_COMMUNICATION_1:
|
|
returnVar = 0;
|
|
break;
|
|
case MENU_COMMUNICATION_2:
|
|
returnVar = 1;
|
|
break;
|
|
case 0x15:
|
|
returnVar = 2;
|
|
break;
|
|
case 0x16:
|
|
returnVar = 3;
|
|
break;
|
|
case 0x17:
|
|
returnVar = 4;
|
|
break;
|
|
case 0x18:
|
|
returnVar = 5;
|
|
break;
|
|
case 0x19:
|
|
returnVar = 6;
|
|
break;
|
|
case 0x1a:
|
|
returnVar = 7;
|
|
break;
|
|
}
|
|
return returnVar;
|
|
}
|
|
|
|
void DrawMainMenu(void)
|
|
{
|
|
s32 iVar3;
|
|
|
|
if(gUnknown_203B34C == NULL)
|
|
{
|
|
gUnknown_203B34C = MemoryAlloc(sizeof(struct unkStruct_203B34C), 8);
|
|
MemoryFill8((u8 *)gUnknown_203B34C, 0, sizeof(struct unkStruct_203B34C));
|
|
}
|
|
|
|
for(iVar3 = 0; iVar3 < 4; iVar3++)
|
|
{
|
|
gUnknown_203B34C->unk144[iVar3] = gUnknown_80E59C8;
|
|
}
|
|
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(gUnknown_203B34C->unk144, 1, 1);
|
|
SetMainMenuItems();
|
|
gUnknown_203B34C->currMenuChoice = -1;
|
|
|
|
if(SetMainMenuText())
|
|
{
|
|
sub_8035CF4(&gUnknown_203B34C->unk4,2,0);
|
|
}
|
|
|
|
sub_8035CF4(&gUnknown_203B34C->unk4,0,1);
|
|
gUnknown_203B34C->unk0 = 1;
|
|
}
|
|
|
|
void CleanMainMenu(void)
|
|
{
|
|
ResetUnusedInputStruct();
|
|
sub_800641C(NULL, 1, 1);
|
|
if(gUnknown_203B34C != NULL)
|
|
{
|
|
MemoryFree(gUnknown_203B34C);
|
|
gUnknown_203B34C = NULL;
|
|
}
|
|
}
|
|
|