tmc/src/staffroll.c

326 lines
9.8 KiB
C

#include "global.h"
#include "room.h"
#include "main.h"
#include "save.h"
#include "flags.h"
#include "fileselect.h"
#include "screen.h"
#include "common.h"
#include "menu.h"
#include "game.h"
#include "subtask.h"
typedef struct {
/*0x00*/ Menu base;
s16 unk_10;
u16 unk_12;
u16 unk_14;
u8 unk_16;
u8 unk_17;
u8 unk_18;
u8 unk_19;
u8 bgmMusicStarted;
u8 unk_1b[0x14];
u8 unk_2f;
} StaffrollMenu;
#define gStaffrollMenu (*(StaffrollMenu*)&gMenu)
const Font gUnk_08127280 = {
(u16*)0x02021f72, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 0, 0, 0, 0, 0, 5, 0, 1, 0
};
const Font gUnk_08127298 = {
(u16*)0x02021f90, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 0, 0, 0, 0, 0, 5, 0, 1, 0
};
const Font gUnk_081272B0 = {
(u16*)0x0202204e, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 1, 0, 0, 0, 0, 5, 0, 1, 0
};
const Font gUnk_081272C8 = {
(u16*)0x020222ce, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 1, 0, 0, 0, 0, 5, 0, 1, 0
};
const Font* const gUnk_081272E0[] = {
&gUnk_08127280,
&gUnk_08127298,
&gUnk_081272B0,
&gUnk_081272C8,
};
// TODO figure out structure of gStaffrollMenu.base.field_0xc
extern u8 gUnk_081272F0[];
extern u8 gUnk_08127644[];
extern u8 gUnk_08127998[];
extern const u8 gUnk_08127CEC[];
extern void (*const gUnk_08127D00[])(void);
extern void (*const gUnk_08127D10[])(void);
void sub_080A3954(void);
void StaffrollTask(void) {
gRoomTransition.frameCount++;
gUnk_08127D00[gMain.state]();
}
void StaffrollTask_State0(void) {
gSave.saw_staffroll = TRUE;
SetGlobalFlag(GAMECLEAR);
gMain.state = 1;
gStaffrollMenu.base.menuType = 0;
gStaffrollMenu.base.transitionTimer = 0xb4;
gStaffrollMenu.unk_16 = 5;
gStaffrollMenu.unk_17 = 4;
gStaffrollMenu.bgmMusicStarted = 0;
if (gSaveHeader->language >= 2) {
gStaffrollMenu.base.field_0xc = gUnk_08127998;
} else {
if (gSaveHeader->language == 1) {
gStaffrollMenu.base.field_0xc = gUnk_08127644;
} else {
gStaffrollMenu.base.field_0xc = gUnk_081272F0;
}
}
DispReset(0);
LoadPaletteGroup(0xb);
LoadPaletteGroup(0xc);
SetColor(0, 0);
gScreen.lcd.displayControl = 0x640;
gScreen.controls.layerFXControl = 0x2442;
gScreen.controls.alphaBlend = 0x1000;
gScreen.bg1.control = 0x1e4d;
gScreen.bg2.control = 0x1dc3;
InitSoundPlayingInfo();
ResetSystemPriority();
SetFade(FADE_IN_OUT | FADE_INSTANT, 0x100);
}
void StaffrollTask_State1(void) {
gUnk_08127D10[gMenu.menuType]();
}
void StaffrollTask_State1MenuType0(void) {
if (--gMenu.transitionTimer == 0) {
sub_080A3954();
}
}
void StaffrollTask_State1MenuType1(void) {
if (gFadeControl.active == 0) {
const u8* ptr = &gUnk_08127CEC[gStaffrollMenu.unk_10 * 2];
LoadPaletteGroup(ptr[0]);
LoadGfxGroup(ptr[1]);
MemClear(&gBG1Buffer, 0x800);
gScreen.bg1.updated = 1;
gScreen.bg2.xOffset = gStaffrollMenu.unk_12;
gScreen.controls.alphaBlend = 0x1000;
gStaffrollMenu.base.menuType = 0;
if (gStaffrollMenu.bgmMusicStarted == 0) {
gStaffrollMenu.bgmMusicStarted = 1;
SoundReq(BGM_CREDITS);
}
SetFade(FADE_INSTANT, 8);
}
}
void StaffrollTask_State1MenuType2(void) {
u8 tmp;
switch (gStaffrollMenu.base.overlayType) {
case 0:
MemClear(&gBG1Buffer, 0x800);
sub_0805F46C(gStaffrollMenu.unk_10, (Font*)gUnk_081272E0[gStaffrollMenu.unk_19]);
gScreen.bg1.updated = 1;
gStaffrollMenu.base.overlayType++;
gStaffrollMenu.unk_18 = 0;
break;
case 1:
if (gFadeControl.active != 0) {
return;
}
if ((gRoomTransition.frameCount & 1) != 0) {
return;
}
tmp = ++gStaffrollMenu.unk_18;
gScreen.controls.alphaBlend = (0x10 - tmp) * 0x100 | tmp;
if (gStaffrollMenu.unk_18 >= 0x10) {
gStaffrollMenu.base.overlayType++;
}
break;
case 2:
gStaffrollMenu.base.transitionTimer--;
if (gStaffrollMenu.base.transitionTimer == 0) {
gStaffrollMenu.base.overlayType++;
}
break;
case 3:
if ((gRoomTransition.frameCount & 1) != 0) {
return;
}
tmp = --gStaffrollMenu.unk_18;
gScreen.controls.alphaBlend = (0x10 - tmp) * 0x100 | tmp;
if (gStaffrollMenu.unk_18 == 0) {
gStaffrollMenu.base.overlayType++;
}
break;
default:
if (gFadeControl.active == 0) {
gFadeControl.mask = 0xffffffff;
sub_080A3954();
}
break;
}
}
void StaffrollTask_State1MenuType3(void) {
gMenu.transitionTimer--;
if (gMenu.transitionTimer == 0) {
sub_080A3954();
SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
}
}
void StaffrollTask_State1MenuType4(void) {
gFadeControl.mask = 0xffff7fff;
SetFade(FADE_IN_OUT | FADE_INSTANT, 4);
SetFadeProgress(gMenu.transitionTimer);
sub_080A3954();
}
void StaffrollTask_State1MenuType5(void) {
SetFade(FADE_INSTANT, 4);
SetFadeProgress(gMenu.transitionTimer);
sub_080A3954();
}
void StaffrollTask_State1MenuType6(void) {
if (gFadeControl.active == 0) {
MemClear(&gBG1Buffer, 0x800);
gScreen.bg1.updated = 1;
MemClear(&gBG2Buffer, 0x800);
gScreen.bg2.updated = 1;
gScreen.controls.alphaBlend = 0x1000;
gMenu.menuType = 0;
SetFade(FADE_INSTANT, 8);
}
}
void StaffrollTask_State1MenuType7(void) {
if (gFadeControl.active == 0) {
SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 8);
gMain.state = 2;
}
}
void sub_080A3954(void) {
u16* puVar1;
u16* puVar2;
u16* puVar3;
u8* pbVar4;
puVar1 = (u16*)(gStaffrollMenu.base.field_0xc + 6);
puVar2 = (u16*)(gStaffrollMenu.base.field_0xc + 8);
puVar3 = (u16*)(gStaffrollMenu.base.field_0xc + 10);
pbVar4 = gStaffrollMenu.base.field_0xc + 1;
gStaffrollMenu.base.menuType = *gStaffrollMenu.base.field_0xc;
gStaffrollMenu.base.overlayType = 0;
gStaffrollMenu.unk_10 = *puVar1;
gStaffrollMenu.base.transitionTimer = *(u16*)(gStaffrollMenu.base.field_0xc + 4);
gStaffrollMenu.unk_12 = *puVar2;
gStaffrollMenu.unk_14 = *puVar3;
gStaffrollMenu.unk_19 = *pbVar4;
gStaffrollMenu.base.field_0xc += 0xc;
}
void StaffrollTask_State3(void) {
if (gFadeControl.active == 0) {
DoSoftReset();
}
}
void StaffrollTask_State2(void) {
SaveResult saveResult;
u32 choice;
u32 tmp;
switch (gStaffrollMenu.base.overlayType) {
case 0:
gStaffrollMenu.base.overlayType = 1;
gStaffrollMenu.base.transitionTimer = 0x1e;
gStaffrollMenu.base.field_0x3 = 0;
DispReset(1);
InitSoundPlayingInfo();
sub_080A4D34();
LoadPaletteGroup(10);
SetColor(0, 0);
LoadGfxGroup(4);
MemClear((void*)VRAM, 0x20);
SetPopupState(0, 0);
gScreen.lcd.displayControl |= 0x600;
gScreen.bg1.control = 0x1c01;
gScreen.bg2.control = 0x1d05;
gScreen.bg2.updated = 1;
SetFade(FADE_INSTANT, 8);
break;
case 1:
if (gFadeControl.active == 0) {
if (gStaffrollMenu.base.transitionTimer != 0) {
gStaffrollMenu.base.transitionTimer--;
} else {
choice = gStaffrollMenu.base.field_0x3;
switch (gInput.newKeys) {
case 0x40:
choice = 0;
break;
case 0x80:
choice = 1;
break;
case 1:
if (choice != 0) {
tmp = 4;
} else {
CreateDialogBox(8, 0);
tmp = 2;
}
gStaffrollMenu.base.overlayType = tmp;
gStaffrollMenu.base.transitionTimer = 0x3c;
SoundReq(SFX_TEXTBOX_SELECT);
break;
}
if (gStaffrollMenu.base.field_0x3 != choice) {
gStaffrollMenu.base.field_0x3 = choice;
SetPopupState(0, choice);
SoundReq(SFX_TEXTBOX_CHOICE);
}
}
}
break;
case 2:
saveResult = HandleSave(0);
gStaffrollMenu.base.field_0x0 = saveResult;
switch (saveResult) {
case SAVE_OK:
gStaffrollMenu.base.overlayType = 4;
break;
case SAVE_ERROR:
gStaffrollMenu.base.transitionTimer = 0x3c;
CreateDialogBox(9, 0);
gStaffrollMenu.base.overlayType = 3;
break;
}
break;
case 3:
if (gStaffrollMenu.base.transitionTimer != 0) {
gStaffrollMenu.base.transitionTimer--;
} else {
if ((gInput.newKeys & 0xb) != 0) {
gStaffrollMenu.base.overlayType = 1;
}
}
break;
case 4:
default:
gScreen.lcd.displayControl &= 0xfdff;
sub_08050384();
SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 8);
gMain.state = 3;
gStaffrollMenu.base.overlayType = 0;
break;
}
}