diff options
author | Matthew Hoops | 2010-12-01 02:11:11 +0000 |
---|---|---|
committer | Matthew Hoops | 2010-12-01 02:11:11 +0000 |
commit | 261cf2390178c6e67874d162799b357da73036a5 (patch) | |
tree | f519cfb957a75a6a1eee1e1bbb6c8640c895c8c4 | |
parent | 94801fcea3f7bbcb74a4d8ca8c5d80fe1f5795d0 (diff) | |
download | scummvm-rg350-261cf2390178c6e67874d162799b357da73036a5.tar.gz scummvm-rg350-261cf2390178c6e67874d162799b357da73036a5.tar.bz2 scummvm-rg350-261cf2390178c6e67874d162799b357da73036a5.zip |
MOHAWK: Split channelwood opcodes into their own class
svn-id: r54691
-rw-r--r-- | engines/mohawk/module.mk | 1 | ||||
-rw-r--r-- | engines/mohawk/myst.cpp | 4 | ||||
-rw-r--r-- | engines/mohawk/myst_stacks/channelwood.cpp | 556 | ||||
-rw-r--r-- | engines/mohawk/myst_stacks/channelwood.h | 77 | ||||
-rw-r--r-- | engines/mohawk/myst_stacks/myst.cpp | 368 | ||||
-rw-r--r-- | engines/mohawk/myst_stacks/myst.h | 2 |
6 files changed, 640 insertions, 368 deletions
diff --git a/engines/mohawk/module.mk b/engines/mohawk/module.mk index f651c5cb5e..3de63e5b8e 100644 --- a/engines/mohawk/module.mk +++ b/engines/mohawk/module.mk @@ -23,6 +23,7 @@ MODULE_OBJS = \ riven_vars.o \ sound.o \ video.o \ + myst_stacks/channelwood.o \ myst_stacks/credits.o \ myst_stacks/myst.o \ myst_stacks/selenitic.o \ diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 81fd5cddad..4d61311466 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -39,6 +39,7 @@ #include "mohawk/video.h" // The stacks +#include "mohawk/myst_stacks/channelwood.h" #include "mohawk/myst_stacks/credits.h" #include "mohawk/myst_stacks/myst.h" #include "mohawk/myst_stacks/selenitic.h" @@ -377,6 +378,9 @@ void MohawkEngine_Myst::changeToStack(uint16 stack) { _prevStack = _scriptParser; switch (_curStack) { + case kChannelwoodStack: + _scriptParser = new MystScriptParser_Channelwood(this); + break; case kCreditsStack: _scriptParser = new MystScriptParser_Credits(this); break; diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp new file mode 100644 index 0000000000..0f4a6e5a03 --- /dev/null +++ b/engines/mohawk/myst_stacks/channelwood.cpp @@ -0,0 +1,556 @@ +/* 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/channelwood.h" + +#include "gui/message.h" + +namespace Mohawk { + +// NOTE: Credits Start Card is 10000 + +#define OPCODE(op, x) { op, &MystScriptParser::x, #x } +#define SPECIFIC_OPCODE(op, x) { op, (OpcodeProcMyst) &MystScriptParser_Channelwood::x, #x } + +MystScriptParser_Channelwood::MystScriptParser_Channelwood(MohawkEngine_Myst *vm) : MystScriptParser(vm) { + setupOpcodes(); +} + +MystScriptParser_Channelwood::~MystScriptParser_Channelwood() { +} + +void MystScriptParser_Channelwood::setupOpcodes() { + // "invalid" opcodes do not exist or have not been observed + // "unknown" opcodes exist, but their meaning is unknown + + static const MystOpcode channelwoodOpcodes[] = { + // "Standard" Opcodes + OPCODE(0, o_toggleVar), + OPCODE(1, o_setVar), + OPCODE(2, o_changeCardSwitch), + OPCODE(3, o_takePage), + OPCODE(4, o_redrawCard), + // TODO: Opcode 5 Not Present + OPCODE(6, o_goToDest), + OPCODE(7, o_goToDest), + OPCODE(8, o_goToDest), + OPCODE(9, o_triggerMovie), + OPCODE(10, o_toggleVarNoRedraw), + // TODO: Opcode 10 to 11 Not Present + OPCODE(12, o_changeCardSwitch), + OPCODE(13, o_changeCardSwitch), + OPCODE(14, o_drawAreaState), + OPCODE(15, o_redrawAreaForVar), + OPCODE(16, o_changeCardDirectional), + OPCODE(17, o_changeCardPush), + OPCODE(18, o_changeCardPop), + OPCODE(19, o_enableAreas), + OPCODE(20, o_disableAreas), + OPCODE(21, o_directionalUpdate), + OPCODE(22, o_goToDest), + OPCODE(23, o_toggleAreasActivation), + OPCODE(24, o_playSound), + // TODO: Opcode 25 Not Present + OPCODE(26, o_stopSoundBackground), + OPCODE(27, o_playSoundBlocking), + OPCODE(28, o_restoreDefaultRect), + OPCODE(29, o_blitRect), + OPCODE(30, o_changeSound), + OPCODE(31, o_soundPlaySwitch), + OPCODE(32, o_soundResumeBackground), + OPCODE(33, o_blitRect), + OPCODE(34, o_changeCard), + OPCODE(35, o_drawImageChangeCard), + OPCODE(36, o_changeMainCursor), + OPCODE(37, o_hideCursor), + OPCODE(38, o_showCursor), + OPCODE(39, o_delay), + OPCODE(40, o_changeStack), + OPCODE(41, o_changeCardPlaySoundDirectional), + OPCODE(42, o_directionalUpdatePlaySound), + OPCODE(43, o_saveMainCursor), + OPCODE(44, o_restoreMainCursor), + // TODO: Opcode 45 Not Present + OPCODE(46, o_soundWaitStop), + // TODO: Opcodes 47 to 99 Not Present + + // "Stack-Specific" Opcodes + SPECIFIC_OPCODE(101, opcode_101), + SPECIFIC_OPCODE(102, opcode_102), + SPECIFIC_OPCODE(104, opcode_104), + SPECIFIC_OPCODE(117, opcode_117), + SPECIFIC_OPCODE(118, opcode_118), + SPECIFIC_OPCODE(119, opcode_119), + SPECIFIC_OPCODE(122, opcode_122), + SPECIFIC_OPCODE(127, opcode_127), + SPECIFIC_OPCODE(129, opcode_129), + + // "Init" Opcodes + SPECIFIC_OPCODE(201, opcode_201), + SPECIFIC_OPCODE(202, opcode_202), + SPECIFIC_OPCODE(203, opcode_203), + + // "Exit" Opcodes + SPECIFIC_OPCODE(300, opcode_300), + + OPCODE(0xFFFF, NOP) + }; + + _opcodes = channelwoodOpcodes; + _opcodeCount = ARRAYSIZE(channelwoodOpcodes); +} + +void MystScriptParser_Channelwood::disablePersistentScripts() { + opcode_202_disable(); + opcode_203_disable(); +} + +void MystScriptParser_Channelwood::runPersistentScripts() { + opcode_202_run(); + opcode_203_run(); +} + +void MystScriptParser_Channelwood::opcode_101(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 1) { + debugC(kDebugScript, "Opcode %d: Play Pipe Movie and Sound", op); + + uint16 soundId = argv[0]; + debugC(kDebugScript, "\tsoundId: %d", soundId); + + _vm->_sound->playSound(soundId); + + // TODO: Get Movie Location from Invoking Resource Rect, rather than + // hardcoded 267, 170 ? + + // TODO: Need version of playMovie blocking which allows selection + // of start and finish points. + if (!_vm->_varStore->getVar(6)) { + // Play Pipe Extending i.e. 0 to 1/2 way through file + _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack), 267, 170); + } else { + // Play Pipe Retracting i.e. 1/2 way to end of file + _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack), 267, 170); + } + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 2 || argc == 3) { + debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Optional Delay and Change Card", op); + + uint16 imageId = argv[0]; + uint16 cardId = argv[1]; + uint16 delay = 0; + + if (argc == 3) + delay = argv[2]; // TODO: Not sure about purpose of this parameter... + + debugC(kDebugScript, "\timageId: %d", imageId); + debugC(kDebugScript, "\tcardId: %d", cardId); + debugC(kDebugScript, "\tdelay: %d", delay); + + _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); + _vm->_system->delayMillis(delay / 100); + _vm->changeToCard(cardId, true); + } else + unknown(op, var, argc, argv); +} + + +void MystScriptParser_Channelwood::opcode_104(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used on Channelwood Card 3280 + if (argc == 0) { + debugC(kDebugScript, "Opcode %d: Do Water Tank Valve Open Animation", op); + Common::Rect rect = _invokingResource->getRect(); + + // TODO: Need to load the image ids from Script Resources structure of VIEW + for (uint16 imageId = 3595; imageId <= 3601; imageId++) { + _vm->_gfx->copyImageToScreen(imageId, rect); + _vm->_system->delayMillis(50); + } + + // TODO: Is 8 gotten from var7 of calling hotspot, rather than hardcoded? + _vm->_varStore->setVar(8, 1); + _vm->_varStore->setVar(19, 1); + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_117(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 1) { + // Used on Card 3012 (Temple Hologram Monitor) + uint16 button = argv[0]; // 0 to 3 + _vm->_varStore->setVar(17, button); + + switch (button) { + case 0: + _vm->_video->playMovie(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 71); + break; + case 1: + _vm->_video->playMovie(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 71); + break; + case 2: + _vm->_video->playMovie(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 71); + break; + case 3: + _vm->_video->playMovie(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 71); + break; + default: + warning("Opcode %d Control Variable Out of Range", op); + break; + } + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_118(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 0) { + // Used on Card 3318 (Sirrus' Room Nightstand Drawer) + // Triggered when clicked on drawer + // TODO: Implement function... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_119(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 0) { + // Used on Card 3333 (Temple Hologram) + // TODO: Not 100% sure about movie position... + switch (_vm->_varStore->getVar(17)) { + case 0: + _vm->_video->playMovie(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 126, 74); + break; + case 1: + _vm->_video->playMovie(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 126, 74); + break; + case 2: + _vm->_video->playMovie(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 126, 74); + break; + case 3: + _vm->_video->playMovie(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 126, 74); + break; + default: + warning("Opcode %d Control Variable Out of Range", op); + break; + } + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_122(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used on Channelwood Card 3280 + if (argc == 0) { + debugC(kDebugScript, "Opcode %d: Do Water Tank Valve Close Animation", op); + Common::Rect rect = _invokingResource->getRect(); + + // TODO: Need to load the image ids from Script Resources structure of VIEW + for (uint16 imageId = 3601; imageId >= 3595; imageId--) { + _vm->_gfx->copyImageToScreen(imageId, rect); + _vm->_system->delayMillis(50); + } + + // TODO: Is 8 gotten from var7 of calling hotspot, rather than hard-coded? + _vm->_varStore->setVar(8, 0); + _vm->_varStore->setVar(19, 0); + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_127(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 2) { + // Used by Card 3262 (Elevator) + debugC(kDebugScript, "Opcode %d: Unknown...", op); + + uint16 u0 = argv[0]; + uint16 u1 = argv[1]; + + debugC(kDebugScript, "\tu0: %d", u0); + debugC(kDebugScript, "\tu1: %d", u1); + + // TODO: Fill in Code... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_129(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 1) { + // Used by Card 3262 (Elevator) + debugC(kDebugScript, "Opcode %d: Unknown...", op); + + uint16 cardId = argv[0]; + + debugC(kDebugScript, "\tcardId: %d", cardId); + + // TODO: Fill in Code... + _vm->changeToCard(cardId, true); + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_201(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + // Used for Card 3247 (Elevator #1 Movement), 3161 (Bridge Movement), 3259 (Elevator #3 Movement) and 3252 (Elevator #2 Movement) + if (argc == 0) { + // TODO: Fill in Function. Video Playback? Rect from invoking hotspot resource... + if (false) { + // Card 3161 + _vm->_video->playMovie(_vm->wrapMovieFilename("bridge", kChannelwoodStack), 292, 204); + + // Card 3247 + _vm->_video->playMovie(_vm->wrapMovieFilename("welev1dn", kChannelwoodStack), 214, 107); + _vm->_video->playMovie(_vm->wrapMovieFilename("welev1up", kChannelwoodStack), 214, 107); + + // Card 3252 + _vm->_video->playMovie(_vm->wrapMovieFilename("welev2dn", kChannelwoodStack), 215, 118); + _vm->_video->playMovie(_vm->wrapMovieFilename("welev2up", kChannelwoodStack), 215, 118); + + // Card 3259 + _vm->_video->playMovie(_vm->wrapMovieFilename("welev3dn", kChannelwoodStack), 213, 99); + _vm->_video->playMovie(_vm->wrapMovieFilename("welev3up", kChannelwoodStack), 213, 99); + } + } else + unknown(op, var, argc, argv); +} + +static struct { + bool enabled; + uint16 var; +} g_opcode202Parameters; + +void MystScriptParser_Channelwood::opcode_202_run(void) { + if (g_opcode202Parameters.enabled) { + // Used for Cards 3328, 3691, 3731, 3809, 3846 etc. (Water Valves) + + // Code for Water Flow Logic + // Var 8 = "Water Tank Valve State" + // Controls + // Var 19 = "Water Flowing to First Water Valve" + // Code for this in Opcode 104 / 122 + + // Var 19 = "Water Flowing to First Water Valve" + // and + // Var 9 = "First Water Valve State" + // Controls + // Var 20 = "Water Flowing to Second (L) Water Valve" + // Var 3 = "Water Flowing (R) to Pump for Upper Walkway to Temple Elevator" + uint16 var9 = _vm->_varStore->getVar(9); + if (_vm->_varStore->getVar(19)) { + _vm->_varStore->setVar(20, !var9); + _vm->_varStore->setVar(3, var9); + } else { + // No water into Valve + _vm->_varStore->setVar(20, 0); + _vm->_varStore->setVar(3, 0); + } + + // Var 20 = "Water Flowing to Second (L) Water Valve" + // and + // Var 10 = "Second (L) Water Valve State" + // Controls + // Var 24 = "Water Flowing to Third (L, L) Water Valve" + // Var 21 = "Water Flowing to Third (L, R) Water Valve" + uint16 var10 = _vm->_varStore->getVar(10); + if (_vm->_varStore->getVar(20)) { + _vm->_varStore->setVar(24, !var10); + _vm->_varStore->setVar(21, var10); + } else { + // No water into Valve + _vm->_varStore->setVar(24, 0); + _vm->_varStore->setVar(21, 0); + } + + // Var 21 = "Water Flowing to Third (L, R) Water Valve" + // and + // Var 11 = "Third (L, R) Water Valve State" + // Controls + // Var 23 = "Water Flowing to Fourth (L, R, L) Water Valve" + // Var 22 = "Water Flowing to Fourth (L, R, R) Water Valve" + uint16 var11 = _vm->_varStore->getVar(11); + if (_vm->_varStore->getVar(21)) { + _vm->_varStore->setVar(23, !var11); + _vm->_varStore->setVar(22, var11); + } else { + // No water into Valve + _vm->_varStore->setVar(23, 0); + _vm->_varStore->setVar(22, 0); + } + + // Var 24 = "Water Flowing to Third (L, L) Water Valve" + // and + // Var 14 = "Third (L, L) Water Valve State" + // Controls + // Var 29 = "Water Flowing to Pipe In Water (L, L, L)" + // Var 28 = "Water Flowing to Join and Pump Bridge (L, L, R)" + uint16 var14 = _vm->_varStore->getVar(14); + if (_vm->_varStore->getVar(24)) { + _vm->_varStore->setVar(29, !var14); + _vm->_varStore->setVar(28, var14); + } else { + // No water into Valve + _vm->_varStore->setVar(29, 0); + _vm->_varStore->setVar(28, 0); + } + + // Var 22 = "Water Flowing to Fourth (L, R, R) Water Valve" + // and + // Var 12 = "Fourth (L, R, R) Water Valve State" + // Controls + // Var 25 = "Water Flowing to Pipe Bridge (L, R, R, L)" + // Var 15 = "Water Flowing (L, R, R, R) to Pump for Lower Walkway to Upper Walkway Elevator" + uint16 var12 = _vm->_varStore->getVar(12); + if (_vm->_varStore->getVar(22)) { + _vm->_varStore->setVar(25, !var12); + _vm->_varStore->setVar(15, var12); + } else { + // No water into Valve + _vm->_varStore->setVar(25, 0); + _vm->_varStore->setVar(15, 0); + } + + // Var 23 = "Water Flowing to Fourth (L, R, L) Water Valve" + // and + // Var 13 = "Fourth (L, R, L) Water Valve State" + // Controls + // Var 27 = "Water Flowing to Join and Pump Bridge (L, R, L, L)" + // Var 26 = "Water Flowing to Pipe At Entry Point (L, R, L, R)" + uint16 var13 = _vm->_varStore->getVar(13); + if (_vm->_varStore->getVar(23)) { + _vm->_varStore->setVar(27, !var13); + _vm->_varStore->setVar(26, var13); + } else { + // No water into Valve + _vm->_varStore->setVar(27, 0); + _vm->_varStore->setVar(26, 0); + } + + // TODO: Not sure that original had OR logic for water flow at Join... + // Var 27 = "Water Flowing to Join and Pump Bridge (L, R, L, L)" + // Or + // Var 28 = "Water Flowing to Join and Pump Bridge (L, L, R)" + // Controls + // Var 31 = "Water Flowing to Join (L, L, R)" // 0 to 2 = Stop Sound, Background, Background with Water Flow + // Var 7 = "Bridge Pump Running" + // TODO: Not sure about control of Var 31 which is tristate... + if (_vm->_varStore->getVar(27) || _vm->_varStore->getVar(28)) { + _vm->_varStore->setVar(31, 2); // Background with Water Flow + _vm->_varStore->setVar(7, 1); + } else { + // No water into Valve + _vm->_varStore->setVar(31, 1); // Background + _vm->_varStore->setVar(7, 0); + } + + // TODO: Code for this shouldn't be here... + // Move to Opcodes called by Pipe Extension... + // Var 25 = "Water Flowing to Pipe Bridge (L, R, R, L)" + // and + // Var 6 = "Pipe Bridge Extended" + // Controls + // Var 32 = "Water Flowing (L, R, R, L, Pipe) State" }, // 0 to 2 = Stop Sound, Background, Background with Water Flow + // Var 4 = "Water Flowing (L, R, R, L, Pipe Extended) to Pump for Book Room Elevator" + // TODO: Not sure about control of Var 32 which is tristate... + if (_vm->_varStore->getVar(25) && _vm->_varStore->getVar(6)) { + _vm->_varStore->setVar(32, 2); // Background with Water Flow + _vm->_varStore->setVar(4, 1); + } else { + // No water into Valve + _vm->_varStore->setVar(32, 1); // Background + _vm->_varStore->setVar(4, 0); + } + } +} + +void MystScriptParser_Channelwood::opcode_202_disable(void) { + g_opcode202Parameters.enabled = false; +} + +void MystScriptParser_Channelwood::opcode_202(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + // Used for Cards 3328, 3691, 3731, 3809, 3846 etc. (Water Valves) + if (argc == 0) { + g_opcode202Parameters.var = var; + g_opcode202Parameters.enabled = true; + } else + unknown(op, var, argc, argv); +} + +static struct { + bool enabled; +} g_opcode203Parameters; + +void MystScriptParser_Channelwood::opcode_203_run(void) { + if (g_opcode203Parameters.enabled) { + // Used for Card 3310 (Sirrus' Room Right Bed Drawer), + // Card 3307 (Sirrus' Room Left Bed Drawer) + // and Card 3318 (Sirrus' Room Nightstand Drawer) + // TODO: Fill in Logic... + } +} + +void MystScriptParser_Channelwood::opcode_203_disable(void) { + g_opcode203Parameters.enabled = false; +} + +void MystScriptParser_Channelwood::opcode_203(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Card 3310 (Sirrus' Room Right Bed Drawer), + // Card 3307 (Sirrus' Room Left Bed Drawer) + // and Card 3318 (Sirrus' Room Nightstand Drawer) + if (argc == 0) + g_opcode203Parameters.enabled = true; + else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Channelwood::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + // Used in Card 3012 (Achenar's Holoprojector Control) + varUnusedCheck(op, var); + // TODO: Fill in Logic. Clearing Variable for View? +} + +} // End of namespace Mohawk diff --git a/engines/mohawk/myst_stacks/channelwood.h b/engines/mohawk/myst_stacks/channelwood.h new file mode 100644 index 0000000000..4ea55f6d46 --- /dev/null +++ b/engines/mohawk/myst_stacks/channelwood.h @@ -0,0 +1,77 @@ +/* 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_CHANNELWOOD_H +#define MYST_SCRIPTS_CHANNELWOOD_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_Channelwood : public MystScriptParser { +public: + MystScriptParser_Channelwood(MohawkEngine_Myst *vm); + ~MystScriptParser_Channelwood(); + + void disablePersistentScripts(); + void runPersistentScripts(); + +private: + void setupOpcodes(); + + void opcode_202_run(); + void opcode_202_disable(); + void opcode_203_run(); + void opcode_203_disable(); + + DECLARE_OPCODE(opcode_101); + DECLARE_OPCODE(opcode_102); + DECLARE_OPCODE(opcode_104); + DECLARE_OPCODE(opcode_117); + DECLARE_OPCODE(opcode_118); + DECLARE_OPCODE(opcode_119); + DECLARE_OPCODE(opcode_122); + DECLARE_OPCODE(opcode_127); + DECLARE_OPCODE(opcode_129); + + DECLARE_OPCODE(opcode_201); + DECLARE_OPCODE(opcode_202); + DECLARE_OPCODE(opcode_203); + + DECLARE_OPCODE(opcode_300); +}; + +} // 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 086589a51b..c4cc4cce11 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -338,32 +338,6 @@ void MystScriptParser_Myst::opcode_101(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - varUnusedCheck(op, var); - - if (argc == 1) { - debugC(kDebugScript, "Opcode %d: Play Pipe Movie and Sound", op); - - uint16 soundId = argv[0]; - debugC(kDebugScript, "\tsoundId: %d", soundId); - - _vm->_sound->playSound(soundId); - - // TODO: Get Movie Location from Invoking Resource Rect, rather than - // hardcoded 267, 170 ? - - // TODO: Need version of playMovie blocking which allows selection - // of start and finish points. - if (!_vm->_varStore->getVar(6)) { - // Play Pipe Extending i.e. 0 to 1/2 way through file - _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack), 267, 170); - } else { - // Play Pipe Retracting i.e. 1/2 way to end of file - _vm->_video->playMovie(_vm->wrapMovieFilename("pipebrid", kChannelwoodStack), 267, 170); - } - } else - unknown(op, var, argc, argv); - break; case kDniStack: // Used in Card 5014 (Atrus) // Hotspot Resource Used to hand Page to Atrus... @@ -399,29 +373,6 @@ void MystScriptParser_Myst::opcode_102(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - varUnusedCheck(op, var); - - if (argc == 2 || argc == 3) { - debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Optional Delay and Change Card", op); - - uint16 imageId = argv[0]; - uint16 cardId = argv[1]; - uint16 delay = 0; - - if (argc == 3) - delay = argv[2]; // TODO: Not sure about purpose of this parameter... - - debugC(kDebugScript, "\timageId: %d", imageId); - debugC(kDebugScript, "\tcardId: %d", cardId); - debugC(kDebugScript, "\tdelay: %d", delay); - - _vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333)); - _vm->_system->delayMillis(delay / 100); - _vm->changeToCard(cardId, true); - } else - unknown(op, var, argc, argv); - break; case kDemoStack: varUnusedCheck(op, var); @@ -495,26 +446,6 @@ void MystScriptParser_Myst::opcode_104(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - varUnusedCheck(op, var); - - // Used on Channelwood Card 3280 - if (argc == 0) { - debugC(kDebugScript, "Opcode %d: Do Water Tank Valve Open Animation", op); - Common::Rect rect = _invokingResource->getRect(); - - // TODO: Need to load the image ids from Script Resources structure of VIEW - for (uint16 imageId = 3595; imageId <= 3601; imageId++) { - _vm->_gfx->copyImageToScreen(imageId, rect); - _vm->_system->delayMillis(50); - } - - // TODO: Is 8 gotten from var7 of calling hotspot, rather than hardcoded? - _vm->_varStore->setVar(8, 1); - _vm->_varStore->setVar(19, 1); - } else - unknown(op, var, argc, argv); - break; default: unknown(op, var, argc, argv); break; @@ -809,33 +740,6 @@ void MystScriptParser_Myst::opcode_117(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - varUnusedCheck(op, var); - - if (argc == 1) { - // Used on Card 3012 (Temple Hologram Monitor) - uint16 button = argv[0]; // 0 to 3 - _vm->_varStore->setVar(17, button); - switch (button) { - case 0: - _vm->_video->playMovie(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 71); - break; - case 1: - _vm->_video->playMovie(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 71); - break; - case 2: - _vm->_video->playMovie(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 71); - break; - case 3: - _vm->_video->playMovie(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 71); - break; - default: - warning("Opcode %d Control Variable Out of Range", op); - break; - } - } else - unknown(op, var, argc, argv); - break; default: unknown(op, var, argc, argv); break; @@ -870,16 +774,6 @@ void MystScriptParser_Myst::opcode_118(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - varUnusedCheck(op, var); - - if (argc == 0) { - // Used on Card 3318 (Sirrus' Room Nightstand Drawer) - // Triggered when clicked on drawer - // TODO: Implement function... - } else - unknown(op, var, argc, argv); - break; default: unknown(op, var, argc, argv); break; @@ -906,30 +800,6 @@ void MystScriptParser_Myst::opcode_119(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - if (argc == 0) { - // Used on Card 3333 (Temple Hologram) - // TODO: Not 100% sure about movie position... - switch (_vm->_varStore->getVar(17)) { - case 0: - _vm->_video->playMovie(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 126, 74); - break; - case 1: - _vm->_video->playMovie(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 126, 74); - break; - case 2: - _vm->_video->playMovie(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 126, 74); - break; - case 3: - _vm->_video->playMovie(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 126, 74); - break; - default: - warning("Opcode %d Control Variable Out of Range", op); - break; - } - } else - unknown(op, var, argc, argv); - break; default: unknown(op, var, argc, argv); break; @@ -1007,24 +877,6 @@ void MystScriptParser_Myst::opcode_122(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kChannelwoodStack: - // Used on Channelwood Card 3280 - if (argc == 0) { - debugC(kDebugScript, "Opcode %d: Do Water Tank Valve Close Animation", op); - Common::Rect rect = _invokingResource->getRect(); - - // TODO: Need to load the image ids from Script Resources structure of VIEW - for (uint16 imageId = 3601; imageId >= 3595; imageId--) { - _vm->_gfx->copyImageToScreen(imageId, rect); - _vm->_system->delayMillis(50); - } - - // TODO: Is 8 gotten from var7 of calling hotspot, rather than hard-coded? - _vm->_varStore->setVar(8, 0); - _vm->_varStore->setVar(19, 0); - } else - unknown(op, var, argc, argv); - break; case kMechanicalStack: if (argc == 0) { // Used on Card 6120 (Elevator) @@ -1125,21 +977,6 @@ void MystScriptParser_Myst::opcode_127(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kChannelwoodStack: - if (argc == 2) { - // Used by Card 3262 (Elevator) - debugC(kDebugScript, "Opcode %d: Unknown...", op); - - uint16 u0 = argv[0]; - uint16 u1 = argv[1]; - - debugC(kDebugScript, "\tu0: %d", u0); - debugC(kDebugScript, "\tu1: %d", u1); - - // TODO: Fill in Code... - } else - unknown(op, var, argc, argv); - break; case kMechanicalStack: if (argc == 0) { // Used for Mech Card 6226 (3 Crystals) @@ -1174,20 +1011,6 @@ void MystScriptParser_Myst::opcode_129(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kChannelwoodStack: - if (argc == 1) { - // Used by Card 3262 (Elevator) - debugC(kDebugScript, "Opcode %d: Unknown...", op); - - uint16 cardId = argv[0]; - - debugC(kDebugScript, "\tcardId: %d", cardId); - - // TODO: Fill in Code... - _vm->changeToCard(cardId, true); - } else - unknown(op, var, argc, argv); - break; case kMechanicalStack: if (argc == 0) { // Used for Mech Card 6226 (3 Crystals) @@ -1783,29 +1606,6 @@ void MystScriptParser_Myst::opcode_201(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - // Used for Card 3247 (Elevator #1 Movement), 3161 (Bridge Movement), 3259 (Elevator #3 Movement) and 3252 (Elevator #2 Movement) - if (argc == 0) { - // TODO: Fill in Function. Video Playback? Rect from invoking hotspot resource... - if (false) { - // Card 3161 - _vm->_video->playMovie(_vm->wrapMovieFilename("bridge", kChannelwoodStack), 292, 204); - - // Card 3247 - _vm->_video->playMovie(_vm->wrapMovieFilename("welev1dn", kChannelwoodStack), 214, 107); - _vm->_video->playMovie(_vm->wrapMovieFilename("welev1up", kChannelwoodStack), 214, 107); - - // Card 3252 - _vm->_video->playMovie(_vm->wrapMovieFilename("welev2dn", kChannelwoodStack), 215, 118); - _vm->_video->playMovie(_vm->wrapMovieFilename("welev2up", kChannelwoodStack), 215, 118); - - // Card 3259 - _vm->_video->playMovie(_vm->wrapMovieFilename("welev3dn", kChannelwoodStack), 213, 99); - _vm->_video->playMovie(_vm->wrapMovieFilename("welev3up", kChannelwoodStack), 213, 99); - } - } else - unknown(op, var, argc, argv); - break; case kDemoStack: // Used on Card 2001, 2002 and 2003 if (argc == 0) { @@ -1839,145 +1639,7 @@ void MystScriptParser_Myst::opcode_202_run(void) { // Used for Card 6220 (Sirrus' Mechanical Bird) // TODO: Fill in Function break; - case kChannelwoodStack: - // Used for Cards 3328, 3691, 3731, 3809, 3846 etc. (Water Valves) - - // Code for Water Flow Logic - // Var 8 = "Water Tank Valve State" - // Controls - // Var 19 = "Water Flowing to First Water Valve" - // Code for this in Opcode 104 / 122 - - // Var 19 = "Water Flowing to First Water Valve" - // and - // Var 9 = "First Water Valve State" - // Controls - // Var 20 = "Water Flowing to Second (L) Water Valve" - // Var 3 = "Water Flowing (R) to Pump for Upper Walkway to Temple Elevator" - uint16 var9 = _vm->_varStore->getVar(9); - if (_vm->_varStore->getVar(19)) { - _vm->_varStore->setVar(20, !var9); - _vm->_varStore->setVar(3, var9); - } else { - // No water into Valve - _vm->_varStore->setVar(20, 0); - _vm->_varStore->setVar(3, 0); - } - - // Var 20 = "Water Flowing to Second (L) Water Valve" - // and - // Var 10 = "Second (L) Water Valve State" - // Controls - // Var 24 = "Water Flowing to Third (L, L) Water Valve" - // Var 21 = "Water Flowing to Third (L, R) Water Valve" - uint16 var10 = _vm->_varStore->getVar(10); - if (_vm->_varStore->getVar(20)) { - _vm->_varStore->setVar(24, !var10); - _vm->_varStore->setVar(21, var10); - } else { - // No water into Valve - _vm->_varStore->setVar(24, 0); - _vm->_varStore->setVar(21, 0); - } - - // Var 21 = "Water Flowing to Third (L, R) Water Valve" - // and - // Var 11 = "Third (L, R) Water Valve State" - // Controls - // Var 23 = "Water Flowing to Fourth (L, R, L) Water Valve" - // Var 22 = "Water Flowing to Fourth (L, R, R) Water Valve" - uint16 var11 = _vm->_varStore->getVar(11); - if (_vm->_varStore->getVar(21)) { - _vm->_varStore->setVar(23, !var11); - _vm->_varStore->setVar(22, var11); - } else { - // No water into Valve - _vm->_varStore->setVar(23, 0); - _vm->_varStore->setVar(22, 0); - } - - // Var 24 = "Water Flowing to Third (L, L) Water Valve" - // and - // Var 14 = "Third (L, L) Water Valve State" - // Controls - // Var 29 = "Water Flowing to Pipe In Water (L, L, L)" - // Var 28 = "Water Flowing to Join and Pump Bridge (L, L, R)" - uint16 var14 = _vm->_varStore->getVar(14); - if (_vm->_varStore->getVar(24)) { - _vm->_varStore->setVar(29, !var14); - _vm->_varStore->setVar(28, var14); - } else { - // No water into Valve - _vm->_varStore->setVar(29, 0); - _vm->_varStore->setVar(28, 0); - } - - // Var 22 = "Water Flowing to Fourth (L, R, R) Water Valve" - // and - // Var 12 = "Fourth (L, R, R) Water Valve State" - // Controls - // Var 25 = "Water Flowing to Pipe Bridge (L, R, R, L)" - // Var 15 = "Water Flowing (L, R, R, R) to Pump for Lower Walkway to Upper Walkway Elevator" - uint16 var12 = _vm->_varStore->getVar(12); - if (_vm->_varStore->getVar(22)) { - _vm->_varStore->setVar(25, !var12); - _vm->_varStore->setVar(15, var12); - } else { - // No water into Valve - _vm->_varStore->setVar(25, 0); - _vm->_varStore->setVar(15, 0); - } - - // Var 23 = "Water Flowing to Fourth (L, R, L) Water Valve" - // and - // Var 13 = "Fourth (L, R, L) Water Valve State" - // Controls - // Var 27 = "Water Flowing to Join and Pump Bridge (L, R, L, L)" - // Var 26 = "Water Flowing to Pipe At Entry Point (L, R, L, R)" - uint16 var13 = _vm->_varStore->getVar(13); - if (_vm->_varStore->getVar(23)) { - _vm->_varStore->setVar(27, !var13); - _vm->_varStore->setVar(26, var13); - } else { - // No water into Valve - _vm->_varStore->setVar(27, 0); - _vm->_varStore->setVar(26, 0); - } - - // TODO: Not sure that original had OR logic for water flow at Join... - // Var 27 = "Water Flowing to Join and Pump Bridge (L, R, L, L)" - // Or - // Var 28 = "Water Flowing to Join and Pump Bridge (L, L, R)" - // Controls - // Var 31 = "Water Flowing to Join (L, L, R)" // 0 to 2 = Stop Sound, Background, Background with Water Flow - // Var 7 = "Bridge Pump Running" - // TODO: Not sure about control of Var 31 which is tristate... - if (_vm->_varStore->getVar(27) || _vm->_varStore->getVar(28)) { - _vm->_varStore->setVar(31, 2); // Background with Water Flow - _vm->_varStore->setVar(7, 1); - } else { - // No water into Valve - _vm->_varStore->setVar(31, 1); // Background - _vm->_varStore->setVar(7, 0); - } - - // TODO: Code for this shouldn't be here... - // Move to Opcodes called by Pipe Extension... - // Var 25 = "Water Flowing to Pipe Bridge (L, R, R, L)" - // and - // Var 6 = "Pipe Bridge Extended" - // Controls - // Var 32 = "Water Flowing (L, R, R, L, Pipe) State" }, // 0 to 2 = Stop Sound, Background, Background with Water Flow - // Var 4 = "Water Flowing (L, R, R, L, Pipe Extended) to Pump for Book Room Elevator" - // TODO: Not sure about control of Var 32 which is tristate... - if (_vm->_varStore->getVar(25) && _vm->_varStore->getVar(6)) { - _vm->_varStore->setVar(32, 2); // Background with Water Flow - _vm->_varStore->setVar(4, 1); - } else { - // No water into Valve - _vm->_varStore->setVar(32, 1); // Background - _vm->_varStore->setVar(4, 0); - } + default: break; } } @@ -2007,14 +1669,6 @@ void MystScriptParser_Myst::opcode_202(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - // Used for Cards 3328, 3691, 3731, 3809, 3846 etc. (Water Valves) - if (argc == 0) { - g_opcode202Parameters.var = var; - g_opcode202Parameters.enabled = true; - } else - unknown(op, var, argc, argv); - break; default: varUnusedCheck(op, var); @@ -2042,12 +1696,6 @@ void MystScriptParser_Myst::opcode_203_run(void) { // Used for Card 6043 (Weapons Rack with Snake Box) // TODO: Fill in Logic for Snake Box... break; - case kChannelwoodStack: - // Used for Card 3310 (Sirrus' Room Right Bed Drawer), - // Card 3307 (Sirrus' Room Left Bed Drawer) - // and Card 3318 (Sirrus' Room Nightstand Drawer) - // TODO: Fill in Logic... - break; } } } @@ -2072,15 +1720,6 @@ void MystScriptParser_Myst::opcode_203(uint16 op, uint16 var, uint16 argc, uint1 } else unknown(op, var, argc, argv); break; - case kChannelwoodStack: - // Used for Card 3310 (Sirrus' Room Right Bed Drawer), - // Card 3307 (Sirrus' Room Left Bed Drawer) - // and Card 3318 (Sirrus' Room Nightstand Drawer) - if (argc == 0) { - g_opcode203Parameters.enabled = true; - } else - unknown(op, var, argc, argv); - break; default: unknown(op, var, argc, argv); break; @@ -2850,11 +2489,6 @@ void MystScriptParser_Myst::opcode_300(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); // TODO: Fill in Logic. Clearing Variable for View? break; - case kChannelwoodStack: - // Used in Card 3012 (Achenar's Holoprojector Control) - varUnusedCheck(op, var); - // TODO: Fill in Logic. Clearing Variable for View? - break; case kDniStack: // Used in Card 5014 (Atrus Writing) varUnusedCheck(op, var); diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h index 1548af9bef..4795fe54fc 100644 --- a/engines/mohawk/myst_stacks/myst.h +++ b/engines/mohawk/myst_stacks/myst.h @@ -150,7 +150,7 @@ private: DECLARE_OPCODE(opcode_312); }; -} +} // End of namespace Mohawk #undef DECLARE_OPCODE |