示例#1
0
void EntityFactory::CopyEntity(Entity* aTargetEntity, const std::string& aEntityTag)
{
	if (myEntities.find(aEntityTag) == myEntities.end())
	{
		//#ifdef _DEBUG
		//		if (myEntityTags.find(aEntityTag) == myEntityTags.end())
		//		{
		//			std::string error = "[EntityFactory] No entity with name " + aEntityTag;
		//			DL_ASSERT(error);
		//		}
		//		
		//		LoadEntity(myEntityTags[aEntityTag], myDifficultScale);
		//#else
		std::string error = "[EntityFactory] No entity with name " + aEntityTag;
		DL_ASSERT(error);
		//#endif
	}
	auto it = myEntities.find(aEntityTag);
	Entity* sourceEntity = it->second.myEntity;

	aTargetEntity->SetName(sourceEntity->GetName());

	if (aEntityTag.rfind("Asteroid") != std::string::npos 
		|| aEntityTag.rfind("asteroid") != std::string::npos 
		|| aEntityTag.rfind("Junk") != std::string::npos
		|| aEntityTag.rfind("junk") != std::string::npos)
	{
		int value = CU::Math::RandomRange(1, 6);
		aTargetEntity->SetShouldRotate(true);
		if (value == 1)
			aTargetEntity->SetShouldRotateX(true);
		else if (value == 2)
			aTargetEntity->SetShouldRotateY(true);
		else if (value == 3)
			aTargetEntity->SetShouldRotateZ(true);
		else if (value == 4)
		{
			aTargetEntity->SetShouldRotateX(true);
			aTargetEntity->SetShouldRotateY(true);
		}
		else if (value == 5)
		{
			aTargetEntity->SetShouldRotateY(true);
			aTargetEntity->SetShouldRotateZ(true);
		}
		else if (value == 6)
		{
			aTargetEntity->SetShouldRotateZ(true);
			aTargetEntity->SetShouldRotateX(true);
		}
	}
	else
	{
		aTargetEntity->SetShouldRotate(sourceEntity->GetShouldRotate());
		aTargetEntity->SetShouldRotateX(sourceEntity->GetShouldRotateX());
		aTargetEntity->SetShouldRotateY(sourceEntity->GetShouldRotateY());
		aTargetEntity->SetShouldRotateZ(sourceEntity->GetShouldRotateZ());
	}







	if (sourceEntity->GetComponent<CollisionComponent>() != nullptr)
	{
		eCollisionType collisionType = sourceEntity->GetComponent<CollisionComponent>()->GetCollisionType();

		if (collisionType == eCollisionType::NORMAL)
		{
			aTargetEntity->AddComponent<CollisionComponent>();
		}
		else if (collisionType == eCollisionType::PLANET)
		{
			aTargetEntity->AddComponent<PlanetCollisionComponent>();
		}

		aTargetEntity->GetComponent<CollisionComponent>()->Init(it->second.myCollisionSphereRadius);
	}
	if (sourceEntity->GetComponent<GraphicsComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<GraphicsComponent>();
		switch (it->second.myGraphicsType)
		{
		case eEntityDataGraphicsType::MODEL:
			aTargetEntity->GetComponent<GraphicsComponent>()->Init(it->second.myModelFile.c_str(),
				it->second.myEffectFile.c_str());
			break;
		case eEntityDataGraphicsType::CUBE:
			aTargetEntity->GetComponent<GraphicsComponent>()->InitCube(it->second.myWidth,
				it->second.myHeight, it->second.myDepth);
			break;
		default:
			break;
		}
		if (it->second.myScale != CU::Vector3f())
		{
			aTargetEntity->GetComponent<GraphicsComponent>()->SetScale(it->second.myScale);
			if (aTargetEntity->GetComponent<CollisionComponent>() != nullptr)
			{
				float scale = aTargetEntity->GetComponent<CollisionComponent>()->GetSphere().myRadius + it->second.myCollisionSphereRadius;
				scale *= CU::Math::GetMaximumValueFromVector(it->second.myScale);
				aTargetEntity->GetComponent<CollisionComponent>()->SetCollisionRadius(scale);
			}
		}
		else if (aTargetEntity->GetComponent<CollisionComponent>() != nullptr)
		{
			float scaleOrg = aTargetEntity->GetComponent<CollisionComponent>()->GetSphere().myRadius;
			aTargetEntity->GetComponent<CollisionComponent>()->SetCollisionRadius(scaleOrg + it->second.myCollisionSphereRadius);
		}
	}
	if (sourceEntity->GetComponent<PhysicsComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<PhysicsComponent>();
	}
	if (sourceEntity->GetComponent<AIComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<AIComponent>();
		float speed = CU::Math::RandomRange<float>(it->second.myMinSpeed, it->second.myMaxSpeed);
		float timeToNextDecision = CU::Math::RandomRange<float>(it->second.myMinTimeToNextDecision,
			it->second.myMaxTimeToNextDecision);
		aTargetEntity->GetComponent<AIComponent>()->Init(speed, timeToNextDecision, it->second.myTargetName
			, it->second.myAIAvoidanceDistance, it->second.myAIAvoidancePoint
			, it->second.myAITargetPositionMode, it->second.myAITurnRate);
	}
	if (sourceEntity->GetComponent<ShootingComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<ShootingComponent>();
		if (it->second.myWeaponType != "")
		{
			aTargetEntity->GetComponent<ShootingComponent>()->AddWeapon(myWeaponFactoryPointer->GetWeapon(it->second.myWeaponType));
		}
	}
	if (sourceEntity->GetComponent<HealthComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<HealthComponent>();
		aTargetEntity->GetComponent<HealthComponent>()->Init(it->second.myLife);
	}
	if (sourceEntity->GetComponent<BulletComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<BulletComponent>();
		if (it->second.myMaxTime > 0 && it->second.myDamage > 0)
		{
			eBulletType bulletType = ConvertToBulletType(sourceEntity->GetName());
			aTargetEntity->GetComponent<BulletComponent>()->Init(it->second.myMaxTime, it->second.myDamage, it->second.myDamageRadius, bulletType);
		}
	}
	if (sourceEntity->GetComponent<SoundComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<SoundComponent>();
	}

	if (sourceEntity->GetComponent<PowerUpComponent>() != nullptr)
	{
		aTargetEntity->AddComponent<PowerUpComponent>();

		if (it->second.myPowerUpType == ePowerUpType::WEAPON_UPGRADE)
		{
			aTargetEntity->GetComponent<PowerUpComponent>()->Init(it->second.myPowerUpType, it->second.myPowerUpName, it->second.myUpgradeName
				, it->second.myUpgradePickupMessage, it->second.myUpgradeID, it->second.myUpgradePickupMessageTime);
		}
		else
		{
			aTargetEntity->GetComponent<PowerUpComponent>()->Init(it->second.myPowerUpType, it->second.myPowerUpName, it->second.myPowerUpValue
				, it->second.myDuration);
		}
	}

	if (it->second.myParticleEmitterXMLPath != "")
	{
		aTargetEntity->AddComponent<ParticleEmitterComponent>()->Init(it->second.myParticleEmitterXMLPath);
	}

	if (it->second.myStreakEmitterXMLPath != "")
	{
		aTargetEntity->AddComponent<StreakEmitterComponent>()->Init(it->second.myStreakEmitterXMLPath);
	}

	ENTITY_LOG("Entity %s copying succeded", aTargetEntity->GetName().c_str());
}