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

bgk at users.sourceforge.net bgk at users.sourceforge.net
Sat Dec 11 18:00:22 CET 2010


Revision: 54866
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54866&view=rev
Author:   bgk
Date:     2010-12-11 17:00:22 +0000 (Sat, 11 Dec 2010)

Log Message:
-----------
MOHAWK: Implement Myst opcodes 113, 114, 198 : Vault open / close
In progress tower rotation

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

Modified: scummvm/trunk/engines/mohawk/myst.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst.cpp	2010-12-11 16:55:25 UTC (rev 54865)
+++ scummvm/trunk/engines/mohawk/myst.cpp	2010-12-11 17:00:22 UTC (rev 54866)
@@ -988,14 +988,14 @@
 			_resources[i]->drawDataToScreen();
 }
 
-void MohawkEngine_Myst::redrawResource(MystResourceType8 *_resource) {
-	_resource->drawConditionalDataToScreen(_scriptParser->getVar(_resource->getType8Var()));
+void MohawkEngine_Myst::redrawResource(MystResourceType8 *_resource, bool update) {
+	_resource->drawConditionalDataToScreen(_scriptParser->getVar(_resource->getType8Var()), update);
 }
 
-void MohawkEngine_Myst::redrawArea(uint16 var) {
+void MohawkEngine_Myst::redrawArea(uint16 var, bool update) {
 	for (uint16 i = 0; i < _resources.size(); i++)
 		if (_resources[i]->type == kMystConditionalImage && _resources[i]->getType8Var() == var)
-			redrawResource(static_cast<MystResourceType8 *>(_resources[i]));
+			redrawResource(static_cast<MystResourceType8 *>(_resources[i]), update);
 }
 
 MystResource *MohawkEngine_Myst::loadResource(Common::SeekableReadStream *rlstStream, MystResource *parent) {

Modified: scummvm/trunk/engines/mohawk/myst.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst.h	2010-12-11 16:55:25 UTC (rev 54865)
+++ scummvm/trunk/engines/mohawk/myst.h	2010-12-11 17:00:22 UTC (rev 54866)
@@ -180,8 +180,8 @@
 	bool _showResourceRects;
 	MystResource *loadResource(Common::SeekableReadStream *rlstStream, MystResource *parent);
 	void setResourceEnabled(uint16 resourceId, bool enable);
-	void redrawArea(uint16 var);
-	void redrawResource(MystResourceType8 *_resource);
+	void redrawArea(uint16 var, bool update = true);
+	void redrawResource(MystResourceType8 *_resource, bool update = true);
 	void drawResourceImages();
 	void drawCardBackground();
 	uint16 getCardBackgroundId();

Modified: scummvm/trunk/engines/mohawk/myst_areas.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_areas.cpp	2010-12-11 16:55:25 UTC (rev 54865)
+++ scummvm/trunk/engines/mohawk/myst_areas.cpp	2010-12-11 17:00:22 UTC (rev 54866)
@@ -410,7 +410,7 @@
 	}
 }
 
-void MystResourceType8::drawConditionalDataToScreen(uint16 state) {
+void MystResourceType8::drawConditionalDataToScreen(uint16 state, bool update) {
 	// Need to call overidden Type 7 function to ensure
 	// switch section is processed correctly.
 	MystResourceType7::drawDataToScreen();
@@ -453,7 +453,10 @@
 			imageToDraw = _subImages[subImageId].wdib;
 
 		_vm->_gfx->copyImageSectionToScreen(imageToDraw, _subImages[subImageId].rect, _rect);
-		_vm->_gfx->updateScreen();
+
+		// Draw to screen
+		if (update)
+			_vm->_gfx->updateScreen();
 	}
 }
 

Modified: scummvm/trunk/engines/mohawk/myst_areas.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_areas.h	2010-12-11 16:55:25 UTC (rev 54865)
+++ scummvm/trunk/engines/mohawk/myst_areas.h	2010-12-11 17:00:22 UTC (rev 54866)
@@ -146,7 +146,7 @@
 	MystResourceType8(MohawkEngine_Myst *vm, Common::SeekableReadStream *rlstStream, MystResource *parent);
 	virtual ~MystResourceType8();
 	virtual void drawDataToScreen();
-	void drawConditionalDataToScreen(uint16 state);
+	void drawConditionalDataToScreen(uint16 state, bool update = true);
 	uint16 getType8Var();
 
 	struct SubImage {

Modified: scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp	2010-12-11 16:55:25 UTC (rev 54865)
+++ scummvm/trunk/engines/mohawk/myst_stacks/myst.cpp	2010-12-11 17:00:22 UTC (rev 54866)
@@ -45,6 +45,7 @@
 	// when linking back to Myst in the library
 	_savedCardId = 4329;
 	_libraryBookcaseChanged = false;
+	_dockVaultState = 0;
 }
 
 MystScriptParser_Myst::~MystScriptParser_Myst() {
@@ -60,9 +61,12 @@
 	OPCODE(103, o_fireplaceToggleButton);
 	OPCODE(104, o_fireplaceRotation);
 	OPCODE(105, opcode_105);
+	OPCODE(106, o_towerRotationStart);
+	OPCODE(107, NOP);
+	OPCODE(108, o_towerRotationEnd);
 	OPCODE(109, opcode_109);
-	OPCODE(113, opcode_113);
-	OPCODE(114, opcode_114);
+	OPCODE(113, o_dockVaultOpen);
+	OPCODE(114, o_dockVaultClose);
 	OPCODE(115, o_bookGivePage);
 	OPCODE(116, o_clockWheelsExecute);
 	OPCODE(117, opcode_117);
@@ -122,13 +126,13 @@
 	OPCODE(195, opcode_195);
 	OPCODE(196, opcode_196);
 	OPCODE(197, opcode_197);
-	OPCODE(198, opcode_198);
+	OPCODE(198, o_dockVaultForceClose);
 	OPCODE(199, opcode_199);
 
 	// "Init" Opcodes
 	OPCODE(200, o_libraryBook_init);
 	OPCODE(201, opcode_201);
-	OPCODE(202, opcode_202);
+	OPCODE(202, o_towerRotationMap_init);
 	OPCODE(203, o_forechamberDoor_init);
 	OPCODE(204, opcode_204);
 	OPCODE(205, opcode_205);
@@ -167,20 +171,23 @@
 
 void MystScriptParser_Myst::disablePersistentScripts() {
 	opcode_201_disable();
-	opcode_202_disable();
 	opcode_205_disable();
 
 	_libraryBookcaseMoving = false;
 	_generatorControlRoomRunning = false;
 	_libraryCombinationBookPagesTurning = false;
 	_clockTurningWheel = 0;
+	_towerRotationMapRunning = false;
 
 	opcode_212_disable();
 }
 
 void MystScriptParser_Myst::runPersistentScripts() {
 	opcode_201_run();
-	opcode_202_run();
+
+	if (_towerRotationMapRunning)
+		towerRotationMap_run();
+
 	opcode_205_run();
 
 	if (_generatorControlRoomRunning)
@@ -213,6 +220,22 @@
 		} else {
 			return 3;
 		}
+	case 2: // Marker Switch Near Cabin
+		return myst.cabinMarkerSwitch;
+	case 3: // Marker Switch Near Clock Tower
+		return myst.clockTowerMarkerSwitch;
+	case 4: // Marker Switch on Dock
+		return myst.dockMarkerSwitch;
+	case 5: // Marker Switch Near Ship Pool
+		return myst.poolMarkerSwitch;
+	case 6: // Marker Switch Near Cogs
+		return myst.gearsMarkerSwitch;
+	case 7: // Marker Switch Near Generator Room
+		return myst.generatorMarkerSwitch;
+	case 8: // Marker Switch Near Stellar Observatory
+		return myst.observatoryMarkerSwitch;
+	case 9: // Marker Switch Near Rocket Ship
+		return myst.rocketshipMarkerSwitch;
 	case 12: // Clock tower gears bridge
 		return myst.clockTowerBridgeOpen;
 	case 23: // Fireplace Pattern Correct
@@ -236,6 +259,8 @@
 		}
 	case 37: // Clock Tower Control Wheels Position
 		return 3 * ((myst.clockTowerMinutePosition / 5) % 3) + myst.clockTowerHourPosition % 3;
+	case 41: // Dock Marker Switch Vault State
+		return _dockVaultState;
 	case 43: // Clock Tower Time
 		return myst.clockTowerHourPosition * 12 + myst.clockTowerMinutePosition / 5;
 	case 44: // Rocket ship power state
@@ -314,6 +339,8 @@
 		return 1;
 	case 302: // Green Book Opened Before Flag
 		return myst.greenBookOpenedBefore;
+	case 304: // Tower Rotation Map Initialized
+		return _towerRotationMapInitialized;
 	default:
 		return MystScriptParser::getVar(var);
 	}
