[colobot] 208/390: Implemented autosave (#292)

Didier Raboud odyx at moszumanska.debian.org
Fri Jun 12 14:21:46 UTC 2015


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

odyx pushed a commit to branch upstream/latest
in repository colobot.

commit a1fe9c8d7f771ded2d903d7341d250b0ed67c037
Author: krzys-h <krzys_h at interia.pl>
Date:   Tue Nov 11 14:50:44 2014 +0100

    Implemented autosave (#292)
---
 src/common/event.h                       |   3 +
 src/common/resources/resourcemanager.cpp | 113 ++++++++++++++++++++------
 src/common/resources/resourcemanager.h   |   5 ++
 src/common/restext.cpp                   |   3 +
 src/object/robotmain.cpp                 | 132 ++++++++++++++++++++++++++++++-
 src/object/robotmain.h                   |  15 ++++
 src/ui/maindialog.cpp                    | 110 +++++++++++++++++++++++++-
 src/ui/maindialog.h                      |   3 +
 src/ui/slider.cpp                        |  15 ++--
 9 files changed, 363 insertions(+), 36 deletions(-)

diff --git a/src/common/event.h b/src/common/event.h
index bb9e123..ed5d60e 100644
--- a/src/common/event.h
+++ b/src/common/event.h
@@ -241,6 +241,9 @@ enum EventType
     EVENT_INTERFACE_EDITVALUE= 477,
     EVENT_INTERFACE_SOLUCE4 = 478,
     EVENT_INTERFACE_BLOOD   = 479,
+    EVENT_INTERFACE_AUTOSAVE_ENABLE = 780,
+    EVENT_INTERFACE_AUTOSAVE_INTERVAL = 781,
+    EVENT_INTERFACE_AUTOSAVE_SLOTS = 782,
 
     EVENT_INTERFACE_KINFO1  = 500,
     EVENT_INTERFACE_KINFO2  = 501,
diff --git a/src/common/resources/resourcemanager.cpp b/src/common/resources/resourcemanager.cpp
index 7329871..28eebfa 100644
--- a/src/common/resources/resourcemanager.cpp
+++ b/src/common/resources/resourcemanager.cpp
@@ -154,48 +154,67 @@ CSNDFile* CResourceManager::GetSNDFileHandler(const std::string &filename)
 
 bool CResourceManager::Exists(const std::string &filename)
 {
-    return PHYSFS_exists(CleanPath(filename).c_str());
+    if(PHYSFS_isInit())
+    {
+        return PHYSFS_exists(CleanPath(filename).c_str());
+    }
+    return false;
 }
 
 bool CResourceManager::DirectoryExists(const std::string& directory)
 {
-    return PHYSFS_exists(CleanPath(directory).c_str()) && PHYSFS_isDirectory(CleanPath(directory).c_str());
+    if(PHYSFS_isInit())
+    {
+        return PHYSFS_exists(CleanPath(directory).c_str()) && PHYSFS_isDirectory(CleanPath(directory).c_str());
+    }
+    return false;
 }
 
 bool CResourceManager::CreateDirectory(const std::string& directory)
 {
-    return PHYSFS_mkdir(CleanPath(directory).c_str());
+    if(PHYSFS_isInit())
+    {
+        return PHYSFS_mkdir(CleanPath(directory).c_str());
+    }
+    return false;
 }
 
 //TODO: Don't use boost::filesystem here
 bool CResourceManager::RemoveDirectory(const std::string& directory)
 {
-    bool success = true;
-    std::string writeDir = PHYSFS_getWriteDir();
-    try
-    {
-        fs::remove_all(writeDir + "/" + CleanPath(directory));
-    }
-    catch (std::exception & e)
+    if(PHYSFS_isInit())
     {
-        success = false;
+        bool success = true;
+        std::string writeDir = PHYSFS_getWriteDir();
+        try
+        {
+            fs::remove_all(writeDir + "/" + CleanPath(directory));
+        }
+        catch (std::exception & e)
+        {
+            success = false;
+        }
+        return success;
     }
-    return success;
+    return false;
 }
 
 std::vector<std::string> CResourceManager::ListFiles(const std::string &directory)
 {
     std::vector<std::string> result;
+    
+    if(PHYSFS_isInit())
+    {
+        char **files = PHYSFS_enumerateFiles(CleanPath(directory).c_str());
 
-    char **files = PHYSFS_enumerateFiles(CleanPath(directory).c_str());
+        for (char **i = files; *i != nullptr; i++)
+        {
+            result.push_back(*i);
+        }
 
-    for (char **i = files; *i != nullptr; i++)
-    {
-        result.push_back(*i);
+        PHYSFS_freeList(files);
     }
 
-    PHYSFS_freeList(files);
-
     return result;
 }
 
@@ -203,18 +222,21 @@ std::vector<std::string> CResourceManager::ListDirectories(const std::string &di
 {
     std::vector<std::string> result;
 
-    char **files = PHYSFS_enumerateFiles(CleanPath(directory).c_str());
-
-    for (char **i = files; *i != nullptr; i++)
+    if(PHYSFS_isInit())
     {
-        std::string path = CleanPath(directory) + "/" + (*i);
-        if (PHYSFS_isDirectory(path.c_str()))
+        char **files = PHYSFS_enumerateFiles(CleanPath(directory).c_str());
+
+        for (char **i = files; *i != nullptr; i++)
         {
-            result.push_back(*i);
+            std::string path = CleanPath(directory) + "/" + (*i);
+            if (PHYSFS_isDirectory(path.c_str()))
+            {
+                result.push_back(*i);
+            }
         }
-    }
 
-    PHYSFS_freeList(files);
+        PHYSFS_freeList(files);
+    }
 
     return result;
 }
@@ -241,6 +263,45 @@ long long CResourceManager::GetLastModificationTime(const std::string& filename)
     return -1;
 }
 
+//TODO: Don't use boost::filesystem. Why doesn't PHYSFS have this?
+bool CResourceManager::Move(const std::string& from, const std::string& to)
+{
+    if(PHYSFS_isInit())
+    {
+        bool success = true;
+        std::string writeDir = PHYSFS_getWriteDir();
+        try
+        {
+            fs::rename(writeDir + "/" + CleanPath(from), writeDir + "/" + CleanPath(to));
+        }
+        catch (std::exception & e)
+        {
+            success = false;
+        }
+        return success;
+    }
+    return false;
+}
+
+//TODO: Don't use boost::filesystem. Why doesn't PHYSFS have this?
+bool CResourceManager::Copy(const std::string& from, const std::string& to)
+{
+    if(PHYSFS_isInit())
+    {
+        bool success = true;
+        std::string writeDir = PHYSFS_getWriteDir();
+        try
+        {
+            fs::copy(writeDir + "/" + CleanPath(from), writeDir + "/" + CleanPath(to));
+        }
+        catch (std::exception & e)
+        {
+            success = false;
+        }
+        return success;
+    }
+    return false;
+}
 
 int CResourceManager::SDLClose(SDL_RWops *context)
 {
diff --git a/src/common/resources/resourcemanager.h b/src/common/resources/resourcemanager.h
index e34ea10..84e28fd 100644
--- a/src/common/resources/resourcemanager.h
+++ b/src/common/resources/resourcemanager.h
@@ -62,6 +62,11 @@ public:
     static long long GetFileSize(const std::string &filename);
     //! Returns last modification date as timestamp
     static long long GetLastModificationTime(const std::string &filename);
+    
+    //! Move file/directory
+    static bool Move(const std::string &from, const std::string &to);
+    //! Copy file/directory
+    static bool Copy(const std::string &from, const std::string &to);
 
 private:
     static int SDLSeek(SDL_RWops *context, int offset, int whence);
diff --git a/src/common/restext.cpp b/src/common/restext.cpp
index 493f141..09bf6bd 100644
--- a/src/common/restext.cpp
+++ b/src/common/restext.cpp
@@ -206,6 +206,9 @@ void InitializeRestext()
     stringsEvent[EVENT_INTERFACE_EDITVALUE] = TR("Big indent\\Indent 2 or 4 spaces per level defined by braces");
     stringsEvent[EVENT_INTERFACE_SOLUCE4]   = TR("Access to solutions\\Show program \"4: Solution\" in the exercises");
     stringsEvent[EVENT_INTERFACE_BLOOD]     = TR("Blood\\Display blood when the astronaut or the alien queen is hit");
+    stringsEvent[EVENT_INTERFACE_AUTOSAVE_ENABLE]   = TR("Autosave\\Enables autosave");
+    stringsEvent[EVENT_INTERFACE_AUTOSAVE_INTERVAL] = TR("Autosave interval\\How often your game will autosave");
+    stringsEvent[EVENT_INTERFACE_AUTOSAVE_SLOTS]    = TR("Autosave slots\\How many autosave slots you'll have");
 
     stringsEvent[EVENT_INTERFACE_KDEF]      = TR("Standard controls\\Standard key functions");
     stringsEvent[EVENT_INTERFACE_KLEFT]     = TR("Turn left\\turns the bot to the left");
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index b44e704..3e00f93 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -708,6 +708,11 @@ CRobotMain::CRobotMain(CApplication* app, bool loadProfile)
     m_winTerminate   = false;
     
     m_exitAfterMission = false;
+    
+    m_autosave = true;
+    m_autosaveInterval = 15;
+    m_autosaveSlots = 3;
+    m_autosaveLast = 0.0f;
 
     m_joystickDeadzone = 0.2f;
     SetDefaultInputBindings();
@@ -3393,7 +3398,7 @@ void CRobotMain::InitEye()
 bool CRobotMain::EventFrame(const Event &event)
 {
     m_time += event.rTime;
-    if (!m_movieLock) m_gameTime += event.rTime;
+    if (!m_movieLock && m_pause->GetPause() == PAUSE_NONE) m_gameTime += event.rTime;
 
     if (!m_immediatSatCom && !m_beginSatCom &&
          m_gameTime > 0.1f && m_phase == PHASE_SIMUL)
@@ -3404,6 +3409,12 @@ bool CRobotMain::EventFrame(const Event &event)
     
     if(!m_movieLock && m_pause->GetPause() == PAUSE_NONE && m_missionTimerStarted)
         m_missionTimer += event.rTime;
+    
+    if(m_pause->GetPause() == PAUSE_NONE && m_autosave && m_gameTime >= m_autosaveLast+(m_autosaveInterval*60) && m_phase == PHASE_SIMUL) {
+        m_autosaveLast = m_gameTime;
+        Autosave();
+    }
+    //CLogger::GetInstancePointer()->Debug("%f %f %d\n", m_gameTime, m_autosaveLast, m_autosaveInterval);
 
     m_water->EventProcess(event);
     m_cloud->EventProcess(event);
@@ -4742,6 +4753,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
         m_app->ResetKeyStates();
         m_time = 0.0f;
         m_gameTime = 0.0f;
+        m_autosaveLast = 0.0f;
         m_infoUsed = 0;
 
         m_selectObject = sel;
@@ -6930,3 +6942,121 @@ void CRobotMain::StartMissionTimer()
         m_missionTimerStarted = true;
     }
 }
+
+void CRobotMain::SetAutosave(bool enable)
+{
+    m_autosave = enable;
+    m_autosaveLast = m_gameTime;
+    AutosaveRotate(false);
+}
+
+bool CRobotMain::GetAutosave()
+{
+    return m_autosave;
+}
+
+void CRobotMain::SetAutosaveInterval(int interval)
+{
+    m_autosaveInterval = interval;
+    m_autosaveLast = m_gameTime;
+}
+
+int CRobotMain::GetAutosaveInterval()
+{
+    return m_autosaveInterval;
+}
+
+void CRobotMain::SetAutosaveSlots(int slots)
+{
+    m_autosaveSlots = slots;
+    AutosaveRotate(false);
+}
+
+int CRobotMain::GetAutosaveSlots()
+{
+    return m_autosaveSlots;
+}
+
+int CRobotMain::AutosaveRotate(bool freeOne)
+{
+    CLogger::GetInstancePointer()->Debug("Rotate autosaves...\n");
+    // Find autosave dirs
+    auto saveDirs = CResourceManager::ListDirectories(std::string(GetSavegameDir()) + "/" + GetGamerName());
+    std::map<int, std::string> autosaveDirs;
+    for(auto& dir : saveDirs)
+    {
+        try
+        {
+            const std::string autosavePrefix = "autosave";
+            if(dir.substr(0, autosavePrefix.length()) == "autosave")
+            {
+                int id = boost::lexical_cast<int>(dir.substr(autosavePrefix.length()));
+                autosaveDirs[id] = std::string(GetSavegameDir()) + "/" + GetGamerName() + "/" + dir;
+            }
+        }
+        catch(...)
+        {
+            CLogger::GetInstancePointer()->Debug("bad?\n");
+            // skip
+        }
+    }
+    if(autosaveDirs.size() == 0) return 1;
+    
+    // Remove all but last m_autosaveSlots
+    std::map<int, std::string> autosavesToKeep;
+    int last_id = autosaveDirs.rbegin()->first;
+    int count = 0;
+    int to_keep = m_autosaveSlots-(freeOne ? 1 : 0);
+    int new_last_id = Math::Min(autosaveDirs.size(), to_keep);
+    bool rotate = false;
+    for(int i = last_id; i > 0; i--)
+    {
+        if(autosaveDirs.count(i) > 0)
+        {
+            count++;
+            if(count > m_autosaveSlots-(freeOne ? 1 : 0) || !m_autosave)
+            {
+                CLogger::GetInstancePointer()->Trace("Remove %s\n", autosaveDirs[i].c_str());
+                CResourceManager::RemoveDirectory(autosaveDirs[i]);
+                rotate = true;
+            }
+            else
+            {
+                CLogger::GetInstancePointer()->Trace("Keep %s\n", autosaveDirs[i].c_str());
+                autosavesToKeep[new_last_id-count+1] = autosaveDirs[i];
+            }
+        }
+    }
+    
+    // Rename autosaves that we kept
+    if(rotate) {
+        for(auto& save : autosavesToKeep) {
+            std::string newDir = std::string(GetSavegameDir()) + "/" + GetGamerName() + "/autosave" + boost::lexical_cast<std::string>(save.first);
+            CLogger::GetInstancePointer()->Trace("Rename %s -> %s\n", save.second.c_str(), newDir.c_str());
+            CResourceManager::Move(save.second, newDir);
+        }
+    }
+    
+    return rotate ? count : count+1;
+}
+
+void CRobotMain::Autosave()
+{
+    int id = AutosaveRotate(true);
+    CLogger::GetInstancePointer()->Info("Autosave!\n");
+    
+    std::string dir = std::string(GetSavegameDir()) + "/" + GetGamerName() + "/autosave" + boost::lexical_cast<std::string>(id);
+    
+    if (!CResourceManager::DirectoryExists(dir))
+    {
+        CResourceManager::CreateDirectory(dir);
+    }
+    
+    std::string savegameFileName = dir + "/data.sav";
+    std::string fileCBot = CResourceManager::GetSaveLocation() + "/" + dir + "/cbot.run";
+    char timestr[100];
+    TimeToAscii(time(NULL), timestr);
+    IOWriteScene(savegameFileName.c_str(), fileCBot.c_str(), const_cast<char*>((std::string("[AUTOSAVE] ")+timestr).c_str()));
+    
+    m_dialog->MakeSaveScreenshot(dir + "/screen.png");
+}
\ No newline at end of file
diff --git a/src/object/robotmain.h b/src/object/robotmain.h
index 1affd1f..3405906 100644
--- a/src/object/robotmain.h
+++ b/src/object/robotmain.h
@@ -396,6 +396,13 @@ public:
     std::string& GetUserLevelName(int id);
     
     void        StartMissionTimer();
+    
+    void        SetAutosave(bool enable);
+    bool        GetAutosave();
+    void        SetAutosaveInterval(int interval);
+    int         GetAutosaveInterval();
+    void        SetAutosaveSlots(int slots);
+    int         GetAutosaveSlots();
 
 protected:
     bool        EventFrame(const Event &event);
@@ -429,6 +436,9 @@ protected:
     void        ExecuteCmd(char *cmd);
     bool        TestGadgetQuantity(int rank);
     void        UpdateSpeedLabel();
+    
+    int         AutosaveRotate(bool freeOne);
+    void        Autosave();
 
 
 protected:
@@ -589,5 +599,10 @@ protected:
     bool            m_missionTimerEnabled;
     bool            m_missionTimerStarted;
     float           m_missionTimer;
+    
+    bool            m_autosave;
+    int             m_autosaveInterval;
+    int             m_autosaveSlots;
+    float           m_autosaveLast;
 };
 
diff --git a/src/ui/maindialog.cpp b/src/ui/maindialog.cpp
index 69a9136..351ccee 100644
--- a/src/ui/maindialog.cpp
+++ b/src/ui/maindialog.cpp
@@ -167,6 +167,7 @@ CMainDialog::CMainDialog()
     m_bCameraInvertY = false;
     m_bEffect        = true;
     m_bBlood         = true;
+    m_bAutosave      = true;
     m_shotDelay      = 0;
 
     m_glintMouse = Math::Point(0.0f, 0.0f);
@@ -1239,6 +1240,34 @@ void CMainDialog::ChangePhase(Phase phase)
         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);
