code:
#include "common.h"
#ifdef PS2_MENU
#include "platform.h"
#include "main.h"
#include "Timer.h"
#include "Pad.h"
#include "Sprite2d.h"
#include "Text.h"
#include "Font.h"
#include "Hud.h"
#include "MBlur.h"
#include "DMAudio.h"
#include "Streaming.h"
#include "Camera.h"
#include "Credits.h"
#include "General.h"
#include "TxdStore.h"
#include "FileMgr.h"
#include "Messages.h"
#include "Frontend_PS2.h"
#include "Stats.h"
#include "Game.h"
#include "World.h"
#include "PlayerInfo.h"
#include "FrontEndControls.h"
#include "MemoryCard.h"

#define CRect_SZ(x, y, w, h) CRect(x, y, x+w, y+h)

wchar MemoryCard_FileNames[8][100+1];
CMenuManager FrontEndMenuManager;

// TEMP: put into header
bool DoRWStuffStartOfFrame_Horizon(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha);
void DoRWStuffEndOfFrame(void);

#define SCRW SCREEN_WIDTH
#define SCRH SCREEN_HEIGHT
//#define X SCREEN_STRETCH_X
//#define Y SCREEN_STRETCH_Y
#define X SCREEN_SCALE_X
#define Y SCREEN_SCALE_Y

#define YF(x) Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(SCREEN_HEIGHT_PAL)))
//#define X(x) ((x)/640.0f*SCRW)
//#define Y(y) ((y)/448.0f*SCRH)

static float MENU_TEXT_SIZE_X = 0.644f;
static float MENU_TEXT_SIZE_Y = 0.84f;	//0.96f;
float BUTTONTAB_TEXT_SIZE_X = 0.35f;
float BUTTONTAB_TEXT_SIZE_Y = 0.7f; //0.8f;
float PANEL_TEXT_SIZE_X = 0.8f;
float PANEL_TEXT_SIZE_Y = 1.2f;	//0.96f/0.7f;	//??
float MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
float MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;	//1.28f;

CRGBA SELECTED_TEXT_COLOR(255, 182, 48, 255);
CRGBA BACKGROUND_SPLASH_COLOR(48, 48, 48, 255);

CVector2D CONTR_DESCR_NEW_TEXTSCALE(0.4564f, 0.63f);	// 0.72
CVector2D CONFIGS_NEW_TEXTSCALE(0.49f, 0.7f);	// 0.8
CVector2D AUDIO_OUTPUT_POS(0.0f, 0.0f);
CVector2D AUDIO_RSTATION_POS(154.0f, 0.0f);
CVector2D DISPLAY_BRIGHTNESS_POS(0.0f, 0.0f);

CRGBA TEXT_COLOR(150, 110, 30, 255);
CRGBA PAD_TEXT_COLOR(200, 200, 200, 255);
CRGBA CRIM_RATING_TEXT_COLOR(255, 182, 48, 255);
CRGBA SCROLL_TEXT_COLOR(150, 110, 30, 255);
CRGBA TITLE_TEXT_COLOR(170, 130, 50, 255);
CRGBA TEXT_SHADOW_COLOR(0, 0, 0, 255);
CVector2D SHADOW_VECTOR(1.0f, 1.0f);
CRGBA SLIDER_RIGHT_COLOR(20, 94, 136, 255);
CRGBA SLIDER_LEFT_COLOR(86, 196, 255, 255);
CRGBA MENU_SELECTED_COLOR(255, 212, 88, 255);
CRGBA rgbaATC(96, 96, 96, 255);	// active text color. not constant

float BUTTONTAB_TEXT_X_SCALES[NUM_PAGES] = { 1.0f };
float PANEL_TEXT_X_SCALES[NUM_PAGES] = { 1.0f };

int32 MemoryCardSlotSelected;
uint32 TimeToStopPadShaking;
bool bFrontEnd_ReloadObrTxtGxt;

bool bMemoryCardStartUpMenus_ExitNow;

extern CMenuPage MenuPage_SaveBasic;
CMenuPage *pActiveMenuPage;
CMenuPage *pMenuSave = &MenuPage_SaveBasic;
bool bMemoryCardSpecialZone;
bool bIgnoreTriangleButton;
bool gErrorSampleTriggered;

bool gMusicPlaying;

CMenuPage MenuPage_Stats;
 CMenuLineLister MenuStats_1;
 CMenuPictureAndText MenuStats_2;	// criminal rating
CMenuPage MenuPage_Briefs;
 CMenuPictureAndText MenuBriefs_1;
 CMenuDummy MenuBriefs_2;
CMenuPage MenuPage_SaveBasic;
 CMenuMultiChoiceTriggered MenuSaveB_1;	// "Load Game", "Delete Game", "New Game"
CMenuPage MenuPage_SaveNewGame;
 CMenuPictureAndText MenuSaveNG_1;	// "Load Game", "Delete Game", "New Game"
 CMenuMultiChoiceTriggered MenuSaveNG_2;	// "No", "Yes"
CMenuPage MenuPage_SaveLoadGame;
 CMenuPictureAndText MenuSaveLG_1;	// "Load Game", "Delete Game", "New Game"
 CMenuMultiChoiceTwoLinesTriggered MenuSaveLG_2;	// save games
CMenuPage MenuPage_SaveDeleteGame;
 CMenuPictureAndText MenuSaveDG_1;	// "Load Game", "Delete Game", "New Game"
 CMenuMultiChoiceTwoLinesTriggered MenuSaveDG_2;	// save games
CMenuPage MenuPage_Controls;
 CMenuPictureAndText MenuControls_3; // controller images
 CMenuPictureAndText MenuControls_6;
 CMenuPictureAndText MenuControls_4;
 CMenuPictureAndText MenuControls_7;
 CMenuMultiChoiceTriggeredAlways MenuControls_1; // "Configuration:" "Setup1", "Setup2", "Setup3", "Setup4"
 CMenuMultiChoiceTriggered MenuControls_2; // "Controller Display:" "On Foot", "In Car"
 CMenuOnOffTriggered MenuControls_5; // "Vibration:"
CMenuPageAnyMove MenuPage_Audio;
 CMenuSliderTriggered MenuAudio_1;	// "Music Volume"
 CMenuMultiChoiceTriggered MenuAudio_4;	// "Output:" "Stereo", "Mono"
 CMenuSliderTriggered MenuAudio_2;	// "SFX Volume"
 CMenuMultiChoicePicturedTriggeredAnyMove MenuAudio_3; // "Radio station select:"
CMenuPage MenuPage_Display;
 CMenuSlider MenuDisplay_1;	// "Brightness"
#ifdef GTA_PC
 CMenuOnOffTriggered MenuDisplay_2;	// "Trails:"
#else
 CMenuOnOff MenuDisplay_2;	// "Trails:"
#endif
 CMenuOnOff MenuDisplay_3;	// "Subtitles:"
 CMenuOnOff MenuDisplay_4;	// "Wide Screen:"
CMenuPage MenuPage_Language;
 CMenuMultiChoiceTriggered MenuLanguage_1;	// "English", "French", "German", "Italian", "Spanish"

CMenuPage MenuPageSaveZone_SaveGame;
 CMenuMultiChoiceTriggered MenuSaveZoneSG_1;	// "Save game", "Cancel"
CMenuPage MenuPageSaveZone_SaveSlots;
 CMenuMultiChoiceTwoLinesTriggered MenuSaveZoneSSL_1;	// "Cancel"
CMenuPage MenuPageSaveZone_SavedSuccessfully;
 CMenuPictureAndText MenuSaveZoneSS_1;	// "Game saved successfully!" "Your saved filename is:"
 CMenuMultiChoiceTriggered MenuSaveZoneSS_2;	// "Quit"
CMenuPage MenuPageSaveZone_Message;
 CMenuPictureAndText MenuSaveZoneMSG_1;	// "Save Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again."
 CMenuMultiChoiceTriggered MenuSaveZoneMSG_2;	// "OK"
CMenuPage MenuPageSaveZone_QuestionYesNo;
 CMenuPictureAndText MenuSaveZoneQYN_1;	// "Save Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again."
 CMenuMultiChoiceTriggered MenuSaveZoneQYN_2;	// "Yes", "No"
CMenuPage MenuPageSaveZone_FormatCard;
 CMenuMultiChoiceTriggered MenuSaveZoneFC_1;	// "Memory card (PS2) in MEMORY CARD slot 1 is unformatted. Would you like to format memory card (PS2) in MEMORY CARD slot 1?" "No" "Yes"
CMenuPage MenuPageSaveZone_ErrorFormat;
 CMenuMultiChoiceTriggered MenuSaveZoneEF_1;	// "Format Failed! Check memory card (PS2) in MEMORY CARD slot 1 and please try again." "OK"

VALIDATE_SIZE(CPlaceableText, 0x10);
VALIDATE_SIZE(CPlaceableShText, 0x20);
VALIDATE_SIZE(CPlaceableShTextTwoLines, 0x30);
VALIDATE_SIZE(CPlaceableShOption, 0x28);
VALIDATE_SIZE(CPlaceableShOptionTwoLines, 0x38);
VALIDATE_SIZE(CPlaceableSprite, 0x18);
VALIDATE_SIZE(CPlaceableShSprite, 0x34);
VALIDATE_SIZE(CMenuMultiChoice, 0x2CC);
VALIDATE_SIZE(CMenuMultiChoiceTriggered, 0x310);
VALIDATE_SIZE(CMenuMultiChoiceTwoLines, 0x3CC);
VALIDATE_SIZE(CMenuOnOff, 0x90);

#include "FrontendTriggers.h"

static const char* FrontendFilenames[][2] =
{
	{"fe2_mainpanel_ul",  "" },
	{"fe2_mainpanel_ur",  "" },
	{"fe2_mainpanel_dl",  "" },
	{"fe2_mainpanel_dr",  "" },
	{"fe2_mainpanel_dr2", "" },
	{"fe2_tabactive",     "" },
	{"fe_iconbrief",      "" },
	{"fe_iconstats",      "" },
	{"fe_iconcontrols",   "" },
	{"fe_iconsave",       "" },
	{"fe_iconaudio",      "" },
	{"fe_icondisplay",    "" },
	{"fe_iconlanguage",   "" },
	{"fe_controller",     "" },
	{"fe_controllersh",   "" },
	{"fe_arrows1",        "" },
	{"fe_arrows2",        "" },
	{"fe_arrows3",        "" },
	{"fe_arrows4",        "" },
	{"fe_radio1",         "" },
	{"fe_radio2",         "" },
	{"fe_radio3",         "" },
	{"fe_radio4",         "" },
	{"fe_radio5",         "" },
	{"fe_radio6",         "" },
	{"fe_radio7",         "" },
	{"fe_radio8",         "" },
	{"fe_radio9",         "" },
};

int32 CMenuManager::m_PrefsSfxVolume = 102;
int32 CMenuManager::m_PrefsMusicVolume = 102;
int32 CMenuManager::m_PrefsBrightness = 256;
bool CMenuManager::m_PrefsShowTrails = true;
bool CMenuManager::m_PrefsShowSubtitles = true;
bool CMenuManager::m_PrefsAllowNastyGame = true;

int32 CMenuManager::m_PrefsRadioStation = 0;
int32 CMenuManager::m_PrefsStereoMono = 0;
int8 CMenuManager::m_PrefsUseWideScreen = 0;
int32 CMenuManager::m_PrefsLanguage = 0;
CMenuManager::CONTRCONFIG CMenuManager::m_PrefsControllerConfig = CONFIG_1;
bool CMenuManager::m_PrefsUseVibration = false;

#ifdef GTA_PC
#include "PlayerSkin.h"
int32 CMenuManager::OS_Language = 0;
int8 CMenuManager::m_PrefsVsync = 1;
int8 CMenuManager::m_PrefsVsyncDisp = 1;
int8 CMenuManager::m_PrefsFrameLimiter = 1;
int8 CMenuManager::m_PrefsSpeakers;
int32 CMenuManager::m_ControlMethod = CONTROL_CLASSIC;
int8 CMenuManager::m_PrefsDMA = 1;
float CMenuManager::m_PrefsLOD = 1.0f;
char CMenuManager::m_PrefsSkinFile[256] = DEFAULT_SKIN_NAME;

#ifndef MASTER
bool CMenuManager::m_PrefsMarketing;
bool CMenuManager::m_PrefsDisableTutorials;
#endif // !MASTER

#ifdef MENU_MAP
bool  CMenuManager::bMenuMapActive;
float CMenuManager::fMapSize;
float CMenuManager::fMapCenterY;
float CMenuManager::fMapCenterX;
#endif

#endif

CMenuManager::CMenuManager(void)
{
	int32 i;

	SetSoundLevelsForMusicMenu();

	m_pageState = PAGESTATE_NORMAL;
	m_currentPage = PAGE_FIRST;
	m_newPage = PAGE_FIRST;
	m_bMenuActive = false;
	m_bSaveMenuActive = false;
	m_bRenderGameInMenu = false;
	m_bTexturesLoaded = false;
	m_nPageLeftTimer = 0;
	m_nPageRightTimer = 0;
	m_nChangePageTimer = 0;
	field_18 = 0;
	m_fade = 255;
	m_someAlpha = 255;
	m_position.x = 0.0f;
	m_position.y = 0.0f;
	m_nSlidingDir = SLIDE_TO_BOTTOM;
	m_nStartPauseTimer = 0;
	m_nEndPauseTimer = 0;
	m_bInitialised = false;
	m_bWantToUpdateContent = false;
	field_3C = 0;
	m_bInSaveZone = false;

	for(i = 0; i < NUM_PAGES; i++){
		BUTTONTAB_TEXT_X_SCALES[i] = 1.0f;
		PANEL_TEXT_X_SCALES[i] = 1.0f;
	}

#ifdef GTA_PC
	TheCamera.m_bUseMouse3rdPerson = m_ControlMethod == CONTROL_STANDARD;
	CMBlur::BlurOn = m_PrefsShowTrails;
#endif
}

