aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/myst_stacks
diff options
context:
space:
mode:
authorMatthew Hoops2010-12-01 21:05:08 +0000
committerMatthew Hoops2010-12-01 21:05:08 +0000
commitbdc3742ced49ffcf48b7cab543758b8976fc94a2 (patch)
tree0d4c26fe30ca0b1bf62d41608bde6e9188d10f26 /engines/mohawk/myst_stacks
parent4fe7e1b3e9ff866d51ec2b86880acbbedc86d6ec (diff)
downloadscummvm-rg350-bdc3742ced49ffcf48b7cab543758b8976fc94a2.tar.gz
scummvm-rg350-bdc3742ced49ffcf48b7cab543758b8976fc94a2.tar.bz2
scummvm-rg350-bdc3742ced49ffcf48b7cab543758b8976fc94a2.zip
MOHAWK: Split makingof and preview opcodes into their own class (and now all are separate)
svn-id: r54723
Diffstat (limited to 'engines/mohawk/myst_stacks')
-rw-r--r--engines/mohawk/myst_stacks/makingof.cpp63
-rw-r--r--engines/mohawk/myst_stacks/makingof.h58
-rw-r--r--engines/mohawk/myst_stacks/myst.cpp1813
-rw-r--r--engines/mohawk/myst_stacks/myst.h5
-rw-r--r--engines/mohawk/myst_stacks/preview.cpp138
-rw-r--r--engines/mohawk/myst_stacks/preview.h61
6 files changed, 936 insertions, 1202 deletions
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