aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/riven_external.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mohawk/riven_external.cpp')
-rw-r--r--engines/mohawk/riven_external.cpp230
1 files changed, 138 insertions, 92 deletions
diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp
index 8c0711840d..88718db1a6 100644
--- a/engines/mohawk/riven_external.cpp
+++ b/engines/mohawk/riven_external.cpp
@@ -312,23 +312,27 @@ void RivenExternal::resetDomeSliders(uint16 soundId, uint16 startHotspot) {
assert(_sliderState == kDomeSliderDefaultState);
}
-void RivenExternal::checkDomeSliders(uint16 resetSlidersHotspot, uint16 openDomeHotspot) {
+void RivenExternal::checkDomeSliders() {
+ RivenHotspot *resetSlidersHotspot = _vm->getCurCard()->getHotspotByName("ResetSliders");
+ RivenHotspot *openDomeHotspot = _vm->getCurCard()->getHotspotByName("OpenDome");
+
// Let's see if we're all matched up...
if (_vm->_vars["adomecombo"] == _sliderState) {
// Set the button hotspot to the open dome hotspot
- _vm->_hotspots[resetSlidersHotspot]->enable(false);
- _vm->_hotspots[openDomeHotspot]->enable(true);
+ resetSlidersHotspot->enable(false);
+ openDomeHotspot->enable(true);
} else {
// Set the button hotspot to the reset sliders hotspot
- _vm->_hotspots[resetSlidersHotspot]->enable(true);
- _vm->_hotspots[openDomeHotspot]->enable(false);
+ resetSlidersHotspot->enable(true);
+ openDomeHotspot->enable(false);
}
}
void RivenExternal::checkSliderCursorChange(uint16 startHotspot) {
// Set the cursor based on _sliderState and what hotspot we're over
for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
- if (_vm->_hotspots[i + startHotspot]->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
+ RivenHotspot *hotspot = _vm->getCurCard()->getHotspotByBlstId(startHotspot + i);
+ if (hotspot->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
if (_sliderState & (1 << (24 - i)))
_vm->_cursor->setCursor(kRivenOpenHandCursor);
else
@@ -339,11 +343,12 @@ void RivenExternal::checkSliderCursorChange(uint16 startHotspot) {
}
}
-void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, uint16 openDomeHotspot, uint16 startHotspot) {
+void RivenExternal::dragDomeSlider(uint16 soundId, uint16 startHotspot) {
int16 foundSlider = -1;
for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
- if (_vm->_hotspots[i + startHotspot]->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
+ RivenHotspot *hotspot = _vm->getCurCard()->getHotspotByBlstId(startHotspot + i);
+ if (hotspot->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
// If the slider is not at this hotspot, we can't do anything else
if (!(_sliderState & (1 << (24 - i))))
return;
@@ -367,24 +372,30 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u
while (_vm->_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_MOUSEMOVE:
- if (foundSlider < 24 && !(_sliderState & (1 << (23 - foundSlider))) && _vm->_hotspots[foundSlider + startHotspot + 1]->containsPoint(event.mouse)) {
- // We've moved the slider right one space
- _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
- foundSlider++;
- _sliderState |= 1 << (24 - foundSlider);
-
- // Now play a click sound and redraw
- _vm->_sound->playSound(soundId);
- drawDomeSliders(startHotspot);
- } else if (foundSlider > 0 && !(_sliderState & (1 << (25 - foundSlider))) && _vm->_hotspots[foundSlider + startHotspot - 1]->containsPoint(event.mouse)) {
- // We've moved the slider left one space
- _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
- foundSlider--;
- _sliderState |= 1 << (24 - foundSlider);
-
- // Now play a click sound and redraw
- _vm->_sound->playSound(soundId);
- drawDomeSliders(startHotspot);
+ if (foundSlider < 24 && !(_sliderState & (1 << (23 - foundSlider)))) {
+ RivenHotspot *nextHotspot = _vm->getCurCard()->getHotspotByBlstId(startHotspot + foundSlider + 1);
+ if (nextHotspot->containsPoint(event.mouse)) {
+ // We've moved the slider right one space
+ _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
+ foundSlider++;
+ _sliderState |= 1 << (24 - foundSlider);
+
+ // Now play a click sound and redraw
+ _vm->_sound->playSound(soundId);
+ drawDomeSliders(startHotspot);
+ }
+ } else if (foundSlider > 0 && !(_sliderState & (1 << (25 - foundSlider)))) {
+ RivenHotspot *previousHotspot = _vm->getCurCard()->getHotspotByBlstId(startHotspot + foundSlider - 1);
+ if (previousHotspot->containsPoint(event.mouse)) {
+ // We've moved the slider left one space
+ _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
+ foundSlider--;
+ _sliderState |= 1 << (24 - foundSlider);
+
+ // Now play a click sound and redraw
+ _vm->_sound->playSound(soundId);
+ drawDomeSliders(startHotspot);
+ }
} else
_vm->_system->updateScreen(); // A normal update for the cursor
break;
@@ -399,7 +410,7 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u
}
// Check to see if we have the right combination
- checkDomeSliders(resetSlidersHotspot, openDomeHotspot);
+ checkDomeSliders();
}
void RivenExternal::drawDomeSliders(uint16 startHotspot) {
@@ -414,10 +425,12 @@ void RivenExternal::drawDomeSliders(uint16 startHotspot) {
uint16 bitmapId = _vm->findResourceID(ID_TBMP, "*sliders*");
for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
- Common::Rect srcRect = _vm->_hotspots[startHotspot + i]->getRect();
+ RivenHotspot *hotspot = _vm->getCurCard()->getHotspotByBlstId(startHotspot + i);
+
+ Common::Rect srcRect = hotspot->getRect();
srcRect.translate(-dstAreaRect.left, -dstAreaRect.top); // Adjust the rect so it's in the destination area
- Common::Rect dstRect = _vm->_hotspots[startHotspot + i]->getRect();
+ Common::Rect dstRect = hotspot->getRect();
if (_sliderState & (1 << (24 - i)))
_vm->_gfx->drawImageRect(bitmapId, srcRect, dstRect);
@@ -449,14 +462,17 @@ void RivenExternal::xaatrusopenbook(uint16 argc, uint16 *argv) {
uint32 &page = _vm->_vars["aatruspage"];
// Set hotspots depending on the page
+ RivenHotspot *openBook = _vm->_card->getHotspotByName("openBook");
+ RivenHotspot *nextPage = _vm->_card->getHotspotByName("nextpage");
+ RivenHotspot *prevPage = _vm->_card->getHotspotByName("prevpage");
if (page == 1) {
- _vm->_hotspots[1]->enable(false);
- _vm->_hotspots[2]->enable(false);
- _vm->_hotspots[3]->enable(true);
+ prevPage->enable(false);
+ nextPage->enable(false);
+ openBook->enable(true);
} else {
- _vm->_hotspots[1]->enable(true);
- _vm->_hotspots[2]->enable(true);
- _vm->_hotspots[3]->enable(false);
+ prevPage->enable(true);
+ nextPage->enable(true);
+ openBook->enable(false);
}
// Draw the image of the page
@@ -514,14 +530,17 @@ void RivenExternal::xacathopenbook(uint16 argc, uint16 *argv) {
uint32 page = _vm->_vars["acathpage"];
// Set hotspots depending on the page
+ RivenHotspot *openBook = _vm->_card->getHotspotByName("openBook");
+ RivenHotspot *nextPage = _vm->_card->getHotspotByName("nextpage");
+ RivenHotspot *prevPage = _vm->_card->getHotspotByName("prevpage");
if (page == 1) {
- _vm->_hotspots[1]->enable(false);
- _vm->_hotspots[2]->enable(false);
- _vm->_hotspots[3]->enable(true);
+ prevPage->enable(false);
+ nextPage->enable(false);
+ openBook->enable(true);
} else {
- _vm->_hotspots[1]->enable(true);
- _vm->_hotspots[2]->enable(true);
- _vm->_hotspots[3]->enable(false);
+ prevPage->enable(true);
+ nextPage->enable(true);
+ openBook->enable(false);
}
// Draw the image of the page
@@ -946,12 +965,16 @@ void RivenExternal::xbait(uint16 argc, uint16 *argv) {
_vm->_cursor->setCursor(kRivenMainCursor);
_vm->_system->updateScreen();
+ RivenHotspot *bait = _vm->getCurCard()->getHotspotByBlstId(9);
+ RivenHotspot *baitPlate = _vm->getCurCard()->getHotspotByBlstId(16);
+
// Set the bait if we put it on the plate
- if (_vm->_hotspots[9]->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
+ if (baitPlate->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
_vm->_vars["bbait"] = 1;
_vm->getCurCard()->drawPicture(4);
- _vm->_hotspots[3]->enable(false); // Disable bait hotspot
- _vm->_hotspots[9]->enable(true); // Enable baitplate hotspot
+
+ bait->enable(false); // Disable bait hotspot
+ baitPlate->enable(true); // Enable baitplate hotspot
}
}
@@ -1005,33 +1028,36 @@ void RivenExternal::xbaitplate(uint16 argc, uint16 *argv) {
_vm->_cursor->setCursor(kRivenMainCursor);
_vm->_system->updateScreen();
+ RivenHotspot *bait = _vm->getCurCard()->getHotspotByBlstId(9);
+ RivenHotspot *baitPlate = _vm->getCurCard()->getHotspotByBlstId(16);
+
// Set the bait if we put it on the plate, remove otherwise
- if (_vm->_hotspots[9]->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
+ if (baitPlate->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
_vm->_vars["bbait"] = 1;
_vm->getCurCard()->drawPicture(4);
- _vm->_hotspots[3]->enable(false); // Disable bait hotspot
- _vm->_hotspots[9]->enable(true); // Enable baitplate hotspot
+ bait->enable(false); // Disable bait hotspot
+ baitPlate->enable(true); // Enable baitplate hotspot
} else {
_vm->_vars["bbait"] = 0;
- _vm->_hotspots[3]->enable(true); // Enable bait hotspot
- _vm->_hotspots[9]->enable(false); // Disable baitplate hotspot
+ bait->enable(true); // Enable bait hotspot
+ baitPlate->enable(false); // Disable baitplate hotspot
}
}
void RivenExternal::xbisland190_opencard(uint16 argc, uint16 *argv) {
- checkDomeSliders(27, 28);
+ checkDomeSliders();
}
void RivenExternal::xbisland190_resetsliders(uint16 argc, uint16 *argv) {
- resetDomeSliders(41, 2);
+ resetDomeSliders(41, 9);
}
void RivenExternal::xbisland190_slidermd(uint16 argc, uint16 *argv) {
- dragDomeSlider(41, 27, 28, 2);
+ dragDomeSlider(41, 9);
}
void RivenExternal::xbisland190_slidermw(uint16 argc, uint16 *argv) {
- checkSliderCursorChange(2);
+ checkSliderCursorChange(9);
}
void RivenExternal::xbscpbtn(uint16 argc, uint16 *argv) {
@@ -1192,10 +1218,12 @@ void RivenExternal::xgrotatepins(uint16 argc, uint16 *argv) {
void RivenExternal::xgpincontrols(uint16 argc, uint16 *argv) {
// Handle a click on a section of an island
+ RivenHotspot *panel = _vm->getCurCard()->getHotspotByBlstId(13);
+
// Get our mouse position and adjust it to the beginning of the hotspot
Common::Point mousePos = _vm->_system->getEventManager()->getMousePos();
- mousePos.x -= _vm->_hotspots[3]->getRect().left;
- mousePos.y -= _vm->_hotspots[3]->getRect().top;
+ mousePos.x -= panel->getRect().left;
+ mousePos.y -= panel->getRect().top;
// And now adjust it to which box we hit
mousePos.x /= 10;
@@ -1280,19 +1308,19 @@ void RivenExternal::xgpincontrols(uint16 argc, uint16 *argv) {
}
void RivenExternal::xgisland25_opencard(uint16 argc, uint16 *argv) {
- checkDomeSliders(28, 29);
+ checkDomeSliders();
}
void RivenExternal::xgisland25_resetsliders(uint16 argc, uint16 *argv) {
- resetDomeSliders(16, 2);
+ resetDomeSliders(16, 11);
}
void RivenExternal::xgisland25_slidermd(uint16 argc, uint16 *argv) {
- dragDomeSlider(16, 28, 29, 2);
+ dragDomeSlider(16, 11);
}
void RivenExternal::xgisland25_slidermw(uint16 argc, uint16 *argv) {
- checkSliderCursorChange(2);
+ checkSliderCursorChange(11);
}
void RivenExternal::xgscpbtn(uint16 argc, uint16 *argv) {
@@ -1340,9 +1368,11 @@ void RivenExternal::xgrviewer(uint16 argc, uint16 *argv) {
}
// Calculate how much we're moving
- static const uint16 hotspotPositions[] = { 2, 1, 5, 4, 3 };
+ Common::String buttonName = _vm->_curHotspot->getName();
+ uint32 buttonPos = buttonName.lastChar() - '0';
+
uint32 &curPos = _vm->_vars["grviewpos"];
- uint32 newPos = curPos + hotspotPositions[_vm->_curHotspot->getIndex() - 2];
+ uint32 newPos = curPos + buttonPos;
// Now play the movie
VideoHandle handle = _vm->_video->playMovieRiven(1);
@@ -1409,9 +1439,11 @@ void RivenExternal::xglviewer(uint16 argc, uint16 *argv) {
// (It shows the village from the middle of the lake)
// Calculate how much we're moving
- static const uint16 hotspotPositions[] = { 1, 5, 4, 2, 0, 0, 3 };
+ Common::String buttonName = _vm->_curHotspot->getName();
+ uint32 buttonPos = buttonName.lastChar() - '0';
+
uint32 &curPos = _vm->_vars["glviewpos"];
- uint32 newPos = curPos + hotspotPositions[_vm->_curHotspot->getIndex() - 2];
+ uint32 newPos = curPos + buttonPos;
// Now play the movie
VideoHandle handle = _vm->_video->playMovieRiven(1);
@@ -1756,15 +1788,15 @@ void RivenExternal::xvga1300_carriage(uint16 argc, uint16 *argv) {
}
void RivenExternal::xjdome25_resetsliders(uint16 argc, uint16 *argv) {
- resetDomeSliders(81, 2);
+ resetDomeSliders(81, 10);
}
void RivenExternal::xjdome25_slidermd(uint16 argc, uint16 *argv) {
- dragDomeSlider(81, 29, 28, 2);
+ dragDomeSlider(81, 10);
}
void RivenExternal::xjdome25_slidermw(uint16 argc, uint16 *argv) {
- checkSliderCursorChange(2);
+ checkSliderCursorChange(10);
}
void RivenExternal::xjscpbtn(uint16 argc, uint16 *argv) {
@@ -1995,8 +2027,10 @@ void RivenExternal::xschool280_playwhark(uint16 argc, uint16 *argv) {
}
// Enable the correct hotspots for the movement now
- _vm->_hotspots[2]->enable(!_vm->_hotspots[2]->isEnabled());
- _vm->_hotspots[3]->enable(!_vm->_hotspots[3]->isEnabled());
+ RivenHotspot *rotateLeft = _vm->getCurCard()->getHotspotByName("rotateLeft");
+ RivenHotspot *rotateRight = _vm->getCurCard()->getHotspotByName("rotateRight");
+ rotateLeft->enable(!rotateLeft->isEnabled());
+ rotateRight->enable(!rotateRight->isEnabled());
// Update the cursor
_vm->updateCurrentHotspot();
@@ -2046,15 +2080,15 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) {
uint32 endTime = argv[2] * 1000 / 600;
// Track down our hotspot
- // Of course, they're not in any sane order...
- static const uint16 hotspotMap[] = { 1, 3, 2, 0 };
- Common::Rect hotspotRect = _vm->_hotspots[hotspotMap[argv[3] - 1]]->getRect();
+ Common::String hotspotName = Common::String::format("touchBook%d", argv[3]);
+ RivenHotspot *hotspot = _vm->getCurCard()->getHotspotByName(hotspotName);
+ Common::Rect hotspotRect = hotspot->getRect();
debug(0, "xbookclick:");
debug(0, "\tVideo Code = %d", argv[0]);
debug(0, "\tStart Time = %dms", startTime);
debug(0, "\tEnd Time = %dms", endTime);
- debug(0, "\tHotspot = %d -> %d", argv[3], hotspotMap[argv[3] - 1]);
+ debug(0, "\tHotspot = %d -> %s", argv[3], hotspotName.c_str());
// Just let the video play while we wait until Gehn opens the trap book for us
while (video->getTime() < startTime && !_vm->shouldQuit()) {
@@ -2157,9 +2191,13 @@ void RivenExternal::xooffice30_closebook(uint16 argc, uint16 *argv) {
_vm->_video->playMovieBlockingRiven(1);
// Set the hotspots into their correct states
- _vm->_hotspots[2]->enable(false);
- _vm->_hotspots[5]->enable(false);
- _vm->_hotspots[6]->enable(true);
+ RivenHotspot *closeBook = _vm->getCurCard()->getHotspotByName("closeBook");
+ RivenHotspot *nullHotspot = _vm->getCurCard()->getHotspotByName("null");
+ RivenHotspot *openBook = _vm->getCurCard()->getHotspotByName("openBook");
+
+ closeBook->enable(false);
+ nullHotspot->enable(false);
+ openBook->enable(true);
// We now need to draw PLST 1 and refresh, but PLST 1 is
// drawn when refreshing anyway, so don't worry about that.
@@ -2284,19 +2322,19 @@ void RivenExternal::xpisland290_domecheck(uint16 argc, uint16 *argv) {
}
void RivenExternal::xpisland25_opencard(uint16 argc, uint16 *argv) {
- checkDomeSliders(31, 5);
+ checkDomeSliders();
}
void RivenExternal::xpisland25_resetsliders(uint16 argc, uint16 *argv) {
- resetDomeSliders(10, 6);
+ resetDomeSliders(10, 14);
}
void RivenExternal::xpisland25_slidermd(uint16 argc, uint16 *argv) {
- dragDomeSlider(10, 31, 5, 6);
+ dragDomeSlider(10, 14);
}
void RivenExternal::xpisland25_slidermw(uint16 argc, uint16 *argv) {
- checkSliderCursorChange(6);
+ checkSliderCursorChange(14);
}
// ------------------------------------------------------------------------------------
@@ -2484,7 +2522,8 @@ void RivenExternal::xtisland390_covercombo(uint16 argc, uint16 *argv) {
// If we have hit the correct 5 buttons in a row, activate the hotspot to open up the
// telescope cover.
- _vm->_hotspots[9]->enable(correctDigits == 5);
+ RivenHotspot *openCover = _vm->getCurCard()->getHotspotByName("openCover");
+ openCover->enable(correctDigits == 5);
}
// Atrus' Journal and Trap Book are added to inventory
@@ -2614,20 +2653,23 @@ void RivenExternal::xt7600_setupmarbles(uint16 argc, uint16 *argv) {
void RivenExternal::setMarbleHotspots() {
// Set the hotspots
for (uint16 i = 0; i < kMarbleCount; i++) {
- uint32 &marblePos = _vm->_vars[s_marbleNames[i]];
+ uint32 marblePos = _vm->_vars[s_marbleNames[i]];
+ RivenHotspot *marbleHotspot = _vm->getCurCard()->getHotspotByName(s_marbleNames[i]);
if (marblePos == 0) // In the receptacle
- _vm->_hotspots[i + 3]->setRect(_marbleBaseHotspots[i]);
+ marbleHotspot->setRect(_marbleBaseHotspots[i]);
else // On the grid
- _vm->_hotspots[i + 3]->setRect(generateMarbleGridRect(getMarbleX(marblePos), getMarbleY(marblePos)));
+ marbleHotspot->setRect(generateMarbleGridRect(getMarbleX(marblePos), getMarbleY(marblePos)));
}
}
void RivenExternal::xt7800_setup(uint16 argc, uint16 *argv) {
// First, let's store the base receptacle hotspots for the marbles
if (_marbleBaseHotspots.empty())
- for (uint16 i = 0; i < kMarbleCount; i++)
- _marbleBaseHotspots.push_back(_vm->_hotspots[i + 3]->getRect());
+ for (uint16 i = 0; i < kMarbleCount; i++) {
+ RivenHotspot *marbleHotspot = _vm->getCurCard()->getHotspotByName(s_marbleNames[i]);
+ _marbleBaseHotspots.push_back(marbleHotspot->getRect());
+ }
// Move the marble hotspots based on their position variables
setMarbleHotspots();
@@ -2640,7 +2682,9 @@ void RivenExternal::drawMarbles() {
if (_vm->_vars["themarble"] - 1 == i)
continue;
- Common::Rect rect = _vm->_hotspots[i + 3]->getRect();
+ RivenHotspot *marbleHotspot = _vm->getCurCard()->getHotspotByName(s_marbleNames[i]);
+
+ Common::Rect rect = marbleHotspot->getRect();
// Trim the rect down a bit
rect.left += 3;
rect.top += 3;
@@ -2662,11 +2706,13 @@ void RivenExternal::xtakeit(uint16 argc, uint16 *argv) {
uint32 &marble = _vm->_vars["themarble"];
marble = 0;
- for (uint32 i = 0; i < kMarbleCount; i++)
- if (_vm->_hotspots[i + 3]->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
+ for (uint32 i = 0; i < kMarbleCount; i++) {
+ RivenHotspot *marbleHotspot = _vm->getCurCard()->getHotspotByName(s_marbleNames[i]);
+ if (marbleHotspot->containsPoint(_vm->_system->getEventManager()->getMousePos())) {
marble = i + 1;
break;
}
+ }
// xtakeit() shouldn't be called if we're not on a marble hotspot
assert(marble != 0);
@@ -2735,19 +2781,19 @@ void RivenExternal::xtisland4990_domecheck(uint16 argc, uint16 *argv) {
}
void RivenExternal::xtisland5056_opencard(uint16 argc, uint16 *argv) {
- checkDomeSliders(29, 30);
+ checkDomeSliders();
}
void RivenExternal::xtisland5056_resetsliders(uint16 argc, uint16 *argv) {
- resetDomeSliders(37, 3);
+ resetDomeSliders(37, 24);
}
void RivenExternal::xtisland5056_slidermd(uint16 argc, uint16 *argv) {
- dragDomeSlider(37, 29, 30, 3);
+ dragDomeSlider(37, 24);
}
void RivenExternal::xtisland5056_slidermw(uint16 argc, uint16 *argv) {
- checkSliderCursorChange(3);
+ checkSliderCursorChange(24);
}
void RivenExternal::xtatboundary(uint16 argc, uint16 *argv) {