[Scummvm-cvs-logs] SF.net SVN: scummvm:[54689] scummvm/trunk/engines/mohawk

mthreepwood at users.sourceforge.net mthreepwood at users.sourceforge.net
Tue Nov 30 23:02:03 CET 2010


Revision: 54689
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54689&view=rev
Author:   mthreepwood
Date:     2010-11-30 22:02:03 +0000 (Tue, 30 Nov 2010)

Log Message:
-----------
MOHAWK: Split out stoneship opcodes into their own class

Modified Paths:
--------------
    scummvm/trunk/engines/mohawk/module.mk
    scummvm/trunk/engines/mohawk/myst.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/myst.h

Added Paths:
-----------
    scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp
    scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h

Modified: scummvm/trunk/engines/mohawk/module.mk
===================================================================
--- scummvm/trunk/engines/mohawk/module.mk	2010-11-30 21:06:40 UTC (rev 54688)
+++ scummvm/trunk/engines/mohawk/module.mk	2010-11-30 22:02:03 UTC (rev 54689)
@@ -25,9 +25,9 @@
 	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)
 PLUGIN := 1

Modified: scummvm/trunk/engines/mohawk/myst.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst.cpp	2010-11-30 21:06:40 UTC (rev 54688)
+++ scummvm/trunk/engines/mohawk/myst.cpp	2010-11-30 22:02:03 UTC (rev 54689)
@@ -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 @@
 	case kSeleniticStack:
 		_scriptParser = new MystScriptParser_Selenitic(this);
 		break;
+	case kStoneshipStack:
+		_scriptParser = new MystScriptParser_Stoneship(this);
+		break;
 	default:
 		_scriptParser = new MystScriptParser_Myst(this);
 		break;

Modified: scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp	2010-11-30 21:06:40 UTC (rev 54688)
+++ scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp	2010-11-30 22:02:03 UTC (rev 54689)
@@ -115,8 +115,6 @@
 		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 @@
 		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 @@
 			// 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_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_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_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_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_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 @@
 	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_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_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 @@
 	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 @@
 	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_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 @@
 		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 @@
 
 		_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 @@
 
 	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 @@
 		_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(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(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 @@
 	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(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 @@
 	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_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 @@
 
 	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 @@
 	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 @@
 	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 @@
 		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);

Modified: scummvm/trunk/engines/mohawk/myst_stacks/myst.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/myst.h	2010-11-30 21:06:40 UTC (rev 54688)
+++ scummvm/trunk/engines/mohawk/myst_stacks/myst.h	2010-11-30 22:02:03 UTC (rev 54689)
@@ -78,8 +78,6 @@
 	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 @@
 	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);

Added: scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp	                        (rev 0)
+++ scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp	2010-11-30 22:02:03 UTC (rev 54689)
@@ -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


Property changes on: scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native

Added: scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h	                        (rev 0)
+++ scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h	2010-11-30 22:02:03 UTC (rev 54689)
@@ -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


Property changes on: scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list