diff options
| author | Bastien Bouclet | 2012-12-15 11:49:41 +0100 | 
|---|---|---|
| committer | Bastien Bouclet | 2012-12-16 06:54:13 +0100 | 
| commit | 07ee25c87df1aa7599664ec97ea5fb277b0c4f89 (patch) | |
| tree | 345e4437d5979635ec5dbec8d6d2730cd65a18fd /engines | |
| parent | 0358a44738f1f1567156dc8e90025dd89414605f (diff) | |
| download | scummvm-rg350-07ee25c87df1aa7599664ec97ea5fb277b0c4f89.tar.gz scummvm-rg350-07ee25c87df1aa7599664ec97ea5fb277b0c4f89.tar.bz2 scummvm-rg350-07ee25c87df1aa7599664ec97ea5fb277b0c4f89.zip  | |
MOHAWK: Implement most of Myst's transition system
Diffstat (limited to 'engines')
| -rw-r--r-- | engines/mohawk/console.cpp | 2 | ||||
| -rw-r--r-- | engines/mohawk/myst.cpp | 12 | ||||
| -rw-r--r-- | engines/mohawk/myst.h | 16 | ||||
| -rw-r--r-- | engines/mohawk/myst_areas.cpp | 26 | ||||
| -rw-r--r-- | engines/mohawk/myst_graphics.cpp | 160 | ||||
| -rw-r--r-- | engines/mohawk/myst_graphics.h | 6 | ||||
| -rw-r--r-- | engines/mohawk/myst_scripts.cpp | 118 | ||||
| -rw-r--r-- | engines/mohawk/myst_scripts.h | 8 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/channelwood.cpp | 2 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/demo.cpp | 4 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/intro.cpp | 6 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/mechanical.cpp | 4 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/myst.cpp | 16 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/preview.cpp | 14 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/selenitic.cpp | 8 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/slides.cpp | 2 | ||||
| -rw-r--r-- | engines/mohawk/myst_stacks/stoneship.cpp | 10 | 
17 files changed, 332 insertions, 82 deletions
diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp index a7a650d8ed..fc957e895e 100644 --- a/engines/mohawk/console.cpp +++ b/engines/mohawk/console.cpp @@ -75,7 +75,7 @@ bool MystConsole::Cmd_ChangeCard(int argc, const char **argv) {  	}  	_vm->_sound->stopSound(); -	_vm->changeToCard((uint16)atoi(argv[1]), true); +	_vm->changeToCard((uint16)atoi(argv[1]), kTransitionCopy);  	return false;  } diff --git a/engines/mohawk/myst.cpp b/engines/mohawk/myst.cpp index 9c0e642203..380bf3bae5 100644 --- a/engines/mohawk/myst.cpp +++ b/engines/mohawk/myst.cpp @@ -523,7 +523,7 @@ void MohawkEngine_Myst::changeToStack(uint16 stack, uint16 card, uint16 linkSrcS  			_video->playMovieBlockingCentered(wrapMovieFilename(flyby, kMasterpieceOnly));  	} -	changeToCard(card, true); +	changeToCard(card, kTransitionCopy);  	if (linkDstSound)  		_sound->playSoundBlocking(linkDstSound); @@ -549,7 +549,7 @@ void MohawkEngine_Myst::drawCardBackground() {  	_gfx->copyImageToBackBuffer(getCardBackgroundId(), Common::Rect(0, 0, 544, 332));  } -void MohawkEngine_Myst::changeToCard(uint16 card, bool updateScreen) { +void MohawkEngine_Myst::changeToCard(uint16 card, TransitionType transition) {  	debug(2, "changeToCard(%d)", card);  	_scriptParser->disablePersistentScripts(); @@ -629,9 +629,11 @@ void MohawkEngine_Myst::changeToCard(uint16 card, bool updateScreen) {  	}  	// Make sure the screen is updated -	if (updateScreen) { -		_gfx->copyBackBufferToScreen(Common::Rect(544, 333)); -		_system->updateScreen(); +	if (transition != kNoTransition) { +		if (!_gameState->_globals.transitions) +			transition = kTransitionCopy; + +		_gfx->runTransition(transition, Common::Rect(544, 333), 10, 0);  	}  	// Make sure we have the right cursor showing diff --git a/engines/mohawk/myst.h b/engines/mohawk/myst.h index 30770f7ec9..43559e2f0d 100644 --- a/engines/mohawk/myst.h +++ b/engines/mohawk/myst.h @@ -75,6 +75,20 @@ enum {  	kStoneshipStack			// Stoneship Age  }; +// Transitions +enum TransitionType { +	kTransitionLeftToRight	= 0, +	kTransitionRightToLeft	= 1, +	kTransitionUnk2			= 2, +	kTransitionDissolve		= 4, +	kTransitionTopToBottom	= 5, +	kTransitionBottomToTop	= 6, +	kTransitionPartToRight	= 9, +	kTransitionPartToLeft	= 10, +	kTransitionCopy			= 11, +	kNoTransition			= 999 +}; +  const uint16 kMasterpieceOnly = 0xFFFF;  struct MystCondition { @@ -154,7 +168,7 @@ public:  	void reloadSaveList();  	void changeToStack(uint16 stack, uint16 card, uint16 linkSrcSound, uint16 linkDstSound); -	void changeToCard(uint16 card, bool updateScreen); +	void changeToCard(uint16 card, TransitionType transition);  	uint16 getCurCard() { return _curCard; }  	uint16 getCurStack() { return _curStack; }  	void setMainCursor(uint16 cursor); diff --git a/engines/mohawk/myst_areas.cpp b/engines/mohawk/myst_areas.cpp index a1f965a25f..12a2c7f44c 100644 --- a/engines/mohawk/myst_areas.cpp +++ b/engines/mohawk/myst_areas.cpp @@ -70,10 +70,30 @@ MystResource::~MystResource() {  }  void MystResource::handleMouseUp() { -	if (_dest != 0) -		_vm->changeToCard(_dest, true); -	else +	if (_dest == 0) {  		warning("Movement type resource with null destination at position (%d, %d), (%d, %d)", _rect.left, _rect.top, _rect.right, _rect.bottom); +		return; +	} + +	uint16 opcode; + +	switch (type) { +	case kMystForwardArea: +		opcode = 6; +		break; +	case kMystLeftArea: +		opcode = 8; +		break; +	case kMystRightArea: +		opcode = 7; +		break; +	default: +		opcode = 48; +		break; +	} + +	_vm->_scriptParser->setInvokingResource(this); +	_vm->_scriptParser->runOpcode(opcode, 0);  }  bool MystResource::canBecomeActive() { diff --git a/engines/mohawk/myst_graphics.cpp b/engines/mohawk/myst_graphics.cpp index 2df0f7e6ba..9eeb1914cd 100644 --- a/engines/mohawk/myst_graphics.cpp +++ b/engines/mohawk/myst_graphics.cpp @@ -209,14 +209,14 @@ void MystGraphics::copyBackBufferToScreen(Common::Rect r) {  	_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(r.left, r.top), _backBuffer->pitch, r.left, r.top, r.width(), r.height());  } -void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, uint16 delay) { +void MystGraphics::runTransition(TransitionType type, Common::Rect rect, uint16 steps, uint16 delay) {  	// Do not artificially delay during transitions  	int oldEnableDrawingTimeSimulation = _enableDrawingTimeSimulation;  	_enableDrawingTimeSimulation = 0;  	switch (type) { -	case 0:	{ +	case kTransitionLeftToRight:	{  			debugC(kDebugScript, "Left to Right");  			uint16 step = (rect.right - rect.left) / steps; @@ -239,7 +239,7 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u  			}  		}  		break; -	case 1:	{ +	case kTransitionRightToLeft:	{  			debugC(kDebugScript, "Right to Left");  			uint16 step = (rect.right - rect.left) / steps; @@ -262,7 +262,16 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u  			}  		}  		break; -	case 5:	{ +	case kTransitionDissolve: { +			debugC(kDebugScript, "Dissolve"); + +			for (int16 step = 0; step < 8; step++) { +				simulatePreviousDrawDelay(rect); +				transitionDissolve(rect, step); +			} +		} +		break; +	case kTransitionTopToBottom:	{  			debugC(kDebugScript, "Top to Bottom");  			uint16 step = (rect.bottom - rect.top) / steps; @@ -285,7 +294,7 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u  			}  		}  		break; -	case 6:	{ +	case kTransitionBottomToTop:	{  			debugC(kDebugScript, "Bottom to Top");  			uint16 step = (rect.bottom - rect.top) / steps; @@ -308,10 +317,23 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u  			}  		}  		break; -	default: -		warning("Unknown Update Direction"); +	case kTransitionPartToRight: { +			debugC(kDebugScript, "Partial left to right"); + +			transitionPartialToRight(rect, 75, 3); +		} +		break; +	case kTransitionPartToLeft: { +			debugC(kDebugScript, "Partial right to left"); +			transitionPartialToLeft(rect, 75, 3); +		} +		break; +	default:  		//TODO: Replace minimal implementation +		warning("Unknown transition %d", type); +		// Fallthrough +	case kTransitionCopy:  		copyBackBufferToScreen(rect);  		_vm->_system->updateScreen();  		break; @@ -320,6 +342,130 @@ void MystGraphics::runTransition(uint16 type, Common::Rect rect, uint16 steps, u  	_enableDrawingTimeSimulation = oldEnableDrawingTimeSimulation;  } + +void MystGraphics::transitionDissolve(Common::Rect rect, uint step) { +	static const bool pattern[][4][4] = { +		{ +			{ true,  false, false, false }, +			{ false, false, false, false }, +			{ false, false, true,  false }, +			{ false, false, false, false } +		}, +		{ +			{ false, false, true,  false }, +			{ false, false, false, false }, +			{ true,  false, false, false }, +			{ false, false, false, false } +		}, +		{ +			{ false, false, false, false }, +			{ false, true,  false, false }, +			{ false, false, false, false }, +			{ false, false, false, true  } +		}, +		{ +			{ false, false, false, false }, +			{ false, false, false, true  }, +			{ false, false, false, false }, +			{ false, true,  false, false } +		}, +		{ +			{ false, false, false, false }, +			{ false, false, true,  false }, +			{ false, true,  false, false }, +			{ false, false, false, false } +		}, +		{ +			{ false, true,  false, false }, +			{ false, false, false, false }, +			{ false, false, false, false }, +			{ false, false, true,  false } +		}, +		{ +			{ false, false, false, false }, +			{ true,  false, false, false }, +			{ false, false, false, true  }, +			{ false, false, false, false } +		}, +		{ +			{ false, false, false, true  }, +			{ false, false, false, false }, +			{ false, false, false, false }, +			{ true,  false, false, false } +		} +	}; + +	rect.clip(_viewport); + +	Graphics::Surface *screen = _vm->_system->lockScreen(); + +	for (uint16 y = rect.top; y < rect.bottom; y++) { +		const bool *linePattern = pattern[step][y % 4]; + +		if (!linePattern[0] && !linePattern[1] && !linePattern[2] && !linePattern[3]) +			continue; + +		for (uint16 x = rect.left; x < rect.right; x++) { +			if (linePattern[x % 4]) { +				if (_pixelFormat.bytesPerPixel == 2) { +					uint16 *dst = (uint16 *)screen->getBasePtr(x, y); +					*dst = *(const uint16 *)_backBuffer->getBasePtr(x, y); +				} else { +					uint32 *dst = (uint32 *)screen->getBasePtr(x, y); +					*dst = *(const uint32 *)_backBuffer->getBasePtr(x, y); +				} +			} +		} +	} + +	_vm->_system->unlockScreen(); +	_vm->_system->updateScreen(); +} + +void MystGraphics::transitionPartialToRight(Common::Rect rect, uint32 width, uint32 steps) +{ +	rect.clip(_viewport); + +	uint32 stepWidth = width / steps; +	Common::Rect srcRect = Common::Rect(rect.right, rect.top, rect.right, rect.bottom); +	Common::Rect dstRect = Common::Rect(rect.left, rect.top, rect.left, rect.bottom); + +	for (uint step = 1; step <= steps; step++) { +		dstRect.right = dstRect.left + step * stepWidth; +		srcRect.left = srcRect.right - step * stepWidth; + +		simulatePreviousDrawDelay(dstRect); +		_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), +				_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); +		_vm->_system->updateScreen(); +	} + +	copyBackBufferToScreen(rect); +	_vm->_system->updateScreen(); +} + +void MystGraphics::transitionPartialToLeft(Common::Rect rect, uint32 width, uint32 steps) +{ +	rect.clip(_viewport); + +	uint32 stepWidth = width / steps; +	Common::Rect srcRect = Common::Rect(rect.left, rect.top, rect.left, rect.bottom); +	Common::Rect dstRect = Common::Rect(rect.right, rect.top, rect.right, rect.bottom); + +	for (uint step = 1; step <= steps; step++) { +		dstRect.left = dstRect.right - step * stepWidth; +		srcRect.right = srcRect.left + step * stepWidth; + +		simulatePreviousDrawDelay(dstRect); +		_vm->_system->copyRectToScreen(_backBuffer->getBasePtr(dstRect.left, dstRect.top), +				_backBuffer->pitch, srcRect.left, srcRect.top, srcRect.width(), srcRect.height()); +		_vm->_system->updateScreen(); +	} + +	copyBackBufferToScreen(rect); +	_vm->_system->updateScreen(); +} +  void MystGraphics::drawRect(Common::Rect rect, RectState state) {  	rect.clip(_viewport); diff --git a/engines/mohawk/myst_graphics.h b/engines/mohawk/myst_graphics.h index de8fe521e6..04eb1b9e9b 100644 --- a/engines/mohawk/myst_graphics.h +++ b/engines/mohawk/myst_graphics.h @@ -48,7 +48,7 @@ public:  	void copyImageToScreen(uint16 image, Common::Rect dest);  	void copyImageToBackBuffer(uint16 image, Common::Rect dest);  	void copyBackBufferToScreen(Common::Rect r); -	void runTransition(uint16 type, Common::Rect rect, uint16 steps, uint16 delay); +	void runTransition(TransitionType type, Common::Rect rect, uint16 steps, uint16 delay);  	void drawRect(Common::Rect rect, RectState state);  	void drawLine(const Common::Point &p1, const Common::Point &p2, uint32 color);  	void enableDrawingTimeSimulation(bool enable); @@ -60,7 +60,9 @@ protected:  	MohawkEngine *getVM() { return (MohawkEngine *)_vm; }  	void simulatePreviousDrawDelay(const Common::Rect &dest);  	void copyBackBufferToScreenWithSaturation(int16 saturation); - +	void transitionDissolve(Common::Rect rect, uint step); +	void transitionPartialToRight(Common::Rect rect, uint32 width, uint32 steps); +	void transitionPartialToLeft(Common::Rect rect, uint32 width, uint32 steps);  private:  	MohawkEngine_Myst *_vm;  	MystBitmap *_bmpDecoder; diff --git a/engines/mohawk/myst_scripts.cpp b/engines/mohawk/myst_scripts.cpp index 107a8b03e9..c1b75df4cf 100644 --- a/engines/mohawk/myst_scripts.cpp +++ b/engines/mohawk/myst_scripts.cpp @@ -100,18 +100,18 @@ void MystScriptParser::setupCommonOpcodes() {  	// "Standard" Opcodes  	OPCODE(0, o_toggleVar);  	OPCODE(1, o_setVar); -	OPCODE(2, o_changeCardSwitch); +	OPCODE(2, o_changeCardSwitch4);  	OPCODE(3, o_takePage);  	OPCODE(4, o_redrawCard);  	// Opcode 5 Not Present -	OPCODE(6, o_goToDest); -	OPCODE(7, o_goToDest); -	OPCODE(8, o_goToDest); +	OPCODE(6, o_goToDestForward); +	OPCODE(7, o_goToDestLeft); +	OPCODE(8, o_goToDestRight);  	OPCODE(9, o_triggerMovie);  	OPCODE(10, o_toggleVarNoRedraw);  	// Opcode 11 Not Present -	OPCODE(12, o_changeCardSwitch); -	OPCODE(13, o_changeCardSwitch); +	OPCODE(12, o_changeCardSwitchLtR); +	OPCODE(13, o_changeCardSwitchRtL);  	OPCODE(14, o_drawAreaState);  	OPCODE(15, o_redrawAreaForVar);  	OPCODE(16, o_changeCardDirectional); @@ -120,7 +120,7 @@ void MystScriptParser::setupCommonOpcodes() {  	OPCODE(19, o_enableAreas);  	OPCODE(20, o_disableAreas);  	OPCODE(21, o_directionalUpdate); -	OPCODE(22, o_goToDest); +	OPCODE(22, o_goToDestUp);  	OPCODE(23, o_toggleAreasActivation);  	OPCODE(24, o_playSound);  	// Opcode 25 is unused; original calls replaceSoundMyst @@ -145,6 +145,7 @@ void MystScriptParser::setupCommonOpcodes() {  	OPCODE(44, o_restoreMainCursor);  	// Opcode 45 Not Present  	OPCODE(46, o_soundWaitStop); +	OPCODE(48, o_goToDest);  	OPCODE(51, o_exitMap);  	// Opcodes 47 to 99 Not Present @@ -273,7 +274,7 @@ void MystScriptParser::animatedUpdate(uint16 argc, uint16 *argv, uint16 delay) {  	while (argsRead < argc) {  		Common::Rect rect = Common::Rect(argv[argsRead], argv[argsRead + 1], argv[argsRead + 2], argv[argsRead + 3]); -		uint16 kind = argv[argsRead + 4]; +		TransitionType kind = static_cast<TransitionType>(argv[argsRead + 4]);  		uint16 steps = argv[argsRead + 5];  		debugC(kDebugScript, "\trect.left: %d", rect.left); @@ -323,16 +324,41 @@ void MystScriptParser::o_setVar(uint16 op, uint16 var, uint16 argc, uint16 *argv  		_vm->redrawArea(var);  } -void MystScriptParser::o_changeCardSwitch(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	// Opcodes 2, 12, and 13 are the same +void MystScriptParser::o_changeCardSwitch4(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	uint16 value = getVar(var);  	debugC(kDebugScript, "Opcode %d: changeCardSwitch var %d: %d", op, var, value);  	if (value) -		_vm->changeToCard(argv[value -1 ], true); +		_vm->changeToCard(argv[value -1 ], kTransitionDissolve);  	else if (_invokingResource != NULL) -		_vm->changeToCard(_invokingResource->getDest(), true); +		_vm->changeToCard(_invokingResource->getDest(), kTransitionDissolve); +	else +		warning("Missing invokingResource in altDest call"); +} + +void MystScriptParser::o_changeCardSwitchLtR(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	uint16 value = getVar(var); + +	debugC(kDebugScript, "Opcode %d: changeCardSwitch var %d: %d", op, var, value); + +	if (value) +		_vm->changeToCard(argv[value -1 ], kTransitionLeftToRight); +	else if (_invokingResource != NULL) +		_vm->changeToCard(_invokingResource->getDest(), kTransitionLeftToRight); +	else +		warning("Missing invokingResource in altDest call"); +} + +void MystScriptParser::o_changeCardSwitchRtL(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	uint16 value = getVar(var); + +	debugC(kDebugScript, "Opcode %d: changeCardSwitch var %d: %d", op, var, value); + +	if (value) +		_vm->changeToCard(argv[value -1 ], kTransitionRightToLeft); +	else if (_invokingResource != NULL) +		_vm->changeToCard(_invokingResource->getDest(), kTransitionRightToLeft);  	else  		warning("Missing invokingResource in altDest call");  } @@ -373,10 +399,47 @@ void MystScriptParser::o_goToDest(uint16 op, uint16 var, uint16 argc, uint16 *ar  	debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op);  	if (_invokingResource != NULL) -		_vm->changeToCard(_invokingResource->getDest(), true); +		_vm->changeToCard(_invokingResource->getDest(), kTransitionCopy); +	else +		warning("Opcode %d: Missing invokingResource", op); +} + +void MystScriptParser::o_goToDestForward(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + +	if (_invokingResource != NULL) +		_vm->changeToCard(_invokingResource->getDest(), kTransitionDissolve); +	else +		warning("Opcode %d: Missing invokingResource", op); +} + +void MystScriptParser::o_goToDestLeft(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + +	if (_invokingResource != NULL) +		_vm->changeToCard(_invokingResource->getDest(), kTransitionPartToRight); +	else +		warning("Opcode %d: Missing invokingResource", op); +} + +void MystScriptParser::o_goToDestRight(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + +	if (_invokingResource != NULL) +		_vm->changeToCard(_invokingResource->getDest(), kTransitionPartToLeft);  	else  		warning("Opcode %d: Missing invokingResource", op);  } + +void MystScriptParser::o_goToDestUp(uint16 op, uint16 var, uint16 argc, uint16 *argv) { +	debugC(kDebugScript, "Opcode %d: Change To Dest of Invoking Resource", op); + +	if (_invokingResource != NULL) +		_vm->changeToCard(_invokingResource->getDest(), kTransitionTopToBottom); +	else +		warning("Opcode %d: Missing invokingResource", op); +} +  void MystScriptParser::o_triggerMovie(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	debugC(kDebugScript, "Opcode %d: Trigger Type 6 Resource Movie..", op);  	// TODO: If movie has sound, pause background music @@ -427,7 +490,7 @@ void MystScriptParser::o_changeCardDirectional(uint16 op, uint16 var, uint16 arg  	debugC(kDebugScript, "\tcardId: %d", cardId);  	debugC(kDebugScript, "\tdirectonal update data size: %d", directionalUpdateDataSize); -	_vm->changeToCard(cardId, false); +	_vm->changeToCard(cardId, kNoTransition);  	animatedUpdate(directionalUpdateDataSize, &argv[2], 0);  } @@ -440,23 +503,23 @@ void MystScriptParser::o_changeCardPush(uint16 op, uint16 var, uint16 argc, uint  	debugC(kDebugScript, "Opcode %d: Jump to Card Id, Storing Current Card Id", op);  	_savedCardId = _vm->getCurCard(); -	uint16 cardId = argv[0]; -	// argv[1] is not used in the original engine +	uint16 cardId = argv[0]; +	TransitionType transition = static_cast<TransitionType>(argv[1]);  	debugC(kDebugScript, "\tCurrent CardId: %d", _savedCardId);  	debugC(kDebugScript, "\tJump to CardId: %d", cardId); -	_vm->changeToCard(cardId, true); +	_vm->changeToCard(cardId, transition);  }  void MystScriptParser::o_changeCardPop(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	debugC(kDebugScript, "Opcode %d: Return To Stored Card Id", op);  	debugC(kDebugScript, "\tCardId: %d", _savedCardId); -	// argv[0] is not used in the original engine +	TransitionType transition = static_cast<TransitionType>(argv[0]); -	_vm->changeToCard(_savedCardId, true); +	_vm->changeToCard(_savedCardId, transition);  }  void MystScriptParser::o_enableAreas(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -752,14 +815,11 @@ void MystScriptParser::o_changeCard(uint16 op, uint16 var, uint16 argc, uint16 *  	debugC(kDebugScript, "Opcode %d: Change Card", op);  	uint16 cardId = argv[0]; - -	// Argument 1 if present is not used -	// uint16 u0 = argv[1]; +	TransitionType transition = static_cast<TransitionType>(argv[1]);  	debugC(kDebugScript, "\tTarget Card: %d", cardId); -	//debugC(kDebugScript, "\tu0: %d", u0); // Unused data -	_vm->changeToCard(cardId, true); +	_vm->changeToCard(cardId, transition);  }  void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -767,7 +827,7 @@ void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc,  		uint16 imageId = argv[0];  		uint16 cardId = argv[1]; -		// argv[2] is not used in the original engine +		TransitionType transition = static_cast<TransitionType>(argv[2]);  		debugC(kDebugScript, "\timageId: %d", imageId);  		debugC(kDebugScript, "\tcardId: %d", cardId); @@ -775,7 +835,7 @@ void MystScriptParser::o_drawImageChangeCard(uint16 op, uint16 var, uint16 argc,  		_vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));  		_vm->_system->updateScreen(); -		_vm->changeToCard(cardId, true); +		_vm->changeToCard(cardId, transition);  }  void MystScriptParser::o_changeMainCursor(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -850,7 +910,7 @@ void MystScriptParser::o_changeCardPlaySoundDirectional(uint16 op, uint16 var, u  	if (soundId)  		_vm->_sound->replaceSoundMyst(soundId); -	_vm->changeToCard(cardId, false); +	_vm->changeToCard(cardId, kNoTransition);  	animatedUpdate(dataSize, &argv[4], delayBetweenSteps);  } @@ -901,12 +961,12 @@ void MystScriptParser::o_quit(uint16 op, uint16 var, uint16 argc, uint16 *argv)  void MystScriptParser::showMap() {  	if (_vm->getCurCard() != getMap()) {  		_savedMapCardId = _vm->getCurCard(); -		_vm->changeToCard(getMap(), true); +		_vm->changeToCard(getMap(), kTransitionCopy);  	}  }  void MystScriptParser::o_exitMap(uint16 op, uint16 var, uint16 argc, uint16 *argv) { -	_vm->changeToCard(_savedMapCardId, true); +	_vm->changeToCard(_savedMapCardId, kTransitionCopy);  }  } // End of namespace Mohawk diff --git a/engines/mohawk/myst_scripts.h b/engines/mohawk/myst_scripts.h index ccb76e0dc8..b75da0801a 100644 --- a/engines/mohawk/myst_scripts.h +++ b/engines/mohawk/myst_scripts.h @@ -86,10 +86,16 @@ public:  	// Common opcodes  	DECLARE_OPCODE(o_toggleVar);  	DECLARE_OPCODE(o_setVar); -	DECLARE_OPCODE(o_changeCardSwitch); +	DECLARE_OPCODE(o_changeCardSwitch4); +	DECLARE_OPCODE(o_changeCardSwitchLtR); +	DECLARE_OPCODE(o_changeCardSwitchRtL);  	DECLARE_OPCODE(o_takePage);  	DECLARE_OPCODE(o_redrawCard);  	DECLARE_OPCODE(o_goToDest); +	DECLARE_OPCODE(o_goToDestForward); +	DECLARE_OPCODE(o_goToDestLeft); +	DECLARE_OPCODE(o_goToDestRight); +	DECLARE_OPCODE(o_goToDestUp);  	DECLARE_OPCODE(o_triggerMovie);  	DECLARE_OPCODE(o_toggleVarNoRedraw);  	DECLARE_OPCODE(o_drawAreaState); diff --git a/engines/mohawk/myst_stacks/channelwood.cpp b/engines/mohawk/myst_stacks/channelwood.cpp index c32ab3a378..63ba5f7c85 100644 --- a/engines/mohawk/myst_stacks/channelwood.cpp +++ b/engines/mohawk/myst_stacks/channelwood.cpp @@ -341,7 +341,7 @@ void Channelwood::o_drawImageChangeCardAndVolume(uint16 op, uint16 var, uint16 a  	_vm->_gfx->copyImageToScreen(imageId, Common::Rect(0, 0, 544, 333));  	_vm->_system->updateScreen(); -	_vm->changeToCard(cardId, true); +	_vm->changeToCard(cardId, kTransitionPartToLeft);  	if (argc == 3) {  		uint16 volume = argv[2]; diff --git a/engines/mohawk/myst_stacks/demo.cpp b/engines/mohawk/myst_stacks/demo.cpp index 29a12571fd..9f393ea401 100644 --- a/engines/mohawk/myst_stacks/demo.cpp +++ b/engines/mohawk/myst_stacks/demo.cpp @@ -104,14 +104,14 @@ void Demo::returnToMenu_run() {  	switch (_returnToMenuStep){  	case 0:  		_vm->_gfx->fadeToBlack(); -		_vm->changeToCard(2003, false); +		_vm->changeToCard(2003, kNoTransition);  		_vm->_gfx->fadeFromBlack();  		_returnToMenuStep++;  		break;  	case 1:  		_vm->_gfx->fadeToBlack(); -		_vm->changeToCard(2001, false); +		_vm->changeToCard(2001, kNoTransition);  		_vm->_gfx->fadeFromBlack();  		_vm->_cursor->showCursor(); diff --git a/engines/mohawk/myst_stacks/intro.cpp b/engines/mohawk/myst_stacks/intro.cpp index 545b97d956..71733227ac 100644 --- a/engines/mohawk/myst_stacks/intro.cpp +++ b/engines/mohawk/myst_stacks/intro.cpp @@ -127,9 +127,9 @@ void Intro::introMovies_run() {  		break;  	default:  		if (_vm->getFeatures() & GF_DEMO) -			_vm->changeToCard(2001, true); +			_vm->changeToCard(2001, kTransitionRightToLeft);  		else -			_vm->changeToCard(2, true); +			_vm->changeToCard(2, kTransitionRightToLeft);  	}  } @@ -148,7 +148,7 @@ void Intro::mystLinkBook_run() {  			_vm->_gfx->copyBackBufferToScreen(Common::Rect(544, 333));  		}  	} else if (!_linkBookMovie->isPlaying()) { -		_vm->changeToCard(5, true); +		_vm->changeToCard(5, kTransitionRightToLeft);  	}  } diff --git a/engines/mohawk/myst_stacks/mechanical.cpp b/engines/mohawk/myst_stacks/mechanical.cpp index 6a925ab4d7..d6069a135c 100644 --- a/engines/mohawk/myst_stacks/mechanical.cpp +++ b/engines/mohawk/myst_stacks/mechanical.cpp @@ -616,7 +616,7 @@ void Mechanical::elevatorGoMiddle_run() {  				_vm->_sound->playSoundBlocking(11120);  				_vm->_gfx->copyImageToBackBuffer(6118, Common::Rect(544, 333));  				_vm->_sound->replaceSoundMyst(12120); -				_vm->_gfx->runTransition(2, Common::Rect(177, 0, 370, 333), 25, 0); +				_vm->_gfx->runTransition(kTransitionUnk2, Common::Rect(177, 0, 370, 333), 25, 0);  				_vm->_sound->playSoundBlocking(13120);  				_vm->_sound->replaceSoundMyst(8120);  				_vm->_gfx->copyImageToBackBuffer(6327, Common::Rect(544, 333)); @@ -630,7 +630,7 @@ void Mechanical::elevatorGoMiddle_run() {  				_elevatorPosition = 1; -				_vm->changeToCard(6327, true); +				_vm->changeToCard(6327, kTransitionRightToLeft);  			}  		}  	} diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index f09c9924f9..f404b23f29 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -1043,7 +1043,7 @@ void Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	// No page or white page  	if (!_globals.heldPage || _globals.heldPage == 13) { -		_vm->changeToCard(cardIdBookCover, true); +		_vm->changeToCard(cardIdBookCover, kTransitionDissolve);  		return;  	} @@ -1085,7 +1085,7 @@ void Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  	// Wrong book  	if (bookVar != var) { -		_vm->changeToCard(cardIdBookCover, true); +		_vm->changeToCard(cardIdBookCover, kTransitionDissolve);  		return;  	} @@ -1111,9 +1111,9 @@ void Myst::o_bookGivePage(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  		else  			_globals.currentAge = 10; -		_vm->changeToCard(cardIdLose, true); +		_vm->changeToCard(cardIdLose, kTransitionDissolve);  	} else { -		_vm->changeToCard(cardIdBookCover, true); +		_vm->changeToCard(cardIdBookCover, kTransitionDissolve);  	}  } @@ -1300,7 +1300,7 @@ void Myst::imagerValidation_run() {  		if (_imagerValidationStep == 11) {  			_imagerValidationStep = 0; -			_vm->changeToCard(_imagerValidationCard, true); +			_vm->changeToCard(_imagerValidationCard, kTransitionBottomToTop);  		} else {  			_startTime = time + 100;  		} @@ -1475,10 +1475,10 @@ void Myst::o_cabinSafeHandleMove(uint16 op, uint16 var, uint16 argc, uint16 *arg  			if (soundId)  				_vm->_sound->replaceSoundMyst(soundId); -			_vm->changeToCard(4103, false); +			_vm->changeToCard(4103, kNoTransition);  			Common::Rect screenRect = Common::Rect(544, 333); -			_vm->_gfx->runTransition(0, screenRect, 2, 5); +			_vm->_gfx->runTransition(kTransitionLeftToRight, screenRect, 2, 5);  		}  		_tempVar = 1;  	} else { @@ -3296,7 +3296,7 @@ void Myst::libraryBookcaseTransform_run(void) {  		if (_state.libraryBookcaseDoor) {  			_vm->_gfx->copyImageSectionToBackBuffer(11179, Common::Rect(0, 0, 106, 81), Common::Rect(0, 72, 106, 153)); -			_vm->_gfx->runTransition(6, Common::Rect(0, 72, 106, 153), 5, 10); +			_vm->_gfx->runTransition(kTransitionBottomToTop, Common::Rect(0, 72, 106, 153), 5, 10);  			_vm->_sound->playSoundBlocking(7348);  			_vm->_sound->replaceBackgroundMyst(4348, 16384);  		} else { diff --git a/engines/mohawk/myst_stacks/preview.cpp b/engines/mohawk/myst_stacks/preview.cpp index 0b8dcf897a..608bd0adc9 100644 --- a/engines/mohawk/myst_stacks/preview.cpp +++ b/engines/mohawk/myst_stacks/preview.cpp @@ -139,7 +139,7 @@ void Preview::speech_run() {  		break;  	case 1: // Open book  		if (_currentCue >= 1) { -			_vm->changeToCard(3001, true); +			_vm->changeToCard(3001, kTransitionDissolve);  			_speechStep++;  		} @@ -147,7 +147,7 @@ void Preview::speech_run() {  	case 2: // Go to Myst  		if (_currentCue >= 2) {  			_vm->_gfx->fadeToBlack(); -			_vm->changeToCard(3002, false); +			_vm->changeToCard(3002, kNoTransition);  			_vm->_gfx->fadeFromBlack();  			_speechStep++; @@ -164,7 +164,7 @@ void Preview::speech_run() {  		if (_currentCue >= 4) {  			_library->drawConditionalDataToScreen(0); -			_vm->changeToCard(3003, true); +			_vm->changeToCard(3003, kTransitionDissolve);  			_speechNextTime = time + 2000;  			_speechStep++; @@ -181,7 +181,7 @@ void Preview::speech_run() {  		if (time < _speechNextTime)  			break; -		_vm->changeToCard(3004, true); +		_vm->changeToCard(3004, kTransitionDissolve);  		_speechNextTime = time + 2000;  		_speechStep++;  		break; @@ -190,7 +190,7 @@ void Preview::speech_run() {  			break;  		_vm->_gfx->fadeToBlack(); -		_vm->changeToCard(3005, false); +		_vm->changeToCard(3005, kNoTransition);  		_vm->_gfx->fadeFromBlack();  		_speechNextTime = time + 1000;  		_speechStep++; @@ -205,7 +205,7 @@ void Preview::speech_run() {  		if (time < _speechNextTime)  			break; -		_vm->changeToCard(3006 + _speechStep - 7, true); +		_vm->changeToCard(3006 + _speechStep - 7, kTransitionDissolve);  		_speechNextTime = time + 2000;  		_speechStep++;  		break; @@ -213,7 +213,7 @@ void Preview::speech_run() {  		if (time < _speechNextTime)  			break; -		_vm->changeToCard(4329, true); +		_vm->changeToCard(4329, kTransitionDissolve);  		_speechRunning = false;  		_globals.currentAge = 2; diff --git a/engines/mohawk/myst_stacks/selenitic.cpp b/engines/mohawk/myst_stacks/selenitic.cpp index 1473742259..a941b14eaa 100644 --- a/engines/mohawk/myst_stacks/selenitic.cpp +++ b/engines/mohawk/myst_stacks/selenitic.cpp @@ -729,11 +729,11 @@ void Selenitic::o_mazeRunnerDoorButton(uint16 op, uint16 var, uint16 argc, uint1  	uint16 cardIdEntry = argv[1];  	if (_mazeRunnerPosition == 288) { -		_vm->changeToCard(cardIdEntry, false); +		_vm->changeToCard(cardIdEntry, kNoTransition);  		_vm->_sound->replaceSoundMyst(cardIdEntry);  		animatedUpdate(argv[2], &argv[3], 10);  	} else if (_mazeRunnerPosition == 289) { -		_vm->changeToCard(cardIdExit, false); +		_vm->changeToCard(cardIdExit, kNoTransition);  		_vm->_sound->replaceSoundMyst(cardIdExit);  		animatedUpdate(argv[2], &argv[3], 10);  	} @@ -895,9 +895,9 @@ void Selenitic::o_soundLockButton(uint16 op, uint16 var, uint16 argc, uint16 *ar  		uint16 cardIdClosed = argv[0];  		uint16 cardIdOpen = argv[1]; -		_vm->changeToCard(cardIdClosed, true); +		_vm->changeToCard(cardIdClosed, kTransitionDissolve); -		_vm->changeToCard(cardIdOpen, false); +		_vm->changeToCard(cardIdOpen, kNoTransition);  		_vm->_sound->replaceSoundMyst(argv[2]);  		animatedUpdate(argv[4], &argv[5], argv[3]); diff --git a/engines/mohawk/myst_stacks/slides.cpp b/engines/mohawk/myst_stacks/slides.cpp index c0bb400db1..720926904a 100644 --- a/engines/mohawk/myst_stacks/slides.cpp +++ b/engines/mohawk/myst_stacks/slides.cpp @@ -63,7 +63,7 @@ void Slides::runPersistentScripts() {  		// Used on Cards...  		if (_vm->_system->getMillis() > _nextCardTime) {  			_vm->_gfx->fadeToBlack(); -			_vm->changeToCard(_nextCardID, false); +			_vm->changeToCard(_nextCardID, kNoTransition);  			_vm->_gfx->fadeFromBlack();  		}  	} diff --git a/engines/mohawk/myst_stacks/stoneship.cpp b/engines/mohawk/myst_stacks/stoneship.cpp index 595f9db477..1359685302 100644 --- a/engines/mohawk/myst_stacks/stoneship.cpp +++ b/engines/mohawk/myst_stacks/stoneship.cpp @@ -440,9 +440,9 @@ void Stoneship::o_drawerOpenSirius(uint16 op, uint16 var, uint16 argc, uint16 *a  		drawer->drawConditionalDataToScreen(0, 0);  	} -	uint16 transition = 5; +	TransitionType transition = kTransitionTopToBottom;  	if (argc == 2 && argv[1]) -		transition = 11; +		transition = kTransitionCopy;  	_vm->_gfx->runTransition(transition, drawer->getRect(), 25, 5);  } @@ -579,7 +579,7 @@ void Stoneship::o_drawerOpenAchenar(uint16 op, uint16 var, uint16 argc, uint16 *  	MystResourceType8 *drawer = static_cast<MystResourceType8 *>(_vm->_resources[argv[0]]);  	drawer->drawConditionalDataToScreen(0, 0); -	_vm->_gfx->runTransition(5, drawer->getRect(), 25, 5); +	_vm->_gfx->runTransition(kTransitionTopToBottom, drawer->getRect(), 25, 5);  }  void Stoneship::o_hologramPlayback(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -777,7 +777,7 @@ void Stoneship::o_cloudOrbLeave(uint16 op, uint16 var, uint16 argc, uint16 *argv  	_cloudOrbMovie->pauseMovie(true);  	_vm->_sound->replaceSoundMyst(_cloudOrbStopSound); -	_vm->_gfx->runTransition(5, _invokingResource->getRect(), 4, 0); +	_vm->_gfx->runTransition(kTransitionTopToBottom, _invokingResource->getRect(), 4, 0);  }  void Stoneship::o_drawerCloseOpened(uint16 op, uint16 var, uint16 argc, uint16 *argv) { @@ -794,7 +794,7 @@ void Stoneship::drawerClose(uint16 drawer) {  	_vm->drawResourceImages();  	MystResource *res = _vm->_resources[drawer]; -	_vm->_gfx->runTransition(6, res->getRect(), 25, 5); +	_vm->_gfx->runTransition(kTransitionBottomToTop, res->getRect(), 25, 5);  }  void Stoneship::o_hologramDisplay_init(uint16 op, uint16 var, uint16 argc, uint16 *argv) {  | 
