aboutsummaryrefslogtreecommitdiff
path: root/engines/prince
diff options
context:
space:
mode:
Diffstat (limited to 'engines/prince')
-rw-r--r--engines/prince/prince.cpp13
-rw-r--r--engines/prince/script.cpp54
-rw-r--r--engines/prince/script.h4
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;