Document main_menu

This commit is contained in:
PikalaxALT
2019-10-08 13:40:04 -04:00
parent 99bd3d9154
commit 3c3fd189d8
2 changed files with 250 additions and 140 deletions
BIN
View File
Binary file not shown.
+250 -140
View File
@@ -25,6 +25,30 @@
#include "text_window_graphics.h" #include "text_window_graphics.h"
#include "constants/songs.h" #include "constants/songs.h"
enum MainMenuType
{
MAIN_MENU_NEWGAME = 0,
MAIN_MENU_CONTINUE,
MAIN_MENU_MYSTERYGIFT
};
enum MainMenuWindow
{
MAIN_MENU_WINDOW_NEWGAME_ONLY = 0,
MAIN_MENU_WINDOW_CONTINUE,
MAIN_MENU_WINDOW_NEWGAME,
MAIN_MENU_WINDOW_MYSTERYGIFT,
MAIN_MENU_WINDOW_ERROR,
MAIN_MENU_WINDOW_COUNT
};
#define tMenuType data[0]
#define tCursorPos data[1]
#define tUnused8 data[8]
#define tMGErrorMsgState data[9]
#define tMGErrorType data[10]
static bool32 MainMenuGpuInit(u8 a0); static bool32 MainMenuGpuInit(u8 a0);
static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId); static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId);
static void PrintSaveErrorStatus(u8 taskId, const u8 *str); static void PrintSaveErrorStatus(u8 taskId, const u8 *str);
@@ -48,14 +72,14 @@ static void PrintDexCount(void);
static void PrintBadgeCount(void); static void PrintBadgeCount(void);
static void LoadUserFrameToBg(u8 bgId); static void LoadUserFrameToBg(u8 bgId);
static void SetStdFrame0OnBg(u8 bgId); static void SetStdFrame0OnBg(u8 bgId);
static void DrawBubbleBorder(const struct WindowTemplate * template); static void MainMenu_DrawWindow(const struct WindowTemplate * template);
static void DestroyWindowBubbleFrame(const struct WindowTemplate * template); static void MainMenu_EraseWindow(const struct WindowTemplate * template);
static const u8 sString_Dummy[] = _(""); static const u8 sString_Dummy[] = _("");
static const u8 sString_Newline[] = _("\n"); static const u8 sString_Newline[] = _("\n");
static const struct WindowTemplate sWindowTemplate[] = { static const struct WindowTemplate sWindowTemplate[] = {
{ [MAIN_MENU_WINDOW_NEWGAME_ONLY] = {
.bg = 0, .bg = 0,
.tilemapLeft = 3, .tilemapLeft = 3,
.tilemapTop = 1, .tilemapTop = 1,
@@ -63,7 +87,8 @@ static const struct WindowTemplate sWindowTemplate[] = {
.height = 2, .height = 2,
.paletteNum = 15, .paletteNum = 15,
.baseBlock = 0x001 .baseBlock = 0x001
}, { },
[MAIN_MENU_WINDOW_CONTINUE] = {
.bg = 0, .bg = 0,
.tilemapLeft = 3, .tilemapLeft = 3,
.tilemapTop = 1, .tilemapTop = 1,
@@ -71,7 +96,8 @@ static const struct WindowTemplate sWindowTemplate[] = {
.height = 10, .height = 10,
.paletteNum = 15, .paletteNum = 15,
.baseBlock = 0x001 .baseBlock = 0x001
}, { },
[MAIN_MENU_WINDOW_NEWGAME] = {
.bg = 0, .bg = 0,
.tilemapLeft = 3, .tilemapLeft = 3,
.tilemapTop = 13, .tilemapTop = 13,
@@ -79,7 +105,8 @@ static const struct WindowTemplate sWindowTemplate[] = {
.height = 2, .height = 2,
.paletteNum = 15, .paletteNum = 15,
.baseBlock = 0x0f1 .baseBlock = 0x0f1
}, { },
[MAIN_MENU_WINDOW_MYSTERYGIFT] = {
.bg = 0, .bg = 0,
.tilemapLeft = 3, .tilemapLeft = 3,
.tilemapTop = 17, .tilemapTop = 17,
@@ -87,7 +114,8 @@ static const struct WindowTemplate sWindowTemplate[] = {
.height = 2, .height = 2,
.paletteNum = 15, .paletteNum = 15,
.baseBlock = 0x121 .baseBlock = 0x121
}, { },
[MAIN_MENU_WINDOW_ERROR] = {
.bg = 0, .bg = 0,
.tilemapLeft = 3, .tilemapLeft = 3,
.tilemapTop = 15, .tilemapTop = 15,
@@ -95,7 +123,8 @@ static const struct WindowTemplate sWindowTemplate[] = {
.height = 4, .height = 4,
.paletteNum = 15, .paletteNum = 15,
.baseBlock = 0x001 .baseBlock = 0x001
}, DUMMY_WIN_TEMPLATE },
[MAIN_MENU_WINDOW_COUNT] = DUMMY_WIN_TEMPLATE
}; };
static const u16 sBgPal00[] = INCBIN_U16("data/main_menu/unk_8234648.gbapal"); static const u16 sBgPal00[] = INCBIN_U16("data/main_menu/unk_8234648.gbapal");
@@ -114,7 +143,7 @@ static const struct BgTemplate sBgTemplate[] = {
} }
}; };
static const u8 gUnknown_8234694[] = { 0, 1, 2 }; static const u8 sMenuCursorYMax[] = { 0, 1, 2 };
static void CB2_MainMenu(void) static void CB2_MainMenu(void)
{ {
@@ -186,11 +215,16 @@ static bool32 MainMenuGpuInit(u8 a0)
SetMainCallback2(CB2_MainMenu); SetMainCallback2(CB2_MainMenu);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON);
taskId = CreateTask(Task_SetWin0BldRegsAndCheckSaveFile, 0); taskId = CreateTask(Task_SetWin0BldRegsAndCheckSaveFile, 0);
gTasks[taskId].data[1] = 0; gTasks[taskId].tCursorPos = 0;
gTasks[taskId].data[8] = a0; gTasks[taskId].tUnused8 = a0;
return FALSE; return FALSE;
} }
/*
* The entire screen is darkened slightly except at WIN0 to indicate
* the player cursor position.
*/
static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId) static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId)
{ {
if (!gPaletteFade.active) if (!gPaletteFade.active)
@@ -204,45 +238,45 @@ static void Task_SetWin0BldRegsAndCheckSaveFile(u8 taskId)
SetGpuReg(REG_OFFSET_BLDY, 7); SetGpuReg(REG_OFFSET_BLDY, 7);
switch (gSaveFileStatus) switch (gSaveFileStatus)
{ {
case 1: case SAVE_STATUS_OK:
LoadUserFrameToBg(0); LoadUserFrameToBg(0);
if (Flag_0x839_IsSet() == TRUE) if (Flag_0x839_IsSet() == TRUE)
{ {
gTasks[taskId].data[0] = 2; gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT;
} }
else else
{ {
gTasks[taskId].data[0] = 1; gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE;
} }
gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck; gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck;
break; break;
case 2: case SAVE_STATUS_INVALID:
SetStdFrame0OnBg(0); SetStdFrame0OnBg(0);
gTasks[taskId].data[0] = 0; gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME;
PrintSaveErrorStatus(taskId, gText_SaveFileHasBeenDeleted); PrintSaveErrorStatus(taskId, gText_SaveFileHasBeenDeleted);
break; break;
case 0xFF: case SAVE_STATUS_ERROR:
SetStdFrame0OnBg(0); SetStdFrame0OnBg(0);
gTasks[taskId].data[0] = 1; gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE;
PrintSaveErrorStatus(taskId, gText_SaveFileCorruptedPrevWillBeLoaded); PrintSaveErrorStatus(taskId, gText_SaveFileCorruptedPrevWillBeLoaded);
if (Flag_0x839_IsSet() == TRUE) if (Flag_0x839_IsSet() == TRUE)
{ {
gTasks[taskId].data[0] = 2; gTasks[taskId].tMenuType = MAIN_MENU_MYSTERYGIFT;
} }
else else
{ {
gTasks[taskId].data[0] = 1; gTasks[taskId].tMenuType = MAIN_MENU_CONTINUE;
} }
break; break;
case 0: case SAVE_STATUS_EMPTY:
default: default:
LoadUserFrameToBg(0); LoadUserFrameToBg(0);
gTasks[taskId].data[0] = 0; gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME;
gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck; gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck;
break; break;
case 4: case SAVE_STATUS_NO_FLASH:
SetStdFrame0OnBg(0); SetStdFrame0OnBg(0);
gTasks[taskId].data[0] = 0; gTasks[taskId].tMenuType = MAIN_MENU_NEWGAME;
PrintSaveErrorStatus(taskId, gText_1MSubCircuitBoardNotInstalled); PrintSaveErrorStatus(taskId, gText_1MSubCircuitBoardNotInstalled);
break; break;
} }
@@ -263,12 +297,12 @@ static void Task_SaveErrorStatus_RunPrinterThenWaitButton(u8 taskId)
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
RunTextPrinters(); RunTextPrinters();
if (!IsTextPrinterActive(4) && JOY_NEW(A_BUTTON)) if (!IsTextPrinterActive(MAIN_MENU_WINDOW_ERROR) && JOY_NEW(A_BUTTON))
{ {
ClearWindowTilemap(4); ClearWindowTilemap(MAIN_MENU_WINDOW_ERROR);
DestroyWindowBubbleFrame(&sWindowTemplate[4]); MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]);
LoadUserFrameToBg(0); LoadUserFrameToBg(0);
if (gTasks[taskId].data[0] == 0) if (gTasks[taskId].tMenuType == MAIN_MENU_NEWGAME)
gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck; gTasks[taskId].func = Task_SetWin0BldRegsNoSaveFileCheck;
else else
gTasks[taskId].func = Task_PrintMainMenuText; gTasks[taskId].func = Task_PrintMainMenuText;
@@ -284,12 +318,10 @@ static void Task_SetWin0BldRegsNoSaveFileCheck(u8 taskId)
SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_WININ, 0x0001); SetGpuReg(REG_OFFSET_WININ, 0x0001);
SetGpuReg(REG_OFFSET_WINOUT, 0x0021); SetGpuReg(REG_OFFSET_WINOUT, 0x0021);
SetGpuReg(REG_OFFSET_BLDCNT, SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);
BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ |
BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));
SetGpuReg(REG_OFFSET_BLDY, 7); SetGpuReg(REG_OFFSET_BLDY, 7);
if (gTasks[taskId].data[0] == 0) if (gTasks[taskId].tMenuType == 0)
gTasks[taskId].func = Task_ExecuteMainMenuSelection; gTasks[taskId].func = Task_ExecuteMainMenuSelection;
else else
gTasks[taskId].func = Task_WaitFadeAndPrintMainMenuText; gTasks[taskId].func = Task_WaitFadeAndPrintMainMenuText;
@@ -311,9 +343,7 @@ static void Task_PrintMainMenuText(u8 taskId)
SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_WININ, 0x0001); SetGpuReg(REG_OFFSET_WININ, 0x0001);
SetGpuReg(REG_OFFSET_WINOUT, 0x0021); SetGpuReg(REG_OFFSET_WINOUT, 0x0021);
SetGpuReg(REG_OFFSET_BLDCNT, SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);
BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ |
BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));
SetGpuReg(REG_OFFSET_BLDY, 7); SetGpuReg(REG_OFFSET_BLDY, 7);
if (gSaveBlock2Ptr->playerGender == MALE) if (gSaveBlock2Ptr->playerGender == MALE)
@@ -321,47 +351,47 @@ static void Task_PrintMainMenuText(u8 taskId)
else else
pal = RGB(31, 3, 21); pal = RGB(31, 3, 21);
LoadPalette(&pal, 0xF1, 2); LoadPalette(&pal, 0xF1, 2);
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].tMenuType)
{ {
case 0: case MAIN_MENU_NEWGAME:
default: default:
FillWindowPixelBuffer(0, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME_ONLY, PIXEL_FILL(10));
AddTextPrinterParameterized3(0, 2, 2, 2, sTextColor1, -1, gText_NewGame); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME_ONLY, 2, 2, 2, sTextColor1, -1, gText_NewGame);
DrawBubbleBorder(&sWindowTemplate[0]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME_ONLY]);
PutWindowTilemap(0); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME_ONLY);
CopyWindowToVram(0, 3); CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME_ONLY, 3);
break; break;
case 1: case MAIN_MENU_CONTINUE:
FillWindowPixelBuffer(1, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10));
FillWindowPixelBuffer(2, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME, PIXEL_FILL(10));
AddTextPrinterParameterized3(1, 2, 2, 2, sTextColor1, -1, gText_Continue); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 2, 2, sTextColor1, -1, gText_Continue);
AddTextPrinterParameterized3(2, 2, 2, 2, sTextColor1, -1, gText_NewGame); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME, 2, 2, 2, sTextColor1, -1, gText_NewGame);
PrintContinueStats(); PrintContinueStats();
DrawBubbleBorder(&sWindowTemplate[1]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_CONTINUE]);
DrawBubbleBorder(&sWindowTemplate[2]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME]);
PutWindowTilemap(1); PutWindowTilemap(MAIN_MENU_WINDOW_CONTINUE);
PutWindowTilemap(2); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME);
CopyWindowToVram(1, 2); CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, 2);
CopyWindowToVram(2, 3); CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, 3);
break; break;
case 2: case MAIN_MENU_MYSTERYGIFT:
FillWindowPixelBuffer(1, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_CONTINUE, PIXEL_FILL(10));
FillWindowPixelBuffer(2, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_NEWGAME, PIXEL_FILL(10));
FillWindowPixelBuffer(3, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_MYSTERYGIFT, PIXEL_FILL(10));
AddTextPrinterParameterized3(1, 2, 2, 2, sTextColor1, -1, gText_Continue); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 2, 2, sTextColor1, -1, gText_Continue);
AddTextPrinterParameterized3(2, 2, 2, 2, sTextColor1, -1, gText_NewGame); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_NEWGAME, 2, 2, 2, sTextColor1, -1, gText_NewGame);
gTasks[taskId].data[10] = 1; gTasks[taskId].tMGErrorType = 1;
AddTextPrinterParameterized3(3, 2, 2, 2, sTextColor1, -1, gText_MysteryGift); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_MYSTERYGIFT, 2, 2, 2, sTextColor1, -1, gText_MysteryGift);
PrintContinueStats(); PrintContinueStats();
DrawBubbleBorder(&sWindowTemplate[1]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_CONTINUE]);
DrawBubbleBorder(&sWindowTemplate[2]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_NEWGAME]);
DrawBubbleBorder(&sWindowTemplate[3]); MainMenu_DrawWindow(&sWindowTemplate[MAIN_MENU_WINDOW_MYSTERYGIFT]);
PutWindowTilemap(1); PutWindowTilemap(MAIN_MENU_WINDOW_CONTINUE);
PutWindowTilemap(2); PutWindowTilemap(MAIN_MENU_WINDOW_NEWGAME);
PutWindowTilemap(3); PutWindowTilemap(MAIN_MENU_WINDOW_MYSTERYGIFT);
CopyWindowToVram(1, 2); CopyWindowToVram(MAIN_MENU_WINDOW_CONTINUE, 2);
CopyWindowToVram(2, 2); CopyWindowToVram(MAIN_MENU_WINDOW_NEWGAME, 2);
CopyWindowToVram(3, 3); CopyWindowToVram(MAIN_MENU_WINDOW_MYSTERYGIFT, 3);
break; break;
} }
gTasks[taskId].func = Task_WaitDma3AndFadeIn; gTasks[taskId].func = Task_WaitDma3AndFadeIn;
@@ -380,7 +410,7 @@ static void Task_WaitDma3AndFadeIn(u8 taskId)
static void Task_UpdateVisualSelection(u8 taskId) static void Task_UpdateVisualSelection(u8 taskId)
{ {
MoveWindowByMenuTypeAndCursorPos(gTasks[taskId].data[0], gTasks[taskId].data[1]); MoveWindowByMenuTypeAndCursorPos(gTasks[taskId].tMenuType, gTasks[taskId].tCursorPos);
gTasks[taskId].func = Task_HandleMenuInput; gTasks[taskId].func = Task_HandleMenuInput;
} }
@@ -394,36 +424,36 @@ static void Task_HandleMenuInput(u8 taskId)
static void Task_ExecuteMainMenuSelection(u8 taskId) static void Task_ExecuteMainMenuSelection(u8 taskId)
{ {
s32 r0; s32 menuAction;
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
switch (gTasks[taskId].data[0]) switch (gTasks[taskId].tMenuType)
{ {
default: default:
case 0: case MAIN_MENU_NEWGAME:
r0 = 0; menuAction = MAIN_MENU_NEWGAME;
break; break;
case 1: case MAIN_MENU_CONTINUE:
switch (gTasks[taskId].data[1]) switch (gTasks[taskId].tCursorPos)
{ {
default: default:
case 0: case 0:
r0 = 1; menuAction = MAIN_MENU_CONTINUE;
break; break;
case 1: case 1:
r0 = 0; menuAction = MAIN_MENU_NEWGAME;
break; break;
} }
break; break;
case 2: case MAIN_MENU_MYSTERYGIFT:
switch (gTasks[taskId].data[1]) switch (gTasks[taskId].tCursorPos)
{ {
default: default:
case 0: case 0:
r0 = 1; menuAction = MAIN_MENU_CONTINUE;
break; break;
case 1: case 1:
r0 = 0; menuAction = MAIN_MENU_NEWGAME;
break; break;
case 2: case 2:
if (!IsWirelessAdapterConnected()) if (!IsWirelessAdapterConnected())
@@ -435,29 +465,29 @@ static void Task_ExecuteMainMenuSelection(u8 taskId)
} }
else else
{ {
r0 = 2; menuAction = MAIN_MENU_MYSTERYGIFT;
} }
break; break;
} }
break; break;
} }
switch (r0) switch (menuAction)
{ {
default: default:
case 0: case MAIN_MENU_NEWGAME:
gUnknown_2031DE0 = 0; gUnknown_2031DE0 = 0;
FreeAllWindowBuffers(); FreeAllWindowBuffers();
DestroyTask(taskId); DestroyTask(taskId);
StartNewGameScene(); StartNewGameScene();
break; break;
case 1: case MAIN_MENU_CONTINUE:
gPlttBufferUnfaded[0] = RGB_BLACK; gPlttBufferUnfaded[0] = RGB_BLACK;
gPlttBufferFaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK;
gUnknown_2031DE0 = 0; gUnknown_2031DE0 = 0;
FreeAllWindowBuffers(); FreeAllWindowBuffers();
TrySetUpQuestLogScenes_ElseContinueFromSave(taskId); TrySetUpQuestLogScenes_ElseContinueFromSave(taskId);
break; break;
case 2: case MAIN_MENU_MYSTERYGIFT:
SetMainCallback2(c2_mystery_gift); SetMainCallback2(c2_mystery_gift);
HelpSystem_Disable(); HelpSystem_Disable();
FreeAllWindowBuffers(); FreeAllWindowBuffers();
@@ -469,24 +499,24 @@ static void Task_ExecuteMainMenuSelection(u8 taskId)
static void Task_MysteryGiftError(u8 taskId) static void Task_MysteryGiftError(u8 taskId)
{ {
switch (gTasks[taskId].data[9]) switch (gTasks[taskId].tMGErrorMsgState)
{ {
case 0: case 0:
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
if (gTasks[taskId].data[10] == 1) if (gTasks[taskId].tMGErrorType == 1)
PrintMessageOnWindow4(gText_WirelessAdapterIsNotConnected); PrintMessageOnWindow4(gText_WirelessAdapterIsNotConnected);
else else
PrintMessageOnWindow4(gText_MysteryGiftCantBeUsedWhileWirelessAdapterIsAttached); PrintMessageOnWindow4(gText_MysteryGiftCantBeUsedWhileWirelessAdapterIsAttached);
gTasks[taskId].data[9]++; gTasks[taskId].tMGErrorMsgState++;
break; break;
case 1: case 1:
if (!gPaletteFade.active) if (!gPaletteFade.active)
gTasks[taskId].data[9]++; gTasks[taskId].tMGErrorMsgState++;
break; break;
case 2: case 2:
RunTextPrinters(); RunTextPrinters();
if (!IsTextPrinterActive(4)) if (!IsTextPrinterActive(4))
gTasks[taskId].data[9]++; gTasks[taskId].tMGErrorMsgState++;
break; break;
case 3: case 3:
if (JOY_NEW(A_BUTTON | B_BUTTON)) if (JOY_NEW(A_BUTTON | B_BUTTON))
@@ -510,36 +540,36 @@ static void Task_ReturnToTileScreen(u8 taskId)
static void MoveWindowByMenuTypeAndCursorPos(u8 menuType, u8 cursorPos) static void MoveWindowByMenuTypeAndCursorPos(u8 menuType, u8 cursorPos)
{ {
u16 win0v1, win0v2; u16 win0vTop, win0vBot;
SetGpuReg(REG_OFFSET_WIN0H, 0x12DE); SetGpuReg(REG_OFFSET_WIN0H, 0x12DE);
switch (menuType) switch (menuType)
{ {
default: default:
case 0: case MAIN_MENU_NEWGAME:
win0v1 = 0x00; win0vTop = 0x00 << 8;
win0v2 = 0x20; win0vBot = 0x20;
break; break;
case 1: case MAIN_MENU_CONTINUE:
case 2: case MAIN_MENU_MYSTERYGIFT:
switch (cursorPos) switch (cursorPos)
{ {
default: default:
case 0: case 0: // CONTINUE
win0v1 = 0x00; win0vTop = 0x00 << 8;
win0v2 = 0x60; win0vBot = 0x60;
break; break;
case 1: case 1: // NEW GAME
win0v1 = 0x60 << 8; win0vTop = 0x60 << 8;
win0v2 = 0x80; win0vBot = 0x80;
break; break;
case 2: case 2: // MYSTERY GIFT
win0v1 = 0x80 << 8; win0vTop = 0x80 << 8;
win0v2 = 0xA0; win0vBot = 0xA0;
break; break;
} }
break; break;
} }
SetGpuReg(REG_OFFSET_WIN0V, (win0v1 + (2 << 8)) | (win0v2 - 2)); SetGpuReg(REG_OFFSET_WIN0V, (win0vTop + (2 << 8)) | (win0vBot - 2));
} }
static bool8 HandleMenuInput(u8 taskId) static bool8 HandleMenuInput(u8 taskId)
@@ -559,14 +589,14 @@ static bool8 HandleMenuInput(u8 taskId)
SetGpuReg(REG_OFFSET_WIN0V, 0xA0); SetGpuReg(REG_OFFSET_WIN0V, 0xA0);
gTasks[taskId].func = Task_ReturnToTileScreen; gTasks[taskId].func = Task_ReturnToTileScreen;
} }
else if (JOY_NEW(DPAD_UP) && gTasks[taskId].data[1] > 0) else if (JOY_NEW(DPAD_UP) && gTasks[taskId].tCursorPos > 0)
{ {
gTasks[taskId].data[1]--; gTasks[taskId].tCursorPos--;
return TRUE; return TRUE;
} }
else if (JOY_NEW(DPAD_DOWN) && gTasks[taskId].data[1] < gUnknown_8234694[gTasks[taskId].data[0]]) else if (JOY_NEW(DPAD_DOWN) && gTasks[taskId].tCursorPos < sMenuCursorYMax[gTasks[taskId].tMenuType])
{ {
gTasks[taskId].data[1]++; gTasks[taskId].tCursorPos++;
return TRUE; return TRUE;
} }
@@ -575,11 +605,11 @@ static bool8 HandleMenuInput(u8 taskId)
static void PrintMessageOnWindow4(const u8 *str) static void PrintMessageOnWindow4(const u8 *str)
{ {
FillWindowPixelBuffer(4, PIXEL_FILL(10)); FillWindowPixelBuffer(MAIN_MENU_WINDOW_ERROR, PIXEL_FILL(10));
DrawBubbleBorder(&sWindowTemplate[4]); MainMenu_DrawWindow(&sWindowTemplate[4]);
AddTextPrinterParameterized3(4, 2, 0, 2, sTextColor1, 2, str); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_ERROR, 2, 0, 2, sTextColor1, 2, str);
PutWindowTilemap(4); PutWindowTilemap(MAIN_MENU_WINDOW_ERROR);
CopyWindowToVram(4, 2); CopyWindowToVram(MAIN_MENU_WINDOW_ERROR, 2);
SetGpuReg(REG_OFFSET_WIN0H, 0x13DD); SetGpuReg(REG_OFFSET_WIN0H, 0x13DD);
SetGpuReg(REG_OFFSET_WIN0V, 0x739D); SetGpuReg(REG_OFFSET_WIN0V, 0x739D);
} }
@@ -597,12 +627,12 @@ static void PrintPlayerName(void)
s32 i; s32 i;
u8 name[OT_NAME_LENGTH + 1]; u8 name[OT_NAME_LENGTH + 1];
u8 *ptr; u8 *ptr;
AddTextPrinterParameterized3(1, 2, 2, 18, sTextColor2, -1, gText_Player); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 2, 18, sTextColor2, -1, gText_Player);
ptr = name; ptr = name;
for (i = 0; i < OT_NAME_LENGTH; i++) for (i = 0; i < OT_NAME_LENGTH; i++)
*ptr++ = gSaveBlock2Ptr->playerName[i]; *ptr++ = gSaveBlock2Ptr->playerName[i];
*ptr = EOS; *ptr = EOS;
AddTextPrinterParameterized3(1, 2, 62, 18, sTextColor2, -1, name); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 62, 18, sTextColor2, -1, name);
} }
static void PrintPlayTime(void) static void PrintPlayTime(void)
@@ -610,11 +640,11 @@ static void PrintPlayTime(void)
u8 strbuf[30]; u8 strbuf[30];
u8 *ptr; u8 *ptr;
AddTextPrinterParameterized3(1, 2, 2, 34, sTextColor2, -1, gText_Time); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 2, 34, sTextColor2, -1, gText_Time);
ptr = ConvertIntToDecimalStringN(strbuf, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3); ptr = ConvertIntToDecimalStringN(strbuf, gSaveBlock2Ptr->playTimeHours, STR_CONV_MODE_LEFT_ALIGN, 3);
*ptr++ = CHAR_COLON; *ptr++ = CHAR_COLON;
ConvertIntToDecimalStringN(ptr, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2); ConvertIntToDecimalStringN(ptr, gSaveBlock2Ptr->playTimeMinutes, STR_CONV_MODE_LEADING_ZEROS, 2);
AddTextPrinterParameterized3(1, 2, 62, 34, sTextColor2, -1, strbuf); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 62, 34, sTextColor2, -1, strbuf);
} }
static void PrintDexCount(void) static void PrintDexCount(void)
@@ -628,10 +658,10 @@ static void PrintDexCount(void)
dexcount = GetNationalPokedexCount(FLAG_GET_CAUGHT); dexcount = GetNationalPokedexCount(FLAG_GET_CAUGHT);
else else
dexcount = GetKantoPokedexCount(FLAG_GET_CAUGHT); dexcount = GetKantoPokedexCount(FLAG_GET_CAUGHT);
AddTextPrinterParameterized3(1, 2, 2, 50, sTextColor2, -1, gText_Pokedex); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 2, 50, sTextColor2, -1, gText_Pokedex);
ptr = ConvertIntToDecimalStringN(strbuf, dexcount, STR_CONV_MODE_LEFT_ALIGN, 3); ptr = ConvertIntToDecimalStringN(strbuf, dexcount, STR_CONV_MODE_LEFT_ALIGN, 3);
StringAppend(ptr, gTextJPDummy_Hiki); StringAppend(ptr, gTextJPDummy_Hiki);
AddTextPrinterParameterized3(1, 2, 62, 50, sTextColor2, -1, strbuf); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 62, 50, sTextColor2, -1, strbuf);
} }
} }
@@ -646,40 +676,120 @@ static void PrintBadgeCount(void)
if (FlagGet(flagId)) if (FlagGet(flagId))
nbadges++; nbadges++;
} }
AddTextPrinterParameterized3(1, 2, 2, 66, sTextColor2, -1, gText_Badges); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 2, 66, sTextColor2, -1, gText_Badges);
ptr = ConvertIntToDecimalStringN(strbuf, nbadges, STR_CONV_MODE_LEADING_ZEROS, 1); ptr = ConvertIntToDecimalStringN(strbuf, nbadges, STR_CONV_MODE_LEADING_ZEROS, 1);
StringAppend(ptr, gTextJPDummy_Ko); StringAppend(ptr, gTextJPDummy_Ko);
AddTextPrinterParameterized3(1, 2, 62, 66, sTextColor2, -1, strbuf); AddTextPrinterParameterized3(MAIN_MENU_WINDOW_CONTINUE, 2, 62, 66, sTextColor2, -1, strbuf);
} }
static void LoadUserFrameToBg(u8 bgId) static void LoadUserFrameToBg(u8 bgId)
{ {
LoadBgTiles(bgId, GetUserFrameGraphicsInfo(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1B1); LoadBgTiles(bgId, GetUserFrameGraphicsInfo(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1B1);
LoadPalette(GetUserFrameGraphicsInfo(gSaveBlock2Ptr->optionsWindowFrameType)->palette, 0x20, 0x20); LoadPalette(GetUserFrameGraphicsInfo(gSaveBlock2Ptr->optionsWindowFrameType)->palette, 0x20, 0x20);
DestroyWindowBubbleFrame(&sWindowTemplate[4]); MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]);
} }
static void SetStdFrame0OnBg(u8 bgId) static void SetStdFrame0OnBg(u8 bgId)
{ {
TextWindow_SetStdFrame0_WithPal(0, 0x1B1, 0x20); TextWindow_SetStdFrame0_WithPal(MAIN_MENU_WINDOW_NEWGAME_ONLY, 0x1B1, 0x20);
DestroyWindowBubbleFrame(&sWindowTemplate[4]); MainMenu_EraseWindow(&sWindowTemplate[MAIN_MENU_WINDOW_ERROR]);
} }
static void DrawBubbleBorder(const struct WindowTemplate * windowTemplate) static void MainMenu_DrawWindow(const struct WindowTemplate * windowTemplate)
{ {
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B1, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop - 1, 1, 1, 2); FillBgTilemapBufferRect(
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B2, windowTemplate->tilemapLeft, windowTemplate->tilemapTop - 1, windowTemplate->width, windowTemplate->height, 2); windowTemplate->bg,
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B3, windowTemplate->tilemapLeft + windowTemplate->width, windowTemplate->tilemapTop - 1, 1, 1, 2); 0x1B1,
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B4, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop, 1, windowTemplate->height, 2); windowTemplate->tilemapLeft - 1,
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B6, windowTemplate->tilemapLeft + windowTemplate->width, windowTemplate->tilemapTop, 1, windowTemplate->height, 2); windowTemplate->tilemapTop - 1,
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B7, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop + windowTemplate->height, 1, 1, 2); 1,
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B8, windowTemplate->tilemapLeft, windowTemplate->tilemapTop + windowTemplate->height, windowTemplate->width, 1, 2); 1,
FillBgTilemapBufferRect(windowTemplate->bg, 0x1B9, windowTemplate->tilemapLeft + windowTemplate->width, windowTemplate->tilemapTop + windowTemplate->height, 1, 1, 2); 2
);
FillBgTilemapBufferRect(
windowTemplate->bg,
0x1B2,
windowTemplate->tilemapLeft,
windowTemplate->tilemapTop - 1,
windowTemplate->width,
windowTemplate->height,
2
);
FillBgTilemapBufferRect(
windowTemplate->bg,
0x1B3,
windowTemplate->tilemapLeft +
windowTemplate->width,
windowTemplate->tilemapTop - 1,
1,
1,
2
);
FillBgTilemapBufferRect(
windowTemplate->bg,
0x1B4,
windowTemplate->tilemapLeft - 1,
windowTemplate->tilemapTop,
1,
windowTemplate->height,
2
);
FillBgTilemapBufferRect(
windowTemplate->bg,
0x1B6,
windowTemplate->tilemapLeft +
windowTemplate->width,
windowTemplate->tilemapTop,
1,
windowTemplate->height,
2
);
FillBgTilemapBufferRect(
windowTemplate->bg,
0x1B7,
windowTemplate->tilemapLeft - 1,
windowTemplate->tilemapTop +
windowTemplate->height,
1,
1,
2
);
FillBgTilemapBufferRect(
windowTemplate->bg,
0x1B8,
windowTemplate->tilemapLeft,
windowTemplate->tilemapTop +
windowTemplate->height,
windowTemplate->width,
1,
2
);
FillBgTilemapBufferRect(
windowTemplate->bg,
0x1B9,
windowTemplate->tilemapLeft +
windowTemplate->width,
windowTemplate->tilemapTop +
windowTemplate->height,
1,
1,
2
);
CopyBgTilemapBufferToVram(windowTemplate->bg); CopyBgTilemapBufferToVram(windowTemplate->bg);
} }
static void DestroyWindowBubbleFrame(const struct WindowTemplate * windowTemplate) static void MainMenu_EraseWindow(const struct WindowTemplate * windowTemplate)
{ {
FillBgTilemapBufferRect(windowTemplate->bg, 0x000, windowTemplate->tilemapLeft - 1, windowTemplate->tilemapTop - 1, windowTemplate->tilemapLeft + windowTemplate->width + 1, windowTemplate->tilemapTop + windowTemplate->height + 1, 2); FillBgTilemapBufferRect(
windowTemplate->bg,
0x000,
windowTemplate->tilemapLeft - 1,
windowTemplate->tilemapTop - 1,
windowTemplate->tilemapLeft +
windowTemplate->width + 1,
windowTemplate->tilemapTop +
windowTemplate->height + 1,
2
);
CopyBgTilemapBufferToVram(windowTemplate->bg); CopyBgTilemapBufferToVram(windowTemplate->bg);
} }