diff options
-rw-r--r-- | engines/prince/prince.cpp | 77 | ||||
-rw-r--r-- | engines/prince/script.cpp | 18 | ||||
-rw-r--r-- | engines/prince/script.h | 1 |
3 files changed, 53 insertions, 43 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 35619fdc1e..1ef70d0c4b 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -84,7 +84,7 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) _invLineSkipX(2), _invLineSkipY(3), _showInventoryFlag(false), _inventoryBackgroundRemember(false), _mst_shadow(0), _mst_shadow2(0), _candleCounter(0), _invX1(53), _invY1(18), _invWidth(536), _invHeight(438), _invCurInside(false), _optionsFlag(false), _optionEnabled(0), _invExamY(120), _invMaxCount(2), _invCounter(0), - _optionsMob(0), _currentPointerNumber(1), _selectedMob(0), _selectedItem(0), _selectedMode(0), + _optionsMob(-1), _currentPointerNumber(1), _selectedMob(-1), _selectedItem(0), _selectedMode(0), _optionsWidth(210), _optionsHeight(170), _invOptionsWidth(210), _invOptionsHeight(130), _optionsStep(20), _invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(236), _optionsColor2(252), _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223), _dialogFlag(false) { @@ -400,6 +400,10 @@ bool PrinceEngine::loadLocation(uint16 locationNr) { _mainHero->_lightY = _script->getLightY(_locationNr); _mainHero->setShadowScale(_script->getShadowScale(_locationNr)); + for (uint i = 0; i < _mobList.size(); i++) { + _mobList[i]._visible = _script->getMobVisible(_room->_mobs, i); + } + clearBackAnimList(); _script->installBackAnims(_backAnimList, _room->_backAnim); @@ -421,7 +425,7 @@ void PrinceEngine::changeCursor(uint16 curId) { case 0: CursorMan.showMouse(false); _optionsFlag = 0; - _selectedMob = 0; + _selectedMob = -1; return; case 1: curSurface = _cursor1->getSurface(); @@ -810,6 +814,7 @@ int PrinceEngine::hotspot(Graphics::Surface *screen, Common::Array<Mob> &mobList for (Common::Array<Mob>::const_iterator it = mobList.begin(); it != mobList.end() ; it++) { const Mob& mob = *it; if (mob._visible != 0) { // 0 is for visible + i++; continue; } if (mob._rect.contains(mousePosCamera)) { @@ -860,11 +865,11 @@ int PrinceEngine::hotspot(Graphics::Surface *screen, Common::Array<Mob> &mobList } _font->drawString(screen, mobName, x, y, screen->w, 216); - return i + 1; + return i; } i++; } - return 0; + return -1; } void PrinceEngine::printAt(uint32 slot, uint8 color, const char *s, uint16 x, uint16 y) { @@ -1718,7 +1723,7 @@ void PrinceEngine::leftMouseButton() { } } else { _optionsMob = _selectedMob; - if (_optionsMob == 0) { + if (_optionsMob == -1) { // @@walkto - TODO return; } @@ -1738,7 +1743,7 @@ void PrinceEngine::leftMouseButton() { //@@walkto - TODO return; } else { - optionEvent = _script->getOptionStandardOffset(option - 1); + optionEvent = _script->getOptionStandardOffset(option); } } } else if (_selectedMode != 0) { @@ -1762,8 +1767,8 @@ void PrinceEngine::leftMouseButton() { } _interpreter->storeNewPC(optionEvent); _flags->setFlagValue(Flags::CURRMOB, _selectedMob); - _selectedMob = 0; - _optionsMob = 0; + _selectedMob = -1; + _optionsMob = -1; } void PrinceEngine::rightMouseButton() { @@ -1783,7 +1788,7 @@ void PrinceEngine::inventoryLeftMouseButton() { if (_optionsFlag == 1) { //check_opt - if (_selectedMob != 0) { + if (_selectedMob != -1) { //inv_check_mob if (_optionEnabled < _invOptionsNumber) { _optionsFlag = 0; @@ -1800,17 +1805,17 @@ void PrinceEngine::inventoryLeftMouseButton() { changeCursor(1); _currentPointerNumber = 1; //exit_normally - _selectedMob = 0; - _optionsMob = 0; + _selectedMob = -1; + _optionsMob = -1; return; } else { return; } } } else { - if (_selectedMob != 0) { + if (_selectedMob != -1) { if (_currentPointerNumber != 2) { - if (_invMobList[_selectedMob - 1]._mask != 29) { + if (_invMobList[_selectedMob]._mask != 29) { _optionEnabled = 0; } else { // map item @@ -1819,10 +1824,10 @@ void PrinceEngine::inventoryLeftMouseButton() { //do_option } else { //use_item_on_item - int invObjUU = _script->scanMobEventsWithItem(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjUU, _selectedItem); + int invObjUU = _script->scanMobEventsWithItem(_invMobList[_selectedMob]._mask, _script->_scriptInfo.invObjUU, _selectedItem); if (invObjUU == -1) { int textNr = 80011; // "I can't do it." - if (_selectedItem == 31 || _invMobList[_selectedMob - 1]._mask == 31) { + if (_selectedItem == 31 || _invMobList[_selectedMob]._mask == 31) { textNr = 80020; // "Nothing is happening." } _interpreter->setCurrentString(textNr); @@ -1830,13 +1835,13 @@ void PrinceEngine::inventoryLeftMouseButton() { setVoice(0, 28, 1); playSample(28, 0); //exit_normally - _selectedMob = 0; - _optionsMob = 0; + _selectedMob = -1; + _optionsMob = -1; return; } else { //store_new_pc // storeNewPC(); - _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob - 1]._mask); + _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob]._mask); //byeinv _showInventoryFlag = false; } @@ -1847,11 +1852,11 @@ void PrinceEngine::inventoryLeftMouseButton() { } //do_option if (_optionEnabled == 0) { - int invObjExamEvent = _script->scanMobEvents(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjExam); + int invObjExamEvent = _script->scanMobEvents(_invMobList[_selectedMob]._mask, _script->_scriptInfo.invObjExam); if (invObjExamEvent == -1) { // do_standard - printAt(0, 216, _invMobList[_selectedMob - 1]._examText.c_str(), kNormalWidth / 2, _invExamY); - _interpreter->setCurrentString(_invMobList[_selectedMob - 1]._mask + 70000); + printAt(0, 216, _invMobList[_selectedMob]._examText.c_str(), kNormalWidth / 2, _invExamY); + _interpreter->setCurrentString(_invMobList[_selectedMob]._mask + 70000); setVoice(0, 28, 1); playSample(28, 0); // disableuseuse @@ -1861,25 +1866,25 @@ void PrinceEngine::inventoryLeftMouseButton() { } else { //store_new_pc // storeNewPC(); - _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob - 1]._mask); + _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob]._mask); //bye_inv _showInventoryFlag = false; } } else if (_optionEnabled == 1) { // not_examine - int invObjUse = _script->scanMobEvents(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjUse); + int invObjUse = _script->scanMobEvents(_invMobList[_selectedMob]._mask, _script->_scriptInfo.invObjUse); if (invObjUse == -1) { // do_standard_use _selectedMode = 0; - _selectedItem = _invMobList[_selectedMob - 1]._mask; - makeInvCursor(_invMobList[_selectedMob - 1]._mask); + _selectedItem = _invMobList[_selectedMob]._mask; + makeInvCursor(_invMobList[_selectedMob]._mask); _currentPointerNumber = 2; changeCursor(2); //exit_normally } else { //store_new_pc // storeNewPC(); - _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob - 1]._mask); + _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob]._mask); //bye_inv _showInventoryFlag = false; } @@ -1887,17 +1892,17 @@ void PrinceEngine::inventoryLeftMouseButton() { // not_use_inv // do_standard_give _selectedMode = 1; - _selectedItem = _invMobList[_selectedMob - 1]._mask; - makeInvCursor(_invMobList[_selectedMob - 1]._mask); + _selectedItem = _invMobList[_selectedMob]._mask; + makeInvCursor(_invMobList[_selectedMob]._mask); _currentPointerNumber = 2; changeCursor(2); //exit_normally } else { // use_item_on_item - int invObjUU = _script->scanMobEventsWithItem(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjUU, _selectedItem); + int invObjUU = _script->scanMobEventsWithItem(_invMobList[_selectedMob]._mask, _script->_scriptInfo.invObjUU, _selectedItem); if (invObjUU == -1) { int textNr = 80011; // "I can't do it." - if (_selectedItem == 31 || _invMobList[_selectedMob - 1]._mask == 31) { + if (_selectedItem == 31 || _invMobList[_selectedMob]._mask == 31) { textNr = 80020; // "Nothing is happening." } _interpreter->setCurrentString(textNr); @@ -1908,14 +1913,14 @@ void PrinceEngine::inventoryLeftMouseButton() { } else { //store_new_pc // storeNewPC(); - _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob - 1]._mask); + _flags->setFlagValue(Flags::CURRMOB, _invMobList[_selectedMob]._mask); //byeinv _showInventoryFlag = false; } } //exit_normally - _selectedMob = 0; - _optionsMob = 0; + _selectedMob = -1; + _optionsMob = -1; } void PrinceEngine::inventoryRightMouseButton() { @@ -1928,7 +1933,7 @@ void PrinceEngine::enableOptions() { if (_optionsFlag != 1) { changeCursor(1); _currentPointerNumber = 1; - if (_selectedMob != 0) { + if (_selectedMob != -1) { //if (_mobType != 0x100) { Common::Point mousePos = _system->getEventManager()->getMousePos(); int x1 = mousePos.x - _optionsWidth / 2; @@ -1962,7 +1967,7 @@ void PrinceEngine::checkOptions() { Common::Point mousePos = _system->getEventManager()->getMousePos(); if (!optionsRect.contains(mousePos)) { _optionsFlag = 0; - _selectedMob = 0; + _selectedMob = -1; return; } _graph->drawAsShadowSurface(_graph->_frontScreen, _optionsX, _optionsY, _optionsPic, _graph->_shadowTable50); @@ -2009,7 +2014,7 @@ void PrinceEngine::checkInvOptions() { Common::Point mousePos = _system->getEventManager()->getMousePos(); if (!optionsRect.contains(mousePos)) { _optionsFlag = 0; - _selectedMob = 0; + _selectedMob = -1; return; } _graph->drawAsShadowSurface(_graph->_screenForInventory, _optionsX, _optionsY, _optionsPicInInventory, _graph->_shadowTable50); diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index 86d9b78cd5..3ed3adba0d 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -224,25 +224,29 @@ uint32 Script::getStartGameOffset() { return _scriptInfo.startGame; } +bool Script::getMobVisible(int roomMobOffset, int mobNr) { + return _data[roomMobOffset + mobNr]; +} + uint8 *Script::getRoomOffset(int locationNr) { return &_data[_scriptInfo.rooms + locationNr * 64]; } int32 Script::getOptionStandardOffset(int option) { switch (option) { - case 0: - return _scriptInfo.stdExamine; case 1: - return _scriptInfo.stdPickup; + return _scriptInfo.stdExamine; case 2: - return _scriptInfo.stdUse; + return _scriptInfo.stdPickup; case 3: - return _scriptInfo.stdOpen; + return _scriptInfo.stdUse; case 4: - return _scriptInfo.stdClose; + return _scriptInfo.stdOpen; case 5: - return _scriptInfo.stdTalk; + return _scriptInfo.stdClose; case 6: + return _scriptInfo.stdTalk; + case 7: return _scriptInfo.stdGive; default: error("Wrong standard option - nr %d", option); diff --git a/engines/prince/script.h b/engines/prince/script.h index f3e3b3cded..44da67a99e 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -143,6 +143,7 @@ public: int scanMobEvents(int mobMask, int dataEventOffset); int scanMobEventsWithItem(int mobMask, int dataEventOffset, int itemMask); + bool getMobVisible(int roomMobOffset, int mobNr); const char *getString(uint32 offset) { return (const char *)(&_data[offset]); |