summaryrefslogtreecommitdiff
path: root/src/diploma.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/diploma.c')
-rw-r--r--src/diploma.c285
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);
+}