瀏覽代碼

rewrite CGHeroInstance::canCastThisSpell

AlexVinS 11 年之前
父節點
當前提交
7af4f44237
共有 3 個文件被更改,包括 46 次插入34 次删除
  1. 33 0
      lib/CSpellHandler.cpp
  2. 12 5
      lib/CSpellHandler.h
  3. 1 29
      lib/mapObjects/CGHeroInstance.cpp

+ 33 - 0
lib/CSpellHandler.cpp

@@ -65,6 +65,39 @@ CSpell::~CSpell()
 	delete mechanics;
 }
 
+bool CSpell::isCastableBy(const IBonusBearer * caster, bool hasSpellBook, const std::set<SpellID> & spellBook) const
+{
+	if(!hasSpellBook)
+		return false;
+	
+	const bool inSpellBook = vstd::contains(spellBook, id);
+	const bool isBonus = caster->hasBonusOfType(Bonus::SPELL, id);
+	
+	bool inTome = false;
+	
+	for(const SpellSchoolInfo & cnf : SPELL_SCHOOL_CONFIG)
+	{
+		if(school.at(cnf.id) && caster->hasBonusOfType(cnf.knoledgeBonus))
+		{
+			inTome = true;
+			break;
+		}				
+	}		
+
+    if (isSpecialSpell())
+    {
+        if (inSpellBook)
+        {//hero has this spell in spellbook
+            logGlobal->errorStream() << "Special spell in spellbook "<<name;
+        }
+        return isBonus;
+    }
+    else
+    {
+       return inSpellBook || inTome || isBonus || caster->hasBonusOfType(Bonus::SPELLS_OF_LEVEL, level);
+    }	
+}
+
 const CSpell::LevelInfo & CSpell::getLevelInfo(const int level) const
 {
 	if(level < 0 || level >= GameConstants::SPELL_SCHOOL_LEVELS)

+ 12 - 5
lib/CSpellHandler.h

@@ -36,7 +36,8 @@ struct SpellSchoolInfo
 	Bonus::BonusType damagePremyBonus;
 	Bonus::BonusType immunityBonus;	
 	std::string jsonName;
-	SecondarySkill::ESecondarySkill skill;	
+	SecondarySkill::ESecondarySkill skill;
+	Bonus::BonusType knoledgeBonus;			
 };
 
 static const SpellSchoolInfo SPELL_SCHOOL_CONFIG[4] = 
@@ -46,28 +47,32 @@ static const SpellSchoolInfo SPELL_SCHOOL_CONFIG[4] =
 		Bonus::AIR_SPELL_DMG_PREMY,
 		Bonus::AIR_IMMUNITY,
 		"air",
-		SecondarySkill::AIR_MAGIC
+		SecondarySkill::AIR_MAGIC,
+		Bonus::AIR_SPELLS
 	},
 	{
 		ESpellSchool::FIRE,
 		Bonus::FIRE_SPELL_DMG_PREMY,
 		Bonus::FIRE_IMMUNITY,
 		"fire",
-		SecondarySkill::FIRE_MAGIC
+		SecondarySkill::FIRE_MAGIC,
+		Bonus::FIRE_SPELLS
 	},
 	{
 		ESpellSchool::WATER,
 		Bonus::WATER_SPELL_DMG_PREMY,
 		Bonus::WATER_IMMUNITY,
 		"water",
-		SecondarySkill::WATER_MAGIC
+		SecondarySkill::WATER_MAGIC,
+		Bonus::WATER_SPELLS
 	},
 	{
 		ESpellSchool::EARTH,
 		Bonus::EARTH_SPELL_DMG_PREMY,
 		Bonus::EARTH_IMMUNITY,
 		"earth",
-		SecondarySkill::EARTH_MAGIC
+		SecondarySkill::EARTH_MAGIC,
+		Bonus::EARTH_SPELLS
 	}
 };
 
@@ -178,6 +183,8 @@ public:
 
 	CSpell();
 	~CSpell();
+	
+	bool isCastableBy(const IBonusBearer * caster, bool hasSpellBook, const std::set<SpellID> & spellBook) const;
 
 	std::vector<BattleHex> rangeInHexes(BattleHex centralHex, ui8 schoolLvl, ui8 side, bool *outDroppedHexes = nullptr ) const; //convert range to specific hexes; last optional out parameter is set to true, if spell would cover unavailable hexes (that are not included in ret)
 	si16 mainEffectAnim; //main spell effect animation, in AC format (or -1 when none)

+ 1 - 29
lib/mapObjects/CGHeroInstance.cpp

@@ -888,35 +888,7 @@ ui8 CGHeroInstance::getSpellSchoolLevel(const CSpell * spell, int *outSelectedSc
 
 bool CGHeroInstance::canCastThisSpell(const CSpell * spell) const
 {
-	if(!getArt(ArtifactPosition::SPELLBOOK)) //if hero has no spellbook
-		return false;
-
-    if (spell->isSpecialSpell())
-    {
-        if (vstd::contains(spells, spell->id))
-        {//hero has this spell in spellbook
-            logGlobal->errorStream() << "Special spell in spellbook "<<spell->name;
-        }
-
-        if (hasBonusOfType(Bonus::SPELL, spell->id))
-            return true;
-
-        return false;
-    }
-    else
-    {
-        if(vstd::contains(spells, spell->id) //hero has this spell in spellbook
-            || (spell->air && hasBonusOfType(Bonus::AIR_SPELLS)) // this is air spell and hero can cast all air spells
-            || (spell->fire && hasBonusOfType(Bonus::FIRE_SPELLS)) // this is fire spell and hero can cast all fire spells
-            || (spell->water && hasBonusOfType(Bonus::WATER_SPELLS)) // this is water spell and hero can cast all water spells
-            || (spell->earth && hasBonusOfType(Bonus::EARTH_SPELLS)) // this is earth spell and hero can cast all earth spells
-            || hasBonusOfType(Bonus::SPELL, spell->id)
-            || hasBonusOfType(Bonus::SPELLS_OF_LEVEL, spell->level)
-            )
-            return true;
-
-        return false;
-    }
+	return spell->isCastableBy(this, nullptr !=getArt(ArtifactPosition::SPELLBOOK), spells);
 }
 
 /**