diff options
Diffstat (limited to 'src/diploma.c')
-rw-r--r-- | src/diploma.c | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/src/diploma.c b/src/diploma.c new file mode 100644 index 000000000..517ee8aa0 --- /dev/null +++ b/src/diploma.c @@ -0,0 +1,285 @@ +#include "global.h" +#include "bg.h" +#include "constants/fanfares.h" +#include "dynamic_placeholder_text_util.h" +#include "gba/macro.h" +#include "gpu_regs.h" +#include "gpu_regs.h" +#include "main.h" +#include "malloc.h" +#include "menu.h" +#include "new_menu_helpers.h" +#include "overworld.h" +#include "palette.h" +#include "pokedex.h" +#include "scanline_effect.h" +#include "sound.h" +#include "sprite.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "window.h" +#include "diploma.h" + +struct Diploma +{ + u8 state; + u8 gfxStep; + u8 callbackStep; + u16 tilemapBuffer[0x800]; +}; + +static EWRAM_DATA struct Diploma *gDiploma = NULL; + +static void DiplomaBgInit(void); +static void DiplomaPrintText(void); +static u8 DiplomaLoadGfx(void); +static void DiplomaVblankHandler(void); +static void CB2_DiplomaInit(void); +static void Task_WaitForExit(u8); +static void Task_DiplomaInit(u8); +static void Task_DiplomaReturnToOverworld(u8); + +static const u32 gUnknown_84147C0[] = INCBIN_U32("graphics/diploma/unk_84147C0.4bpp.lz"); +static const u32 gUnknown_84154E8[] = INCBIN_U32("graphics/diploma/unk_84154E8.bin.lz"); +static const u16 gUnknown_8415954[] = INCBIN_U16("graphics/diploma/unk_8415954.gbapal"); + +static const u8 gUnknown_8415994[] = _("{HIGHLIGHT TRANSPARENT}プレイヤー"); +static const u8 gUnknown_841599D[] = _("{HIGHLIGHT TRANSPARENT}さま"); +static const u8 gUnknown_84159A3[] = _("{HIGHLIGHT TRANSPARENT}ホウエン"); +static const u8 gUnknown_84159AB[] = _("{HIGHLIGHT TRANSPARENT}ぜんこく"); +static const u8 gUnknown_84159B3[] = _("{HIGHLIGHT TRANSPARENT} ポケモンずかんを\nみごと かんせい させた\nいだいなこうせきを たたえ\nここに しょうめい します"); +static const u8 gUnknown_84159ED[] = _("{COLOR RED}{HIGHLIGHT TRANSPARENT}ゲームフリーク"); +static const u8 gUnknown_84159FB[] = _("{COLOR RED}{HIGHLIGHT TRANSPARENT}"); + +static const ALIGNED(4) struct TextColor gUnknown_8415A04 = {0, 2, 3}; + +static const struct BgTemplate gUnknown_8415A08[] = { + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 1, + }, { + .bg = 1, + .charBaseIndex = 1, + .mapBaseIndex = 29, + .screenSize = 1, + .paletteMode = 0, + .priority = 1, + .baseTile = 0, + } +}; + +static const struct WindowTemplate gUnknown_8415A10[] = { + { + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 2, + .width = 29, + .height = 16, + .paletteNum = 15, + .baseBlock = 0x000 + }, DUMMY_WIN_TEMPLATE +}; + +static void VCBC_DiplomaOam(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void CB2_ShowDiploma(void) +{ + gDiploma = AllocZeroed(sizeof(*gDiploma)); + gDiploma->state = 0; + gDiploma->gfxStep = 0; + gDiploma->callbackStep = 0; + DiplomaBgInit(); + CreateTask(Task_DiplomaInit, 0); + SetMainCallback2(CB2_DiplomaInit); +} + +static void CB2_DiplomaInit(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void Task_DiplomaInit(u8 taskId) +{ + switch (gDiploma->callbackStep) + { + case 0: + SetVBlankCallback(NULL); + break; + case 1: + DiplomaVblankHandler(); + break; + case 2: + if (!DiplomaLoadGfx()) + { + return; + } + break; + case 3: + CopyToBgTilemapBuffer(1, gUnknown_84154E8, 0, 0); + break; + case 4: + if (HasAllKantoMons()) + { + SetGpuReg(REG_OFFSET_BG1HOFS, 0x80 << 1); + } + else + { + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + } + break; + case 5: + DiplomaPrintText(); + break; + case 6: + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + break; + case 7: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + break; + case 8: + SetVBlankCallback(VCBC_DiplomaOam); + break; + default: + if (gPaletteFade.active) + { + break; + } + PlayFanfareByFanfareNum(FANFARE_05); + gTasks[taskId].func = Task_WaitForExit; + } + gDiploma->callbackStep++; +} + +static void Task_WaitForExit(u8 taskId) +{ + switch (gDiploma->state) + { + case 0: + if (WaitFanfare(0)) + { + gDiploma->state++; + } + break; + case 1: + if (JOY_NEW(A_BUTTON)) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gDiploma->state++; + } + break; + case 2: + Task_DiplomaReturnToOverworld(taskId); + break; + } +} + +static void Task_DiplomaReturnToOverworld(u8 taskId) +{ + if (gPaletteFade.active) + return; + DestroyTask(taskId); + FreeAllWindowBuffers(); + FREE_AND_SET_NULL(gDiploma); + SetMainCallback2(CB2_Overworld); +} + +static void DiplomaBgInit(void) +{ + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + ResetTasks(); + ScanlineEffect_Stop(); +} + +static void DiplomaVblankHandler(void) +{ + void *vram = (void *)VRAM; + DmaClearLarge16(3, vram, VRAM_SIZE, 0x1000); + DmaClear32(3, (void *)OAM, OAM_SIZE); + DmaClear16(3, (void *)PLTT, PLTT_SIZE); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_8415A08, 2); + 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(gUnknown_8415A10); + DeactivateAllTextPrinters(); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + SetBgTilemapBuffer(1, gDiploma->tilemapBuffer); + ShowBg(0); + ShowBg(1); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); +} + +static u8 DiplomaLoadGfx(void) +{ + switch (gDiploma->gfxStep) + { + case 0: + ResetTempTileDataBuffers(); + break; + case 1: + DecompressAndCopyTileDataToVram(1, gUnknown_84147C0, 0, 0, 0); + break; + case 2: + if (!(FreeTempTileDataBuffersIfPossible() == 1)) + { + break; + } + return 0; + case 3: + LoadPalette(gUnknown_8415954, 0, 0x40); + default: + return 1; + } + gDiploma->gfxStep++; + return 0; +} + +static void DiplomaPrintText(void) +{ + u8 arr[160]; + u32 width; + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gSaveBlock2Ptr->playerName); + if (HasAllKantoMons()) + { + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B68F); + } + else + { + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_841B698); + } + FillWindowPixelBuffer(0, 0); + DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B60E); + width = GetStringWidth(2, arr, -1); + AddTextPrinterParameterized3(0, 2, 0x78 - (width / 2), 4, &gUnknown_8415A04, -1, arr); + DynamicPlaceholderTextUtil_ExpandPlaceholders(arr, gUnknown_841B619); + width = GetStringWidth(2, arr, -1); + AddTextPrinterParameterized3(0, 0x2, 0x78 - (width / 2), 0x1E, &gUnknown_8415A04, -1, arr); + AddTextPrinterParameterized3(0, 0x2, 0x78, 0x69, &gUnknown_8415A04, 0, gUnknown_841B684); + PutWindowTilemap(0); +} |