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) { 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++) { 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); 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"); debugPrintf("enabled");
else else
debugPrintf("disabled"); 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()); 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; _ignoreNextMouseUp = false;
_extrasFile = nullptr; _extrasFile = nullptr;
_curStack = kStackUnknown; _curStack = kStackUnknown;
_hotspots = nullptr;
_gfx = nullptr; _gfx = nullptr;
_sound = nullptr; _sound = nullptr;
_externalScriptHandler = nullptr; _externalScriptHandler = nullptr;
@ -68,7 +67,6 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio
_saveLoad = nullptr; _saveLoad = nullptr;
_optionsDialog = nullptr; _optionsDialog = nullptr;
_card = nullptr; _card = nullptr;
_hotspotCount = 0;
_curHotspot = -1; _curHotspot = -1;
removeTimer(); removeTimer();
@ -105,7 +103,9 @@ MohawkEngine_Riven::~MohawkEngine_Riven() {
delete _scriptMan; delete _scriptMan;
delete _optionsDialog; delete _optionsDialog;
delete _rnd; delete _rnd;
delete[] _hotspots; for (uint i = 0; i < _hotspots.size(); i++) {
delete _hotspots[i];
}
delete g_atrusJournalRect1; delete g_atrusJournalRect1;
delete g_atrusJournalRect2; delete g_atrusJournalRect2;
delete g_cathJournalRect2; delete g_cathJournalRect2;
@ -257,8 +257,8 @@ void MohawkEngine_Riven::handleEvents() {
case Common::KEYCODE_F4: case Common::KEYCODE_F4:
_showHotspots = !_showHotspots; _showHotspots = !_showHotspots;
if (_showHotspots) { if (_showHotspots) {
for (uint16 i = 0; i < _hotspotCount; i++) for (uint16 i = 0; i < _hotspots.size(); i++)
_gfx->drawRect(_hotspots[i].rect, _hotspots[i].enabled); _gfx->drawRect(_hotspots[i]->rect, _hotspots[i]->enabled);
needsUpdate = true; needsUpdate = true;
} else } else
refreshCard(); refreshCard();
@ -414,8 +414,8 @@ void MohawkEngine_Riven::refreshCard() {
_card->open(); _card->open();
if (_showHotspots) if (_showHotspots)
for (uint16 i = 0; i < _hotspotCount; i++) for (uint16 i = 0; i < _hotspots.size(); i++)
_gfx->drawRect(_hotspots[i].rect, _hotspots[i].enabled); _gfx->drawRect(_hotspots[i]->rect, _hotspots[i]->enabled);
// Now we need to redraw the cursor if necessary and handle mouse over scripts // Now we need to redraw the cursor if necessary and handle mouse over scripts
updateCurrentHotspot(); updateCurrentHotspot();
@ -425,46 +425,17 @@ void MohawkEngine_Riven::refreshCard() {
} }
void MohawkEngine_Riven::loadHotspots(uint16 id) { void MohawkEngine_Riven::loadHotspots(uint16 id) {
// Clear old hotspots for (uint i = 0; i < _hotspots.size(); i++) {
delete[] _hotspots; delete _hotspots[i];
}
// NOTE: The hotspot scripts are cleared by the RivenScriptManager automatically.
Common::SeekableReadStream *inStream = getResource(ID_HSPT, id); Common::SeekableReadStream *inStream = getResource(ID_HSPT, id);
_hotspotCount = inStream->readUint16BE(); uint16 hotspotCount = inStream->readUint16BE();
_hotspots = new RivenHotspot[_hotspotCount]; _hotspots.resize(hotspotCount);
for (uint16 i = 0; i < _hotspotCount; i++) { for (uint16 i = 0; i < hotspotCount; i++) {
_hotspots[i].enabled = true; _hotspots[i] = new RivenHotspot(this, inStream);
_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);
} }
delete inStream; delete inStream;
@ -474,11 +445,11 @@ void MohawkEngine_Riven::loadHotspots(uint16 id) {
void MohawkEngine_Riven::updateZipMode() { void MohawkEngine_Riven::updateZipMode() {
// Check if a zip mode hotspot is enabled by checking the name/id against the ZIPS records. // Check if a zip mode hotspot is enabled by checking the name/id against the ZIPS records.
for (uint32 i = 0; i < _hotspotCount; i++) { for (uint32 i = 0; i < _hotspots.size(); i++) {
if (_hotspots[i].zipModeHotspot) { if (_hotspots[i]->zipModeHotspot) {
if (_vars["azip"] != 0) { if (_vars["azip"] != 0) {
// Check if a zip mode hotspot is enabled by checking the name/id against the ZIPS records. // 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; bool foundMatch = false;
@ -489,9 +460,9 @@ void MohawkEngine_Riven::updateZipMode() {
break; break;
} }
_hotspots[i].enabled = foundMatch; _hotspots[i]->enabled = foundMatch;
} else // Disable the hotspot if zip mode is disabled } 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() { void MohawkEngine_Riven::checkHotspotChange() {
uint16 hotspotIndex = 0; uint16 hotspotIndex = 0;
bool foundHotspot = false; bool foundHotspot = false;
for (uint16 i = 0; i < _hotspotCount; i++) for (uint16 i = 0; i < _hotspots.size(); i++)
if (_hotspots[i].enabled && _hotspots[i].rect.contains(_eventMan->getMousePos())) { if (_hotspots[i]->enabled && _hotspots[i]->rect.contains(_eventMan->getMousePos())) {
foundHotspot = true; foundHotspot = true;
hotspotIndex = i; hotspotIndex = i;
} }
@ -508,7 +479,7 @@ void MohawkEngine_Riven::checkHotspotChange() {
if (foundHotspot) { if (foundHotspot) {
if (_curHotspot != hotspotIndex) { if (_curHotspot != hotspotIndex) {
_curHotspot = hotspotIndex; _curHotspot = hotspotIndex;
_cursor->setCursor(_hotspots[_curHotspot].mouse_cursor); _cursor->setCursor(_hotspots[_curHotspot]->mouse_cursor);
_system->updateScreen(); _system->updateScreen();
} }
} else { } else {
@ -524,12 +495,12 @@ void MohawkEngine_Riven::updateCurrentHotspot() {
} }
Common::String MohawkEngine_Riven::getHotspotName(uint16 hotspot) { 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 Common::String();
return getName(HotspotNames, _hotspots[hotspot].name_resource); return getName(HotspotNames, _hotspots[hotspot]->name_resource);
} }
void MohawkEngine_Riven::checkInventoryClick() { void MohawkEngine_Riven::checkInventoryClick() {
@ -663,13 +634,7 @@ uint32 MohawkEngine_Riven::getCurCardRMAP() {
} }
void MohawkEngine_Riven::runHotspotScript(uint16 hotspot, uint16 scriptType) { void MohawkEngine_Riven::runHotspotScript(uint16 hotspot, uint16 scriptType) {
assert(hotspot < _hotspotCount); _hotspots[hotspot]->runScript(scriptType);
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;
}
} }
void MohawkEngine_Riven::delayAndUpdate(uint32 ms) { void MohawkEngine_Riven::delayAndUpdate(uint32 ms) {

View file

@ -42,6 +42,7 @@ class RivenConsole;
class RivenSaveLoad; class RivenSaveLoad;
class RivenOptionsDialog; class RivenOptionsDialog;
class RivenCard; class RivenCard;
class RivenHotspot;
class RivenSoundManager; class RivenSoundManager;
// Riven Stack Types // Riven Stack Types
@ -86,20 +87,6 @@ extern Common::Rect *g_cathJournalRect3;
extern Common::Rect *g_trapBookRect3; extern Common::Rect *g_trapBookRect3;
extern Common::Rect *g_demoExitRect; 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 { struct ZipMode {
Common::String name; Common::String name;
uint16 id; uint16 id;
@ -148,7 +135,6 @@ private:
void handleEvents(); void handleEvents();
// Hotspot related functions and variables // Hotspot related functions and variables
uint16 _hotspotCount;
void loadHotspots(uint16); void loadHotspots(uint16);
void checkInventoryClick(); void checkInventoryClick();
bool _showHotspots; bool _showHotspots;
@ -180,10 +166,9 @@ public:
uint32 getCurCardRMAP(); uint32 getCurCardRMAP();
// Hotspot functions/variables // Hotspot functions/variables
RivenHotspot *_hotspots; Common::Array<RivenHotspot *> _hotspots;
int32 _curHotspot; int32 _curHotspot;
Common::Array<ZipMode> _zipModeData; Common::Array<ZipMode> _zipModeData;
uint16 getHotspotCount() const { return _hotspotCount; }
void runHotspotScript(uint16 hotspot, uint16 scriptType); void runHotspotScript(uint16 hotspot, uint16 scriptType);
int32 getCurHotspot() const { return _curHotspot; } int32 getCurHotspot() const { return _curHotspot; }
Common::String getHotspotName(uint16 hotspot); 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); 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 } // End of namespace Mohawk

View file

@ -95,6 +95,38 @@ private:
Common::Array<SLSTRecord> _soundList; 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 } // End of namespace Mohawk
#endif #endif

View file

@ -316,19 +316,19 @@ void RivenExternal::checkDomeSliders(uint16 resetSlidersHotspot, uint16 openDome
// Let's see if we're all matched up... // Let's see if we're all matched up...
if (_vm->_vars["adomecombo"] == _sliderState) { if (_vm->_vars["adomecombo"] == _sliderState) {
// Set the button hotspot to the open dome hotspot // Set the button hotspot to the open dome hotspot
_vm->_hotspots[resetSlidersHotspot].enabled = false; _vm->_hotspots[resetSlidersHotspot]->enabled = false;
_vm->_hotspots[openDomeHotspot].enabled = true; _vm->_hotspots[openDomeHotspot]->enabled = true;
} else { } else {
// Set the button hotspot to the reset sliders hotspot // Set the button hotspot to the reset sliders hotspot
_vm->_hotspots[resetSlidersHotspot].enabled = true; _vm->_hotspots[resetSlidersHotspot]->enabled = true;
_vm->_hotspots[openDomeHotspot].enabled = false; _vm->_hotspots[openDomeHotspot]->enabled = false;
} }
} }
void RivenExternal::checkSliderCursorChange(uint16 startHotspot) { void RivenExternal::checkSliderCursorChange(uint16 startHotspot) {
// Set the cursor based on _sliderState and what hotspot we're over // Set the cursor based on _sliderState and what hotspot we're over
for (uint16 i = 0; i < kDomeSliderSlotCount; i++) { 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))) if (_sliderState & (1 << (24 - i)))
_vm->_cursor->setCursor(kRivenOpenHandCursor); _vm->_cursor->setCursor(kRivenOpenHandCursor);
else else
@ -343,7 +343,7 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u
int16 foundSlider = -1; int16 foundSlider = -1;
for (uint16 i = 0; i < kDomeSliderSlotCount; i++) { 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 the slider is not at this hotspot, we can't do anything else
if (!(_sliderState & (1 << (24 - i)))) if (!(_sliderState & (1 << (24 - i))))
return; return;
@ -367,7 +367,7 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u
while (_vm->_system->getEventManager()->pollEvent(event)) { while (_vm->_system->getEventManager()->pollEvent(event)) {
switch (event.type) { switch (event.type) {
case Common::EVENT_MOUSEMOVE: 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 // We've moved the slider right one space
_sliderState &= ~(_sliderState & (1 << (24 - foundSlider))); _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
foundSlider++; foundSlider++;
@ -376,7 +376,7 @@ void RivenExternal::dragDomeSlider(uint16 soundId, uint16 resetSlidersHotspot, u
// Now play a click sound and redraw // Now play a click sound and redraw
_vm->_sound->playSound(soundId); _vm->_sound->playSound(soundId);
drawDomeSliders(startHotspot); 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 // We've moved the slider left one space
_sliderState &= ~(_sliderState & (1 << (24 - foundSlider))); _sliderState &= ~(_sliderState & (1 << (24 - foundSlider)));
foundSlider--; foundSlider--;
@ -414,10 +414,10 @@ void RivenExternal::drawDomeSliders(uint16 startHotspot) {
uint16 bitmapId = _vm->findResourceID(ID_TBMP, "*sliders*"); uint16 bitmapId = _vm->findResourceID(ID_TBMP, "*sliders*");
for (uint16 i = 0; i < kDomeSliderSlotCount; i++) { 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 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))) if (_sliderState & (1 << (24 - i)))
_vm->_gfx->drawImageRect(bitmapId, srcRect, dstRect); _vm->_gfx->drawImageRect(bitmapId, srcRect, dstRect);
@ -450,13 +450,13 @@ void RivenExternal::xaatrusopenbook(uint16 argc, uint16 *argv) {
// Set hotspots depending on the page // Set hotspots depending on the page
if (page == 1) { if (page == 1) {
_vm->_hotspots[1].enabled = false; _vm->_hotspots[1]->enabled = false;
_vm->_hotspots[2].enabled = false; _vm->_hotspots[2]->enabled = false;
_vm->_hotspots[3].enabled = true; _vm->_hotspots[3]->enabled = true;
} else { } else {
_vm->_hotspots[1].enabled = true; _vm->_hotspots[1]->enabled = true;
_vm->_hotspots[2].enabled = true; _vm->_hotspots[2]->enabled = true;
_vm->_hotspots[3].enabled = false; _vm->_hotspots[3]->enabled = false;
} }
// Draw the image of the page // Draw the image of the page
@ -515,13 +515,13 @@ void RivenExternal::xacathopenbook(uint16 argc, uint16 *argv) {
// Set hotspots depending on the page // Set hotspots depending on the page
if (page == 1) { if (page == 1) {
_vm->_hotspots[1].enabled = false; _vm->_hotspots[1]->enabled = false;
_vm->_hotspots[2].enabled = false; _vm->_hotspots[2]->enabled = false;
_vm->_hotspots[3].enabled = true; _vm->_hotspots[3]->enabled = true;
} else { } else {
_vm->_hotspots[1].enabled = true; _vm->_hotspots[1]->enabled = true;
_vm->_hotspots[2].enabled = true; _vm->_hotspots[2]->enabled = true;
_vm->_hotspots[3].enabled = false; _vm->_hotspots[3]->enabled = false;
} }
// Draw the image of the page // Draw the image of the page
@ -947,11 +947,11 @@ void RivenExternal::xbait(uint16 argc, uint16 *argv) {
_vm->_system->updateScreen(); _vm->_system->updateScreen();
// Set the bait if we put it on the plate // 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->_vars["bbait"] = 1;
_vm->getCurCard()->drawPicture(4); _vm->getCurCard()->drawPicture(4);
_vm->_hotspots[3].enabled = false; // Disable bait hotspot _vm->_hotspots[3]->enabled = false; // Disable bait hotspot
_vm->_hotspots[9].enabled = true; // Enable baitplate hotspot _vm->_hotspots[9]->enabled = true; // Enable baitplate hotspot
} }
} }
@ -1006,15 +1006,15 @@ void RivenExternal::xbaitplate(uint16 argc, uint16 *argv) {
_vm->_system->updateScreen(); _vm->_system->updateScreen();
// Set the bait if we put it on the plate, remove otherwise // 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->_vars["bbait"] = 1;
_vm->getCurCard()->drawPicture(4); _vm->getCurCard()->drawPicture(4);
_vm->_hotspots[3].enabled = false; // Disable bait hotspot _vm->_hotspots[3]->enabled = false; // Disable bait hotspot
_vm->_hotspots[9].enabled = true; // Enable baitplate hotspot _vm->_hotspots[9]->enabled = true; // Enable baitplate hotspot
} else { } else {
_vm->_vars["bbait"] = 0; _vm->_vars["bbait"] = 0;
_vm->_hotspots[3].enabled = true; // Enable bait hotspot _vm->_hotspots[3]->enabled = true; // Enable bait hotspot
_vm->_hotspots[9].enabled = false; // Disable baitplate 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 // Get our mouse position and adjust it to the beginning of the hotspot
Common::Point mousePos = _vm->_system->getEventManager()->getMousePos(); Common::Point mousePos = _vm->_system->getEventManager()->getMousePos();
mousePos.x -= _vm->_hotspots[3].rect.left; mousePos.x -= _vm->_hotspots[3]->rect.left;
mousePos.y -= _vm->_hotspots[3].rect.top; mousePos.y -= _vm->_hotspots[3]->rect.top;
// And now adjust it to which box we hit // And now adjust it to which box we hit
mousePos.x /= 10; mousePos.x /= 10;
@ -1995,8 +1995,8 @@ void RivenExternal::xschool280_playwhark(uint16 argc, uint16 *argv) {
} }
// Enable the correct hotspots for the movement now // Enable the correct hotspots for the movement now
_vm->_hotspots[2].enabled = !_vm->_hotspots[2].enabled; _vm->_hotspots[2]->enabled = !_vm->_hotspots[2]->enabled;
_vm->_hotspots[3].enabled = !_vm->_hotspots[3].enabled; _vm->_hotspots[3]->enabled = !_vm->_hotspots[3]->enabled;
// Update the cursor // Update the cursor
_vm->updateCurrentHotspot(); _vm->updateCurrentHotspot();
@ -2048,7 +2048,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) {
// Track down our hotspot // Track down our hotspot
// Of course, they're not in any sane order... // Of course, they're not in any sane order...
static const uint16 hotspotMap[] = { 1, 3, 2, 0 }; 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, "xbookclick:");
debug(0, "\tVideo Code = %d", argv[0]); debug(0, "\tVideo Code = %d", argv[0]);
@ -2157,9 +2157,9 @@ void RivenExternal::xooffice30_closebook(uint16 argc, uint16 *argv) {
_vm->_video->playMovieBlockingRiven(1); _vm->_video->playMovieBlockingRiven(1);
// Set the hotspots into their correct states // Set the hotspots into their correct states
_vm->_hotspots[2].enabled = false; _vm->_hotspots[2]->enabled = false;
_vm->_hotspots[5].enabled = false; _vm->_hotspots[5]->enabled = false;
_vm->_hotspots[6].enabled = true; _vm->_hotspots[6]->enabled = true;
// We now need to draw PLST 1 and refresh, but PLST 1 is // We now need to draw PLST 1 and refresh, but PLST 1 is
// drawn when refreshing anyway, so don't worry about that. // 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 // If we have hit the correct 5 buttons in a row, activate the hotspot to open up the
// telescope cover. // telescope cover.
_vm->_hotspots[9].enabled = (correctDigits == 5); _vm->_hotspots[9]->enabled = (correctDigits == 5);
} }
// Atrus' Journal and Trap Book are added to inventory // Atrus' Journal and Trap Book are added to inventory
@ -2617,9 +2617,9 @@ void RivenExternal::setMarbleHotspots() {
uint32 &marblePos = _vm->_vars[s_marbleNames[i]]; uint32 &marblePos = _vm->_vars[s_marbleNames[i]];
if (marblePos == 0) // In the receptacle if (marblePos == 0) // In the receptacle
_vm->_hotspots[i + 3].rect = _marbleBaseHotspots[i]; _vm->_hotspots[i + 3]->rect = _marbleBaseHotspots[i];
else // On the grid 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 // First, let's store the base receptacle hotspots for the marbles
if (_marbleBaseHotspots.empty()) if (_marbleBaseHotspots.empty())
for (uint16 i = 0; i < kMarbleCount; i++) 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 // Move the marble hotspots based on their position variables
setMarbleHotspots(); setMarbleHotspots();
@ -2640,7 +2640,7 @@ void RivenExternal::drawMarbles() {
if (_vm->_vars["themarble"] - 1 == i) if (_vm->_vars["themarble"] - 1 == i)
continue; continue;
Common::Rect rect = _vm->_hotspots[i + 3].rect; Common::Rect rect = _vm->_hotspots[i + 3]->rect;
// Trim the rect down a bit // Trim the rect down a bit
rect.left += 3; rect.left += 3;
rect.top += 3; rect.top += 3;
@ -2663,7 +2663,7 @@ void RivenExternal::xtakeit(uint16 argc, uint16 *argv) {
marble = 0; marble = 0;
for (uint32 i = 0; i < kMarbleCount; i++) 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; marble = i + 1;
break; break;
} }

View file

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