aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlukaslw2014-07-30 19:54:39 +0200
committerlukaslw2014-07-30 19:54:39 +0200
commit93a552c26d2323321356ddb9cdd3400769100617 (patch)
treecd6a1af9d04a1eb94fe2e9140837f1237d4d8aa6
parent956b98903fe704f0388538741c539567476bd745 (diff)
downloadscummvm-rg350-93a552c26d2323321356ddb9cdd3400769100617.tar.gz
scummvm-rg350-93a552c26d2323321356ddb9cdd3400769100617.tar.bz2
scummvm-rg350-93a552c26d2323321356ddb9cdd3400769100617.zip
PRINCE: Skull mini-game fix
-rw-r--r--engines/prince/graphics.cpp23
-rw-r--r--engines/prince/graphics.h1
-rw-r--r--engines/prince/object.cpp6
-rw-r--r--engines/prince/object.h4
-rw-r--r--engines/prince/prince.cpp36
-rw-r--r--engines/prince/script.cpp52
-rw-r--r--engines/prince/script.h6
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);