Преглед изворни кода

Parsing for stack experience and all other properties specified by creature format. Functionality untested due to other bugs in engine :(

DjWarmonger пре 13 година
родитељ
комит
8e78c86fe9
1 измењених фајлова са 56 додато и 6 уклоњено
  1. 56 6
      lib/CModHandler.cpp

+ 56 - 6
lib/CModHandler.cpp

@@ -86,7 +86,7 @@ void CModHandler::loadConfigFromFile (std::string name)
 		const JsonNode *value = &config["creatures"];
 		BOOST_FOREACH (auto creature, value->Vector())
 		{
-			auto cre = loadCreature (creature); //FIXME: unused variable 'cre' //create and push back creature
+			loadCreature (creature);//create and push back creature
 		}
 	}
 }
@@ -114,7 +114,11 @@ CCreature * CModHandler::loadCreature (const JsonNode &node)
 	const JsonNode & name = node["name"];
 	cre->nameSing = name["singular"].String();
 	cre->namePl = name["plural"].String();
-	cre->nameRef = cre->nameSing;
+	value = &name["reference"];
+	if (!value->isNull())
+		cre->nameRef = value->String();
+	else
+		cre->nameRef = cre->nameSing;
 
 	cre->cost = Res::ResourceSet(node["cost"]);
 
@@ -157,6 +161,40 @@ CCreature * CModHandler::loadCreature (const JsonNode &node)
 	{
 		cre->addNewBonus(ParseBonus(bonus));
 	}
+	BOOST_FOREACH (const JsonNode &exp, node["stackExperience"].Vector())
+	{
+		auto bonus = ParseBonus (exp["bonus"]);
+		const JsonVector &values = exp["values"].Vector();
+		int lowerLimit = 1, upperLimit = 255;
+		if (values[0].getType() == JsonNode::JsonType::DATA_BOOL)
+		{
+			BOOST_FOREACH (const JsonNode &val, values)
+			{
+				if (val.Bool() == true)
+				{
+					bonus->limiter.reset (new RankRangeLimiter(lowerLimit));
+					cre->addNewBonus (new Bonus(*bonus)); //bonuses must be unique objects
+					break; //TODO: allow bonuses to turn off?
+				}
+				++lowerLimit;
+			}
+		}
+		else
+		{
+			int lastVal = 0;
+			BOOST_FOREACH (const JsonNode &val, values)
+			{
+				if (val.Float() != lastVal)
+				{
+					bonus->val = val.Float() - lastVal;
+					bonus->limiter.reset (new RankRangeLimiter(lowerLimit));
+					cre->addNewBonus (new Bonus(*bonus));
+				}
+				lastVal = val.Float();
+				++lowerLimit;
+			}
+		}
+	}
 	//graphics
 
 	const JsonNode & graphics = node["graphics"];
@@ -171,6 +209,19 @@ CCreature * CModHandler::loadCreature (const JsonNode &node)
 	cre->flightAnimationDistance = animationTime["flight"].Float(); //?
 	//TODO: background?
 	const JsonNode & missle = graphics["missle"];
+	//TODO: parse
+	value = &missle["projectile"];
+	if (value->isNull())
+		cre->projectile = "PLCBOWX.DEF";
+	else
+		cre->projectile = value->String();
+
+	value = &missle["spinning"];
+	if (value->isNull())
+		cre->projectileSpin = false; //no animation by default to avoid crash
+	else
+		cre->projectileSpin = value->Bool();
+
 	const JsonNode & offsets = missle["offset"];
 	cre->upperRightMissleOffsetX = offsets["upperX"].Float();
 	cre->upperRightMissleOffsetY = offsets["upperY"].Float();
@@ -185,10 +236,6 @@ CCreature * CModHandler::loadCreature (const JsonNode &node)
 	}
 	cre->advMapDef = graphics["map"].String();
 	cre->iconIndex = graphics["iconIndex"].Float();
-	
-	//TODO: parse
-	cre->projectile = "PLCBOWX.DEF";
-	cre->projectileSpin = false;
 
 	const JsonNode & sounds = node["sound"];
 
@@ -206,6 +253,9 @@ CCreature * CModHandler::loadCreature (const JsonNode &node)
 #undef GET_SOUND_VALUE
 
 	creatures.push_back(cre);
+
+	tlog3 << "Added new creature " << cre->nameRef << "\n";
+
 	return cre;
 }
 void CModHandler::recreateAdvMapDefs()