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()); }