Explorar o código

Random selection for secondary skills

nordsoft %!s(int64=2) %!d(string=hai) anos
pai
achega
dce5a924b0
Modificáronse 1 ficheiros con 32 adicións e 2 borrados
  1. 32 2
      lib/mapObjects/JsonRandom.cpp

+ 32 - 2
lib/mapObjects/JsonRandom.cpp

@@ -20,6 +20,7 @@
 #include "../CCreatureHandler.h"
 #include "../CCreatureSet.h"
 #include "../spells/CSpellHandler.h"
+#include "../CSkillHandler.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
@@ -136,11 +137,40 @@ namespace JsonRandom
 	std::map<SecondarySkill, si32> loadSecondary(const JsonNode & value, CRandomGenerator & rng)
 	{
 		std::map<SecondarySkill, si32> ret;
+		std::vector<SecondarySkill> except;
+		
 		for(const auto & pair : value.Struct())
 		{
-			SecondarySkill id(VLC->modh->identifiers.getIdentifier(pair.second.meta, "skill", pair.first).get());
-			ret[id] = loadValue(pair.second, rng);
+			std::string skillName = pair.first;
+			
+			if(skillName == "random")
+			{
+				if(pair.second.isNumber())
+					skillName = RandomGeneratorUtil::nextItem(VLC->skillh->objects, rng)->get()->getNameTextID();
+				else
+				{
+					auto skill = *RandomGeneratorUtil::nextItem(loadSecondary(pair.second, rng), rng);
+					ret[skill.first] = skill.second;
+				}
+			}
+			else if(skillName == "except")
+			{
+				for(auto & i : pair.second.Vector())
+				{
+					SecondarySkill id(VLC->modh->identifiers.getIdentifier(pair.second.meta, "skill", i.String()).get());
+					except.push_back(id);
+				}
+			}
+			else
+			{
+				SecondarySkill id(VLC->modh->identifiers.getIdentifier(pair.second.meta, "skill", pair.first).get());
+				ret[id] = loadValue(pair.second, rng);
+			}
 		}
+		
+		for(auto & i : except)
+			ret.erase(i);
+		
 		return ret;
 	}