Ver Fonte

Generate random Pandora boxes.

DjWarmonger há 11 anos atrás
pai
commit
cbd2d74292
2 ficheiros alterados com 175 adições e 0 exclusões
  1. 3 0
      config/objects/generic.json
  2. 172 0
      lib/rmg/CRmgTemplateZone.cpp

+ 3 - 0
config/objects/generic.json

@@ -86,6 +86,9 @@
 		"types" : {
 			"object" : {
 				"index" : 0,
+				"templates" : {
+					"normal" : { "animation" : "ava0128.def", "visitableFrom" : [ "+++", "+-+", "+++" ], "mask" : [ "VV", "VA"] }
+				}
 				"rmg" : {
 				}
 			}

+ 172 - 0
lib/rmg/CRmgTemplateZone.cpp

@@ -1435,4 +1435,176 @@ void CRmgTemplateZone::addAllPossibleObjects (CMapGenerator* gen)
 		oi.probability = 30;
 		possibleObjects.push_back (oi);
 	}
+
+	//pandora box with gold
+	for (int i = 1; i < 5; i++)
+	{
+		oi.generateObject = [i]() -> CGObjectInstance *
+		{
+			auto obj = new CGPandoraBox();
+			obj->ID = Obj::PANDORAS_BOX;
+			obj->subID = 0;
+			obj->resources[Res::GOLD] = i * 5000;
+			return obj;
+		};
+		oi.value = i * 5000;;
+		oi.probability = 5;
+		possibleObjects.push_back (oi);
+	}
+
+	//pandora box with experience
+	for (int i = 1; i < 5; i++)
+	{
+		oi.generateObject = [i]() -> CGObjectInstance *
+		{
+			auto obj = new CGPandoraBox();
+			obj->ID = Obj::PANDORAS_BOX;
+			obj->subID = 0;
+			obj->gainedExp = i * 5000;
+			return obj;
+		};
+		oi.value = i * 6000;;
+		oi.probability = 20;
+		possibleObjects.push_back (oi);
+	}
+
+	//pandora box with creatures
+	static const int tierValues[] = {5000, 7000, 9000, 12000, 16000, 21000, 27000};
+
+	for (auto creature : VLC->creh->creatures)
+	{
+		if (!creature->special && VLC->townh->factions[creature->faction]->nativeTerrain == terrainType)
+		{
+			int actualTier = creature->level > 7 ? 6 : creature->level-1;
+			int creaturesAmount = tierValues[actualTier] / creature->AIValue;
+			if (creaturesAmount <= 5)
+			{
+			}
+			else if (creaturesAmount <= 12)
+			{
+				(creaturesAmount /= 2) *= 2;
+			}
+			else if (creaturesAmount <= 50)
+			{
+				creaturesAmount = boost::math::round((float)creaturesAmount / 5) * 5;
+			}
+			else if (creaturesAmount <= 12)
+			{
+				creaturesAmount = boost::math::round((float)creaturesAmount / 10) * 10;
+			}
+
+			oi.generateObject = [creature, creaturesAmount]() -> CGObjectInstance *
+			{
+				auto obj = new CGPandoraBox();
+				obj->ID = Obj::PANDORAS_BOX;
+				obj->subID = 0;
+				auto stack = new CStackInstance(creature, creaturesAmount);
+				obj->creatures.putStack(SlotID(0), stack);
+				return obj;
+			};
+			oi.value = (2 * (creature->AIValue) * creaturesAmount * (1 + 1) - 4000)/3; //TODO: count number of towns on the map
+			oi.probability = 3;
+			possibleObjects.push_back (oi);
+		}
+	}
+
+	//Pandora with 12 spells of certain level
+	for (int i = 1; i <= GameConstants::SPELL_LEVELS; i++)
+	{
+		oi.generateObject = [i, gen]() -> CGObjectInstance *
+		{
+			auto obj = new CGPandoraBox();
+			obj->ID = Obj::PANDORAS_BOX;
+			obj->subID = 0;
+
+			std::vector <CSpell *> spells;
+			for (auto spell : VLC->spellh->objects)
+			{
+				if (!spell->isSpecialSpell() && spell->level == i)
+					spells.push_back(spell);
+			}
+
+			RandomGeneratorUtil::randomShuffle(spells, gen->rand);
+			for (int j = 0; j < std::min<int>(12, spells.size()); j++)
+			{
+				obj->spells.push_back (spells[j]->id);
+			}
+
+			return obj;
+		};
+		oi.value = (i + 1) * 2500; //5000 - 15000
+		oi.probability = 2;
+		possibleObjects.push_back (oi);
+	}
+
+	//Pandora with 15 spells of certain school
+	for (int i = 1; i <= 4; i++)
+	{
+		oi.generateObject = [i, gen]() -> CGObjectInstance *
+		{
+			auto obj = new CGPandoraBox();
+			obj->ID = Obj::PANDORAS_BOX;
+			obj->subID = 0;
+
+			std::vector <CSpell *> spells;
+			for (auto spell : VLC->spellh->objects)
+			{
+				if (!spell->isSpecialSpell())
+				{
+					bool school = false; //TODO: we could have better interface for iterating schools
+					switch (i)
+					{
+						case 1:
+							school = spell->air;
+						case 2:
+							school = spell->earth;
+						case 3:
+							school = spell->fire;
+						case 4:
+							school = spell->water;
+					}
+					if (school)
+						spells.push_back(spell);
+				}
+			}
+
+			RandomGeneratorUtil::randomShuffle(spells, gen->rand);
+			for (int j = 0; j < std::min<int>(15, spells.size()); j++)
+			{
+				obj->spells.push_back (spells[j]->id);
+			}
+
+			return obj;
+		};
+		oi.value = 15000;
+		oi.probability = 2;
+		possibleObjects.push_back (oi);
+	}
+
+	// Pandora box with 60 random spells
+
+	oi.generateObject = [gen]() -> CGObjectInstance *
+	{
+		auto obj = new CGPandoraBox();
+		obj->ID = Obj::PANDORAS_BOX;
+		obj->subID = 0;
+
+		std::vector <CSpell *> spells;
+		for (auto spell : VLC->spellh->objects)
+		{
+			if (!spell->isSpecialSpell())
+				spells.push_back(spell);
+		}
+
+		RandomGeneratorUtil::randomShuffle(spells, gen->rand);
+		for (int j = 0; j < std::min<int>(60, spells.size()); j++)
+		{
+			obj->spells.push_back (spells[j]->id);
+		}
+
+		return obj;
+	};
+	oi.value = 3000;
+	oi.probability = 2;
+	possibleObjects.push_back (oi);
 }