/*
* Copyright 2011-2013 Arx Libertatis Team (see the AUTHORS file)
*
* This file is part of Arx Libertatis.
*
* Arx Libertatis 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.
*
* Arx Libertatis 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 Arx Libertatis. If not, see .
*/
/* Based on:
===========================================================================
ARX FATALIS GPL Source Code
Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company.
This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code').
Arx Fatalis Source Code 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.
Arx Fatalis Source Code 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 Arx Fatalis Source Code. If not, see
.
In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these
additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx
Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o
ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
#include "gui/MenuWidgets.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "core/Application.h"
#include "core/Config.h"
#include "core/Core.h"
#include "core/GameTime.h"
#include "core/Localisation.h"
#include "core/SaveGame.h"
#include "core/Version.h"
#include "gui/Menu.h"
#include "gui/MenuPublic.h"
#include "gui/Text.h"
#include "gui/Interface.h"
#include "gui/Credits.h"
#include "gui/TextManager.h"
#include "graphics/Draw.h"
#include "graphics/Math.h"
#include "graphics/Renderer.h"
#include "graphics/data/TextureContainer.h"
#include "graphics/font/Font.h"
#include "graphics/texture/TextureStage.h"
#include "input/Input.h"
#include "scene/ChangeLevel.h"
#include "scene/GameSound.h"
#include "scene/LoadLevel.h"
#include "window/RenderWindow.h"
using std::wistringstream;
using std::min;
using std::max;
using std::string;
using std::vector;
const std::string AUTO_RESOLUTION_STRING = "Automatic";
static int newWidth;
static int newHeight;
static int newBpp;
static bool newFullscreen;
#define NODEBUGZONE
//-----------------------------------------------------------------------------
#define RATIO_X(a) (((float)a)*Xratio)
#define RATIO_Y(a) (((float)a)*Yratio)
//-----------------------------------------------------------------------------
// Imported global variables and functions
extern ARX_MENU_DATA ARXmenu;
extern TextureContainer * scursor[];
extern long DANAESIZX;
extern long DANAESIZY;
extern long REFUSE_GAME_RETURN;
extern float PROGRESS_BAR_TOTAL;
extern float OLD_PROGRESS_BAR_COUNT;
extern float PROGRESS_BAR_COUNT;
float INTERFACE_RATIO(float a);
bool bNoMenu=false;
void ARXMenu_Private_Options_Video_SetResolution(bool fullscreen, int _iWidth, int _iHeight, int _bpp);
//-----------------------------------------------------------------------------
static MenuCursor * pMenuCursor = NULL;
static CWindowMenu *pWindowMenu=NULL;
CMenuState *pMenu;
static CMenuElement * pMenuElementResume = NULL;
static CMenuElement * pMenuElementApply = NULL;
static CMenuElementText * pLoadConfirm = NULL;
CMenuElementText *pDeleteConfirm=NULL;
CMenuElementText *pDeleteButton=NULL;
CMenuCheckButton * fullscreenCheckbox = NULL;
static CMenuSliderText * pMenuSliderResol = NULL;
static CMenuSliderText * pMenuSliderBpp = NULL;
float ARXTimeMenu;
float ARXOldTimeMenu;
float ARXDiffTimeMenu;
bool bFade=false;
bool bFadeInOut=false;
int iFadeAction=-1;
float fFadeInOut=0.f;
void ARX_MENU_Clicked_NEWQUEST();
TextureContainer *pTextureLoad=NULL;
static TextureContainer *pTextureLoadRender=NULL;
int iTimeToDrawD7=-3000;
void ARX_QuickSave() {
if(REFUSE_GAME_RETURN) {
return;
}
ARX_SOUND_MixerPause(ARX_SOUND_MixerGame);
savegames.quicksave(savegame_thumbnail);
ARX_SOUND_MixerResume(ARX_SOUND_MixerGame);
}
void ARX_DrawAfterQuickLoad() {
iTimeToDrawD7 -= checked_range_cast(FrameDiff);
float fColor;
if(iTimeToDrawD7>0)
{
fColor=1.f;
}
else
{
int iFade=-iTimeToDrawD7;
if(iFade>1000) return;
fColor=1.f-(((float)iFade)/1000.f);
}
TextureContainer *pTex = TextureContainer::Load("graph/interface/icons/menu_main_save");
if(!pTex) return;
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
EERIEDrawBitmap2(0, 0, INTERFACE_RATIO_DWORD(pTex->m_dwWidth),
INTERFACE_RATIO_DWORD(pTex->m_dwHeight), 0.f, pTex, Color::gray(fColor));
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
bool ARX_QuickLoad() {
SaveGameList::iterator save = savegames.quickload();
if(save == savegames.end()) {
// No saves found!
return false;
}
ARX_SOUND_MixerPause(ARX_SOUND_MixerGame);
LoadLevelScreen();
PROGRESS_BAR_TOTAL = 238;
OLD_PROGRESS_BAR_COUNT = PROGRESS_BAR_COUNT = 0;
PROGRESS_BAR_COUNT += 1.f;
LoadLevelScreen(save->level);
DanaeClearLevel();
ARX_CHANGELEVEL_Load(save->savefile);
REFUSE_GAME_RETURN = 0;
ARX_SOUND_MixerResume(ARX_SOUND_MixerGame);
return true;
}
//-----------------------------------------------------------------------------
bool MENU_NoActiveWindow()
{
if( (!pWindowMenu)||
((pWindowMenu)&&
(pWindowMenu->eCurrentMenuState==MAIN)) ) return true;
return false;
}
void FontRenderText(Font* _pFont, Vec3f pos, const std::string& _pText, Color _c) {
if(pTextManage) {
long x = checked_range_cast(pos.x);
long y = checked_range_cast(pos.y);
pTextManage->AddText(_pFont, _pText, x, y, _c);
}
}
void Check_Apply()
{
if(pMenuElementApply)
{
if((config.video.resolution.x != newWidth) ||
(config.video.resolution.y != newHeight) ||
(config.video.fullscreen != newFullscreen) ||
(config.video.bpp!=newBpp)) {
pMenuElementApply->SetCheckOn();
((CMenuElementText*)pMenuElementApply)->lColor=((CMenuElementText*)pMenuElementApply)->lOldColor;
}
else
{
if(((CMenuElementText*)pMenuElementApply)->lColor!=Color(127,127,127))
{
pMenuElementApply->SetCheckOff();
((CMenuElementText*)pMenuElementApply)->lOldColor=((CMenuElementText*)pMenuElementApply)->lColor;
((CMenuElementText*)pMenuElementApply)->lColor=Color(127,127,127);
}
}
}
}
//-----------------------------------------------------------------------------
static void FadeInOut(float _fVal)
{
TexturedVertex d3dvertex[4];
u32 iColor = Color::gray(_fVal).toBGR();
d3dvertex[0].p.x=0;
d3dvertex[0].p.y=0;
d3dvertex[0].p.z=0.f;
d3dvertex[0].rhw=0.999999f;
d3dvertex[0].color=iColor;
d3dvertex[1].p.x=static_cast(DANAESIZX);
d3dvertex[1].p.y=0;
d3dvertex[1].p.z=0.f;
d3dvertex[1].rhw=0.999999f;
d3dvertex[1].color=iColor;
d3dvertex[2].p.x=0;
d3dvertex[2].p.y=static_cast(DANAESIZY);
d3dvertex[2].p.z=0.f;
d3dvertex[2].rhw=0.999999f;
d3dvertex[2].color=iColor;
d3dvertex[3].p.x=static_cast(DANAESIZX);
d3dvertex[3].p.y=static_cast(DANAESIZY);
d3dvertex[3].p.z=0.f;
d3dvertex[3].rhw=0.999999f;
d3dvertex[3].color=iColor;
GRenderer->ResetTexture(0);
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendZero, Renderer::BlendInvSrcColor);
GRenderer->SetRenderState(Renderer::DepthWrite, false);
GRenderer->SetRenderState(Renderer::DepthTest, false);
GRenderer->SetCulling(Renderer::CullNone);
EERIEDRAWPRIM(Renderer::TriangleStrip, d3dvertex, 4, true);
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
GRenderer->SetRenderState(Renderer::DepthWrite, true);
GRenderer->SetRenderState(Renderer::DepthTest, true);
GRenderer->SetCulling(Renderer::CullCCW);
}
//-----------------------------------------------------------------------------
bool ProcessFadeInOut(bool _bFadeIn,float _fspeed)
{
FadeInOut(fFadeInOut);
if(!bFade) return true;
if(_bFadeIn)
{
fFadeInOut+=_fspeed*ARXDiffTimeMenu*( 1.0f / 100 );
if(fFadeInOut>1.f)
{
fFadeInOut=1.f;
bFade=false;
}
}
else
{
fFadeInOut-=_fspeed*ARXDiffTimeMenu*( 1.0f / 100 );
if(fFadeInOut<0.f)
{
fFadeInOut=0.f;
bFade=false;
}
}
return false;
}
//-----------------------------------------------------------------------------
bool Menu2_Render() {
if(pMenuCursor == NULL)
pMenuCursor = new MenuCursor();
pMenuCursor->Update();
ARXOldTimeMenu = ARXTimeMenu;
ARXTimeMenu = arxtime.get_updated( false );
ARXDiffTimeMenu = ARXTimeMenu-ARXOldTimeMenu;
// this means ArxTimeMenu is reset
if(ARXDiffTimeMenu < 0) {
ARXDiffTimeMenu = 0;
}
GRenderer->GetTextureStage(0)->SetMinFilter(TextureStage::FilterLinear);
GRenderer->GetTextureStage(0)->SetMagFilter(TextureStage::FilterLinear);
if(AMCM_NEWQUEST == ARXmenu.currentmode || AMCM_CREDITS == ARXmenu.currentmode) {
delete pWindowMenu, pWindowMenu = NULL;
delete pMenu, pMenu = NULL;
if(ARXmenu.currentmode == AMCM_CREDITS){
Credits::render();
return true;
}
return false;
}
GRenderer->BeginScene();
if(pTextManage) {
pTextManage->Clear();
}
GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapClamp);
GRenderer->SetRenderState(Renderer::Fog, false);
GRenderer->SetRenderState(Renderer::DepthWrite, false);
GRenderer->SetRenderState(Renderer::DepthTest, false);
GRenderer->SetCulling(Renderer::CullNone);
MENUSTATE eOldMenuState=NOP;
MENUSTATE eM;
if(!pMenu)
{
eM=NOP;
}
else
{
eM=pMenu->eOldMenuWindowState;
}
Color lColor = Color(232, 204, 142);
if( (!pMenu)|| ((pMenu)&&(pMenu->bReInitAll)) )
{
std::string szMenuText;
bool bBOOL = false;
CMenuElementText *me;
if(pMenu && pMenu->bReInitAll) {
eOldMenuState = pMenu->eOldMenuState;
delete pWindowMenu, pWindowMenu = NULL;
delete pMenu, pMenu = NULL;
}
pMenu = new CMenuState(MAIN);
pMenu->eOldMenuWindowState=eM;
pMenu->pTexBackGround = TextureContainer::LoadUI("graph/interface/menus/menu_main_background", TextureContainer::NoColorKey);
int iPosMenuPrincipaleX = 370;
int iPosMenuPrincipaleY=100;
int iDecMenuPrincipaleY=50;
#define MACRO_MENU_PRINCIPALE(MACRO_button,MACRO_menu,MACRO_locate,MACRO_check){\
szMenuText = getLocalised( MACRO_locate );\
me = new CMenuElementText(MACRO_button, hFontMainMenu, szMenuText, RATIO_X(iPosMenuPrincipaleX), RATIO_Y(iPosMenuPrincipaleY), lColor, 1.8f, MACRO_menu);\
if(MACRO_check)\
{\
pMenuElementResume=me;\
ARXMenu_GetResumeGame(bBOOL);\
if (bBOOL)\
{\
me->SetCheckOn();\
}\
else\
{\
me->SetCheckOff();\
me->lColor=Color(127,127,127);\
}\
}\
pMenu->AddMenuElement(me);\
iPosMenuPrincipaleY+=iDecMenuPrincipaleY;\
}
MACRO_MENU_PRINCIPALE(BUTTON_MENUMAIN_RESUMEGAME,RESUME_GAME,"system_menus_main_resumegame",1);
MACRO_MENU_PRINCIPALE(BUTTON_MENUMAIN_NEWQUEST,NEW_QUEST,"system_menus_main_newquest",0);
MACRO_MENU_PRINCIPALE(-1,EDIT_QUEST,"system_menus_main_editquest",0);
MACRO_MENU_PRINCIPALE(BUTTON_MENUMAIN_OPTIONS,OPTIONS,"system_menus_main_options",0);
MACRO_MENU_PRINCIPALE(BUTTON_MENUMAIN_CREDITS,CREDITS,"system_menus_main_credits",0);
MACRO_MENU_PRINCIPALE(-1,QUIT,"system_menus_main_quit",0);
#undef MACRO_MENU_PRINCIPALE
std::string version = arx_version;
if(!arx_release_codename.empty()) {
version += " \"";
version += arx_release_codename;
version += "\"";
}
float verPosX = RATIO_X(620) - hFontControls->getTextSize(version).x;
me = new CMenuElementText( -1, hFontControls, version, verPosX, RATIO_Y(80), lColor, 1.0f, NOP );
me->SetCheckOff();
me->lColor=Color(127,127,127);
pMenu->AddMenuElement(me);
}
bool bScroll=true;
{
if(pMenuElementResume)
{
bool bTemp;
ARXMenu_GetResumeGame(bTemp);
if(bTemp)
{
pMenuElementResume->SetCheckOn();
((CMenuElementText*)pMenuElementResume)->lColor=lColor;
}
else
{
pMenuElementResume->SetCheckOff();
((CMenuElementText*)pMenuElementResume)->lColor=Color(127,127,127);
}
}
MENUSTATE eMenuState = pMenu->Update(checked_range_cast(ARXDiffTimeMenu));
if(eOldMenuState!=NOP)
{
eMenuState=eOldMenuState;
bScroll=false;
}
if( eMenuState == RESUME_GAME )
{
pTextManage->Clear();
ARXmenu.currentmode = AMCM_OFF;
pMenu->eMenuState = NOP;
pMenu->pZoneClick = NULL;
delete pWindowMenu, pWindowMenu = NULL;
delete pMenu, pMenu = NULL;
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapRepeat);
GRenderer->SetRenderState(Renderer::DepthWrite, true);
GRenderer->SetRenderState(Renderer::DepthTest, true);
GRenderer->EndScene();
return true;
}
else if (eMenuState!=NOP )
{
pMenu->eOldMenuState=eMenuState;
delete pWindowMenu, pWindowMenu = NULL;
//suivant la resolution
int iWindowMenuWidth=(321);
int iWindowMenuHeight=(430);
int iWindowMenuPosX=(20);
int iWindowMenuPosY=(480-iWindowMenuHeight)>>1;
int iWindowConsoleOffsetX=(0);
int iWindowConsoleOffsetY=(14-10);
int iWindowConsoleWidth=(iWindowMenuWidth-iWindowConsoleOffsetX);
int iWindowConsoleHeight=(iWindowMenuHeight-iWindowConsoleOffsetY+20);
///////////////////////
float fPosX1 = RATIO_X(20);
float fPosX2 = RATIO_X(200);
int iPosX2 = checked_range_cast(fPosX2);
float fPosBack = RATIO_X(10);
float fPosBackY = RATIO_Y(190);
float fPosNext = RATIO_X(140);
float fPosApply = RATIO_X(240);
float fPosBDAY = RATIO_Y(380);
pWindowMenu = new CWindowMenu(iWindowMenuPosX,iWindowMenuPosY,iWindowMenuWidth,iWindowMenuHeight,1);
switch(eMenuState)
{
//------------------ START NEW_QUEST
case NEW_QUEST:
{
std::string szMenuText;
bool bBOOL = false;
ARXMenu_GetResumeGame(bBOOL);
if (!bBOOL)
{
break;
}
CMenuElement *me = NULL;
CWindowMenuConsole *pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,NEW_QUEST);
szMenuText = getLocalised( "system_menus_main_editquest_confirm" );
me=new CMenuElementText(-1, hFontMenu, szMenuText,0,0,lColor,1.f, NOP);
me->bCheck = false;
pWindowMenuConsole->AddMenuCenter(me);
szMenuText = getLocalised( "system_menus_main_newquest_confirm" );
me=new CMenuElementText(-1, hFontMenu, szMenuText,0,0,lColor,1.f, NOP);
me->bCheck = false;
pWindowMenuConsole->AddMenuCenter(me);
CMenuPanel *pPanel = new CMenuPanel();
szMenuText = getLocalised( "system_yes" );
szMenuText += " "; // TODO This space can probably go
me = new CMenuElementText(BUTTON_MENUNEWQUEST_CONFIRM, hFontMenu, szMenuText, 0, 0,lColor,1.f, NEW_QUEST_ENTER_GAME);
me->SetPos(RATIO_X(iWindowConsoleWidth - (me->GetWidth() + 10)),0);
pPanel->AddElementNoCenterIn(me);
szMenuText = getLocalised( "system_no" );
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosBack, 0,lColor,1.f, MAIN);
me->SetShortCut(Keyboard::Key_Escape);
pPanel->AddElementNoCenterIn(me);
pPanel->Move(0, checked_range_cast(fPosBDAY));
pWindowMenuConsole->AddMenu(pPanel);
pWindowMenu->AddConsole(pWindowMenuConsole);
pWindowMenu->eCurrentMenuState=NEW_QUEST;
}
break;
//------------------ END NEW_QUEST
case EDIT_QUEST:
{
CMenuElement *me;
CMenuElement *me01;
CMenuPanel *pPanel;
TextureContainer *pTex;
std::string szMenuText;
CWindowMenuConsole *pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,EDIT_QUEST);
szMenuText = getLocalised( "system_menus_main_editquest_load");
me = new CMenuElementText(BUTTON_MENUEDITQUEST_LOAD_INIT, hFontMenu, szMenuText, 0, 0, lColor, 1.f, EDIT_QUEST_LOAD);
me->lData = -1;
pWindowMenuConsole->AddMenuCenter(me);
szMenuText = getLocalised( "system_menus_main_editquest_save");
me = new CMenuElementText(-1, hFontMenu, szMenuText, 0, 0, lColor, 1.f, EDIT_QUEST_SAVE);
bool bBOOL;
ARXMenu_GetResumeGame(bBOOL);
if (!bBOOL)
{
me->SetCheckOff();
((CMenuElementText*)me)->lColor=Color(127,127,127);
}
pWindowMenuConsole->AddMenuCenter(me);
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(-1, fPosBack, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = MAIN;
me->SetShortCut(Keyboard::Key_Escape);
pWindowMenuConsole->AddMenu(me);
pWindowMenu->eCurrentMenuState = EDIT_QUEST;
pWindowMenu->AddConsole(pWindowMenuConsole);
// LOAD ---------------------------------------------------
pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY-(40),iWindowConsoleWidth,iWindowConsoleHeight,EDIT_QUEST_LOAD);
pWindowMenuConsole->lData = -1;
pWindowMenuConsole->iInterligne = 5;
pTex = TextureContainer::Load("graph/interface/icons/menu_main_load");
me = new CMenuCheckButton(-1, 0, 0, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
((CMenuCheckButton *)me)->bCheck = false;
pWindowMenuConsole->AddMenuCenter(me);
string quicksaveName = getLocalised("system_menus_main_quickloadsave", "Quicksave");
// TODO make this list scrollable
// TODO align the date part to the right!
{
size_t quicksaveNum = 0;
// Show quicksaves.
for(size_t i = 0; i < savegames.size(); i++) {
const SaveGame & save = savegames[i];
if(!save.quicksave) {
continue;
}
std::ostringstream text;
text << quicksaveName << ' ' << ++quicksaveNum << " " << save.time;
CMenuElement * e = new CMenuElementText(BUTTON_MENUEDITQUEST_LOAD, hFontControls,
text.str(), fPosX1, 0.f, lColor, .8f, NOP);
e->lData = i;
pWindowMenuConsole->AddMenuCenterY(e);
}
// Show regular saves.
for(size_t i = 0; i < savegames.size(); i++) {
const SaveGame & save = savegames[i];
if(save.quicksave) {
continue;
}
string text = save.name + " " + save.time;
CMenuElement * e = new CMenuElementText(BUTTON_MENUEDITQUEST_LOAD, hFontControls,
text, fPosX1, 0.f, lColor, 0.8f, NOP);
e->lData = i;
pWindowMenuConsole->AddMenuCenterY(e);
}
CMenuElement * confirm = new CMenuElementText(-1, hFontControls, " ", fPosX1, 0.f,
lColor, 0.8f, EDIT_QUEST_SAVE_CONFIRM);
confirm->SetCheckOff();
confirm->lData = -1;
pWindowMenuConsole->AddMenuCenterY(confirm);
// Delete button
szMenuText = getLocalised("system_menus_main_editquest_delete");
szMenuText += " ";
me = new CMenuElementText(BUTTON_MENUEDITQUEST_DELETE_CONFIRM, hFontMenu, szMenuText, 0, 0,lColor,1.f, EDIT_QUEST_LOAD);
me->SetPos(RATIO_X(iWindowConsoleWidth-10)-me->GetWidth(), RATIO_Y(42));
pDeleteConfirm=(CMenuElementText*)me;
me->SetCheckOff();
((CMenuElementText*)me)->lOldColor = ((CMenuElementText*)me)->lColor;
((CMenuElementText*)me)->lColor = Color::grayb(127);
pWindowMenuConsole->AddMenu(me);
// Load button
szMenuText = getLocalised("system_menus_main_editquest_load");
szMenuText += " ";
me = new CMenuElementText(BUTTON_MENUEDITQUEST_LOAD_CONFIRM, hFontMenu, szMenuText, 0, 0,lColor,1.f, MAIN);
me->SetPos(RATIO_X(iWindowConsoleWidth-10)-me->GetWidth(), fPosBDAY + RATIO_Y(40));
pLoadConfirm=(CMenuElementText*)me;
me->SetCheckOff();
((CMenuElementText*)me)->lOldColor = ((CMenuElementText*)me)->lColor;
((CMenuElementText*)me)->lColor = Color::grayb(127);
pWindowMenuConsole->AddMenu(me);
// Back button
CMenuPanel *pc = new CMenuPanel();
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(-1, fPosBack, fPosBackY + RATIO_Y(20), pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = EDIT_QUEST;
me->SetShortCut(Keyboard::Key_Escape);
pc->AddElementNoCenterIn(me);
pWindowMenuConsole->AddMenu(pc);
}
pWindowMenu->AddConsole(pWindowMenuConsole);
// SAVE----------------------------------------------------
pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY - (40), iWindowConsoleWidth,iWindowConsoleHeight,EDIT_QUEST_SAVE);
pWindowMenuConsole->iInterligne = 5;
pTex = TextureContainer::Load("graph/interface/icons/menu_main_save");
me = new CMenuCheckButton(-1, fPosBack, 0, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
((CMenuCheckButton *)me)->bCheck = false;
pWindowMenuConsole->AddMenuCenter(me);
size_t quicksaveNum = 0;
// Show quicksaves.
for(size_t i = 0; i < savegames.size(); i++) {
const SaveGame & save = savegames[i];
if(!save.quicksave) {
continue;
}
std::ostringstream text;
text << quicksaveName << ' ' << ++quicksaveNum << " " << save.time;
CMenuElement * e = new CMenuElementText(BUTTON_MENUEDITQUEST_SAVEINFO, hFontControls,
text.str(), fPosX1, 0.f, Color::grayb(127),
.8f, EDIT_QUEST_SAVE_CONFIRM);
e->SetCheckOff();
e->lData = i;
pWindowMenuConsole->AddMenuCenterY(e);
}
// Show regular saves.
for(size_t i = 0; i < savegames.size(); i++) {
const SaveGame & save = savegames[i];
if(save.quicksave) {
continue;
}
string text = save.name + " " + save.time;
CMenuElement * e = new CMenuElementText(BUTTON_MENUEDITQUEST_SAVEINFO, hFontControls,
text, fPosX1, 0.f, lColor, .8f,
EDIT_QUEST_SAVE_CONFIRM);
e->lData = i;
pWindowMenuConsole->AddMenuCenterY(e);
}
for(size_t i = savegames.size(); i <= 15; i++) {
std::ostringstream text;
text << '-' << std::setfill('0') << std::setw(4) << i << '-';
CMenuElementText * e = new CMenuElementText(BUTTON_MENUEDITQUEST_SAVEINFO, hFontControls, text.str(), fPosX1,
0.f, lColor, .8f,
EDIT_QUEST_SAVE_CONFIRM);
e->eMenuState = EDIT_QUEST_SAVE_CONFIRM;
e->lData = -1;
pWindowMenuConsole->AddMenuCenterY(e);
}
me01 = new CMenuElementText(-1, hFontControls, " ", fPosX1, 0.f, lColor, 0.8f, EDIT_QUEST_SAVE_CONFIRM);
me01->lData = -1;
me01->SetCheckOff();
pWindowMenuConsole->AddMenuCenterY((CMenuElementText*)me01);
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(-1, fPosBack, fPosBackY + RATIO_Y(20), pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = EDIT_QUEST;
me->SetShortCut(Keyboard::Key_Escape);
pWindowMenuConsole->AddMenu(me);
pWindowMenu->AddConsole(pWindowMenuConsole);
// SAVE CONFIRM--------------------------------------------
pWindowMenuConsole = new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,EDIT_QUEST_SAVE_CONFIRM);
pWindowMenuConsole->lData = -1;
pTex = TextureContainer::Load("graph/interface/icons/menu_main_save");
me = new CMenuCheckButton(-1, 0, 0, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
((CMenuCheckButton *)me)->bCheck = false;
pWindowMenuConsole->AddMenuCenter(me);
szMenuText = getLocalised("system_menu_editquest_newsavegame", "---");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->lData = -1;
pWindowMenuConsole->AddMenuCenter(me);
me->eState=EDIT;
me->ePlace=CENTER;
pPanel = new CMenuPanel();
// Delete button
szMenuText = getLocalised("system_menus_main_editquest_delete");
me = new CMenuElementText(BUTTON_MENUEDITQUEST_DELETE, hFontMenu, szMenuText, 0, 0,lColor,1.f, EDIT_QUEST_SAVE);
me->SetPos(RATIO_X(iWindowConsoleWidth-10)-me->GetWidth(), RATIO_Y(5));
pDeleteButton = (CMenuElementText*)me;
((CMenuElementText*)me)->lOldColor = ((CMenuElementText*)me)->lColor;
pPanel->AddElementNoCenterIn(me);
// Save button
szMenuText = getLocalised("system_menus_main_editquest_save");
me = new CMenuElementText(BUTTON_MENUEDITQUEST_SAVE, hFontMenu, szMenuText, 0, 0,lColor,1.f, MAIN);
me->SetPos(RATIO_X(iWindowConsoleWidth-10)-me->GetWidth(), fPosBDAY);
pPanel->AddElementNoCenterIn(me);
// Back button
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(-1, fPosBack, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = EDIT_QUEST_SAVE;
me->SetShortCut(Keyboard::Key_Escape);
pPanel->AddElementNoCenterIn(me);
pWindowMenuConsole->AddMenu(pPanel);
pWindowMenu->AddConsole(pWindowMenuConsole);
}
break;
case OPTIONS:
{
std::string szMenuText;
CMenuElement *me;
CMenuPanel *pc;
TextureContainer *pTex;
CWindowMenuConsole *pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,OPTIONS);
szMenuText = getLocalised("system_menus_options_video");
me = new CMenuElementText(BUTTON_MENUOPTIONSVIDEO_INIT, hFontMenu, szMenuText, 0, 0,lColor,1.f,OPTIONS_VIDEO);
pWindowMenuConsole->AddMenuCenter(me);
szMenuText = getLocalised("system_menus_options_audio");
me = new CMenuElementText(-1, hFontMenu, szMenuText, 0, 0,lColor,1.f,OPTIONS_AUDIO);
pWindowMenuConsole->AddMenuCenter(me);
szMenuText = getLocalised("system_menus_options_input");
me = new CMenuElementText(-1, hFontMenu, szMenuText, 0, 0,lColor,1.f,OPTIONS_INPUT);
pWindowMenuConsole->AddMenuCenter(me);
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(-1, fPosBack, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = MAIN;
me->SetShortCut(Keyboard::Key_Escape);
pWindowMenuConsole->AddMenu(me);
pWindowMenu->AddConsole(pWindowMenuConsole);
//------------------ END OPTIONS
//------------------ START VIDEO
pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY - (35),iWindowConsoleWidth,iWindowConsoleHeight, OPTIONS_VIDEO);
// Renderer selection
{
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_video_renderer", "Renderer");
szMenuText += " ";
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
CMenuSliderText * slider = new CMenuSliderText(BUTTON_MENUOPTIONSVIDEO_RENDERER, 0, 0);
slider->AddText(new CMenuElementText(-1, hFontMenu, "Auto-Select", 0, 0, lColor, 1.f, OPTIONS_VIDEO_RENDERER_AUTOMATIC));
slider->iPos = slider->vText.size() - 1;
#ifdef ARX_HAVE_SDL
slider->AddText(new CMenuElementText(-1, hFontMenu, "OpenGL", 0, 0, lColor, 1.f, OPTIONS_VIDEO_RENDERER_OPENGL));
if(config.window.framework == "SDL") {
slider->iPos = slider->vText.size() - 1;
}
#endif
#ifdef ARX_HAVE_D3D9
slider->AddText(new CMenuElementText(-1, hFontMenu, "D3D 9", 0, 0, lColor, 1.f, OPTIONS_VIDEO_RENDERER_D3D9));
if(config.window.framework == "D3D9") {
slider->iPos = slider->vText.size() - 1;
}
#endif
float fRatio = (RATIO_X(iWindowConsoleWidth-9) - slider->GetWidth());
slider->Move(checked_range_cast(fRatio), 0);
pc->AddElement(slider);
pWindowMenuConsole->AddMenuCenterY(pc);
}
szMenuText = getLocalised("system_menus_options_videos_full_screen");
if(szMenuText.empty()) {
// TODO once we ship our own amendmends to the loc files a cleaner
// fix would be to just define system_menus_options_videos_full_screen
// for the german version there
szMenuText = getLocalised("system_menus_options_video_full_screen");
}
szMenuText += " ";
CMenuElementText * metemp = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
metemp->SetCheckOff();
TextureContainer *pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
TextureContainer *pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
fullscreenCheckbox = new CMenuCheckButton(BUTTON_MENUOPTIONSVIDEO_FULLSCREEN, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, metemp);
fullscreenCheckbox->iState= config.video.fullscreen ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(fullscreenCheckbox);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_video_resolution");
szMenuText += " ";
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
pMenuSliderResol = new CMenuSliderText(BUTTON_MENUOPTIONSVIDEO_RESOLUTION, 0, 0);
pMenuSliderResol->setEnabled(config.video.fullscreen);
std::vector vBpp;
const RenderWindow::DisplayModes & modes = mainApp->GetWindow()->getDisplayModes();
for(size_t i = 0; i != modes.size(); ++i) {
const RenderWindow::DisplayMode & mode = modes[i];
if(std::find(vBpp.begin(), vBpp.end(), mode.depth) == vBpp.end()) {
vBpp.push_back(mode.depth);
}
if(mode.depth != unsigned(config.video.bpp)) {
continue;
}
// find the aspect ratio
unsigned a = mode.resolution.x;
unsigned b = mode.resolution.y;
while(b != 0) {
unsigned t = a % b;
a = b, b = t;
}
Vec2i aspect = mode.resolution / a;
std::stringstream ss;
ss << mode.resolution.x << 'x' << mode.resolution.y;
if(aspect.x < 100 && aspect.y < 100) {
if(aspect == Vec2i(8, 5)) {
aspect = Vec2i(16, 10);
}
ss << " (" << aspect.x << ':' << aspect.y << ')';
}
pMenuSliderResol->AddText(new CMenuElementText(-1, hFontMenu, ss.str(), 0, 0, lColor, 1.f, MENUSTATE(OPTIONS_VIDEO_RESOLUTION_0 + i)));
if(mode.resolution == config.video.resolution) {
pMenuSliderResol->iPos = pMenuSliderResol->vText.size() - 1;
}
}
pMenuSliderResol->AddText(new CMenuElementText(-1, hFontMenu, AUTO_RESOLUTION_STRING, 0, 0, lColor, 1.f, MENUSTATE(OPTIONS_VIDEO_RESOLUTION_0 + modes.size())));
if(config.video.resolution == Vec2i::ZERO) {
pMenuSliderResol->iPos = pMenuSliderResol->vText.size() - 1;
}
float fRatio = (RATIO_X(iWindowConsoleWidth-9) - pMenuSliderResol->GetWidth());
pMenuSliderResol->Move(checked_range_cast(fRatio), 0);
pc->AddElement(pMenuSliderResol);
pWindowMenuConsole->AddMenuCenterY(pc);
int iSize = me->GetWidth();
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_video_bpp");
szMenuText += " ";
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSliderText(BUTTON_MENUOPTIONSVIDEO_BPP, 0, 0);
pMenuSliderBpp = (CMenuSliderText*)me;
pMenuSliderBpp->setEnabled(config.video.fullscreen);
std::sort(vBpp.begin(), vBpp.end());
std::vector::iterator ii;
for(ii=vBpp.begin();ii!=vBpp.end();++ii)
{
std::stringstream bpp;
bpp << *ii;
((CMenuSliderText*)me)->AddText(new CMenuElementText(-1, hFontMenu, bpp.str(), 0, 0, lColor, 1.f, (MENUSTATE)(BUTTON_MENUOPTIONSVIDEO_BPP)));
if(*ii == unsigned(config.video.bpp)) {
((CMenuSliderText*)me)->iPos = ((CMenuSliderText*)me)->vText.size()-1;
}
}
((CMenuSliderText *)me)->SetWidth(iSize);
fRatio = (RATIO_X(iWindowConsoleWidth-9) - me->GetWidth());
me->Move(checked_range_cast(fRatio), 0);
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_detail");
szMenuText += " ";
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSliderText(BUTTON_MENUOPTIONSVIDEO_OTHERSDETAILS, 0, 0);
szMenuText = getLocalised("system_menus_options_video_texture_low");
((CMenuSliderText *)me)->AddText(new CMenuElementText(-1, hFontMenu, szMenuText, 0, 0,lColor,1.f, OPTIONS_OTHERDETAILS));
szMenuText = getLocalised("system_menus_options_video_texture_med");
((CMenuSliderText *)me)->AddText(new CMenuElementText(-1, hFontMenu, szMenuText, 0, 0,lColor,1.f, OPTIONS_OTHERDETAILS));
szMenuText = getLocalised("system_menus_options_video_texture_high");
((CMenuSliderText *)me)->AddText(new CMenuElementText(-1, hFontMenu, szMenuText, 0, 0,lColor,1.f, OPTIONS_OTHERDETAILS));
fRatio = (RATIO_X(iWindowConsoleWidth-9) - me->GetWidth());
me->Move(checked_range_cast(fRatio), 0);
pc->AddElement(me);
((CMenuSliderText *)me)->iPos = config.video.levelOfDetail;
pWindowMenuConsole->AddMenuCenterY(pc);
bool bBOOL = false;
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_video_brouillard");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSlider(BUTTON_MENUOPTIONSVIDEO_FOG, iPosX2, 0);
((CMenuSlider *)me)->setValue(config.video.fogDistance);
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
szMenuText = getLocalised("system_menus_options_video_crosshair", "Show Crosshair");
szMenuText += " ";
metemp = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
metemp->SetCheckOff();
me = new CMenuCheckButton(BUTTON_MENUOPTIONSVIDEO_CROSSHAIR, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, metemp);
((CMenuCheckButton*)me)->iState= config.video.showCrosshair ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(me);
szMenuText = getLocalised("system_menus_options_video_antialiasing", "antialiasing");
szMenuText += " ";
pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
metemp = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
metemp->SetCheckOff();
me = new CMenuCheckButton(BUTTON_MENUOPTIONSVIDEO_ANTIALIASING, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, metemp);
((CMenuCheckButton*)me)->iState= config.video.antialiasing ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(me);
ARX_SetAntiAliasing();
szMenuText = getLocalised("system_menus_options_video_vsync", "VSync");
szMenuText += " ";
pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
metemp = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
metemp->SetCheckOff();
me = new CMenuCheckButton(BUTTON_MENUOPTIONSVIDEO_VSYNC, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, metemp);
((CMenuCheckButton*)me)->iState= config.video.vsync ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(me);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_video_apply");
szMenuText += " ";
pMenuElementApply = me = new CMenuElementText(BUTTON_MENUOPTIONSVIDEO_APPLY, hFontMenu, szMenuText, fPosApply, 0.f, lColor, 1.f, NOP);
me->SetPos(RATIO_X(iWindowConsoleWidth-10)-me->GetWidth(), fPosBDAY + RATIO_Y(40));
me->SetCheckOff();
pc->AddElementNoCenterIn(me);
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(BUTTON_MENUOPTIONSVIDEO_BACK, fPosBack, fPosBackY + RATIO_Y(20), pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = OPTIONS;
me->SetShortCut(Keyboard::Key_Escape);
pc->AddElementNoCenterIn(me);
pWindowMenuConsole->AddMenu(pc);
pWindowMenu->AddConsole(pWindowMenuConsole);
//------------------ END VIDEO
//------------------ START AUDIO
pWindowMenuConsole = new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,OPTIONS_AUDIO);
// Audio backend selection
{
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_audio_backend", "Backend");
szMenuText += " ";
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
CMenuSliderText * slider = new CMenuSliderText(BUTTON_MENUOPTIONSAUDIO_BACKEND, 0, 0);
slider->AddText(new CMenuElementText(-1, hFontMenu, "Auto-Select", 0, 0, lColor, 1.f, OPTIONS_AUDIO_BACKEND_AUTOMATIC));
slider->iPos = slider->vText.size() - 1;
#ifdef ARX_HAVE_OPENAL
slider->AddText(new CMenuElementText(-1, hFontMenu, "OpenAL", 0, 0, lColor, 1.f, OPTIONS_AUDIO_BACKEND_OPENAL));
if(config.audio.backend == "OpenAL") {
slider->iPos = slider->vText.size() - 1;
}
#endif
#ifdef ARX_HAVE_DSOUND
slider->AddText(new CMenuElementText(-1, hFontMenu, "Direct Sound", 0, 0, lColor, 1.f, OPTIONS_AUDIO_BACKEND_DSOUND));
if(config.audio.backend == "DirectSound") {
slider->iPos = slider->vText.size() - 1;
}
#endif
float fRatio = (RATIO_X(iWindowConsoleWidth-9) - slider->GetWidth());
slider->Move(checked_range_cast(fRatio), 0);
pc->AddElement(slider);
pWindowMenuConsole->AddMenuCenterY(pc);
}
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_audio_master_volume");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_AUDIO_VOLUME);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSlider(BUTTON_MENUOPTIONSAUDIO_MASTER, iPosX2, 0);
((CMenuSlider *)me)->setValue((int)config.audio.volume); // TODO use float sliders
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_audio_effects_volume");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_AUDIO);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSlider(BUTTON_MENUOPTIONSAUDIO_SFX, iPosX2, 0);
((CMenuSlider *)me)->setValue((int)config.audio.sfxVolume);
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_audio_speech_volume");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_AUDIO);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSlider(BUTTON_MENUOPTIONSAUDIO_SPEECH, iPosX2, 0);
((CMenuSlider *)me)->setValue((int)config.audio.speechVolume);
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_audio_ambiance_volume");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_AUDIO);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSlider(BUTTON_MENUOPTIONSAUDIO_AMBIANCE, iPosX2, 0);
((CMenuSlider *)me)->setValue((int)config.audio.ambianceVolume);
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
szMenuText = getLocalised("system_menus_options_audio_eax", "EAX");
szMenuText += " ";
pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
CMenuElementText * pElementText = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_INPUT);
me = new CMenuCheckButton(BUTTON_MENUOPTIONSAUDIO_EAX, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, pElementText);
((CMenuCheckButton*)me)->iState = config.audio.eax ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(me);
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(-1, fPosBack, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = OPTIONS;
me->SetShortCut(Keyboard::Key_Escape);
pWindowMenuConsole->AddMenu(me);
pWindowMenu->AddConsole(pWindowMenuConsole);
//------------------ END AUDIO
//------------------ START INPUT
pWindowMenuConsole = new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight, OPTIONS_INPUT);
// Input backend selection
{
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_input_backend", "Backend");
szMenuText += " ";
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
CMenuSliderText * slider = new CMenuSliderText(BUTTON_MENUOPTIONS_CONTROLS_BACKEND, 0, 0);
slider->AddText(new CMenuElementText(-1, hFontMenu, "Auto-Select", 0, 0, lColor, 1.f, OPTIONS_INPUT_BACKEND_AUTOMATIC));
slider->iPos = slider->vText.size() - 1;
#ifdef ARX_HAVE_SDL
slider->AddText(new CMenuElementText(-1, hFontMenu, "SDL", 0, 0, lColor, 1.f, OPTIONS_INPUT_BACKEND_SDL));
if(config.input.backend == "SDL") {
slider->iPos = slider->vText.size() - 1;
}
#endif
#ifdef ARX_HAVE_DINPUT8
slider->AddText(new CMenuElementText(-1, hFontMenu, "DInput 8", 0, 0, lColor, 1.f, OPTIONS_INPUT_BACKEND_DINPUT));
if(config.input.backend == "DirectInput8") {
slider->iPos = slider->vText.size() - 1;
}
#endif
float fRatio = (RATIO_X(iWindowConsoleWidth-9) - slider->GetWidth());
slider->Move(checked_range_cast(fRatio), 0);
pc->AddElement(slider);
pWindowMenuConsole->AddMenuCenterY(pc);
}
szMenuText = getLocalised("system_menus_options_input_customize_controls");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_INPUT_CUSTOMIZE_KEYS_1);
pWindowMenuConsole->AddMenuCenterY(me);
szMenuText = getLocalised("system_menus_options_input_invert_mouse");
szMenuText += " ";
pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
me = new CMenuCheckButton(BUTTON_MENUOPTIONS_CONTROLS_INVERTMOUSE, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_INPUT));
bBOOL = false;
ARXMenu_Options_Control_GetInvertMouse(bBOOL);
if (bBOOL)
{
((CMenuCheckButton*)me)->iState=1;
}
else
{
((CMenuCheckButton*)me)->iState=0;
}
pWindowMenuConsole->AddMenuCenterY(me);
szMenuText = getLocalised("system_menus_options_auto_ready_weapon");
szMenuText += " ";
pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
me = new CMenuCheckButton(BUTTON_MENUOPTIONS_CONTROLS_AUTOREADYWEAPON, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_INPUT));
((CMenuCheckButton*)me)->iState = config.input.autoReadyWeapon ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(me);
szMenuText = getLocalised("system_menus_options_input_mouse_look_toggle");
szMenuText += " ";
pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
me = new CMenuCheckButton(BUTTON_MENUOPTIONS_CONTROLS_MOUSELOOK, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_INPUT));
((CMenuCheckButton*)me)->iState = config.input.mouseLookToggle ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(me);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_input_mouse_sensitivity");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSlider(BUTTON_MENUOPTIONS_CONTROLS_MOUSESENSITIVITY, iPosX2, 0);
((CMenuSlider*)me)->setValue(config.input.mouseSensitivity);
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
szMenuText = getLocalised("system_menus_autodescription", "auto_description");
szMenuText += " ";
pTex1 = TextureContainer::Load("graph/interface/menus/menu_checkbox_off");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_checkbox_on");
me = new CMenuCheckButton(BUTTON_MENUOPTIONS_CONTROLS_AUTODESCRIPTION, 0, 0, pTex1->m_dwWidth, pTex1, pTex2, new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, OPTIONS_INPUT));
((CMenuCheckButton*)me)->iState = config.input.autoDescription ? 1 : 0;
pWindowMenuConsole->AddMenuCenterY(me);
pc = new CMenuPanel();
szMenuText = getLocalised("system_menus_options_misc_quicksave_slots", "Quicksave slots");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosX1, 0.f, lColor, 1.f, NOP);
me->SetCheckOff();
pc->AddElement(me);
me = new CMenuSlider(BUTTON_MENUOPTIONS_CONTROLS_QUICKSAVESLOTS, iPosX2, 0);
((CMenuSlider*)me)->setValue(config.misc.quicksaveSlots);
pc->AddElement(me);
pWindowMenuConsole->AddMenuCenterY(pc);
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(-1, fPosBack, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = OPTIONS;
me->SetShortCut(Keyboard::Key_Escape);
pWindowMenuConsole->AddMenu(me);
pWindowMenu->AddConsole(pWindowMenuConsole);
//------------------ END INPUT
//------------------ START CUSTOM CONTROLS
char pNoDef1[]="---";
char pNoDef2[]="---";
#define CUSTOM_CTRL_X0 RATIO_X(20)
#define CUSTOM_CTRL_X1 RATIO_X(150)
#define CUSTOM_CTRL_X2 RATIO_X(245)
long fControlPosY = static_cast(RATIO_Y(8.f));
#define CUSTOM_CTRL_FUNC(a,b,c,d){\
pc=new CMenuPanel();\
szMenuText = getLocalised(a, "?");\
me = new CMenuElementText(-1, hFontControls, szMenuText, CUSTOM_CTRL_X0, 0,lColor,.7f, NOP);\
me->SetCheckOff();\
pc->AddElement(me);\
me = new CMenuElementText(c, hFontControls, pNoDef1, CUSTOM_CTRL_X1, 0,lColor,.7f, NOP);\
me->eState=GETTOUCH;\
if((!b)||(c<0))\
{\
me->SetCheckOff();\
((CMenuElementText*)me)->lColor=Color(127,127,127);\
}\
pc->AddElement(me);\
me = new CMenuElementText(d, hFontControls, pNoDef2, CUSTOM_CTRL_X2, 0,lColor,.7f, NOP);\
me->eState=GETTOUCH;\
if(d<0)\
{\
me->SetCheckOff();\
((CMenuElementText*)me)->lColor=Color(127,127,127);\
}\
pc->AddElement(me);\
pc->Move(0,fControlPosY);\
pWindowMenuConsole->AddMenu(pc);\
fControlPosY += static_cast( pc->GetHeight() + RATIO_Y(3.f) );\
};
#define CUSTOM_CTRL_FUNC2(a,b,c,d){\
pc=new CMenuPanel();\
szMenuText = getLocalised(a, "?");\
szMenuText += "2";\
me = new CMenuElementText(-1, hFontControls, szMenuText, CUSTOM_CTRL_X0, 0,lColor,.7f, NOP);\
me->SetCheckOff();\
pc->AddElement(me);\
me = new CMenuElementText(c, hFontControls, pNoDef1, CUSTOM_CTRL_X1, 0,lColor,.7f, NOP);\
me->eState=GETTOUCH;\
if((!b)||(c<0))\
{\
me->SetCheckOff();\
((CMenuElementText*)me)->lColor=Color(127,127,127);\
}\
pc->AddElement(me);\
me = new CMenuElementText(d, hFontControls, pNoDef2, CUSTOM_CTRL_X2, 0,lColor,.7f, NOP);\
me->eState=GETTOUCH;\
if(d<0)\
{\
me->SetCheckOff();\
((CMenuElementText*)me)->lColor=Color(127,127,127);\
}\
pc->AddElement(me);\
pc->Move(0,fControlPosY);\
pWindowMenuConsole->AddMenu(pc);\
fControlPosY += static_cast( pc->GetHeight() + RATIO_Y(3.f) );\
};
#define CUSTOM_CTRL_FUNC3(a,default,b,c,d){\
pc=new CMenuPanel();\
szMenuText = getLocalised(a, default);\
me = new CMenuElementText(-1, hFontControls, szMenuText, CUSTOM_CTRL_X0, 0,lColor,.7f, NOP);\
me->SetCheckOff();\
pc->AddElement(me);\
me = new CMenuElementText(c, hFontControls, pNoDef1, CUSTOM_CTRL_X1, 0,lColor,.7f, NOP);\
me->eState=GETTOUCH;\
if((!b)||(c<0))\
{\
me->SetCheckOff();\
((CMenuElementText*)me)->lColor=Color(127,127,127);\
}\
pc->AddElement(me);\
me = new CMenuElementText(d, hFontControls, pNoDef2, CUSTOM_CTRL_X2, 0,lColor,.7f, NOP);\
me->eState=GETTOUCH;\
if(d<0)\
{\
me->SetCheckOff();\
((CMenuElementText*)me)->lColor=Color(127,127,127);\
}\
pc->AddElement(me);\
pc->Move(0,fControlPosY);\
pWindowMenuConsole->AddMenu(pc);\
fControlPosY += static_cast( pc->GetHeight() + RATIO_Y(3.f) );\
};
pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,OPTIONS_INPUT_CUSTOMIZE_KEYS_1);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_mouselook",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_MOUSELOOK1, BUTTON_MENUOPTIONS_CONTROLS_CUST_MOUSELOOK2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_action_combine",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE1, BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_jump",1,BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP1, BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_magic_mode",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_MAGICMODE1, BUTTON_MENUOPTIONS_CONTROLS_CUST_MAGICMODE2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_stealth_mode",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STEALTHMODE1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STEALTHMODE2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_walk_forward",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKFORWARD1, BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKFORWARD2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_walk_backward",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKBACKWARD1, BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKBACKWARD2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_strafe_left",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFELEFT1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFELEFT2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_strafe_right",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFERIGHT1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFERIGHT2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_lean_left",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANLEFT1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANLEFT2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_lean_right",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANRIGHT1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANRIGHT2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_crouch",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCH1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCH2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_crouch_toggle",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCHTOGGLE1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCHTOGGLE2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_strafe",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFE1, BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFE2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_center_view",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CENTERVIEW1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CENTERVIEW2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_freelook",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_FREELOOK1, BUTTON_MENUOPTIONS_CONTROLS_CUST_FREELOOK2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_turn_left",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNLEFT1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNLEFT2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_turn_right",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNRIGHT1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNRIGHT2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_look_up",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKUP1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKUP2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_look_down",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKDOWN1, BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKDOWN2);
pc=new CMenuPanel();
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(BUTTON_MENUOPTIONS_CONTROLS_CUST_BACK, fPosBack, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = OPTIONS_INPUT;
me->SetShortCut(Keyboard::Key_Escape);
pc->AddElementNoCenterIn(me);
szMenuText = getLocalised( "system_menus_options_input_customize_default" );
me = new CMenuElementText(BUTTON_MENUOPTIONS_CONTROLS_CUST_DEFAULT, hFontMenu, szMenuText, 0, 0,lColor,1.f, NOP);
me->SetPos((RATIO_X(iWindowConsoleWidth) - me->GetWidth())*0.5f, fPosBDAY);
pc->AddElementNoCenterIn(me);
pTex = TextureContainer::Load("graph/interface/menus/next");
me = new CMenuCheckButton(BUTTON_MENUOPTIONS_CONTROLS_CUST_BACK, fPosNext, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = OPTIONS_INPUT_CUSTOMIZE_KEYS_2;
me->SetShortCut(Keyboard::Key_Escape);
pc->AddElementNoCenterIn(me);
pWindowMenuConsole->AddMenu(pc);
pWindowMenu->AddConsole(pWindowMenuConsole);
pWindowMenuConsole->ReInitActionKey();
pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,OPTIONS_INPUT_CUSTOMIZE_KEYS_2);
fControlPosY = static_cast(RATIO_Y(8.f));
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_inventory",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_INVENTORY1, BUTTON_MENUOPTIONS_CONTROLS_CUST_INVENTORY2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_book",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOK1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOK2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_bookcharsheet",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKCHARSHEET1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKCHARSHEET2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_bookmap",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKMAP1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKMAP2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_bookspell",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKSPELL1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKSPELL2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_bookquest",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKQUEST1, BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKQUEST2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_drink_potion_life",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONLIFE1, BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONLIFE2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_drink_potion_mana",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONMANA1, BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONMANA2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_torch",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TORCH1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TORCH2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_cancelcurrentspell",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CANCELCURSPELL1, BUTTON_MENUOPTIONS_CONTROLS_CUST_CANCELCURSPELL2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_precast1",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST1, BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST1_2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_precast2",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST2, BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST2_2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_precast3",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST3, BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST3_2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_weapon",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_WEAPON1, BUTTON_MENUOPTIONS_CONTROLS_CUST_WEAPON2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_unequipweapon",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_UNEQUIPWEAPON1, BUTTON_MENUOPTIONS_CONTROLS_CUST_UNEQUIPWEAPON2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_previous",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_PREVIOUS1, BUTTON_MENUOPTIONS_CONTROLS_CUST_PREVIOUS2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_next",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_NEXT1, BUTTON_MENUOPTIONS_CONTROLS_CUST_NEXT2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_quickload",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKLOAD, BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKLOAD2);
CUSTOM_CTRL_FUNC("system_menus_options_input_customize_controls_quicksave",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKSAVE, BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKSAVE2);
CUSTOM_CTRL_FUNC2("system_menus_options_input_customize_controls_bookmap",1, BUTTON_MENUOPTIONS_CONTROLS_CUST_MINIMAP1, BUTTON_MENUOPTIONS_CONTROLS_CUST_MINIMAP2);
CUSTOM_CTRL_FUNC3("system_menus_options_input_customize_controls_toggle_fullscreen", "Toggle fullscreen", 1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TOGGLE_FULLSCREEN1, BUTTON_MENUOPTIONS_CONTROLS_CUST_TOGGLE_FULLSCREEN2);
pc=new CMenuPanel();
pTex = TextureContainer::Load("graph/interface/menus/back");
me = new CMenuCheckButton(BUTTON_MENUOPTIONS_CONTROLS_CUST_BACK, fPosBack, fPosBackY, pTex?pTex->m_dwWidth:0, pTex, NULL, NULL);
me->eMenuState = OPTIONS_INPUT_CUSTOMIZE_KEYS_1;
me->SetShortCut(Keyboard::Key_Escape);
pc->AddElementNoCenterIn(me);
szMenuText = getLocalised( "system_menus_options_input_customize_default" );
me = new CMenuElementText(BUTTON_MENUOPTIONS_CONTROLS_CUST_DEFAULT, hFontMenu, szMenuText, 0, 0,lColor,1.f, NOP);
me->SetPos((RATIO_X(iWindowConsoleWidth) - me->GetWidth())*0.5f, fPosBDAY);
pc->AddElementNoCenterIn(me);
pWindowMenuConsole->AddMenu(pc);
pWindowMenu->AddConsole(pWindowMenuConsole);
pWindowMenuConsole->ReInitActionKey();
#undef CUSTOM_CTRL_X0
#undef CUSTOM_CTRL_X1
#undef CUSTOM_CTRL_X2
#undef CUSTOM_CTRL_FUNC
#undef CUSTOM_CTRL_FUNC2
#undef CUSTOM_CTRL_FUNC3
//------------------ END CUSTOM CONTROLS
pWindowMenu->eCurrentMenuState=OPTIONS;
}
break;
case QUIT:
{
std::string szMenuText;
CMenuElement *me = NULL;
CWindowMenuConsole *pWindowMenuConsole=new CWindowMenuConsole(iWindowConsoleOffsetX,iWindowConsoleOffsetY,iWindowConsoleWidth,iWindowConsoleHeight,QUIT);
szMenuText = getLocalised("system_menus_main_quit");
me=new CMenuElementText(-1, hFontMenu, szMenuText,0,0,lColor,1.f, NOP);
me->bCheck = false;
pWindowMenuConsole->AddMenuCenter(me);
szMenuText = getLocalised("system_menus_main_editquest_confirm");
me=new CMenuElementText(-1, hFontMenu, szMenuText,0,0,lColor,1.f, NOP);
me->bCheck = false;
pWindowMenuConsole->AddMenuCenter(me);
CMenuPanel *pPanel = new CMenuPanel();
szMenuText = getLocalised("system_yes");
me = new CMenuElementText(BUTTON_MENUMAIN_QUIT, hFontMenu, szMenuText, 0, 0,lColor,1.f, NEW_QUEST_ENTER_GAME);
me->SetPos(RATIO_X(iWindowConsoleWidth-10)-me->GetWidth(), 0);
pPanel->AddElementNoCenterIn(me);
szMenuText = getLocalised("system_no");
me = new CMenuElementText(-1, hFontMenu, szMenuText, fPosBack, 0,lColor,1.f, MAIN);
me->SetShortCut(Keyboard::Key_Escape);
pPanel->AddElementNoCenterIn(me);
pPanel->Move(0, checked_range_cast(fPosBDAY));
pWindowMenuConsole->AddMenu(pPanel);
pWindowMenu->AddConsole(pWindowMenuConsole);
pWindowMenu->eCurrentMenuState=QUIT;
}
break;
default: break; // Unhandled menu state.
}
}
}
pMenu->Render();
if(pWindowMenu)
{
if(!bScroll)
{
pWindowMenu->fAngle=90.f;
pWindowMenu->eCurrentMenuState=pMenu->eOldMenuWindowState;
}
pWindowMenu->Update(ARXDiffTimeMenu);
if (pWindowMenu)
{
MENUSTATE eMS=pWindowMenu->Render();
if(eMS!=NOP)
{
pMenu->eOldMenuWindowState=eMS;
}
}
Check_Apply();
}
bNoMenu=false;
// If the menu needs to be reinitialized, then the text in the TextManager is probably using bad fonts that were deleted already
// Skip one update in this case
if(pTextManage && !pMenu->bReInitAll)
{
pTextManage->Update(ARXDiffTimeMenu);
pTextManage->Render();
}
GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapClamp);
GRenderer->SetRenderState(Renderer::Fog, false);
GRenderer->SetRenderState(Renderer::DepthWrite, false);
GRenderer->SetRenderState(Renderer::DepthTest, false);
GRenderer->SetCulling(Renderer::CullNone);
pMenuCursor->DrawCursor();
if (pTextureLoadRender)
{
GRenderer->SetRenderState(Renderer::DepthTest, false);
int iOffsetX = 0;
int iOffsetY=0;
if ((DANAEMouse.y + INTERFACE_RATIO_DWORD(pTextureLoad->m_dwHeight)) > DANAESIZY)
{
float fOffestY = iOffsetY - INTERFACE_RATIO_DWORD(pTextureLoad->m_dwHeight) ;
iOffsetY = checked_range_cast(fOffestY);
}
EERIEDrawBitmap(static_cast(DANAEMouse.x + iOffsetX),
static_cast(DANAEMouse.y + iOffsetY),
(float)INTERFACE_RATIO_DWORD(pTextureLoad->m_dwWidth),
(float)INTERFACE_RATIO_DWORD(pTextureLoad->m_dwHeight),
0.001f, pTextureLoad, Color::white);
GRenderer->ResetTexture(0);
EERIEDraw2DRect(static_cast(DANAEMouse.x + iOffsetX),
static_cast(DANAEMouse.y + iOffsetY),
DANAEMouse.x + iOffsetX + (float)INTERFACE_RATIO_DWORD(pTextureLoad->m_dwWidth),
DANAEMouse.y + iOffsetY + (float)INTERFACE_RATIO_DWORD(pTextureLoad->m_dwHeight),
0.01f, Color::white);
pTextureLoadRender=NULL;
}
if(ProcessFadeInOut(bFadeInOut,0.1f))
{
switch(iFadeAction)
{
case AMCM_CREDITS:
ARX_MENU_Clicked_CREDITS();
iFadeAction=-1;
bFadeInOut=false;
bFade=true;
break;
case AMCM_NEWQUEST:
ARX_MENU_Clicked_NEWQUEST();
iFadeAction=-1;
bFadeInOut=false;
bFade=true;
CINEMASCOPE = 0;
break;
case AMCM_OFF:
ARX_MENU_Clicked_QUIT_GAME();
iFadeAction=-1;
bFadeInOut=false;
bFade=true;
break;
}
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
GRenderer->GetTextureStage(0)->SetMinFilter(TextureStage::FilterLinear);
GRenderer->GetTextureStage(0)->SetMagFilter(TextureStage::FilterLinear);
GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapRepeat);
GRenderer->SetRenderState(Renderer::DepthWrite, true);
GRenderer->SetRenderState(Renderer::DepthTest, true);
GRenderer->SetCulling(Renderer::CullCCW);
GRenderer->EndScene();
return true;
}
//-----------------------------------------------------------------------------
CMenuElement::CMenuElement(MENUSTATE _ms) : CMenuZone(), enabled(true)
{
ePlace=NOCENTER;
eState=TNOP;
eMenuState=_ms;
iShortCut=-1;
}
//-----------------------------------------------------------------------------
CMenuElement::~CMenuElement()
{
if( this == pMenuElementApply )
{
pMenuElementApply = NULL;
}
if( this == pMenuElementResume )
{
pMenuElementResume = NULL;
}
if( this == pLoadConfirm )
{
pLoadConfirm = NULL;
}
if( this == pDeleteConfirm )
{
pDeleteConfirm = NULL;
}
if( this == pDeleteButton )
{
pDeleteButton = NULL;
}
if( this == pMenuSliderResol )
{
pMenuSliderResol = NULL;
}
if(this == fullscreenCheckbox) {
fullscreenCheckbox = NULL;
}
if( this == pMenuSliderBpp )
{
pMenuSliderBpp = NULL;
}
}
//-----------------------------------------------------------------------------
CMenuElement* CMenuElement::OnShortCut()
{
if(iShortCut==-1) return NULL;
if( GInput->isKeyPressedNowUnPressed(iShortCut) )
{
return this;
}
return NULL;
}
//-----------------------------------------------------------------------------
CMenuElementText::CMenuElementText(int _iID, Font* _pFont, const std::string& _pText,float _fPosX,float _fPosY,Color _lColor,float _fSize,MENUSTATE _eMs) : CMenuElement(_eMs)
{
iID = _iID;
pFont = _pFont;
if( !_pText.compare( "---") )
{
bTestYDouble=true;
}
lpszText= _pText;
Vec2i textSize = _pFont->getTextSize(_pText);
rZone.left = checked_range_cast(_fPosX);
rZone.top = checked_range_cast(_fPosY);
rZone.right = rZone.left + textSize.x;
rZone.bottom = rZone.top + textSize.y;
lColor=_lColor;
lColorHighlight=lOldColor=Color(255, 255, 255);
fSize=_fSize;
pRef=this;
bSelected = false;
iPosCursor = _pText.length() + 1;
}
//-----------------------------------------------------------------------------
CMenuElementText::~CMenuElementText()
{
}
//-----------------------------------------------------------------------------
void CMenuElementText::SetText( const std::string& _pText )
{
lpszText = _pText;
Vec2i textSize = pFont->getTextSize(_pText);
rZone.right = textSize.x + rZone.left;
rZone.bottom = textSize.y + rZone.top;
}
//-----------------------------------------------------------------------------
void CMenuElementText::Update(int _iDTime) {
(void)_iDTime;
}
//-----------------------------------------------------------------------------
bool CMenuElementText::OnMouseDoubleClick(int _iMouseButton)
{
switch(iID)
{
case BUTTON_MENUEDITQUEST_LOAD:
OnMouseClick(_iMouseButton);
if (pWindowMenu)
{
for (size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size() ; i++)
{
CWindowMenuConsole *p = pWindowMenu->vWindowConsoleElement[i];
if ( p->eMenuState == EDIT_QUEST_LOAD )
{
for (size_t j = 0 ; j < p->MenuAllZone.vMenuZone.size() ; j++)
{
CMenuElement *pMenuElement = (CMenuElement*) ( (CMenuElement*)p->MenuAllZone.vMenuZone[j] )->GetZoneWithID( BUTTON_MENUEDITQUEST_LOAD_CONFIRM );
if( pMenuElement )
{
pMenuElement->OnMouseClick( _iMouseButton );
}
}
}
}
}
return true;
}
return false;
}
//-----------------------------------------------------------------------------
// true: block les zones de checks
bool CMenuElementText::OnMouseClick(int _iMouseButton) {
if(!enabled) {
return false;
}
(void)_iMouseButton;
switch(eState)
{
case EDIT:
eState=EDIT_TIME;
return true;
case GETTOUCH:
eState=GETTOUCH_TIME;
lOldColor=lColorHighlight;
return true;
default: break;
}
if (iID != BUTTON_MENUMAIN_RESUMEGAME)
{
ARX_SOUND_PlayMenu(SND_MENU_CLICK);
}
switch (iID)
{
case -1:
{
return false;
}
break;
// MENUMAIN
case BUTTON_MENUMAIN_RESUMEGAME:
{
pTextManage->Clear();
ARXMenu_ResumeGame();
ARX_SOUND_PlayMenu(SND_MENU_CLICK);
}
break;
case BUTTON_MENUMAIN_NEWQUEST:
{
bool bBOOL = false;
ARXMenu_GetResumeGame(bBOOL);
if (!bBOOL)
{
ARXMenu_NewQuest();
}
}
break;
case BUTTON_MENUMAIN_LOADQUEST:
{
}break;
case BUTTON_MENUMAIN_SAVEQUEST:
{
}break;
case BUTTON_MENUMAIN_MULTIPLAYER:
{
}break;
case BUTTON_MENUMAIN_OPTIONS:
{
}break;
case BUTTON_MENUMAIN_CREDITS:
{
ARXMenu_Credits();
}
break;
case BUTTON_MENUMAIN_QUIT:
{
ARXMenu_Quit();
}
break;
case BUTTON_MENUNEWQUEST_CONFIRM:
{
ARXMenu_NewQuest();
}
break;
// MENULOADQUEST
case BUTTON_MENUOPTIONSVIDEO_INIT: {
newWidth = config.video.resolution.x;
newHeight = config.video.resolution.y;
newFullscreen = config.video.fullscreen;
newBpp = config.video.bpp;
break;
}
case BUTTON_MENUEDITQUEST_LOAD_INIT:
{
if ( pWindowMenu )
for (size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size() ; i++)
{
CWindowMenuConsole * p = pWindowMenu->vWindowConsoleElement[i];
if(p->eMenuState == EDIT_QUEST_LOAD) {
p->lData = lData;
for (size_t j = 0 ; j < p->MenuAllZone.vMenuZone.size() ; j++)
{
CMenuZone *cz = p->MenuAllZone.vMenuZone[j];
if ( cz->iID == BUTTON_MENUEDITQUEST_LOAD )
{
( (CMenuElementText *)cz )->bSelected = false;
}
}
}
}
}
break;
case BUTTON_MENUEDITQUEST_LOAD:
{
if (pWindowMenu)
{
pLoadConfirm->SetCheckOn();
pLoadConfirm->lColor = pLoadConfirm->lOldColor;
pDeleteConfirm->SetCheckOn();
pDeleteConfirm->lColor = pDeleteConfirm->lOldColor;
for (size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size() ; i++)
{
CWindowMenuConsole *p = pWindowMenu->vWindowConsoleElement[i];
if(p->eMenuState == EDIT_QUEST_LOAD) {
p->lData = lData;
for (size_t j = 0 ; j < p->MenuAllZone.vMenuZone.size(); j++)
{
CMenuZone *cz = p->MenuAllZone.vMenuZone[j];
if ( cz->iID == BUTTON_MENUEDITQUEST_LOAD )
{
( (CMenuElementText *)cz )->bSelected = false;
}
}
bSelected = true;
}
}
}
}
break;
case BUTTON_MENUEDITQUEST_LOAD_CONFIRM:
{
if (pWindowMenu)
{
for (size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size() ; i++)
{
CWindowMenuConsole *p = pWindowMenu->vWindowConsoleElement[i];
if(p->eMenuState == EDIT_QUEST_LOAD) {
lData = p->lData;
if(lData != -1) {
eMenuState = MAIN;
GRenderer->Clear(Renderer::DepthBuffer);
ARXMenu_LoadQuest(lData);
bNoMenu=true;
if(pTextManage) {
pTextManage->Clear();
}
break;
}
}
}
pLoadConfirm->SetCheckOff();
pLoadConfirm->lColor = Color::grayb(127);
pDeleteConfirm->SetCheckOff();
pDeleteConfirm->lColor = Color::grayb(127);
}
}
break;
case BUTTON_MENUEDITQUEST_LOAD_CONFIRM_BACK:
pLoadConfirm->SetCheckOff();
pLoadConfirm->lColor = Color::grayb(127);
pDeleteConfirm->SetCheckOff();
pDeleteConfirm->lColor = Color::grayb(127);
break;
// MENUSAVEQUEST
case BUTTON_MENUEDITQUEST_SAVE:
{
if (pWindowMenu)
for (size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size() ; i++)
{
CWindowMenuConsole *p = pWindowMenu->vWindowConsoleElement[i];
if(p->eMenuState == EDIT_QUEST_SAVE_CONFIRM) {
p->lData = lData;
CMenuElementText * me = (CMenuElementText *) p->MenuAllZone.vMenuZone[1];
if(me) {
eMenuState = MAIN;
ARXMenu_SaveQuest(me->lpszText, me->lData);
break;
}
}
}
}
break;
// Delete save from the load menu
case BUTTON_MENUEDITQUEST_DELETE_CONFIRM: {
if(pWindowMenu) {
for(size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size(); i++) {
CWindowMenuConsole *p = pWindowMenu->vWindowConsoleElement[i];
if(p->eMenuState == EDIT_QUEST_LOAD) {
lData = p->lData;
if(lData != -1) {
eMenuState = EDIT_QUEST_LOAD;
pMenu->bReInitAll = true;
savegames.remove(lData);
break;
}
}
}
}
pLoadConfirm->SetCheckOff();
pLoadConfirm->lColor = Color::grayb(127);
pDeleteConfirm->SetCheckOff();
pDeleteConfirm->lColor = Color::grayb(127);
break;
}
// Delete save from the save menu
case BUTTON_MENUEDITQUEST_DELETE: {
if(pWindowMenu) {
for(size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size(); i++) {
CWindowMenuConsole *p = pWindowMenu->vWindowConsoleElement[i];
if(p->eMenuState == EDIT_QUEST_SAVE_CONFIRM) {
p->lData = lData;
CMenuElementText * me = (CMenuElementText *) p->MenuAllZone.vMenuZone[1];
if(me) {
eMenuState = EDIT_QUEST_SAVE;
pMenu->bReInitAll = true;
savegames.remove(me->lData);
break;
}
}
}
}
break;
}
case BUTTON_MENUOPTIONSVIDEO_APPLY: {
if(newWidth != config.video.resolution.x || newHeight!=config.video.resolution.y
|| newFullscreen != config.video.fullscreen || newBpp != config.video.bpp) {
ARXMenu_Private_Options_Video_SetResolution(newFullscreen, newWidth, newHeight,
newBpp);
pMenuSliderResol->iOldPos = -1;
pMenuSliderBpp->iOldPos = -1;
fullscreenCheckbox->iOldState = -1;
}
pMenu->bReInitAll=true;
}
break;
// MENUOPTIONS_CONTROLS
case BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MAGICMODE1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MAGICMODE2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STEALTHMODE1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STEALTHMODE2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKFORWARD1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKFORWARD2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKBACKWARD1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKBACKWARD2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFELEFT1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFELEFT2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFERIGHT1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFERIGHT2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANLEFT1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANLEFT2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANRIGHT1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANRIGHT2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCH1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCH2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MOUSELOOK1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_INVENTORY1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_INVENTORY2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOK1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOK2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONLIFE1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONLIFE2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONMANA1:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONMANA2:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DEFAULT:
{
}break;
case BUTTON_MENUOPTIONS_CONTROLS_BACK:
{
config.save();
}
break;
}
if(eMenuState == EDIT_QUEST_SAVE_CONFIRM) {
for (size_t i = 0 ; i < pWindowMenu->vWindowConsoleElement.size() ; i++)
{
CWindowMenuConsole *p = pWindowMenu->vWindowConsoleElement[i];
if ( p->eMenuState == eMenuState )
{
p->lData = lData;
CMenuElementText * me = (CMenuElementText *) p->MenuAllZone.vMenuZone[1];
if(me) {
me->lData = lData;
if(lData != -1) {
me->SetText(savegames[lData].name);
pDeleteButton->lColor = pDeleteButton->lOldColor;
pDeleteButton->SetCheckOn();
} else {
pDeleteButton->lColor = Color::grayb(127);
pDeleteButton->SetCheckOff();
me->SetText(getLocalised("system_menu_editquest_newsavegame"));
}
p->AlignElementCenter(me);
}
}
}
}
return false;
}
//-----------------------------------------------------------------------------
// true: block les zones de checks
CMenuElement* CMenuElementText::OnShortCut()
{
if(iShortCut==-1) return NULL;
if( GInput->isKeyPressedNowUnPressed(iShortCut) )
{
return this;
}
return NULL;
}
//-----------------------------------------------------------------------------
void CMenuElementText::Render()
{
if(bNoMenu) return;
Vec3f ePos;
ePos.x = (float) rZone.left;
ePos.y = (float) rZone.top;
ePos.z = 1;
if(bSelected) {
FontRenderText(pFont, ePos, lpszText, lColorHighlight);
} else if(enabled) {
FontRenderText(pFont, ePos, lpszText, lColor);
} else {
FontRenderText(pFont, ePos, lpszText, Color::grayb(127));
}
}
//-----------------------------------------------------------------------------
void CMenuElementText::RenderMouseOver()
{
if(bNoMenu) return;
pMenuCursor->SetMouseOver();
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
Vec3f ePos;
ePos.x = (float)rZone.left;
ePos.y = (float)rZone.top;
ePos.z = 1;
FontRenderText(pFont, ePos, lpszText, lColorHighlight);
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
switch(iID) {
case BUTTON_MENUEDITQUEST_LOAD:
case BUTTON_MENUEDITQUEST_SAVEINFO: {
if(lData == -1) {
pTextureLoadRender = NULL;
break;
}
const res::path & image = savegames[lData].thumbnail;
if(!image.empty()) {
TextureContainer * t = TextureContainer::LoadUI(image, TextureContainer::NoColorKey);
if(t != pTextureLoad) {
delete pTextureLoad;
pTextureLoad = t;
}
pTextureLoadRender = pTextureLoad;
}
break;
}
default: {
pTextureLoadRender = NULL;
break;
}
}
}
//-----------------------------------------------------------------------------
Vec2i CMenuElementText::GetTextSize() const
{
return pFont->getTextSize(lpszText);
}
//-----------------------------------------------------------------------------
CMenuState::CMenuState(MENUSTATE _ms)
{
bReInitAll=false;
eMenuState = _ms;
eOldMenuState = NOP;
eOldMenuWindowState= NOP;
pTexBackGround = NULL;
pTexBackGround1 = NULL;
fPos = 0;
pMenuAllZone=new CMenuAllZone();
iPosMenu=-1;
}
CMenuState::~CMenuState() {
delete pMenuAllZone;
delete pTexBackGround;
delete pTexBackGround1;
}
void CMenuState::AddMenuElement(CMenuElement * _me) {
pMenuAllZone->AddZone((CMenuZone *)_me);
}
MENUSTATE CMenuState::Update(int _iDTime) {
fPos += _iDTime*( 1.0f / 700 );
pZoneClick=NULL;
CMenuZone * iR=pMenuAllZone->CheckZone(GInput->getMousePosAbs());
if(GInput->getMouseButton(Mouse::Button_0)) {
if(iR) {
pZoneClick = (CMenuElement*)iR;
pZoneClick->OnMouseClick(1);
return pZoneClick->eMenuState;
}
} else {
if(iR) {
pZoneClick = (CMenuElement*)iR;
}
}
return NOP;
}
//-----------------------------------------------------------------------------
void CMenuState::Render()
{
if(bNoMenu) return;
if (pTexBackGround)
EERIEDrawBitmap2(0, 0, static_cast(DANAESIZX), static_cast(DANAESIZY), 0.999f, pTexBackGround, Color::white);
//------------------------------------------------------------------------
int t=pMenuAllZone->GetNbZone();
int iARXDiffTimeMenu = checked_range_cast(ARXDiffTimeMenu);
for(int i=0;iGetZoneNum(i);
pMe->Update(iARXDiffTimeMenu);
pMe->Render();
}
//HIGHLIGHT
if(pZoneClick)
{
pZoneClick->RenderMouseOver();
}
//DEBUG ZONE
GRenderer->ResetTexture(0);
pMenuAllZone->DrawZone();
}
//-----------------------------------------------------------------------------
CMenuZone::CMenuZone()
{
bActif = true;
bCheck=true;
bTestYDouble=false;
iID=-1;
lData=0;
pData=NULL;
lPosition=0;
rZone.top = 0;
rZone.bottom = 0;
rZone.left = 0;
rZone.right = 0;
}
//-----------------------------------------------------------------------------
CMenuZone::CMenuZone(int _iX1,int _iY1,int _iX2,int _iY2, CMenuZone * _pRef)
{
bActif=true;
rZone.left=_iX1;
rZone.top=_iY1;
rZone.right=_iX2;
rZone.bottom=_iY2;
pRef=_pRef;
iID=-1;
lData=0;
pData=NULL;
}
//-----------------------------------------------------------------------------
CMenuZone::~CMenuZone()
{
}
//-----------------------------------------------------------------------------
void CMenuZone::Move(int _iX,int _iY)
{
rZone.left += _iX;
rZone.top += _iY;
rZone.right += _iX;
rZone.bottom += _iY;
}
//-----------------------------------------------------------------------------
void CMenuZone::SetPos(float _fX,float _fY)
{
int iWidth = rZone.right - rZone.left;
int iHeight = rZone.bottom - rZone.top;
int iX = checked_range_cast(_fX);
int iY = checked_range_cast(_fY);
rZone.left = iX;
rZone.top = iY;
rZone.right = iX + abs(iWidth);
rZone.bottom = iY + abs(iHeight);
}
//-----------------------------------------------------------------------------
CMenuZone * CMenuZone::IsMouseOver(const Vec2s& mousePos) const
{
int iYDouble=0;
if(bTestYDouble)
{
iYDouble=(rZone.bottom-rZone.top)>>1;
}
if( bActif &&
(mousePos.x >= rZone.left) &&
(mousePos.y >= (rZone.top-iYDouble)) &&
(mousePos.x <= rZone.right) &&
(mousePos.y <= (rZone.bottom+iYDouble)) )
return pRef;
return NULL;
}
//-----------------------------------------------------------------------------
CMenuAllZone::CMenuAllZone()
{
vMenuZone.clear();
vector::iterator i;
for(i=vMenuZone.begin();i!=vMenuZone.end();++i)
{
CMenuZone *zone=*i;
delete zone;
}
}
//-----------------------------------------------------------------------------
CMenuAllZone::~CMenuAllZone()
{
for(std::vector::iterator it = vMenuZone.begin(), it_end = vMenuZone.end(); it != it_end; ++it)
delete *it;
}
//-----------------------------------------------------------------------------
void CMenuAllZone::AddZone(CMenuZone *_pMenuZone)
{
vMenuZone.push_back(_pMenuZone);
}
//-----------------------------------------------------------------------------
CMenuZone * CMenuAllZone::CheckZone(const Vec2s& mousePos) const
{
std::vector::const_iterator i;
for(i=vMenuZone.begin();i!=vMenuZone.end();++i)
{
CMenuZone *zone=*i;
if(zone->bCheck && zone->bActif)
{
CMenuZone * pRef = ((*i)->IsMouseOver(mousePos));
if (pRef)
return pRef;
}
}
return NULL;
}
//-----------------------------------------------------------------------------
CMenuZone * CMenuAllZone::GetZoneNum(int _iNum)
{
vector::iterator i;
int iNum=0;
for(i=vMenuZone.begin();i!=vMenuZone.end();++i)
{
CMenuZone *zone=*i;
if(iNum==_iNum) return zone;
iNum++;
}
return NULL;
}
//-----------------------------------------------------------------------------
CMenuZone * CMenuAllZone::GetZoneWithID(int _iID)
{
for (std::vector::iterator i = vMenuZone.begin(), i_end = vMenuZone.end(); i != i_end; ++i)
if (CMenuZone *zone = ((CMenuElement*)(*i))->GetZoneWithID(_iID))
return zone;
return NULL;
}
//-----------------------------------------------------------------------------
void CMenuAllZone::Move(int _iPosX,int _iPosY)
{
for (std::vector::iterator i = vMenuZone.begin(), i_end = vMenuZone.end(); i != i_end; ++i)
(*i)->Move(_iPosX, _iPosY);
}
//-----------------------------------------------------------------------------
int CMenuAllZone::GetNbZone()
{
return vMenuZone.size();
}
//-----------------------------------------------------------------------------
void CMenuAllZone::DrawZone()
{
#ifndef NODEBUGZONE
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->ResetTexture(0);
for(std::vector::const_iterator i = vMenuZone.begin(), i_end = vMenuZone.end(); i != i_end; ++i)
{
CMenuZone *zone=*i;
if(zone->bActif)
{
TexturedVertex v1[3],v2[3];
v1[0].p.x = (float)zone->rZone.left;
v1[0].p.y = (float)zone->rZone.top;
v1[1].p.x = (float)zone->rZone.left;
v1[1].p.y = (float)zone->rZone.bottom;
v1[2].p.x = (float)zone->rZone.right;
v1[2].p.y = (float)zone->rZone.bottom;
v2[0].p.x = (float)zone->rZone.left;
v2[0].p.y = (float)zone->rZone.top;
v2[1].p.x = (float)zone->rZone.right;
v2[1].p.y = (float)zone->rZone.top;
v2[2].p.x = (float)zone->rZone.right;
v2[2].p.y = (float)zone->rZone.bottom;
v1[0].color=v1[1].color=v1[2].color=v2[0].color=v2[1].color=v2[2].color=0xFFFFA000;
v1[0].p.z=v1[1].p.z=v1[2].p.z=v2[0].p.z=v2[1].p.z=v2[2].p.z=0.f;
v1[0].rhw=v1[1].rhw=v1[2].rhw=v2[0].rhw=v2[1].rhw=v2[2].rhw=0.999999f;
EERIEDRAWPRIM(Renderer::TriangleStrip, v1);
EERIEDRAWPRIM(Renderer::TriangleStrip, v2);
}
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
#endif // #ifndef NODEBUGZONE
}
//-----------------------------------------------------------------------------
CMenuCheckButton::CMenuCheckButton(int _iID, float _fPosX,float _fPosY,int _iTaille,TextureContainer *_pTex1,TextureContainer *_pTex2, CMenuElementText *_pText)
:CMenuElement(NOP)
{
iID = _iID;
iState = 0;
iOldState = -1;
iPosX = checked_range_cast(_fPosX);
iPosY = checked_range_cast(_fPosY);
iTaille = _iTaille;
pText = _pText;
if(_pTex1) {
float fRatioX = RATIO_X(_pTex1->m_dwWidth) ;
float fRatioY = RATIO_Y(_pTex1->m_dwHeight);
vTex.push_back(_pTex1);
_iTaille = std::max(_iTaille, checked_range_cast(fRatioX));
_iTaille = std::max(_iTaille, checked_range_cast(fRatioY));
}
if(_pTex2) {
float fRatioX = RATIO_X(_pTex2->m_dwWidth) ;
float fRatioY = RATIO_Y(_pTex2->m_dwHeight);
vTex.push_back(_pTex2);
_iTaille = std::max(_iTaille, checked_range_cast(fRatioX));
_iTaille = std::max(_iTaille, checked_range_cast(fRatioY));
}
Vec2i textSize(0,0);
if ( pText )
{
textSize = pText->pFont->getTextSize(pText->lpszText);
_iTaille = std::max(_iTaille, textSize.y);
textSize.x += pText->rZone.left;
pText->Move(iPosX, iPosY + (_iTaille - textSize.y) / 2);
}
rZone.left = checked_range_cast(_fPosX);
rZone.top = checked_range_cast(_fPosY);
rZone.right = checked_range_cast(_fPosX + _iTaille + textSize.x);
rZone.bottom = checked_range_cast(_fPosY + std::max(_iTaille, textSize.y));
pRef=this;
if(_pTex1 && _pTex2) {
float rZoneR = ( RATIO_X(200.f) + RATIO_X(_pTex1->m_dwWidth) + (RATIO_X(12*9) - RATIO_X(_pTex1->m_dwWidth))*0.5f );
rZone.right = checked_range_cast(rZoneR);
}
Move(iPosX, iPosY);
}
CMenuCheckButton::~CMenuCheckButton() {
delete pText;
}
void CMenuCheckButton::Move(int _iX, int _iY) {
CMenuElement::Move(_iX, _iY);
if(pText) {
pText->Move(_iX, _iY);
}
ComputeTexturesPosition();
}
bool CMenuCheckButton::OnMouseClick(int _iMouseButton) {
(void)_iMouseButton;
if(iOldState<0)
iOldState=iState;
iState ++;
//NB : It seems that iState cannot be negative (used as tabular index / used as bool) but need further approval
arx_assert(iState >= 0);
if ((size_t)iState >= vTex.size())
{
iState = 0;
}
ARX_SOUND_PlayMenu(SND_MENU_CLICK);
switch (iID)
{
case BUTTON_MENUOPTIONSVIDEO_FULLSCREEN:
{
newFullscreen = ((iState)?true:false);
if(pMenuSliderResol) {
pMenuSliderResol->setEnabled(newFullscreen);
}
if(pMenuSliderBpp) {
pMenuSliderBpp->setEnabled(newFullscreen);
}
}
break;
case BUTTON_MENUOPTIONSVIDEO_CROSSHAIR:
{
config.video.showCrosshair=(iState)?true:false;
}
break;
case BUTTON_MENUOPTIONSVIDEO_ANTIALIASING: {
config.video.antialiasing = iState ? true : false;
ARX_SetAntiAliasing();
break;
}
case BUTTON_MENUOPTIONSVIDEO_VSYNC: {
config.video.vsync = iState ? true : false;
break;
}
case BUTTON_MENUOPTIONSAUDIO_EAX:
{
ARXMenu_Options_Audio_SetEAX((iState)?true:false);
}
break;
case BUTTON_MENUOPTIONS_CONTROLS_INVERTMOUSE:
{
ARXMenu_Options_Control_SetInvertMouse((iState)?true:false);
}
break;
case BUTTON_MENUOPTIONS_CONTROLS_AUTOREADYWEAPON: {
config.input.autoReadyWeapon = (iState) ? true : false;
break;
}
case BUTTON_MENUOPTIONS_CONTROLS_MOUSELOOK: {
config.input.mouseLookToggle = (iState) ? true : false;
break;
}
case BUTTON_MENUOPTIONS_CONTROLS_AUTODESCRIPTION: {
config.input.autoDescription = (iState) ? true : false;
break;
}
case BUTTON_MENUOPTIONS_CONTROLS_LINK: {
config.input.linkMouseLookToUse = (iState) ? true : false;
break;
}
case BUTTON_MENUOPTIONSVIDEO_BACK:
{
if( (pMenuSliderResol)&&
(pMenuSliderResol->iOldPos>=0) )
{
pMenuSliderResol->iPos=pMenuSliderResol->iOldPos;
pMenuSliderResol->iOldPos=-1;
newWidth=config.video.resolution.x;
newHeight=config.video.resolution.y;
}
if( (pMenuSliderBpp)&&
(pMenuSliderBpp->iOldPos>=0) )
{
pMenuSliderBpp->iPos=pMenuSliderBpp->iOldPos;
pMenuSliderBpp->iOldPos=-1;
newBpp=config.video.bpp;
}
if(fullscreenCheckbox && fullscreenCheckbox->iOldState >= 0) {
fullscreenCheckbox->iState = fullscreenCheckbox->iOldState;
fullscreenCheckbox->iOldState = -1;
newFullscreen = config.video.fullscreen;
}
break;
}
}
return false;
}
//-----------------------------------------------------------------------------
void CMenuCheckButton::Update(int /*_iDTime*/)
{
}
//-----------------------------------------------------------------------------
void CMenuCheckButton::Render()
{
if(bNoMenu) return;
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
if (!vTex.empty())
{
TextureContainer *pTex = vTex[iState];
TexturedVertex v[4];
Color color = (bCheck) ? Color::white : Color::fromBGRA(0xFF3F3F3F);
v[0].p.z=v[1].p.z=v[2].p.z=v[3].p.z=0.f;
v[0].rhw=v[1].rhw=v[2].rhw=v[3].rhw=0.999999f;
float iY = 0;
{
iY = static_cast(rZone.bottom - rZone.top);
iY -= iTaille;
iY = rZone.top + iY*0.5f;
}
//carre
EERIEDrawBitmap2(static_cast(rZone.right - iTaille), iY, RATIO_X(iTaille), RATIO_Y(iTaille), 0.f, pTex, color);
}
if (pText)
pText->Render();
//DEBUG
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
//-----------------------------------------------------------------------------
void CMenuCheckButton::RenderMouseOver()
{
if(bNoMenu) return;
pMenuCursor->SetMouseOver();
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
TextureContainer *pTex = vTex[iState];
if(pTex) GRenderer->SetTexture(0, pTex);
else GRenderer->ResetTexture(0);
TexturedVertex v[4];
v[0].color = v[1].color = v[2].color = v[3].color = Color::white.toBGR();
v[0].p.z=v[1].p.z=v[2].p.z=v[3].p.z=0.f;
v[0].rhw=v[1].rhw=v[2].rhw=v[3].rhw=0.999999f;
float iY = 0;
iY = static_cast(rZone.bottom - rZone.top);
iY -= iTaille;
iY = rZone.top + iY*0.5f;
//carre
EERIEDrawBitmap2(static_cast(rZone.right - iTaille), iY, RATIO_X(iTaille), RATIO_Y(iTaille), 0.f, pTex, Color::white);
//tick
if (pText)
pText->RenderMouseOver();
//DEBUG
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
//-----------------------------------------------------------------------------
// Nuky - merges common code of Render() and RenderMouseOver()
/// Compute members fTexX, fTexY, fTexSX and fTexSY according to rZone and iTaille
void CMenuCheckButton::ComputeTexturesPosition()
{
// Nuky - for now I split into 2 cases, because I don't know yet how to fix position with text
// TODO Merge with master
/*if (!pText)
{
fTexX_ = static_cast(rZone.left);
fTexY_ = static_cast(rZone.top);
fTexSX_ = RATIO_X(iTaille);
fTexSY_ = RATIO_Y(iTaille);
}
else
{
fTexX_ = static_cast(rZone.right - iTaille);
fTexY_ = rZone.top + (static_cast(rZone.bottom - rZone.top) - iTaille) * 0.5f;
fTexSX_ = RATIO_X(iTaille);
fTexSY_ = RATIO_Y(iTaille);
}*/
}
//-----------------------------------------------------------------------------
CWindowMenu::CWindowMenu(int _iPosX,int _iPosY,int _iTailleX,int _iTailleY,int _iNbButton) :
bMouseListen (true)
{
iPosX=(int)RATIO_X(_iPosX);
iPosY=(int)RATIO_Y(_iPosY);
iTailleX=(int)RATIO_X(_iTailleX);
iTailleY=(int)RATIO_Y(_iTailleY);
iNbButton=_iNbButton;
pTexButton=TextureContainer::LoadUI("graph/interface/menus/menu_left_1button");
pTexButton2=TextureContainer::LoadUI("graph/interface/menus/menu_left_2button");
pTexButton3=TextureContainer::LoadUI("graph/interface/menus/menu_left_3button");
pTexMain=TextureContainer::LoadUI("graph/interface/menus/menu_left_main");
pTexGlissiere=TextureContainer::LoadUI("graph/interface/menus/menu_left_main_glissiere");
pTexGlissiereButton=TextureContainer::LoadUI("graph/interface/menus/menu_left_main_glissiere_button");
vWindowConsoleElement.clear();
fPosXCalc=((float)-iTailleX);
fDist=((float)(iTailleX+iPosX));
fAngle=0.f;
eCurrentMenuState=NOP;
float fCalc = fPosXCalc + (fDist * sin(radians(fAngle)));
iPosX = checked_range_cast(fCalc);
bChangeConsole=false;
}
//-----------------------------------------------------------------------------
CWindowMenu::~CWindowMenu()
{
for (std::vector::iterator it = vWindowConsoleElement.begin(), it_end = vWindowConsoleElement.end(); it < it_end; ++it)
delete *it;
}
//-----------------------------------------------------------------------------
void CWindowMenu::AddConsole(CWindowMenuConsole *_pMenuConsoleElement)
{
vWindowConsoleElement.push_back(_pMenuConsoleElement);
_pMenuConsoleElement->iOldPosX = 0;
_pMenuConsoleElement->iOldPosY = 0;
_pMenuConsoleElement->iPosX = iPosX;
_pMenuConsoleElement->iPosY = iPosY;
}
//-----------------------------------------------------------------------------
void CWindowMenu::Update(float _fDTime)
{
float fCalc = fPosXCalc + (fDist * sin(radians(fAngle)));
iPosX = checked_range_cast(fCalc);
fAngle += _fDTime * 0.08f;
if (fAngle>90.f) fAngle=90.f;
}
//-----------------------------------------------------------------------------
MENUSTATE CWindowMenu::Render()
{
if(bNoMenu) return NOP;
if(bChangeConsole)
{
//TO DO: faire ce que l'on veut
bChangeConsole=false;
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
TexturedVertex v[4];
v[0].color = v[1].color = v[2].color = v[3].color = Color::white.toBGR();
v[0].p.z=v[1].p.z=v[2].p.z=v[3].p.z=0.f;
v[0].rhw=v[1].rhw=v[2].rhw=v[3].rhw=0.999999f;
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
MENUSTATE eMS=NOP;
if (bMouseListen)
{
vector::iterator i;
for (i = vWindowConsoleElement.begin(); i != vWindowConsoleElement.end(); ++i)
{
if(eCurrentMenuState==(*i)->eMenuState)
{
eMS=(*i)->Update(iPosX, iPosY, 0);
if (eMS != NOP)
break;
}
}
}
for (std::vector::iterator i = vWindowConsoleElement.begin(); i != vWindowConsoleElement.end(); ++i)
{
if(eCurrentMenuState==(*i)->eMenuState)
{
if ((*i)->Render())
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
break;
}
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
if (eMS != NOP)
{
eCurrentMenuState=eMS;
bChangeConsole=true;
}
return eMS;
}
CWindowMenuConsole::CWindowMenuConsole(int _iPosX,int _iPosY,int _iWidth,int _iHeight,MENUSTATE _eMenuState) :
bMouseListen (true),
iInterligne (10),
bEdit (false),
lData(0),
pData(NULL)
{
iOX=(int)RATIO_X(_iPosX);
iOY=(int)RATIO_Y(_iPosY);
iWidth=(int)RATIO_X(_iWidth);
iHeight=(int)RATIO_Y(_iHeight);
eMenuState=_eMenuState;
pTexBackground = TextureContainer::LoadUI("graph/interface/menus/menu_console_background");
pTexBackgroundBorder = TextureContainer::LoadUI("graph/interface/menus/menu_console_background_border");
bFrameOdd=false;
iPosMenu=-1;
}
//-----------------------------------------------------------------------------
void CWindowMenuConsole::AddMenu(CMenuElement *_pMenuElement)
{
_pMenuElement->ePlace=NOCENTER;
_pMenuElement->Move(iOX,iOY);
MenuAllZone.AddZone((CMenuZone*)_pMenuElement);
}
//-----------------------------------------------------------------------------
void CWindowMenuConsole::AddMenuCenterY( CMenuElement * _pMenuElement )
{
_pMenuElement->ePlace = CENTERY;
int iDy = _pMenuElement->rZone.bottom-_pMenuElement->rZone.top;
int iI = MenuAllZone.GetNbZone();
for( int iJ = 0 ; iJ < iI ; iJ++ )
{
iDy += iInterligne;
CMenuZone *pZone = MenuAllZone.GetZoneNum(iJ);
iDy += pZone->rZone.bottom - pZone->rZone.top;
}
int iDepY;
if( iDy < iHeight )
{
iDepY = iOY + ( ( iHeight - iDy ) >> 1 );
}
else
{
iDepY = iOY;
}
int dy = 0;
iI = MenuAllZone.GetNbZone();
if( iI )
{
dy = iDepY - MenuAllZone.GetZoneNum(0)->rZone.top;
}
//We can't go inside the for-loop
else
{
arx_assert( !( 0 < iI ) );
}
for( int iJ = 0 ; iJ < iI ; iJ++ )
{
CMenuZone *pZone = MenuAllZone.GetZoneNum(iJ);
iDy = pZone->rZone.bottom - pZone->rZone.top;
iDepY += iDy + iInterligne;
pZone->Move( 0, dy );
}
_pMenuElement->Move( 0, iDepY );
MenuAllZone.AddZone( (CMenuZone*) _pMenuElement );
}
//-----------------------------------------------------------------------------
void CWindowMenuConsole::AddMenuCenter( CMenuElement * _pMenuElement )
{
_pMenuElement->ePlace = CENTER;
int iDx = _pMenuElement->rZone.right - _pMenuElement->rZone.left;
int dx = ( ( iWidth - iDx ) >> 1 ) - _pMenuElement->rZone.left;
if( dx < 0 )
{
dx = 0;
}
int iDy = _pMenuElement->rZone.bottom - _pMenuElement->rZone.top;
int iI = MenuAllZone.GetNbZone();
for( int iJ = 0 ; iJ < iI ; iJ++ )
{
iDy += iInterligne;
CMenuZone *pZone = MenuAllZone.GetZoneNum(iJ);
iDy += pZone->rZone.bottom - pZone->rZone.top;
}
int iDepY;
if( iDy < iHeight )
{
iDepY = iOY + ( ( iHeight - iDy ) >> 1 );
}
else
{
iDepY = iOY;
}
int dy = 0;
iI = MenuAllZone.GetNbZone();
if( iI )
{
dy = iDepY - MenuAllZone.GetZoneNum(0)->rZone.top;
}
//We can't go inside the for-loop
else
{
arx_assert( !( 0 < iI ) );
}
for( int iJ = 0 ; iJ < iI ; iJ++ )
{
CMenuZone *pZone = MenuAllZone.GetZoneNum( iJ );
iDepY += pZone->rZone.bottom - pZone->rZone.top + iInterligne;
pZone->Move( 0, dy );
}
_pMenuElement->Move( dx, iDepY );
MenuAllZone.AddZone( (CMenuZone*) _pMenuElement );
}
//-----------------------------------------------------------------------------
void CWindowMenuConsole::AlignElementCenter(CMenuElement *_pMenuElement) {
_pMenuElement->Move(-_pMenuElement->rZone.left, 0);
_pMenuElement->ePlace = CENTER;
int iDx = _pMenuElement->rZone.right - _pMenuElement->rZone.left;
int dx = (iWidth - iDx) / 2 - _pMenuElement->rZone.left;
_pMenuElement->Move(std::max(dx, 0), 0);
}
//-----------------------------------------------------------------------------
void CWindowMenuConsole::UpdateText()
{
if(GInput->isAnyKeyPressed())
{
if( (GInput->isKeyPressed(Keyboard::Key_Enter)) ||
(GInput->isKeyPressed(Keyboard::Key_NumPadEnter)) ||
(GInput->isKeyPressed(Keyboard::Key_Escape)) )
{
ARX_SOUND_PlayMenu(SND_MENU_CLICK);
((CMenuElementText*)pZoneClick)->eState=EDIT;
if( ((CMenuElementText*)pZoneClick)->lpszText.empty() )
{
std::string szMenuText;
szMenuText = getLocalised("system_menu_editquest_newsavegame");
((CMenuElementText*)pZoneClick)->SetText(szMenuText);
int iDx=pZoneClick->rZone.right-pZoneClick->rZone.left;
if(pZoneClick->ePlace)
{
pZoneClick->rZone.left=iPosX+((iWidth-iDx)>>1);
if(pZoneClick->rZone.left<0)
{
pZoneClick->rZone.left=0;
}
}
pZoneClick->rZone.right=pZoneClick->rZone.left+iDx;
}
pZoneClick=NULL;
bEdit=false;
return;
}
bool bKey=false;
std::string tText;
CMenuElementText *pZoneText=(CMenuElementText*)pZoneClick;
if(GInput->isKeyPressedNowPressed(Keyboard::Key_Backspace))
{
tText = pZoneText->lpszText;
if( !tText.empty() )
{
tText.resize(tText.size() - 1);
bKey=true;
}
}
else
{
int iKey = GInput->getKeyPressed();
iKey&=0xFFFF;
if(GInput->isKeyPressedNowPressed(iKey))
{
tText = pZoneText->lpszText;
char tCat;
bKey = GInput->getKeyAsText(iKey, tCat);
if(bKey)
{
int iChar = tCat & 0x000000FF; // To prevent ascii chars between [128, 255] from causing an assertion in the functions below...
if ((isalnum(iChar) || isspace(iChar) || ispunct(iChar)) && (tCat != '\t') && (tCat != '*'))
tText += tCat;
}
}
}
if(bKey)
{
pZoneText->SetText(tText);
if( (pZoneText->rZone.right-pZoneText->rZone.left)>(iWidth-RATIO_X(64)) )
{
if(!tText.empty()) {
tText.resize(tText.size() - 1);
pZoneText->SetText(tText);
}
}
int iDx=pZoneClick->rZone.right-pZoneClick->rZone.left;
if(pZoneClick->ePlace)
{
pZoneClick->rZone.left=iPosX+((iWidth-iDx)>>1);
if(pZoneClick->rZone.left<0)
{
pZoneClick->rZone.left=0;
}
}
pZoneClick->rZone.right=pZoneClick->rZone.left+iDx;
}
}
if (pZoneClick->rZone.top == pZoneClick->rZone.bottom)
{
Vec2i textSize = ((CMenuElementText*)pZoneClick)->pFont->getTextSize("|");
pZoneClick->rZone.bottom += textSize.y;
}
//DRAW CURSOR
TexturedVertex v[4];
GRenderer->ResetTexture(0);
float col=.5f+rnd()*.5f;
v[0].color = v[1].color = v[2].color = v[3].color = Color::gray(col).toBGR();
v[0].p.z=v[1].p.z=v[2].p.z=v[3].p.z=0.f;
v[0].rhw=v[1].rhw=v[2].rhw=v[3].rhw=0.999999f;
v[0].p.x = (float)pZoneClick->rZone.right;
v[0].p.y = (float)pZoneClick->rZone.top;
v[1].p.x = v[0].p.x+2.f;
v[1].p.y = v[0].p.y;
v[2].p.x = v[0].p.x;
v[2].p.y = (float)pZoneClick->rZone.bottom;
v[3].p.x = v[1].p.x;
v[3].p.y = v[2].p.y;
EERIEDRAWPRIM(Renderer::TriangleStrip, v, 4);
}
//-----------------------------------------------------------------------------
CMenuElement * CWindowMenuConsole::GetTouch(bool keyTouched, int keyId, InputKeyId* pInputKeyId, bool _bValidateTest)
{
int iMouseButton = keyTouched ? 0 : GInput->getMouseButtonClicked();
if(pInputKeyId)
*pInputKeyId = keyId;
if(keyTouched || (iMouseButton & (Mouse::ButtonBase | Mouse::WheelBase))) {
if(!keyTouched && !bMouseAttack)
{
bMouseAttack=!bMouseAttack;
return NULL;
}
CMenuElementText *pZoneText=(CMenuElementText*)pZoneClick;
if(_bValidateTest)
{
if( (pZoneClick->iID==BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE1)||
(pZoneClick->iID==BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE2))
{
bool bOk=true;
if( (iMouseButton & Mouse::ButtonBase)&&
!(iMouseButton & Mouse::WheelBase) )
{
bOk=false;
}
else
{
for(int buttonId = Mouse::ButtonBase; buttonId < Mouse::ButtonMax; buttonId++)
{
if(keyId == buttonId)
{
bOk=false;
break;
}
}
}
if(bOk) return NULL;
}
}
std::string pText;
if(iMouseButton & (Mouse::ButtonBase | Mouse::WheelBase))
pText = GInput->getKeyName(iMouseButton, true);
else
pText = GInput->getKeyName(keyId, true);
if ( !pText.empty() )
{
pZoneText->lColorHighlight=pZoneText->lOldColor;
pZoneText->eState=GETTOUCH;
pZoneText->SetText(pText);
int iDx=pZoneClick->rZone.right-pZoneClick->rZone.left;
if(pZoneClick->ePlace)
{
pZoneClick->rZone.left=(iWidth-iDx)>>1;
if(pZoneClick->rZone.left<0)
{
pZoneClick->rZone.left=0;
}
}
pZoneClick->rZone.right=pZoneClick->rZone.left+iDx;
pZoneClick=NULL;
bEdit=false;
if(iMouseButton & (Mouse::ButtonBase | Mouse::WheelBase))
{
if(pInputKeyId)
*pInputKeyId = iMouseButton;
}
bMouseAttack=false;
return (CMenuElement*)pZoneText;
}
}
return NULL;
}
//-----------------------------------------------------------------------------
MENUSTATE CWindowMenuConsole::Update(int _iPosX,int _iPosY,int _iOffsetY)
{
bFrameOdd=!bFrameOdd;
iSavePosY=_iPosY;
//move les zones
if(_iOffsetY)
{
_iPosY-=(MenuAllZone.GetZoneNum(_iOffsetY)->rZone.top)-(MenuAllZone.GetZoneNum(0)->rZone.top);
}
MenuAllZone.Move((iPosX-iOldPosX),(iPosY-iOldPosY));
int iI = MenuAllZone.GetNbZone();
for(int iJ=0;iJrZone.toprZone.bottom+iInterligne)>(iSavePosY+iHeight)))
{
pZone->bActif=false;
}
else
{
pZone->bActif=true;
}
pZone->bActif=true;
}
iOldPosX=iPosX;
iOldPosY=iPosY;
iPosX=_iPosX;
iPosY=_iPosY;
// Check if mouse over
if (bMouseListen)
{
if (!bEdit)
{
pZoneClick=NULL;
CMenuZone * iR = MenuAllZone.CheckZone(GInput->getMousePosAbs());
if(iR) {
pZoneClick=(CMenuElement*)iR;
if( GInput->getMouseButtonDoubleClick(Mouse::Button_0,300) )
{
MENUSTATE e = pZoneClick->eMenuState;
bEdit = pZoneClick->OnMouseDoubleClick(0);
if (pZoneClick->iID == BUTTON_MENUEDITQUEST_LOAD)
return MAIN;
if(bEdit)
return pZoneClick->eMenuState;
return e;
}
if( GInput->getMouseButton(Mouse::Button_0) )
{
MENUSTATE e = pZoneClick->eMenuState;
bEdit = pZoneClick->OnMouseClick(0);
return e;
}
else
{
pZoneClick->EmptyFunction();
}
}
}
else
{
if(!pZoneClick)
{
CMenuZone * iR = MenuAllZone.CheckZone(GInput->getMousePosAbs());
if(iR) {
pZoneClick=(CMenuElement*)iR;
if( GInput->getMouseButtonDoubleClick(Mouse::Button_0,300) )
{
bEdit = pZoneClick->OnMouseDoubleClick(0);
if(bEdit)
return pZoneClick->eMenuState;
}
}
}
}
}
//check les shortcuts
if(!bEdit)
{
iI=MenuAllZone.GetNbZone();
for(int iJ=0;iJOnShortCut();
if(CMenuElementShortCut)
{
pZoneClick=CMenuElementShortCut;
MENUSTATE e = pZoneClick->eMenuState;
bEdit = pZoneClick->OnMouseClick(0);
pZoneClick=CMenuElementShortCut;
return e;
}
}
}
return NOP;
}
//-----------------------------------------------------------------------------
static bool UpdateGameKey(bool bEdit, CMenuElement *pmeElement, InputKeyId inputKeyId)
{
bool bChange=false;
if( (!bEdit)&&
(pmeElement) )
{
switch(pmeElement->iID)
{
case BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP2:
bChange=config.setActionKey(CONTROLS_CUST_JUMP,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MAGICMODE1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MAGICMODE2:
bChange=config.setActionKey(CONTROLS_CUST_MAGICMODE,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_MAGICMODE1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STEALTHMODE1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STEALTHMODE2:
bChange=config.setActionKey(CONTROLS_CUST_STEALTHMODE,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_STEALTHMODE1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKFORWARD1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKFORWARD2:
bChange=config.setActionKey(CONTROLS_CUST_WALKFORWARD,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKFORWARD1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKBACKWARD1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKBACKWARD2:
bChange=config.setActionKey(CONTROLS_CUST_WALKBACKWARD,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_WALKBACKWARD1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFELEFT1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFELEFT2:
bChange=config.setActionKey(CONTROLS_CUST_STRAFELEFT,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFELEFT1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFERIGHT1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFERIGHT2:
bChange=config.setActionKey(CONTROLS_CUST_STRAFERIGHT,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFERIGHT1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANLEFT1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANLEFT2:
bChange=config.setActionKey(CONTROLS_CUST_LEANLEFT,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANLEFT1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANRIGHT1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANRIGHT2:
bChange=config.setActionKey(CONTROLS_CUST_LEANRIGHT,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_LEANRIGHT1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCH1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCH2:
bChange=config.setActionKey(CONTROLS_CUST_CROUCH,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCH1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MOUSELOOK1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MOUSELOOK2:
bChange=config.setActionKey(CONTROLS_CUST_MOUSELOOK,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_MOUSELOOK1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE2:
bChange=config.setActionKey(CONTROLS_CUST_ACTION,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_ACTIONCOMBINE1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_INVENTORY1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_INVENTORY2:
bChange=config.setActionKey(CONTROLS_CUST_INVENTORY,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_INVENTORY1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOK1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOK2:
bChange=config.setActionKey(CONTROLS_CUST_BOOK,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOK1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKCHARSHEET1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKCHARSHEET2:
bChange=config.setActionKey(CONTROLS_CUST_BOOKCHARSHEET,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKCHARSHEET1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKSPELL1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKSPELL2:
bChange=config.setActionKey(CONTROLS_CUST_BOOKSPELL,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKSPELL1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKMAP1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKMAP2:
bChange=config.setActionKey(CONTROLS_CUST_BOOKMAP,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKMAP1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKQUEST1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKQUEST2:
bChange=config.setActionKey(CONTROLS_CUST_BOOKQUEST,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_BOOKQUEST1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONLIFE1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONLIFE2:
bChange=config.setActionKey(CONTROLS_CUST_DRINKPOTIONLIFE,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONLIFE1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONMANA1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONMANA2:
bChange=config.setActionKey(CONTROLS_CUST_DRINKPOTIONMANA,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_DRINKPOTIONMANA1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TORCH1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TORCH2:
bChange=config.setActionKey(CONTROLS_CUST_TORCH,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_TORCH1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CANCELCURSPELL1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CANCELCURSPELL2:
bChange=config.setActionKey(CONTROLS_CUST_CANCELCURSPELL,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_CANCELCURSPELL1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST1_2:
bChange=config.setActionKey(CONTROLS_CUST_PRECAST1,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST2:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST2_2:
bChange=config.setActionKey(CONTROLS_CUST_PRECAST2,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST2,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST3:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST3_2:
bChange=config.setActionKey(CONTROLS_CUST_PRECAST3,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_PRECAST3,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WEAPON1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_WEAPON2:
bChange=config.setActionKey(CONTROLS_CUST_WEAPON,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_WEAPON1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKLOAD:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKLOAD2:
bChange=config.setActionKey(CONTROLS_CUST_QUICKLOAD,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKLOAD,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKSAVE:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKSAVE2:
bChange=config.setActionKey(CONTROLS_CUST_QUICKSAVE,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_QUICKSAVE,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNLEFT1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNLEFT2:
bChange=config.setActionKey(CONTROLS_CUST_TURNLEFT,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNLEFT1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNRIGHT1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNRIGHT2:
bChange=config.setActionKey(CONTROLS_CUST_TURNRIGHT,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_TURNRIGHT1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKUP1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKUP2:
bChange=config.setActionKey(CONTROLS_CUST_LOOKUP,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKUP1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKDOWN1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKDOWN2:
bChange=config.setActionKey(CONTROLS_CUST_LOOKDOWN,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_LOOKDOWN1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFE1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFE2:
bChange=config.setActionKey(CONTROLS_CUST_STRAFE,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_STRAFE1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CENTERVIEW1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CENTERVIEW2:
bChange=config.setActionKey(CONTROLS_CUST_CENTERVIEW,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_CENTERVIEW1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_FREELOOK1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_FREELOOK2:
bChange=config.setActionKey(CONTROLS_CUST_FREELOOK,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_FREELOOK1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PREVIOUS1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_PREVIOUS2:
bChange=config.setActionKey(CONTROLS_CUST_PREVIOUS,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_PREVIOUS1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_NEXT1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_NEXT2:
bChange=config.setActionKey(CONTROLS_CUST_NEXT,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_NEXT1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCHTOGGLE1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCHTOGGLE2:
bChange=config.setActionKey(CONTROLS_CUST_CROUCHTOGGLE,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_CROUCHTOGGLE1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_UNEQUIPWEAPON1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_UNEQUIPWEAPON2:
bChange=config.setActionKey(CONTROLS_CUST_UNEQUIPWEAPON,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_UNEQUIPWEAPON1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MINIMAP1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_MINIMAP2:
bChange=config.setActionKey(CONTROLS_CUST_MINIMAP,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_MINIMAP1,inputKeyId);
break;
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TOGGLE_FULLSCREEN1:
case BUTTON_MENUOPTIONS_CONTROLS_CUST_TOGGLE_FULLSCREEN2:
bChange=config.setActionKey(CONTROLS_CUST_TOGGLE_FULLSCREEN,pmeElement->iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_TOGGLE_FULLSCREEN1,inputKeyId);
break;
}
}
return bChange;
}
//-----------------------------------------------------------------------------
int CWindowMenuConsole::Render()
{
if(bNoMenu) return 0;
int iSlider=0;
//------------------------------------------------------------------------
// Console display
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendZero, Renderer::BlendInvSrcColor);
GRenderer->SetRenderState(Renderer::DepthTest, false);
EERIEDrawBitmap2(static_cast(iPosX), static_cast(iSavePosY),
RATIO_X(pTexBackground->m_dwWidth), RATIO_Y(pTexBackground->m_dwHeight),
0, pTexBackground, Color::white);
GRenderer->SetRenderState(Renderer::DepthTest, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
EERIEDrawBitmap2(static_cast(iPosX), static_cast(iSavePosY),
RATIO_X(pTexBackgroundBorder->m_dwWidth), RATIO_Y(pTexBackgroundBorder->m_dwHeight),
0, pTexBackgroundBorder, Color::white);
//------------------------------------------------------------------------
int t = MenuAllZone.GetNbZone();
int iARXDiffTimeMenu = checked_range_cast(ARXDiffTimeMenu);
for(int i=0;ibActif)
{
pMe->Update(iARXDiffTimeMenu);
pMe->Render();
}
else
{
iSlider++;
}
}
//HIGHLIGHT
if(pZoneClick && pZoneClick->bActif)
{
bool bReInit=false;
pZoneClick->RenderMouseOver();
switch(pZoneClick->eState)
{
case EDIT_TIME:
UpdateText();
break;
case GETTOUCH_TIME:
{
if(bFrameOdd)
((CMenuElementText*)pZoneClick)->lColorHighlight = Color(255, 0, 0);
else
((CMenuElementText*)pZoneClick)->lColorHighlight = Color(50, 0, 0);
bool keyTouched = GInput->isAnyKeyPressed();
int keyId = GInput->getKeyPressed();
if( GInput->isKeyPressed(Keyboard::Key_LeftShift)||
GInput->isKeyPressed(Keyboard::Key_RightShift)||
GInput->isKeyPressed(Keyboard::Key_LeftCtrl)||
GInput->isKeyPressed(Keyboard::Key_RightCtrl)||
GInput->isKeyPressed(Keyboard::Key_LeftAlt)||
GInput->isKeyPressed(Keyboard::Key_RightAlt) )
{
if(!((keyId & INPUT_COMBINATION_MASK )>>16))
keyTouched = false;
}
else
{
if(GInput->isKeyPressedNowUnPressed(Keyboard::Key_LeftShift))
{
keyTouched = true;
keyId = Keyboard::Key_LeftShift;
}
if(GInput->isKeyPressedNowUnPressed(Keyboard::Key_RightShift))
{
keyTouched = true;
keyId = Keyboard::Key_RightShift;
}
if(GInput->isKeyPressedNowUnPressed(Keyboard::Key_LeftCtrl))
{
keyTouched = true;
keyId = Keyboard::Key_LeftCtrl;
}
if(GInput->isKeyPressedNowUnPressed(Keyboard::Key_RightCtrl))
{
keyTouched = true;
keyId = Keyboard::Key_RightCtrl;
}
if(GInput->isKeyPressedNowUnPressed(Keyboard::Key_LeftAlt))
{
keyTouched = true;
keyId = Keyboard::Key_LeftAlt;
}
if(GInput->isKeyPressedNowUnPressed(Keyboard::Key_RightAlt))
{
keyTouched = true;
keyId = Keyboard::Key_RightAlt;
}
}
InputKeyId inputKeyId;
CMenuElement *pmeElement = GetTouch(keyTouched, keyId, &inputKeyId, true);
if(pmeElement)
{
if(UpdateGameKey(bEdit,pmeElement, inputKeyId))
{
bReInit=true;
}
}
}
break;
default:
{
if(GInput->getMouseButtonNowPressed(Mouse::Button_0))
{
CMenuZone *pmzMenuZone = MenuAllZone.GetZoneWithID(BUTTON_MENUOPTIONS_CONTROLS_CUST_DEFAULT);
if(pmzMenuZone==pZoneClick)
{
config.setDefaultActionKeys();
bReInit=true;
}
}
}
break;
}
if(bReInit)
{
ReInitActionKey();
bMouseAttack=false;
}
}
//DEBUG ZONE
MenuAllZone.DrawZone();
return iSlider;
}
void CWindowMenuConsole::ReInitActionKey()
{
int iID=BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP1;
int iI=NUM_ACTION_KEY;
while(iI--)
{
int iTab=(iID-BUTTON_MENUOPTIONS_CONTROLS_CUST_JUMP1)>>1;
CMenuZone *pmzMenuZone = MenuAllZone.GetZoneWithID(iID);
if (pmzMenuZone)
{
if(pmzMenuZone)
{
pZoneClick = (CMenuElement*)pmzMenuZone;
GetTouch(true, config.actions[iTab].key[0]);
}
pmzMenuZone = MenuAllZone.GetZoneWithID(iID+1);
if( pmzMenuZone )
{
pZoneClick = (CMenuElement*)pmzMenuZone;
GetTouch(true, config.actions[iTab].key[1]);
}
}
iID+=2;
}
}
//-----------------------------------------------------------------------------
CMenuPanel::CMenuPanel()
: CMenuElement(NOP)
{
vElement.clear();
pRef = this;
}
//-----------------------------------------------------------------------------
CMenuPanel::~CMenuPanel()
{
for (std::vector::iterator it = vElement.begin(), it_end = vElement.end(); it != it_end; ++it)
delete (*it);
}
//-----------------------------------------------------------------------------
void CMenuPanel::Move(int _iX, int _iY)
{
rZone.left += _iX;
rZone.top += _iY;
rZone.right += _iX;
rZone.bottom += _iY;
for (std::vector::iterator it = vElement.begin(), it_end = vElement.end(); it != it_end; ++it)
(*it)->Move(_iX, _iY);
}
//-----------------------------------------------------------------------------
// patch on ajoute à droite en ligne
void CMenuPanel::AddElement(CMenuElement* _pElem)
{
vElement.push_back(_pElem);
if (vElement.size() == 1)
rZone = _pElem->rZone;
else
{
rZone.left = std::min(rZone.left, _pElem->rZone.left);
rZone.top = std::min(rZone.top, _pElem->rZone.top);
}
// + taille elem
rZone.right = std::max(rZone.right, _pElem->rZone.right);
rZone.bottom = std::max(rZone.bottom, _pElem->rZone.bottom);
_pElem->Move(0, ((GetHeight() - _pElem->rZone.bottom) / 2));
}
//-----------------------------------------------------------------------------
// patch on ajoute à droite en ligne
void CMenuPanel::AddElementNoCenterIn(CMenuElement* _pElem)
{
vElement.push_back(_pElem);
if (vElement.size() == 1)
rZone=_pElem->rZone;
else
{
rZone.left = std::min(rZone.left, _pElem->rZone.left);
rZone.top = std::min(rZone.top, _pElem->rZone.top);
}
// + taille elem
rZone.right = std::max(rZone.right, _pElem->rZone.right);
rZone.bottom = std::max(rZone.bottom, _pElem->rZone.bottom);
}
//-----------------------------------------------------------------------------
CMenuElement* CMenuPanel::OnShortCut()
{
for (std::vector::iterator it = vElement.begin(), it_end = vElement.end(); it != it_end; ++it)
if ((*it)->OnShortCut())
return *it;
return NULL;
}
//-----------------------------------------------------------------------------
void CMenuPanel::Update(int _iTime)
{
rZone.right = rZone.left;
rZone.bottom = rZone.top;
;
for (std::vector::iterator it = vElement.begin(), it_end = vElement.end(); it != it_end; ++it)
{
(*it)->Update(_iTime);
rZone.right = std::max(rZone.right, (*it)->rZone.right);
rZone.bottom = std::max(rZone.bottom, (*it)->rZone.bottom);
}
}
//-----------------------------------------------------------------------------
void CMenuPanel::Render()
{
if(bNoMenu) return;
for (std::vector::iterator it = vElement.begin(), it_end = vElement.end(); it != it_end; ++it)
(*it)->Render();
}
//-----------------------------------------------------------------------------
CMenuZone * CMenuPanel::GetZoneWithID(int _iID)
{
for (std::vector::iterator it = vElement.begin(), it_end = vElement.end(); it != it_end; ++it)
if (CMenuZone* pZone = (*it)->GetZoneWithID(_iID))
return pZone;
return NULL;
}
//-----------------------------------------------------------------------------
CMenuZone * CMenuPanel::IsMouseOver(const Vec2s& mousePos) const
{
if ((mousePos.x >= rZone.left) &&
(mousePos.y >= rZone.top) &&
(mousePos.x <= rZone.right) &&
(mousePos.y <= rZone.bottom))
{
vector::const_iterator i;
for(i=vElement.begin();i!=vElement.end();++i)
{
if ((*i)->bCheck &&
(*i)->bActif &&
(mousePos.x >= (*i)->rZone.left) &&
(mousePos.y >= (*i)->rZone.top) &&
(mousePos.x <= (*i)->rZone.right) &&
(mousePos.y <= (*i)->rZone.bottom))
return (*i)->pRef;
}
}
return NULL;
}
//-----------------------------------------------------------------------------
CMenuButton::CMenuButton(int _iID, Font* _pFont,MENUSTATE _eMenuState,int _iPosX,int _iPosY, const std::string& _pText,float _fSize,TextureContainer *_pTex,TextureContainer *_pTexOver,int _iColor)
: CMenuElement(_eMenuState)
{
iID = _iID;
pFont = _pFont;
fSize=_fSize;
rZone.left=_iPosX;
rZone.top=_iPosY;
rZone.right = rZone.left ;
rZone.bottom = rZone.top ;
vText.clear();
iPos=0;
if( !_pText.empty() )
{
AddText(_pText);
}
pTex=_pTex;
pTexOver=_pTexOver;
if(pTex) {
float rZoneR = rZone.left + RATIO_X(pTex->m_dwWidth);
float rZoneB = rZone.top + RATIO_Y(pTex->m_dwHeight);
rZone.right = max(rZone.right, checked_range_cast(rZoneR));
rZone.bottom = max(rZone.bottom, checked_range_cast(rZoneB));
}
if(pTexOver) {
float rZoneR = rZone.left + RATIO_X(pTexOver->m_dwWidth);
float rZoneB = rZone.top + RATIO_Y(pTexOver->m_dwHeight);
rZone.right = max(rZone.right, checked_range_cast(rZoneR));
rZone.bottom = max(rZone.bottom, checked_range_cast(rZoneB));
}
iColor=_iColor;
pRef=this;
}
//-----------------------------------------------------------------------------
CMenuButton::~CMenuButton() {
}
//-----------------------------------------------------------------------------
void CMenuButton::SetPos(float _iX,float _iY)
{
CMenuZone::SetPos(_iX, _iY);
int iWidth = 0;
int iHeight = 0;
if(pTex) {
iWidth = checked_range_cast(RATIO_X(pTex->m_dwWidth));
iHeight = checked_range_cast(RATIO_Y(pTex->m_dwHeight));
}
int iWidth2 = 0;
int iHeight2 = 0;
if(pTexOver) {
iWidth2 = checked_range_cast(RATIO_X(pTexOver->m_dwWidth));
iHeight2 = checked_range_cast(RATIO_Y(pTexOver->m_dwHeight));
}
rZone.right = static_cast(_iX) + max(iWidth, iWidth2);
rZone.bottom = static_cast(_iY) + max(iHeight, iHeight2);
}
//-----------------------------------------------------------------------------
void CMenuButton::AddText( const std::string& _pText)
{
if ( _pText.empty() )
return;
vText += _pText;
int iSizeXButton=rZone.right-rZone.left;
int iSizeYButton=rZone.bottom-rZone.top;
Vec2i textSize = pFont->getTextSize(_pText);
if(textSize.x>iSizeXButton) iSizeXButton=textSize.x;
if(textSize.y>iSizeYButton) iSizeYButton=textSize.y;
rZone.right=rZone.left+iSizeXButton;
rZone.bottom=rZone.top+iSizeYButton;
}
bool CMenuButton::OnMouseClick(int _iMouseButton) {
(void)_iMouseButton;
if(!enabled) {
return false;
}
iPos++;
arx_assert(iPos >= 0);
if((size_t)iPos >= vText.size() )
iPos = 0;
ARX_SOUND_PlayMenu(SND_MENU_CLICK);
return false;
}
//-----------------------------------------------------------------------------
void CMenuButton::Update(int _iDTime) {
(void)_iDTime;
}
//-----------------------------------------------------------------------------
void CMenuButton::Render()
{
if(bNoMenu) return;
//affichage de la texture
if(pTex) {
EERIEDrawBitmap2(static_cast(rZone.left), static_cast(rZone.top),
RATIO_X(pTex->m_dwWidth), RATIO_Y(pTex->m_dwHeight), 0, pTex, Color::white);
}
//affichage de la font
if(vText.size())
{
char pText = vText[iPos];
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
Vec3f ePos;
ePos.x = (float)rZone.left;
ePos.y = (float)rZone.top;
ePos.z = 1;
FontRenderText(pFont, ePos, &pText, Color(232, 204, 142));
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
}
//-----------------------------------------------------------------------------
void CMenuButton::RenderMouseOver()
{
if(bNoMenu) return;
pMenuCursor->SetMouseOver();
//affichage de la texture
if(pTexOver)
{
TexturedVertex v[4];
v[0].color = v[1].color = v[2].color = v[3].color = Color::white.toBGR();
v[0].p.z=v[1].p.z=v[2].p.z=v[3].p.z=0.f;
v[0].rhw=v[1].rhw=v[2].rhw=v[3].rhw=0.999999f;
GRenderer->SetTexture(0, pTexOver);
v[0].p.x = (float)rZone.left;
v[0].p.y = (float)rZone.top;
v[0].uv.x = 0.f;
v[0].uv.y = 0.f;
v[1].p.x = (float)(rZone.right);
v[1].p.y = v[0].p.y;
v[1].uv.x = 0.999999f;
v[1].uv.y = 0.f;
v[2].p.x = v[0].p.x;
v[2].p.y = (float)(rZone.bottom);
v[2].uv.x = 0.f;
v[2].uv.y = 0.999999f;
v[3].p.x = v[1].p.x;
v[3].p.y = v[2].p.y;
v[3].uv.x = 0.999999f;
v[3].uv.y = 0.999999f;
EERIEDRAWPRIM(Renderer::TriangleStrip, v, 4);
}
if( vText.size() )
{
char pText=vText[iPos];
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
Vec3f ePos;
ePos.x = (float)rZone.left;
ePos.y = (float)rZone.top;
ePos.z = 1;
FontRenderText(pFont, ePos, &pText, Color(255, 255, 255));
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
}
//-----------------------------------------------------------------------------
CMenuSliderText::CMenuSliderText(int _iID, int _iPosX, int _iPosY)
: CMenuElement(NOP)
{
iID = _iID;
TextureContainer *pTex = TextureContainer::Load("graph/interface/menus/menu_slider_button_left");
pLeftButton = new CMenuButton(-1, hFontMenu, NOP, _iPosX, _iPosY, string(), 1, pTex, pTex, -1);
pTex = TextureContainer::Load("graph/interface/menus/menu_slider_button_right");
pRightButton = new CMenuButton(-1, hFontMenu, NOP, _iPosX, _iPosY, string(), 1, pTex, pTex, -1);
vText.clear();
iPos = 0;
iOldPos = -1;
rZone.left = _iPosX;
rZone.top = _iPosY;
rZone.right = _iPosX + pLeftButton->GetWidth() + pRightButton->GetWidth();
rZone.bottom = _iPosY + max(pLeftButton->GetHeight(), pRightButton->GetHeight());
pRef = this;
}
CMenuSliderText::~CMenuSliderText() {
delete pLeftButton;
delete pRightButton;
BOOST_FOREACH(CMenuElementText * e, vText) {
delete e;
}
}
void CMenuSliderText::SetWidth(int _iWidth) {
rZone.right = max(rZone.right, rZone.left + _iWidth);
pRightButton->SetPos(rZone.right - pRightButton->GetWidth(), pRightButton->rZone.top);
int dx=rZone.right-rZone.left-pLeftButton->GetWidth()-pRightButton->GetWidth();
//on recentre tout
vector::iterator it;
for(it=vText.begin();itGetTextSize();
int dxx=(dx-textSize.x)>>1;
pMenuElementText->SetPos(static_cast(pLeftButton->rZone.right + dxx), static_cast(rZone.top));
}
}
//-----------------------------------------------------------------------------
void CMenuSliderText::AddText(CMenuElementText *_pText)
{
_pText->setEnabled(enabled);
_pText->Move(rZone.left + pLeftButton->GetWidth(), rZone.top + 0);
vText.push_back(_pText);
Vec2i textSize = _pText->GetTextSize();
rZone.right = max(rZone.right, rZone.left + pLeftButton->GetWidth() + pRightButton->GetWidth() + textSize.x);
rZone.bottom = max(rZone.bottom, rZone.top + textSize.y);
pLeftButton->SetPos(rZone.left, rZone.top+(textSize.y>>2));
pRightButton->SetPos(rZone.right-pRightButton->GetWidth(), rZone.top+(textSize.y>>2));
int dx=rZone.right-rZone.left-pLeftButton->GetWidth()-pRightButton->GetWidth();
//on recentre tout
vector::iterator it;
for(it=vText.begin();itGetTextSize();
int dxx=(dx-textSize.x)>>1;
pMenuElementText->SetPos(static_cast(pLeftButton->rZone.right + dxx), static_cast(rZone.top));
}
}
//-----------------------------------------------------------------------------
void CMenuSliderText::Move(int _iX, int _iY)
{
CMenuZone::Move(_iX, _iY);
pLeftButton->Move(_iX, _iY);
pRightButton->Move(_iX, _iY);
for (std::vector::const_iterator i = vText.begin(), i_end = vText.end(); i != i_end; ++i)
(*i)->Move(_iX, _iY);
}
//-----------------------------------------------------------------------------
void CMenuSliderText::EmptyFunction()
{
//Touche pour la selection
if(GInput->isKeyPressedNowPressed(Keyboard::Key_LeftArrow))
{
iPos--;
if (iPos <= 0) iPos = 0;
}
else
{
if( GInput->isKeyPressedNowPressed( Keyboard::Key_RightArrow ) )
{
iPos++;
arx_assert(iPos >= 0);
if ((size_t)iPos >= vText.size() - 1 ) iPos = vText.size() - 1;
}
}
}
//-----------------------------------------------------------------------------
bool CMenuSliderText::OnMouseClick(int)
{
if(!enabled) {
return false;
}
ARX_SOUND_PlayMenu(SND_MENU_CLICK);
if(iOldPos<0)
iOldPos=iPos;
int iX = GInput->getMousePosAbs().x;
int iY = GInput->getMousePosAbs().y;
if ((iX >= rZone.left) &&
(iY >= rZone.top) &&
(iX <= rZone.right) &&
(iY <= rZone.bottom))
{
if ((iX >= pLeftButton->rZone.left) &&
(iY >= pLeftButton->rZone.top) &&
(iX <= pLeftButton->rZone.right) &&
(iY <= pLeftButton->rZone.bottom))
{
iPos--;
if(iPos < 0) {
iPos = vText.size() - 1;
}
}
else if ((iX >= pRightButton->rZone.left) &&
(iY >= pRightButton->rZone.top) &&
(iX <= pRightButton->rZone.right) &&
(iY <= pRightButton->rZone.bottom))
{
iPos++;
arx_assert(iPos >= 0);
if(size_t(iPos) >= vText.size()) {
iPos = 0;
}
}
}
switch(iID) {
case BUTTON_MENUOPTIONSVIDEO_RESOLUTION: {
std::string pcText = (vText.at(iPos))->lpszText;
if(pcText == AUTO_RESOLUTION_STRING) {
newWidth = newHeight = 0;
} else {
std::stringstream ss( pcText );
int iX = config.video.resolution.x;
int iY = config.video.resolution.y;
char tmp;
ss >> iX >> tmp >> iY;
newWidth = iX;
newHeight = iY;
}
break;
}
case BUTTON_MENUOPTIONSVIDEO_RENDERER: {
switch((vText.at(iPos))->eMenuState) {
case OPTIONS_VIDEO_RENDERER_OPENGL: config.window.framework = "SDL"; break;
case OPTIONS_VIDEO_RENDERER_D3D9: config.window.framework = "D3D9"; break;
case OPTIONS_VIDEO_RENDERER_AUTOMATIC: config.window.framework = "auto"; break;
default: break;
}
break;
}
case BUTTON_MENUOPTIONSAUDIO_BACKEND: {
switch((vText.at(iPos))->eMenuState) {
case OPTIONS_AUDIO_BACKEND_OPENAL: config.audio.backend = "OpenAL"; break;
case OPTIONS_AUDIO_BACKEND_DSOUND: config.audio.backend = "DirectSound"; break;
case OPTIONS_AUDIO_BACKEND_AUTOMATIC: config.audio.backend = "auto"; break;
default: break;
}
break;
}
case BUTTON_MENUOPTIONS_CONTROLS_BACKEND: {
switch((vText.at(iPos))->eMenuState) {
case OPTIONS_INPUT_BACKEND_SDL: config.input.backend = "SDL"; break;
case OPTIONS_INPUT_BACKEND_DINPUT: config.input.backend = "DirectInput8"; break;
case OPTIONS_INPUT_BACKEND_AUTOMATIC: config.input.backend = "auto"; break;
default: break;
}
break;
}
// MENUOPTIONS_VIDEO
case BUTTON_MENUOPTIONSVIDEO_BPP: {
std::stringstream ss;
ss << vText[iPos]->lpszText;
ss >> newBpp;
break;
}
case BUTTON_MENUOPTIONSVIDEO_OTHERSDETAILS: {
ARXMenu_Options_Video_SetDetailsQuality(iPos);
break;
}
}
return false;
}
//-----------------------------------------------------------------------------
void CMenuSliderText::Update(int _iTime)
{
pLeftButton->Update(_iTime);
pRightButton->Update(_iTime);
}
//-----------------------------------------------------------------------------
void CMenuSliderText::Render() {
if(bNoMenu) return;
if(enabled) {
pLeftButton->Render();
pRightButton->Render();
}
if(iPos >= 0 && size_t(iPos) < vText.size() && vText[iPos]) {
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
vText[iPos]->Render();
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
}
void CMenuSliderText::setEnabled(bool enable) {
CMenuElement::setEnabled(enable);
pLeftButton->setEnabled(enable);
pRightButton->setEnabled(enable);
for(size_t i = 0; i < vText.size(); i++) {
vText[i]->setEnabled(enable);
}
}
//-----------------------------------------------------------------------------
void CMenuSliderText::RenderMouseOver()
{
if(bNoMenu) return;
pMenuCursor->SetMouseOver();
int iX = GInput->getMousePosAbs().x;
int iY = GInput->getMousePosAbs().y;
if(!enabled) {
return;
}
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
if ((iX >= rZone.left) &&
(iY >= rZone.top) &&
(iX <= rZone.right) &&
(iY <= rZone.bottom))
{
if ((iX >= pLeftButton->rZone.left) &&
(iY >= pLeftButton->rZone.top) &&
(iX <= pLeftButton->rZone.right) &&
(iY <= pLeftButton->rZone.bottom))
{
pLeftButton->Render();
}
else if ((iX >= pRightButton->rZone.left) &&
(iY >= pRightButton->rZone.top) &&
(iX <= pRightButton->rZone.right) &&
(iY <= pRightButton->rZone.bottom))
{
pRightButton->Render();
}
}
}
//-----------------------------------------------------------------------------
// CMenuSlider
//-----------------------------------------------------------------------------
CMenuSlider::CMenuSlider(int _iID, int _iPosX, int _iPosY)
: CMenuElement(NOP)
{
iID = _iID;
TextureContainer *pTexL = TextureContainer::Load("graph/interface/menus/menu_slider_button_left");
TextureContainer *pTexR = TextureContainer::Load("graph/interface/menus/menu_slider_button_right");
pLeftButton = new CMenuButton(-1, hFontMenu, NOP, _iPosX, _iPosY, string(), 1, pTexL, pTexR, -1);
pRightButton = new CMenuButton(-1, hFontMenu, NOP, _iPosX, _iPosY, string(), 1, pTexR, pTexL, -1);
pTex1 = TextureContainer::Load("graph/interface/menus/menu_slider_on");
pTex2 = TextureContainer::Load("graph/interface/menus/menu_slider_off");
iPos = 0;
rZone.left = _iPosX;
rZone.top = _iPosY;
rZone.right = _iPosX + pLeftButton->GetWidth() + pRightButton->GetWidth() + 10*max(pTex1->m_dwWidth, pTex2->m_dwWidth);
rZone.bottom = _iPosY + max(pLeftButton->GetHeight(), pRightButton->GetHeight());
arx_assert(rZone.bottom >= 0);
rZone.bottom = max( static_cast( rZone.bottom ), (unsigned long)max( pTex1->m_dwHeight, pTex2->m_dwHeight ) );
pRightButton->Move(pLeftButton->GetWidth() + 10*max(pTex1->m_dwWidth, pTex2->m_dwWidth), 0);
pRef = this;
}
CMenuSlider::~CMenuSlider() {
delete pLeftButton;
delete pRightButton;
}
void CMenuSlider::Move(int _iX, int _iY) {
CMenuZone::Move(_iX, _iY);
pLeftButton->Move(_iX, _iY);
pRightButton->Move(_iX, _iY);
}
void CMenuSlider::EmptyFunction()
{
//Touche pour la selection
if(GInput->isKeyPressedNowPressed(Keyboard::Key_LeftArrow))
{
iPos--;
if (iPos <= 0) iPos = 0;
}
else
{
if(GInput->isKeyPressedNowPressed(Keyboard::Key_RightArrow))
{
iPos++;
if (iPos >= 10) iPos = 10;
}
}
}
//-----------------------------------------------------------------------------
bool CMenuSlider::OnMouseClick(int)
{
ARX_SOUND_PlayMenu(SND_MENU_CLICK);
int iX = GInput->getMousePosAbs().x;
int iY = GInput->getMousePosAbs().y;
if ((iX >= rZone.left) &&
(iY >= rZone.top) &&
(iX <= rZone.right) &&
(iY <= rZone.bottom))
{
if ((iX >= pLeftButton->rZone.left) &&
(iY >= pLeftButton->rZone.top) &&
(iX <= pLeftButton->rZone.right) &&
(iY <= pLeftButton->rZone.bottom))
{
iPos--;
if (iPos <= 0) iPos = 0;
}
else if ((iX >= pRightButton->rZone.left) &&
(iY >= pRightButton->rZone.top) &&
(iX <= pRightButton->rZone.right) &&
(iY <= pRightButton->rZone.bottom))
{
iPos++;
if (iPos >= 10) iPos = 10;
}
}
switch (iID)
{
// MENUOPTIONS_VIDEO
case BUTTON_MENUOPTIONSVIDEO_FOG:
ARXMenu_Options_Video_SetFogDistance(iPos);
break;
// MENUOPTIONS_AUDIO
case BUTTON_MENUOPTIONSAUDIO_MASTER:
ARXMenu_Options_Audio_SetMasterVolume(iPos);
break;
case BUTTON_MENUOPTIONSAUDIO_SFX:
ARXMenu_Options_Audio_SetSfxVolume(iPos);
break;
case BUTTON_MENUOPTIONSAUDIO_SPEECH:
ARXMenu_Options_Audio_SetSpeechVolume(iPos);
break;
case BUTTON_MENUOPTIONSAUDIO_AMBIANCE:
ARXMenu_Options_Audio_SetAmbianceVolume(iPos);
break;
// MENUOPTIONS_CONTROLS
case BUTTON_MENUOPTIONS_CONTROLS_MOUSESENSITIVITY:
ARXMenu_Options_Control_SetMouseSensitivity(iPos);
break;
case BUTTON_MENUOPTIONS_CONTROLS_QUICKSAVESLOTS: {
iPos = std::max(iPos, 1);
config.misc.quicksaveSlots = iPos;
break;
}
}
return false;
}
//-----------------------------------------------------------------------------
void CMenuSlider::Update(int _iTime) {
pLeftButton->Update(_iTime);
pRightButton->Update(_iTime);
pRightButton->SetPos(rZone.left, rZone.top);
float fWidth = pLeftButton->GetWidth() + RATIO_X(10*max(pTex1->m_dwWidth, pTex2->m_dwWidth)) ;
pRightButton->Move(checked_range_cast(fWidth), 0);
rZone.right = checked_range_cast( rZone.left + pLeftButton->GetWidth() + pRightButton->GetWidth() + RATIO_X(10*std::max(pTex1->m_dwWidth, pTex2->m_dwWidth)) );
rZone.bottom = rZone.top + std::max(pLeftButton->GetHeight(), pRightButton->GetHeight());
}
void CMenuSlider::Render()
{
if(bNoMenu) return;
pLeftButton->Render();
pRightButton->Render();
float iX = static_cast( rZone.left + pLeftButton->GetWidth() );
float iY = static_cast( rZone.top );
float iTexW = 0;
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
TexturedVertex v[4];
v[0].color = v[1].color = v[2].color = v[3].color = Color::white.toBGR();
v[0].p.z=v[1].p.z=v[2].p.z=v[3].p.z=0.f;
v[0].rhw=v[1].rhw=v[2].rhw=v[3].rhw=0.999999f;
TextureContainer *pTex = pTex1;
for (int i=0; i<10; i++)
{
iTexW = 0;
if(i < iPos) {
if(pTex1) {
pTex = pTex1;
iTexW = RATIO_X(pTex1->m_dwWidth);
}
} else if(pTex2) {
pTex = pTex2;
iTexW = RATIO_X(pTex2->m_dwWidth);
}
if(pTex) {
EERIEDrawBitmap2(iX, iY, RATIO_X(pTex->m_dwWidth), RATIO_Y(pTex->m_dwHeight),
0, pTex, Color::white);
}
iX += iTexW;
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
void CMenuSlider::RenderMouseOver()
{
if(bNoMenu) return;
pMenuCursor->SetMouseOver();
int iX = GInput->getMousePosAbs().x;
int iY = GInput->getMousePosAbs().y;
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
if ((iX >= rZone.left) &&
(iY >= rZone.top) &&
(iX <= rZone.right) &&
(iY <= rZone.bottom))
{
if ((iX >= pLeftButton->rZone.left) &&
(iY >= pLeftButton->rZone.top) &&
(iX <= pLeftButton->rZone.right) &&
(iY <= pLeftButton->rZone.bottom))
{
pLeftButton->Render();
}
else if ((iX >= pRightButton->rZone.left) &&
(iY >= pRightButton->rZone.top) &&
(iX <= pRightButton->rZone.right) &&
(iY <= pRightButton->rZone.bottom))
{
pRightButton->Render();
}
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
//-----------------------------------------------------------------------------
MenuCursor::MenuCursor()
{
pTex[0]=TextureContainer::Find("graph/interface/cursors/cursor00");
pTex[1]=TextureContainer::Find("graph/interface/cursors/cursor01");
pTex[2]=TextureContainer::Find("graph/interface/cursors/cursor02");
pTex[3]=TextureContainer::Find("graph/interface/cursors/cursor03");
pTex[4]=TextureContainer::Find("graph/interface/cursors/cursor04");
pTex[5]=TextureContainer::Find("graph/interface/cursors/cursor05");
pTex[6]=TextureContainer::Find("graph/interface/cursors/cursor06");
pTex[7]=TextureContainer::Find("graph/interface/cursors/cursor07");
SetCursorOff();
iNbOldCoord=0;
iMaxOldCoord=40;
exited = true;
bMouseOver=false;
if(pTex[0])
{
fTailleX=(float)pTex[0]->m_dwWidth;
fTailleY=(float)pTex[0]->m_dwHeight;
}
else
{
fTailleX=fTailleY=0.f;
}
iNumCursor=0;
lFrameDiff=0;
bDrawCursor=true;
}
//-----------------------------------------------------------------------------
MenuCursor::~MenuCursor()
{
}
//-----------------------------------------------------------------------------
void MenuCursor::SetCursorOff()
{
eNumTex=CURSOR_OFF;
}
//-----------------------------------------------------------------------------
void MenuCursor::SetCursorOn()
{
eNumTex=CURSOR_ON;
}
//-----------------------------------------------------------------------------
void MenuCursor::SetMouseOver()
{
bMouseOver=true;
SetCursorOn();
}
//-----------------------------------------------------------------------------
void MenuCursor::DrawOneCursor(const Vec2s& mousePos) {
if(!GInput->isMouseInWindow()) {
return;
}
GRenderer->GetTextureStage(0)->SetMinFilter(TextureStage::FilterNearest);
GRenderer->GetTextureStage(0)->SetMagFilter(TextureStage::FilterNearest);
GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapClamp);
EERIEDrawBitmap2(static_cast(mousePos.x), static_cast(mousePos.y),
INTERFACE_RATIO_DWORD(scursor[iNumCursor]->m_dwWidth),
INTERFACE_RATIO_DWORD(scursor[iNumCursor]->m_dwHeight),
0.00000001f, scursor[iNumCursor], Color::white);
GRenderer->GetTextureStage(0)->SetMinFilter(TextureStage::FilterLinear);
GRenderer->GetTextureStage(0)->SetMagFilter(TextureStage::FilterLinear);
GRenderer->GetTextureStage(0)->SetWrapMode(TextureStage::WrapRepeat);
}
//-----------------------------------------------------------------------------
void MenuCursor::Update() {
bool inWindow = GInput->isMouseInWindow();
if(inWindow && exited) {
// Mouse is re-entering the window - reset the cursor trail
iNbOldCoord = 0;
}
exited = !inWindow;
Vec2s iDiff;
if(pTex[eNumTex]) {
iDiff = Vec2s(pTex[eNumTex]->m_dwWidth / 2, pTex[eNumTex]->m_dwHeight / 2);
} else {
iDiff = Vec2s::ZERO;
}
iOldCoord[iNbOldCoord] = GInput->getMousePosAbs() + iDiff;
iNbOldCoord++;
if(iNbOldCoord >= iMaxOldCoord) {
iNbOldCoord = iMaxOldCoord - 1;
memmove(iOldCoord, iOldCoord + 1, sizeof(Vec2s) * iNbOldCoord);
}
}
//-----------------------------------------------------------------------------
static bool ComputePer(const Vec2s & _psPoint1, const Vec2s & _psPoint2, TexturedVertex * _psd3dv1, TexturedVertex * _psd3dv2, float _fSize) {
Vec2f sTemp((float)(_psPoint2.x - _psPoint1.x), (float)(_psPoint2.y - _psPoint1.y));
float fTemp = sTemp.x;
sTemp.x = -sTemp.y;
sTemp.y = fTemp;
float fMag = sTemp.length();
if(fMag < std::numeric_limits::epsilon()) {
return false;
}
fMag = _fSize / fMag;
_psd3dv1->p.x=(sTemp.x*fMag);
_psd3dv1->p.y=(sTemp.y*fMag);
_psd3dv2->p.x=((float)_psPoint1.x)-_psd3dv1->p.x;
_psd3dv2->p.y=((float)_psPoint1.y)-_psd3dv1->p.y;
_psd3dv1->p.x+=((float)_psPoint1.x);
_psd3dv1->p.y+=((float)_psPoint1.y);
return true;
}
//-----------------------------------------------------------------------------
static void DrawLine2D(const Vec2s * points, int _iNbPt, float _fSize, float _fRed, float _fGreen, float _fBlue) {
if(_iNbPt < 2) {
return;
}
float fSize = _fSize / _iNbPt;
float fTaille = fSize;
float fDColorRed = _fRed / _iNbPt;
float fColorRed = fDColorRed;
float fDColorGreen = _fGreen / _iNbPt;
float fColorGreen = fDColorGreen;
float fDColorBlue = _fBlue / _iNbPt;
float fColorBlue = fDColorBlue;
GRenderer->SetBlendFunc(Renderer::BlendDstColor, Renderer::BlendInvDstColor);
GRenderer->ResetTexture(0);
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
TexturedVertex v[4];
v[0].p.z = v[1].p.z = v[2].p.z = v[3].p.z = 0.f;
v[0].rhw = v[1].rhw = v[2].rhw = v[3].rhw = 0.999999f;
v[0].color = v[2].color = Color3f(fColorRed, fColorGreen, fColorBlue).toBGR();
if(!ComputePer(points[0], points[1], &v[0], &v[2], fTaille)) {
v[0].p.x = v[2].p.x = points[0].x;
v[0].p.y = v[2].p.y = points[1].y;
}
for(int i = 1; i < _iNbPt - 1; i++) {
fTaille += fSize;
fColorRed += fDColorRed;
fColorGreen += fDColorGreen;
fColorBlue += fDColorBlue;
if(ComputePer(points[i], points[i + 1], &v[1], &v[3], fTaille)) {
v[1].color = v[3].color = Color3f(fColorRed, fColorGreen, fColorBlue).toBGR();
EERIEDRAWPRIM(Renderer::TriangleStrip, v, 4);
v[0].p.x = v[1].p.x;
v[0].p.y = v[1].p.y;
v[0].color = v[1].color;
v[2].p.x = v[3].p.x;
v[2].p.y = v[3].p.y;
v[2].color = v[3].color;
}
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
//-----------------------------------------------------------------------------
void MenuCursor::DrawCursor()
{
if(!bDrawCursor)
return;
GRenderer->SetRenderState(Renderer::AlphaBlending, true);
DrawLine2D(iOldCoord, iNbOldCoord, 10.f, .725f, .619f, 0.56f);
if(pTex[iNumCursor])
GRenderer->SetTexture(0, pTex[iNumCursor]);
else
GRenderer->ResetTexture(0);
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
GRenderer->SetRenderState(Renderer::DepthTest, false);
DrawOneCursor(GInput->getMousePosAbs());
GRenderer->SetRenderState(Renderer::DepthTest, true);
lFrameDiff += checked_range_cast(ARXDiffTimeMenu);
if(lFrameDiff>70)
{
if(bMouseOver)
{
if(iNumCursor<4)
{
iNumCursor++;
}
else
{
if(iNumCursor>4)
{
iNumCursor--;
}
}
SetCursorOff();
bMouseOver=false;
}
else
{
if (iNumCursor > 0)
{
iNumCursor++;
if(iNumCursor>7) iNumCursor=0;
}
}
lFrameDiff=0;
}
GRenderer->SetRenderState(Renderer::AlphaBlending, false);
}
void Menu2_Close() {
ARXmenu.currentmode = AMCM_OFF;
delete pWindowMenu, pWindowMenu = NULL;
delete pMenu, pMenu = NULL;
delete pMenuCursor, pMenuCursor = NULL;
}