[Scummvm-cvs-logs] SF.net SVN: scummvm: [31985] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sat May 10 21:20:38 CEST 2008


Revision: 31985
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31985&view=rev
Author:   lordhoto
Date:     2008-05-10 12:20:38 -0700 (Sat, 10 May 2008)

Log Message:
-----------
Implemented pausing of timers, this should fix some minor glitches.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/gui_hof.cpp
    scummvm/trunk/engines/kyra/gui_mr.cpp
    scummvm/trunk/engines/kyra/gui_v1.cpp
    scummvm/trunk/engines/kyra/timer.cpp
    scummvm/trunk/engines/kyra/timer.h

Modified: scummvm/trunk/engines/kyra/gui_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_hof.cpp	2008-05-10 18:56:00 UTC (rev 31984)
+++ scummvm/trunk/engines/kyra/gui_hof.cpp	2008-05-10 19:20:38 UTC (rev 31985)
@@ -666,6 +666,8 @@
 #pragma mark -
 
 int GUI_HoF::optionsButton(Button *button) {
+	PauseTimer pause(*_vm->_timer);
+
 	_restartGame = false;
 	_reloadTemporarySave = false;
 

Modified: scummvm/trunk/engines/kyra/gui_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_mr.cpp	2008-05-10 18:56:00 UTC (rev 31984)
+++ scummvm/trunk/engines/kyra/gui_mr.cpp	2008-05-10 19:20:38 UTC (rev 31985)
@@ -789,6 +789,8 @@
 }
 
 int GUI_MR::optionsButton(Button *button) {
+	PauseTimer pause(*_vm->_timer);
+
 	_vm->musicUpdate(0);
 
 	_screen->hideMouse();

Modified: scummvm/trunk/engines/kyra/gui_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v1.cpp	2008-05-10 18:56:00 UTC (rev 31984)
+++ scummvm/trunk/engines/kyra/gui_v1.cpp	2008-05-10 19:20:38 UTC (rev 31985)
@@ -30,6 +30,7 @@
 #include "kyra/animator_v1.h"
 #include "kyra/sound.h"
 #include "kyra/gui_v1.h"
+#include "kyra/timer.h"
 
 #include "common/config-manager.h"
 #include "common/savefile.h"
@@ -406,6 +407,8 @@
 }
 
 int GUI_v1::buttonMenuCallback(Button *caller) {
+	PauseTimer pause(*_vm->_timer);
+
 	_displayMenu = true;
 
 	assert(_vm->_guiStrings);

Modified: scummvm/trunk/engines/kyra/timer.cpp
===================================================================
--- scummvm/trunk/engines/kyra/timer.cpp	2008-05-10 18:56:00 UTC (rev 31984)
+++ scummvm/trunk/engines/kyra/timer.cpp	2008-05-10 19:20:38 UTC (rev 31985)
@@ -62,10 +62,32 @@
 };
 } // end of anonymous namespace
 
+void TimerManager::pause(bool pause) {
+	if (pause) {
+		++_isPaused;
+
+		if (_isPaused == 1) {
+			_isPaused = true;
+			_pauseStart = _system->getMillis();
+		}
+	} else if (!pause && _isPaused > 0) {
+		--_isPaused;
+
+		if (_isPaused == 0) {
+			const uint32 pausedTime = _system->getMillis() - _pauseStart;
+			_nextRun += pausedTime;
+
+			for (Iterator pos = _timers.begin(); pos != _timers.end(); ++pos) {
+				pos->lastUpdate += pausedTime;
+				pos->nextRun += pausedTime;
+			}
+		}
+	}
+}
+
 void TimerManager::reset() {
-	for (Iterator pos = _timers.begin(); pos != _timers.end(); ++pos) {
+	for (Iterator pos = _timers.begin(); pos != _timers.end(); ++pos)
 		delete pos->func;
-	}
 
 	_timers.clear();
 }
