2017-02-04 14:49:08 +01:00
|
|
|
/* **************************************
|
2018-11-18 20:03:35 +01:00
|
|
|
* Includes *
|
2017-02-04 14:49:08 +01:00
|
|
|
* *************************************/
|
|
|
|
|
|
|
|
#include "Menu.h"
|
2017-08-06 04:17:09 +02:00
|
|
|
#include "Global_Inc.h"
|
|
|
|
#include "System.h"
|
|
|
|
#include "Gfx.h"
|
|
|
|
#include "Sfx.h"
|
|
|
|
#include "MainMenuBtnAni.h"
|
|
|
|
#include "LoadMenu.h"
|
|
|
|
#include "Game.h"
|
|
|
|
#include "EndAnimation.h"
|
|
|
|
#include "PSXSDKIntro.h"
|
|
|
|
#include "MemCard.h"
|
|
|
|
#include "Serial.h"
|
|
|
|
#include "Pad.h"
|
2017-02-04 14:49:08 +01:00
|
|
|
|
|
|
|
/* **************************************
|
2018-11-18 20:03:35 +01:00
|
|
|
* Defines *
|
2017-02-04 14:49:08 +01:00
|
|
|
* *************************************/
|
|
|
|
|
2018-02-25 05:25:33 +01:00
|
|
|
#define MAIN_MENU_BUTTON_SIZE 64
|
2017-02-04 14:49:08 +01:00
|
|
|
#define SELECTED_BUTTON_LUMINANCE 0xC0
|
|
|
|
|
|
|
|
/* **************************************
|
2018-11-18 20:03:35 +01:00
|
|
|
* Structs and enums *
|
2017-02-04 14:49:08 +01:00
|
|
|
* *************************************/
|
|
|
|
|
2018-01-02 06:43:54 +01:00
|
|
|
typedef enum t_levelId
|
|
|
|
{
|
|
|
|
LEVEL1 = 0,
|
|
|
|
LEVEL2,
|
2018-11-24 13:03:52 +01:00
|
|
|
LEVEL3,
|
2018-03-10 14:30:40 +01:00
|
|
|
MAX_LEVELS
|
2018-01-02 06:43:54 +01:00
|
|
|
}LEVEL_ID;
|
|
|
|
|
|
|
|
typedef struct t_lvlpltdata
|
|
|
|
{
|
|
|
|
LEVEL_ID levelID;
|
|
|
|
const char** fileNames[];
|
|
|
|
}TYPE_LVL_PLT_DATA;
|
|
|
|
|
2017-02-04 14:49:08 +01:00
|
|
|
typedef enum
|
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
PLAY_OPTIONS_LEVEL,
|
|
|
|
ONE_TWO_PLAYERS_LEVEL,
|
2017-12-30 00:58:57 +01:00
|
|
|
LEVEL_LIST_LEVEL,
|
2018-11-18 20:03:35 +01:00
|
|
|
OPTIONS_LEVEL
|
2017-02-04 14:49:08 +01:00
|
|
|
}MainMenuLevel;
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
MAIN_MENU_PLAY_OPTIONS_LEVEL_BUTTONS = 2,
|
|
|
|
MAIN_MENU_ONE_TWO_PLAYERS_LEVEL_BUTTONS = 2,
|
|
|
|
MAIN_MENU_ONE_TWO_PLAYERS_LEVEL_BUTTONS_PAD_TWO_DISCONNECTED = 1,
|
|
|
|
MAIN_MENU_OPTIONS_LEVEL_BUTTONS = 1
|
2017-02-04 14:49:08 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
PLAY_BUTTON_INDEX,
|
|
|
|
OPTIONS_BUTTON_INDEX,
|
|
|
|
ONE_PLAYER_BUTTON_INDEX,
|
|
|
|
TWO_PLAYER_BUTTON_INDEX,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MAIN_MENU_BUTTONS_MAX
|
2017-02-04 14:49:08 +01:00
|
|
|
}MMBtn_Index;
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
MAIN_MENU_PLAY_BUTTON_X = 92,
|
|
|
|
MAIN_MENU_PLAY_BUTTON_Y = 92,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MAIN_MENU_OPTIONS_BUTTON_X = 225,
|
|
|
|
MAIN_MENU_OPTIONS_BUTTON_Y = 92,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MAIN_MENU_ONE_PLAYER_BUTTON_X = 92,
|
|
|
|
MAIN_MENU_ONE_PLAYER_BUTTON_Y = 92,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MAIN_MENU_TWO_PLAYER_BUTTON_X = 225,
|
|
|
|
MAIN_MENU_TWO_PLAYER_BUTTON_Y = 92
|
2017-02-04 14:49:08 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
PLAY_BUTTON_U_OFFSET = 0,
|
|
|
|
PLAY_BUTTON_Y_OFFSET = 64,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
ONE_PLAYER_BUTTON_U_OFFSET = 128,
|
|
|
|
ONE_PLAYER_BUTTON_Y_OFFSET = 64,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
OPTIONS_BUTTON_U_OFFSET = 64,
|
|
|
|
OPTIONS_BUTTON_Y_OFFSET = 64,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
TWO_PLAYER_BUTTON_U_OFFSET = 192,
|
|
|
|
TWO_PLAYER_BUTTON_Y_OFFSET = 64,
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
DEFAULT_BUTTON_U_OFFSET = 0,
|
|
|
|
DEFAULT_BUTTON_V_OFFSET = 128
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2017-02-04 14:49:08 +01:00
|
|
|
}MMBtn_Offset;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
MMBtn_Offset offset_u;
|
|
|
|
MMBtn_Offset offset_v;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
// Timer for absolute, sine-like animation
|
|
|
|
short timer;
|
2017-02-04 14:49:08 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
// Pointer to function executed by pressing the button
|
|
|
|
void (*f)();
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MMBtn_Index i;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
bool selected;
|
|
|
|
bool was_selected;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2017-02-04 14:49:08 +01:00
|
|
|
}TYPE_MMBtn;
|
|
|
|
|
|
|
|
/* **************************************
|
2018-11-18 20:03:35 +01:00
|
|
|
* Local prototypes *
|
2017-02-04 14:49:08 +01:00
|
|
|
* **************************************/
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MainMenuInit(void);
|
2017-09-16 03:35:52 +02:00
|
|
|
static void MenuCheatInit(void);
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MainMenuDrawButton(TYPE_MMBtn* btn);
|
2017-02-04 14:49:08 +01:00
|
|
|
static void PlayMenu(void);
|
|
|
|
static void OptionsMenu(void);
|
|
|
|
static void OnePlayerMenu(void);
|
|
|
|
static void TwoPlayerMenu(void);
|
|
|
|
static void MainMenuButtonHandler(void);
|
|
|
|
static void MainMenuRestoreInitValues(void);
|
|
|
|
static void MenuTestCheat(void);
|
2017-12-30 00:58:57 +01:00
|
|
|
static void MainMenuRenderLevelList(void);
|
2017-02-04 14:49:08 +01:00
|
|
|
|
|
|
|
/* **************************************
|
2018-11-18 20:03:35 +01:00
|
|
|
* Local variables *
|
2017-02-04 14:49:08 +01:00
|
|
|
* **************************************/
|
|
|
|
|
|
|
|
static GsSprite MenuSpr;
|
2017-09-16 03:35:52 +02:00
|
|
|
static GsSprite MenuStarSpr;
|
2017-02-04 14:49:08 +01:00
|
|
|
static SsVag BellSnd;
|
|
|
|
static SsVag AcceptSnd;
|
|
|
|
static TYPE_CHEAT TestCheat;
|
|
|
|
static TYPE_CHEAT StackCheckCheat;
|
2017-07-20 22:36:19 +02:00
|
|
|
static TYPE_CHEAT DevMenuCheat;
|
|
|
|
static TYPE_CHEAT SerialCheat;
|
2017-12-26 22:18:37 +01:00
|
|
|
static volatile bool BcnGWSpr_set;
|
2018-01-02 06:43:54 +01:00
|
|
|
static LEVEL_ID SelectedLevel;
|
|
|
|
static uint8_t SelectedPlt;
|
|
|
|
static bool isLevelSelected;
|
2017-02-04 14:49:08 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static const char* MainMenuLevelList[] =
|
|
|
|
{
|
|
|
|
[LEVEL1] = "DATA\\LEVELS\\LEVEL1.LVL",
|
2018-11-24 13:03:52 +01:00
|
|
|
[LEVEL2] = "DATA\\LEVELS\\LEVEL2.LVL",
|
|
|
|
[LEVEL3] = "DATA\\LEVELS\\LEVEL3.LVL"
|
2018-11-18 20:03:35 +01:00
|
|
|
};
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2018-11-24 13:03:52 +01:00
|
|
|
static const char** MainMenuPltList[] =
|
|
|
|
{
|
|
|
|
[LEVEL1] = (const char*[])
|
|
|
|
{
|
|
|
|
"DATA\\LEVELS\\TUTORIA1.PLT",
|
|
|
|
"DATA\\LEVELS\\LEVEL1.PLT",
|
|
|
|
"DATA\\LEVELS\\EASY.PLT",
|
|
|
|
NULL
|
|
|
|
},
|
|
|
|
|
|
|
|
[LEVEL2] = (const char*[])
|
|
|
|
{
|
|
|
|
"DATA\\LEVELS\\LEVEL2.PLT",
|
|
|
|
NULL
|
|
|
|
},
|
|
|
|
|
|
|
|
[LEVEL3] = (const char*[])
|
|
|
|
{
|
|
|
|
"DATA\\LEVELS\\LEVEL3.PLT",
|
|
|
|
NULL
|
|
|
|
}
|
|
|
|
};
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2018-01-02 06:43:54 +01:00
|
|
|
static TYPE_GAME_CONFIGURATION GameCfg;
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2017-02-04 14:49:08 +01:00
|
|
|
static TYPE_MMBtn MainMenuBtn[MAIN_MENU_BUTTONS_MAX];
|
|
|
|
static MainMenuLevel menuLevel;
|
|
|
|
static MMBtn_Index MainMenuMinimumBtn;
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void PlayMenu(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
menuLevel = ONE_TWO_PLAYERS_LEVEL;
|
|
|
|
MainMenuMinimumBtn = ONE_PLAYER_BUTTON_INDEX;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].selected = false;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].timer = 0;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].selected = false;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].timer = 0;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].selected = true;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].timer = 0;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].selected = false;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].timer = 0;
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void OptionsMenu(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
Serial_printf("OptionsMenu(void)!\n");
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void OnePlayerMenu(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2017-12-30 00:58:57 +01:00
|
|
|
menuLevel = LEVEL_LIST_LEVEL;
|
2018-01-02 06:43:54 +01:00
|
|
|
GameCfg.TwoPlayers = false;
|
2018-11-18 20:03:35 +01:00
|
|
|
//EndAnimation();
|
|
|
|
//Game(false /* One Player Only */);
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void TwoPlayerMenu(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2017-12-30 00:58:57 +01:00
|
|
|
menuLevel = LEVEL_LIST_LEVEL;
|
2018-01-02 06:43:54 +01:00
|
|
|
GameCfg.TwoPlayers = true;
|
2018-11-18 20:03:35 +01:00
|
|
|
//EndAnimation();
|
|
|
|
//Game(true /* Two players */);
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MainMenuInit(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
static const char* const MainMenuFiles[] =
|
|
|
|
{
|
|
|
|
"DATA\\SPRITES\\MAINMENU.TIM",
|
|
|
|
"DATA\\SOUNDS\\BELL.VAG",
|
|
|
|
"DATA\\SOUNDS\\ACCEPT.VAG",
|
|
|
|
"DATA\\SPRITES\\BUTTONS.TIM",
|
|
|
|
"DATA\\SPRITES\\MENUSTAR.TIM",
|
|
|
|
#ifndef NO_INTRO
|
|
|
|
"DATA\\SPRITES\\PSXDISK.TIM",
|
|
|
|
"DATA\\FONTS\\INTROFNT.TIM",
|
|
|
|
"DATA\\SPRITES\\GPL.TIM",
|
|
|
|
"DATA\\SPRITES\\OPENSRC.TIM",
|
|
|
|
"DATA\\SOUNDS\\TRAYCL.VAG",
|
|
|
|
"DATA\\SOUNDS\\SPINDISK.VAG"
|
|
|
|
#endif // NO_INTRO
|
|
|
|
};
|
|
|
|
|
|
|
|
static void* const MainMenuDest[] =
|
2017-09-26 21:52:39 +02:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
&MenuSpr,
|
|
|
|
&BellSnd,
|
|
|
|
&AcceptSnd,
|
|
|
|
&PSXButtons,
|
|
|
|
&MenuStarSpr,
|
|
|
|
#ifndef NO_INTRO
|
|
|
|
&PsxDisk,
|
|
|
|
&PSXSDKIntroFont,
|
|
|
|
&GPL_Logo,
|
|
|
|
&OpenSource_Logo,
|
|
|
|
&TrayClSnd,
|
|
|
|
&SpinDiskSnd
|
|
|
|
#endif // NO_INTRO
|
2017-09-26 21:52:39 +02:00
|
|
|
};
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
LoadMenu( MainMenuFiles,
|
2017-09-23 01:32:26 +02:00
|
|
|
MainMenuDest,
|
2018-11-18 20:03:35 +01:00
|
|
|
sizeof (MainMenuFiles) / sizeof (char*) ,
|
|
|
|
sizeof (MainMenuDest) / sizeof (void*) );
|
|
|
|
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].offset_u = PLAY_BUTTON_U_OFFSET;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].offset_v = PLAY_BUTTON_Y_OFFSET;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].timer = 0;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].f = &PlayMenu;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].i = PLAY_BUTTON_INDEX;
|
|
|
|
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].offset_u = OPTIONS_BUTTON_U_OFFSET;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].offset_v = OPTIONS_BUTTON_Y_OFFSET;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].timer = 0;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].f = &OptionsMenu;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].i = OPTIONS_BUTTON_INDEX;
|
|
|
|
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].offset_u = ONE_PLAYER_BUTTON_U_OFFSET;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].offset_v = ONE_PLAYER_BUTTON_Y_OFFSET;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].timer = 0;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].f = &OnePlayerMenu;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].i = ONE_PLAYER_BUTTON_INDEX;
|
|
|
|
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].offset_u = TWO_PLAYER_BUTTON_U_OFFSET;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].offset_v = TWO_PLAYER_BUTTON_Y_OFFSET;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].timer = 0;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].f = &TwoPlayerMenu;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].i = TWO_PLAYER_BUTTON_INDEX;
|
|
|
|
|
|
|
|
menuLevel = PLAY_OPTIONS_LEVEL;
|
|
|
|
|
|
|
|
MainMenuMinimumBtn = PLAY_BUTTON_INDEX;
|
|
|
|
|
|
|
|
{
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
MENU_STAR_X = 32,
|
|
|
|
MENU_STAR_Y = Y_SCREEN_RESOLUTION - 32,
|
|
|
|
};
|
|
|
|
|
|
|
|
MenuStarSpr.x = MENU_STAR_X;
|
|
|
|
MenuStarSpr.y = MENU_STAR_Y;
|
|
|
|
}
|
|
|
|
|
2017-12-26 22:18:37 +01:00
|
|
|
MenuStarSpr.mx = MenuStarSpr.w >> 1;
|
|
|
|
MenuStarSpr.my = MenuStarSpr.h >> 1;
|
2017-09-26 21:52:39 +02:00
|
|
|
MenuStarSpr.rotate = 0;
|
|
|
|
|
2018-01-02 06:43:54 +01:00
|
|
|
SelectedLevel = LEVEL1;
|
|
|
|
|
2017-09-16 03:35:52 +02:00
|
|
|
MenuCheatInit();
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
LoadMenuEnd();
|
2017-09-16 03:35:52 +02:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MenuCheatInit(void)
|
2017-09-16 03:35:52 +02:00
|
|
|
{
|
|
|
|
TestCheat.Callback = &MenuTestCheat;
|
2018-11-18 20:03:35 +01:00
|
|
|
memset(TestCheat.Combination,0,CHEAT_ARRAY_SIZE);
|
|
|
|
//memcpy(myarray, (int [5]){a,b,c,d,e}, 5*sizeof (int));
|
|
|
|
|
|
|
|
memcpy( TestCheat.Combination,
|
|
|
|
(unsigned short[CHEAT_ARRAY_SIZE])
|
|
|
|
{ PAD_CIRCLE, PAD_CIRCLE, PAD_CROSS, PAD_TRIANGLE,
|
|
|
|
PAD_TRIANGLE, PAD_TRIANGLE, 0 , 0 ,
|
|
|
|
0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0 } ,
|
2018-03-10 14:30:40 +01:00
|
|
|
sizeof (unsigned short) * CHEAT_ARRAY_SIZE);
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
PadAddCheat(&TestCheat);
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
StackCheckCheat.Callback = &SystemPrintStackPointerAddress;
|
|
|
|
memset(StackCheckCheat.Combination, 0, CHEAT_ARRAY_SIZE);
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
memcpy( StackCheckCheat.Combination,
|
|
|
|
(unsigned short[CHEAT_ARRAY_SIZE])
|
|
|
|
{ PAD_TRIANGLE, PAD_TRIANGLE, PAD_CROSS, PAD_TRIANGLE,
|
|
|
|
PAD_L1, PAD_R1, 0 , 0 ,
|
|
|
|
0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0 } ,
|
2018-03-10 14:30:40 +01:00
|
|
|
sizeof (unsigned short) * CHEAT_ARRAY_SIZE);
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
PadAddCheat(&StackCheckCheat);
|
2017-02-04 14:49:08 +01:00
|
|
|
|
2017-07-27 07:41:25 +02:00
|
|
|
DevMenuCheat.Callback = &SystemDevMenuToggle;
|
2017-07-20 22:36:19 +02:00
|
|
|
memset(DevMenuCheat.Combination, 0 , CHEAT_ARRAY_SIZE);
|
|
|
|
|
|
|
|
memcpy( DevMenuCheat.Combination,
|
|
|
|
(unsigned short[CHEAT_ARRAY_SIZE])
|
2018-11-18 20:03:35 +01:00
|
|
|
{ PAD_SQUARE, PAD_SQUARE, PAD_CROSS, PAD_CROSS,
|
|
|
|
PAD_CIRCLE, PAD_CIRCLE, PAD_TRIANGLE , PAD_TRIANGLE ,
|
|
|
|
PAD_L1, PAD_L1, PAD_R1, PAD_R1,
|
|
|
|
PAD_L2, PAD_L2, PAD_R2, PAD_R2 } ,
|
2018-03-10 14:30:40 +01:00
|
|
|
sizeof (unsigned short) * CHEAT_ARRAY_SIZE);
|
2017-07-20 22:36:19 +02:00
|
|
|
|
|
|
|
PadAddCheat(&DevMenuCheat);
|
|
|
|
|
2017-07-27 07:41:25 +02:00
|
|
|
SerialCheat.Callback = &SystemReturnToLoader;
|
2017-07-20 22:36:19 +02:00
|
|
|
memset(SerialCheat.Combination, 0 , CHEAT_ARRAY_SIZE);
|
|
|
|
|
|
|
|
memcpy( SerialCheat.Combination,
|
|
|
|
(unsigned short[CHEAT_ARRAY_SIZE])
|
2018-11-18 20:03:35 +01:00
|
|
|
{ PAD_SQUARE, PAD_SQUARE, PAD_SQUARE, PAD_SQUARE,
|
|
|
|
PAD_CIRCLE, PAD_CIRCLE, PAD_CIRCLE , PAD_CIRCLE ,
|
|
|
|
0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0 } ,
|
2018-03-10 14:30:40 +01:00
|
|
|
sizeof (unsigned short) * CHEAT_ARRAY_SIZE);
|
2017-07-20 22:36:19 +02:00
|
|
|
|
|
|
|
PadAddCheat(&SerialCheat);
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void MainMenu(void)
|
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuInit();
|
2017-09-16 01:44:42 +02:00
|
|
|
|
|
|
|
#ifndef NO_INTRO
|
2018-11-18 20:03:35 +01:00
|
|
|
PSXSDKIntro();
|
2017-09-16 01:44:42 +02:00
|
|
|
#endif //PSXSDK_DEBUG
|
2017-06-11 13:58:33 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
while (1)
|
|
|
|
{
|
2017-09-16 03:35:52 +02:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
MAIN_MENU_BG_R = 0,
|
|
|
|
MAIN_MENU_BG_G = 0,
|
|
|
|
MAIN_MENU_BG_B = 40
|
|
|
|
};
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuButtonHandler();
|
2017-06-27 00:58:12 +02:00
|
|
|
|
2017-09-16 03:35:52 +02:00
|
|
|
GsSortCls(MAIN_MENU_BG_R, MAIN_MENU_BG_G, MAIN_MENU_BG_B);
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2017-09-26 21:52:39 +02:00
|
|
|
MenuStarSpr.rotate += ROTATE_ONE;
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
switch(menuLevel)
|
|
|
|
{
|
|
|
|
case PLAY_OPTIONS_LEVEL:
|
|
|
|
MainMenuDrawButton(&MainMenuBtn[PLAY_BUTTON_INDEX]);
|
|
|
|
MainMenuDrawButton(&MainMenuBtn[OPTIONS_BUTTON_INDEX]);
|
|
|
|
break;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
case ONE_TWO_PLAYERS_LEVEL:
|
|
|
|
MainMenuDrawButton(&MainMenuBtn[ONE_PLAYER_BUTTON_INDEX]);
|
|
|
|
MainMenuDrawButton(&MainMenuBtn[TWO_PLAYER_BUTTON_INDEX]);
|
|
|
|
break;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2017-12-30 00:58:57 +01:00
|
|
|
case LEVEL_LIST_LEVEL:
|
|
|
|
MainMenuRenderLevelList();
|
|
|
|
break;
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2017-09-16 01:44:42 +02:00
|
|
|
|
|
|
|
GfxDrawScene_Slow();
|
2018-11-18 20:03:35 +01:00
|
|
|
}
|
2017-12-30 00:58:57 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MainMenuRenderLevelList(void)
|
2017-12-30 00:58:57 +01:00
|
|
|
{
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
LEVEL_LIST_RECT_X = 16,
|
|
|
|
LEVEL_LIST_RECT_Y = 16,
|
|
|
|
LEVEL_LIST_RECT_W = 128,
|
|
|
|
LEVEL_LIST_RECT_H = 128,
|
|
|
|
|
|
|
|
LEVEL_LIST_RECT_B0 = 48,
|
|
|
|
LEVEL_LIST_RECT_B1 = LEVEL_LIST_RECT_B0,
|
|
|
|
LEVEL_LIST_RECT_B2 = 128,
|
|
|
|
LEVEL_LIST_RECT_B3 = LEVEL_LIST_RECT_B2,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
LEVEL_LIST_PLT_RECT_X = LEVEL_LIST_RECT_X,
|
|
|
|
LEVEL_LIST_PLT_RECT_Y = LEVEL_LIST_RECT_Y + LEVEL_LIST_RECT_H + 16,
|
|
|
|
LEVEL_LIST_PLT_RECT_H = 64,
|
|
|
|
LEVEL_LIST_PLT_RECT_W = LEVEL_LIST_RECT_W,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
LEVEL_LIST_TEXT_X = LEVEL_LIST_RECT_X + 8,
|
|
|
|
LEVEL_LIST_TEXT_Y = LEVEL_LIST_RECT_Y + 8,
|
2018-01-02 06:43:54 +01:00
|
|
|
|
|
|
|
LEVEL_LIST_PLT_TEXT_X = LEVEL_LIST_PLT_RECT_X + 8,
|
|
|
|
LEVEL_LIST_PLT_TEXT_Y = LEVEL_LIST_PLT_RECT_Y + 8,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
LEVEL_LIST_SELECTION_RECT_X = LEVEL_LIST_TEXT_X,
|
|
|
|
LEVEL_LIST_SELECTION_RECT_Y = LEVEL_LIST_TEXT_Y,
|
|
|
|
LEVEL_LIST_SELECTION_RECT_W = LEVEL_LIST_RECT_W - 16,
|
|
|
|
LEVEL_LIST_SELECTION_RECT_H = 8,
|
2017-12-30 00:58:57 +01:00
|
|
|
};
|
2017-02-04 14:49:08 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static GsGPoly4 levelListSelectionRect =
|
|
|
|
{
|
|
|
|
.x[0] = LEVEL_LIST_SELECTION_RECT_X,
|
|
|
|
.x[1] = LEVEL_LIST_SELECTION_RECT_X + LEVEL_LIST_SELECTION_RECT_W,
|
|
|
|
.x[2] = LEVEL_LIST_SELECTION_RECT_X,
|
|
|
|
.x[3] = LEVEL_LIST_SELECTION_RECT_X + LEVEL_LIST_SELECTION_RECT_W,
|
|
|
|
|
|
|
|
.r[0] = LEVEL_LIST_RECT_B0,
|
|
|
|
.r[1] = LEVEL_LIST_RECT_B1,
|
|
|
|
.r[2] = LEVEL_LIST_RECT_B2,
|
|
|
|
.r[3] = LEVEL_LIST_RECT_B3,
|
|
|
|
|
|
|
|
.g[0] = LEVEL_LIST_RECT_B0,
|
|
|
|
.g[1] = LEVEL_LIST_RECT_B1,
|
|
|
|
.g[2] = LEVEL_LIST_RECT_B2,
|
|
|
|
.g[3] = LEVEL_LIST_RECT_B3,
|
|
|
|
|
|
|
|
.b[0] = LEVEL_LIST_RECT_B0,
|
|
|
|
.b[1] = LEVEL_LIST_RECT_B1,
|
|
|
|
.b[2] = LEVEL_LIST_RECT_B2,
|
|
|
|
.b[3] = LEVEL_LIST_RECT_B3,
|
|
|
|
|
|
|
|
.attribute = ENABLE_TRANS | TRANS_MODE(0)
|
|
|
|
};
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
GsSortGPoly4(
|
|
|
|
&(GsGPoly4)
|
|
|
|
{
|
|
|
|
.x[0] = LEVEL_LIST_RECT_X,
|
|
|
|
.x[1] = LEVEL_LIST_RECT_X + LEVEL_LIST_RECT_W,
|
|
|
|
.x[2] = LEVEL_LIST_RECT_X,
|
|
|
|
.x[3] = LEVEL_LIST_RECT_X + LEVEL_LIST_RECT_W,
|
|
|
|
|
|
|
|
.y[0] = LEVEL_LIST_RECT_Y,
|
|
|
|
.y[1] = LEVEL_LIST_RECT_Y,
|
|
|
|
.y[2] = LEVEL_LIST_RECT_Y + LEVEL_LIST_RECT_H,
|
|
|
|
.y[3] = LEVEL_LIST_RECT_Y + LEVEL_LIST_RECT_H,
|
|
|
|
|
|
|
|
.b[0] = LEVEL_LIST_RECT_B0,
|
|
|
|
.b[1] = LEVEL_LIST_RECT_B1,
|
|
|
|
.b[2] = LEVEL_LIST_RECT_B2,
|
|
|
|
.b[3] = LEVEL_LIST_RECT_B3
|
|
|
|
});
|
|
|
|
|
|
|
|
GsSortGPoly4(
|
|
|
|
&(GsGPoly4)
|
|
|
|
{
|
|
|
|
.x[0] = LEVEL_LIST_PLT_RECT_X,
|
|
|
|
.x[1] = LEVEL_LIST_PLT_RECT_X + LEVEL_LIST_PLT_RECT_W,
|
|
|
|
.x[2] = LEVEL_LIST_RECT_X,
|
|
|
|
.x[3] = LEVEL_LIST_PLT_RECT_X + LEVEL_LIST_PLT_RECT_W,
|
|
|
|
|
|
|
|
.y[0] = LEVEL_LIST_PLT_RECT_Y,
|
|
|
|
.y[1] = LEVEL_LIST_PLT_RECT_Y,
|
|
|
|
.y[2] = LEVEL_LIST_PLT_RECT_Y + LEVEL_LIST_PLT_RECT_H,
|
|
|
|
.y[3] = LEVEL_LIST_PLT_RECT_Y + LEVEL_LIST_PLT_RECT_H,
|
|
|
|
|
|
|
|
.b[0] = LEVEL_LIST_RECT_B0,
|
|
|
|
.b[1] = LEVEL_LIST_RECT_B1,
|
|
|
|
.b[2] = LEVEL_LIST_RECT_B2,
|
|
|
|
.b[3] = LEVEL_LIST_RECT_B3
|
|
|
|
});
|
2018-01-02 06:43:54 +01:00
|
|
|
|
|
|
|
levelListSelectionRect.y[0] = LEVEL_LIST_SELECTION_RECT_Y + (short)(SelectedLevel << 3);
|
|
|
|
levelListSelectionRect.y[1] = levelListSelectionRect.y[0];
|
|
|
|
levelListSelectionRect.y[2] = LEVEL_LIST_SELECTION_RECT_Y + LEVEL_LIST_SELECTION_RECT_H + (short)(SelectedLevel << 3);
|
|
|
|
levelListSelectionRect.y[3] = levelListSelectionRect.y[2];
|
|
|
|
|
2017-12-30 00:58:57 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
LEVEL_ID i;
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
for (i = LEVEL1; i < MAX_LEVELS; i++)
|
|
|
|
{
|
|
|
|
char baseName[32];
|
|
|
|
const size_t maxLength = sizeof (baseName) / sizeof (baseName[0]);
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
// Update "baseName" with file name + extension.
|
|
|
|
SystemGetFileBasename(MainMenuLevelList[i], baseName, maxLength);
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
FontPrintText(&SmallFont, LEVEL_LIST_TEXT_X, LEVEL_LIST_TEXT_Y + (i << 3), baseName);
|
2018-03-10 14:30:40 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
if (i == SelectedLevel)
|
2018-01-02 06:43:54 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
const char** ptrPltLevelArray;
|
|
|
|
size_t j;
|
2018-03-10 14:30:40 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
for (ptrPltLevelArray = MainMenuPltList[i], j = 0; *ptrPltLevelArray != NULL; ptrPltLevelArray++, j++)
|
2018-01-02 06:43:54 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
const char* strPltLevel = *ptrPltLevelArray;
|
|
|
|
|
|
|
|
if (strPltLevel != NULL)
|
|
|
|
{
|
|
|
|
// Update "baseName" with file name + extension.
|
|
|
|
SystemGetFileBasename(strPltLevel, baseName, maxLength);
|
2017-12-30 00:58:57 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
FontPrintText( &SmallFont,
|
|
|
|
LEVEL_LIST_PLT_TEXT_X,
|
|
|
|
LEVEL_LIST_PLT_TEXT_Y + (j << 3),
|
|
|
|
baseName );
|
|
|
|
}
|
2018-01-02 06:43:54 +01:00
|
|
|
}
|
|
|
|
}
|
2017-12-30 00:58:57 +01:00
|
|
|
}
|
|
|
|
}
|
2018-01-02 06:43:54 +01:00
|
|
|
|
2018-11-23 13:57:38 +01:00
|
|
|
if (isLevelSelected)
|
2018-01-02 06:43:54 +01:00
|
|
|
{
|
|
|
|
levelListSelectionRect.y[0] = LEVEL_LIST_PLT_TEXT_Y + (short)(SelectedPlt << 3);
|
|
|
|
levelListSelectionRect.y[1] = levelListSelectionRect.y[0];
|
|
|
|
levelListSelectionRect.y[2] = LEVEL_LIST_PLT_TEXT_Y + LEVEL_LIST_SELECTION_RECT_H + (short)(SelectedPlt << 3);
|
|
|
|
levelListSelectionRect.y[3] = levelListSelectionRect.y[2];
|
|
|
|
}
|
2018-11-18 20:03:35 +01:00
|
|
|
|
|
|
|
GsSortGPoly4(&levelListSelectionRect);
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MainMenuRestoreInitValues(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2018-01-02 06:43:54 +01:00
|
|
|
uint8_t i;
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
menuLevel = PLAY_OPTIONS_LEVEL;
|
|
|
|
MainMenuMinimumBtn = PLAY_BUTTON_INDEX;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].selected = false;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[PLAY_BUTTON_INDEX].timer = 0;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].selected = false;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[OPTIONS_BUTTON_INDEX].timer = 0;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].selected = false;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[ONE_PLAYER_BUTTON_INDEX].timer = 0;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].selected = false;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].was_selected = false;
|
|
|
|
MainMenuBtn[TWO_PLAYER_BUTTON_INDEX].timer = 0;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-01-02 06:43:54 +01:00
|
|
|
SelectedLevel = LEVEL1;
|
|
|
|
SelectedPlt = 0;
|
|
|
|
|
2018-03-10 14:30:40 +01:00
|
|
|
memset(&GameCfg, 0, sizeof (TYPE_GAME_CONFIGURATION));
|
2018-01-02 06:43:54 +01:00
|
|
|
|
|
|
|
for (i = 0; i < MAIN_MENU_BUTTONS_MAX; i++)
|
|
|
|
{
|
|
|
|
MainMenuBtn[i].was_selected = false;
|
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
GfxSetGlobalLuminance(NORMAL_LUMINANCE);
|
2017-08-19 16:51:00 +02:00
|
|
|
|
|
|
|
SfxPlayTrack(INTRO_TRACK);
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MainMenuButtonHandler(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
static uint8_t btn_selected = PLAY_BUTTON_INDEX;
|
|
|
|
static uint8_t previous_btn_selected = 0;
|
|
|
|
uint8_t max_buttons = 0;
|
|
|
|
|
2018-11-23 13:57:38 +01:00
|
|
|
if (PadOneAnyKeyPressed())
|
2018-11-18 20:03:35 +01:00
|
|
|
{
|
|
|
|
if (SystemIsRandSeedSet() == false)
|
|
|
|
{
|
|
|
|
SystemSetRandSeed();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-23 13:57:38 +01:00
|
|
|
if ( (PadOneKeySinglePress(PAD_CROSS))
|
2018-11-18 20:03:35 +01:00
|
|
|
||
|
2018-11-23 13:57:38 +01:00
|
|
|
(PadOneKeySinglePress(PAD_TRIANGLE)) )
|
2018-11-18 20:03:35 +01:00
|
|
|
{
|
|
|
|
SfxPlaySound(&AcceptSnd);
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(menuLevel)
|
|
|
|
{
|
|
|
|
case PLAY_OPTIONS_LEVEL:
|
|
|
|
max_buttons = MAIN_MENU_PLAY_OPTIONS_LEVEL_BUTTONS;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ONE_TWO_PLAYERS_LEVEL:
|
2017-08-14 14:29:04 +02:00
|
|
|
|
2017-08-30 23:29:57 +02:00
|
|
|
if ( (btn_selected == TWO_PLAYER_BUTTON_INDEX)
|
2017-08-14 14:29:04 +02:00
|
|
|
&&
|
|
|
|
(PadTwoConnected() == false) )
|
|
|
|
{
|
|
|
|
max_buttons = MAIN_MENU_ONE_TWO_PLAYERS_LEVEL_BUTTONS_PAD_TWO_DISCONNECTED;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
max_buttons = MAIN_MENU_ONE_TWO_PLAYERS_LEVEL_BUTTONS;
|
|
|
|
}
|
|
|
|
|
2018-11-23 13:57:38 +01:00
|
|
|
if (PadOneKeySinglePress(PAD_TRIANGLE))
|
2018-11-18 20:03:35 +01:00
|
|
|
{
|
|
|
|
menuLevel = PLAY_OPTIONS_LEVEL;
|
|
|
|
MainMenuMinimumBtn = PLAY_BUTTON_INDEX;
|
|
|
|
btn_selected = PLAY_BUTTON_INDEX;
|
|
|
|
}
|
2017-08-14 14:29:04 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
break;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-01-02 06:43:54 +01:00
|
|
|
case LEVEL_LIST_LEVEL:
|
2018-11-23 13:57:38 +01:00
|
|
|
if (PadOneKeySinglePress(PAD_UP))
|
2018-01-02 06:43:54 +01:00
|
|
|
{
|
|
|
|
if (isLevelSelected == false)
|
|
|
|
{
|
|
|
|
if (SelectedLevel > 0)
|
|
|
|
{
|
|
|
|
SelectedLevel--;
|
|
|
|
SelectedPlt = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (SelectedPlt > 0)
|
|
|
|
{
|
|
|
|
SelectedPlt--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-23 13:57:38 +01:00
|
|
|
else if (PadOneKeySinglePress(PAD_DOWN))
|
2018-01-02 06:43:54 +01:00
|
|
|
{
|
|
|
|
if (isLevelSelected == false)
|
|
|
|
{
|
2018-03-10 14:30:40 +01:00
|
|
|
if (SelectedLevel < (MAX_LEVELS - 1))
|
2018-01-02 06:43:54 +01:00
|
|
|
{
|
|
|
|
SelectedLevel++;
|
|
|
|
SelectedPlt = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (MainMenuPltList[SelectedLevel][SelectedPlt + 1] != NULL)
|
|
|
|
{
|
|
|
|
SelectedPlt++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-11-23 13:57:38 +01:00
|
|
|
else if (PadOneKeySinglePress(PAD_TRIANGLE))
|
2018-01-02 06:43:54 +01:00
|
|
|
{
|
|
|
|
if (isLevelSelected == true)
|
|
|
|
{
|
|
|
|
isLevelSelected = false;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
MainMenuRestoreInitValues();
|
2018-11-18 20:03:35 +01:00
|
|
|
btn_selected = PLAY_BUTTON_INDEX;
|
|
|
|
isLevelSelected = false;
|
2018-01-02 06:43:54 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
default:
|
|
|
|
max_buttons = 0;
|
|
|
|
break;
|
|
|
|
}
|
2017-08-14 14:29:04 +02:00
|
|
|
|
|
|
|
//DEBUG_PRINT_VAR(btn_selected);
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[previous_btn_selected].was_selected = MainMenuBtn[previous_btn_selected].selected;
|
|
|
|
MainMenuBtn[btn_selected].was_selected = MainMenuBtn[btn_selected].selected;
|
|
|
|
|
|
|
|
if (PadOneKeySinglePress(PAD_LEFT) && (btn_selected > 0) )
|
|
|
|
{
|
|
|
|
MainMenuBtn[btn_selected].selected = false;
|
|
|
|
previous_btn_selected = btn_selected;
|
|
|
|
btn_selected--;
|
|
|
|
SfxPlaySound(&BellSnd);
|
|
|
|
}
|
|
|
|
else if (PadOneKeySinglePress(PAD_RIGHT)
|
|
|
|
&&
|
|
|
|
(btn_selected < (max_buttons - 1 + MainMenuMinimumBtn) ) )
|
|
|
|
{
|
|
|
|
MainMenuBtn[btn_selected].selected = false;
|
|
|
|
previous_btn_selected = btn_selected;
|
|
|
|
btn_selected++;
|
|
|
|
SfxPlaySound(&BellSnd);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (btn_selected < MainMenuMinimumBtn)
|
|
|
|
{
|
|
|
|
btn_selected = MainMenuMinimumBtn;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (btn_selected > (max_buttons - 1 + MainMenuMinimumBtn) )
|
|
|
|
{
|
|
|
|
// Avoid overflow when going back in menu navigation
|
|
|
|
btn_selected = (max_buttons - 1 + MainMenuMinimumBtn);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (PadOneKeySinglePress(PAD_CROSS) )
|
|
|
|
{
|
2018-01-02 06:43:54 +01:00
|
|
|
if (menuLevel == LEVEL_LIST_LEVEL)
|
2018-11-18 20:03:35 +01:00
|
|
|
{
|
2018-01-02 06:43:54 +01:00
|
|
|
if (isLevelSelected == false)
|
|
|
|
{
|
|
|
|
isLevelSelected = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
GameCfg.LVLPath = MainMenuLevelList[SelectedLevel];
|
|
|
|
GameCfg.PLTPath = MainMenuPltList[SelectedLevel][SelectedPlt];
|
|
|
|
|
|
|
|
EndAnimation();
|
|
|
|
|
|
|
|
// Start gameplay!
|
|
|
|
Game(&GameCfg);
|
|
|
|
|
|
|
|
MainMenuRestoreInitValues();
|
|
|
|
btn_selected = PLAY_BUTTON_INDEX;
|
|
|
|
isLevelSelected = false;
|
|
|
|
}
|
2018-11-18 20:03:35 +01:00
|
|
|
}
|
2018-01-02 06:43:54 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
MainMenuBtn[btn_selected].f();
|
|
|
|
}
|
2018-11-18 20:03:35 +01:00
|
|
|
}
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
MainMenuBtn[btn_selected].selected = true;
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MainMenuDrawButton(TYPE_MMBtn* btn)
|
2017-09-16 01:44:42 +02:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
MenuSpr.w = MAIN_MENU_BUTTON_SIZE;
|
|
|
|
MenuSpr.h = MAIN_MENU_BUTTON_SIZE;
|
|
|
|
|
|
|
|
if ( (btn->timer) < (MainMenuBtnAni_sz - 1) )
|
|
|
|
{
|
|
|
|
btn->timer++;
|
|
|
|
}
|
|
|
|
|
2018-11-23 13:57:38 +01:00
|
|
|
if (btn->selected)
|
2018-11-18 20:03:35 +01:00
|
|
|
{
|
|
|
|
if (btn->was_selected == false)
|
|
|
|
{
|
|
|
|
btn->timer = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
MenuSpr.r = SELECTED_BUTTON_LUMINANCE;
|
|
|
|
MenuSpr.g = SELECTED_BUTTON_LUMINANCE;
|
|
|
|
MenuSpr.b = SELECTED_BUTTON_LUMINANCE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
MenuSpr.r = NORMAL_LUMINANCE;
|
|
|
|
MenuSpr.g = NORMAL_LUMINANCE;
|
|
|
|
MenuSpr.b = NORMAL_LUMINANCE;
|
|
|
|
}
|
|
|
|
|
|
|
|
MenuSpr.u = DEFAULT_BUTTON_U_OFFSET;
|
|
|
|
MenuSpr.v = DEFAULT_BUTTON_V_OFFSET;
|
|
|
|
|
|
|
|
switch(btn->i)
|
|
|
|
{
|
|
|
|
case PLAY_BUTTON_INDEX:
|
|
|
|
MenuSpr.x = MAIN_MENU_PLAY_BUTTON_X;
|
|
|
|
MenuSpr.y = MAIN_MENU_PLAY_BUTTON_Y;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case OPTIONS_BUTTON_INDEX:
|
|
|
|
MenuSpr.x = MAIN_MENU_OPTIONS_BUTTON_X;
|
|
|
|
MenuSpr.y = MAIN_MENU_OPTIONS_BUTTON_Y;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ONE_PLAYER_BUTTON_INDEX:
|
|
|
|
MenuSpr.x = MAIN_MENU_ONE_PLAYER_BUTTON_X;
|
|
|
|
MenuSpr.y = MAIN_MENU_ONE_PLAYER_BUTTON_Y;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TWO_PLAYER_BUTTON_INDEX:
|
|
|
|
MenuSpr.x = MAIN_MENU_TWO_PLAYER_BUTTON_X;
|
|
|
|
MenuSpr.y = MAIN_MENU_TWO_PLAYER_BUTTON_Y;
|
2017-08-14 14:29:04 +02:00
|
|
|
|
|
|
|
// Exception: turn option dimmer if second player pad isn't connected
|
|
|
|
|
2017-08-30 23:29:57 +02:00
|
|
|
if (PadTwoConnected() == false)
|
2017-08-14 14:29:04 +02:00
|
|
|
{
|
|
|
|
MenuSpr.r = NORMAL_LUMINANCE >> 1;
|
|
|
|
MenuSpr.g = NORMAL_LUMINANCE >> 1;
|
|
|
|
MenuSpr.b = NORMAL_LUMINANCE >> 1;
|
|
|
|
}
|
2017-12-29 23:19:43 +01:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
break;
|
2017-09-16 01:44:42 +02:00
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2017-09-23 01:32:26 +02:00
|
|
|
|
2017-09-16 03:35:52 +02:00
|
|
|
MenuSpr.u += btn->offset_u;
|
|
|
|
MenuSpr.v += btn->offset_v;
|
2017-09-16 01:44:42 +02:00
|
|
|
MenuSpr.y -= MainMenuBtnAni[btn->timer];
|
|
|
|
GsSortSprite(&MenuSpr);
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|
|
|
|
|
2018-11-18 20:03:35 +01:00
|
|
|
static void MenuTestCheat(void)
|
2017-02-04 14:49:08 +01:00
|
|
|
{
|
2018-11-18 20:03:35 +01:00
|
|
|
if (MemCardShowMap() == false)
|
|
|
|
{
|
|
|
|
Serial_printf("MemCardShowMap() failed!\n");
|
|
|
|
return;
|
|
|
|
}
|
2017-02-04 14:49:08 +01:00
|
|
|
}
|