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

bgk at users.sourceforge.net bgk at users.sourceforge.net
Sat Jan 22 17:44:00 CET 2011


Revision: 55434
          http://scummvm.svn.sourceforge.net/scummvm/?rev=55434&view=rev
Author:   bgk
Date:     2011-01-22 16:44:00 +0000 (Sat, 22 Jan 2011)

Log Message:
-----------
MOHAWK: Implement Channelwood's remaining opcodes

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

Modified: scummvm/trunk/engines/mohawk/myst_stacks/channelwood.cpp
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/channelwood.cpp	2011-01-22 16:35:25 UTC (rev 55433)
+++ scummvm/trunk/engines/mohawk/myst_stacks/channelwood.cpp	2011-01-22 16:44:00 UTC (rev 55434)
@@ -50,7 +50,7 @@
 	// "Stack-Specific" Opcodes
 	OPCODE(100, o_bridgeToggle);
 	OPCODE(101, o_pipeExtend);
-	OPCODE(102, opcode_102);
+	OPCODE(102, o_drawImageChangeCardAndVolume);
 	OPCODE(104, o_waterTankValveOpen);
 	OPCODE(105, o_leverStartMove);
 	OPCODE(106, o_leverEndMove);
@@ -64,12 +64,16 @@
 	OPCODE(114, o_valveHandleMoveStart2);
 	OPCODE(115, o_valveHandleMove3);
 	OPCODE(116, o_valveHandleMoveStart3);
-	OPCODE(117, opcode_117);
+	OPCODE(117, o_hologramMonitor);
 	OPCODE(118, o_drawerOpen);
-	OPCODE(119, opcode_119);
+	OPCODE(119, o_hologramTemple);
+	OPCODE(120, o_leverElev3StartMove);
+	OPCODE(121, o_leverElev3EndMove);
 	OPCODE(122, o_waterTankValveClose);
 	OPCODE(123, o_executeMouseUp);
 	OPCODE(124, o_leverEndMoveWithSound);
+	OPCODE(125, o_pumpLeverMove);
+	OPCODE(126, o_pumpLeverEndMove);
 	OPCODE(127, o_elevatorMovies);
 	OPCODE(128, o_leverEndMoveResumeBackground);
 	OPCODE(129, o_soundReplace);
@@ -80,7 +84,7 @@
 	OPCODE(203, o_drawer_init);
 
 	// "Exit" Opcodes
-	OPCODE(300, opcode_300);
+	OPCODE(300, NOP);
 }
 
 #undef OPCODE
@@ -315,28 +319,24 @@
 	_vm->_sound->resumeBackgroundMyst();
 }
 
-void MystScriptParser_Channelwood::opcode_102(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Change Card, and change volume", op);
 
-	if (argc == 2 || argc == 3) {
-		debugC(kDebugScript, "Opcode %d: Draw Full Screen Image, Optional Delay and Change Card", op);
+	uint16 imageId = argv[0];
+	uint16 cardId = argv[1];
 
-		uint16 imageId = argv[0];
-		uint16 cardId = argv[1];
-		uint16 delay = 0;
+	debugC(kDebugScript, "\timageId: %d", imageId);
+	debugC(kDebugScript, "\tcardId: %d", cardId);
 
-		if (argc == 3)
-			delay = argv[2]; // TODO: Not sure about purpose of this parameter...
+	_vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));
+	_vm->_system->updateScreen();
+	_vm->_system->delayMillis(10);
+	_vm->changeToCard(cardId, true);
 
-		debugC(kDebugScript, "\timageId: %d", imageId);
-		debugC(kDebugScript, "\tcardId: %d", cardId);
-		debugC(kDebugScript, "\tdelay: %d", delay);
-
-		_vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));
-		_vm->_system->delayMillis(delay / 100);
-		_vm->changeToCard(cardId, true);
-	} else
-		unknown(op, var, argc, argv);
+	if (argc == 3) {
+		uint16 volume = argv[2];
+		_vm->_sound->changeBackgroundVolumeMyst(volume);
+	}
 }
 
 
@@ -448,6 +448,50 @@
 		_vm->_sound->replaceSoundMyst(soundId);
 }
 
