diff options
author | Martin Kiewitz | 2016-02-13 00:10:43 +0100 |
---|---|---|
committer | Martin Kiewitz | 2016-02-13 00:10:43 +0100 |
commit | af9028355294ffe569e9100c2cac02eb843b1c11 (patch) | |
tree | f95f7aaeeca2d91794fa690b825bb6d01428f661 | |
parent | b67cb25e22a0871ebc9135da847cd1bc5dd5a96d (diff) | |
download | scummvm-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.h | 66 | ||||
-rw-r--r-- | engines/agi/cycle.cpp | 46 |
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) { |