@@ -321,9 +348,33 @@
 
 void MystScriptParser_Myst::toggleVar(uint16 var) {
 	MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
-	// MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
+	MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
 
 	switch(var) {
+	case 2: // Marker Switch Near Cabin
+		myst.cabinMarkerSwitch = (myst.cabinMarkerSwitch + 1) % 2;
+		break;
+	case 3: // Marker Switch Near Clock Tower
+		myst.clockTowerMarkerSwitch = (myst.clockTowerMarkerSwitch + 1) % 2;
+		break;
+	case 4: // Marker Switch on Dock
+		myst.dockMarkerSwitch = (myst.dockMarkerSwitch + 1) % 2;
+		break;
+	case 5: // Marker Switch Near Ship Pool
+		myst.poolMarkerSwitch = (myst.poolMarkerSwitch + 1) % 2;
+		break;
+	case 6: // Marker Switch Near Cogs
+		myst.gearsMarkerSwitch = (myst.gearsMarkerSwitch + 1) % 2;
+		break;
+	case 7: // Marker Switch Near Generator Room
+		myst.generatorMarkerSwitch = (myst.generatorMarkerSwitch + 1) % 2;
+		break;
+	case 8: // Marker Switch Near Stellar Observatory
+		myst.observatoryMarkerSwitch = (myst.observatoryMarkerSwitch + 1) % 2;
+		break;
+	case 9: // Marker Switch Near Rocket Ship
+		myst.rocketshipMarkerSwitch = (myst.rocketshipMarkerSwitch + 1) % 2;
+		break;
 	case 24: // Fireplace Blue Page
 		if (globals.ending != 4 && !(globals.bluePagesInBook & 32)) {
 			if (globals.heldPage == 6)
@@ -342,6 +393,17 @@
 			}
 		}
 		break;
+	case 41: // Vault white page
+		if (globals.ending != 4) {
+			if (_dockVaultState == 1) {
+				_dockVaultState = 2;
+				globals.heldPage = 0;
+			} else if (_dockVaultState == 2) {
+				_dockVaultState = 1;
+				globals.heldPage = 13;
+			}
+		}
+		break;
 	case 102: // Red page
 		if (globals.ending != 4 && !(globals.redPagesInBook & 1)) {
 			if (globals.heldPage == 7)
@@ -384,6 +446,9 @@
 	case 303: // Library Bookcase status changed
 		_libraryBookcaseChanged = value;
 		break;
+	case 304: // Myst Library Image Present on Tower Rotation Map
+		_towerRotationMapInitialized = value;
+		break;
 	default:
 		refresh = MystScriptParser::setVarValue(var, value);
 		break;
@@ -540,6 +605,14 @@
 		unknown(op, var, argc, argv);
 }
 
+void MystScriptParser_Myst::o_towerRotationStart(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	_towerRotationMapClicked = true;
+}
+
+void MystScriptParser_Myst::o_towerRotationEnd(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	_towerRotationMapClicked = false;
+}
+
 void MystScriptParser_Myst::opcode_109(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
 	if (argc == 1) {
 		int16 signedValue = argv[0];
@@ -553,95 +626,63 @@
 		unknown(op, var, argc, argv);
 }
 
-void MystScriptParser_Myst::opcode_113(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
-
+void MystScriptParser_Myst::o_dockVaultOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
 	// Used on Myst 4143 (Dock near Marker Switch)
-	if (argc == 9) {
-		uint16 soundId = argv[0];
+	MystVariables::Globals &globals = _vm->_saveLoad->_v->globals;
+	MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
+	uint16 soundId = argv[0];
+	uint16 delay = argv[1];
+	uint16 directionalUpdateDataSize = argv[2];
 
-		uint16 u0 = argv[1];
-		uint16 u1 = argv[2];
+	debugC(kDebugScript, "Opcode %d: Vault Open Logic", op);
+	debugC(kDebugScript, "\tsoundId: %d", soundId);
+	debugC(kDebugScript, "\tdirectionalUpdateDataSize: %d", directionalUpdateDataSize);
 
-		Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]);
+	if ((myst.cabinMarkerSwitch == 1) &&
+		(myst.clockTowerMarkerSwitch == 1) &&
+		(myst.dockMarkerSwitch == 0) &&
+		(myst.gearsMarkerSwitch == 1) &&
+		(myst.generatorMarkerSwitch == 1) &&
+		(myst.observatoryMarkerSwitch == 1) &&
+		(myst.poolMarkerSwitch == 1) &&
+		(myst.rocketshipMarkerSwitch == 1)) {
+		if (globals.heldPage != 13 && globals.ending != 4)
+			_dockVaultState = 2;
+		else
+			_dockVaultState = 1;
 
-		uint16 updateDirection = argv[7];
-		uint16 u2 = argv[8];
-
-		debugC(kDebugScript, "Opcode %d: Vault Open Logic", op);
-		debugC(kDebugScript, "\tsoundId: %d", soundId);
-		debugC(kDebugScript, "\tu0: %d", u0);
-		debugC(kDebugScript, "\tu1: %d", u1);
-
-		debugC(kDebugScript, "\trect.left: %d", rect.left);
-		debugC(kDebugScript, "\trect.top: %d", rect.top);
-		debugC(kDebugScript, "\trect.right: %d", rect.right);
-		debugC(kDebugScript, "\trect.bottom: %d", rect.bottom);
-		debugC(kDebugScript, "\trect updateDirection: %d", updateDirection);
-		debugC(kDebugScript, "\tu2: %d", u2);
-
-		if ((_vm->_varStore->getVar(2) == 1) &&
-			(_vm->_varStore->getVar(3) == 1) &&
-			(_vm->_varStore->getVar(4) == 0) &&
-			(_vm->_varStore->getVar(5) == 1) &&
-			(_vm->_varStore->getVar(6) == 1) &&
-			(_vm->_varStore->getVar(7) == 1) &&
-			(_vm->_varStore->getVar(8) == 1) &&
-			(_vm->_varStore->getVar(9) == 1)) {
-			// TODO: Implement correct function...
-			// Blit Image in Left to Right Vertical stripes i.e. transistion
-			// like door opening
-			_vm->_sound->playSound(soundId);
-			// TODO: Set 41 to 1 if page already present in hand.
-			_vm->_varStore->setVar(41, 2);
-		}
-	} else
-		unknown(op, var, argc, argv);
+		_vm->_sound->playSound(soundId);
+		_vm->redrawArea(41, false);
+		animatedUpdate(directionalUpdateDataSize, &argv[3], delay);
+	}
 }
 
-void MystScriptParser_Myst::opcode_114(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
-
+void MystScriptParser_Myst::o_dockVaultClose(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
 	// Used on Myst 4143 (Dock near Marker Switch)
-	if (argc == 9) {
-		uint16 soundId = argv[0];
+	MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
+	uint16 soundId = argv[0];
+	uint16 delay = argv[1];
+	uint16 directionalUpdateDataSize = argv[2];
 
-		uint16 u0 = argv[1];
-		uint16 u1 = argv[2];
+	debugC(kDebugScript, "Opcode %d: Vault Close Logic", op);
+	debugC(kDebugScript, "\tsoundId: %d", soundId);
+	debugC(kDebugScript, "\tdirectionalUpdateDataSize: %d", directionalUpdateDataSize);
 
-		Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]);
+	if ((myst.cabinMarkerSwitch == 1) &&
+		(myst.clockTowerMarkerSwitch == 1) &&
+		(myst.dockMarkerSwitch == 1) &&
+		(myst.gearsMarkerSwitch == 1) &&
+		(myst.generatorMarkerSwitch == 1) &&
+		(myst.observatoryMarkerSwitch == 1) &&
+		(myst.poolMarkerSwitch == 1) &&
+		(myst.rocketshipMarkerSwitch == 1)) {
+		if (_dockVaultState == 1 || _dockVaultState == 2)
+			_dockVaultState = 0;
 
-		uint16 updateDirection = argv[7];
-		uint16 u2 = argv[8];
-
-		debugC(kDebugScript, "Opcode %d: Vault Close Logic", op);
-		debugC(kDebugScript, "\tsoundId: %d", soundId);
-		debugC(kDebugScript, "\tu0: %d", u0);
-		debugC(kDebugScript, "\tu1: %d", u1);
-
-		debugC(kDebugScript, "\trect.left: %d", rect.left);
-		debugC(kDebugScript, "\trect.top: %d", rect.top);
-		debugC(kDebugScript, "\trect.right: %d", rect.right);
-		debugC(kDebugScript, "\trect.bottom: %d", rect.bottom);
-		debugC(kDebugScript, "\tupdateDirection: %d", updateDirection);
-		debugC(kDebugScript, "\tu2: %d", u2);
-
-		if ((_vm->_varStore->getVar(2) == 1) &&
-			(_vm->_varStore->getVar(3) == 1) &&
-			(_vm->_varStore->getVar(4) == 1) &&
-			(_vm->_varStore->getVar(5) == 1) &&
-			(_vm->_varStore->getVar(6) == 1) &&
-			(_vm->_varStore->getVar(7) == 1) &&
-			(_vm->_varStore->getVar(8) == 1) &&
-			(_vm->_varStore->getVar(9) == 1)) {
-			// TODO: Implement correct function...
-			// Blit Image in Right to Left Vertical stripes i.e. transistion
-			// like door closing
-			_vm->_sound->playSound(soundId);
-			_vm->_varStore->setVar(41, 0);
-		}
-	} else
-		unknown(op, var, argc, argv);
+		_vm->_sound->playSound(soundId);
+		_vm->redrawArea(41, false);
+		animatedUpdate(directionalUpdateDataSize, &argv[3], delay);
+	}
 }
 
 void MystScriptParser_Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -1559,40 +1600,29 @@
 	// TODO: Year decrease
 }
 
