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

bgk at users.sourceforge.net bgk at users.sourceforge.net
Sat Jan 29 11:49:15 CET 2011


Revision: 55612
          http://scummvm.svn.sourceforge.net/scummvm/?rev=55612&view=rev
Author:   bgk
Date:     2011-01-29 10:49:15 +0000 (Sat, 29 Jan 2011)

Log Message:
-----------
MOHAWK: Implement more Stoneship puzzles, up to linking back to Myst

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

Modified: scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp	2011-01-29 10:42:56 UTC (rev 55611)
+++ scummvm/trunk/engines/mohawk/myst_stacks/stoneship.cpp	2011-01-29 10:49:15 UTC (rev 55612)
@@ -23,6 +23,7 @@
  *
  */
 
+#include "mohawk/cursors.h"
 #include "mohawk/myst.h"
 #include "mohawk/graphics.h"
 #include "mohawk/myst_areas.h"
@@ -41,6 +42,7 @@
 
 	_state.generatorDepletionTime = 0;
 	_state.generatorDuration = 0;
+	_cabinMystBookPresent = 0;
 }
 
 MystScriptParser_Stoneship::~MystScriptParser_Stoneship() {
@@ -51,8 +53,8 @@
 void MystScriptParser_Stoneship::setupOpcodes() {
 	// "Stack-Specific" Opcodes
 	OPCODE(100, o_pumpTurnOff);
-	OPCODE(101, opcode_101);
-	OPCODE(102, opcode_102);
+	OPCODE(101, o_brotherDoorOpen);
+	OPCODE(102, o_cabinBookMovie);
 	OPCODE(103, opcode_103);
 	OPCODE(104, opcode_104);
 	OPCODE(108, o_generatorStart);
@@ -60,11 +62,11 @@
 	OPCODE(110, o_generatorStop);
 	OPCODE(111, opcode_111);
 	OPCODE(112, opcode_112);
-	OPCODE(116, opcode_116);
+	OPCODE(116, o_compassButton);
 	OPCODE(117, o_chestValveVideos);
 	OPCODE(118, o_chestDropKey);
 	OPCODE(119, o_trapLockOpen);
-	OPCODE(120, opcode_120);
+	OPCODE(120, o_sideDoorsMovies);
 	OPCODE(125, opcode_125);
 
 	// "Init" Opcodes
@@ -157,11 +159,26 @@
 		}
 	case 14: // State Of Tunnels lights To Brothers' Rooms - Far
 		return _state.generatorPowerAvailable;
+	case 15: // Side Door in Tunnels To Brother's Rooms Open
+		if (_state.generatorPowerAvailable == 1)
+			return _state.sideDoorOpened;
+		else
+			return 0;
 	case 16: // Ship Chamber Light State
 		return _state.lightState;
-//case 20: // Ship Chamber Table/Book State
-//	return 0;
-//	return 1;
+	case 18: // Brother Room Door Open
+		return _brotherDoorOpen;
+	case 19: // Brother Room Door State
+		if (_brotherDoorOpen) {
+			if (_state.lightState)
+				return 2; // Open, Light On
+			else
+				return 1; // Open, Light Off
+		} else {
+			return 0; // Closed
+		}
+	case 20: // Ship Chamber Table/Book State
+		return _cabinMystBookPresent;
 	case 28: // Telescope Angle Position
 		return 0;
 	case 30: // Light State in Tunnel to Compass Rose Room
@@ -173,14 +190,24 @@
 		} else {
 			return 2;
 		}
-	case 31:
+	case 31: // Lighthouse Lamp Room Battery Pack Indicator Light
 		return batteryRemainingCharge() >= 10;
 	case 32: // Lighthouse Lamp Room Battery Pack Meter Level
 		return 0;
