Browse Source

Merge pull request #185 from vmarkovtsev/issue/2264

Fix 2264 learning stone & Learning skill
DjWarmonger 9 years ago
parent
commit
4352f49a1d
2 changed files with 17 additions and 11 deletions
  1. 13 8
      lib/mapObjects/CRewardableObject.cpp
  2. 4 3
      lib/mapObjects/CRewardableObject.h

+ 13 - 8
lib/mapObjects/CRewardableObject.cpp

@@ -99,7 +99,7 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const
 			iw.player = h->tempOwner;
 			iw.soundID = soundID;
 			iw.text = info[index].message;
-			info[index].reward.loadComponents(iw.components);
+			info[index].reward.loadComponents(iw.components, h);
 			cb->showInfoDialog(&iw);
 		}
 		// grant reward afterwards. Note that it may remove object
@@ -112,7 +112,7 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const
 		sd.soundID = soundID;
 		sd.text = onSelect;
 		for (auto index : rewards)
-			sd.components.push_back(info[index].reward.getDisplayedComponent());
+			sd.components.push_back(info[index].reward.getDisplayedComponent(h));
 		cb->showBlockingDialog(&sd);
 	};
 
@@ -341,19 +341,24 @@ bool CRewardableObject::wasVisited (const CGHeroInstance * h) const
 	}
 }
 
-void CRewardInfo::loadComponents(std::vector<Component> & comps) const
+void CRewardInfo::loadComponents(std::vector<Component> & comps,
+                                 const CGHeroInstance * h) const
 {
 	for (auto comp : extraComponents)
 		comps.push_back(comp);
 
-	if (gainedExp)    comps.push_back(Component(Component::EXPERIENCE, 0, gainedExp, 0));
+	if (gainedExp)
+	{
+		comps.push_back(Component(
+			Component::EXPERIENCE, 0, h->calculateXp(gainedExp), 0));
+	}
 	if (gainedLevels) comps.push_back(Component(Component::EXPERIENCE, 0, gainedLevels, 0));
 
-	if (manaDiff)   comps.push_back(Component(Component::PRIM_SKILL, 5, manaDiff,   0));
+	if (manaDiff) comps.push_back(Component(Component::PRIM_SKILL, 5, manaDiff, 0));
 
 	for (size_t i=0; i<primary.size(); i++)
 	{
-		if (primary[i] !=0)
+		if (primary[i] != 0)
 			comps.push_back(Component(Component::PRIM_SKILL, i, primary[i], 0));
 	}
 
@@ -376,10 +381,10 @@ void CRewardInfo::loadComponents(std::vector<Component> & comps) const
 	}
 }
 
-Component CRewardInfo::getDisplayedComponent() const
+Component CRewardInfo::getDisplayedComponent(const CGHeroInstance * h) const
 {
 	std::vector<Component> comps;
-	loadComponents(comps);
+	loadComponents(comps, h);
 	assert(!comps.empty());
 	return comps.front();
 }

+ 4 - 3
lib/mapObjects/CRewardableObject.h

@@ -104,9 +104,10 @@ public:
 	/// if set to true, object will be removed after granting reward
 	bool removeObject;
 
-	/// Generates list of components that describes reward
-	virtual void loadComponents(std::vector<Component> & comps) const;
-	Component getDisplayedComponent() const;
+	/// Generates list of components that describes reward for a specific hero
+	virtual void loadComponents(std::vector<Component> & comps,
+	                            const CGHeroInstance * h) const;
+	Component getDisplayedComponent(const CGHeroInstance * h) const;
 
 	CRewardInfo() :
 		gainedExp(0),