diff options
Diffstat (limited to 'engines/prince')
-rw-r--r-- | engines/prince/prince.cpp | 13 | ||||
-rw-r--r-- | engines/prince/script.cpp | 54 | ||||
-rw-r--r-- | engines/prince/script.h | 4 |
3 files changed, 60 insertions, 11 deletions
diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 358baad762..5fd97fca76 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -1706,7 +1706,7 @@ void PrinceEngine::leftMouseButton() { //do_option if (_currentPointerNumber != 2) { //skip_use_code - int optionScriptOffset = _script->getOptionScript(_room->_walkTo, option); + int optionScriptOffset = _room->getOptionOffset(option); if (optionScriptOffset != 0) { optionEvent = _script->scanMobEvents(_optionsMob, optionScriptOffset); } else { @@ -1717,7 +1717,7 @@ void PrinceEngine::leftMouseButton() { //@@walkto - TODO return; } else { - optionEvent = _script->getOptionScript(_script->_scriptInfo.stdExamine, option - 1); + optionEvent = _script->getOptionStandardOffset(option - 1); } } } else if (_selectedMode != 0) { @@ -1739,8 +1739,7 @@ void PrinceEngine::leftMouseButton() { optionEvent = _script->_scriptInfo.stdUseItem; } } - // eax <- return (int)READ_UINT16(&_data[optionEvent]); - // storeNewPC(); + _interpreter->storeNewPC(optionEvent); _flags->setFlagValue(Flags::CURRMOB, _selectedMob); _selectedMob = 0; _optionsMob = 0; @@ -1903,11 +1902,9 @@ void PrinceEngine::inventoryRightMouseButton() { void PrinceEngine::enableOptions() { if (_optionsFlag != 1) { - //changeCursor(1); - //_currentPointerNumber = 1; + changeCursor(1); + _currentPointerNumber = 1; if (_selectedMob != 0) { - changeCursor(1); - _currentPointerNumber = 1; //if (_mobType != 0x100) { Common::Point mousePos = _system->getEventManager()->getMousePos(); int x1 = mousePos.x - _optionsWidth / 2; diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index 461dbb12df..68508a89de 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -63,6 +63,29 @@ bool Room::loadRoom(byte *roomData) { return true; } +int Room::getOptionOffset(int option) { + switch (option) { + case 0: + return _walkTo; + case 1: + return _examine; + case 2: + return _pickup; + case 3: + return _use; + case 4: + return _pushOpen; + case 5: + return _pullClose; + case 6: + return _talk; + case 7: + return _give; + default: + error("Wrong option - nr %d", option); + } +} + /* void Room::loadMobs(Common::SeekableReadStream &stream) { debug("loadMobs %d", stream.pos()); @@ -205,8 +228,25 @@ uint8 *Script::getRoomOffset(int locationNr) { return &_data[_scriptInfo.rooms + locationNr * 64]; } -int Script::getOptionScript(int offset, int option) { - return (int)READ_UINT16(&_data[offset + option * 4]); +int32 Script::getOptionStandardOffset(int option) { + switch (option) { + case 0: + return _scriptInfo.stdExamine; + case 1: + return _scriptInfo.stdPickup; + case 2: + return _scriptInfo.stdUse; + case 3: + return _scriptInfo.stdOpen; + case 4: + return _scriptInfo.stdClose; + case 5: + return _scriptInfo.stdTalk; + case 6: + return _scriptInfo.stdGive; + default: + error("Wrong standard option - nr %d", option); + } } int Script::scanMobEvents(int mobMask, int dataEventOffset) { @@ -456,6 +496,14 @@ uint32 Interpreter::step(uint32 opcodePC) { return _currentInstruction; } +void Interpreter::storeNewPC(int opcodePC) { + if (_flags->getFlagValue(Flags::GETACTION) == 1) { + _flags->setFlagValue(Flags::GETACTIONDATA, opcodePC); + opcodePC = _flags->getFlagValue(Flags::GETACTIONBACK); + } + _fgOpcodePC = opcodePC; +} + template <typename T> T Interpreter::readScript() { T data = _script->read<T>(_currentInstruction); @@ -763,6 +811,8 @@ void Interpreter::O_SETSTRING() { // FIXME: Make it better ;) if (offset >= 80000) { debugInterpreter("GetVaria %s", _vm->_variaTxt->getString(offset - 80000)); + _string = (const byte *)_vm->_variaTxt->getString(offset - 80000); + _currentString = offset - 80000; // TODO - wrong sample } else if (offset < 2000) { uint32 of = READ_LE_UINT32(_vm->_talkTxt+offset*4); diff --git a/engines/prince/script.h b/engines/prince/script.h index 28e3be4ebc..19c64ba5b6 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -68,6 +68,7 @@ public: bool loadFromStream(Common::SeekableReadStream &stream); bool loadRoom(byte *roomData); + int getOptionOffset(int option); private: @@ -135,7 +136,7 @@ public: int16 getLightY(int locationNr); int32 getShadowScale(int locationNr); uint8 *getRoomOffset(int locationNr); - int32 getOptionScript(int offset, int option); + int32 getOptionStandardOffset(int option); void installBackAnims(Common::Array<BackgroundAnim> &_backanimList, int offset); void installSingleBackAnim(Common::Array<BackgroundAnim> &_backanimList, int offset); bool loadAllMasks(Common::Array<Mask> &maskList, int offset); @@ -177,6 +178,7 @@ public: void stopBg() { _bgOpcodePC = 0; } void step(); + void storeNewPC(int opcodePC); private: PrinceEngine *_vm; |