CSC3224_Computer_Games_Development / GameEngine / Engine_Resource_Management / EntityManagement.cpp
EntityManagement.cpp
Raw
#include "EntityManagement.h"

EntityManagement::EntityManagement() : mapOfEntities(), entityID(0), entityMessageSystemEvent()
{
	entityMessageSystemEvent.reserve(MAX_NO_OF_ENTITIES);
	// Constructor - Initialize all Eninge Messages 
	for (auto i = 0; i < static_cast<int>(MessageSystemEventType::END_TYPE); ++i)
	{
		mapOfEntities.emplace(i, messageSystemEventVector());
	}
}
// Destructor
EntityManagement::~EntityManagement()
{
	auto unorderedSet = std::unordered_set<uint32_t>();
	for (auto EventType : mapOfEntities)
	{
		for (auto it = EventType.second.begin(); it != EventType.second.end(); ++it)
		{
			delete it->first;
			if (unorderedSet.find(it->second->getEntityID()) != unorderedSet.end())
			{
				unorderedSet.insert(it->second->getEntityID());
				delete it->second;
			}
		}
	}
}
// Create Entity at default position
Entity* EntityManagement::createEntity(std::string inputTextureID, sf::IntRect inputEntityRectangle)
{
	auto spriteRectangle = new SpriteRectangle(inputTextureID, inputEntityRectangle);
	return createEntity(spriteRectangle);
}
// Create Entity at default position
Entity* EntityManagement::createEntity(SpriteRectangle* inputSpriteRectangle)
{
	auto entity = new Entity(getNextEntityID(), *this, *inputSpriteRectangle);
	std::cout << "Creating Entity Nr: " << entity->getEntityID() << std::endl;
	mapOfEntities.find(static_cast<int>(MessageSystemEventType::SPRITE_RECTANGLE_TYPE))->second.push_back(std::make_pair(inputSpriteRectangle, entity));
	entityMessageSystemEvent.emplace(entity->getEntityID(), std::vector<MessageSystemEvent*>{inputSpriteRectangle});
	return entity;
}
// Destroy Entity
void EntityManagement::destroyEntity(Entity* inputEntity)
{
	inputEntity->isDeleted = true;
	for (auto engineEventType : mapOfEntities)
	{
		std::pair<MessageSystemEvent*, Entity*>* matches[MAX_NR_OF_ENGINE_EventS];
		for (auto e : matches)
		{
			delete e->first;
			engineEventType.second.clear(); //

		}
	}
	entityMessageSystemEvent.erase(inputEntity->getEntityID());
	std::cout << "Destroyed Entity Nr: " << inputEntity->getEntityID() << std::endl;
	delete inputEntity;
}
// Add Message to Entity
void EntityManagement::addMessageSystemEvent(Entity& inputEntity, MessageSystemEvent& inputMessageSystemEvent)
{
	std::cout << "Adding Message System Event type: " << inputMessageSystemEvent.getTypeValue() << " to Entity: " << inputEntity.getEntityID() << std::endl;
	mapOfEntities.find(inputMessageSystemEvent.getTypeValue())->second.push_back(std::make_pair(&inputMessageSystemEvent, &inputEntity));
	entityMessageSystemEvent.find(inputEntity.getEntityID())->second.push_back(&inputMessageSystemEvent);
}
// Remove Message from Entity
void EntityManagement::removeMessageSystemEvent(Entity& inputEntity, MessageSystemEvent& inputMessageSystemEvent)
{
	auto entityMap = mapOfEntities.find(inputMessageSystemEvent.getTypeValue())->second;
	auto iterator = std::find_if(entityMap.begin(), entityMap.end(), [&inputEntity, &inputMessageSystemEvent](std::pair<MessageSystemEvent*, Entity*> entityMessageSystemEvent)
	{
		return (inputEntity == *(entityMessageSystemEvent.second)) && (&inputMessageSystemEvent == entityMessageSystemEvent.first);
	});
	if (iterator != entityMap.end())
	{
		std::cout << "Deleting Message System " << typeid(iterator->first).name() << " Event type from Entity: " << iterator->second->getEntityID() << std::endl;
		delete iterator->first;
		entityMap.erase(iterator);
	}
	else
	{
		throw "No such Message System Event in Entity";
	}
	auto messageSystemEvent = entityMessageSystemEvent.find(inputEntity.getEntityID())->second;
	auto messageSystemEventIterator = std::find_if(messageSystemEvent.begin(), messageSystemEvent.end(), [&inputMessageSystemEvent](MessageSystemEvent* p)
	{
		return (&inputMessageSystemEvent == p);
	});
	messageSystemEvent.erase(messageSystemEventIterator);
}
// Get Message System Event
std::vector<MessageSystemEvent*>* EntityManagement::getMessageSystemEventType(uint32_t inputMessageSystemID)
{
	return &entityMessageSystemEvent.find(inputMessageSystemID)->second;
}
// Get Message System Event
messageSystemEventVector* EntityManagement::getMessageSystemEventType(MessageSystemEventType inputMessageSystemType)
{
	return &(mapOfEntities.find(static_cast<int>(inputMessageSystemType))->second);
}
// Get Max Entity ID
uint32_t EntityManagement::getMaxEntityID() const
{
	return entityID;
}

// Get Next Entity ID
uint32_t EntityManagement::getNextEntityID()
{
	return entityID++;
}