void
CMenuManager::LoadAllTextures(void)
{
	int32 i;

	if(m_bTexturesLoaded)
		return;

	DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0);
	DMAudio.Service();
	DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
	CSprite2d *splash = LoadSplash(nil);
	if(splash)
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	else // doesn't exist!!
		CHud::Sprites[19].Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERMIPNEAREST);
	DoRWStuffEndOfFrame();

	CFileMgr::SetDir("");
	CFileMgr::SetDir("");

	CTimer::Stop();
	CStreaming::MakeSpaceFor(60*1024);
	CStreaming::ImGonnaUseStreamingMemory();
	CGame::TidyUpMemory(false, true);
	int32 slot = CTxdStore::FindTxdSlot("frontend");
	if(slot == -1)
		slot = CTxdStore::AddTxdSlot("frontend");
	printf("LOAD frontend\n");
	CTxdStore::LoadTxd(slot, "MODELS/FRONTEND.TXD");
	CTxdStore::SetCurrentTxd(slot);
	CStreaming::IHaveUsedStreamingMemory();
	CTimer::Update();

	for(i = 0; i < NUM_SPRIRES; i++)
	{
		m_sprites[i].SetTexture(FrontendFilenames[i][0], FrontendFilenames[i][1]);
		m_sprites[i].SetAddressing(rwTEXTUREADDRESSBORDER);
	}

	m_bTexturesLoaded = true;
}

void
CMenuManager::UnloadTextures(void)
{
	int32 slot;
	int32 i;

	if ( !m_bTexturesLoaded )
		return;

	slot = CTxdStore::FindTxdSlot("frontend");
#ifdef FIX_BUGS
	for(i = 0; i < NUM_SPRIRES; i++)
		m_sprites[i].Delete();
#endif

	printf("REMOVE frontend\n");
	CTxdStore::RemoveTxd(slot);
	m_bTexturesLoaded = false;
}

