aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/mohawk/riven_card.cpp4
-rw-r--r--engines/mohawk/riven_card.h2
-rw-r--r--engines/mohawk/riven_stacks/bspit.cpp338
-rw-r--r--engines/mohawk/riven_stacks/bspit.h7
-rw-r--r--engines/mohawk/riven_vars.cpp1
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;