From 57469533b61df8e2b562cc4b36cfa0653ff0f575 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Fri, 7 Aug 2015 20:48:55 +0200 Subject: [PATCH] Implemented loading progress bar --- po/colobot.pot | 30 ++++ po/de.po | 33 ++++ po/fr.po | 33 ++++ po/pl.po | 30 ++++ po/ru.po | 33 ++++ src/app/controller.cpp | 2 +- src/common/event.cpp | 2 + src/common/event.h | 2 + src/common/pathman.h | 2 +- src/common/restext.cpp | 11 ++ src/common/restext.h | 11 ++ src/graphics/engine/engine.cpp | 2 +- src/object/level/parser.cpp | 13 +- src/object/level/parser.h | 5 +- src/object/level/parserparam.cpp | 2 +- src/object/level/parserparam.h | 6 +- src/object/object_manager.cpp | 11 ++ src/object/object_manager.h | 4 + src/object/player_profile.cpp | 2 +- src/object/robotmain.cpp | 262 +++++++++++++++++----------- src/object/robotmain.h | 7 +- src/ui/maindialog.cpp | 2 +- src/ui/mainmap.cpp | 32 +--- src/ui/mainmap.h | 2 - src/ui/mainui.cpp | 28 ++- src/ui/mainui.h | 5 + src/ui/screen/screen_io_read.cpp | 2 +- src/ui/screen/screen_level_list.cpp | 2 +- src/ui/screen/screen_loading.cpp | 82 ++++++++- src/ui/screen/screen_loading.h | 11 ++ 30 files changed, 516 insertions(+), 153 deletions(-) diff --git a/po/colobot.pot b/po/colobot.pot index 64c28706..c604ab0e 100644 --- a/po/colobot.pot +++ b/po/colobot.pot @@ -249,6 +249,36 @@ msgstr "" msgid "Recorder" msgstr "" +msgid "Starting..." +msgstr "" + +msgid "Processing level file" +msgstr "" + +msgid "Loading basic level settings" +msgstr "" + +msgid "Loading music" +msgstr "" + +msgid "Loading terrain" +msgstr "" + +msgid "Loading objects" +msgstr "" + +msgid "Restoring saved objects" +msgstr "" + +msgid "Loading programs" +msgstr "" + +msgid "Restoring CBot execution state" +msgstr "" + +msgid "Loading finished!" +msgstr "" + msgid "Cancel" msgstr "" diff --git a/po/de.po b/po/de.po index 78beb092..7f00616e 100644 --- a/po/de.po +++ b/po/de.po @@ -818,6 +818,26 @@ msgstr "Laden\\Eine gespeicherte Mission öffnen" msgid "Load\\Loads the selected mission" msgstr "Laden\\Öffnet eine gespeicherte Mission" +msgid "Loading basic level settings" +msgstr "" + +#, fuzzy +msgid "Loading finished!" +msgstr "Programm beendet" + +msgid "Loading music" +msgstr "" + +#, fuzzy +msgid "Loading objects" +msgstr "Liste der Objekte" + +msgid "Loading programs" +msgstr "" + +msgid "Loading terrain" +msgstr "" + msgid "Lowest\\Minimum graphic quality (highest frame rate)" msgstr "Min.\\Minimale Qualität (großes Framerate)" @@ -1138,6 +1158,9 @@ msgstr "Geschütztes Element (private)" msgid "Private\\Private folder" msgstr "Privat\\Privater Ordner" +msgid "Processing level file" +msgstr "" + #, fuzzy msgid "Program cloned" msgstr "Programm beendet" @@ -1241,6 +1264,12 @@ msgstr "Auflösung" msgid "Restart\\Restart the mission from the beginning" msgstr "Neu anfangen\\Die Mission von vorne anfangen" +msgid "Restoring CBot execution state" +msgstr "" + +msgid "Restoring saved objects" +msgstr "" + msgid "Return to start" msgstr "Alles zurücksetzen" @@ -1434,6 +1463,10 @@ msgstr "Standard\\Standardfarben einsetzen" msgid "Start" msgstr "Startfläche" +#, fuzzy +msgid "Starting..." +msgstr "Startfläche" + msgid "Still working ..." msgstr "Prozess im Gang ..." diff --git a/po/fr.po b/po/fr.po index a2e94b09..4e4cc0d6 100644 --- a/po/fr.po +++ b/po/fr.po @@ -812,6 +812,26 @@ msgstr "Charger\\Charger une mission enregistrée" msgid "Load\\Loads the selected mission" msgstr "Charger\\Charger la mission sélectionnée" +msgid "Loading basic level settings" +msgstr "" + +#, fuzzy +msgid "Loading finished!" +msgstr "Programme terminé" + +msgid "Loading music" +msgstr "" + +#, fuzzy +msgid "Loading objects" +msgstr "Liste des objets" + +msgid "Loading programs" +msgstr "" + +msgid "Loading terrain" +msgstr "" + msgid "Lowest\\Minimum graphic quality (highest frame rate)" msgstr "Mini\\Qualité minimale (+ rapide)" @@ -1134,6 +1154,9 @@ msgstr "Elément protégé" msgid "Private\\Private folder" msgstr "Privé\\Dossier privé" +msgid "Processing level file" +msgstr "" + #, fuzzy msgid "Program cloned" msgstr "Programme terminé" @@ -1236,6 +1259,12 @@ msgstr "Résolution" msgid "Restart\\Restart the mission from the beginning" msgstr "Recommencer\\Recommencer la mission au début" +msgid "Restoring CBot execution state" +msgstr "" + +msgid "Restoring saved objects" +msgstr "" + msgid "Return to start" msgstr "Remet au départ" @@ -1430,6 +1459,10 @@ msgstr "Standard\\Remet les couleurs standards" msgid "Start" msgstr "Départ" +#, fuzzy +msgid "Starting..." +msgstr "Départ" + msgid "Still working ..." msgstr "Travail en cours ..." diff --git a/po/pl.po b/po/pl.po index def821d2..c9a21b98 100644 --- a/po/pl.po +++ b/po/pl.po @@ -820,6 +820,24 @@ msgstr "Wczytaj\\Wczytuje zapisaną misję" msgid "Load\\Loads the selected mission" msgstr "Wczytaj\\Wczytuje zaznaczoną misję" +msgid "Loading basic level settings" +msgstr "Wczytywanie podstawowych ustawień poziomu" + +msgid "Loading finished!" +msgstr "Wczytywanie zakończone!" + +msgid "Loading music" +msgstr "Wczytywanie muzyki" + +msgid "Loading objects" +msgstr "Wczytywanie obiektów" + +msgid "Loading programs" +msgstr "Wczytywanie programów" + +msgid "Loading terrain" +msgstr "Wczytywanie terenu" + msgid "Lowest\\Minimum graphic quality (highest frame rate)" msgstr "" "Najniższa\\Minimalna jakość grafiki (najwyższa częstotliwość odświeżania)" @@ -1141,6 +1159,9 @@ msgstr "Element prywatny" msgid "Private\\Private folder" msgstr "Prywatny\\Folder prywatny" +msgid "Processing level file" +msgstr "Przetwarzanie pliku poziomu" + msgid "Program cloned" msgstr "Program skopiowany" @@ -1240,6 +1261,12 @@ msgstr "Rozdzielczość" msgid "Restart\\Restart the mission from the beginning" msgstr "Uruchom ponownie\\Uruchamia ponownie misję od początku" +msgid "Restoring CBot execution state" +msgstr "Przywracanie stanu wykonywania CBot" + +msgid "Restoring saved objects" +msgstr "Przywracanie zapisanych obiektów" + msgid "Return to start" msgstr "Powrót do początku" @@ -1431,6 +1458,9 @@ msgstr "Standardowe\\Standardowe ustawienia wyglądu" msgid "Start" msgstr "Początek" +msgid "Starting..." +msgstr "Rozpoczynanie..." + msgid "Still working ..." msgstr "Wciąż pracuje..." diff --git a/po/ru.po b/po/ru.po index f03358a3..a71154eb 100644 --- a/po/ru.po +++ b/po/ru.po @@ -811,6 +811,26 @@ msgstr "Загрузить\\Загрузить сохраненную мисси msgid "Load\\Loads the selected mission" msgstr "Загрузить\\Загрузить выбранную миссию" +msgid "Loading basic level settings" +msgstr "" + +#, fuzzy +msgid "Loading finished!" +msgstr "Программа выполнена" + +msgid "Loading music" +msgstr "" + +#, fuzzy +msgid "Loading objects" +msgstr "Список объектов" + +msgid "Loading programs" +msgstr "" + +msgid "Loading terrain" +msgstr "" + msgid "Lowest\\Minimum graphic quality (highest frame rate)" msgstr "Низкое\\Минимальное качество графики (быстро)" @@ -1133,6 +1153,9 @@ msgstr "Частный элемент" msgid "Private\\Private folder" msgstr "Личное\\Личная папка" +msgid "Processing level file" +msgstr "" + #, fuzzy msgid "Program cloned" msgstr "Программа выполнена" @@ -1236,6 +1259,12 @@ msgstr "Разрешение" msgid "Restart\\Restart the mission from the beginning" msgstr "Заново\\Начать данную миссию с начала" +msgid "Restoring CBot execution state" +msgstr "" + +msgid "Restoring saved objects" +msgstr "" + msgid "Return to start" msgstr "Вернуться в начало" @@ -1426,6 +1455,10 @@ msgstr "По умолчанию\\Настройки внешнего вида п msgid "Start" msgstr "Начало" +#, fuzzy +msgid "Starting..." +msgstr "Начало" + msgid "Still working ..." msgstr "Работает ..." diff --git a/src/app/controller.cpp b/src/app/controller.cpp index e89ec380..20fe8df7 100644 --- a/src/app/controller.cpp +++ b/src/app/controller.cpp @@ -58,7 +58,7 @@ void CController::StartApp() void CController::StartGame(LevelCategory cat, int chap, int lvl) { m_main->SetLevel(cat, chap, lvl); - m_main->ChangePhase(PHASE_LOADING); + m_main->ChangePhase(PHASE_SIMUL); } void CController::ProcessEvent(Event& event) diff --git a/src/common/event.cpp b/src/common/event.cpp index 3d5ed4c2..b5b92660 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -148,6 +148,8 @@ void InitializeEventTypeTexts() EVENT_TYPE_TEXT[EVENT_LIST8] = "EVENT_LIST8"; EVENT_TYPE_TEXT[EVENT_LIST9] = "EVENT_LIST9"; + EVENT_TYPE_TEXT[EVENT_LOADING] = "EVENT_LOADING"; + EVENT_TYPE_TEXT[EVENT_TOOLTIP] = "EVENT_TOOLTIP"; EVENT_TYPE_TEXT[EVENT_DIALOG_OK] = "EVENT_DIALOG_OK"; diff --git a/src/common/event.h b/src/common/event.h index 797ee39e..ae50a1cd 100644 --- a/src/common/event.h +++ b/src/common/event.h @@ -172,6 +172,8 @@ enum EventType EVENT_LIST8 = 118, EVENT_LIST9 = 119, + EVENT_LOADING = 120, + EVENT_TOOLTIP = 200, EVENT_DIALOG_OK = 300, diff --git a/src/common/pathman.h b/src/common/pathman.h index e42e9b4c..0af3f701 100644 --- a/src/common/pathman.h +++ b/src/common/pathman.h @@ -19,7 +19,7 @@ /** * \file common/pathman.h - * \brief Class for managing data/lang/save paths, and %something% replacements + * \brief Class for managing data/lang/save paths */ #pragma once diff --git a/src/common/restext.cpp b/src/common/restext.cpp index 2e072167..4304c61d 100644 --- a/src/common/restext.cpp +++ b/src/common/restext.cpp @@ -146,6 +146,17 @@ void InitializeRestext() stringsText[RT_INTERFACE_REC] = TR("Recorder"); + stringsText[RT_LOADING_INIT] = TR("Starting..."); + stringsText[RT_LOADING_PROCESSING] = TR("Processing level file"); + stringsText[RT_LOADING_LEVEL_SETTINGS] = TR("Loading basic level settings"); + stringsText[RT_LOADING_MUSIC] = TR("Loading music"); + stringsText[RT_LOADING_TERRAIN] = TR("Loading terrain"); + stringsText[RT_LOADING_OBJECTS] = TR("Loading objects"); + stringsText[RT_LOADING_OBJECTS_SAVED] = TR("Restoring saved objects"); + stringsText[RT_LOADING_PROGRAMS] = TR("Loading programs"); + stringsText[RT_LOADING_CBOT_SAVE] = TR("Restoring CBot execution state"); + stringsText[RT_LOADING_FINISHED] = TR("Loading finished!"); + stringsEvent[EVENT_BUTTON_OK] = TR("OK"); diff --git a/src/common/restext.h b/src/common/restext.h index 2628f864..c74c5ae4 100644 --- a/src/common/restext.h +++ b/src/common/restext.h @@ -145,6 +145,17 @@ enum ResTextType RT_MESSAGE_WIN = 200, RT_MESSAGE_LOST = 201, + RT_LOADING_INIT = 210, + RT_LOADING_PROCESSING = 211, + RT_LOADING_LEVEL_SETTINGS = 212, + RT_LOADING_MUSIC = 213, + RT_LOADING_TERRAIN = 214, + RT_LOADING_OBJECTS = 215, + RT_LOADING_OBJECTS_SAVED = 216, + RT_LOADING_PROGRAMS = 217, + RT_LOADING_CBOT_SAVE = 218, + RT_LOADING_FINISHED = 219, + RT_MAX //! < number of values }; diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 2d1cd167..e95d75b5 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -3214,6 +3214,7 @@ void CEngine::Render() UseMSAA(true); + DrawBackground(); // draws the background if (m_drawWorld) Draw3DScene(); @@ -3234,7 +3235,6 @@ void CEngine::Draw3DScene() if (m_groundSpotVisible) UpdateGroundSpotTextures(); - DrawBackground(); // draws the background if (m_planetMode) DrawPlanet(); // draws the planets if (m_skyMode) m_cloud->Draw(); // draws the clouds diff --git a/src/object/level/parser.cpp b/src/object/level/parser.cpp index 527d2d4d..8cce9b6b 100644 --- a/src/object/level/parser.cpp +++ b/src/object/level/parser.cpp @@ -356,7 +356,7 @@ void CLevelParser::AddLine(CLevelParserLineUPtr line) m_lines.push_back(std::move(line)); } -CLevelParserLine* CLevelParser::Get(std::string command) +CLevelParserLine* CLevelParser::Get(const std::string& command) { for (auto& line : m_lines) { @@ -365,3 +365,14 @@ CLevelParserLine* CLevelParser::Get(std::string command) } throw CLevelParserException("Command not found: " + command); } + +int CLevelParser::CountLines(const std::string& command) +{ + int count = 0; + for (auto& line : m_lines) + { + if (line->GetCommand() == command) + count++; + } + return count; +} diff --git a/src/object/level/parser.h b/src/object/level/parser.h index ba78a8df..3ced2b06 100644 --- a/src/object/level/parser.h +++ b/src/object/level/parser.h @@ -85,7 +85,10 @@ public: void AddLine(CLevelParserLineUPtr line); //! Find first line with given command - CLevelParserLine* Get(std::string command); + CLevelParserLine* Get(const std::string& command); + + //! Count lines with given command + int CountLines(const std::string& command); private: std::string m_filename; diff --git a/src/object/level/parserparam.cpp b/src/object/level/parserparam.cpp index b552173c..ddad2dcf 100644 --- a/src/object/level/parserparam.cpp +++ b/src/object/level/parserparam.cpp @@ -462,7 +462,7 @@ ObjectType CLevelParserParam::ToObjectType(std::string value) if (value == "Me" ) return OBJECT_HUMAN; if (value == "Tech" ) return OBJECT_TECH; if (value == "MissionController" ) return OBJECT_CONTROLLER; - return static_cast(Cast(value, "object")); + return static_cast(boost::lexical_cast(value)); } const std::string CLevelParserParam::FromObjectType(ObjectType value) diff --git a/src/object/level/parserparam.h b/src/object/level/parserparam.h index b02a6999..b22fb552 100644 --- a/src/object/level/parserparam.h +++ b/src/object/level/parserparam.h @@ -122,6 +122,9 @@ public: std::string GetValue(); bool IsDefined(); + static const std::string FromObjectType(ObjectType value); + static ObjectType ToObjectType(std::string value); + private: void ParseArray(); void LoadArray(); @@ -130,7 +133,6 @@ private: template T Cast(std::string requestedType); std::string ToPath(std::string path, const std::string defaultDir); - ObjectType ToObjectType(std::string value); DriveType ToDriveType(std::string value); ToolType ToToolType(std::string value); Gfx::WaterType ToWaterType(std::string value); @@ -141,7 +143,6 @@ private: Gfx::CameraType ToCameraType(std::string value); MissionType ToMissionType(std::string value); - const std::string FromObjectType(ObjectType value); const std::string FromCameraType(Gfx::CameraType value); private: @@ -151,4 +152,3 @@ private: std::string m_value; CLevelParserParamVec m_array; }; - diff --git a/src/object/object_manager.cpp b/src/object/object_manager.cpp index af41a28a..156ee4a1 100644 --- a/src/object/object_manager.cpp +++ b/src/object/object_manager.cpp @@ -206,6 +206,17 @@ void CObjectManager::DestroyTeam(int team) } } +int CObjectManager::CountObjectsImplementing(ObjectInterfaceType interface) +{ + int count = 0; + for (CObject* object : GetAllObjects()) + { + if (object->Implements(interface)) + count++; + } + return count; +} + CObject* CObjectManager::Radar(CObject* pThis, ObjectType type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes) { std::vector types; diff --git a/src/object/object_manager.h b/src/object/object_manager.h index db7738d1..b462a2ba 100644 --- a/src/object/object_manager.h +++ b/src/object/object_manager.h @@ -30,6 +30,7 @@ #include "math/vector.h" #include "object/object_create_params.h" +#include "object/object_interface_type.h" #include "object/object_type.h" #include @@ -172,6 +173,9 @@ public: // TODO: This should be probably moved to separate class void DestroyTeam(int team); + //! Counts all objects implementing given interface + int CountObjectsImplementing(ObjectInterfaceType interface); + //! Returns all objects inline CObjectContainerProxy GetAllObjects() { diff --git a/src/object/player_profile.cpp b/src/object/player_profile.cpp index 718aea99..be2f9403 100644 --- a/src/object/player_profile.cpp +++ b/src/object/player_profile.cpp @@ -517,7 +517,7 @@ void CPlayerProfile::LoadScene(std::string dir) CRobotMain::GetInstancePointer()->SetLevel(cat, chap, rank); CRobotMain::GetInstancePointer()->SetReadScene(dir); - CRobotMain::GetInstancePointer()->ChangePhase(PHASE_LOADING); + CRobotMain::GetInstancePointer()->ChangePhase(PHASE_SIMUL); } bool CPlayerProfile::DeleteScene(std::string dir) diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index 224614ee..f95825e5 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -87,21 +87,24 @@ #include "sound/sound.h" -#include "ui/controls/button.h" #include "ui/displayinfo.h" #include "ui/displaytext.h" -#include "ui/controls/edit.h" -#include "ui/controls/interface.h" -#include "ui/controls/label.h" #include "ui/maindialog.h" #include "ui/mainmap.h" #include "ui/mainshort.h" #include "ui/mainui.h" + +#include "ui/controls/button.h" +#include "ui/controls/edit.h" +#include "ui/controls/interface.h" +#include "ui/controls/label.h" #include "ui/controls/map.h" #include "ui/controls/shortcut.h" #include "ui/controls/slider.h" #include "ui/controls/window.h" +#include "ui/screen/screen_loading.h" + #include #include @@ -373,14 +376,12 @@ bool IsPhaseWithWorld(Phase phase) 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; } bool IsMainMenuPhase(Phase phase) { - if (phase == PHASE_LOADING) return true; return !IsPhaseWithWorld(phase); } @@ -470,15 +471,6 @@ void CRobotMain::ChangePhase(Phase phase) } ClearInterface(); - if (m_phase == PHASE_LOADING) - { - m_app->SetMouseMode(MOUSE_NONE); - } - else - { - m_app->SetMouseMode(m_settings->GetSystemMouse() ? MOUSE_SYSTEM : MOUSE_ENGINE); - } - Math::Point dim, pos; // Creates and hide the command console. @@ -525,7 +517,11 @@ void CRobotMain::ChangePhase(Phase phase) bool loading = !m_sceneReadPath.empty(); + m_ui->ShowLoadingScreen(true); + m_ui->GetLoadingScreen()->SetProgress(0.0f, RT_LOADING_INIT); + m_map->CreateMap(); + m_map->ShowMap(false); try { @@ -2492,6 +2488,14 @@ void CRobotMain::InitEye() //! Advances the entire scene bool CRobotMain::EventFrame(const Event &event) { + // TODO: For some reason we're getting one big event with event.rTime > 0.1f after loading before the movie starts? + if (!m_immediatSatCom && !m_beginSatCom && !m_movieLock && + m_gameTime > 0.1f && m_phase == PHASE_SIMUL) + { + m_displayText->DisplayError(INFO_BEGINSATCOM, Math::Vector(0.0f,0.0f,0.0f)); + m_beginSatCom = true; // message appears + } + m_time += event.rTime; if (!m_movieLock && m_pause->GetPause() == PAUSE_NONE) { @@ -2499,13 +2503,6 @@ bool CRobotMain::EventFrame(const Event &event) m_gameTimeAbsolute += m_app->GetRealRelTime() / 1e9f; } - if (!m_immediatSatCom && !m_beginSatCom && - m_gameTime > 0.1f && m_phase == PHASE_SIMUL) - { - m_displayText->DisplayError(INFO_BEGINSATCOM, Math::Vector(0.0f,0.0f,0.0f)); - m_beginSatCom = true; // message appears - } - if (!m_movieLock && m_pause->GetPause() == PAUSE_NONE && m_missionTimerStarted) m_missionTimer += event.rTime; @@ -2932,10 +2929,20 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_missionTimerStarted = false; m_missionTimer = 0.0f; + std::string backgroundPath = ""; + Gfx::Color backgroundUp = Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f); + Gfx::Color backgroundDown = Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f); + Gfx::Color backgroundCloudUp = Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f); + Gfx::Color backgroundCloudDown = Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f); + bool backgroundFull = false; + try { + m_ui->GetLoadingScreen()->SetProgress(0.05f, RT_LOADING_PROCESSING); CLevelParser levelParser(m_levelCategory, m_levelChap, m_levelRank); levelParser.Load(); + int numObjects = levelParser.CountLines("CreateObject"); + m_ui->GetLoadingScreen()->SetProgress(0.1f, RT_LOADING_LEVEL_SETTINGS); int rankObj = 0; int rankGadget = 0; @@ -3039,7 +3046,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (line->GetCommand() == "CacheAudio" && !resetObject) { - m_sound->CacheMusic(std::string("../")+line->GetParam("filename")->AsPath("music")); + std::string filename = line->GetParam("filename")->AsPath("music"); + m_ui->GetLoadingScreen()->SetProgress(0.15f, RT_LOADING_MUSIC, filename); + m_sound->CacheMusic(std::string("../")+filename); continue; } @@ -3047,6 +3056,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) { auto audioChange = MakeUnique(); audioChange->Read(line.get()); + m_ui->GetLoadingScreen()->SetProgress(0.15f, RT_LOADING_MUSIC, CResourceManager::CleanPath("music/"+audioChange->music)); m_sound->CacheMusic(audioChange->music); m_audioChange.push_back(std::move(audioChange)); continue; @@ -3076,7 +3086,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) { if (line->GetParam("filename")->IsDefined()) { - m_audioTrack = std::string("../")+line->GetParam("filename")->AsPath("music"); + m_audioTrack = "../"+line->GetParam("filename")->AsPath("music"); } else { @@ -3090,7 +3100,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (line->GetParam("satcom")->IsDefined()) { - m_satcomTrack = std::string("../")+line->GetParam("satcom")->AsPath("music"); + m_satcomTrack = "../"+line->GetParam("satcom")->AsPath("music"); m_satcomRepeat = line->GetParam("satcomRepeat")->AsBool(true); } else @@ -3100,7 +3110,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (line->GetParam("editor")->IsDefined()) { - m_editorTrack = std::string("../")+line->GetParam("editor")->AsPath("music"); + m_editorTrack = "../"+line->GetParam("editor")->AsPath("music"); m_editorRepeat = line->GetParam("editorRepeat")->AsBool(true); } else @@ -3108,9 +3118,21 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_editorTrack = ""; } - if (!m_audioTrack.empty()) m_sound->CacheMusic(m_audioTrack); - if (!m_satcomTrack.empty()) m_sound->CacheMusic(m_satcomTrack); - if (!m_editorTrack.empty()) m_sound->CacheMusic(m_editorTrack); + if (!m_audioTrack.empty()) + { + m_ui->GetLoadingScreen()->SetProgress(0.15f, RT_LOADING_MUSIC, CResourceManager::CleanPath("music/"+m_audioTrack)); + m_sound->CacheMusic(m_audioTrack); + } + if (!m_satcomTrack.empty()) + { + m_sound->CacheMusic(m_satcomTrack); + m_ui->GetLoadingScreen()->SetProgress(0.15f, RT_LOADING_MUSIC, CResourceManager::CleanPath("music/"+m_satcomTrack)); + } + if (!m_editorTrack.empty()) + { + m_sound->CacheMusic(m_editorTrack); + m_ui->GetLoadingScreen()->SetProgress(0.15f, RT_LOADING_MUSIC, CResourceManager::CleanPath("music/"+m_editorTrack)); + } continue; } @@ -3177,15 +3199,13 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (line->GetCommand() == "Background" && !resetObject) { - std::string path = ""; if (line->GetParam("image")->IsDefined()) - path = line->GetParam("image")->AsPath("textures"); - m_engine->SetBackground(path.c_str(), - line->GetParam("up")->AsColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)), - line->GetParam("down")->AsColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)), - line->GetParam("cloudUp")->AsColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)), - line->GetParam("cloudDown")->AsColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)), - line->GetParam("full")->AsBool(false)); + backgroundPath = line->GetParam("image")->AsPath("textures"); + backgroundUp = line->GetParam("up")->AsColor(backgroundUp); + backgroundDown = line->GetParam("down")->AsColor(backgroundDown); + backgroundCloudUp = line->GetParam("cloudUp")->AsColor(backgroundCloudUp); + backgroundCloudDown = line->GetParam("cloudDown")->AsColor(backgroundCloudDown); + backgroundFull = line->GetParam("full")->AsBool(backgroundFull); continue; } @@ -3229,6 +3249,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (line->GetCommand() == "TerrainGenerate" && !resetObject) { + m_ui->GetLoadingScreen()->SetProgress(0.2f, RT_LOADING_TERRAIN); m_terrain->Generate(line->GetParam("mosaic")->AsInt(20), line->GetParam("brick")->AsInt(3), line->GetParam("size")->AsFloat(20.0f), @@ -3422,7 +3443,14 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) ChangeColor(); // changes the colors of texture if (!m_sceneReadPath.empty()) // loading file ? + { + m_ui->GetLoadingScreen()->SetProgress(0.25f, RT_LOADING_OBJECTS_SAVED); sel = IOReadScene(m_sceneReadPath + "/data.sav", m_sceneReadPath + "/cbot.run"); + } + else + { + m_ui->GetLoadingScreen()->SetProgress(0.25f, RT_LOADING_OBJECTS); + } continue; } @@ -3472,6 +3500,15 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (!TestGadgetQuantity(rankGadget++)) continue; } + + float objectProgress = static_cast(rankObj) / static_cast(numObjects); + std::string details = StrUtils::ToString(rankObj+1)+" / "+StrUtils::ToString(numObjects); + #if DEV_BUILD + // Object categories may spoil the level a bit, so hide them in release builds + details += ": "+CLevelParserParam::FromObjectType(type); + #endif + m_ui->GetLoadingScreen()->SetProgress(0.25f+objectProgress*0.5f, RT_LOADING_OBJECTS, details); + Math::Vector pos = line->GetParam("pos")->AsPoint()*g_unit; float dirAngle = line->GetParam("dir")->AsFloat(0.0f)*Math::PI; bool trainer; @@ -3747,7 +3784,6 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_map->FloorColorMap(line->GetParam("floor")->AsColor(Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f)), line->GetParam("water")->AsColor(Gfx::Color(0.533f, 0.533f, 0.533f, 0.533f))); m_mapShow = line->GetParam("show")->AsBool(true); - m_map->ShowMap(m_mapShow); m_map->SetToy(line->GetParam("toyIcon")->AsBool(false)); m_mapImage = line->GetParam("image")->AsBool(false); if (m_mapImage) @@ -3873,6 +3909,18 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (m_sceneReadPath.empty()) CompileScript(soluce); // compiles all scripts + m_ui->GetLoadingScreen()->SetProgress(1.0f, RT_LOADING_FINISHED); + + if (!resetObject) + { + m_engine->SetBackground(backgroundPath, + backgroundUp, + backgroundDown, + backgroundCloudUp, + backgroundCloudDown, + backgroundFull); + } + if (m_levelCategory == LevelCategory::Missions && !resetObject) // mission? { m_playerProfile->SetFreeGameResearchUnlock(m_playerProfile->GetFreeGameResearchUnlock() | m_researchDone[0]); @@ -3896,7 +3944,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) m_short->SetMode(false); // vehicles? } - CreateShortcuts(); + m_map->ShowMap(m_mapShow); m_map->UpdateMap(); // TODO: m_engine->TimeInit(); ?? m_input->ResetKeyStates(); @@ -3949,6 +3997,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject) if (m_app->GetSceneTestMode()) m_eventQueue->AddEvent(Event(EVENT_QUIT)); + + m_ui->ShowLoadingScreen(false); + CreateShortcuts(); } void CRobotMain::LevelLoadingError(const std::string& error, const std::runtime_error& exception, Phase exitPhase) @@ -4614,51 +4665,44 @@ void CRobotMain::FrameShowLimit(float rTime) //! Compiles all scripts of robots void CRobotMain::CompileScript(bool soluce) { - int nbError = 0; - int lastError = 0; + m_ui->GetLoadingScreen()->SetProgress(0.75f, RT_LOADING_PROGRAMS); - do + int numObjects = m_objMan->CountObjectsImplementing(ObjectInterfaceType::Programmable); + int objCounter = 0; + + for (CObject* obj : m_objMan->GetAllObjects()) { - lastError = nbError; - nbError = 0; - for (CObject* obj : m_objMan->GetAllObjects()) - { - if (! obj->Implements(ObjectInterfaceType::Programmable)) continue; + if (! obj->Implements(ObjectInterfaceType::Programmable)) continue; - CBrain* brain = dynamic_cast(obj)->GetBrain(); - for (auto& prog : brain->GetPrograms()) + float objectProgress = static_cast(objCounter) / static_cast(numObjects); + m_ui->GetLoadingScreen()->SetProgress(0.75f+objectProgress*0.25f, RT_LOADING_PROGRAMS, "for object "+StrUtils::ToString(objCounter+1)+" / "+StrUtils::ToString(numObjects)); + objCounter++; + + CBrain* brain = dynamic_cast(obj)->GetBrain(); + for (auto& prog : brain->GetPrograms()) + { + Program* program = prog.get(); + + if (program->filename.empty()) continue; + + std::string name = "ai/" + program->filename; + if (! brain->ReadProgram(program, const_cast(name.c_str()))) { - Program* program = prog.get(); - - if (program->filename.empty()) continue; - - std::string name = "ai/" + program->filename; - if (! brain->ReadProgram(program, const_cast(name.c_str()))) - { - GetLogger()->Error("Unable to read script from file \"%s\"\n", name.c_str()); - } - if (!brain->GetCompile(program)) nbError++; + GetLogger()->Error("Unable to read script from file \"%s\"\n", name.c_str()); } - - LoadOneScript(obj, nbError); + //? if (!brain->GetCompile(program)) nbError++; } - } - while (nbError > 0 && nbError != lastError); - // Load all solutions. - if (soluce) - { - for (CObject* obj : m_objMan->GetAllObjects()) + if (soluce) { - if (! obj->Implements(ObjectInterfaceType::Programmable)) continue; - - CBrain* brain = dynamic_cast(obj)->GetBrain(); char* name = brain->GetSoluceName(); if (name[0] != 0) { brain->ReadSoluce(name); // load solution } } + + LoadOneScript(obj); } // Start all programs according to the command "run". @@ -4676,7 +4720,7 @@ void CRobotMain::CompileScript(bool soluce) } //! Load all programs of the robot -void CRobotMain::LoadOneScript(CObject *obj, int &nbError) +void CRobotMain::LoadOneScript(CObject *obj) { if (! obj->Implements(ObjectInterfaceType::Programmable)) return; @@ -4693,8 +4737,6 @@ void CRobotMain::LoadOneScript(CObject *obj, int &nbError) char categoryChar = GetLevelCategoryDir(m_levelCategory)[0]; for (unsigned int i = 0; i <= 999; i++) { - //? if (brain->GetCompile(i)) continue; - char file[MAX_FNAME]; sprintf(file, "%c%.3d%.3d%.3d%.3d.txt", categoryChar, m_levelChap, m_levelRank, objRank, i); std::string filename = m_playerProfile->GetSaveFile(file); @@ -4704,14 +4746,13 @@ void CRobotMain::LoadOneScript(CObject *obj, int &nbError) Program* program = brain->GetOrAddProgram(i); if(brain->GetCompile(program)) continue; // If already loaded (e.g. from level file), skip brain->ReadProgram(program, filename.c_str()); - if (!brain->GetCompile(program)) nbError++; + //? if (!brain->GetCompile(program)) nbError++; } } } //! Load all programs of the robot -void CRobotMain::LoadFileScript(CObject *obj, const char* filename, int objRank, - int &nbError) +void CRobotMain::LoadFileScript(CObject *obj, const char* filename, int objRank) { if (objRank == -1) return; @@ -4733,7 +4774,7 @@ void CRobotMain::LoadFileScript(CObject *obj, const char* filename, int objRank, { Program* program = brain->GetOrAddProgram(i); brain->ReadProgram(program, fn); - if (!brain->GetCompile(program)) nbError++; + //? if (!brain->GetCompile(program)) nbError++; } } } @@ -5131,7 +5172,7 @@ void CRobotMain::IOWriteSceneFinished() } //! Resumes the game -CObject* CRobotMain::IOReadObject(CLevelParserLine *line, const char* filename, int objRank) +CObject* CRobotMain::IOReadObject(CLevelParserLine *line, const char* filename, const std::string& objCounterText, float objectProgress, int objRank) { Math::Vector pos = line->GetParam("pos")->AsPoint()*g_unit; Math::Vector dir = line->GetParam("angle")->AsPoint()*(Math::PI/180.0f); @@ -5140,6 +5181,13 @@ CObject* CRobotMain::IOReadObject(CLevelParserLine *line, const char* filename, ObjectType type = line->GetParam("type")->AsObjectType(); int id = line->GetParam("id")->AsInt(); + std::string details = objCounterText; + #if DEV_BUILD + // Object categories may spoil the level a bit, so hide them in release builds + details += ": "+CLevelParserParam::FromObjectType(type); + #endif + m_ui->GetLoadingScreen()->SetProgress(0.25f+objectProgress*0.5f, RT_LOADING_OBJECTS_SAVED, details); + bool trainer = line->GetParam("trainer")->AsBool(false); bool toy = line->GetParam("toy")->AsBool(false); int option = line->GetParam("option")->AsInt(0); @@ -5222,6 +5270,7 @@ CObject* CRobotMain::IOReadScene(std::string filename, std::string filecbot) { CLevelParser levelParser(filename); levelParser.Load(); + int numObjects = levelParser.CountLines("CreateObject") + levelParser.CountLines("CreatePower") + levelParser.CountLines("CreateFret"); m_base = nullptr; @@ -5229,6 +5278,7 @@ CObject* CRobotMain::IOReadScene(std::string filename, std::string filecbot) CObject* power = nullptr; CObject* sel = nullptr; int objRank = 0; + int objCounter = 0; for (auto& line : levelParser.GetLines()) { if (line->GetCommand() == "Map") @@ -5247,14 +5297,20 @@ CObject* CRobotMain::IOReadScene(std::string filename, std::string filecbot) } if (line->GetCommand() == "CreateFret") - cargo = IOReadObject(line.get(), filename.c_str(), -1); + { + cargo = IOReadObject(line.get(), filename.c_str(), StrUtils::ToString(objCounter+1)+" / "+StrUtils::ToString(numObjects), static_cast(objCounter) / static_cast(numObjects), -1); + objCounter++; + } if (line->GetCommand() == "CreatePower") - power = IOReadObject(line.get(), filename.c_str(), -1); + { + power = IOReadObject(line.get(), filename.c_str(), StrUtils::ToString(objCounter+1)+" / "+StrUtils::ToString(numObjects), static_cast(objCounter) / static_cast(numObjects), -1); + objCounter++; + } if (line->GetCommand() == "CreateObject") { - CObject* obj = IOReadObject(line.get(), filename.c_str(), objRank++); + CObject* obj = IOReadObject(line.get(), filename.c_str(), StrUtils::ToString(objCounter+1)+" / "+StrUtils::ToString(numObjects), static_cast(objCounter) / static_cast(numObjects), objRank++); if (line->GetParam("select")->AsBool(false)) sel = obj; @@ -5276,32 +5332,33 @@ CObject* CRobotMain::IOReadScene(std::string filename, std::string filecbot) assert(power->Implements(ObjectInterfaceType::Transportable)); dynamic_cast(power)->SetTransporter(obj); } - cargo = nullptr; + cargo = nullptr; power = nullptr; + + objCounter++; } } // Compiles scripts. - int nbError = 0; - int lastError = 0; - do + m_ui->GetLoadingScreen()->SetProgress(0.75f, RT_LOADING_PROGRAMS); + numObjects = m_objMan->CountObjectsImplementing(ObjectInterfaceType::Programmable); + objCounter = 0; + + for (CObject* obj : m_objMan->GetAllObjects()) { - lastError = nbError; - nbError = 0; - for (CObject* obj : m_objMan->GetAllObjects()) - { - if (IsObjectBeingTransported(obj)) continue; + if (! obj->Implements(ObjectInterfaceType::Programmable)) continue; - if (obj->Implements(ObjectInterfaceType::Programmable)) - { - objRank = obj->GetDefRank(); - if (objRank == -1) continue; + float objectProgress = static_cast(objCounter) / static_cast(numObjects); + m_ui->GetLoadingScreen()->SetProgress(0.75f+objectProgress*0.2f, RT_LOADING_PROGRAMS, "for object "+StrUtils::ToString(objCounter+1)+" / "+StrUtils::ToString(numObjects)); + objCounter++; - LoadFileScript(obj, filename.c_str(), objRank, nbError); - } - } + if (IsObjectBeingTransported(obj)) continue; // TODO: WTF, programmable transportable objects? + + objRank = obj->GetDefRank(); + if (objRank == -1) continue; + + LoadFileScript(obj, filename.c_str(), objRank); } - while (nbError > 0 && nbError != lastError); // Starts scripts for (CObject* obj : m_objMan->GetAllObjects()) @@ -5318,6 +5375,8 @@ CObject* CRobotMain::IOReadScene(std::string filename, std::string filecbot) } } + m_ui->GetLoadingScreen()->SetProgress(0.95f, RT_LOADING_CBOT_SAVE); + // Reads the file of stacks of execution. FILE* file = fOpen((CResourceManager::GetSaveLocation() + "/" + filecbot).c_str(), "rb"); if (file != NULL) @@ -5346,6 +5405,8 @@ CObject* CRobotMain::IOReadScene(std::string filename, std::string filecbot) fClose(file); } + m_ui->GetLoadingScreen()->SetProgress(1.0f, RT_LOADING_FINISHED); + return sel; } @@ -5879,6 +5940,7 @@ void CRobotMain::UpdateSpeedLabel() bool CRobotMain::CreateShortcuts() { if (m_phase != PHASE_SIMUL) return false; + if (m_ui->GetLoadingScreen()->IsVisible()) return false; if (!m_shortCut) return false; return m_short->CreateShortcuts(); } @@ -5892,7 +5954,7 @@ void CRobotMain::UpdateMap() //! Indicates whether the mini-map is visible bool CRobotMain::GetShowMap() { - return m_map->GetShowMap() && m_mapShow; + return m_mapShow; } @@ -5902,7 +5964,7 @@ void CRobotMain::SetMovieLock(bool lock) m_movieLock = lock; CreateShortcuts(); - m_map->ShowMap(!m_movieLock && m_mapShow); + m_map->ShowMap(!m_movieLock && m_mapShow && !m_ui->GetLoadingScreen()->IsVisible()); if (m_movieLock) HiliteClear(); } diff --git a/src/object/robotmain.h b/src/object/robotmain.h index f9878b14..550641bc 100644 --- a/src/object/robotmain.h +++ b/src/object/robotmain.h @@ -50,7 +50,6 @@ enum Phase PHASE_APPERANCE, PHASE_MAIN_MENU, PHASE_LEVEL_LIST, - PHASE_LOADING, PHASE_SIMUL, PHASE_SETUPd, PHASE_SETUPg, @@ -273,8 +272,8 @@ public: void FrameShowLimit(float rTime); void CompileScript(bool soluce); - void LoadOneScript(CObject *pObj, int &nerror); - void LoadFileScript(CObject *pObj, const char* filename, int objRank, int &nerror); + void LoadOneScript(CObject *pObj); + void LoadFileScript(CObject *pObj, const char* filename, int objRank); void SaveAllScript(); void SaveOneScript(CObject *pObj); void SaveFileScript(CObject *pObj, const char* filename, int objRank); @@ -293,7 +292,7 @@ public: void IOWriteSceneFinished(); CObject* IOReadScene(std::string filename, std::string filecbot); void IOWriteObject(CLevelParserLine *line, CObject* obj); - CObject* IOReadObject(CLevelParserLine *line, const char* filename, int objRank); + CObject* IOReadObject(CLevelParserLine *line, const char* filename, const std::string& objCounterText, float objectProgress, int objRank); int CreateSpot(Math::Vector pos, Gfx::Color color); diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp index e79ba571..c94faebe 100644 --- a/src/ui/maindialog.cpp +++ b/src/ui/maindialog.cpp @@ -125,7 +125,7 @@ bool CMainDialog::EventProcess(const Event &event) if ( pressedButton == EVENT_INTERFACE_AGAIN ) { StopDialog(); - m_main->ChangePhase(PHASE_LOADING); + m_main->ChangePhase(PHASE_SIMUL); } if ( pressedButton == EVENT_DIALOG_OK ) diff --git a/src/ui/mainmap.cpp b/src/ui/mainmap.cpp index f6068653..262691ae 100644 --- a/src/ui/mainmap.cpp +++ b/src/ui/mainmap.cpp @@ -39,7 +39,6 @@ CMainMap::CMainMap() m_event = CApplication::GetInstancePointer()->GetEventQueue(); m_engine = Gfx::CEngine::GetInstancePointer(); - m_mapMode = 1; m_bFixImage = false; } @@ -129,20 +128,19 @@ void CMainMap::ShowMap(bool bShow) if (pw == nullptr) return; + + pm = static_cast(pw->SearchControl(EVENT_OBJECT_MAP)); + if (pm != nullptr) + pm->SetState(STATE_VISIBLE, bShow); + + ps = static_cast(pw->SearchControl(EVENT_OBJECT_MAPZOOM)); + if (ps != nullptr) + ps->SetState(STATE_VISIBLE, bShow); + if (bShow) { DimMap(); } - else - { - pm = static_cast(pw->SearchControl(EVENT_OBJECT_MAP)); - if (pm != nullptr) - pm->ClearState(STATE_VISIBLE); - - ps = static_cast(pw->SearchControl(EVENT_OBJECT_MAPZOOM)); - if (ps != nullptr) - ps->ClearState(STATE_VISIBLE); - } } // Dimensions of the mini-map. @@ -162,8 +160,6 @@ void CMainMap::DimMap() if (pm == nullptr) return; - pm->SetState(STATE_VISIBLE, (m_mapMode != 0)); - dim.x = 100.0f/640.0f; dim.y = 100.0f/480.0f; pos.x = 540.0f/640.0f; @@ -174,8 +170,6 @@ void CMainMap::DimMap() ps = static_cast(pw->SearchControl(EVENT_OBJECT_MAPZOOM)); if (ps != nullptr) { - ps->SetState(STATE_VISIBLE, (m_mapMode != 0)); - dim.x = SCROLL_WIDTH; dim.y = 66.0f / 480.0f; pos.x = 523.0f / 640.0f; @@ -349,13 +343,6 @@ void CMainMap::UpdateMap() pm->UpdateTerrain(); } -// Indicates if the mini-map is visible. - -bool CMainMap::GetShowMap() -{ - return ( m_mapMode != 0 ); -} - // Indicates whether the mini-map displays a still image. bool CMainMap::GetFixImage() @@ -401,4 +388,3 @@ void CMainMap::SetHighlight(CObject* pObj) } - diff --git a/src/ui/mainmap.h b/src/ui/mainmap.h index e5767289..d1dc2902 100644 --- a/src/ui/mainmap.h +++ b/src/ui/mainmap.h @@ -49,7 +49,6 @@ public: void ZoomMap(float zoom); void ZoomMap(); void MapEnable(bool bEnable); - bool GetShowMap(); bool GetFixImage(); CObject* DetectMap(Math::Point pos, bool &bInMap); void SetHighlight(CObject* pObj); @@ -64,7 +63,6 @@ protected: Gfx::CEngine* m_engine; CInterface* m_interface; - int m_mapMode; bool m_bFixImage; }; diff --git a/src/ui/mainui.cpp b/src/ui/mainui.cpp index d2b33f57..ea2b8dfe 100644 --- a/src/ui/mainui.cpp +++ b/src/ui/mainui.cpp @@ -63,11 +63,12 @@ namespace Ui CMainUserInterface::CMainUserInterface() { + m_app = CApplication::GetInstancePointer(); m_main = CRobotMain::GetInstancePointer(); m_engine = Gfx::CEngine::GetInstancePointer(); m_particle = m_engine->GetParticle(); m_interface = m_main->GetInterface(); - m_sound = CApplication::GetInstancePointer()->GetSound(); + m_sound = m_app->GetSound(); m_settings = CSettings::GetInstancePointer(); m_dialog = MakeUnique(); @@ -112,6 +113,27 @@ CMainDialog* CMainUserInterface::GetDialog() return m_dialog.get(); } +void CMainUserInterface::ShowLoadingScreen(bool show) +{ + if (show) + { + m_app->SetMouseMode(MOUSE_NONE); + m_currentScreen = m_screenLoading.get(); + m_screenLoading->CreateInterface(); + } + else + { + m_screenLoading->DestroyInterface(); + m_currentScreen = nullptr; + m_app->SetMouseMode(m_settings->GetSystemMouse() ? MOUSE_SYSTEM : MOUSE_ENGINE); + } +} + +CScreenLoading* CMainUserInterface::GetLoadingScreen() +{ + return m_screenLoading.get(); +} + // Changes phase. @@ -162,10 +184,6 @@ void CMainUserInterface::ChangePhase(Phase phase) m_screenLevelList->SetLevelCategory(m_main->GetLevelCategory()); m_currentScreen = m_screenLevelList.get(); } - if (m_phase == PHASE_LOADING) - { - m_currentScreen = m_screenLoading.get(); - } if (m_phase >= PHASE_SETUPd && m_phase <= PHASE_SETUPs) { CScreenSetup* screenSetup = GetSetupScreen(m_phase); diff --git a/src/ui/mainui.h b/src/ui/mainui.h index 529f8e1e..56a97e8c 100644 --- a/src/ui/mainui.h +++ b/src/ui/mainui.h @@ -23,6 +23,7 @@ #include +class CApplication; class CSettings; class CSoundInterface; @@ -64,6 +65,9 @@ public: CMainDialog* GetDialog(); + void ShowLoadingScreen(bool show); + CScreenLoading* GetLoadingScreen(); + bool EventProcess(const Event &event); void ChangePhase(Phase phase); @@ -90,6 +94,7 @@ protected: CScreenSetup* GetSetupScreen(Phase phase); protected: + CApplication* m_app; CRobotMain* m_main; Gfx::CEngine* m_engine; Gfx::CParticle* m_particle; diff --git a/src/ui/screen/screen_io_read.cpp b/src/ui/screen/screen_io_read.cpp index 641d42a9..f4096bec 100644 --- a/src/ui/screen/screen_io_read.cpp +++ b/src/ui/screen/screen_io_read.cpp @@ -167,7 +167,7 @@ bool CScreenIORead::EventProcess(const Event &event) if(m_inSimulation) { m_main->StopSuspend(); - m_main->ChangePhase(PHASE_LOADING); + m_main->ChangePhase(PHASE_SIMUL); } return false; } diff --git a/src/ui/screen/screen_level_list.cpp b/src/ui/screen/screen_level_list.cpp index 8ba8d73d..1fe60e11 100644 --- a/src/ui/screen/screen_level_list.cpp +++ b/src/ui/screen/screen_level_list.cpp @@ -294,7 +294,7 @@ bool CScreenLevelList::EventProcess(const Event &event) case EVENT_INTERFACE_PLAY: m_main->SetLevel(m_category, m_chap[m_category]+1, m_sel[m_category]+1); - m_main->ChangePhase(PHASE_LOADING); + m_main->ChangePhase(PHASE_SIMUL); break; case EVENT_INTERFACE_READ: diff --git a/src/ui/screen/screen_loading.cpp b/src/ui/screen/screen_loading.cpp index 5b037d8f..ea9759f8 100644 --- a/src/ui/screen/screen_loading.cpp +++ b/src/ui/screen/screen_loading.cpp @@ -19,10 +19,13 @@ #include "ui/screen/screen_loading.h" +#include "common/config.h" + #include "app/app.h" #include "ui/controls/button.h" #include "ui/controls/edit.h" +#include "ui/controls/gauge.h" #include "ui/controls/interface.h" #include "ui/controls/label.h" #include "ui/controls/window.h" @@ -31,6 +34,7 @@ namespace Ui { CScreenLoading::CScreenLoading() +: m_visible(false) { } @@ -68,24 +72,90 @@ void CScreenLoading::CreateInterface() pg = pw->CreateGroup(pos, ddim, 22, EVENT_NULL); pg->SetState(STATE_SHADOW); - pos.x = 220.0f/640.0f; + pos.x = 257.5f/640.0f; pos.y = 210.0f/480.0f; - ddim.x = 200.0f/640.0f; + ddim.x = 125.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); + pos.y -= ddim.y*1.75f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL2, ""); + pl->SetTextAlign(Gfx::TEXT_ALIGN_CENTER); + + pos.y -= ddim.y*1.0f; + pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL3, ""); + pl->SetTextAlign(Gfx::TEXT_ALIGN_CENTER); + pl->SetFontSize(Gfx::FONT_SIZE_SMALL*0.75f); + + pos.y -= ddim.y*2.0f; + pw->CreateGauge(pos, ddim, 0, EVENT_LOADING); + SetBackground("textures/interface/interface.png"); + + m_engine->SetDrawWorld(false); + m_app->Render(); + + m_visible = true; +} + +void CScreenLoading::DestroyInterface() +{ + if (!m_visible) return; + m_visible = false; + + m_engine->SetBackForce(false); + m_engine->SetDrawWorld(true); + + m_interface->DeleteControl(EVENT_WINDOW5); } bool CScreenLoading::EventProcess(const Event &event) { - m_app->Render(); // render the frame once before we start loading - m_main->ChangePhase(PHASE_SIMUL); + return false; // Stop all events! +} - return false; +bool CScreenLoading::IsVisible() +{ + return m_visible; +} + +void CScreenLoading::SetProgress(float progress, const std::string& text, const std::string& details) +{ + if (!m_visible) return; + + CWindow* pw = static_cast(m_interface->SearchControl(EVENT_WINDOW5)); + if (pw == nullptr) return; + + CLabel* pl = static_cast(pw->SearchControl(EVENT_LABEL2)); + if (pl != nullptr) + { + pl->SetName(text); + } + + pl = static_cast(pw->SearchControl(EVENT_LABEL3)); + if (pl != nullptr) + { + pl->SetName(details); + } + + CGauge* pg = static_cast(pw->SearchControl(EVENT_LOADING)); + if (pg != nullptr) + { + pg->SetLevel(progress); + } + + SetBackground("textures/interface/interface.png"); + m_engine->SetBackForce(true); + m_app->Render(); +} + +void CScreenLoading::SetProgress(float progress, ResTextType text, const std::string& details) +{ + std::string name; + GetResource(RES_TEXT, text, name); + SetProgress(progress, name, details); } } // namespace Ui diff --git a/src/ui/screen/screen_loading.h b/src/ui/screen/screen_loading.h index e3dddaae..b69c242a 100644 --- a/src/ui/screen/screen_loading.h +++ b/src/ui/screen/screen_loading.h @@ -21,6 +21,8 @@ #include "ui/screen/screen.h" +#include "common/restext.h" + namespace Ui { @@ -30,7 +32,16 @@ public: CScreenLoading(); void CreateInterface() override; + void DestroyInterface(); bool EventProcess(const Event &event) override; + + bool IsVisible(); + + void SetProgress(float progress, const std::string& text, const std::string& details = ""); + void SetProgress(float progress, ResTextType text, const std::string& details = ""); + +protected: + bool m_visible; }; } // namespace Ui