diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-07-30 22:07:15 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-07-30 22:07:15 -0400 |
commit | ea8f529f2d5bb520b83d5b7721dc47ba1b489d45 (patch) | |
tree | 87a234f44bc4284c3a7c997d274b264320c8163b /src | |
parent | 23d917f7c89c1256f1e935a57d490816fd916f55 (diff) |
title_screen: data and code thru sub_8078C9C
Diffstat (limited to 'src')
-rw-r--r-- | src/title_screen.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/src/title_screen.c b/src/title_screen.c new file mode 100644 index 000000000..9e779bb7b --- /dev/null +++ b/src/title_screen.c @@ -0,0 +1,192 @@ +#include "global.h" +#include "malloc.h" +#include "palette.h" +#include "gpu_regs.h" +#include "bg.h" +#include "task.h" +#include "main.h" +#include "new_menu_helpers.h" +#include "m4a.h" +#include "scanline_effect.h" +#include "constants/songs.h" + +EWRAM_DATA u8 gUnknown_2037F30 = 0; + +void sub_8078B34(void); +void sub_8078B9C(void); +void sub_8078BB4(void); +void sub_8078BEC(u8 taskId); +void sub_8078C24(u8 taskId); +void sub_8078C90(s16 * data, u8 a1); +void sub_8078C9C(s16 * data); +void sub_8078D24(s16 * data); +void sub_8078DA4(s16 * data); +void sub_8078FC4(s16 * data); +void sub_80790CC(s16 * data); +void sub_80791C0(s16 * data); +void sub_8079708(void); +void sub_8079620(void); +void sub_8079648(void); +void sub_8079A10(s16 a0); + +const u8 gUnknown_83BF58C[] = INCBIN_U8("data/graphics/title_screen/unk_83BF58C.4bpp.lz"); +const u8 gUnknown_83BF5A8[] = INCBIN_U8("data/graphics/title_screen/unk_83BF5A8.bin.lz"); +extern const struct BgTemplate gUnknown_83BFB74[4]; +extern const void (*const gUnknown_83BFB84[])(s16 * data); + +/*graphics.h*/ +extern const u16 gUnknown_8EAB6C4[]; +extern const u8 gUnknown_8EAB8C4[]; +extern const u8 gUnknown_8EAD390[]; +extern const u16 gUnknown_8EAD5E8[]; +extern const u8 gUnknown_8EAD608[]; +extern const u8 gUnknown_8EADEE4[]; +extern const u16 gUnknown_8EAE094[]; +extern const u8 gUnknown_8EAE0B4[]; +extern const u8 gUnknown_8EAE374[]; + +void CB2_InitTitleScreen(void) +{ + switch (gMain.state) + { + default: + gMain.state = 0; + // fallthrough + case 0: + SetVBlankCallback(NULL); + StartTimer1(); + InitHeap(gHeap, HEAP_SIZE); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetPaletteFade(); + sub_8078B34(); + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)PLTT, PLTT_SIZE); + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, gUnknown_83BFB74, NELEMS(gUnknown_83BFB74)); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + gUnknown_2037F30 = 0xFF; + break; + case 1: + LoadPalette(gUnknown_8EAB6C4, 0, 0x1A0); + DecompressAndCopyTileDataToVram(0, gUnknown_8EAB8C4, 0, 0, 0); + DecompressAndCopyTileDataToVram(0, gUnknown_8EAD390, 0, 0, 1); + LoadPalette(gUnknown_8EAD5E8, 0xD0, 0x20); + DecompressAndCopyTileDataToVram(1, gUnknown_8EAD608, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, gUnknown_8EADEE4, 0, 0, 1); + LoadPalette(gUnknown_8EAE094, 0xF0, 0x20); + DecompressAndCopyTileDataToVram(2, gUnknown_8EAE0B4, 0, 0, 0); + DecompressAndCopyTileDataToVram(2, gUnknown_8EAE374, 0, 0, 1); + LoadPalette(gUnknown_8EAE094, 0xE0, 0x20); + DecompressAndCopyTileDataToVram(3, gUnknown_83BF58C, 0, 0, 0); + DecompressAndCopyTileDataToVram(3, gUnknown_83BF5A8, 0, 0, 1); + sub_8079708(); + break; + case 2: + if (!FreeTempTileDataBuffersIfPossible()) + { + BlendPalettes(0x0000FFFF, 0x10, RGB_BLACK); + CreateTask(sub_8078C24, 4); + gUnknown_2037F30 = CreateTask(sub_8078BEC, 2); + SetVBlankCallback(sub_8078BB4); + SetMainCallback2(sub_8078B9C); + m4aSongNumStart(BGM_FRLG_TITLE); + } + return; + } + gMain.state++; +} + +void sub_8078B34(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); +} + +void sub_8078B9C(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_8078BB4(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); + + if (gUnknown_2037F30 != 0xFF) + gTasks[gUnknown_2037F30].data[0]++; +} + +void sub_8078BEC(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + + if (data[0] >= 2700) + { + gUnknown_2037F30 = 0xFF; + DestroyTask(taskId); + } +} + +void sub_8078C24(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + + if (JOY_NEW(A_BUTTON | B_BUTTON | START_BUTTON) + && data[0] != 3 && data[0] != 4 && data[0] != 5) + { + sub_8079620(); + sub_8079648(); + sub_8079A10(data[5]); + sub_8078C90(data, 3); + } + else + { + gUnknown_83BFB84[data[0]](data); + } +} + +void sub_8078C90(s16 * data, u8 a1) +{ + data[1] = 0; + data[0] = a1; +} + +void sub_8078C9C(s16 * data) +{ + struct ScanlineEffectParams params; + + HideBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + + params.dmaDest = (volatile void *)REG_ADDR_BLDY; + params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + params.initState = 1; + params.unused9 = 0; + + CpuFill16(0, gScanlineEffectRegBuffers[0], 0x140); + CpuFill16(0, gScanlineEffectRegBuffers[1], 0x140); + + ScanlineEffect_SetParams(params); + + sub_8078C90(data, 1); +} |