aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2010-10-27 22:37:51 +0000
committerJohannes Schickel2010-10-27 22:37:51 +0000
commit2ad28b8cd53c363f12d920c746795e0d371dc9f9 (patch)
treef849131b939c148f7843a60dd8d68b36ffb5a772
parent8a08ca1f39a0dc5ad6003d8213fe8aec4acb7327 (diff)
downloadscummvm-rg350-2ad28b8cd53c363f12d920c746795e0d371dc9f9.tar.gz
scummvm-rg350-2ad28b8cd53c363f12d920c746795e0d371dc9f9.tar.bz2
scummvm-rg350-2ad28b8cd53c363f12d920c746795e0d371dc9f9.zip
ENGINE: Generalize SCUMM play time counting and move it into Engine.
This implements Max's idea on -devel ("Re: [Scummvm-devel] ATTN Engine authors: Advanced engine features") from 27.10.2010 on 11:12PM CEST. Unlike the SCUMM implementation it stores the play time as ms instead of s. The SCUMM engine was adapted to use this instead to reduce code duplication. svn-id: r53892
-rw-r--r--engines/engine.cpp23
-rw-r--r--engines/engine.h25
-rw-r--r--engines/scumm/saveload.cpp6
-rw-r--r--engines/scumm/scumm.cpp10
-rw-r--r--engines/scumm/scumm.h3
5 files changed, 52 insertions, 15 deletions
diff --git a/engines/engine.cpp b/engines/engine.cpp
index 965dcca485..78e431aa09 100644
--- a/engines/engine.cpp
+++ b/engines/engine.cpp
@@ -94,6 +94,8 @@ Engine::Engine(OSystem *syst)
_saveFileMan(_system->getSavefileManager()),
_targetName(ConfMan.getActiveDomainName()),
_pauseLevel(0),
+ _pauseStartTime(0),
+ _engineStartTime(_system->getMillis()),
_mainMenuDialog(NULL) {
g_engine = this;
@@ -380,9 +382,12 @@ void Engine::pauseEngine(bool pause) {
_pauseLevel--;
if (_pauseLevel == 1 && pause) {
+ _pauseStartTime = _system->getMillis();
pauseEngineIntern(true);
} else if (_pauseLevel == 0) {
pauseEngineIntern(false);
+ _engineStartTime += _system->getMillis() - _pauseStartTime;
+ _pauseStartTime = 0;
}
}
@@ -398,6 +403,24 @@ void Engine::openMainMenuDialog() {
syncSoundSettings();
}
+uint32 Engine::getTotalPlayTime() const {
+ if (!_pauseLevel)
+ return _system->getMillis() - _engineStartTime;
+ else
+ return _pauseStartTime - _engineStartTime;
+}
+
+void Engine::resetTotalPlayTime(uint32 time) {
+ const uint32 currentTime = _system->getMillis();
+
+ // We need to reset the pause start time here in case the engine is already
+ // paused to avoid any incorrect play time counting.
+ if (_pauseLevel > 0)
+ _pauseStartTime = currentTime;
+
+ _engineStartTime = currentTime - time;
+}
+
int Engine::runDialog(GUI::Dialog &dialog) {
pauseEngine(true);
int result = dialog.runModal();
diff --git a/engines/engine.h b/engines/engine.h
index ead1526d72..b1575962ff 100644
--- a/engines/engine.h
+++ b/engines/engine.h
@@ -74,6 +74,17 @@ private:
*/
int _pauseLevel;
+ /**
+ * The time when the pause was started.
+ */
+ uint32 _pauseStartTime;
+
+ /**
+ * The time when the engine was started. This value is used to calculate
+ * the current play time of the game running.
+ */
+ int32 _engineStartTime;
+
public:
@@ -234,6 +245,20 @@ public:
*/
void openMainMenuDialog();
+ /**
+ * Get the total play time.
+ *
+ * @return How long the player has been playing in ms.
+ */
+ uint32 getTotalPlayTime() const;
+
+ /**
+ * Reset the game time counter to the specified time.
+ *
+ * @param time Play time to set up in ms.
+ */
+ void resetTotalPlayTime(uint32 time = 0);
+
inline Common::TimerManager *getTimerManager() { return _timer; }
inline Common::EventManager *getEventManager() { return _eventMan; }
inline Common::SaveFileManager *getSaveFileManager() { return _saveFileMan; }
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 28ec6c182f..b9cb0ae10f 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -378,10 +378,10 @@ bool ScummEngine::loadState(int slot, bool compat) {
return false;
}
- _engineStartTime = _system->getMillis() / 1000 - infos.playtime;
+ resetTotalPlayTime(infos.playtime * 1000);
} else {
// start time counting
- _engineStartTime = _system->getMillis() / 1000;
+ resetTotalPlayTime();
}
// Due to a bug in scummvm up to and including 0.3.0, save games could be saved
@@ -797,7 +797,7 @@ void ScummEngine::saveInfos(Common::WriteStream* file) {
// still save old format for older versions
section.timeTValue = 0;
- section.playtime = _system->getMillis() / 1000 - _engineStartTime;
+ section.playtime = getTotalPlayTime() / 1000;
TimeDate curTime;
_system->getTimeAndDate(curTime);
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index d711888c2c..2c654402fa 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -1927,7 +1927,7 @@ int ScummEngine::getTalkSpeed() {
#pragma mark -
Common::Error ScummEngine::go() {
- _engineStartTime = _system->getMillis() / 1000;
+ resetTotalPlayTime();
// If requested, load a save game instead of running the boot script
if (_saveLoadFlag != 2 || !loadState(_saveLoadSlot, _saveTemporaryState)) {
@@ -2505,10 +2505,6 @@ void ScummEngine::startManiac() {
void ScummEngine::pauseEngineIntern(bool pause) {
if (pause) {
- // Record start of the pause, so that we can later
- // adjust _engineStartTime accordingly.
- _pauseStartTime = _system->getMillis();
-
// Pause sound & video
_oldSoundsPaused = _sound->_soundsPaused;
_sound->pauseSounds(true);
@@ -2526,10 +2522,6 @@ void ScummEngine::pauseEngineIntern(bool pause) {
// Resume sound & video
_sound->pauseSounds(_oldSoundsPaused);
-
- // Adjust engine start time
- _engineStartTime += (_system->getMillis() - _pauseStartTime) / 1000;
- _pauseStartTime = 0;
}
}
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index 346d8fb79a..0a513b6068 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -700,9 +700,6 @@ protected:
void saveInfos(Common::WriteStream* file);
static bool loadInfos(Common::SeekableReadStream *file, InfoStuff *stuff);
- int32 _engineStartTime;
- int32 _pauseStartTime;
-
protected:
/* Script VM - should be in Script class */
uint32 _localScriptOffsets[1024];