tmc/src/gameOverTask.c

241 lines
6.5 KiB
C

/**
* @file gameOverTask.c
* @ingroup Tasks
*
* @brief Game Over Task
*/
#include "common.h"
#include "fade.h"
#include "fileselect.h"
#include "functions.h"
#include "game.h"
#include "main.h"
#include "menu.h"
#include "save.h"
#include "sound.h"
#include "subtask.h"
typedef void(GameOverState)(void);
static GameOverState GameOver_Init;
static GameOverState GameOver_FadeIn;
static GameOverState GameOver_TextMove;
static GameOverState GameOver_Update;
static GameOverState GameOver_Exit;
void DrawGameOverText(void);
void GameOverTask(void) {
static GameOverState* const sStates[] = {
GameOver_Init, GameOver_FadeIn, GameOver_TextMove, GameOver_Update, GameOver_Exit,
};
sStates[gMain.state]();
if (gMain.state != GAMETASK_TRANSITION) {
FlushSprites();
DrawGameOverText();
CopyOAM();
}
}
void switch_state(u32 idx) {
gMain.state = idx;
SetMenuType(0);
}
void GameOver_Init(void) {
if (gFadeControl.active)
return;
sub_08052010();
gGenericMenu.unk10.a[0] = 80;
gMenu.transitionTimer = 60;
gSave.stats.health = 24;
gMain.field_0x5 = 60;
SoundReq(BGM_GAMEOVER);
SetFadeInverted(4);
gFadeControl.mask = 0xFFFF0001;
switch_state(GAMETASK_INIT);
}
void GameOver_FadeIn(void) {
if (gFadeControl.active)
return;
if (gMain.field_0x5 == 0) {
if (gGenericMenu.unk10.a[0] >= 38) {
gGenericMenu.unk10.a[0]--;
} else {
gMenu.transitionTimer--;
if (gMenu.transitionTimer == 0) {
switch_state(GAMETASK_MAIN);
#if defined(DEMO_USA) || defined(DEMO_JP)
SoundReq(SONG_VOL_FADE_OUT);
SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 4);
#else
SetPopupState(0, 0);
gScreen.lcd.displayControl |= DISPCNT_BG1_ON | DISPCNT_BG2_ON;
gFadeControl.mask = 0x0000ffff;
SetFade(FADE_INSTANT, 16);
#endif
}
}
} else {
gMain.field_0x5--;
}
}
void GameOver_TextMove(void) {
#if defined(DEMO_USA) || defined(DEMO_JP)
if (gFadeControl.active == 0) {
DoSoftReset();
}
#else
s32 temp3;
u32 temp2;
if (gFadeControl.active)
return;
switch (gMenu.menuType) {
case 0:
gMenu.transitionTimer = 30;
gMenu.field_0x3 = 0;
SetMenuType(1);
SetPopupState(0, 0);
gFadeControl.mask = 0xffffffff;
return;
case 1:
if (gMenu.transitionTimer == 0) {
u32 temp = gMenu.field_0x3;
switch (gInput.newKeys) {
case DPAD_UP:
temp = 0;
break;
case DPAD_DOWN:
temp = 1;
break;
case A_BUTTON:
if (gMenu.field_0x3 != 0) {
temp2 = 4;
} else {
CreateDialogBox(8, 0);
temp2 = 2;
}
gMenu.transitionTimer = 60;
SetMenuType(temp2);
SoundReq(SFX_TEXTBOX_SELECT);
break;
}
if (gMenu.field_0x3 != temp) {
gMenu.field_0x3 = temp;
SetPopupState(0, temp);
SoundReq(SFX_TEXTBOX_CHOICE);
}
return;
}
gMenu.transitionTimer--;
return;
case 2:
temp3 = HandleSave(0);
gMenu.field_0x0 = temp3;
switch (temp3) {
case 1:
SetMenuType(4);
break;
case -1:
gMenu.transitionTimer = 60;
CreateDialogBox(9, 0);
SetMenuType(3);
break;
}
return;
case 3:
if (gMenu.transitionTimer != 0) {
gMenu.transitionTimer--;
} else if (gInput.newKeys & (A_BUTTON | B_BUTTON | START_BUTTON)) {
SetMenuType(0);
}
return;
case 4:
default:
gScreen.lcd.displayControl &= ~DISPCNT_BG1_ON;
sub_08050384();
switch_state(GAMETASK_EXIT);
return;
}
#endif
}
void GameOver_Update(void) {
switch (gMenu.menuType) {
case 0:
gMenu.transitionTimer = 30;
gMenu.field_0x3 = 0;
SetMenuType(1);
SetPopupState(1, 0);
return;
case 1:
gScreen.lcd.displayControl |= DISPCNT_BG1_ON;
if (gMenu.transitionTimer != 0) {
gMenu.transitionTimer--;
return;
} else {
u32 temp = gMenu.field_0x3;
switch (gInput.newKeys) {
case DPAD_UP:
temp = 0;
break;
case DPAD_DOWN:
temp = 1;
break;
case A_BUTTON:
SetMenuType(2);
SoundReq(SFX_TEXTBOX_SELECT);
if (temp == 0) {
SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
} else {
SetFade(FADE_IN_OUT | FADE_BLACK_WHITE | FADE_INSTANT, 8);
}
break;
}
if (gMenu.field_0x3 != temp) {
gMenu.field_0x3 = temp;
SetPopupState(1, temp);
SoundReq(SFX_TEXTBOX_CHOICE);
}
}
return;
case 2:
default:
if (gFadeControl.active == 0) {
if (gMenu.field_0x3 == 0) {
SetTask(TASK_GAME);
} else {
DoSoftReset();
}
}
return;
}
}
// Unused, since task is set above
// if we got here, it would be a softlock
void GameOver_Exit(void) {
}
void DrawGameOverText(void) {
static const u8 sOffsets[] = {
48, 68, 88, 108, 137, 156, 174, 192,
};
u32 i;
gOamCmd._4 = 0;
gOamCmd._6 = 0;
gOamCmd._8 = 0x8600;
gOamCmd.y = gGenericMenu.unk10.a[0];
for (i = 0; i < 8; ++i) {
gOamCmd.x = sOffsets[i];
#ifdef EU
DrawDirect(0x1fc, i);
#else
DrawDirect(0x1fd, i);
#endif
}
}