[colobot] 87/145: Allow using custom paths for win/lost scenes

Didier Raboud odyx at moszumanska.debian.org
Mon Jul 11 12:56:20 UTC 2016


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit 250047579f3e23071507e461cf616c366125693b
Author: krzys-h <krzys_h at interia.pl>
Date:   Fri May 27 23:37:36 2016 +0200

    Allow using custom paths for win/lost scenes
---
 data                                |  2 +-
 src/level/level_category.cpp        |  4 ---
 src/level/level_category.h          |  5 ---
 src/level/robotmain.cpp             | 64 +++++++++++++++++++++++++------------
 src/level/robotmain.h               |  6 ++--
 src/ui/screen/screen_level_list.cpp | 10 ------
 src/ui/screen/screen_level_list.h   |  1 -
 7 files changed, 49 insertions(+), 43 deletions(-)

diff --git a/data b/data
index 229394c..cbd7b5b 160000
--- a/data
+++ b/data
@@ -1 +1 @@
-Subproject commit 229394cda28955dfa6ec554c58365d11c647f55c
+Subproject commit cbd7b5b46a2098b8d88a96370cc8d9aeb05a71f7
diff --git a/src/level/level_category.cpp b/src/level/level_category.cpp
index e2eab7d..c927455 100644
--- a/src/level/level_category.cpp
+++ b/src/level/level_category.cpp
@@ -30,10 +30,6 @@ const std::map<LevelCategory, std::string> CATEGORY_DIR_MAP = {
     { LevelCategory::Challenges,   "challenges"   },
     { LevelCategory::CodeBattles,  "battles"      },
     { LevelCategory::CustomLevels, "custom"       },
-
-    { LevelCategory::Win,          "win"          },
-    { LevelCategory::Lost,         "lost"         },
-    { LevelCategory::Perso,        "perso"        },
 };
 
 std::string GetLevelCategoryDir(LevelCategory category)
diff --git a/src/level/level_category.h b/src/level/level_category.h
index 1db6bcc..4001b67 100644
--- a/src/level/level_category.h
+++ b/src/level/level_category.h
@@ -30,11 +30,6 @@ enum class LevelCategory
     CodeBattles,
     CustomLevels,
     Max,
-
-    // These are special types not runnable by the user
-    Win,
-    Lost,
-    Perso,
 };
 
 std::string GetLevelCategoryDir(LevelCategory category);
diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp
index e41a060..2990ceb 100644
--- a/src/level/robotmain.cpp
+++ b/src/level/robotmain.cpp
@@ -228,8 +228,6 @@ CRobotMain::CRobotMain()
     m_tooltipName.clear();
     m_tooltipTime = 0.0f;
 
-    m_endingWinRank   = 0;
-    m_endingLostRank  = 0;
     m_winTerminate   = false;
 
     m_globalMagnifyDamage = 1.0f;