void
CMenuManager::InitialiseMenusOnce(void)
{
	if(m_bInitialised)
		return;
	m_bInitialised = true;

	InitialiseChangedLanguageSettings();

	// Normal menu
	MenuPage_Stats.Initialise();
	MenuPage_Briefs.Initialise();
	MenuPage_SaveBasic.Initialise();
	MenuPage_SaveNewGame.Initialise();
	MenuPage_SaveLoadGame.Initialise();
	MenuPage_SaveDeleteGame.Initialise();
	MenuPage_Controls.Initialise();
	MenuPage_Audio.Initialise();
	MenuPage_Display.Initialise();
	MenuPage_Language.Initialise();

	// Save menu
	MenuPageSaveZone_SaveGame.Initialise();
	MenuPageSaveZone_SaveSlots.Initialise();
	MenuPageSaveZone_SavedSuccessfully.Initialise();
	MenuPageSaveZone_Message.Initialise();
	MenuPageSaveZone_QuestionYesNo.Initialise();
	MenuPageSaveZone_FormatCard.Initialise();
	MenuPageSaveZone_ErrorFormat.Initialise();

	/* Stats */

	MenuStats_1.ResetNumberOfTextLines();
	MenuStats_1.SetPosition(X(75.0f), Y(70.0f));
	MenuStats_1.m_width = X(480.0f);
	MenuStats_1.m_height = Y(274.0f);
	MenuStats_1.field_10E8 = 0;	// unknown
	MenuStats_1.m_lineSpacing = Y(20.0f);
	MenuStats_1.m_scrollSpeed = 1.0f;
	MenuStats_1.SetLinesColor(SCROLL_TEXT_COLOR);
	MenuStats_1.ResetNumberOfTextLines();
	MenuPage_Stats.AddMenu(&MenuStats_1);
	MenuStats_2.SetPosition(X(75.0f), Y(50.0f));
	MenuStats_2.SetTextsColor(CRIM_RATING_TEXT_COLOR);
	MenuPage_Stats.AddMenu(&MenuStats_2);
	MenuPage_Stats.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Stats.ActivatePage();

	CVector2D saveGameTextScale(X(0.49f), Y(0.7f));
	CVector2D defaultTextScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	/* Basic Load/Delete/New Game */

	MenuSaveB_1.m_numOptions = 0;
	MenuSaveB_1.SetPosition(X(220.0f), Y(110.0f));
	MenuSaveB_1.AddOption(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TriggerSave_LoadGameSelect, false, true);
	MenuSaveB_1.AddOption(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TriggerSave_DeleteGameSelect, false, true);
	MenuSaveB_1.AddOption(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TriggerSave_NewGameSelectYes, false, true);
	MenuSaveB_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuPage_SaveBasic.AddMenu(&MenuSaveB_1);
	MenuPage_SaveBasic.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveBasic.ActivatePage();

	/* New Game - but unused */

	MenuSaveNG_1.m_numTexts = 0;
	MenuSaveNG_1.SetPosition(X(220.0f), Y(110.0f));
	MenuSaveNG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TEXT_COLOR, true);
	MenuSaveNG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TEXT_COLOR, true);
	MenuSaveNG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), SELECTED_TEXT_COLOR, true);
	MenuPage_SaveNewGame.AddMenu(&MenuSaveNG_1);
	MenuSaveNG_2.m_numOptions = 0;
	MenuSaveNG_2.SetPosition(X(250.0f), Y(170.0f));
	MenuSaveNG_2.AddOption(TheText.Get("FEM_NO"), 0.0f, 0.0f, TriggerSave_BackToMainMenu, false, false);
	MenuSaveNG_2.AddOption(TheText.Get("FEM_YES"), 0.0f, Y(20.0f), TriggerSave_NewGameSelectYes, false, false);
	MenuSaveNG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveNG_2.m_defaultCancel = TriggerSave_BackToMainMenu;
	MenuPage_SaveNewGame.AddMenu(&MenuSaveNG_2);
	MenuPage_SaveNewGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveNewGame.ActivatePage();

	/* Load Game */

	MenuSaveLG_1.m_numTexts = 0;
	MenuSaveLG_1.SetPosition(X(220.0f),  Y(110.0f));
	MenuSaveLG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), SELECTED_TEXT_COLOR, true);
	MenuSaveLG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), TEXT_COLOR, true);
	MenuSaveLG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TEXT_COLOR, true);
	MenuPage_SaveLoadGame.AddMenu(&MenuSaveLG_1);
	MenuSaveLG_2.m_numOptions = 0;
	MenuSaveLG_2.SetPosition(X(250.0f),  Y(60.0f));
	MenuSaveLG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveLG_2.m_defaultCancel = TriggerSave_BackToMainMenuTwoLines;
	MenuSaveLG_2.SetNewOldTextScale(true, saveGameTextScale, defaultTextScale, false);
	MenuPage_SaveLoadGame.AddMenu(&MenuSaveLG_2);
	MenuPage_SaveLoadGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveLoadGame.ActivatePage();

	/* Delete Game */

	MenuSaveDG_1.m_numTexts = 0;
	MenuSaveDG_1.SetPosition(X(220.0f),  Y(110.0f));
	MenuSaveDG_1.AddText(TheText.Get("FES_LGA"), 0.0f, Y(20.0f), TEXT_COLOR, true);
	MenuSaveDG_1.AddText(TheText.Get("FES_DGA"), 0.0f, Y(40.0f), SELECTED_TEXT_COLOR, true);
	MenuSaveDG_1.AddText(TheText.Get("FES_NGA"), 0.0f, Y(60.0f), TEXT_COLOR, true);
	MenuPage_SaveDeleteGame.AddMenu(&MenuSaveDG_1);
	MenuSaveDG_2.m_numOptions = 0;
	MenuSaveDG_2.SetPosition(X(250.0f),  Y(60.0f));
	MenuSaveDG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveDG_2.m_defaultCancel = TriggerSave_BackToMainMenuTwoLines;
	MenuSaveDG_2.SetNewOldTextScale(true, saveGameTextScale, defaultTextScale, false);
	MenuPage_SaveDeleteGame.AddMenu(&MenuSaveDG_2);
	MenuPage_SaveDeleteGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_SaveDeleteGame.ActivatePage();

	CVector2D briefsTextScale(X(0.525f), Y(0.7f));
	CVector2D defaultTextScale1(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	/* Briefs */

	MenuBriefs_1.m_numTexts = 0;
	MenuBriefs_1.SetPosition(X(60.0f), Y(60.0f));
	MenuBriefs_1.SetTextsColor(TEXT_COLOR);
	MenuBriefs_1.SetNewOldTextScale(true, briefsTextScale, defaultTextScale1);
	MenuBriefs_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
	MenuPage_Briefs.AddMenu(&MenuBriefs_1);
	MenuPage_Briefs.AddMenu(&MenuBriefs_2);
	MenuPage_Briefs.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Briefs.ActivatePage();

	CVector2D defaultTextScale2(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CVector2D defaultTextScale3(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CVector2D CONTR_DESCR_NEW_TEXTSCALE_scaled(X(CONTR_DESCR_NEW_TEXTSCALE.x), Y(CONTR_DESCR_NEW_TEXTSCALE.y));
	CVector2D CONFIGS_NEW_TEXTSCALE_scaled(X(CONFIGS_NEW_TEXTSCALE.x), Y(CONFIGS_NEW_TEXTSCALE.y));

	/* Controls */

	MenuControls_3.m_numTexts = 0;
	MenuControls_3.m_numSprites = 0;
	MenuControls_3.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_3.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_3.AddPicture(&m_sprites[FE_ARROWS1],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_3.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerOnFoot(&MenuControls_3, CMenuManager::m_PrefsControllerConfig);
	MenuControls_3.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_3.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));
	MenuPage_Controls.AddMenu(&MenuControls_3);

	MenuControls_6.m_numTexts = 0;
	MenuControls_6.m_numSprites = 0;
	MenuControls_6.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_6.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_6.AddPicture(&m_sprites[FE_ARROWS3],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_6.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerOnFoot(&MenuControls_6, CMenuManager::CONFIG_2);
	MenuControls_6.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_6.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));

	MenuControls_4.m_numTexts = 0;
	MenuControls_4.m_numSprites = 0;
	MenuControls_4.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_4.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_4.AddPicture(&m_sprites[FE_ARROWS2],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_4.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerInCar(&MenuControls_4, CMenuManager::m_PrefsControllerConfig);
	MenuControls_4.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_4.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));

	MenuControls_7.m_numTexts = 0;
	MenuControls_7.m_numSprites = 0;
	MenuControls_7.SetPosition(X(170.0f), Y(88.0f));
	MenuControls_7.AddPicture(&m_sprites[FE_CONTROLLER],
		&m_sprites[FE_CONTROLLERSH],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_7.AddPicture(&m_sprites[FE_ARROWS4],
		0.0f, 0.0f, X(235.2f), Y(175.2), CRGBA(255, 255, 255, 255));
	MenuControls_7.SetNewOldTextScale(true, CONTR_DESCR_NEW_TEXTSCALE_scaled, defaultTextScale2);
	InitialiseTextsInMenuControllerInCar(&MenuControls_7, CMenuManager::CONFIG_2);
	MenuControls_7.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuControls_7.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x), X(600.0f));

	MenuControls_1.m_numOptions = 0;
	MenuControls_1.SetPosition(X(284.0f), Y(290.0f));
	MenuControls_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuControls_1.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
	MenuControls_1.AddTitle(TheText.Get("FEC_CCF"), 0.0f, 0.0f, true);
	MenuControls_1.AddOption(TheText.Get("FEC_CF1"), X(15.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuControls_1.AddOption(TheText.Get("FEC_CF2"), X(85.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuControls_1.AddOption(TheText.Get("FEC_CF3"), X(155.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuControls_1.AddOption(TheText.Get("FEC_CF4"), X(225.0f), Y(2.0f), TriggerControls_ContrConfig, false, false);
	MenuPage_Controls.AddMenu(&MenuControls_1);
	MenuControls_1.m_alwaysTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawContrConfig;
	MenuControls_1.m_alwaysHighlightTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawHNContrConfig;
	MenuControls_1.m_alwaysNormalTrigger = (CMenuMultiChoiceTriggered::Trigger)TriggerControls_DrawHNContrConfig;

	MenuControls_2.m_numOptions = 0;
	MenuControls_2.SetPosition(X(284.0f), Y(310.0f));
	MenuControls_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuControls_2.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
	MenuControls_2.AddTitle(TheText.Get("FEC_CDP"), 0.0f, 0.0f, true);
	MenuControls_2.AddOption(TheText.Get("FEC_ONF"), X(15.0f), Y(2.0f), (CMenuMultiChoiceTriggered::Trigger)TriggerControls_ContrDisplay, false, false);
	MenuControls_2.AddOption(TheText.Get("FEC_INC"), X(105.0f), Y(2.0f), (CMenuMultiChoiceTriggered::Trigger)TriggerControls_ContrDisplay, false, false);
	MenuPage_Controls.AddMenu(&MenuControls_2);
	MenuControls_2.m_bTwoState = true;
	MenuControls_2.SetMenuSelection(0);

	MenuControls_5.SetPosition(X(284.0f), Y(330.0f));
	MenuControls_5.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuControls_5.SetNewOldTextScale(true, CONFIGS_NEW_TEXTSCALE_scaled, defaultTextScale3, false);
	MenuControls_5.AddTitle(TheText.Get("FEC_VIB"), false, 0.0f, 0.0f, true);
	MenuControls_5.SetOptionPosition(X(15.0f), Y(2.0f), TriggerControls_Vibrations, false);
	MenuPage_Controls.AddMenu(&MenuControls_5);
	MenuPage_Controls.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Controls.ActivatePage();

	/* Audio */

	CVector2D audioOutputScale(X(0.49f), Y(0.63f));
	CVector2D defaultTextScale4(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	FEC_MOVETAB movetab;
	MenuAudio_1.SetPosition(X(70.0f), Y(80.0f));
	MenuAudio_1.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
	MenuAudio_1.AddTitle(TheText.Get("FEA_MUS"), 0.0f, 0.0f);
	MenuAudio_1.AddTickBox(X(15.0f), Y(20.0f), X(150.0f), Y(5.0f), Y(45.0f), TriggerAudio_MusicVolume, TriggerAudio_MusicVolumeAlways);
	movetab.right = 1;
	movetab.left = 2;
	movetab.down = 3;
	movetab.up = 3;
	MenuPage_Audio.AddMenu(&MenuAudio_1, &movetab);

	MenuAudio_4.m_numOptions = 0;
	MenuAudio_4.SetPosition(X(280.0f), Y(80.0f));
	MenuAudio_4.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuAudio_4.SetNewOldTextScale(true, audioOutputScale, defaultTextScale4, false);
	MenuAudio_4.AddTitle(TheText.Get("FEA_OUT"), X(AUDIO_OUTPUT_POS.x), Y(AUDIO_OUTPUT_POS.y), false);
	MenuAudio_4.AddOption(TheText.Get("FEA_ST"), X(-15.0f), Y(30.0f), TriggerAudio_StereoMono, false, false);
	MenuAudio_4.AddOption(TheText.Get("FEA_MNO"), X(55.0f), Y(30.0f), TriggerAudio_StereoMono, false, false);
	movetab.right = 2;
	movetab.left = 0;
	movetab.down = 3;
	movetab.up = 3;
	MenuPage_Audio.AddMenu(&MenuAudio_4, &movetab);
	MenuAudio_4.m_bTwoState = true;

	MenuAudio_2.SetPosition(X(410.0f), Y(80.0f));
	MenuAudio_2.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
	MenuAudio_2.AddTitle(TheText.Get("FEA_SFX"), 0.0f, 0.0f);
	MenuAudio_2.AddTickBox(X(5.0f), Y(20.0f), X(150.0f), Y(5.0f), Y(45.0f), TriggerAudio_SfxVolume, TriggerAudio_SfxVolumeAlways);
	movetab.right = 0;
	movetab.left = 1;
	movetab.down = 3;
	movetab.up = 3;
	MenuPage_Audio.AddMenu(&MenuAudio_2, &movetab);

	MenuAudio_3.m_numOptions = 0;
	MenuAudio_3.SetPosition(X(50.0f), Y(170.0f));
	MenuAudio_3.SetColors(TITLE_TEXT_COLOR, CRGBA(64, 64, 64, 255), CRGBA(250, 250, 250, 255));
	MenuAudio_3.AddTitle(TheText.Get("FEA_RSS"), X(AUDIO_RSTATION_POS.x), Y(AUDIO_RSTATION_POS.y), false);
	// first row
	movetab.right = 1;
	movetab.left = 4;
	movetab.down = 5;
	movetab.up = 5;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO1], &movetab, 0.0f, Y(18.0f),
		CVector2D(X(96.0f), YF(72.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 2;
	movetab.left = 0;
	movetab.down = 6;
	movetab.up = 6;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO2], &movetab, X(106.0f), Y(20.0f),
		CVector2D(X(79.2f), YF(81.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 3;
	movetab.left = 1;
	movetab.down = 7;
	movetab.up = 7;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO5], &movetab, X(210.0f), Y(20.0f),
		CVector2D(X(86.4f), YF(72.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 4;
	movetab.left = 2;
	movetab.down = 8;
	movetab.up = 8;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO7], &movetab, X(324.0f), Y(5.0f),
		CVector2D(X(115.2f), YF(102.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 0;
	movetab.left = 3;
	movetab.down = 8;
	movetab.up = 8;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO8], &movetab, X(446.0f), Y(5.0f),
		CVector2D(X(102.96f), YF(101.4f)), TriggerAudio_RadioStation, false);
	// second row
	movetab.right = 6;
	movetab.left = 8;
	movetab.down = 0;
	movetab.up = 0;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO3], &movetab, X(60.0f), Y(96.0f),
		CVector2D(X(87.36f), YF(85.8f)), TriggerAudio_RadioStation, false);
	movetab.right = 7;
	movetab.left = 5;
	movetab.down = 1;
	movetab.up = 1;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO4], &movetab, X(130.0f), Y(72.0f),
		CVector2D(X(129.6f), YF(129.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 8;
	movetab.left = 6;
	movetab.down = 2;
	movetab.up = 2;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO6], &movetab, X(284.0f), Y(108.0f),
		CVector2D(X(60.0f), YF(60.0f)), TriggerAudio_RadioStation, false);
	movetab.right = 5;
	movetab.left = 7;
	movetab.down = 3;
	movetab.up = 3;
	MenuAudio_3.AddOption(&m_sprites[FE_RADIO9], &movetab, X(404.0f), Y(85.0f),
		CVector2D(X(81.12f), YF(101.4f)), TriggerAudio_RadioStation, false);
	movetab.right = 2;
	movetab.left = 0;
	movetab.down = 1;
	movetab.up = 1;
	MenuPage_Audio.AddMenu(&MenuAudio_3, &movetab);
	MenuPage_Audio.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Audio.ActivatePage();

	/* Display */

	MenuDisplay_1.SetPosition(X(240.0f), Y(140.0f));
	MenuDisplay_1.SetColors(TEXT_COLOR, TEXT_COLOR, SLIDER_LEFT_COLOR, SLIDER_RIGHT_COLOR);
	MenuDisplay_1.m_style = 0;	// ticks
	MenuDisplay_1.AddTitle(TheText.Get("FED_BRI"), X(DISPLAY_BRIGHTNESS_POS.x), Y(DISPLAY_BRIGHTNESS_POS.y));
	MenuDisplay_1.AddTickBox(X(-30.0f), Y(20.0f), X(200.0f), Y(40.0f), Y(40.0f));
	MenuPage_Display.AddMenu(&MenuDisplay_1);
	MenuDisplay_2.SetPosition(X(290.0f), Y(240.0f));
	MenuDisplay_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuDisplay_2.AddTitle(TheText.Get("FED_TRA"), false, 0.0f, 0.0f, true);
#ifdef GTA_PC
	MenuDisplay_2.SetOptionPosition(X(40.0f), 0.0f, TriggerDisplay_Trails, false);
#else
	MenuDisplay_2.SetOptionPosition(X(40.0f), 0.0f, false);
#endif
	MenuDisplay_2.m_bTwoState = true;
	MenuPage_Display.AddMenu(&MenuDisplay_2);
	MenuDisplay_3.SetPosition(X(290.0f), Y(260.0f));
	MenuDisplay_3.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuDisplay_3.AddTitle(TheText.Get("FED_SUB"), false, 0.0f, 0.0f, true);
	MenuDisplay_3.SetOptionPosition(X(40.0f), 0.0f, false);
	MenuDisplay_3.m_bTwoState = true;
	MenuPage_Display.AddMenu(&MenuDisplay_3);
	MenuDisplay_4.SetPosition(X(290.0f), Y(280.0f));
	MenuDisplay_4.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR);
	MenuDisplay_4.AddTitle(TheText.Get("FED_WIS"), false, 0.0f, 0.0f, true);
	MenuDisplay_4.SetOptionPosition(X(40.0f), 0.0f, false);
	MenuDisplay_4.m_bTwoState = true;
	MenuPage_Display.AddMenu(&MenuDisplay_4);
	MenuPage_Display.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Display.ActivatePage();

	/* Language */
	MenuLanguage_1.m_numOptions = 0;
	MenuLanguage_1.SetPosition(X(288.0f), Y(160.0f));
	MenuLanguage_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, SELECTED_TEXT_COLOR);
	MenuLanguage_1.AddOption(TheText.Get("FEL_ENG"), 0.0f, 0.0f, TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_FRE"), 0.0f, Y(20.0f), TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_GER"), 0.0f, Y(40.0f), TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_ITA"), 0.0f, Y(60.0f), TriggerLanguage_Language, false, false);
	MenuLanguage_1.AddOption(TheText.Get("FEL_SPA"), 0.0f, Y(80.0f), TriggerLanguage_Language, false, false);
	MenuPage_Language.AddMenu(&MenuLanguage_1);
	MenuPage_Language.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPage_Language.ActivatePage();

	/*
	 * Save zone menu
	 */

	CVector2D saveGameTextScale2(X(0.49f), Y(0.7f));
	CVector2D defaultTextScale5(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));

	/* Save game */

	MenuSaveZoneSG_1.m_numOptions = 0;
	MenuSaveZoneSG_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneSG_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneSG_1.AddOption(TheText.Get("FESZ_SA"), 0.0f, Y(20.0f), TriggerSaveZone_SaveGameSelect, false, false);
	MenuSaveZoneSG_1.AddOption(TheText.Get("FESZ_CA"), 0.0f, Y(40.0f), TriggerSaveZone_QuitMenu, false, false);
	MenuSaveZoneSG_1.m_defaultCancel = TriggerSaveZone_QuitMenu;
	MenuPageSaveZone_SaveGame.AddMenu(&MenuSaveZoneSG_1);
	MenuSaveZoneSG_1.SetMenuSelection(1);
	MenuPageSaveZone_SaveGame.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_SaveGame.ActivatePage();

	/* Select slot */

	MenuSaveZoneSSL_1.m_numOptions = 0;
	MenuSaveZoneSSL_1.SetPosition(X(160.0f), Y(100.0f));
	MenuSaveZoneSSL_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneSSL_1.AddOption(TheText.Get("FESZ_CA"), 0.0f, 0.0f, TriggerSaveZone_BackToMainMenuTwoLines, false, false);
	MenuSaveZoneSSL_1.SetNewOldTextScale(true, saveGameTextScale2, defaultTextScale5, true);
	MenuPageSaveZone_SaveSlots.AddMenu(&MenuSaveZoneSSL_1);
	MenuSaveZoneSSL_1.SetMenuSelection(0);
	MenuPageSaveZone_SaveSlots.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_SaveSlots.ActivatePage();

	/* Save successful */

	MenuSaveZoneSS_1.m_numTexts = 0;
	MenuSaveZoneSS_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L1"), X(-40.0f), 0.0f, TITLE_TEXT_COLOR, false);
	MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L2"), X(-40.0f), Y(20.0f), TITLE_TEXT_COLOR, false);
	// twice this line?
	MenuSaveZoneSS_1.AddText(TheText.Get("FESZ_L2"), X(-40.0f), Y(40.0f), TEXT_COLOR, false);
	MenuPageSaveZone_SavedSuccessfully.AddMenu(&MenuSaveZoneSS_1);
	MenuSaveZoneSS_2.m_numOptions = 0;
	MenuSaveZoneSS_2.SetPosition(X(200.0f), Y(170.0f));
	MenuSaveZoneSS_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneSS_2.AddOption(TheText.Get("FESZ_QU"), X(60.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
	MenuPageSaveZone_SavedSuccessfully.AddMenu(&MenuSaveZoneSS_2);
	MenuPageSaveZone_SavedSuccessfully.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_SavedSuccessfully.ActivatePage();

	MenuSaveZoneMSG_1.m_numTexts = 0;
	MenuSaveZoneMSG_1.SetPosition(X(170.0f), Y(130.0f));
	MenuSaveZoneMSG_1.AddText(TheText.Get("FESZ_SR"), X(-40.0f), 0.0f, TEXT_COLOR, false);
	MenuSaveZoneMSG_1.SetTextsColor(TEXT_COLOR);
	MenuSaveZoneMSG_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x-20.0f), X(580.0f));
	MenuPageSaveZone_Message.AddMenu(&MenuSaveZoneMSG_1);
	MenuSaveZoneMSG_2.m_numOptions = 0;
	MenuSaveZoneMSG_2.SetPosition(X(170.0f), Y(180.0f));
	MenuSaveZoneMSG_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneMSG_2.AddOption(TheText.Get("FESZ_OK"), X(40.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
	MenuPageSaveZone_Message.AddMenu(&MenuSaveZoneMSG_2);
	MenuPageSaveZone_Message.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_Message.ActivatePage();

	MenuSaveZoneQYN_1.m_numTexts = 0;
	MenuSaveZoneQYN_1.SetPosition(X(170.0f), Y(130.0f));
	MenuSaveZoneQYN_1.AddText(TheText.Get("FESZ_SR"), X(-40.0f), 0.0f, TEXT_COLOR, false);
	MenuSaveZoneQYN_1.SetTextsColor(TEXT_COLOR);
	MenuSaveZoneQYN_1.SetNewOldShadowWrapX(true, X(600.0f+SHADOW_VECTOR.x-20.0f), X(580.0f));
	MenuPageSaveZone_QuestionYesNo.AddMenu(&MenuSaveZoneQYN_1);
	MenuSaveZoneQYN_2.m_numOptions = 0;
	MenuSaveZoneQYN_2.SetPosition(X(170.0f), Y(180.0f));
	MenuSaveZoneQYN_2.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_YES"), X(80.0f), 0.0f, TriggerSaveZone_QuitMenu, false, false);
	MenuSaveZoneQYN_2.AddOption(TheText.Get("FEM_NO"), X(80.0f), Y(20.0f), TriggerSaveZone_QuitMenu, false, false);
	MenuPageSaveZone_QuestionYesNo.AddMenu(&MenuSaveZoneQYN_2);
	MenuPageSaveZone_QuestionYesNo.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_QuestionYesNo.ActivatePage();

	/* Format card */

	MenuSaveZoneFC_1.m_numOptions = 0;
	MenuSaveZoneFC_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneFC_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneFC_1.AddTitle(TheText.Get("FESZ_FM"), X(-100.0f), 0.0f, false);
	MenuSaveZoneFC_1.AddOption(TheText.Get("FEM_NO"), X(40.0f), Y(95.0f), TriggerSaveZone_BackToMainMenu, false, false);
	MenuSaveZoneFC_1.AddOption(TheText.Get("FEM_YES"), X(40.0f), Y(75.0f), TriggerSaveZone_FormatCardSelect, false, false);
	MenuSaveZoneFC_1.m_defaultCancel = TriggerSaveZone_FormatCardSelect;
	MenuPageSaveZone_FormatCard.AddMenu(&MenuSaveZoneFC_1);
	MenuPageSaveZone_FormatCard.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_FormatCard.ActivatePage();

	/* Format error */

	MenuSaveZoneEF_1.m_numOptions = 0;
	MenuSaveZoneEF_1.SetPosition(X(200.0f), Y(100.0f));
	MenuSaveZoneEF_1.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	MenuSaveZoneEF_1.AddTitle(TheText.Get("FESZ_FF"), X(-40.0f), 0.0f, false);
	MenuSaveZoneEF_1.AddOption(TheText.Get("FESZ_OK"), X(70.0f), Y(20.0f), TriggerSaveZone_FormatFailedOK, false, false);
	MenuPageSaveZone_ErrorFormat.AddMenu(&MenuSaveZoneEF_1);
	MenuPageSaveZone_ErrorFormat.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
	MenuPageSaveZone_ErrorFormat.ActivatePage();

	pActiveMenuPage = &MenuPage_Stats;
	pActiveMenuPage->ActivatePage();

	InitialiseMenuContents();

	m_bWantToUpdateContent = false;
}

void
CMenuManager::InitialiseChangedLanguageSettings(void)
{
	if ( bFrontEnd_ReloadObrTxtGxt )
	{
		bFrontEnd_ReloadObrTxtGxt = false;

		CTimer::Stop();
		TheText.Unload();
		TheText.Load();
		CTimer::Update();

		FrontEndMenuManager.AnaliseMenuContents();
		CGame::frenchGame = false;
		CGame::germanGame = false;
		if ( m_PrefsAllowNastyGame )
			CGame::nastyGame = true;

		for ( int32 i = 0; i < NUM_PAGES; i++ )
		{
			BUTTONTAB_TEXT_X_SCALES[i] = 1.0f;
			PANEL_TEXT_X_SCALES[i] = 1.0f;
		}

		switch ( m_PrefsLanguage )
		{
			case LANGUAGE_AMERICAN:
			{
				MENU_TEXT_SIZE_X = 0.644f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.35f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[6] = 0.94f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.4564f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.49f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = 0.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 154.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 0.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_FRENCH:
			{
				CGame::frenchGame = true;
				if ( m_PrefsAllowNastyGame )
					CGame::nastyGame = false;

				MENU_TEXT_SIZE_X = 0.504f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.32f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[0] = 0.84f;
				BUTTONTAB_TEXT_X_SCALES[3] = 0.84f;
				PANEL_TEXT_X_SCALES[1] = 0.8f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.385f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.455f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = -15.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 184.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 20.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_GERMAN:
			{
				CGame::germanGame = true;
				if ( m_PrefsAllowNastyGame )
					CGame::nastyGame = false;

				MENU_TEXT_SIZE_X = 0.546f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.32f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.35f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.434f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = -15.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 154.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 20.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.7f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_ITALIAN:
			{
				MENU_TEXT_SIZE_X = 0.574f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.32f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[0] = 0.86f;
				PANEL_TEXT_X_SCALES[1] = 0.9f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.385f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.42f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = 10.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 194.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 10.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}

			case LANGUAGE_SPANISH:
			{
				MENU_TEXT_SIZE_X = 0.546f;
				MENU_TEXT_SIZE_Y = 0.84f;//0.96f;

				BUTTONTAB_TEXT_SIZE_X = 0.35f;
				BUTTONTAB_TEXT_SIZE_Y = 0.7f;//0.8f;

				BUTTONTAB_TEXT_X_SCALES[0] = 0.78f;
				PANEL_TEXT_X_SCALES[1] = 0.95f;

				CONTR_DESCR_NEW_TEXTSCALE.x = 0.364f;
				CONTR_DESCR_NEW_TEXTSCALE.y = 0.63f;//0.72f;

				CONFIGS_NEW_TEXTSCALE.x = 0.455f;
				CONFIGS_NEW_TEXTSCALE.y = 0.7f;//0.8f;

				AUDIO_OUTPUT_POS.x = 10.0f;
				AUDIO_OUTPUT_POS.y = 0.0f;

				AUDIO_RSTATION_POS.x = 124.0f;
				AUDIO_RSTATION_POS.y = 0.0f;

				DISPLAY_BRIGHTNESS_POS.x = 30.0f;
				DISPLAY_BRIGHTNESS_POS.y = 0.0f;

				MEMCARD_ACCESS_MSG_SIZE_X = 0.84f;
				MEMCARD_ACCESS_MSG_SIZE_Y = 1.12f;//1.28f;

				break;
			}
		}
	}
}

void
CMenuManager::InitialiseMenuContents(void)
{
	if ( m_bWantToUpdateContent == false )
	{
		m_bWantToUpdateContent = true;

		m_pageState = PAGESTATE_NORMAL;

		switch ( CPad::GetPad(0)->GetMode() )
		{
			case 3: m_PrefsControllerConfig = CONFIG_4; break;
			case 2: m_PrefsControllerConfig = CONFIG_3; break;
			case 1: m_PrefsControllerConfig = CONFIG_2; break;
			case 0: m_PrefsControllerConfig = CONFIG_1; break;
		}

		MenuControls_1.SetMenuSelection(m_PrefsControllerConfig);
		MenuControls_5.SetMenuSelection(m_PrefsUseVibration);

		MenuAudio_1.SetMenuSelection(m_PrefsMusicVolume / 127.0f * 100.0f + 0.5f);
		MenuAudio_2.SetMenuSelection(m_PrefsSfxVolume   / 127.0f * 100.0f + 0.5f);
		MenuAudio_3.SetMenuSelection(m_PrefsRadioStation);
		MenuAudio_4.SetMenuSelection(m_PrefsStereoMono);

		MenuDisplay_1.SetMenuSelection(m_PrefsBrightness / 512.0f * 100.0f + 0.5f);
#ifdef PS2
		m_PrefsShowTrails = BlurOn;
#else
		m_PrefsShowTrails = CMBlur::BlurOn;
#endif
		MenuDisplay_2.SetMenuSelection(m_PrefsShowTrails);
		MenuDisplay_3.SetMenuSelection(m_PrefsShowSubtitles);
		MenuDisplay_4.SetMenuSelection(m_PrefsUseWideScreen);

		MenuLanguage_1.SetMenuSelection(m_PrefsLanguage);

		FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect,     nil, 0, 34, 22);
		FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);

		MenuBriefs_1.m_numTexts = 0;
		MenuBriefs_1.AddText(TheText.Get("FEB_PMB"), 0.0f, 0.0f, TITLE_TEXT_COLOR, 0); // Previous Mission Briefs:

		static wchar StringsToDisplay[NUMPREVIOUSBRIEFS][256];

		CRGBA newColor;
		int32 brierY = 36;

		for ( int32 i = NUMPREVIOUSBRIEFS-1; i >= 0; i-- )
		{
			tPreviousBrief &brief = CMessages::PreviousBriefs[i];
			if (brief.m_pText)
			{
				CMessages::InsertNumberInString(brief.m_pText,
					brief.m_nNumber[0], brief.m_nNumber[1],
					brief.m_nNumber[2], brief.m_nNumber[3],
					brief.m_nNumber[4], brief.m_nNumber[5], StringsToDisplay[i]);
				CMessages::InsertStringInString(StringsToDisplay[i], brief.m_pString);

				newColor = TEXT_COLOR;
				FilterOutColorMarkersFromString(StringsToDisplay[i], newColor);

				if (newColor != TEXT_COLOR)
				{
					newColor.r /= 2;
					newColor.g /= 2;
					newColor.b /= 2;
				}
				MenuBriefs_1.AddText(StringsToDisplay[i], 0.0f, YF((float)brierY), newColor, 0);
				brierY += 54;
			}
		}

		MenuStats_1.m_scrollPosition = 0.0f;
		MenuStats_1.ResetNumberOfTextLines();

		nStatLinesIndex = 0;

		#define STAT_HEADER(str) do { MenuStats_1.AddTextLine(TheText.Get(str), nil); } while(0)
		#define STAT_PARAM(str) do { MenuStats_1.AddTextLine(nil, TheText.Get(str)); } while(0)
		#define STAT_LINE(str, left, isFloat, right) do { MenuStats_1.AddTextLine(TheText.Get(str), PrintStatLine(str, left, isFloat, right)); } while(0)

		int32 nTemp;

		STAT_HEADER("PL_STAT");

		int32 percentCompleted = (CStats::TotalProgressInGame == 0 ? 0 : CStats::ProgressMade * 100.0f / (CGame::nastyGame ? CStats::TotalProgressInGame : CStats::TotalProgressInGame - 1));
		percentCompleted = Min(percentCompleted, 100);

		STAT_LINE("PER_COM", &percentCompleted,       0, nil);

		STAT_LINE("NMISON",  &CStats::MissionsGiven,  0, nil);

		STAT_LINE("FEST_MP", &CStats::MissionsPassed, 0, &CStats::TotalNumberMissions);

		if ( CGame::nastyGame )
			STAT_LINE("FEST_RP", &CStats::NumberKillFrenziesPassed, 0, &CStats::TotalNumberKillFrenzies);

		CPlayerInfo &player = CWorld::Players[CWorld::PlayerInFocus];
		float packagesPercent = 0.0f;
		if (player.m_nTotalPackages != 0)
			packagesPercent = player.m_nCollectedPackages * 100.0f / player.m_nTotalPackages;
		int32 nPackagesPercent = packagesPercent;
		nTemp = 100;

		STAT_LINE("PERPIC", &nPackagesPercent,       0, &nTemp);

		STAT_LINE("NOUNIF", &CStats::NumberOfUniqueJumpsFound, 0, &CStats::TotalNumberOfUniqueJumps);

		STAT_LINE("DAYSPS", &CStats::DaysPassed, 0, nil);

		if ( CGame::nastyGame )
		{
			STAT_LINE("PE_WAST", &CStats::PeopleKilledByPlayer, 0, nil);
			STAT_LINE("PE_WSOT", &CStats::PeopleKilledByOthers, 0, nil);
		}

		STAT_LINE("CAR_EXP", &CStats::CarsExploded, 0, nil);

		STAT_LINE("TM_BUST", &CStats::TimesArrested, 0, nil);

		STAT_LINE("TM_DED", &CStats::TimesDied, 0, nil);

		nTemp = CStats::PedsKilledOfThisType[PEDTYPE_GANG9] + CStats::PedsKilledOfThisType[PEDTYPE_GANG8]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG7] + CStats::PedsKilledOfThisType[PEDTYPE_GANG6]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG5] + CStats::PedsKilledOfThisType[PEDTYPE_GANG4]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG3] + CStats::PedsKilledOfThisType[PEDTYPE_GANG2]
			+ CStats::PedsKilledOfThisType[PEDTYPE_GANG1];
		STAT_LINE("GNG_WST", &nTemp, 0, nil);

		nTemp = CStats::PedsKilledOfThisType[PEDTYPE_CRIMINAL];
		STAT_LINE("DED_CRI", &nTemp, 0, nil);

		STAT_LINE("HEL_DST", &CStats::HelisDestroyed, 0, nil);

		STAT_LINE("KGS_EXP", &CStats::KgsOfExplosivesUsed, 0, nil);

		nTemp = (CStats::InstantHitsFiredByPlayer == 0 ? 0 : CStats::InstantHitsHitByPlayer * 100.0f / CStats::InstantHitsFiredByPlayer);
		STAT_LINE("ACCURA", &nTemp, 0, nil);

		if (CStats::ElBurroTime > 0)
			STAT_LINE("ELBURRO", &CStats::ElBurroTime, 0, nil);

		if (CStats::Record4x4One > 0)
			STAT_LINE("FEST_R1", &CStats::Record4x4One, 0, nil);

		if (CStats::Record4x4Two > 0)
			STAT_LINE("FEST_R2", &CStats::Record4x4Two, 0, nil);

		if (CStats::Record4x4Three > 0)
			STAT_LINE("FEST_R3", &CStats::Record4x4Three, 0, nil);

		if (CStats::Record4x4Mayhem > 0)
			STAT_LINE("FEST_RM", &CStats::Record4x4Mayhem, 0, nil);

		if (CStats::LongestFlightInDodo > 0)
			STAT_LINE("FEST_LF", &CStats::LongestFlightInDodo, 0, nil);

		if (CStats::TimeTakenDefuseMission > 0)
			STAT_LINE("FEST_BD", &CStats::TimeTakenDefuseMission, 0, nil);

		STAT_LINE("CAR_CRU", &CStats::CarsCrushed, 0, nil);

		if (CStats::HighestScores[0] > 0)
		{
			STAT_HEADER("FEST_BB");
			STAT_LINE("FEST_H0", &CStats::HighestScores[0], 0, nil);
		}

		int32 hs = 0;
		for ( int32 i = 1; i < 5; i++ )
			hs += CStats::HighestScores[i];

		if (hs > 0)
			STAT_HEADER("FEST_GC");

		if (CStats::HighestScores[1] > 0)
			STAT_LINE("FEST_H1", &CStats::HighestScores[1], 0, nil);

		if (CStats::HighestScores[2] > 0)
			STAT_LINE("FEST_H2", &CStats::HighestScores[2], 0, nil);

		if (CStats::HighestScores[3] > 0)
			STAT_LINE("FEST_H3", &CStats::HighestScores[3], 0, nil);

		if (CStats::HighestScores[4] > 0)
			STAT_LINE("FEST_H4", &CStats::HighestScores[4], 0, nil);

		STAT_LINE("FESTDFM", &CStats::DistanceTravelledOnFoot, 0, nil);
		STAT_LINE("FESTDCM", &CStats::DistanceTravelledInVehicle, 0, nil);
		STAT_LINE("MMRAIN", &CStats::mmRain, 0, nil);
		nTemp = (int32)CStats::MaximumJumpDistance;
		STAT_LINE("MXCARDM", &nTemp, 0, nil);
		nTemp = (int32)CStats::MaximumJumpHeight;
		STAT_LINE("MXCARJM", &nTemp, 0, nil);

		STAT_LINE("MXFLIP", &CStats::MaximumJumpFlips, 0, nil);
		STAT_LINE("MXJUMP", &CStats::MaximumJumpSpins, 0, nil);

		STAT_HEADER("BSTSTU");

		switch (CStats::BestStuntJump)
		{
			case 1:  STAT_PARAM("INSTUN"); break;
			case 2:  STAT_PARAM("PRINST"); break;
			case 3:  STAT_PARAM("DBINST"); break;
			case 4:  STAT_PARAM("DBPINS"); break;
			case 5:  STAT_PARAM("TRINST"); break;
			case 6:  STAT_PARAM("PRTRST"); break;
			case 7:  STAT_PARAM("QUINST"); break;
			case 8:  STAT_PARAM("PQUINS"); break;
			default: STAT_PARAM("NOSTUC"); break;
		}

		STAT_LINE("PASDRO", &CStats::PassengersDroppedOffWithTaxi, 0, nil);
		STAT_LINE("MONTAX", &CStats::MoneyMadeWithTaxi, 0, nil);
		STAT_LINE("FEST_LS", &CStats::LivesSavedWithAmbulance, 0, nil);
		STAT_LINE("FEST_HA", &CStats::HighestLevelAmbulanceMission, 0, nil);
		STAT_LINE("FEST_CC", &CStats::CriminalsCaught, 0, nil);
		STAT_LINE("FEST_FE", &CStats::FiresExtinguished, 0, nil);
		int32 rnd = ((CGeneral::GetRandomNumber() & 255) + 100) * 2384;
		STAT_LINE("DAYPLC", &rnd, 0, nil);

		#undef STAT_LINE

		MenuStats_2.m_numTexts = 0;
		MenuStats_2.AddText(TheText.Get("CRIMRA"), 0.0f, 0.0f, CRIM_RATING_TEXT_COLOR, 0);

		char rating[16];
		wchar urating[16];
		sprintf(rating, "  %d", CStats::FindCriminalRatingNumber());
		AsciiToUnicode(rating, urating);

		wchar *pStatLine = aStatLines[nStatLinesIndex++];
		UnicodeStrcpy(pStatLine, CStats::FindCriminalRatingString());
		UnicodeStrcat(pStatLine, urating);

		MenuStats_2.AddText(pStatLine, X(MenuStats_1.m_width), 0.0f, CRIM_RATING_TEXT_COLOR, 1);

		MenuSaveZoneSG_1.SetMenuSelection(1);
		MenuSaveZoneFC_1.SetMenuSelection(1);
	}
}

void
CMenuManager::AnaliseMenuContents(void)
{
	if ( m_bWantToUpdateContent )
	{
		m_bWantToUpdateContent = false;

		m_PrefsControllerConfig = (CONTRCONFIG)MenuControls_1.GetMenuSelection();
		switch ( m_PrefsControllerConfig )
		{
			case CONFIG_4: CPad::GetPad(0)->SetMode(3); break;
			case CONFIG_3: CPad::GetPad(0)->SetMode(2); break;
			case CONFIG_2: CPad::GetPad(0)->SetMode(1); break;
			case CONFIG_1: CPad::GetPad(0)->SetMode(0); break;
		}

		m_PrefsUseVibration = MenuControls_5.m_title.m_bSelected;

		m_PrefsMusicVolume   = float(MenuAudio_1.GetMenuSelection())/100.0f*127.0f+0.5f;
		m_PrefsSfxVolume     = float(MenuAudio_2.GetMenuSelection())/100.0f*127.0f+0.5f;
		m_PrefsRadioStation  = MenuAudio_3.GetMenuSelection();
		m_PrefsStereoMono    = MenuAudio_4.GetMenuSelection();
		m_PrefsBrightness    = float(MenuDisplay_1.GetMenuSelection()) / 100.0f*512.0f + 0.5f;
		m_PrefsShowTrails    = MenuDisplay_2.GetMenuSelection();
		m_PrefsShowSubtitles = MenuDisplay_3.GetMenuSelection();
		m_PrefsUseWideScreen = MenuDisplay_4.GetMenuSelection();
#ifdef PS2
		BlurOn               = m_PrefsShowTrails;
#else
		CMBlur::BlurOn       = m_PrefsShowTrails;
#endif

		if ( m_PrefsLanguage != MenuLanguage_1.GetMenuSelection() )
		{
			m_PrefsLanguage = MenuLanguage_1.GetMenuSelection();
			m_bInitialised = false;
			bFrontEnd_ReloadObrTxtGxt = true;
		}
	}
}

void
CMenuManager::InitialiseMenuContentsAfterLoadingGame(void)
{
	if ( MenuLanguage_1.GetMenuSelection() != m_PrefsLanguage )
	{
		m_bInitialised = false;
		bFrontEnd_ReloadObrTxtGxt = true;
	}
}

void
CMenuManager::DrawFrontEnd(void)
{
	CFont::SetAlphaFade(255.0f);
	if(m_bInSaveZone)
		DrawFrontEndSaveZone();
	else
		DrawFrontEndNormal();

	if ( MemCardAccessTriggerCaller.CanCall() )
		MemCardAccessTriggerCaller.CallTrigger();

	DisplayWarningControllerMsg();
}

void
CMenuManager::DrawFrontEndNormal(void)
{
	CSprite2d::InitPerFrame();
	CFont::InitPerFrame();

	if ( bMemoryCardSpecialZone )
	{
		static uint8 counter = 0;

		counter++;

		if ( (counter & 63 ) == 0 )
		{
			FillMenuWithMemCardFileListing(&MenuSaveLG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_LoadGameLoadGameSelect, nil, 0, 34, 22);
			FillMenuWithMemCardFileListing(&MenuSaveDG_2, TriggerSave_BackToMainMenuTwoLines, TriggerSave_DeleteGameDeleteGameSelect, nil, 0, 34, 22);
		}
	}

	m_fade = 255;
	if ( m_nChangePageTimer != 0 && m_nChangePageTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
		m_fade = uint32(float(m_nChangePageTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 250.0f * 255.0f);

	m_someAlpha = 255;

	m_position.x = 0.0f;
	m_position.y = 0.0f;

	if ( m_nStartPauseTimer != 0 && m_nStartPauseTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
	{
		float slide = float(m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 800.0f;
		float alpha = 1.0f;

		if ((m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) <= 1600)
			alpha = float(m_nStartPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 400.0f;

		m_someAlpha = 255 - Clamp(alpha, 0.0f, 1.0f) * 255.0f;

		switch ( m_nSlidingDir )
		{
			case SLIDE_TO_RIGHT:  m_position.x =   slide * X(700.0f);  break;
			case SLIDE_TO_TOP:    m_position.y = -(slide * Y(500.0f)); break;
			case SLIDE_TO_LEFT:   m_position.x = -(slide * X(700.0f)); break;
			case SLIDE_TO_BOTTOM: m_position.y =   slide * Y(500.0f);  break;
			default:              m_position.y =   slide * Y(500.0f);  break;
		}
	}

	if ( m_nEndPauseTimer != 0 && m_nEndPauseTimer >= CTimer::GetTimeInMillisecondsPauseMode() )
	{
		float slide = float(m_nEndPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) / 800.0f;
		float alpha = float((int32)(m_nEndPauseTimer - CTimer::GetTimeInMillisecondsPauseMode()) + -266) / 533.0f;

		m_someAlpha = Clamp(alpha, 0.0f, 1.0f) * 255.0f;

		switch ( m_nSlidingDir )
		{
			case SLIDE_TO_TOP:    m_position.y =   (1.0f - slide) * Y(500.0f);  break;
			case SLIDE_TO_RIGHT:  m_position.x =   (1.0f - slide) * X(700.0f);  break;
			case SLIDE_TO_LEFT:   m_position.x =   (1.0f - slide) * X(700.0f);  break;
			case SLIDE_TO_BOTTOM: m_position.y = -((1.0f - slide) * Y(500.0f)); break;
			default:              m_position.y = -((1.0f - slide) * Y(500.0f)); break;
		}
	}

	if ( m_someAlpha < 255 )
		m_fade = m_someAlpha;

	float posX, posY;

	/* Draw splash */
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
	CSprite2d *splash = LoadSplash(nil);
	if(splash)
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	else
		// doesn't exist!!
		CHud::Sprites[19].Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERMIPNEAREST);

	/* Draw main panel */
	RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSCLAMP);
	CRGBA panelColor(255, 255, 255, m_someAlpha);
	m_sprites[FE2_MAINPANEL_UL].Draw(
		CRect(m_position.x, m_position.y, m_position.x+SCRW/2.0f, m_position.y+SCRH/2.0f),
		panelColor);
	m_sprites[FE2_MAINPANEL_UR].Draw(
		CRect(m_position.x+SCRW/2.0f, m_position.y, m_position.x+SCRW, m_position.y+SCRH/2.0f),
		panelColor);
	m_sprites[FE2_MAINPANEL_DL].Draw(
		CRect(m_position.x, m_position.y+SCRH/2.0f, m_position.x+SCRW/2.0f, m_position.y+SCRH),
		panelColor);
	m_sprites[FE2_MAINPANEL_DR].Draw(
		CRect(m_position.x+SCRW/2.0f, m_position.y+SCRH/2.0f, m_position.x+SCRW, m_position.y+SCRH),
		panelColor);

	/* Draw icon backdrop */
	CRGBA iconColor(255, 255, 255, m_fade*0.75f);
	float iconX = 48.0f;
	float iconY = 54.0f;
	float iconWidth = 540.0f;
	float iconHeight = 296.0f;
	int32 sprite = FE_ICONBRIEF;

#ifdef PS2_MENU_USEALLPAGEICONS
	switch(m_currentPage)
	{
	case PAGE_STATS:
		sprite = FE_ICONSTATS;
		break;
	case PAGE_LOAD:
		sprite = FE_ICONSAVE;
		break;
	case PAGE_CONTROLS:
		sprite = FE_ICONCONTROLS;
		break;
	case PAGE_BRIEFS:
		sprite = FE_ICONBRIEF;
		break;
	case PAGE_AUDIO:
		sprite = FE_ICONAUDIO;
		break;
	case PAGE_DISPLAY:
		sprite = FE_ICONDISPLAY;
		break;
	case PAGE_LANGUAGE:
		sprite = FE_ICONLANGUAGE;
		break;
	}
#else
	switch(m_currentPage)
	{
	case PAGE_STATS:
	case PAGE_LOAD:
	case PAGE_CONTROLS:
		sprite = FE_ICONSTATS;	// PS2 has the same texture for stats and brief
		//sprite = FE_ICONBRIEF;
		break;
	case PAGE_BRIEFS:
		sprite = FE_ICONBRIEF;
		break;
	case PAGE_AUDIO:
		sprite = FE_ICONAUDIO;
		break;
	case PAGE_DISPLAY:
		sprite = FE_ICONDISPLAY;
		break;
	case PAGE_LANGUAGE:
		sprite = FE_ICONLANGUAGE;
		break;
	}
#endif
	m_sprites[sprite].Draw(
		CRect_SZ(m_position.x+X(iconX), m_position.y+Y(iconY), X(iconWidth), Y(iconHeight)),
		iconColor);

	/* Overwrite tab buttons if entered page */
	bool bOverwriteTab = false;

	switch ( m_pageState )
	{
		case PAGESTATE_NORMAL:
		case PAGESTATE_HIGHLIGHTED:
			break;

		case PAGESTATE_SELECTED:
			bOverwriteTab = true;
			break;
	}

	if( bOverwriteTab )
	{
		CRGBA shadow(41, 101, 102, m_someAlpha);
		CRGBA green(40, 48, 57, m_someAlpha);
		CSprite2d::DrawRect(
			CRect_SZ(m_position.x+X(82.0f), m_position.y+Y(408.0f), X(476.0f), Y(18.0f)),
			shadow);
		CSprite2d::DrawRect(
			CRect_SZ(m_position.x+X(82.0f), m_position.y+Y(408.0f), X(476.0f), Y(5.0f)),
			green);
	}
// stats, load, briefs, controls, audio, display, language

	/* Shadow of panel on top of tab buttons */
	CRGBA panelShadow(96, 96, 96, m_someAlpha*0.375f);
	CSprite2d::DrawRect(CRect_SZ(m_position.x+X(87.0f), m_position.y+Y(408.0f), X(464.0f), Y(3.0f)), panelShadow);
	/* Draw second shadow - seems unused */
	if ( m_nChangePageTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() < m_nChangePageTimer )
	{
		posX = 0.0f;
		switch(field_18)
		{
		case PAGE_STATS: posX = 88.0f; break;
		case PAGE_LOAD: posX = 286.0f; break;	// actually controls
		case PAGE_BRIEFS: posX = 154.0f; break;	// actually load
		case PAGE_CONTROLS: posX = 220.0f; break;	// actually briefs
		case PAGE_AUDIO: posX = 352.0f; break;
		case PAGE_DISPLAY: posX = 418.0f; break;
		case PAGE_LANGUAGE: posX = 484.0f; break;
		}
		CSprite2d::DrawRect(CRect_SZ(m_position.x+X(posX), m_position.y+Y(411.0f), X(65.0f), Y(3.0f)), panelShadow);
	}

	/* Active tab */
	posX = 0.0f;
	switch(m_currentPage)
	{
	case PAGE_STATS: posX = 88.0f; break;
	case PAGE_LOAD: posX = 154.0f; break;
	case PAGE_BRIEFS: posX = 220.0f; break;
	case PAGE_CONTROLS: posX = 286.0f; break;
	case PAGE_AUDIO: posX = 352.0f; break;
	case PAGE_DISPLAY: posX = 418.0f; break;
	case PAGE_LANGUAGE: posX = 484.0f; break;
	}
	// PAL has 465 for 407 here - and actually 406 seems right
	m_sprites[FE2_TABACTIVE].Draw(CRect_SZ(m_position.x+X(posX), m_position.y+YF(465.0f), X(128.0f), Y(32.0f)), CRGBA(255, 255, 255, m_someAlpha));

	/* Draw page title */
	posX = m_position.x + X(592.0f);
	posY = m_position.y + Y(376.0f);
	CRGBA fontCol1(255, 193, 71, m_someAlpha);
	CRGBA fontCol2(0, 0, 0, m_someAlpha);
	CFont::SetFontStyle(FONT_HEADING);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(PANEL_TEXT_SIZE_X), Y(PANEL_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyWrap(0.0f);
	CFont::SetRightJustifyOn();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
	const char *key = nil;
	switch(m_currentPage)
	{
	case PAGE_STATS:    key = "FEP_STA"; break;
	case PAGE_LOAD:     key = "FEP_SAV"; break;
	case PAGE_BRIEFS:   key = "FEP_BRI"; break;
	case PAGE_CONTROLS: key = "FEP_CON"; break;
	case PAGE_AUDIO:    key = "FEP_AUD"; break;
	case PAGE_DISPLAY:  key = "FEP_DIS"; break;
	case PAGE_LANGUAGE: key = "FEP_LAN"; break;
	}
	CFont::SetScale(X(PANEL_TEXT_SIZE_X*PANEL_TEXT_X_SCALES[m_currentPage]), Y(PANEL_TEXT_SIZE_Y));
	CFont::SetColor(fontCol1);
	CFont::PrintString(posX, posY, TheText.Get(key));
	CFont::SetColor(fontCol2);
	CFont::PrintString(posX-X(1.0f), posY-Y(1.0f), TheText.Get(key));
	CFont::DrawFonts();

	/* Draw controller buttons */
	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(0.35f), Y(0.64f));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
	CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
	switch(m_currentPage)
	{
		case PAGE_STATS:
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_ST"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM"));
			CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(360.0f), TheText.Get("FEDSSC1"));
			CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(372.0f), TheText.Get("FEDSSC2"));
			break;

		case PAGE_BRIEFS:
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_ST"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM"));
			break;

		case PAGE_LOAD:
		case PAGE_CONTROLS:
		case PAGE_AUDIO:
		case PAGE_DISPLAY:
		case PAGE_LANGUAGE:
		{
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(360.0f), TheText.Get("FEDS_SE"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_BA"));
			CFont::PrintString(m_position.x+X(52.0f), m_position.y+Y(384.0f), TheText.Get("FEDS_ST"));

			switch ( m_pageState )
			{
				case PAGESTATE_NORMAL:
					CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(372.0f), TheText.Get("FEDS_AM")); // <>-CHANGE MENU
					break;

				case PAGESTATE_HIGHLIGHTED:
				case PAGESTATE_SELECTED:
				{
					CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(360.0f+3.5f), TheText.Get("FEA_UP")); // ;
					CFont::PrintString(m_position.x+X(242.0f), m_position.y+Y(384.0f-3.5f), TheText.Get("FEA_DO")); // =
					CFont::PrintString(m_position.x+X(242.0f-10.0f), m_position.y+Y(372.0f), TheText.Get("FEA_LE")); // <
					CFont::PrintString(m_position.x+X(242.0f+11.0f), m_position.y+Y(372.0f), TheText.Get("FEA_RI")); // >
					CFont::PrintString(m_position.x+X(242.0f+20.0f), m_position.y+Y(372.0f), TheText.Get("FEDSAS3")); // - CHANGE SELECTION

					break;
				}
			}

			break;
		}
	}

	CFont::DrawFonts();

	/* Draw tab button texts */
	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X), Y(BUTTONTAB_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f

	switch ( m_pageState )
	{
		case PAGESTATE_NORMAL:
		{
			CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_STATS]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(92.0f), m_position.y+Y(408.0f), TheText.Get("FEB_STA"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LOAD]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(158.0f), m_position.y+Y(408.0f), TheText.Get("FEB_SAV"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_BRIEFS]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(224.0f), m_position.y+Y(408.0f), TheText.Get("FEB_BRI"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_CONTROLS]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(290.0f), m_position.y+Y(408.0f), TheText.Get("FEB_CON"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_AUDIO]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(356.0f), m_position.y+Y(408.0f), TheText.Get("FEB_AUD"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_DISPLAY]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(422.0f), m_position.y+Y(408.0f), TheText.Get("FEB_DIS"));
			CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LANGUAGE]), Y(BUTTONTAB_TEXT_SIZE_Y));
			CFont::PrintString(m_position.x+X(488.0f), m_position.y+Y(408.0f), TheText.Get("FEB_LAN"));

			break;
		}

		case PAGESTATE_HIGHLIGHTED:
		case PAGESTATE_SELECTED:
		{
			CFont::SetColor(CRGBA(16, 16, 16, m_someAlpha));
			switch(m_currentPage)
			{
			// PAL has 466 for 408...probably rounded?
			case PAGE_STATS:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_STATS]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(92.0f), m_position.y+Y(408.0f), TheText.Get("FEB_STA"));
				break;
			case PAGE_LOAD:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LOAD]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(158.0f), m_position.y+Y(408.0f), TheText.Get("FEB_SAV"));
				break;
			case PAGE_BRIEFS:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_BRIEFS]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(224.0f), m_position.y+Y(408.0f), TheText.Get("FEB_BRI"));
				break;
			case PAGE_CONTROLS:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_CONTROLS]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(290.0f), m_position.y+Y(408.0f), TheText.Get("FEB_CON"));
				break;
			case PAGE_AUDIO:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_AUDIO]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(356.0f), m_position.y+Y(408.0f), TheText.Get("FEB_AUD"));
				break;
			case PAGE_DISPLAY:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_DISPLAY]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(422.0f), m_position.y+Y(408.0f), TheText.Get("FEB_DIS"));
				break;
			case PAGE_LANGUAGE:
				CFont::SetScale(X(BUTTONTAB_TEXT_SIZE_X*BUTTONTAB_TEXT_X_SCALES[PAGE_LANGUAGE]), Y(BUTTONTAB_TEXT_SIZE_Y));
				CFont::PrintString(m_position.x+X(488.0f), m_position.y+Y(408.0f), TheText.Get("FEB_LAN"));
				break;
			}

			break;
		}
	}

	CFont::DrawFonts();

	pActiveMenuPage = nil;
	switch(m_currentPage)
	{
		case PAGE_STATS:	pActiveMenuPage = &MenuPage_Stats; break;
		case PAGE_LOAD:	    pActiveMenuPage = pMenuSave; break;
		case PAGE_BRIEFS:	pActiveMenuPage = &MenuPage_Briefs; break;
		case PAGE_CONTROLS:	pActiveMenuPage = &MenuPage_Controls; break;
		case PAGE_AUDIO:	pActiveMenuPage = &MenuPage_Audio; break;
		case PAGE_DISPLAY:	pActiveMenuPage = &MenuPage_Display; break;
		case PAGE_LANGUAGE:	pActiveMenuPage = &MenuPage_Language; break;
	}

	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); // 600.0f
	CFont::SetRightJustifyWrap(X(38.0f));

	if(m_currentPage == PAGE_LANGUAGE)
	{
		CFont::SetCentreOn();
		CFont::SetCentreSize(SCRW-X(40.0f)); // 600.0f
	}

	if ( m_nEndPauseTimer != 0 )
	{
		switch ( m_currentPage )
		{
			case PAGE_LOAD:
			case PAGE_BRIEFS:
			case PAGE_CONTROLS:
				break;

			default:
				CFont::SetWrapx(X(1200.0f));
				break;
		}
	}

	if(pActiveMenuPage)
	{
		pActiveMenuPage->SetAlpha(m_fade);

		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				pActiveMenuPage->DrawNormal(m_position.x, m_position.y);
				break;

			case PAGESTATE_HIGHLIGHTED:
				pActiveMenuPage->DrawHighlighted(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), m_position.x, m_position.y);
				break;

			case PAGESTATE_SELECTED:
				pActiveMenuPage->Draw(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), CRGBA(MENU_SELECTED_COLOR.r, MENU_SELECTED_COLOR.g, MENU_SELECTED_COLOR.b, m_fade), m_position.x, m_position.y);
				break;
		}
	}

	CFont::DrawFonts();
	CFont::DrawFonts();
	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
	RwRenderStateSet(rwRENDERSTATETEXTUREADDRESS, (void*)rwTEXTUREADDRESSWRAP);
}

