[Scummvm-git-logs] scummvm master -> d5af3f309b1962e2fda2018bc38e129a7ec8ae12

dreammaster noreply at scummvm.org
Tue Jan 10 00:53:49 UTC 2023


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
f493655c52 XEEN: Fixes for Vertigo well crash
d5af3f309b XEEN: Workaround for corrupt mine Alpha monsters in Clouds


Commit: f493655c52c53b1c03744e18a3ce282a0dbc3c26
    https://github.com/scummvm/scummvm/commit/f493655c52c53b1c03744e18a3ce282a0dbc3c26
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-01-09T14:53:01-10:00

Commit Message:
XEEN: Fixes for Vertigo well crash

Changed paths:
    engines/xeen/scripts.cpp
    engines/xeen/sprites.cpp
    engines/xeen/sprites.h


diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp
index 5d709d28e18..db5348ea49a 100644
--- a/engines/xeen/scripts.cpp
+++ b/engines/xeen/scripts.cpp
@@ -1195,7 +1195,7 @@ bool Scripts::cmdAlterHed(ParamsIterator &params) {
 	Map &map = *_vm->_map;
 	Party &party = *_vm->_party;
 
-	HeadData::HeadEntry &he = map._headData[party._mazePosition.y][party._mazePosition.x];
+	HeadData::HeadEntry &he = map._headData[party._mazePosition.y % 16][party._mazePosition.x % 16];
 	he._left = params.readByte();
 	he._right = params.readByte();
 
diff --git a/engines/xeen/sprites.cpp b/engines/xeen/sprites.cpp
index 9aa097b565c..6a88aeeda5a 100644
--- a/engines/xeen/sprites.cpp
+++ b/engines/xeen/sprites.cpp
@@ -160,10 +160,13 @@ void SpriteResource::draw(XSurface &dest, int frame, const Common::Point &destPo
 		break;
 	}
 
-	// Sprites can consist of separate background & foreground
-	drawer->draw(dest, _index[frame]._offset1, destPos, r, flags, scale);
-	if (_index[frame]._offset2)
-		drawer->draw(dest, _index[frame]._offset2, destPos, r, flags, scale);
+	// WORKAROUND: Crash clicking Vertigo well in Clouds
+	if (frame < (int)_index.size()) {
+		// Sprites can consist of separate background & foreground
+		drawer->draw(dest, _index[frame]._offset1, destPos, r, flags, scale);
+		if (_index[frame]._offset2)
+			drawer->draw(dest, _index[frame]._offset2, destPos, r, flags, scale);
+	}
 
 	delete drawer;
 }
diff --git a/engines/xeen/sprites.h b/engines/xeen/sprites.h
index 7e067d409cd..e8497e8a803 100644
--- a/engines/xeen/sprites.h
+++ b/engines/xeen/sprites.h
@@ -182,12 +182,12 @@ public:
  */
 class SpriteDrawer {
 private:
-	byte *_data;
-	size_t _filesize;
+	byte *_data = nullptr;
+	size_t _filesize = 0;
 protected:
-	byte *_destTop, *_destBottom;
-	byte *_destLeft, *_destRight;
-	int _pitch;
+	byte *_destTop = nullptr, *_destBottom = nullptr;
+	byte *_destLeft = nullptr, *_destRight = nullptr;
+	int _pitch = 0;
 private:
 	/**
 	 * Scale a co-ordinate value based on the passed scaling mask
@@ -223,7 +223,7 @@ public:
 
 class SpriteDrawer1 : public SpriteDrawer {
 private:
-	byte _offset, _mask;
+	byte _offset = 0, _mask = 0;
 protected:
 	/**
 	 * Output a pixel
@@ -242,8 +242,8 @@ public:
  */
 class SpriteDrawer2 : public SpriteDrawer {
 private:
-	uint16 _mask1, _mask2;
-	uint16 _random1, _random2;
+	uint16 _mask1 = 0, _mask2 = 0;
+	uint16 _random1 = 0, _random2 = 0;
 private:
 	/**
 	 * Output a pixel
@@ -261,9 +261,9 @@ public:
  */
 class SpriteDrawer3 : public SpriteDrawer {
 private:
-	uint16 _offset, _mask;
+	uint16 _offset = 0, _mask = 0;
 	byte _palette[256 * 3];
-	bool _hasPalette;
+	bool _hasPalette = false;
 private:
 	/**
 	 * Output a pixel
@@ -278,7 +278,7 @@ public:
 
 class SpriteDrawer4 : public SpriteDrawer {
 private:
-	byte _threshold;
+	byte _threshold = 0;
 protected:
 	/**
 	 * Output a pixel
@@ -296,7 +296,7 @@ public:
  */
 class SpriteDrawer5 : public SpriteDrawer {
 private:
-	uint16 _threshold, _random1, _random2;
+	uint16 _threshold = 0, _random1 = 0, _random2 = 0;
 protected:
 	/**
 	 * Output a pixel
@@ -311,7 +311,7 @@ public:
 
 class SpriteDrawer6 : public SpriteDrawer {
 private:
-	byte _mask;
+	byte _mask = 0;
 protected:
 	/**
 	 * Output a pixel


Commit: d5af3f309b1962e2fda2018bc38e129a7ec8ae12
    https://github.com/scummvm/scummvm/commit/d5af3f309b1962e2fda2018bc38e129a7ec8ae12
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2023-01-09T14:53:02-10:00

Commit Message:
XEEN: Workaround for corrupt mine Alpha monsters in Clouds

Changed paths:
    NEWS.md
    engines/xeen/map.cpp


diff --git a/NEWS.md b/NEWS.md
index ea159799be3..5f9e699ad1c 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -146,6 +146,9 @@ For a more comprehensive changelog of the latest experimental code, see:
    - Adjust cursor to behave closer to the original.
    - Adjust item quantity slider to behave closer to the original.
 
+ Xeen:
+   - Several crash fixes for Clouds of Xeen
+
  3DS port:
    - Update relocation parser to support PREL31 that are emitted by new compiler.
    - Do more autoconfiguration in ./configure.
diff --git a/engines/xeen/map.cpp b/engines/xeen/map.cpp
index 5a7a511bb96..2f520ad2bbb 100644
--- a/engines/xeen/map.cpp
+++ b/engines/xeen/map.cpp
@@ -479,7 +479,7 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
 			obj._direction = mobStruct._direction;
 			obj._frame = 100;
 
-			if (obj._id < (int)_objectSprites.size()) {
+			if (obj._id >= 0 && obj._id < (int)_objectSprites.size()) {
 				obj._spriteId = _objectSprites[obj._id]._spriteId;
 				obj._sprites = &_objectSprites[obj._id]._sprites;
 			}
@@ -509,6 +509,12 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
 
 			if (mon._id < (int)_monsterSprites.size()) {
 				mon._spriteId = _monsterSprites[mon._id]._spriteId;
+
+				// WORKAROUND: For Clouds-only mine Alpha, the monster list is invalid
+				if (_vm->getGameID() == GType_Clouds && mon._spriteId == 105
+					&& monsterData.size() == 91)
+					return;
+
 				mon._sprites = &_monsterSprites[mon._id]._sprites;
 				mon._attackSprites = &_monsterSprites[mon._id]._attackSprites;
 				mon._monsterData = &monsterData[mon._spriteId];




More information about the Scummvm-git-logs mailing list