diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-07-01 22:10:35 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-07-01 22:10:35 -0400 |
commit | 2c953c5baf05d12a829cb73664c9a95f660f1548 (patch) | |
tree | 82543acf54c6996fb2d58abf0eb45771c446cdcd /src/intro.c | |
parent | 74d771ef90a3189bd2da1b35f6b42a1fa8f51e67 (diff) |
Redo partial decomp of intro (force push)
Diffstat (limited to 'src/intro.c')
-rw-r--r-- | src/intro.c | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/src/intro.c b/src/intro.c new file mode 100644 index 000000000..42d2af471 --- /dev/null +++ b/src/intro.c @@ -0,0 +1,289 @@ +#include "global.h" +#include "m4a.h" +#include "malloc.h" +#include "bg.h" +#include "palette.h" +#include "main.h" +#include "gpu_regs.h" +#include "task.h" +#include "scanline_effect.h" +#include "libgcnmultiboot.h" +#include "new_menu_helpers.h" +#include "link.h" +#include "menu.h" +#include "save.h" +#include "new_game.h" + +struct IntroSequenceData +{ + void (*field_0000)(struct IntroSequenceData *); + u8 field_0004; + u8 field_0005; + u8 filler_0006[0x36]; + u8 field_003C[0x400]; + u8 field_043C[0x400]; + u8 filler_083C[0x2080]; +}; // size: 0x28BC + +EWRAM_DATA struct GcmbStruct gUnknown_203AAD4 = {0}; + +void sub_80EC870(void); +void sub_80EC9D4(void); +void sub_80EC9EC(void); +void sub_80ECA00(void); +void sub_80ECA70(void); +void sub_80ECAB0(u8 taskId); +void sub_80ECAA8(struct IntroSequenceData * ptr, void (*cb)(struct IntroSequenceData *)); +void sub_80ECAF0(struct IntroSequenceData * ptr); +void sub_80ECB98(struct IntroSequenceData * ptr); +void sub_80EDBE8(struct IntroSequenceData * ptr); + +extern const u32 gMultiBootProgram_PokemonColosseum_Start[]; + +extern const u8 gUnknown_8402260[]; +extern const u8 gUnknown_8402280[]; +extern const u8 gUnknown_84024E4[]; +extern const u16 gUnknown_8402630[]; +extern const u8 gUnknown_8402650[]; +extern const u8 gUnknown_8402668[]; +extern const u16 gUnknown_840270C[]; +extern const u8 gUnknown_840272C[]; +extern const u8 gUnknown_84028F8[]; + +extern const struct BgTemplate gUnknown_840BB80[2]; +extern const struct WindowTemplate gUnknown_840BBA8[]; + +void sub_80EC5A4(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_80EC5B8(void) +{ + if (!UpdatePaletteFade()) + SetMainCallback2(sub_80EC870); +} + +void load_copyright_graphics(u16 a, u16 b, u16 c) +{ + LZ77UnCompVram(gUnknown_8402280, (void *)BG_VRAM + a); + LZ77UnCompVram(gUnknown_84024E4, (void *)BG_VRAM + b); + LoadPalette(gUnknown_8402260, c, 0x20); +} + +void SerialCb_CopyrightScreen(void) +{ + GameCubeMultiBoot_HandleSerialInterrupt(&gUnknown_203AAD4); +} + +bool8 sub_80EC62C(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + ((vu16*)PLTT)[0] = RGB_WHITE; + SetGpuReg(REG_OFFSET_DISPCNT, 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 + sizeof(vu16), PLTT_SIZE - sizeof(vu16)); + ResetPaletteFade(); + load_copyright_graphics(0, 0x3800, 0); + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + FreeAllSpritePalettes();BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0xFFFF); + SetGpuReg(REG_OFFSET_BG0CNT, 0x700); + EnableInterrupts(INTR_FLAG_VBLANK); + SetVBlankCallback(sub_80EC5A4); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON); + SetSerialCallback(SerialCb_CopyrightScreen); + GameCubeMultiBoot_Init(&gUnknown_203AAD4); + // fallthrough + default: + UpdatePaletteFade(); + gMain.state++; + GameCubeMultiBoot_Main(&gUnknown_203AAD4); + break; + case 140: + GameCubeMultiBoot_Main(&gUnknown_203AAD4); + if (gUnknown_203AAD4.gcmb_field_2 != 1) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gMain.state++; + } + break; + case 141: + if (!UpdatePaletteFade()) + { + gMain.state++; + if (gUnknown_203AAD4.gcmb_field_2 != 0) + { + if (gUnknown_203AAD4.gcmb_field_2 == 2) + { + if (*((u32 *)0x020000AC) == 0x65366347) + { + CpuCopy16(gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, 0x28000); + *((u32 *)0x020000AC) = 0x65366347; + } + GameCubeMultiBoot_ExecuteProgram(&gUnknown_203AAD4); + } + } + else + { + GameCubeMultiBoot_Quit(); + SetSerialCallback(SerialCB); + } + return FALSE; + } + break; + case 142: + sub_800B388(); + SetMainCallback2(sub_80EC5B8); + break; + } + return TRUE; +} + +void c2_copyright_1(void) +{ + if (!sub_80EC62C()) + { + ResetMenuAndMonGlobals(); + Save_ResetSaveCounters(); + Save_LoadGameData(0); + if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID) + Sav2_ClearSetDefault(); + SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); + } +} + +void sub_80EC864(void) +{ + sub_80EC62C(); +} + +void sub_80EC870(void) +{ + switch (gMain.state) + { + default: + gMain.state = 0; + // fallthrough + case 0: + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_DISPCNT, 0); + InitHeap(gHeap, HEAP_SIZE); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + ResetTempTileDataBuffers(); + sub_80ECA00(); + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + FillPalette(0, 0, 0x400); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_840BB80, NELEMS(gUnknown_840BB80)); + break; + case 1: + LoadPalette(gUnknown_8402630, 0x00, 0x20); + DecompressAndCopyTileDataToVram(3, gUnknown_8402650, 0, 0, 0); + DecompressAndCopyTileDataToVram(3, gUnknown_8402668, 0, 0, 1); + LoadPalette(gUnknown_840270C, 0xD0, 0x20); + break; + case 2: + if (!FreeTempTileDataBuffersIfPossible()) + { + sub_80ECA70(); + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + SetMainCallback2(sub_80EC9D4); + SetVBlankCallback(sub_80EC9EC); + } + return; + } + gMain.state++; +} + +void sub_80EC9D4(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_80EC9EC(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_80ECA00(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); + SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); +} + +void sub_80ECA70(void) +{ + struct IntroSequenceData * ptr = Alloc(sizeof(struct IntroSequenceData)); + sub_80ECAA8(ptr, sub_80ECAF0); + ptr->field_0005 = CreateTask(sub_80ECAB0, 3); + SetWordTaskArg(ptr->field_0005, 0, (uintptr_t)ptr); +} + +void sub_80ECAA8(struct IntroSequenceData * ptr, void (*cb)(struct IntroSequenceData *)) +{ + ptr->field_0000 = cb; + ptr->field_0004 = 0; +} + +void sub_80ECAB0(u8 taskId) +{ + struct IntroSequenceData * ptr = (void *)GetWordTaskArg(taskId, 0); + if (JOY_NEW(A_BUTTON | START_BUTTON | SELECT_BUTTON) && ptr->field_0000 != sub_80EDBE8) + sub_80ECAA8(ptr, sub_80EDBE8); + ptr->field_0000(ptr); +} + +void sub_80ECAF0(struct IntroSequenceData * this) +{ + switch (this->field_0004) + { + case 0: + InitWindows(gUnknown_840BBA8); + LZ77UnCompWram(gUnknown_840272C, this->field_043C); + LZ77UnCompWram(gUnknown_84028F8, this->field_003C); + FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x11); + FillWindowPixelBuffer(0, 0x00); + BlitBitmapToWindow(0, this->field_043C, 0, 40, 144, 16); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + this->field_0004++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + sub_80ECAA8(this, sub_80ECB98); + break; + } +} |