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 |