aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kiewitz2016-10-12 21:48:35 +0200
committerMartin Kiewitz2016-10-12 21:48:35 +0200
commit32ca051485d6bce0939d8fec0676a1fd5d537fc2 (patch)
treef160416cae5e7270594dc8a79be7b5d38d5831fa
parenteef7d91fe1631e44cb5909fb6d0121f18587b637 (diff)
downloadscummvm-rg350-32ca051485d6bce0939d8fec0676a1fd5d537fc2.tar.gz
scummvm-rg350-32ca051485d6bce0939d8fec0676a1fd5d537fc2.tar.bz2
scummvm-rg350-32ca051485d6bce0939d8fec0676a1fd5d537fc2.zip
AGI: Make TIME_DELAY 0 to set the game to 40 fps
Original AGI TIME_DELAY 0 made the game run as fast as possible. We didn't go that far, but it still seems to run too fast. This should hopefully fix that. See bug #9607
-rw-r--r--engines/agi/agi.h2
-rw-r--r--engines/agi/cycle.cpp20
-rw-r--r--engines/agi/global.cpp2
3 files changed, 22 insertions, 2 deletions
diff --git a/engines/agi/agi.h b/engines/agi/agi.h
index 79d05c4b1d..b8c30e9d5c 100644
--- a/engines/agi/agi.h
+++ b/engines/agi/agi.h
@@ -978,7 +978,7 @@ public:
void inGameTimerUpdate();
private:
- uint32 _lastUsedPlayTimeInCycles; // 20 per second
+ uint32 _lastUsedPlayTimeInCycles; // 40 per second
uint32 _lastUsedPlayTimeInSeconds; // actual seconds
uint32 _passedPlayTimeCycles; // increased by 1 every time we passed a cycle
diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp
index 381c462ade..4148306de2 100644
--- a/engines/agi/cycle.cpp
+++ b/engines/agi/cycle.cpp
@@ -413,7 +413,27 @@ int AgiEngine::playGame() {
}
}
+ // Increment the delay value by one, so that we wait for at least 1 cycle
+ // In Original AGI 1 cycle was 50 milliseconds, so 20 frames per second
+ // So TIME_DELAY 1 resulted in around 20 frames per second
+ // 2 resulted in around 10 frames per second
+ // 0 however resulted in no limits at all, so the game ran as fast as possible
+ // We obviously do not want the game to run as fast as possible, so we will use 40 frames per second instead.
+ timeDelay = timeDelay * 2;
+ if (!timeDelay)
+ timeDelay = 1;
+
+ // Our cycle counter runs at 25 milliseconds.
+ // So time delay has to be 1 for the originally unlimited speed - for our 40 fps
+ // 2 for 20 frames per second
+ // 4 for 10 frames per second
+ // and so on.
+
if (_passedPlayTimeCycles >= timeDelay) {
+ // code to check for executed cycles
+ // TimeDate time;
+ // g_system->getTimeAndDate(time);
+ // warning("cycle %d", time.tm_sec);
inGameTimerResetPassedCycles();
interpretCycle();
diff --git a/engines/agi/global.cpp b/engines/agi/global.cpp
index 6f83f02a4e..bd7e4e490f 100644
--- a/engines/agi/global.cpp
+++ b/engines/agi/global.cpp
@@ -247,7 +247,7 @@ void AgiEngine::setVarSecondsTrigger(byte newSeconds) {
// This is also called in the main loop, because the game needs to be sync'd to 20 cycles per second
void AgiEngine::inGameTimerUpdate() {
uint32 curPlayTimeMilliseconds = inGameTimerGet();
- uint32 curPlayTimeCycles = curPlayTimeMilliseconds / 50;
+ uint32 curPlayTimeCycles = curPlayTimeMilliseconds / 25;
if (curPlayTimeCycles == _lastUsedPlayTimeInCycles) {
// No difference, skip updating