diff options
-rw-r--r-- | engines/prince/graphics.cpp | 23 | ||||
-rw-r--r-- | engines/prince/graphics.h | 1 | ||||
-rw-r--r-- | engines/prince/object.cpp | 6 | ||||
-rw-r--r-- | engines/prince/object.h | 4 | ||||
-rw-r--r-- | engines/prince/prince.cpp | 36 | ||||
-rw-r--r-- | engines/prince/script.cpp | 52 | ||||
-rw-r--r-- | engines/prince/script.h | 6 |
7 files changed, 79 insertions, 49 deletions
diff --git a/engines/prince/graphics.cpp b/engines/prince/graphics.cpp index 9b8c874642..195c61b5f0 100644 --- a/engines/prince/graphics.cpp +++ b/engines/prince/graphics.cpp @@ -230,6 +230,29 @@ void GraphicsMan::drawAsShadowDrawNode(Graphics::Surface *screen, DrawNode *draw } } +void GraphicsMan::drawBackSpriteDrawNode(Graphics::Surface *screen, DrawNode *drawNode) { + byte *src1 = (byte *)drawNode->s->getBasePtr(0, 0); + byte *dst1 = (byte *)screen->getBasePtr(drawNode->posX, drawNode->posY); + + for (int y = 0; y < drawNode->s->h; y++) { + byte *src2 = src1; + byte *dst2 = dst1; + for (int x = 0; x < drawNode->s->w; x++, src2++, dst2++) { + if (*src2 != 255) { + if (x + drawNode->posX < screen->w && x + drawNode->posX >= 0) { + if (y + drawNode->posY < screen->h && y + drawNode->posY >= 0) { + if (*dst2 == 255) { + *dst2 = *src2; + } + } + } + } + } + src1 += drawNode->s->pitch; + dst1 += screen->pitch; + } +} + void GraphicsMan::drawPixel(Graphics::Surface *screen, int32 posX, int32 posY) { byte *dst = (byte *)screen->getBasePtr(posX, posY); *dst = 255; diff --git a/engines/prince/graphics.h b/engines/prince/graphics.h index e5d0ea99ad..f4e7f37d89 100644 --- a/engines/prince/graphics.h +++ b/engines/prince/graphics.h @@ -52,6 +52,7 @@ public: static void drawTransparentDrawNode(Graphics::Surface *screen, DrawNode *drawNode); static void drawAsShadowDrawNode(Graphics::Surface *screen, DrawNode *drawNode); static void drawMaskDrawNode(Graphics::Surface *screen, DrawNode *drawNode); + static void drawBackSpriteDrawNode(Graphics::Surface *screen, DrawNode *drawNode); byte getBlendTableColor(byte pixelColor, byte backgroundPixelColor, byte *blendTable); diff --git a/engines/prince/object.cpp b/engines/prince/object.cpp index c8cdc75083..7e4bd1bbee 100644 --- a/engines/prince/object.cpp +++ b/engines/prince/object.cpp @@ -68,7 +68,7 @@ bool Object::loadFromStream(Common::SeekableReadStream &stream) { if (x == 0xFFFF) return false; _x = x; - _y = stream.readUint16LE(); + _y = stream.readSint16LE(); // skull mini-game has some signed y coords const Common::String obStreamName = Common::String::format("OB%02d", stream.readUint16LE()); Common::SeekableReadStream *obStream = SearchMan.createReadStreamForMember(obStreamName); @@ -87,7 +87,7 @@ bool Object::loadFromStream(Common::SeekableReadStream &stream) { return true; } -void Object::setData(AttrId dataId, uint16 value) { +void Object::setData(AttrId dataId, int32 value) { switch (dataId) { case kObjectX: _x = value; @@ -100,7 +100,7 @@ void Object::setData(AttrId dataId, uint16 value) { } } -uint16 Object::getData(AttrId dataId) { +int32 Object::getData(AttrId dataId) { switch (dataId) { case kObjectX: return _x; diff --git a/engines/prince/object.h b/engines/prince/object.h index 4a67336c5f..31e88ac9e4 100644 --- a/engines/prince/object.h +++ b/engines/prince/object.h @@ -57,8 +57,8 @@ public: bool loadFromStream(Common::SeekableReadStream &stream); Graphics::Surface *getSurface() const { return _surface; } - uint16 getData(AttrId dataId); - void setData(AttrId dataId, uint16 value); + int32 getData(AttrId dataId); + void setData(AttrId dataId, int32 value); private: void loadSurface(Common::SeekableReadStream &stream); diff --git a/engines/prince/prince.cpp b/engines/prince/prince.cpp index 3f0527fc02..17517992be 100644 --- a/engines/prince/prince.cpp +++ b/engines/prince/prince.cpp @@ -1710,25 +1710,25 @@ void PrinceEngine::showObjects() { if (objSurface != nullptr) { if (spriteCheck(objSurface->w, objSurface->h, _objList[nr]->_x, _objList[nr]->_y)) { - if ((_objList[i]->_flags & 0x0200) == 0) { - int destX = _objList[nr]->_x - _picWindowX; - int destY = _objList[nr]->_y - _picWindowY; - DrawNode newDrawNode; - newDrawNode.posX = destX; - newDrawNode.posY = destY; - newDrawNode.posZ = _objList[nr]->_z; - newDrawNode.width = 0; - newDrawNode.height = 0; - newDrawNode.s = objSurface; - newDrawNode.originalRoomSurface = nullptr; - newDrawNode.data = nullptr; - newDrawNode.freeSurfaceSMemory = false; - newDrawNode.drawFunction = &_graph->drawTransparentDrawNode; - _drawNodeList.push_back(newDrawNode); + int destX = _objList[nr]->_x - _picWindowX; + int destY = _objList[nr]->_y - _picWindowY; + DrawNode newDrawNode; + newDrawNode.posX = destX; + newDrawNode.posY = destY; + newDrawNode.posZ = _objList[nr]->_z; + newDrawNode.width = 0; + newDrawNode.height = 0; + newDrawNode.s = objSurface; + newDrawNode.originalRoomSurface = nullptr; + newDrawNode.data = nullptr; + newDrawNode.freeSurfaceSMemory = false; + + if ((_objList[nr]->_flags & 0x2000)) { + newDrawNode.drawFunction = &_graph->drawBackSpriteDrawNode; } else { - // showBackSprite(); - error("showBackSprite() - showObjects"); + newDrawNode.drawFunction = &_graph->drawTransparentDrawNode; } + _drawNodeList.push_back(newDrawNode); } if ((_objList[nr]->_flags & 1)) { @@ -2546,7 +2546,7 @@ void PrinceEngine::enableOptions(bool checkType) { _currentPointerNumber = 1; if (_selectedMob != -1) { if (checkType) { - if (_mobList[_selectedMob]._type == 0x100) { + if (_mobList[_selectedMob]._type & 0x100) { return; } } diff --git a/engines/prince/script.cpp b/engines/prince/script.cpp index 57d0b8a770..9dbab2f7e4 100644 --- a/engines/prince/script.cpp +++ b/engines/prince/script.cpp @@ -391,11 +391,11 @@ void InterpreterFlags::resetAllFlags() { memset(_flags, 0, sizeof(_flags)); } -void InterpreterFlags::setFlagValue(Flags::Id flagId, uint32 value) { +void InterpreterFlags::setFlagValue(Flags::Id flagId, int32 value) { _flags[(uint32)flagId - kFlagMask] = value; } -uint32 InterpreterFlags::getFlagValue(Flags::Id flagId) { +int32 InterpreterFlags::getFlagValue(Flags::Id flagId) { return _flags[(uint32)flagId - kFlagMask]; } @@ -522,7 +522,7 @@ T Interpreter::readScript() { return data; } -uint16 Interpreter::readScriptFlagValue() { +int16 Interpreter::readScriptFlagValue() { uint16 value = readScript<uint16>(); if (value & InterpreterFlags::kFlagMask) { return _flags->getFlagValue((Flags::Id)value); @@ -806,7 +806,7 @@ void Interpreter::O_CHANGEANIMTYPE() { void Interpreter::O__SETFLAG() { Flags::Id flagId = readScriptFlagId(); - uint16 value = readScriptFlagValue(); + int16 value = readScriptFlagValue(); _flags->setFlagValue((Flags::Id)(flagId), value); debugInterpreter("O__SETFLAG 0x%04X (%s) = %d", flagId, Flags::getFlagName(flagId), value); } @@ -844,7 +844,7 @@ void Interpreter::O_EXIT() { void Interpreter::O_ADDFLAG() { Flags::Id flagId = readScriptFlagId(); - uint16 value = readScriptFlagValue(); + int16 value = readScriptFlagValue(); _flags->setFlagValue(flagId, _flags->getFlagValue(flagId) + value); if (_flags->getFlagValue(flagId)) { _result = 1; @@ -864,7 +864,7 @@ void Interpreter::O_TALKANIM() { void Interpreter::O_SUBFLAG() { Flags::Id flagId = readScriptFlagId(); - uint16 value = readScriptFlagValue(); + int16 value = readScriptFlagValue(); _flags->setFlagValue(flagId, _flags->getFlagValue(flagId) - value); if (_flags->getFlagValue(flagId)) { _result = 1; @@ -894,7 +894,7 @@ void Interpreter::O_SETSTRING() { void Interpreter::O_ANDFLAG() { Flags::Id flagId = readScriptFlagId(); - uint16 value = readScriptFlagValue(); + int16 value = readScriptFlagValue(); _flags->setFlagValue(flagId, _flags->getFlagValue(flagId) & value); if (_flags->getFlagValue(flagId)) { _result = 1; @@ -915,7 +915,7 @@ void Interpreter::O_GETMOBDATA() { void Interpreter::O_ORFLAG() { Flags::Id flagId = readScriptFlagId(); - uint16 value = readScriptFlagValue(); + int16 value = readScriptFlagValue(); _flags->setFlagValue(flagId, _flags->getFlagValue(flagId) | value); if (_flags->getFlagValue(flagId)) { _result = 1; @@ -935,7 +935,7 @@ void Interpreter::O_SETMOBDATA() { void Interpreter::O_XORFLAG() { Flags::Id flagId = readScriptFlagId(); - uint16 value = readScriptFlagValue(); + int16 value = readScriptFlagValue(); _flags->setFlagValue(flagId, _flags->getFlagValue(flagId) ^ value); if (_flags->getFlagValue(flagId)) { _result = 1; @@ -1113,8 +1113,8 @@ void Interpreter::O_RUNACTION() { void Interpreter::O_COMPAREHI() { Flags::Id flag = readScriptFlagId(); - uint16 value = readScriptFlagValue(); - uint16 flagValue = _flags->getFlagValue(flag); + int16 value = readScriptFlagValue(); + int16 flagValue = _flags->getFlagValue(flag); if (flagValue > value) { _result = 0; } else { @@ -1125,8 +1125,8 @@ void Interpreter::O_COMPAREHI() { void Interpreter::O_COMPARELO() { Flags::Id flag = readScriptFlagId(); - uint16 value = readScriptFlagValue(); - uint16 flagValue = _flags->getFlagValue(flag); + int16 value = readScriptFlagValue(); + int16 flagValue = _flags->getFlagValue(flag); if (flagValue < value) { _result = 0; } else { @@ -1374,19 +1374,25 @@ void Interpreter::O_SETSTRINGOFFSET() { void Interpreter::O_GETOBJDATA() { Flags::Id flag = readScriptFlagId(); - uint16 obj = readScriptFlagValue(); - int16 objOffset = readScriptFlagValue(); - int16 value = _vm->_objList[obj]->getData((Object::AttrId)objOffset); - _flags->setFlagValue(flag, value); - debugInterpreter("O_GETOBJDATA flag %d, obj %d, objOffset %d", flag, obj, objOffset); + uint16 slot = readScriptFlagValue(); + uint16 objOffset = readScriptFlagValue(); + int nr = _vm->_objSlot[slot]; + if (nr != 0xFF) { + int16 value = _vm->_objList[nr]->getData((Object::AttrId)objOffset); + _flags->setFlagValue(flag, value); + } + debugInterpreter("O_GETOBJDATA flag %d, objSlot %d, objOffset %d", flag, slot, objOffset); } void Interpreter::O_SETOBJDATA() { - uint16 obj = readScriptFlagValue(); - int16 objOffset = readScriptFlagValue(); - uint16 value = readScriptFlagValue(); - _vm->_objList[obj]->setData((Object::AttrId)objOffset, value); - debugInterpreter("O_SETOBJDATA obj %d, objOffset %d, value %d", obj, objOffset, value); + uint16 slot = readScriptFlagValue(); + uint16 objOffset = readScriptFlagValue(); + int16 value = readScriptFlagValue(); + int nr = _vm->_objSlot[slot]; + if (nr != 0xFF) { + _vm->_objList[nr]->setData((Object::AttrId)objOffset, value); + } + debugInterpreter("O_SETOBJDATA objSlot %d, objOffset %d, value %d", slot, objOffset, value); } // Not used in script diff --git a/engines/prince/script.h b/engines/prince/script.h index 6ebef3d94b..57f9268598 100644 --- a/engines/prince/script.h +++ b/engines/prince/script.h @@ -175,8 +175,8 @@ class InterpreterFlags { public: InterpreterFlags(); - void setFlagValue(Flags::Id flag, uint32 value); - uint32 getFlagValue(Flags::Id flag); + void setFlagValue(Flags::Id flag, int32 value); + int32 getFlagValue(Flags::Id flag); void resetAllFlags(); @@ -243,7 +243,7 @@ private: // Helper functions uint32 step(uint32 opcodePC); - uint16 readScriptFlagValue(); + int16 readScriptFlagValue(); Flags::Id readScriptFlagId(); int checkSeq(byte *string); |