Przeglądaj źródła

Seer Huts with exp / gold rewards.

DjWarmonger 10 lat temu
rodzic
commit
67ab90616d
2 zmienionych plików z 85 dodań i 33 usunięć
  1. 4 4
      lib/mapObjects/CQuest.cpp
  2. 81 29
      lib/rmg/CRmgTemplateZone.cpp

+ 4 - 4
lib/mapObjects/CQuest.cpp

@@ -389,10 +389,10 @@ void CQuest::getCompletionText (MetaString &iwText, std::vector<Component> &comp
 
 CGSeerHut::CGSeerHut() : IQuestObject()
 {
-	obj->quest->lastDay = -1;
-	obj->quest->isCustomFirst = false;
-	obj->quest->isCustomNext = false;
-	obj->quest->isCustomComplete = false;
+	quest->lastDay = -1;
+	quest->isCustomFirst = false;
+	quest->isCustomNext = false;
+	quest->isCustomComplete = false;
 }
 
 void CGSeerHut::setObjToKill()

+ 81 - 29
lib/rmg/CRmgTemplateZone.cpp

@@ -2283,44 +2283,96 @@ void CRmgTemplateZone::addAllPossibleObjects(CMapGenerator* gen)
 	{
 		seerHutsPerType = 1;
 	}
+	oi.maxPerZone = seerHutsPerType;
 
 	RandomGeneratorUtil::randomShuffle(creatures, gen->rand);
 
-	for (int loops = 0; loops < seerHutsPerType; loops++) //in case there are many arties available
+	for (int i = 0; i < std::min<int>(creatures.size(), questArtsRemaining - genericSeerHuts); i++)
 	{
-		for (int i = 0; i < std::min<int>(creatures.size(), questArtsRemaining - genericSeerHuts); i++)
+		auto creature = creatures[i];
+		int creaturesAmount = creatureToCount(creature);
+
+		if (!creaturesAmount)
+			continue;
+
+		int randomAppearance = *RandomGeneratorUtil::nextItem(VLC->objtypeh->knownSubObjects(Obj::SEER_HUT), gen->rand);
+
+		oi.generateObject = [creature, creaturesAmount, randomAppearance, gen]() -> CGObjectInstance *
 		{
-			auto creature = creatures[i];
-			int creaturesAmount = creatureToCount(creature);
+			auto obj = new CGSeerHut();
+			obj->ID = Obj::SEER_HUT;
+			obj->subID = randomAppearance;
+			obj->rewardType = CGSeerHut::CREATURE;
+			obj->rID = creature->idNumber;
+			obj->rVal = creaturesAmount;
 
-			if (!creaturesAmount)
-				continue;
+			obj->quest->missionType = CQuest::MISSION_ART;
+			ArtifactID artid = *RandomGeneratorUtil::nextItem(gen->getQuestArtsRemaning(), gen->rand);
+			obj->quest->m5arts.push_back(artid);
+			gen->banQuestArt(artid);
+			gen->map->addQuest(obj);
 
-			int randomAppearance = *RandomGeneratorUtil::nextItem(VLC->objtypeh->knownSubObjects(Obj::SEER_HUT), gen->rand);
+			return obj;
+			//TODO: place required artifact in next zone
+		};
+		oi.setTemplate(Obj::SEER_HUT, randomAppearance, terrainType);
+		oi.value = ((2 * (creature->AIValue) * creaturesAmount * (1 + (float)(gen->getZoneCount(creature->faction)) / gen->getTotalZoneCount())) - 4000) / 3;
+		oi.probability = 3;
+		possibleObjects.push_back(oi);
+	}
 
-			oi.generateObject = [creature, creaturesAmount, randomAppearance, gen]() -> CGObjectInstance *
-			{
-				auto obj = new CGSeerHut();
-				obj->ID = Obj::SEER_HUT;
-				obj->subID = randomAppearance;
-				obj->rewardType = CGSeerHut::CREATURE;
-				obj->rID = creature->idNumber;
-				obj->rVal = creaturesAmount;
-
-				obj->quest->missionType = CQuest::MISSION_ART;
-				ArtifactID artid = *RandomGeneratorUtil::nextItem(gen->getQuestArtsRemaning(), gen->rand);
-				obj->quest->m5arts.push_back(artid);
-				gen->banQuestArt(artid);
-				gen->map->addQuest(obj);
+	static int seerExpGold[] = { 5000, 10000, 15000, 20000 };
+	static int seerValues[] = { 2000, 5333, 8666, 12000};
 
-				return obj;
-				//TODO: place required artifact in next zone
-			};
-			oi.setTemplate(Obj::SEER_HUT, randomAppearance, terrainType);
-			oi.value = ((2 * (creature->AIValue) * creaturesAmount * (1 + (float)(gen->getZoneCount(creature->faction)) / gen->getTotalZoneCount())) - 4000) / 3;
-			oi.probability = 3;
-			possibleObjects.push_back(oi);
-		}
+	for (int i = 0; i < 4; i++) //seems that code for exp and gold reward is similiar
+	{
+		int randomAppearance = *RandomGeneratorUtil::nextItem(VLC->objtypeh->knownSubObjects(Obj::SEER_HUT), gen->rand);
+
+		oi.setTemplate(Obj::SEER_HUT, randomAppearance, terrainType);
+		oi.value = seerValues[i];
+		oi.probability = 10;
+
+		oi.generateObject = [i, randomAppearance, gen]() -> CGObjectInstance *
+		{
+			auto obj = new CGSeerHut();
+			obj->ID = Obj::SEER_HUT;
+			obj->subID = randomAppearance;
+			obj->rewardType = CGSeerHut::EXPERIENCE;
+			obj->rID = 0; //unitialized?
+			obj->rVal = seerExpGold[i];
+
+			obj->quest->missionType = CQuest::MISSION_ART;
+			ArtifactID artid = *RandomGeneratorUtil::nextItem(gen->getQuestArtsRemaning(), gen->rand);
+			obj->quest->m5arts.push_back(artid);
+			gen->banQuestArt(artid);
+			gen->map->addQuest(obj);
+
+			return obj;
+			//TODO: place required artifact in next zone
+		};
+
+		possibleObjects.push_back(oi);
+
+		oi.generateObject = [i, randomAppearance, gen]() -> CGObjectInstance *
+		{
+			auto obj = new CGSeerHut();
+			obj->ID = Obj::SEER_HUT;
+			obj->subID = randomAppearance;
+			obj->rewardType = CGSeerHut::RESOURCES;
+			obj->rID = Res::GOLD;
+			obj->rVal = seerExpGold[i];
+
+			obj->quest->missionType = CQuest::MISSION_ART;
+			ArtifactID artid = *RandomGeneratorUtil::nextItem(gen->getQuestArtsRemaning(), gen->rand);
+			obj->quest->m5arts.push_back(artid);
+			gen->banQuestArt(artid);
+			gen->map->addQuest(obj);
+
+			return obj;
+			//TODO: place required artifact in next zone
+		};
+
+		possibleObjects.push_back(oi);
 	}
 }