void
CMenuManager::DrawFrontEndSaveZone(void)
{
	if ( bMemoryCardSpecialZone )
	{
		static uint8 counter = 0;
		counter++;
		if ( counter & 63 )
		{
			FillMenuWithMemCardFileListing(&MenuSaveZoneSSL_1, TriggerSaveZone_BackToMainMenuTwoLines, TriggerSaveZone_SaveSlots, nil, 0, 34, 22);

			if ( TheMemoryCard.GetError() == CMemoryCard::ERR_NOFORMAT )
			{
				pActiveMenuPage = &MenuPageSaveZone_FormatCard;
				pActiveMenuPage->ActivatePage();
				bMemoryCardSpecialZone = false;
			}
		}
	}

	CSprite2d::InitPerFrame();
	CFont::InitPerFrame();

	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);

	m_fade = 255;

	CSprite2d::DrawRect(CRect(X(50.0f), Y(50.0f), X(590.0f), Y(398.0f)), CRGBA(0, 0, 0, 175)); //CRect(50.0f, 57.142f, 590.0f, 454.857147f)

	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetRightJustifyWrap(X(70.0f));
	CFont::SetWrapx(SCRW-X(70.0f)); // 570.0f

	if ( pActiveMenuPage )
	{
		pActiveMenuPage->SetAlpha(m_fade);
		pActiveMenuPage->Draw(CRGBA(rgbaATC.r, rgbaATC.g, rgbaATC.b, m_fade), TITLE_TEXT_COLOR, 0.0f, 0.0f);
	}

	CFont::DrawFonts();
	CFont::SetFontStyle(FONT_BANK);
	CFont::SetBackgroundOff();
	CFont::SetScale(X(0.44f), Y(0.68f)); // 0.44f, 0.777143f
	CFont::SetPropOn();
	CFont::SetCentreOff();
	CFont::SetJustifyOn();
	CFont::SetRightJustifyOff();
	CFont::SetBackGroundOnlyTextOn();
	CFont::SetWrapx(SCRW-X(40.0f)); //600.0f
	CFont::SetColor(TEXT_COLOR);

	wchar *text;
	if ( pActiveMenuPage == &MenuPageSaveZone_FormatCard
		|| pActiveMenuPage == &MenuPageSaveZone_SaveSlots
		|| pActiveMenuPage == &MenuPageSaveZone_SaveGame )
	{
		text = TheText.Get("FEDS_SB"); // / button - SELECT " button - BACK
	}
	else
	{
		text = TheText.Get("FEDS_SE"); // / button - SELECT
	}

	CFont::PrintString(X(180.0f), Y(376.0f), text); // 180.0f, 429.714294f
	CFont::DrawFonts();

	RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
}

