diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index bda91af137c9..ae07bebfad0e 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -883,15 +883,6 @@ void PrinceEngine::showTexts(Graphics::Surface *screen) { } int leftBorderText = 6; - /* - if (text._x + wideLine / 2 > _picWindowX + kNormalWidth - leftBorderText) { - text._x = _picWindowX + kNormalWidth - leftBorderText - wideLine / 2; - } - - if (text._x - wideLine / 2 < _picWindowX + leftBorderText) { - text._x = _picWindowX + leftBorderText + wideLine / 2; - } - */ if (text._x + wideLine / 2 > kNormalWidth - leftBorderText) { text._x = kNormalWidth - leftBorderText - wideLine / 2; } @@ -902,7 +893,7 @@ void PrinceEngine::showTexts(Graphics::Surface *screen) { for (uint8 i = 0; i < lines.size(); i++) { int x = text._x - getTextWidth(lines[i].c_str()) / 2; - int y = text._y - (lines.size() - i) * (_font->getFontHeight()); + int y = text._y - (lines.size() - i) * (_font->getFontHeight()); // to fix if (x < 0) { x = 0; } @@ -1673,7 +1664,10 @@ void PrinceEngine::leftMouseButton() { //_script->_scriptInfo.stdUse; } else { debug("selectedMob: %d", _selectedMob); - _script->scanMobEvents(_mobList[_selectedMob]._mask, _room->_itemUse); + int mobEvent = _script->scanMobEventsWithItem(_mobList[_selectedMob - 1]._mask, _room->_itemUse, _selectedItem); + if (mobEvent == -1) { + + } } } @@ -1723,7 +1717,20 @@ void PrinceEngine::inventoryLeftMouseButton() { //do_option } else { //use_item_on_item + int invObjUU = _script->scanMobEventsWithItem(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjUU, _selectedItem); + if (invObjUU == -1) { + int textNr = 11; + if (_selectedItem == 31 || _invMobList[_selectedMob - 1]._mask == 31) { + textNr = 20; + } + printAt(0, 216, _variaTxt->getString(textNr), kNormalWidth / 2, 100); + //loadVoice(0, 28, Common::String::format("%05d-00.WAV", text)); + //playSample(28, 0); + } else { + //store_new_pc + // storeNewPC(); + } } } else { return; @@ -1731,7 +1738,7 @@ void PrinceEngine::inventoryLeftMouseButton() { } //do_option if (_optionEnabled == 0) { - int invObjExamEvent = _script->scanMobEvents(_selectedMob, _script->_scriptInfo.invObjExam); + int invObjExamEvent = _script->scanMobEvents(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjExam); if (invObjExamEvent == -1) { // do_standard printAt(0, 216, _invMobList[_selectedMob - 1]._examText.c_str(), kNormalWidth / 2, _invExamY); @@ -1751,12 +1758,12 @@ void PrinceEngine::inventoryLeftMouseButton() { } } else if (_optionEnabled == 1) { // not_examine - int invObjUse = _script->scanMobEvents(_selectedMob, _script->_scriptInfo.invObjUse); + int invObjUse = _script->scanMobEvents(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjUse); if (invObjUse == -1) { // do_standard_use _selectedMode = 0; - _selectedItem = _selectedMob; - makeInvCursor(_selectedMob); + _selectedItem = _invMobList[_selectedMob - 1]._mask; + makeInvCursor(_invMobList[_selectedMob - 1]._mask); _currentPointerNumber = 2; changeCursor(2); //exit_normally @@ -1772,14 +1779,27 @@ void PrinceEngine::inventoryLeftMouseButton() { // not_use_inv // do_standard_give _selectedMode = 1; - _selectedItem = _selectedMob; - makeInvCursor(_selectedMob); + _selectedItem = _invMobList[_selectedMob - 1]._mask; + makeInvCursor(_invMobList[_selectedMob - 1]._mask); _currentPointerNumber = 2; changeCursor(2); //exit_normally } else { // use_item_on_item + int invObjUU = _script->scanMobEventsWithItem(_invMobList[_selectedMob - 1]._mask, _script->_scriptInfo.invObjUU, _selectedItem); + if (invObjUU == -1) { + int textNr = 11; + if (_selectedItem == 31 || _invMobList[_selectedMob - 1]._mask == 31) { + textNr = 20; + } + printAt(0, 216, _variaTxt->getString(textNr), kNormalWidth / 2, 100); + //loadVoice(0, 28, Common::String::format("%05d-00.WAV", text)); + //playSample(28, 0); + } else { + //store_new_pc + // storeNewPC(); + } } //exit_normally _selectedMob = 0; diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index 5c81ee682c69..a8efe71ca8fc 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -212,10 +212,10 @@ int Script::scanMobEvents(int mobMask, int dataEventOffset) { int32 code; do { mob = (int)READ_UINT16(&_data[dataEventOffset + i * 6]); - debug("mob: %d", mob); - code = (int)READ_UINT32(&_data[dataEventOffset + i * 6 + 2]); - debug("code: %d", code); if (mob == mobMask) { + code = (int)READ_UINT32(&_data[dataEventOffset + i * 6 + 2]); + debug("mob: %d", mob); + debug("code: %d", code); return code; } i++; @@ -223,6 +223,29 @@ int Script::scanMobEvents(int mobMask, int dataEventOffset) { return -1; } +int Script::scanMobEventsWithItem(int mobMask, int dataEventOffset, int itemNr) { + debug("mobMask: %d", mobMask); + int i = 0; + int16 mob; + int16 item; + int32 code; + do { + mob = (int)READ_UINT16(&_data[dataEventOffset + i * 8]); + if (mob == mobMask) { + item = (int)READ_UINT16(&_data[dataEventOffset + i * 8 + 2]); + if (item == itemNr) { + code = (int)READ_UINT32(&_data[dataEventOffset + i * 8 + 4]); + debug("mob: %d", mob); + debug("item: %d", item); + debug("code: %d", code); + return code; + } + } + i++; + } while (mob != -1); + return -1; +} + void Script::installSingleBackAnim(Common::Array &_backanimList, int offset) { BackgroundAnim newBackgroundAnim; diff --git a/engines/prince/script.h b/engines/prince/script.h index 489647ad914d..4a7316c9d5cb 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -140,6 +140,7 @@ class Script { bool loadAllMasks(Common::Array &maskList, int offset); int scanMobEvents(int mobMask, int dataEventOffset); + int scanMobEventsWithItem(int mobMask, int dataEventOffset, int item); const char *getString(uint32 offset) { return (const char *)(&_data[offset]); diff --git a/engines/prince/variatxt.cpp b/engines/prince/variatxt.cpp index 427044479356..fdca8c2c775b 100644 --- a/engines/prince/variatxt.cpp +++ b/engines/prince/variatxt.cpp @@ -42,15 +42,11 @@ bool VariaTxt::loadFromStream(Common::SeekableReadStream &stream) { return true; } -const char * VariaTxt::getString(uint32 stringId) { - uint32 stringOffset = READ_LE_UINT32(_data + stringId); - +const char *VariaTxt::getString(uint32 stringId) { + uint32 stringOffset = READ_LE_UINT32(_data + stringId * 4); if (stringOffset > _dataSize) { assert(false); } - - debug("VariaTxt::getString %04X %04X", stringId, stringOffset); - return (const char *)_data + stringOffset; }