From 9e07738b525f99eb30fb871296573d76e1135e8a Mon Sep 17 00:00:00 2001 From: Robert Crossfield Date: Tue, 14 Feb 2017 18:28:58 +1100 Subject: SCUMM: Fix bug #4112. If you enter the lab while Dr. Fred has the power off, the power won't be turned back on as the script is killed --- engines/scumm/script_v2.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'engines') diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp index 756e0b44de..1814b00ca9 100644 --- a/engines/scumm/script_v2.cpp +++ b/engines/scumm/script_v2.cpp @@ -1192,7 +1192,28 @@ void ScummEngine_v2::o2_startScript() { runScript(script, 0, 0, 0); } +// Helper functions for ManiacMansion workarounds +#define MM_SCRIPT(script) (script + (_game.version == 0 ? 0 : 5)) +#define MM_VALUE(v0,v1) (_game.version == 0 ? v0 : v1) + void ScummEngine_v2::stopScriptCommon(int script) { + + // WORKAROUND bug #4112: If you enter the lab while Dr. Fred has the powered turned off + // to repair the Zom-B-Matic, the script will be stopped and the power will never turn + // back on. This fix forces the power on, when the player enters the lab, + // if the script which turned it off is running + if (_game.id == GID_MANIAC && _roomResource == 4 && isScriptRunning(MM_SCRIPT(138))) { + + if (vm.slot[_currentScript].number == MM_VALUE(130, 163)) { + + if (script == MM_SCRIPT(138)) { + + int obj = MM_VALUE(124, 157); + putState(obj, getState(obj) & ~kObjectState_08 ); + } + } + } + if (_game.id == GID_MANIAC && _roomResource == 26 && vm.slot[_currentScript].number == 10001) { // FIXME: Nasty hack for bug #915575 // Don't let the exit script for room 26 stop the script (116), when -- cgit v1.2.3 From 56caa6f0a7669cf14798148b995031e3f681a4bf Mon Sep 17 00:00:00 2001 From: Robert Crossfield Date: Tue, 14 Feb 2017 18:35:12 +1100 Subject: SCUMM: Cleanup Maniac Mansion workarounds --- engines/scumm/script_v2.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'engines') diff --git a/engines/scumm/script_v2.cpp b/engines/scumm/script_v2.cpp index 1814b00ca9..8160c5e30a 100644 --- a/engines/scumm/script_v2.cpp +++ b/engines/scumm/script_v2.cpp @@ -31,6 +31,10 @@ namespace Scumm { + // Helper functions for ManiacMansion workarounds +#define MM_SCRIPT(script) (script + (_game.version == 0 ? 0 : 5)) +#define MM_VALUE(v0,v1) (_game.version == 0 ? v0 : v1) + #define OPCODE(i, x) _opcodes[i]._OPCODE(ScummEngine_v2, x) void ScummEngine_v2::setupOpcodes() { @@ -1178,13 +1182,8 @@ void ScummEngine_v2::o2_startScript() { // (which makes Ted go answer the door bell) is simply ignored. This // way, the door bell still chimes, but Ted ignores it. if (_game.id == GID_MANIAC) { - if (_game.version >= 1 && script == 87) { - if (isScriptRunning(88) || isScriptRunning(89)) - return; - } - // Script numbers are different in V0 - if (_game.version == 0 && script == 82) { - if (isScriptRunning(83) || isScriptRunning(84)) + if (script == MM_SCRIPT(82)) { + if (isScriptRunning(MM_SCRIPT(83)) || isScriptRunning(MM_SCRIPT(84))) return; } } @@ -1192,10 +1191,6 @@ void ScummEngine_v2::o2_startScript() { runScript(script, 0, 0, 0); } -// Helper functions for ManiacMansion workarounds -#define MM_SCRIPT(script) (script + (_game.version == 0 ? 0 : 5)) -#define MM_VALUE(v0,v1) (_game.version == 0 ? v0 : v1) - void ScummEngine_v2::stopScriptCommon(int script) { // WORKAROUND bug #4112: If you enter the lab while Dr. Fred has the powered turned off @@ -1209,7 +1204,7 @@ void ScummEngine_v2::stopScriptCommon(int script) { if (script == MM_SCRIPT(138)) { int obj = MM_VALUE(124, 157); - putState(obj, getState(obj) & ~kObjectState_08 ); + putState(obj, getState(obj) & ~kObjectState_08); } } } @@ -1218,10 +1213,7 @@ void ScummEngine_v2::stopScriptCommon(int script) { // FIXME: Nasty hack for bug #915575 // Don't let the exit script for room 26 stop the script (116), when // switching to the dungeon (script 89) - if (_game.version >= 1 && script == 116 && isScriptRunning(89)) - return; - // Script numbers are different in V0 - if (_game.version == 0 && script == 111 && isScriptRunning(84)) + if (script == MM_SCRIPT(111) && isScriptRunning(MM_SCRIPT(84))) return; } -- cgit v1.2.3