MOHAWK: Start converting RivenHotspot into a class
This commit is contained in:
parent
1b062d1e39
commit
23bbf05c91
7 changed files with 164 additions and 136 deletions
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue