Bläddra i källkod

Polish object database, add data operations

Dydzio 7 år sedan
förälder
incheckning
82da82fbeb
2 ändrade filer med 49 tillägg och 15 borttagningar
  1. 22 14
      AI/VCAI/MapObjectsEvaluator.cpp
  2. 27 1
      AI/VCAI/MapObjectsEvaluator.h

+ 22 - 14
AI/VCAI/MapObjectsEvaluator.cpp

@@ -12,35 +12,43 @@ MapObjectsEvaluator & MapObjectsEvaluator::getInstance()
 	return *(singletonInstance.get());
 }
 
-MapObjectsEvaluator::MapObjectsEvaluator() : objectDatabase(std::map<int, std::map<int, int>>())
+MapObjectsEvaluator::MapObjectsEvaluator() : objectDatabase(std::map<AiMapObjectID, int>())
 {
 	for(auto primaryID : VLC->objtypeh->knownObjects())
 	{
-		auto newObject = std::pair<int, std::map<int, int>>(primaryID, std::map<int, int>());
 		for(auto secondaryID : VLC->objtypeh->knownSubObjects(primaryID))
 		{
 			auto handler = VLC->objtypeh->getHandlerFor(primaryID, secondaryID);
 			if(!handler->isStaticObject() && handler->getRMGInfo().value)
 			{
-				newObject.second.insert(std::pair<int,int>(secondaryID, handler->getRMGInfo().value));
+				AiMapObjectID newObjectType = AiMapObjectID(primaryID, secondaryID);
+				std::pair<AiMapObjectID, int> newObject = { newObjectType, handler->getRMGInfo().value };
+				objectDatabase.insert(newObject);
 			}
-		}
-		objectDatabase.insert(newObject);
+		}	
 	}
 }
 
 boost::optional<int> MapObjectsEvaluator::getObjectValue(int primaryID, int secondaryID)
 {
-	auto object = objectDatabase.find(primaryID);
+	AiMapObjectID internalIdentifier = AiMapObjectID(primaryID, secondaryID);
+	auto object = objectDatabase.find(internalIdentifier);
 	if(object != objectDatabase.end())
-	{
-		auto subobjects = (*object).second;
-		auto desiredObject = subobjects.find(secondaryID);
-		if(desiredObject != subobjects.end())
-		{
-			return (*desiredObject).second;
-		}
-	}
+		return object->second;
+
 	logGlobal->trace("Unknown object for AI, ID: " + std::to_string(primaryID) + ", SubID: " + std::to_string(secondaryID));
 	return boost::optional<int>();
 }
+
+void MapObjectsEvaluator::addObjectData(int primaryID, int secondaryID, int value) //by current design it updates value if already in AI database
+{
+	AiMapObjectID internalIdentifier = AiMapObjectID(primaryID, secondaryID);
+	objectDatabase.insert_or_assign(internalIdentifier, value);
+}
+
+void MapObjectsEvaluator::removeObjectData(int primaryID, int secondaryID, int value)
+{
+	AiMapObjectID internalIdentifier = AiMapObjectID(primaryID, secondaryID);
+	vstd::erase_if_present(objectDatabase, internalIdentifier);
+}
+

+ 27 - 1
AI/VCAI/MapObjectsEvaluator.h

@@ -9,15 +9,41 @@
 */
 #pragma once
 
+struct AiMapObjectID
+{
+	int primaryID;
+	int secondaryID;
+
+	AiMapObjectID(int primID, int secID) : primaryID(primID), secondaryID(secID) {};
+};
+
+inline bool operator<(const AiMapObjectID& obj1, const AiMapObjectID& obj2)
+{
+	if(obj1.primaryID != obj2.primaryID)
+		return obj1.primaryID < obj2.primaryID;
+	else
+		return obj1.secondaryID < obj2.secondaryID;
+}
+
+inline bool operator==(const AiMapObjectID& obj1, const AiMapObjectID& obj2)
+{
+	if(obj1.primaryID == obj2.primaryID)
+		return obj1.secondaryID == obj2.secondaryID;
+
+	return false;
+}
+
 class MapObjectsEvaluator
 {
 private:
-	std::map<int, std::map<int, int>> objectDatabase; //each object contains map of subobjects with their values (std::map<ObjID, std::map<SubObjID, Value>>)
+	std::map<AiMapObjectID, int> objectDatabase; //value for each object type
 	static std::unique_ptr<MapObjectsEvaluator> singletonInstance;
 
 public:
 	MapObjectsEvaluator();
 	static MapObjectsEvaluator & getInstance();
 	boost::optional<int> getObjectValue(int primaryID, int secondaryID);
+	void addObjectData(int primaryID, int secondaryID, int value);
+	void removeObjectData(int primaryID, int secondaryID, int value);
 };