diff options
| -rw-r--r-- | engines/mohawk/module.mk | 2 | ||||
| -rw-r--r-- | engines/mohawk/myst.cpp | 14 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/makingof.cpp | 63 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/makingof.h | 58 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/myst.cpp | 1813 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/myst.h | 5 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/preview.cpp | 138 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/preview.h | 61 | 
8 files changed, 950 insertions, 1204 deletions
| diff --git a/engines/mohawk/module.mk b/engines/mohawk/module.mk index 353b7db483..cc6584b77e 100644 --- a/engines/mohawk/module.mk +++ b/engines/mohawk/module.mk @@ -28,8 +28,10 @@ MODULE_OBJS = \  	myst_stacks/demo.o \  	myst_stacks/dni.o \  	myst_stacks/intro.o \ +	myst_stacks/makingof.o \  	myst_stacks/mechanical.o \  	myst_stacks/myst.o \ +	myst_stacks/preview.o \  	myst_stacks/selenitic.o \  	myst_stacks/slides.o \  	myst_stacks/stoneship.o diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index d81c5923cc..558dc2d79d 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -44,8 +44,10 @@  #include "mohawk/myst_stacks/demo.h"  #include "mohawk/myst_stacks/dni.h"  #include "mohawk/myst_stacks/intro.h" +#include "mohawk/myst_stacks/makingof.h"  #include "mohawk/myst_stacks/mechanical.h"  #include "mohawk/myst_stacks/myst.h" +#include "mohawk/myst_stacks/preview.h"  #include "mohawk/myst_stacks/selenitic.h"  #include "mohawk/myst_stacks/slides.h"  #include "mohawk/myst_stacks/stoneship.h" @@ -398,9 +400,18 @@ void MohawkEngine_Myst::changeToStack(uint16 stack) {  	case kIntroStack:  		_scriptParser = new MystScriptParser_Intro(this);  		break; +	case kMakingOfStack: +		_scriptParser = new MystScriptParser_MakingOf(this); +		break;  	case kMechanicalStack:  		_scriptParser = new MystScriptParser_Mechanical(this);  		break; +	case kMystStack: +		_scriptParser = new MystScriptParser_Myst(this); +		break; +	case kDemoPreviewStack: +		_scriptParser = new MystScriptParser_Preview(this); +		break;  	case kSeleniticStack:  		_scriptParser = new MystScriptParser_Selenitic(this);  		break; @@ -411,8 +422,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack) {  		_scriptParser = new MystScriptParser_Stoneship(this);  		break;  	default: -		_scriptParser = new MystScriptParser_Myst(this); -		break; +		error("Unknown Myst stack");  	}  	// If the array is empty, add a new one. Otherwise, delete the first diff --git a/engines/mohawk/myst_stacks/makingof.cpp b/engines/mohawk/myst_stacks/makingof.cpp new file mode 100644 index 0000000000..54de15f50e --- /dev/null +++ b/engines/mohawk/myst_stacks/makingof.cpp @@ -0,0 +1,63 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "mohawk/myst.h" +#include "mohawk/graphics.h" +#include "mohawk/myst_areas.h" +#include "mohawk/sound.h" +#include "mohawk/video.h" +#include "mohawk/myst_stacks/makingof.h" + +#include "gui/message.h" + +namespace Mohawk { + +MystScriptParser_MakingOf::MystScriptParser_MakingOf(MohawkEngine_Myst *vm) : MystScriptParser(vm) { +	setupOpcodes(); +} + +MystScriptParser_MakingOf::~MystScriptParser_MakingOf() { +} + +#define OPCODE(op, x) _opcodes.push_back(new MystOpcode(op, (OpcodeProcMyst) &MystScriptParser_MakingOf::x, #x)) + +void MystScriptParser_MakingOf::setupOpcodes() { +	// "Stack-Specific" Opcodes +	OPCODE(100, o_quit); +} + +#undef OPCODE + +void MystScriptParser_MakingOf::disablePersistentScripts() { +} + +void MystScriptParser_MakingOf::runPersistentScripts() { +} + +void MystScriptParser_MakingOf::o_quit(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	_vm->_system->quit(); +} + +} // End of namespace Mohawk diff --git a/engines/mohawk/myst_stacks/makingof.h b/engines/mohawk/myst_stacks/makingof.h new file mode 100644 index 0000000000..5775e7cc80 --- /dev/null +++ b/engines/mohawk/myst_stacks/makingof.h @@ -0,0 +1,58 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef MYST_SCRIPTS_MAKINGOF_H +#define MYST_SCRIPTS_MAKINGOF_H + +#include "common/scummsys.h" +#include "common/util.h" +#include "mohawk/myst_scripts.h" + +namespace Mohawk { + +#define DECLARE_OPCODE(x) void x(uint16 op, uint16 var, uint16 argc, uint16 *argv) + +class MohawkEngine_Myst; +struct MystScriptEntry; + +class MystScriptParser_MakingOf : public MystScriptParser { +public: +	MystScriptParser_MakingOf(MohawkEngine_Myst *vm); +	~MystScriptParser_MakingOf(); + +	void disablePersistentScripts(); +	void runPersistentScripts(); + +private: +	void setupOpcodes(); + +	DECLARE_OPCODE(o_quit); +}; + +} // End of namespace Mohawk + +#undef DECLARE_OPCODE + +#endif diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index 2d1619ba8c..f6d0f8d633 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -52,7 +52,6 @@ MystScriptParser_Myst::~MystScriptParser_Myst() {  void MystScriptParser_Myst::setupOpcodes() {  	// "Stack-Specific" Opcodes -	OPCODE(100, opcode_100);  	OPCODE(101, opcode_101);  	OPCODE(102, opcode_102);  	OPCODE(103, opcode_103); @@ -69,20 +68,13 @@ void MystScriptParser_Myst::setupOpcodes() {  	OPCODE(120, opcode_120);  	OPCODE(121, opcode_121);  	OPCODE(133, opcode_133); -	// TODO: Opcodes 134 to 146 Not Present  	OPCODE(147, opcode_147); -	// TODO: Opcodes 148 to 163 Not Present  	OPCODE(164, opcode_164); -	// TODO: Opcodes 165 to 168 Not Present  	OPCODE(169, opcode_169); -	// TODO: Opcodes 170 to 181 Not Present  	OPCODE(182, opcode_182);  	OPCODE(183, opcode_183);  	OPCODE(184, opcode_184);  	OPCODE(185, opcode_185); -	// TODO: Opcodes 186 to 195 Not Present -	OPCODE(196, opcode_196); // Demo only -	OPCODE(197, opcode_197); // Demo only  	OPCODE(198, opcode_198);  	OPCODE(199, opcode_199); @@ -109,9 +101,6 @@ void MystScriptParser_Myst::setupOpcodes() {  	OPCODE(220, opcode_220);  	OPCODE(221, opcode_221);  	OPCODE(222, opcode_222); -	// TODO: Opcodes 223 to 297 Not Present -	OPCODE(298, opcode_298); // Demo only -	OPCODE(299, opcode_299); // Demo only  	// "Exit" Opcodes  	OPCODE(300, opcode_300); @@ -124,9 +113,7 @@ void MystScriptParser_Myst::setupOpcodes() {  	OPCODE(307, opcode_307);  	OPCODE(308, opcode_308);  	OPCODE(309, opcode_309); -	// TODO: Opcodes 310 to 311 Not Present  	OPCODE(312, opcode_312); -	// TODO: Opcodes 313 and greater Not Present  }  #undef OPCODE @@ -155,783 +142,537 @@ void MystScriptParser_Myst::runPersistentScripts() {  	opcode_212_run();  } -void MystScriptParser_Myst::opcode_100(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMakingOfStack: -		_vm->_system->quit(); -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} -} -  void MystScriptParser_Myst::opcode_101(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		debugC(kDebugScript, "Opcode %d: Decrement Variable", op); -		if (argc == 0) { -			debugC(kDebugScript, "\tvar: %d", var); -			uint16 varValue = _vm->_varStore->getVar(var); -			// Logic to prevent decrement to negative -			if (varValue != 0) -				_vm->_varStore->setVar(var, varValue - 1); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	debugC(kDebugScript, "Opcode %d: Decrement Variable", op); +	if (argc == 0) { +		debugC(kDebugScript, "\tvar: %d", var); +		uint16 varValue = _vm->_varStore->getVar(var); +		// Logic to prevent decrement to negative +		if (varValue != 0) +			_vm->_varStore->setVar(var, varValue - 1); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		if (argc == 0) { -			debugC(kDebugScript, "Opcode %d: Increment Variable", op); -			debugC(kDebugScript, "\tvar: %d", var); - -			// AFAIK no logic to put ceiling on increment at least in this opcode -			_vm->_varStore->setVar(var, _vm->_varStore->getVar(var) + 1); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		debugC(kDebugScript, "Opcode %d: Increment Variable", op); +		debugC(kDebugScript, "\tvar: %d", var); + +		// AFAIK no logic to put ceiling on increment at least in this opcode +		_vm->_varStore->setVar(var, _vm->_varStore->getVar(var) + 1); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_103(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		// Used on Myst Card 4162 (Fireplace Grid) -		if (argc == 1) { -			debugC(kDebugScript, "Opcode %d: Toggle Variable with Bitmask", op); - -			uint16 bitmask = argv[0]; -			uint16 varValue = _vm->_varStore->getVar(var); - -			debugC(kDebugScript, "\tvar: %d", var); -			debugC(kDebugScript, "\tbitmask: 0x%02X", bitmask); - -			if (varValue & bitmask) -				_vm->_varStore->setVar(var, varValue & ~bitmask); -			else -				_vm->_varStore->setVar(var, varValue | bitmask); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used on Myst Card 4162 (Fireplace Grid) +	if (argc == 1) { +		debugC(kDebugScript, "Opcode %d: Toggle Variable with Bitmask", op); + +		uint16 bitmask = argv[0]; +		uint16 varValue = _vm->_varStore->getVar(var); + +		debugC(kDebugScript, "\tvar: %d", var); +		debugC(kDebugScript, "\tbitmask: 0x%02X", bitmask); + +		if (varValue & bitmask) +			_vm->_varStore->setVar(var, varValue & ~bitmask); +		else +			_vm->_varStore->setVar(var, varValue | bitmask); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_104(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		varUnusedCheck(op, var); +	varUnusedCheck(op, var); -		// Used on Myst Card 4162 and 4166 (Fireplace Puzzle Rotation Movies) -		if (argc == 1) { -			debugC(kDebugScript, "Opcode %d: Play Fireplace Puzzle Rotation Movies", op); +	// Used on Myst Card 4162 and 4166 (Fireplace Puzzle Rotation Movies) +	if (argc == 1) { +		debugC(kDebugScript, "Opcode %d: Play Fireplace Puzzle Rotation Movies", op); -			uint16 movieNum = argv[0]; -			debugC(kDebugScript, "\tmovieNum: %d", movieNum); +		uint16 movieNum = argv[0]; +		debugC(kDebugScript, "\tmovieNum: %d", movieNum); -			if (movieNum == 0) -				_vm->_video->playMovie(_vm->wrapMovieFilename("fpin", kMystStack), 167, 5); -			if (movieNum == 1) -				_vm->_video->playMovie(_vm->wrapMovieFilename("fpout", kMystStack), 167, 5); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +		if (movieNum == 0) +			_vm->_video->playMovie(_vm->wrapMovieFilename("fpin", kMystStack), 167, 5); +		if (movieNum == 1) +			_vm->_video->playMovie(_vm->wrapMovieFilename("fpout", kMystStack), 167, 5); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_105(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 1) { -			varUnusedCheck(op, var); +	if (argc == 1) { +		varUnusedCheck(op, var); -			uint16 soundId = argv[0]; -			uint16 boxValue = 0; -			Audio::SoundHandle *handle; +		uint16 soundId = argv[0]; +		uint16 boxValue = 0; +		Audio::SoundHandle *handle; -			debugC(kDebugScript, "Opcode %d: Ship Puzzle Logic", op); -			debugC(kDebugScript, "\tsoundId: %d", soundId); +		debugC(kDebugScript, "Opcode %d: Ship Puzzle Logic", op); +		debugC(kDebugScript, "\tsoundId: %d", soundId); -			// Logic for Myst Ship Box Puzzle Solution -			for (byte i = 0; i < 8; i++) -				boxValue |= _vm->_varStore->getVar(i + 26) ? (1 << i) : 0; +		// Logic for Myst Ship Box Puzzle Solution +		for (byte i = 0; i < 8; i++) +			boxValue |= _vm->_varStore->getVar(i + 26) ? (1 << i) : 0; -			uint16 var10 = _vm->_varStore->getVar(10); +		uint16 var10 = _vm->_varStore->getVar(10); -			if (boxValue == 0x32 && var10 == 0) { -				handle = _vm->_sound->playSound(soundId); +		if (boxValue == 0x32 && var10 == 0) { +			handle = _vm->_sound->playSound(soundId); -				while (_vm->_mixer->isSoundHandleActive(*handle)) -					_vm->_system->delayMillis(10); +			while (_vm->_mixer->isSoundHandleActive(*handle)) +				_vm->_system->delayMillis(10); -				_vm->_varStore->setVar(10, 1); -			} else if (boxValue != 0x32 && var10 == 1) { -				handle = _vm->_sound->playSound(soundId); +			_vm->_varStore->setVar(10, 1); +		} else if (boxValue != 0x32 && var10 == 1) { +			handle = _vm->_sound->playSound(soundId); -				while (_vm->_mixer->isSoundHandleActive(*handle)) -					_vm->_system->delayMillis(10); +			while (_vm->_mixer->isSoundHandleActive(*handle)) +				_vm->_system->delayMillis(10); -				_vm->_varStore->setVar(10, 0); -			} -		} else -			unknown(op, var, argc, argv); -		break; -	default: +			_vm->_varStore->setVar(10, 0); +		} +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_109(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 1) { -			int16 signedValue = argv[0]; +	if (argc == 1) { +		int16 signedValue = argv[0]; -			debugC(kDebugScript, "Opcode %d: Add Signed Value to Var", op); -			debugC(kDebugScript, "\tVar: %d", var); -			debugC(kDebugScript, "\tsignedValue: %d", signedValue); +		debugC(kDebugScript, "Opcode %d: Add Signed Value to Var", op); +		debugC(kDebugScript, "\tVar: %d", var); +		debugC(kDebugScript, "\tsignedValue: %d", signedValue); -			_vm->_varStore->setVar(var, _vm->_varStore->getVar(var) + signedValue); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +		_vm->_varStore->setVar(var, _vm->_varStore->getVar(var) + signedValue); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_113(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used on Myst 4143 (Dock near Marker Switch) -		if (argc == 9) { -			uint16 soundId = argv[0]; - -			uint16 u0 = argv[1]; -			uint16 u1 = argv[2]; - -			Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]); - -			uint16 updateDirection = argv[7]; -			uint16 u2 = argv[8]; - -			debugC(kDebugScript, "Opcode %d: Vault Open Logic", op); -			debugC(kDebugScript, "\tsoundId: %d", soundId); -			debugC(kDebugScript, "\tu0: %d", u0); -			debugC(kDebugScript, "\tu1: %d", u1); - -			debugC(kDebugScript, "\trect.left: %d", rect.left); -			debugC(kDebugScript, "\trect.top: %d", rect.top); -			debugC(kDebugScript, "\trect.right: %d", rect.right); -			debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); -			debugC(kDebugScript, "\trect updateDirection: %d", updateDirection); -			debugC(kDebugScript, "\tu2: %d", u2); - -			if ((_vm->_varStore->getVar(2) == 1) && -			   (_vm->_varStore->getVar(3) == 1) && -			   (_vm->_varStore->getVar(4) == 0) && -			   (_vm->_varStore->getVar(5) == 1) && -			   (_vm->_varStore->getVar(6) == 1) && -			   (_vm->_varStore->getVar(7) == 1) && -			   (_vm->_varStore->getVar(8) == 1) && -			   (_vm->_varStore->getVar(9) == 1)) { -				// TODO: Implement correct function... -				// Blit Image in Left to Right Vertical stripes i.e. transistion -				// like door opening -				_vm->_sound->playSound(soundId); -				// TODO: Set 41 to 1 if page already present in hand. -				_vm->_varStore->setVar(41, 2); -			} -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used on Myst 4143 (Dock near Marker Switch) +	if (argc == 9) { +		uint16 soundId = argv[0]; + +		uint16 u0 = argv[1]; +		uint16 u1 = argv[2]; + +		Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]); + +		uint16 updateDirection = argv[7]; +		uint16 u2 = argv[8]; + +		debugC(kDebugScript, "Opcode %d: Vault Open Logic", op); +		debugC(kDebugScript, "\tsoundId: %d", soundId); +		debugC(kDebugScript, "\tu0: %d", u0); +		debugC(kDebugScript, "\tu1: %d", u1); + +		debugC(kDebugScript, "\trect.left: %d", rect.left); +		debugC(kDebugScript, "\trect.top: %d", rect.top); +		debugC(kDebugScript, "\trect.right: %d", rect.right); +		debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); +		debugC(kDebugScript, "\trect updateDirection: %d", updateDirection); +		debugC(kDebugScript, "\tu2: %d", u2); + +		if ((_vm->_varStore->getVar(2) == 1) && +			(_vm->_varStore->getVar(3) == 1) && +			(_vm->_varStore->getVar(4) == 0) && +			(_vm->_varStore->getVar(5) == 1) && +			(_vm->_varStore->getVar(6) == 1) && +			(_vm->_varStore->getVar(7) == 1) && +			(_vm->_varStore->getVar(8) == 1) && +			(_vm->_varStore->getVar(9) == 1)) { +			// TODO: Implement correct function... +			// Blit Image in Left to Right Vertical stripes i.e. transistion +			// like door opening +			_vm->_sound->playSound(soundId); +			// TODO: Set 41 to 1 if page already present in hand. +			_vm->_varStore->setVar(41, 2); +		} +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_114(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used on Myst 4143 (Dock near Marker Switch) -		if (argc == 9) { -			uint16 soundId = argv[0]; - -			uint16 u0 = argv[1]; -			uint16 u1 = argv[2]; - -			Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]); - -			uint16 updateDirection = argv[7]; -			uint16 u2 = argv[8]; - -			debugC(kDebugScript, "Opcode %d: Vault Close Logic", op); -			debugC(kDebugScript, "\tsoundId: %d", soundId); -			debugC(kDebugScript, "\tu0: %d", u0); -			debugC(kDebugScript, "\tu1: %d", u1); - -			debugC(kDebugScript, "\trect.left: %d", rect.left); -			debugC(kDebugScript, "\trect.top: %d", rect.top); -			debugC(kDebugScript, "\trect.right: %d", rect.right); -			debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); -			debugC(kDebugScript, "\tupdateDirection: %d", updateDirection); -			debugC(kDebugScript, "\tu2: %d", u2); - -			if ((_vm->_varStore->getVar(2) == 1) && -			   (_vm->_varStore->getVar(3) == 1) && -			   (_vm->_varStore->getVar(4) == 1) && -			   (_vm->_varStore->getVar(5) == 1) && -			   (_vm->_varStore->getVar(6) == 1) && -			   (_vm->_varStore->getVar(7) == 1) && -			   (_vm->_varStore->getVar(8) == 1) && -			   (_vm->_varStore->getVar(9) == 1)) { -				// TODO: Implement correct function... -				// Blit Image in Right to Left Vertical stripes i.e. transistion -				// like door closing -				_vm->_sound->playSound(soundId); -				_vm->_varStore->setVar(41, 0); -			} -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used on Myst 4143 (Dock near Marker Switch) +	if (argc == 9) { +		uint16 soundId = argv[0]; + +		uint16 u0 = argv[1]; +		uint16 u1 = argv[2]; + +		Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]); + +		uint16 updateDirection = argv[7]; +		uint16 u2 = argv[8]; + +		debugC(kDebugScript, "Opcode %d: Vault Close Logic", op); +		debugC(kDebugScript, "\tsoundId: %d", soundId); +		debugC(kDebugScript, "\tu0: %d", u0); +		debugC(kDebugScript, "\tu1: %d", u1); + +		debugC(kDebugScript, "\trect.left: %d", rect.left); +		debugC(kDebugScript, "\trect.top: %d", rect.top); +		debugC(kDebugScript, "\trect.right: %d", rect.right); +		debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); +		debugC(kDebugScript, "\tupdateDirection: %d", updateDirection); +		debugC(kDebugScript, "\tu2: %d", u2); + +		if ((_vm->_varStore->getVar(2) == 1) && +			(_vm->_varStore->getVar(3) == 1) && +			(_vm->_varStore->getVar(4) == 1) && +			(_vm->_varStore->getVar(5) == 1) && +			(_vm->_varStore->getVar(6) == 1) && +			(_vm->_varStore->getVar(7) == 1) && +			(_vm->_varStore->getVar(8) == 1) && +			(_vm->_varStore->getVar(9) == 1)) { +			// TODO: Implement correct function... +			// Blit Image in Right to Left Vertical stripes i.e. transistion +			// like door closing +			_vm->_sound->playSound(soundId); +			_vm->_varStore->setVar(41, 0); +		} +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_115(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		if (argc == 3) { -			uint16 cardIdLose = argv[0]; -			uint16 cardIdBookCover = argv[1]; -			uint16 soundIdAddPage = argv[2]; - -			debugC(kDebugScript, "Opcode %d: Red and Blue Book/Page Interaction", op); -			debugC(kDebugScript, "Var: %d", var); -			debugC(kDebugScript, "Card Id (Lose): %d", cardIdLose); -			debugC(kDebugScript, "Card Id (Book Cover): %d", cardIdBookCover); -			debugC(kDebugScript, "SoundId (Add Page): %d", soundIdAddPage); - -			// TODO: if holding page for this book, play SoundIdAddPage -			if (false) { // TODO: Should be access to mainCursor... -				_vm->_sound->playSound(soundIdAddPage); -				// TODO: Code for updating variables based on adding page -			} +	if (argc == 3) { +		uint16 cardIdLose = argv[0]; +		uint16 cardIdBookCover = argv[1]; +		uint16 soundIdAddPage = argv[2]; -			// TODO: Add Tweak to improve original logic by denying -			//       lose until all red / blue pages collected, rather -			//       than allowing shortcut based on 1 fireplace page? - -			// If holding last page for this book i.e. var 24/25 -			// Then trigger Trapped in Book Losing Ending -			if ((var == 100 && !_vm->_varStore->getVar(25)) || -			   (var == 101 && !_vm->_varStore->getVar(24))) { -				// TODO: Clear mainCursor back to nominal.. -				_vm->changeToCard(cardIdLose, true); -			} else -				_vm->changeToCard(cardIdBookCover, true); - -			// TODO: Is this logic here? -			//       i.e. If was holding page, wait then auto open and play book... +		debugC(kDebugScript, "Opcode %d: Red and Blue Book/Page Interaction", op); +		debugC(kDebugScript, "Var: %d", var); +		debugC(kDebugScript, "Card Id (Lose): %d", cardIdLose); +		debugC(kDebugScript, "Card Id (Book Cover): %d", cardIdBookCover); +		debugC(kDebugScript, "SoundId (Add Page): %d", soundIdAddPage); + +		// TODO: if holding page for this book, play SoundIdAddPage +		if (false) { // TODO: Should be access to mainCursor... +			_vm->_sound->playSound(soundIdAddPage); +			// TODO: Code for updating variables based on adding page +		} + +		// TODO: Add Tweak to improve original logic by denying +		//       lose until all red / blue pages collected, rather +		//       than allowing shortcut based on 1 fireplace page? + +		// If holding last page for this book i.e. var 24/25 +		// Then trigger Trapped in Book Losing Ending +		if ((var == 100 && !_vm->_varStore->getVar(25)) || +			(var == 101 && !_vm->_varStore->getVar(24))) { +			// TODO: Clear mainCursor back to nominal.. +			_vm->changeToCard(cardIdLose, true);  		} else -			unknown(op, var, argc, argv); -		break; -	default: -		varUnusedCheck(op, var); +			_vm->changeToCard(cardIdBookCover, true); + +		// TODO: Is this logic here? +		//       i.e. If was holding page, wait then auto open and play book... +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_116(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 1) { -			// Used on Card 4006 (Clock Tower Time Controls) -			uint16 soundId = argv[0]; +	if (argc == 1) { +		// Used on Card 4006 (Clock Tower Time Controls) +		uint16 soundId = argv[0]; -			debugC(kDebugScript, "Opcode %d: Clock Tower Bridge Puzzle Execute Button", op); +		debugC(kDebugScript, "Opcode %d: Clock Tower Bridge Puzzle Execute Button", op); -			uint16 bridgeState = _vm->_varStore->getVar(12); -			uint16 currentTime = _vm->_varStore->getVar(43); +		uint16 bridgeState = _vm->_varStore->getVar(12); +		uint16 currentTime = _vm->_varStore->getVar(43); -			const uint16 correctTime = 32; // 2:40 i.e. From 12 Noon in 5 min increments +		const uint16 correctTime = 32; // 2:40 i.e. From 12 Noon in 5 min increments -			if (!bridgeState && currentTime == correctTime) { -				_vm->_sound->playSound(soundId); +		if (!bridgeState && currentTime == correctTime) { +			_vm->_sound->playSound(soundId); -				// TODO: Play only 1st half of movie i.e. gears rise up -				_vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 36); +			// TODO: Play only 1st half of movie i.e. gears rise up +			_vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 36); -				bridgeState = 1; -				_vm->_varStore->setVar(12, bridgeState); -			} else if (bridgeState && currentTime != correctTime) { -				_vm->_sound->playSound(soundId); +			bridgeState = 1; +			_vm->_varStore->setVar(12, bridgeState); +		} else if (bridgeState && currentTime != correctTime) { +			_vm->_sound->playSound(soundId); -				// TODO: Play only 2nd half of movie i.e. gears sink down -				_vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 36); +			// TODO: Play only 2nd half of movie i.e. gears sink down +			_vm->_video->playMovie(_vm->wrapMovieFilename("gears", kMystStack), 305, 36); -				bridgeState = 0; -				_vm->_varStore->setVar(12, bridgeState); -			} -		} else -			unknown(op, var, argc, argv); -		break; -	default: +			bridgeState = 0; +			_vm->_varStore->setVar(12, bridgeState); +		} +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_117(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 2) { -			// Used by Myst Imager Control Button -			uint16 varValue = _vm->_varStore->getVar(var); - -			if (varValue) -				_vm->_sound->playSound(argv[1]); -			else -				_vm->_sound->playSound(argv[0]); - -			_vm->_varStore->setVar(var, !varValue); -			// TODO: Change Var 45 "Dock Forechamber Imager Water Effect Enabled" here? -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 2) { +		// Used by Myst Imager Control Button +		uint16 varValue = _vm->_varStore->getVar(var); + +		if (varValue) +			_vm->_sound->playSound(argv[1]); +		else +			_vm->_sound->playSound(argv[0]); + +		_vm->_varStore->setVar(var, !varValue); +		// TODO: Change Var 45 "Dock Forechamber Imager Water Effect Enabled" here? +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_118(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		varUnusedCheck(op, var); +	varUnusedCheck(op, var); -		if (argc == 5) { -			// Used by Card 4709 (Myst Imager Control Panel Red Button) +	if (argc == 5) { +		// Used by Card 4709 (Myst Imager Control Panel Red Button) -			debugC(kDebugScript, "Opcode %d: Imager Change Value", op); +		debugC(kDebugScript, "Opcode %d: Imager Change Value", op); -			uint16 soundIdBeepLo = argv[0]; -			uint16 soundIdBeepHi = argv[1]; -			uint16 soundIdBwapp = argv[2]; -			uint16 soundIdBeepTune = argv[3]; // 5 tones.. -			uint16 soundIdPanelSlam = argv[4]; +		uint16 soundIdBeepLo = argv[0]; +		uint16 soundIdBeepHi = argv[1]; +		uint16 soundIdBwapp = argv[2]; +		uint16 soundIdBeepTune = argv[3]; // 5 tones.. +		uint16 soundIdPanelSlam = argv[4]; -			debugC(kDebugScript, "\tsoundIdBeepLo: %d", soundIdBeepLo); -			debugC(kDebugScript, "\tsoundIdBeepHi: %d", soundIdBeepHi); -			debugC(kDebugScript, "\tsoundIdBwapp: %d", soundIdBwapp); -			debugC(kDebugScript, "\tsoundIdBeepTune: %d", soundIdBeepTune); -			debugC(kDebugScript, "\tsoundIdPanelSlam: %d", soundIdPanelSlam); +		debugC(kDebugScript, "\tsoundIdBeepLo: %d", soundIdBeepLo); +		debugC(kDebugScript, "\tsoundIdBeepHi: %d", soundIdBeepHi); +		debugC(kDebugScript, "\tsoundIdBwapp: %d", soundIdBwapp); +		debugC(kDebugScript, "\tsoundIdBeepTune: %d", soundIdBeepTune); +		debugC(kDebugScript, "\tsoundIdPanelSlam: %d", soundIdPanelSlam); -			_vm->_sound->playSound(soundIdBeepLo); +		_vm->_sound->playSound(soundIdBeepLo); -			// TODO: Complete Logic... -		} else -			unknown(op, var, argc, argv); -		break; -	default: +		// TODO: Complete Logic... +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_119(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 1) { -			// Used on Card 4383 and 4451 (Tower Elevator) -			switch (argv[0]) { -			case 0: -				_vm->_video->playMovie(_vm->wrapMovieFilename("libdown", kMystStack), 216, 78); -				break; -			case 1: -				_vm->_video->playMovie(_vm->wrapMovieFilename("libup", kMystStack), 214, 75); -				break; -			default: -				break; -			} -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 1) { +		// Used on Card 4383 and 4451 (Tower Elevator) +		switch (argv[0]) { +		case 0: +			_vm->_video->playMovie(_vm->wrapMovieFilename("libdown", kMystStack), 216, 78); +			break; +		case 1: +			_vm->_video->playMovie(_vm->wrapMovieFilename("libup", kMystStack), 214, 75); +			break; +		default: +			break; +		} +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_120(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	MystResource *_top; +	// Used for Card 4297 (Generator Puzzle Buttons) +	debugC(kDebugScript, "Opcode %d: Toggle Var8 of Invoking Resource", op); +	MystResource *_top = _invokingResource; -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4297 (Generator Puzzle Buttons) -		debugC(kDebugScript, "Opcode %d: Toggle Var8 of Invoking Resource", op); -		_top = _invokingResource; +	while (_top->_parent != NULL) +		_top = _top->_parent; -		while(_top->_parent != NULL) -			_top = _top->_parent; - -		if (argc == 0) { -			uint16 var8 = _top->getType8Var(); -			if (var8 != 0xFFFF) -				_vm->_varStore->setVar(var8, !_vm->_varStore->getVar(var8)); -			else -				warning("Opcode 120: No invoking Resource Var 8 found"); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		uint16 var8 = _top->getType8Var(); +		if (var8 != 0xFFFF) +			_vm->_varStore->setVar(var8, !_vm->_varStore->getVar(var8)); +		else +			warning("Opcode 120: No invoking Resource Var 8 found"); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_121(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used on Card 4100 (Cabin Safe Buttons) -		// Correct Solution (724) -> Var 67=2, 68=7, 69=5 -		// Jump to Card 4103 when solution correct and handle pulled... -		if (argc == 0) { -			uint16 varValue = _vm->_varStore->getVar(var); -			if (varValue == 0) -				varValue = 9; -			else -				varValue--; -			_vm->_varStore->setVar(var, varValue); -		} else -			unknown(op, var, argc, argv); -		break; -	default: -		varUnusedCheck(op, var); - +	// Used on Card 4100 (Cabin Safe Buttons) +	// Correct Solution (724) -> Var 67=2, 68=7, 69=5 +	// Jump to Card 4103 when solution correct and handle pulled... +	if (argc == 0) { +		uint16 varValue = _vm->_varStore->getVar(var); +		if (varValue == 0) +			varValue = 9; +		else +			varValue--; +		_vm->_varStore->setVar(var, varValue); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_133(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used on Card 4500 (Stellar Observatory Controls) -		if (argc == 1) { -			// Called by Telescope Slew Button -			uint16 soundId = argv[0]; +	// Used on Card 4500 (Stellar Observatory Controls) +	if (argc == 1) { +		// Called by Telescope Slew Button +		uint16 soundId = argv[0]; -			// TODO: Function to change variables controlling telescope view -			//       etc. +		// TODO: Function to change variables controlling telescope view +		//       etc. -			// TODO: Sound seems to be stuck looping? -			_vm->_sound->playSound(soundId); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +		// TODO: Sound seems to be stuck looping? +		_vm->_sound->playSound(soundId); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_147(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			// TODO: Extra Logic to do this in INIT process watching cursor and var 98? -			_vm->_varStore->setVar(98, 0); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		// TODO: Extra Logic to do this in INIT process watching cursor and var 98? +		_vm->_varStore->setVar(98, 0); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_164(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used on Card 4530 (Rocketship Music Slider Controls) -		// TODO: Finish Implementation... -		// Var 105 is used to set between 0 to 2 = No Function, Movie Playback and Linkable... -		// This is called when Var 105 = 1 i.e. this plays back Movie... -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used on Card 4530 (Rocketship Music Slider Controls) +	// TODO: Finish Implementation... +	// Var 105 is used to set between 0 to 2 = No Function, Movie Playback and Linkable... +	// This is called when Var 105 = 1 i.e. this plays back Movie...  }  void MystScriptParser_Myst::opcode_169(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used on Card 4099 (In Cabin, Looking Out Door) -		// TODO: Finish Implementation... -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used on Card 4099 (In Cabin, Looking Out Door) +	// TODO: Finish Implementation...  }  void MystScriptParser_Myst::opcode_181(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			// TODO: Logic for lighting the match -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		// TODO: Logic for lighting the match +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_182(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			// TODO: Logic for lighting the match -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		// TODO: Logic for lighting the match +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_183(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			// Used for Myst Cards 4257, 4260, 4263, 4266, 4269, 4272, 4275 and 4278 (Ship Puzzle Boxes) -			_vm->_varStore->setVar(105, 1); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		// Used for Myst Cards 4257, 4260, 4263, 4266, 4269, 4272, 4275 and 4278 (Ship Puzzle Boxes) +		_vm->_varStore->setVar(105, 1); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_184(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			// Used for Myst Cards 4257, 4260, 4263, 4266, 4269, 4272, 4275 and 4278 (Ship Puzzle Boxes) -			_vm->_varStore->setVar(105, 0); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		// Used for Myst Cards 4257, 4260, 4263, 4266, 4269, 4272, 4275 and 4278 (Ship Puzzle Boxes) +		_vm->_varStore->setVar(105, 0); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_185(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			// Used for Myst Card 4098 (Cabin Boiler Pilot Light) -			// TODO: Extra Logic to do this in INIT process watching cursor and var 98? -			_vm->_varStore->setVar(98, 1); -		} else -			unknown(op, var, argc, argv); -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} -} - -void MystScriptParser_Myst::opcode_196(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	varUnusedCheck(op, var); - -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -		// Used on Card ... -		// TODO: Finish Implementation... -		// Voice Over and Card Advance? -		break; -	default: +	if (argc == 0) { +		// Used for Myst Card 4098 (Cabin Boiler Pilot Light) +		// TODO: Extra Logic to do this in INIT process watching cursor and var 98? +		_vm->_varStore->setVar(98, 1); +	} else  		unknown(op, var, argc, argv); -		break; -	} -} - -void MystScriptParser_Myst::opcode_197(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	varUnusedCheck(op, var); - -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -		// Used on Card ... -		// TODO: Finish Implementation... -		// Voice Over and Card Advance? -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	}  }  // TODO: Merge with Opcode 42?  void MystScriptParser_Myst::opcode_198(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -		if (argc == 0) { -			// Nuh-uh! No leaving the library in the demo! -			GUI::MessageDialog dialog("You can't leave the library in the demo."); -			dialog.runModal(); -		} else -			unknown(op, var, argc, argv); -		break; -	case kMystStack: -		// Used on Card 4143 (Dock near Marker Switch, facing Cogs) -		if (argc == 9) { -			uint16 soundId = argv[0]; -			uint16 u0 = argv[1]; -			uint16 u1 = argv[2]; -			Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]); -			uint16 updateDirection = argv[7]; -			uint16 u2 = argv[8]; - -			debugC(kDebugScript, "Opcode %d: Close Dock Marker Switch Vault", op); -			debugC(kDebugScript, "\tsoundId: %d", soundId); -			debugC(kDebugScript, "\tu0: %d", u0); -			debugC(kDebugScript, "\tu1: %d", u1); - -			debugC(kDebugScript, "\trect.left: %d", rect.left); -			debugC(kDebugScript, "\trect.top: %d", rect.top); -			debugC(kDebugScript, "\trect.right: %d", rect.right); -			debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); -			debugC(kDebugScript, "\tupdateDirection: %d", updateDirection); -			debugC(kDebugScript, "\tu2: %d", u2); - -			Audio::SoundHandle *handle; -			if (_vm->_varStore->getVar(41) != 0) { -				handle = _vm->_sound->playSound(soundId); - -				while (_vm->_mixer->isSoundHandleActive(*handle)) -					_vm->_system->delayMillis(10); -				// TODO: Do Image Blit -			} -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used on Card 4143 (Dock near Marker Switch, facing Cogs) +	if (argc == 9) { +		uint16 soundId = argv[0]; +		uint16 u0 = argv[1]; +		uint16 u1 = argv[2]; +		Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]); +		uint16 updateDirection = argv[7]; +		uint16 u2 = argv[8]; + +		debugC(kDebugScript, "Opcode %d: Close Dock Marker Switch Vault", op); +		debugC(kDebugScript, "\tsoundId: %d", soundId); +		debugC(kDebugScript, "\tu0: %d", u0); +		debugC(kDebugScript, "\tu1: %d", u1); + +		debugC(kDebugScript, "\trect.left: %d", rect.left); +		debugC(kDebugScript, "\trect.top: %d", rect.top); +		debugC(kDebugScript, "\trect.right: %d", rect.right); +		debugC(kDebugScript, "\trect.bottom: %d", rect.bottom); +		debugC(kDebugScript, "\tupdateDirection: %d", updateDirection); +		debugC(kDebugScript, "\tu2: %d", u2); + +		if (_vm->_varStore->getVar(41) != 0) { +			Audio::SoundHandle *handle = _vm->_sound->playSound(soundId); + +			while (_vm->_mixer->isSoundHandleActive(*handle)) +				_vm->_system->delayMillis(10); +			// TODO: Do Image Blit +		} +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_199(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			debugC(kDebugScript, "Opcode %d: Myst Imager Control Execute Button Logic", op); - -			uint16 numericSelection = (_vm->_varStore->getVar(36) + 1) % 10; -			numericSelection += ((_vm->_varStore->getVar(35) + 1) % 10) * 10; - -			debugC(kDebugScript, "\tImager Selection: %d", numericSelection); - -			switch (numericSelection) { -			case 40: -				_vm->_varStore->setVar(51, 1); // Mountain -				break; -			case 67: -				_vm->_varStore->setVar(51, 2); // Water -				break; -			case 47: -				_vm->_varStore->setVar(51, 4); // Marker Switch -				break; -			case 8: -				_vm->_varStore->setVar(51, 3); // Atrus -				break; -			default: -				_vm->_varStore->setVar(51, 0); // Blank -				break; -			} +	if (argc == 0) { +		debugC(kDebugScript, "Opcode %d: Myst Imager Control Execute Button Logic", op); -			// TODO: Fill in Logic -			//{  34, 2, "Dock Forechamber Imager State" }, // 0 to 2 = Off, Mountain, Water -			//{ 310, 0, "Dock Forechamber Imager Control Temp Value?" } -		} else -			unknown(op, var, argc, argv); -		break; -	case kDemoPreviewStack: -		// Used on Card ... -		// TODO: Finish Implementation... -		// Voice Over and Card Advance? -		break; -	default: +		uint16 numericSelection = (_vm->_varStore->getVar(36) + 1) % 10; +		numericSelection += ((_vm->_varStore->getVar(35) + 1) % 10) * 10; + +		debugC(kDebugScript, "\tImager Selection: %d", numericSelection); + +		switch (numericSelection) { +		case 40: +			_vm->_varStore->setVar(51, 1); // Mountain +			break; +		case 67: +			_vm->_varStore->setVar(51, 2); // Water +			break; +		case 47: +			_vm->_varStore->setVar(51, 4); // Marker Switch +			break; +		case 8: +			_vm->_varStore->setVar(51, 3); // Atrus +			break; +		default: +			_vm->_varStore->setVar(51, 0); // Blank +			break; +		} + +		// TODO: Fill in Logic +		//{  34, 2, "Dock Forechamber Imager State" }, // 0 to 2 = Off, Mountain, Water +		//{ 310, 0, "Dock Forechamber Imager Control Temp Value?" } +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { @@ -946,41 +687,36 @@ static struct {  void MystScriptParser_Myst::opcode_200_run() {  	static uint16 lastImageIndex = 0; -	uint16 curImageIndex; -	Common::Rect rect;  	if (g_opcode200Parameters.enabled) { -		switch (_vm->getCurStack()) { -		case kDemoPreviewStack: -		case kMystStack: -			curImageIndex = _vm->_varStore->getVar(g_opcode200Parameters.var); - -			if (curImageIndex >= g_opcode200Parameters.imageCount) { -				curImageIndex = g_opcode200Parameters.imageCount - 1; -				_vm->_varStore->setVar(g_opcode200Parameters.var, curImageIndex); -			} +		uint16 curImageIndex = _vm->_varStore->getVar(g_opcode200Parameters.var); -			// HACK: Think these images are centered on screen (when smaller than full screen), -			//       and since no _gfx call for image size, hack this to deal with this case for now... -			if (_vm->getCurCard() == 4059) -				rect = Common::Rect(157, 115, 544, 333); -			else -				rect = Common::Rect(0, 0, 544, 333); - -			if (curImageIndex != lastImageIndex) -				_vm->_gfx->copyImageToScreen(g_opcode200Parameters.imageBaseId + curImageIndex, rect); - -			// TODO: Comparison with original engine shows that this simple solution -			//       may not be the correct one and the choice of which sound -			//       may be more complicated or even random.. -			if (curImageIndex < lastImageIndex && g_opcode200Parameters.soundDecrement != 0) -				_vm->_sound->playSound(g_opcode200Parameters.soundDecrement); -			else if (curImageIndex > lastImageIndex && g_opcode200Parameters.soundIncrement != 0) -				_vm->_sound->playSound(g_opcode200Parameters.soundIncrement); - -			lastImageIndex = curImageIndex; -			break; +		if (curImageIndex >= g_opcode200Parameters.imageCount) { +			curImageIndex = g_opcode200Parameters.imageCount - 1; +			_vm->_varStore->setVar(g_opcode200Parameters.var, curImageIndex);  		} + +		Common::Rect rect; + +		// HACK: Think these images are centered on screen (when smaller than full screen), +		//       and since no _gfx call for image size, hack this to deal with this case for now... +		if (_vm->getCurCard() == 4059) +			rect = Common::Rect(157, 115, 544, 333); +		else +			rect = Common::Rect(0, 0, 544, 333); + +		if (curImageIndex != lastImageIndex) +			_vm->_gfx->copyImageToScreen(g_opcode200Parameters.imageBaseId + curImageIndex, rect); + +		// TODO: Comparison with original engine shows that this simple solution +		//       may not be the correct one and the choice of which sound +		//       may be more complicated or even random.. +		if (curImageIndex < lastImageIndex && g_opcode200Parameters.soundDecrement != 0) +			_vm->_sound->playSound(g_opcode200Parameters.soundDecrement); +		else if (curImageIndex > lastImageIndex && g_opcode200Parameters.soundIncrement != 0) +			_vm->_sound->playSound(g_opcode200Parameters.soundIncrement); + +		lastImageIndex = curImageIndex;  	}  } @@ -994,25 +730,17 @@ void MystScriptParser_Myst::opcode_200_disable() {  }  void MystScriptParser_Myst::opcode_200(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		if (argc == 4) { -			g_opcode200Parameters.var = var; -			g_opcode200Parameters.imageCount = argv[0]; -			g_opcode200Parameters.imageBaseId = argv[1]; -			g_opcode200Parameters.soundDecrement = argv[2]; -			g_opcode200Parameters.soundIncrement = argv[3]; -			g_opcode200Parameters.enabled = true; - -			_vm->_varStore->setVar(var, 0); -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 4) { +		g_opcode200Parameters.var = var; +		g_opcode200Parameters.imageCount = argv[0]; +		g_opcode200Parameters.imageBaseId = argv[1]; +		g_opcode200Parameters.soundDecrement = argv[2]; +		g_opcode200Parameters.soundIncrement = argv[3]; +		g_opcode200Parameters.enabled = true; + +		_vm->_varStore->setVar(var, 0); +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { @@ -1023,17 +751,13 @@ static struct {  } g_opcode201Parameters;  void MystScriptParser_Myst::opcode_201_run() { -	uint16 var105; -  	if (g_opcode201Parameters.enabled) { -		switch (_vm->getCurStack()) { -		case kMystStack: -			var105 = _vm->_varStore->getVar(105); -			if (var105 && !g_opcode201Parameters.lastVar105) -				_vm->_sound->playSound(g_opcode201Parameters.soundId); -			g_opcode201Parameters.lastVar105 = var105; -			break; -		} +		uint16 var105 = _vm->_varStore->getVar(105); + +		if (var105 && !g_opcode201Parameters.lastVar105) +			_vm->_sound->playSound(g_opcode201Parameters.soundId); + +		g_opcode201Parameters.lastVar105 = var105;  	}  } @@ -1046,20 +770,13 @@ void MystScriptParser_Myst::opcode_201_disable() {  void MystScriptParser_Myst::opcode_201(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Cards 4257, 4260, 4263, 4266, 4269, 4272, 4275 and 4278 (Ship Puzzle Boxes) -		if (argc == 1) { -			g_opcode201Parameters.soundId = argv[0]; -			g_opcode201Parameters.lastVar105 = 0; -			g_opcode201Parameters.enabled = true; -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Cards 4257, 4260, 4263, 4266, 4269, 4272, 4275 and 4278 (Ship Puzzle Boxes) +	if (argc == 1) { +		g_opcode201Parameters.soundId = argv[0]; +		g_opcode201Parameters.lastVar105 = 0; +		g_opcode201Parameters.enabled = true; +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { @@ -1068,20 +785,11 @@ static struct {  } g_opcode202Parameters;  void MystScriptParser_Myst::opcode_202_run(void) { -	if (g_opcode202Parameters.enabled) { -		switch (_vm->getCurStack()) { -		case kDemoPreviewStack: -		case kMystStack: -			// Used for Card 4378 (Library Tower Rotation Map) -			// TODO: Fill in.. Code for Tower Rotation Angle etc.. -			// Var 0, 3, 4, 5, 6, 7, 8, 9 used for Type 8 Image Display -			// Type 11 Hotspot for control.. -			// Var 304 controls presence of Myst Library Image -			break; -		default: -			break; -		} -	} +	// Used for Card 4378 (Library Tower Rotation Map) +	// TODO: Fill in.. Code for Tower Rotation Angle etc.. +	// Var 0, 3, 4, 5, 6, 7, 8, 9 used for Type 8 Image Display +	// Type 11 Hotspot for control.. +	// Var 304 controls presence of Myst Library Image  }  void MystScriptParser_Myst::opcode_202_disable(void) { @@ -1089,24 +797,14 @@ void MystScriptParser_Myst::opcode_202_disable(void) {  }  void MystScriptParser_Myst::opcode_202(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		varUnusedCheck(op, var); - -		// Used for Card 4378 (Library Tower Rotation Map) -		if (argc == 1) { -			// TODO: Figure Out argv[0] purpose.. number of image resources? -			g_opcode202Parameters.enabled = true; -		} else -			unknown(op, var, argc, argv); -		break; -	default: -		varUnusedCheck(op, var); +	varUnusedCheck(op, var); +	// Used for Card 4378 (Library Tower Rotation Map) +	if (argc == 1) { +		// TODO: Figure Out argv[0] purpose.. number of image resources? +		g_opcode202Parameters.enabled = true; +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { @@ -1115,16 +813,12 @@ static struct {  void MystScriptParser_Myst::opcode_203_run(void) {  	if (g_opcode203Parameters.enabled) { -		switch (_vm->getCurStack()) { -		case kMystStack: -			// Used for Card 4138 (Dock Forechamber Door) -			// TODO: Fill in Logic. Slide for Dock Forechamber Door? -			// Original has Left to Right Open Slide and Upon leaving card, -			// Right to left Slide before card change. -			//debugC(kDebugScript, "Opcode %d: Clear Dock Forechamber Door Variable", op); -			//_vm->_varStore->setVar(105, 0); -			break; -		} +		// Used for Card 4138 (Dock Forechamber Door) +		// TODO: Fill in Logic. Slide for Dock Forechamber Door? +		// Original has Left to Right Open Slide and Upon leaving card, +		// Right to left Slide before card change. +		//debugC(kDebugScript, "Opcode %d: Clear Dock Forechamber Door Variable", op); +		//_vm->_varStore->setVar(105, 0);  	}  } @@ -1135,29 +829,15 @@ void MystScriptParser_Myst::opcode_203_disable(void) {  void MystScriptParser_Myst::opcode_203(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4138 (Dock Forechamber Door) -		// Set forechamber door to closed -		setVarValue(105, 0); -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4138 (Dock Forechamber Door) +	// Set forechamber door to closed +	setVarValue(105, 0);  }  void MystScriptParser_Myst::opcode_204(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4134 and 4149 (Dock) -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4134 and 4149 (Dock)  }  static struct { @@ -1166,12 +846,8 @@ static struct {  void MystScriptParser_Myst::opcode_205_run(void) {  	if (g_opcode205Parameters.enabled) { -		switch (_vm->getCurStack()) { -		case kMystStack: -			// Used for Card 4532 (Rocketship Piano) -			// TODO: Fill in function... -			break; -		} +		// Used for Card 4532 (Rocketship Piano) +		// TODO: Fill in function...  	}  } @@ -1182,60 +858,35 @@ void MystScriptParser_Myst::opcode_205_disable(void) {  void MystScriptParser_Myst::opcode_205(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4532 (Rocketship Piano) +	// Used for Card 4532 (Rocketship Piano) -		if (argc == 0) { -			g_opcode205Parameters.enabled = true; -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) +		g_opcode205Parameters.enabled = true; +	else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_206(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4256 (Butterfly Movie Activation) -		// TODO: Implement Logic... -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4256 (Butterfly Movie Activation) +	// TODO: Implement Logic...  }  void MystScriptParser_Myst::opcode_208(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		if (argc == 0) { -			debugC(kDebugScript, "Opcode %d: Imager Function", op); -			debugC(kDebugScript, "Var: %d", var); - -			// TODO: Fill in Correct Function -			if (false) { -				_vm->_video->playMovie(_vm->wrapMovieFilename("vltmntn", kMystStack), 159, 97); -			} -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	if (argc == 0) { +		debugC(kDebugScript, "Opcode %d: Imager Function", op); +		debugC(kDebugScript, "Var: %d", var); + +		// TODO: Fill in Correct Function +		if (false) { +			_vm->_video->playMovie(_vm->wrapMovieFilename("vltmntn", kMystStack), 159, 97); +		} +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { -	uint16 u0[5]; -	uint16 u1[5]; -	uint16 stateVar; -  	uint16 soundId;  	bool enabled; @@ -1245,19 +896,13 @@ void MystScriptParser_Myst::opcode_209_run(void) {  	static bool enabledLast;  	if (g_opcode209Parameters.enabled) { -		switch (_vm->getCurStack()) { -		case kDemoPreviewStack: -		case kMystStack: -			// Used for Card 4334 and 4348 (Myst Library Bookcase Door) -			if (!enabledLast) -				// TODO: If Variable changed... -				_vm->_sound->playSound(g_opcode209Parameters.soundId); - -				// TODO: Code to trigger Type 6 to play movie... -			break; -		default: -			break; +		// Used for Card 4334 and 4348 (Myst Library Bookcase Door) +		if (!enabledLast) { +			// TODO: If Variable changed... +			_vm->_sound->playSound(g_opcode209Parameters.soundId);  		} + +		// TODO: Code to trigger Type 6 to play movie...  	}  	enabledLast = g_opcode209Parameters.enabled; @@ -1270,20 +915,12 @@ void MystScriptParser_Myst::opcode_209_disable(void) {  void MystScriptParser_Myst::opcode_209(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		// Used for Card 4334 and 4348 (Myst Library Bookcase Door) -		if (argc == 1) { -			g_opcode209Parameters.soundId = argv[0]; -			g_opcode209Parameters.enabled = true; -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4334 and 4348 (Myst Library Bookcase Door) +	if (argc == 1) { +		g_opcode209Parameters.soundId = argv[0]; +		g_opcode209Parameters.enabled = true; +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { @@ -1374,20 +1011,13 @@ void MystScriptParser_Myst::opcode_210_disable(void) {  void MystScriptParser_Myst::opcode_210(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4297 (Generator Puzzle) -		if (argc == 2) { -			// TODO: Work Out 2 parameters meaning... 16, 17 -			// Script Resources for Generator Spinup and Spindown Sounds? -			g_opcode210Parameters.enabled = true; -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4297 (Generator Puzzle) +	if (argc == 2) { +		// TODO: Work Out 2 parameters meaning... 16, 17 +		// Script Resources for Generator Spinup and Spindown Sounds? +		g_opcode210Parameters.enabled = true; +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { @@ -1441,22 +1071,14 @@ void MystScriptParser_Myst::opcode_211_disable(void) {  void MystScriptParser_Myst::opcode_211(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		// Used for Card 4059 (Fireplace Puzzle) -		if (argc == 0) { -			for (byte i = 0; i < 6; i++) -				_vm->_varStore->setVar(i + 17, 0); +	// Used for Card 4059 (Fireplace Puzzle) +	if (argc == 0) { +		for (byte i = 0; i < 6; i++) +			_vm->_varStore->setVar(i + 17, 0); -			g_opcode211Parameters.enabled = true; -		} else -			unknown(op, var, argc, argv); -		break; -	default: +		g_opcode211Parameters.enabled = true; +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  static struct { @@ -1493,467 +1115,264 @@ void MystScriptParser_Myst::opcode_212_disable(void) {  void MystScriptParser_Myst::opcode_212(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4113 (Clock Tower Cog Puzzle) -		if (argc == 0) { -			g_opcode212Parameters.enabled = true; -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4113 (Clock Tower Cog Puzzle) +	if (argc == 0) +		g_opcode212Parameters.enabled = true; +	else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_213(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4524 (Dockside Facing Towards Ship) -		if (argc == 0) { -			// TODO: Implement Code... -			// Code for Gull Videos? -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4524 (Dockside Facing Towards Ship) +	if (argc == 0) { +		// TODO: Implement Code... +		// Code for Gull Videos? +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_214(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4500 (Stellar Observatory) -		if (argc == 5) { -			debugC(kDebugScript, "Opcode %d: Unknown...", op); - -			uint16 u0 = argv[0]; -			uint16 u1 = argv[1]; -			uint16 u2 = argv[2]; -			uint16 u3 = argv[3]; -			uint16 u4 = argv[4]; - -			debugC(kDebugScript, "\tu0: %d", u0); -			debugC(kDebugScript, "\tu1: %d", u1); -			debugC(kDebugScript, "\tu2: %d", u2); -			debugC(kDebugScript, "\tu3: %d", u3); -			debugC(kDebugScript, "\tu4: %d", u4); -			// TODO: Complete Implementation... -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4500 (Stellar Observatory) +	if (argc == 5) { +		debugC(kDebugScript, "Opcode %d: Unknown...", op); + +		uint16 u0 = argv[0]; +		uint16 u1 = argv[1]; +		uint16 u2 = argv[2]; +		uint16 u3 = argv[3]; +		uint16 u4 = argv[4]; + +		debugC(kDebugScript, "\tu0: %d", u0); +		debugC(kDebugScript, "\tu1: %d", u1); +		debugC(kDebugScript, "\tu2: %d", u2); +		debugC(kDebugScript, "\tu3: %d", u3); +		debugC(kDebugScript, "\tu4: %d", u4); +		// TODO: Complete Implementation... +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_215(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4134 (Dock Facing Marker Switch) -		// TODO: Fill in logic for Gull Videos. -		//       may be offset and overlap and need video update to all these -		//       to run in sequence with opcode215_run() process... -		if (false) { -			// All birds(x) videos are 120x48 and played in top right corner of card -			_vm->_video->playMovie(_vm->wrapMovieFilename("birds1", kMystStack), 544-120-1, 0); -			_vm->_video->playMovie(_vm->wrapMovieFilename("birds2", kMystStack), 544-120-1, 0); -			_vm->_video->playMovie(_vm->wrapMovieFilename("birds3", kMystStack), 544-120-1, 0); -		} -		break; -	default: -		unknown(op, var, argc, argv); -		break; +	// Used for Card 4134 (Dock Facing Marker Switch) +	// TODO: Fill in logic for Gull Videos. +	//       may be offset and overlap and need video update to all these +	//       to run in sequence with opcode215_run() process... +	if (false) { +		// All birds(x) videos are 120x48 and played in top right corner of card +		_vm->_video->playMovie(_vm->wrapMovieFilename("birds1", kMystStack), 544-120-1, 0); +		_vm->_video->playMovie(_vm->wrapMovieFilename("birds2", kMystStack), 544-120-1, 0); +		_vm->_video->playMovie(_vm->wrapMovieFilename("birds3", kMystStack), 544-120-1, 0);  	}  }  void MystScriptParser_Myst::opcode_216(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Cards 4571 (Channelwood Tree), 4586 (Channelwood Tree),  -		// 4615 (Channelwood Tree) and 4601 (Channelwood Tree) -		if (argc == 0) { -			// TODO: Fill in logic for Channelwood Tree Position i.e. Var 72 update // 0 to 12, 4 for Alcove -			// Based on Timer code and following variables : -			// 98  "Cabin Boiler Pilot Light Lit" -			// 99  "Cabin Boiler Gas Valve Position" }, // 0 to 5 -			// 305 "Cabin Boiler Lit" }, -			// 306 "Cabin Boiler Steam Sound Control" }, // 0 to 27 -			// 307 "Cabin Boiler Needle Position i.e. Fully Pressurised" }, // 0 to 1 - -			// Note : Opcode 218 does boiler update code.. -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Cards 4571 (Channelwood Tree), 4586 (Channelwood Tree),  +	// 4615 (Channelwood Tree) and 4601 (Channelwood Tree) +	if (argc == 0) { +		// TODO: Fill in logic for Channelwood Tree Position i.e. Var 72 update // 0 to 12, 4 for Alcove +		// Based on Timer code and following variables : +		// 98  "Cabin Boiler Pilot Light Lit" +		// 99  "Cabin Boiler Gas Valve Position" }, // 0 to 5 +		// 305 "Cabin Boiler Lit" }, +		// 306 "Cabin Boiler Steam Sound Control" }, // 0 to 27 +		// 307 "Cabin Boiler Needle Position i.e. Fully Pressurised" }, // 0 to 1 + +		// Note : Opcode 218 does boiler update code.. +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_217(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4601 (Channelwood Tree) -		if (argc == 2) { -			// TODO: Fill in logic for Tree Position Close Up... -			// 2 arguments: 4, 4 -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4601 (Channelwood Tree) +	if (argc == 2) { +		// TODO: Fill in logic for Tree Position Close Up... +		// 2 arguments: 4, 4 +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_218(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4097 (Cabin Boiler) -		// TODO: Fill in logic -		if (false) { -			_vm->_video->playMovie(_vm->wrapMovieFilename("cabfirfr", kMystStack), 254, 244); -			_vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack), 254, 138); -		} +	// Used for Card 4097 (Cabin Boiler) +	// TODO: Fill in logic +	if (false) { +		_vm->_video->playMovie(_vm->wrapMovieFilename("cabfirfr", kMystStack), 254, 244); +		_vm->_video->playMovie(_vm->wrapMovieFilename("cabcgfar", kMystStack), 254, 138); +	} -		// Used for Card 4098 (Cabin Boiler) -		// TODO: Fill in logic -		if (false) { -			_vm->_video->playMovie(_vm->wrapMovieFilename("cabfire", kMystStack), 240, 279); -			_vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack), 243, 97); -		} -		break; -	default: -		unknown(op, var, argc, argv); -		break; +	// Used for Card 4098 (Cabin Boiler) +	// TODO: Fill in logic +	if (false) { +		_vm->_video->playMovie(_vm->wrapMovieFilename("cabfire", kMystStack), 240, 279); +		_vm->_video->playMovie(_vm->wrapMovieFilename("cabingau", kMystStack), 243, 97);  	}  }  void MystScriptParser_Myst::opcode_219(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4530 (Rocketship Music Puzzle) -		if (argc == 5) { -			debugC(kDebugScript, "Opcode %d: Unknown...", op); - -			uint16 u0 = argv[0]; -			uint16 u1 = argv[1]; -			uint16 u2 = argv[2]; -			uint16 u3 = argv[3]; -			uint16 u4 = argv[4]; - -			debugC(kDebugScript, "\tu0: %d", u0); -			debugC(kDebugScript, "\tu1: %d", u1); -			debugC(kDebugScript, "\tu2: %d", u2); -			debugC(kDebugScript, "\tu3: %d", u3); -			debugC(kDebugScript, "\tu4: %d", u4); -			// TODO: Fill in logic... -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4530 (Rocketship Music Puzzle) +	if (argc == 5) { +		debugC(kDebugScript, "Opcode %d: Unknown...", op); + +		uint16 u0 = argv[0]; +		uint16 u1 = argv[1]; +		uint16 u2 = argv[2]; +		uint16 u3 = argv[3]; +		uint16 u4 = argv[4]; + +		debugC(kDebugScript, "\tu0: %d", u0); +		debugC(kDebugScript, "\tu1: %d", u1); +		debugC(kDebugScript, "\tu2: %d", u2); +		debugC(kDebugScript, "\tu3: %d", u3); +		debugC(kDebugScript, "\tu4: %d", u4); +		// TODO: Fill in logic... +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_220(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4530 (Rocketship Music Puzzle Video) -		// TODO: Fill in logic. -		if (false) { -			// loop? -			_vm->_video->playMovie(_vm->wrapMovieFilename("selenbok", kMystStack), 224, 41); -		} -		break; -	default: -		unknown(op, var, argc, argv); -		break; +	// Used for Card 4530 (Rocketship Music Puzzle Video) +	// TODO: Fill in logic. +	if (false) { +		// loop? +		_vm->_video->playMovie(_vm->wrapMovieFilename("selenbok", kMystStack), 224, 41);  	}  }  void MystScriptParser_Myst::opcode_221(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4168 (Green Book Movies) -		// Movie plays in resource #0 rect -		// TODO: Not sure if subsection is looped... -		if (!_vm->_varStore->getVar(302)) { -			// HACK: Stop Wind Sounds.. Think this is a problem at library entrance. -			_vm->_sound->stopSound(); -			_vm->_video->playBackgroundMovie(_vm->wrapMovieFilename("atrusbk1", kMystStack), 314, 76); -			_vm->_varStore->setVar(302, 1); -		} else { -			// HACK: Stop Wind Sounds.. Think this is a problem at library entrance. -			_vm->_sound->stopSound(); -			_vm->_video->playBackgroundMovie(_vm->wrapMovieFilename("atrusbk2", kMystStack), 314, 76); -		} -		break; -	default: -		unknown(op, var, argc, argv); -		break; +	// Used for Card 4168 (Green Book Movies) +	// Movie plays in resource #0 rect +	// TODO: Not sure if subsection is looped... +	if (!_vm->_varStore->getVar(302)) { +		// HACK: Stop Wind Sounds.. Think this is a problem at library entrance. +		_vm->_sound->stopSound(); +		_vm->_video->playBackgroundMovie(_vm->wrapMovieFilename("atrusbk1", kMystStack), 314, 76); +		_vm->_varStore->setVar(302, 1); +	} else { +		// HACK: Stop Wind Sounds.. Think this is a problem at library entrance. +		_vm->_sound->stopSound(); +		_vm->_video->playBackgroundMovie(_vm->wrapMovieFilename("atrusbk2", kMystStack), 314, 76);  	}  }  void MystScriptParser_Myst::opcode_222(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4141 (Myst Dock Facing Sea) -		if (argc == 0) { -			// TODO: Logic for Gull Videos? -		} else -			unknown(op, var, argc, argv); -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} -} - -void MystScriptParser_Myst::opcode_298(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	varUnusedCheck(op, var); - -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -		// Used for Card 3000 (Closed Myst Book) -		// TODO: Fill in logic. -		// Start Voice Over... which controls book opening -		_vm->_sound->playSound(3001); - -		// then link to Myst - Trigger of Hotspot? then opcode 199/196/197 for voice over continue? -		// TODO: Sync Voice and Actions to Original -		// TODO: Flash Library Red -		// TODO: Move to run process based delay to prevent -		//       blocking... -		_vm->_system->delayMillis(20 * 1000); -		for (uint16 imageId = 3001; imageId <= 3012; imageId++) { -			_vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); -			_vm->_system->delayMillis(5 * 1000); -		} -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} -} - -void MystScriptParser_Myst::opcode_299(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	varUnusedCheck(op, var); - -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -		// Used for Card 3002 (Myst Island Overview) -		// TODO: Fill in logic. -		// Zoom into Island? -		// On this card is a Type 8 controlled by Var 0, which -		// can change the Myst Library to Red.. -		break; -	default: +	// Used for Card 4141 (Myst Dock Facing Sea) +	if (argc == 0) { +		// TODO: Logic for Gull Videos? +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		// Used in Card 4371 (Blue Book) Var = 101 -		//     and Card 4363 (Red Book)  Var = 100 -		debugC(kDebugScript, "Opcode %d: Book Exit Function...", op); -		debugC(kDebugScript, "Var: %d", var); -		// TODO: Fill in Logic -		break; -	default: -		varUnusedCheck(op, var); -		unknown(op, var, argc, argv); -		break; -	} +	// Used in Card 4371 (Blue Book) Var = 101 +	//     and Card 4363 (Red Book)  Var = 100 +	debugC(kDebugScript, "Opcode %d: Book Exit Function...", op); +	debugC(kDebugScript, "Var: %d", var); +	// TODO: Fill in Logic  }  void MystScriptParser_Myst::opcode_301(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kDemoPreviewStack: -	case kMystStack: -		// Used in Cards 4047, 4059, 4060, 4068 and 4080 (Myst Library Books - Open) -		// TODO: Fill in Logic. Clear Variable on Book exit.. or Copy from duplicate.. -		_vm->_varStore->setVar(0, 1); -		break; -	default: -		varUnusedCheck(op, var); -		unknown(op, var, argc, argv); -		break; -	} +	// Used in Cards 4047, 4059, 4060, 4068 and 4080 (Myst Library Books - Open) +	// TODO: Fill in Logic. Clear Variable on Book exit.. or Copy from duplicate.. +	_vm->_varStore->setVar(0, 1);  }  void MystScriptParser_Myst::opcode_302(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used in Card 4113 (Clock Tower Cog Puzzle) -		// TODO: Fill in Logic -		break; -	default: -		varUnusedCheck(op, var); -		unknown(op, var, argc, argv); -		break; -	} +	// Used in Card 4113 (Clock Tower Cog Puzzle) +	// TODO: Fill in Logic  }  void MystScriptParser_Myst::opcode_303(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4134 (Dock Facing Marker Switch) -		// Used for Card 4141 (Myst Dock Facing Sea) -		// In the original engine, this opcode stopped Gull Movies if playing, -		// upon card change, but this behaviour is now default in this engine. -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4134 (Dock Facing Marker Switch) +	// Used for Card 4141 (Myst Dock Facing Sea) +	// In the original engine, this opcode stopped Gull Movies if playing, +	// upon card change, but this behavior is now default in this engine.  }  void MystScriptParser_Myst::opcode_304(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4601 (Channelwood Tree) -		if (argc == 0) { -			debugC(kDebugScript, "Opcode %d: Unknown...", op); -			// TODO: Logic for clearing variable? -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4601 (Channelwood Tree) +	if (argc == 0) { +		debugC(kDebugScript, "Opcode %d: Unknown...", op); +		// TODO: Logic for clearing variable? +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_305(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4601 (Channelwood Tree) -		if (argc == 0) { -			debugC(kDebugScript, "Opcode %d: Unknown...", op); -			// TODO: Logic for clearing variable? -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4601 (Channelwood Tree) +	if (argc == 0) { +		debugC(kDebugScript, "Opcode %d: Unknown...", op); +		// TODO: Logic for clearing variable? +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_306(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4098 (Cabin Boiler Puzzle) -		// In the original engine, this opcode stopped the Boiler Fire and Meter Needle videos -		// if playing, upon card change, but this behaviour is now default in this engine. -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4098 (Cabin Boiler Puzzle) +	// In the original engine, this opcode stopped the Boiler Fire and Meter Needle videos +	// if playing, upon card change, but this behavior is now default in this engine.  }  void MystScriptParser_Myst::opcode_307(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4297 (Generator Room Controls) -		if (argc == 0) { -			debugC(kDebugScript, "Opcode %d: Unknown...", op); -			// TODO: Logic for clearing variable? -		} else -			unknown(op, var, argc, argv); -		break; -	default: +	// Used for Card 4297 (Generator Room Controls) +	if (argc == 0) { +		debugC(kDebugScript, "Opcode %d: Unknown...", op); +		// TODO: Logic for clearing variable? +	} else  		unknown(op, var, argc, argv); -		break; -	}  }  void MystScriptParser_Myst::opcode_308(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4530 (Rocketship Music Sliders) -		// In the original engine, this opcode stopped the Selenitic Book Movie if playing, -		// upon card change, but this behaviour is now default in this engine. -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4530 (Rocketship Music Sliders) +	// In the original engine, this opcode stopped the Selenitic Book Movie if playing, +	// upon card change, but this behavior is now default in this engine.  }  void MystScriptParser_Myst::opcode_309(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4168 (Green D'ni Book Open) -		// In the original engine, this opcode stopped the Green Book Atrus Movies if playing, -		// upon card change, but this behaviour is now default in this engine. -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4168 (Green D'ni Book Open) +	// In the original engine, this opcode stopped the Green Book Atrus Movies if playing, +	// upon card change, but this behavior is now default in this engine.  }  void MystScriptParser_Myst::opcode_312(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	varUnusedCheck(op, var); -	switch (_vm->getCurStack()) { -	case kMystStack: -		// Used for Card 4698 (Dock Forechamber Imager) -		// In the original engine, this opcode stopped the Imager Movie if playing, -		// especially the hardcoded Topological Extrusion (Mountain) video, -		// upon card change, but this behaviour is now default in this engine. -		break; -	default: -		unknown(op, var, argc, argv); -		break; -	} +	// Used for Card 4698 (Dock Forechamber Imager) +	// In the original engine, this opcode stopped the Imager Movie if playing, +	// especially the hardcoded Topological Extrusion (Mountain) video, +	// upon card change, but this behavior is now default in this engine.  }  } // End of namespace Mohawk diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h index 2b141f0992..38f7a9bdea 100644 --- a/engines/mohawk/myst_stacks/myst.h +++ b/engines/mohawk/myst_stacks/myst.h @@ -67,7 +67,6 @@ private:  	void opcode_212_run();  	void opcode_212_disable(); -	DECLARE_OPCODE(opcode_100);  	DECLARE_OPCODE(opcode_101);  	DECLARE_OPCODE(opcode_102);  	DECLARE_OPCODE(opcode_103); @@ -92,8 +91,6 @@ private:  	DECLARE_OPCODE(opcode_183);  	DECLARE_OPCODE(opcode_184);  	DECLARE_OPCODE(opcode_185); -	DECLARE_OPCODE(opcode_196); -	DECLARE_OPCODE(opcode_197);  	DECLARE_OPCODE(opcode_198);  	DECLARE_OPCODE(opcode_199); @@ -119,8 +116,6 @@ private:  	DECLARE_OPCODE(opcode_220);  	DECLARE_OPCODE(opcode_221);  	DECLARE_OPCODE(opcode_222); -	DECLARE_OPCODE(opcode_298); -	DECLARE_OPCODE(opcode_299);  	DECLARE_OPCODE(opcode_300);  	DECLARE_OPCODE(opcode_301); diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp new file mode 100644 index 0000000000..6a4414c2f0 --- /dev/null +++ b/engines/mohawk/myst_stacks/preview.cpp @@ -0,0 +1,138 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "mohawk/myst.h" +#include "mohawk/graphics.h" +#include "mohawk/myst_areas.h" +#include "mohawk/sound.h" +#include "mohawk/video.h" +#include "mohawk/myst_stacks/preview.h" + +#include "gui/message.h" + +namespace Mohawk { + +MystScriptParser_Preview::MystScriptParser_Preview(MohawkEngine_Myst *vm) : MystScriptParser_Myst(vm) { +	setupOpcodes(); +} + +MystScriptParser_Preview::~MystScriptParser_Preview() { +} + +#define OPCODE(op, x) _opcodes.push_back(new MystOpcode(op, (OpcodeProcMyst) &MystScriptParser_Preview::x, #x)) + +#define OVERRIDE_OPCODE(opcode, x) \ +	for (uint32 i = 0; i < _opcodes.size(); i++) \ +		if (_opcodes[i]->op == opcode) { \ +			_opcodes[i]->proc = (OpcodeProcMyst) &MystScriptParser_Preview::x; \ +			_opcodes[i]->desc = #x; \ +			break; \ +		} + +void MystScriptParser_Preview::setupOpcodes() { +	// "Stack-Specific" Opcodes +	OPCODE(196, opcode_196); +	OPCODE(197, opcode_197); +	OVERRIDE_OPCODE(198, opcode_198); +	OVERRIDE_OPCODE(199, opcode_199); + +	// "Init" Opcodes +	OPCODE(298, opcode_298); +	OPCODE(299, opcode_299); +} + +#undef OPCODE +#undef OVERRIDE_OPCODE + +void MystScriptParser_Preview::opcode_196(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	varUnusedCheck(op, var); + +	// Used on Card ... +	// TODO: Finish Implementation... +	// Voice Over and Card Advance? +} + +void MystScriptParser_Preview::opcode_197(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	varUnusedCheck(op, var); + +	// Used on Card ... +	// TODO: Finish Implementation... +	// Voice Over and Card Advance? +} + +// TODO: Merge with Opcode 42? +void MystScriptParser_Preview::opcode_198(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	varUnusedCheck(op, var); + +	if (argc == 0) { +		// Nuh-uh! No leaving the library in the demo! +		GUI::MessageDialog dialog("You can't leave the library in the demo."); +		dialog.runModal(); +	} else +		unknown(op, var, argc, argv); +} + +void MystScriptParser_Preview::opcode_199(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	varUnusedCheck(op, var); + +	// Used on Card ... +	// TODO: Finish Implementation... +	// Voice Over and Card Advance? +} + +void MystScriptParser_Preview::opcode_298(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	varUnusedCheck(op, var); + +	// Used for Card 3000 (Closed Myst Book) +	// TODO: Fill in logic. +	// Start Voice Over... which controls book opening +	_vm->_sound->playSound(3001); + +	// then link to Myst - Trigger of Hotspot? then opcode 199/196/197 for voice over continue? +	// TODO: Sync Voice and Actions to Original +	// TODO: Flash Library Red +	// TODO: Move to run process based delay to prevent +	//       blocking... +	_vm->_gfx->updateScreen(); +	_vm->_system->delayMillis(20 * 1000); + +	for (uint16 imageId = 3001; imageId <= 3012; imageId++) { +		_vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); +		_vm->_gfx->updateScreen(); +		_vm->_system->delayMillis(5 * 1000); +	} +} + +void MystScriptParser_Preview::opcode_299(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	varUnusedCheck(op, var); + +	// Used for Card 3002 (Myst Island Overview) +	// TODO: Fill in logic. +	// Zoom into Island? +	// On this card is a Type 8 controlled by Var 0, which +	// can change the Myst Library to Red.. +} + +} // End of namespace Mohawk diff --git a/engines/mohawk/myst_stacks/preview.h b/engines/mohawk/myst_stacks/preview.h new file mode 100644 index 0000000000..25f0ab514f --- /dev/null +++ b/engines/mohawk/myst_stacks/preview.h @@ -0,0 +1,61 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef MYST_SCRIPTS_PREVIEW_H +#define MYST_SCRIPTS_PREVIEW_H + +#include "common/scummsys.h" +#include "common/util.h" +#include "mohawk/myst_stacks/myst.h" + +namespace Mohawk { + +#define DECLARE_OPCODE(x) void x(uint16 op, uint16 var, uint16 argc, uint16 *argv) + +class MohawkEngine_Myst; +struct MystScriptEntry; + +class MystScriptParser_Preview : public MystScriptParser_Myst { +public: +	MystScriptParser_Preview(MohawkEngine_Myst *vm); +	~MystScriptParser_Preview(); + +private: +	void setupOpcodes(); + +	DECLARE_OPCODE(opcode_196); +	DECLARE_OPCODE(opcode_197); +	DECLARE_OPCODE(opcode_198); +	DECLARE_OPCODE(opcode_199); + +	DECLARE_OPCODE(opcode_298); +	DECLARE_OPCODE(opcode_299); +}; + +} // End of namespace Mohawk + +#undef DECLARE_OPCODE + +#endif | 
