Redo partial decomp of intro (force push)
This commit is contained in:
+289
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user