aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen
diff options
context:
space:
mode:
authorPaul Gilbert2019-09-01 15:28:58 -0700
committerPaul Gilbert2019-09-01 15:29:33 -0700
commitb0776c8f321ebd3453bd2721a3c9e4926b283b93 (patch)
tree05e96f5536ab43670c9c09569e496132be8f3f20 /engines/xeen
parentd4a98dcadbb9d374966c207be34f7a1926be26fe (diff)
downloadscummvm-rg350-b0776c8f321ebd3453bd2721a3c9e4926b283b93.tar.gz
scummvm-rg350-b0776c8f321ebd3453bd2721a3c9e4926b283b93.tar.bz2
scummvm-rg350-b0776c8f321ebd3453bd2721a3c9e4926b283b93.zip
XEEN: Fix crash loading Great Pyramid Level 3
Diffstat (limited to 'engines/xeen')
-rw-r--r--engines/xeen/map.cpp42
1 files changed, 22 insertions, 20 deletions
diff --git a/engines/xeen/map.cpp b/engines/xeen/map.cpp
index bc5d55f1fc..9fd967b89b 100644
--- a/engines/xeen/map.cpp
+++ b/engines/xeen/map.cpp
@@ -417,8 +417,8 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
if (s.isSaving()) {
// Save objects
if (_objects.empty()) {
- MobStruct nullStruct;
- nullStruct.synchronize(s);
+ mobStruct.endOfList();
+ mobStruct.synchronize(s);
} else {
for (uint i = 0; i < _objects.size(); ++i) {
mobStruct._pos = _objects[i]._position;
@@ -432,8 +432,8 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
// Save monsters
if (_monsters.empty()) {
- MobStruct nullStruct;
- nullStruct.synchronize(s);
+ mobStruct.endOfList();
+ mobStruct.synchronize(s);
} else {
for (uint i = 0; i < _monsters.size(); ++i) {
mobStruct._pos = _monsters[i]._position;
@@ -446,17 +446,11 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
mobStruct.synchronize(s);
// Save wall items
- if (_wallItems.empty()) {
- MobStruct nullStruct;
- nullStruct._pos.x = nullStruct._pos.y = 0x80;
- nullStruct.synchronize(s);
- } else {
- for (uint i = 0; i < _wallItems.size(); ++i) {
- mobStruct._pos = _wallItems[i]._position;
- mobStruct._id = _wallItems[i]._id;
- mobStruct._direction = _wallItems[i]._direction;
- mobStruct.synchronize(s);
- }
+ for (uint i = 0; i < _wallItems.size(); ++i) {
+ mobStruct._pos = _wallItems[i]._position;
+ mobStruct._id = _wallItems[i]._id;
+ mobStruct._direction = _wallItems[i]._direction;
+ mobStruct.synchronize(s);
}
mobStruct.endOfList();
mobStruct.synchronize(s);
@@ -465,6 +459,10 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
// Load monster/obbject data and merge together with sprite Ids
// Load objects
mobStruct.synchronize(s);
+ if (mobStruct._id == -1 && mobStruct._pos.x == -1)
+ // Empty array has a blank entry
+ mobStruct.synchronize(s);
+
do {
MazeObject obj;
obj._position = mobStruct._pos;
@@ -483,7 +481,11 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
// Load monsters
mobStruct.synchronize(s);
- do {
+ if (mobStruct._id == -1 && mobStruct._pos.x == -1)
+ // Empty array has a blank entry
+ mobStruct.synchronize(s);
+
+ while (mobStruct._id != 255 || mobStruct._pos.x != -1) {
MazeMonster mon;
mon._position = mobStruct._pos;
mon._id = mobStruct._id;
@@ -507,11 +509,11 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
}
mobStruct.synchronize(s);
- } while (mobStruct._id != 255 || mobStruct._pos.x != -1);
+ }
- // Load wall items
+ // Load wall items. Unlike the previous two arrays, this has no dummy entry for an empty array
mobStruct.synchronize(s);
- do {
+ while (mobStruct._id != 255 || mobStruct._pos.x != -1) {
if (mobStruct._id < (int)_wallItemSprites.size()) {
MazeWallItem wi;
wi._position = mobStruct._pos;
@@ -524,7 +526,7 @@ void MonsterObjectData::synchronize(XeenSerializer &s, MonsterData &monsterData)
}
mobStruct.synchronize(s);
- } while (mobStruct._id != 255 || mobStruct._pos.x != -1);
+ }
}
}