diff options
| -rw-r--r-- | engines/mohawk/riven_card.cpp | 4 | ||||
| -rw-r--r-- | engines/mohawk/riven_card.h | 2 | ||||
| -rw-r--r-- | engines/mohawk/riven_stacks/bspit.cpp | 338 | ||||
| -rw-r--r-- | engines/mohawk/riven_stacks/bspit.h | 7 | ||||
| -rw-r--r-- | engines/mohawk/riven_vars.cpp | 1 | 
5 files changed, 196 insertions, 156 deletions
| diff --git a/engines/mohawk/riven_card.cpp b/engines/mohawk/riven_card.cpp index d5501c8ac4..fe93190385 100644 --- a/engines/mohawk/riven_card.cpp +++ b/engines/mohawk/riven_card.cpp @@ -232,6 +232,10 @@ SLSTRecord RivenCard::getSound(uint16 index) const {  	error("Could not find sound %d in card %d", index, _id);  } +void RivenCard::overrideSound(uint16 index, uint16 withIndex) { +	_soundList[index].soundIds = _soundList[withIndex].soundIds; +} +  void RivenCard::loadHotspots(uint16 id) {  	Common::SeekableReadStream *inStream = _vm->getResource(ID_HSPT, id); diff --git a/engines/mohawk/riven_card.h b/engines/mohawk/riven_card.h index a736a604b6..e92d31afbd 100644 --- a/engines/mohawk/riven_card.h +++ b/engines/mohawk/riven_card.h @@ -80,6 +80,8 @@ public:  	/** Get the card's sound description with the specified index */  	SLSTRecord getSound(uint16 index) const; +	void overrideSound(uint16 index, uint16 withIndex); +  	/** Play the card's movie with the specified index */  	void playMovie(uint16 index, bool queue = false); diff --git a/engines/mohawk/riven_stacks/bspit.cpp b/engines/mohawk/riven_stacks/bspit.cpp index 9cb562f53a..eb249af21b 100644 --- a/engines/mohawk/riven_stacks/bspit.cpp +++ b/engines/mohawk/riven_stacks/bspit.cpp @@ -36,25 +36,25 @@ namespace RivenStacks {  BSpit::BSpit(MohawkEngine_Riven *vm) :  		DomeSpit(vm, kStackBspit, "bSliders.190", "bSliderBG.190") { -//	REGISTER_COMMAND(BSpit, xblabopenbook); -//	REGISTER_COMMAND(BSpit, xblabbookprevpage); -//	REGISTER_COMMAND(BSpit, xblabbooknextpage); -//	REGISTER_COMMAND(BSpit, xsoundplug); -//	REGISTER_COMMAND(BSpit, xbchangeboiler); -//	REGISTER_COMMAND(BSpit, xbupdateboiler); -//	REGISTER_COMMAND(BSpit, xbsettrap); -//	REGISTER_COMMAND(BSpit, xbcheckcatch); -//	REGISTER_COMMAND(BSpit, xbait); -//	REGISTER_COMMAND(BSpit, xbfreeytram); -//	REGISTER_COMMAND(BSpit, xbaitplate); -//	REGISTER_COMMAND(BSpit, xbisland190_opencard); -//	REGISTER_COMMAND(BSpit, xbisland190_resetsliders); -//	REGISTER_COMMAND(BSpit, xbisland190_slidermd); -//	REGISTER_COMMAND(BSpit, xbisland190_slidermw); -//	REGISTER_COMMAND(BSpit, xbscpbtn); -//	REGISTER_COMMAND(BSpit, xbisland_domecheck); -//	REGISTER_COMMAND(BSpit, xvalvecontrol); -//	REGISTER_COMMAND(BSpit, xbchipper); +	REGISTER_COMMAND(BSpit, xblabopenbook); +	REGISTER_COMMAND(BSpit, xblabbookprevpage); +	REGISTER_COMMAND(BSpit, xblabbooknextpage); +	REGISTER_COMMAND(BSpit, xsoundplug); +	REGISTER_COMMAND(BSpit, xbchangeboiler); +	REGISTER_COMMAND(BSpit, xbupdateboiler); +	REGISTER_COMMAND(BSpit, xbsettrap); +	REGISTER_COMMAND(BSpit, xbcheckcatch); +	REGISTER_COMMAND(BSpit, xbait); +	REGISTER_COMMAND(BSpit, xbfreeytram); +	REGISTER_COMMAND(BSpit, xbaitplate); +	REGISTER_COMMAND(BSpit, xbisland190_opencard); +	REGISTER_COMMAND(BSpit, xbisland190_resetsliders); +	REGISTER_COMMAND(BSpit, xbisland190_slidermd); +	REGISTER_COMMAND(BSpit, xbisland190_slidermw); +	REGISTER_COMMAND(BSpit, xbscpbtn); +	REGISTER_COMMAND(BSpit, xbisland_domecheck); +	REGISTER_COMMAND(BSpit, xvalvecontrol); +	REGISTER_COMMAND(BSpit, xbchipper);  }  void BSpit::xblabopenbook(uint16 argc, uint16 *argv) { @@ -65,17 +65,22 @@ void BSpit::xblabopenbook(uint16 argc, uint16 *argv) {  	_vm->getCard()->drawPicture(page);  	if (page == 14) { -		// Draw the dome combination -		// The images for the numbers are tBMP's 364 through 368 -		// The start point is at (240, 82) -		uint32 domeCombo = _vm->_vars["adomecombo"]; -		static const uint16 kNumberWidth = 32; -		static const uint16 kNumberHeight = 24; -		static const uint16 kDstX = 240; -		static const uint16 kDstY = 82; -		byte numCount = 0; - -		for (int bitPos = 24; bitPos >= 0; bitPos--) { +		labBookDrawDomeCombination(); +	} +} + +void BSpit::labBookDrawDomeCombination() const { +	// Draw the dome combination +	// The images for the numbers are tBMP's 364 through 368 +	// The start point is at (240, 82) +	uint32 domeCombo = _vm->_vars["adomecombo"]; +	static const uint16 kNumberWidth = 32; +	static const uint16 kNumberHeight = 24; +	static const uint16 kDstX = 240; +	static const uint16 kDstY = 82; +	byte numCount = 0; + +	for (int bitPos = 24; bitPos >= 0; bitPos--) {  			if (domeCombo & (1 << bitPos)) {  				uint16 offset = (24 - bitPos) * kNumberWidth;  				Common::Rect srcRect = Common::Rect(offset, 0, offset + kNumberWidth, kNumberHeight); @@ -85,51 +90,102 @@ void BSpit::xblabopenbook(uint16 argc, uint16 *argv) {  			}  		} -		assert(numCount == 5); // Sanity check -	} +	assert(numCount == 5); // Sanity check  }  void BSpit::xblabbookprevpage(uint16 argc, uint16 *argv) {  	// Get the page variable  	uint32 &page = _vm->_vars["blabpage"]; -	// Decrement the page if it's not the first page -	if (page == 1) -		return; -	page--; +	// Keep turning pages while the mouse is pressed +	bool firstPageTurn = true; +	while (mouseIsDown() || firstPageTurn) { +		// Check for the first page +		if (page == 1) +			return; -	// Play the page turning sound -	_vm->_sound->playSound(22); +		if (!pageTurn(kRivenTransitionWipeRight)) { +			return; +		} -	// Now update the screen :) -	_vm->_gfx->scheduleTransition(kRivenTransitionWipeRight); -	_vm->getCard()->drawPicture(page); +		// Update the page number +		page--; +		firstPageTurn = false; + +		_vm->getCard()->drawPicture(page); + +		if (page == 14) { +			labBookDrawDomeCombination(); +		} + +		_vm->doFrame(); +	}  }  void BSpit::xblabbooknextpage(uint16 argc, uint16 *argv) {  	// Get the page variable  	uint32 &page = _vm->_vars["blabpage"]; -	// Increment the page if it's not the last page -	if (page == 22) -		return; -	page++; +	// Keep turning pages while the mouse is pressed +	bool firstPageTurn = true; +	while ((mouseIsDown() || firstPageTurn) && !_vm->shouldQuit()) { +		// Check for the last page +		if (page == 22) +			return; + +		if (!pageTurn(kRivenTransitionWipeLeft)) { +			return; +		} + +		// Update the page number +		page++; +		firstPageTurn = false; + +		_vm->getCard()->drawPicture(page); + +		if (page == 14) { +			labBookDrawDomeCombination(); +		} + +		_vm->doFrame(); +	} +} + +bool BSpit::pageTurn(RivenTransition transition) { +	// Wait until the previous page turn sound completes +	while (_vm->_sound->isEffectPlaying() && !_vm->shouldQuit()) { +		if (!mouseIsDown()) { +			return false; +		} + +		_vm->doFrame(); +	}  	// Play the page turning sound -	_vm->_sound->playSound(23); +	const char *soundName = nullptr; +	if (_vm->_rnd->getRandomBit()) +		soundName = "aPage1"; +	else +		soundName = "aPage2"; + +	_vm->_sound->playCardSound(soundName, 51, true);  	// Now update the screen :) -	_vm->_gfx->scheduleTransition(kRivenTransitionWipeLeft); -	_vm->getCard()->drawPicture(page); +	_vm->_gfx->scheduleTransition(transition); + +	return true;  }  void BSpit::xsoundplug(uint16 argc, uint16 *argv) { -	if (_vm->_vars["bheat"] != 0) -		_vm->getCard()->playSound(1); -	else if (_vm->_vars["bcratergg"] != 0) -		_vm->getCard()->playSound(2); -	else -		_vm->getCard()->playSound(3); +	if (_vm->_vars["bcratergg"] == 0) { +		if (_vm->_vars["bblrwtr"] == 0) { +			_vm->getCard()->overrideSound(0, 2); +		} else { +			_vm->getCard()->overrideSound(0, 3); +		} +	} else { +		_vm->getCard()->overrideSound(0, 1); +	}  }  void BSpit::xbchangeboiler(uint16 argc, uint16 *argv) { @@ -151,12 +207,12 @@ void BSpit::xbchangeboiler(uint16 argc, uint16 *argv) {  			if (platform == 1)  				_vm->getCard()->playMovie(22);  			else -			_vm->getCard()->playMovie(19); +				_vm->getCard()->playMovie(19);  		} else {  			if (platform == 1)  				_vm->getCard()->playMovie(16);  			else -			_vm->getCard()->playMovie(13); +				_vm->getCard()->playMovie(13);  		}  	} else if (argv[0] == 2 && water != 0) {  		if (heat == 1) { @@ -164,13 +220,13 @@ void BSpit::xbchangeboiler(uint16 argc, uint16 *argv) {  			if (platform == 1)  				_vm->getCard()->playMovie(23);  			else -			_vm->getCard()->playMovie(20); +				_vm->getCard()->playMovie(20);  		} else {  			// Turning off the heat  			if (platform == 1)  				_vm->getCard()->playMovie(18);  			else -			_vm->getCard()->playMovie(15); +				_vm->getCard()->playMovie(15);  		}  	} else if (argv[0] == 3) {  		if (platform == 1) { @@ -179,18 +235,20 @@ void BSpit::xbchangeboiler(uint16 argc, uint16 *argv) {  				if (heat == 1)  					_vm->getCard()->playMovie(24);  				else -				_vm->getCard()->playMovie(17); -			} else +					_vm->getCard()->playMovie(17); +			} else {  				_vm->getCard()->playMovie(11); +			}  		} else {  			// Raising the platform  			if (water == 1) {  				if (heat == 1)  					_vm->getCard()->playMovie(21);  				else -				_vm->getCard()->playMovie(14); -			} else +					_vm->getCard()->playMovie(14); +			} else {  				_vm->getCard()->playMovie(9); +			}  		}  	} @@ -280,33 +338,20 @@ void BSpit::xbcheckcatch(uint16 argc, uint16 *argv) {  void BSpit::xbait(uint16 argc, uint16 *argv) {  	// Set the cursor to the pellet  	_vm->_cursor->setCursor(kRivenPelletCursor); -	_vm->_system->updateScreen();  	// Loop until the player lets go (or quits) -	Common::Event event; -	bool mouseDown = true; -	while (mouseDown) { -		while (_vm->_system->getEventManager()->pollEvent(event)) { -			if (event.type == Common::EVENT_LBUTTONUP) -				mouseDown = false; -			else if (event.type == Common::EVENT_MOUSEMOVE) -				_vm->_system->updateScreen(); -			else if (event.type == Common::EVENT_QUIT || event.type == Common::EVENT_RTL) -				return; -		} - -		_vm->_system->delayMillis(10); // Take it easy on the CPU +	while (mouseIsDown() && !_vm->shouldQuit()) { +		_vm->doFrame();  	}  	// Set back the cursor  	_vm->_cursor->setCursor(kRivenMainCursor); -	_vm->_system->updateScreen();  	RivenHotspot *bait = _vm->getCard()->getHotspotByBlstId(9);  	RivenHotspot *baitPlate = _vm->getCard()->getHotspotByBlstId(16);  	// Set the bait if we put it on the plate -	if (baitPlate->containsPoint(_vm->_system->getEventManager()->getMousePos())) { +	if (baitPlate->containsPoint(getMousePosition())) {  		_vm->_vars["bbait"] = 1;  		_vm->getCard()->drawPicture(4); @@ -351,30 +396,18 @@ void BSpit::xbaitplate(uint16 argc, uint16 *argv) {  	_vm->getCard()->drawPicture(3);  	// Loop until the player lets go (or quits) -	Common::Event event; -	bool mouseDown = true; -	while (mouseDown) { -		while (_vm->_system->getEventManager()->pollEvent(event)) { -			if (event.type == Common::EVENT_LBUTTONUP) -				mouseDown = false; -			else if (event.type == Common::EVENT_MOUSEMOVE) -				_vm->_system->updateScreen(); -			else if (event.type == Common::EVENT_QUIT || event.type == Common::EVENT_RTL) -				return; -		} - -		_vm->_system->delayMillis(10); // Take it easy on the CPU +	while (mouseIsDown() && !_vm->shouldQuit()) { +		_vm->doFrame();  	}  	// Set back the cursor  	_vm->_cursor->setCursor(kRivenMainCursor); -	_vm->_system->updateScreen();  	RivenHotspot *bait = _vm->getCard()->getHotspotByBlstId(9);  	RivenHotspot *baitPlate = _vm->getCard()->getHotspotByBlstId(16);  	// Set the bait if we put it on the plate, remove otherwise -	if (baitPlate->containsPoint(_vm->_system->getEventManager()->getMousePos())) { +	if (baitPlate->containsPoint(getMousePosition())) {  		_vm->_vars["bbait"] = 1;  		_vm->getCard()->drawPicture(4);  		bait->enable(false); // Disable bait hotspot @@ -411,94 +444,87 @@ void BSpit::xbisland_domecheck(uint16 argc, uint16 *argv) {  }  void BSpit::xvalvecontrol(uint16 argc, uint16 *argv) { -	Common::Point startPos = _vm->_system->getEventManager()->getMousePos(); - -	// Get the variable for the valve -	uint32 &valve = _vm->_vars["bvalve"]; - -	int changeX = 0; -	int changeY = 0; -	bool done = false; +	Common::Point startPos = getMouseDragStartPosition();  	// Set the cursor to the closed position  	_vm->_cursor->setCursor(kRivenClosedHandCursor); -	_vm->_system->updateScreen(); - -	while (!done) { -		Common::Event event; - -		while (_vm->_system->getEventManager()->pollEvent(event)) { -			switch (event.type) { -				case Common::EVENT_MOUSEMOVE: -					changeX = event.mouse.x - startPos.x; -					changeY = startPos.y - event.mouse.y; -					_vm->_system->updateScreen(); -					break; -				case Common::EVENT_LBUTTONUP: -					// FIXME: These values for changes in x/y could be tweaked. -					if (valve == 0 && changeY <= -10) { -						valve = 1; -						_vm->_cursor->setCursor(kRivenHideCursor); -						_vm->_system->updateScreen(); -						RivenVideo *video = _vm->_video->openSlot(2); -						video->playBlocking(); -						_vm->refreshCard(); -					} else if (valve == 1) { -						if (changeX >= 0 && changeY >= 10) { -							valve = 0; -							_vm->_cursor->setCursor(kRivenHideCursor); -							_vm->_system->updateScreen(); -							RivenVideo *video = _vm->_video->openSlot(3); -							video->playBlocking(); -							_vm->refreshCard(); -						} else if (changeX <= -10 && changeY <= 10) { -							valve = 2; -							_vm->_cursor->setCursor(kRivenHideCursor); -							_vm->_system->updateScreen(); -							RivenVideo *video = _vm->_video->openSlot(1); -							video->playBlocking(); -							_vm->refreshCard(); -						} -					} else if (valve == 2 && changeX >= 10) { -						valve = 1; -						_vm->_cursor->setCursor(kRivenHideCursor); -						_vm->_system->updateScreen(); -						RivenVideo *video = _vm->_video->openSlot(4); -						video->playBlocking(); -						_vm->refreshCard(); -					} -					done = true; -				default: -					break; + +	while (mouseIsDown()) { +		Common::Point mousePos = getMousePosition(); +		int changeX = mousePos.x - startPos.x; +		int changeY = startPos.y - mousePos.y; + +		// Get the variable for the valve +		uint32 valve = _vm->_vars["bvalve"]; + +		// FIXME: These values for changes in x/y could be tweaked. +		if (valve == 0 && changeY <= -10) { +			valveChangePosition(1, 2, 2); +		} else if (valve == 1) { +			if (changeX >= 0 && changeY >= 10) { +				valveChangePosition(0, 3, 1); +			} else if (changeX <= -10 && changeY <= 10) { +				valveChangePosition(2, 1, 3);  			} +		} else if (valve == 2 && changeX >= 10) { +			valveChangePosition(1, 4, 2);  		} -		_vm->_system->delayMillis(10); + +		_vm->doFrame();  	} +} + +void BSpit::valveChangePosition(uint32 valvePosition, uint16 videoId, uint16 pictureId) { +	RivenVideo *video = _vm->_video->openSlot(videoId); +	video->seek(0); +	video->playBlocking(); + +	_vm->getCard()->drawPicture(pictureId);  	// If we changed state and the new state is that the valve is flowing to  	// the boiler, we need to update the boiler state. -	if (valve == 1) { -		if (_vm->_vars["bidvlv"] == 1) { // Check which way the water is going at the boiler -			if (_vm->_vars["bblrarm"] == 1) { +	if (valvePosition == 1) { +		// Check which way the water is going at the boiler +		if (_vm->_vars["bidvlv"] == 1) { +			if (_vm->_vars["bblrarm"] == 1 && _vm->_vars["bblrwtr"] == 1) {  				// If the pipe is open, make sure the water is drained out  				_vm->_vars["bheat"] = 0;  				_vm->_vars["bblrwtr"] = 0; -			} else { +				_vm->_sound->playCardSound("bBlrFar"); +			} + +			if (_vm->_vars["bblrarm"] == 0 && _vm->_vars["bblrwtr"] == 0) {  				// If the pipe is closed, fill the boiler again  				_vm->_vars["bheat"] = _vm->_vars["bblrvalve"];  				_vm->_vars["bblrwtr"] = 1; +				_vm->_sound->playCardSound("bBlrFar");  			}  		} else {  			// Have the grating inside the boiler match the switch outside  			_vm->_vars["bblrgrt"] = (_vm->_vars["bblrsw"] == 1) ? 0 : 1;  		}  	} + +	_vm->_vars["bvalve"] = valvePosition;  }  void BSpit::xbchipper(uint16 argc, uint16 *argv) { -	// Why is this an external command....? -	if (_vm->_vars["bvalve"] == 2) { +	Common::Point startPos = getMouseDragStartPosition(); + +	bool pulledLever = false; +	while (mouseIsDown() && !_vm->shouldQuit()) { +		Common::Point pos = getMousePosition(); +		if (pos.y > startPos.y) { +			pulledLever = true; +			break; +		} + +		_vm->doFrame(); +	} + +	if (pulledLever) {  		RivenVideo *video = _vm->_video->openSlot(2); +		video->seek(0);  		video->playBlocking();  	}  } diff --git a/engines/mohawk/riven_stacks/bspit.h b/engines/mohawk/riven_stacks/bspit.h index 135776e8bd..fd11ba814d 100644 --- a/engines/mohawk/riven_stacks/bspit.h +++ b/engines/mohawk/riven_stacks/bspit.h @@ -23,6 +23,7 @@  #ifndef RIVEN_STACKS_BSPIT_H  #define RIVEN_STACKS_BSPIT_H +#include <engines/mohawk/riven_graphics.h>  #include "mohawk/riven_stacks/domespit.h"  namespace Mohawk { @@ -69,6 +70,12 @@ public:  	// Time callback  	void ytramTrapTimer();  	void checkYtramCatch(bool playSound); + +	void valveChangePosition(uint32 valvePosition, uint16 videoId, uint16 pictureId); + +	void labBookDrawDomeCombination() const; + +	bool pageTurn(Mohawk::RivenTransition transition);  };  } // End of namespace RivenStacks diff --git a/engines/mohawk/riven_vars.cpp b/engines/mohawk/riven_vars.cpp index bbc39c248e..0bf61d4c12 100644 --- a/engines/mohawk/riven_vars.cpp +++ b/engines/mohawk/riven_vars.cpp @@ -297,6 +297,7 @@ void MohawkEngine_Riven::initVars() {  	_vars["aatruspage"] = 1;  	_vars["acathpage"] = 1;  	_vars["bheat"] = 1; +	_vars["blabpage"] = 1;  	_vars["waterenabled"] = 1;  	_vars["ogehnpage"] = 1;  	_vars["bblrsw"] = 1; | 
