diff options
-rw-r--r-- | engines/prince/prince.cpp | 60 | ||||
-rw-r--r-- | engines/prince/prince.h | 1 | ||||
-rw-r--r-- | engines/prince/script.cpp | 18 | ||||
-rw-r--r-- | engines/prince/script.h | 5 |
4 files changed, 68 insertions, 16 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 4f3be5f98e..f7cc1c7065 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -32,6 +32,7 @@ #include "common/keyboard.h" #include "common/substream.h" #include "common/str.h" +#include "common/str-array.h" #include "graphics/cursorman.h" #include "graphics/surface.h" @@ -86,8 +87,8 @@ PrinceEngine::PrinceEngine(OSystem *syst, const PrinceGameDescription *gameDesc) _invCurInside(false), _optionsFlag(false), _optionEnabled(0), _invExamY(120), _optionsMob(0), _currentPointerNumber(1), _selectedMob(0), _selectedItem(0), _selectedMode(0), _optionsWidth(210), _optionsHeight(170), _invOptionsWidth(210), _invOptionsHeight(130), _optionsStep(20), - _invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(0xFF00EC), _optionsColor2(0xFF00FC), - _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(0xFF00DC), _dialogColor2(0xFF00DF) { + _invOptionsStep(20), _optionsNumber(7), _invOptionsNumber(5), _optionsColor1(236), _optionsColor2(252), + _dialogWidth(600), _dialogHeight(0), _dialogLineSpace(10), _dialogColor1(220), _dialogColor2(223) { // Debug/console setup DebugMan.addDebugChannel(DebugChannel::kScript, "script", "Prince Script debug channel"); @@ -1645,6 +1646,38 @@ void PrinceEngine::drawInvItems() { } } +void PrinceEngine::leftMouseButton() { + if (_optionsFlag) { + if (_optionEnabled < _optionsNumber) { + _optionsFlag = 0; + } else { + return; + } + } else { + _optionsMob = _selectedMob; + if (!_selectedMob) { + // @@walkto + } + } + // edi = optionsMob + // ebp = optionsMobNumber + // selectedMob = optionsMobNumber + if (_currentPointerNumber != 2) { + //skip_use_code + } + if (_selectedMode != 0) { + //give_item + } + + if (_room->_itemUse == 0) { + //standard_useitem + //_script->_scriptInfo.stdUse; + } else { + debug("selectedMob: %d", _selectedMob); + _script->scanMobItemEvents(_mobList[_selectedMob]._mask, _room->_itemUse); + } +} + void PrinceEngine::rightMouseButton() { if (_currentPointerNumber < 2) { enableOptions(); @@ -1980,12 +2013,8 @@ void PrinceEngine::createDialogBox(Common::Array<DialogLine> &dialogData) { int amountOfDialogLines = 0; int amountOfDialogOptions = dialogData.size(); - // change this to sth simpler? - Common::Array<Common::String> lines; for (int i = 0; i < amountOfDialogOptions; i++) { - _font->wordWrapText(dialogData[i]._line, _graph->_frontScreen->w, lines); - amountOfDialogLines += lines.size(); - lines.clear(); + amountOfDialogLines += calcText(dialogData[i]._line.c_str()); } _dialogHeight = _font->getFontHeight() * amountOfDialogLines + _dialogLineSpace * (amountOfDialogOptions + 1); @@ -2048,8 +2077,10 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) { case Common::EVENT_MOUSEMOVE: break; case Common::EVENT_LBUTTONDOWN: - dialogLeftMouseButton(dialogSelected, dialogData[dialogSelectedText]._line.c_str()); - return; + if (dialogSelected != -1) { + dialogLeftMouseButton(dialogSelected, dialogData[dialogSelectedText]._line.c_str()); + return; + } break; case Common::EVENT_RBUTTONDOWN: break; @@ -2076,10 +2107,8 @@ void PrinceEngine::runDialog(Common::Array<DialogLine> &dialogData) { } void PrinceEngine::dialogLeftMouseButton(int dialogSelected, const char *s) { - if (dialogSelected != -1) { - //TODO @@showa_dialoga: - talkHero(0, s); - } + //TODO @@showa_dialoga: + talkHero(0, s); } void PrinceEngine::talkHero(int slot, const char *s) { @@ -2090,13 +2119,13 @@ void PrinceEngine::talkHero(int slot, const char *s) { int x, y; if (slot == 0) { - text._color = 0xFF00DC; // test this + text._color = 220; // test this _mainHero->_state = Hero::TALK; _mainHero->_talkTime = time; x = _mainHero->_middleX - _picWindowX; y = _mainHero->_middleY - _mainHero->_scaledFrameYSize - 10; } else { - text._color = 0xFF00DC; // test this ! + text._color = 220; // test this ! _secondHero->_state = Hero::TALK; _secondHero->_talkTime = time; x = _secondHero->_middleX - _picWindowX; @@ -2158,6 +2187,7 @@ void PrinceEngine::mainLoop() { case Common::EVENT_MOUSEMOVE: break; case Common::EVENT_LBUTTONDOWN: + leftMouseButton(); break; case Common::EVENT_RBUTTONDOWN: rightMouseButton(); diff --git a/engines/prince/prince.h b/engines/prince/prince.h index 5e04eecb1c..4ffedaed6f 100644 --- a/engines/prince/prince.h +++ b/engines/prince/prince.h @@ -343,6 +343,7 @@ public: void checkOptions(); void checkInvOptions(); + void leftMouseButton(); void rightMouseButton(); void inventoryLeftMouseButton(); void inventoryRightMouseButton(); diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index 29566b7fb7..02234adcfa 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -242,6 +242,23 @@ int Script::scanInvObjUseEvents(int mobMask) { return -1; // or sth else? } +int Script::scanMobItemEvents(int mobMask, int roomEventOffset) { + debug("mobMask: %d", mobMask); + RE tempRE; + int i = 0; + do { + tempRE._mob = (int)READ_UINT16(&_data[roomEventOffset + i * 6]); + debug("mob: %d", tempRE._mob); + tempRE._code = (int)READ_UINT32(&_data[roomEventOffset + i * 6 + 2]); + debug("code: %d", tempRE._code); + if (tempRE._mob == mobMask) { + return tempRE._code; + } + i++; + } while (tempRE._mob != -1); //?? || i <= 1 or without this (no items there) + return -1; // or sth else? +} + void Script::installSingleBackAnim(Common::Array<BackgroundAnim> &_backanimList, int offset) { BackgroundAnim newBackgroundAnim; @@ -1003,6 +1020,7 @@ void Interpreter::O_CHECKINV() { void Interpreter::O_TALKHERO() { uint16 hero = readScriptFlagValue(); debugInterpreter("O_TALKHERO hero %d", hero); + _vm->talkHero(hero, (const char *)_string); } void Interpreter::O_WAITTEXT() { diff --git a/engines/prince/script.h b/engines/prince/script.h index d53f951859..e7e444de13 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -120,6 +120,8 @@ public: int goTester; }; + ScriptInfo _scriptInfo; + bool loadFromStream(Common::SeekableReadStream &stream); template <typename T> @@ -129,6 +131,7 @@ public: } uint32 getStartGameOffset(); + uint32 getStdUseItem(); int16 getLightX(int locationNr); int16 getLightY(int locationNr); int32 getShadowScale(int locationNr); @@ -139,6 +142,7 @@ public: int scanInvObjExamEvents(int mobMask); int scanInvObjUseEvents(int mobMask); + int scanMobItemEvents(int mobMask, int roomEventOffset); const char *getString(uint32 offset) { return (const char *)(&_data[offset]); @@ -149,7 +153,6 @@ private: uint8 *_data; uint32 _dataSize; Common::Array<Room> _roomList; - ScriptInfo _scriptInfo; }; class InterpreterFlags { |