MapObjectsEvaluator.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "StdInc.h"
  2. #include "MapObjectsEvaluator.h"
  3. #include "../../lib/GameConstants.h"
  4. #include "../../lib/VCMI_Lib.h"
  5. #include "../../lib/mapObjects/CObjectClassesHandler.h"
  6. MapObjectsEvaluator & MapObjectsEvaluator::getInstance()
  7. {
  8. static std::unique_ptr<MapObjectsEvaluator> singletonInstance;
  9. if(singletonInstance == nullptr)
  10. singletonInstance.reset(new MapObjectsEvaluator());
  11. return *(singletonInstance.get());
  12. }
  13. MapObjectsEvaluator::MapObjectsEvaluator() : objectDatabase(std::map<AiMapObjectID, int>())
  14. {
  15. for(auto primaryID : VLC->objtypeh->knownObjects())
  16. {
  17. for(auto secondaryID : VLC->objtypeh->knownSubObjects(primaryID))
  18. {
  19. auto handler = VLC->objtypeh->getHandlerFor(primaryID, secondaryID);
  20. if(!handler->isStaticObject() && handler->getRMGInfo().value)
  21. {
  22. AiMapObjectID newObjectType = AiMapObjectID(primaryID, secondaryID);
  23. std::pair<AiMapObjectID, int> newObject = { newObjectType, handler->getRMGInfo().value };
  24. objectDatabase.insert(newObject);
  25. }
  26. }
  27. }
  28. }
  29. boost::optional<int> MapObjectsEvaluator::getObjectValue(int primaryID, int secondaryID)
  30. {
  31. AiMapObjectID internalIdentifier = AiMapObjectID(primaryID, secondaryID);
  32. auto object = objectDatabase.find(internalIdentifier);
  33. if(object != objectDatabase.end())
  34. return object->second;
  35. logGlobal->trace("Unknown object for AI, ID: " + std::to_string(primaryID) + ", SubID: " + std::to_string(secondaryID));
  36. return boost::optional<int>();
  37. }
  38. void MapObjectsEvaluator::addObjectData(int primaryID, int secondaryID, int value) //by current design it updates value if already in AI database
  39. {
  40. AiMapObjectID internalIdentifier = AiMapObjectID(primaryID, secondaryID);
  41. objectDatabase.insert_or_assign(internalIdentifier, value);
  42. }
  43. void MapObjectsEvaluator::removeObjectData(int primaryID, int secondaryID, int value)
  44. {
  45. AiMapObjectID internalIdentifier = AiMapObjectID(primaryID, secondaryID);
  46. vstd::erase_if_present(objectDatabase, internalIdentifier);
  47. }