aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kiewitz2016-02-13 00:10:43 +0100
committerMartin Kiewitz2016-02-13 00:10:43 +0100
commitaf9028355294ffe569e9100c2cac02eb843b1c11 (patch)
treef95f7aaeeca2d91794fa690b825bb6d01428f661
parentb67cb25e22a0871ebc9135da847cd1bc5dd5a96d (diff)
downloadscummvm-rg350-af9028355294ffe569e9100c2cac02eb843b1c11.tar.gz
scummvm-rg350-af9028355294ffe569e9100c2cac02eb843b1c11.tar.bz2
scummvm-rg350-af9028355294ffe569e9100c2cac02eb843b1c11.zip
AGI: Add time delay overwrite for AppleIIgs
Should somewhat fix bug #7026 Needs testing (although AGI games need to get tested for 1.8.0 anyway)
-rw-r--r--engines/agi/appleIIgs_timedelay_overwrite.h66
-rw-r--r--engines/agi/cycle.cpp46
2 files changed, 112 insertions, 0 deletions
diff --git a/engines/agi/appleIIgs_timedelay_overwrite.h b/engines/agi/appleIIgs_timedelay_overwrite.h
new file mode 100644
index 0000000000..204584157f
--- /dev/null
+++ b/engines/agi/appleIIgs_timedelay_overwrite.h
@@ -0,0 +1,66 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef AGI_APPLEIIGS_DELAY_OVERWRITE_H
+#define AGI_APPLEIIGS_DELAY_OVERWRITE_H
+
+namespace Agi {
+
+struct AgiAppleIIgsDelayOverwriteRoomEntry {
+ int16 fromRoom;
+ int16 toRoom;
+ int16 timeDelayOverwrite; // time delay here is like on PC, so 0 - unlimited, 1 - 20 cycles, 2 - 10 cycles
+};
+
+struct AgiAppleIIgsDelayOverwriteGameEntry {
+ uint32 gameId;
+ int16 defaultTimeDelayOverwrite; // time delay here is like on PC, so 0 - unlimited, 1 - 20 cycles, 2 - 10 cycles
+ const AgiAppleIIgsDelayOverwriteRoomEntry *roomTable;
+};
+
+static const AgiAppleIIgsDelayOverwriteRoomEntry appleIIgsDelayOverwriteMH1[] = {
+ { 153, 153, 2 }, // Intro w/ credits
+ { 104, 104, 2 }, // Intro cutscene
+ { 117, 117, 2 }, // Intro cutscene (ego waking up)
+ // Room 124+125 are MAD rooms, those seem to work at a proper speed
+ { -1, -1, -1 }
+};
+
+static const AgiAppleIIgsDelayOverwriteGameEntry appleIIgsDelayOverwriteGameTable[] = {
+ { GID_BC, 2, nullptr }, // NEEDS TESTING
+ { GID_GOLDRUSH, 2, nullptr }, // NEEDS TESTING
+ { GID_KQ1, 2, nullptr }, // NEEDS TESTING
+ // KQ2 seems to work fine at speed given by scripts (NEEDS FURTHER TESTING)
+ { GID_KQ3, 2, nullptr }, // NEEDS TESTING
+ { GID_KQ4, 2, nullptr }, // NEEDS TESTING
+ { GID_LSL1, 2, nullptr }, // Switch Larry 1 to 10 cycles per second (that's around PC Larry 1's "normal" speed
+ { GID_MH1, -1, appleIIgsDelayOverwriteMH1 }, // NEEDS TESTING
+ { GID_MIXEDUP, 2, nullptr }, // NEEDS TESTING
+ { GID_PQ1, 2, nullptr }, // NEEDS TESTING
+ { GID_SQ1, 2, nullptr }, // NEEDS TESTING
+ { GID_SQ2, 2, nullptr }, // NEEDS TESTING
+ { GID_AGIDEMO, -1, nullptr }
+};
+
+} // End of namespace Agi
+
+#endif /* AGI_APPLEIIGS_DELAY_OVERWRITE_H */
diff --git a/engines/agi/cycle.cpp b/engines/agi/cycle.cpp
index 52cc16005b..7f563419e7 100644
--- a/engines/agi/cycle.cpp
+++ b/engines/agi/cycle.cpp
@@ -30,6 +30,7 @@
#include "agi/keyboard.h"
#include "agi/menu.h"
#include "agi/systemui.h"
+#include "agi/appleIIgs_timedelay_overwrite.h"
namespace Agi {
@@ -289,6 +290,8 @@ uint16 AgiEngine::processAGIEvents() {
int AgiEngine::playGame() {
int ec = errOK;
+ const AgiAppleIIgsDelayOverwriteGameEntry *appleIIgsDelayOverwrite = nullptr;
+ const AgiAppleIIgsDelayOverwriteRoomEntry *appleIIgsDelayRoomOverwrite = nullptr;
debugC(2, kDebugLevelMain, "initializing...");
debugC(2, kDebugLevelMain, "game version = 0x%x", getVersion());
@@ -338,6 +341,16 @@ int AgiEngine::playGame() {
artificialDelay_Reset();
+ if (getPlatform() == Common::kPlatformApple2GS) {
+ // Look up, if there is a time delay overwrite table for the current game
+ appleIIgsDelayOverwrite = appleIIgsDelayOverwriteGameTable;
+ while (appleIIgsDelayOverwrite->gameId != GID_AGIDEMO) {
+ if (appleIIgsDelayOverwrite->gameId == getGameID())
+ break; // game found
+ appleIIgsDelayOverwrite++;
+ }
+ }
+
do {
processAGIEvents();
@@ -353,6 +366,39 @@ int AgiEngine::playGame() {
// Normally that game runs at TIME_DELAY 1.
// Maybe a script patch for this game would make sense.
// TODO: needs further investigation
+
+ int16 timeDelayOverwrite = -1;
+
+ // Now check, if we got a time delay overwrite entry for current room
+ if (appleIIgsDelayOverwrite->roomTable) {
+ byte curRoom = getVar(VM_VAR_CURRENT_ROOM);
+
+ appleIIgsDelayRoomOverwrite = appleIIgsDelayOverwrite->roomTable;
+ while (appleIIgsDelayRoomOverwrite->fromRoom >= 0) {
+ if ((appleIIgsDelayRoomOverwrite->fromRoom <= curRoom) && (appleIIgsDelayRoomOverwrite->toRoom >= curRoom)) {
+ timeDelayOverwrite = appleIIgsDelayRoomOverwrite->timeDelayOverwrite;
+ break;
+ }
+ appleIIgsDelayRoomOverwrite++;
+ }
+
+ if (timeDelayOverwrite < 0) {
+ // use default time delay in case no room specific one was found
+ timeDelayOverwrite = appleIIgsDelayOverwrite->defaultTimeDelayOverwrite;
+ }
+ } else {
+ timeDelayOverwrite = appleIIgsDelayOverwrite->defaultTimeDelayOverwrite;
+ }
+
+ if (timeDelayOverwrite >= 0) {
+ if (timeDelayOverwrite != timeDelay) {
+ // delayOverwrite is not the same as the delay taken from the scripts? overwrite it
+ warning("AppleIIgs: time delay overwrite from %d to %d", timeDelay, timeDelayOverwrite);
+
+ setVar(VM_VAR_TIME_DELAY, timeDelayOverwrite - 1); // adjust for Apple IIgs
+ timeDelay = timeDelayOverwrite;
+ }
+ }
}
if (_passedPlayTimeCycles >= timeDelay) {