Browse Source

Refactor duplicated code as suggested by SonarCloud

Tomasz Zieliński 1 year ago
parent
commit
253f1dc7e6
1 changed files with 21 additions and 35 deletions
  1. 21 35
      lib/rmg/modificators/TreasurePlacer.cpp

+ 21 - 35
lib/rmg/modificators/TreasurePlacer.cpp

@@ -464,6 +464,19 @@ void TreasurePlacer::addAllPossibleObjects()
 		
 		RandomGeneratorUtil::randomShuffle(creatures, zone.getRand());
 
+		auto setRandomArtifact = [qap, &oi](CGSeerHut * obj)
+		{
+			ArtifactID artid = qap->drawRandomArtifact();
+			oi.destroyObject = [artid, qap]()
+			{
+				// Artifact can be used again
+				qap->addRandomArtifact(artid);
+				qap->removeQuestArtifact(artid);
+			};
+			obj->quest->mission.artifacts.push_back(artid);
+			qap->addQuestArtifact(artid);
+		};
+
 		for(int i = 0; i < static_cast<int>(creatures.size()); i++)
 		{
 			auto * creature = creatures[i];
@@ -475,7 +488,7 @@ void TreasurePlacer::addAllPossibleObjects()
 			int randomAppearance = chooseRandomAppearance(zone.getRand(), Obj::SEER_HUT, zone.getTerrainType());
 			
 			// FIXME: Remove duplicated code for gold, exp and creaure reward
-			oi.generateObject = [creature, creaturesAmount, randomAppearance, qap, &oi]() -> CGObjectInstance *
+			oi.generateObject = [creature, creaturesAmount, randomAppearance, qap, &oi, setRandomArtifact]() -> CGObjectInstance *
 			{
 				auto factory = VLC->objtypeh->getHandlerFor(Obj::SEER_HUT, randomAppearance);
 				auto * obj = dynamic_cast<CGSeerHut *>(factory->create());
@@ -485,16 +498,7 @@ void TreasurePlacer::addAllPossibleObjects()
 				reward.visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
 				obj->configuration.info.push_back(reward);
 								
-				ArtifactID artid = qap->drawRandomArtifact();
-				oi.destroyObject = [artid, qap]()
-				{
-					// Artifact can be used again
-					qap->addRandomArtifact(artid);
-					qap->removeQuestArtifact(artid);
-				};
-				obj->quest->mission.artifacts.push_back(artid);
-				
-				qap->addQuestArtifact(artid);
+				setRandomArtifact(obj);
 				
 				return obj;
 			};
@@ -528,7 +532,7 @@ void TreasurePlacer::addAllPossibleObjects()
 			oi.probability = 10;
 			oi.maxPerZone = 1;
 			
-			oi.generateObject = [i, randomAppearance, this, qap, &oi]() -> CGObjectInstance *
+			oi.generateObject = [i, randomAppearance, this, qap, &oi, setRandomArtifact]() -> CGObjectInstance *
 			{
 				auto factory = VLC->objtypeh->getHandlerFor(Obj::SEER_HUT, randomAppearance);
 				auto * obj = dynamic_cast<CGSeerHut *>(factory->create());
@@ -537,25 +541,16 @@ void TreasurePlacer::addAllPossibleObjects()
 				reward.reward.heroExperience = generator.getConfig().questRewardValues[i];
 				reward.visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
 				obj->configuration.info.push_back(reward);
-				
-				ArtifactID artid = qap->drawRandomArtifact();
-				oi.destroyObject = [artid, qap]()
-				{
-					// Artifact can be used again
-					qap->addRandomArtifact(artid);
-					qap->removeQuestArtifact(artid);
-				};
-				obj->quest->mission.artifacts.push_back(artid);
-				
-				qap->addQuestArtifact(artid);
-				
+
+				setRandomArtifact(obj);
+
 				return obj;
 			};
 			
 			if(!oi.templates.empty())
 				possibleSeerHuts.push_back(oi);
 			
-			oi.generateObject = [i, randomAppearance, this, qap, &oi]() -> CGObjectInstance *
+			oi.generateObject = [i, randomAppearance, this, qap, &oi, setRandomArtifact]() -> CGObjectInstance *
 			{
 				auto factory = VLC->objtypeh->getHandlerFor(Obj::SEER_HUT, randomAppearance);
 				auto * obj = dynamic_cast<CGSeerHut *>(factory->create());
@@ -565,16 +560,7 @@ void TreasurePlacer::addAllPossibleObjects()
 				reward.visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
 				obj->configuration.info.push_back(reward);
 				
-				ArtifactID artid = qap->drawRandomArtifact();
-				oi.destroyObject = [artid, qap]()
-				{
-					// Artifact can be used again
-					qap->addRandomArtifact(artid);
-					qap->removeQuestArtifact(artid);
-				};
-				obj->quest->mission.artifacts.push_back(artid);
-				
-				qap->addQuestArtifact(artid);
+				setRandomArtifact(obj);
 				
 				return obj;
 			};