From e4fa2855b610d5667bd6a68147db7818212100e7 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 30 Nov 2010 22:02:03 +0000 Subject: MOHAWK: Split out stoneship opcodes into their own class svn-id: r54689 --- engines/mohawk/module.mk | 4 +- engines/mohawk/myst.cpp | 4 + engines/mohawk/myst_stacks/myst.cpp | 429 --------------------- engines/mohawk/myst_stacks/myst.h | 3 - engines/mohawk/myst_stacks/stoneship.cpp | 628 +++++++++++++++++++++++++++++++ engines/mohawk/myst_stacks/stoneship.h | 91 +++++ 6 files changed, 725 insertions(+), 434 deletions(-) create mode 100644 engines/mohawk/myst_stacks/stoneship.cpp create mode 100644 engines/mohawk/myst_stacks/stoneship.h (limited to 'engines/mohawk') diff --git a/engines/mohawk/module.mk b/engines/mohawk/module.mk index 71c9c55be9..f651c5cb5e 100644 --- a/engines/mohawk/module.mk +++ b/engines/mohawk/module.mk @@ -25,8 +25,8 @@ MODULE_OBJS = \ video.o \ myst_stacks/credits.o \ myst_stacks/myst.o \ - myst_stacks/selenitic.o - + myst_stacks/selenitic.o \ + myst_stacks/stoneship.o # This module can be built as a plugin ifeq ($(ENABLE_MOHAWK), DYNAMIC_PLUGIN) diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index caf862d266..81fd5cddad 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -42,6 +42,7 @@ #include "mohawk/myst_stacks/credits.h" #include "mohawk/myst_stacks/myst.h" #include "mohawk/myst_stacks/selenitic.h" +#include "mohawk/myst_stacks/stoneship.h" namespace Mohawk { @@ -382,6 +383,9 @@ void MohawkEngine_Myst::changeToStack(uint16 stack) { case kSeleniticStack: _scriptParser = new MystScriptParser_Selenitic(this); break; + case kStoneshipStack: + _scriptParser = new MystScriptParser_Stoneship(this); + break; default: _scriptParser = new MystScriptParser_Myst(this); break; diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index d28cd5e6c3..086589a51b 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -115,8 +115,6 @@ void MystScriptParser_Myst::setupOpcodes() { SPECIFIC_OPCODE(104, opcode_104), SPECIFIC_OPCODE(105, opcode_105), SPECIFIC_OPCODE(109, opcode_109), - SPECIFIC_OPCODE(111, opcode_111), - SPECIFIC_OPCODE(112, opcode_112), SPECIFIC_OPCODE(113, opcode_113), SPECIFIC_OPCODE(114, opcode_114), SPECIFIC_OPCODE(115, opcode_115), @@ -163,7 +161,6 @@ void MystScriptParser_Myst::setupOpcodes() { SPECIFIC_OPCODE(204, opcode_204), SPECIFIC_OPCODE(205, opcode_205), SPECIFIC_OPCODE(206, opcode_206), - SPECIFIC_OPCODE(207, opcode_207), SPECIFIC_OPCODE(208, opcode_208), SPECIFIC_OPCODE(209, opcode_209), SPECIFIC_OPCODE(210, opcode_210), @@ -302,17 +299,6 @@ void MystScriptParser_Myst::opcode_100(uint16 op, uint16 var, uint16 argc, uint1 // TODO: No soundIdLinkDst for Opcode 100 link? Check Original. } break; - case kStoneshipStack: - // Used for Cards 2185 (Water Pump) - varUnusedCheck(op, var); - - if (argc == 0) { - debugC(kDebugScript, "Opcode %d: Unknown Function", op); - - // TODO: Called when Water Pump Button is pressed? Animation? - } else - unknown(op, var, argc, argv); - break; case kDniStack: // Used in Card 5022 (Rocks) varUnusedCheck(op, var); @@ -340,28 +326,6 @@ void MystScriptParser_Myst::opcode_100(uint16 op, uint16 var, uint16 argc, uint1 void MystScriptParser_Myst::opcode_101(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - if (argc == 6) { - // Used by Door Buttons to Brothers' Rooms - // Cards 2294, 2255 - Common::Rect u0_rect = Common::Rect(argv[0], argv[1], argv[2], argv[3]); - uint16 u1 = argv[3]; - uint16 u2 = argv[2]; - - debugC(kDebugScript, "Opcode %d: Unknown", op); - debugC(kDebugScript, "u0_rect.left: %d", u0_rect.left); - debugC(kDebugScript, "u0_rect.top: %d", u0_rect.top); - debugC(kDebugScript, "u0_rect.right: %d", u0_rect.right); - debugC(kDebugScript, "u0_rect.bottom: %d", u0_rect.bottom); - debugC(kDebugScript, "u1: %d", u1); - debugC(kDebugScript, "u2: %d", u2); - - // TODO: Fill in logic... - } else - unknown(op, var, argc, argv); - break; case kDemoPreviewStack: case kMystStack: debugC(kDebugScript, "Opcode %d: Decrement Variable", op); @@ -424,25 +388,6 @@ void MystScriptParser_Myst::opcode_101(uint16 op, uint16 var, uint16 argc, uint1 void MystScriptParser_Myst::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - if (argc == 2) { - debugC(kDebugScript, "Opcode %d: Play Book Room Movie", op); - - uint16 startTime = argv[0]; - uint16 endTime = argv[1]; - - debugC(kDebugScript, "\tstartTime: %d", startTime); - debugC(kDebugScript, "\tendTime: %d", endTime); - - warning("TODO: Opcode %d Movie Time Index %d to %d", op, startTime, endTime); - // TODO: Need version of playMovie blocking which allows selection - // of start and finish points. - _vm->_video->playMovie(_vm->wrapMovieFilename("bkroom", kStoneshipStack), 159, 99); - } else - unknown(op, var, argc, argv); - break; case kDemoPreviewStack: case kMystStack: if (argc == 0) { @@ -495,20 +440,6 @@ void MystScriptParser_Myst::opcode_102(uint16 op, uint16 var, uint16 argc, uint1 void MystScriptParser_Myst::opcode_103(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - if (argc == 1) { - // Used on Card 2197 (Sirrus' Room Drawers) - debugC(kDebugScript, "Opcode %d: Unknown", op); - - uint16 u0 = argv[0]; - - debugC(kDebugScript, "\tu0: %d", u0); - // TODO: Fill in Logic... - } else - unknown(op, var, argc, argv); - break; case kDemoPreviewStack: case kMystStack: // Used on Myst Card 4162 (Fireplace Grid) @@ -536,24 +467,6 @@ void MystScriptParser_Myst::opcode_103(uint16 op, uint16 var, uint16 argc, uint1 void MystScriptParser_Myst::opcode_104(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - // Used for Card 2004 (Achenar's Room Drawers) - // Used for Closeup of Torn Note? - if (argc == 1) { - debugC(kDebugScript, "Opcode %d: Unknown Function", op); - - uint16 u0 = argv[0]; - debugC(kDebugScript, "\tu0: %d", u0); - - // TODO: Fill in Function... - // Does u0 correspond to a resource Id? Enable? Disable? - // Similar to Opcode 111 (Stoneship Version).. But does this also - // draw closeup image of note / change to closeup card? - } else - unknown(op, var, argc, argv); - break; case kMystStack: varUnusedCheck(op, var); @@ -686,60 +599,6 @@ void MystScriptParser_Myst::opcode_109(uint16 op, uint16 var, uint16 argc, uint1 } } -void MystScriptParser_Myst::opcode_111(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); - - switch (_vm->getCurStack()) { - case kStoneshipStack: - if (argc == 1) { - // Used for Card 2004 (Achenar's Room Drawers) - // Used by Drawers Hotspots... - - debugC(kDebugScript, "Opcode %d: Unknown Function", op); - - uint16 u0 = argv[0]; - debugC(kDebugScript, "\tu0: %d", u0); - - // TODO: Fill in Function... - // Does u0 correspond to a resource Id? Enable? Disable? - } else - unknown(op, var, argc, argv); - break; - default: - unknown(op, var, argc, argv); - break; - } -} - -void MystScriptParser_Myst::opcode_112(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for Card 2013 (Achenar's Rose-Skull Hologram) - if (argc == 3) { - debugC(kDebugScript, "Opcode %d: Rose-Skull Hologram Playback", op); - - uint16 varValue = _vm->_varStore->getVar(var); - - debugC(kDebugScript, "\tVar: %d = %d", var, varValue); - - uint16 startPoint = argv[0]; - uint16 endPoint = argv[1]; - uint16 u0 = argv[2]; - - debugC(kDebugScript, "\tstartPoint: %d", startPoint); - debugC(kDebugScript, "\tendPoint: %d", endPoint); - debugC(kDebugScript, "\tu0: %d", u0); - - // TODO: Fill in Function... - } else - unknown(op, var, argc, argv); - break; - default: - unknown(op, var, argc, argv); - break; - } -} - void MystScriptParser_Myst::opcode_113(uint16 op, uint16 var, uint16 argc, uint16 *argv) { varUnusedCheck(op, var); @@ -895,29 +754,6 @@ void MystScriptParser_Myst::opcode_116(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - if (argc == 1) { - // Used on Card 2111 (Compass Rose) - // Called when Button Clicked. - uint16 correctButton = argv[0]; - - if (correctButton) { - // Correct Button -> Light On Logic - // TODO: Deal with if main power on? - _vm->_varStore->setVar(16, 1); - _vm->_varStore->setVar(30, 0); - } else { - // Wrong Button -> Power Failure Logic - // TODO: Fill in Alarm - _vm->_varStore->setVar(16, 0); - _vm->_varStore->setVar(30, 2); - _vm->_varStore->setVar(33, 0); - } - } else - unknown(op, var, argc, argv); - break; case kMystStack: if (argc == 1) { // Used on Card 4006 (Clock Tower Time Controls) @@ -958,18 +794,6 @@ void MystScriptParser_Myst::opcode_116(uint16 op, uint16 var, uint16 argc, uint1 void MystScriptParser_Myst::opcode_117(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - if (argc == 0) { - // Used on Card 2132 (Chest at Bottom of Lighthouse) - // Called when Valve Hotspot Clicked. - // TODO: Fill in Function to play right section of movie - // based on valve state and water in chest.. - _vm->_video->playMovie(_vm->wrapMovieFilename("ligspig", kStoneshipStack), 97, 267); - } else - unknown(op, var, argc, argv); - break; case kMystStack: if (argc == 2) { // Used by Myst Imager Control Button @@ -1020,17 +844,6 @@ void MystScriptParser_Myst::opcode_117(uint16 op, uint16 var, uint16 argc, uint1 void MystScriptParser_Myst::opcode_118(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - if (argc == 0) { - // Used on Card 2126 (Lighthouse Looking Along Plank) - // Called when Exit Resource is clicked - - // TODO: Implement Function... - // If holding Key to Lamp Room Trapdoor, drop to bottom of - // Lighthouse... - } else - unknown(op, var, argc, argv); - break; case kMystStack: varUnusedCheck(op, var); @@ -1077,14 +890,6 @@ void MystScriptParser_Myst::opcode_119(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kStoneshipStack: - if (argc == 0) { - // Used on Card 2143 (Lighthouse Trapdoor) - // Called when Lock Hotspot Clicked while holding key. - _vm->_video->playMovie(_vm->wrapMovieFilename("openloc", kStoneshipStack), 187, 72); - } else - unknown(op, var, argc, argv); - break; case kMystStack: if (argc == 1) { // Used on Card 4383 and 4451 (Tower Elevator) @@ -1137,38 +942,6 @@ void MystScriptParser_Myst::opcode_120(uint16 op, uint16 var, uint16 argc, uint1 MystResource *_top; switch (_vm->getCurStack()) { - case kStoneshipStack: - if (argc == 1) { - // Used for Cards 2285, 2289, 2247, 2251 (Side Doors in Tunnels Down To Brothers Rooms) - uint16 movieId = argv[0]; - - debugC(kDebugScript, "Opcode %d: Play Side Door Movies", op); - debugC(kDebugScript, "\tmovieId: %d", movieId); - - switch (movieId) { - case 0: - // Card 2251 - _vm->_video->playMovie(_vm->wrapMovieFilename("tunaup", kStoneshipStack), 149, 161); - break; - case 1: - // Card 2247 - _vm->_video->playMovie(_vm->wrapMovieFilename("tunadown", kStoneshipStack), 218, 150); - break; - case 2: - // Card 2289 - _vm->_video->playMovie(_vm->wrapMovieFilename("tuncup", kStoneshipStack), 259, 161); - break; - case 3: - // Card 2285 - _vm->_video->playMovie(_vm->wrapMovieFilename("tuncdown", kStoneshipStack), 166, 150); - break; - default: - warning("Opcode 120 MovieId Out Of Range"); - break; - } - } else - unknown(op, var, argc, argv); - break; case kMystStack: // Used for Card 4297 (Generator Puzzle Buttons) debugC(kDebugScript, "Opcode %d: Toggle Var8 of Invoking Resource", op); @@ -1312,18 +1085,6 @@ void MystScriptParser_Myst::opcode_124(uint16 op, uint16 var, uint16 argc, uint1 void MystScriptParser_Myst::opcode_125(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - if (argc == 1) { - // Used on Card 2197 (Sirrus' Room Drawers) - debugC(kDebugScript, "Opcode %d: Unknown uses Var %d", op, var); - - uint16 u0 = argv[0]; - - debugC(kDebugScript, "\tu0: %d", u0); - // TODO: Fill in Logic... - } else - unknown(op, var, argc, argv); - break; case kMechanicalStack: if (argc == 0) { // Used on Card 6267 (Code Lock) @@ -1801,11 +1562,6 @@ void MystScriptParser_Myst::opcode_200_run() { case kDemoStack: // Used on Card 2000 // TODO : Implement function here to play though intro movies and change card? break; - case kStoneshipStack: - // Used for Card 2013 (Achenar's Rose-Skull Hologram) - - // TODO: Implement Function... - break; case kDemoPreviewStack: case kMystStack: curImageIndex = _vm->_varStore->getVar(g_opcode200Parameters.var); @@ -1892,15 +1648,6 @@ void MystScriptParser_Myst::opcode_200(uint16 op, uint16 var, uint16 argc, uint1 _vm->changeToCard(_vm->getCurCard()+1, true); break; - case kStoneshipStack: - varUnusedCheck(op, var); - - // Used for Card 2013 (Achenar's Rose-Skull Hologram) - if (argc == 0) { - g_opcode200Parameters.enabled = true; - } else - unknown(op, var, argc, argv); - break; case kDemoPreviewStack: case kMystStack: if (argc == 4) { @@ -1976,11 +1723,6 @@ void MystScriptParser_Myst::opcode_201_run() { if (g_opcode201Parameters.enabled) { switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for Card 2013 (Achenar's Rose-Skull Hologram) - - // TODO: Fill in Function... - break; case kMystStack: var105 = _vm->_varStore->getVar(105); if (var105 && !g_opcode201Parameters.lastVar105) @@ -2021,15 +1763,6 @@ void MystScriptParser_Myst::opcode_201(uint16 op, uint16 var, uint16 argc, uint1 _vm->_gfx->copyImageToScreen(4, Common::Rect(0, 0, 544, 333)); // TODO: Wait until video ends, then change to card 5 break; - case kStoneshipStack: - varUnusedCheck(op, var); - - // Used for Card 2013 (Achenar's Rose-Skull Hologram) - if (argc == 0) { - g_opcode201Parameters.enabled = true; - } else - unknown(op, var, argc, argv); - break; case kMystStack: // Used for Cards 4257, 4260, 4263, 4266, 4269, 4272, 4275 and 4278 (Ship Puzzle Boxes) if (argc == 1) { @@ -2256,14 +1989,6 @@ void MystScriptParser_Myst::opcode_202_disable(void) { void MystScriptParser_Myst::opcode_202(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - // Used for Card 2160 (Lighthouse Battery Pack Closeup) - // TODO: Implement Code... - // Not Sure of Purpose - Update of Light / Discharge? - unknown(op, var, argc, argv); - break; case kDemoPreviewStack: case kMystStack: varUnusedCheck(op, var); @@ -2334,35 +2059,7 @@ void MystScriptParser_Myst::opcode_203_disable(void) { void MystScriptParser_Myst::opcode_203(uint16 op, uint16 var, uint16 argc, uint16 *argv) { varUnusedCheck(op, var); - uint16 imageIdDarkDoorOpen = 0; - uint16 imageIdDarkDoorClosed = 0; - switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for all/most Cards in Tunnels Down To Brothers Rooms - - // TODO: Duplicate or similar function to Opcode 203? - if (argc == 2 || argc == 4) { - debugC(kDebugScript, "Opcode %d: %d Arguments", op, argc); - - uint16 u0 = argv[0]; - if (argc == 4) { - imageIdDarkDoorOpen = argv[1]; - imageIdDarkDoorClosed = argv[2]; - } - uint16 soundIdAlarm = argv[argc - 1]; - - debugC(kDebugScript, "\tu0: %d", u0); - if (argc == 4) { - debugC(kDebugScript, "\timageIdDarkDoorOpen: %d", imageIdDarkDoorOpen); - debugC(kDebugScript, "\tsoundIdDarkDoorClosed: %d", imageIdDarkDoorClosed); - } - debugC(kDebugScript, "\tsoundIdAlarm: %d", soundIdAlarm); - - // TODO: Fill in Correct Function for Lights - } else - unknown(op, var, argc, argv); - break; case kMystStack: // Used for Card 4138 (Dock Forechamber Door) // Set forechamber door to closed @@ -2423,15 +2120,6 @@ void MystScriptParser_Myst::opcode_204(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for Card 2160 (Lighthouse Battery Pack Closeup) - if (argc == 0) { - // TODO: Implement Code For Battery Meter Level - // Overwrite _vm->_resources[1]->_subImages[0].rect.bottom 1 to 80 - // Add accessor functions for this... - } else - unknown(op, var, argc, argv); - break; case kMystStack: // Used for Card 4134 and 4149 (Dock) break; @@ -2478,35 +2166,7 @@ void MystScriptParser_Myst::opcode_205_disable(void) { void MystScriptParser_Myst::opcode_205(uint16 op, uint16 var, uint16 argc, uint16 *argv) { varUnusedCheck(op, var); - uint16 imageIdDoorOpen = 0; - uint16 imageIdDoorClosed = 0; - switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used on Cards 2322, 2285 (Tunnels Down To Brothers Rooms) - - // TODO: Duplicate or similar function to Opcode 203? - if (argc == 2 || argc == 4) { - debugC(kDebugScript, "Opcode %d: %d Arguments", op, argc); - - uint16 u0 = argv[0]; - if (argc == 4) { - imageIdDoorOpen = argv[1]; - imageIdDoorClosed = argv[2]; - } - uint16 soundIdAlarm = argv[argc - 1]; - - debugC(kDebugScript, "\tu0: %d", u0); - if (argc == 4) { - debugC(kDebugScript, "\timageIdDoorOpen: %d", imageIdDoorOpen); - debugC(kDebugScript, "\tsoundIdDoorClosed: %d", imageIdDoorClosed); - } - debugC(kDebugScript, "\tsoundIdAlarm: %d", soundIdAlarm); - - // TODO: Fill in Correct Function for Lights - } else - unknown(op, var, argc, argv); - break; case kMystStack: // Used for Card 4532 (Rocketship Piano) @@ -2564,14 +2224,6 @@ void MystScriptParser_Myst::opcode_206(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for Cards 2272 and 2234 (Facing Out of Door) - if (argc == 0) { - debugC(kDebugScript, "Opcode %d: Unknown, %d Arguments", op, argc); - // TODO: Function Unknown... - } else - unknown(op, var, argc, argv); - break; case kMystStack: // Used for Card 4256 (Butterfly Movie Activation) // TODO: Implement Logic... @@ -2596,41 +2248,8 @@ void MystScriptParser_Myst::opcode_206(uint16 op, uint16 var, uint16 argc, uint1 } } -void MystScriptParser_Myst::opcode_207(uint16 op, uint16 var, uint16 argc, uint16 *argv) { - varUnusedCheck(op, var); - - switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for Card 2138 (Lighthouse Key/Chest Animation Logic) - // TODO: Fill in function - warning("TODO: Opcode 207 Lighthouse Key/Chest Animation Logic"); - break; - default: - unknown(op, var, argc, argv); - break; - } -} - void MystScriptParser_Myst::opcode_208(uint16 op, uint16 var, uint16 argc, uint16 *argv) { switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - // Used in Card 2218 (Telescope view) - if (argc == 3) { - debugC(kDebugScript, "Opcode %d: Telescope View", op); - uint16 imagePanorama = argv[0]; - uint16 imageLighthouseOff = argv[1]; - uint16 imageLighthouseOn = argv[2]; - - debugC(kDebugScript, "Image (Panorama): %d", imagePanorama); - debugC(kDebugScript, "Image (Lighthouse Off): %d", imageLighthouseOff); - debugC(kDebugScript, "Image (Lighthouse On): %d", imageLighthouseOn); - - // TODO: Fill in Logic. - } else - unknown(op, var, argc, argv); - break; case kMystStack: if (argc == 0) { debugC(kDebugScript, "Opcode %d: Imager Function", op); @@ -2664,12 +2283,6 @@ void MystScriptParser_Myst::opcode_209_run(void) { if (g_opcode209Parameters.enabled) { switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for Card 2004 (Achenar's Room Drawers) - - // TODO: Implement Function... - // Swap Open Drawers? - break; case kDemoPreviewStack: case kMystStack: // Used for Card 4334 and 4348 (Myst Library Bookcase Door) @@ -2701,27 +2314,6 @@ void MystScriptParser_Myst::opcode_209(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kStoneshipStack: - // Used for Card 2004 (Achenar's Room Drawers) - if (argc == 11) { - g_opcode209Parameters.u0[0] = argv[0]; - g_opcode209Parameters.u0[1] = argv[1]; - g_opcode209Parameters.u0[2] = argv[2]; - g_opcode209Parameters.u0[3] = argv[3]; - g_opcode209Parameters.u0[4] = argv[4]; - - g_opcode209Parameters.u1[0] = argv[5]; - g_opcode209Parameters.u1[1] = argv[6]; - g_opcode209Parameters.u1[2] = argv[7]; - g_opcode209Parameters.u1[3] = argv[8]; - g_opcode209Parameters.u1[4] = argv[9]; - - g_opcode209Parameters.stateVar = argv[10]; - - g_opcode209Parameters.enabled = true; - } else - unknown(op, var, argc, argv); - break; case kDemoPreviewStack: case kMystStack: // Used for Card 4334 and 4348 (Myst Library Bookcase Door) @@ -2833,22 +2425,6 @@ void MystScriptParser_Myst::opcode_210(uint16 op, uint16 var, uint16 argc, uint1 varUnusedCheck(op, var); switch (_vm->getCurStack()) { - case kStoneshipStack: - varUnusedCheck(op, var); - - // Used in Cards 2205 and 2207 (Cloud Orbs in Sirrus' Room) - if (argc == 2) { - uint16 soundId = argv[0]; - uint16 soundIdStopping = argv[1]; - - // TODO: Work Out Function i.e. control Var etc. - if (false) { - _vm->_sound->playSound(soundId); - _vm->_sound->playSound(soundIdStopping); - } - } else - unknown(op, var, argc, argv); - break; case kMystStack: // Used for Card 4297 (Generator Puzzle) if (argc == 2) { @@ -3269,11 +2845,6 @@ void MystScriptParser_Myst::opcode_300(uint16 op, uint16 var, uint16 argc, uint1 debugC(kDebugScript, "Var: %d", var); // TODO: Fill in Logic break; - case kStoneshipStack: - // Used in Card 2218 (Telescope view) - varUnusedCheck(op, var); - // TODO: Fill in Logic. Clearing Variable for View? - break; case kMechanicalStack: // Used in Card 6156 (Fortress Elevator View) varUnusedCheck(op, var); diff --git a/engines/mohawk/myst_stacks/myst.h b/engines/mohawk/myst_stacks/myst.h index f7521afafa..1548af9bef 100644 --- a/engines/mohawk/myst_stacks/myst.h +++ b/engines/mohawk/myst_stacks/myst.h @@ -78,8 +78,6 @@ private: DECLARE_OPCODE(opcode_104); DECLARE_OPCODE(opcode_105); DECLARE_OPCODE(opcode_109); - DECLARE_OPCODE(opcode_111); - DECLARE_OPCODE(opcode_112); DECLARE_OPCODE(opcode_113); DECLARE_OPCODE(opcode_114); DECLARE_OPCODE(opcode_115); @@ -121,7 +119,6 @@ private: DECLARE_OPCODE(opcode_204); DECLARE_OPCODE(opcode_205); DECLARE_OPCODE(opcode_206); - DECLARE_OPCODE(opcode_207); DECLARE_OPCODE(opcode_208); DECLARE_OPCODE(opcode_209); DECLARE_OPCODE(opcode_210); diff --git a/engines/mohawk/myst_stacks/stoneship.cpp b/engines/mohawk/myst_stacks/stoneship.cpp new file mode 100644 index 0000000000..9e53a1e2bf --- /dev/null +++ b/engines/mohawk/myst_stacks/stoneship.cpp @@ -0,0 +1,628 @@ +/* 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/stoneship.h" + +#include "gui/message.h" + +namespace Mohawk { + +#define OPCODE(op, x) { op, &MystScriptParser::x, #x } +#define SPECIFIC_OPCODE(op, x) { op, (OpcodeProcMyst) &MystScriptParser_Stoneship::x, #x } + +MystScriptParser_Stoneship::MystScriptParser_Stoneship(MohawkEngine_Myst *vm) : MystScriptParser(vm) { + setupOpcodes(); +} + +MystScriptParser_Stoneship::~MystScriptParser_Stoneship() { +} + +void MystScriptParser_Stoneship::setupOpcodes() { + // "invalid" opcodes do not exist or have not been observed + // "unknown" opcodes exist, but their meaning is unknown + + static const MystOpcode stoneshipOpcodes[] = { + // "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(100, opcode_100), + SPECIFIC_OPCODE(101, opcode_101), + SPECIFIC_OPCODE(102, opcode_102), + SPECIFIC_OPCODE(103, opcode_103), + SPECIFIC_OPCODE(104, opcode_104), + SPECIFIC_OPCODE(111, opcode_111), + SPECIFIC_OPCODE(112, opcode_112), + SPECIFIC_OPCODE(116, opcode_116), + SPECIFIC_OPCODE(117, opcode_117), + SPECIFIC_OPCODE(118, opcode_118), + SPECIFIC_OPCODE(119, opcode_119), + SPECIFIC_OPCODE(120, opcode_120), + SPECIFIC_OPCODE(125, opcode_125), + + // "Init" Opcodes + SPECIFIC_OPCODE(200, opcode_200), + SPECIFIC_OPCODE(201, opcode_201), + SPECIFIC_OPCODE(202, opcode_202), + SPECIFIC_OPCODE(203, opcode_203), + SPECIFIC_OPCODE(204, opcode_204), + SPECIFIC_OPCODE(205, opcode_205), + SPECIFIC_OPCODE(206, opcode_206), + SPECIFIC_OPCODE(207, opcode_207), + SPECIFIC_OPCODE(208, opcode_208), + SPECIFIC_OPCODE(209, opcode_209), + SPECIFIC_OPCODE(210, opcode_210), + + // "Exit" Opcodes + SPECIFIC_OPCODE(300, opcode_300), + + OPCODE(0xFFFF, NOP) + }; + + _opcodes = stoneshipOpcodes; + _opcodeCount = ARRAYSIZE(stoneshipOpcodes); +} + +void MystScriptParser_Stoneship::disablePersistentScripts() { + opcode_200_disable(); + opcode_201_disable(); + opcode_209_disable(); +} + +void MystScriptParser_Stoneship::runPersistentScripts() { + opcode_200_run(); + opcode_201_run(); + opcode_209_run(); +} + +void MystScriptParser_Stoneship::opcode_100(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + // Used for Cards 2185 (Water Pump) + varUnusedCheck(op, var); + + if (argc == 0) { + debugC(kDebugScript, "Opcode %d: Unknown Function", op); + + // TODO: Called when Water Pump Button is pressed? Animation? + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_101(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 6) { + // Used by Door Buttons to Brothers' Rooms + // Cards 2294, 2255 + Common::Rect u0_rect = Common::Rect(argv[0], argv[1], argv[2], argv[3]); + uint16 u1 = argv[3]; + uint16 u2 = argv[2]; + + debugC(kDebugScript, "Opcode %d: Unknown", op); + debugC(kDebugScript, "u0_rect.left: %d", u0_rect.left); + debugC(kDebugScript, "u0_rect.top: %d", u0_rect.top); + debugC(kDebugScript, "u0_rect.right: %d", u0_rect.right); + debugC(kDebugScript, "u0_rect.bottom: %d", u0_rect.bottom); + debugC(kDebugScript, "u1: %d", u1); + debugC(kDebugScript, "u2: %d", u2); + + // TODO: Fill in logic... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 2) { + debugC(kDebugScript, "Opcode %d: Play Book Room Movie", op); + + uint16 startTime = argv[0]; + uint16 endTime = argv[1]; + + debugC(kDebugScript, "\tstartTime: %d", startTime); + debugC(kDebugScript, "\tendTime: %d", endTime); + + warning("TODO: Opcode %d Movie Time Index %d to %d", op, startTime, endTime); + // TODO: Need version of playMovie blocking which allows selection + // of start and finish points. + _vm->_video->playMovie(_vm->wrapMovieFilename("bkroom", kStoneshipStack), 159, 99); + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_103(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 1) { + // Used on Card 2197 (Sirrus' Room Drawers) + debugC(kDebugScript, "Opcode %d: Unknown", op); + + uint16 u0 = argv[0]; + + debugC(kDebugScript, "\tu0: %d", u0); + // TODO: Fill in Logic... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_104(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + // Used for Card 2004 (Achenar's Room Drawers) + // Used for Closeup of Torn Note? + if (argc == 1) { + debugC(kDebugScript, "Opcode %d: Unknown Function", op); + + uint16 u0 = argv[0]; + debugC(kDebugScript, "\tu0: %d", u0); + + // TODO: Fill in Function... + // Does u0 correspond to a resource Id? Enable? Disable? + // Similar to Opcode 111 (Stoneship Version).. But does this also + // draw closeup image of note / change to closeup card? + } else + unknown(op, var, argc, argv); +} + + +void MystScriptParser_Stoneship::opcode_111(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 1) { + // Used for Card 2004 (Achenar's Room Drawers) + // Used by Drawers Hotspots... + + debugC(kDebugScript, "Opcode %d: Unknown Function", op); + + uint16 u0 = argv[0]; + debugC(kDebugScript, "\tu0: %d", u0); + + // TODO: Fill in Function... + // Does u0 correspond to a resource Id? Enable? Disable? + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_112(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + // Used for Card 2013 (Achenar's Rose-Skull Hologram) + if (argc == 3) { + debugC(kDebugScript, "Opcode %d: Rose-Skull Hologram Playback", op); + + uint16 varValue = _vm->_varStore->getVar(var); + + debugC(kDebugScript, "\tVar: %d = %d", var, varValue); + + uint16 startPoint = argv[0]; + uint16 endPoint = argv[1]; + uint16 u0 = argv[2]; + + debugC(kDebugScript, "\tstartPoint: %d", startPoint); + debugC(kDebugScript, "\tendPoint: %d", endPoint); + debugC(kDebugScript, "\tu0: %d", u0); + + // TODO: Fill in Function... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_116(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 1) { + // Used on Card 2111 (Compass Rose) + // Called when Button Clicked. + uint16 correctButton = argv[0]; + + if (correctButton) { + // Correct Button -> Light On Logic + // TODO: Deal with if main power on? + _vm->_varStore->setVar(16, 1); + _vm->_varStore->setVar(30, 0); + } else { + // Wrong Button -> Power Failure Logic + // TODO: Fill in Alarm + _vm->_varStore->setVar(16, 0); + _vm->_varStore->setVar(30, 2); + _vm->_varStore->setVar(33, 0); + } + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_117(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 0) { + // Used on Card 2132 (Chest at Bottom of Lighthouse) + // Called when Valve Hotspot Clicked. + // TODO: Fill in Function to play right section of movie + // based on valve state and water in chest.. + _vm->_video->playMovie(_vm->wrapMovieFilename("ligspig", kStoneshipStack), 97, 267); + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_118(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + if (argc == 0) { + // Used on Card 2126 (Lighthouse Looking Along Plank) + // Called when Exit Resource is clicked + + // TODO: Implement Function... + // If holding Key to Lamp Room Trapdoor, drop to bottom of + // Lighthouse... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_119(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 0) { + // Used on Card 2143 (Lighthouse Trapdoor) + // Called when Lock Hotspot Clicked while holding key. + _vm->_video->playMovie(_vm->wrapMovieFilename("openloc", kStoneshipStack), 187, 72); + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_120(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + if (argc == 1) { + // Used for Cards 2285, 2289, 2247, 2251 (Side Doors in Tunnels Down To Brothers Rooms) + uint16 movieId = argv[0]; + + debugC(kDebugScript, "Opcode %d: Play Side Door Movies", op); + debugC(kDebugScript, "\tmovieId: %d", movieId); + + switch (movieId) { + case 0: + // Card 2251 + _vm->_video->playMovie(_vm->wrapMovieFilename("tunaup", kStoneshipStack), 149, 161); + break; + case 1: + // Card 2247 + _vm->_video->playMovie(_vm->wrapMovieFilename("tunadown", kStoneshipStack), 218, 150); + break; + case 2: + // Card 2289 + _vm->_video->playMovie(_vm->wrapMovieFilename("tuncup", kStoneshipStack), 259, 161); + break; + case 3: + // Card 2285 + _vm->_video->playMovie(_vm->wrapMovieFilename("tuncdown", kStoneshipStack), 166, 150); + break; + default: + warning("Opcode 120 MovieId Out Of Range"); + break; + } + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_125(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + if (argc == 1) { + // Used on Card 2197 (Sirrus' Room Drawers) + debugC(kDebugScript, "Opcode %d: Unknown uses Var %d", op, var); + + uint16 u0 = argv[0]; + + debugC(kDebugScript, "\tu0: %d", u0); + // TODO: Fill in Logic... + } else + unknown(op, var, argc, argv); +} + +static struct { + bool enabled; +} g_opcode200Parameters; + +void MystScriptParser_Stoneship::opcode_200_run() { + // Used for Card 2013 (Achenar's Rose-Skull Hologram) + + // TODO: Implement Function... +} + +void MystScriptParser_Stoneship::opcode_200_disable() { + g_opcode200Parameters.enabled = false; +} + +void MystScriptParser_Stoneship::opcode_200(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Card 2013 (Achenar's Rose-Skull Hologram) + if (argc == 0) + g_opcode200Parameters.enabled = true; + else + unknown(op, var, argc, argv); +} + +static struct { + bool enabled; +} g_opcode201Parameters; + +void MystScriptParser_Stoneship::opcode_201_run() { + // Used for Card 2013 (Achenar's Rose-Skull Hologram) + + // TODO: Fill in Function... +} + +void MystScriptParser_Stoneship::opcode_201_disable() { + g_opcode201Parameters.enabled = false; +} + +void MystScriptParser_Stoneship::opcode_201(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Card 2013 (Achenar's Rose-Skull Hologram) + if (argc == 0) + g_opcode201Parameters.enabled = true; + else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_202(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Card 2160 (Lighthouse Battery Pack Closeup) + // TODO: Implement Code... + // Not Sure of Purpose - Update of Light / Discharge? + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_203(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for all/most Cards in Tunnels Down To Brothers Rooms + + // TODO: Duplicate or similar function to Opcode 203? + if (argc == 2 || argc == 4) { + debugC(kDebugScript, "Opcode %d: %d Arguments", op, argc); + + uint16 imageIdDarkDoorOpen = 0; + uint16 imageIdDarkDoorClosed = 0; + uint16 u0 = argv[0]; + uint16 soundIdAlarm = argv[argc - 1]; + + if (argc == 4) { + imageIdDarkDoorOpen = argv[1]; + imageIdDarkDoorClosed = argv[2]; + } + + debugC(kDebugScript, "\tu0: %d", u0); + + if (argc == 4) { + debugC(kDebugScript, "\timageIdDarkDoorOpen: %d", imageIdDarkDoorOpen); + debugC(kDebugScript, "\tsoundIdDarkDoorClosed: %d", imageIdDarkDoorClosed); + } + + debugC(kDebugScript, "\tsoundIdAlarm: %d", soundIdAlarm); + + // TODO: Fill in Correct Function for Lights + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_204(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Card 2160 (Lighthouse Battery Pack Closeup) + if (argc == 0) { + // TODO: Implement Code For Battery Meter Level + // Overwrite _vm->_resources[1]->_subImages[0].rect.bottom 1 to 80 + // Add accessor functions for this... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_205(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used on Cards 2322, 2285 (Tunnels Down To Brothers Rooms) + + // TODO: Duplicate or similar function to Opcode 203? + if (argc == 2 || argc == 4) { + debugC(kDebugScript, "Opcode %d: %d Arguments", op, argc); + + uint16 imageIdDoorOpen = 0; + uint16 imageIdDoorClosed = 0; + + uint16 u0 = argv[0]; + if (argc == 4) { + imageIdDoorOpen = argv[1]; + imageIdDoorClosed = argv[2]; + } + + uint16 soundIdAlarm = argv[argc - 1]; + + debugC(kDebugScript, "\tu0: %d", u0); + + if (argc == 4) { + debugC(kDebugScript, "\timageIdDoorOpen: %d", imageIdDoorOpen); + debugC(kDebugScript, "\tsoundIdDoorClosed: %d", imageIdDoorClosed); + } + + debugC(kDebugScript, "\tsoundIdAlarm: %d", soundIdAlarm); + + // TODO: Fill in Correct Function for Lights + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_206(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Cards 2272 and 2234 (Facing Out of Door) + if (argc == 0) { + debugC(kDebugScript, "Opcode %d: Unknown, %d Arguments", op, argc); + // TODO: Function Unknown... + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_207(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Card 2138 (Lighthouse Key/Chest Animation Logic) + // TODO: Fill in function + warning("TODO: Opcode 207 Lighthouse Key/Chest Animation Logic"); +} + +void MystScriptParser_Stoneship::opcode_208(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used in Card 2218 (Telescope view) + if (argc == 3) { + debugC(kDebugScript, "Opcode %d: Telescope View", op); + uint16 imagePanorama = argv[0]; + uint16 imageLighthouseOff = argv[1]; + uint16 imageLighthouseOn = argv[2]; + + debugC(kDebugScript, "Image (Panorama): %d", imagePanorama); + debugC(kDebugScript, "Image (Lighthouse Off): %d", imageLighthouseOff); + debugC(kDebugScript, "Image (Lighthouse On): %d", imageLighthouseOn); + + // TODO: Fill in Logic. + } else + unknown(op, var, argc, argv); +} + +static struct { + uint16 u0[5]; + uint16 u1[5]; + uint16 stateVar; + + bool enabled; +} g_opcode209Parameters; + +void MystScriptParser_Stoneship::opcode_209_run(void) { + // Used for Card 2004 (Achenar's Room Drawers) + + // TODO: Implement Function... + // Swap Open Drawers? +} + +void MystScriptParser_Stoneship::opcode_209_disable(void) { + g_opcode209Parameters.enabled = false; +} + +void MystScriptParser_Stoneship::opcode_209(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used for Card 2004 (Achenar's Room Drawers) + if (argc == 11) { + g_opcode209Parameters.u0[0] = argv[0]; + g_opcode209Parameters.u0[1] = argv[1]; + g_opcode209Parameters.u0[2] = argv[2]; + g_opcode209Parameters.u0[3] = argv[3]; + g_opcode209Parameters.u0[4] = argv[4]; + + g_opcode209Parameters.u1[0] = argv[5]; + g_opcode209Parameters.u1[1] = argv[6]; + g_opcode209Parameters.u1[2] = argv[7]; + g_opcode209Parameters.u1[3] = argv[8]; + g_opcode209Parameters.u1[4] = argv[9]; + + g_opcode209Parameters.stateVar = argv[10]; + + g_opcode209Parameters.enabled = true; + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_210(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + varUnusedCheck(op, var); + + // Used in Cards 2205 and 2207 (Cloud Orbs in Sirrus' Room) + if (argc == 2) { + uint16 soundId = argv[0]; + uint16 soundIdStopping = argv[1]; + + // TODO: Work Out Function i.e. control Var etc. + if (false) { + _vm->_sound->playSound(soundId); + _vm->_sound->playSound(soundIdStopping); + } + } else + unknown(op, var, argc, argv); +} + +void MystScriptParser_Stoneship::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) { + // Used in Card 2218 (Telescope view) + varUnusedCheck(op, var); + // TODO: Fill in Logic. Clearing Variable for View? +} + +} // End of namespace Mohawk diff --git a/engines/mohawk/myst_stacks/stoneship.h b/engines/mohawk/myst_stacks/stoneship.h new file mode 100644 index 0000000000..c01ee01a86 --- /dev/null +++ b/engines/mohawk/myst_stacks/stoneship.h @@ -0,0 +1,91 @@ +/* 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_STONESHIP_H +#define MYST_SCRIPTS_STONESHIP_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_Stoneship : public MystScriptParser { +public: + MystScriptParser_Stoneship(MohawkEngine_Myst *vm); + ~MystScriptParser_Stoneship(); + + void disablePersistentScripts(); + void runPersistentScripts(); + +private: + void setupOpcodes(); + + void opcode_200_run(); + void opcode_200_disable(); + void opcode_201_run(); + void opcode_201_disable(); + void opcode_209_run(); + void opcode_209_disable(); + + DECLARE_OPCODE(opcode_100); + DECLARE_OPCODE(opcode_101); + DECLARE_OPCODE(opcode_102); + DECLARE_OPCODE(opcode_103); + DECLARE_OPCODE(opcode_104); + DECLARE_OPCODE(opcode_111); + DECLARE_OPCODE(opcode_112); + DECLARE_OPCODE(opcode_116); + DECLARE_OPCODE(opcode_117); + DECLARE_OPCODE(opcode_118); + DECLARE_OPCODE(opcode_119); + DECLARE_OPCODE(opcode_120); + DECLARE_OPCODE(opcode_125); + + DECLARE_OPCODE(opcode_200); + DECLARE_OPCODE(opcode_201); + DECLARE_OPCODE(opcode_202); + DECLARE_OPCODE(opcode_203); + DECLARE_OPCODE(opcode_204); + DECLARE_OPCODE(opcode_205); + DECLARE_OPCODE(opcode_206); + DECLARE_OPCODE(opcode_207); + DECLARE_OPCODE(opcode_208); + DECLARE_OPCODE(opcode_209); + DECLARE_OPCODE(opcode_210); + + DECLARE_OPCODE(opcode_300); +}; + +} + +#undef DECLARE_OPCODE + +#endif -- cgit v1.2.3