浏览代码

[Map format] more correct handling of default hero primary skills

AlexVinS 8 年之前
父节点
当前提交
9f1451c1a3
共有 1 个文件被更改,包括 15 次插入22 次删除
  1. 15 22
      lib/mapObjects/CGHeroInstance.cpp

+ 15 - 22
lib/mapObjects/CGHeroInstance.cpp

@@ -1610,40 +1610,33 @@ void CGHeroInstance::serializeCommonOptions(JsonSerializeFormat & handler)
 		}
 	}
 
+	//primary skills
+	if(handler.saving)
 	{
-		if(handler.saving)
+		const bool haveSkills = hasBonus(Selector::type(Bonus::PRIMARY_SKILL).And(Selector::sourceType(Bonus::HERO_BASE_SKILL)));
+
+		if(haveSkills)
 		{
-			bool haveSkills = false;
+			auto primarySkills = handler.enterStruct("primarySkills");
 
 			for(int i = 0; i < GameConstants::PRIMARY_SKILLS; ++i)
 			{
-				if(valOfBonuses(Selector::typeSubtype(Bonus::PRIMARY_SKILL, i).And(Selector::sourceType(Bonus::HERO_BASE_SKILL))) != 0)
-				{
-					haveSkills = true;
-					break;
-				}
-			}
-
-			if(haveSkills)
-			{
-				auto primarySkills = handler.enterStruct("primarySkills");
-
-				for(int i = 0; i < GameConstants::PRIMARY_SKILLS; ++i)
-				{
-					int value = valOfBonuses(Selector::typeSubtype(Bonus::PRIMARY_SKILL, i).And(Selector::sourceType(Bonus::HERO_BASE_SKILL)));
+				int value = valOfBonuses(Selector::typeSubtype(Bonus::PRIMARY_SKILL, i).And(Selector::sourceType(Bonus::HERO_BASE_SKILL)));
 
-					handler.serializeInt(PrimarySkill::names[i], value, 0);
-				}
+				handler.serializeInt(PrimarySkill::names[i], value, 0);
 			}
 		}
-		else
-		{
-			auto primarySkills = handler.enterStruct("primarySkills");
+	}
+	else
+	{
+		auto primarySkills = handler.enterStruct("primarySkills");
 
+		if(primarySkills.get().getType() == JsonNode::DATA_STRUCT)
+		{
 			for(int i = 0; i < GameConstants::PRIMARY_SKILLS; ++i)
 			{
 				int value = 0;
-				handler.serializeInt(PrimarySkill::names[i], value, 0);
+				primarySkills->serializeInt(PrimarySkill::names[i], value, 0);
 				pushPrimSkill(static_cast<PrimarySkill::PrimarySkill>(i), value);
 			}
 		}