/* * Copyright (C) 2006-2010 - Frictional Games * * This file is part of Penumbra Overture. * * Penumbra Overture 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. * * Penumbra Overture 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 Penumbra Overture. If not, see . */ #include "MainMenu.h" #include "Init.h" #include "GraphicsHelper.h" #include "ButtonHandler.h" #include "MapHandler.h" #include "SaveHandler.h" #include "IntroStory.h" #include "Player.h" #include "PlayerHelper.h" #include "EffectHandler.h" #include "HapticGameCamera.h" #include "OALWrapper/OAL_Init.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.c_str()); 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.c_str()); mpFont->Draw(mvPositon + cVector3f(-fAdd,0,-1),mvFontSize,cColor(0.56f,0.35f * mfAlpha),eFontAlign_Center,msText.c_str()); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // 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.c_str()); 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.c_str()); mpFont->Draw(mvPositon+cVector3f(2,2,-1),mvFontSize,cColor(0.1f,0.32f,1.0f,mfAlpha*fX),mAlignment,msText.c_str()); mpFont->Draw(mvPositon+cVector3f(-2,-2,-1),mvFontSize,cColor(0.1f,0.32f,1.0f,mfAlpha*fX),mAlignment,msText.c_str()); mpFont->Draw(mvPositon+cVector3f(3,3,-2),mvFontSize,cColor(0.1f,0.32f,1.0f,mfAlpha*0.5f*fX),mAlignment,msText.c_str()); mpFont->Draw(mvPositon+cVector3f(-3,-3,-2),mvFontSize,cColor(0.1f,0.32f,1.0f,mfAlpha*0.5f*fX),mAlignment,msText.c_str()); } } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // 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,_W("%ls"),msText.c_str()); else mpFont->DrawWordWrap( mvPositon,mfMaxWidth,mvFontSize.y+1, mvFontSize,cColor(0.9f,1),mAlignment,msText.c_str()); } //----------------------------------------------------------------------- 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 == i) { mpFont->Draw(vPos,mvFontSize,cColor(0.95f,1),eFontAlign_Left,mvEntries[i].c_str()); 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].c_str()); 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; } } //----------------------------------------------------------------------- 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 sAuto = _W("save/auto/") + mpInit->mpSaveHandler->GetLatest(_W("save/auto/"),_W("*.sav")); tWString sSpot = _W("save/spot/") + mpInit->mpSaveHandler->GetLatest(_W("save/spot/"),_W("*.sav")); tWString sFile = _W(""); if(sAuto == _W("save/auto/")) { sFile = sSpot; } else if(sSpot == _W("save/spot/")) { sFile = sAuto; } else { tWString sSaveDir = mpInit->mpSaveHandler->GetSaveDir(); cDate dateAuto = FileModifiedDate(sSaveDir + sAuto); cDate dateSpot = FileModifiedDate(sSaveDir + sSpot); if(dateAuto > dateSpot) { sFile = sAuto; } else { sFile = sSpot; } } if(sFile != _W("")) mpInit->mpSaveHandler->LoadGameFromFile(sFile); } //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // 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[3]; 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 = msDir + _W("/") + 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, 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 + _W("/") + 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, 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 = mpInit->mpSaveHandler->GetSaveDir() + msDir + _W("/") + gvSaveGameFileVec[mlNum][lSelected]; RemoveFile(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, 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 = mpInit->mpSaveHandler->GetSaveDir() + msDir + _W("/") + gvSaveGameFileVec[mlNum][lSelected]; tWString sDest = mpInit->mpSaveHandler->GetSaveDir() + _W("save/favorite/") + gvSaveGameFileVec[mlNum][lSelected]; CloneFile(sFile,sDest,true); mpInit->mpMainMenu->UpdateWidgets(); } tWString msDir; int mlNum; }; //----------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////// // OPTIONS CONTROLS ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------- cMainMenuWidget_Text *gpInvertMouseYText=NULL; cMainMenuWidget_Text *gpMouseSensitivityText=NULL; cMainMenuWidget_Text *gpToggleCrouchText=NULL; cMainMenuWidget_Text *gpUseHapticsText=NULL; cMainMenuWidget_Text *gpWidgetInteractModeCameraSpeedText = NULL; cMainMenuWidget_Text *gpWidgetActionModeCameraSpeedText = NULL; cMainMenuWidget_Text *gpWidgetWeightForceScaleText = NULL; //----------------------------------------------------------------------- class cMainMenuWidget_UseHaptics : public cMainMenuWidget_Button { public: cMainMenuWidget_UseHaptics(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->mbHasHapticsOnRestart = !mpInit->mbHasHapticsOnRestart; gpUseHapticsText->msText = mpInit->mbHasHapticsOnRestart ? kTranslate("MainMenu","On") : kTranslate("MainMenu","Off"); gbMustRestart = true; } }; //----------------------------------------------------------------------- class cMainMenuWidget_WeightForceScale : public cMainMenuWidget_Button { public: cMainMenuWidget_WeightForceScale(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) { float afX = mpInit->mfHapticForceMul; if(aButton == eMButton_Left) { afX += 0.1f; if(afX>3.0f) afX = 3.0f; } else if(aButton == eMButton_Right) { afX -= 0.1f; if(afX<0.0f) afX = 0.0f; } char sTempVec[256]; sprintf(sTempVec,"%.1f",afX); gpWidgetWeightForceScaleText->msText = cString::To16Char(sTempVec); mpInit->mfHapticForceMul = afX; } }; //----------------------------------------------------------------------- class cMainMenuWidget_InteractModeCameraSpeed : public cMainMenuWidget_Button { public: cMainMenuWidget_InteractModeCameraSpeed(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) { float afX = mpInit->mpPlayer->GetHapticCamera()->GetInteractModeCameraSpeed(); if(aButton == eMButton_Left) { afX += 0.1f; if(afX>3.0f) afX = 3.0f; } else if(aButton == eMButton_Right) { afX -= 0.1f; if(afX<0.1f) afX = 0.1f; } char sTempVec[256]; sprintf(sTempVec,"%.1f",afX); gpWidgetInteractModeCameraSpeedText->msText = cString::To16Char(sTempVec); mpInit->mpPlayer->GetHapticCamera()->SetInteractModeCameraSpeed(afX); } }; //----------------------------------------------------------------------- class cMainMenuWidget_ActionModeCameraSpeed : public cMainMenuWidget_Button { public: cMainMenuWidget_ActionModeCameraSpeed(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) { float afX = mpInit->mpPlayer->GetHapticCamera()->GetActionModeCameraSpeed(); if(aButton == eMButton_Left) { afX += 0.1f; if(afX>3.0f) afX = 3.0f; } else if(aButton == eMButton_Right) { afX -= 0.1f; if(afX<0.1f) afX = 0.1f; } char sTempVec[256]; sprintf(sTempVec,"%.1f",afX); gpWidgetActionModeCameraSpeedText->msText = cString::To16Char(sTempVec); mpInit->mpPlayer->GetHapticCamera()->SetActionModeCameraSpeed(afX); } }; //----------------------------------------------------------------------- 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]; sprintf(sTempVec,"%.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 SOUND ////////////////////////////////////////////////////////////////////////// cMainMenuWidget_Text *gpSoundVolumeText=NULL; cMainMenuWidget_Text *gpSoundHardwareText=NULL; cMainMenuWidget_Text *gpSoundOutputDevice=NULL; class cMainMenuWidget_SoundVolume : public cMainMenuWidget_Button { public: cMainMenuWidget_SoundVolume(cInit *apInit, const cVector3f &avPos, const tWString& asText,cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit,avPos,asText,eMainMenuState_LastEnum,avFontSize,aAlignment) { msTip = kTranslate("MainMenu", "TipSoundVolume"); } void OnMouseDown(eMButton aButton) { float fVolume = mpInit->mpGame->GetSound()->GetLowLevel()->GetVolume(); if(aButton == eMButton_Left) { fVolume += 0.1f; if(fVolume > 1.0f) fVolume = 1.0f; } else if(aButton == eMButton_Right) { fVolume -= 0.1f; if(fVolume < 0.0f) fVolume = 0.0f; } mpInit->mpGame->GetSound()->GetLowLevel()->SetVolume(fVolume); char sTempVec[256]; sprintf(sTempVec,"%.0f",mpInit->mpGame->GetSound()->GetLowLevel()->GetVolume()*100); gpSoundVolumeText->msText = cString::To16Char(sTempVec); } }; class cMainMenuWidget_SoundHardware : public cMainMenuWidget_Button { public: cMainMenuWidget_SoundHardware(cInit *apInit, const cVector3f &avPos, const tWString& asText,cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit,avPos,asText,eMainMenuState_LastEnum,avFontSize,aAlignment) { msTip = kTranslate("MainMenu", "TipSoundHardware"); } void OnMouseDown(eMButton aButton) { mpInit->mbUseSoundHardware = !mpInit->mbUseSoundHardware; gpSoundHardwareText->msText = mpInit->mbUseSoundHardware ? kTranslate("MainMenu","On") : kTranslate("MainMenu","Off"); gbMustRestart = true; } }; class cMainMenuWidget_SoundOutputDevice : public cMainMenuWidget_Button { public: tStringVec mlDevices; cMainMenuWidget_SoundOutputDevice(cInit *apInit, const cVector3f &avPos, const tWString& asText,cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit,avPos,asText,eMainMenuState_LastEnum,avFontSize,aAlignment) { msTip = kTranslate("MainMenu", "TipSoundOutputDevice"); mlDevices = OAL_Info_GetOutputDevices(); } void OnMouseDown(eMButton aButton) { int lCurrentNum = 0; //get current num for(int i=0; imsDeviceName) { lCurrentNum = i; break; } } if(aButton == eMButton_Left) { lCurrentNum++; if(lCurrentNum >= mlDevices.size()) lCurrentNum =0; } else if(aButton == eMButton_Right) { lCurrentNum--; if(lCurrentNum < 0) lCurrentNum =mlDevices.size()-1; } mpInit->msDeviceName = mlDevices[lCurrentNum]; gpSoundOutputDevice->msText = cString::To16Char(mpInit->msDeviceName); gbMustRestart = true; } }; ////////////////////////////////////////////////////////////////////////// // 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"); } }; tString gvDifficultyLevel[] = {"Easy","Normal","Hard"}; 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) { tWStringList lstStrings; apInit->mpGame->GetResources()->GetLowLevel()->FindFilesInDir(lstStrings,_W("config/"),_W("*.lang")); mlCurrentFile =0; int lIdx=0; for(tWStringListIt it = lstStrings.begin(); it != lstStrings.end();++it) { mvFiles.push_back(*it); if( cString::To16Char(cString::ToLowerCase(apInit->msLanguageFile)) == cString::ToLowerCaseW(*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::SetFileExtW(mvFiles[mlCurrentFile],_W("")); mpInit->msLanguageFile = cString::To8Char(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(); } } std::vector mvFiles; int mlCurrentFile; }; //------------------------------------------------------------ //------------------------------------------------------------ ////////////////////////////////////////////////////////////////////////// // OPTIONS GRAPHICS ////////////////////////////////////////////////////////////////////////// cMainMenuWidget_Text *gpResolutionText=NULL; cMainMenuWidget_Text *gpPostEffectsText=NULL; cMainMenuWidget_Text *gpBloomText=NULL; cMainMenuWidget_Text *gpMotionBlurText=NULL; cMainMenuWidget_Text *gpVSyncText=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; 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; tString gvTextureQuality[] = {"High","Medium","Low"}; int glTextureQualityNum = 3; tString gvShaderQuality[] = {"Very Low","Low","Medium","High"}; 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]; sprintf(sTempVec,"%.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"); } }; //------------------------------------------------------------ tString 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; }; //------------------------------------------------------------ tString 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) { 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; imvScreenSize) { 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]; sprintf(sTempVec,"%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_VSync : public cMainMenuWidget_Button { public: cMainMenuWidget_VSync(cInit *apInit, const cVector3f &avPos, const tWString& asText,cVector2f avFontSize, eFontAlign aAlignment) : cMainMenuWidget_Button(apInit,avPos,asText,eMainMenuState_LastEnum,avFontSize,aAlignment) { msTip = kTranslate("MainMenu", "TipGraphicsVSync"); } void OnMouseDown(eMButton aButton) { mpInit->mbVsync = !mpInit->mbVsync; mpInit->mpGame->GetGraphics()->GetLowLevel()->SetVsyncActive(mpInit->mbVsync); gpVSyncText->msText = mpInit->mbVsync ? 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") { 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); 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.c_str()); } //////////////////////////////// // 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->mbHasHaptics) mpInit->mpPlayer->GetHapticCamera()->SetActive(false); if (!mpInit->mbFullScreen) { mpInit->mpGame->GetInput()->GetLowLevel()->LockInput(false); } mpInit->mpGame->GetUpdater()->SetContainer("MainMenu"); mpInit->mpGame->GetScene()->SetDrawScene(false); mpInit->mpGame->GetScene()->SetUpdateMap(false); if(mpInit->mbHasHaptics) { mpInit->mpGame->GetHaptic()->GetLowLevel()->StopAllForces(); mpInit->mpGame->GetHaptic()->GetLowLevel()->SetUpdateShapes(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->mpConfig->GetBool("Game","FirstStart",true); if(bFirstStart) { SetState(eMainMenuState_FirstStart); mLastState = eMainMenuState_FirstStart; mpInit->mpConfig->SetBool("Game","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); } if(mpInit->mbHasHaptics) mpInit->mpPlayer->GetHapticCamera()->SetActive(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); if(mpInit->mbHasHaptics) mpInit->mpGame->GetHaptic()->GetLowLevel()->SetUpdateShapes(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; iGetKeyboard()->KeyIsDown((eKey)i); } for(int i=0; iGetMouse()->ButtonIsDown((eMButton)i); } } //----------------------------------------------------------------------- bool cMainMenu::CheckForInput() { cInput *pInput = mpInit->mpGame->GetInput(); //////////////////// //Keyboard for(int i=0; iGetKeyboard()->KeyIsDown((eKey)i)) { if(mvKeyPressed[i]==false) return true; } else { mvKeyPressed[i] = false; } } //////////////////// //Mouse for(int i=0; iGetMouse()->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 std::multiset > 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->mpConfig->GetBool("Game","FirstStart",true); 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; sprintf(sTempVec,"%.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 sAuto = mpInit->mpSaveHandler->GetLatest(_W("save/auto/"),_W("*.sav")); tWString sSpot = mpInit->mpSaveHandler->GetLatest(_W("save/spot/"),_W("*.sav")); if(sAuto != _W("") || sSpot != _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 = _W("save/spot"); if(i == 1) sDir = _W("save/auto"); else if(i == 2) sDir = _W("save/favorite"); gpSaveGameList[i] = hplNew( cMainMenuWidget_SaveGameList,( mpInit,vPos,cVector2f(355,170),15,sDir,(int)i) ); AddWidgetToState(state,gpSaveGameList[i]); iLowLevelResources *pLowLevelResources = mpInit->mpGame->GetResources()->GetLowLevel(); iLowLevelSystem *pLowLevelSystem = mpInit->mpGame->GetSystem()->GetLowLevel(); tWStringList lstFiles; tTempFileAndDataSet setTempFiles; tWString sFullPath = mpInit->mpSaveHandler->GetSaveDir() + sDir; pLowLevelResources->FindFilesInDir(lstFiles,sFullPath,_W("*.sav")); tWStringListIt fileIt = lstFiles.begin(); for(; fileIt != lstFiles.end(); ++fileIt) { tWString sFile = *fileIt; cDate date = FileModifiedDate(sFullPath+_W("/")+sFile); 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::SetFileExtW(sFile,_W("")); sFile = cString::SubW(sFile,0, (int)sFile.length() - 3); sFile = cString::ReplaceCharToW(sFile,_W("_"),_W(" ")); sFile = cString::ReplaceCharToW(sFile,_W("."),_W(":")); //TODO: PROBLEM!!! 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,sDir,(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","Sound"),eMainMenuState_OptionsSound,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 *pWidgetUseHaptics = NULL; cMainMenuWidget *pWidgetInteractModeCameraSpeed = NULL; cMainMenuWidget *pWidgetActionModeCameraSpeed = NULL; cMainMenuWidget *pWidgetWeightForceScale = NULL; if(mpInit->mbHapticsAvailable) { vPos.y+= 5; //Use haptics tWString sText = kTranslate("MainMenu","Use Haptics:"); if(sText == _W("")) sText = _W("Use Haptics:"); pWidgetUseHaptics = hplNew( cMainMenuWidget_UseHaptics,(mpInit,vPos,sText,20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsControls,pWidgetUseHaptics); vPos.y += 29; //Weight Force Scale sText = kTranslate("MainMenu","Weight Force Scale:"); if(sText == _W("")) sText = _W("Weight Force Scale:"); pWidgetWeightForceScale = hplNew( cMainMenuWidget_WeightForceScale,(mpInit,vPos,sText,20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsControls,pWidgetWeightForceScale); vPos.y += 29; //InteractMode camera speed sText = kTranslate("MainMenu","InteractMode Camera Speed:"); if(sText == _W("")) sText = _W("InteractMode Camera Speed:"); pWidgetInteractModeCameraSpeed = hplNew( cMainMenuWidget_InteractModeCameraSpeed,(mpInit,vPos,sText,20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsControls,pWidgetInteractModeCameraSpeed); vPos.y += 29; //ActionMode camera speed sText = kTranslate("MainMenu","ActionMode Camera Speed:"); if(sText == _W("")) sText = _W("ActionMode Camera Speed:"); pWidgetActionModeCameraSpeed = hplNew( cMainMenuWidget_ActionModeCameraSpeed,(mpInit,vPos,sText,20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsControls,pWidgetActionModeCameraSpeed); vPos.y += 29; vPos.y+= 5; } 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; sprintf(sTempVec,"%.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); if(mpInit->mbHapticsAvailable) { vPos.y+= 5; vPos.y += 29; sText = mpInit->mbHasHapticsOnRestart ? kTranslate("MainMenu","On") : kTranslate("MainMenu","Off"); gpUseHapticsText = hplNew( cMainMenuWidget_Text,(mpInit,vPos,sText,20,eFontAlign_Left) ); AddWidgetToState(eMainMenuState_OptionsControls,gpUseHapticsText); gpUseHapticsText->SetExtraWidget(pWidgetUseHaptics); vPos.y += 29; sprintf(sTempVec,"%.1f",mpInit->mfHapticForceMul); sText = cString::To16Char(sTempVec); gpWidgetWeightForceScaleText = hplNew( cMainMenuWidget_Text,(mpInit,vPos,sText,20,eFontAlign_Left,pWidgetWeightForceScale) ); AddWidgetToState(eMainMenuState_OptionsControls,gpWidgetWeightForceScaleText); vPos.y += 29; sprintf(sTempVec,"%.1f",mpInit->mpPlayer->GetHapticCamera()->GetInteractModeCameraSpeed()); sText = cString::To16Char(sTempVec); gpWidgetInteractModeCameraSpeedText = hplNew( cMainMenuWidget_Text,(mpInit,vPos,sText,20,eFontAlign_Left,pWidgetInteractModeCameraSpeed) ); AddWidgetToState(eMainMenuState_OptionsControls,gpWidgetInteractModeCameraSpeedText); vPos.y += 29; sprintf(sTempVec,"%.1f",mpInit->mpPlayer->GetHapticCamera()->GetActionModeCameraSpeed()); sText = cString::To16Char(sTempVec); gpWidgetActionModeCameraSpeedText = hplNew( cMainMenuWidget_Text,(mpInit,vPos,sText,20,eFontAlign_Left,pWidgetActionModeCameraSpeed) ); AddWidgetToState(eMainMenuState_OptionsControls,gpWidgetActionModeCameraSpeedText); } /////////////////////////////////// // Options Key Setup General stuff /////////////////////////////////// for(int i=0; i<3; ++i) { eMainMenuState state = (eMainMenuState)(i+ eMainMenuState_OptionsKeySetupMove); cVector3f vPos = vTextStart;//cVector3f(400, 260, 40); //Head AddWidgetToState(state,hplNew( cMainMenuWidget_Text,(mpInit,vPos,kTranslate("MainMenu","Configure Keys"),25,eFontAlign_Center)) ); vPos.y += 42; vPos.x -= 110; //Buttons AddWidgetToState(state,hplNew( cMainMenuWidget_Button,(mpInit,vPos,kTranslate("MainMenu","Movement"),eMainMenuState_OptionsKeySetupMove,25,eFontAlign_Center)) ); vPos.y += 32; AddWidgetToState(state,hplNew( cMainMenuWidget_Button,(mpInit,vPos,kTranslate("MainMenu","Actions"),eMainMenuState_OptionsKeySetupAction,25,eFontAlign_Center)) ); vPos.y += 32; AddWidgetToState(state,hplNew( cMainMenuWidget_Button,(mpInit,vPos,kTranslate("MainMenu","Misc"),eMainMenuState_OptionsKeySetupMisc,25,eFontAlign_Center)) ); //Back vPos.y += 150; vPos.x += 130; AddWidgetToState(state,hplNew( cMainMenuWidget_KeyReset,(mpInit,vPos,kTranslate("MainMenu","Reset to defaults"),23,eFontAlign_Center)) ); vPos.y += 32; AddWidgetToState(state,hplNew( cMainMenuWidget_Button,(mpInit,vPos,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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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),_W(""),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 Sound /////////////////////////////////// vPos = vTextStart;//cVector3f(400, 230, 40); //Head AddWidgetToState(eMainMenuState_OptionsSound,hplNew( cMainMenuWidget_Text, (mpInit,vPos,kTranslate("MainMenu","Sound"),25,eFontAlign_Center)) ); vPos.y += 37; //Buttons cMainMenuWidget *pWidgetSoundVolume = hplNew( cMainMenuWidget_SoundVolume, (mpInit,vPos,kTranslate("MainMenu","Sound Volume:"),20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsSound,pWidgetSoundVolume); vPos.y += 29; cMainMenuWidget *pWidgetSoundHardware = hplNew( cMainMenuWidget_SoundHardware, (mpInit,vPos,kTranslate("MainMenu","Use Hardware:"),20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsSound,pWidgetSoundHardware); vPos.y += 29; cMainMenuWidget *pWidgetSoundOutputDevice = hplNew( cMainMenuWidget_SoundOutputDevice, (mpInit,vPos,kTranslate("MainMenu","Output Device:"),20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsSound,pWidgetSoundOutputDevice); vPos.y += 35; AddWidgetToState(eMainMenuState_OptionsSound,hplNew( cMainMenuWidget_GfxBack, (mpInit,vPos,kTranslate("MainMenu","Back"),23,eFontAlign_Center)) ); //Text vPos = cVector3f(vTextStart.x+12, vTextStart.y+37, vTextStart.z); sprintf(sTempVec,"%.0f",mpInit->mpGame->GetSound()->GetLowLevel()->GetVolume()*100); sText = cString::To16Char(sTempVec); gpSoundVolumeText = hplNew( cMainMenuWidget_Text, (mpInit,vPos,sText,20,eFontAlign_Left) ); AddWidgetToState(eMainMenuState_OptionsSound,gpSoundVolumeText); gpSoundVolumeText->SetExtraWidget(pWidgetSoundVolume); vPos.y += 29; sText = mpInit->mbUseSoundHardware ? kTranslate("MainMenu","On") : kTranslate("MainMenu","Off"); gpSoundHardwareText = hplNew( cMainMenuWidget_Text, (mpInit,vPos,sText,20,eFontAlign_Left) ); AddWidgetToState(eMainMenuState_OptionsSound,gpSoundHardwareText); gpSoundHardwareText->SetExtraWidget(pWidgetSoundHardware); vPos.y += 29; // Set the default to what's really being used mpInit->msDeviceName = tString(OAL_Info_GetDeviceName()); sText = cString::To16Char(mpInit->msDeviceName); gpSoundOutputDevice = hplNew( cMainMenuWidget_Text, (mpInit,vPos,sText,20,eFontAlign_Left) ); AddWidgetToState(eMainMenuState_OptionsSound,gpSoundOutputDevice); gpSoundOutputDevice->SetExtraWidget(pWidgetSoundOutputDevice); /////////////////////////////////// // 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); sprintf(sTempVec,"%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; sprintf(sTempVec,"%.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 *pVSyncButton = hplNew( cMainMenuWidget_VSync,(mpInit,vPos,kTranslate("MainMenu","VSync:"),20,eFontAlign_Right) ); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced,pVSyncButton); 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 = mpInit->mbVsync ? kTranslate("MainMenu","On") : kTranslate("MainMenu","Off"); gpVSyncText = hplNew( cMainMenuWidget_Text,(mpInit,vPos,sText,20,eFontAlign_Left) ); AddWidgetToState(eMainMenuState_OptionsGraphicsAdvanced,gpVSyncText); gpVSyncText->SetExtraWidget(pVSyncButton); 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); } //---------------------------------------------------------------------