-//case 36: // Ship Chamber Door State
-//	return 0; // Closed
-//	return 1; // Open, Light Off
-//	return 2; // Open, Light On
+	case 33: // State of Side Door in Tunnels to Compass Rose Room
+		if (_state.sideDoorOpened)
+			return 2;
+		else
+			return _state.generatorPowerAvailable == 1;
+	case 36: // Ship Chamber Door State
+		if (_tempVar) {
+			if (_state.lightState)
+				return 2; // Open, Light On
+			else
+				return 1; // Open, Light Off
+		} else {
+			return 0; // Closed
+		}
 	default:
 		return MystScriptParser::getVar(var);
 	}
@@ -224,6 +251,9 @@
 		if (_state.chestOpenState)
 			_state.trapdoorKeyState = _state.trapdoorKeyState != 1;
 		break;
+	case 20: // Ship Chamber Table/Book State
+		_cabinMystBookPresent = (_cabinMystBookPresent + 1) % 2;
+		break;
 	default:
 		MystScriptParser::toggleVar(var);
 		break;
@@ -244,6 +274,20 @@
 	case 8: // Lighthouse Chest Key Position
 		_state.trapdoorKeyState = value;
 		break;
+	case 15: // Side Door in Tunnels To Brother's Rooms Open
+		if (_state.sideDoorOpened != value) {
+			if (!value && _state.generatorPowerAvailable == 2)
+				_state.generatorPowerAvailable = 0;
+			_state.sideDoorOpened = value;
+			refresh = true;
+		}
+		break;
+	case 18: // Brother Room Door Open
+		if (_brotherDoorOpen != value) {
+			_brotherDoorOpen = value;
+			refresh = true;
+		}
+		break;
 	default:
 		refresh = MystScriptParser::setVarValue(var, value);
 		break;
@@ -282,47 +326,23 @@
 	}
 }
 
-void MystScriptParser_Stoneship::opcode_101(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Stoneship::o_brotherDoorOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Open brother door", op);
 
-	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);
+	_brotherDoorOpen = 1;
+	_vm->redrawArea(19, 0);
+	animatedUpdate(argc, argv, 5);
 }
 
-void MystScriptParser_Stoneship::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Stoneship::o_cabinBookMovie(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Play Book Room Movie", op);
 
-	if (argc == 2) {
-		debugC(kDebugScript, "Opcode %d: Play Book Room Movie", op);
+	uint16 startTime = argv[0];
+	uint16 endTime = argv[1];
 
-		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->playMovieBlocking(_vm->wrapMovieFilename("bkroom", kStoneshipStack), 159, 99);
-	} else
-		unknown(op, var, argc, argv);
+	VideoHandle book = _vm->_video->playMovie(_vm->wrapMovieFilename("bkroom", kStoneshipStack), 159, 99);
+	_vm->_video->setVideoBounds(book, Video::VideoTimestamp(startTime, 600), Video::VideoTimestamp(endTime, 600));
+	_vm->_video->waitUntilMovieEnds(book);
 }
 
 void MystScriptParser_Stoneship::opcode_103(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -465,28 +485,26 @@
 		unknown(op, var, argc, argv);
 }
 