@@ -93,7 +115,7 @@
 void TimerManager::update() {
 	debugC(9, kDebugLevelTimer, "TimerManager::update()");
 
-	if (_system->getMillis() < _nextRun)
+	if (_system->getMillis() < _nextRun || _isPaused)
 		return;
 
 	_nextRun += 99999;
@@ -121,8 +143,10 @@
 void TimerManager::resync() {
 	debugC(9, kDebugLevelTimer, "TimerManager::resync()");
 
+	const uint32 curTime = _isPaused ? _pauseStart : _system->getMillis();
+
 	_nextRun = 0;	// force rerun
-	Common::for_each(_timers.begin(), _timers.end(), TimerResync(_vm, _system->getMillis()));
+	Common::for_each(_timers.begin(), _timers.end(), TimerResync(_vm, curTime));
 }
 
 void TimerManager::resetNextRun() {
@@ -225,8 +249,10 @@
 }
 
 void TimerManager::loadDataFromFile(Common::SeekableReadStream &file, int version) {
-	debugC(9, kDebugLevelTimer, "TimerManager::loadDataFromFile(%p, %d)", (const void*)&file, version);
+	debugC(9, kDebugLevelTimer, "TimerManager::loadDataFromFile(%p, %d)", (const void *)&file, version);
 
+	const uint32 loadTime = _isPaused ? _pauseStart : _system->getMillis();
+
 	if (version <= 7) {
 		_nextRun = 0;
 		for (int i = 0; i < 32; ++i) {
@@ -240,12 +266,11 @@
 				timer->countdown = countdown;
 
 				if (nextRun) {
-					timer->nextRun = nextRun + _system->getMillis();
+					timer->nextRun = nextRun + loadTime;
 					timer->lastUpdate = timer->nextRun - countdown * _vm->tickLength();
 				} else {
-					uint32 curTime = _system->getMillis();
-					timer->nextRun = curTime;
-					timer->lastUpdate = curTime - countdown * _vm->tickLength();
+					timer->nextRun = loadTime;
+					timer->lastUpdate = loadTime - countdown * _vm->tickLength();
 				}
 			} else {
 				warning("Loading timer data for non existing timer %d", i);
@@ -272,14 +297,16 @@
 }
 
 void TimerManager::saveDataToFile(Common::WriteStream &file) const {
-	debugC(9, kDebugLevelTimer, "TimerManager::saveDataToFile(%p)", (const void*)&file);
+	debugC(9, kDebugLevelTimer, "TimerManager::saveDataToFile(%p)", (const void *)&file);
 
+	const uint32 saveTime = _isPaused ? _pauseStart : _system->getMillis();
+
 	file.writeByte(count());
 	for (CIterator pos = _timers.begin(); pos != _timers.end(); ++pos) {
 		file.writeByte(pos->id);
 		file.writeByte(pos->enabled);
 		file.writeSint32BE(pos->countdown);
-		file.writeSint32BE(pos->lastUpdate - _system->getMillis());
+		file.writeSint32BE(pos->lastUpdate - saveTime);
 	}
 }
 

Modified: scummvm/trunk/engines/kyra/timer.h
===================================================================
--- scummvm/trunk/engines/kyra/timer.h	2008-05-10 18:56:00 UTC (rev 31984)
+++ scummvm/trunk/engines/kyra/timer.h	2008-05-10 19:20:38 UTC (rev 31985)
@@ -49,9 +49,11 @@
 
 class TimerManager {
 public:
-	TimerManager(KyraEngine *vm, OSystem *sys) : _vm(vm), _system(sys), _timers(), _nextRun(0) {}
+	TimerManager(KyraEngine *vm, OSystem *sys) : _vm(vm), _system(sys), _timers(), _nextRun(0), _isPaused(0), _pauseStart(0) {}
 	~TimerManager() { reset(); }
 
+	void pause(bool pause);
+
 	void reset();
 
 	void addTimer(uint8 id, TimerFunc *func, int countdown, bool enabled);
@@ -82,10 +84,21 @@
 	Common::List<TimerEntry> _timers;
 	uint32 _nextRun;
 
+	uint _isPaused;
+	uint32 _pauseStart;
+
 	typedef Common::List<TimerEntry>::iterator Iterator;
 	typedef Common::List<TimerEntry>::const_iterator CIterator;
 };
 
+class PauseTimer {
+public:
+	PauseTimer(TimerManager &timer) : _timer(timer) { _timer.pause(true); }
+	~PauseTimer() { _timer.pause(false); }
+private:
+	TimerManager &_timer;
+};
+
 } // end of namespace Kyra
 
 #endif


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list