MOHAWK: Start converting RivenHotspot into a class

This commit is contained in:
Bastien Bouclet 2016-08-05 08:07:02 +02:00 committed by Eugene Sandulenko
parent 1b062d1e39
commit 23bbf05c91
7 changed files with 164 additions and 136 deletions

View file

@ -510,17 +510,17 @@ bool RivenConsole::Cmd_ChangeStack(int argc, const char **argv) {
}
bool RivenConsole::Cmd_Hotspots(int argc, const char **argv) {
debugPrintf("Current card (%d) has %d hotspots:\n", _vm->getCurCard()->getId(), _vm->getHotspotCount());
debugPrintf("Current card (%d) has %d hotspots:\n", _vm->getCurCard()->getId(), _vm->_hotspots.size());
for (uint16 i = 0; i < _vm->getHotspotCount(); i++) {
debugPrintf("Hotspot %d, index %d, BLST ID %d (", i, _vm->_hotspots[i].index, _vm->_hotspots[i].blstID);
for (uint16 i = 0; i < _vm->_hotspots.size(); i++) {
debugPrintf("Hotspot %d, index %d, BLST ID %d (", i, _vm->_hotspots[i]->index, _vm->_hotspots[i]->blstID);
if (_vm->_hotspots[i].enabled)
if (_vm->_hotspots[i]->enabled)
debugPrintf("enabled");
else
debugPrintf("disabled");
debugPrintf(") - (%d, %d, %d, %d)\n", _vm->_hotspots[i].rect.left, _vm->_hotspots[i].rect.top, _vm->_hotspots[i].rect.right, _vm->_hotspots[i].rect.bottom);
debugPrintf(") - (%d, %d, %d, %d)\n", _vm->_hotspots[i]->rect.left, _vm->_hotspots[i]->rect.top, _vm->_hotspots[i]->rect.right, _vm->_hotspots[i]->rect.bottom);
debugPrintf(" Name = %s\n", _vm->getHotspotName(i).c_str());
}

View file

@ -58,7 +58,6 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
_ignoreNextMouseUp = false;
_extrasFile = nullptr;
_curStack = kStackUnknown;
_hotspots = nullptr;
_gfx = nullptr;
_sound = nullptr;
_externalScriptHandler = nullptr;
@ -68,7 +67,6 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
_saveLoad = nullptr;
_optionsDialog = nullptr;
_card = nullptr;
_hotspotCount = 0;
_curHotspot = -1;
removeTimer();
@ -105,7 +103,9 @@ MohawkEngine_Riven::~MohawkEngine_Riven() {
delete _scriptMan;
delete _optionsDialog;
delete _rnd;
delete[] _hotspots;
for (uint i = 0; i < _hotspots.size(); i++) {
delete _hotspots[i];
}
delete g_atrusJournalRect1;
delete g_atrusJournalRect2;
delete g_cathJournalRect2;
@ -257,8 +257,8 @@ void MohawkEngine_Riven::handleEvents() {
case Common::KEYCODE_F4:
_showHotspots = !_showHotspots;
if (_showHotspots) {
for (uint16 i = 0; i < _hotspotCount; i++)
_gfx->drawRect(_hotspots[i].rect, _hotspots[i].enabled);
for (uint16 i = 0; i < _hotspots.size(); i++)
_gfx->drawRect(_hotspots[i]->rect, _hotspots[i]->enabled);
needsUpdate = true;
} else
refreshCard();
@ -414,8 +414,8 @@ void MohawkEngine_Riven::refreshCard() {
_card->open();
if (_showHotspots)
for (uint16 i = 0; i < _hotspotCount; i++)
_gfx->drawRect(_hotspots[i].rect, _hotspots[i].enabled);
for (uint16 i = 0; i < _hotspots.size(); i++)
_gfx->drawRect(_hotspots[i]->rect, _hotspots[i]->enabled);
// Now we need to redraw the cursor if necessary and handle mouse over scripts
updateCurrentHotspot();
@ -425,46 +425,17 @@ void MohawkEngine_Riven::refreshCard() {
}
void MohawkEngine_Riven::loadHotspots(uint16 id) {
// Clear old hotspots
delete[] _hotspots;
// NOTE: The hotspot scripts are cleared by the RivenScriptManager automatically.
for (uint i = 0; i < _hotspots.size(); i++) {
delete _hotspots[i];
}
Common::SeekableReadStream *inStream = getResource(ID_HSPT, id);
_hotspotCount = inStream->readUint16BE();
_hotspots = new RivenHotspot[_hotspotCount];
uint16 hotspotCount = inStream->readUint16BE();
_hotspots.resize(hotspotCount);
for (uint16 i = 0; i < _hotspotCount; i++) {
_hotspots[i].enabled = true;
_hotspots[i].blstID = inStream->readUint16BE();
_hotspots[i].name_resource = inStream->readSint16BE();
int16 left = inStream->readSint16BE();
int16 top = inStream->readSint16BE();
int16 right = inStream->readSint16BE();
int16 bottom = inStream->readSint16BE();
// Riven has some invalid rects, disable them here
// Known weird hotspots:
// - tspit 371 (DVD: 377), hotspot 4
if (left >= right || top >= bottom) {
warning("%s %d hotspot %d is invalid: (%d, %d, %d, %d)", getStackName(_curStack).c_str(), id, i, left, top, right, bottom);
left = top = right = bottom = 0;
_hotspots[i].enabled = 0;
}
_hotspots[i].rect = Common::Rect(left, top, right, bottom);
_hotspots[i].u0 = inStream->readUint16BE();
_hotspots[i].mouse_cursor = inStream->readUint16BE();
_hotspots[i].index = inStream->readUint16BE();
_hotspots[i].u1 = inStream->readSint16BE();
_hotspots[i].zipModeHotspot = inStream->readUint16BE();
// Read in the scripts now
_hotspots[i].scripts = _scriptMan->readScripts(inStream);
for (uint16 i = 0; i < hotspotCount; i++) {
_hotspots[i] = new RivenHotspot(this, inStream);
}
delete inStream;
@ -474,11 +445,11 @@ void MohawkEngine_Riven::loadHotspots(uint16 id) {
void MohawkEngine_Riven::updateZipMode() {
// Check if a zip mode hotspot is enabled by checking the name/id against the ZIPS records.
for (uint32 i = 0; i < _hotspotCount; i++) {
if (_hotspots[i].zipModeHotspot) {
for (uint32 i = 0; i < _hotspots.size(); i++) {
if (_hotspots[i]->zipModeHotspot) {
if (_vars["azip"] != 0) {
// Check if a zip mode hotspot is enabled by checking the name/id against the ZIPS records.
Common::String hotspotName = getName(HotspotNames, _hotspots[i].name_resource);
Common::String hotspotName = getName(HotspotNames, _hotspots[i]->name_resource);
bool foundMatch = false;
@ -489,9 +460,9 @@ void MohawkEngine_Riven::updateZipMode() {
break;
}
_hotspots[i].enabled = foundMatch;
_hotspots[i]->enabled = foundMatch;
} else // Disable the hotspot if zip mode is disabled
_hotspots[i].enabled = false;
_hotspots[i]->enabled = false;
}
}
}
@ -499,8 +470,8 @@ void MohawkEngine_Riven::updateZipMode() {
void MohawkEngine_Riven::checkHotspotChange() {
uint16 hotspotIndex = 0;
bool foundHotspot = false;
for (uint16 i = 0; i < _hotspotCount; i++)
if (_hotspots[i].enabled && _hotspots[i].rect.contains(_eventMan->getMousePos())) {
for (uint16 i = 0; i < _hotspots.size(); i++)
if (_hotspots[i]->enabled && _hotspots[i]->rect.contains(_eventMan->getMousePos())) {
foundHotspot = true;
hotspotIndex = i;
}
@ -508,7 +479,7 @@ void MohawkEngine_Riven::checkHotspotChange() {
if (foundHotspot) {
if (_curHotspot != hotspotIndex) {
_curHotspot = hotspotIndex;
_cursor->setCursor(_hotspots[_curHotspot].mouse_cursor);
_cursor->setCursor(_hotspots[_curHotspot]->mouse_cursor);
_system->updateScreen();
}
} else {
@ -524,12 +495,12 @@ void MohawkEngine_Riven::updateCurrentHotspot() {
}
Common::String MohawkEngine_Riven::getHotspotName(uint16 hotspot) {
assert(hotspot < _hotspotCount);
assert(hotspot < _hotspots.size());
if (_hotspots[hotspot].name_resource < 0)
if (_hotspots[hotspot]->name_resource < 0)
return Common::String();
return getName(HotspotNames, _hotspots[hotspot].name_resource);
return getName(HotspotNames, _hotspots[hotspot]->name_resource);
}
void MohawkEngine_Riven::checkInventoryClick() {
@ -663,13 +634,7 @@ uint32 MohawkEngine_Riven::getCurCardRMAP() {
}
void MohawkEngine_Riven::runHotspotScript(uint16 hotspot, uint16 scriptType) {
assert(hotspot < _hotspotCount);
for (uint16 i = 0; i < _hotspots[hotspot].scripts.size(); i++)
if (_hotspots[hotspot].scripts[i].type == scriptType) {
RivenScriptPtr script = _hotspots[hotspot].scripts[i].script;
_scriptMan->runScript(script, false);
break;
}
_hotspots[hotspot]->runScript(scriptType);
}
void MohawkEngine_Riven::delayAndUpdate(uint32 ms) {

View file

@ -42,6 +42,7 @@ class RivenConsole;
class RivenSaveLoad;
class RivenOptionsDialog;
class RivenCard;
class RivenHotspot;
class RivenSoundManager;
// Riven Stack Types
@ -86,20 +87,6 @@ extern Common::Rect *g_cathJournalRect3;
extern Common::Rect *g_trapBookRect3;
extern Common::Rect *g_demoExitRect;
struct RivenHotspot {
uint16 blstID;
int16 name_resource;
Common::Rect rect;
uint16 u0;
uint16 mouse_cursor;
uint16 index;
int16 u1;
int16 zipModeHotspot;
RivenScriptList scripts;
bool enabled;
};
struct ZipMode {
Common::String name;
uint16 id;
@ -148,7 +135,6 @@ private:
void handleEvents();
// Hotspot related functions and variables
uint16 _hotspotCount;
void loadHotspots(uint16);
void checkInventoryClick();
bool _showHotspots;
@ -180,10 +166,9 @@ public:
uint32 getCurCardRMAP();
// Hotspot functions/variables
RivenHotspot *_hotspots;
Common::Array<RivenHotspot *> _hotspots;
int32 _curHotspot;
Common::Array<ZipMode> _zipModeData;
uint16 getHotspotCount() const { return _hotspotCount; }
void runHotspotScript(uint16 hotspot, uint16 scriptType);
int32 getCurHotspot() const { return _curHotspot; }
Common::String getHotspotName(uint16 hotspot);

View file

@ -196,4 +196,50 @@ SLSTRecord RivenCard::getSound(uint16 index) const {
error("Could not find sound %d in card %d", index, _id);
}
RivenHotspot::RivenHotspot(MohawkEngine_Riven *vm, Common::ReadStream *stream) :
_vm(vm) {
loadFromStream(stream);
}
void RivenHotspot::loadFromStream(Common::ReadStream *stream) {
enabled = true;
blstID = stream->readUint16BE();
name_resource = stream->readSint16BE();
int16 left = stream->readSint16BE();
int16 top = stream->readSint16BE();
int16 right = stream->readSint16BE();
int16 bottom = stream->readSint16BE();
// Riven has some invalid rects, disable them here
// Known weird hotspots:
// - tspit 371 (DVD: 377), hotspot 4
if (left >= right || top >= bottom) {
warning("Invalid hotspot: (%d, %d, %d, %d)", left, top, right, bottom);
left = top = right = bottom = 0;
enabled = 0;
}
rect = Common::Rect(left, top, right, bottom);
_u0 = stream->readUint16BE();
mouse_cursor = stream->readUint16BE();
index = stream->readUint16BE();
_u1 = stream->readSint16BE();
zipModeHotspot = stream->readUint16BE();
// Read in the scripts now
_scripts = _vm->_scriptMan->readScripts(stream);
}
void RivenHotspot::runScript(uint16 scriptType) {
for (uint16 i = 0; i < _scripts.size(); i++)
if (_scripts[i].type == scriptType) {
RivenScriptPtr script = _scripts[i].script;
_vm->_scriptMan->runScript(script, false);
break;
}
}
} // End of namespace Mohawk

View file

@ -95,6 +95,38 @@ private:
Common::Array<SLSTRecord> _soundList;
};
/**
* A Card Hotspot
*
* Hotspots are named rectangular areas of the view.
* Hotspots can be interactive through their scripts.
*/
class RivenHotspot {
public:
RivenHotspot(MohawkEngine_Riven *vm, Common::ReadStream *stream);
/** Run one of the hotspot's scripts */
void runScript(uint16 scriptType);
uint16 blstID;
int16 name_resource;
uint16 index;
Common::Rect rect;
uint16 mouse_cursor;
int16 zipModeHotspot;
bool enabled; // TODO: Remove
private:
void loadFromStream(Common::ReadStream *stream);
MohawkEngine_Riven *_vm;
uint16 _u0;
int16 _u1;
RivenScriptList _scripts;
};
} // End of namespace Mohawk
#endif

View file

@ -316,19 +316,19 @@ void RivenExternal::checkDomeSliders(uint16 resetSlidersHotspot, uint16 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].enabled = false;
_vm->_hotspots[openDomeHotspot].enabled = true;
_vm->_hotspots[resetSlidersHotspot]->enabled = false;
_vm->_hotspots[openDomeHotspot]->enabled = true;
} else {
// Set the button hotspot to the reset sliders hotspot
_vm->_hotspots[resetSlidersHotspot].enabled = true;
_vm->_hotspots[openDomeHotspot].enabled = false;
_vm->_hotspots[resetSlidersHotspot]->enabled = true;
_vm->_hotspots[openDomeHotspot]->enabled = 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].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
if (_vm->_hotspots[i + startHotspot]->rect.contains(_vm->_system->getEventManager()->getMousePos())) {
if (_sliderState & (1 << (24 - i)))
_vm->_cursor->setCursor(kRivenOpenHandCursor);
else
@ -343,7 +343,7 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u
int16 foundSlider = -1;
for (uint16 i = 0; i < kDomeSliderSlotCount; i++) {
if (_vm->_hotspots[i + startHotspot].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
if (_vm->_hotspots[i + startHotspot]->rect.contains(_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,7 +367,7 @@ 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].rect.contains(event.mouse)) {
if (foundSlider < 24 && !(_sliderState & (1 << (23 - foundSlider))) && _vm->_hotspots[foundSlider + startHotspot + 1]->rect.contains(event.mouse)) {
// We've moved the slider right one space
_sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
foundSlider++;
@ -376,7 +376,7 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u
// 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].rect.contains(event.mouse)) {
} else if (foundSlider > 0 && !(_sliderState & (1 << (25 - foundSlider))) && _vm->_hotspots[foundSlider + startHotspot - 1]->rect.contains(event.mouse)) {
// We've moved the slider left one space
_sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
foundSlider--;
@ -414,10 +414,10 @@ 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].rect;
Common::Rect srcRect = _vm->_hotspots[startHotspot + i]->rect;
srcRect.translate(-dstAreaRect.left, -dstAreaRect.top); // Adjust the rect so it's in the destination area
Common::Rect dstRect = _vm->_hotspots[startHotspot + i].rect;
Common::Rect dstRect = _vm->_hotspots[startHotspot + i]->rect;
if (_sliderState & (1 << (24 - i)))
_vm->_gfx->drawImageRect(bitmapId, srcRect, dstRect);
@ -450,13 +450,13 @@ void RivenExternal::xaatrusopenbook(uint16 argc, uint16 *argv) {
// Set hotspots depending on the page
if (page == 1) {
_vm->_hotspots[1].enabled = false;
_vm->_hotspots[2].enabled = false;
_vm->_hotspots[3].enabled = true;
_vm->_hotspots[1]->enabled = false;
_vm->_hotspots[2]->enabled = false;
_vm->_hotspots[3]->enabled = true;
} else {
_vm->_hotspots[1].enabled = true;
_vm->_hotspots[2].enabled = true;
_vm->_hotspots[3].enabled = false;
_vm->_hotspots[1]->enabled = true;
_vm->_hotspots[2]->enabled = true;
_vm->_hotspots[3]->enabled = false;
}
// Draw the image of the page
@ -515,13 +515,13 @@ void RivenExternal::xacathopenbook(uint16 argc, uint16 *argv) {
// Set hotspots depending on the page
if (page == 1) {
_vm->_hotspots[1].enabled = false;
_vm->_hotspots[2].enabled = false;
_vm->_hotspots[3].enabled = true;
_vm->_hotspots[1]->enabled = false;
_vm->_hotspots[2]->enabled = false;
_vm->_hotspots[3]->enabled = true;
} else {
_vm->_hotspots[1].enabled = true;
_vm->_hotspots[2].enabled = true;
_vm->_hotspots[3].enabled = false;
_vm->_hotspots[1]->enabled = true;
_vm->_hotspots[2]->enabled = true;
_vm->_hotspots[3]->enabled = false;
}
// Draw the image of the page
@ -947,11 +947,11 @@ void RivenExternal::xbait(uint16 argc, uint16 *argv) {
_vm->_system->updateScreen();
// Set the bait if we put it on the plate
if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
if (_vm->_hotspots[9]->rect.contains(_vm->_system->getEventManager()->getMousePos())) {
_vm->_vars["bbait"] = 1;
_vm->getCurCard()->drawPicture(4);
_vm->_hotspots[3].enabled = false; // Disable bait hotspot
_vm->_hotspots[9].enabled = true; // Enable baitplate hotspot
_vm->_hotspots[3]->enabled = false; // Disable bait hotspot
_vm->_hotspots[9]->enabled = true; // Enable baitplate hotspot
}
}
@ -1006,15 +1006,15 @@ void RivenExternal::xbaitplate(uint16 argc, uint16 *argv) {
_vm->_system->updateScreen();
// Set the bait if we put it on the plate, remove otherwise
if (_vm->_hotspots[9].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
if (_vm->_hotspots[9]->rect.contains(_vm->_system->getEventManager()->getMousePos())) {
_vm->_vars["bbait"] = 1;
_vm->getCurCard()->drawPicture(4);
_vm->_hotspots[3].enabled = false; // Disable bait hotspot
_vm->_hotspots[9].enabled = true; // Enable baitplate hotspot
_vm->_hotspots[3]->enabled = false; // Disable bait hotspot
_vm->_hotspots[9]->enabled = true; // Enable baitplate hotspot
} else {
_vm->_vars["bbait"] = 0;
_vm->_hotspots[3].enabled = true; // Enable bait hotspot
_vm->_hotspots[9].enabled = false; // Disable baitplate hotspot
_vm->_hotspots[3]->enabled = true; // Enable bait hotspot
_vm->_hotspots[9]->enabled = false; // Disable baitplate hotspot
}
}
@ -1194,8 +1194,8 @@ void RivenExternal::xgpincontrols(uint16 argc, uint16 *argv) {
// 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].rect.left;
mousePos.y -= _vm->_hotspots[3].rect.top;
mousePos.x -= _vm->_hotspots[3]->rect.left;
mousePos.y -= _vm->_hotspots[3]->rect.top;
// And now adjust it to which box we hit
mousePos.x /= 10;
@ -1995,8 +1995,8 @@ void RivenExternal::xschool280_playwhark(uint16 argc, uint16 *argv) {
}
// Enable the correct hotspots for the movement now
_vm->_hotspots[2].enabled = !_vm->_hotspots[2].enabled;
_vm->_hotspots[3].enabled = !_vm->_hotspots[3].enabled;
_vm->_hotspots[2]->enabled = !_vm->_hotspots[2]->enabled;
_vm->_hotspots[3]->enabled = !_vm->_hotspots[3]->enabled;
// Update the cursor
_vm->updateCurrentHotspot();
@ -2048,7 +2048,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) {
// 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]].rect;
Common::Rect hotspotRect = _vm->_hotspots[hotspotMap[argv[3] - 1]]->rect;
debug(0, "xbookclick:");
debug(0, "\tVideo Code = %d", argv[0]);
@ -2157,9 +2157,9 @@ void RivenExternal::xooffice30_closebook(uint16 argc, uint16 *argv) {
_vm->_video->playMovieBlockingRiven(1);
// Set the hotspots into their correct states
_vm->_hotspots[2].enabled = false;
_vm->_hotspots[5].enabled = false;
_vm->_hotspots[6].enabled = true;
_vm->_hotspots[2]->enabled = false;
_vm->_hotspots[5]->enabled = false;
_vm->_hotspots[6]->enabled = true;
// We now need to draw PLST 1 and refresh, but PLST 1 is
// drawn when refreshing anyway, so don't worry about that.
@ -2484,7 +2484,7 @@ 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].enabled = (correctDigits == 5);
_vm->_hotspots[9]->enabled = (correctDigits == 5);
}
// Atrus' Journal and Trap Book are added to inventory
@ -2617,9 +2617,9 @@ void RivenExternal::setMarbleHotspots() {
uint32 &marblePos = _vm->_vars[s_marbleNames[i]];
if (marblePos == 0) // In the receptacle
_vm->_hotspots[i + 3].rect = _marbleBaseHotspots[i];
_vm->_hotspots[i + 3]->rect = _marbleBaseHotspots[i];
else // On the grid
_vm->_hotspots[i + 3].rect = generateMarbleGridRect(getMarbleX(marblePos), getMarbleY(marblePos));
_vm->_hotspots[i + 3]->rect = generateMarbleGridRect(getMarbleX(marblePos), getMarbleY(marblePos));
}
}
@ -2627,7 +2627,7 @@ 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].rect);
_marbleBaseHotspots.push_back(_vm->_hotspots[i + 3]->rect);
// Move the marble hotspots based on their position variables
setMarbleHotspots();
@ -2640,7 +2640,7 @@ void RivenExternal::drawMarbles() {
if (_vm->_vars["themarble"] - 1 == i)
continue;
Common::Rect rect = _vm->_hotspots[i + 3].rect;
Common::Rect rect = _vm->_hotspots[i + 3]->rect;
// Trim the rect down a bit
rect.left += 3;
rect.top += 3;
@ -2663,7 +2663,7 @@ void RivenExternal::xtakeit(uint16 argc, uint16 *argv) {
marble = 0;
for (uint32 i = 0; i < kMarbleCount; i++)
if (_vm->_hotspots[i + 3].rect.contains(_vm->_system->getEventManager()->getMousePos())) {
if (_vm->_hotspots[i + 3]->rect.contains(_vm->_system->getEventManager()->getMousePos())) {
marble = i + 1;
break;
}

View file

@ -358,10 +358,10 @@ void RivenSimpleCommand::mohawkSwitch(uint16 op, uint16 argc, uint16 *argv) {
// Command 9: enable hotspot (blst_id)
void RivenSimpleCommand::enableHotspot(uint16 op, uint16 argc, uint16 *argv) {
for (uint16 i = 0; i < _vm->getHotspotCount(); i++) {
if (_vm->_hotspots[i].blstID == argv[0]) {
for (uint16 i = 0; i < _vm->_hotspots.size(); i++) {
if (_vm->_hotspots[i]->blstID == argv[0]) {
debug(2, "Enabling hotspot with BLST ID %d", argv[0]);
_vm->_hotspots[i].enabled = true;
_vm->_hotspots[i]->enabled = true;
}
}
@ -371,10 +371,10 @@ void RivenSimpleCommand::enableHotspot(uint16 op, uint16 argc, uint16 *argv) {
// Command 10: disable hotspot (blst_id)
void RivenSimpleCommand::disableHotspot(uint16 op, uint16 argc, uint16 *argv) {
for (uint16 i = 0; i < _vm->getHotspotCount(); i++) {
if (_vm->_hotspots[i].blstID == argv[0]) {
for (uint16 i = 0; i < _vm->_hotspots.size(); i++) {
if (_vm->_hotspots[i]->blstID == argv[0]) {
debug(2, "Disabling hotspot with BLST ID %d", argv[0]);
_vm->_hotspots[i].enabled = false;
_vm->_hotspots[i]->enabled = false;
}
}
@ -601,9 +601,9 @@ void RivenSimpleCommand::activateBLST(uint16 op, uint16 argc, uint16 *argv) {
uint16 hotspotID = blst->readUint16BE();
if (argv[0] == index)
for (uint16 j = 0; j < _vm->getHotspotCount(); j++)
if (_vm->_hotspots[j].blstID == hotspotID)
_vm->_hotspots[j].enabled = (enabled == 1);
for (uint16 j = 0; j < _vm->_hotspots.size(); j++)
if (_vm->_hotspots[j]->blstID == hotspotID)
_vm->_hotspots[j]->enabled = (enabled == 1);
}
delete blst;