void
CMenuManager::DrawMemoryCardStartUpMenus()
{
	CFont::SetAlphaFade(255.0f);
	bMemoryCardStartUpMenus_ExitNow = false;

	CMenuPage page; // + 0x40 data
	CMenuMultiChoiceTriggered MCMenu;
	MCMenu.SetPosition(X(320.0f), Y(150.0f)); //171.428574f

	switch ( TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE) )
	{
		case CMemoryCard::MCSTATE_NEED_200KB: // 200KB
		{
			// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO)
			MCMenu.AddTitle(TheText.Get("MCGNSP"), 0.0f, 0.0f, 0);
			break;
		}

		case CMemoryCard::MCSTATE_NEED_500KB: // 500KB
		{
			// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO)
			MCMenu.AddTitle(TheText.Get("MCDNSP"), 0.0f, 0.0f, 0);
			break;
		}

		case CMemoryCard::MCSTATE_OK:
		case CMemoryCard::MCSTATE_NOCARD:
		{
			return;
			break;
		}
	}

	MCMenu.AddOption(TheText.Get("FEM_NO"),  X(30.0f),  Y(110.0f), nil, 0, 0);// 125.714294f
	MCMenu.AddOption(TheText.Get("FEM_YES"), X(-30.0f), Y(110.0f), TriggerMCSUM_Yes, 0, 0);// 125.714294f
	MCMenu.SetColors(TITLE_TEXT_COLOR, TEXT_COLOR, TEXT_COLOR);
	page.AddMenu(&MCMenu);

	MCMenu.GoFirst();

	page.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);

	CTimer::Initialise();
	CTimer::StartUserPause();

	while ( !bMemoryCardStartUpMenus_ExitNow )
	{
#ifdef GTA_PC
		HandleExit();

		if(RsGlobal.quit)
			return;
#endif

#ifdef GTA_PC
		if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
			page.GoLeft();
		if ( CPad::GetPad(0)->GetDPadRightJustDown() )
			page.GoRight();
		if ( CPad::GetPad(0)->GetDPadUpJustDown() )
			page.GoDown();
		if ( CPad::GetPad(0)->GetDPadDownJustDown() )
			page.GoUp();
		if ( CPad::GetPad(0)->GetCrossJustDown() || CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetRightMouseJustDown() )
			page.SelectCurrentOptionUnderCursor();

		if ( CPad::GetPad(0)->GetCircleJustDown() || CPad::GetPad(0)->GetEscapeJustDown() )
			;
#else
		if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
			page.GoLeft();
		if ( CPad::GetPad(0)->GetDPadRightJustDown() )
			page.GoRight();
		if ( CPad::GetPad(0)->GetDPadUpJustDown() )
			page.GoDown();
		if ( CPad::GetPad(0)->GetDPadDownJustDown() )
			page.GoUp();
		if ( CPad::GetPad(0)->GetCrossJustDown() )
			page.SelectCurrentOptionUnderCursor();
		if ( CPad::GetPad(0)->GetCircleJustDown() )
			;
#endif

		static int32 MemCardStatusWaiter = 0;

		MemCardStatusWaiter++;

		if ( MemCardStatusWaiter > 120 )
		{
			MemCardStatusWaiter = 0;

			switch ( TheMemoryCard.CheckCardStateAtGameStartUp(CARD_ONE) )
			{
				case CMemoryCard::MCSTATE_NEED_200KB:
				{
					// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 200KB is needed to save this application data. Do you wish to start? (YES or NO)
					MCMenu.AddTitle(TheText.Get("MCGNSP"), 0.0f, 0.0f, 0);
					break;
				}

				case CMemoryCard::MCSTATE_NEED_500KB:
				{
					// There is insufficient space on the Memory Card (PS2) in MEMORY CARD slot 1. At least 500KB is needed to save this application data. Do you wish to start? (YES or NO)
					MCMenu.AddTitle(TheText.Get("MCDNSP"), 0.0f, 0.0f, 0);
					break;
				}

				case CMemoryCard::MCSTATE_NOCARD:
				{
					// There is no Memory Card (PS2) in MEMORY CARD slot 1. Do you wish to start? (YES or NO)
					MCMenu.AddTitle(TheText.Get("MCSTNS"), 0.0f, 0.0f, 0);
					break;
				}

				case CMemoryCard::MCSTATE_OK:
				{
					bMemoryCardStartUpMenus_ExitNow = true;
					break;
				}
			}
		}

		DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);
		CFont::InitPerFrame();

		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
		CSprite2d *splash = LoadSplash("splash1");
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);

		SetRandomActiveTextlineColor(1);

		CRGBA col(rgbaATC.r, rgbaATC.g, rgbaATC.b, 255);
		CFont::SetFontStyle(FONT_BANK);
		CFont::SetBackgroundOff();
		CFont::SetScale(X(MENU_TEXT_SIZE_X), Y(MENU_TEXT_SIZE_Y));
		CFont::SetPropOn();
		CFont::SetJustifyOn();
		CFont::SetRightJustifyOff();
		CFont::SetBackGroundOnlyTextOn();
		CFont::SetWrapx(SCRW-X(60.0f)); // 580.0f
		CFont::SetCentreOn();
		CFont::SetCentreSize(SCRW-X(120.0f)); // 520.0f

		MCMenu.Draw(col, TITLE_TEXT_COLOR, 0.0f, 0.0f);
		CFont::DrawFonts();

		CFont::SetFontStyle(FONT_BANK);
		CFont::SetScale(X(0.4f), Y(0.64f)); // 0.731429
		CFont::SetPropOn();
		CFont::SetCentreOff();
		CFont::SetJustifyOn();
		CFont::SetRightJustifyOff();
		CFont::SetBackGroundOnlyTextOn();
		CFont::SetWrapx(SCRW-X(60.0f)); // 580.0f
		CFont::SetColor(TEXT_COLOR);

		CPlaceableShText text;
		text.SetPosition(X(240.0f), Y(378.0f), false); // 432.000000
		text.SetColor(TEXT_COLOR);
		text.m_text = TheText.Get("FEDS_SE"); // / button - SELECT
		text.SetShadows(true, TEXT_SHADOW_COLOR, SHADOW_VECTOR);
		text.Draw(0.0f, 0.0f);

		CFont::DrawFonts();
		DisplayWarningControllerMsg();
		DoRWStuffEndOfFrame();
		CPad::UpdatePads();
		CTimer::Update();
	}

	CTimer::EndUserPause();
	CTimer::Stop();

	for ( int32 i = 0; i < 100; i++ )
	{
#ifdef GTA_PC
		HandleExit();
#endif
		DoRWStuffStartOfFrame(0, 0, 0, 0, 0, 0, 255);

		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
		CSprite2d *splash = LoadSplash("splash1");
		splash->Draw(CRect(0.0f, 0.0f, SCRW, SCRH), BACKGROUND_SPLASH_COLOR);
		RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERNEAREST);

		DoRWStuffEndOfFrame();
	}
}

