summaryrefslogtreecommitdiff
path: root/src/main_menu.c
diff options
context:
space:
mode:
authorgolem galvanize <golemgalvanize@github.com>2018-02-11 17:19:36 -0500
committergolem galvanize <golemgalvanize@github.com>2018-02-11 17:19:36 -0500
commit601a942db45bd5697d15ae2fd8ab10c8259410b4 (patch)
tree7b853360bdf2e4bf7eb8ba0a265f482f47e915e6 /src/main_menu.c
parent99d0b4bbfd3fd05ba67aed1e7cf1b500b3ab594f (diff)
decompile main_menu
Diffstat (limited to 'src/main_menu.c')
-rw-r--r--src/main_menu.c901
1 files changed, 862 insertions, 39 deletions
diff --git a/src/main_menu.c b/src/main_menu.c
index 9ae3e6af0..f4241edb0 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -1,34 +1,50 @@
// Includes
#include "global.h"
+#include "battle_dome_cards.h"
#include "bg.h"
+#include "constants/flags.h"
#include "constants/rgb.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "decompress.h"
#include "event_data.h"
+#include "field_effect.h"
#include "gpu_regs.h"
+#include "international_string_util.h"
+#include "link.h"
#include "main.h"
#include "menu.h"
#include "menu_indicators.h"
+#include "mystery_event_menu.h"
+#include "naming_screen.h"
+#include "option_menu.h"
+#include "overworld.h"
#include "palette.h"
#include "pokeball.h"
+#include "pokedex.h"
+#include "pokemon_3.h"
+#include "random.h"
#include "rtc.h"
#include "save.h"
#include "scanline_effect.h"
#include "sound.h"
#include "sprite.h"
#include "string.h"
+#include "strings.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "text_window.h"
+#include "title_screen.h"
#include "window.h"
// Static type declarations
// Static RAM declarations
+extern u8 gUnknown_02022D04;
+extern u16 gUnknown_02022D06;
IWRAM_DATA u8 gUnknown_03000DD0;
@@ -55,35 +71,23 @@ extern u16 gMainMenuBgPal[];
extern u16 gMainMenuTextPal[];
extern struct BgTemplate gUnknown_082FF0E8[];
extern struct WindowTemplate gUnknown_082FF038[];
-extern u8 gText_SaveFileErased[];
-extern u8 gText_SaveFileCorrupted[];
-extern u8 gJPText_No1MSubCircuit[];
-extern u16 gUnknown_02022D06;
extern struct WindowTemplate gUnknown_082FF070[];
-extern u8 gText_BatteryRunDry[];
extern u8 gUnknown_082FF0E0[];
-extern u8 gText_MainMenuNewGame[];
extern struct WindowTemplate gUnknown_082FF048[];
extern struct ArrowStruct gUnknown_082FF0F4;
-extern u8 gText_MainMenuOption[];
-extern u8 gText_MainMenuContinue[];
-extern u8 gText_MainMenuMysteryGift2[];
-extern u8 gText_MainMenuMysteryEvents[];
-extern u8 gText_MainMenuMysteryGift[];
-extern u8 gText_WirelessNotConnected[];
-extern u8 gText_MysteryGiftCantUse[];
-extern u8 gText_MysteryEventsCantUse[];
extern struct BgTemplate gUnknown_082FF0F0;
extern u8 gBirchIntroShadowGfx[];
extern u8 gUnknown_082FEEF0[];
extern u16 gUnknown_082FECFC[];
extern u16 gUnknown_082FF028[];
extern struct WindowTemplate gUnknown_082FF080[];
-extern u8 gUnknown_082C897B[];
-extern u8 gText_ThisIsAPokemon[];
-extern u8 gUnknown_082C8A1F[];
-extern u8 gUnknown_02022D04;
-extern u8 gUnknown_082C8BD0[];
+extern const union AffineAnimCmd *const gUnknown_082FF114[];
+extern u16 gUnknown_082FF018[];
+extern struct WindowTemplate gUnknown_082FF088[];
+extern const struct MenuAction gUnknown_082FF118[];
+extern u8* gMalePresetNames[];
+extern u8* gFemalePresetNames[];
+extern u8 gUnknown_082FF0E3[];
u32 InitMainMenu(bool8);
void Task_MainMenuCheckSaveFile(u8);
@@ -110,7 +114,7 @@ void unknown_rbox_to_vram(u8, u8);
void sub_8032318(u8);
void task_new_game_prof_birch_speech_4(u8);
void task_new_game_prof_birch_speech_5(u8);
-void sub_80323A0(struct TextPrinter*, u16);
+void sub_80323A0(struct TextSubPrinter *printer, u16 a);
void task_new_game_prof_birch_speech_6(u8);
void sub_8030B14(u8);
void task_new_game_prof_birch_speech_7(u8);
@@ -120,22 +124,41 @@ void task_new_game_prof_birch_speech_8(u8);
void task_new_game_prof_birch_speech_9(u8);
void task_new_game_prof_birch_speech_10(u8);
void task_new_game_prof_birch_speech_11(u8);
-
-extern void LoadMainMenuWindowFrameTiles(u8, u16);
-extern bool8 sub_80093CC(void);
-extern void Task_ScrollIndicatorArrowPairOnMainMenu(u8);
-extern void Task_HighlightSelectedMainMenuItem(u8);
-extern void DrawMainMenuWindowBorder(struct WindowTemplate*, u16);
-extern void sub_819746C(u8, u8);
-extern void sub_8086230(void);
-extern void CB2_InitOptionMenu(void);
-extern void c2_mystery_gift(void);
-extern void CB2_InitMysteryEventMenu(void);
-extern void sub_801867C(void);
-extern void CB2_InitTitleScreen(void);
-extern void dp13_810BB8C(void);
-extern bool16 sub_8197224(void);
-extern void AddTextPrinterWithCallbackForMessage(u8, void(*callback)(struct TextPrinter*, u16));
+void LoadMainMenuWindowFrameTiles(u8, u16);
+void DrawMainMenuWindowBorder(struct WindowTemplate*, u16);
+void Task_HighlightSelectedMainMenuItem(u8);
+void task_new_game_prof_birch_speech_12(u8);
+void task_new_game_prof_birch_speech_13(u8);
+void sub_8031D74(void);
+s8 sub_8031DB4(void);
+void sub_80322E0(u8, u8);
+void task_new_game_prof_birch_speech_14(u8);
+void sub_8030ED4(u8);
+void sub_8030F7C(u8);
+void task_new_game_prof_birch_speech_15(u8);
+void task_new_game_prof_birch_speech_16(u8);
+void task_new_game_prof_birch_speech_17(u8);
+void new_game_prof_birch_speech_part2_start(void);
+void set_default_player_name(u8);
+void task_new_game_prof_birch_speech_part2_3(u8);
+void task_new_game_prof_birch_speech_part2_4(u8);
+void sub_80323CC(u8, u8, u16, u16, u8, u8);
+void task_new_game_prof_birch_speech_part2_5(u8);
+void task_new_game_prof_birch_speech_part2_6(u8);
+void task_new_game_prof_birch_speech_part2_7(u8);
+void task_new_game_prof_birch_speech_part2_8(u8);
+void task_new_game_prof_birch_speech_part2_9(u8);
+void sub_80318D8(struct Sprite*);
+void task_new_game_prof_birch_speech_part2_10(u8);
+void task_new_game_prof_birch_speech_part2_11(u8);
+void task_new_game_prof_birch_speech_part2_12(u8);
+void nullsub_11();
+void task_new_game_prof_birch_speech_part2_1(u8);
+void fmt_time(void);
+void fmt_pokedex(void);
+void fmt_player(void);
+void fmt_badges(void);
+void sub_8032474(u8, u8, u8, u8, u8, u8);
void CB2_MainMenu(void)
{
@@ -314,7 +337,9 @@ void Task_MainMenuCheckBattery(u8 taskId)
SetGpuReg(REG_OFFSET_BLDY, 7);
if (!(RtcGetErrorStatus() & RTC_ERR_FLAG_MASK))
+ {
gTasks[taskId].func = Task_DisplayMainMenu;
+ }
else
{
CreateMainMenuErrorWindow(gText_BatteryRunDry);
@@ -627,7 +652,9 @@ void Task_HandleMainMenuAPressed(u8 taskId)
gTasks[taskId].data[0] = 1;
}
else
+ {
action = 5;
+ }
break;
case 3:
if (r2)
@@ -636,7 +663,9 @@ void Task_HandleMainMenuAPressed(u8 taskId)
gTasks[taskId].data[0] = 2;
}
else
+ {
action = 4;
+ }
break;
case 4:
action = 2;
@@ -874,7 +903,9 @@ void task_new_game_prof_birch_speech_2(u8 taskId)
u8 spriteId;
if (gTasks[taskId].data[7])
+ {
gTasks[taskId].data[7]--;
+ }
else
{
spriteId = gTasks[taskId].data[8];
@@ -895,7 +926,9 @@ void task_new_game_prof_birch_speech_3(u8 taskId)
{
gSprites[gTasks[taskId].data[8]].oam.objMode = 0;
if (gTasks[taskId].data[7])
+ {
gTasks[taskId].data[7]--;
+ }
else
{
InitWindows(gUnknown_082FF080);
@@ -905,7 +938,7 @@ void task_new_game_prof_birch_speech_3(u8 taskId)
PutWindowTilemap(0);
CopyWindowToVram(0, 2);
sub_8032318(0);
- StringExpandPlaceholders(gStringVar4, gUnknown_082C897B);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_Welcome);
AddTextPrinterForMessage(1);
gTasks[taskId].func = task_new_game_prof_birch_speech_4;
}
@@ -927,7 +960,7 @@ void task_new_game_prof_birch_speech_5(u8 taskId)
{
if (!sub_8197224())
{
- StringExpandPlaceholders(gStringVar4, gUnknown_082C8A1F);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_MainSpeech);
AddTextPrinterForMessage(1);
gTasks[taskId].func = task_new_game_prof_birch_speech_6;
}
@@ -983,7 +1016,7 @@ void task_new_game_prof_birch_speech_6(u8 taskId)
if (!sub_8197224())
{
gUnknown_02022D04 = 0;
- StringExpandPlaceholders(gStringVar4, gUnknown_082C8BD0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_AndYouAre);
AddTextPrinterForMessage(1);
gTasks[taskId].func = task_new_game_prof_birch_speech_7;
}
@@ -1023,7 +1056,9 @@ void task_new_game_prof_birch_speech_9(u8 taskId)
gSprites[gTasks[taskId].data[8]].invisible = 1;
gSprites[gTasks[taskId].data[9]].invisible = 1;
if (gTasks[taskId].data[7])
+ {
gTasks[taskId].data[7]--;
+ }
else
{
u8 spriteId = gTasks[taskId].data[10];
@@ -1049,3 +1084,791 @@ void task_new_game_prof_birch_speech_10(u8 taskId)
gTasks[taskId].func = task_new_game_prof_birch_speech_11;
}
}
+
+void task_new_game_prof_birch_speech_11(u8 taskId)
+{
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_BoyOrGirl);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_12;
+}
+
+void task_new_game_prof_birch_speech_12(u8 taskId)
+{
+ if (!sub_8197224())
+ {
+ sub_8031D74();
+ gTasks[taskId].func = task_new_game_prof_birch_speech_13;
+ }
+}
+
+void task_new_game_prof_birch_speech_13(u8 taskId)
+{
+ int gender = sub_8031DB4();
+ int r3;
+
+ switch (gender)
+ {
+ case MALE:
+ PlaySE(SE_SELECT);
+ gSaveBlock2Ptr->playerGender = gender;
+ sub_80322E0(1, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_14;
+ break;
+ case FEMALE:
+ PlaySE(SE_SELECT);
+ gSaveBlock2Ptr->playerGender = gender;
+ sub_80322E0(1, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_14;
+ break;
+ }
+ r3 = GetMenuCursorPos();
+ if (r3 != gTasks[taskId].data[6])
+ {
+ gTasks[taskId].data[6] = r3;
+ gSprites[gTasks[taskId].data[2]].oam.objMode = 1;
+ sub_8031ACC(taskId, 0);
+ gTasks[taskId].func = sub_8030ED4;
+ }
+}
+
+void sub_8030ED4(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[2];
+ if (gTasks[taskId].data[5] == 0)
+ {
+ gSprites[spriteId].pos1.x += 4;
+ }
+ else
+ {
+ gSprites[spriteId].invisible = 1;
+ if (gTasks[taskId].data[6])
+ spriteId = gTasks[taskId].data[11];
+ else
+ spriteId = gTasks[taskId].data[10];
+ gSprites[spriteId].pos1.x = 0xF0;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gTasks[taskId].data[2] = spriteId;
+ gSprites[spriteId].oam.objMode = 1;
+ sub_8031BAC(taskId, 0);
+ gTasks[taskId].func = sub_8030F7C;
+ }
+}
+
+void sub_8030F7C(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[2];
+
+ if (gSprites[spriteId].pos1.x > 0xB4)
+ {
+ gSprites[spriteId].pos1.x -= 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos1.x = 0xB4;
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[spriteId].oam.objMode = 0;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_13;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_14(u8 taskId)
+{
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_WhatsYourName);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_15;
+}
+
+void task_new_game_prof_birch_speech_15(u8 taskId)
+{
+ if (!sub_8197224())
+ gTasks[taskId].func = task_new_game_prof_birch_speech_16;
+}
+
+void task_new_game_prof_birch_speech_16(u8 taskId)
+{
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_17;
+ }
+}
+
+void task_new_game_prof_birch_speech_17(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ sub_818D820(gTasks[taskId].data[9]);
+ set_default_player_name(Random() % 20);
+ DestroyTask(taskId);
+ DoNamingScreen(0, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, new_game_prof_birch_speech_part2_start);
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_2(u8 taskId)
+{
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_SoItsPlayer);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_3;
+}
+
+void task_new_game_prof_birch_speech_part2_3(u8 taskId)
+{
+ if (!sub_8197224())
+ {
+ sub_80323CC(2, 1, 0xF3, 0xDF, 2, 15);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_4;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_4(u8 taskId)
+{
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ gSprites[gTasks[taskId].data[2]].oam.objMode = 1;
+ sub_8031ACC(taskId, 2);
+ sub_8031C88(taskId, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_5;
+ break;
+ case -1:
+ case 1:
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_11;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_5(u8 taskId)
+{
+ if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4] += 2;
+ SetGpuReg(REG_OFFSET_BG1HOFS, gTasks[taskId].data[4]);
+ }
+ else
+ {
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_6;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_6(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[10]].invisible = 1;
+ gSprites[gTasks[taskId].data[11]].invisible = 1;
+ spriteId = gTasks[taskId].data[8];
+ gSprites[spriteId].pos1.x = 0x88;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gSprites[spriteId].oam.objMode = 1;
+ spriteId = gTasks[taskId].data[9];
+ gSprites[spriteId].pos1.x = 0x64;
+ gSprites[spriteId].pos1.y = 0x4B;
+ gSprites[spriteId].invisible = 0;
+ gSprites[spriteId].oam.objMode = 1;
+ sub_8031BAC(taskId, 2);
+ sub_8031D34(taskId, 1);
+ sub_8032318(0);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_YourePlayer);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_7;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_7(u8 taskId)
+{
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[8]].oam.objMode = 0;
+ gSprites[gTasks[taskId].data[9]].oam.objMode = 0;
+ if (!sub_8197224())
+ {
+ gSprites[gTasks[taskId].data[8]].oam.objMode = 1;
+ gSprites[gTasks[taskId].data[9]].oam.objMode = 1;
+ sub_8031ACC(taskId, 2);
+ sub_8031C88(taskId, 1);
+ gTasks[taskId].data[7] = 64;
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_8;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_8(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[8]].invisible = 1;
+ gSprites[gTasks[taskId].data[9]].invisible = 1;
+ if (gTasks[taskId].data[7])
+ {
+ gTasks[taskId].data[7]--;
+ return;
+ }
+ if (gSaveBlock2Ptr->playerGender != MALE)
+ spriteId = gTasks[taskId].data[11];
+ else
+ spriteId = gTasks[taskId].data[10];
+ gSprites[spriteId].pos1.x = 0x78;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gSprites[spriteId].oam.objMode = 1;
+ gTasks[taskId].data[2] = spriteId;
+ sub_8031BAC(taskId, 2);
+ sub_8031D34(taskId, 1);
+ StringExpandPlaceholders(gStringVar4, gText_Birch_AreYouReady);
+ AddTextPrinterForMessage(1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_9;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_9(u8 taskId)
+{
+ u8 spriteId;
+
+ if (gTasks[taskId].data[5])
+ {
+ gSprites[gTasks[taskId].data[2]].oam.objMode = 0;
+ if (!sub_8197224())
+ {
+ spriteId = gTasks[taskId].data[2];
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].affineAnims = gUnknown_082FF114;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ gSprites[spriteId].callback = sub_80318D8;
+ BeginNormalPaletteFade(0xFFFF, 0, 0, 16, 0);
+ FadeOutBGM(4);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_10;
+ }
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_10(u8 taskId)
+{
+ u8 spriteId = gTasks[taskId].data[2];
+
+ if (gSprites[spriteId].affineAnimEnded)
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_11;
+}
+
+void task_new_game_prof_birch_speech_part2_11(u8 taskId)
+{
+ u8 spriteId;
+
+ if (!gPaletteFade.active)
+ {
+ spriteId = gTasks[taskId].data[2];
+ gSprites[spriteId].callback = nullsub_11;
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x1040);
+ BeginNormalPaletteFade(-0x10000, 0, 0, 16, -1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_12;
+ }
+}
+
+void task_new_game_prof_birch_speech_part2_12(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ FreeAllWindowBuffers();
+ sub_818D820(gTasks[taskId].data[9]);
+ dp13_810BB8C();
+ SetMainCallback2(CB2_NewGame);
+ DestroyTask(taskId);
+ }
+}
+
+void new_game_prof_birch_speech_part2_start(void)
+{
+ u8 taskId;
+ u8 spriteId;
+ u16 savedIme;
+
+ ResetBgsAndClearDma3BusyFlags(0);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, 0x1040);
+ InitBgsFromTemplates(0, gUnknown_082FF0E8, 2);
+ InitBgFromTemplate(&gUnknown_082FF0F0);
+ SetVBlankCallback(NULL);
+ SetGpuReg(REG_OFFSET_BG2CNT, 0);
+ SetGpuReg(REG_OFFSET_BG1CNT, 0);
+ SetGpuReg(REG_OFFSET_BG0CNT, 0);
+ SetGpuReg(REG_OFFSET_BG2HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG2VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG1VOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0HOFS, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS, 0);
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT, PLTT_SIZE);
+ ResetPaletteFade();
+ LZ77UnCompVram(gBirchIntroShadowGfx, (u8*)VRAM);
+ LZ77UnCompVram(gUnknown_082FEEF0, (u8*)(VRAM + 0x3800));
+ LoadPalette(gUnknown_082FECFC, 0, 64);
+ LoadPalette(&gUnknown_082FF018[1], 1, 16);
+ ResetTasks();
+ taskId = CreateTask(task_new_game_prof_birch_speech_part2_1, 0);
+ gTasks[taskId].data[7] = 5;
+ gTasks[taskId].data[4] = -60;
+ ScanlineEffect_Stop();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ dp13_810BB8C();
+ AddBirchSpeechObjects(taskId);
+ if (gSaveBlock2Ptr->playerGender != MALE)
+ {
+ gTasks[taskId].data[6] = FEMALE;
+ spriteId = gTasks[taskId].data[11];
+ }
+ else
+ {
+ gTasks[taskId].data[6] = MALE;
+ spriteId = gTasks[taskId].data[10];
+ }
+ gSprites[spriteId].pos1.x = 0xB4;
+ gSprites[spriteId].pos1.y = 0x3C;
+ gSprites[spriteId].invisible = 0;
+ gTasks[taskId].data[2] = spriteId;
+ SetGpuReg(REG_OFFSET_BG1HOFS, -60);
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ SetGpuReg(REG_OFFSET_WIN0H, 0);
+ SetGpuReg(REG_OFFSET_WIN0V, 0);
+ SetGpuReg(REG_OFFSET_WININ, 0);
+ SetGpuReg(REG_OFFSET_WINOUT, 0);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ ShowBg(0);
+ ShowBg(1);
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= 1;
+ REG_IME = savedIme;
+ SetVBlankCallback(VBlankCB_MainMenu);
+ SetMainCallback2(CB2_MainMenu);
+ InitWindows(gUnknown_082FF080);
+ LoadMainMenuWindowFrameTiles(0, 0xF3);
+ copy_textbox_border_tile_patterns_to_vram(0, 0xFC, 0xF0);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+}
+
+void nullsub_11(struct Sprite *sprite)
+{
+}
+
+void sub_80318D8(struct Sprite *sprite)
+{
+ u32 y;
+
+ y = (sprite->pos1.y << 16) + sprite->data[0] + 0xC000;
+ sprite->pos1.y = y >> 16;
+ sprite->data[0] = y;
+}
+
+u8 sub_80318F4(u8 a, u8 b)
+{
+ return sub_818D3E4(SPECIES_LOTAD, 8, 0, 1, a, b, 14, -1);
+}
+
+void AddBirchSpeechObjects(u8 taskId)
+{
+ u8 spriteId = AddNewGameBirchObject(0x88, 0x3C, 1);
+ u8 spriteId2;
+ u8 spriteId3;
+ u8 spriteId4;
+
+ gSprites[spriteId].callback = nullsub_11;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].invisible = 1;
+ gTasks[taskId].data[8] = spriteId;
+ spriteId2 = sub_80318F4(100, 0x4B);
+ gSprites[spriteId2].callback = nullsub_11;
+ gSprites[spriteId2].oam.priority = 0;
+ gSprites[spriteId2].invisible = 1;
+ gTasks[taskId].data[9] = spriteId2;
+ spriteId3 = CreateTrainerSprite(sub_806EFF0(0x3C), 0x78, 0x3C, 0, gDecompressionBuffer);
+ gSprites[spriteId3].callback = nullsub_11;
+ gSprites[spriteId3].invisible = 1;
+ gSprites[spriteId3].oam.priority = 0;
+ gTasks[taskId].data[10] = spriteId3;
+ spriteId4 = CreateTrainerSprite(sub_806EFF0(0x3F), 0x78, 0x3C, 0, &gDecompressionBuffer[0x800]);
+ gSprites[spriteId4].callback = nullsub_11;
+ gSprites[spriteId4].invisible = 1;
+ gSprites[spriteId4].oam.priority = 0;
+ gTasks[taskId].data[11] = spriteId4;
+}
+
+void sub_8031A5C(u8 taskId)
+{
+ int alpha;
+
+ if (gTasks[taskId].data[1] == 0)
+ {
+ gTasks[gTasks[taskId].data[0]].data[5] = 1;
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]--;
+ gTasks[taskId].data[2]++;
+ alpha = gTasks[taskId].data[2] << 8;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1] + alpha);
+ }
+}
+
+void sub_8031ACC(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x250);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 16);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gTasks[taskId].data[5] = 0;
+ taskId2 = CreateTask(sub_8031A5C, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 16;
+ gTasks[taskId2].data[2] = 0;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031B3C(u8 taskId)
+{
+ int alpha;
+
+ if (gTasks[taskId].data[1] == 16)
+ {
+ gTasks[gTasks[taskId].data[0]].data[5] = 1;
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]++;
+ gTasks[taskId].data[2]--;
+ alpha = gTasks[taskId].data[2] << 8;
+ SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1] + alpha);
+ }
+}
+
+void sub_8031BAC(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x250);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ gTasks[taskId].data[5] = 0;
+ taskId2 = CreateTask(sub_8031B3C, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 0;
+ gTasks[taskId2].data[2] = 16;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031C1C(u8 taskId)
+{
+ if (gTasks[taskId].data[2])
+ {
+ gTasks[taskId].data[2]--;
+ }
+ else if (gTasks[taskId].data[1] == 8)
+ {
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]++;
+ LoadPalette(&gUnknown_082FF018[gTasks[taskId].data[1]], 1, 16);
+ }
+}
+
+void sub_8031C88(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ taskId2 = CreateTask(sub_8031C1C, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 0;
+ gTasks[taskId2].data[2] = 8;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031CC8(u8 taskId)
+{
+ if (gTasks[taskId].data[2])
+ {
+ gTasks[taskId].data[2]--;
+ }
+ else if (gTasks[taskId].data[1] == 0)
+ {
+ DestroyTask(taskId);
+ }
+ else if (gTasks[taskId].data[4])
+ {
+ gTasks[taskId].data[4]--;
+ }
+ else
+ {
+ gTasks[taskId].data[4] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]--;
+ LoadPalette(&gUnknown_082FF018[gTasks[taskId].data[1]], 1, 16);
+ }
+}
+
+void sub_8031D34(u8 taskId, u8 a)
+{
+ u8 taskId2;
+
+ taskId2 = CreateTask(sub_8031CC8, 0);
+ gTasks[taskId2].data[0] = taskId;
+ gTasks[taskId2].data[1] = 8;
+ gTasks[taskId2].data[2] = 8;
+ gTasks[taskId2].data[3] = a;
+ gTasks[taskId2].data[4] = a;
+}
+
+void sub_8031D74(void)
+{
+ DrawMainMenuWindowBorder(gUnknown_082FF088, 0xF3);
+ FillWindowPixelBuffer(1, 17);
+ PrintMenuTable(1, 2, gUnknown_082FF118);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(1, 2, 0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 3);
+}
+
+s8 sub_8031DB4(void)
+{
+ return ProcessMenuInputNoWrapAround();
+}
+
+void set_default_player_name(u8 nameId)
+{
+ u8* name;
+ u8 i;
+
+ if (gSaveBlock2Ptr->playerGender == MALE)
+ name = gMalePresetNames[nameId];
+ else
+ name = gFemalePresetNames[nameId];
+ for (i = 0; i < 7; i++)
+ gSaveBlock2Ptr->playerName[i] = name[i];
+ gSaveBlock2Ptr->playerName[7] = 0xFF;
+}
+
+void CreateMainMenuErrorWindow(u8* str)
+{
+ FillWindowPixelBuffer(7, 17);
+ PrintTextOnWindow(7, 1, str, 0, 1, 2, 0);
+ PutWindowTilemap(7);
+ CopyWindowToVram(7, 2);
+ DrawMainMenuWindowBorder(gUnknown_082FF070, 0x1D5);
+ SetGpuReg(REG_OFFSET_WIN0H, 0x9E7);
+ SetGpuReg(REG_OFFSET_WIN0V, 0x719F);
+}
+
+void fmt_savegame(void)
+{
+ fmt_time();
+ fmt_pokedex();
+ fmt_player();
+ fmt_badges();
+}
+
+void fmt_time(void)
+{
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuPlayer);
+ box_print(2, 1, 0, 17, gUnknown_082FF0E3, -1, gStringVar4);
+ box_print(2, 1, GetStringRightAlignXOffset(1, gSaveBlock2Ptr->playerName, 100), 17, gUnknown_082FF0E3, -1, gSaveBlock2Ptr->playerName);
+}
+
+void fmt_player(void)
+{
+ u8 str[0x20];
+ u8* ptr;
+
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuTime);
+ box_print(2, 1, 0x6C, 17, gUnknown_082FF0E3, -1, gStringVar4);
+ ptr = ConvertIntToDecimalStringN(str, gSaveBlock2Ptr->playTimeHours, 0, 3);
+ *ptr = 0xF0;
+ ConvertIntToDecimalStringN(ptr + 1, gSaveBlock2Ptr->playTimeMinutes, 2, 2);
+ box_print(2, 1, GetStringRightAlignXOffset(1, str, 0xD0), 17, gUnknown_082FF0E3, -1, str);
+}
+
+void fmt_pokedex(void)
+{
+ u8 str[0x20];
+ u16 dexCount;
+
+ if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
+ {
+ if (IsNationalPokedexEnabled())
+ dexCount = pokedex_count(1);
+ else
+ dexCount = sub_80C0844(1);
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuPokedex);
+ box_print(2, 1, 0, 33, gUnknown_082FF0E3, -1, gStringVar4);
+ ConvertIntToDecimalStringN(str, dexCount, 0, 3);
+ box_print(2, 1, GetStringRightAlignXOffset(1, str, 100), 33, gUnknown_082FF0E3, -1, str);
+ }
+}
+
+void fmt_badges(void)
+{
+ u8 str[0x20];
+ u8 badgeCount = 0;
+ u32 i;
+
+ for (i = FLAG_BADGE01_GET; i <= FLAG_BADGE08_GET; i++)
+ {
+ if (FlagGet(i))
+ badgeCount++;
+ }
+ StringExpandPlaceholders(gStringVar4, gText_ContinueMenuBadges);
+ box_print(2, 1, 0x6C, 33, gUnknown_082FF0E3, -1, gStringVar4);
+ ConvertIntToDecimalStringN(str, badgeCount, 2, 1);
+ box_print(2, 1, GetStringRightAlignXOffset(1, str, 0xD0), 33, gUnknown_082FF0E3, -1, str);
+}
+
+void LoadMainMenuWindowFrameTiles(u8 bgId, u16 tileOffset)
+{
+ LoadBgTiles(bgId, GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, tileOffset);
+ LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, 32, 32);
+}
+
+void DrawMainMenuWindowBorder(struct WindowTemplate *template, u16 baseTileNum)
+{
+ u16 r9 = 1 + baseTileNum;
+ u16 r10 = 2 + baseTileNum;
+ u16 sp18 = 3 + baseTileNum;
+ u16 spC = 5 + baseTileNum;
+ u16 sp10 = 6 + baseTileNum;
+ u16 sp14 = 7 + baseTileNum;
+ u16 r6 = 8 + baseTileNum;
+
+ FillBgTilemapBufferRect(template->priority, baseTileNum, template->tilemapLeft - 1, template->tilemapTop - 1, 1, 1, 2);
+ FillBgTilemapBufferRect(template->priority, r9, template->tilemapLeft, template->tilemapTop - 1, template->width, 1, 2);
+ FillBgTilemapBufferRect(template->priority, r10, template->tilemapLeft + template->width, template->tilemapTop - 1, 1, 1, 2);
+ FillBgTilemapBufferRect(template->priority, sp18, template->tilemapLeft - 1, template->tilemapTop, 1, template->height, 2);
+ FillBgTilemapBufferRect(template->priority, spC, template->tilemapLeft + template->width, template->tilemapTop, 1, template->height, 2);
+ FillBgTilemapBufferRect(template->priority, sp10, template->tilemapLeft - 1, template->tilemapTop + template->height, 1, 1, 2);
+ FillBgTilemapBufferRect(template->priority, sp14, template->tilemapLeft, template->tilemapTop + template->height, template->width, 1, 2);
+ FillBgTilemapBufferRect(template->priority, r6, template->tilemapLeft + template->width, template->tilemapTop + template->height, 1, 1, 2);
+ CopyBgTilemapBufferToVram(template->priority);
+}
+
+void sub_8032250(struct WindowTemplate *template)
+{
+ FillBgTilemapBufferRect(template->priority, 0, template->tilemapLeft - 1, template->tilemapTop - 1, template->tilemapLeft + template->width + 1, template->tilemapTop + template->height + 1, 2);
+ CopyBgTilemapBufferToVram(template->priority);
+}
+
+void sub_8032298(u8 a, u8 b, u8 c, u8 d, u8 e, u8 unused)
+{
+ FillBgTilemapBufferRect(a, 0, b + 0xFF, c + 0xFF, d + 2, e + 2, 2);
+}
+
+void sub_80322E0(u8 windowId, u8 a)
+{
+ CallWindowFunction(windowId, sub_8032298);
+ FillWindowPixelBuffer(windowId, 17);
+ ClearWindowTilemap(windowId);
+ if (a == 1)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8032318(u8 a)
+{
+ u8 fontAttribute = GetFontAttribute(1, 6);
+ u8 fontAttribute2 = GetFontAttribute(1, 0);
+ u8 fontAttribute3 = GetFontAttribute(1, 1);
+ u8 windowAttribute = GetWindowAttribute(a, 3);
+ u8 windowAttribute2 = GetWindowAttribute(a, 4);
+
+ FillWindowPixelRect(a, fontAttribute, 0, 0, fontAttribute2 * windowAttribute, fontAttribute3 * windowAttribute2);
+ CopyWindowToVram(a, 2);
+}
+
+void sub_80323A0(struct TextSubPrinter *printer, u16 a)
+{
+ if (*(printer->current_text_offset - 2) == 8 && gUnknown_02022D04 == 0)
+ {
+ gUnknown_02022D04 = 1;
+ CreateTask(sub_8030A70, 0);
+ }
+}
+
+void sub_80323CC(u8 a, u8 b, u16 c, u16 d, u8 e, u8 f)
+{
+ struct WindowTemplate sp;
+ struct WindowTemplate sp2;
+
+ sp = sub_8198A50(0, a + 1, b + 1, 5, 4, f, d);
+ sp2 = sp;
+ CreateYesNoMenu(&sp2, c, e, 0);
+}
+
+void unknown_rbox_to_vram(u8 windowId, u8 a)
+{
+ CallWindowFunction(windowId, sub_8032474);
+ FillWindowPixelBuffer(windowId, 17);
+ PutWindowTilemap(windowId);
+ if (a == 1)
+ CopyWindowToVram(windowId, 3);
+}
+
+void sub_8032474 (u8 a, u8 b, u8 c, u8 d, u8 e, u8 f)
+{
+ FillBgTilemapBufferRect(a, 0xFD, b-2, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0xFF, b-1, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x100, b, c-1, d, 1, f);
+ FillBgTilemapBufferRect(a, 0x101, b+d-1, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x102, b+d, c-1, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x103, b-2, c, 1, 5, f);
+ FillBgTilemapBufferRect(a, 0x105, b-1, c, d+1, 5, f);
+ FillBgTilemapBufferRect(a, 0x106, b+d, c, 1, 5, f);
+ FillBgTilemapBufferRect(a, 0x8FD, b-2, c+e, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x8FF, b-1, c+e, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x900, b, c+e, d-1, 1, f);
+ FillBgTilemapBufferRect(a, 0x901, b+d-1, c+e, 1, 1, f);
+ FillBgTilemapBufferRect(a, 0x902, b+d, c+e, 1, 1, f);
+}
+
+void task_new_game_prof_birch_speech_part2_1(u8 taskId)
+{
+ if (gTasks[taskId].data[7]-- <= 0)
+ {
+ unknown_rbox_to_vram(0, 1);
+ gTasks[taskId].func = task_new_game_prof_birch_speech_part2_2;
+ }
+}