@@ -570,14 +568,14 @@ void CRobotMain::ChangePhase(Phase phase)
     if (m_phase == PHASE_WIN)
     {
         m_sound->StopAll();
-        if (m_endingWinRank == -1)
+        if (m_endingWin.empty())
         {
             ChangePhase(PHASE_LEVEL_LIST);
         }
         else
         {
-            m_winTerminate = (m_endingWinRank == 904);
-            SetLevel(LevelCategory::Win, 0, m_endingWinRank);
+            m_winTerminate = (m_endingWin.substr(m_endingWin.find_last_of("/")+1) == "win904.txt");
+            m_levelFile = m_endingWin;
             try
             {
                 CreateScene(false, true, false);  // sets scene
@@ -614,14 +612,14 @@ void CRobotMain::ChangePhase(Phase phase)
     if (m_phase == PHASE_LOST)
     {
         m_sound->StopAll();
-        if (m_endingLostRank == -1)
+        if (m_endingLost.empty())
         {
             ChangePhase(PHASE_LEVEL_LIST);
         }
         else
         {
             m_winTerminate = false;
-            SetLevel(LevelCategory::Lost, 0, m_endingLostRank);
+            m_levelFile = m_endingLost;
             try
             {
                 CreateScene(false, true, false);  // sets scene
@@ -2793,7 +2791,7 @@ void CRobotMain::ScenePerso()
     m_lightMan->FlushLights();
     m_particle->FlushParticle();
 
-    SetLevel(LevelCategory::Perso, 0, 0);
+    m_levelFile = "levels/other/perso000.txt";
     try
     {
         CreateScene(false, true, false);  // sets scene
@@ -2844,8 +2842,8 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
         m_displayText->SetEnable(true);
         m_immediatSatCom = false;
         m_lockedSatCom = false;
-        m_endingWinRank   = 0;
-        m_endingLostRank  = 0;
+        m_endingWin = "";
+        m_endingLost = "";
         m_audioChange.clear();
         m_endTake.clear();
         m_endTakeImmediat = false;
@@ -2890,7 +2888,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
         m_missionResultFromScript = false;
     }
 
-    //NOTE: Reset timer always, even when only resetting object positions
+    // NOTE: Reset timer always, even when only resetting object positions
     m_missionTimerEnabled = false;
     m_missionTimerStarted = false;
     m_missionTimer = 0.0f;
@@ -2905,7 +2903,9 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
     try
     {
         m_ui->GetLoadingScreen()->SetProgress(0.05f, RT_LOADING_PROCESSING);
-        CLevelParser levelParser(m_levelCategory, m_levelChap, m_levelRank);
+        GetLogger()->Info("Loading level: %s\n", m_levelFile.c_str());
+        CLevelParser levelParser(m_levelFile);
+        levelParser.SetLevelPaths(m_levelCategory, m_levelChap, m_levelRank);
         levelParser.Load();
         int numObjects = levelParser.CountLines("CreateObject");
         m_ui->GetLoadingScreen()->SetProgress(0.1f, RT_LOADING_LEVEL_SETTINGS);
@@ -2913,11 +2913,6 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
         int rankObj = 0;
         CObject* sel = nullptr;
 
-        /*
-        * NOTE: Moving frequently used lines to the top
-        *       may speed up loading
-        */
-
         for (auto& line : levelParser.GetLines())
         {
             if (line->GetCommand() == "Title" && !resetObject)
@@ -2979,9 +2974,36 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
 
             if (line->GetCommand() == "EndingFile" && !resetObject)
             {
-                // NOTE: The old default was 0, but I think -1 is more correct - 0 means "ending file 000", while -1 means "no ending file"
-                m_endingWinRank  = line->GetParam("win")->AsInt(-1);
-                m_endingLostRank = line->GetParam("lost")->AsInt(-1);
+                auto Process = [&](const std::string& type) -> std::string
+                {
+                    if (line->GetParam(type)->IsDefined())
+                    {
+                        try
+                        {
+                            int rank = boost::lexical_cast<int>(line->GetParam(type)->GetValue());
+                            if (rank >= 0)
+                            {
+                                GetLogger()->Warn("This level is using deprecated way of defining %1$s scene. Please change the %1$s= parameter in EndingFile from %2$d to \"levels/other/%1$s%2$03d.txt\".\n", type.c_str(), rank);
+                                std::stringstream ss;
+                                ss << "levels/other/" << type << std::setfill('0') << std::setw(3) << rank << ".txt";
+                                return ss.str();
+                            }
+                            else
+                            {
+                                GetLogger()->Warn("This level is using deprecated way of defining %1$s scene. Please remove the %1$s= parameter in EndingFile.\n", type.c_str());
+                                return "";
+                            }
+
+                        }
+                        catch (boost::bad_lexical_cast &e)
+                        {
+                            return line->GetParam(type)->AsPath("levels");
+                        }
+                    }
+                    return "";
+                };
+                m_endingWin = Process("win");
+                m_endingLost = Process("lost");
                 continue;
             }
 
@@ -5288,9 +5310,11 @@ float CRobotMain::GetPersoAngle()
 
 void CRobotMain::SetLevel(LevelCategory cat, int chap, int rank)
 {
+    GetLogger()->Debug("Change level to %s %d %d\n", GetLevelCategoryDir(cat).c_str(), chap, rank);
     m_levelCategory = cat;
     m_levelChap = chap;
     m_levelRank = rank;
+    m_levelFile = CLevelParser::BuildScenePath(m_levelCategory, m_levelChap, m_levelRank);
 }
 
 LevelCategory CRobotMain::GetLevelCategory()
diff --git a/src/level/robotmain.h b/src/level/robotmain.h
index 3247813..505b5b9 100644
--- a/src/level/robotmain.h
+++ b/src/level/robotmain.h
@@ -458,6 +458,8 @@ protected:
     LevelCategory   m_levelCategory;
     int             m_levelChap = 0;
     int             m_levelRank = 0;
+    //! if set, loads this file instead of building from category/chap/rank
+    std::string     m_levelFile = "";
     std::string     m_sceneReadPath;
 
     float           m_winDelay = 0.0f;
@@ -517,8 +519,8 @@ protected:
 
     std::string     m_scriptName = "";
     std::string     m_scriptFile = "";
-    int             m_endingWinRank = 0;
-    int             m_endingLostRank = 0;
+    std::string     m_endingWin = "";
+    std::string     m_endingLost = "";
     bool            m_winTerminate = false;
 
     float           m_globalMagnifyDamage = 0.0f;
diff --git a/src/ui/screen/screen_level_list.cpp b/src/ui/screen/screen_level_list.cpp
index ee91369..3811035 100644
--- a/src/ui/screen/screen_level_list.cpp
+++ b/src/ui/screen/screen_level_list.cpp
@@ -47,7 +47,6 @@ namespace Ui
 CScreenLevelList::CScreenLevelList(CMainDialog* mainDialog)
     : m_dialog(mainDialog),
       m_category{},
-      m_listCategory{},
       m_sceneSoluce{false},
       m_maxList{0},
       m_accessChap{0}
@@ -57,15 +56,6 @@ CScreenLevelList::CScreenLevelList(CMainDialog* mainDialog)
 void CScreenLevelList::SetLevelCategory(LevelCategory category)
 {
     m_category = category;
-
-    if ( static_cast<int>(m_category) >= static_cast<int>(LevelCategory::Max) )
-    {
-        m_category = m_listCategory;
-    }
-    else
-    {
-        m_listCategory = m_category;
-    }
 }
 
 void CScreenLevelList::CreateInterface()
diff --git a/src/ui/screen/screen_level_list.h b/src/ui/screen/screen_level_list.h
index 2073e54..b27f88c 100644
--- a/src/ui/screen/screen_level_list.h
+++ b/src/ui/screen/screen_level_list.h
@@ -63,7 +63,6 @@ protected:
     Ui::CMainDialog* m_dialog;
 
     LevelCategory m_category;
-    LevelCategory m_listCategory;
 
     bool m_sceneSoluce;
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list