/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of Penumbra Overture. */ #include "hpl1/penumbra-overture/MainMenu.h" #include "common/savefile.h" #include "hpl1/debug.h" #include "hpl1/graphics.h" #include "hpl1/hpl1.h" #include "hpl1/penumbra-overture/ButtonHandler.h" #include "hpl1/penumbra-overture/EffectHandler.h" #include "hpl1/penumbra-overture/GraphicsHelper.h" #include "hpl1/penumbra-overture/Init.h" #include "hpl1/penumbra-overture/IntroStory.h" #include "hpl1/penumbra-overture/MapHandler.h" #include "hpl1/penumbra-overture/Player.h" #include "hpl1/penumbra-overture/PlayerHelper.h" #include "hpl1/penumbra-overture/SaveHandler.h" float gfMenuFadeAmount; bool gbMustRestart = false; static eMainMenuState gvMenuBackStates[] = { eMainMenuState_Exit, // eMainMenuState_Start, eMainMenuState_Start, // eMainMenuState_NewGame, eMainMenuState_Start, // eMainMenuState_Exit, eMainMenuState_Start, // eMainMenuState_Continue, eMainMenuState_Start, // eMainMenuState_Resume, eMainMenuState_Start, // eMainMenuState_LoadGameSpot, eMainMenuState_Start, // eMainMenuState_LoadGameAuto, eMainMenuState_Start, // eMainMenuState_LoadGameFavorite, eMainMenuState_Start, // eMainMenuState_Options, eMainMenuState_Options, // eMainMenuState_OptionsGraphics, eMainMenuState_OptionsGraphics, // eMainMenuState_OptionsGraphicsAdvanced, eMainMenuState_Options, // eMainMenuState_OptionsControls, eMainMenuState_Options, // eMainMenuState_OptionsGame, eMainMenuState_Options, // eMainMenuState_OptionsSound, eMainMenuState_OptionsControls, // eMainMenuState_OptionsKeySetupMove, eMainMenuState_OptionsControls, // eMainMenuState_OptionsKeySetupAction, eMainMenuState_OptionsControls, // eMainMenuState_OptionsKeySetupMisc, eMainMenuState_Options, // eMainMenuState_GraphicsRestart, eMainMenuState_Start, // eMainMenuState_FirstStart, }; ////////////////////////////////////////////////////////////////////////// // WIDGET ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget::cMainMenuWidget(cInit *apInit, const cVector3f &avPos, const cVector2f &avSize) { mpInit = apInit; mpDrawer = mpInit->mpGame->GetGraphics()->GetDrawer(); mvPositon = cVector3f(avPos.x, avPos.y, 40); mRect.w = avSize.x; mRect.h = avSize.y; mRect.x = avPos.x - mRect.w / 2; mRect.y = avPos.y; mbActive = true; } cMainMenuWidget::~cMainMenuWidget() { } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // MAIN BUTTON ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_MainButton::cMainMenuWidget_MainButton(cInit *apInit, const cVector3f &avPos, const tWString &asText, eMainMenuState aNextState) : cMainMenuWidget(apInit, avPos, cVector2f(1, 1)) { mpFont = mpInit->mpGame->GetResources()->GetFontManager()->CreateFontData("font_menu_small.fnt", 30); msText = asText; mvFontSize = 35; mbOver = false; mfOverTimer = 0; mfAlpha = 0; mRect.w = mpFont->getLength(mvFontSize, msText.c_str()); mRect.h = mvFontSize.y + 8; mRect.x = avPos.x - mRect.w / 2; mRect.y = avPos.y + 3; mNextState = aNextState; msTip = _W(""); } cMainMenuWidget_MainButton::~cMainMenuWidget_MainButton() { } void cMainMenuWidget_MainButton::OnUpdate(float afTimeStep) { mfOverTimer += afTimeStep * 1.3f; if (mbOver) { mfAlpha += 1.8f * afTimeStep; if (mfAlpha > 1) mfAlpha = 1; } else { mfAlpha -= 1.3f * afTimeStep; if (mfAlpha < 0) mfAlpha = 0; } } //----------------------------------------------------------------------- void cMainMenuWidget_MainButton::OnMouseOver(bool abOver) { mbOver = abOver; if (abOver) { mpInit->mpMainMenu->SetButtonTip(msTip); } } //----------------------------------------------------------------------- void cMainMenuWidget_MainButton::OnMouseDown(eMButton aButton) { mpInit->mpMainMenu->SetState(mNextState); mpInit->mpGame->GetSound()->GetSoundHandler()->PlayGui("gui_menu_click", false, 1); } //----------------------------------------------------------------------- void cMainMenuWidget_MainButton::OnDraw() { mpFont->draw(mvPositon, mvFontSize, cColor(0.62f + mfAlpha * 0.3f, 1), eFontAlign_Center, msText); float fAdd = sin(mfOverTimer) * 16.0f; if (mfAlpha > 0) { mpFont->draw(mvPositon + cVector3f(fAdd, 0, -1), mvFontSize, cColor(0.56f, 0.35f * mfAlpha), eFontAlign_Center, msText); mpFont->draw(mvPositon + cVector3f(-fAdd, 0, -1), mvFontSize, cColor(0.56f, 0.35f * mfAlpha), eFontAlign_Center, msText); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // BUTTON ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Button::cMainMenuWidget_Button(cInit *apInit, const cVector3f &avPos, const tWString &asText, eMainMenuState aNextState, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget(apInit, avPos, cVector2f(1, 1)) { mpFont = mpInit->mpGame->GetResources()->GetFontManager()->CreateFontData("font_menu_small.fnt", 30); msText = asText; mvFontSize = avFontSize; mbOver = false; mAlignment = aAlignment; mfAlpha = 0; mfOverTimer = 0; mRect.w = mpFont->getLength(mvFontSize, msText.c_str()); mRect.h = mvFontSize.y + 3; mRect.y = avPos.y + 3; if (mAlignment == eFontAlign_Center) { mRect.x = avPos.x - mRect.w / 2; } else if (mAlignment == eFontAlign_Left) { mRect.x = avPos.x; } else if (mAlignment == eFontAlign_Right) { mRect.x = avPos.x - mRect.w; } mNextState = aNextState; } cMainMenuWidget_Button::~cMainMenuWidget_Button() { } void cMainMenuWidget_Button::OnUpdate(float afTimeStep) { if (mbOver) { mfAlpha += 1.8f * afTimeStep; if (mfAlpha > 1) mfAlpha = 1; } else { mfAlpha -= 1.3f * afTimeStep; if (mfAlpha < 0) mfAlpha = 0; } mfOverTimer += afTimeStep * 0.4f; } //----------------------------------------------------------------------- void cMainMenuWidget_Button::OnMouseOver(bool abOver) { mbOver = abOver; if (mbOver) { mpInit->mpMainMenu->SetButtonTip(msTip); } } //----------------------------------------------------------------------- void cMainMenuWidget_Button::OnMouseDown(eMButton aButton) { mpInit->mpMainMenu->SetState(mNextState); mpInit->mpGame->GetSound()->GetSoundHandler()->PlayGui("gui_menu_click", false, 1); } //----------------------------------------------------------------------- void cMainMenuWidget_Button::OnDraw() { mpFont->draw(mvPositon, mvFontSize, cColor(0.62f, 1), mAlignment, msText); if (mfAlpha > 0) { float fX = 0.8f + sin(mfOverTimer) * 0.2f; mpFont->draw(mvPositon + cVector3f(0, 0, 1), mvFontSize, cColor(0.9f, 0.95f, 1.0f, mfAlpha * fX), mAlignment, msText); mpFont->draw(mvPositon + cVector3f(2, 2, -1), mvFontSize, cColor(0.1f, 0.32f, 1.0f, mfAlpha * fX), mAlignment, msText); mpFont->draw(mvPositon + cVector3f(-2, -2, -1), mvFontSize, cColor(0.1f, 0.32f, 1.0f, mfAlpha * fX), mAlignment, msText); mpFont->draw(mvPositon + cVector3f(3, 3, -2), mvFontSize, cColor(0.1f, 0.32f, 1.0f, mfAlpha * 0.5f * fX), mAlignment, msText); mpFont->draw(mvPositon + cVector3f(-3, -3, -2), mvFontSize, cColor(0.1f, 0.32f, 1.0f, mfAlpha * 0.5f * fX), mAlignment, msText); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // TEXT ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Text::cMainMenuWidget_Text(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment, cMainMenuWidget *apExtra, float afMaxWidth) : cMainMenuWidget(apInit, avPos, cVector2f(1, 1)) { mpFont = mpInit->mpGame->GetResources()->GetFontManager()->CreateFontData("font_menu_small.fnt", 30); mfMaxWidth = afMaxWidth; msText = asText; mvFontSize = avFontSize; mAlignment = aAlignment; mRect.w = mpFont->getLength(mvFontSize, msText.c_str()); mRect.h = mvFontSize.y + 3; mRect.y = avPos.y + 3; if (mAlignment == eFontAlign_Center) { mRect.x = avPos.x - mRect.w / 2; } else if (mAlignment == eFontAlign_Left) { mRect.x = avPos.x; } else if (mAlignment == eFontAlign_Right) { mRect.x = avPos.x - mRect.w; } mpExtra = apExtra; mbOver = false; } cMainMenuWidget_Text::~cMainMenuWidget_Text() { } //----------------------------------------------------------------------- void cMainMenuWidget_Text::UpdateSize() { mRect.w = mpFont->getLength(mvFontSize, msText.c_str()); } void cMainMenuWidget_Text::OnDraw() { if (mfMaxWidth <= 0) mpFont->draw(mvPositon, mvFontSize, cColor(0.9f, 1), mAlignment, msText); else mpFont->drawWordWrap(mvPositon, mfMaxWidth, mvFontSize.y + 1, mvFontSize, cColor(0.9f, 1), mAlignment, msText); } //----------------------------------------------------------------------- void cMainMenuWidget_Text::OnMouseDown(eMButton aButton) { if (mpExtra) { mpExtra->OnMouseDown(aButton); } } void cMainMenuWidget_Text::OnMouseOver(bool abOver) { // if(abOver == mbOver) return; mbOver = abOver; if (mpExtra) { if (mpExtra->mbOver == false) mpExtra->OnMouseOver(abOver); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // IMAGE ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Image::cMainMenuWidget_Image(cInit *apInit, const cVector3f &avPos, const cVector2f &avSize, const tString &asImageFile, const tString &asImageMat, const cColor &aColor) : cMainMenuWidget(apInit, avPos, avSize) { mpImage = mpDrawer->CreateGfxObject(asImageFile, asImageMat); mColor = aColor; mvSize = avSize; } cMainMenuWidget_Image::~cMainMenuWidget_Image() { } //----------------------------------------------------------------------- void cMainMenuWidget_Image::OnDraw() { mpDrawer->DrawGfxObject(mpImage, mvPositon, mvSize, mColor); } ////////////////////////////////////////////////////////////////////////// // LIST ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_List::cMainMenuWidget_List(cInit *apInit, const cVector3f &avPos, const cVector2f &avSize, cVector2f avFontSize) : cMainMenuWidget(apInit, avPos, avSize) { mpDrawer = mpInit->mpGame->GetGraphics()->GetDrawer(); mpFont = mpInit->mpGame->GetResources()->GetFontManager()->CreateFontData("font_menu_small.fnt", 30); mpBackGfx = mpDrawer->CreateGfxObject("effect_white.jpg", "diffalpha2d"); mpDownGfx = mpDrawer->CreateGfxObject("menu_list_down.bmp", "diffalpha2d"); mpUpGfx = mpDrawer->CreateGfxObject("menu_list_up.bmp", "diffalpha2d"); mpSlideGfx = mpDrawer->CreateGfxObject("menu_list_slide.bmp", "diffalpha2d"); mpBorderLeftGfx = mpDrawer->CreateGfxObject("menu_list_border_left.bmp", "diffalpha2d"); mpBorderTopGfx = mpDrawer->CreateGfxObject("menu_list_border_top.bmp", "diffalpha2d"); mpBorderBottomGfx = mpDrawer->CreateGfxObject("menu_list_border_bottom.bmp", "diffalpha2d"); mpSlideButtonGfx = mpDrawer->CreateGfxObject("menu_list_slider_button.bmp", "diffalpha2d"); mvFontSize = avFontSize; mRect.x = avPos.x; mRect.y = avPos.y; mRect.w = avSize.x; mRect.h = avSize.y; mlMaxRows = (int)floor((avSize.y - 6) / (avFontSize.y + 2)); mvPosition = avPos; mvSize = avSize; mlSelected = -1; mlFirstRow = 0; mbSlideButtonPressed = false; mfSlideButtonMove = 0; mvLastMousePos = mpInit->mpMainMenu->GetMousePos(); } cMainMenuWidget_List::~cMainMenuWidget_List() { } //----------------------------------------------------------------------- void cMainMenuWidget_List::OnUpdate(float afTimeStep) { //////////////////////////////// // Slide button // Size float fT = (float)mlMaxRows / (float)mvEntries.size(); if (fT > 1) fT = 1; mfSlideButtonSize = (mvSize.y - 28) * fT; // Pos mfSlideButtonPos = 0; if ((int)mvEntries.size() > mlMaxRows) { mfSlideButtonPos = ((mvSize.y - 28) - mfSlideButtonSize) * (float)mlFirstRow / (float)(mvEntries.size() - mlMaxRows); } ///////////////////////////////// // Slide button pressed if (mbSlideButtonPressed && (int)mvEntries.size() > mlMaxRows) { float fMinStep = ((mvSize.y - 28) - mfSlideButtonSize) / (float)mvEntries.size(); cVector2f vRelMouse = mpInit->mpMainMenu->GetMousePos() - mvLastMousePos; mfSlideButtonMove += vRelMouse.y; while (mfSlideButtonMove <= -fMinStep && mlFirstRow > 0) { mlFirstRow--; mfSlideButtonMove += fMinStep; } while (mfSlideButtonMove >= fMinStep && mlFirstRow < (int)mvEntries.size() - mlMaxRows) { mlFirstRow++; mfSlideButtonMove -= fMinStep; } } mvLastMousePos = mpInit->mpMainMenu->GetMousePos(); } //----------------------------------------------------------------------- void cMainMenuWidget_List::OnMouseOver(bool abOver) { if (abOver == false) { mbSlideButtonPressed = false; mfSlideButtonMove = 0; } } //----------------------------------------------------------------------- void cMainMenuWidget_List::OnDraw() { mpDrawer->DrawGfxObject(mpBackGfx, mvPositon - cVector3f(0, 0, 1), mvSize, cColor(0.05f, 0.05f, 0.1f, 1)); // Up mpDrawer->DrawGfxObject(mpUpGfx, cVector3f(mvPositon.x + mvSize.x - 14, mvPositon.y, mvPositon.z + 1), cVector2f(14, 14), cColor(1, 1)); // Down mpDrawer->DrawGfxObject(mpDownGfx, cVector3f(mvPositon.x + mvSize.x - 14, mvPositon.y + mvSize.y - 14, mvPositon.z + 1), cVector2f(14, 14), cColor(1, 1)); // Slide mpDrawer->DrawGfxObject(mpSlideGfx, cVector3f(mvPositon.x + mvSize.x - 14, mvPositon.y + 14, mvPositon.z + 1), cVector2f(14, mvSize.y - 28), cColor(1, 1)); // Border Top mpDrawer->DrawGfxObject(mpBorderTopGfx, cVector3f(mvPositon.x + 3, mvPositon.y, mvPositon.z + 1), cVector2f(mvSize.x - 17, 3), cColor(1, 1)); // Border Bottom mpDrawer->DrawGfxObject(mpBorderBottomGfx, cVector3f(mvPositon.x + 3, mvPositon.y + mvSize.y - 3, mvPositon.z + 1), cVector2f(mvSize.x - 17, 3), cColor(1, 1)); // Border Left mpDrawer->DrawGfxObject(mpBorderLeftGfx, cVector3f(mvPositon.x, mvPositon.y, mvPositon.z + 1), cVector2f(3, mvSize.y), cColor(1, 1)); // Slider Button cVector3f vButtonStart = cVector3f(mvPositon.x + mvSize.x - 14, mvPositon.y + 14, mvPositon.z + 2); mpDrawer->DrawGfxObject(mpSlideButtonGfx, vButtonStart + cVector3f(0, mfSlideButtonPos, 0), cVector2f(14, mfSlideButtonSize), cColor(1, 1)); cVector3f vPos = mvPositon + cVector3f(5, 3, 0); for (size_t i = mlFirstRow; i < mvEntries.size(); ++i) { if ((int)i - mlFirstRow >= mlMaxRows) break; if (mlSelected == (int)i) { mpFont->draw(vPos, mvFontSize, cColor(0.95f, 1), eFontAlign_Left, mvEntries[i]); mpDrawer->DrawGfxObject(mpBackGfx, vPos + cVector3f(0, 2, -1), cVector2f(mvSize.x - 5, mvFontSize.y), cColor(0.0f, 0.0f, 0.73f, 1)); } else mpFont->draw(vPos, mvFontSize, cColor(0.7f, 1), eFontAlign_Left, mvEntries[i]); vPos.y += mvFontSize.y + 2; } } //----------------------------------------------------------------------- void cMainMenuWidget_List::OnMouseDown(eMButton aButton) { cVector2f vLocalMouse = mpInit->mpMainMenu->GetMousePos() - cVector2f(mvPositon.x, mvPositon.y); // Scrollbar if (vLocalMouse.x > mvSize.x - 14) { // Up Arrow if (vLocalMouse.y <= 14) { if (mlFirstRow > 0) mlFirstRow--; } // Down Arrow else if (vLocalMouse.y >= mvSize.y - 14) { if (mlFirstRow < (int)mvEntries.size() - mlMaxRows) mlFirstRow++; } // Press slide button else if (vLocalMouse.y >= mfSlideButtonPos && vLocalMouse.y <= mfSlideButtonPos + mfSlideButtonSize) { mbSlideButtonPressed = true; } } // Entries else { int lSelected = mlFirstRow + (int)floor((vLocalMouse.y - 3) / (mvFontSize.y + 2)); if (lSelected < (int)mvEntries.size()) mlSelected = lSelected; } } void cMainMenuWidget_List::OnMouseUp(eMButton aButton) { mbSlideButtonPressed = false; mfSlideButtonMove = 0; } //----------------------------------------------------------------------- void cMainMenuWidget_List::AddEntry(const tWString &asText) { mvEntries.push_back(asText); if (mlSelected == -1 && mvEntries.size() == 1) mlSelected = 0; } //----------------------------------------------------------------------- const tWString &cMainMenuWidget_List::GetSelectedEntry() { return mvEntries[0]; } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // NEW GAME ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_NewGame::cMainMenuWidget_NewGame(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment, eGameDifficulty aDiffuculty) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mDiffuculty = aDiffuculty; switch (mDiffuculty) { case eGameDifficulty_Easy: msTip = kTranslate("MainMenu", "TipDifficultyEasy"); break; case eGameDifficulty_Normal: msTip = kTranslate("MainMenu", "TipDifficultyNormal"); break; case eGameDifficulty_Hard: msTip = kTranslate("MainMenu", "TipDifficultyHard"); break; default: break; } } //----------------------------------------------------------------------- void cMainMenuWidget_NewGame::OnMouseDown(eMButton aButton) { mpInit->mpGraphicsHelper->DrawLoadingScreen(""); mpInit->mpMainMenu->SetActive(false); mpInit->ResetGame(true); mpInit->mDifficulty = mDiffuculty; if (mpInit->mbShowIntro) { mpInit->mpIntroStory->SetActive(true); } else { mpInit->mpGame->GetUpdater()->SetContainer("Default"); mpInit->mpGame->GetScene()->SetDrawScene(true); mpInit->mpMapHandler->Load(mpInit->msStartMap, mpInit->msStartLink); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // CONTINUE ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Continue::cMainMenuWidget_Continue(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { } //----------------------------------------------------------------------- void cMainMenuWidget_Continue::OnMouseDown(eMButton aButton) { // mpInit->mpGraphicsHelper->DrawLoadingScreen("other_loading.jpg"); mpInit->mpMainMenu->SetActive(false); tWString latestSave = mpInit->mpSaveHandler->GetLatest(_W("????:*")); if (latestSave != _W("")) mpInit->mpSaveHandler->LoadGameFromFile(latestSave); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // QUIT ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Quit::cMainMenuWidget_Quit(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { } //----------------------------------------------------------------------- void cMainMenuWidget_Quit::OnMouseDown(eMButton aButton) { mpInit->mpGame->Exit(); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // RESUME ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Resume::cMainMenuWidget_Resume(cInit *apInit, const cVector3f &avPos, const tWString &asText) : cMainMenuWidget_MainButton(apInit, avPos, asText, eMainMenuState_LastEnum) { } //----------------------------------------------------------------------- void cMainMenuWidget_Resume::OnMouseDown(eMButton aButton) { mpInit->mpGame->GetSound()->GetSoundHandler()->PlayGui("gui_menu_click", false, 1); mpInit->mpMainMenu->SetActive(false); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // LOADGAME ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- tWStringVec *gvSaveGameFileVec; class cMainMenuWidget_SaveGameList : public cMainMenuWidget_List { public: cMainMenuWidget_SaveGameList(cInit *apInit, const cVector3f &avPos, const cVector2f &avSize, cVector2f avFontSize, tWString asDir, int alNum) : cMainMenuWidget_List(apInit, avPos, avSize, avFontSize) { msDir = asDir; mlNum = alNum; } void OnDoubleClick(eMButton aButton) { if (mlSelected < 0) return; tWString sFile = gvSaveGameFileVec[mlNum][mlSelected]; mpInit->mpMainMenu->SetActive(false); mpInit->ResetGame(true); mpInit->mpSaveHandler->LoadGameFromFile(sFile); } private: tWString msDir; int mlNum; }; cMainMenuWidget_SaveGameList *gpSaveGameList[3] = {NULL, NULL, NULL}; class cMainMenuWidget_LoadSaveGame : public cMainMenuWidget_Button { public: cMainMenuWidget_LoadSaveGame(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment, const tWString &asDir, int alNum) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msDir = asDir; mlNum = alNum; } void OnMouseDown(eMButton aButton) { int lSelected = gpSaveGameList[mlNum]->GetSelectedIndex(); if (lSelected < 0) return; tWString sFile = msDir + Common::U32String("/") + gvSaveGameFileVec[mlNum][lSelected]; mpInit->mpMainMenu->SetActive(false); mpInit->ResetGame(true); mpInit->mpSaveHandler->LoadGameFromFile(sFile); } tWString msDir; int mlNum; }; class cMainMenuWidget_RemoveSaveGame : public cMainMenuWidget_Button { public: cMainMenuWidget_RemoveSaveGame(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment, const tWString &asDir, int alNum) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msDir = asDir; mlNum = alNum; } void OnMouseDown(eMButton aButton) { int lSelected = gpSaveGameList[mlNum]->GetSelectedIndex(); if (lSelected < 0) return; tWString sFile = gvSaveGameFileVec[mlNum][lSelected]; Hpl1::g_engine->removeSaveFile(sFile); mpInit->mpMainMenu->UpdateWidgets(); } tWString msDir; int mlNum; }; class cMainMenuWidget_FavoriteSaveGame : public cMainMenuWidget_Button { public: cMainMenuWidget_FavoriteSaveGame(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment, int alNum) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mlNum = alNum; } void OnMouseDown(eMButton aButton) { int lSelected = gpSaveGameList[mlNum]->GetSelectedIndex(); if (lSelected < 0) return; tWString originalName = gvSaveGameFileVec[mlNum][lSelected]; tWString newName = _W("favorite-") + cString::SubW(originalName, originalName.find('.') + 1); Hpl1::logInfo(Hpl1::kDebugSaves, "adding save %S to favourites\n", newName.encode().c_str()); Common::String originalFile(Hpl1::g_engine->mapInternalSaveToFile(originalName)); Common::String newFile(Hpl1::g_engine->createSaveFile(newName)); g_engine->getSaveFileManager()->copySavefile(originalFile, newFile); mpInit->mpMainMenu->UpdateWidgets(); } int mlNum; }; //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // OPTIONS CONTROLS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Text *gpInvertMouseYText = NULL; cMainMenuWidget_Text *gpMouseSensitivityText = NULL; cMainMenuWidget_Text *gpToggleCrouchText = NULL; cMainMenuWidget_Text *gpWidgetInteractModeCameraSpeedText = NULL; cMainMenuWidget_Text *gpWidgetActionModeCameraSpeedText = NULL; cMainMenuWidget_Text *gpWidgetWeightForceScaleText = NULL; //----------------------------------------------------------------------- class cMainMenuWidget_InvertMouseY : public cMainMenuWidget_Button { public: cMainMenuWidget_InvertMouseY(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipControlsInvertMouseY"); } void OnMouseDown(eMButton aButton) { mpInit->mpButtonHandler->mbInvertMouseY = !mpInit->mpButtonHandler->mbInvertMouseY; gpInvertMouseYText->msText = mpInit->mpButtonHandler->mbInvertMouseY ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; //------------------------------------------------------------ class cMainMenuWidget_MouseSensitivity : public cMainMenuWidget_Button { public: cMainMenuWidget_MouseSensitivity(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipControlsMouseSensitivity"); } void OnMouseDown(eMButton aButton) { if (aButton == eMButton_Left) { mpInit->mpButtonHandler->mfMouseSensitivity += 0.2f; if (mpInit->mpButtonHandler->mfMouseSensitivity > 5.0f) mpInit->mpButtonHandler->mfMouseSensitivity = 5.0f; } else if (aButton == eMButton_Right) { mpInit->mpButtonHandler->mfMouseSensitivity -= 0.2f; if (mpInit->mpButtonHandler->mfMouseSensitivity < 0.2f) mpInit->mpButtonHandler->mfMouseSensitivity = 0.2f; } char sTempVec[256]; snprintf(sTempVec, 256, "%.1f", mpInit->mpButtonHandler->mfMouseSensitivity); gpMouseSensitivityText->msText = cString::To16Char(sTempVec); } }; //------------------------------------------------------------ class cMainMenuWidget_ToggleCrouch : public cMainMenuWidget_Button { public: cMainMenuWidget_ToggleCrouch(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipControlsToggleCrouch"); } void OnMouseDown(eMButton aButton) { mpInit->mpButtonHandler->mbToggleCrouch = !mpInit->mpButtonHandler->mbToggleCrouch; gpToggleCrouchText->msText = mpInit->mpButtonHandler->mbToggleCrouch ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; ////////////////////////////////////////////////////////////////////////// // OPTIONS GAME ////////////////////////////////////////////////////////////////////////// cMainMenuWidget_Text *gpLanguageText = NULL; cMainMenuWidget_Text *gpSubtitlesText = NULL; cMainMenuWidget_Text *gpSimpleSwingText = NULL; cMainMenuWidget_Text *gpAllowQuickSaveText = NULL; cMainMenuWidget_Text *gpDisablePersonalText = NULL; cMainMenuWidget_Text *gpDifficultyText = NULL; cMainMenuWidget_Text *gpFlashItemsText = NULL; cMainMenuWidget_Text *gpShowCrossHairText = NULL; class cMainMenuWidget_ShowCrossHair : public cMainMenuWidget_Button { public: cMainMenuWidget_ShowCrossHair(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = _W(""); } void OnMouseDown(eMButton aButton) { mpInit->mbShowCrossHair = !mpInit->mbShowCrossHair; gpShowCrossHairText->msText = mpInit->mbShowCrossHair ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; class cMainMenuWidget_FlashItems : public cMainMenuWidget_Button { public: cMainMenuWidget_FlashItems(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGameFlashText"); } void OnMouseDown(eMButton aButton) { mpInit->mbFlashItems = !mpInit->mbFlashItems; gpFlashItemsText->msText = mpInit->mbFlashItems ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; constexpr const char *gvDifficultyLevel[] = {"Easy", "Normal", "Hard"}; constexpr int glDifficultyLevelNum = 3; class cMainMenuWidget_Difficulty : public cMainMenuWidget_Button { public: cMainMenuWidget_Difficulty(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGameDifficulty"); } void OnMouseDown(eMButton aButton) { int lCurrent = (int)mpInit->mDifficulty; if (aButton == eMButton_Left) { lCurrent++; if (lCurrent >= glDifficultyLevelNum) lCurrent = 0; } else if (aButton == eMButton_Right) { lCurrent--; if (lCurrent < 0) lCurrent = glDifficultyLevelNum - 1; } gpDifficultyText->msText = kTranslate("MainMenu", gvDifficultyLevel[lCurrent]); mpInit->mDifficulty = (eGameDifficulty)lCurrent; } }; class cMainMenuWidget_SimpleSwing : public cMainMenuWidget_Button { public: cMainMenuWidget_SimpleSwing(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { } void OnMouseDown(eMButton aButton) { mpInit->mbSimpleWeaponSwing = !mpInit->mbSimpleWeaponSwing; gpSimpleSwingText->msText = mpInit->mbSimpleWeaponSwing ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; class cMainMenuWidget_AllowQuickSave : public cMainMenuWidget_Button { public: cMainMenuWidget_AllowQuickSave(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { } void OnMouseDown(eMButton aButton) { mpInit->mbAllowQuickSave = !mpInit->mbAllowQuickSave; gpAllowQuickSaveText->msText = mpInit->mbAllowQuickSave ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; class cMainMenuWidget_DisablePersonal : public cMainMenuWidget_Button { public: cMainMenuWidget_DisablePersonal(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGameDisablePersonal"); } void OnMouseDown(eMButton aButton) { mpInit->mbDisablePersonalNotes = !mpInit->mbDisablePersonalNotes; gpDisablePersonalText->msText = mpInit->mbDisablePersonalNotes ? kTranslate("MainMenu", "Off") : kTranslate("MainMenu", "On"); } }; class cMainMenuWidget_Subtitles : public cMainMenuWidget_Button { public: cMainMenuWidget_Subtitles(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGameSubtitles"); } void OnMouseDown(eMButton aButton) { mpInit->mbSubtitles = !mpInit->mbSubtitles; gpSubtitlesText->msText = mpInit->mbSubtitles ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; class cMainMenuWidget_Language : public cMainMenuWidget_Button { public: cMainMenuWidget_Language(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { tStringList lstStrings; apInit->mpGame->GetResources()->GetLowLevel()->findFilesInDir(lstStrings, "config", "*.lang"); mlCurrentFile = 0; int lIdx = 0; for (tStringListIt it = lstStrings.begin(); it != lstStrings.end(); ++it) { mvFiles.push_back(*it); if (cString::ToLowerCase(apInit->msLanguageFile) == cString::ToLowerCase(*it)) { mlCurrentFile = lIdx; } ++lIdx; } msTip = kTranslate("MainMenu", "TipGameLanguage"); } void OnMouseDown(eMButton aButton) { if (aButton == eMButton_Left) { mlCurrentFile++; if (mlCurrentFile >= (int)mvFiles.size()) mlCurrentFile = 0; } else if (aButton == eMButton_Right) { mlCurrentFile--; if (mlCurrentFile < 0) mlCurrentFile = (int)mvFiles.size() - 1; } gpLanguageText->msText = cString::To16Char(cString::SetFileExt(mvFiles[mlCurrentFile], "")); mpInit->msLanguageFile = mvFiles[mlCurrentFile]; if (mpInit->mpMapHandler->GetCurrentMapName() != "") { gbMustRestart = true; } else { mpInit->mpGame->GetResources()->ClearResourceDirs(); mpInit->mpGame->GetResources()->AddResourceDir("core/programs"); mpInit->mpGame->GetResources()->AddResourceDir("core/textures"); mpInit->mpGame->GetResources()->LoadResourceDirsFile("resources.cfg"); mpInit->mpGame->GetResources()->SetLanguageFile(mpInit->msLanguageFile); mpInit->mpMainMenu->UpdateWidgets(); } } Common::Array mvFiles; int mlCurrentFile; }; //------------------------------------------------------------ //------------------------------------------------------------ ////////////////////////////////////////////////////////////////////////// // OPTIONS GRAPHICS ////////////////////////////////////////////////////////////////////////// cMainMenuWidget_Text *gpResolutionText = NULL; cMainMenuWidget_Text *gpPostEffectsText = NULL; cMainMenuWidget_Text *gpBloomText = NULL; cMainMenuWidget_Text *gpMotionBlurText = NULL; cMainMenuWidget_Text *gpTextureQualityText = NULL; cMainMenuWidget_Text *gpShaderQualityText = NULL; cMainMenuWidget_Text *gpShadowsText = NULL; cMainMenuWidget_Text *gpTextureFilterText = NULL; cMainMenuWidget_Text *gpTextureAnisotropyText = NULL; cMainMenuWidget_Text *gpGammaText = NULL; cMainMenuWidget_Text *gpGammaText2 = NULL; cMainMenuWidget_Text *gpFSAAText = NULL; cMainMenuWidget_Text *gpDoFText = NULL; constexpr cVector2l gvResolutions[] = {cVector2l(640, 480), cVector2l(800, 600), cVector2l(1024, 768), cVector2l(1152, 864), cVector2l(1280, 720), cVector2l(1280, 768), cVector2l(1280, 800), cVector2l(1280, 960), cVector2l(1280, 1024), cVector2l(1360, 768), cVector2l(1360, 1024), cVector2l(1400, 1050), cVector2l(1440, 900), cVector2l(1680, 1050), cVector2l(1600, 1200), cVector2l(1920, 1080), cVector2l(1920, 1200)}; int glResolutionNum = 17; constexpr const char *gvTextureQuality[] = {"High", "Medium", "Low"}; constexpr int glTextureQualityNum = 3; constexpr const char *gvShaderQuality[] = {"Very Low", "Low", "Medium", "High"}; constexpr int glShaderQualityNum = 4; cMainMenuWidget_Text *gpNoiseFilterText = NULL; //------------------------------------------------------------ class cMainMenuWidget_Gamma : public cMainMenuWidget_Button { public: cMainMenuWidget_Gamma(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment, int alGNum) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mfMax = 3.0f; mfMin = 0.1f; mfStep = 0.1f; mlGNum = alGNum; msTip = kTranslate("MainMenu", "TipGraphicsGamma"); } void OnMouseDown(eMButton aButton) { mfGamma = mpInit->mpGame->GetGraphics()->GetLowLevel()->GetGammaCorrection(); if (aButton == eMButton_Left) { mfGamma += mfStep; if (mfGamma > mfMax) mfGamma = mfMax; } else if (aButton == eMButton_Right) { mfGamma -= mfStep; if (mfGamma < mfMin) mfGamma = mfMin; } mpInit->mpGame->GetGraphics()->GetLowLevel()->SetGammaCorrection(mfGamma); char sTempVec[256]; snprintf(sTempVec, 256, "%.1f", mfGamma); gpGammaText->msText = cString::To16Char(sTempVec); if (mlGNum == 1) gpGammaText2->msText = cString::To16Char(sTempVec); } float mfGamma; float mfMax; float mfMin; float mfStep; int mlGNum; }; //------------------------------------------------------------ class cMainMenuWidget_NoiseFilter : public cMainMenuWidget_Button { public: cMainMenuWidget_NoiseFilter(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsNoiseFilter"); } void OnMouseDown(eMButton aButton) { bool bX = mpInit->mpPlayer->GetNoiseFilter()->IsActive(); mpInit->mpPlayer->GetNoiseFilter()->SetActive(!bX); gpNoiseFilterText->msText = mpInit->mpPlayer->GetNoiseFilter()->IsActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; //------------------------------------------------------------ constexpr const char *gvShadowTypes[] = {"On", "Only Static", "Off"}; class cMainMenuWidget_Shadows : public cMainMenuWidget_Button { public: cMainMenuWidget_Shadows(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mlCurrent = apInit->mpGame->GetGraphics()->GetRenderer3D()->GetShowShadows(); msTip = kTranslate("MainMenu", "TipGraphicsShadows"); } void OnMouseDown(eMButton aButton) { if (aButton == eMButton_Left) { mlCurrent++; if (mlCurrent >= 3) mlCurrent = 0; } else if (aButton == eMButton_Right) { mlCurrent--; if (mlCurrent < 0) mlCurrent = 2; } gpShadowsText->msText = kTranslate("MainMenu", gvShadowTypes[mlCurrent]); mpInit->mpGame->GetGraphics()->GetRenderer3D()->SetShowShadows((eRendererShowShadows)mlCurrent); } int mlCurrent; }; //------------------------------------------------------------ constexpr const char *gvTextureFilter[] = {"Bilinear", "Trilinear"}; class cMainMenuWidget_TextureFilter : public cMainMenuWidget_Button { public: cMainMenuWidget_TextureFilter(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mlCurrent = apInit->mpGame->GetResources()->GetMaterialManager()->GetTextureFilter(); msTip = kTranslate("MainMenu", "TipGraphicsTextureFilter"); } void OnMouseDown(eMButton aButton) { if (aButton == eMButton_Left) { mlCurrent--; if (mlCurrent < 0) mlCurrent = 1; } else if (aButton == eMButton_Right) { mlCurrent++; if (mlCurrent > 1) mlCurrent = 0; } gpTextureFilterText->msText = kTranslate("MainMenu", gvTextureFilter[mlCurrent]); mpInit->mpGame->GetResources()->GetMaterialManager()->SetTextureFilter((eTextureFilter)mlCurrent); } int mlCurrent; }; //------------------------------------------------------------ class cMainMenuWidget_TextureAnisotropy : public cMainMenuWidget_Button { public: cMainMenuWidget_TextureAnisotropy(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mlMax = mpInit->mpGame->GetGraphics()->GetLowLevel()->GetCaps(eGraphicCaps_MaxAnisotropicFiltering); msTip = kTranslate("MainMenu", "TipGraphicsTextureAnisotropy"); } void OnMouseDown(eMButton aButton) { int lX = (int)mpInit->mpGame->GetResources()->GetMaterialManager()->GetTextureAnisotropy(); if (aButton == eMButton_Left) { lX *= 2; if (lX > mlMax) lX = 1; } else if (aButton == eMButton_Right) { lX /= 2; if (lX < 1) lX = mlMax; } if (lX != 1) gpTextureAnisotropyText->msText = cString::To16Char(cString::ToString(lX) + "x"); else gpTextureAnisotropyText->msText = kTranslate("MainMenu", "Off"); mpInit->mpGame->GetResources()->GetMaterialManager()->SetTextureAnisotropy((float)lX); } int mlMax; }; //------------------------------------------------------------ class cMainMenuWidget_FSAA : public cMainMenuWidget_Button { public: cMainMenuWidget_FSAA(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mlMax = 4; msTip = kTranslate("MainMenu", "TipGraphicsFSAA"); } void OnMouseDown(eMButton aButton) { int lX = mpInit->mlFSAA; if (aButton == eMButton_Left) { if (lX == 0) lX = 2; else lX *= 2; if (lX > mlMax) lX = 0; } else if (aButton == eMButton_Right) { if (lX == 2) lX = 0; else if (lX == 0) lX = -1; else lX /= 2; if (lX < 0) lX = mlMax; } if (lX != 0) gpFSAAText->msText = cString::To16Char(cString::ToString(lX) + "x"); else gpFSAAText->msText = kTranslate("MainMenu", "Off"); mpInit->mlFSAA = lX; gbMustRestart = true; } int mlMax; int mlCurrent; }; class cMainMenuWidget_DOF : public cMainMenuWidget_Button { public: cMainMenuWidget_DOF(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsDOF"); } void OnMouseDown(eMButton aButton) { bool bX = mpInit->mpEffectHandler->GetDepthOfField()->IsDisabled(); mpInit->mpEffectHandler->GetDepthOfField()->SetDisabled(!bX); gpDoFText->msText = bX ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; //------------------------------------------------------------ class cMainMenuWidget_ShaderQuality : public cMainMenuWidget_Button { public: cMainMenuWidget_ShaderQuality(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsShaderQuality"); } void OnMouseDown(eMButton aButton) { if (!Hpl1::areShadersAvailable()) return; int lCurrent = iMaterial::GetQuality(); if (aButton == eMButton_Left) { lCurrent++; if (lCurrent >= glShaderQualityNum) lCurrent = 0; } else if (aButton == eMButton_Right) { lCurrent--; if (lCurrent < 0) lCurrent = glShaderQualityNum - 1; } gpShaderQualityText->msText = kTranslate("MainMenu", gvShaderQuality[lCurrent]); iMaterial::SetQuality((eMaterialQuality)lCurrent); if (mpInit->mpMapHandler->GetCurrentMapName() != "") gbMustRestart = true; } }; //------------------------------------------------------------ class cMainMenuWidget_TextureQuality : public cMainMenuWidget_Button { public: cMainMenuWidget_TextureQuality(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mlCurrent = apInit->mpGame->GetResources()->GetMaterialManager()->GetTextureSizeLevel(); msTip = kTranslate("MainMenu", "TipGraphicsTextureQuality"); } void OnMouseDown(eMButton aButton) { if (aButton == eMButton_Right) { mlCurrent++; if (mlCurrent >= glTextureQualityNum) mlCurrent = 0; } else if (aButton == eMButton_Left) { mlCurrent--; if (mlCurrent < 0) mlCurrent = glTextureQualityNum - 1; } gpTextureQualityText->msText = kTranslate("MainMenu", gvTextureQuality[mlCurrent]); mpInit->mpGame->GetResources()->GetMaterialManager()->SetTextureSizeLevel(mlCurrent); gbMustRestart = true; } int mlCurrent; }; //------------------------------------------------------------ class cMainMenuWidget_Resolution : public cMainMenuWidget_Button { public: cMainMenuWidget_Resolution(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsResolution"); } void OnMouseDown(eMButton aButton) { int lCurrentNum = 0; // get current num for (int i = 0; i < glResolutionNum; ++i) { if (gvResolutions[i] == mpInit->mvScreenSize) { lCurrentNum = i; break; } } if (aButton == eMButton_Left) { lCurrentNum++; if (lCurrentNum >= glResolutionNum) lCurrentNum = 0; } else if (aButton == eMButton_Right) { lCurrentNum--; if (lCurrentNum < 0) lCurrentNum = glResolutionNum - 1; } mpInit->mvScreenSize = gvResolutions[lCurrentNum]; char sTempVec[256]; snprintf(sTempVec, 256, "%d x %d", mpInit->mvScreenSize.x, mpInit->mvScreenSize.y); gpResolutionText->msText = cString::To16Char(sTempVec); gbMustRestart = true; } }; //----------------------------------------------------------- class cMainMenuWidget_PostEffects : public cMainMenuWidget_Button { public: cMainMenuWidget_PostEffects(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsPostEffects"); } void OnMouseDown(eMButton aButton) { bool bX = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetActive(); mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->SetActive(!bX); mpInit->mbPostEffects = !bX; gpPostEffectsText->msText = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; //----------------------------------------------------------- class cMainMenuWidget_Bloom : public cMainMenuWidget_Button { public: cMainMenuWidget_Bloom(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsBloom"); } void OnMouseDown(eMButton aButton) { bool bX = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetBloomActive(); mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->SetBloomActive(!bX); gpBloomText->msText = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetBloomActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; //------------------------------------------------------------ class cMainMenuWidget_MotionBlur : public cMainMenuWidget_Button { public: cMainMenuWidget_MotionBlur(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsMotionBlur"); } void OnMouseDown(eMButton aButton) { bool bX = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetMotionBlurActive(); mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->SetMotionBlurActive(!bX); gpMotionBlurText->msText = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetMotionBlurActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); } }; //------------------------------------------------------------ class cMainMenuWidget_GfxBack : public cMainMenuWidget_Button { public: cMainMenuWidget_GfxBack(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { } void OnMouseDown(eMButton aButton) { mpInit->mpGame->GetSound()->GetSoundHandler()->PlayGui("gui_menu_click", false, 1); if (gbMustRestart) { mpInit->mpMainMenu->SetState(eMainMenuState_GraphicsRestart); gbMustRestart = false; } else { mpInit->mpMainMenu->SetState(eMainMenuState_Options); } } }; ////////////////////////////////////////////////////////////////////////// // OPTIONS KEY CONFIG ////////////////////////////////////////////////////////////////////////// class cMainMenuWidget_KeyButton : public cMainMenuWidget_Button { public: cMainMenuWidget_KeyButton(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment, cMainMenuWidget_Text *apKeyWiget, const tString &asActionName) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { mpKeyWidget = apKeyWiget; msActionName = asActionName; iAction *pAction = mpInit->mpGame->GetInput()->GetAction(asActionName); if (pAction) { tString sKeyName = pAction->GetInputName(); mpKeyWidget->msText = kTranslate("ButtonNames", sKeyName); // If translation is missing, set to default if (mpKeyWidget->msText == _W("")) mpKeyWidget->msText = cString::To16Char(sKeyName); } else { mpKeyWidget->msText = kTranslate("MainMenu", "Empty"); // FatalError("Action for %s button does not exist!\n",msText.c_str()); } mpKeyWidget->SetExtraWidget(this); mpKeyWidget->UpdateSize(); } void OnMouseDown(eMButton aButton) { mpKeyWidget->msText = _W("....."); mpInit->mpMainMenu->SetInputToAction(msActionName, mpKeyWidget); } void Reset() { iAction *pAction = mpInit->mpGame->GetInput()->GetAction(msActionName); if (pAction) { tString sKeyName = pAction->GetInputName(); mpKeyWidget->msText = kTranslate("ButtonNames", sKeyName); // If translation is missing, set to default if (mpKeyWidget->msText == _W("")) mpKeyWidget->msText = cString::To16Char(sKeyName); mpKeyWidget->UpdateSize(); } else { mpKeyWidget->msText = kTranslate("MainMenu", "Empty"); } } private: cMainMenuWidget_Text *mpKeyWidget; tString msActionName; }; //------------------------------------------------------------ class cMainMenuWidget_KeyReset : public cMainMenuWidget_Button { public: cMainMenuWidget_KeyReset(cInit *apInit, const cVector3f &avPos, const tWString &asText, cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit, avPos, asText, eMainMenuState_LastEnum, avFontSize, aAlignment) { } void OnMouseDown(eMButton aButton) { // Log("Setting deafult keys!\n"); mpInit->mpButtonHandler->SetDefaultKeys(); mpInit->mpMainMenu->ResetWidgets(eMainMenuState_OptionsKeySetupMove); mpInit->mpMainMenu->ResetWidgets(eMainMenuState_OptionsKeySetupAction); mpInit->mpMainMenu->ResetWidgets(eMainMenuState_OptionsKeySetupMisc); } private: // cMainMenuWidget_Text *mpKeyWidget; tString msActionName; }; //------------------------------------------------------------ ////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenu::cMainMenu(cInit *apInit) : iUpdateable("MainMenu") { gvSaveGameFileVec = new tWStringVec[3]; mState = eMainMenuState_Start; mpLogo = NULL; mpBackground = NULL; mpInit = apInit; mpDrawer = mpInit->mpGame->GetGraphics()->GetDrawer(); // Load graphics mpGfxBlackQuad = mpDrawer->CreateGfxObject("effect_black.bmp", "diffalpha2d"); mpGfxMouse = mpDrawer->CreateGfxObject("player_crosshair_pointer.bmp", "diffalpha2d"); mpGfxRainDrop = mpDrawer->CreateGfxObject("menu_rain_drop.jpg", "diffadditive2d"); mpGfxRainSplash = mpDrawer->CreateGfxObject("menu_rain_splash.jpg", "diffadditive2d"); mpGfxSnowFlake = mpDrawer->CreateGfxObject("menu_snow_flake.jpg", "diffadditive2d"); // Init effects mvRainDrops.resize(70); mvRainSplashes.resize(180); for (size_t i = 0; i < mvRainSplashes.size(); ++i) { mvRainSplashes[i].mCol = cColor(1, 0); mvRainSplashes[i].mpGfx = mpGfxRainSplash; } for (size_t i = 0; i < mvRainDrops.size(); ++i) { mvRainDrops[i].mCol = cColor(1, 0); mvRainDrops[i].mpGfx = mpGfxRainDrop; } mvSnowFlakes.resize(80); for (size_t i = 0; i < mvSnowFlakes.size(); ++i) { mvSnowFlakes[i].mvPos = cVector3f(cMath::RandRectf(350, 800), cMath::RandRectf(200, 550), 20); mvSnowFlakes[i].mvVel = cVector3f(0, cMath::RandRectf(15, 40), 0); mvSnowFlakes[i].mvSize = cMath::RandRectf(2, 10); mvSnowFlakes[i].mpGfx = mpGfxSnowFlake; } // load fonts mpFont = mpInit->mpGame->GetResources()->GetFontManager()->CreateFontData("font_menu_small.fnt", 20, 32, 255); mpTipFont = mpInit->mpGame->GetResources()->GetFontManager()->CreateFontData("verdana.fnt"); ////////////////////////////////// // Init widgets mvState.resize(eMainMenuState_LastEnum); Reset(); } //----------------------------------------------------------------------- cMainMenu::~cMainMenu(void) { STLDeleteAll(mlstWidgets); delete[] gvSaveGameFileVec; mpDrawer->DestroyGfxObject(mpGfxBlackQuad); mpDrawer->DestroyGfxObject(mpGfxMouse); mpDrawer->DestroyGfxObject(mpGfxRainDrop); mpDrawer->DestroyGfxObject(mpGfxRainSplash); mpDrawer->DestroyGfxObject(mpGfxSnowFlake); if (mpLogo) mpInit->mpGame->GetResources()->GetTextureManager()->Destroy(mpLogo); if (mpBackground) mpInit->mpGame->GetResources()->GetTextureManager()->Destroy(mpBackground); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // PUBLIC METHODS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- void cMainMenu::Reset() { mbActive = false; mbFadeIn = false; mfAlpha = 0; mfFadeAmount = 0; mbMouseIsDown = false; mbUpdateWidgets = false; mpCurrentActionText = NULL; mbGameActive = false; // Effects: mfRainDropCount = 0; } //----------------------------------------------------------------------- void cMainMenu::OnPostSceneDraw() { mpInit->mpGraphicsHelper->ClearScreen(cColor(0, 0)); mpInit->mpGraphicsHelper->DrawTexture(mpLogo, 0, cVector3f(800, 180, 30), cColor(1, 1)); mpInit->mpGraphicsHelper->DrawTexture(mpBackground, cVector3f(0, 180, 0), cVector3f(800, 420, 0), cColor(1, 1)); //////////////////////////////// // Fade in if (mbFadeIn) { mpDrawer->DrawGfxObject(mpGfxBlackQuad, cVector3f(0, 0, 120), cVector2f(800, 600), cColor(1, 1 - mfFadeAmount)); } } //----------------------------------------------------------------------- void cMainMenu::OnDraw() { //////////////////////////////// // Draw widgets tMainMenuWidgetListIt it = mlstWidgets.begin(); for (; it != mlstWidgets.end(); ++it) { cMainMenuWidget *pWidget = *it; if (pWidget->IsActive()) pWidget->OnDraw(); } DrawBackground(); //////////////////////////// // Draw tip if (msButtonTip != _W("")) { mpTipFont->drawWordWrap(cVector3f(10, 570, 150), 780, 13, 12, cColor(1, 1), eFontAlign_Left, msButtonTip); } //////////////////////////////// // Draw mouse if (mpCurrentActionText) return; cResourceImage *pImage = mpGfxMouse->GetMaterial()->GetImage(eMaterialTexture_Diffuse); cVector2l vSize = pImage->GetSize(); cVector2f vPosAdd(((float)vSize.x) / 2.0f, ((float)vSize.y) / 2.0f); mpDrawer->DrawGfxObject(mpGfxMouse, cVector3f(0, 0, 100) + (mvMousePos - vPosAdd)); } //----------------------------------------------------------------------- static void DrawParticle(cGraphicsDrawer *apDrawer, cMainMenuParticle *apParticle) { apDrawer->DrawGfxObject(apParticle->mpGfx, apParticle->mvPos - apParticle->mvSize / 2, apParticle->mvSize, apParticle->mCol); } void cMainMenu::DrawBackground() { if (mbGameActive) { for (size_t i = 0; i < mvSnowFlakes.size(); ++i) DrawParticle(mpDrawer, &mvSnowFlakes[i]); } else { for (size_t i = 0; i < mvRainDrops.size(); ++i) DrawParticle(mpDrawer, &mvRainDrops[i]); for (size_t i = 0; i < mvRainSplashes.size(); ++i) DrawParticle(mpDrawer, &mvRainSplashes[i]); } } //----------------------------------------------------------------------- void cMainMenu::Update(float afTimeStep) { if (mbFadeIn) { if (mfFadeAmount < 1) mfFadeAmount += 0.5f * afTimeStep; else { mbFadeIn = false; mfFadeAmount = 0; } } if (mbUpdateWidgets) { mbUpdateWidgets = false; CreateWidgets(); SetState(mState); } if (mpCurrentActionText) { cInput *pInput = mpInit->mpGame->GetInput(); if (CheckForInput()) { // Log("Creating action '%s'\n",msCurrentActionName.c_str()); iAction *pAction = pInput->InputToAction(msCurrentActionName); mpCurrentActionText->msText = kTranslate("ButtonNames", pAction->GetInputName()); // If translation is missing, set to default if (mpCurrentActionText->msText == _W("")) mpCurrentActionText->msText = cString::To16Char(pAction->GetInputName()); mpCurrentActionText->UpdateSize(); tString sAction = mpInit->mpButtonHandler->GetActionName(pAction->GetInputName(), msCurrentActionName); if (sAction != "") { pInput->DestroyAction(sAction); mpInit->mpMainMenu->ResetWidgets(eMainMenuState_OptionsKeySetupMove); mpInit->mpMainMenu->ResetWidgets(eMainMenuState_OptionsKeySetupAction); mpInit->mpMainMenu->ResetWidgets(eMainMenuState_OptionsKeySetupMisc); } mpCurrentActionText = NULL; Log("Reset check for input!\n"); } } else { } //////////////////////////////// // Update effect if (mbGameActive) { for (size_t i = 0; i < mvSnowFlakes.size(); ++i) { cMainMenuParticle &flake = mvSnowFlakes[i]; if (flake.mvPos.y >= 600 - (150 - mvSnowFlakes[i].mvSize.x * 15)) { mvSnowFlakes[i].mvPos = cVector3f(cMath::RandRectf(350, 800), 200, 20); mvSnowFlakes[i].mvVel = cVector3f(0, cMath::RandRectf(15, 40), 0); mvSnowFlakes[i].mvSize = cMath::RandRectf(2, 10); } flake.mvPos += flake.mvVel * afTimeStep; flake.mvVel.x += cMath::RandRectf(-2, 2); if (flake.mvVel.x < -25) flake.mvVel.x = -25; if (flake.mvVel.x > 25) flake.mvVel.x = 25; float fDist = cMath::Vector3Dist(flake.mvPos, cVector3f(550, 550, 20)); float fAlpha = 1 - fDist / 380; if (fAlpha < 0) fAlpha = 0; flake.mCol = cColor(1, fAlpha); } } else { // Rainsplashes for (size_t i = 0; i < mvRainSplashes.size(); ++i) { cMainMenuParticle &splash = mvRainSplashes[i]; if (splash.mCol.a <= 0) { splash.mCol.a = 1; float fX, fY; if (i < 120) { fX = cMath::RandRectf(400, 700); fY = cMath::RandRectf(500, 550); } else if (i < 140) { fX = cMath::RandRectf(480, 605); fY = cMath::RandRectf(278, 320); } else if (i < 160) { fX = cMath::RandRectf(360, 460); fY = cMath::RandRectf(288, 330); } else { fX = cMath::RandRectf(615, 760); fY = cMath::RandRectf(258, 310); } splash.mvPos = cVector3f(fX, fY, 20); splash.mvSize = cMath::RandRectf(3, 16); splash.mpGfx = mpGfxRainSplash; splash.mvVel.x = cMath::RandRectf(1, 5); } else { splash.mCol.a -= afTimeStep * splash.mvVel.x; if (splash.mCol.a < 0) splash.mCol.a = 0; } } // Rain drops if (mfRainDropCount <= 0) { for (size_t i = 0; i < mvRainDrops.size(); ++i) { float fX = cMath::RandRectf(150, 800); float fY = cMath::RandRectf(180, 600); mvRainDrops[i].mvPos = cVector3f(fX, fY, 20); mvRainDrops[i].mvSize = cMath::RandRectf(28, 34); float fDist = cMath::Vector3Dist(mvRainDrops[i].mvPos, cVector3f(550, 400, 20)); float fAlpha = 1 - fDist / 380; if (fAlpha < 0) fAlpha = 0; mvRainDrops[i].mCol = cColor(1, fAlpha); mvRainDrops[i].mpGfx = mpGfxRainDrop; } mfRainDropCount = 1.0f / 37.0f; } else { mfRainDropCount -= afTimeStep; } } //////////////////////////////// // Update buttons msButtonTip = _W(""); tMainMenuWidgetListIt it = mlstWidgets.begin(); for (; it != mlstWidgets.end(); ++it) { cMainMenuWidget *pWidget = *it; if (pWidget->IsActive()) pWidget->OnUpdate(afTimeStep); if (cMath::PointBoxCollision(mvMousePos, pWidget->GetRect())) { if (pWidget->IsActive()) pWidget->OnMouseOver(true); } else { if (pWidget->IsActive()) pWidget->OnMouseOver(false); } } } //----------------------------------------------------------------------- void cMainMenu::AddMousePos(const cVector2f &avRel) { if (mpCurrentActionText) return; mvMousePos += avRel; if (mvMousePos.x < 0) mvMousePos.x = 0; if (mvMousePos.x >= 800) mvMousePos.x = 800; if (mvMousePos.y < 0) mvMousePos.y = 0; if (mvMousePos.y >= 600) mvMousePos.y = 600; } void cMainMenu::SetMousePos(const cVector2f &avPos) { if (mpCurrentActionText) return; mvMousePos = avPos; } //----------------------------------------------------------------------- void cMainMenu::OnMouseDown(eMButton aButton) { if (mpCurrentActionText) return; //////////////////////////////// // Update buttons tMainMenuWidgetListIt it = mlstWidgets.begin(); for (; it != mlstWidgets.end(); ++it) { cMainMenuWidget *pWidget = *it; if (cMath::PointBoxCollision(mvMousePos, pWidget->GetRect())) { if (pWidget->IsActive()) { pWidget->OnMouseDown(aButton); break; } } } mbMouseIsDown = true; } void cMainMenu::OnMouseUp(eMButton aButton) { if (mpCurrentActionText) return; //////////////////////////////// // Update buttons tMainMenuWidgetListIt it = mlstWidgets.begin(); for (; it != mlstWidgets.end(); ++it) { cMainMenuWidget *pWidget = *it; if (cMath::PointBoxCollision(mvMousePos, pWidget->GetRect())) { if (pWidget->IsActive()) pWidget->OnMouseUp(aButton); } } mbMouseIsDown = false; } //----------------------------------------------------------------------- void cMainMenu::OnMouseDoubleClick(eMButton aButton) { if (mpCurrentActionText) return; //////////////////////////////// // Update buttons tMainMenuWidgetListIt it = mlstWidgets.begin(); for (; it != mlstWidgets.end(); ++it) { cMainMenuWidget *pWidget = *it; if (cMath::PointBoxCollision(mvMousePos, pWidget->GetRect())) { if (pWidget->IsActive()) pWidget->OnDoubleClick(aButton); } } mbMouseIsDown = false; } //----------------------------------------------------------------------- void cMainMenu::SetActive(bool abX) { if (mbActive == abX) return; mbActive = abX; if (mbActive) { if (!mpInit->mbFullScreen) { mpInit->mpGame->GetInput()->GetLowLevel()->LockInput(false); } mpInit->mpGame->GetUpdater()->SetContainer("MainMenu"); mpInit->mpGame->GetScene()->SetDrawScene(false); mpInit->mpGame->GetScene()->SetUpdateMap(false); mpInit->mpButtonHandler->ChangeState(eButtonHandlerState_MainMenu); /////////////////////////////// // Init menu CreateWidgets(); cSoundHandler *pSoundHandler = mpInit->mpGame->GetSound()->GetSoundHandler(); if (mpInit->mpMapHandler->GetCurrentMapName() != "") { mpInit->mpGame->GetSound()->GetSoundHandler()->PauseAll(eSoundDest_World | eSoundDest_Gui); mpInit->mpGame->GetSound()->GetMusicHandler()->Pause(); mbGameActive = true; pSoundHandler->PlayGui("gui_wind1", true, 1); } else { mpInit->mpGame->GetSound()->GetMusicHandler()->Play("music_theme.ogg", 1, 5.0f, false); if (pSoundHandler->IsPlaying("gui_rain1") == false) pSoundHandler->PlayGui("gui_rain1", true, 1); mbGameActive = false; mbFadeIn = true; } bool bFirstStart = mpInit->_firstStart; if (bFirstStart) { SetState(eMainMenuState_FirstStart); mLastState = eMainMenuState_FirstStart; mpInit->_firstStart = false; } else { SetState(eMainMenuState_Start); mLastState = eMainMenuState_Start; } gbMustRestart = false; mpCurrentActionText = NULL; mpLogo = mpInit->mpGame->GetResources()->GetTextureManager()->Create2D("menu_logo.jpg", false); if (mbGameActive) mpBackground = mpInit->mpGame->GetResources()->GetTextureManager()->Create2D("menu_background_ingame.jpg", false); else mpBackground = mpInit->mpGame->GetResources()->GetTextureManager()->Create2D("menu_background.jpg", false); } else { if (!mpInit->mbFullScreen) { mpInit->mpGame->GetInput()->GetLowLevel()->LockInput(true); } cSoundHandler *pSoundHandler = mpInit->mpGame->GetSound()->GetSoundHandler(); if (mpInit->mpMapHandler->GetCurrentMapName() != "") { if (pSoundHandler->IsPlaying("gui_wind1")) pSoundHandler->Stop("gui_wind1"); pSoundHandler->ResumeAll(eSoundDest_World | eSoundDest_Gui); mpInit->mpGame->GetSound()->GetMusicHandler()->Resume(); } else { if (pSoundHandler->IsPlaying("gui_rain1")) pSoundHandler->Stop("gui_rain1"); mpInit->mpGame->GetSound()->GetMusicHandler()->Stop(0.3f); } mpInit->mpGame->GetUpdater()->SetContainer("Default"); mpInit->mpGame->GetScene()->SetDrawScene(true); mpInit->mpGame->GetScene()->SetUpdateMap(true); mpInit->mpButtonHandler->ChangeState(eButtonHandlerState_Game); if (mpLogo) mpInit->mpGame->GetResources()->GetTextureManager()->Destroy(mpLogo); mpLogo = NULL; if (mpBackground) mpInit->mpGame->GetResources()->GetTextureManager()->Destroy(mpBackground); mpBackground = NULL; } } //----------------------------------------------------------------------- void cMainMenu::Exit() { if (mpCurrentActionText) { mpCurrentActionText = NULL; } else if (mState == eMainMenuState_Start && mpInit->mpMapHandler->GetCurrentMapName() != "") { SetActive(false); } else if ((mState == eMainMenuState_OptionsGraphics || mState == eMainMenuState_OptionsSound || mState == eMainMenuState_OptionsGame) && gbMustRestart) { SetState(eMainMenuState_GraphicsRestart); mpInit->mpGame->GetSound()->GetSoundHandler()->PlayGui("gui_menu_click", false, 1); gbMustRestart = false; } else { SetState(gvMenuBackStates[mState]); mpInit->mpGame->GetSound()->GetSoundHandler()->PlayGui("gui_menu_click", false, 1); } } //----------------------------------------------------------------------- void cMainMenu::OnExit() { SetActive(false); } //----------------------------------------------------------------------- void cMainMenu::SetState(eMainMenuState aState) { mLastState = mState; mState = aState; // Set all widgets as not active. tMainMenuWidgetListIt it = mlstWidgets.begin(); for (; it != mlstWidgets.end(); ++it) { cMainMenuWidget *pWidget = *it; pWidget->SetActive(false); } // Set all widgets for current state as active. it = mvState[aState].begin(); for (; it != mvState[aState].end(); ++it) { cMainMenuWidget *pWidget = *it; pWidget->SetActive(true); } } //----------------------------------------------------------------------- void cMainMenu::SetInputToAction(const tString &asActionName, cMainMenuWidget_Text *apText) { msCurrentActionName = asActionName; mpCurrentActionText = apText; InitCheckInput(); } //----------------------------------------------------------------------- void cMainMenu::InitCheckInput() { cInput *pInput = mpInit->mpGame->GetInput(); for (int i = 0; i < Common::KEYCODE_LAST; ++i) { mvKeyPressed[i] = pInput->GetKeyboard()->KeyIsDown(static_cast(i)); } for (int i = 0; i < eMButton_LastEnum; ++i) { mvMousePressed[i] = pInput->GetMouse()->ButtonIsDown((eMButton)i); } } //----------------------------------------------------------------------- bool cMainMenu::CheckForInput() { cInput *pInput = mpInit->mpGame->GetInput(); //////////////////// // Keyboard for (int i = 0; i < Common::KEYCODE_LAST; ++i) { if (pInput->GetKeyboard()->KeyIsDown(static_cast(i))) { if (mvKeyPressed[i] == false) return true; } else { mvKeyPressed[i] = false; } } //////////////////// // Mouse for (int i = 0; i < eMButton_LastEnum; ++i) { if (pInput->GetMouse()->ButtonIsDown((eMButton)i)) { if (mvMousePressed[i] == false) return true; } else { mvMousePressed[i] = false; } } return false; } //----------------------------------------------------------------------- void cMainMenu::ResetWidgets(eMainMenuState aState) { tMainMenuWidgetListIt it = mvState[aState].begin(); for (; it != mvState[aState].end(); ++it) { cMainMenuWidget *pWidget = *it; pWidget->Reset(); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // PRIVATE METHODS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- class cTempFileAndData { public: cTempFileAndData(const tWString &asFile, const cDate &aDate) { msFile = asFile; mDate = aDate; } bool operator<(const cTempFileAndData &aA) const { return mDate < aA.mDate; } bool operator>(const cTempFileAndData &aA) const { return mDate > aA.mDate; } bool operator==(const cTempFileAndData &aA) const { return mDate == aA.mDate; } tWString msFile; cDate mDate; }; typedef Hpl1::Std::set > tTempFileAndDataSet; typedef tTempFileAndDataSet::iterator tTempFileAndDataSetIt; //----------------------------------------------------------------------- void cMainMenu::CreateWidgets() { cVector3f vPos; tWString sText; cMainMenuWidget_Text *pTempTextWidget; char sTempVec[256]; cVector3f vTextStart(220, 230, 40); /////////////////////////////// // Erase all previous STLDeleteAll(mlstWidgets); for (size_t i = 0; i < eMainMenuState_LastEnum; ++i) mvState[i].clear(); /////////////////////////////// // First start ////////////////////////////// bool bFirstStart = mpInit->_firstStart; if (bFirstStart) { vPos = cVector3f(40, 190, 40); AddWidgetToState(eMainMenuState_FirstStart, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "Welcome"), 15, eFontAlign_Left))); vPos.y += 18; AddWidgetToState(eMainMenuState_FirstStart, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "Too Improve"), 15, eFontAlign_Left))); vPos.y += 28; AddWidgetToState(eMainMenuState_FirstStart, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "StartTip1"), 15, eFontAlign_Left))); vPos.y += 18; AddWidgetToState(eMainMenuState_FirstStart, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "StartTip2"), 15, eFontAlign_Left))); vPos.y += 18; AddWidgetToState(eMainMenuState_FirstStart, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "StartTip3"), 15, eFontAlign_Left))); vPos.y += 28; vPos.x = 395; cMainMenuWidget *pGammaFirstButton = hplNew(cMainMenuWidget_Gamma, (mpInit, vPos, kTranslate("MainMenu", "Gamma:"), 20, eFontAlign_Right, 1)); AddWidgetToState(eMainMenuState_FirstStart, pGammaFirstButton); vPos.x = 405; snprintf(sTempVec, 256, "%.1f", mpInit->mpGame->GetGraphics()->GetLowLevel()->GetGammaCorrection()); sText = cString::To16Char(sTempVec); gpGammaText2 = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_FirstStart, gpGammaText2); gpGammaText2->SetExtraWidget(pGammaFirstButton); vPos.y += 31; AddWidgetToState(eMainMenuState_FirstStart, hplNew(cMainMenuWidget_Image, (mpInit, cVector3f(250, vPos.y, 30), cVector2f(300, 200), "menu_gamma.bmp", "diffalpha2d", cColor(1, 1)))); vPos.y += 205; // AddWidgetToState(eMainMenuState_FirstStart,hplNew( cMainMenuWidget_Text(mpInit,vPos,kTranslate("MainMenu", "StartTip4"),15,eFontAlign_Left)); // vPos.y += 28; AddWidgetToState(eMainMenuState_FirstStart, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "OK"), eMainMenuState_Start, 20, eFontAlign_Center))); } /////////////////////////////// // Start menu: ////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); if (mpInit->mpMapHandler->GetCurrentMapName() != "") { AddWidgetToState(eMainMenuState_Start, hplNew(cMainMenuWidget_Resume, (mpInit, vPos, kTranslate("MainMenu", "Resume")))); vPos.y += 60; } else { tWString latestSave = mpInit->mpSaveHandler->GetLatest(_W("????:*")); if (latestSave != _W("")) { AddWidgetToState(eMainMenuState_Start, hplNew(cMainMenuWidget_MainButton, (mpInit, vPos, kTranslate("MainMenu", "Continue"), eMainMenuState_Continue))); vPos.y += 51; } } AddWidgetToState(eMainMenuState_Start, hplNew(cMainMenuWidget_MainButton, (mpInit, vPos, kTranslate("MainMenu", "New Game"), eMainMenuState_NewGame))); vPos.y += 51; AddWidgetToState(eMainMenuState_Start, hplNew(cMainMenuWidget_MainButton, (mpInit, vPos, kTranslate("MainMenu", "Load Game"), eMainMenuState_LoadGameSpot))); vPos.y += 51; AddWidgetToState(eMainMenuState_Start, hplNew(cMainMenuWidget_MainButton, (mpInit, vPos, kTranslate("MainMenu", "Options"), eMainMenuState_Options))); vPos.y += 51; AddWidgetToState(eMainMenuState_Start, hplNew(cMainMenuWidget_MainButton, (mpInit, vPos, kTranslate("MainMenu", "Exit"), eMainMenuState_Exit))); /////////////////////////////////// // New Game /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); // AddWidgetToState(eMainMenuState_NewGame,hplNew( cMainMenuWidget_Text(mpInit,vPos,kTranslate("MainMenu","StartNewGame"),24,eFontAlign_Center)); // vPos.y += 34; AddWidgetToState(eMainMenuState_NewGame, hplNew(cMainMenuWidget_NewGame, (mpInit, vPos, kTranslate("MainMenu", "Easy"), 24, eFontAlign_Center, eGameDifficulty_Easy))); vPos.y += 30; AddWidgetToState(eMainMenuState_NewGame, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "EasyDesc"), 16, eFontAlign_Center))); vPos.y += 42; AddWidgetToState(eMainMenuState_NewGame, hplNew(cMainMenuWidget_NewGame, (mpInit, vPos, kTranslate("MainMenu", "Normal"), 24, eFontAlign_Center, eGameDifficulty_Normal))); vPos.y += 30; AddWidgetToState(eMainMenuState_NewGame, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "NormalDesc"), 16, eFontAlign_Center))); vPos.y += 42; AddWidgetToState(eMainMenuState_NewGame, hplNew(cMainMenuWidget_NewGame, (mpInit, vPos, kTranslate("MainMenu", "Hard"), 24, eFontAlign_Center, eGameDifficulty_Hard))); vPos.y += 30; AddWidgetToState(eMainMenuState_NewGame, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "HardDesc"), 16, eFontAlign_Center))); vPos.y += 46; AddWidgetToState(eMainMenuState_NewGame, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Back"), eMainMenuState_Start, 22, eFontAlign_Center))); /////////////////////////////////// // Continue /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); AddWidgetToState(eMainMenuState_Continue, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "ContinueLastSave"), 20, eFontAlign_Center))); vPos.y += 34; AddWidgetToState(eMainMenuState_Continue, hplNew(cMainMenuWidget_Continue, (mpInit, vPos, kTranslate("MainMenu", "Yes"), 20, eFontAlign_Center))); vPos.y += 29; AddWidgetToState(eMainMenuState_Continue, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "No"), eMainMenuState_Start, 20, eFontAlign_Center))); /////////////////////////////////// // Load Game /////////////////////////////////// for (size_t i = 0; i < 3; ++i) { vPos = vTextStart; // cVector3f(400, 260, 40); eMainMenuState state = (eMainMenuState)(eMainMenuState_LoadGameSpot + i); /////////////////////////// // Head AddWidgetToState(state, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "Load Game"), 27, eFontAlign_Center))); vPos.y += 42; vPos.x -= 110; /////////////////////////// // Buttons AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Saved Games"), eMainMenuState_LoadGameSpot, 25, eFontAlign_Center))); vPos.y += 32; AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Auto Saves"), eMainMenuState_LoadGameAuto, 25, eFontAlign_Center))); vPos.y += 32; AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Favorites"), eMainMenuState_LoadGameFavorite, 25, eFontAlign_Center))); /////////////////////////// // Back vPos.y += 150; vPos.x += 130; vPos.y += 32; AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Back"), eMainMenuState_Start, 23, eFontAlign_Center))); /////////////////////////// // Load type vPos = vTextStart; // cVector3f(400, 260, 40); vPos.y += 42; vPos.x += 185; tString sLoadType = "Saved Games"; if (i == 1) sLoadType = "Auto Saves"; if (i == 2) sLoadType = "Favorites"; AddWidgetToState(state, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", sLoadType) + _W(":"), 21, eFontAlign_Center))); /////////////////////////// // Saved games list // Set up vPos = vTextStart; // cVector3f(400, 260 , 40); vPos.y += 46 + 30; vPos.x += 15; tWString sDir("spot:"); if (i == 1) sDir = _W("auto:"); else if (i == 2) sDir = _W("favorite:"); gpSaveGameList[i] = hplNew(cMainMenuWidget_SaveGameList, ( mpInit, vPos, cVector2f(355, 170), 15, sDir, (int)i)); AddWidgetToState(state, gpSaveGameList[i]); tTempFileAndDataSet setTempFiles; Common::StringArray saves = Hpl1::g_engine->listInternalSaves(sDir + "*"); for (auto &s : saves) { tWString sFile = cString::To16Char(s.c_str()); cDate date = cSaveHandler::parseDate(s); setTempFiles.insert(cTempFileAndData(sFile, date)); } // Go through the sorted array and add to File vector and as list entries gvSaveGameFileVec[i].clear(); tTempFileAndDataSetIt dateIt = setTempFiles.begin(); for (; dateIt != setTempFiles.end(); ++dateIt) { const cTempFileAndData &temp = *dateIt; tWString sFile = temp.msFile; gvSaveGameFileVec[i].push_back(sFile); sFile = cString::SubW(sFile, sFile.find(':') + 1); gpSaveGameList[i]->AddEntry(sFile); // gpSaveGameList[i]->AddEntry(sFile); } /////////////////////////// // Save game buttons vPos.y += 170; vPos.x = vTextStart.x + 20; AddWidgetToState(state, hplNew(cMainMenuWidget_LoadSaveGame, (mpInit, vPos, kTranslate("MainMenu", "Load"), 17, eFontAlign_Left, sDir, (int)i))); vPos.x += 70; if (i != 2) AddWidgetToState(state, hplNew(cMainMenuWidget_FavoriteSaveGame, (mpInit, vPos, kTranslate("MainMenu", "Add To Favorites"), 17, eFontAlign_Left, (int)i))); vPos.x += 205; AddWidgetToState(state, hplNew(cMainMenuWidget_RemoveSaveGame, (mpInit, vPos, kTranslate("MainMenu", "Remove"), 17, eFontAlign_Left, sDir, (int)i))); } /////////////////////////////////// // Quit /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); AddWidgetToState(eMainMenuState_Exit, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "SureQuit"), 20, eFontAlign_Center))); vPos.y += 34; AddWidgetToState(eMainMenuState_Exit, hplNew(cMainMenuWidget_Quit, (mpInit, vPos, kTranslate("MainMenu", "Yes"), 20, eFontAlign_Center))); vPos.y += 29; AddWidgetToState(eMainMenuState_Exit, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "No"), eMainMenuState_Start, 20, eFontAlign_Center))); /////////////////////////////////// // Options /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); AddWidgetToState(eMainMenuState_Options, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Controls"), eMainMenuState_OptionsControls, 25, eFontAlign_Center))); vPos.y += 37; AddWidgetToState(eMainMenuState_Options, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Game"), eMainMenuState_OptionsGame, 25, eFontAlign_Center))); vPos.y += 37; AddWidgetToState(eMainMenuState_Options, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Graphics"), eMainMenuState_OptionsGraphics, 25, eFontAlign_Center))); vPos.y += 37; AddWidgetToState(eMainMenuState_Options, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Back"), eMainMenuState_Start, 25, eFontAlign_Center))); /////////////////////////////////// // Options Controls /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); // Head AddWidgetToState(eMainMenuState_OptionsControls, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "Controls"), 25, eFontAlign_Center))); vPos.y += 37; // Buttons cMainMenuWidget *pWidgetInvertMouseY = hplNew(cMainMenuWidget_InvertMouseY, (mpInit, vPos, kTranslate("MainMenu", "Invert Mouse Y:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsControls, pWidgetInvertMouseY); vPos.y += 29; cMainMenuWidget *pWidgetMouseSensitivity = hplNew(cMainMenuWidget_MouseSensitivity, (mpInit, vPos, kTranslate("MainMenu", "Mouse Sensitivity:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsControls, pWidgetMouseSensitivity); vPos.y += 29; cMainMenuWidget *pWidgetToggleCrouch = hplNew(cMainMenuWidget_ToggleCrouch, (mpInit, vPos, kTranslate("MainMenu", "Toggle Crouch:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsControls, pWidgetToggleCrouch); vPos.y += 29; // cMainMenuWidget *pWidgetChangeKeyConf = hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Change Key Mapping"), eMainMenuState_OptionsKeySetupMove, 20, eFontAlign_Center)); // AddWidgetToState(eMainMenuState_OptionsControls, pWidgetChangeKeyConf); // vPos.y += 35; AddWidgetToState(eMainMenuState_OptionsControls, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Back"), eMainMenuState_Options, 23, eFontAlign_Center))); // Text vPos = cVector3f(vTextStart.x + 12, vTextStart.y + 37, vTextStart.z); sText = mpInit->mpButtonHandler->mbInvertMouseY ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpInvertMouseYText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left, pWidgetInvertMouseY)); AddWidgetToState(eMainMenuState_OptionsControls, gpInvertMouseYText); vPos.y += 29; snprintf(sTempVec, 256, "%.1f", mpInit->mpButtonHandler->mfMouseSensitivity); sText = cString::To16Char(sTempVec); gpMouseSensitivityText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left, pWidgetMouseSensitivity)); AddWidgetToState(eMainMenuState_OptionsControls, gpMouseSensitivityText); vPos.y += 29; sText = mpInit->mpButtonHandler->mbToggleCrouch ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpToggleCrouchText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left, pWidgetToggleCrouch)); AddWidgetToState(eMainMenuState_OptionsControls, gpToggleCrouchText); /////////////////////////////////// // Options Key Setup General stuff /////////////////////////////////// for (int i = 0; i < 3; ++i) { eMainMenuState state = (eMainMenuState)(i + eMainMenuState_OptionsKeySetupMove); cVector3f vPos2 = vTextStart; // cVector3f(400, 260, 40); // Head AddWidgetToState(state, hplNew(cMainMenuWidget_Text, (mpInit, vPos2, kTranslate("MainMenu", "Configure Keys"), 25, eFontAlign_Center))); vPos2.y += 42; vPos2.x -= 110; // Buttons AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos2, kTranslate("MainMenu", "Movement"), eMainMenuState_OptionsKeySetupMove, 25, eFontAlign_Center))); vPos2.y += 32; AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos2, kTranslate("MainMenu", "Actions"), eMainMenuState_OptionsKeySetupAction, 25, eFontAlign_Center))); vPos2.y += 32; AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos2, kTranslate("MainMenu", "Misc"), eMainMenuState_OptionsKeySetupMisc, 25, eFontAlign_Center))); // Back vPos2.y += 150; vPos2.x += 130; AddWidgetToState(state, hplNew(cMainMenuWidget_KeyReset, (mpInit, vPos2, kTranslate("MainMenu", "Reset to defaults"), 23, eFontAlign_Center))); vPos2.y += 32; AddWidgetToState(state, hplNew(cMainMenuWidget_Button, (mpInit, vPos2, kTranslate("MainMenu", "Back"), eMainMenuState_OptionsControls, 23, eFontAlign_Center))); } /////////////////////////////////// // Options Key Setup Move /////////////////////////////////// cMainMenuWidget *pWidgetKeyButton; float fKeyTextXAdd = 195; // Key buttons /*cInput *pInput = */ mpInit->mpGame->GetInput(); vPos = vTextStart; // cVector3f(400, 260, 40); vPos.y += 46; vPos.x += 15; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Forward:"), 18, eFontAlign_Left, pTempTextWidget, "Forward")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Backward:"), 18, eFontAlign_Left, pTempTextWidget, "Backward")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Strafe Left:"), 18, eFontAlign_Left, pTempTextWidget, "Left")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Strafe Right:"), 18, eFontAlign_Left, pTempTextWidget, "Right")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Run:"), 18, eFontAlign_Left, pTempTextWidget, "Run")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Crouch:"), 18, eFontAlign_Left, pTempTextWidget, "Crouch")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Jump:"), 18, eFontAlign_Left, pTempTextWidget, "Jump")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Lean Left:"), 18, eFontAlign_Left, pTempTextWidget, "LeanLeft")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pTempTextWidget); pWidgetKeyButton = hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Lean Right:"), 18, eFontAlign_Left, pTempTextWidget, "LeanRight")); AddWidgetToState(eMainMenuState_OptionsKeySetupMove, pWidgetKeyButton); /////////////////////////////////// // Options Key Setup Action /////////////////////////////////// // Key buttons vPos = vTextStart; // cVector3f(400, 260, 40); vPos.y += 46; vPos.x += 15; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Interact:"), 18, eFontAlign_Left, pTempTextWidget, "Interact"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Examine:"), 18, eFontAlign_Left, pTempTextWidget, "Examine"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "InteractMode:"), 18, eFontAlign_Left, pTempTextWidget, "InteractMode"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Holster:"), 18, eFontAlign_Left, pTempTextWidget, "Holster"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupAction, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "LookMode:"), 18, eFontAlign_Left, pTempTextWidget, "LookMode"))); /////////////////////////////////// // Options Key Setup Misc /////////////////////////////////// // Key buttons vPos = vTextStart; // cVector3f(400, 260, 40); vPos.y += 46; vPos.x += 15; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Inventory:"), 18, eFontAlign_Left, pTempTextWidget, "Inventory"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Notebook:"), 18, eFontAlign_Left, pTempTextWidget, "NoteBook"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Pers. Notes:"), 18, eFontAlign_Left, pTempTextWidget, "PersonalNotes"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Flashlight:"), 18, eFontAlign_Left, pTempTextWidget, "Flashlight"))); vPos.y += 23; pTempTextWidget = hplNew(cMainMenuWidget_Text, (mpInit, vPos + cVector3f(fKeyTextXAdd, 0, 0), Common::U32String(), 18, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, pTempTextWidget); AddWidgetToState(eMainMenuState_OptionsKeySetupMisc, hplNew(cMainMenuWidget_KeyButton, (mpInit, vPos, kTranslate("MainMenu", "Glowstick:"), 18, eFontAlign_Left, pTempTextWidget, "GlowStick"))); /////////////////////////////////// // Options Game /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); // Head AddWidgetToState(eMainMenuState_OptionsGame, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "Game"), 25, eFontAlign_Center))); vPos.y += 37; // Buttons cMainMenuWidget *pWidgetLanguage = hplNew(cMainMenuWidget_Language, (mpInit, vPos, kTranslate("MainMenu", "Language:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGame, pWidgetLanguage); vPos.y += 29; cMainMenuWidget *pWidgetSubtitles = hplNew(cMainMenuWidget_Subtitles, (mpInit, vPos, kTranslate("MainMenu", "Subtitle:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGame, pWidgetSubtitles); vPos.y += 50; cMainMenuWidget *pWidgetDifficulty = hplNew(cMainMenuWidget_Difficulty, (mpInit, vPos, kTranslate("MainMenu", "Difficulty:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGame, pWidgetDifficulty); vPos.y += 29; if (mpInit->mbSimpleSwingInOptions) { AddWidgetToState(eMainMenuState_OptionsGame, hplNew(cMainMenuWidget_SimpleSwing, (mpInit, vPos, kTranslate("MainMenu", "SimpleSwing:"), 20, eFontAlign_Right))); vPos.y += 29; } // AddWidgetToState(eMainMenuState_OptionsGame,hplNew( cMainMenuWidget_AllowQuickSave(mpInit,vPos,kTranslate("MainMenu","AllowQuickSave:"),20,eFontAlign_Right)); // vPos.y += 29; tWString sCrosshairText = kTranslate("MainMenu", "Show Crosshair:"); if (sCrosshairText == _W("")) sCrosshairText = _W("Show Crosshair:"); cMainMenuWidget *pWidgetShowCrossHair = hplNew(cMainMenuWidget_ShowCrossHair, (mpInit, vPos, sCrosshairText, 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGame, pWidgetShowCrossHair); vPos.y += 29; cMainMenuWidget *pWidgetFlashItems = hplNew(cMainMenuWidget_FlashItems, (mpInit, vPos, kTranslate("MainMenu", "FlashItems:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGame, pWidgetFlashItems); vPos.y += 29; cMainMenuWidget *pWidgetDisablePersonal = hplNew(cMainMenuWidget_DisablePersonal, (mpInit, vPos, kTranslate("MainMenu", "DisablePersonal:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGame, pWidgetDisablePersonal); vPos.y += 35; AddWidgetToState(eMainMenuState_OptionsGame, hplNew(cMainMenuWidget_GfxBack, (mpInit, vPos, kTranslate("MainMenu", "Back"), 23, eFontAlign_Center))); // Text vPos = cVector3f(vTextStart.x + 12, vTextStart.y + 37, vTextStart.z); sText = cString::To16Char(cString::SetFileExt(mpInit->msLanguageFile, "")); gpLanguageText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGame, gpLanguageText); gpLanguageText->SetExtraWidget(pWidgetLanguage); vPos.y += 29; sText = mpInit->mbSubtitles ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpSubtitlesText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGame, gpSubtitlesText); gpSubtitlesText->SetExtraWidget(pWidgetSubtitles); vPos.y += 25; AddWidgetToState(eMainMenuState_OptionsGame, hplNew(cMainMenuWidget_Text, (mpInit, cVector3f(vPos - cVector3f(12, 0, 0)), kTranslate("MainMenu", "VoiceLanguange:"), 12, eFontAlign_Right))); AddWidgetToState(eMainMenuState_OptionsGame, hplNew(cMainMenuWidget_Text, (mpInit, cVector3f(vPos), kTranslate("MainMenu", "SetThisToLanguageOfVoice"), 12, eFontAlign_Left))); vPos.y += 25; sText = kTranslate("MainMenu", gvDifficultyLevel[mpInit->mDifficulty]); gpDifficultyText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGame, gpDifficultyText); gpDifficultyText->SetExtraWidget(pWidgetDifficulty); vPos.y += 29; if (mpInit->mbSimpleSwingInOptions) { sText = mpInit->mbSimpleWeaponSwing ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpSimpleSwingText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGame, gpSimpleSwingText); vPos.y += 29; } // sText = mpInit->mbAllowQuickSave ? kTranslate("MainMenu","On") : kTranslate("MainMenu","Off"); // gpAllowQuickSaveText = hplNew( cMainMenuWidget_Text, (mpInit,vPos,sText,20,eFontAlign_Left) ); // AddWidgetToState(eMainMenuState_OptionsGame,gpAllowQuickSaveText); // vPos.y += 29; sText = mpInit->mbShowCrossHair ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpShowCrossHairText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGame, gpShowCrossHairText); gpShowCrossHairText->SetExtraWidget(pWidgetShowCrossHair); vPos.y += 29; sText = mpInit->mbFlashItems ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpFlashItemsText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGame, gpFlashItemsText); gpFlashItemsText->SetExtraWidget(pWidgetFlashItems); vPos.y += 29; sText = mpInit->mbDisablePersonalNotes ? kTranslate("MainMenu", "Off") : kTranslate("MainMenu", "On"); gpDisablePersonalText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGame, gpDisablePersonalText); gpDisablePersonalText->SetExtraWidget(pWidgetDisablePersonal); /////////////////////////////////// // Options Graphics /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 230, 40); // Head AddWidgetToState(eMainMenuState_OptionsGraphics, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "Graphics"), 25, eFontAlign_Center))); vPos.y += 37; /*AddWidgetToState(eMainMenuState_OptionsGraphics,hplNew( cMainMenuWidget_Image, (mpInit, cVector3f(400,vPos.y,30), cVector2f(200,150), "menu_gamma.bmp", "diffalpha2d", cColor(1,1))) ); //Buttons vPos.x -= 130;*/ cMainMenuWidget *pWidgetResolution = hplNew(cMainMenuWidget_Resolution, (mpInit, vPos, kTranslate("MainMenu", "Resolution:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphics, pWidgetResolution); vPos.y += 29; cMainMenuWidget *pWidgetNoiseFilter = hplNew(cMainMenuWidget_NoiseFilter, (mpInit, vPos, kTranslate("MainMenu", "Noise Filter:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphics, pWidgetNoiseFilter); vPos.y += 29; cMainMenuWidget *pWidgetBloom = hplNew(cMainMenuWidget_Bloom, (mpInit, vPos, kTranslate("MainMenu", "Bloom:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphics, pWidgetBloom); vPos.y += 29; cMainMenuWidget *pWidgetGamma = hplNew(cMainMenuWidget_Gamma, (mpInit, vPos, kTranslate("MainMenu", "Gamma:"), 20, eFontAlign_Right, 0)); AddWidgetToState(eMainMenuState_OptionsGraphics, pWidgetGamma); vPos.y += 29; cMainMenuWidget *pWidgetShaderQuality = hplNew(cMainMenuWidget_ShaderQuality, (mpInit, vPos, kTranslate("MainMenu", "Shader Quality:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphics, pWidgetShaderQuality); // vPos.x = 400; // vPos.y = 230 + 150; vPos.y += 35; AddWidgetToState(eMainMenuState_OptionsGraphics, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Advanced"), eMainMenuState_OptionsGraphicsAdvanced, 23, eFontAlign_Center))); vPos.y += 35; AddWidgetToState(eMainMenuState_OptionsGraphics, hplNew(cMainMenuWidget_GfxBack, (mpInit, vPos, kTranslate("MainMenu", "Back"), 23, eFontAlign_Center))); // Text vPos = cVector3f(vTextStart.x + 12, vTextStart.y + 37, vTextStart.z); snprintf(sTempVec, 256, "%d x %d", mpInit->mvScreenSize.x, mpInit->mvScreenSize.y); sText = cString::To16Char(sTempVec); gpResolutionText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphics, gpResolutionText); gpResolutionText->SetExtraWidget(pWidgetResolution); vPos.y += 29; sText = mpInit->mpPlayer->GetNoiseFilter()->IsActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpNoiseFilterText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphics, gpNoiseFilterText); gpNoiseFilterText->SetExtraWidget(pWidgetNoiseFilter); vPos.y += 29; sText = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetBloomActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpBloomText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphics, gpBloomText); gpBloomText->SetExtraWidget(pWidgetBloom); vPos.y += 29; snprintf(sTempVec, 256, "%.1f", mpInit->mpGame->GetGraphics()->GetLowLevel()->GetGammaCorrection()); sText = cString::To16Char(sTempVec); gpGammaText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphics, gpGammaText); gpGammaText->SetExtraWidget(pWidgetGamma); vPos.y += 29; sText = kTranslate("MainMenu", gvShaderQuality[iMaterial::GetQuality()]); gpShaderQualityText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphics, gpShaderQualityText); gpShaderQualityText->SetExtraWidget(pWidgetShaderQuality); /////////////////////////////////// // Options Advanced Graphics /////////////////////////////////// vPos = vTextStart + cVector3f(40, 0, 0); // cVector3f(400, 260, 40); // Head AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "Advanced Graphics"), 25, eFontAlign_Center))); vPos.y += 37; // Buttons cMainMenuWidget *pTextureQualityButton = hplNew(cMainMenuWidget_TextureQuality, (mpInit, vPos, kTranslate("MainMenu", "Texture Quality:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pTextureQualityButton); vPos.y += 29; cMainMenuWidget *pShadowsButton = hplNew(cMainMenuWidget_Shadows, (mpInit, vPos, kTranslate("MainMenu", "Shadows:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pShadowsButton); vPos.y += 29; cMainMenuWidget *pPostEffectsButton = hplNew(cMainMenuWidget_PostEffects, (mpInit, vPos, kTranslate("MainMenu", "Post Effects:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pPostEffectsButton); vPos.y += 29; cMainMenuWidget *pMotionBlurButton = hplNew(cMainMenuWidget_MotionBlur, (mpInit, vPos, kTranslate("MainMenu", "Motion Blur:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pMotionBlurButton); vPos.y += 29; cMainMenuWidget *pTextureFilterButton = hplNew(cMainMenuWidget_TextureFilter, (mpInit, vPos, kTranslate("MainMenu", "Texture Filter:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pTextureFilterButton); vPos.y += 29; cMainMenuWidget *pTextureAnisotropyButton = hplNew(cMainMenuWidget_TextureAnisotropy, (mpInit, vPos, kTranslate("MainMenu", "Anisotropy:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pTextureAnisotropyButton); vPos.y += 29; cMainMenuWidget *pFSAAButton = hplNew(cMainMenuWidget_FSAA, (mpInit, vPos, kTranslate("MainMenu", "Anti-Aliasing:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pFSAAButton); vPos.y += 29; cMainMenuWidget *pDOFButton = hplNew(cMainMenuWidget_DOF, (mpInit, vPos, kTranslate("MainMenu", "Depth of Field:"), 20, eFontAlign_Right)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, pDOFButton); vPos.y += 35; AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "Back"), eMainMenuState_OptionsGraphics, 23, eFontAlign_Center))); // Text vPos = cVector3f(vTextStart.x + 12, vTextStart.y + 37, vTextStart.z) + cVector3f(40, 0, 0); sText = kTranslate("MainMenu", gvTextureQuality[mpInit->mpGame->GetResources()->GetMaterialManager()->GetTextureSizeLevel()]); gpTextureQualityText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpTextureQualityText); gpTextureQualityText->SetExtraWidget(pTextureQualityButton); vPos.y += 29; sText = kTranslate("MainMenu", gvShadowTypes[mpInit->mpGame->GetGraphics()->GetRenderer3D()->GetShowShadows()]); gpShadowsText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpShadowsText); gpShadowsText->SetExtraWidget(pShadowsButton); vPos.y += 29; sText = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpPostEffectsText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpPostEffectsText); gpPostEffectsText->SetExtraWidget(pPostEffectsButton); vPos.y += 29; sText = mpInit->mpGame->GetGraphics()->GetRendererPostEffects()->GetMotionBlurActive() ? kTranslate("MainMenu", "On") : kTranslate("MainMenu", "Off"); gpMotionBlurText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpMotionBlurText); gpMotionBlurText->SetExtraWidget(pMotionBlurButton); vPos.y += 29; sText = kTranslate("MainMenu", gvTextureFilter[mpInit->mpGame->GetResources()->GetMaterialManager()->GetTextureFilter()]); gpTextureFilterText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpTextureFilterText); gpTextureFilterText->SetExtraWidget(pTextureFilterButton); vPos.y += 29; int lAniDeg = (int)mpInit->mpGame->GetResources()->GetMaterialManager()->GetTextureAnisotropy(); if (lAniDeg != 1) sText = cString::To16Char(cString::ToString(lAniDeg) + "x"); else sText = kTranslate("MainMenu", "Off"); gpTextureAnisotropyText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpTextureAnisotropyText); gpTextureAnisotropyText->SetExtraWidget(pTextureAnisotropyButton); vPos.y += 29; int lFSAA = mpInit->mlFSAA; if (lFSAA != 0) sText = cString::To16Char(cString::ToString(lFSAA) + "x"); else sText = kTranslate("MainMenu", "Off"); gpFSAAText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpFSAAText); gpFSAAText->SetExtraWidget(pFSAAButton); vPos.y += 29; sText = mpInit->mpEffectHandler->GetDepthOfField()->IsDisabled() ? kTranslate("MainMenu", "Off") : kTranslate("MainMenu", "On"); gpDoFText = hplNew(cMainMenuWidget_Text, (mpInit, vPos, sText, 20, eFontAlign_Left)); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced, gpDoFText); gpDoFText->SetExtraWidget(pDOFButton); /////////////////////////////////// // Graphics Restart /////////////////////////////////// vPos = vTextStart; // cVector3f(400, 260, 40); AddWidgetToState(eMainMenuState_GraphicsRestart, hplNew(cMainMenuWidget_Text, (mpInit, vPos, kTranslate("MainMenu", "GraphicsRestart"), 16, eFontAlign_Center, NULL, 400))); vPos.y += 42; AddWidgetToState(eMainMenuState_GraphicsRestart, hplNew(cMainMenuWidget_Button, (mpInit, vPos, kTranslate("MainMenu", "OK"), eMainMenuState_Options, 22, eFontAlign_Center))); } //----------------------------------------------------------------------- void cMainMenu::AddWidgetToState(eMainMenuState aState, cMainMenuWidget *apWidget) { mlstWidgets.push_back(apWidget); mvState[aState].push_back(apWidget); } //---------------------------------------------------------------------