Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "global.h"
- #include "new_game_menu.h"
- #include "main.h"
- #include "menu.h"
- #include "scanline_effect.h"
- #include "palette.h"
- #include "sprite.h"
- #include "task.h"
- #include "bg.h"
- #include "gpu_regs.h"
- #include "window.h"
- #include "text.h"
- #include "text_window.h"
- #include "international_string_util.h"
- #include "strings.h"
- #include "gba/m4a_internal.h"
- #include "constants/rgb.h"
- #include "constants/songs.h"
- #include "sound.h"
- #include "overworld.h"
- #include "naming_screen.h"
- #include "string_util.h"
- #include "event_data.h"
- // Task data
- enum
- {
- TD_MENUSELECTION,
- };
- // Menu items
- enum
- {
- MENUITEM_NAME,
- MENUITEM_CHARACTER,
- MENUITEM_OUTFIT,
- MENUITEM_BEGIN,
- MENUITEM_COUNT,
- };
- // Window Ids
- enum
- {
- WIN_NEW_GAME_TITLE,
- WIN_NEW_GAME_MENU,
- WIN_NEW_GAME_NAME
- };
- #define YPOS_NAME (MENUITEM_NAME * 16)
- #define YPOS_CHARACTER (MENUITEM_CHARACTER * 16)
- #define YPOS_OUTFIT (MENUITEM_OUTFIT * 16)
- #define YPOS_BEGIN (MENUITEM_BEGIN * 16)
- #define VAR_CHARACTER VAR_TEMP_0
- #define VAR_OUTFIT VAR_TEMP_1
- // this file's functions
- static void Task_NewGameMenuFadeIn(u8 taskId);
- static void Task_NewGameMenuProcessInput(u8 taskId);
- static void Task_NewGameMenuBeginGame(u8 taskId);
- static void Task_NewGameMenuBeginGameCleanup(u8 taskId);
- static void Task_NewGameMenuBackToMainMenu(u8 taskId);
- static void Task_NewGameMenuFadeOut(u8 taskId);
- static void HighlightNewGameMenuItem(u8 selection);
- static void Name_ProcessInput(u8 taskId);
- static void Name_StartNamingScreen(u8 taskId);
- static void Character_ProcessInput(u8 taskId);
- static void Outfit_ProcessInput(u8 taskId);
- static void Begin_ProcessInput(u8 taskId);
- static void DrawTitleText(void);
- static void DrawNewGameMenuTexts(void);
- static void DrawBgWindowFrames(void);
- static void DrawPlayerNameText(void);
- EWRAM_DATA static bool8 sArrowPressed = FALSE;
- static const u16 sNewGameMenuText_Pal[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal");
- static const u8 defaultName[] = _("Brendan");
- static const u8 *const sNewGameMenuItemsNames[MENUITEM_COUNT] =
- {
- [MENUITEM_NAME] = gText_NewGameName,
- [MENUITEM_CHARACTER] = gText_NewGameCharacter,
- [MENUITEM_OUTFIT] = gText_NewGameOutfit,
- [MENUITEM_BEGIN] = gText_NewGameBegin,
- };
- static const struct WindowTemplate sNewGameMenuWinTemplates[] =
- {
- {
- .bg = 1,
- .tilemapLeft = 2,
- .tilemapTop = 1,
- .width = 10,
- .height = 2,
- .paletteNum = 1,
- .baseBlock = 2
- },
- {
- .bg = 0,
- .tilemapLeft = 2,
- .tilemapTop = 5,
- .width = 10,
- .height = 14,
- .paletteNum = 1,
- .baseBlock = 22
- },
- {
- .bg = 1,
- .tilemapLeft = 16,
- .tilemapTop = 5,
- .width = 12,
- .height = 2,
- .paletteNum = 1,
- .baseBlock = 162
- },
- DUMMY_WIN_TEMPLATE
- };
- static const struct BgTemplate sNewGameMenuBgTemplates[] =
- {
- {
- .bg = 1,
- .charBaseIndex = 1,
- .mapBaseIndex = 30,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
- {
- .bg = 0,
- .charBaseIndex = 1,
- .mapBaseIndex = 31,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 1,
- .baseTile = 0
- },
- {
- .bg = 1,
- .charBaseIndex = 1,
- .mapBaseIndex = 32,
- .screenSize = 0,
- .paletteMode = 0,
- .priority = 0,
- .baseTile = 0
- },
- };
- static const u16 sNewGameMenuBg_Pal[] = {RGB(31, 31, 16)};
- // code
- static void MainCB2(void)
- {
- RunTasks();
- AnimateSprites();
- BuildOamBuffer();
- UpdatePaletteFade();
- }
- static void VBlankCB(void)
- {
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
- }
- void CB2_InitNewGameMenu(void)
- {
- switch (gMain.state)
- {
- default:
- case 0:
- SetVBlankCallback(NULL);
- gMain.state++;
- break;
- case 1:
- DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000);
- DmaClear32(3, OAM, OAM_SIZE);
- DmaClear16(3, PLTT, PLTT_SIZE);
- SetGpuReg(REG_OFFSET_DISPCNT, 0);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sNewGameMenuBgTemplates, ARRAY_COUNT(sNewGameMenuBgTemplates));
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- ChangeBgX(1, 0, 0);
- ChangeBgY(1, 0, 0);
- ChangeBgX(2, 0, 0);
- ChangeBgY(2, 0, 0);
- ChangeBgX(3, 0, 0);
- ChangeBgY(3, 0, 0);
- InitWindows(sNewGameMenuWinTemplates);
- DeactivateAllTextPrinters();
- SetGpuReg(REG_OFFSET_WIN0H, 0);
- SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_CLR);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_DARKEN);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0);
- SetGpuReg(REG_OFFSET_BLDY, 4);
- SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
- ShowBg(0);
- ShowBg(1);
- gMain.state++;
- break;
- case 2:
- ResetPaletteFade();
- ScanlineEffect_Stop();
- ResetTasks();
- ResetSpriteData();
- gMain.state++;
- break;
- case 3:
- LoadBgTiles(1, GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1A2);
- gMain.state++;
- break;
- case 4:
- LoadPalette(sNewGameMenuBg_Pal, 0, sizeof(sNewGameMenuBg_Pal));
- LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, 0x70, 0x20);
- gMain.state++;
- break;
- case 5:
- LoadPalette(sNewGameMenuText_Pal, 16, sizeof(sNewGameMenuText_Pal));
- gMain.state++;
- break;
- case 6:
- PutWindowTilemap(0);
- DrawTitleText();
- gMain.state++;
- break;
- case 7:
- gMain.state++;
- break;
- case 8:
- PutWindowTilemap(1);
- DrawNewGameMenuTexts();
- gMain.state++;
- case 9:
- PutWindowTilemap(2);
- StringCopy(gStringVar1, defaultName);
- DrawPlayerNameText();
- gMain.state++;
- case 10:
- DrawBgWindowFrames();
- gMain.state++;
- break;
- case 11:
- {
- u8 taskId = CreateTask(Task_NewGameMenuFadeIn, 0);
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- VarSet(VAR_CHARACTER, FEMALE);
- HighlightNewGameMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
- CopyWindowToVram(WIN_NEW_GAME_MENU, 3);
- gMain.state++;
- break;
- }
- case 12:
- PlayBGM(MUS_RG_MYSTERY_GIFT);
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
- SetVBlankCallback(VBlankCB);
- SetMainCallback2(MainCB2);
- return;
- }
- }
- void CB2_ReturnToNewGameMenuFromNamingScreen(void)
- {
- u8 taskId;
- SetVBlankCallback(NULL);
- DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000);
- DmaClear32(3, OAM, OAM_SIZE);
- DmaClear16(3, PLTT, PLTT_SIZE);
- SetGpuReg(REG_OFFSET_DISPCNT, 0);
- ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sNewGameMenuBgTemplates, ARRAY_COUNT(sNewGameMenuBgTemplates));
- ChangeBgX(0, 0, 0);
- ChangeBgY(0, 0, 0);
- ChangeBgX(1, 0, 0);
- ChangeBgY(1, 0, 0);
- ChangeBgX(2, 0, 0);
- ChangeBgY(2, 0, 0);
- ChangeBgX(3, 0, 0);
- ChangeBgY(3, 0, 0);
- InitWindows(sNewGameMenuWinTemplates);
- DeactivateAllTextPrinters();
- SetGpuReg(REG_OFFSET_WIN0H, 0);
- SetGpuReg(REG_OFFSET_WIN0V, 0);
- SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0);
- SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_CLR);
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_DARKEN);
- SetGpuReg(REG_OFFSET_BLDALPHA, 0);
- SetGpuReg(REG_OFFSET_BLDY, 4);
- SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
- ShowBg(0);
- ShowBg(1);
- ResetPaletteFade();
- ScanlineEffect_Stop();
- ResetTasks();
- ResetSpriteData();
- LoadBgTiles(1, GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1A2);
- LoadPalette(sNewGameMenuBg_Pal, 0, sizeof(sNewGameMenuBg_Pal));
- LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, 0x70, 0x20);
- LoadPalette(sNewGameMenuText_Pal, 16, sizeof(sNewGameMenuText_Pal));
- PutWindowTilemap(0);
- DrawTitleText();
- PutWindowTilemap(1);
- DrawNewGameMenuTexts();
- PutWindowTilemap(2);
- DrawPlayerNameText();
- DrawBgWindowFrames();
- taskId = CreateTask(Task_NewGameMenuFadeIn, 0);
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- HighlightNewGameMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
- CopyWindowToVram(WIN_NEW_GAME_MENU, 3);
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
- SetVBlankCallback(VBlankCB);
- SetMainCallback2(MainCB2);
- }
- static void Task_NewGameMenuFadeIn(u8 taskId)
- {
- if (!gPaletteFade.active)
- gTasks[taskId].func = Task_NewGameMenuProcessInput;
- }
- static void Task_NewGameMenuProcessInput(u8 taskId)
- {
- if (JOY_NEW(B_BUTTON))
- {
- gTasks[taskId].func = Task_NewGameMenuBackToMainMenu;
- }
- else if (JOY_NEW(DPAD_UP))
- {
- if (gTasks[taskId].data[TD_MENUSELECTION] > 0)
- gTasks[taskId].data[TD_MENUSELECTION]--;
- else
- gTasks[taskId].data[TD_MENUSELECTION] = MENUITEM_BEGIN;
- HighlightNewGameMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
- }
- else if (JOY_NEW(DPAD_DOWN))
- {
- if (gTasks[taskId].data[TD_MENUSELECTION] < MENUITEM_BEGIN)
- gTasks[taskId].data[TD_MENUSELECTION]++;
- else
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- HighlightNewGameMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
- }
- else
- {
- switch (gTasks[taskId].data[TD_MENUSELECTION])
- {
- case MENUITEM_NAME:
- Name_ProcessInput(taskId);
- break;
- case MENUITEM_CHARACTER:
- Character_ProcessInput(taskId);
- break;
- case MENUITEM_OUTFIT:
- Outfit_ProcessInput(taskId);
- break;
- case MENUITEM_BEGIN:
- Begin_ProcessInput(taskId);
- break;
- default:
- return;
- }
- if (sArrowPressed)
- {
- sArrowPressed = FALSE;
- CopyWindowToVram(WIN_NEW_GAME_MENU, 2);
- }
- }
- }
- static void Task_NewGameMenuBackToMainMenu(u8 taskId)
- {
- PlayBGM(MUS_NONE);
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
- gTasks[taskId].func = Task_NewGameMenuFadeOut;
- }
- static void Task_NewGameMenuBeginGame(u8 taskId)
- {
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
- gTasks[taskId].func = Task_NewGameMenuBeginGameCleanup;
- }
- static void Task_NewGameMenuBeginGameCleanup(u8 taskId)
- {
- u8 i;
- if (!gPaletteFade.active)
- {
- gSaveBlock2Ptr->playerGender = VarGet(VAR_CHARACTER);
- for (i = 0; i < PLAYER_NAME_LENGTH; i++)
- gSaveBlock2Ptr->playerName[i] = gStringVar1[i];
- gSaveBlock2Ptr->playerName[PLAYER_NAME_LENGTH] = EOS;
- FreeAllWindowBuffers();
- SetMainCallback2(CB2_NewGame);
- DestroyTask(taskId);
- }
- }
- static void Task_NewGameMenuFadeOut(u8 taskId)
- {
- if (!gPaletteFade.active)
- {
- DestroyTask(taskId);
- FreeAllWindowBuffers();
- SetMainCallback2(gMain.savedCallback);
- }
- }
- static void HighlightNewGameMenuItem(u8 index)
- {
- SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(16, 96));
- SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(index * 16 + 40, index * 16 + 56));
- }
- static void Name_ProcessInput(u8 taskId)
- {
- if (JOY_NEW(A_BUTTON))
- {
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
- gTasks[taskId].func = Name_StartNamingScreen;
- }
- }
- static void Name_StartNamingScreen(u8 taskId)
- {
- if (!gPaletteFade.active)
- {
- FreeAllWindowBuffers();
- DestroyTask(taskId);
- DoNamingScreen(NAMING_SCREEN_PLAYER, gStringVar1, VarGet(VAR_CHARACTER), 0, 0, CB2_ReturnToNewGameMenuFromNamingScreen);
- }
- }
- static void Character_ProcessInput(u8 taskId)
- {
- if (JOY_NEW(DPAD_LEFT))
- {
- PlaySE(SE_SELECT);
- if (VarGet(VAR_CHARACTER) == MALE)
- VarSet(VAR_CHARACTER, FEMALE);
- else if (VarGet(VAR_CHARACTER) == FEMALE)
- VarSet(VAR_CHARACTER, MALE);
- }
- if (JOY_NEW(DPAD_RIGHT))
- {
- PlaySE(SE_SELECT);
- if (VarGet(VAR_CHARACTER) == MALE)
- VarSet(VAR_CHARACTER, FEMALE);
- else if (VarGet(VAR_CHARACTER) == FEMALE)
- VarSet(VAR_CHARACTER, MALE);
- }
- }
- static void Outfit_ProcessInput(u8 taskId)
- {
- if (JOY_NEW(DPAD_LEFT))
- {
- PlaySE(SE_SELECT);
- }
- if (JOY_NEW(DPAD_RIGHT))
- {
- PlaySE(SE_SELECT);
- }
- }
- static void Begin_ProcessInput(u8 taskId)
- {
- if (JOY_NEW(A_BUTTON))
- {
- gTasks[taskId].func = Task_NewGameMenuBeginGame;
- }
- }
- static void DrawTitleText(void)
- {
- FillWindowPixelBuffer(WIN_NEW_GAME_TITLE, PIXEL_FILL(1));
- AddTextPrinterParameterized(WIN_NEW_GAME_TITLE, 1, gText_NewGameMenuTitle, 8, 1, TEXT_SPEED_FF, NULL);
- CopyWindowToVram(WIN_NEW_GAME_TITLE, 3);
- }
- static void DrawNewGameMenuTexts(void)
- {
- u8 i;
- FillWindowPixelBuffer(WIN_NEW_GAME_MENU, PIXEL_FILL(1));
- for (i = 0; i < MENUITEM_COUNT; i++)
- {
- AddTextPrinterParameterized(WIN_NEW_GAME_MENU, 1, sNewGameMenuItemsNames[i], 8, (i * 16) + 1, TEXT_SPEED_FF, NULL);
- }
- CopyWindowToVram(WIN_NEW_GAME_MENU, 3);
- }
- static void DrawPlayerNameText(void)
- {
- FillWindowPixelBuffer(WIN_NEW_GAME_NAME, PIXEL_FILL(1));
- PrintPlayerNameOnWindow(WIN_NEW_GAME_NAME, gStringVar1, 8, 1);
- CopyWindowToVram(WIN_NEW_GAME_NAME, 3);
- }
- #define TILE_TOP_CORNER_L 0x1A2
- #define TILE_TOP_EDGE 0x1A3
- #define TILE_TOP_CORNER_R 0x1A4
- #define TILE_LEFT_EDGE 0x1A5
- #define TILE_RIGHT_EDGE 0x1A7
- #define TILE_BOT_CORNER_L 0x1A8
- #define TILE_BOT_EDGE 0x1A9
- #define TILE_BOT_CORNER_R 0x1AA
- static void DrawBgWindowFrames(void)
- {
- // bg, tile, x, y, width, height, palNum
- // Draw title window frame
- FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 0, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 0, 11, 1, 7);
- FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 12, 0, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 1, 1, 2, 7);
- FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 12, 1, 1, 2, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 3, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 3, 11, 1, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 12, 3, 1, 1, 7);
- // Draw new game menu window frame
- FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 4, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 4, 11, 1, 7);
- FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 12, 4, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 5, 1, 18, 7);
- FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 12, 5, 1, 18, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 19, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 19, 11, 1, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 12, 19, 1, 1, 7);
- // Draw player name window frame
- FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 15, 4, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 16, 4, 11, 1, 7);
- FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 27, 4, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 15, 5, 1, 2, 7);
- FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 27, 5, 1, 2, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 15, 7, 1, 1, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 16, 7, 11, 1, 7);
- FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 27, 7, 1, 1, 7);
- CopyBgTilemapBufferToVram(1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement