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

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

commit 6d2fd18b419ddc202fa14cb14c98e8f3d5ecf646
Author: krzys-h <krzy...@interia.pl>
Date:   Wed Oct 29 17:53:46 2014 +0100

    Implemented mission timer
---
 src/common/misc.cpp            | 13 ++++++++
 src/common/misc.h              |  2 ++
 src/graphics/engine/engine.cpp | 14 +++++++++
 src/graphics/engine/engine.h   |  7 +++++
 src/object/brain.cpp           |  2 ++
 src/object/robotmain.cpp       | 67 +++++++++++++++++++++++++++++++++++++-----
 src/object/robotmain.h         |  6 ++++
 7 files changed, 103 insertions(+), 8 deletions(-)

diff --git a/src/common/misc.cpp b/src/common/misc.cpp
index 4954fc0..35a5560 100644
--- a/src/common/misc.cpp
+++ b/src/common/misc.cpp
@@ -26,6 +26,8 @@
 #include <string.h>
 #include <ctype.h>
 #include <time.h>
+#include <sstream>
+#include <iomanip>
 
 
 // Returns a non-accented letter.
@@ -232,6 +234,17 @@ void TimeToAsciiClean(time_t time, char *buffer)
                     when.tm_hour, when.tm_min);
 }
 
+std::string TimeFormat(float time)
+{
+    int minutes = floor(time/60);
+    double time2 = fmod(time, 60);
+    double seconds;
+    double fraction = modf(time2, &seconds)*100;
+    std::ostringstream sstream;
+    sstream << std::setfill('0') << std::setw(2) << minutes << ":" << 
std::setfill('0') << std::setw(2) << floor(seconds) << "." << std::setfill('0') 
<< std::setw(2) << floor(fraction);
+    return sstream.str();
+}
+
 
 // Adds an extension to file, if doesn't already one.
 
diff --git a/src/common/misc.h b/src/common/misc.h
index 4b75ae3..b53bbdd 100644
--- a/src/common/misc.h
+++ b/src/common/misc.h
@@ -22,6 +22,7 @@
 
 
 #include <time.h>
+#include <string>
 
 
 // TODO: rewrite/refactor or remove
@@ -32,6 +33,7 @@ extern char GetToLower(char letter);
 
 extern void TimeToAscii(time_t time, char *buffer);
 extern void TimeToAsciiClean(time_t time, char *buffer);
+extern std::string TimeFormat(float time);
 
 extern void AddExt(char* filename, const char* ext);
 
diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp
index 03bff72..3c642ae 100644
--- a/src/graphics/engine/engine.cpp
+++ b/src/graphics/engine/engine.cpp
@@ -520,6 +520,11 @@ void CEngine::SetStatisticPos(Math::Vector pos)
     m_statisticPos = pos;
 }
 
+void CEngine::SetTimerDisplay(const std::string& text)
+{
+    m_timerText = text;
+}
+
 
 
 /*******************************************************
@@ -3510,6 +3515,7 @@ void CEngine::DrawInterface()
     DrawMouse();
     DrawHighlight();
     DrawStats();
+    DrawTimer();
 }
 
 void CEngine::UpdateGroundSpotTextures()
@@ -4479,6 +4485,14 @@ void CEngine::DrawStats()
     m_text->DrawText(str.str(), FONT_COLOBOT, 12.0f, pos, 1.0f, 
TEXT_ALIGN_LEFT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
 }
 
+void CEngine::DrawTimer()
+{
+    SetState(ENG_RSTATE_TEXT);
+    
+    Math::Point pos(0.98f, 0.98f-m_text->GetAscent(FONT_COLOBOT, 15.0f));
+    m_text->DrawText(m_timerText, FONT_COLOBOT, 15.0f, pos, 1.0f, 
TEXT_ALIGN_RIGHT, 0, Color(1.0f, 1.0f, 1.0f, 1.0f));
+}
+
 
 } // namespace Gfx
 
diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h
index c8e86d1..6ca7d1b 100644
--- a/src/graphics/engine/engine.h
+++ b/src/graphics/engine/engine.h
@@ -780,6 +780,9 @@ public:
     
     //! Sets the coordinates to display in stats window
     void            SetStatisticPos(Math::Vector pos);
+    
+    //! Sets text to display as mission timer
+    void            SetTimerDisplay(const std::string& text);
 
 
     /* *************** Object management *************** */
@@ -1236,6 +1239,8 @@ protected:
     void        DrawMouseSprite(Math::Point pos, Math::Point dim, int icon);
     //! Draw statistic texts
     void        DrawStats();
+    //! Draw mission timer
+    void        DrawTimer();
 
     //! Creates a new tier 2 object (texture)
     EngineBaseObjTexTier&  AddLevel2(EngineBaseObject& p1, const std::string& 
tex1Name, const std::string& tex2Name);
@@ -1442,6 +1447,8 @@ protected:
 
     bool            m_debugLights;
     bool            m_debugDumpLights;
+    
+    std::string     m_timerText;
 };
 
 
