Sfoglia il codice sorgente

Skill removal as reward

George King 7 mesi fa
parent
commit
cae84e0e77
1 ha cambiato i file con 17 aggiunte e 4 eliminazioni
  1. 17 4
      lib/mapObjects/CGHeroInstance.cpp

+ 17 - 4
lib/mapObjects/CGHeroInstance.cpp

@@ -133,7 +133,16 @@ ui8 CGHeroInstance::getSecSkillLevel(const SecondarySkill & skill) const
 
 void CGHeroInstance::setSecSkillLevel(const SecondarySkill & which, int val, bool abs)
 {
-	if(getSecSkillLevel(which) == 0)
+	if (val == 0)      // skill removal
+	{
+		auto it = std::find_if(secSkills.begin(), secSkills.end(), [&](const std::pair<SecondarySkill, ui8>& pair) { return pair.first == which; });
+		if (it != secSkills.end())
+		{
+			secSkills.erase(it);
+			updateSkillBonus(which, val);
+		}
+	}
+	else if(getSecSkillLevel(which) == 0)
 	{
 		secSkills.emplace_back(which, val);
 		updateSkillBonus(which, val);
@@ -660,9 +669,13 @@ void CGHeroInstance::recreateSecondarySkillsBonuses()
 void CGHeroInstance::updateSkillBonus(const SecondarySkill & which, int val)
 {
 	removeBonuses(Selector::source(BonusSource::SECONDARY_SKILL, BonusSourceID(which)));
-	auto skillBonus = (*LIBRARY->skillh)[which]->at(val).effects;
-	for(const auto & b : skillBonus)
-		addNewBonus(std::make_shared<Bonus>(*b));
+
+	if(val > 0)
+	{
+		auto skillBonus = (*LIBRARY->skillh)[which]->at(val).effects;
+		for(const auto& b : skillBonus)
+			addNewBonus(std::make_shared<Bonus>(*b));
+	}
 }
 
 void CGHeroInstance::setPropertyDer(ObjProperty what, ObjPropertyID identifier)