@@ -2570,6 +2599,23 @@ bool CMainDialog::EventProcess(const Event &event)
                 ChangeSetupButtons();
                 UpdateSetupButtons();
                 break;
+                
+            case EVENT_INTERFACE_AUTOSAVE_ENABLE:
+                m_bAutosave = !m_bAutosave;
+                m_main->SetAutosave(m_bAutosave);
+                ChangeSetupButtons();
+                UpdateSetupButtons();
+                break;
+            
+            case EVENT_INTERFACE_AUTOSAVE_INTERVAL:
+                ChangeSetupButtons();
+                UpdateSetupButtons();
+                break;
+                
+            case EVENT_INTERFACE_AUTOSAVE_SLOTS:
+                ChangeSetupButtons();
+                UpdateSetupButtons();
+                break;
 
             default:
                 break;
@@ -4175,12 +4221,17 @@ bool CMainDialog::IOWriteScene()
     std::string fileCBot = CResourceManager::GetSaveLocation() + "/" + dir + "/cbot.run";
     m_main->IOWriteScene(savegameFileName.c_str(), fileCBot.c_str(), info);
 
-    m_shotDelay = 3;
-    m_shotName = CResourceManager::GetSaveLocation() + "/" + dir + "/screen.png"; //TODO: Use PHYSFS?
-
+    MakeSaveScreenshot(dir + "/screen.png");
+    
     return true;
 }
 
