From 54254e2158ac2ac50928d4a78d8bdf79d9102955 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Tue, 4 Aug 2015 23:28:58 +0200 Subject: [PATCH] Split CMainDialog --- src/CMakeLists.txt | 12 + src/object/robotmain.cpp | 46 +- src/object/robotmain.h | 11 +- src/ui/maindialog.cpp | 4374 +----------------------- src/ui/maindialog.h | 68 +- src/ui/screen/screen.cpp | 52 + src/ui/screen/screen.h | 61 + src/ui/screen/screen_apperance.cpp | 692 ++++ src/ui/screen/screen_apperance.h | 46 + src/ui/screen/screen_io.cpp | 252 ++ src/ui/screen/screen_io.h | 42 + src/ui/screen/screen_io_read.cpp | 170 + src/ui/screen/screen_io_read.h | 36 + src/ui/screen/screen_io_write.cpp | 160 + src/ui/screen/screen_io_write.h | 33 + src/ui/screen/screen_level_list.cpp | 598 ++++ src/ui/screen/screen_level_list.h | 71 + src/ui/screen/screen_loading.cpp | 93 + src/ui/screen/screen_loading.h | 36 + src/ui/screen/screen_main_menu.cpp | 221 ++ src/ui/screen/screen_main_menu.h | 33 + src/ui/screen/screen_player_select.cpp | 457 +++ src/ui/screen/screen_player_select.h | 43 + src/ui/screen/screen_quit.cpp | 133 + src/ui/screen/screen_quit.h | 33 + src/ui/screen/screen_setup.cpp | 1673 +++++++++ src/ui/screen/screen_setup.h | 64 + src/ui/screen/screen_welcome.cpp | 110 + src/ui/screen/screen_welcome.h | 37 + 29 files changed, 5339 insertions(+), 4318 deletions(-) create mode 100644 src/ui/screen/screen.cpp create mode 100644 src/ui/screen/screen.h create mode 100644 src/ui/screen/screen_apperance.cpp create mode 100644 src/ui/screen/screen_apperance.h create mode 100644 src/ui/screen/screen_io.cpp create mode 100644 src/ui/screen/screen_io.h create mode 100644 src/ui/screen/screen_io_read.cpp create mode 100644 src/ui/screen/screen_io_read.h create mode 100644 src/ui/screen/screen_io_write.cpp create mode 100644 src/ui/screen/screen_io_write.h create mode 100644 src/ui/screen/screen_level_list.cpp create mode 100644 src/ui/screen/screen_level_list.h create mode 100644 src/ui/screen/screen_loading.cpp create mode 100644 src/ui/screen/screen_loading.h create mode 100644 src/ui/screen/screen_main_menu.cpp create mode 100644 src/ui/screen/screen_main_menu.h create mode 100644 src/ui/screen/screen_player_select.cpp create mode 100644 src/ui/screen/screen_player_select.h create mode 100644 src/ui/screen/screen_quit.cpp create mode 100644 src/ui/screen/screen_quit.h create mode 100644 src/ui/screen/screen_setup.cpp create mode 100644 src/ui/screen/screen_setup.h create mode 100644 src/ui/screen/screen_welcome.cpp create mode 100644 src/ui/screen/screen_welcome.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8789d7d0..328fbd7a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -205,6 +205,18 @@ set(BASE_SOURCES script/scriptfunc.cpp sound/sound.cpp sound/sound_type.cpp + ui/screen/screen.cpp + ui/screen/screen_apperance.cpp + ui/screen/screen_io.cpp + ui/screen/screen_io_read.cpp + ui/screen/screen_io_write.cpp + ui/screen/screen_level_list.cpp + ui/screen/screen_loading.cpp + ui/screen/screen_main_menu.cpp + ui/screen/screen_player_select.cpp + ui/screen/screen_setup.cpp + ui/screen/screen_quit.cpp + ui/screen/screen_welcome.cpp ui/button.cpp ui/check.cpp ui/color.cpp diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index 745915fe..0a72a878 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -398,9 +398,33 @@ void CRobotMain::LoadConfigFile() m_settings->LoadSettings(); } +bool IsInSimulationConfigPhase(Phase phase) +{ + return (phase >= PHASE_SETUPds && phase <= PHASE_SETUPss) || phase == PHASE_READs || phase == PHASE_WRITEs; +} + +bool IsPhaseWithWorld(Phase phase) +{ + if (phase == PHASE_SIMUL ) return true; + if (phase == PHASE_WIN ) return true; + if (phase == PHASE_LOST ) return true; + if (phase == PHASE_APPERANCE) return true; + if (phase == PHASE_LOADING ) return true; + if (IsInSimulationConfigPhase(phase)) return true; + return false; +} + //! Changes phase void CRobotMain::ChangePhase(Phase phase) { + if (!IsPhaseWithWorld(m_phase) || IsInSimulationConfigPhase(m_phase) || IsInSimulationConfigPhase(phase)) + { + m_phase = phase; + m_dialog->ChangePhase(m_phase); + return; + } + GetLogger()->Info("Resseting world on scene change...\n"); + m_missionTimerEnabled = m_missionTimerStarted = false; m_missionTimer = 0.0f; @@ -435,6 +459,7 @@ void CRobotMain::ChangePhase(Phase phase) m_editLock = false; m_freePhoto = false; m_resetCreate = false; + m_infoObject = nullptr; ChangePause(PAUSE_NONE); FlushDisplayInfo(); @@ -1501,20 +1526,39 @@ void CRobotMain::SetDisplayInfoPosition(int index, int pos) //! Beginning of a dialogue during the game void CRobotMain::StartSuspend() { + m_sound->MuteAll(true); + ClearInterface(); + m_suspendInitPause = m_pause->GetPauseType(); + m_pause->SetPause(PAUSE_DIALOG); + m_engine->SetOverFront(false); // over flat behind + CreateShortcuts(); + m_map->ShowMap(false); m_infoObject = DeselectAll(); // removes the control buttons m_displayText->HideText(true); + m_suspendInitCamera = m_camera->GetType(); + m_camera->SetType(Gfx::CAM_TYPE_DIALOG); + m_suspend = true; } //! End of dialogue during the game void CRobotMain::StopSuspend() { - SelectObject(m_infoObject, false); // gives the command buttons + m_sound->MuteAll(false); + ClearInterface(); + m_pause->SetPause(m_suspendInitPause); + m_engine->SetOverFront(true); // over flat front + CreateShortcuts(); + + if(m_infoObject != nullptr) + SelectObject(m_infoObject, false); // gives the command buttons m_map->ShowMap(m_mapShow); m_displayText->HideText(false); + m_camera->SetType(m_suspendInitCamera); + m_suspend = false; } diff --git a/src/object/robotmain.h b/src/object/robotmain.h index 76af54c5..9e752615 100644 --- a/src/object/robotmain.h +++ b/src/object/robotmain.h @@ -29,6 +29,7 @@ #include "common/global.h" #include "common/singleton.h" +#include "graphics/engine/camera.h" #include "graphics/engine/particle.h" #include "object/drive_type.h" @@ -61,14 +62,15 @@ enum Phase PHASE_SETUPps, PHASE_SETUPcs, PHASE_SETUPss, - PHASE_WRITE, - PHASE_READ, PHASE_WRITEs, + PHASE_READ, PHASE_READs, PHASE_WIN, PHASE_LOST, PHASE_QUIT_SCREEN, }; +bool IsInSimulationConfigPhase(Phase phase); +bool IsPhaseWithWorld(Phase phase); class CController; @@ -492,13 +494,16 @@ protected: bool m_editFull; // edition in full screen? bool m_hilite; bool m_trainerPilot; // remote trainer? - bool m_suspend; bool m_friendAim; bool m_resetCreate; bool m_mapShow; bool m_mapImage; char m_mapFilename[100]; + bool m_suspend; + PauseType m_suspendInitPause; + Gfx::CameraType m_suspendInitCamera; + Math::Point m_tooltipPos; std::string m_tooltipName; float m_tooltipTime; diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp index 2822771d..5061250e 100644 --- a/src/ui/maindialog.cpp +++ b/src/ui/maindialog.cpp @@ -47,6 +47,18 @@ #include "sound/sound.h" +#include "ui/screen/screen.h" +#include "ui/screen/screen_apperance.h" +#include "ui/screen/screen_io_read.h" +#include "ui/screen/screen_io_write.h" +#include "ui/screen/screen_level_list.h" +#include "ui/screen/screen_loading.h" +#include "ui/screen/screen_main_menu.h" +#include "ui/screen/screen_player_select.h" +#include "ui/screen/screen_setup.h" +#include "ui/screen/screen_quit.h" +#include "ui/screen/screen_welcome.h" + #include "ui/button.h" #include "ui/check.h" #include "ui/color.h" @@ -74,46 +86,7 @@ namespace Ui { -const int KEY_VISIBLE = 6; // number of visible keys redefinable - -const float WELCOME_LENGTH = 3.0f; - -static int perso_color[3*10*3] = -{ - // hair: - 193, 221, 226, // white - 255, 255, 181, // yellow - 204, 155, 84, // blond - 165, 48, 10, // red - 140, 75, 84, // brown - 83, 64, 51, // brown - 90, 95, 85, // black - 85, 48, 9, // brown - 60, 0, 23, // black - 0, 0, 0, // - // spacesuit: - 203, 206, 204, // dirty white - 0, 205, 203, // bluish - 108, 176, 0, // greenish - 207, 207, 32, // yellow - 170, 141, 0, // orange - 108, 84, 0, // brown - 0, 84, 136, // bluish - 56, 61, 146, // bluish - 56, 56, 56, // black - 0, 0, 0, // - // strips: - 255, 255, 255, // white - 255, 255, 0, // yellow - 255, 132, 1, // orange - 255, 0, 255, // magenta - 255, 0, 0, // red - 0, 255, 0, // green - 0, 255, 255, // cyan - 0, 0, 255, // blue - 70, 51, 84, // dark - 0, 0, 0, // -}; +template<> CMainDialog* CSingleton::m_instance = nullptr; // Constructor of robot application. @@ -130,19 +103,6 @@ CMainDialog::CMainDialog() m_pause = nullptr; m_phase = PHASE_PLAYER_SELECT; - m_phaseSetup = PHASE_SETUPg; - m_bSceneSoluce = false; - m_bSimulSetup = false; - - for(int i = 0; i < static_cast(LevelCategory::Max); i++) - { - m_chap[static_cast(i)] = 0; - m_sel[static_cast(i)] = 0; - } - - m_category = LevelCategory::Exercises; - m_listCategory = m_category; - m_maxList = 0; m_shotDelay = 0; @@ -155,8 +115,6 @@ CMainDialog::CMainDialog() m_partiTime[i] = 0.0f; } - m_setupFull = false; - m_bDialog = false; } @@ -172,18 +130,6 @@ void CMainDialog::Create() m_particle = m_engine->GetParticle(); m_pause = CPauseManager::GetInstancePointer(); m_settings = CSettings::GetInstancePointer(); - - std::vector modes; - m_app->GetVideoResolutionList(modes, true, true); - for (auto it = modes.begin(); it != modes.end(); ++it) - { - if (it->x == m_app->GetVideoConfig().size.x && it->y == m_app->GetVideoConfig().size.y) - { - m_setupSelMode = it - modes.begin(); - break; - } - } - m_setupFull = m_app->GetVideoConfig().fullScreen; } // Destructor of robot application. @@ -197,494 +143,64 @@ CMainDialog::~CMainDialog() void CMainDialog::ChangePhase(Phase phase) { - CWindow* pw = nullptr; - CEdit* pe; - CEditValue* pv; - CLabel* pl; - CList* pli; - CCheck* pc; - CScroll* ps; - CSlider* psl; - CEnumSlider* pes; - CButton* pb; - CColor* pco; - CGroup* pg; - CImage* pi; - Math::Point pos, dim, ddim; - float ox, oy, sx, sy; - std::string name; - int res, i, j; - m_camera->SetType(Gfx::CAM_TYPE_DIALOG); m_engine->SetOverFront(false); m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::ENG_RSTATE_TCOLOR_BLACK); // TODO: color ok? m_phase = phase; // copy the info to CRobotMain - m_phaseTime = 0.0f; - dim.x = 32.0f/640.0f; - dim.y = 32.0f/480.0f; - ox = 3.0f/640.0f; - oy = 3.0f/480.0f; - sx = (32.0f+2.0f)/640.0f; - sy = (32.0f+2.0f)/480.0f; - - if ( m_phase == PHASE_MAIN_MENU ) + m_screen.reset(); + if (m_phase == PHASE_QUIT_SCREEN) { - pos.x = 0.35f; - pos.y = 0.10f; - ddim.x = 0.30f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 10, EVENT_WINDOW5); - - GetResource(RES_TEXT, RT_TITLE_INIT, name); - pw->SetName(name); - - pos.x = 0.35f; - pos.y = 0.60f; - ddim.x = 0.30f; - ddim.y = 0.30f; - pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner - pos.x = 0.35f; - pos.y = 0.10f; - ddim.x = 0.30f; - ddim.y = 0.30f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - ddim.x = 0.20f; - ddim.y = dim.y*2.4f; - pos.x = 0.40f; - pos.y = oy+sy*9.1f; - pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // yellow - pg->SetState(STATE_SHADOW); - pos.y = oy+sy*6.8f; - pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // orange - pg->SetState(STATE_SHADOW); - pos.y = oy+sy*3.9f; - pg = pw->CreateGroup(pos, ddim, 25, EVENT_LABEL1); // orange - pg->SetState(STATE_SHADOW); - ddim.y = dim.y*1.2f; - pos.y = oy+sy*1.9f; - pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // red - pg->SetState(STATE_SHADOW); - - ddim.x = 0.18f; - ddim.y = dim.y*1; - pos.x = 0.41f; - - pos.y = oy+sy*10.3f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MISSION); - pb->SetState(STATE_SHADOW); - - pos.y = oy+sy*9.2f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_FREE); - pb->SetState(STATE_SHADOW); - - pos.y = oy+sy*8.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_TRAINER); - pb->SetState(STATE_SHADOW); - - pos.y = oy+sy*6.9f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_DEFI); - pb->SetState(STATE_SHADOW); - - pos.y = oy+sy*5.1f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUP); - pb->SetState(STATE_SHADOW); - - pos.y = oy+sy*4.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NAME); - pb->SetState(STATE_SHADOW); - - pos.y = oy+sy*2.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_QUIT); - pb->SetState(STATE_SHADOW); - - pos.x = 447.0f/640.0f; - pos.y = 313.0f/480.0f; - ddim.x = 0.09f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_USER); - pb->SetState(STATE_SHADOW); - - try - { - CLevelParser levelParser("levels/custom/config.txt"); - if (levelParser.Exists()) - { - levelParser.Load(); - CLevelParserLine* line = levelParser.Get("Button"); - if (line->GetParam("name")->IsDefined()) - pb->SetName(line->GetParam("name")->AsString()); - if (line->GetParam("tooltip")->IsDefined()) - pb->SetTooltip(line->GetParam("tooltip")->AsString()); - } - } - catch (CLevelParserException& e) - { - GetLogger()->Error("Failed loading userlevel button name: %s\n", e.what()); - } - - /*pos.x = 139.0f/640.0f; - pos.y = 313.0f/480.0f; - ddim.x = 0.09f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PROTO); - pb->SetState(STATE_SHADOW);*/ - - pos.x = 0.40f; - ddim.x = 0.20f; - pos.y = 26.0f/480.0f; - ddim.y = 12.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 1, EVENT_LABEL1); - pg->SetState(STATE_SHADOW); - pos.y -= 5.0f/480.0f; - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, "TerranovaTeam"); - pl->SetFontType(Gfx::FONT_COURIER); - pl->SetFontSize(Gfx::FONT_SIZE_SMALL); - - m_engine->SetBackground("textures/interface/interface.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true); - m_engine->SetBackForce(true); + m_screen = MakeUnique(); + } + if (m_phase >= PHASE_WELCOME1 && m_phase <= PHASE_WELCOME3) + { + m_screen = MakeUnique(m_phase-PHASE_WELCOME1); + } + if (m_phase == PHASE_PLAYER_SELECT) + { + m_screen = MakeUnique(); + } + if (m_phase == PHASE_APPERANCE) + { + m_screen = MakeUnique(); + } + if (m_phase == PHASE_MAIN_MENU) + { + m_screen = MakeUnique(); + } + if (m_phase == PHASE_LEVEL_LIST) + { + m_screen = MakeUnique(m_main->GetLevelCategory()); + } + if (m_phase == PHASE_LOADING) + { + m_screen = MakeUnique(); + } + if (m_phase >= PHASE_SETUPd && m_phase <= PHASE_SETUPs) + { + m_screen = MakeUnique(m_phase, false); + } + if (m_phase >= PHASE_SETUPds && m_phase <= PHASE_SETUPss) + { + m_screen = MakeUnique(static_cast(m_phase-PHASE_SETUPds+PHASE_SETUPd), true); + } + if (m_phase == PHASE_WRITEs) + { + m_screen = MakeUnique(); + } + if (m_phase == PHASE_READ || m_phase == PHASE_READs) + { + m_screen = MakeUnique(m_phase == PHASE_READs); } - if ( m_phase == PHASE_PLAYER_SELECT ) + if (m_screen.get() != nullptr) { - pos.x = 0.10f; - pos.y = 0.10f; - ddim.x = 0.80f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); - GetResource(RES_TEXT, RT_TITLE_NAME, name); - pw->SetName(name); - - pos.x = 0.10f; - pos.y = 0.40f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner - pos.x = 0.40f; - pos.y = 0.10f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - pos.x = 60.0f/640.0f; - pos.y = 313.0f/480.0f; - ddim.x = 120.0f/640.0f; - ddim.y = 32.0f/480.0f; - GetResource(RES_EVENT, EVENT_INTERFACE_NLABEL, name); - pl = pw->CreateLabel(pos, ddim, -1, EVENT_INTERFACE_NLABEL, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_RIGHT); - - pos.x = 200.0f/640.0f; - pos.y = 320.0f/480.0f; - ddim.x = 160.0f/640.0f; - ddim.y = 32.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 7, EVENT_LABEL1); - pg->SetState(STATE_SHADOW); - - pos.x = 207.0f/640.0f; - pos.y = 328.0f/480.0f; - ddim.x = 144.0f/640.0f; - ddim.y = 18.0f/480.0f; - pe = pw->CreateEdit(pos, ddim, 0, EVENT_INTERFACE_NEDIT); - pe->SetMaxChar(15); - if(m_main->GetPlayerProfile() != nullptr) - { - name = m_main->GetPlayerProfile()->GetName(); - } - else - { - name = CPlayerProfile::GetLastName(); - } - pe->SetText(name.c_str()); - pe->SetCursor(name.length(), 0); - m_interface->SetFocus(pe); - - pos.x = 380.0f/640.0f; - pos.y = 320.0f/480.0f; - ddim.x =100.0f/640.0f; - ddim.y = 32.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NOK); - pb->SetState(STATE_SHADOW); - - pos.x = 380.0f/640.0f; - pos.y = 250.0f/480.0f; - ddim.x =100.0f/640.0f; - ddim.y = 52.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PERSO); - pb->SetState(STATE_SHADOW); - - pos.x = 200.0f/640.0f; - pos.y = 150.0f/480.0f; - ddim.x = 160.0f/640.0f; - ddim.y = 160.0f/480.0f; - pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_NLIST); - pli->SetState(STATE_SHADOW); - - pos.x = 200.0f/640.0f; - pos.y = 100.0f/480.0f; - ddim.x = 160.0f/640.0f; - ddim.y = 32.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NDELETE); - pb->SetState(STATE_SHADOW); - - pos.x = 380.0f/640.0f; - pos.y = 100.0f/480.0f; - ddim.x =100.0f/640.0f; - ddim.y = 32.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NCANCEL); - pb->SetState(STATE_SHADOW); - - ReadNameList(); - UpdateNameList(); - UpdateNameControl(); - - m_engine->SetBackground("textures/interface/interface.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true); - m_engine->SetBackForce(true); + m_screen->CreateInterface(); } - if ( m_phase == PHASE_APPERANCE ) - { - pos.x = 0.10f; - pos.y = 0.10f; - ddim.x = 0.80f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); - GetResource(RES_TEXT, RT_TITLE_PERSO, name); - pw->SetName(name); - - pos.x = 0.10f; - pos.y = 0.40f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner - pos.x = 0.40f; - pos.y = 0.10f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - pos.x = 95.0f/640.0f; - pos.y = 108.0f/480.0f; - ddim.x = 220.0f/640.0f; - ddim.y = 274.0f/480.0f; - pw->CreateGroup(pos, ddim, 17, EVENT_NULL); // frame - - pos.x = 100.0f/640.0f; - pos.y = 364.0f/480.0f; - ddim.x = 210.0f/640.0f; - ddim.y = 14.0f/480.0f; - pw->CreateGroup(pos, ddim, 3, EVENT_NULL); // transparent -> gray - - pos.x = 120.0f/640.0f; - pos.y = 364.0f/480.0f; - ddim.x = 80.0f/640.0f; - ddim.y = 28.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PHEAD); - pb->SetState(STATE_SHADOW); - pb->SetState(STATE_CARD); - - pos.x = 210.0f/640.0f; - pos.y = 364.0f/480.0f; - ddim.x = 80.0f/640.0f; - ddim.y = 28.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PBODY); - pb->SetState(STATE_SHADOW); - pb->SetState(STATE_CARD); - - pos.x = 100.0f/640.0f; - pos.y = 354.0f/480.0f; - ddim.x = 210.0f/640.0f; - ddim.y = 10.0f/480.0f; - pw->CreateGroup(pos, ddim, 1, EVENT_INTERFACE_GLINTb); // orange bar - pos.x = 100.0f/640.0f; - pos.y = 154.0f/480.0f; - ddim.x = 210.0f/640.0f; - ddim.y = 200.0f/480.0f; - pw->CreateGroup(pos, ddim, 2, EVENT_INTERFACE_GLINTu); // orange -> transparent - - // Face - pos.x = 340.0f/640.0f; - pos.y = 356.0f/480.0f; - ddim.x = 200.0f/640.0f; - ddim.y = 16.0f/480.0f; - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, ""); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = 340.0f/640.0f; - pos.y = 312.0f/480.0f; - ddim.x = 44.0f/640.0f; - ddim.y = 44.0f/480.0f; - pb = pw->CreateButton(pos, ddim, 43, EVENT_INTERFACE_PFACE1); - pb->SetState(STATE_SHADOW); - pos.x += 50.0f/640.0f; - pb = pw->CreateButton(pos, ddim, 46, EVENT_INTERFACE_PFACE4); - pb->SetState(STATE_SHADOW); - pos.x += 50.0f/640.0f; - pb = pw->CreateButton(pos, ddim, 45, EVENT_INTERFACE_PFACE3); - pb->SetState(STATE_SHADOW); - pos.x += 50.0f/640.0f; - pb = pw->CreateButton(pos, ddim, 44, EVENT_INTERFACE_PFACE2); - pb->SetState(STATE_SHADOW); - - // Glasses - pos.x = 340.0f/640.0f; - pos.y = 270.0f/480.0f; - ddim.x = 200.0f/640.0f; - ddim.y = 16.0f/480.0f; - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, ""); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = 340.0f/640.0f; - pos.y = 240.0f/480.0f; - ddim.x = 30.0f/640.0f; - ddim.y = 30.0f/480.0f; - for ( i=0 ; i<6 ; i++ ) - { - int ti[6] = {11, 179, 180, 181, 182, 183}; - pb = pw->CreateButton(pos, ddim, ti[i], static_cast(EVENT_INTERFACE_PGLASS0+i)); - pb->SetState(STATE_SHADOW); - pos.x += (30.0f+2.8f)/640.0f; - } - - // Color A - pos.x = 340.0f/640.0f; - pos.y = 300.0f/480.0f; - ddim.x = 200.0f/640.0f; - ddim.y = 16.0f/480.0f; - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL14, ""); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.y = 282.0f/480.0f; - ddim.x = 18.0f/640.0f; - ddim.y = 18.0f/480.0f; - for ( j=0 ; j<3 ; j++ ) - { - pos.x = 340.0f/640.0f; - for ( i=0 ; i<3 ; i++ ) - { - pco = pw->CreateColor(pos, ddim, -1, static_cast(EVENT_INTERFACE_PC0a+j*3+i)); - pco->SetState(STATE_SHADOW); - pos.x += 20.0f/640.0f; - } - pos.y -= 20.0f/480.0f; - } - - pos.x = 420.0f/640.0f; - pos.y = 282.0f/480.0f; - ddim.x = 100.0f/640.0f; - ddim.y = 18.0f/480.0f; - for ( i=0 ; i<3 ; i++ ) - { - psl = pw->CreateSlider(pos, ddim, 0, static_cast(EVENT_INTERFACE_PCRa+i)); - psl->SetState(STATE_SHADOW); - psl->SetLimit(0.0f, 255.0f); - psl->SetArrowStep(16.0f); - pos.y -= 20.0f/480.0f; - } - - // Color B - pos.x = 340.0f/640.0f; - pos.y = 192.0f/480.0f; - ddim.x = 200.0f/640.0f; - ddim.y = 16.0f/480.0f; - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL13, ""); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.y = 174.0f/480.0f; - ddim.x = 18.0f/640.0f; - ddim.y = 18.0f/480.0f; - for ( j=0 ; j<3 ; j++ ) - { - pos.x = 340.0f/640.0f; - for ( i=0 ; i<3 ; i++ ) - { - pco = pw->CreateColor(pos, ddim, -1, static_cast(EVENT_INTERFACE_PC0b+j*3+i)); - pco->SetState(STATE_SHADOW); - pos.x += 20.0f/640.0f; - } - pos.y -= 20.0f/480.0f; - } - - pos.x = 420.0f/640.0f; - pos.y = 174.0f/480.0f; - ddim.x = 100.0f/640.0f; - ddim.y = 18.0f/480.0f; - for ( i=0 ; i<3 ; i++ ) - { - psl = pw->CreateSlider(pos, ddim, 0, static_cast(EVENT_INTERFACE_PCRb+i)); - psl->SetState(STATE_SHADOW); - psl->SetLimit(0.0f, 255.0f); - psl->SetArrowStep(16.0f); - pos.y -= 20.0f/480.0f; - } - - // Rotation - pos.x = 100.0f/640.0f; - pos.y = 113.0f/480.0f; - ddim.x = 20.0f/640.0f; - ddim.y = 20.0f/480.0f; - pb = pw->CreateButton(pos, ddim, 55, EVENT_INTERFACE_PLROT); // < - pb->SetState(STATE_SHADOW); - pb->SetRepeat(true); - - pos.x = 290.0f/640.0f; - pos.y = 113.0f/480.0f; - ddim.x = 20.0f/640.0f; - ddim.y = 20.0f/480.0f; - pb = pw->CreateButton(pos, ddim, 48, EVENT_INTERFACE_PRROT); // > - pb->SetState(STATE_SHADOW); - pb->SetRepeat(true); - - pos.x = 100.0f/640.0f; - pos.y = 70.0f/480.0f; - ddim.x = 100.0f/640.0f; - ddim.y = 32.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_POK); - pb->SetState(STATE_SHADOW); - - pos.x = 210.0f/640.0f; - pos.y = 70.0f/480.0f; - ddim.x =100.0f/640.0f; - ddim.y = 32.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PCANCEL); - pb->SetState(STATE_SHADOW); - - pos.x = 340.0f/640.0f; - pos.y = 70.0f/480.0f; - ddim.x =194.0f/640.0f; - ddim.y = 32.0f/480.0f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PDEF); - pb->SetState(STATE_SHADOW); - - m_apperanceTab = 0; - m_apperanceAngle = -0.6f; - m_main->GetPlayerProfile()->LoadApperance(); - UpdatePerso(); - m_main->ScenePerso(); - CameraPerso(); - } - - if ( m_phase != PHASE_SIMUL && - m_phase != PHASE_WIN && - m_phase != PHASE_LOST && - m_phase != PHASE_WRITE && - m_phase != PHASE_READs && - m_phase != PHASE_WRITEs && - m_phase != PHASE_SETUPds && - m_phase != PHASE_SETUPgs && - m_phase != PHASE_SETUPps && - m_phase != PHASE_SETUPcs && - m_phase != PHASE_SETUPss ) + if ( !IsPhaseWithWorld(m_phase) ) { if (!m_sound->IsPlayingMusic() && m_sound->IsCachedMusic("Intro1.ogg")) { @@ -692,1098 +208,6 @@ void CMainDialog::ChangePhase(Phase phase) } } - if ( m_phase == PHASE_LEVEL_LIST ) - { - m_category = m_main->GetLevelCategory(); - if ( static_cast(m_category) >= static_cast(LevelCategory::Max) ) - { - m_category = m_listCategory; - } - else - { - m_listCategory = m_category; - } - - if ( m_category == LevelCategory::FreeGame ) - { - m_accessChap = m_main->GetPlayerProfile()->GetChapPassed(LevelCategory::Missions); - } - - pos.x = 0.10f; - pos.y = 0.10f; - ddim.x = 0.80f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); - pw->SetClosable(true); - if ( m_category == LevelCategory::Exercises ) res = RT_TITLE_TRAINER; - if ( m_category == LevelCategory::Challenges ) res = RT_TITLE_DEFI; - if ( m_category == LevelCategory::Missions ) res = RT_TITLE_MISSION; - if ( m_category == LevelCategory::FreeGame ) res = RT_TITLE_FREE; - if ( m_category == LevelCategory::CustomLevels ) res = RT_TITLE_USER; - GetResource(RES_TEXT, res, name); - pw->SetName(name); - - pos.x = 0.10f; - pos.y = 0.40f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner - pos.x = 0.40f; - pos.y = 0.10f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - // Displays a list of chapters: - pos.x = ox+sx*3; - pos.y = oy+sy*10.5f; - ddim.x = dim.x*7.5f; - ddim.y = dim.y*0.6f; - if ( m_category == LevelCategory::Exercises ) res = RT_PLAY_CHAPt; - if ( m_category == LevelCategory::Challenges ) res = RT_PLAY_CHAPd; - if ( m_category == LevelCategory::Missions ) res = RT_PLAY_CHAPm; - if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_CHAPf; - if ( m_category == LevelCategory::CustomLevels ) res = RT_PLAY_CHAPu; - GetResource(RES_TEXT, res, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.y = oy+sy*6.7f; - ddim.y = dim.y*4.5f; - ddim.x = dim.x*6.5f; - pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_CHAP); - pli->SetState(STATE_SHADOW); - m_chap[m_category] = m_main->GetPlayerProfile()->GetSelectedChap(m_category)-1; - UpdateSceneChap(m_chap[m_category]); - if ( m_category != LevelCategory::CustomLevels ) pli->SetState(STATE_EXTEND); - - // Displays a list of missions: - pos.x = ox+sx*9.5f; - pos.y = oy+sy*10.5f; - ddim.x = dim.x*7.5f; - ddim.y = dim.y*0.6f; - if ( m_category == LevelCategory::Exercises ) res = RT_PLAY_LISTt; - if ( m_category == LevelCategory::Challenges ) res = RT_PLAY_LISTd; - if ( m_category == LevelCategory::Missions ) res = RT_PLAY_LISTm; - if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_LISTf; - if ( m_category == LevelCategory::CustomLevels ) res = RT_PLAY_LISTu; - GetResource(RES_TEXT, res, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.y = oy+sy*6.7f; - ddim.y = dim.y*4.5f; - ddim.x = dim.x*6.5f; - pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_LIST); - pli->SetState(STATE_SHADOW); - m_sel[m_category] = m_main->GetPlayerProfile()->GetSelectedRank(m_category)-1; - UpdateSceneList(m_chap[m_category], m_sel[m_category]); - if ( m_category != LevelCategory::CustomLevels ) pli->SetState(STATE_EXTEND); - pos = pli->GetPos(); - ddim = pli->GetDim(); - - // Displays the summary: - pos.x = ox+sx*3; - pos.y = oy+sy*5.4f; - ddim.x = dim.x*6.5f; - ddim.y = dim.y*0.6f; - GetResource(RES_TEXT, RT_PLAY_RESUME, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL13, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*3; - pos.y = oy+sy*3.6f; - ddim.x = dim.x*13.4f; - ddim.y = dim.y*1.9f; - pe = pw->CreateEdit(pos, ddim, 0, EVENT_INTERFACE_RESUME); - pe->SetState(STATE_SHADOW); - pe->SetMaxChar(500); - pe->SetEditCap(false); // just to see - pe->SetHighlightCap(false); - - // Button displays the "soluce": - if ( m_category != LevelCategory::Exercises && - m_category != LevelCategory::FreeGame ) - { - pos.x = ox+sx*9.5f; - pos.y = oy+sy*5.8f; - ddim.x = dim.x*6.5f; - ddim.y = dim.y*0.5f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SOLUCE); - pc->SetState(STATE_SHADOW); - pc->ClearState(STATE_CHECK); - } - m_bSceneSoluce = false; - - UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1); - - if ( m_category == LevelCategory::Missions || - m_category == LevelCategory::FreeGame || - m_category == LevelCategory::CustomLevels ) - { - pos.x = ox+sx*9.5f; - pos.y = oy+sy*2; - ddim.x = dim.x*3.7f; - ddim.y = dim.y*1; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PLAY); - pb->SetState(STATE_SHADOW); - if ( m_maxList == 0 ) - { - pb->ClearState(STATE_ENABLE); - } - - pos.x += dim.x*4.0f; - ddim.x = dim.x*2.5f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_READ); - pb->SetState(STATE_SHADOW); - if ( !m_main->GetPlayerProfile()->HasAnySavedScene() ) // no file to read? - { - pb->ClearState(STATE_ENABLE); - } - } - else - { - pos.x = ox+sx*9.5f; - pos.y = oy+sy*2; - ddim.x = dim.x*6.5f; - ddim.y = dim.y*1; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PLAY); - pb->SetState(STATE_SHADOW); - if ( m_maxList == 0 ) - { - pb->ClearState(STATE_ENABLE); - } - } - - pos.x = ox+sx*3; - ddim.x = dim.x*4; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); - pb->SetState(STATE_SHADOW); - - m_engine->SetBackground("textures/interface/interface.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true); - m_engine->SetBackForce(true); - } - - if ( m_phase == PHASE_SETUPd || - m_phase == PHASE_SETUPg || - m_phase == PHASE_SETUPp || - m_phase == PHASE_SETUPc || - m_phase == PHASE_SETUPs || - m_phase == PHASE_SETUPds || - m_phase == PHASE_SETUPgs || - m_phase == PHASE_SETUPps || - m_phase == PHASE_SETUPcs || - m_phase == PHASE_SETUPss ) - { - if ( m_phase == PHASE_SETUPds ) - { - m_phaseSetup = PHASE_SETUPd; - m_bSimulSetup = true; - } - else if ( m_phase == PHASE_SETUPgs ) - { - m_phaseSetup = PHASE_SETUPg; - m_bSimulSetup = true; - } - else if ( m_phase == PHASE_SETUPps ) - { - m_phaseSetup = PHASE_SETUPp; - m_bSimulSetup = true; - } - else if ( m_phase == PHASE_SETUPcs ) - { - m_phaseSetup = PHASE_SETUPc; - m_bSimulSetup = true; - } - else if ( m_phase == PHASE_SETUPss ) - { - m_phaseSetup = PHASE_SETUPs; - m_bSimulSetup = true; - } - else - { - m_phaseSetup = m_phase; - m_bSimulSetup = false; - } - - pos.x = 0.10f; - pos.y = 0.10f; - ddim.x = 0.80f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); - pw->SetClosable(true); - GetResource(RES_TEXT, RT_TITLE_SETUP, name); - pw->SetName(name); - - pos.x = 0.70f; - pos.y = 0.10f; - ddim.x = 0.20f; - ddim.y = 0.20f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - pos.x = 0.10f; - ddim.x = 0.80f; - pos.y = 0.76f; - ddim.y = 0.05f; - pw->CreateGroup(pos, ddim, 3, EVENT_NULL); // transparent -> gray - - ddim.x = 0.78f/5-0.01f; - ddim.y = 0.06f; - pos.x = 0.115f; - pos.y = 0.76f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPd); - pb->SetState(STATE_SHADOW); - pb->SetState(STATE_CARD); - pb->SetState(STATE_CHECK, (m_phase == PHASE_SETUPd || m_phase == PHASE_SETUPds)); - #if PLATFORM_WINDOWS - pb->SetState(STATE_ENABLE, !m_bSimulSetup); - #endif - - pos.x += ddim.x+0.01f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPg); - pb->SetState(STATE_SHADOW); - pb->SetState(STATE_CARD); - pb->SetState(STATE_CHECK, (m_phase == PHASE_SETUPg || m_phase == PHASE_SETUPgs)); - - pos.x += ddim.x+0.01f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPp); - pb->SetState(STATE_SHADOW); - pb->SetState(STATE_CARD); - pb->SetState(STATE_CHECK, (m_phase == PHASE_SETUPp || m_phase == PHASE_SETUPps)); - - pos.x += ddim.x+0.01f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPc); - pb->SetState(STATE_SHADOW); - pb->SetState(STATE_CARD); - pb->SetState(STATE_CHECK, (m_phase == PHASE_SETUPc || m_phase == PHASE_SETUPcs)); - - pos.x += ddim.x+0.01f; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPs); - pb->SetState(STATE_SHADOW); - pb->SetState(STATE_CARD); - pb->SetState(STATE_CHECK, (m_phase == PHASE_SETUPs || m_phase == PHASE_SETUPss)); - - pos.x = 0.10f; - ddim.x = 0.80f; - pos.y = 0.34f; - ddim.y = 0.42f; - pw->CreateGroup(pos, ddim, 2, EVENT_INTERFACE_GLINTu); // orange -> transparent - pos.x = 0.10f+(6.0f/640.0f); - ddim.x = 0.80f-(11.0f/640.0f); - pos.y = 0.74f; - ddim.y = 0.02f; - pw->CreateGroup(pos, ddim, 1, EVENT_INTERFACE_GLINTb); // orange bar - - ddim.x = dim.x*4; - ddim.y = dim.y*1; - pos.x = ox+sx*3; - pos.y = oy+sy*2; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); - pb->SetState(STATE_SHADOW); - - if ( !m_bSimulSetup ) - { - m_engine->SetBackground("textures/interface/interface.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true); - m_engine->SetBackForce(true); - } - } - - if ( m_phase == PHASE_SETUPd || // setup/display ? - m_phase == PHASE_SETUPds ) - { - pos.x = ox+sx*3; - pos.y = oy+sy*9; - ddim.x = dim.x*6; - ddim.y = dim.y*1; - GetResource(RES_TEXT, RT_SETUP_MODE, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - m_setupFull = m_app->GetVideoConfig().fullScreen; - pos.x = ox+sx*3; - pos.y = oy+sy*5.2f; - ddim.x = dim.x*6; - ddim.y = dim.y*4.5f; - pli = pw->CreateList(pos, ddim, 0, EVENT_LIST2); - pli->SetState(STATE_SHADOW); - UpdateDisplayMode(); - - ddim.x = dim.x*4; - ddim.y = dim.y*0.5f; - pos.x = ox+sx*3; - pos.y = oy+sy*4.1f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_FULL); - pc->SetState(STATE_SHADOW); - pc->SetState(STATE_CHECK, m_setupFull); - - #if !PLATFORM_LINUX - ddim.x = 0.9f; - ddim.y = 0.1f; - pos.x = 0.05f; - pos.y = 0.20f; - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, "The game will be restarted in order to apply changes. All unsaved progress will be lost."); - #endif - - ddim.x = dim.x*6; - ddim.y = dim.y*1; - pos.x = ox+sx*10; - pos.y = oy+sy*2; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_APPLY); - pb->SetState(STATE_SHADOW); - UpdateApply(); - } - - if ( m_phase == PHASE_SETUPg || // setup/graphic ? - m_phase == PHASE_SETUPgs ) - { - ddim.x = dim.x*6; - ddim.y = dim.y*0.5f; - pos.x = ox+sx*3; - pos.y = 0.65f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SHADOW); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_GROUND); - pc->SetState(STATE_SHADOW); - if ( m_bSimulSetup ) - { - pc->SetState(STATE_DEAD); - } - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_DIRTY); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SKY); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_LENS); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_PLANET); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_FOG); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_LIGHT); - pc->SetState(STATE_SHADOW); - if ( m_bSimulSetup ) - { - pc->SetState(STATE_DEAD); - } - - pos.x = ox+sx*3; - pos.y = 0.245f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_MSAA); - pes->SetState(STATE_SHADOW); - std::vector msaaOptions; - for(int i = 1; i <= m_engine->GetDevice()->GetMaxSamples(); i *= 2) - msaaOptions.push_back(i); - pes->SetPossibleValues(msaaOptions); - if(m_engine->GetDevice()->GetMaxSamples() < 2) - pes->ClearState(STATE_ENABLE); - pos.y += ddim.y/2; - pos.x += 0.005f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_MSAA, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*8.5f; - pos.y = 0.65f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_PARTI); - pv->SetState(STATE_SHADOW); - pv->SetMinValue(0.0f); - pv->SetMaxValue(2.0f); - pos.x += 0.13f; - pos.y -= 0.015f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_PARTI, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL10, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*8.5f; - pos.y = 0.59f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_CLIP); - pv->SetState(STATE_SHADOW); - pv->SetMinValue(0.5f); - pv->SetMaxValue(2.0f); - pos.x += 0.13f; - pos.y -= 0.015f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_CLIP, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*8.5f; - pos.y = 0.53f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_DETAIL); - pv->SetState(STATE_SHADOW); - pv->SetMinValue(0.0f); - pv->SetMaxValue(2.0f); - pos.x += 0.13f; - pos.y -= 0.015f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_DETAIL, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*8.5f; - pos.y = 0.47f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_GADGET); - pv->SetState(STATE_SHADOW); - if ( m_bSimulSetup ) - { - pv->SetState(STATE_DEAD); - } - pv->SetMinValue(0.0f); - pv->SetMaxValue(1.0f); - pos.x += 0.13f; - pos.y -= 0.015f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_GADGET, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL13, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*8.5f; - pos.y = 0.385f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_TEXTURE_FILTER); - pes->SetState(STATE_SHADOW); - pes->SetPossibleValues({ - { Gfx::TEX_FILTER_NEAREST, "Nearest" }, - { Gfx::TEX_FILTER_BILINEAR, "Bilinear" }, - { Gfx::TEX_FILTER_TRILINEAR, "Trilinear" } - }); - pos.y += ddim.y/2; - pos.x += 0.005f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_TEXTURE_FILTER, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*8.5f; - pos.y = 0.315f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_TEXTURE_MIPMAP); - pes->SetState(STATE_SHADOW); - pes->SetPossibleValues({1, 4, 8, 16}); - pos.y += ddim.y/2; - pos.x += 0.005f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_TEXTURE_MIPMAP, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*8.5f; - pos.y = 0.245f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_TEXTURE_ANISOTROPY); - pes->SetState(STATE_SHADOW); - std::vector anisotropyOptions; - for(int i = 1; i <= m_engine->GetDevice()->GetMaxAnisotropyLevel(); i *= 2) - anisotropyOptions.push_back(i); - pes->SetPossibleValues(anisotropyOptions); - if(!m_engine->GetDevice()->IsAnisotropySupported()) - pes->ClearState(STATE_ENABLE); - pos.y += ddim.y/2; - pos.x += 0.005f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_TEXTURE_ANISOTROPY, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - - pos.x = ox+sx*12.5; - pos.y = 0.385f; - ddim.x = dim.x*2.2f; - ddim.y = 18.0f/480.0f; - pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_SHADOW_MAPPING); - pes->SetState(STATE_SHADOW); - std::map shadowOptions = { - { -1, "Disabled" }, - }; - if (m_engine->GetDevice()->IsFramebufferSupported()) - { - for(int i = 128; i <= m_engine->GetDevice()->GetMaxTextureSize(); i *= 2) - shadowOptions[i] = StrUtils::ToString(i)+"x"+StrUtils::ToString(i); - } - else - { - shadowOptions[0] = "Screen buffer"; // TODO: Is this the proper name for this? - } - pes->SetPossibleValues(shadowOptions); - if (!m_engine->GetDevice()->IsShadowMappingSupported()) - { - pes->ClearState(STATE_ENABLE); - } - pos.y += ddim.y/2; - pos.x += 0.005f; - ddim.x = 0.40f; - GetResource(RES_EVENT, EVENT_INTERFACE_SHADOW_MAPPING, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*12.5; - pos.y = 0.315f; - ddim.x = dim.x*6; - ddim.y = dim.y*0.5f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SHADOW_MAPPING_QUALITY); - pc->SetState(STATE_SHADOW); - - ddim.x = dim.x*2; - ddim.y = dim.y*1; - pos.x = ox+sx*10; - pos.y = oy+sy*2; - - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MIN); - pb->SetState(STATE_SHADOW); - pos.x += ddim.x; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NORM); - pb->SetState(STATE_SHADOW); - pos.x += ddim.x; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MAX); - pb->SetState(STATE_SHADOW); - - UpdateSetupButtons(); - } - - if ( m_phase == PHASE_SETUPp || // setup/game ? - m_phase == PHASE_SETUPps ) - { - ddim.x = dim.x*6; - ddim.y = dim.y*0.5f; - pos.x = ox+sx*3; - pos.y = 0.65f; - //? pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_TOTO); - //? pc->SetState(STATE_SHADOW); - //? pos.y -= 0.048f; - - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_MOVIES); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - //#endif - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SCROLL); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_INVERTX); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_INVERTY); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EFFECT); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_BLOOD); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_AUTOSAVE_ENABLE); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - - pos.y -= ddim.y; - ddim.x = dim.x*2.5f; - psl = pw->CreateSlider(pos, ddim, -1, EVENT_INTERFACE_AUTOSAVE_INTERVAL); - psl->SetState(STATE_SHADOW); - psl->SetLimit(1.0f, 30.0f); - psl->SetArrowStep(1.0f); - pos.y += ddim.y/2; - GetResource(RES_EVENT, EVENT_INTERFACE_AUTOSAVE_INTERVAL, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - pos.y -= ddim.y/2; - pos.x = ox+sx*3+dim.x*3.5f; - psl = pw->CreateSlider(pos, ddim, -1, EVENT_INTERFACE_AUTOSAVE_SLOTS); - psl->SetState(STATE_SHADOW); - psl->SetLimit(1.0f, 10.0f); - psl->SetArrowStep(1.0f); - pos.y += ddim.y/2; - GetResource(RES_EVENT, EVENT_INTERFACE_AUTOSAVE_SLOTS, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - pos.y -= ddim.y/2; - - - //? pos.y -= 0.048f; - //? pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_NICERST); - //? pc->SetState(STATE_SHADOW); - //? pos.y -= 0.048f; - //? pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_HIMSELF); - //? pc->SetState(STATE_SHADOW); - - ddim.x = dim.x*6; - ddim.y = dim.y*0.5f; - pos.x = ox+sx*10; - pos.y = 0.65f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_TOOLTIP); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_GLINT); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_RAIN); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_MOUSE); - pc->SetState(STATE_SHADOW); - pos.y -= 0.048f; - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EDITMODE); - pc->SetState(STATE_SHADOW); - if ( m_bSimulSetup ) - { - pc->SetState(STATE_DEAD); - } - pos.y -= 0.048f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EDITVALUE); - pc->SetState(STATE_SHADOW); - - UpdateSetupButtons(); - } - - if ( m_phase == PHASE_SETUPc || // setup/commands ? - m_phase == PHASE_SETUPcs ) - { - pos.x = ox+sx*3; - pos.y = 320.0f/480.0f; - ddim.x = dim.x*15.0f; - ddim.y = 18.0f/480.0f; - GetResource(RES_TEXT, RT_SETUP_KEY1, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_INTERFACE_KINFO1, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*3; - pos.y = 302.0f/480.0f; - ddim.x = dim.x*15.0f; - ddim.y = 18.0f/480.0f; - GetResource(RES_TEXT, RT_SETUP_KEY2, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_INTERFACE_KINFO2, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - ddim.x = 428.0f/640.0f; - ddim.y = 128.0f/480.0f; - pos.x = 105.0f/640.0f; - pos.y = 164.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 0, EVENT_INTERFACE_KGROUP); - pg->ClearState(STATE_ENABLE); - pg->SetState(STATE_DEAD); - pg->SetState(STATE_SHADOW); - - ddim.x = 18.0f/640.0f; - ddim.y = (20.0f/480.0f)*KEY_VISIBLE; - pos.x = 510.0f/640.0f; - pos.y = 168.0f/480.0f; - ps = pw->CreateScroll(pos, ddim, -1, EVENT_INTERFACE_KSCROLL); - ps->SetVisibleRatio(static_cast(KEY_VISIBLE/INPUT_SLOT_MAX)); - ps->SetArrowStep(1.0f/(static_cast(INPUT_SLOT_MAX-KEY_VISIBLE))); - UpdateKey(); - - ddim.x = dim.x*6; - ddim.y = dim.y*0.5f; - pos.x = ox+sx*3; - pos.y = 130.0f/480.0f; - pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_JOYSTICK); - pc->SetState(STATE_SHADOW); - - ddim.x = dim.x*6; - ddim.y = dim.y*1; - pos.x = ox+sx*10; - pos.y = oy+sy*2; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_KDEF); - pb->SetState(STATE_SHADOW); - - UpdateSetupButtons(); - } - - if ( m_phase == PHASE_SETUPs || // setup/sound ? - m_phase == PHASE_SETUPss ) - { - pos.x = ox+sx*3; - pos.y = 0.55f; - ddim.x = dim.x*4.0f; - ddim.y = 18.0f/480.0f; - psl = pw->CreateSlider(pos, ddim, 0, EVENT_INTERFACE_VOLSOUND); - psl->SetState(STATE_SHADOW); - psl->SetLimit(0.0f, MAXVOLUME); - psl->SetArrowStep(1.0f); - pos.y += ddim.y; - GetResource(RES_EVENT, EVENT_INTERFACE_VOLSOUND, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.x = ox+sx*3; - pos.y = 0.40f; - ddim.x = dim.x*4.0f; - ddim.y = 18.0f/480.0f; - psl = pw->CreateSlider(pos, ddim, 0, EVENT_INTERFACE_VOLMUSIC); - psl->SetState(STATE_SHADOW); - psl->SetLimit(0.0f, MAXVOLUME); - psl->SetArrowStep(1.0f); - pos.y += ddim.y; - GetResource(RES_EVENT, EVENT_INTERFACE_VOLMUSIC, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - ddim.x = dim.x*3; - ddim.y = dim.y*1; - pos.x = ox+sx*10; - pos.y = oy+sy*2; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SILENT); - pb->SetState(STATE_SHADOW); - pos.x += ddim.x; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NOISY); - pb->SetState(STATE_SHADOW); - - UpdateSetupButtons(); - } - - if ( m_phase == PHASE_WRITE || - m_phase == PHASE_WRITEs ) - { - pos.x = 0.10f; - pos.y = 0.10f; - ddim.x = 0.80f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 13, EVENT_WINDOW5); - pw->SetClosable(true); - GetResource(RES_TEXT, RT_TITLE_WRITE, name); - pw->SetName(name); - - pos.x = 0.10f; - pos.y = 0.40f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner - pos.x = 0.40f; - pos.y = 0.10f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - pos.x = 290.0f/640.0f; - ddim.x = 245.0f/640.0f; - - pos.y = 146.0f/480.0f; - ddim.y = 18.0f/480.0f; - GetResource(RES_EVENT, EVENT_INTERFACE_IOLABEL, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_INTERFACE_IOLABEL, name); - pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); - - pos.y = 130.0f/480.0f; - ddim.y = 18.0f/480.0f; - pe = pw->CreateEdit(pos, ddim, 0, EVENT_INTERFACE_IONAME); - pe->SetState(STATE_SHADOW); - pe->SetFontType(Gfx::FONT_COLOBOT); - pe->SetMaxChar(35); - IOReadName(); - - pos.y = 190.0f/480.0f; - ddim.y = 190.0f/480.0f; - pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_IOLIST); - pli->SetState(STATE_SHADOW); - - pos.y = oy+sy*2; - ddim.y = dim.y*1; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IOWRITE); - pb->SetState(STATE_SHADOW); - - pos.x = 105.0f/640.0f; - pos.y = 190.0f/480.0f; - ddim.x = 170.0f/640.0f; - ddim.y = dim.y*1; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IODELETE); - pb->SetState(STATE_SHADOW); - - pos.x = 105.0f/640.0f; - pos.y = 250.0f/480.0f; - ddim.x = 170.0f/640.0f; - ddim.y = 128.0f/480.0f; - pi = pw->CreateImage(pos, ddim, 0, EVENT_INTERFACE_IOIMAGE); - pi->SetState(STATE_SHADOW); - - ddim.x = dim.x*4; - ddim.y = dim.y*1; - pos.x = ox+sx*3; - pos.y = oy+sy*2; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); - pb->SetState(STATE_SHADOW); - - IOReadList(); - IOUpdateList(); - } - - if ( m_phase == PHASE_READ || - m_phase == PHASE_READs ) - { - pos.x = 0.10f; - pos.y = 0.10f; - ddim.x = 0.80f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 14, EVENT_WINDOW5); - pw->SetClosable(true); - GetResource(RES_TEXT, RT_TITLE_READ, name); - pw->SetName(name); - - pos.x = 0.10f; - pos.y = 0.40f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner - pos.x = 0.40f; - pos.y = 0.10f; - ddim.x = 0.50f; - ddim.y = 0.50f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - pos.x = 290.0f/640.0f; - ddim.x = 245.0f/640.0f; - - pos.y = 160.0f/480.0f; - ddim.y = 190.0f/480.0f; - pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_IOLIST); - pli->SetState(STATE_SHADOW); - - pos.y = oy+sy*2; - ddim.y = dim.y*1; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IOREAD); - pb->SetState(STATE_SHADOW); - if ( m_phase == PHASE_READs ) - { - pb->SetState(STATE_WARNING); - } - - pos.x = 105.0f/640.0f; - pos.y = 160.0f/480.0f; - ddim.x = 170.0f/640.0f; - ddim.y = dim.y*1; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IODELETE); - pb->SetState(STATE_SHADOW); - - pos.x = 105.0f/640.0f; - pos.y = 220.0f/480.0f; - ddim.x = 170.0f/640.0f; - ddim.y = 128.0f/480.0f; - pi = pw->CreateImage(pos, ddim, 0, EVENT_INTERFACE_IOIMAGE); - pi->SetState(STATE_SHADOW); - - ddim.x = dim.x*4; - ddim.y = dim.y*1; - pos.x = ox+sx*3; - pos.y = oy+sy*2; - pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); - pb->SetState(STATE_SHADOW); - - IOReadList(); - IOUpdateList(); - - if ( m_phase == PHASE_READ ) - { - m_engine->SetBackground("textures/interface/interface.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true); - m_engine->SetBackForce(true); - } - } - - if ( m_phase == PHASE_LOADING ) - { - pos.x = 0.35f; - pos.y = 0.10f; - ddim.x = 0.30f; - ddim.y = 0.80f; - pw = m_interface->CreateWindows(pos, ddim, 10, EVENT_WINDOW5); - - pw->SetName(" "); - - pos.x = 0.35f; - pos.y = 0.60f; - ddim.x = 0.30f; - ddim.y = 0.30f; - pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner - pos.x = 0.35f; - pos.y = 0.10f; - ddim.x = 0.30f; - ddim.y = 0.30f; - pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner - - pos.x = 254.0f/640.0f; - pos.y = 208.0f/480.0f; - ddim.x = 132.0f/640.0f; - ddim.y = 42.0f/480.0f; - pg = pw->CreateGroup(pos, ddim, 22, EVENT_NULL); - pg->SetState(STATE_SHADOW); - - pos.x = 220.0f/640.0f; - pos.y = 210.0f/480.0f; - ddim.x = 200.0f/640.0f; - ddim.y = 20.0f/480.0f; - GetResource(RES_TEXT, RT_DIALOG_LOADING, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); - pl->SetFontSize(12.0f); - pl->SetTextAlign(Gfx::TEXT_ALIGN_CENTER); - - m_engine->SetBackground("textures/interface/interface.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true); - m_engine->SetBackForce(true); - - m_loadingCounter = 1; // enough time to display! - } - - if ( m_phase == PHASE_WELCOME1 ) - { - pos.x = 0.0f; - pos.y = 0.0f; - ddim.x = 0.0f; - ddim.y = 0.0f; - pw = m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); - - m_engine->SetOverColor(Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f), Gfx::ENG_RSTATE_TCOLOR_BLACK); // TODO: color ok? - m_engine->SetOverFront(true); - - m_engine->SetBackground("textures/interface/intro1.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true, true); - m_engine->SetBackForce(true); - } - if ( m_phase == PHASE_WELCOME2 ) - { - pos.x = 0.0f; - pos.y = 0.0f; - ddim.x = 0.0f; - ddim.y = 0.0f; - pw = m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); - - m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::ENG_RSTATE_TCOLOR_WHITE); // TODO: color ok? - m_engine->SetOverFront(true); - - m_engine->SetBackground("textures/interface/intro2.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true, true); - m_engine->SetBackForce(true); - } - if ( m_phase == PHASE_WELCOME3 ) - { - pos.x = 0.0f; - pos.y = 0.0f; - ddim.x = 0.0f; - ddim.y = 0.0f; - pw = m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); - - m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::ENG_RSTATE_TCOLOR_WHITE); // TODO: color ok? - m_engine->SetOverFront(true); - - m_engine->SetBackground("textures/interface/intro3.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true, true); - m_engine->SetBackForce(true); - } - - if ( m_phase == PHASE_QUIT_SCREEN ) - { - pos.x = 0.0f; - pos.y = 0.0f; - ddim.x = 0.0f; - ddim.y = 0.0f; - pw = m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); - - pos.x = 80.0f/640.0f; - pos.y = 190.0f/480.0f; - ddim.x = 490.0f/640.0f; - ddim.y = 160.0f/480.0f; - pe = pw->CreateEdit(pos, ddim, 0, EVENT_EDIT1); - pe->SetGenericMode(true); - pe->SetEditCap(false); - pe->SetHighlightCap(false); - pe->SetFontType(Gfx::FONT_COURIER); - pe->SetFontSize(Gfx::FONT_SIZE_SMALL); - pe->ReadText(std::string("help/") + m_app->GetLanguageChar() + std::string("/authors.txt")); - - pos.x = 40.0f/640.0f; - pos.y = 83.0f/480.0f; - ddim.x = 246.0f/640.0f; - ddim.y = 16.0f/480.0f; - GetResource(RES_TEXT, RT_GENERIC_DEV1, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); - pl->SetFontType(Gfx::FONT_COURIER); - pl->SetFontSize(Gfx::FONT_SIZE_SMALL); - - pos.y = 13.0f/480.0f; - GetResource(RES_TEXT, RT_GENERIC_DEV2, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name); - pl->SetFontType(Gfx::FONT_COURIER); - pl->SetFontSize(Gfx::FONT_SIZE_SMALL); - - pos.x = 355.0f/640.0f; - pos.y = 83.0f/480.0f; - ddim.x = 246.0f/640.0f; - ddim.y = 16.0f/480.0f; - GetResource(RES_TEXT, RT_GENERIC_EDIT1, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL3, name); - pl->SetFontType(Gfx::FONT_COURIER); - pl->SetFontSize(Gfx::FONT_SIZE_SMALL); - - pos.y = 13.0f/480.0f; - GetResource(RES_TEXT, RT_GENERIC_EDIT2, name); - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL4, name); - pl->SetFontType(Gfx::FONT_COURIER); - pl->SetFontSize(Gfx::FONT_SIZE_SMALL); - - pos.x = 306.0f/640.0f; - pos.y = 17.0f/480.0f; - ddim.x = 30.0f/640.0f; - ddim.y = 30.0f/480.0f; - pb = pw->CreateButton(pos, ddim, 49, EVENT_INTERFACE_ABORT); - pb->SetState(STATE_SHADOW); - - m_engine->SetBackground("textures/interface/generico.png", - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), - true); - m_engine->SetBackForce(true); - } - if ( m_phase == PHASE_MAIN_MENU || m_phase == PHASE_PLAYER_SELECT || m_phase == PHASE_LEVEL_LIST || @@ -1795,13 +219,19 @@ void CMainDialog::ChangePhase(Phase phase) m_phase == PHASE_READ || m_phase == PHASE_LOADING ) { - pos.x = 540.0f/640.0f; - pos.y = 9.0f/480.0f; - ddim.x = 90.0f/640.0f; - ddim.y = 10.0f/480.0f; - pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, COLOBOT_VERSION_DISPLAY); - pl->SetFontType(Gfx::FONT_COURIER); - pl->SetFontSize(9.0f); + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if (pw != nullptr) + { + Math::Point pos, ddim; + + pos.x = 540.0f/640.0f; + pos.y = 9.0f/480.0f; + ddim.x = 90.0f/640.0f; + ddim.y = 10.0f/480.0f; + CLabel* pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, COLOBOT_VERSION_DISPLAY); + pl->SetFontType(Gfx::FONT_COURIER); + pl->SetFontSize(9.0f); + } } m_engine->LoadAllTextures(); @@ -1813,32 +243,18 @@ void CMainDialog::ChangePhase(Phase phase) bool CMainDialog::EventProcess(const Event &event) { - CWindow* pw; - CList* pl; - CButton* pb; - CCheck* pc; Event newEvent; - float welcomeLength; + + if ( !m_interface->EventProcess(event) ) + { + return false; + } + + if (m_screen.get() != nullptr && !m_screen->EventProcess(event)) return false; if ( event.type == EVENT_FRAME ) { - m_phaseTime += event.rTime; - - //? if ( m_phase == PHASE_WELCOME1 ) welcomeLength = WELCOME_LENGTH+2.0f; - //? else welcomeLength = WELCOME_LENGTH; - welcomeLength = WELCOME_LENGTH; - - if ( m_phase != PHASE_SIMUL && - m_phase != PHASE_WIN && - m_phase != PHASE_LOST && - m_phase != PHASE_WRITE && - m_phase != PHASE_READs && - m_phase != PHASE_WRITEs && - m_phase != PHASE_SETUPds && - m_phase != PHASE_SETUPgs && - m_phase != PHASE_SETUPps && - m_phase != PHASE_SETUPcs && - m_phase != PHASE_SETUPss ) + if ( !IsPhaseWithWorld(m_phase) ) { if (!m_sound->IsPlayingMusic() && m_sound->IsCachedMusic("Intro2.ogg")) { @@ -1846,61 +262,6 @@ bool CMainDialog::EventProcess(const Event &event) } } - if ( m_phase == PHASE_WELCOME1 || - m_phase == PHASE_WELCOME2 || - m_phase == PHASE_WELCOME3 ) - { - float intensity; - int mode = Gfx::ENG_RSTATE_TCOLOR_WHITE; - - // 1/4 of display time is animating - float animatingTime = welcomeLength / 4.0f; - - if ( m_phaseTime < animatingTime ) - { - //appearing - intensity = m_phaseTime / animatingTime; - } - else if ( m_phaseTime < welcomeLength - animatingTime ) - { - //showing - intensity = 1.0f; - } - else - { - //hiding - intensity = (welcomeLength - m_phaseTime) / animatingTime; - } - - if ( intensity < 0.0f ) intensity = 0.0f; - if ( intensity > 1.0f ) intensity = 1.0f; - - //white first, others -> black fadding - if ( (m_phase == PHASE_WELCOME1) && ( m_phaseTime < welcomeLength/2.0f)) - { - intensity = 1.0f - intensity; - mode = Gfx::ENG_RSTATE_TCOLOR_BLACK; - } - - m_engine->SetOverColor(Gfx::Color(intensity, intensity, intensity, intensity), mode); // TODO: color ok? - } - - if ( m_phase == PHASE_WELCOME1 && m_phaseTime >= welcomeLength ) - { - m_main->ChangePhase(PHASE_WELCOME2); - return true; - } - if ( m_phase == PHASE_WELCOME2 && m_phaseTime >= welcomeLength ) - { - m_main->ChangePhase(PHASE_WELCOME3); - return true; - } - if ( m_phase == PHASE_WELCOME3 && m_phaseTime >= welcomeLength ) - { - m_main->ChangePhase(PHASE_PLAYER_SELECT); - return true; - } - if ( m_shotDelay > 0 && !m_bDialog ) // screenshot done? { m_shotDelay --; @@ -1912,16 +273,6 @@ bool CMainDialog::EventProcess(const Event &event) } } - if ( m_phase == PHASE_LOADING ) - { - if ( m_loadingCounter == 0 ) - { - m_main->ChangePhase(PHASE_SIMUL); - } - m_loadingCounter --; - return false; - } - m_glintTime += event.rTime; GlintMove(); // moves reflections @@ -1951,13 +302,7 @@ bool CMainDialog::EventProcess(const Event &event) StopDialog(); if ( m_phase == PHASE_PLAYER_SELECT ) { - NameDelete(); - } - if ( m_phase == PHASE_MAIN_MENU ) - { - //? m_eventQueue->MakeEvent(newEvent, EVENT_QUIT); - //? m_eventQueue->AddEvent(newEvent); - m_main->ChangePhase(PHASE_QUIT_SCREEN); + static_cast(m_screen.get())->NameDelete(); } if ( m_phase == PHASE_SIMUL ) { @@ -1979,15 +324,16 @@ bool CMainDialog::EventProcess(const Event &event) if ( event.type == EVENT_INTERFACE_SETUP ) { StopDialog(); - StartSuspend(); - #if PLATFORM_WINDOWS - if ( m_phaseSetup == PHASE_SETUPd ) m_phaseSetup = PHASE_SETUPg; + m_main->StartSuspend(); + #if PLATFORM_LINUX + if ( CScreenSetup::GetSetupTab() == PHASE_SETUPd ) m_main->ChangePhase(PHASE_SETUPds); + #else + if ( CScreenSetup::GetSetupTab() == PHASE_SETUPd ) m_main->ChangePhase(PHASE_SETUPgs); #endif - if ( m_phaseSetup == PHASE_SETUPd ) ChangePhase(PHASE_SETUPds); - if ( m_phaseSetup == PHASE_SETUPg ) ChangePhase(PHASE_SETUPgs); - if ( m_phaseSetup == PHASE_SETUPp ) ChangePhase(PHASE_SETUPps); - if ( m_phaseSetup == PHASE_SETUPc ) ChangePhase(PHASE_SETUPcs); - if ( m_phaseSetup == PHASE_SETUPs ) ChangePhase(PHASE_SETUPss); + if ( CScreenSetup::GetSetupTab() == PHASE_SETUPg ) m_main->ChangePhase(PHASE_SETUPgs); + if ( CScreenSetup::GetSetupTab() == PHASE_SETUPp ) m_main->ChangePhase(PHASE_SETUPps); + if ( CScreenSetup::GetSetupTab() == PHASE_SETUPc ) m_main->ChangePhase(PHASE_SETUPcs); + if ( CScreenSetup::GetSetupTab() == PHASE_SETUPs ) m_main->ChangePhase(PHASE_SETUPss); } if ( event.type == EVENT_INTERFACE_AGAIN ) { @@ -1997,878 +343,19 @@ bool CMainDialog::EventProcess(const Event &event) if ( event.type == EVENT_INTERFACE_WRITE ) { StopDialog(); - StartSuspend(); - ChangePhase(PHASE_WRITEs); + m_main->StartSuspend(); + m_main->ChangePhase(PHASE_WRITEs); } if ( event.type == EVENT_INTERFACE_READ ) { StopDialog(); - StartSuspend(); - ChangePhase(PHASE_READs); + m_main->StartSuspend(); + m_main->ChangePhase(PHASE_READs); } return false; } - if ( /* m_engine->GetMouseVisible() && TODO: WTF ?! */ - !m_interface->EventProcess(event) ) - { - return false; - } - - if ( m_phase == PHASE_MAIN_MENU ) - { - switch( event.type ) - { - case EVENT_KEY_DOWN: - if ( event.key.key == KEY(ESCAPE) ) - { - //? StartQuit(); // would you leave? - m_sound->Play(SOUND_TZOING); - m_main->ChangePhase(PHASE_QUIT_SCREEN); - return false; - } - return true; - break; - - case EVENT_INTERFACE_QUIT: - //? StartQuit(); // would you leave? - m_sound->Play(SOUND_TZOING); - m_main->ChangePhase(PHASE_QUIT_SCREEN); - break; - - case EVENT_INTERFACE_TRAINER: - m_main->SetLevel(LevelCategory::Exercises, 0, 0); - m_main->ChangePhase(PHASE_LEVEL_LIST); - break; - - case EVENT_INTERFACE_DEFI: - m_main->SetLevel(LevelCategory::Challenges, 0, 0); - m_main->ChangePhase(PHASE_LEVEL_LIST); - break; - - case EVENT_INTERFACE_MISSION: - m_main->SetLevel(LevelCategory::Missions, 0, 0); - m_main->ChangePhase(PHASE_LEVEL_LIST); - break; - - case EVENT_INTERFACE_FREE: - m_main->SetLevel(LevelCategory::FreeGame, 0, 0); - m_main->ChangePhase(PHASE_LEVEL_LIST); - break; - - case EVENT_INTERFACE_USER: - m_main->SetLevel(LevelCategory::CustomLevels, 0, 0); - m_main->ChangePhase(PHASE_LEVEL_LIST); - break; - - case EVENT_INTERFACE_SETUP: - m_main->ChangePhase(m_phaseSetup); - break; - - case EVENT_INTERFACE_NAME: - m_main->ChangePhase(PHASE_PLAYER_SELECT); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_PLAYER_SELECT ) - { - switch( event.type ) - { - case EVENT_KEY_DOWN: - if ( event.key.key == KEY(RETURN) ) - { - NameSelect(); - } - if ( event.key.key == KEY(ESCAPE) ) - { - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) break; - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NCANCEL)); - if ( pb == 0 ) break; - if ( pb->TestState(STATE_ENABLE) ) - { - m_main->ChangePhase(PHASE_MAIN_MENU); - } - } - break; - - case EVENT_INTERFACE_NEDIT: - UpdateNameList(); - UpdateNameControl(); - break; - - case EVENT_INTERFACE_NLIST: - UpdateNameEdit(); - break; - - case EVENT_INTERFACE_NOK: - NameSelect(); - break; - - case EVENT_INTERFACE_PERSO: - NameSelect(); - m_main->ChangePhase(PHASE_APPERANCE); - break; - - case EVENT_INTERFACE_NCANCEL: - m_main->ChangePhase(PHASE_MAIN_MENU); - break; - - case EVENT_INTERFACE_NDELETE: - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) break; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); - if ( pl == 0 ) break; - StartDeleteGame(pl->GetItemName(pl->GetSelect())); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_APPERANCE ) - { - PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); - switch( event.type ) - { - case EVENT_KEY_DOWN: - if ( event.key.key == KEY(RETURN) ) - { - m_main->ChangePhase(PHASE_MAIN_MENU); - } - if ( event.key.key == KEY(ESCAPE) ) - { - m_main->ChangePhase(PHASE_PLAYER_SELECT); - } - break; - - case EVENT_INTERFACE_PHEAD: - m_apperanceTab = 0; - UpdatePerso(); - m_main->ScenePerso(); - CameraPerso(); - break; - case EVENT_INTERFACE_PBODY: - m_apperanceTab = 1; - UpdatePerso(); - m_main->ScenePerso(); - CameraPerso(); - break; - - case EVENT_INTERFACE_PFACE1: - case EVENT_INTERFACE_PFACE2: - case EVENT_INTERFACE_PFACE3: - case EVENT_INTERFACE_PFACE4: - apperance.face = event.type-EVENT_INTERFACE_PFACE1; - UpdatePerso(); - m_main->ScenePerso(); - break; - - case EVENT_INTERFACE_PGLASS0: - case EVENT_INTERFACE_PGLASS1: - case EVENT_INTERFACE_PGLASS2: - case EVENT_INTERFACE_PGLASS3: - case EVENT_INTERFACE_PGLASS4: - case EVENT_INTERFACE_PGLASS5: - case EVENT_INTERFACE_PGLASS6: - case EVENT_INTERFACE_PGLASS7: - case EVENT_INTERFACE_PGLASS8: - case EVENT_INTERFACE_PGLASS9: - apperance.glasses = event.type-EVENT_INTERFACE_PGLASS0; - UpdatePerso(); - m_main->ScenePerso(); - break; - - case EVENT_INTERFACE_PC0a: - case EVENT_INTERFACE_PC1a: - case EVENT_INTERFACE_PC2a: - case EVENT_INTERFACE_PC3a: - case EVENT_INTERFACE_PC4a: - case EVENT_INTERFACE_PC5a: - case EVENT_INTERFACE_PC6a: - case EVENT_INTERFACE_PC7a: - case EVENT_INTERFACE_PC8a: - case EVENT_INTERFACE_PC9a: - FixPerso(event.type-EVENT_INTERFACE_PC0a, 0); - UpdatePerso(); - m_main->ScenePerso(); - break; - - case EVENT_INTERFACE_PC0b: - case EVENT_INTERFACE_PC1b: - case EVENT_INTERFACE_PC2b: - case EVENT_INTERFACE_PC3b: - case EVENT_INTERFACE_PC4b: - case EVENT_INTERFACE_PC5b: - case EVENT_INTERFACE_PC6b: - case EVENT_INTERFACE_PC7b: - case EVENT_INTERFACE_PC8b: - case EVENT_INTERFACE_PC9b: - FixPerso(event.type-EVENT_INTERFACE_PC0b, 1); - UpdatePerso(); - m_main->ScenePerso(); - break; - - case EVENT_INTERFACE_PCRa: - case EVENT_INTERFACE_PCGa: - case EVENT_INTERFACE_PCBa: - case EVENT_INTERFACE_PCRb: - case EVENT_INTERFACE_PCGb: - case EVENT_INTERFACE_PCBb: - ColorPerso(); - UpdatePerso(); - m_main->ScenePerso(); - break; - - case EVENT_INTERFACE_PDEF: - apperance.DefPerso(); - UpdatePerso(); - m_main->ScenePerso(); - break; - - case EVENT_INTERFACE_PLROT: - m_apperanceAngle += 0.2f; - break; - case EVENT_INTERFACE_PRROT: - m_apperanceAngle -= 0.2f; - break; - - case EVENT_INTERFACE_POK: - m_main->GetPlayerProfile()->SaveApperance(); - m_main->ChangePhase(PHASE_MAIN_MENU); - break; - - case EVENT_INTERFACE_PCANCEL: - m_main->GetPlayerProfile()->LoadApperance(); // reload apperance from file - m_main->ChangePhase(PHASE_PLAYER_SELECT); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_LEVEL_LIST ) - { - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return false; - - if ( event.type == pw->GetEventTypeClose() || - event.type == EVENT_INTERFACE_BACK || - (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) - { - m_main->ChangePhase(PHASE_MAIN_MENU); - return false; - } - - switch( event.type ) - { - case EVENT_INTERFACE_CHAP: - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_CHAP)); - if ( pl == 0 ) break; - m_chap[m_category] = pl->GetSelect(); - m_main->GetPlayerProfile()->SetSelectedChap(m_category, m_chap[m_category]+1); - UpdateSceneList(m_chap[m_category], m_sel[m_category]); - UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1); - break; - - case EVENT_INTERFACE_LIST: - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_LIST)); - if ( pl == 0 ) break; - m_sel[m_category] = pl->GetSelect(); - m_main->GetPlayerProfile()->SetSelectedRank(m_category, m_sel[m_category]+1); - UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1); - break; - - case EVENT_INTERFACE_SOLUCE: - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE)); - if ( pb == 0 ) break; - m_bSceneSoluce = !m_bSceneSoluce; - pb->SetState(STATE_CHECK, m_bSceneSoluce); - break; - - case EVENT_INTERFACE_PLAY: - m_main->SetLevel(m_category, m_chap[m_category]+1, m_sel[m_category]+1); - m_main->ChangePhase(PHASE_LOADING); - break; - - case EVENT_INTERFACE_READ: - m_main->ChangePhase(PHASE_READ); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_SETUPd || - m_phase == PHASE_SETUPg || - m_phase == PHASE_SETUPp || - m_phase == PHASE_SETUPc || - m_phase == PHASE_SETUPs ) - { - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return false; - - if ( event.type == pw->GetEventTypeClose() || - event.type == EVENT_INTERFACE_BACK || - (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) - { - m_settings->SaveSettings(); - m_engine->ApplyChange(); - m_main->ChangePhase(PHASE_MAIN_MENU); - return false; - } - - switch( event.type ) - { - case EVENT_INTERFACE_SETUPd: - m_main->ChangePhase(PHASE_SETUPd); - return false; - - case EVENT_INTERFACE_SETUPg: - m_main->ChangePhase(PHASE_SETUPg); - return false; - - case EVENT_INTERFACE_SETUPp: - m_main->ChangePhase(PHASE_SETUPp); - return false; - - case EVENT_INTERFACE_SETUPc: - m_main->ChangePhase(PHASE_SETUPc); - return false; - - case EVENT_INTERFACE_SETUPs: - m_main->ChangePhase(PHASE_SETUPs); - return false; - - default: - break; - } - } - - if ( m_phase == PHASE_SETUPds || - m_phase == PHASE_SETUPgs || - m_phase == PHASE_SETUPps || - m_phase == PHASE_SETUPcs || - m_phase == PHASE_SETUPss ) - { - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return false; - - if ( event.type == pw->GetEventTypeClose() || - event.type == EVENT_INTERFACE_BACK || - (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) - { - m_settings->SaveSettings(); - m_engine->ApplyChange(); - m_interface->DeleteControl(EVENT_WINDOW5); - ChangePhase(PHASE_SIMUL); - StopSuspend(); - return false; - } - - switch( event.type ) - { - case EVENT_INTERFACE_SETUPd: - ChangePhase(PHASE_SETUPds); - return false; - - case EVENT_INTERFACE_SETUPg: - ChangePhase(PHASE_SETUPgs); - return false; - - case EVENT_INTERFACE_SETUPp: - ChangePhase(PHASE_SETUPps); - return false; - - case EVENT_INTERFACE_SETUPc: - ChangePhase(PHASE_SETUPcs); - return false; - - case EVENT_INTERFACE_SETUPs: - ChangePhase(PHASE_SETUPss); - return false; - - default: - break; - } - } - - if ( m_phase == PHASE_SETUPd || // setup/display ? - m_phase == PHASE_SETUPds ) - { - switch( event.type ) - { - case EVENT_LIST2: - UpdateApply(); - break; - - case EVENT_INTERFACE_FULL: - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) break; - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FULL)); - if ( pc == 0 ) break; - - if ( pc->TestState(STATE_CHECK) ) - { - pc->ClearState(STATE_CHECK); - } - else - { - pc->SetState(STATE_CHECK); - } - - UpdateApply(); - break; - - case EVENT_INTERFACE_APPLY: - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) break; - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_APPLY)); - if ( pb == 0 ) break; - pb->ClearState(STATE_PRESS); - pb->ClearState(STATE_HILIGHT); - ChangeDisplay(); - UpdateApply(); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_SETUPg || // setup/graphic ? - m_phase == PHASE_SETUPgs ) - { - switch( event.type ) - { - case EVENT_INTERFACE_SHADOW: - m_engine->SetShadow(!m_engine->GetShadow()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_GROUND: - m_engine->SetGroundSpot(!m_engine->GetGroundSpot()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_DIRTY: - m_engine->SetDirty(!m_engine->GetDirty()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_FOG: - m_engine->SetFog(!m_engine->GetFog()); - m_camera->SetOverBaseColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)); // TODO: color ok? - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_LENS: - m_engine->SetLensMode(!m_engine->GetLensMode()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_SKY: - m_engine->SetSkyMode(!m_engine->GetSkyMode()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_PLANET: - m_engine->SetPlanetMode(!m_engine->GetPlanetMode()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_LIGHT: - m_engine->SetLightMode(!m_engine->GetLightMode()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_PARTI: - case EVENT_INTERFACE_CLIP: - case EVENT_INTERFACE_DETAIL: - case EVENT_INTERFACE_GADGET: - ChangeSetupButtons(); - break; - - case EVENT_INTERFACE_TEXTURE_FILTER: - case EVENT_INTERFACE_TEXTURE_MIPMAP: - case EVENT_INTERFACE_TEXTURE_ANISOTROPY: - case EVENT_INTERFACE_MSAA: - case EVENT_INTERFACE_SHADOW_MAPPING: - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_SHADOW_MAPPING_QUALITY: - m_engine->SetShadowMappingQuality(!m_engine->GetShadowMappingQuality()); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_MIN: - ChangeSetupQuality(-1); - UpdateSetupButtons(); - break; - case EVENT_INTERFACE_NORM: - ChangeSetupQuality(0); - UpdateSetupButtons(); - break; - case EVENT_INTERFACE_MAX: - ChangeSetupQuality(1); - UpdateSetupButtons(); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_SETUPp || // setup/game ? - m_phase == PHASE_SETUPps ) - { - switch( event.type ) - { - case EVENT_INTERFACE_TOTO: - m_engine->SetTotoMode(!m_engine->GetTotoMode()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_TOOLTIP: - m_settings->SetTooltips(!m_settings->GetTooltips()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_GLINT: - m_settings->SetInterfaceGlint(!m_settings->GetInterfaceGlint()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_RAIN: - m_settings->SetInterfaceRain(!m_settings->GetInterfaceRain()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_MOUSE: - if (m_app->GetMouseMode() == MOUSE_SYSTEM) - m_app->SetMouseMode(MOUSE_ENGINE); - else - m_app->SetMouseMode(MOUSE_SYSTEM); - - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_EDITMODE: - m_engine->SetEditIndentMode(!m_engine->GetEditIndentMode()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_EDITVALUE: - if ( m_engine->GetEditIndentValue() == 2 ) - { - m_engine->SetEditIndentValue(4); - } - else - { - m_engine->SetEditIndentValue(2); - } - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_SOLUCE4: - m_settings->SetSoluce4(!m_settings->GetSoluce4()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_MOVIES: - m_settings->SetMovies(!m_settings->GetMovies()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_NICERST: - m_settings->SetNiceReset(!m_settings->GetNiceReset()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_HIMSELF: - m_settings->SetHimselfDamage(!m_settings->GetHimselfDamage()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_SCROLL: - m_camera->SetCameraScroll(!m_camera->GetCameraScroll()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_INVERTX: - m_camera->SetCameraInvertX(!m_camera->GetCameraInvertX()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_INVERTY: - m_camera->SetCameraInvertY(!m_camera->GetCameraInvertY()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_EFFECT: - m_camera->SetEffect(!m_camera->GetEffect()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_BLOOD: - m_camera->SetBlood(!m_camera->GetBlood()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_AUTOSAVE_ENABLE: - m_main->SetAutosave(!m_main->GetAutosave()); - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_AUTOSAVE_INTERVAL: - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - case EVENT_INTERFACE_AUTOSAVE_SLOTS: - ChangeSetupButtons(); - UpdateSetupButtons(); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_SETUPc || // setup/commands ? - m_phase == PHASE_SETUPcs ) - { - switch( event.type ) - { - case EVENT_INTERFACE_KSCROLL: - UpdateKey(); - break; - - case EVENT_INTERFACE_KDEF: - CInput::GetInstancePointer()->SetDefaultInputBindings(); - UpdateKey(); - break; - - case EVENT_INTERFACE_JOYSTICK: - m_app->SetJoystickEnabled(!m_app->GetJoystickEnabled()); - UpdateSetupButtons(); - break; - - default: - if (event.type >= EVENT_INTERFACE_KEY && event.type <= EVENT_INTERFACE_KEY_END) - { - ChangeKey(event.type); - UpdateKey(); - break; - } - return true; - } - return false; - } - - if ( m_phase == PHASE_SETUPs || // setup/sound ? - m_phase == PHASE_SETUPss ) - { - switch( event.type ) - { - case EVENT_INTERFACE_VOLSOUND: - case EVENT_INTERFACE_VOLMUSIC: - ChangeSetupButtons(); - break; - - case EVENT_INTERFACE_SILENT: - m_sound->SetAudioVolume(0); - m_sound->SetMusicVolume(0); - UpdateSetupButtons(); - break; - case EVENT_INTERFACE_NOISY: - m_sound->SetAudioVolume(MAXVOLUME); - m_sound->SetMusicVolume(MAXVOLUME*3/4); - UpdateSetupButtons(); - break; - - default: - return true; - } - return false; - } - - if ( m_phase == PHASE_READ ) - { - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return false; - - if ( event.type == pw->GetEventTypeClose() || - event.type == EVENT_INTERFACE_BACK || - (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) - { - ChangePhase(PHASE_LEVEL_LIST); - return false; - } - - if ( event.type == EVENT_INTERFACE_IOLIST ) - { - IOUpdateList(); - return false; - } - if ( event.type == EVENT_INTERFACE_IODELETE ) - { - IODeleteScene(); - IOUpdateList(); - return false; - } - if ( event.type == EVENT_INTERFACE_IOREAD ) - { - IOReadScene(); - return false; - } - - return true; - } - - if ( m_phase == PHASE_WRITEs || - m_phase == PHASE_READs ) - { - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return false; - - if ( event.type == pw->GetEventTypeClose() || - event.type == EVENT_INTERFACE_BACK || - (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) - { - m_interface->DeleteControl(EVENT_WINDOW5); - ChangePhase(PHASE_SIMUL); - StopSuspend(); - return false; - } - - if ( event.type == EVENT_INTERFACE_IOLIST ) - { - IOUpdateList(); - return false; - } - if ( event.type == EVENT_INTERFACE_IODELETE ) - { - IODeleteScene(); - IOUpdateList(); - return false; - } - if ( event.type == EVENT_INTERFACE_IOWRITE ) - { - ChangePhase(PHASE_SIMUL); - StopSuspend(); - - IOWriteScene(); - m_interface->DeleteControl(EVENT_WINDOW5); - return false; - } - if ( event.type == EVENT_INTERFACE_IOREAD ) - { - ChangePhase(PHASE_SIMUL); - StopSuspend(); - - IOReadScene(); - return false; - } - - return true; - } - - if ( m_phase == PHASE_WELCOME1 ) - { - if ( event.type == EVENT_KEY_DOWN || - event.type == EVENT_MOUSE_BUTTON_DOWN ) - { - m_main->ChangePhase(PHASE_WELCOME2); - return true; - } - } - if ( m_phase == PHASE_WELCOME2 ) - { - if ( event.type == EVENT_KEY_DOWN || - event.type == EVENT_MOUSE_BUTTON_DOWN ) - { - m_main->ChangePhase(PHASE_WELCOME3); - return true; - } - } - if ( m_phase == PHASE_WELCOME3 ) - { - if ( event.type == EVENT_KEY_DOWN || - event.type == EVENT_MOUSE_BUTTON_DOWN ) - { - m_main->ChangePhase(PHASE_PLAYER_SELECT); - return true; - } - } - - if ( m_phase == PHASE_QUIT_SCREEN ) - { - if ( event.type == EVENT_INTERFACE_ABORT ) - { - ChangePhase(PHASE_MAIN_MENU); - } - - if ( event.type == EVENT_KEY_DOWN ) - { - if ( event.key.key == KEY(ESCAPE) ) - { - ChangePhase(PHASE_MAIN_MENU); - } - else - { - m_eventQueue->AddEvent(Event(EVENT_QUIT)); - } - } - - if ( event.type == EVENT_MOUSE_BUTTON_DOWN ) - { - m_eventQueue->AddEvent(Event(EVENT_QUIT)); - } - } - return true; } @@ -2988,10 +475,9 @@ void CMainDialog::GlintMove() } } - if ( m_phase == PHASE_WRITE || - m_phase == PHASE_READ || - m_phase == PHASE_WRITEs || - m_phase == PHASE_READs ) + if ( m_phase == PHASE_WRITEs || + m_phase == PHASE_READ || + m_phase == PHASE_READs ) { pg = static_cast(pw->SearchControl(EVENT_INTERFACE_GLINTl)); if ( pg != 0 ) @@ -3144,7 +630,6 @@ void CMainDialog::FrameParticle(float rTime) m_phase == PHASE_SETUPp || m_phase == PHASE_SETUPc || m_phase == PHASE_SETUPs || - m_phase == PHASE_WRITE || m_phase == PHASE_READ ) { pParti = partiPosBig; @@ -3375,1598 +860,32 @@ void CMainDialog::NiceParticle(Math::Point mouse, bool bPress) } } +// Updates the lists according to the cheat code. -// Updates the list of players after checking the files on disk. - -void CMainDialog::ReadNameList() +void CMainDialog::AllMissionUpdate() { - CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if (pw == nullptr) return; - CList* pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); - if (pl == nullptr) return; - pl->Flush(); - - auto players = CPlayerProfile::GetPlayerList(); - for (int i = 0; i < static_cast(players.size()); ++i) + if ( m_phase == PHASE_LEVEL_LIST ) { - pl->SetItemName(i, players.at(i).c_str()); + static_cast(m_screen.get())->AllMissionUpdate(); } } -// Updates the controls of the players. - -void CMainDialog::UpdateNameControl() -{ - CWindow* pw; - CList* pl; - CButton* pb; - CEdit* pe; - char name[100]; - int total, sel; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); - if ( pl == 0 ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); - if ( pe == 0 ) return; - - std::string gamer = m_main->GetPlayerProfile()->GetName(); - total = pl->GetTotal(); - sel = pl->GetSelect(); - pe->GetText(name, 100); - - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NCANCEL)); - if ( pb != 0 ) - { - pb->SetState(STATE_ENABLE, !gamer.empty()); - } - - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NDELETE)); - if ( pb != 0 ) - { - pb->SetState(STATE_ENABLE, total>0 && sel!=-1); - } - - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NOK)); - if ( pb != 0 ) - { - pb->SetState(STATE_ENABLE, name[0]!=0 || sel!=-1); - } - - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_PERSO)); - if ( pb != 0 ) - { - pb->SetState(STATE_ENABLE, name[0]!=0 || sel!=-1); - } -} - -// Updates the list of players by name frape. - -void CMainDialog::UpdateNameList() -{ - CWindow* pw; - CList* pl; - CEdit* pe; - char name[100]; - int total, i; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); - if ( pl == 0 ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); - if ( pe == 0 ) return; - - pe->GetText(name, 100); - total = pl->GetTotal(); - - for ( i=0 ; iGetItemName(i)) == 0 ) - { - pl->SetSelect(i); - pl->ShowSelect(false); - return; - } - } - - pl->SetSelect(-1); -} - -// Updates the player's name and function of the selected list. - -void CMainDialog::UpdateNameEdit() -{ - CWindow* pw; - CList* pl; - CEdit* pe; - char* name; - int sel; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); - if ( pl == 0 ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); - if ( pe == 0 ) return; - - sel = pl->GetSelect(); - if ( sel == -1 ) - { - pe->SetText(""); - pe->SetCursor(0, 0); - } - else - { - name = pl->GetItemName(sel); - pe->SetText(name); - pe->SetCursor(strlen(name), 0); - } - - UpdateNameControl(); -} - -// Selects a player. - -void CMainDialog::NameSelect() -{ - CWindow* pw; - CList* pl; - CEdit* pe; - char name[100]; - int sel; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); - if ( pl == 0 ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); - if ( pe == 0 ) return; - - pe->GetText(name, 100); - sel = pl->GetSelect(); - - if ( sel == -1 ) - { - NameCreate(); - } - else - { - m_main->SelectPlayer(pl->GetItemName(sel)); - } - - m_main->ChangePhase(PHASE_MAIN_MENU); -} - -// Creates a new player. - -bool CMainDialog::NameCreate() -{ - CWindow* pw; - CEdit* pe; - char name[100]; - char c; - int len, i, j; - - GetLogger()->Info("Creating new player\n"); - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return false; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); - if ( pe == 0 ) return false; - - pe->GetText(name, 100); - if ( name[0] == 0 ) - { - m_sound->Play(SOUND_TZOING); - return false; - } - - len = strlen(name); - j = 0; - for ( i=0 ; i= '0' && c <= '9') || - (c >= 'a' && c <= 'z') || - c == ' ' || - c == '-' || - c == '_' || - c == '.' || - c == ',' || - c == '\'' ) - { - name[j++] = name[i]; - } - } - name[j] = 0; - if ( j == 0 ) - { - m_sound->Play(SOUND_TZOING); - return false; - } - - m_main->SelectPlayer(name); - m_main->GetPlayerProfile()->Create(); - - return true; -} - -// Removes a player. - -void CMainDialog::NameDelete() -{ - CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if (pw == nullptr) return; - CList* pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); - if (pl == nullptr) return; - - int sel = pl->GetSelect(); - if (sel == -1) - { - m_sound->Play(SOUND_TZOING); - return; - } - - char* gamer = pl->GetItemName(sel); - - m_main->SelectPlayer(gamer); - if (!m_main->GetPlayerProfile()->Delete()) - { - m_sound->Play(SOUND_TZOING); - return; - } - - pl->SetSelect(-1); - - ReadNameList(); - UpdateNameList(); - UpdateNameControl(); -} - - - -// ests whether two colors are equal or nearly are. - -bool EqColor(const Gfx::Color &c1, const Gfx::Color &c2) -{ - return (fabs(c1.r-c2.r) < 0.01f && - fabs(c1.g-c2.g) < 0.01f && - fabs(c1.b-c2.b) < 0.01f ); -} - -// Updates all the buttons for the character. - -void CMainDialog::UpdatePerso() -{ - CWindow* pw; - CLabel* pl; - CButton* pb; - CColor* pc; - CSlider* ps; - Gfx::Color color; - std::string name; - int i; - - PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_PHEAD)); - if ( pb != 0 ) - { - pb->SetState(STATE_CHECK, m_apperanceTab==0); - } - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_PBODY)); - if ( pb != 0 ) - { - pb->SetState(STATE_CHECK, m_apperanceTab==1); - } - - pl = static_cast(pw->SearchControl(EVENT_LABEL11)); - if ( pl != 0 ) - { - if ( m_apperanceTab == 0 ) - { - pl->SetState(STATE_VISIBLE); - GetResource(RES_TEXT, RT_PERSO_FACE, name); - pl->SetName(name); - } - else - { - pl->ClearState(STATE_VISIBLE); - } - } - - pl = static_cast(pw->SearchControl(EVENT_LABEL12)); - if ( pl != 0 ) - { - if ( m_apperanceTab == 0 ) - { - pl->SetState(STATE_VISIBLE); - GetResource(RES_TEXT, RT_PERSO_GLASSES, name); - pl->SetName(name); - } - else - { - pl->ClearState(STATE_VISIBLE); - } - } - - pl = static_cast(pw->SearchControl(EVENT_LABEL13)); - if ( pl != 0 ) - { - if ( m_apperanceTab == 0 ) GetResource(RES_TEXT, RT_PERSO_HAIR, name); - else GetResource(RES_TEXT, RT_PERSO_BAND, name); - pl->SetName(name); - } - - pl = static_cast(pw->SearchControl(EVENT_LABEL14)); - if ( pl != 0 ) - { - if ( m_apperanceTab == 0 ) - { - pl->ClearState(STATE_VISIBLE); - } - else - { - pl->SetState(STATE_VISIBLE); - GetResource(RES_TEXT, RT_PERSO_COMBI, name); - pl->SetName(name); - } - } - - for ( i=0 ; i<4 ; i++ ) - { - pb = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PFACE1+i))); - if ( pb == 0 ) break; - pb->SetState(STATE_VISIBLE, m_apperanceTab==0); - pb->SetState(STATE_CHECK, i==apperance.face); - } - - for ( i=0 ; i<10 ; i++ ) - { - pb = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PGLASS0+i))); - if ( pb == 0 ) break; - pb->SetState(STATE_VISIBLE, m_apperanceTab==0); - pb->SetState(STATE_CHECK, i==apperance.glasses); - } - - for ( i=0 ; i<3*3 ; i++ ) - { - pc = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PC0a+i))); - if ( pc == 0 ) break; - if ( m_apperanceTab == 0 ) - { - pc->ClearState(STATE_VISIBLE); - } - else - { - pc->SetState(STATE_VISIBLE); - color.r = perso_color[3*10*1+3*i+0]/255.0f; - color.g = perso_color[3*10*1+3*i+1]/255.0f; - color.b = perso_color[3*10*1+3*i+2]/255.0f; - color.a = 0.0f; - pc->SetColor(color); - pc->SetState(STATE_CHECK, EqColor(color, apperance.colorCombi)); - } - - pc = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PC0b+i))); - if ( pc == 0 ) break; - color.r = perso_color[3*10*2*m_apperanceTab+3*i+0]/255.0f; - color.g = perso_color[3*10*2*m_apperanceTab+3*i+1]/255.0f; - color.b = perso_color[3*10*2*m_apperanceTab+3*i+2]/255.0f; - color.a = 0.0f; - pc->SetColor(color); - pc->SetState(STATE_CHECK, EqColor(color, m_apperanceTab?apperance.colorBand:apperance.colorHair)); - } - - for ( i=0 ; i<3 ; i++ ) - { - ps = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PCRa+i))); - if ( ps == 0 ) break; - ps->SetState(STATE_VISIBLE, m_apperanceTab==1); - } - - if ( m_apperanceTab == 1 ) - { - color = apperance.colorCombi; - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRa)); - if ( ps != 0 ) ps->SetVisibleValue(color.r*255.0f); - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGa)); - if ( ps != 0 ) ps->SetVisibleValue(color.g*255.0f); - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBa)); - if ( ps != 0 ) ps->SetVisibleValue(color.b*255.0f); - } - - if ( m_apperanceTab == 0 ) color = apperance.colorHair; - else color = apperance.colorBand; - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRb)); - if ( ps != 0 ) ps->SetVisibleValue(color.r*255.0f); - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGb)); - if ( ps != 0 ) ps->SetVisibleValue(color.g*255.0f); - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBb)); - if ( ps != 0 ) ps->SetVisibleValue(color.b*255.0f); -} - -// Updates the camera for the character. - -void CMainDialog::CameraPerso() -{ - if ( m_apperanceTab == 0 ) - { -//? m_camera->Init(Math::Vector(4.0f, 0.0f, 0.0f), -//? Math::Vector(0.0f, 0.0f, 1.0f), 0.0f); - m_camera->Init(Math::Vector(6.0f, 0.0f, 0.0f), - Math::Vector(0.0f, 0.2f, 1.5f), 0.0f); - } - else - { - m_camera->Init(Math::Vector(18.0f, 0.0f, 4.5f), - Math::Vector(0.0f, 1.6f, 4.5f), 0.0f); - } - - m_camera->SetType(Gfx::CAM_TYPE_SCRIPT); - m_camera->FixCamera(); -} - -// Sets a fixed color. - -void CMainDialog::FixPerso(int rank, int index) -{ - PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); - if ( m_apperanceTab == 0 ) - { - if ( index == 1 ) - { - apperance.colorHair.r = perso_color[3*10*0+rank*3+0]/255.0f; - apperance.colorHair.g = perso_color[3*10*0+rank*3+1]/255.0f; - apperance.colorHair.b = perso_color[3*10*0+rank*3+2]/255.0f; - } - } - if ( m_apperanceTab == 1 ) - { - if ( index == 0 ) - { - apperance.colorCombi.r = perso_color[3*10*1+rank*3+0]/255.0f; - apperance.colorCombi.g = perso_color[3*10*1+rank*3+1]/255.0f; - apperance.colorCombi.b = perso_color[3*10*1+rank*3+2]/255.0f; - } - if ( index == 1 ) - { - apperance.colorBand.r = perso_color[3*10*2+rank*3+0]/255.0f; - apperance.colorBand.g = perso_color[3*10*2+rank*3+1]/255.0f; - apperance.colorBand.b = perso_color[3*10*2+rank*3+2]/255.0f; - } - } -} - -// Updates the color of the character. - -void CMainDialog::ColorPerso() -{ - CWindow* pw; - CSlider* ps; - Gfx::Color color; - - PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - - color.a = 0.0f; - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRa)); - if ( ps != 0 ) color.r = ps->GetVisibleValue()/255.0f; - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGa)); - if ( ps != 0 ) color.g = ps->GetVisibleValue()/255.0f; - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBa)); - if ( ps != 0 ) color.b = ps->GetVisibleValue()/255.0f; - if ( m_apperanceTab == 1 ) apperance.colorCombi = color; - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRb)); - if ( ps != 0 ) color.r = ps->GetVisibleValue()/255.0f; - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGb)); - if ( ps != 0 ) color.g = ps->GetVisibleValue()/255.0f; - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBb)); - if ( ps != 0 ) color.b = ps->GetVisibleValue()/255.0f; - if ( m_apperanceTab == 0 ) apperance.colorHair = color; - else apperance.colorBand = color; -} - -// Builds the file name by default. - -void CMainDialog::IOReadName() -{ - CWindow* pw; - CEdit* pe; - std::string resume; - char line[100]; - char name[100]; - time_t now; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == nullptr ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_IONAME)); - if ( pe == nullptr ) return; - - resume = std::string(GetLevelCategoryDir(m_category)) + " " + boost::lexical_cast(m_chap[m_category]+1); - - CLevelParser levelParser(m_category, m_chap[m_category]+1, 0); - try - { - levelParser.Load(); - resume = levelParser.Get("Title")->GetParam("resume")->AsString(); - } - catch (CLevelParserException& e) - { - GetLogger()->Warn("%s\n", e.what()); - } - - time(&now); - TimeToAsciiClean(now, line); - sprintf(name, "%s - %s %d", line, resume.c_str(), m_sel[m_category]+1); - - pe->SetText(name); - pe->SetCursor(strlen(name), 0); - m_interface->SetFocus(pe); -} - -// Updates the list of games recorded on disk. - -void CMainDialog::IOReadList() -{ - CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if (pw == nullptr) return; - CList* pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); - if (pl == nullptr) return; - - pl->Flush(); - - m_saveList.clear(); - for(const SavedScene& save : m_main->GetPlayerProfile()->GetSavedSceneList()) - { - pl->SetItemName(m_saveList.size(), save.name.c_str()); - m_saveList.push_back(save.path); - } - - // invalid index - if ( m_phase == PHASE_WRITE || m_phase == PHASE_WRITEs ) - { - std::string nameStr; - GetResource(RES_TEXT, RT_IO_NEW, nameStr); - pl->SetItemName(m_saveList.size(), nameStr.c_str()); - } - - pl->SetSelect(m_saveList.size()); - pl->ShowSelect(false); // shows the selected columns - - for (unsigned int i = 0; i < m_saveList.size(); i++) - { - m_engine->DeleteTexture(m_saveList.at(i) + "/screen.png"); - } -} - -// Updates the buttons according to the selected part in the list. - -void CMainDialog::IOUpdateList() -{ - CWindow* pw; - CList* pl; - CButton* pb; - CImage* pi; - int sel, max; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == nullptr ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); - if ( pl == nullptr ) return; - pi = static_cast(pw->SearchControl(EVENT_INTERFACE_IOIMAGE)); - if ( pi == nullptr ) return; - - sel = pl->GetSelect(); - max = pl->GetTotal(); - - if (m_saveList.size() <= static_cast(sel)) - return; - - std::string filename = m_saveList.at(sel) + "/screen.png"; - if ( m_phase == PHASE_WRITE || m_phase == PHASE_WRITEs ) - { - if ( sel < max-1 ) - { - pi->SetFilenameImage(filename.c_str()); - } - else - { - pi->SetFilenameImage(""); - } - - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_IODELETE)); - if ( pb != nullptr ) - { - pb->SetState(STATE_ENABLE, sel < max-1); - } - } - else - { - pi->SetFilenameImage(filename.c_str()); - } -} - -// Deletes the selected scene. - -void CMainDialog::IODeleteScene() -{ - CWindow* pw; - CList* pl; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); - if ( pl == 0 ) return; - - int sel = pl->GetSelect(); - if (sel < 0 || sel >= static_cast(m_saveList.size())) return; - - if (!m_main->GetPlayerProfile()->DeleteScene(m_saveList.at(sel))) - { - m_sound->Play(SOUND_TZOING); - return; - } - - IOReadList(); -} - -// clears filename only to leave letter or numbers -std::string clearName(char *name) -{ - std::string ret; - int len = strlen(name); - for (int i = 0; i < len; i++) - { - if (isalnum(name[i])) - { - ret += name[i]; - } - } - return ret; -} - - -// Writes the scene. -void CMainDialog::IOWriteScene() -{ - CWindow* pw; - CList* pl; - CEdit* pe; - char info[100]; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == nullptr ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); - if ( pl == nullptr ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_IONAME)); - if ( pe == nullptr ) return; - - int sel = pl->GetSelect(); - if ( sel == -1 ) return; - - std::string dir; - pe->GetText(info, 100); - if (static_cast(sel) >= m_saveList.size()) - { - dir = m_main->GetPlayerProfile()->GetSaveFile("save"+clearName(info)); - } - else - { - dir = m_saveList.at(sel); - } - - m_main->GetPlayerProfile()->SaveScene(dir, info); -} - void CMainDialog::MakeSaveScreenshot(const std::string& name) { m_shotDelay = 3; m_shotName = CResourceManager::GetSaveLocation() + "/" + name; //TODO: Use PHYSFS? } -// Reads the scene. - -void CMainDialog::IOReadScene() -{ - CWindow* pw; - CList* pl; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == nullptr ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); - if ( pl == nullptr ) return; - - int sel = pl->GetSelect(); - if (sel < 0 || sel >= static_cast(m_saveList.size())) return; - - m_main->GetPlayerProfile()->LoadScene(m_saveList.at(sel)); - - m_chap[m_category] = m_main->GetLevelChap()-1; - m_sel[m_category] = m_main->GetLevelRank()-1; -} - -// Updates the lists according to the cheat code. - -void CMainDialog::AllMissionUpdate() -{ - if ( m_phase == PHASE_LEVEL_LIST ) - { - UpdateSceneChap(m_chap[m_category]); - UpdateSceneList(m_chap[m_category], m_sel[m_category]); - } -} - -// Updates the chapters of exercises or missions. - -void CMainDialog::UpdateSceneChap(int &chap) -{ - CWindow* pw; - CList* pl; - - std::string fileName; - char line[500]; - bool bPassed; - - memset(line, 0, 500); - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_CHAP)); - if ( pl == 0 ) return; - - pl->Flush(); - - unsigned int j; - if ( m_category == LevelCategory::CustomLevels ) - { - UpdateCustomLevelList(); - - for ( j=0 ; jSetItemName(j, levelParser.Get("Title")->GetParam("text")->AsString().c_str()); - pl->SetEnable(j, true); - } - catch (CLevelParserException& e) - { - pl->SetItemName(j, (std::string("[ERROR]: ")+e.what()).c_str()); - pl->SetEnable(j, false); - } - } - } - else - { - for ( j=0 ; jGetParam("text")->AsString().c_str()); - } - catch (CLevelParserException& e) - { - sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); - } - - bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, j+1, 0); - pl->SetItemName(j, line); - pl->SetCheck(j, bPassed); - pl->SetEnable(j, true); - - if ( m_category == LevelCategory::Missions && !m_main->GetShowAll() && !bPassed ) - { - j ++; - break; - } - - if ( m_category == LevelCategory::FreeGame && j == m_accessChap ) - { - j ++; - break; - } - } - } - - if ( chap > j-1 ) chap = j-1; - - pl->SetSelect(chap); - pl->ShowSelect(false); // shows the selected columns -} - -// Updates the list of exercises or missions. - -void CMainDialog::UpdateSceneList(int chap, int &sel) -{ - CWindow* pw; - CList* pl; - std::string fileName; - char line[500]; - int j; - bool bPassed; - - memset(line, 0, 500); - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_INTERFACE_LIST)); - if ( pl == 0 ) return; - - pl->Flush(); - - bool readAll = true; - for ( j=0 ; jGetParam("text")->AsString().c_str()); - } - catch (CLevelParserException& e) - { - sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); - } - - bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, chap+1, j+1); - pl->SetItemName(j, line); - pl->SetCheck(j, bPassed); - pl->SetEnable(j, true); - - if ( m_category == LevelCategory::Missions && !m_main->GetShowAll() && !bPassed ) - { - readAll = false; - } - } - - if (readAll) - { - m_maxList = j; - } - else - { - m_maxList = j+1; // this is not the last! - } - - if ( sel > j-1 ) sel = j-1; - - pl->SetSelect(sel); - pl->ShowSelect(false); // shows the selected columns -} - // Updates the button "solution" according to cheat code. void CMainDialog::ShowSoluceUpdate() { - CWindow* pw; - CEdit* pe; - CCheck* pc; - if ( m_phase == PHASE_LEVEL_LIST ) { - m_bSceneSoluce = false; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_RESUME)); - if ( pe == 0 ) return; - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE)); - if ( pc == 0 ) return; - - if ( m_main->GetShowSoluce() ) - { - pc->SetState(STATE_VISIBLE); - pc->SetState(STATE_CHECK); - m_bSceneSoluce = true; - } - else - { - pc->ClearState(STATE_VISIBLE); - pc->ClearState(STATE_CHECK); - m_bSceneSoluce = false; - } + static_cast(m_screen.get())->ShowSoluceUpdate(); } } -// Updates a summary of exercise or mission. - -void CMainDialog::UpdateSceneResume(int chap, int rank) -{ - CWindow* pw; - CEdit* pe; - CCheck* pc; - std::string fileName; - int numTry; - bool bPassed, bVisible; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pe = static_cast(pw->SearchControl(EVENT_INTERFACE_RESUME)); - if ( pe == 0 ) return; - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE)); - - if ( pc == 0 ) - { - m_bSceneSoluce = false; - } - else - { - numTry = m_main->GetPlayerProfile()->GetLevelTryCount(m_category, chap, rank); - bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, chap, rank); - bVisible = ( numTry > 2 || bPassed || m_main->GetShowSoluce() ); - if ( !m_settings->GetSoluce4() ) bVisible = false; - pc->SetState(STATE_VISIBLE, bVisible); - if ( !bVisible ) - { - pc->ClearState(STATE_CHECK); - m_bSceneSoluce = false; - } - } - - if(chap == 0 || rank == 0) return; - - try - { - CLevelParser levelParser(m_category, chap, rank); - levelParser.Load(); - pe->SetText(levelParser.Get("Resume")->GetParam("text")->AsString().c_str()); - } - catch (CLevelParserException& e) - { - pe->SetText((std::string("[ERROR]: ")+e.what()).c_str()); - } -} - -// Updates the list of modes. - -int GCD(int a, int b) -{ - return (b == 0) ? a : GCD(b, a%b); -} - -Math::IntPoint AspectRatio(Math::IntPoint resolution) -{ - int gcd = GCD(resolution.x, resolution.y); - return Math::IntPoint(static_cast(resolution.x) / gcd, static_cast(resolution.y) / gcd); -} - -void CMainDialog::UpdateDisplayMode() -{ - CWindow* pw; - CList* pl; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - pl = static_cast(pw->SearchControl(EVENT_LIST2)); - if ( pl == 0 ) return; - pl->Flush(); - - std::vector modes; - m_app->GetVideoResolutionList(modes, true, true); - int i = 0; - std::stringstream mode_text; - for (Math::IntPoint mode : modes) - { - mode_text.str(""); - Math::IntPoint aspect = AspectRatio(mode); - mode_text << mode.x << "x" << mode.y << " [" << aspect.x << ":" << aspect.y << "]"; - pl->SetItemName(i++, mode_text.str().c_str()); - } - - pl->SetSelect(m_setupSelMode); - pl->ShowSelect(false); -} - -// Change the graphics mode. - -void CMainDialog::ChangeDisplay() -{ - CWindow* pw; - CList* pl; - CCheck* pc; - bool bFull; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - - pl = static_cast(pw->SearchControl(EVENT_LIST2)); - if ( pl == 0 ) return; - m_setupSelMode = pl->GetSelect(); - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FULL)); - if ( pc == 0 ) return; - bFull = pc->TestState(STATE_CHECK); - m_setupFull = bFull; - - std::vector modes; - m_app->GetVideoResolutionList(modes, true, true); - - Gfx::DeviceConfig config = m_app->GetVideoConfig(); - config.size = modes[m_setupSelMode]; - config.fullScreen = bFull; - - m_settings->SaveResolutionSettings(config); - - #if !PLATFORM_LINUX - // Windows causes problems, so we'll restart the game - // Mac OS was not tested so let's restart just to be sure - m_app->Restart(); - #else - m_app->ChangeVideoConfig(config); - #endif -} - - - -// Updates the "apply" button. - -void CMainDialog::UpdateApply() -{ - CWindow* pw; - CButton* pb; - CList* pl; - CCheck* pc; - int sel2; - bool bFull; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - - pb = static_cast(pw->SearchControl(EVENT_INTERFACE_APPLY)); - - pl = static_cast(pw->SearchControl(EVENT_LIST2)); - if ( pl == 0 ) return; - sel2 = pl->GetSelect(); - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FULL)); - bFull = pc->TestState(STATE_CHECK); - - if ( sel2 == m_setupSelMode && - bFull == m_setupFull ) - { - pb->ClearState(STATE_ENABLE); - } - else - { - pb->SetState(STATE_ENABLE); - } -} - -// Updates the buttons during the setup phase. - -void CMainDialog::UpdateSetupButtons() -{ - CWindow* pw; - CCheck* pc; - CEditValue* pv; - CSlider* ps; - CEnumSlider* pes; - float value; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_TOTO)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetTotoMode()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_TOOLTIP)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_settings->GetTooltips()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_GLINT)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_settings->GetInterfaceGlint()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_RAIN)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_settings->GetInterfaceRain()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_MOUSE)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_app->GetMouseMode() == MOUSE_SYSTEM); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_EDITMODE)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetEditIndentMode()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_EDITVALUE)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetEditIndentValue()>2); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE4)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_settings->GetSoluce4()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_MOVIES)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_settings->GetMovies()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_NICERST)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_settings->GetNiceReset()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_HIMSELF)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_settings->GetHimselfDamage()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SCROLL)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_camera->GetCameraScroll()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_INVERTX)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_camera->GetCameraInvertX()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_INVERTY)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_camera->GetCameraInvertY()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_EFFECT)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_camera->GetEffect()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_BLOOD)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_camera->GetBlood()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_ENABLE)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_main->GetAutosave()); - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_INTERVAL)); - if ( ps != 0 ) - { - ps->SetState(STATE_ENABLE, m_main->GetAutosave()); - ps->SetVisibleValue(m_main->GetAutosaveInterval()); - - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_SLOTS)); - if ( ps != 0 ) - { - ps->SetState(STATE_ENABLE, m_main->GetAutosave()); - ps->SetVisibleValue(m_main->GetAutosaveSlots()); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_FILTER)); - if ( pes != 0 ) - { - pes->SetVisibleValue(m_engine->GetTextureFilterMode()); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_MIPMAP)); - if ( pes != 0 ) - { - pes->SetState(STATE_ENABLE, m_engine->GetTextureFilterMode() == Gfx::TEX_FILTER_TRILINEAR); - pes->SetVisibleValue(m_engine->GetTextureMipmapLevel()); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_ANISOTROPY)); - if ( pes != 0 ) - { - pes->SetVisibleValue(m_engine->GetTextureAnisotropyLevel()); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_MSAA)); - if ( pes != 0 ) - { - pes->SetVisibleValue(m_engine->GetMultiSample()); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING)); - if ( pes != 0 ) - { - if (!m_engine->GetShadowMapping()) - { - pes->SetVisibleValue(-1); - } - else if (!m_engine->GetShadowMappingOffscreen()) - { - pes->SetVisibleValue(0); - } - else - { - pes->SetVisibleValue(m_engine->GetShadowMappingOffscreenResolution()); - } - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING_QUALITY)); - if ( pc != 0 ) - { - pc->SetState(STATE_ENABLE, m_engine->GetShadowMapping()); - pc->SetState(STATE_CHECK, m_engine->GetShadowMapping() && m_engine->GetShadowMappingQuality()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW)); - if ( pc != 0 ) - { - pc->SetState(STATE_ENABLE, !m_engine->GetShadowMapping()); - pc->SetState(STATE_CHECK, !m_engine->GetShadowMapping() && m_engine->GetShadow()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_GROUND)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetGroundSpot()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_DIRTY)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetDirty()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FOG)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetFog()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_LENS)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetLensMode()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SKY)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetSkyMode()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_PLANET)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetPlanetMode()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_LIGHT)); - if ( pc != 0 ) - { - pc->SetState(STATE_CHECK, m_engine->GetLightMode()); - } - - pc = static_cast(pw->SearchControl(EVENT_INTERFACE_JOYSTICK)); - if ( pc != 0 ) - { - pc->SetState(STATE_ENABLE, m_app->GetJoystick().index >= 0); - pc->SetState(STATE_CHECK, m_app->GetJoystickEnabled()); - } - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_PARTI)); - if ( pv != 0 ) - { - value = m_engine->GetParticleDensity(); - pv->SetValue(value); - } - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_CLIP)); - if ( pv != 0 ) - { - value = m_engine->GetClippingDistance(); - pv->SetValue(value); - } - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_DETAIL)); - if ( pv != 0 ) - { - value = m_engine->GetObjectDetail(); - pv->SetValue(value); - } - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_GADGET)); - if ( pv != 0 ) - { - value = m_engine->GetGadgetQuantity(); - pv->SetValue(value); - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLSOUND)); - if ( ps != 0 ) - { - value = static_cast(m_sound->GetAudioVolume()); - ps->SetVisibleValue(value); - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLMUSIC)); - if ( ps != 0 ) - { - value = static_cast(m_sound->GetMusicVolume()); - ps->SetVisibleValue(value); - } -} - -// Updates the engine function of the buttons after the setup phase. - -void CMainDialog::ChangeSetupButtons() -{ - CWindow* pw; - CEditValue* pv; - CSlider* ps; - CEnumSlider* pes; - float value; - - pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if ( pw == 0 ) return; - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_PARTI)); - if ( pv != 0 ) - { - value = pv->GetValue(); - m_engine->SetParticleDensity(value); - } - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_CLIP)); - if ( pv != 0 ) - { - value = pv->GetValue(); - m_engine->SetClippingDistance(value); - } - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_DETAIL)); - if ( pv != 0 ) - { - value = pv->GetValue(); - m_engine->SetObjectDetail(value); - } - - pv = static_cast(pw->SearchControl(EVENT_INTERFACE_GADGET)); - if ( pv != 0 ) - { - value = pv->GetValue(); - m_engine->SetGadgetQuantity(value); - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLSOUND)); - if ( ps != 0 ) - { - value = ps->GetVisibleValue(); - m_sound->SetAudioVolume(static_cast(value)); - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLMUSIC)); - if ( ps != 0 ) - { - value = ps->GetVisibleValue(); - m_sound->SetMusicVolume(static_cast(value)); - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_INTERVAL)); - if ( ps != 0 ) - { - value = ps->GetVisibleValue(); - m_main->SetAutosaveInterval(static_cast(round(value))); - } - - ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_SLOTS)); - if ( ps != 0 ) - { - value = ps->GetVisibleValue(); - m_main->SetAutosaveSlots(static_cast(round(value))); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_FILTER)); - if ( pes != 0 ) - { - value = pes->GetVisibleValue(); - m_engine->SetTextureFilterMode(static_cast(value)); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_MIPMAP)); - if ( pes != 0 ) - { - value = pes->GetVisibleValue(); - m_engine->SetTextureMipmapLevel(static_cast(value)); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_ANISOTROPY)); - if ( pes != 0 ) - { - value = pes->GetVisibleValue(); - m_engine->SetTextureAnisotropyLevel(static_cast(value)); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_MSAA)); - if ( pes != 0 ) - { - value = pes->GetVisibleValue(); - m_engine->SetMultiSample(static_cast(value)); - } - - pes = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING)); - if ( pes != 0 ) - { - value = pes->GetVisibleValue(); - if(value == -1) - { - m_engine->SetShadowMapping(false); - } - else if(value == 0) - { - m_engine->SetShadowMapping(true); - m_engine->SetShadowMappingOffscreen(false); - } - else - { - m_engine->SetShadowMapping(true); - m_engine->SetShadowMappingOffscreen(true); - m_engine->SetShadowMappingOffscreenResolution(value); - } - } -} - - -// Changes the general level of quality. - -void CMainDialog::ChangeSetupQuality(int quality) -{ - bool bEnable; - float value; - - bEnable = true; //(quality >= 0); - m_engine->SetShadow(bEnable); - m_engine->SetGroundSpot(bEnable); - m_engine->SetDirty(bEnable); - m_engine->SetFog(bEnable); - m_engine->SetLensMode(bEnable); - m_engine->SetSkyMode(bEnable); - m_engine->SetPlanetMode(bEnable); - m_engine->SetLightMode(bEnable); - m_camera->SetOverBaseColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)); // TODO: color ok? - - if ( quality < 0 ) value = 0.0f; - if ( quality == 0 ) value = 1.0f; - if ( quality > 0 ) value = 2.0f; - m_engine->SetParticleDensity(value); - - if ( quality < 0 ) value = 0.5f; - if ( quality == 0 ) value = 1.0f; - if ( quality > 0 ) value = 2.0f; - m_engine->SetClippingDistance(value); - - if ( quality < 0 ) value = 0.0f; - if ( quality == 0 ) value = 1.0f; - if ( quality > 0 ) value = 2.0f; - m_engine->SetObjectDetail(value); - - if ( quality < 0 ) value = 0.5f; - if ( quality == 0 ) value = 1.0f; - if ( quality > 0 ) value = 1.0f; - m_engine->SetGadgetQuantity(value); - - if ( quality < 0 ) m_engine->SetMultiSample(1); - if ( quality == 0 ) m_engine->SetMultiSample(2); - if ( quality > 0 ) m_engine->SetMultiSample(4); - - if ( quality < 0 ) { m_engine->SetTextureFilterMode(Gfx::TEX_FILTER_BILINEAR); } - if ( quality == 0 ) { m_engine->SetTextureFilterMode(Gfx::TEX_FILTER_TRILINEAR); m_engine->SetTextureMipmapLevel(4); m_engine->SetTextureAnisotropyLevel(4); } - if ( quality > 0 ) { m_engine->SetTextureFilterMode(Gfx::TEX_FILTER_TRILINEAR); m_engine->SetTextureMipmapLevel(8); m_engine->SetTextureAnisotropyLevel(8); } - - if ( quality < 0 ) { m_engine->SetShadowMapping(false); m_engine->SetShadowMappingQuality(false); } - else { m_engine->SetShadowMapping(true); m_engine->SetShadowMappingQuality(true); m_engine->SetShadowMappingOffscreen(true); } - if ( quality == 0 ) m_engine->SetShadowMappingOffscreenResolution(1024); - if ( quality > 0 ) m_engine->SetShadowMappingOffscreenResolution(2048); - - // TODO: first execute adapt? - //m_engine->FirstExecuteAdapt(false); -} - -// Updates the list of keys. - -void CMainDialog::UpdateKey() -{ - CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if (pw == nullptr) return; - - CScroll* ps = static_cast(pw->SearchControl(EVENT_INTERFACE_KSCROLL)); - if (ps == nullptr) return; - - int first = static_cast(ps->GetVisibleValue()*(INPUT_SLOT_MAX-KEY_VISIBLE)); - - for (int i = 0; i < INPUT_SLOT_MAX; i++) - pw->DeleteControl(static_cast(EVENT_INTERFACE_KEY+i)); - - Math::Point dim; - dim.x = 400.0f/640.0f; - dim.y = 20.0f/480.0f; - Math::Point pos; - pos.x = 110.0f/640.0f; - pos.y = 168.0f/480.0f + dim.y*(KEY_VISIBLE-1); - for (int i = 0; i < KEY_VISIBLE; i++) - { - pw->CreateKey(pos, dim, -1, static_cast(EVENT_INTERFACE_KEY+first+i)); - CKey* pk = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_KEY+first+i))); - if (pk == nullptr) break; - - pk->SetBinding(CInput::GetInstancePointer()->GetInputBinding(static_cast(first+i))); - pos.y -= dim.y; - } -} - -// Change a key. - -void CMainDialog::ChangeKey(EventType event) -{ - CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); - if (pw == nullptr) return; - - CScroll* ps = static_cast(pw->SearchControl(EVENT_INTERFACE_KSCROLL)); - if (ps == nullptr) return; - - for (int i = 0; i < INPUT_SLOT_MAX; i++) - { - if ( EVENT_INTERFACE_KEY+i == event ) - { - CKey* pk = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_KEY+i))); - if (pk == nullptr) break; - - CInput::GetInstancePointer()->SetInputBinding(static_cast(i), pk->GetBinding()); - } - } -} - - - // Do you want to quit the current mission? void CMainDialog::StartAbort() @@ -5003,9 +922,9 @@ void CMainDialog::StartAbort() GetResource(RES_TEXT, RT_DIALOG_NO, name); pb->SetName(name); - if ( m_category == LevelCategory::Missions || // missions ? - m_category == LevelCategory::FreeGame || // free games? - m_category == LevelCategory::CustomLevels ) // user ? + if ( m_main->GetLevelCategory() == LevelCategory::Missions || // missions ? + m_main->GetLevelCategory() == LevelCategory::FreeGame || // free games? + m_main->GetLevelCategory() == LevelCategory::CustomLevels ) // user ? { pos.y = 0.62f; pb = pw->CreateButton(pos, dim, -1, EVENT_INTERFACE_WRITE); @@ -5156,7 +1075,7 @@ void CMainDialog::StartDialog(Math::Point dim, bool bFire, bool bOK, bool bCance CButton* pb; Math::Point pos, ddim; - StartSuspend(); + m_main->StartSuspend(); pw = static_cast(m_interface->SearchControl(EVENT_WINDOW0)); if ( pw != 0 ) pw->ClearState(STATE_ENABLE); @@ -5366,39 +1285,11 @@ void CMainDialog::StopDialog() pw = static_cast(m_interface->SearchControl(EVENT_WINDOW8)); if ( pw != 0 ) pw->SetState(STATE_ENABLE); - StopSuspend(); + m_main->StopSuspend(); m_interface->DeleteControl(EVENT_WINDOW9); m_bDialog = false; } -// Suspends the simulation for a dialog phase. - -void CMainDialog::StartSuspend() -{ - m_sound->MuteAll(true); - m_main->ClearInterface(); - m_bInitPause = m_pause->GetPauseType(); - m_pause->SetPause(PAUSE_DIALOG); - m_engine->SetOverFront(false); // over flat behind - m_main->CreateShortcuts(); - m_main->StartSuspend(); - m_initCamera = m_camera->GetType(); - m_camera->SetType(Gfx::CAM_TYPE_DIALOG); -} - -// Resume the simulation after a period of dialog. - -void CMainDialog::StopSuspend() -{ - m_sound->MuteAll(false); - m_main->ClearInterface(); - m_pause->SetPause(m_bInitPause); - m_engine->SetOverFront(true); // over flat front - m_main->CreateShortcuts(); - m_main->StopSuspend(); - m_camera->SetType(m_initCamera); -} - // Specifies whether a dialog is displayed. @@ -5412,71 +1303,46 @@ bool CMainDialog::IsDialog() bool CMainDialog::GetSceneSoluce() { - return m_bSceneSoluce; + return CScreenLevelList::GetSceneSoluce(); } bool CMainDialog::GetGamerOnlyHead() { - return (m_phase == PHASE_APPERANCE && m_apperanceTab == 0); + if (m_phase == PHASE_APPERANCE) + return static_cast(m_screen.get())->GetGamerOnlyHead(); + return false; } float CMainDialog::GetPersoAngle() { - return m_apperanceAngle; + if (m_phase == PHASE_APPERANCE) + return static_cast(m_screen.get())->GetPersoAngle(); + return 0.0f; } void CMainDialog::UpdateChapterPassed() { - // TODO: CMainDialog is a bad place for this function - bool bAll = true; - for ( int i=0 ; iGetPlayerProfile()->GetLevelPassed(m_category, m_chap[m_category]+1, i+1)) - { - bAll = false; - break; - } - } - m_main->GetPlayerProfile()->IncrementLevelTryCount(m_category, m_chap[m_category]+1, 0); - m_main->GetPlayerProfile()->SetLevelPassed(m_category, m_chap[m_category]+1, 0, bAll); + CScreenLevelList::UpdateChapterPassed(); } - -// Passes to the next mission, and possibly in the next chapter. - -bool CMainDialog::NextMission() +void CMainDialog::NextMission() { - m_sel[m_category] ++; // next mission - - if ( m_sel[m_category] >= m_maxList ) // last mission of the chapter? - { - m_chap[m_category] ++; // next chapter - m_sel[m_category] = 0; // first mission - } - - m_main->GetPlayerProfile()->SetSelectedChap(m_category, m_chap[m_category]+1); - m_main->GetPlayerProfile()->SetSelectedRank(m_category, m_sel[m_category]+1); - - return true; + CScreenLevelList::NextMission(); } -//TODO: Userlevel management should be probably moved out of CMainDialog, along with the listing of normal missions void CMainDialog::UpdateCustomLevelList() { - auto userLevelDirs = CResourceManager::ListDirectories("levels/custom/"); - std::sort(userLevelDirs.begin(), userLevelDirs.end()); - m_customLevelList = userLevelDirs; + CScreenLevelList::UpdateCustomLevelList(); } std::string CMainDialog::GetCustomLevelName(int id) { - if(id < 1 || id > m_customLevelList.size()) return ""; - return m_customLevelList[id-1]; + return CScreenLevelList::GetCustomLevelName(id); } const std::vector& CMainDialog::GetCustomLevelList() { - return m_customLevelList; + return CScreenLevelList::GetCustomLevelList(); } diff --git a/src/ui/maindialog.h b/src/ui/maindialog.h index 0ad0a948..55ba83a1 100644 --- a/src/ui/maindialog.h +++ b/src/ui/maindialog.h @@ -20,9 +20,9 @@ #include "app/pausemanager.h" -#include "graphics/core/color.h" +#include "common/singleton.h" -#include "graphics/engine/camera.h" +#include "graphics/core/color.h" #include "object/level_category.h" #include "object/robotmain.h" @@ -47,9 +47,11 @@ class CInterface; class CWindow; class CControl; +class CScreen; -class CMainDialog + +class CMainDialog : public CSingleton { public: CMainDialog(); @@ -71,11 +73,8 @@ public: void StopDialog(); bool IsDialog(); - void StartSuspend(); - void StopSuspend(); - void UpdateChapterPassed(); - bool NextMission(); + void NextMission(); bool GetGamerOnlyHead(); float GetPersoAngle(); @@ -93,35 +92,7 @@ protected: void GlintMove(); void FrameParticle(float rTime); void NiceParticle(Math::Point mouse, bool bPress); - void ReadNameList(); - void UpdateNameList(); - void UpdateNameEdit(); - void UpdateNameControl(); - void NameSelect(); - bool NameCreate(); - void NameDelete(); - void UpdatePerso(); - void CameraPerso(); - void FixPerso(int rank, int index); - void ColorPerso(); - void IOReadName(); - void IOReadList(); - void IOUpdateList(); - void IODeleteScene(); - void IOWriteScene(); - void IOReadScene(); int GetChapPassed(); - void UpdateSceneChap(int &chap); - void UpdateSceneList(int chap, int &sel); - void UpdateSceneResume(int chap, int rank); - void UpdateDisplayMode(); - void ChangeDisplay(); - void UpdateApply(); - void UpdateSetupButtons(); - void ChangeSetupButtons(); - void ChangeSetupQuality(int quality); - void UpdateKey(); - void ChangeKey(EventType event); protected: CApplication* m_app; @@ -135,35 +106,16 @@ protected: CPauseManager* m_pause; CSettings* m_settings; + std::unique_ptr m_screen; + Phase m_phase; // copy of CRobotMain - Phase m_phaseSetup; // tab selected - float m_phaseTime; - - int m_apperanceTab; // perso: tab selected - float m_apperanceAngle; // perso: angle of presentation - - LevelCategory m_category; - LevelCategory m_listCategory; - std::map m_chap; // selected chapter (0..8) - std::map m_sel; // chosen mission (0..98) - int m_maxList; - int m_accessChap; - bool m_bSceneSoluce; // shows the solution - bool m_bSimulSetup; // adjustment during the game - - std::vector m_customLevelList; int m_shotDelay; // number of frames before copy std::string m_shotName; // generate a file name - int m_setupSelMode; - bool m_setupFull; - Math::Point m_glintMouse; float m_glintTime; - int m_loadingCounter; - bool m_bDialog; // this dialogue? bool m_bDialogFire; // setting on fire? bool m_bDialogDelete; @@ -171,14 +123,10 @@ protected: Math::Point m_dialogDim; float m_dialogParti; float m_dialogTime; - PauseType m_bInitPause; - Gfx::CameraType m_initCamera; int m_partiPhase[10]; float m_partiTime[10]; Math::Point m_partiPos[10]; - - std::vector m_saveList; }; } // namespace Ui diff --git a/src/ui/screen/screen.cpp b/src/ui/screen/screen.cpp new file mode 100644 index 00000000..82acf3e2 --- /dev/null +++ b/src/ui/screen/screen.cpp @@ -0,0 +1,52 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen.h" + +#include "app/app.h" + +#include "graphics/engine/engine.h" + +#include "object/robotmain.h" + +namespace Ui { + +CRobotMain* CScreen::m_main = nullptr; + +CScreen::CScreen() +{ + m_main = CRobotMain::GetInstancePointer(); + m_interface = m_main->GetInterface(); + m_app = CApplication::GetInstancePointer(); + m_eventQueue = m_app->GetEventQueue(); + m_engine = Gfx::CEngine::GetInstancePointer(); + m_sound = m_app->GetSound(); +} + +void CScreen::SetBackground(const std::string& filename, bool scaled) +{ + m_engine->SetBackground(filename, + Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), + Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), + Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), + Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), + true, scaled); + m_engine->SetBackForce(true); +} + +} // namespace Ui diff --git a/src/ui/screen/screen.h b/src/ui/screen/screen.h new file mode 100644 index 00000000..a730ff98 --- /dev/null +++ b/src/ui/screen/screen.h @@ -0,0 +1,61 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "common/event.h" + +#include + +class CRobotMain; +class CApplication; +class CEventQueue; +class CSoundInterface; +namespace Gfx +{ +class CEngine; +} + +namespace Ui { + +class CInterface; + +class CScreen +{ +public: + CScreen(); + virtual void CreateInterface() = 0; + virtual bool EventProcess(const Event &event) = 0; + +protected: + void SetBackground(const std::string& filename, bool scaled = false); + +protected: + static CRobotMain* m_main; + CInterface* m_interface; + CApplication* m_app; + CEventQueue* m_eventQueue; + Gfx::CEngine* m_engine; + CSoundInterface* m_sound; + + const Math::Point dim = Math::Point(32.0f/640.0f, 32.0f/480.0f); + const float ox = 3.0f/640.0f, oy = 3.0f/480.0f; + const float sx = (32.0f+2.0f)/640.0f, sy = (32.0f+2.0f)/480.0f; +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_apperance.cpp b/src/ui/screen/screen_apperance.cpp new file mode 100644 index 00000000..6c3a015d --- /dev/null +++ b/src/ui/screen/screen_apperance.cpp @@ -0,0 +1,692 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_apperance.h" + +#include "app/app.h" + +#include "object/player_profile.h" +#include "object/robotmain.h" + +#include "graphics/engine/camera.h" + +#include "ui/button.h" +#include "ui/color.h" +#include "ui/interface.h" +#include "ui/label.h" +#include "ui/slider.h" +#include "ui/window.h" + +namespace Ui { + +static int perso_color[3*10*3] = +{ + // hair: + 193, 221, 226, // white + 255, 255, 181, // yellow + 204, 155, 84, // blond + 165, 48, 10, // red + 140, 75, 84, // brown + 83, 64, 51, // brown + 90, 95, 85, // black + 85, 48, 9, // brown + 60, 0, 23, // black + 0, 0, 0, // + // spacesuit: + 203, 206, 204, // dirty white + 0, 205, 203, // bluish + 108, 176, 0, // greenish + 207, 207, 32, // yellow + 170, 141, 0, // orange + 108, 84, 0, // brown + 0, 84, 136, // bluish + 56, 61, 146, // bluish + 56, 56, 56, // black + 0, 0, 0, // + // strips: + 255, 255, 255, // white + 255, 255, 0, // yellow + 255, 132, 1, // orange + 255, 0, 255, // magenta + 255, 0, 0, // red + 0, 255, 0, // green + 0, 255, 255, // cyan + 0, 0, 255, // blue + 70, 51, 84, // dark + 0, 0, 0, // +}; + +CScreenApperance::CScreenApperance() +{ +} + +void CScreenApperance::CreateInterface() +{ + CWindow* pw; + CLabel* pl; + CButton* pb; + CColor* pco; + CSlider* psl; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.10f; + pos.y = 0.10f; + ddim.x = 0.80f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); + GetResource(RES_TEXT, RT_TITLE_PERSO, name); + pw->SetName(name); + + pos.x = 0.10f; + pos.y = 0.40f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner + pos.x = 0.40f; + pos.y = 0.10f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + pos.x = 95.0f/640.0f; + pos.y = 108.0f/480.0f; + ddim.x = 220.0f/640.0f; + ddim.y = 274.0f/480.0f; + pw->CreateGroup(pos, ddim, 17, EVENT_NULL); // frame + + pos.x = 100.0f/640.0f; + pos.y = 364.0f/480.0f; + ddim.x = 210.0f/640.0f; + ddim.y = 14.0f/480.0f; + pw->CreateGroup(pos, ddim, 3, EVENT_NULL); // transparent -> gray + + pos.x = 120.0f/640.0f; + pos.y = 364.0f/480.0f; + ddim.x = 80.0f/640.0f; + ddim.y = 28.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PHEAD); + pb->SetState(STATE_SHADOW); + pb->SetState(STATE_CARD); + + pos.x = 210.0f/640.0f; + pos.y = 364.0f/480.0f; + ddim.x = 80.0f/640.0f; + ddim.y = 28.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PBODY); + pb->SetState(STATE_SHADOW); + pb->SetState(STATE_CARD); + + pos.x = 100.0f/640.0f; + pos.y = 354.0f/480.0f; + ddim.x = 210.0f/640.0f; + ddim.y = 10.0f/480.0f; + pw->CreateGroup(pos, ddim, 1, EVENT_INTERFACE_GLINTb); // orange bar + pos.x = 100.0f/640.0f; + pos.y = 154.0f/480.0f; + ddim.x = 210.0f/640.0f; + ddim.y = 200.0f/480.0f; + pw->CreateGroup(pos, ddim, 2, EVENT_INTERFACE_GLINTu); // orange -> transparent + + // Face + pos.x = 340.0f/640.0f; + pos.y = 356.0f/480.0f; + ddim.x = 200.0f/640.0f; + ddim.y = 16.0f/480.0f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, ""); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = 340.0f/640.0f; + pos.y = 312.0f/480.0f; + ddim.x = 44.0f/640.0f; + ddim.y = 44.0f/480.0f; + pb = pw->CreateButton(pos, ddim, 43, EVENT_INTERFACE_PFACE1); + pb->SetState(STATE_SHADOW); + pos.x += 50.0f/640.0f; + pb = pw->CreateButton(pos, ddim, 46, EVENT_INTERFACE_PFACE4); + pb->SetState(STATE_SHADOW); + pos.x += 50.0f/640.0f; + pb = pw->CreateButton(pos, ddim, 45, EVENT_INTERFACE_PFACE3); + pb->SetState(STATE_SHADOW); + pos.x += 50.0f/640.0f; + pb = pw->CreateButton(pos, ddim, 44, EVENT_INTERFACE_PFACE2); + pb->SetState(STATE_SHADOW); + + // Glasses + pos.x = 340.0f/640.0f; + pos.y = 270.0f/480.0f; + ddim.x = 200.0f/640.0f; + ddim.y = 16.0f/480.0f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, ""); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = 340.0f/640.0f; + pos.y = 240.0f/480.0f; + ddim.x = 30.0f/640.0f; + ddim.y = 30.0f/480.0f; + for ( int i=0 ; i<6 ; i++ ) + { + int ti[6] = {11, 179, 180, 181, 182, 183}; + pb = pw->CreateButton(pos, ddim, ti[i], static_cast(EVENT_INTERFACE_PGLASS0+i)); + pb->SetState(STATE_SHADOW); + pos.x += (30.0f+2.8f)/640.0f; + } + + // Color A + pos.x = 340.0f/640.0f; + pos.y = 300.0f/480.0f; + ddim.x = 200.0f/640.0f; + ddim.y = 16.0f/480.0f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL14, ""); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.y = 282.0f/480.0f; + ddim.x = 18.0f/640.0f; + ddim.y = 18.0f/480.0f; + for ( int j=0 ; j<3 ; j++ ) + { + pos.x = 340.0f/640.0f; + for ( int i=0 ; i<3 ; i++ ) + { + pco = pw->CreateColor(pos, ddim, -1, static_cast(EVENT_INTERFACE_PC0a+j*3+i)); + pco->SetState(STATE_SHADOW); + pos.x += 20.0f/640.0f; + } + pos.y -= 20.0f/480.0f; + } + + pos.x = 420.0f/640.0f; + pos.y = 282.0f/480.0f; + ddim.x = 100.0f/640.0f; + ddim.y = 18.0f/480.0f; + for ( int i=0 ; i<3 ; i++ ) + { + psl = pw->CreateSlider(pos, ddim, 0, static_cast(EVENT_INTERFACE_PCRa+i)); + psl->SetState(STATE_SHADOW); + psl->SetLimit(0.0f, 255.0f); + psl->SetArrowStep(16.0f); + pos.y -= 20.0f/480.0f; + } + + // Color B + pos.x = 340.0f/640.0f; + pos.y = 192.0f/480.0f; + ddim.x = 200.0f/640.0f; + ddim.y = 16.0f/480.0f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL13, ""); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.y = 174.0f/480.0f; + ddim.x = 18.0f/640.0f; + ddim.y = 18.0f/480.0f; + for ( int j=0 ; j<3 ; j++ ) + { + pos.x = 340.0f/640.0f; + for ( int i=0 ; i<3 ; i++ ) + { + pco = pw->CreateColor(pos, ddim, -1, static_cast(EVENT_INTERFACE_PC0b+j*3+i)); + pco->SetState(STATE_SHADOW); + pos.x += 20.0f/640.0f; + } + pos.y -= 20.0f/480.0f; + } + + pos.x = 420.0f/640.0f; + pos.y = 174.0f/480.0f; + ddim.x = 100.0f/640.0f; + ddim.y = 18.0f/480.0f; + for ( int i=0 ; i<3 ; i++ ) + { + psl = pw->CreateSlider(pos, ddim, 0, static_cast(EVENT_INTERFACE_PCRb+i)); + psl->SetState(STATE_SHADOW); + psl->SetLimit(0.0f, 255.0f); + psl->SetArrowStep(16.0f); + pos.y -= 20.0f/480.0f; + } + + // Rotation + pos.x = 100.0f/640.0f; + pos.y = 113.0f/480.0f; + ddim.x = 20.0f/640.0f; + ddim.y = 20.0f/480.0f; + pb = pw->CreateButton(pos, ddim, 55, EVENT_INTERFACE_PLROT); // < + pb->SetState(STATE_SHADOW); + pb->SetRepeat(true); + + pos.x = 290.0f/640.0f; + pos.y = 113.0f/480.0f; + ddim.x = 20.0f/640.0f; + ddim.y = 20.0f/480.0f; + pb = pw->CreateButton(pos, ddim, 48, EVENT_INTERFACE_PRROT); // > + pb->SetState(STATE_SHADOW); + pb->SetRepeat(true); + + pos.x = 100.0f/640.0f; + pos.y = 70.0f/480.0f; + ddim.x = 100.0f/640.0f; + ddim.y = 32.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_POK); + pb->SetState(STATE_SHADOW); + + pos.x = 210.0f/640.0f; + pos.y = 70.0f/480.0f; + ddim.x =100.0f/640.0f; + ddim.y = 32.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PCANCEL); + pb->SetState(STATE_SHADOW); + + pos.x = 340.0f/640.0f; + pos.y = 70.0f/480.0f; + ddim.x =194.0f/640.0f; + ddim.y = 32.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PDEF); + pb->SetState(STATE_SHADOW); + + m_apperanceTab = 0; + m_apperanceAngle = -0.6f; + m_main->GetPlayerProfile()->LoadApperance(); + UpdatePerso(); + m_main->ScenePerso(); + CameraPerso(); +} + +bool CScreenApperance::EventProcess(const Event &event) +{ + PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); + switch( event.type ) + { + case EVENT_KEY_DOWN: + if ( event.key.key == KEY(RETURN) ) + { + m_main->ChangePhase(PHASE_MAIN_MENU); + } + if ( event.key.key == KEY(ESCAPE) ) + { + m_main->ChangePhase(PHASE_PLAYER_SELECT); + } + break; + + case EVENT_INTERFACE_PHEAD: + m_apperanceTab = 0; + UpdatePerso(); + m_main->ScenePerso(); + CameraPerso(); + break; + case EVENT_INTERFACE_PBODY: + m_apperanceTab = 1; + UpdatePerso(); + m_main->ScenePerso(); + CameraPerso(); + break; + + case EVENT_INTERFACE_PFACE1: + case EVENT_INTERFACE_PFACE2: + case EVENT_INTERFACE_PFACE3: + case EVENT_INTERFACE_PFACE4: + apperance.face = event.type-EVENT_INTERFACE_PFACE1; + UpdatePerso(); + m_main->ScenePerso(); + break; + + case EVENT_INTERFACE_PGLASS0: + case EVENT_INTERFACE_PGLASS1: + case EVENT_INTERFACE_PGLASS2: + case EVENT_INTERFACE_PGLASS3: + case EVENT_INTERFACE_PGLASS4: + case EVENT_INTERFACE_PGLASS5: + case EVENT_INTERFACE_PGLASS6: + case EVENT_INTERFACE_PGLASS7: + case EVENT_INTERFACE_PGLASS8: + case EVENT_INTERFACE_PGLASS9: + apperance.glasses = event.type-EVENT_INTERFACE_PGLASS0; + UpdatePerso(); + m_main->ScenePerso(); + break; + + case EVENT_INTERFACE_PC0a: + case EVENT_INTERFACE_PC1a: + case EVENT_INTERFACE_PC2a: + case EVENT_INTERFACE_PC3a: + case EVENT_INTERFACE_PC4a: + case EVENT_INTERFACE_PC5a: + case EVENT_INTERFACE_PC6a: + case EVENT_INTERFACE_PC7a: + case EVENT_INTERFACE_PC8a: + case EVENT_INTERFACE_PC9a: + FixPerso(event.type-EVENT_INTERFACE_PC0a, 0); + UpdatePerso(); + m_main->ScenePerso(); + break; + + case EVENT_INTERFACE_PC0b: + case EVENT_INTERFACE_PC1b: + case EVENT_INTERFACE_PC2b: + case EVENT_INTERFACE_PC3b: + case EVENT_INTERFACE_PC4b: + case EVENT_INTERFACE_PC5b: + case EVENT_INTERFACE_PC6b: + case EVENT_INTERFACE_PC7b: + case EVENT_INTERFACE_PC8b: + case EVENT_INTERFACE_PC9b: + FixPerso(event.type-EVENT_INTERFACE_PC0b, 1); + UpdatePerso(); + m_main->ScenePerso(); + break; + + case EVENT_INTERFACE_PCRa: + case EVENT_INTERFACE_PCGa: + case EVENT_INTERFACE_PCBa: + case EVENT_INTERFACE_PCRb: + case EVENT_INTERFACE_PCGb: + case EVENT_INTERFACE_PCBb: + ColorPerso(); + UpdatePerso(); + m_main->ScenePerso(); + break; + + case EVENT_INTERFACE_PDEF: + apperance.DefPerso(); + UpdatePerso(); + m_main->ScenePerso(); + break; + + case EVENT_INTERFACE_PLROT: + m_apperanceAngle += 0.2f; + break; + case EVENT_INTERFACE_PRROT: + m_apperanceAngle -= 0.2f; + break; + + case EVENT_INTERFACE_POK: + m_main->GetPlayerProfile()->SaveApperance(); + m_main->ChangePhase(PHASE_MAIN_MENU); + break; + + case EVENT_INTERFACE_PCANCEL: + m_main->GetPlayerProfile()->LoadApperance(); // reload apperance from file + m_main->ChangePhase(PHASE_PLAYER_SELECT); + break; + + default: + return true; + } + return false; +} + +bool CScreenApperance::GetGamerOnlyHead() +{ + return m_apperanceTab == 0; +} + +float CScreenApperance::GetPersoAngle() +{ + return m_apperanceAngle; +} + +// Tests whether two colors are equal or nearly are. + +bool EqColor(const Gfx::Color &c1, const Gfx::Color &c2) +{ + return (fabs(c1.r-c2.r) < 0.01f && + fabs(c1.g-c2.g) < 0.01f && + fabs(c1.b-c2.b) < 0.01f ); +} + +// Updates all the buttons for the character. + +void CScreenApperance::UpdatePerso() +{ + CWindow* pw; + CLabel* pl; + CButton* pb; + CColor* pc; + CSlider* ps; + Gfx::Color color; + std::string name; + int i; + + PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_PHEAD)); + if ( pb != 0 ) + { + pb->SetState(STATE_CHECK, m_apperanceTab==0); + } + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_PBODY)); + if ( pb != 0 ) + { + pb->SetState(STATE_CHECK, m_apperanceTab==1); + } + + pl = static_cast(pw->SearchControl(EVENT_LABEL11)); + if ( pl != 0 ) + { + if ( m_apperanceTab == 0 ) + { + pl->SetState(STATE_VISIBLE); + GetResource(RES_TEXT, RT_PERSO_FACE, name); + pl->SetName(name); + } + else + { + pl->ClearState(STATE_VISIBLE); + } + } + + pl = static_cast(pw->SearchControl(EVENT_LABEL12)); + if ( pl != 0 ) + { + if ( m_apperanceTab == 0 ) + { + pl->SetState(STATE_VISIBLE); + GetResource(RES_TEXT, RT_PERSO_GLASSES, name); + pl->SetName(name); + } + else + { + pl->ClearState(STATE_VISIBLE); + } + } + + pl = static_cast(pw->SearchControl(EVENT_LABEL13)); + if ( pl != 0 ) + { + if ( m_apperanceTab == 0 ) GetResource(RES_TEXT, RT_PERSO_HAIR, name); + else GetResource(RES_TEXT, RT_PERSO_BAND, name); + pl->SetName(name); + } + + pl = static_cast(pw->SearchControl(EVENT_LABEL14)); + if ( pl != 0 ) + { + if ( m_apperanceTab == 0 ) + { + pl->ClearState(STATE_VISIBLE); + } + else + { + pl->SetState(STATE_VISIBLE); + GetResource(RES_TEXT, RT_PERSO_COMBI, name); + pl->SetName(name); + } + } + + for ( i=0 ; i<4 ; i++ ) + { + pb = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PFACE1+i))); + if ( pb == 0 ) break; + pb->SetState(STATE_VISIBLE, m_apperanceTab==0); + pb->SetState(STATE_CHECK, i==apperance.face); + } + + for ( i=0 ; i<10 ; i++ ) + { + pb = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PGLASS0+i))); + if ( pb == 0 ) break; + pb->SetState(STATE_VISIBLE, m_apperanceTab==0); + pb->SetState(STATE_CHECK, i==apperance.glasses); + } + + for ( i=0 ; i<3*3 ; i++ ) + { + pc = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PC0a+i))); + if ( pc == 0 ) break; + if ( m_apperanceTab == 0 ) + { + pc->ClearState(STATE_VISIBLE); + } + else + { + pc->SetState(STATE_VISIBLE); + color.r = perso_color[3*10*1+3*i+0]/255.0f; + color.g = perso_color[3*10*1+3*i+1]/255.0f; + color.b = perso_color[3*10*1+3*i+2]/255.0f; + color.a = 0.0f; + pc->SetColor(color); + pc->SetState(STATE_CHECK, EqColor(color, apperance.colorCombi)); + } + + pc = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PC0b+i))); + if ( pc == 0 ) break; + color.r = perso_color[3*10*2*m_apperanceTab+3*i+0]/255.0f; + color.g = perso_color[3*10*2*m_apperanceTab+3*i+1]/255.0f; + color.b = perso_color[3*10*2*m_apperanceTab+3*i+2]/255.0f; + color.a = 0.0f; + pc->SetColor(color); + pc->SetState(STATE_CHECK, EqColor(color, m_apperanceTab?apperance.colorBand:apperance.colorHair)); + } + + for ( i=0 ; i<3 ; i++ ) + { + ps = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_PCRa+i))); + if ( ps == 0 ) break; + ps->SetState(STATE_VISIBLE, m_apperanceTab==1); + } + + if ( m_apperanceTab == 1 ) + { + color = apperance.colorCombi; + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRa)); + if ( ps != 0 ) ps->SetVisibleValue(color.r*255.0f); + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGa)); + if ( ps != 0 ) ps->SetVisibleValue(color.g*255.0f); + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBa)); + if ( ps != 0 ) ps->SetVisibleValue(color.b*255.0f); + } + + if ( m_apperanceTab == 0 ) color = apperance.colorHair; + else color = apperance.colorBand; + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRb)); + if ( ps != 0 ) ps->SetVisibleValue(color.r*255.0f); + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGb)); + if ( ps != 0 ) ps->SetVisibleValue(color.g*255.0f); + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBb)); + if ( ps != 0 ) ps->SetVisibleValue(color.b*255.0f); +} + +// Updates the camera for the character. + +void CScreenApperance::CameraPerso() +{ + Gfx::CCamera* camera = m_main->GetCamera(); + + if ( m_apperanceTab == 0 ) + { +//? camera->Init(Math::Vector(4.0f, 0.0f, 0.0f), +//? Math::Vector(0.0f, 0.0f, 1.0f), 0.0f); + camera->Init(Math::Vector(6.0f, 0.0f, 0.0f), + Math::Vector(0.0f, 0.2f, 1.5f), 0.0f); + } + else + { + camera->Init(Math::Vector(18.0f, 0.0f, 4.5f), + Math::Vector(0.0f, 1.6f, 4.5f), 0.0f); + } + + camera->SetType(Gfx::CAM_TYPE_SCRIPT); + camera->FixCamera(); +} + +// Sets a fixed color. + +void CScreenApperance::FixPerso(int rank, int index) +{ + PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); + if ( m_apperanceTab == 0 ) + { + if ( index == 1 ) + { + apperance.colorHair.r = perso_color[3*10*0+rank*3+0]/255.0f; + apperance.colorHair.g = perso_color[3*10*0+rank*3+1]/255.0f; + apperance.colorHair.b = perso_color[3*10*0+rank*3+2]/255.0f; + } + } + if ( m_apperanceTab == 1 ) + { + if ( index == 0 ) + { + apperance.colorCombi.r = perso_color[3*10*1+rank*3+0]/255.0f; + apperance.colorCombi.g = perso_color[3*10*1+rank*3+1]/255.0f; + apperance.colorCombi.b = perso_color[3*10*1+rank*3+2]/255.0f; + } + if ( index == 1 ) + { + apperance.colorBand.r = perso_color[3*10*2+rank*3+0]/255.0f; + apperance.colorBand.g = perso_color[3*10*2+rank*3+1]/255.0f; + apperance.colorBand.b = perso_color[3*10*2+rank*3+2]/255.0f; + } + } +} + +// Updates the color of the character. + +void CScreenApperance::ColorPerso() +{ + CWindow* pw; + CSlider* ps; + Gfx::Color color; + + PlayerApperance& apperance = m_main->GetPlayerProfile()->GetApperance(); + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + + color.a = 0.0f; + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRa)); + if ( ps != 0 ) color.r = ps->GetVisibleValue()/255.0f; + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGa)); + if ( ps != 0 ) color.g = ps->GetVisibleValue()/255.0f; + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBa)); + if ( ps != 0 ) color.b = ps->GetVisibleValue()/255.0f; + if ( m_apperanceTab == 1 ) apperance.colorCombi = color; + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCRb)); + if ( ps != 0 ) color.r = ps->GetVisibleValue()/255.0f; + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCGb)); + if ( ps != 0 ) color.g = ps->GetVisibleValue()/255.0f; + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_PCBb)); + if ( ps != 0 ) color.b = ps->GetVisibleValue()/255.0f; + if ( m_apperanceTab == 0 ) apperance.colorHair = color; + else apperance.colorBand = color; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_apperance.h b/src/ui/screen/screen_apperance.h new file mode 100644 index 00000000..c7101104 --- /dev/null +++ b/src/ui/screen/screen_apperance.h @@ -0,0 +1,46 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +namespace Ui { + +class CScreenApperance : public CScreen +{ +public: + CScreenApperance(); + void CreateInterface(); + bool EventProcess(const Event &event); + + bool GetGamerOnlyHead(); + float GetPersoAngle(); + +protected: + void UpdatePerso(); + void CameraPerso(); + void FixPerso(int rank, int index); + void ColorPerso(); + +protected: + int m_apperanceTab; // perso: tab selected + float m_apperanceAngle; // perso: angle of presentation +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_io.cpp b/src/ui/screen/screen_io.cpp new file mode 100644 index 00000000..16e86773 --- /dev/null +++ b/src/ui/screen/screen_io.cpp @@ -0,0 +1,252 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_io.h" + +#include "common/logger.h" +#include "common/stringutils.h" + +#include "object/level/parser.h" + +#include "object/player_profile.h" +#include "object/robotmain.h" + +#include "ui/screen/screen_level_list.h" + +#include "ui/button.h" +#include "ui/edit.h" +#include "ui/interface.h" +#include "ui/image.h" +#include "ui/window.h" + +#include +#include + +namespace Ui { + +// Builds the file name by default. + +void CScreenIO::IOReadName() +{ + CWindow* pw; + CEdit* pe; + std::string resume; + char line[100]; + char name[100]; + time_t now; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == nullptr ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_IONAME)); + if ( pe == nullptr ) return; + + resume = GetLevelCategoryDir(m_main->GetLevelCategory()) + " " + StrUtils::ToString(m_main->GetLevelChap()); + + CLevelParser levelParser(m_main->GetLevelCategory(), m_main->GetLevelChap(), 0); + try + { + levelParser.Load(); + resume = levelParser.Get("Title")->GetParam("resume")->AsString(); + } + catch (CLevelParserException& e) + { + GetLogger()->Warn("%s\n", e.what()); + } + + time(&now); + TimeToAsciiClean(now, line); + sprintf(name, "%s - %s %d", line, resume.c_str(), m_main->GetLevelRank()); + + pe->SetText(name); + pe->SetCursor(strlen(name), 0); + m_interface->SetFocus(pe); +} + +// Updates the list of games recorded on disk. + +void CScreenIO::IOReadList(bool isWrite) +{ + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if (pw == nullptr) return; + CList* pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); + if (pl == nullptr) return; + + pl->Flush(); + + m_saveList.clear(); + for(const SavedScene& save : m_main->GetPlayerProfile()->GetSavedSceneList()) + { + pl->SetItemName(m_saveList.size(), save.name.c_str()); + m_saveList.push_back(save.path); + } + + // invalid index + if ( isWrite ) + { + std::string nameStr; + GetResource(RES_TEXT, RT_IO_NEW, nameStr); + pl->SetItemName(m_saveList.size(), nameStr.c_str()); + } + + pl->SetSelect(m_saveList.size()); + pl->ShowSelect(false); // shows the selected columns + + for (unsigned int i = 0; i < m_saveList.size(); i++) + { + m_engine->DeleteTexture(m_saveList.at(i) + "/screen.png"); + } +} + +// Updates the buttons according to the selected part in the list. + +void CScreenIO::IOUpdateList(bool isWrite) +{ + CWindow* pw; + CList* pl; + CButton* pb; + CImage* pi; + int sel, max; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == nullptr ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); + if ( pl == nullptr ) return; + pi = static_cast(pw->SearchControl(EVENT_INTERFACE_IOIMAGE)); + if ( pi == nullptr ) return; + + sel = pl->GetSelect(); + max = pl->GetTotal(); + + if (m_saveList.size() <= static_cast(sel)) + return; + + std::string filename = m_saveList.at(sel) + "/screen.png"; + if ( isWrite ) + { + if ( sel < max-1 ) + { + pi->SetFilenameImage(filename.c_str()); + } + else + { + pi->SetFilenameImage(""); + } + + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_IODELETE)); + if ( pb != nullptr ) + { + pb->SetState(STATE_ENABLE, sel < max-1); + } + } + else + { + pi->SetFilenameImage(filename.c_str()); + } +} + +// Deletes the selected scene. + +void CScreenIO::IODeleteScene() +{ + CWindow* pw; + CList* pl; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); + if ( pl == 0 ) return; + + int sel = pl->GetSelect(); + if (sel < 0 || sel >= static_cast(m_saveList.size())) return; + + if (!m_main->GetPlayerProfile()->DeleteScene(m_saveList.at(sel))) + { + m_sound->Play(SOUND_TZOING); + return; + } +} + +// clears filename only to leave letter or numbers +std::string clearName(char *name) +{ + std::string ret; + int len = strlen(name); + for (int i = 0; i < len; i++) + { + if (isalnum(name[i])) + { + ret += name[i]; + } + } + return ret; +} + + +// Writes the scene. +void CScreenIO::IOWriteScene() +{ + CWindow* pw; + CList* pl; + CEdit* pe; + char info[100]; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == nullptr ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); + if ( pl == nullptr ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_IONAME)); + if ( pe == nullptr ) return; + + int sel = pl->GetSelect(); + if ( sel == -1 ) return; + + std::string dir; + pe->GetText(info, 100); + if (static_cast(sel) >= m_saveList.size()) + { + dir = m_main->GetPlayerProfile()->GetSaveFile("save"+clearName(info)); + } + else + { + dir = m_saveList.at(sel); + } + + m_main->GetPlayerProfile()->SaveScene(dir, info); +} + +// Reads the scene. + +void CScreenIO::IOReadScene() +{ + CWindow* pw; + CList* pl; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == nullptr ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_IOLIST)); + if ( pl == nullptr ) return; + + int sel = pl->GetSelect(); + if (sel < 0 || sel >= static_cast(m_saveList.size())) return; + + m_main->GetPlayerProfile()->LoadScene(m_saveList.at(sel)); + + CScreenLevelList::SetSelection(m_main->GetLevelCategory(), m_main->GetLevelChap()-1, m_main->GetLevelRank()-1); +} + +} // namespace Ui diff --git a/src/ui/screen/screen_io.h b/src/ui/screen/screen_io.h new file mode 100644 index 00000000..3369cdd8 --- /dev/null +++ b/src/ui/screen/screen_io.h @@ -0,0 +1,42 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +#include +#include + +namespace Ui { + +class CScreenIO : public CScreen +{ +protected: + void IOReadName(); + void IOReadList(bool isWrite); + void IOUpdateList(bool isWrite); + void IODeleteScene(); + void IOWriteScene(); + void IOReadScene(); + +protected: + std::vector m_saveList; +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_io_read.cpp b/src/ui/screen/screen_io_read.cpp new file mode 100644 index 00000000..a478d2ca --- /dev/null +++ b/src/ui/screen/screen_io_read.cpp @@ -0,0 +1,170 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_io_read.h" + +#include "app/app.h" + +#include "ui/button.h" +#include "ui/interface.h" +#include "ui/image.h" +#include "ui/list.h" +#include "ui/window.h" + +namespace Ui { + +CScreenIORead::CScreenIORead(bool inSimulation) +: m_inSimulation(inSimulation) +{ +} + +void CScreenIORead::CreateInterface() +{ + CWindow* pw; + CButton* pb; + CList* pli; + CImage* pi; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.10f; + pos.y = 0.10f; + ddim.x = 0.80f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 14, EVENT_WINDOW5); + pw->SetClosable(true); + GetResource(RES_TEXT, RT_TITLE_READ, name); + pw->SetName(name); + + pos.x = 0.10f; + pos.y = 0.40f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner + pos.x = 0.40f; + pos.y = 0.10f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + pos.x = 290.0f/640.0f; + ddim.x = 245.0f/640.0f; + + pos.y = 160.0f/480.0f; + ddim.y = 190.0f/480.0f; + pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_IOLIST); + pli->SetState(STATE_SHADOW); + + pos.y = oy+sy*2; + ddim.y = dim.y*1; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IOREAD); + pb->SetState(STATE_SHADOW); + if ( m_inSimulation ) + { + pb->SetState(STATE_WARNING); + } + + pos.x = 105.0f/640.0f; + pos.y = 160.0f/480.0f; + ddim.x = 170.0f/640.0f; + ddim.y = dim.y*1; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IODELETE); + pb->SetState(STATE_SHADOW); + + pos.x = 105.0f/640.0f; + pos.y = 220.0f/480.0f; + ddim.x = 170.0f/640.0f; + ddim.y = 128.0f/480.0f; + pi = pw->CreateImage(pos, ddim, 0, EVENT_INTERFACE_IOIMAGE); + pi->SetState(STATE_SHADOW); + + ddim.x = dim.x*4; + ddim.y = dim.y*1; + pos.x = ox+sx*3; + pos.y = oy+sy*2; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); + pb->SetState(STATE_SHADOW); + + IOReadList(false); + IOUpdateList(false); + + if ( !m_inSimulation ) + { + SetBackground("textures/interface/interface.png"); + } +} + +bool CScreenIORead::EventProcess(const Event &event) +{ + if (!m_inSimulation) + { + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return false; + + if ( event.type == pw->GetEventTypeClose() || + event.type == EVENT_INTERFACE_BACK || + (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) + { + m_main->ChangePhase(PHASE_LEVEL_LIST); + return false; + } + } + else + { + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return false; + + if ( event.type == pw->GetEventTypeClose() || + event.type == EVENT_INTERFACE_BACK || + (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) + { + m_interface->DeleteControl(EVENT_WINDOW5); + m_main->ChangePhase(PHASE_SIMUL); + m_main->StopSuspend(); + return false; + } + } + + if ( event.type == EVENT_INTERFACE_IOLIST ) + { + IOUpdateList(false); + return false; + } + if ( event.type == EVENT_INTERFACE_IODELETE ) + { + IODeleteScene(); + IOReadList(false); + IOUpdateList(false); + return false; + } + + if ( event.type == EVENT_INTERFACE_IOREAD ) + { + IOReadScene(); + if(m_inSimulation) + { + m_main->StopSuspend(); + m_main->ChangePhase(PHASE_LOADING); + } + return false; + } + + return true; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_io_read.h b/src/ui/screen/screen_io_read.h new file mode 100644 index 00000000..76f333f3 --- /dev/null +++ b/src/ui/screen/screen_io_read.h @@ -0,0 +1,36 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen_io.h" + +namespace Ui { + +class CScreenIORead : public CScreenIO +{ +public: + CScreenIORead(bool inSimulation); + void CreateInterface(); + bool EventProcess(const Event &event); + +protected: + bool m_inSimulation; +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_io_write.cpp b/src/ui/screen/screen_io_write.cpp new file mode 100644 index 00000000..6740ff0e --- /dev/null +++ b/src/ui/screen/screen_io_write.cpp @@ -0,0 +1,160 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_io_write.h" + +#include "app/app.h" + +#include "ui/button.h" +#include "ui/edit.h" +#include "ui/interface.h" +#include "ui/image.h" +#include "ui/label.h" +#include "ui/list.h" +#include "ui/window.h" + +namespace Ui { + +CScreenIOWrite::CScreenIOWrite() +{ +} + +void CScreenIOWrite::CreateInterface() +{ + CWindow* pw; + CButton* pb; + CList* pli; + CLabel* pl; + CImage* pi; + CEdit* pe; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.10f; + pos.y = 0.10f; + ddim.x = 0.80f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 13, EVENT_WINDOW5); + pw->SetClosable(true); + GetResource(RES_TEXT, RT_TITLE_WRITE, name); + pw->SetName(name); + + pos.x = 0.10f; + pos.y = 0.40f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner + pos.x = 0.40f; + pos.y = 0.10f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + pos.x = 290.0f/640.0f; + ddim.x = 245.0f/640.0f; + + pos.y = 146.0f/480.0f; + ddim.y = 18.0f/480.0f; + GetResource(RES_EVENT, EVENT_INTERFACE_IOLABEL, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_INTERFACE_IOLABEL, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.y = 130.0f/480.0f; + ddim.y = 18.0f/480.0f; + pe = pw->CreateEdit(pos, ddim, 0, EVENT_INTERFACE_IONAME); + pe->SetState(STATE_SHADOW); + pe->SetFontType(Gfx::FONT_COLOBOT); + pe->SetMaxChar(35); + IOReadName(); + + pos.y = 190.0f/480.0f; + ddim.y = 190.0f/480.0f; + pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_IOLIST); + pli->SetState(STATE_SHADOW); + + pos.y = oy+sy*2; + ddim.y = dim.y*1; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IOWRITE); + pb->SetState(STATE_SHADOW); + + pos.x = 105.0f/640.0f; + pos.y = 190.0f/480.0f; + ddim.x = 170.0f/640.0f; + ddim.y = dim.y*1; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_IODELETE); + pb->SetState(STATE_SHADOW); + + pos.x = 105.0f/640.0f; + pos.y = 250.0f/480.0f; + ddim.x = 170.0f/640.0f; + ddim.y = 128.0f/480.0f; + pi = pw->CreateImage(pos, ddim, 0, EVENT_INTERFACE_IOIMAGE); + pi->SetState(STATE_SHADOW); + + ddim.x = dim.x*4; + ddim.y = dim.y*1; + pos.x = ox+sx*3; + pos.y = oy+sy*2; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); + pb->SetState(STATE_SHADOW); + + IOReadList(true); + IOUpdateList(true); +} + +bool CScreenIOWrite::EventProcess(const Event &event) +{ + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return false; + + if ( event.type == pw->GetEventTypeClose() || + event.type == EVENT_INTERFACE_BACK || + (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) + { + m_interface->DeleteControl(EVENT_WINDOW5); + m_main->ChangePhase(PHASE_SIMUL); + m_main->StopSuspend(); + return false; + } + + if ( event.type == EVENT_INTERFACE_IOLIST ) + { + IOUpdateList(true); + return false; + } + if ( event.type == EVENT_INTERFACE_IODELETE ) + { + IODeleteScene(); + IOReadList(true); + IOUpdateList(true); + return false; + } + + if ( event.type == EVENT_INTERFACE_IOWRITE ) + { + IOWriteScene(); + m_interface->DeleteControl(EVENT_WINDOW5); + m_main->ChangePhase(PHASE_SIMUL); + m_main->StopSuspend(); + return false; + } + + return true; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_io_write.h b/src/ui/screen/screen_io_write.h new file mode 100644 index 00000000..2bd27f0b --- /dev/null +++ b/src/ui/screen/screen_io_write.h @@ -0,0 +1,33 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen_io.h" + +namespace Ui { + +class CScreenIOWrite : public CScreenIO +{ +public: + CScreenIOWrite(); + void CreateInterface(); + bool EventProcess(const Event &event); +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_level_list.cpp b/src/ui/screen/screen_level_list.cpp new file mode 100644 index 00000000..c9211392 --- /dev/null +++ b/src/ui/screen/screen_level_list.cpp @@ -0,0 +1,598 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_level_list.h" + +#include "app/app.h" + +#include "common/resources/resourcemanager.h" + +#include "common/settings.h" + +#include "object/level/parser.h" + +#include "object/player_profile.h" + +#include "ui/button.h" +#include "ui/check.h" +#include "ui/edit.h" +#include "ui/interface.h" +#include "ui/label.h" +#include "ui/list.h" +#include "ui/window.h" + +namespace Ui { + +LevelCategory CScreenLevelList::m_category; +LevelCategory CScreenLevelList::m_listCategory = LevelCategory::Missions; +std::map CScreenLevelList::m_chap; +std::map CScreenLevelList::m_sel; +int CScreenLevelList::m_maxList = 0; +bool CScreenLevelList::m_bSceneSoluce = 0; +std::vector CScreenLevelList::m_customLevelList; + +CScreenLevelList::CScreenLevelList(LevelCategory category) +{ + m_category = category; + + if ( static_cast(m_category) >= static_cast(LevelCategory::Max) ) + { + m_category = m_listCategory; + } + else + { + m_listCategory = m_category; + } +} + +void CScreenLevelList::CreateInterface() +{ + CWindow* pw; + CEdit* pe; + CLabel* pl; + CButton* pb; + CCheck* pc; + CList* pli; + Math::Point pos, ddim; + int res; + std::string name; + + if ( m_category == LevelCategory::FreeGame ) + { + m_accessChap = m_main->GetPlayerProfile()->GetChapPassed(LevelCategory::Missions); + } + + pos.x = 0.10f; + pos.y = 0.10f; + ddim.x = 0.80f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); + pw->SetClosable(true); + if ( m_category == LevelCategory::Exercises ) res = RT_TITLE_TRAINER; + if ( m_category == LevelCategory::Challenges ) res = RT_TITLE_DEFI; + if ( m_category == LevelCategory::Missions ) res = RT_TITLE_MISSION; + if ( m_category == LevelCategory::FreeGame ) res = RT_TITLE_FREE; + if ( m_category == LevelCategory::CustomLevels ) res = RT_TITLE_USER; + GetResource(RES_TEXT, res, name); + pw->SetName(name); + + pos.x = 0.10f; + pos.y = 0.40f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner + pos.x = 0.40f; + pos.y = 0.10f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + // Displays a list of chapters: + pos.x = ox+sx*3; + pos.y = oy+sy*10.5f; + ddim.x = dim.x*7.5f; + ddim.y = dim.y*0.6f; + if ( m_category == LevelCategory::Exercises ) res = RT_PLAY_CHAPt; + if ( m_category == LevelCategory::Challenges ) res = RT_PLAY_CHAPd; + if ( m_category == LevelCategory::Missions ) res = RT_PLAY_CHAPm; + if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_CHAPf; + if ( m_category == LevelCategory::CustomLevels ) res = RT_PLAY_CHAPu; + GetResource(RES_TEXT, res, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.y = oy+sy*6.7f; + ddim.y = dim.y*4.5f; + ddim.x = dim.x*6.5f; + pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_CHAP); + pli->SetState(STATE_SHADOW); + m_chap[m_category] = m_main->GetPlayerProfile()->GetSelectedChap(m_category)-1; + UpdateSceneChap(m_chap[m_category]); + if ( m_category != LevelCategory::CustomLevels ) pli->SetState(STATE_EXTEND); + + // Displays a list of missions: + pos.x = ox+sx*9.5f; + pos.y = oy+sy*10.5f; + ddim.x = dim.x*7.5f; + ddim.y = dim.y*0.6f; + if ( m_category == LevelCategory::Exercises ) res = RT_PLAY_LISTt; + if ( m_category == LevelCategory::Challenges ) res = RT_PLAY_LISTd; + if ( m_category == LevelCategory::Missions ) res = RT_PLAY_LISTm; + if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_LISTf; + if ( m_category == LevelCategory::CustomLevels ) res = RT_PLAY_LISTu; + GetResource(RES_TEXT, res, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.y = oy+sy*6.7f; + ddim.y = dim.y*4.5f; + ddim.x = dim.x*6.5f; + pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_LIST); + pli->SetState(STATE_SHADOW); + m_sel[m_category] = m_main->GetPlayerProfile()->GetSelectedRank(m_category)-1; + UpdateSceneList(m_chap[m_category], m_sel[m_category]); + if ( m_category != LevelCategory::CustomLevels ) pli->SetState(STATE_EXTEND); + pos = pli->GetPos(); + ddim = pli->GetDim(); + + // Displays the summary: + pos.x = ox+sx*3; + pos.y = oy+sy*5.4f; + ddim.x = dim.x*6.5f; + ddim.y = dim.y*0.6f; + GetResource(RES_TEXT, RT_PLAY_RESUME, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL13, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*3; + pos.y = oy+sy*3.6f; + ddim.x = dim.x*13.4f; + ddim.y = dim.y*1.9f; + pe = pw->CreateEdit(pos, ddim, 0, EVENT_INTERFACE_RESUME); + pe->SetState(STATE_SHADOW); + pe->SetMaxChar(500); + pe->SetEditCap(false); // just to see + pe->SetHighlightCap(false); + + // Button displays the "soluce": + if ( m_category != LevelCategory::Exercises && + m_category != LevelCategory::FreeGame ) + { + pos.x = ox+sx*9.5f; + pos.y = oy+sy*5.8f; + ddim.x = dim.x*6.5f; + ddim.y = dim.y*0.5f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SOLUCE); + pc->SetState(STATE_SHADOW); + pc->ClearState(STATE_CHECK); + } + m_bSceneSoluce = false; + + UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1); + + if ( m_category == LevelCategory::Missions || + m_category == LevelCategory::FreeGame || + m_category == LevelCategory::CustomLevels ) + { + pos.x = ox+sx*9.5f; + pos.y = oy+sy*2; + ddim.x = dim.x*3.7f; + ddim.y = dim.y*1; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PLAY); + pb->SetState(STATE_SHADOW); + if ( m_maxList == 0 ) + { + pb->ClearState(STATE_ENABLE); + } + + pos.x += dim.x*4.0f; + ddim.x = dim.x*2.5f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_READ); + pb->SetState(STATE_SHADOW); + if ( !m_main->GetPlayerProfile()->HasAnySavedScene() ) // no file to read? + { + pb->ClearState(STATE_ENABLE); + } + } + else + { + pos.x = ox+sx*9.5f; + pos.y = oy+sy*2; + ddim.x = dim.x*6.5f; + ddim.y = dim.y*1; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PLAY); + pb->SetState(STATE_SHADOW); + if ( m_maxList == 0 ) + { + pb->ClearState(STATE_ENABLE); + } + } + + pos.x = ox+sx*3; + ddim.x = dim.x*4; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); + pb->SetState(STATE_SHADOW); + + SetBackground("textures/interface/interface.png"); +} + +bool CScreenLevelList::EventProcess(const Event &event) +{ + CWindow* pw; + CList* pl; + CButton* pb; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return false; + + if ( event.type == pw->GetEventTypeClose() || + event.type == EVENT_INTERFACE_BACK || + (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) + { + m_main->ChangePhase(PHASE_MAIN_MENU); + return false; + } + + switch( event.type ) + { + case EVENT_INTERFACE_CHAP: + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_CHAP)); + if ( pl == 0 ) break; + m_chap[m_category] = pl->GetSelect(); + m_main->GetPlayerProfile()->SetSelectedChap(m_category, m_chap[m_category]+1); + UpdateSceneList(m_chap[m_category], m_sel[m_category]); + UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1); + break; + + case EVENT_INTERFACE_LIST: + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_LIST)); + if ( pl == 0 ) break; + m_sel[m_category] = pl->GetSelect(); + m_main->GetPlayerProfile()->SetSelectedRank(m_category, m_sel[m_category]+1); + UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1); + break; + + case EVENT_INTERFACE_SOLUCE: + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE)); + if ( pb == 0 ) break; + m_bSceneSoluce = !m_bSceneSoluce; + pb->SetState(STATE_CHECK, m_bSceneSoluce); + break; + + case EVENT_INTERFACE_PLAY: + m_main->SetLevel(m_category, m_chap[m_category]+1, m_sel[m_category]+1); + m_main->ChangePhase(PHASE_LOADING); + break; + + case EVENT_INTERFACE_READ: + m_main->ChangePhase(PHASE_READ); + break; + + default: + return true; + } + return false; +} + +void CScreenLevelList::SetSelection(LevelCategory category, int chap, int rank) +{ + m_chap[category] = chap; + m_sel[category] = rank; +} + +// Updates the lists according to the cheat code. + +void CScreenLevelList::AllMissionUpdate() +{ + UpdateSceneChap(m_chap[m_category]); + UpdateSceneList(m_chap[m_category], m_sel[m_category]); +} + +// Whether to show the solution. + +bool CScreenLevelList::GetSceneSoluce() +{ + return m_bSceneSoluce; +} + +// Updates the chapters of exercises or missions. + +void CScreenLevelList::UpdateSceneChap(int &chap) +{ + CWindow* pw; + CList* pl; + + std::string fileName; + char line[500]; + bool bPassed; + + memset(line, 0, 500); + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_CHAP)); + if ( pl == 0 ) return; + + pl->Flush(); + + unsigned int j; + if ( m_category == LevelCategory::CustomLevels ) + { + UpdateCustomLevelList(); + + for ( j=0 ; jSetItemName(j, levelParser.Get("Title")->GetParam("text")->AsString().c_str()); + pl->SetEnable(j, true); + } + catch (CLevelParserException& e) + { + pl->SetItemName(j, (std::string("[ERROR]: ")+e.what()).c_str()); + pl->SetEnable(j, false); + } + } + } + else + { + for ( j=0 ; jGetParam("text")->AsString().c_str()); + } + catch (CLevelParserException& e) + { + sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); + } + + bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, j+1, 0); + pl->SetItemName(j, line); + pl->SetCheck(j, bPassed); + pl->SetEnable(j, true); + + if ( m_category == LevelCategory::Missions && !m_main->GetShowAll() && !bPassed ) + { + j ++; + break; + } + + if ( m_category == LevelCategory::FreeGame && j == m_accessChap ) + { + j ++; + break; + } + } + } + + if ( chap > j-1 ) chap = j-1; + + pl->SetSelect(chap); + pl->ShowSelect(false); // shows the selected columns +} + +// Updates the list of exercises or missions. + +void CScreenLevelList::UpdateSceneList(int chap, int &sel) +{ + CWindow* pw; + CList* pl; + std::string fileName; + char line[500]; + int j; + bool bPassed; + + memset(line, 0, 500); + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_LIST)); + if ( pl == 0 ) return; + + pl->Flush(); + + bool readAll = true; + for ( j=0 ; jGetParam("text")->AsString().c_str()); + } + catch (CLevelParserException& e) + { + sprintf(line, "%s", (std::string("[ERROR]: ")+e.what()).c_str()); + } + + bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, chap+1, j+1); + pl->SetItemName(j, line); + pl->SetCheck(j, bPassed); + pl->SetEnable(j, true); + + if ( m_category == LevelCategory::Missions && !m_main->GetShowAll() && !bPassed ) + { + readAll = false; + } + } + + if (readAll) + { + m_maxList = j; + } + else + { + m_maxList = j+1; // this is not the last! + } + + if ( sel > j-1 ) sel = j-1; + + pl->SetSelect(sel); + pl->ShowSelect(false); // shows the selected columns +} + +// Updates the button "solution" according to cheat code. + +void CScreenLevelList::ShowSoluceUpdate() +{ + CWindow* pw; + CEdit* pe; + CCheck* pc; + + m_bSceneSoluce = false; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_RESUME)); + if ( pe == 0 ) return; + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE)); + if ( pc == 0 ) return; + + if ( m_main->GetShowSoluce() ) + { + pc->SetState(STATE_VISIBLE); + pc->SetState(STATE_CHECK); + m_bSceneSoluce = true; + } + else + { + pc->ClearState(STATE_VISIBLE); + pc->ClearState(STATE_CHECK); + m_bSceneSoluce = false; + } +} + +// Updates a summary of exercise or mission. + +void CScreenLevelList::UpdateSceneResume(int chap, int rank) +{ + CWindow* pw; + CEdit* pe; + CCheck* pc; + std::string fileName; + int numTry; + bool bPassed, bVisible; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_RESUME)); + if ( pe == 0 ) return; + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE)); + + if ( pc == 0 ) + { + m_bSceneSoluce = false; + } + else + { + numTry = m_main->GetPlayerProfile()->GetLevelTryCount(m_category, chap, rank); + bPassed = m_main->GetPlayerProfile()->GetLevelPassed(m_category, chap, rank); + bVisible = ( numTry > 2 || bPassed || m_main->GetShowSoluce() ); + if ( !CSettings::GetInstancePointer()->GetSoluce4() ) bVisible = false; + pc->SetState(STATE_VISIBLE, bVisible); + if ( !bVisible ) + { + pc->ClearState(STATE_CHECK); + m_bSceneSoluce = false; + } + } + + if(chap == 0 || rank == 0) return; + + try + { + CLevelParser levelParser(m_category, chap, rank); + levelParser.Load(); + pe->SetText(levelParser.Get("Resume")->GetParam("text")->AsString().c_str()); + } + catch (CLevelParserException& e) + { + pe->SetText((std::string("[ERROR]: ")+e.what()).c_str()); + } +} + +void CScreenLevelList::UpdateChapterPassed() +{ + // TODO: CScreenLevelList is a bad place for this function + bool bAll = true; + for ( int i=0 ; iGetPlayerProfile()->GetLevelPassed(m_category, m_chap[m_category]+1, i+1)) + { + bAll = false; + break; + } + } + m_main->GetPlayerProfile()->IncrementLevelTryCount(m_category, m_chap[m_category]+1, 0); + m_main->GetPlayerProfile()->SetLevelPassed(m_category, m_chap[m_category]+1, 0, bAll); +} + + +// Passes to the next mission, and possibly in the next chapter. + +void CScreenLevelList::NextMission() +{ + m_sel[m_category] ++; // next mission + + if ( m_sel[m_category] >= m_maxList ) // last mission of the chapter? + { + m_chap[m_category] ++; // next chapter + m_sel[m_category] = 0; // first mission + } + + m_main->GetPlayerProfile()->SetSelectedChap(m_category, m_chap[m_category]+1); + m_main->GetPlayerProfile()->SetSelectedRank(m_category, m_sel[m_category]+1); +} + +// TODO: Separate class for userlevels? +void CScreenLevelList::UpdateCustomLevelList() +{ + auto userLevelDirs = CResourceManager::ListDirectories("levels/custom/"); + std::sort(userLevelDirs.begin(), userLevelDirs.end()); + m_customLevelList = userLevelDirs; +} + +std::string CScreenLevelList::GetCustomLevelName(int id) +{ + if(id < 1 || id > m_customLevelList.size()) return ""; + return m_customLevelList[id-1]; +} + +const std::vector& CScreenLevelList::GetCustomLevelList() +{ + return m_customLevelList; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_level_list.h b/src/ui/screen/screen_level_list.h new file mode 100644 index 00000000..bce5ab92 --- /dev/null +++ b/src/ui/screen/screen_level_list.h @@ -0,0 +1,71 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +#include "object/level_category.h" + +#include +#include + +namespace Ui { + +class CScreenLevelList : public CScreen +{ +public: + CScreenLevelList(LevelCategory category); + void CreateInterface(); + bool EventProcess(const Event &event); + + static void SetSelection(LevelCategory category, int chap, int rank); + + static bool GetSceneSoluce(); + + void AllMissionUpdate(); + void ShowSoluceUpdate(); + + static void UpdateChapterPassed(); + static void NextMission(); + + static void UpdateCustomLevelList(); + static std::string GetCustomLevelName(int id); + static const std::vector& GetCustomLevelList(); + +protected: + void UpdateSceneChap(int &chap); + void UpdateSceneList(int chap, int &sel); + void UpdateSceneResume(int chap, int rank); + +protected: + static LevelCategory m_category; + static LevelCategory m_listCategory; + + static bool m_bSceneSoluce; + + static std::map m_chap; // selected chapter (0..8) + static std::map m_sel; // chosen mission (0..98) + static int m_maxList; + + static std::vector m_customLevelList; + + int m_accessChap; +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_loading.cpp b/src/ui/screen/screen_loading.cpp new file mode 100644 index 00000000..bfcc218f --- /dev/null +++ b/src/ui/screen/screen_loading.cpp @@ -0,0 +1,93 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_loading.h" + +#include "app/app.h" + +#include "ui/button.h" +#include "ui/edit.h" +#include "ui/interface.h" +#include "ui/label.h" +#include "ui/window.h" + +namespace Ui { + +CScreenLoading::CScreenLoading() +{ +} + +void CScreenLoading::CreateInterface() +{ + CWindow* pw; + CLabel* pl; + CGroup* pg; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.35f; + pos.y = 0.10f; + ddim.x = 0.30f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 10, EVENT_WINDOW5); + + pw->SetName(" "); + + pos.x = 0.35f; + pos.y = 0.60f; + ddim.x = 0.30f; + ddim.y = 0.30f; + pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner + pos.x = 0.35f; + pos.y = 0.10f; + ddim.x = 0.30f; + ddim.y = 0.30f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + pos.x = 254.0f/640.0f; + pos.y = 208.0f/480.0f; + ddim.x = 132.0f/640.0f; + ddim.y = 42.0f/480.0f; + pg = pw->CreateGroup(pos, ddim, 22, EVENT_NULL); + pg->SetState(STATE_SHADOW); + + pos.x = 220.0f/640.0f; + pos.y = 210.0f/480.0f; + ddim.x = 200.0f/640.0f; + ddim.y = 20.0f/480.0f; + GetResource(RES_TEXT, RT_DIALOG_LOADING, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); + pl->SetFontSize(12.0f); + pl->SetTextAlign(Gfx::TEXT_ALIGN_CENTER); + + SetBackground("textures/interface/interface.png"); + + m_loadingCounter = 1; // enough time to display! +} + +bool CScreenLoading::EventProcess(const Event &event) +{ + if ( m_loadingCounter == 0 ) + { + m_main->ChangePhase(PHASE_SIMUL); + } + m_loadingCounter --; + return true; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_loading.h b/src/ui/screen/screen_loading.h new file mode 100644 index 00000000..1b557dda --- /dev/null +++ b/src/ui/screen/screen_loading.h @@ -0,0 +1,36 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +namespace Ui { + +class CScreenLoading : public CScreen +{ +public: + CScreenLoading(); + void CreateInterface(); + bool EventProcess(const Event &event); + +protected: + int m_loadingCounter; +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_main_menu.cpp b/src/ui/screen/screen_main_menu.cpp new file mode 100644 index 00000000..6843a7c4 --- /dev/null +++ b/src/ui/screen/screen_main_menu.cpp @@ -0,0 +1,221 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_main_menu.h" + +#include "app/app.h" + +#include "common/logger.h" + +#include "object/level/parser.h" + +#include "ui/screen/screen_setup.h" + +#include "ui/button.h" +#include "ui/group.h" +#include "ui/interface.h" +#include "ui/label.h" +#include "ui/window.h" + +namespace Ui { + +CScreenMainMenu::CScreenMainMenu() +{ +} + +void CScreenMainMenu::CreateInterface() +{ + CWindow* pw; + CLabel* pl; + CButton* pb; + CGroup* pg; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.35f; + pos.y = 0.10f; + ddim.x = 0.30f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 10, EVENT_WINDOW5); + + GetResource(RES_TEXT, RT_TITLE_INIT, name); + pw->SetName(name); + + pos.x = 0.35f; + pos.y = 0.60f; + ddim.x = 0.30f; + ddim.y = 0.30f; + pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner + pos.x = 0.35f; + pos.y = 0.10f; + ddim.x = 0.30f; + ddim.y = 0.30f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + ddim.x = 0.20f; + ddim.y = dim.y*2.4f; + pos.x = 0.40f; + pos.y = oy+sy*9.1f; + pg = pw->CreateGroup(pos, ddim, 23, EVENT_LABEL1); // yellow + pg->SetState(STATE_SHADOW); + pos.y = oy+sy*6.8f; + pg = pw->CreateGroup(pos, ddim, 24, EVENT_LABEL1); // orange + pg->SetState(STATE_SHADOW); + pos.y = oy+sy*3.9f; + pg = pw->CreateGroup(pos, ddim, 25, EVENT_LABEL1); // orange + pg->SetState(STATE_SHADOW); + ddim.y = dim.y*1.2f; + pos.y = oy+sy*1.9f; + pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // red + pg->SetState(STATE_SHADOW); + + ddim.x = 0.18f; + ddim.y = dim.y*1; + pos.x = 0.41f; + + pos.y = oy+sy*10.3f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MISSION); + pb->SetState(STATE_SHADOW); + + pos.y = oy+sy*9.2f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_FREE); + pb->SetState(STATE_SHADOW); + + pos.y = oy+sy*8.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_TRAINER); + pb->SetState(STATE_SHADOW); + + pos.y = oy+sy*6.9f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_DEFI); + pb->SetState(STATE_SHADOW); + + pos.y = oy+sy*5.1f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUP); + pb->SetState(STATE_SHADOW); + + pos.y = oy+sy*4.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NAME); + pb->SetState(STATE_SHADOW); + + pos.y = oy+sy*2.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_QUIT); + pb->SetState(STATE_SHADOW); + + pos.x = 447.0f/640.0f; + pos.y = 313.0f/480.0f; + ddim.x = 0.09f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_USER); + pb->SetState(STATE_SHADOW); + + try + { + CLevelParser levelParser("levels/custom/config.txt"); + if (levelParser.Exists()) + { + levelParser.Load(); + CLevelParserLine* line = levelParser.Get("Button"); + if (line->GetParam("name")->IsDefined()) + pb->SetName(line->GetParam("name")->AsString()); + if (line->GetParam("tooltip")->IsDefined()) + pb->SetTooltip(line->GetParam("tooltip")->AsString()); + } + } + catch (CLevelParserException& e) + { + GetLogger()->Error("Failed loading userlevel button name: %s\n", e.what()); + } + + /*pos.x = 139.0f/640.0f; + pos.y = 313.0f/480.0f; + ddim.x = 0.09f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PROTO); + pb->SetState(STATE_SHADOW);*/ + + pos.x = 0.40f; + ddim.x = 0.20f; + pos.y = 26.0f/480.0f; + ddim.y = 12.0f/480.0f; + pg = pw->CreateGroup(pos, ddim, 1, EVENT_LABEL1); + pg->SetState(STATE_SHADOW); + pos.y -= 5.0f/480.0f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, "TerranovaTeam"); + pl->SetFontType(Gfx::FONT_COURIER); + pl->SetFontSize(Gfx::FONT_SIZE_SMALL); + + SetBackground("textures/interface/interface.png"); +} + +bool CScreenMainMenu::EventProcess(const Event &event) +{ + switch( event.type ) + { + case EVENT_KEY_DOWN: + if ( event.key.key == KEY(ESCAPE) ) + { + m_sound->Play(SOUND_TZOING); + m_main->ChangePhase(PHASE_QUIT_SCREEN); + return false; + } + return true; + break; + + case EVENT_INTERFACE_QUIT: + m_sound->Play(SOUND_TZOING); + m_main->ChangePhase(PHASE_QUIT_SCREEN); + break; + + case EVENT_INTERFACE_TRAINER: + m_main->SetLevel(LevelCategory::Exercises, 0, 0); + m_main->ChangePhase(PHASE_LEVEL_LIST); + break; + + case EVENT_INTERFACE_DEFI: + m_main->SetLevel(LevelCategory::Challenges, 0, 0); + m_main->ChangePhase(PHASE_LEVEL_LIST); + break; + + case EVENT_INTERFACE_MISSION: + m_main->SetLevel(LevelCategory::Missions, 0, 0); + m_main->ChangePhase(PHASE_LEVEL_LIST); + break; + + case EVENT_INTERFACE_FREE: + m_main->SetLevel(LevelCategory::FreeGame, 0, 0); + m_main->ChangePhase(PHASE_LEVEL_LIST); + break; + + case EVENT_INTERFACE_USER: + m_main->SetLevel(LevelCategory::CustomLevels, 0, 0); + m_main->ChangePhase(PHASE_LEVEL_LIST); + break; + + case EVENT_INTERFACE_SETUP: + m_main->ChangePhase(CScreenSetup::GetSetupTab()); + break; + + case EVENT_INTERFACE_NAME: + m_main->ChangePhase(PHASE_PLAYER_SELECT); + break; + + default: + return true; + } + return false; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_main_menu.h b/src/ui/screen/screen_main_menu.h new file mode 100644 index 00000000..ab979e40 --- /dev/null +++ b/src/ui/screen/screen_main_menu.h @@ -0,0 +1,33 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +namespace Ui { + +class CScreenMainMenu : public CScreen +{ +public: + CScreenMainMenu(); + void CreateInterface(); + bool EventProcess(const Event &event); +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_player_select.cpp b/src/ui/screen/screen_player_select.cpp new file mode 100644 index 00000000..2e37dade --- /dev/null +++ b/src/ui/screen/screen_player_select.cpp @@ -0,0 +1,457 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_player_select.h" + +#include "app/app.h" + +#include "common/logger.h" + +#include "object/player_profile.h" + +#include "ui/button.h" +#include "ui/edit.h" +#include "ui/interface.h" +#include "ui/label.h" +#include "ui/list.h" +#include "ui/maindialog.h" +#include "ui/window.h" + +namespace Ui { + +CScreenPlayerSelect::CScreenPlayerSelect() +{ +} + +void CScreenPlayerSelect::CreateInterface() +{ + CWindow* pw; + CEdit* pe; + CLabel* pl; + CButton* pb; + CList* pli; + CGroup* pg; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.10f; + pos.y = 0.10f; + ddim.x = 0.80f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); + GetResource(RES_TEXT, RT_TITLE_NAME, name); + pw->SetName(name); + + pos.x = 0.10f; + pos.y = 0.40f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 5, EVENT_INTERFACE_GLINTl); // orange corner + pos.x = 0.40f; + pos.y = 0.10f; + ddim.x = 0.50f; + ddim.y = 0.50f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + pos.x = 60.0f/640.0f; + pos.y = 313.0f/480.0f; + ddim.x = 120.0f/640.0f; + ddim.y = 32.0f/480.0f; + GetResource(RES_EVENT, EVENT_INTERFACE_NLABEL, name); + pl = pw->CreateLabel(pos, ddim, -1, EVENT_INTERFACE_NLABEL, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_RIGHT); + + pos.x = 200.0f/640.0f; + pos.y = 320.0f/480.0f; + ddim.x = 160.0f/640.0f; + ddim.y = 32.0f/480.0f; + pg = pw->CreateGroup(pos, ddim, 7, EVENT_LABEL1); + pg->SetState(STATE_SHADOW); + + pos.x = 207.0f/640.0f; + pos.y = 328.0f/480.0f; + ddim.x = 144.0f/640.0f; + ddim.y = 18.0f/480.0f; + pe = pw->CreateEdit(pos, ddim, 0, EVENT_INTERFACE_NEDIT); + pe->SetMaxChar(15); + if(m_main->GetPlayerProfile() != nullptr) + { + name = m_main->GetPlayerProfile()->GetName(); + } + else + { + name = CPlayerProfile::GetLastName(); + } + pe->SetText(name.c_str()); + pe->SetCursor(name.length(), 0); + m_interface->SetFocus(pe); + + pos.x = 380.0f/640.0f; + pos.y = 320.0f/480.0f; + ddim.x =100.0f/640.0f; + ddim.y = 32.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NOK); + pb->SetState(STATE_SHADOW); + + pos.x = 380.0f/640.0f; + pos.y = 250.0f/480.0f; + ddim.x =100.0f/640.0f; + ddim.y = 52.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PERSO); + pb->SetState(STATE_SHADOW); + + pos.x = 200.0f/640.0f; + pos.y = 150.0f/480.0f; + ddim.x = 160.0f/640.0f; + ddim.y = 160.0f/480.0f; + pli = pw->CreateList(pos, ddim, 0, EVENT_INTERFACE_NLIST); + pli->SetState(STATE_SHADOW); + + pos.x = 200.0f/640.0f; + pos.y = 100.0f/480.0f; + ddim.x = 160.0f/640.0f; + ddim.y = 32.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NDELETE); + pb->SetState(STATE_SHADOW); + + pos.x = 380.0f/640.0f; + pos.y = 100.0f/480.0f; + ddim.x =100.0f/640.0f; + ddim.y = 32.0f/480.0f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NCANCEL); + pb->SetState(STATE_SHADOW); + + ReadNameList(); + UpdateNameList(); + UpdateNameControl(); + + SetBackground("textures/interface/interface.png"); +} + +bool CScreenPlayerSelect::EventProcess(const Event &event) +{ + CWindow* pw; + CButton* pb; + CList* pl; + + switch( event.type ) + { + case EVENT_KEY_DOWN: + if ( event.key.key == KEY(RETURN) ) + { + NameSelect(); + } + if ( event.key.key == KEY(ESCAPE) ) + { + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) break; + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NCANCEL)); + if ( pb == 0 ) break; + if ( pb->TestState(STATE_ENABLE) ) + { + m_main->ChangePhase(PHASE_MAIN_MENU); + } + } + break; + + case EVENT_INTERFACE_NEDIT: + UpdateNameList(); + UpdateNameControl(); + break; + + case EVENT_INTERFACE_NLIST: + UpdateNameEdit(); + break; + + case EVENT_INTERFACE_NOK: + NameSelect(); + break; + + case EVENT_INTERFACE_PERSO: + NameSelect(); + m_main->ChangePhase(PHASE_APPERANCE); + break; + + case EVENT_INTERFACE_NCANCEL: + m_main->ChangePhase(PHASE_MAIN_MENU); + break; + + case EVENT_INTERFACE_NDELETE: + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) break; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); + if ( pl == 0 ) break; + CMainDialog::GetInstancePointer()->StartDeleteGame(pl->GetItemName(pl->GetSelect())); + break; + + default: + return true; + } + return false; +} + +// Updates the list of players after checking the files on disk. + +void CScreenPlayerSelect::ReadNameList() +{ + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if (pw == nullptr) return; + CList* pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); + if (pl == nullptr) return; + pl->Flush(); + + auto players = CPlayerProfile::GetPlayerList(); + for (int i = 0; i < static_cast(players.size()); ++i) + { + pl->SetItemName(i, players.at(i).c_str()); + } +} + +// Updates the controls of the players. + +void CScreenPlayerSelect::UpdateNameControl() +{ + CWindow* pw; + CList* pl; + CButton* pb; + CEdit* pe; + char name[100]; + int total, sel; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); + if ( pl == 0 ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); + if ( pe == 0 ) return; + + std::string gamer = m_main->GetPlayerProfile()->GetName(); + total = pl->GetTotal(); + sel = pl->GetSelect(); + pe->GetText(name, 100); + + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NCANCEL)); + if ( pb != 0 ) + { + pb->SetState(STATE_ENABLE, !gamer.empty()); + } + + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NDELETE)); + if ( pb != 0 ) + { + pb->SetState(STATE_ENABLE, total>0 && sel!=-1); + } + + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_NOK)); + if ( pb != 0 ) + { + pb->SetState(STATE_ENABLE, name[0]!=0 || sel!=-1); + } + + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_PERSO)); + if ( pb != 0 ) + { + pb->SetState(STATE_ENABLE, name[0]!=0 || sel!=-1); + } +} + +// Updates the list of players by name frape. + +void CScreenPlayerSelect::UpdateNameList() +{ + CWindow* pw; + CList* pl; + CEdit* pe; + char name[100]; + int total, i; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); + if ( pl == 0 ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); + if ( pe == 0 ) return; + + pe->GetText(name, 100); + total = pl->GetTotal(); + + for ( i=0 ; iGetItemName(i)) == 0 ) + { + pl->SetSelect(i); + pl->ShowSelect(false); + return; + } + } + + pl->SetSelect(-1); +} + +// Updates the player's name and function of the selected list. + +void CScreenPlayerSelect::UpdateNameEdit() +{ + CWindow* pw; + CList* pl; + CEdit* pe; + char* name; + int sel; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); + if ( pl == 0 ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); + if ( pe == 0 ) return; + + sel = pl->GetSelect(); + if ( sel == -1 ) + { + pe->SetText(""); + pe->SetCursor(0, 0); + } + else + { + name = pl->GetItemName(sel); + pe->SetText(name); + pe->SetCursor(strlen(name), 0); + } + + UpdateNameControl(); +} + +// Selects a player. + +void CScreenPlayerSelect::NameSelect() +{ + CWindow* pw; + CList* pl; + CEdit* pe; + char name[100]; + int sel; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); + if ( pl == 0 ) return; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); + if ( pe == 0 ) return; + + pe->GetText(name, 100); + sel = pl->GetSelect(); + + if ( sel == -1 ) + { + NameCreate(); + } + else + { + m_main->SelectPlayer(pl->GetItemName(sel)); + } + + m_main->ChangePhase(PHASE_MAIN_MENU); +} + +// Creates a new player. + +bool CScreenPlayerSelect::NameCreate() +{ + CWindow* pw; + CEdit* pe; + char name[100]; + char c; + int len, i, j; + + GetLogger()->Info("Creating new player\n"); + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return false; + pe = static_cast(pw->SearchControl(EVENT_INTERFACE_NEDIT)); + if ( pe == 0 ) return false; + + pe->GetText(name, 100); + if ( name[0] == 0 ) + { + m_sound->Play(SOUND_TZOING); + return false; + } + + len = strlen(name); + j = 0; + for ( i=0 ; i= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + c == ' ' || + c == '-' || + c == '_' || + c == '.' || + c == ',' || + c == '\'' ) + { + name[j++] = name[i]; + } + } + name[j] = 0; + if ( j == 0 ) + { + m_sound->Play(SOUND_TZOING); + return false; + } + + m_main->SelectPlayer(name); + m_main->GetPlayerProfile()->Create(); + + return true; +} + +// Removes a player. + +void CScreenPlayerSelect::NameDelete() +{ + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if (pw == nullptr) return; + CList* pl = static_cast(pw->SearchControl(EVENT_INTERFACE_NLIST)); + if (pl == nullptr) return; + + int sel = pl->GetSelect(); + if (sel == -1) + { + m_sound->Play(SOUND_TZOING); + return; + } + + char* gamer = pl->GetItemName(sel); + + m_main->SelectPlayer(gamer); + if (!m_main->GetPlayerProfile()->Delete()) + { + m_sound->Play(SOUND_TZOING); + return; + } + + pl->SetSelect(-1); + + ReadNameList(); + UpdateNameList(); + UpdateNameControl(); +} + +} // namespace Ui diff --git a/src/ui/screen/screen_player_select.h b/src/ui/screen/screen_player_select.h new file mode 100644 index 00000000..7976ce1f --- /dev/null +++ b/src/ui/screen/screen_player_select.h @@ -0,0 +1,43 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +namespace Ui { + +class CScreenPlayerSelect : public CScreen +{ +public: + CScreenPlayerSelect(); + void CreateInterface(); + bool EventProcess(const Event &event); + + void NameDelete(); // called by CMainDialog + +protected: + void ReadNameList(); + void UpdateNameList(); + void UpdateNameEdit(); + void UpdateNameControl(); + void NameSelect(); + bool NameCreate(); +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_quit.cpp b/src/ui/screen/screen_quit.cpp new file mode 100644 index 00000000..7195168d --- /dev/null +++ b/src/ui/screen/screen_quit.cpp @@ -0,0 +1,133 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_quit.h" + +#include "app/app.h" + +#include "ui/button.h" +#include "ui/edit.h" +#include "ui/interface.h" +#include "ui/label.h" +#include "ui/window.h" + +namespace Ui { + +CScreenQuit::CScreenQuit() +{ +} + +void CScreenQuit::CreateInterface() +{ + CWindow* pw; + CEdit* pe; + CLabel* pl; + CButton* pb; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.0f; + pos.y = 0.0f; + ddim.x = 0.0f; + ddim.y = 0.0f; + pw = m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); + + pos.x = 80.0f/640.0f; + pos.y = 190.0f/480.0f; + ddim.x = 490.0f/640.0f; + ddim.y = 160.0f/480.0f; + pe = pw->CreateEdit(pos, ddim, 0, EVENT_EDIT1); + pe->SetGenericMode(true); + pe->SetEditCap(false); + pe->SetHighlightCap(false); + pe->SetFontType(Gfx::FONT_COURIER); + pe->SetFontSize(Gfx::FONT_SIZE_SMALL); + pe->ReadText(std::string("help/") + m_app->GetLanguageChar() + std::string("/authors.txt")); + + pos.x = 40.0f/640.0f; + pos.y = 83.0f/480.0f; + ddim.x = 246.0f/640.0f; + ddim.y = 16.0f/480.0f; + GetResource(RES_TEXT, RT_GENERIC_DEV1, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); + pl->SetFontType(Gfx::FONT_COURIER); + pl->SetFontSize(Gfx::FONT_SIZE_SMALL); + + pos.y = 13.0f/480.0f; + GetResource(RES_TEXT, RT_GENERIC_DEV2, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name); + pl->SetFontType(Gfx::FONT_COURIER); + pl->SetFontSize(Gfx::FONT_SIZE_SMALL); + + pos.x = 355.0f/640.0f; + pos.y = 83.0f/480.0f; + ddim.x = 246.0f/640.0f; + ddim.y = 16.0f/480.0f; + GetResource(RES_TEXT, RT_GENERIC_EDIT1, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL3, name); + pl->SetFontType(Gfx::FONT_COURIER); + pl->SetFontSize(Gfx::FONT_SIZE_SMALL); + + pos.y = 13.0f/480.0f; + GetResource(RES_TEXT, RT_GENERIC_EDIT2, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL4, name); + pl->SetFontType(Gfx::FONT_COURIER); + pl->SetFontSize(Gfx::FONT_SIZE_SMALL); + + pos.x = 306.0f/640.0f; + pos.y = 17.0f/480.0f; + ddim.x = 30.0f/640.0f; + ddim.y = 30.0f/480.0f; + pb = pw->CreateButton(pos, ddim, 49, EVENT_INTERFACE_ABORT); + pb->SetState(STATE_SHADOW); + + SetBackground("textures/interface/generico.png"); +} + +bool CScreenQuit::EventProcess(const Event &event) +{ + if ( event.type == EVENT_INTERFACE_ABORT ) + { + m_main->ChangePhase(PHASE_MAIN_MENU); + return false; + } + + if ( event.type == EVENT_KEY_DOWN ) + { + if ( event.key.key == KEY(ESCAPE) ) + { + m_main->ChangePhase(PHASE_MAIN_MENU); + return false; + } + else + { + m_eventQueue->AddEvent(Event(EVENT_QUIT)); + return false; + } + } + + if ( event.type == EVENT_MOUSE_BUTTON_DOWN ) + { + m_eventQueue->AddEvent(Event(EVENT_QUIT)); + return false; + } + + return true; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_quit.h b/src/ui/screen/screen_quit.h new file mode 100644 index 00000000..5e8b75f2 --- /dev/null +++ b/src/ui/screen/screen_quit.h @@ -0,0 +1,33 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +namespace Ui { + +class CScreenQuit : public CScreen +{ +public: + CScreenQuit(); + void CreateInterface(); + bool EventProcess(const Event &event); +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_setup.cpp b/src/ui/screen/screen_setup.cpp new file mode 100644 index 00000000..34a0f3a5 --- /dev/null +++ b/src/ui/screen/screen_setup.cpp @@ -0,0 +1,1673 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_setup.h" + +#include "common/config.h" + +#include "app/app.h" + +#include "common/settings.h" +#include "common/stringutils.h" + +#include "graphics/engine/camera.h" + +#include "ui/button.h" +#include "ui/check.h" +#include "ui/color.h" +#include "ui/editvalue.h" +#include "ui/group.h" +#include "ui/interface.h" +#include "ui/key.h" +#include "ui/label.h" +#include "ui/list.h" +#include "ui/scroll.h" +#include "ui/slider.h" +#include "ui/window.h" + +namespace Ui { + +const int KEY_VISIBLE = 6; // number of visible keys redefinable + +Phase CScreenSetup::m_tab = PHASE_SETUPg; + +CScreenSetup::CScreenSetup(Phase tab, bool simulationSetup) +{ + m_settings = CSettings::GetInstancePointer(); + m_camera = m_main->GetCamera(); + + m_tab = tab; + m_simulationSetup = simulationSetup; + + //TODO: Move to CreateInterface? + std::vector modes; + m_app->GetVideoResolutionList(modes, true, true); + for (auto it = modes.begin(); it != modes.end(); ++it) + { + if (it->x == m_app->GetVideoConfig().size.x && it->y == m_app->GetVideoConfig().size.y) + { + m_setupSelMode = it - modes.begin(); + break; + } + } + m_setupFull = m_app->GetVideoConfig().fullScreen; +} + +//TODO: Split this futher to separate class for each tab +void CScreenSetup::CreateInterface() +{ + CWindow* pw; + CEditValue* pv; + CLabel* pl; + CList* pli; + CCheck* pc; + CScroll* ps; + CSlider* psl; + CEnumSlider* pes; + CButton* pb; + CGroup* pg; + Math::Point pos, ddim; + std::string name; + + pos.x = 0.10f; + pos.y = 0.10f; + ddim.x = 0.80f; + ddim.y = 0.80f; + pw = m_interface->CreateWindows(pos, ddim, 12, EVENT_WINDOW5); + pw->SetClosable(true); + GetResource(RES_TEXT, RT_TITLE_SETUP, name); + pw->SetName(name); + + pos.x = 0.70f; + pos.y = 0.10f; + ddim.x = 0.20f; + ddim.y = 0.20f; + pw->CreateGroup(pos, ddim, 4, EVENT_INTERFACE_GLINTr); // blue corner + + pos.x = 0.10f; + ddim.x = 0.80f; + pos.y = 0.76f; + ddim.y = 0.05f; + pw->CreateGroup(pos, ddim, 3, EVENT_NULL); // transparent -> gray + + ddim.x = 0.78f/5-0.01f; + ddim.y = 0.06f; + pos.x = 0.115f; + pos.y = 0.76f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPd); + pb->SetState(STATE_SHADOW); + pb->SetState(STATE_CARD); + pb->SetState(STATE_CHECK, (m_tab == PHASE_SETUPd)); + #if PLATFORM_WINDOWS + pb->SetState(STATE_ENABLE, !m_simulationSetup); + #endif + + pos.x += ddim.x+0.01f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPg); + pb->SetState(STATE_SHADOW); + pb->SetState(STATE_CARD); + pb->SetState(STATE_CHECK, (m_tab == PHASE_SETUPg)); + + pos.x += ddim.x+0.01f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPp); + pb->SetState(STATE_SHADOW); + pb->SetState(STATE_CARD); + pb->SetState(STATE_CHECK, (m_tab == PHASE_SETUPp)); + + pos.x += ddim.x+0.01f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPc); + pb->SetState(STATE_SHADOW); + pb->SetState(STATE_CARD); + pb->SetState(STATE_CHECK, (m_tab == PHASE_SETUPc)); + + pos.x += ddim.x+0.01f; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SETUPs); + pb->SetState(STATE_SHADOW); + pb->SetState(STATE_CARD); + pb->SetState(STATE_CHECK, (m_tab == PHASE_SETUPs)); + + pos.x = 0.10f; + ddim.x = 0.80f; + pos.y = 0.34f; + ddim.y = 0.42f; + pw->CreateGroup(pos, ddim, 2, EVENT_INTERFACE_GLINTu); // orange -> transparent + pos.x = 0.10f+(6.0f/640.0f); + ddim.x = 0.80f-(11.0f/640.0f); + pos.y = 0.74f; + ddim.y = 0.02f; + pw->CreateGroup(pos, ddim, 1, EVENT_INTERFACE_GLINTb); // orange bar + + ddim.x = dim.x*4; + ddim.y = dim.y*1; + pos.x = ox+sx*3; + pos.y = oy+sy*2; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_BACK); + pb->SetState(STATE_SHADOW); + + if ( !m_simulationSetup ) + { + SetBackground("textures/interface/interface.png"); + } + + if ( m_tab == PHASE_SETUPd ) // setup/display ? + { + pos.x = ox+sx*3; + pos.y = oy+sy*9; + ddim.x = dim.x*6; + ddim.y = dim.y*1; + GetResource(RES_TEXT, RT_SETUP_MODE, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + m_setupFull = m_app->GetVideoConfig().fullScreen; + pos.x = ox+sx*3; + pos.y = oy+sy*5.2f; + ddim.x = dim.x*6; + ddim.y = dim.y*4.5f; + pli = pw->CreateList(pos, ddim, 0, EVENT_LIST2); + pli->SetState(STATE_SHADOW); + UpdateDisplayMode(); + + ddim.x = dim.x*4; + ddim.y = dim.y*0.5f; + pos.x = ox+sx*3; + pos.y = oy+sy*4.1f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_FULL); + pc->SetState(STATE_SHADOW); + pc->SetState(STATE_CHECK, m_setupFull); + + #if !PLATFORM_LINUX + ddim.x = 0.9f; + ddim.y = 0.1f; + pos.x = 0.05f; + pos.y = 0.20f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, "The game will be restarted in order to apply changes. All unsaved progress will be lost."); + #endif + + ddim.x = dim.x*6; + ddim.y = dim.y*1; + pos.x = ox+sx*10; + pos.y = oy+sy*2; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_APPLY); + pb->SetState(STATE_SHADOW); + UpdateApply(); + } + + if ( m_tab == PHASE_SETUPg ) // setup/graphic ? + { + ddim.x = dim.x*6; + ddim.y = dim.y*0.5f; + pos.x = ox+sx*3; + pos.y = 0.65f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SHADOW); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_GROUND); + pc->SetState(STATE_SHADOW); + if ( m_simulationSetup ) + { + pc->SetState(STATE_DEAD); + } + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_DIRTY); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SKY); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_LENS); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_PLANET); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_FOG); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_LIGHT); + pc->SetState(STATE_SHADOW); + if ( m_simulationSetup ) + { + pc->SetState(STATE_DEAD); + } + + pos.x = ox+sx*3; + pos.y = 0.245f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_MSAA); + pes->SetState(STATE_SHADOW); + std::vector msaaOptions; + for(int i = 1; i <= m_engine->GetDevice()->GetMaxSamples(); i *= 2) + msaaOptions.push_back(i); + pes->SetPossibleValues(msaaOptions); + if(m_engine->GetDevice()->GetMaxSamples() < 2) + pes->ClearState(STATE_ENABLE); + pos.y += ddim.y/2; + pos.x += 0.005f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_MSAA, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*8.5f; + pos.y = 0.65f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_PARTI); + pv->SetState(STATE_SHADOW); + pv->SetMinValue(0.0f); + pv->SetMaxValue(2.0f); + pos.x += 0.13f; + pos.y -= 0.015f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_PARTI, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL10, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*8.5f; + pos.y = 0.59f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_CLIP); + pv->SetState(STATE_SHADOW); + pv->SetMinValue(0.5f); + pv->SetMaxValue(2.0f); + pos.x += 0.13f; + pos.y -= 0.015f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_CLIP, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*8.5f; + pos.y = 0.53f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_DETAIL); + pv->SetState(STATE_SHADOW); + pv->SetMinValue(0.0f); + pv->SetMaxValue(2.0f); + pos.x += 0.13f; + pos.y -= 0.015f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_DETAIL, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*8.5f; + pos.y = 0.47f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pv = pw->CreateEditValue(pos, ddim, 0, EVENT_INTERFACE_GADGET); + pv->SetState(STATE_SHADOW); + if ( m_simulationSetup ) + { + pv->SetState(STATE_DEAD); + } + pv->SetMinValue(0.0f); + pv->SetMaxValue(1.0f); + pos.x += 0.13f; + pos.y -= 0.015f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_GADGET, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL13, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*8.5f; + pos.y = 0.385f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_TEXTURE_FILTER); + pes->SetState(STATE_SHADOW); + pes->SetPossibleValues({ + { Gfx::TEX_FILTER_NEAREST, "Nearest" }, + { Gfx::TEX_FILTER_BILINEAR, "Bilinear" }, + { Gfx::TEX_FILTER_TRILINEAR, "Trilinear" } + }); + pos.y += ddim.y/2; + pos.x += 0.005f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_TEXTURE_FILTER, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*8.5f; + pos.y = 0.315f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_TEXTURE_MIPMAP); + pes->SetState(STATE_SHADOW); + pes->SetPossibleValues({1, 4, 8, 16}); + pos.y += ddim.y/2; + pos.x += 0.005f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_TEXTURE_MIPMAP, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*8.5f; + pos.y = 0.245f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_TEXTURE_ANISOTROPY); + pes->SetState(STATE_SHADOW); + std::vector anisotropyOptions; + for(int i = 1; i <= m_engine->GetDevice()->GetMaxAnisotropyLevel(); i *= 2) + anisotropyOptions.push_back(i); + pes->SetPossibleValues(anisotropyOptions); + if(!m_engine->GetDevice()->IsAnisotropySupported()) + pes->ClearState(STATE_ENABLE); + pos.y += ddim.y/2; + pos.x += 0.005f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_TEXTURE_ANISOTROPY, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + + pos.x = ox+sx*12.5; + pos.y = 0.385f; + ddim.x = dim.x*2.2f; + ddim.y = 18.0f/480.0f; + pes = pw->CreateEnumSlider(pos, ddim, 0, EVENT_INTERFACE_SHADOW_MAPPING); + pes->SetState(STATE_SHADOW); + std::map shadowOptions = { + { -1, "Disabled" }, + }; + if (m_engine->GetDevice()->IsFramebufferSupported()) + { + for(int i = 128; i <= m_engine->GetDevice()->GetMaxTextureSize(); i *= 2) + shadowOptions[i] = StrUtils::ToString(i)+"x"+StrUtils::ToString(i); + } + else + { + shadowOptions[0] = "Screen buffer"; // TODO: Is this the proper name for this? + } + pes->SetPossibleValues(shadowOptions); + if (!m_engine->GetDevice()->IsShadowMappingSupported()) + { + pes->ClearState(STATE_ENABLE); + } + pos.y += ddim.y/2; + pos.x += 0.005f; + ddim.x = 0.40f; + GetResource(RES_EVENT, EVENT_INTERFACE_SHADOW_MAPPING, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*12.5; + pos.y = 0.315f; + ddim.x = dim.x*6; + ddim.y = dim.y*0.5f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SHADOW_MAPPING_QUALITY); + pc->SetState(STATE_SHADOW); + + ddim.x = dim.x*2; + ddim.y = dim.y*1; + pos.x = ox+sx*10; + pos.y = oy+sy*2; + + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MIN); + pb->SetState(STATE_SHADOW); + pos.x += ddim.x; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NORM); + pb->SetState(STATE_SHADOW); + pos.x += ddim.x; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MAX); + pb->SetState(STATE_SHADOW); + + UpdateSetupButtons(); + } + + if ( m_tab == PHASE_SETUPp ) // setup/game ? + { + ddim.x = dim.x*6; + ddim.y = dim.y*0.5f; + pos.x = ox+sx*3; + pos.y = 0.65f; + //? pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_TOTO); + //? pc->SetState(STATE_SHADOW); + //? pos.y -= 0.048f; + + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_MOVIES); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + //#endif + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_SCROLL); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_INVERTX); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_INVERTY); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EFFECT); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_BLOOD); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_AUTOSAVE_ENABLE); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + + pos.y -= ddim.y; + ddim.x = dim.x*2.5f; + psl = pw->CreateSlider(pos, ddim, -1, EVENT_INTERFACE_AUTOSAVE_INTERVAL); + psl->SetState(STATE_SHADOW); + psl->SetLimit(1.0f, 30.0f); + psl->SetArrowStep(1.0f); + pos.y += ddim.y/2; + GetResource(RES_EVENT, EVENT_INTERFACE_AUTOSAVE_INTERVAL, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + pos.y -= ddim.y/2; + pos.x = ox+sx*3+dim.x*3.5f; + psl = pw->CreateSlider(pos, ddim, -1, EVENT_INTERFACE_AUTOSAVE_SLOTS); + psl->SetState(STATE_SHADOW); + psl->SetLimit(1.0f, 10.0f); + psl->SetArrowStep(1.0f); + pos.y += ddim.y/2; + GetResource(RES_EVENT, EVENT_INTERFACE_AUTOSAVE_SLOTS, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + pos.y -= ddim.y/2; + + + //? pos.y -= 0.048f; + //? pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_NICERST); + //? pc->SetState(STATE_SHADOW); + //? pos.y -= 0.048f; + //? pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_HIMSELF); + //? pc->SetState(STATE_SHADOW); + + ddim.x = dim.x*6; + ddim.y = dim.y*0.5f; + pos.x = ox+sx*10; + pos.y = 0.65f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_TOOLTIP); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_GLINT); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_RAIN); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_MOUSE); + pc->SetState(STATE_SHADOW); + pos.y -= 0.048f; + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EDITMODE); + pc->SetState(STATE_SHADOW); + if ( m_simulationSetup ) + { + pc->SetState(STATE_DEAD); + } + pos.y -= 0.048f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_EDITVALUE); + pc->SetState(STATE_SHADOW); + + UpdateSetupButtons(); + } + + if ( m_tab == PHASE_SETUPc ) // setup/commands ? + { + pos.x = ox+sx*3; + pos.y = 320.0f/480.0f; + ddim.x = dim.x*15.0f; + ddim.y = 18.0f/480.0f; + GetResource(RES_TEXT, RT_SETUP_KEY1, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_INTERFACE_KINFO1, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*3; + pos.y = 302.0f/480.0f; + ddim.x = dim.x*15.0f; + ddim.y = 18.0f/480.0f; + GetResource(RES_TEXT, RT_SETUP_KEY2, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_INTERFACE_KINFO2, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + ddim.x = 428.0f/640.0f; + ddim.y = 128.0f/480.0f; + pos.x = 105.0f/640.0f; + pos.y = 164.0f/480.0f; + pg = pw->CreateGroup(pos, ddim, 0, EVENT_INTERFACE_KGROUP); + pg->ClearState(STATE_ENABLE); + pg->SetState(STATE_DEAD); + pg->SetState(STATE_SHADOW); + + ddim.x = 18.0f/640.0f; + ddim.y = (20.0f/480.0f)*KEY_VISIBLE; + pos.x = 510.0f/640.0f; + pos.y = 168.0f/480.0f; + ps = pw->CreateScroll(pos, ddim, -1, EVENT_INTERFACE_KSCROLL); + ps->SetVisibleRatio(static_cast(KEY_VISIBLE/INPUT_SLOT_MAX)); + ps->SetArrowStep(1.0f/(static_cast(INPUT_SLOT_MAX-KEY_VISIBLE))); + UpdateKey(); + + ddim.x = dim.x*6; + ddim.y = dim.y*0.5f; + pos.x = ox+sx*3; + pos.y = 130.0f/480.0f; + pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_JOYSTICK); + pc->SetState(STATE_SHADOW); + + ddim.x = dim.x*6; + ddim.y = dim.y*1; + pos.x = ox+sx*10; + pos.y = oy+sy*2; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_KDEF); + pb->SetState(STATE_SHADOW); + + UpdateSetupButtons(); + } + + if ( m_tab == PHASE_SETUPs ) // setup/sound ? + { + pos.x = ox+sx*3; + pos.y = 0.55f; + ddim.x = dim.x*4.0f; + ddim.y = 18.0f/480.0f; + psl = pw->CreateSlider(pos, ddim, 0, EVENT_INTERFACE_VOLSOUND); + psl->SetState(STATE_SHADOW); + psl->SetLimit(0.0f, MAXVOLUME); + psl->SetArrowStep(1.0f); + pos.y += ddim.y; + GetResource(RES_EVENT, EVENT_INTERFACE_VOLSOUND, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL1, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + pos.x = ox+sx*3; + pos.y = 0.40f; + ddim.x = dim.x*4.0f; + ddim.y = 18.0f/480.0f; + psl = pw->CreateSlider(pos, ddim, 0, EVENT_INTERFACE_VOLMUSIC); + psl->SetState(STATE_SHADOW); + psl->SetLimit(0.0f, MAXVOLUME); + psl->SetArrowStep(1.0f); + pos.y += ddim.y; + GetResource(RES_EVENT, EVENT_INTERFACE_VOLMUSIC, name); + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, name); + pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); + + ddim.x = dim.x*3; + ddim.y = dim.y*1; + pos.x = ox+sx*10; + pos.y = oy+sy*2; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_SILENT); + pb->SetState(STATE_SHADOW); + pos.x += ddim.x; + pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_NOISY); + pb->SetState(STATE_SHADOW); + + UpdateSetupButtons(); + } +} + +bool CScreenSetup::EventProcess(const Event &event) +{ + if ( !m_simulationSetup ) + { + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return false; + + if ( event.type == pw->GetEventTypeClose() || + event.type == EVENT_INTERFACE_BACK || + (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) + { + m_settings->SaveSettings(); + m_engine->ApplyChange(); + m_main->ChangePhase(PHASE_MAIN_MENU); + return false; + } + + switch( event.type ) + { + case EVENT_INTERFACE_SETUPd: + m_main->ChangePhase(PHASE_SETUPd); + return false; + + case EVENT_INTERFACE_SETUPg: + m_main->ChangePhase(PHASE_SETUPg); + return false; + + case EVENT_INTERFACE_SETUPp: + m_main->ChangePhase(PHASE_SETUPp); + return false; + + case EVENT_INTERFACE_SETUPc: + m_main->ChangePhase(PHASE_SETUPc); + return false; + + case EVENT_INTERFACE_SETUPs: + m_main->ChangePhase(PHASE_SETUPs); + return false; + + default: + break; + } + } + else + { + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return false; + + if ( event.type == pw->GetEventTypeClose() || + event.type == EVENT_INTERFACE_BACK || + (event.type == EVENT_KEY_DOWN && event.key.key == KEY(ESCAPE)) ) + { + m_settings->SaveSettings(); + m_engine->ApplyChange(); + m_interface->DeleteControl(EVENT_WINDOW5); + m_main->ChangePhase(PHASE_SIMUL); + m_main->StopSuspend(); + return false; + } + + switch( event.type ) + { + case EVENT_INTERFACE_SETUPd: + m_main->ChangePhase(PHASE_SETUPds); + return false; + + case EVENT_INTERFACE_SETUPg: + m_main->ChangePhase(PHASE_SETUPgs); + return false; + + case EVENT_INTERFACE_SETUPp: + m_main->ChangePhase(PHASE_SETUPps); + return false; + + case EVENT_INTERFACE_SETUPc: + m_main->ChangePhase(PHASE_SETUPcs); + return false; + + case EVENT_INTERFACE_SETUPs: + m_main->ChangePhase(PHASE_SETUPss); + return false; + + default: + break; + } + } + + if ( m_tab == PHASE_SETUPd ) // setup/display ? + { + CWindow* pw; + CCheck* pc; + CButton* pb; + + switch( event.type ) + { + case EVENT_LIST2: + UpdateApply(); + break; + + case EVENT_INTERFACE_FULL: + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) break; + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FULL)); + if ( pc == 0 ) break; + + if ( pc->TestState(STATE_CHECK) ) + { + pc->ClearState(STATE_CHECK); + } + else + { + pc->SetState(STATE_CHECK); + } + + UpdateApply(); + break; + + case EVENT_INTERFACE_APPLY: + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) break; + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_APPLY)); + if ( pb == 0 ) break; + pb->ClearState(STATE_PRESS); + pb->ClearState(STATE_HILIGHT); + ChangeDisplay(); + UpdateApply(); + break; + + default: + return true; + } + return false; + } + + if ( m_tab == PHASE_SETUPg ) // setup/graphic ? + { + switch( event.type ) + { + case EVENT_INTERFACE_SHADOW: + m_engine->SetShadow(!m_engine->GetShadow()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_GROUND: + m_engine->SetGroundSpot(!m_engine->GetGroundSpot()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_DIRTY: + m_engine->SetDirty(!m_engine->GetDirty()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_FOG: + m_engine->SetFog(!m_engine->GetFog()); + m_camera->SetOverBaseColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)); // TODO: color ok? + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_LENS: + m_engine->SetLensMode(!m_engine->GetLensMode()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_SKY: + m_engine->SetSkyMode(!m_engine->GetSkyMode()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_PLANET: + m_engine->SetPlanetMode(!m_engine->GetPlanetMode()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_LIGHT: + m_engine->SetLightMode(!m_engine->GetLightMode()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_PARTI: + case EVENT_INTERFACE_CLIP: + case EVENT_INTERFACE_DETAIL: + case EVENT_INTERFACE_GADGET: + ChangeSetupButtons(); + break; + + case EVENT_INTERFACE_TEXTURE_FILTER: + case EVENT_INTERFACE_TEXTURE_MIPMAP: + case EVENT_INTERFACE_TEXTURE_ANISOTROPY: + case EVENT_INTERFACE_MSAA: + case EVENT_INTERFACE_SHADOW_MAPPING: + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_SHADOW_MAPPING_QUALITY: + m_engine->SetShadowMappingQuality(!m_engine->GetShadowMappingQuality()); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_MIN: + ChangeSetupQuality(-1); + UpdateSetupButtons(); + break; + case EVENT_INTERFACE_NORM: + ChangeSetupQuality(0); + UpdateSetupButtons(); + break; + case EVENT_INTERFACE_MAX: + ChangeSetupQuality(1); + UpdateSetupButtons(); + break; + + default: + return true; + } + return false; + } + + if ( m_tab == PHASE_SETUPp ) // setup/game ? + { + switch( event.type ) + { + case EVENT_INTERFACE_TOTO: + m_engine->SetTotoMode(!m_engine->GetTotoMode()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_TOOLTIP: + m_settings->SetTooltips(!m_settings->GetTooltips()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_GLINT: + m_settings->SetInterfaceGlint(!m_settings->GetInterfaceGlint()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_RAIN: + m_settings->SetInterfaceRain(!m_settings->GetInterfaceRain()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_MOUSE: + if (m_app->GetMouseMode() == MOUSE_SYSTEM) + m_app->SetMouseMode(MOUSE_ENGINE); + else + m_app->SetMouseMode(MOUSE_SYSTEM); + + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_EDITMODE: + m_engine->SetEditIndentMode(!m_engine->GetEditIndentMode()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_EDITVALUE: + if ( m_engine->GetEditIndentValue() == 2 ) + { + m_engine->SetEditIndentValue(4); + } + else + { + m_engine->SetEditIndentValue(2); + } + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_SOLUCE4: + m_settings->SetSoluce4(!m_settings->GetSoluce4()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_MOVIES: + m_settings->SetMovies(!m_settings->GetMovies()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_NICERST: + m_settings->SetNiceReset(!m_settings->GetNiceReset()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_HIMSELF: + m_settings->SetHimselfDamage(!m_settings->GetHimselfDamage()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_SCROLL: + m_camera->SetCameraScroll(!m_camera->GetCameraScroll()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_INVERTX: + m_camera->SetCameraInvertX(!m_camera->GetCameraInvertX()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_INVERTY: + m_camera->SetCameraInvertY(!m_camera->GetCameraInvertY()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_EFFECT: + m_camera->SetEffect(!m_camera->GetEffect()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_BLOOD: + m_camera->SetBlood(!m_camera->GetBlood()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_AUTOSAVE_ENABLE: + m_main->SetAutosave(!m_main->GetAutosave()); + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_AUTOSAVE_INTERVAL: + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + case EVENT_INTERFACE_AUTOSAVE_SLOTS: + ChangeSetupButtons(); + UpdateSetupButtons(); + break; + + default: + return true; + } + return false; + } + + if ( m_tab == PHASE_SETUPc ) // setup/commands ? + { + switch( event.type ) + { + case EVENT_INTERFACE_KSCROLL: + UpdateKey(); + break; + + case EVENT_INTERFACE_KDEF: + CInput::GetInstancePointer()->SetDefaultInputBindings(); + UpdateKey(); + break; + + case EVENT_INTERFACE_JOYSTICK: + m_app->SetJoystickEnabled(!m_app->GetJoystickEnabled()); + UpdateSetupButtons(); + break; + + default: + if (event.type >= EVENT_INTERFACE_KEY && event.type <= EVENT_INTERFACE_KEY_END) + { + ChangeKey(event.type); + UpdateKey(); + break; + } + return true; + } + return false; + } + + if ( m_tab == PHASE_SETUPs ) // setup/sound ? + { + switch( event.type ) + { + case EVENT_INTERFACE_VOLSOUND: + case EVENT_INTERFACE_VOLMUSIC: + ChangeSetupButtons(); + break; + + case EVENT_INTERFACE_SILENT: + m_sound->SetAudioVolume(0); + m_sound->SetMusicVolume(0); + UpdateSetupButtons(); + break; + case EVENT_INTERFACE_NOISY: + m_sound->SetAudioVolume(MAXVOLUME); + m_sound->SetMusicVolume(MAXVOLUME*3/4); + UpdateSetupButtons(); + break; + + default: + return true; + } + return false; + } + + return true; +} + +// Updates the list of modes. + +int GCD(int a, int b) +{ + return (b == 0) ? a : GCD(b, a%b); +} + +Math::IntPoint AspectRatio(Math::IntPoint resolution) +{ + int gcd = GCD(resolution.x, resolution.y); + return Math::IntPoint(static_cast(resolution.x) / gcd, static_cast(resolution.y) / gcd); +} + +void CScreenSetup::UpdateDisplayMode() +{ + CWindow* pw; + CList* pl; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + pl = static_cast(pw->SearchControl(EVENT_LIST2)); + if ( pl == 0 ) return; + pl->Flush(); + + std::vector modes; + m_app->GetVideoResolutionList(modes, true, true); + int i = 0; + std::stringstream mode_text; + for (Math::IntPoint mode : modes) + { + mode_text.str(""); + Math::IntPoint aspect = AspectRatio(mode); + mode_text << mode.x << "x" << mode.y << " [" << aspect.x << ":" << aspect.y << "]"; + pl->SetItemName(i++, mode_text.str().c_str()); + } + + pl->SetSelect(m_setupSelMode); + pl->ShowSelect(false); +} + +// Change the graphics mode. + +void CScreenSetup::ChangeDisplay() +{ + CWindow* pw; + CList* pl; + CCheck* pc; + bool bFull; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + + pl = static_cast(pw->SearchControl(EVENT_LIST2)); + if ( pl == 0 ) return; + m_setupSelMode = pl->GetSelect(); + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FULL)); + if ( pc == 0 ) return; + bFull = pc->TestState(STATE_CHECK); + m_setupFull = bFull; + + std::vector modes; + m_app->GetVideoResolutionList(modes, true, true); + + Gfx::DeviceConfig config = m_app->GetVideoConfig(); + config.size = modes[m_setupSelMode]; + config.fullScreen = bFull; + + m_settings->SaveResolutionSettings(config); + + #if !PLATFORM_LINUX + // Windows causes problems, so we'll restart the game + // Mac OS was not tested so let's restart just to be sure + m_app->Restart(); + #else + m_app->ChangeVideoConfig(config); + #endif +} + + + +// Updates the "apply" button. + +void CScreenSetup::UpdateApply() +{ + CWindow* pw; + CButton* pb; + CList* pl; + CCheck* pc; + int sel2; + bool bFull; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + + pb = static_cast(pw->SearchControl(EVENT_INTERFACE_APPLY)); + + pl = static_cast(pw->SearchControl(EVENT_LIST2)); + if ( pl == 0 ) return; + sel2 = pl->GetSelect(); + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FULL)); + bFull = pc->TestState(STATE_CHECK); + + if ( sel2 == m_setupSelMode && + bFull == m_setupFull ) + { + pb->ClearState(STATE_ENABLE); + } + else + { + pb->SetState(STATE_ENABLE); + } +} + +// Updates the buttons during the setup phase. + +void CScreenSetup::UpdateSetupButtons() +{ + CWindow* pw; + CCheck* pc; + CEditValue* pv; + CSlider* ps; + CEnumSlider* pes; + float value; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_TOTO)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetTotoMode()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_TOOLTIP)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_settings->GetTooltips()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_GLINT)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_settings->GetInterfaceGlint()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_RAIN)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_settings->GetInterfaceRain()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_MOUSE)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_app->GetMouseMode() == MOUSE_SYSTEM); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_EDITMODE)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetEditIndentMode()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_EDITVALUE)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetEditIndentValue()>2); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SOLUCE4)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_settings->GetSoluce4()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_MOVIES)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_settings->GetMovies()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_NICERST)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_settings->GetNiceReset()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_HIMSELF)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_settings->GetHimselfDamage()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SCROLL)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_camera->GetCameraScroll()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_INVERTX)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_camera->GetCameraInvertX()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_INVERTY)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_camera->GetCameraInvertY()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_EFFECT)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_camera->GetEffect()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_BLOOD)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_camera->GetBlood()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_ENABLE)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_main->GetAutosave()); + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_INTERVAL)); + if ( ps != 0 ) + { + ps->SetState(STATE_ENABLE, m_main->GetAutosave()); + ps->SetVisibleValue(m_main->GetAutosaveInterval()); + + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_SLOTS)); + if ( ps != 0 ) + { + ps->SetState(STATE_ENABLE, m_main->GetAutosave()); + ps->SetVisibleValue(m_main->GetAutosaveSlots()); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_FILTER)); + if ( pes != 0 ) + { + pes->SetVisibleValue(m_engine->GetTextureFilterMode()); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_MIPMAP)); + if ( pes != 0 ) + { + pes->SetState(STATE_ENABLE, m_engine->GetTextureFilterMode() == Gfx::TEX_FILTER_TRILINEAR); + pes->SetVisibleValue(m_engine->GetTextureMipmapLevel()); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_ANISOTROPY)); + if ( pes != 0 ) + { + pes->SetVisibleValue(m_engine->GetTextureAnisotropyLevel()); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_MSAA)); + if ( pes != 0 ) + { + pes->SetVisibleValue(m_engine->GetMultiSample()); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING)); + if ( pes != 0 ) + { + if (!m_engine->GetShadowMapping()) + { + pes->SetVisibleValue(-1); + } + else if (!m_engine->GetShadowMappingOffscreen()) + { + pes->SetVisibleValue(0); + } + else + { + pes->SetVisibleValue(m_engine->GetShadowMappingOffscreenResolution()); + } + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING_QUALITY)); + if ( pc != 0 ) + { + pc->SetState(STATE_ENABLE, m_engine->GetShadowMapping()); + pc->SetState(STATE_CHECK, m_engine->GetShadowMapping() && m_engine->GetShadowMappingQuality()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW)); + if ( pc != 0 ) + { + pc->SetState(STATE_ENABLE, !m_engine->GetShadowMapping()); + pc->SetState(STATE_CHECK, !m_engine->GetShadowMapping() && m_engine->GetShadow()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_GROUND)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetGroundSpot()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_DIRTY)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetDirty()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_FOG)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetFog()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_LENS)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetLensMode()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_SKY)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetSkyMode()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_PLANET)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetPlanetMode()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_LIGHT)); + if ( pc != 0 ) + { + pc->SetState(STATE_CHECK, m_engine->GetLightMode()); + } + + pc = static_cast(pw->SearchControl(EVENT_INTERFACE_JOYSTICK)); + if ( pc != 0 ) + { + pc->SetState(STATE_ENABLE, m_app->GetJoystick().index >= 0); + pc->SetState(STATE_CHECK, m_app->GetJoystickEnabled()); + } + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_PARTI)); + if ( pv != 0 ) + { + value = m_engine->GetParticleDensity(); + pv->SetValue(value); + } + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_CLIP)); + if ( pv != 0 ) + { + value = m_engine->GetClippingDistance(); + pv->SetValue(value); + } + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_DETAIL)); + if ( pv != 0 ) + { + value = m_engine->GetObjectDetail(); + pv->SetValue(value); + } + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_GADGET)); + if ( pv != 0 ) + { + value = m_engine->GetGadgetQuantity(); + pv->SetValue(value); + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLSOUND)); + if ( ps != 0 ) + { + value = static_cast(m_sound->GetAudioVolume()); + ps->SetVisibleValue(value); + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLMUSIC)); + if ( ps != 0 ) + { + value = static_cast(m_sound->GetMusicVolume()); + ps->SetVisibleValue(value); + } +} + +// Updates the engine function of the buttons after the setup phase. + +void CScreenSetup::ChangeSetupButtons() +{ + CWindow* pw; + CEditValue* pv; + CSlider* ps; + CEnumSlider* pes; + float value; + + pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if ( pw == 0 ) return; + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_PARTI)); + if ( pv != 0 ) + { + value = pv->GetValue(); + m_engine->SetParticleDensity(value); + } + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_CLIP)); + if ( pv != 0 ) + { + value = pv->GetValue(); + m_engine->SetClippingDistance(value); + } + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_DETAIL)); + if ( pv != 0 ) + { + value = pv->GetValue(); + m_engine->SetObjectDetail(value); + } + + pv = static_cast(pw->SearchControl(EVENT_INTERFACE_GADGET)); + if ( pv != 0 ) + { + value = pv->GetValue(); + m_engine->SetGadgetQuantity(value); + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLSOUND)); + if ( ps != 0 ) + { + value = ps->GetVisibleValue(); + m_sound->SetAudioVolume(static_cast(value)); + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_VOLMUSIC)); + if ( ps != 0 ) + { + value = ps->GetVisibleValue(); + m_sound->SetMusicVolume(static_cast(value)); + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_INTERVAL)); + if ( ps != 0 ) + { + value = ps->GetVisibleValue(); + m_main->SetAutosaveInterval(static_cast(round(value))); + } + + ps = static_cast(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_SLOTS)); + if ( ps != 0 ) + { + value = ps->GetVisibleValue(); + m_main->SetAutosaveSlots(static_cast(round(value))); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_FILTER)); + if ( pes != 0 ) + { + value = pes->GetVisibleValue(); + m_engine->SetTextureFilterMode(static_cast(value)); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_MIPMAP)); + if ( pes != 0 ) + { + value = pes->GetVisibleValue(); + m_engine->SetTextureMipmapLevel(static_cast(value)); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_TEXTURE_ANISOTROPY)); + if ( pes != 0 ) + { + value = pes->GetVisibleValue(); + m_engine->SetTextureAnisotropyLevel(static_cast(value)); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_MSAA)); + if ( pes != 0 ) + { + value = pes->GetVisibleValue(); + m_engine->SetMultiSample(static_cast(value)); + } + + pes = static_cast(pw->SearchControl(EVENT_INTERFACE_SHADOW_MAPPING)); + if ( pes != 0 ) + { + value = pes->GetVisibleValue(); + if(value == -1) + { + m_engine->SetShadowMapping(false); + } + else if(value == 0) + { + m_engine->SetShadowMapping(true); + m_engine->SetShadowMappingOffscreen(false); + } + else + { + m_engine->SetShadowMapping(true); + m_engine->SetShadowMappingOffscreen(true); + m_engine->SetShadowMappingOffscreenResolution(value); + } + } +} + + +// Changes the general level of quality. + +void CScreenSetup::ChangeSetupQuality(int quality) +{ + bool bEnable; + float value; + + bEnable = true; //(quality >= 0); + m_engine->SetShadow(bEnable); + m_engine->SetGroundSpot(bEnable); + m_engine->SetDirty(bEnable); + m_engine->SetFog(bEnable); + m_engine->SetLensMode(bEnable); + m_engine->SetSkyMode(bEnable); + m_engine->SetPlanetMode(bEnable); + m_engine->SetLightMode(bEnable); + m_camera->SetOverBaseColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)); // TODO: color ok? + + if ( quality < 0 ) value = 0.0f; + if ( quality == 0 ) value = 1.0f; + if ( quality > 0 ) value = 2.0f; + m_engine->SetParticleDensity(value); + + if ( quality < 0 ) value = 0.5f; + if ( quality == 0 ) value = 1.0f; + if ( quality > 0 ) value = 2.0f; + m_engine->SetClippingDistance(value); + + if ( quality < 0 ) value = 0.0f; + if ( quality == 0 ) value = 1.0f; + if ( quality > 0 ) value = 2.0f; + m_engine->SetObjectDetail(value); + + if ( quality < 0 ) value = 0.5f; + if ( quality == 0 ) value = 1.0f; + if ( quality > 0 ) value = 1.0f; + m_engine->SetGadgetQuantity(value); + + if ( quality < 0 ) m_engine->SetMultiSample(1); + if ( quality == 0 ) m_engine->SetMultiSample(2); + if ( quality > 0 ) m_engine->SetMultiSample(4); + + if ( quality < 0 ) { m_engine->SetTextureFilterMode(Gfx::TEX_FILTER_BILINEAR); } + if ( quality == 0 ) { m_engine->SetTextureFilterMode(Gfx::TEX_FILTER_TRILINEAR); m_engine->SetTextureMipmapLevel(4); m_engine->SetTextureAnisotropyLevel(4); } + if ( quality > 0 ) { m_engine->SetTextureFilterMode(Gfx::TEX_FILTER_TRILINEAR); m_engine->SetTextureMipmapLevel(8); m_engine->SetTextureAnisotropyLevel(8); } + + if ( quality < 0 ) { m_engine->SetShadowMapping(false); m_engine->SetShadowMappingQuality(false); } + else { m_engine->SetShadowMapping(true); m_engine->SetShadowMappingQuality(true); m_engine->SetShadowMappingOffscreen(true); } + if ( quality == 0 ) m_engine->SetShadowMappingOffscreenResolution(1024); + if ( quality > 0 ) m_engine->SetShadowMappingOffscreenResolution(2048); + + // TODO: first execute adapt? + //m_engine->FirstExecuteAdapt(false); +} + +// Updates the list of keys. + +void CScreenSetup::UpdateKey() +{ + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if (pw == nullptr) return; + + CScroll* ps = static_cast(pw->SearchControl(EVENT_INTERFACE_KSCROLL)); + if (ps == nullptr) return; + + int first = static_cast(ps->GetVisibleValue()*(INPUT_SLOT_MAX-KEY_VISIBLE)); + + for (int i = 0; i < INPUT_SLOT_MAX; i++) + pw->DeleteControl(static_cast(EVENT_INTERFACE_KEY+i)); + + Math::Point dim; + dim.x = 400.0f/640.0f; + dim.y = 20.0f/480.0f; + Math::Point pos; + pos.x = 110.0f/640.0f; + pos.y = 168.0f/480.0f + dim.y*(KEY_VISIBLE-1); + for (int i = 0; i < KEY_VISIBLE; i++) + { + pw->CreateKey(pos, dim, -1, static_cast(EVENT_INTERFACE_KEY+first+i)); + CKey* pk = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_KEY+first+i))); + if (pk == nullptr) break; + + pk->SetBinding(CInput::GetInstancePointer()->GetInputBinding(static_cast(first+i))); + pos.y -= dim.y; + } +} + +// Change a key. + +void CScreenSetup::ChangeKey(EventType event) +{ + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if (pw == nullptr) return; + + CScroll* ps = static_cast(pw->SearchControl(EVENT_INTERFACE_KSCROLL)); + if (ps == nullptr) return; + + for (int i = 0; i < INPUT_SLOT_MAX; i++) + { + if ( EVENT_INTERFACE_KEY+i == event ) + { + CKey* pk = static_cast(pw->SearchControl(static_cast(EVENT_INTERFACE_KEY+i))); + if (pk == nullptr) break; + + CInput::GetInstancePointer()->SetInputBinding(static_cast(i), pk->GetBinding()); + } + } +} + +Phase CScreenSetup::GetSetupTab() +{ + return m_tab; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_setup.h b/src/ui/screen/screen_setup.h new file mode 100644 index 00000000..8706ce3a --- /dev/null +++ b/src/ui/screen/screen_setup.h @@ -0,0 +1,64 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +#include "object/robotmain.h" + +class CSettings; + +namespace Gfx +{ +class CCamera; +} + +namespace Ui { + +class CScreenSetup : public CScreen +{ +public: + CScreenSetup(Phase tab, bool simulationSetup); + void CreateInterface(); + bool EventProcess(const Event &event); + + static Phase GetSetupTab(); + +protected: + void UpdateDisplayMode(); + void ChangeDisplay(); + void UpdateApply(); + void UpdateSetupButtons(); + void ChangeSetupButtons(); + void ChangeSetupQuality(int quality); + void UpdateKey(); + void ChangeKey(EventType event); + +protected: + CSettings* m_settings; + Gfx::CCamera* m_camera; + + static Phase m_tab; + bool m_simulationSetup; + + int m_setupSelMode; + bool m_setupFull; +}; + +} // namespace Ui diff --git a/src/ui/screen/screen_welcome.cpp b/src/ui/screen/screen_welcome.cpp new file mode 100644 index 00000000..28742d56 --- /dev/null +++ b/src/ui/screen/screen_welcome.cpp @@ -0,0 +1,110 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#include "ui/screen/screen_welcome.h" + +#include "app/app.h" + +#include "common/stringutils.h" + +#include "graphics/engine/engine.h" + +#include "ui/interface.h" +#include "ui/window.h" + +namespace Ui { + +const float WELCOME_LENGTH = 3.0f; + +CScreenWelcome::CScreenWelcome(int imageIndex) +: m_imageIndex(imageIndex) +, m_time(0.0f) +{ +} + +void CScreenWelcome::CreateInterface() +{ + Math::Point pos, ddim; + + pos.x = 0.0f; + pos.y = 0.0f; + ddim.x = 0.0f; + ddim.y = 0.0f; + m_interface->CreateWindows(pos, ddim, -1, EVENT_WINDOW5); + + if ( m_imageIndex == 0 ) + m_engine->SetOverColor(Gfx::Color(1.0f, 1.0f, 1.0f, 1.0f), Gfx::ENG_RSTATE_TCOLOR_BLACK); + else + m_engine->SetOverColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f), Gfx::ENG_RSTATE_TCOLOR_WHITE); + m_engine->SetOverFront(true); + + SetBackground("textures/interface/intro"+StrUtils::ToString(m_imageIndex+1)+".png", true); +} + +bool CScreenWelcome::EventProcess(const Event &event) +{ + if (event.type == EVENT_FRAME) + { + m_time += event.rTime; + + // 1/4 of display time is animating + float animatingTime = WELCOME_LENGTH / 4.0f; + + float intensity; + if (m_time < animatingTime) + { + // appearing + intensity = m_time / animatingTime; + } + else if (m_time < WELCOME_LENGTH - animatingTime) + { + // showing + intensity = 1.0f; + } + else + { + // hiding + intensity = (WELCOME_LENGTH - m_time) / animatingTime; + } + + if ( intensity < 0.0f ) intensity = 0.0f; + if ( intensity > 1.0f ) intensity = 1.0f; + + // white first, others -> black fading + int mode = Gfx::ENG_RSTATE_TCOLOR_WHITE; + if ((m_imageIndex == 0) && (m_time < WELCOME_LENGTH/2.0f)) + { + intensity = 1.0f - intensity; + mode = Gfx::ENG_RSTATE_TCOLOR_BLACK; + } + + m_engine->SetOverColor(Gfx::Color(intensity, intensity, intensity, intensity), mode); + } + + if (m_time >= WELCOME_LENGTH || + event.type == EVENT_KEY_DOWN || + event.type == EVENT_MOUSE_BUTTON_DOWN ) + { + m_main->ChangePhase(static_cast(PHASE_WELCOME1+m_imageIndex+1)); + return false; + } + + return true; +} + +} // namespace Ui diff --git a/src/ui/screen/screen_welcome.h b/src/ui/screen/screen_welcome.h new file mode 100644 index 00000000..972344d3 --- /dev/null +++ b/src/ui/screen/screen_welcome.h @@ -0,0 +1,37 @@ +/* + * This file is part of the Colobot: Gold Edition source code + * Copyright (C) 2001-2015, Daniel Roux, EPSITEC SA & TerranovaTeam + * http://epsiteс.ch; http://colobot.info; http://github.com/colobot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://gnu.org/licenses + */ +#pragma once + +#include "ui/screen/screen.h" + +namespace Ui { + +class CScreenWelcome : public CScreen +{ +public: + CScreenWelcome(int imageIndex); + void CreateInterface(); + bool EventProcess(const Event &event); + +protected: + int m_imageIndex; + float m_time; +}; + +} // namespace Ui