-// TODO: Merge with Opcode 42?
-void MystScriptParser_Myst::opcode_198(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Myst::o_dockVaultForceClose(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	// Used on Myst 4143 (Dock near Marker Switch)
+	MystVariables::Myst &myst = _vm->_saveLoad->_v->myst;
+	uint16 soundId = argv[0];
+	uint16 delay = argv[1];
+	uint16 directionalUpdateDataSize = argv[2];
 
-	// Used on Card 4143 (Dock near Marker Switch, facing Cogs)
-	if (argc == 9) {
-		uint16 soundId = argv[0];
-		uint16 u0 = argv[1];
-		uint16 u1 = argv[2];
-		Common::Rect rect = Common::Rect(argv[3], argv[4], argv[5], argv[6]);
-		uint16 updateDirection = argv[7];
-		uint16 u2 = argv[8];
+	debugC(kDebugScript, "Opcode %d: Vault Force Close", op);
+	debugC(kDebugScript, "\tsoundId: %d", soundId);
+	debugC(kDebugScript, "\tdirectionalUpdateDataSize: %d", directionalUpdateDataSize);
 
-		debugC(kDebugScript, "Opcode %d: Close Dock Marker Switch Vault", op);
-		debugC(kDebugScript, "\tsoundId: %d", soundId);
-		debugC(kDebugScript, "\tu0: %d", u0);
-		debugC(kDebugScript, "\tu1: %d", u1);
+	if (_dockVaultState) {
+		// Open switch
+		myst.dockMarkerSwitch = 1;
+		_vm->_sound->playSound(4143);
+		_vm->redrawArea(4);
 
-		debugC(kDebugScript, "\trect.left: %d", rect.left);
-		debugC(kDebugScript, "\trect.top: %d", rect.top);
-		debugC(kDebugScript, "\trect.right: %d", rect.right);
-		debugC(kDebugScript, "\trect.bottom: %d", rect.bottom);
-		debugC(kDebugScript, "\tupdateDirection: %d", updateDirection);
-		debugC(kDebugScript, "\tu2: %d", u2);
-
-		if (_vm->_varStore->getVar(41) != 0) {
-			Audio::SoundHandle *handle = _vm->_sound->playSound(soundId);
-
-			while (_vm->_mixer->isSoundHandleActive(*handle))
-				_vm->_system->delayMillis(10);
-			// TODO: Do Image Blit
-		}
-	} else
-		unknown(op, var, argc, argv);
+		// Close vault
+		_dockVaultState = 0;
+		_vm->_sound->playSound(soundId);
+		_vm->redrawArea(41, false);
+		animatedUpdate(directionalUpdateDataSize, &argv[3], delay);
+	}
 }
 
 void MystScriptParser_Myst::opcode_199(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -1675,34 +1705,47 @@
 		unknown(op, var, argc, argv);
 }
 
-static struct {
-	bool enabled;
-	uint16 var;
-} g_opcode202Parameters;
+void MystScriptParser_Myst::towerRotationMap_run() {
+	if (!_towerRotationMapInitialized) {
+		_towerRotationMapInitialized = true;
+		_vm->_sound->playSound(4378);
 
-void MystScriptParser_Myst::opcode_202_run(void) {
-	// Used for Card 4378 (Library Tower Rotation Map)
-	// TODO: Fill in.. Code for Tower Rotation Angle etc..
-	// Var 0, 3, 4, 5, 6, 7, 8, 9 used for Type 8 Image Display
-	// Type 11 Hotspot for control..
-	// Var 304 controls presence of Myst Library Image
-}
+		// Draw library
+		_vm->redrawArea(304, false);
 
-void MystScriptParser_Myst::opcode_202_disable(void) {
-	g_opcode202Parameters.enabled = false;
-}
+		// Draw other resources
+		for (uint i = 1; i <= 10; i++) {
+			MystResourceType8 *resource = static_cast<MystResourceType8 *>(_vm->_resources[i]);
+			_vm->redrawResource(resource, false);
+		}
 
-void MystScriptParser_Myst::opcode_202(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+		// Draw to screen
+		_vm->_gfx->updateScreen();
+	}
 
-	// Used for Card 4378 (Library Tower Rotation Map)
-	if (argc == 1) {
-		// TODO: Figure Out argv[0] purpose.. number of image resources?
-		g_opcode202Parameters.enabled = true;
-	} else
-		unknown(op, var, argc, argv);
+	uint32 time = _vm->_system->getMillis();
+	if (time > _startTime) {
+		if (_towerRotationMapClicked) {
+			// TODO: handle tower rotation
+			_startTime = time + 100;
+		} else {
+			// Blink tower
+			_startTime = time + 500;
+			_tempVar = (_tempVar + 1) % 2;
+			_towerRotationMapTower->drawConditionalDataToScreen(_tempVar);
+		}
+	}
 }
 
+void MystScriptParser_Myst::o_towerRotationMap_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	_towerRotationMapRunning = true;
+	_towerRotationMapTower = static_cast<MystResourceType11 *>(_invokingResource);
+	_towerRotationMapLabel = static_cast<MystResourceType8 *>(_vm->_resources[argv[0]]);
+	_tempVar = 0;
+	_startTime = 0;
+	_towerRotationMapClicked = false;
+}
+
 void MystScriptParser_Myst::o_forechamberDoor_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
 	// Used for Card 4138 (Dock Forechamber Door)
 	// Set forechamber door to closed

Modified: scummvm/trunk/engines/mohawk/myst_stacks/myst.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/myst.h	2010-12-11 16:55:25 UTC (rev 54865)
+++ scummvm/trunk/engines/mohawk/myst_stacks/myst.h	2010-12-11 17:00:22 UTC (rev 54866)
@@ -53,8 +53,7 @@
 
 	void opcode_201_run();
 	void opcode_201_disable();
-	void opcode_202_run();
-	void opcode_202_disable();
+	void towerRotationMap_run();
 	void opcode_205_run();
 	void opcode_205_disable();
 	void libraryBookcaseTransform_run();
@@ -70,9 +69,11 @@
 	DECLARE_OPCODE(o_fireplaceToggleButton);
 	DECLARE_OPCODE(o_fireplaceRotation);
 	DECLARE_OPCODE(opcode_105);
+	DECLARE_OPCODE(o_towerRotationStart);
+	DECLARE_OPCODE(o_towerRotationEnd);
 	DECLARE_OPCODE(opcode_109);
-	DECLARE_OPCODE(opcode_113);
-	DECLARE_OPCODE(opcode_114);
+	DECLARE_OPCODE(o_dockVaultOpen);
+	DECLARE_OPCODE(o_dockVaultClose);
 	DECLARE_OPCODE(o_bookGivePage);
 	DECLARE_OPCODE(o_clockWheelsExecute);
 	DECLARE_OPCODE(opcode_117);
@@ -131,12 +132,12 @@
 	DECLARE_OPCODE(opcode_195);
 	DECLARE_OPCODE(opcode_196);
 	DECLARE_OPCODE(opcode_197);
-	DECLARE_OPCODE(opcode_198);
+	DECLARE_OPCODE(o_dockVaultForceClose);
 	DECLARE_OPCODE(opcode_199);
 
 	DECLARE_OPCODE(o_libraryBook_init);
 	DECLARE_OPCODE(opcode_201);
-	DECLARE_OPCODE(opcode_202);
+	DECLARE_OPCODE(o_towerRotationMap_init);
 	DECLARE_OPCODE(o_forechamberDoor_init);
 	DECLARE_OPCODE(opcode_204);
 	DECLARE_OPCODE(opcode_205);
@@ -196,6 +197,14 @@
 
 	uint16 _clockTurningWheel;
 
+	uint16 _dockVaultState; // 92
+
+	bool _towerRotationMapRunning;
+	uint16 _towerRotationMapInitialized; // 292
+	MystResourceType11 *_towerRotationMapTower; // 108
+	MystResourceType8 *_towerRotationMapLabel; // 112
+	bool _towerRotationMapClicked; // 132
+
 	void generatorRedrawRocket();
 	void generatorButtonValue(MystResource *button, uint16 &offset, uint16 &value);
 


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