Browse Source

Fix loading of SoD & later maps

Ivan Savenko 6 months ago
parent
commit
f3a57f754c
3 changed files with 10 additions and 4 deletions
  1. 6 0
      lib/mapping/CMap.cpp
  2. 1 0
      lib/mapping/CMap.h
  3. 3 4
      lib/mapping/MapFormatH3M.cpp

+ 6 - 0
lib/mapping/CMap.cpp

@@ -946,4 +946,10 @@ void CMap::saveCompatibilityAddMissingArtifact(std::shared_ptr<CArtifactInstance
 	artInstances.push_back(artifact);
 }
 
+ObjectInstanceID CMap::allocateUniqueInstanceID()
+{
+	objects.push_back(nullptr);
+	return ObjectInstanceID(objects.size() - 1);
+}
+
 VCMI_LIB_NAMESPACE_END

+ 1 - 0
lib/mapping/CMap.h

@@ -110,6 +110,7 @@ public:
 	void removeArtifactInstance(CArtifactSet & set, const ArtifactPosition & slot);
 
 	void generateUniqueInstanceName(CGObjectInstance * target);
+	ObjectInstanceID allocateUniqueInstanceID();
 
 	///Use only this method when creating new map object instances
 	void addNewObject(std::shared_ptr<CGObjectInstance> obj);

+ 3 - 4
lib/mapping/MapFormatH3M.cpp

@@ -1921,7 +1921,6 @@ std::shared_ptr<CGObjectInstance> CMapLoaderH3M::readObject(MapObjectID id, MapO
 void CMapLoaderH3M::readObjects()
 {
 	uint32_t objectsCount = reader->readUInt32();
-	ObjectInstanceID nextObjectID(0);
 
 	for(uint32_t i = 0; i < objectsCount; ++i)
 	{
@@ -1936,14 +1935,15 @@ void CMapLoaderH3M::readObjects()
 		auto originalSubID = originalTemplate->subid;
 		reader->skipZero(5);
 
-		auto newObject = readObject(originalID, originalSubID, remappedTemplate, mapPosition, nextObjectID);
+		ObjectInstanceID newObjectID = map->allocateUniqueInstanceID();
+		auto newObject = readObject(originalID, originalSubID, remappedTemplate, mapPosition, newObjectID);
 
 		if(!newObject)
 			continue;
 
 		newObject->setAnchorPos(mapPosition);
 		newObject->ID = remappedTemplate->id;
-		newObject->id = nextObjectID;
+		newObject->id = newObjectID;
 		if(newObject->ID != Obj::HERO && newObject->ID != Obj::HERO_PLACEHOLDER && newObject->ID != Obj::PRISON)
 		{
 			newObject->subID = remappedTemplate->subid;
@@ -1955,7 +1955,6 @@ void CMapLoaderH3M::readObjects()
 
 		map->generateUniqueInstanceName(newObject.get());
 		map->addNewObject(newObject);
-		nextObjectID.num += 1;
 	}
 
 	map->postInitialize();