+void CMainDialog::MakeSaveScreenshot(const std::string& name)
+{
+    m_shotDelay = 3;
+    m_shotName = CResourceManager::GetSaveLocation() + "/" + name; //TODO: Use PHYSFS?
+}
+
 // Reads the scene.
 
 bool CMainDialog::IOReadScene()
@@ -4726,6 +4777,27 @@ void CMainDialog::UpdateSetupButtons()
     {
         pc->SetState(STATE_CHECK, m_bBlood);
     }
+    
+    pc = static_cast<CCheck*>(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_ENABLE));
+    if ( pc != 0 )
+    {
+        pc->SetState(STATE_CHECK, m_bAutosave);
+    }
+    
+    ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_INTERVAL));
+    if ( ps != 0 )
+    {
+        ps->SetState(STATE_ENABLE, m_bAutosave);
+        ps->SetVisibleValue(m_main->GetAutosaveInterval());
+        
+    }
+    
+    ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_SLOTS));
+    if ( ps != 0 )
+    {
+        ps->SetState(STATE_ENABLE, m_bAutosave);
+        ps->SetVisibleValue(m_main->GetAutosaveSlots());
+    }
 
     pc = static_cast<CCheck*>(pw->SearchControl(EVENT_INTERFACE_SHADOW));
     if ( pc != 0 )