diff --git a/src/object/brain.cpp b/src/object/brain.cpp
index dec8cca..f10faac 100644
--- a/src/object/brain.cpp
+++ b/src/object/brain.cpp
@@ -2546,6 +2546,8 @@ void CBrain::RunProgram(int rank)
         BlinkScript(true);  // blink
         m_object->CreateSelectParticle();
         m_main->UpdateShortcuts();
+        if(m_object->GetTrainer())
+            m_main->StartMissionTimer();
     }
 }
 
diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp
index 6ebd34c..10e7648 100644
--- a/src/object/robotmain.cpp
+++ b/src/object/robotmain.cpp
@@ -645,6 +645,10 @@ CRobotMain::CRobotMain(CApplication* app, bool loadProfile)
     m_time = 0.0f;
     m_gameTime = 0.0f;
     m_checkEndTime = 0.0f;
+    
+    m_missionTimerEnabled = false;
+    m_missionTimerStarted = false;
+    m_missionTimer = 0.0f;
 
     m_phase       = PHASE_NAME;
     m_cameraRank  = -1;
@@ -1087,6 +1091,9 @@ void CRobotMain::ResetKeyStates()
 //! Changes phase
 void CRobotMain::ChangePhase(Phase phase)
 {
+    m_missionTimerEnabled = m_missionTimerStarted = false;
+    m_missionTimer = 0.0f;
+    
     if (m_phase == PHASE_SIMUL)  // ends a simulation?
     {
         SaveAllScript();
@@ -1417,10 +1424,7 @@ bool CRobotMain::ProcessEvent(Event &event)
         if (m_displayInfo != nullptr)  // current edition?
             m_displayInfo->EventProcess(event);
         
-        if (m_phase == PHASE_SIMUL)
-        {
-            UpdateInfoText();
-        }
+        UpdateInfoText();
 
         return EventFrame(event);
     }
@@ -1754,12 +1758,14 @@ bool CRobotMain::ProcessEvent(Event &event)
                 break;
 
             case EVENT_WIN:
+                m_missionTimerEnabled = m_missionTimerStarted = false;
                 ChangePhase(PHASE_WIN);
                 if(m_exitAfterMission)
                     m_eventQueue->AddEvent(Event(EVENT_QUIT));
                 break;
 
             case EVENT_LOST:
+                m_missionTimerEnabled = m_missionTimerStarted = false;
                 ChangePhase(PHASE_LOST);
                 if(m_exitAfterMission)
                     m_eventQueue->AddEvent(Event(EVENT_QUIT));
@@ -3365,12 +3371,16 @@ void CRobotMain::AbortMovie()
 //! Updates the text information
 void CRobotMain::UpdateInfoText()
 {
-    CObject* obj = GetSelect();
-    if (obj != nullptr)
+    if (m_phase == PHASE_SIMUL)
     {
-        Math::Vector pos = obj->GetPosition(0);
-        m_engine->SetStatisticPos(pos);
+        CObject* obj = GetSelect();
+        if (obj != nullptr)
+        {
+            Math::Vector pos = obj->GetPosition(0);
+            m_engine->SetStatisticPos(pos);
+        }
     }
+    m_engine->SetTimerDisplay(m_missionTimerEnabled && m_missionTimerStarted ? 
TimeFormat(m_missionTimer) : "");
 }
 
 
@@ -3394,6 +3404,9 @@ bool CRobotMain::EventFrame(const Event &event)
         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;
 
     m_water->EventProcess(event);
     m_cloud->EventProcess(event);
@@ -3760,6 +3773,11 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, 
bool resetObject)
         m_missionResult       = ERR_MISSION_NOTERM;
     }
     
+    //NOTE: Reset timer always, even when only resetting object positions
+    m_missionTimerEnabled = false;
+    m_missionTimerStarted = false;
+    m_missionTimer = 0.0f;
+    
     CLevelParser* level = new CLevelParser(base, rank/100, rank%100);
     level->Load();
 
@@ -3853,6 +3871,15 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, 
bool resetObject)
             continue;
         }
         