void
CMenuManager::Process(void)
{
	if ( m_bSaveMenuActive || m_bInSaveZone || TheCamera.GetScreenFadeStatus() == FADE_0 )
	{
		InitialiseMenusOnce();
		m_bWantToRestart = false;
		WorkOutMenuState(false);

		if ( m_bMenuActive )
		{
			if ( !m_bInSaveZone )
				LoadAllTextures();
			InitialiseMenuContents();
			SetRandomActiveTextlineColor(0);
			ProcessControllerInput();
		}
		else
		{
			AnaliseMenuContents();
			pMenuSave = &MenuPage_SaveBasic;
			m_pageState = PAGESTATE_NORMAL;
			bMemoryCardSpecialZone = false;
			bIgnoreTriangleButton = false;
			UnloadTextures();
			m_bInSaveZone = false;
			m_bRenderGameInMenu = false;
			gErrorSampleTriggered = true;
		}
	}
}

void
CMenuManager::WorkOutMenuState(uint8 bExit)
{
#ifdef GTA_PC
	bool bIsStartPressed = CPad::GetPad(0)->GetStartJustDown() || (m_pageState == PAGESTATE_NORMAL && CPad::GetPad(0)->GetEscapeJustDown());
#else
	bool bIsStartPressed = CPad::GetPad(0)->GetStartJustDown();
#endif
	bool bIsCreditsOrDraw      = CCredits::AreCreditsDone() || m_bMenuActive;
	bool bIsDemoOrDraw         = m_bMenuActive || CGame::bDemoMode;

	if ( (bIsStartPressed && bIsCreditsOrDraw) || bExit || (!bIsDemoOrDraw && CPad::IsNoOrObsolete()) )
	{
		if ( m_nStartPauseTimer == 0 && m_nEndPauseTimer == 0 )
		{
			m_bMenuActive = !m_bMenuActive;

			if ( !m_bMenuActive )
			{
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_STARTING, 0);
				DMAudio.ChangeMusicMode(MUSICMODE_GAME);
				gMusicPlaying = false;
				bMemoryCardSpecialZone = false;
				bIgnoreTriangleButton = false;

				m_bMenuActive = true;

				m_nEndPauseTimer = CTimer::GetTimeInMillisecondsPauseMode() + 800;

				if ( m_currentPage == PAGE_CONTROLS || m_currentPage == PAGE_BRIEFS || m_currentPage == PAGE_LOAD )
				{
					m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);

					switch ( m_nSlidingDir ) //m_nSlidingDir &= ~1;
					{
						case SLIDE_TO_LEFT:  m_nSlidingDir = SLIDE_TO_TOP;    break;
						case SLIDE_TO_RIGHT: m_nSlidingDir = SLIDE_TO_BOTTOM; break;
					}

					m_position.y = Y(500.0f); // 571.428589f;
				}
			}
			else
			{
				DMAudio.ChangeMusicMode(MUSICMODE_FRONTEND);

				if ( DMAudio.GetRadioInCar() < 9 )
					m_PrefsRadioStation = DMAudio.GetRadioInCar();
				else
					m_PrefsRadioStation = CGeneral::GetRandomNumber() % 9;

				CTimer::StartUserPause();
				CPad::StopPadsShaking();
				m_nStartPauseTimer = CTimer::GetTimeInMillisecondsPauseMode() + 800;
				m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);

				switch ( m_nSlidingDir )
				{
					case SLIDE_TO_RIGHT:  m_position.y = Y(612.5f); break;
					case SLIDE_TO_LEFT:   m_position.y = Y(612.5f); break;
					case SLIDE_TO_BOTTOM: m_position.y = Y(500.0f); break;
					case SLIDE_TO_TOP:    m_position.y = Y(500.0f); break;
					default:              m_position.y = Y(500.0f); break;
				}

				if ( m_currentPage == PAGE_CONTROLS || m_currentPage == PAGE_BRIEFS )
				{
					m_nSlidingDir = CGeneral::GetRandomNumber() & (SLIDE_MAX-1);

					switch ( m_nSlidingDir ) //m_nSlidingDir &= ~1;
					{
						case SLIDE_TO_LEFT:  m_nSlidingDir = SLIDE_TO_TOP;    break;
						case SLIDE_TO_RIGHT: m_nSlidingDir = SLIDE_TO_BOTTOM; break;
					}

					m_position.y = Y(500.0f); //571.428589f
				}
			}
		}
	}

	if ( m_bSaveMenuActive && !m_bInSaveZone && !TheMemoryCard._bunk2)
	{
		m_bSaveMenuActive = false;
		m_bInSaveZone = true;
		m_bRenderGameInMenu = true;
		m_bMenuActive = true;
		CTimer::StartUserPause();
		pActiveMenuPage = &MenuPageSaveZone_SaveGame;
	}

	if ( m_pageState == PAGESTATE_NORMAL && gMusicPlaying )
	{
		DMAudio.StopFrontEndTrack();
		gMusicPlaying = false;
	}

	if ( m_nChangePageTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nChangePageTimer )
	{
		m_nChangePageTimer = 0;
		pMenuSave = &MenuPage_SaveBasic;
		m_currentPage = m_newPage;
	}

	if ( m_nPageLeftTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nPageLeftTimer )
		m_nPageLeftTimer = 0;

	if ( m_nPageRightTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nPageRightTimer )
		m_nPageRightTimer = 0;

	if ( m_nStartPauseTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nStartPauseTimer )
		m_nStartPauseTimer = 0;

	if ( m_nEndPauseTimer != 0 && CTimer::GetTimeInMillisecondsPauseMode() >= m_nEndPauseTimer )
	{
		m_nEndPauseTimer = 0;
		m_bMenuActive = false;
		m_bMenuActive = false;
		m_bInSaveZone = false;
		CTimer::EndUserPause();
	}
}