-void MystScriptParser_Stoneship::opcode_116(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Stoneship::o_compassButton(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Compass rose button pressed", op);
+	// Used on Card 2111 (Compass Rose)
+	// Called when Button Clicked.
+	uint16 correctButton = argv[0];
 
-	if (argc == 1) {
-		// Used on Card 2111 (Compass Rose)
-		// Called when Button Clicked.
-		uint16 correctButton = argv[0];
+	if (correctButton) {
+		// Correct Button -> Light On Logic
+		_state.lightState = 1;
+	} else {
+		// Wrong Button -> Power Failure Logic
+		_state.generatorPowerAvailable = 2;
+		_state.lightState = 0;
+		_state.generatorDepletionTime = 0;
+		_state.generatorDepletionTime = 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);
+		_batteryDepleting = false;
+	}
+
+	o_redrawCard(op, var, argc, argv);
 }
 
 void MystScriptParser_Stoneship::o_chestValveVideos(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -555,39 +573,40 @@
 		_vm->_sound->playSound(4143);
 }
 
-void MystScriptParser_Stoneship::opcode_120(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Stoneship::o_sideDoorsMovies(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	// Used for Cards 2285, 2289, 2247, 2251 (Side Doors in Tunnels Down To Brothers Rooms)
+	uint16 movieId = argv[0];
 
-	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);
 
-		debugC(kDebugScript, "Opcode %d: Play Side Door Movies", op);
-		debugC(kDebugScript, "\tmovieId: %d", movieId);
+	_vm->_cursor->hideCursor();
+	_vm->_sound->pauseBackgroundMyst();
 
-		switch (movieId) {
-		case 0:
-			// Card 2251
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tunaup", kStoneshipStack), 149, 161);
-			break;
-		case 1:
-			// Card 2247
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tunadown", kStoneshipStack), 218, 150);
-			break;
-		case 2:
-			// Card 2289
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tuncup", kStoneshipStack), 259, 161);
-			break;
-		case 3:
-			// Card 2285
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tuncdown", kStoneshipStack), 166, 150);
-			break;
-		default:
-			warning("Opcode 120 MovieId Out Of Range");
-			break;
-		}
-	} else
-		unknown(op, var, argc, argv);
+	switch (movieId) {
+	case 0:
+		// Card 2251
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tunaup", kStoneshipStack), 149, 161);
+		break;
+	case 1:
+		// Card 2247
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tunadown", kStoneshipStack), 218, 150);
+		break;
+	case 2:
+		// Card 2289
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tuncup", kStoneshipStack), 259, 161);
+		break;
+	case 3:
+		// Card 2285
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("tuncdown", kStoneshipStack), 166, 150);
+		break;
+	default:
+		warning("Opcode 120 MovieId Out Of Range");
+		break;
+	}
+
+	_vm->_sound->resumeBackgroundMyst();
+	_vm->_cursor->showCursor();
 }
 
 void MystScriptParser_Stoneship::opcode_125(uint16 op, uint16 var, uint16 argc, uint16 *argv) {

Modified: scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h	2011-01-29 10:42:56 UTC (rev 55611)
+++ scummvm/trunk/engines/mohawk/myst_stacks/stoneship.h	2011-01-29 10:49:15 UTC (rev 55612)
@@ -59,19 +59,19 @@
 	void opcode_209_disable();
 
 	DECLARE_OPCODE(o_pumpTurnOff);
-	DECLARE_OPCODE(opcode_101);
-	DECLARE_OPCODE(opcode_102);
+	DECLARE_OPCODE(o_brotherDoorOpen);
+	DECLARE_OPCODE(o_cabinBookMovie);
 	DECLARE_OPCODE(opcode_103);
 	DECLARE_OPCODE(opcode_104);
 	DECLARE_OPCODE(o_generatorStart);
 	DECLARE_OPCODE(o_generatorStop);
 	DECLARE_OPCODE(opcode_111);
 	DECLARE_OPCODE(opcode_112);
-	DECLARE_OPCODE(opcode_116);
+	DECLARE_OPCODE(o_compassButton);
 	DECLARE_OPCODE(o_chestValveVideos);
 	DECLARE_OPCODE(o_chestDropKey);
 	DECLARE_OPCODE(o_trapLockOpen);
-	DECLARE_OPCODE(opcode_120);
+	DECLARE_OPCODE(o_sideDoorsMovies);
 	DECLARE_OPCODE(opcode_125);
 
 	DECLARE_OPCODE(opcode_200);
@@ -96,6 +96,10 @@
 	bool _batteryDepleting;
 	uint32 _batteryNextTime;
 
+	uint16 _cabinMystBookPresent; // 64
+
+	uint16 _brotherDoorOpen; // 76
+
 	uint16 batteryRemainingCharge();
 };
 


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