@@ -4891,6 +4963,20 @@ void CMainDialog::ChangeSetupButtons()
         value = ps->GetVisibleValue();
         m_sound->SetMusicVolume(static_cast<int>(value));
     }
+    
+    ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_INTERVAL));
+    if ( ps != 0 )
+    {
+        value = ps->GetVisibleValue();
+        m_main->SetAutosaveInterval(static_cast<int>(value));
+    }
+    
+    ps = static_cast<CSlider*>(pw->SearchControl(EVENT_INTERFACE_AUTOSAVE_SLOTS));
+    if ( ps != 0 )
+    {
+        value = ps->GetVisibleValue();
+        m_main->SetAutosaveSlots(static_cast<int>(value));
+    }
 }
 
 
@@ -4913,6 +4999,9 @@ void CMainDialog::SetupMemorize()
     GetProfile().SetIntProperty("Setup", "CameraInvertY", m_bCameraInvertY);
     GetProfile().SetIntProperty("Setup", "InterfaceEffect", m_bEffect);
     GetProfile().SetIntProperty("Setup", "Blood", m_bBlood);
+    GetProfile().SetIntProperty("Setup", "Autosave", m_bAutosave);
+    GetProfile().SetIntProperty("Setup", "AutosaveInterval", m_main->GetAutosaveInterval());
+    GetProfile().SetIntProperty("Setup", "AutosaveSlots", m_main->GetAutosaveSlots());
     GetProfile().SetIntProperty("Setup", "GroundShadow", m_engine->GetShadow());
     GetProfile().SetIntProperty("Setup", "GroundSpot", m_engine->GetGroundSpot());
     GetProfile().SetIntProperty("Setup", "ObjectDirty", m_engine->GetDirty());