+void MystScriptParser_Channelwood::o_leverElev3StartMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	_vm->_gfx->copyImageToScreen(3970, Common::Rect(544, 333));
+	_vm->_system->updateScreen();
+	o_leverStartMove(op, var, argc, argv);
+}
+
+void MystScriptParser_Channelwood::o_leverElev3EndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	o_leverEndMove(op, var, argc, argv);
+	_vm->_gfx->copyImageToScreen(3265, Common::Rect(544, 333));
+	_vm->_system->updateScreen();
+	_vm->_sound->replaceSoundMyst(5265);
+}
+
+void MystScriptParser_Channelwood::o_pumpLeverMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Pump lever move", op);
+
+	MystResourceType12 *lever = static_cast<MystResourceType12 *>(_invokingResource);
+
+	// Make the handle follow the mouse
+	int16 maxStep = lever->getStepsV() - 1;
+	Common::Rect rect = lever->getRect();
+	int16 step = ((_vm->_mouse.y - rect.top) * lever->getStepsV()) / rect.height();
+	step = CLIP<int16>(step, 0, maxStep);
+
+	lever->drawFrame(step);
+
+	if (step == maxStep) {
+		uint16 soundId = lever->getList2(0);
+		_vm->_sound->replaceBackgroundMyst(soundId, 38400);
+	} else {
+		uint16 soundId = lever->getList2(1);
+		_vm->_sound->replaceBackgroundMyst(soundId, 36864);
+	}
+}
+
+void MystScriptParser_Channelwood::o_pumpLeverEndMove(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	o_leverEndMove(op, var, argc, argv);
+
+	MystResourceType12 *lever = static_cast<MystResourceType12 *>(_invokingResource);
+	uint16 soundId = lever->getList3(0);
+	if (soundId)
+		_vm->_sound->replaceBackgroundMyst(soundId, 36864);
+}
+
 void MystScriptParser_Channelwood::o_stairsDoorToggle(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
 	debugC(kDebugScript, "Opcode %d: Play stairs door video", op);
 
@@ -562,33 +606,36 @@
 	o_valveHandleMove3(op, var, argc, argv);
 }
 
-void MystScriptParser_Channelwood::opcode_117(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Channelwood::o_hologramMonitor(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Hologram monitor", op);
 
-	if (argc == 1) {
-		// Used on Card 3012 (Temple Hologram Monitor)
-		uint16 button = argv[0]; // 0 to 3
-		_vm->_varStore->setVar(17, button);
+	// Used on Card 3012 (Temple Hologram Monitor)
+	uint16 button = argv[0]; // 0 to 3
 
+	if (_state.holoprojectorSelection != button || !_vm->_video->isVideoPlaying()) {
+		_state.holoprojectorSelection = button;
+		_vm->redrawArea(17);
+
+		_vm->_video->stopVideos();
+
 		switch (button) {
 		case 0:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 71);
+			_vm->_video->playMovie(_vm->wrapMovieFilename("monalgh", kChannelwoodStack), 227, 70);
 			break;
 		case 1:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 71);
+			_vm->_video->playMovie(_vm->wrapMovieFilename("monamth", kChannelwoodStack), 227, 70);
 			break;
 		case 2:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 71);
+			_vm->_video->playMovie(_vm->wrapMovieFilename("monasirs", kChannelwoodStack), 227, 70);
 			break;
 		case 3:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 71);
+			_vm->_video->playMovie(_vm->wrapMovieFilename("monsmsg", kChannelwoodStack), 227, 70);
 			break;
 		default:
 			warning("Opcode %d Control Variable Out of Range", op);
 			break;
 		}
-	} else
-		unknown(op, var, argc, argv);
+	}
 }
 
 void MystScriptParser_Channelwood::o_drawerOpen(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -599,31 +646,31 @@
 	_vm->redrawArea(102, false);
 }
 