void
CMenuManager::ProcessControllerInput(void)
{
	if ( TimeToStopPadShaking != 0 && TimeToStopPadShaking < CTimer::GetTimeInMillisecondsPauseMode() )
	{
		CPad::StopPadsShaking();
		TimeToStopPadShaking = 0;
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadLeft() || CPad::GetPad(0)->GetLeft() )
#else
	if ( CPad::GetPad(0)->GetDPadLeft() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoLeftStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadRight() || CPad::GetPad(0)->GetRight() )
#else
	if ( CPad::GetPad(0)->GetDPadRight() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoRightStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadLeftJustDown() || CPad::GetPad(0)->GetLeftJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadLeftJustDown() )
#endif
		ProcessDPadLeftJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadRightJustDown() || CPad::GetPad(0)->GetRightJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadRightJustDown() )
#endif
		ProcessDPadRightJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadUp() || CPad::GetPad(0)->GetUp() )
#else
	if ( CPad::GetPad(0)->GetDPadUp() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( m_currentPage == PAGE_STATS )
				{
					if ( pActiveMenuPage )
						pActiveMenuPage->GoUpStill();
				}
				break;
			}

			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoUpStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadDown() || CPad::GetPad(0)->GetDown() )
#else
	if ( CPad::GetPad(0)->GetDPadDown() )
#endif
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( m_currentPage == PAGE_STATS )
				{
					if ( pActiveMenuPage )
						pActiveMenuPage->GoDownStill();
				}

				break;
			}
			case PAGESTATE_HIGHLIGHTED:
				break;

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoDownStill();
				break;
			}
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadUpJustDown() || CPad::GetPad(0)->GetUpJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadUpJustDown() )
#endif
		ProcessDPadUpJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetDPadDownJustDown() || CPad::GetPad(0)->GetDownJustDown() )
#else
	if ( CPad::GetPad(0)->GetDPadDownJustDown() )
#endif
		ProcessDPadDownJustDown();

	if ( CPad::GetPad(0)->GetLeftShoulder1JustDown() )
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				ProcessDPadLeftJustDown();
				break;

			case PAGESTATE_HIGHLIGHTED:
			case PAGESTATE_SELECTED:
				break;
		}
	}

	if ( CPad::GetPad(0)->GetRightShoulder1JustDown() )
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				ProcessDPadRightJustDown();
				break;

			case PAGESTATE_HIGHLIGHTED:
			case PAGESTATE_SELECTED:
				break;
		}
	}

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetCrossJustDown() || CPad::GetPad(0)->GetEnterJustDown() || CPad::GetPad(0)->GetRightMouseJustDown() )
#else
	if ( CPad::GetPad(0)->GetCrossJustDown() )
#endif
		ProcessDPadCrossJustDown();

#ifdef GTA_PC
	if ( CPad::GetPad(0)->GetTriangleJustDown() || CPad::GetPad(0)->GetBackspaceJustDown() || (m_pageState != PAGESTATE_NORMAL && CPad::GetPad(0)->GetEscapeJustDown()) )
#else
	if ( CPad::GetPad(0)->GetTriangleJustDown() )
#endif
		ProcessDPadTriangleJustDown();
}

void
CMenuManager::ProcessDPadLeftJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoLeft();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( !bMemoryCardSpecialZone && !m_bInSaveZone )
				{
					if ( m_nChangePageTimer == 0 )
					{
						if ( --m_newPage < PAGE_FIRST ) m_newPage = PAGE_LAST;

						m_nPageLeftTimer   = CTimer::GetTimeInMillisecondsPauseMode() + 300;
						m_nPageRightTimer  = 0;
						m_nChangePageTimer = CTimer::GetTimeInMillisecondsPauseMode() + 250;
						field_18 = m_newPage;
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
					}
				}

				break;
			}

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoLeftMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);

				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoLeft();

					if ( m_currentPage == PAGE_AUDIO)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_1 )
							;
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( m_currentPage == PAGE_DISPLAY)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuDisplay_1 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
						{
							if ( MenuSaveDG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
						{
							if ( MenuSaveLG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
				}

				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadRightJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoRight();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
			{
				if ( !bMemoryCardSpecialZone && !m_bInSaveZone )
				{
					if ( m_nChangePageTimer == 0 )
					{
						if ( ++m_newPage > PAGE_LAST ) m_newPage = PAGE_FIRST;

						m_nPageLeftTimer   = 0;
						m_nPageRightTimer  = CTimer::GetTimeInMillisecondsPauseMode() + 300;
						m_nChangePageTimer = CTimer::GetTimeInMillisecondsPauseMode() + 250;
						field_18 = m_newPage;
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
					}
				}

				break;
			}

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoRightMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);

				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoRight();

					if ( m_currentPage == PAGE_AUDIO)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_1 )
							;
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( m_currentPage == PAGE_DISPLAY)
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuDisplay_1 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
					{
						if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
						{
							if ( MenuSaveDG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
						{
							if ( MenuSaveLG_2.m_numOptions < 2 )
								;
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
						}
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
				}

				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadUpJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoUp();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				break;

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoUpMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoUp();

					if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
					{
						if ( MenuSaveDG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
					{
						if ( MenuSaveLG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
				}

				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadDownJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
		{
			pActiveMenuPage->GoDown();

			if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveZoneSSL_1 )
			{
				if ( MenuSaveZoneSSL_1.m_numOptions < 2 )
					;
				else
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
			}
			else
				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
		}
	}
	else
	{
		switch ( m_pageState )
		{
			case PAGESTATE_NORMAL:
				break;

			case PAGESTATE_HIGHLIGHTED:
			{
				if ( pActiveMenuPage )
					pActiveMenuPage->GoDownMenuOnPage();

				DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);

				break;
			}

			case PAGESTATE_SELECTED:
			{
				if ( pActiveMenuPage )
				{
					pActiveMenuPage->GoDown();

					if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 )
					{
						if ( MenuSaveDG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
					{
						if ( MenuSaveLG_2.m_numOptions < 2 )
							;
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
					}
					else
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NAVIGATION, 0);
				}
				break;
			}
		}
	}
}

void
CMenuManager::ProcessDPadTriangleJustDown(void)
{
	if ( pActiveMenuPage )
	{
		pActiveMenuPage->SelectDefaultCancelAction();

		if ( m_bMenuActive || m_bInSaveZone )
		{
			if ( bIgnoreTriangleButton )
			{
				if ( m_bInSaveZone )
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
				else if ( pActiveMenuPage->m_pCurrentControl == &MenuSaveDG_2 || pActiveMenuPage->m_pCurrentControl == &MenuSaveLG_2 )
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
			}
			else if ( !bIgnoreTriangleButton )
			{
				switch ( m_pageState )
				{
					case PAGESTATE_NORMAL:
						WorkOutMenuState(true);
						break;

					case PAGESTATE_HIGHLIGHTED:
						m_pageState = PAGESTATE_NORMAL;
						DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
						break;

					case PAGESTATE_SELECTED:
					{
						m_pageState = PAGESTATE_HIGHLIGHTED;
						if ( pActiveMenuPage )
						{
							if ( pActiveMenuPage->m_numControls == 1 )
							{
								m_pageState = PAGESTATE_NORMAL;
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
							}
							else
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
						}
						break;
					}
				}
			}
		}
	}
	else
	{
		if ( !bIgnoreTriangleButton )
		{
			switch ( m_pageState )
			{
				case PAGESTATE_NORMAL:
					WorkOutMenuState(false);
					break;

				case PAGESTATE_HIGHLIGHTED:
					m_pageState = PAGESTATE_NORMAL;
					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
					break;

				case PAGESTATE_SELECTED:
				{
					m_pageState = PAGESTATE_HIGHLIGHTED;
					if ( pActiveMenuPage )
					{
						if ( pActiveMenuPage->m_numControls == 1 )
						{
							m_pageState = PAGESTATE_NORMAL;
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_NEW_PAGE, 0);
						}
						else
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_BACK, 0);
					}
					break;
				}
			}
		}
	}
}

