Răsfoiți Sursa

Fixed Bonus parser crashing at unspecified value. Assigning empty objects is also not good solution.

DjWarmonger 13 ani în urmă
părinte
comite
ecda63683e
2 a modificat fișierele cu 15 adăugiri și 7 ștergeri
  1. 1 1
      AI/VCAI/VCAI.cpp
  2. 14 6
      lib/JsonNode.cpp

+ 1 - 1
AI/VCAI/VCAI.cpp

@@ -3236,7 +3236,7 @@ TSubgoal CGoal::whatToDoToAchieve()
 						int primaryPath, secondaryPath;
 						auto h = otherHeroes.back();
 						cb->setSelection(hero.h);
-						primaryPath = cb->getPathInfo(h->pos)->turns;
+						primaryPath = cb->getPathInfo(h->pos)->turns; //FIXME: investigate crash at this line
 						cb->setSelection(h);
 						secondaryPath = cb->getPathInfo(hero->pos)->turns;
 

+ 14 - 6
lib/JsonNode.cpp

@@ -942,6 +942,8 @@ const T & parseByMap(const std::map<std::string, T> & map, const JsonNode * val,
 			return it->second;
 		}
 	}
+	else
+		return T();
 };
 
 Bonus * ParseBonus (const JsonNode &ability)
@@ -967,7 +969,9 @@ Bonus * ParseBonus (const JsonNode &ability)
 	if (!value->isNull())
 		b->val = value->Float();
 
-	b->valType = parseByMap(bonusValueMap, &ability["valueType"], "value type ");
+	value = &ability["valueType"];
+	if (!value->isNull())
+		b->valType = parseByMap(bonusValueMap, value, "value type ");
 
 	value = &ability["additionalInfo"];
 	if (!value->isNull())
@@ -985,11 +989,15 @@ Bonus * ParseBonus (const JsonNode &ability)
 	if (!value->isNull())
 		b->description = value->String();
 
-	b->effectRange = parseByMap(bonusLimitEffect, &ability["effectRange"], "effect range ");
-	
-	b->duration = parseByMap(bonusDurationMap, &ability["duration"], "duration type ");
-
-	b->source = parseByMap(bonusSourceMap, &ability["source"], "source type ");
+	value = &ability["effectRange"];
+	if (!value->isNull())
+		b->valType = parseByMap(bonusValueMap, value, "effect range ");
+	value = &ability["duration"];
+	if (!value->isNull())
+		b->valType = parseByMap(bonusValueMap, value, "duration type ");
+	value = &ability["source"];
+	if (!value->isNull())
+		b->valType = parseByMap(bonusValueMap, value, "source type ");
 
 // 	value = &ability["limiter"];
 // 	if (!value->isNull())