-void MystScriptParser_Channelwood::opcode_119(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	varUnusedCheck(op, var);
+void MystScriptParser_Channelwood::o_hologramTemple(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Temple hologram", op);
 
-	if (argc == 0) {
-		// Used on Card 3333 (Temple Hologram)
-		// TODO: Not 100% sure about movie position...
-		switch (_vm->_varStore->getVar(17)) {
-		case 0:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 126, 74);
-			break;
-		case 1:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 126, 74);
-			break;
-		case 2:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 126, 74);
-			break;
-		case 3:
-			_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 126, 74);
-			break;
-		default:
-			warning("Opcode %d Control Variable Out of Range", op);
-			break;
-		}
-	} else
-		unknown(op, var, argc, argv);
+	_vm->_sound->pauseBackgroundMyst();
+
+	// Used on Card 3333 (Temple Hologram)
+	switch (_state.holoprojectorSelection) {
+	case 0:
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoalgh", kChannelwoodStack), 139, 64);
+		break;
+	case 1:
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoamth", kChannelwoodStack), 127, 73);
+		break;
+	case 2:
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holoasir", kChannelwoodStack), 139, 64);
+		break;
+	case 3:
+		_vm->_video->playMovieBlocking(_vm->wrapMovieFilename("holosmsg", kChannelwoodStack), 127, 45);
+		break;
+	default:
+		warning("Opcode %d Control Variable Out of Range", op);
+		break;
+	}
+
+	_vm->_sound->resumeBackgroundMyst();
 }
 
 void MystScriptParser_Channelwood::o_executeMouseUp(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
@@ -710,13 +757,8 @@
 }
 
 void MystScriptParser_Channelwood::o_drawer_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
+	debugC(kDebugScript, "Opcode %d: Sirius's drawer init", op);
 	_siriusDrawerState = 0;
 }
 
-void MystScriptParser_Channelwood::opcode_300(uint16 op, uint16 var, uint16 argc, uint16 *argv) {
-	// Used in Card 3012 (Achenar's Holoprojector Control)
-	varUnusedCheck(op, var);
-	// TODO: Fill in Logic. Clearing Variable for View?
-}
-
 } // End of namespace Mohawk

Modified: scummvm/trunk/engines/mohawk/myst_stacks/channelwood.h
===================================================================
--- scummvm/trunk/engines/mohawk/myst_stacks/channelwood.h	2011-01-22 16:35:25 UTC (rev 55433)
+++ scummvm/trunk/engines/mohawk/myst_stacks/channelwood.h	2011-01-22 16:44:00 UTC (rev 55434)
@@ -53,7 +53,7 @@
 
 	DECLARE_OPCODE(o_bridgeToggle);
 	DECLARE_OPCODE(o_pipeExtend);
-	DECLARE_OPCODE(opcode_102);
+	DECLARE_OPCODE(o_drawImageChangeCardAndVolume);
 	DECLARE_OPCODE(o_waterTankValveOpen);
 	DECLARE_OPCODE(o_leverStartMove);
 	DECLARE_OPCODE(o_leverMove);
@@ -61,6 +61,10 @@
 	DECLARE_OPCODE(o_leverEndMove);
 	DECLARE_OPCODE(o_leverEndMoveResumeBackground);
 	DECLARE_OPCODE(o_leverEndMoveWithSound);
+	DECLARE_OPCODE(o_leverElev3StartMove);
+	DECLARE_OPCODE(o_leverElev3EndMove);
+	DECLARE_OPCODE(o_pumpLeverMove);
+	DECLARE_OPCODE(o_pumpLeverEndMove);
 	DECLARE_OPCODE(o_stairsDoorToggle);
 	DECLARE_OPCODE(o_valveHandleMove1);
 	DECLARE_OPCODE(o_valveHandleMoveStart1);
@@ -69,9 +73,9 @@
 	DECLARE_OPCODE(o_valveHandleMoveStart2);
 	DECLARE_OPCODE(o_valveHandleMove3);
 	DECLARE_OPCODE(o_valveHandleMoveStart3);
-	DECLARE_OPCODE(opcode_117);
+	DECLARE_OPCODE(o_hologramMonitor);
 	DECLARE_OPCODE(o_drawerOpen);
-	DECLARE_OPCODE(opcode_119);
+	DECLARE_OPCODE(o_hologramTemple);
 	DECLARE_OPCODE(o_executeMouseUp);
 	DECLARE_OPCODE(o_waterTankValveClose);
 	DECLARE_OPCODE(o_elevatorMovies);
@@ -81,8 +85,6 @@
 	DECLARE_OPCODE(o_pipeValve_init);
 	DECLARE_OPCODE(o_drawer_init);
 
-	DECLARE_OPCODE(opcode_300);
-
 	MystGameState::Channelwood &_state;
 
 	uint16 _valveVar; // 64


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