@@ -5066,6 +5155,21 @@ void CMainDialog::SetupRecall()
         m_bBlood = iValue;
     }
     
+    if ( GetProfile().GetIntProperty("Setup", "Autosave", iValue) )
+    {
+        m_bAutosave = iValue;
+    }
+    
+    if ( GetProfile().GetIntProperty("Setup", "AutosaveInterval", iValue) )
+    {
+        m_main->SetAutosaveInterval(iValue);
+    }
+    
+    if ( GetProfile().GetIntProperty("Setup", "AutosaveSlots", iValue) )
+    {
+        m_main->SetAutosaveSlots(iValue);
+    }
+    
     if ( GetProfile().GetIntProperty("Setup", "GroundShadow", iValue) )
     {
         m_engine->SetShadow(iValue);
diff --git a/src/ui/maindialog.h b/src/ui/maindialog.h
index aa98e3e..67a0bbb 100644
--- a/src/ui/maindialog.h
+++ b/src/ui/maindialog.h
@@ -139,6 +139,8 @@ public:
     void    ShowSoluceUpdate();
     
     std::string& GetUserLevelName(int id);
+    
+    void    MakeSaveScreenshot(const std::string& name);
 
 protected:
     void    GlintMove();
@@ -240,6 +242,7 @@ protected:
     bool            m_bCameraInvertY;       // for CCamera
     bool            m_bEffect;          // for CCamera
     bool            m_bBlood;          // for CCamera
+    bool            m_bAutosave;
 
     Math::Point          m_glintMouse;
     float                m_glintTime;
diff --git a/src/ui/slider.cpp b/src/ui/slider.cpp
index 58fcc26..70ba7ef 100644
--- a/src/ui/slider.cpp
+++ b/src/ui/slider.cpp
@@ -469,15 +469,18 @@ void CSlider::Draw()
 
     if ( m_bHoriz )
     {
-        sprintf(text, "%d", static_cast<int>(m_min+m_visibleValue*(m_max-m_min)));
-        h = m_engine->GetText()->GetHeight(m_fontType, m_fontSize);
-        pos.x = m_pos.x+m_dim.x+(10.0f/640.0f);
-        pos.y = m_pos.y+(m_dim.y-h)/2.0f;
-        m_engine->GetText()->DrawText(text, m_fontType, m_fontSize, pos, m_dim.x, Gfx::TEXT_ALIGN_LEFT, 0);
+        if ( m_state & STATE_ENABLE )
+        {
+            sprintf(text, "%d", static_cast<int>(m_min+m_visibleValue*(m_max-m_min)));
+            h = m_engine->GetText()->GetHeight(m_fontType, m_fontSize);
+            pos.x = m_pos.x+m_dim.x+(10.0f/640.0f);
+            pos.y = m_pos.y+(m_dim.y-h)/2.0f;
+            m_engine->GetText()->DrawText(text, m_fontType, m_fontSize, pos, m_dim.x, Gfx::TEXT_ALIGN_LEFT, 0);
+        }
     }
     else
     {
-        if ( m_state & STATE_VALUE )
+        if ( m_state & STATE_VALUE && m_state & STATE_ENABLE )
         {
             pos.x = m_pos.x+m_dim.x+4.0f/640.0f;
             h = m_dim.y-m_marginButton*2.0f;

-- 
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