+        if (line->GetCommand() == "MissionTimer")
+        {
+            m_missionTimerEnabled = line->GetParam("enabled")->AsBool();
+            if(!line->GetParam("program")->AsBool(false)) {
+                m_missionTimerStarted = true;
+            }
+            continue;
+        }
+        
         if (line->GetCommand() == "CacheAudio" && !resetObject && m_version >= 
2)
         {
             
m_sound->CacheMusic(std::string("../")+line->GetParam("filename")->AsPath("music"));
@@ -6342,12 +6369,14 @@ Error CRobotMain::CheckEndMission(bool frame)
         if (m_missionResult == INFO_LOST) //mission lost?
         {
             m_displayText->DisplayError(INFO_LOST, 
Math::Vector(0.0f,0.0f,0.0f));
+            m_missionTimerEnabled = m_missionTimerStarted = false;
             m_winDelay = 0.0f;
             if (m_lostDelay == 0) m_lostDelay = m_endTakeLostDelay;
             m_displayText->SetEnable(false);
         }
         if (m_missionResult == INFO_LOSTq) //mission lost?
         {
+            m_missionTimerEnabled = m_missionTimerStarted = false;
             m_winDelay = 0.0f;
             if (m_lostDelay == 0) m_lostDelay = 0.1f;
             m_displayText->SetEnable(false);
@@ -6355,6 +6384,11 @@ Error CRobotMain::CheckEndMission(bool frame)
         if (frame && m_base) return ERR_MISSION_NOTERM;
         if (m_missionResult == ERR_OK) { //mission win?
             m_displayText->DisplayError(INFO_WIN, 
Math::Vector(0.0f,0.0f,0.0f));
+            if(m_missionTimerEnabled && m_missionTimerStarted) {
+                CLogger::GetInstancePointer()->Info("Mission time: %s\n", 
TimeFormat(m_missionTimer).c_str());
+                m_displayText->DisplayText(("Time: 
"+TimeFormat(m_missionTimer)).c_str(), Math::Vector(0.0f,0.0f,0.0f));
+            }
+            m_missionTimerEnabled = m_missionTimerStarted = false;
             if (m_winDelay == 0) m_winDelay = m_endTakeWinDelay;
             m_lostDelay = 0.0f;
             m_displayText->SetEnable(false);
@@ -6431,6 +6465,7 @@ Error CRobotMain::CheckEndMission(bool frame)
                     m_lostDelay = 0.1f;  // lost immediately
                     m_winDelay  = 0.0f;
                 }
+                m_missionTimerEnabled = m_missionTimerStarted = false;
                 m_displayText->SetEnable(false);
                 return INFO_LOSTq;
             }
@@ -6442,6 +6477,7 @@ Error CRobotMain::CheckEndMission(bool frame)
                     m_lostDelay = m_endTakeLostDelay;  // lost in 6 seconds
                     m_winDelay  = 0.0f;
                 }
+                m_missionTimerEnabled = m_missionTimerStarted = false;
                 m_displayText->SetEnable(false);
                 return INFO_LOST;
             }
@@ -6460,6 +6496,7 @@ Error CRobotMain::CheckEndMission(bool frame)
                 m_winDelay  = m_endTakeWinDelay;  // wins in x seconds
                 m_lostDelay = 0.0f;
             }
+            m_missionTimerEnabled = m_missionTimerStarted = false;
             m_displayText->SetEnable(false);
             return ERR_OK;  // mission ended
         }
@@ -6478,6 +6515,7 @@ Error CRobotMain::CheckEndMission(bool frame)
     {
         m_winDelay  = 1.0f;  // wins in one second
         m_lostDelay = 0.0f;
+        m_missionTimerEnabled = m_missionTimerStarted = false;
         m_displayText->SetEnable(false);
         return ERR_OK;  // mission ended
     }
@@ -6487,6 +6525,11 @@ Error CRobotMain::CheckEndMission(bool frame)
     if (m_winDelay == 0.0f)
     {
         m_displayText->DisplayError(INFO_WIN, Math::Vector(0.0f,0.0f,0.0f));
+        if(m_missionTimerEnabled && m_missionTimerStarted) {
+            CLogger::GetInstancePointer()->Info("Mission time: %s\n", 
TimeFormat(m_missionTimer).c_str());
+            m_displayText->DisplayText(("Time: 
"+TimeFormat(m_missionTimer)).c_str(), Math::Vector(0.0f,0.0f,0.0f));
+        }
+        m_missionTimerEnabled = m_missionTimerStarted = false;
         m_winDelay  = m_endTakeWinDelay;  // wins in two seconds
         m_lostDelay = 0.0f;
     }
@@ -6960,3 +7003,11 @@ std::string& CRobotMain::GetUserLevelName(int id)
 {
     return m_dialog->GetUserLevelName(id);
 }
+
+void CRobotMain::StartMissionTimer()
+{
+    if(m_missionTimerEnabled && !m_missionTimerStarted) {
+        CLogger::GetInstancePointer()->Info("Starting mission timer...\n");
+        m_missionTimerStarted = true;
+    }
+}
diff --git a/src/object/robotmain.h b/src/object/robotmain.h
index da31e5f..0b89975 100644
--- a/src/object/robotmain.h
+++ b/src/object/robotmain.h
@@ -397,6 +397,8 @@ public:
     void        DisplayError(Error err, Math::Vector goal, float height=15.0f, 
float dist=60.0f, float time=10.0f);
     
     std::string& GetUserLevelName(int id);
+    
+    void        StartMissionTimer();
 
 protected:
     bool        EventFrame(const Event &event);
@@ -589,5 +591,9 @@ protected:
     float           m_colorShiftWater;
 
     std::string     m_oldLocale;
+    
+    bool            m_missionTimerEnabled;
+    bool            m_missionTimerStarted;
+    float           m_missionTimer;
 };
 

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

_______________________________________________
Pkg-games-commits mailing list
Pkg-games-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits

Reply via email to