void
CMenuManager::ProcessDPadCrossJustDown(void)
{
	if ( m_bInSaveZone )
	{
		if ( pActiveMenuPage )
			pActiveMenuPage->SelectCurrentOptionUnderCursor();

		DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
	}
	else
	{
		if ( m_currentPage != PAGE_STATS && m_currentPage != PAGE_BRIEFS)
		{
			switch ( m_pageState )
			{
				case PAGESTATE_NORMAL:
				{
					m_pageState = PAGESTATE_HIGHLIGHTED;
					if ( pActiveMenuPage )
					{
						if ( pActiveMenuPage->m_numControls == 1 )
							m_pageState = PAGESTATE_SELECTED;
					}

					switch ( m_currentPage )
					{
						case PAGE_AUDIO:
						{
							if (   pActiveMenuPage->m_pCurrentControl == &MenuAudio_1
								|| pActiveMenuPage->m_pCurrentControl == &MenuAudio_2
								|| pActiveMenuPage->m_pCurrentControl == &MenuAudio_3
								|| pActiveMenuPage->m_pCurrentControl == &MenuAudio_4 )
							{
								if ( !gMusicPlaying )
								{
									DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, TRUE);
									gMusicPlaying = true;
								}
							}
							else
							{
								DMAudio.StopFrontEndTrack();
								gMusicPlaying = false;
							}
							break;
						}
					}

					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
					break;
				}

				case PAGESTATE_HIGHLIGHTED:
				{
					m_pageState = PAGESTATE_SELECTED;
					DoHackingMenusAtPageBrowse();
					if ( pActiveMenuPage )
					{
						if ( pActiveMenuPage->IsActiveMenuTwoState())
						{
							m_pageState = PAGESTATE_HIGHLIGHTED;
							pActiveMenuPage->ActiveMenuTwoState_SelectNextPosition();
						}
					}

					switch ( m_currentPage )
					{
						case PAGE_AUDIO:
						{
							if ( pActiveMenuPage->m_pCurrentControl != &MenuAudio_4 )
								DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);

							break;
						}

						default:
						{
							DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
							DMAudio.StopFrontEndTrack();
							gMusicPlaying = false;
							break;
						}
					}
					break;
				}

				case PAGESTATE_SELECTED:
				{
					if ( pActiveMenuPage )
					{
						pActiveMenuPage->SelectCurrentOptionUnderCursor();

						switch ( m_currentPage )
						{
							case PAGE_AUDIO:
							{
								if ( pActiveMenuPage->m_pCurrentControl != &MenuAudio_3 )
									m_pageState = PAGESTATE_HIGHLIGHTED;
								break;
							}

							case PAGE_LOAD:
							case PAGE_LANGUAGE:
								break;

							default:
								m_pageState = PAGESTATE_HIGHLIGHTED;
								break;
						}
					}

					DMAudio.PlayFrontEndSound(SOUND_FRONTEND_MENU_SETTING_CHANGE, 0);
					break;
				}
			}
		}
	}
}

void
CMenuManager::DoHackingMenusAtPageBrowse(void)
{
	if ( pActiveMenuPage )
	{
		switch ( m_currentPage )
		{
			case PAGE_CONTROLS:
			{
				if ( pActiveMenuPage->m_pCurrentControl == &MenuControls_1  )
				{
					int32 sel = MenuControls_1.GetMenuSelection();
					MenuControls_1.GoFirst();

					for ( int32 i = 0; i < sel; i++ )
						MenuControls_1.GoNext();
				}
				break;
			}

			case PAGE_AUDIO:
			{
				if ( pActiveMenuPage->m_pCurrentControl == &MenuAudio_3  )
				{
					int32 sel = MenuAudio_3.GetMenuSelection();
					MenuAudio_3.GoFirst();

					for ( int32 i = 0; i < sel; i++ )
						MenuAudio_3.GoNext();
				}
				break;
			}
		}
	}
}

void
CMenuManager::SetSoundLevelsForMusicMenu(void)
{
	DMAudio.SetMusicMasterVolume(m_PrefsMusicVolume);
	DMAudio.SetEffectsMasterVolume(m_PrefsSfxVolume);
}

void
CMenuManager::FilterOutColorMarkersFromString(wchar *string, CRGBA &color)
{
	wchar buf[300];
	UnicodeStrcpy(buf, string);

	wchar *src = buf;
	wchar *dst = string;
	while ( *src != '\0' )
	{
		if ( *src == '~' )
		{
			src++;

			if ( *src == 'l' )      color = CRGBA(0, 0, 0, 255);
			else if ( *src == 'p' ) color = CRGBA(255, 0, 255, 255);
			else if ( *src == 'y' ) color = CRGBA(255, 255, 0, 255);
			else if ( *src == 'w' ) color = CRGBA(255, 255, 255, 255);
			else if ( *src == 'b' ) color = CRGBA(40, 40, 255, 255);
			else if ( *src == 'g' ) color = CRGBA(40, 235, 40, 255);
			else if ( *src == 'r' ) color = CRGBA(255, 0, 0, 255);

			while ( *src++ != '~' )
				;
		}
		else
			*dst++ = *src++;
	}

	*dst = '\0';
}

#endif


code:
#pragma once
#include "Sprite2d.h"

enum
{
	PAGE_STATS,
	PAGE_LOAD,
	PAGE_BRIEFS,
	PAGE_CONTROLS,
	PAGE_AUDIO,
	PAGE_DISPLAY,
	PAGE_LANGUAGE,

	NUM_PAGES,
	PAGE_FIRST = PAGE_STATS,
	PAGE_LAST = PAGE_LANGUAGE,
};

enum
{
	PAGESTATE_NORMAL = 0,
	PAGESTATE_HIGHLIGHTED,
	PAGESTATE_SELECTED
};

enum eFrontendSprites
{
	FE2_MAINPANEL_UL,
	FE2_MAINPANEL_UR,
	FE2_MAINPANEL_DL,
	FE2_MAINPANEL_DR,
	FE2_MAINPANEL_DR2,
	FE2_TABACTIVE,
	FE_ICONBRIEF,
	FE_ICONSTATS,
	FE_ICONCONTROLS,
	FE_ICONSAVE,
	FE_ICONAUDIO,
	FE_ICONDISPLAY,
	FE_ICONLANGUAGE,
	FE_CONTROLLER,
	FE_CONTROLLERSH,
	FE_ARROWS1,
	FE_ARROWS2,
	FE_ARROWS3,
	FE_ARROWS4,
	FE_RADIO1,
	FE_RADIO2,
	FE_RADIO3,
	FE_RADIO4,
	FE_RADIO5,
	FE_RADIO6,
	FE_RADIO7,
	FE_RADIO8,
	FE_RADIO9,

	NUM_FE_SPRITES
};

class CSprite2d;
class CVector2D;

#ifdef GTA_PC
enum eControlMethod
{
	CONTROL_STANDARD = 0,
	CONTROL_CLASSIC,
};
#endif

class CMenuManager
{
public:
	enum LANGUAGE
	{
		LANGUAGE_AMERICAN,
		LANGUAGE_FRENCH,
		LANGUAGE_GERMAN,
		LANGUAGE_ITALIAN,
		LANGUAGE_SPANISH,
#ifdef MORE_LANGUAGES
		LANGUAGE_POLISH,
		LANGUAGE_RUSSIAN,
		LANGUAGE_JAPANESE,
#endif
	};

	enum CONTRCONFIG
	{
		CONFIG_1 = 0,
		CONFIG_2,
		CONFIG_3,
		CONFIG_4,
	};

	enum
	{
		NUM_SPRIRES = 28,
	};

	enum
	{
		PAGESTATE_NORMAL = 0,
		PAGESTATE_HIGHLIGHTED = 1,
		PAGESTATE_SELELECTED = 2,
	};

	enum
	{
		SLIDE_TO_BOTTOM = 0,
		SLIDE_TO_RIGHT,
		SLIDE_TO_TOP,
		SLIDE_TO_LEFT,
		SLIDE_MAX
	};

	int32 m_currentPage;
	int32 m_newPage;
	int32 m_pageState;
	uint32 m_nPageLeftTimer;
	uint32 m_nPageRightTimer;
	uint32 m_nChangePageTimer;
	int field_18;
	uint8 m_fade;
	uint8 m_someAlpha;
	//char field_1E; // unused ?
	//char field_1F; // unused ?
	uint32 m_nStartPauseTimer;
	uint32 m_nEndPauseTimer;
	CVector2D m_position;
	uint8 m_nSlidingDir;
	//char field_31; // unused ?
	//char field_32; // unused ?
	//char field_33; // unused ?
	bool m_bInitialised;
	bool m_bWantToUpdateContent;
	bool m_bMenuActive;
	bool m_bWantToRestart;
	//char field_38; //unused ?
	bool m_bRenderGameInMenu;
	bool m_bSaveMenuActive;
	bool m_bInSaveZone;
	char field_3C;
	bool m_bTexturesLoaded;
	//char field_3E; //unused ?
	//char field_3F; //unused ?
	CSprite2d m_sprites[NUM_SPRIRES];

	static int32 m_PrefsSfxVolume;
	static int32 m_PrefsMusicVolume;
	static int32 m_PrefsBrightness;
	static bool m_PrefsShowTrails;
	static bool m_PrefsShowSubtitles;
	static bool m_PrefsAllowNastyGame;
	static int32 m_PrefsRadioStation;
	static int32 m_PrefsStereoMono;
	static int8 m_PrefsUseWideScreen;
	static int32 m_PrefsLanguage;
	static CONTRCONFIG m_PrefsControllerConfig;
	static bool m_PrefsUseVibration;

#define ISLAND_LOADING_IS(p)
#define ISLAND_LOADING_ISNT(p)
#ifdef GTA_PC
	bool m_bQuitGameNoCD;

	int32 m_nMouseTempPosX;
	int32 m_nMouseTempPosY;
	int32 m_nPrefsVideoMode;
	int32 m_nDisplayVideoMode;
	int8 m_nPrefsAudio3DProviderIndex;

	static int32 OS_Language;
	static int8 m_PrefsVsync;
	static int8 m_PrefsVsyncDisp;
	static int8 m_PrefsFrameLimiter;
	static int8 m_PrefsSpeakers;
	static int32 m_ControlMethod;
	static int8 m_PrefsDMA;
	static float m_PrefsLOD;
	static char m_PrefsSkinFile[256];

#ifndef MASTER
	static bool m_PrefsMarketing;
	static bool m_PrefsDisableTutorials;
#endif // !MASTER

#ifdef MENU_MAP
	static bool bMenuMapActive;
	static float fMapSize;
	static float fMapCenterY;
	static float fMapCenterX;
#endif

#ifdef IMPROVED_VIDEOMODE
	int32 m_nPrefsWidth = 640;
	int32 m_nPrefsHeight = 480;
	int32 m_nPrefsDepth = 32;
	int32 m_nPrefsWindowed = 1;
	int32 m_nPrefsSubsystem;
	int32 m_nSelectedScreenMode;
#endif

	void WaitForUserCD() { }
#endif

	bool GetIsMenuActive() {return !!m_bMenuActive;}

	CMenuManager(void);
#ifdef FIX_BUGS
	~CMenuManager(void)
	{
		UnloadTextures();
	}
#endif

	void LoadAllTextures(void);
	void UnloadTextures(void);

	void InitialiseMenusOnce(void);
	void InitialiseChangedLanguageSettings(void);
	void InitialiseMenuContents(void);
	void AnaliseMenuContents(void);
	void InitialiseMenuContentsAfterLoadingGame(void);
	void DrawFrontEnd(void);
	void DrawFrontEndNormal(void);
	void DrawFrontEndSaveZone(void);
	void DrawMemoryCardStartUpMenus(void);
	void Process(void);
	void WorkOutMenuState(uint8 bExit);
	void ProcessControllerInput(void);
	void ProcessDPadLeftJustDown(void);
	void ProcessDPadRightJustDown(void);
	void ProcessDPadUpJustDown(void);
	void ProcessDPadDownJustDown(void);
	void ProcessDPadTriangleJustDown(void);
	void ProcessDPadCrossJustDown(void);
	void DoHackingMenusAtPageBrowse(void);
	void SetSoundLevelsForMusicMenu(void);
	void FilterOutColorMarkersFromString(wchar *string, CRGBA &color);
};

extern CMenuManager FrontEndMenuManager;

license: mit