mirror of https://github.com/zeldaret/tmc.git
241 lines
6.5 KiB
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
|
|
}
|
|
}
|