diff options
author | Paul Gilbert | 2019-09-01 15:28:58 -0700 |
---|---|---|
committer | Paul Gilbert | 2019-09-01 15:29:33 -0700 |
commit | b0776c8f321ebd3453bd2721a3c9e4926b283b93 (patch) | |
tree | 05e96f5536ab43670c9c09569e496132be8f3f20 /engines | |
parent | d4a98dcadbb9d374966c207be34f7a1926be26fe (diff) | |
download | scummvm-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')
-rw-r--r-- | engines/xeen/map.cpp | 42 |
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); + } } } |