Browse Source

Remove copy-pasted code in rewardable town building leading to hero not
registered as visitor

Ivan Savenko 1 year ago
parent
commit
c55a75cc4e

+ 1 - 13
lib/mapObjects/CRewardableObject.cpp

@@ -95,19 +95,7 @@ void CRewardableObject::blockingDialogAnswered(const CGHeroInstance * hero, int3
 	}
 	else
 	{
-		if (answer == 0)
-			return; //Player refused
-
-		if(answer > 0 && answer - 1 < configuration.info.size())
-		{
-			auto list = getAvailableRewards(hero, Rewardable::EEventType::EVENT_FIRST_VISIT);
-			markAsVisited(hero);
-			grantReward(list[answer - 1], hero);
-		}
-		else
-		{
-			throw std::runtime_error("Unhandled choice");
-		}
+		onBlockingDialogAnswered(hero, answer);
 	}
 }
 

+ 1 - 15
lib/mapObjects/TownBuildingInstance.cpp

@@ -131,21 +131,7 @@ void TownRewardableBuildingInstance::heroLevelUpDone(const CGHeroInstance *hero)
 
 void TownRewardableBuildingInstance::blockingDialogAnswered(const CGHeroInstance *hero, int32_t answer) const
 {
-	if(answer == 0)
-		return; // player refused
-	
-	if(visitors.find(hero->id) != visitors.end())
-		return; // query not for this building
-
-	if(answer > 0 && answer-1 < configuration.info.size())
-	{
-		auto list = getAvailableRewards(hero, Rewardable::EEventType::EVENT_FIRST_VISIT);
-		grantReward(list[answer - 1], hero);
-	}
-	else
-	{
-		throw std::runtime_error("Unhandled choice");
-	}
+	onBlockingDialogAnswered(hero, answer);
 }
 
 void TownRewardableBuildingInstance::grantReward(ui32 rewardID, const CGHeroInstance * hero) const

+ 17 - 0
lib/rewardable/Interface.cpp

@@ -366,4 +366,21 @@ void Rewardable::Interface::doHeroVisit(const CGHeroInstance *h) const
 	}
 }
 
+void Rewardable::Interface::onBlockingDialogAnswered(const CGHeroInstance * hero, int32_t answer) const
+{
+	if (answer == 0)
+		return; //Player refused
+
+	if(answer > 0 && answer - 1 < configuration.info.size())
+	{
+		auto list = getAvailableRewards(hero, Rewardable::EEventType::EVENT_FIRST_VISIT);
+		markAsVisited(hero);
+		grantReward(list[answer - 1], hero);
+	}
+	else
+	{
+		throw std::runtime_error("Unhandled choice");
+	}
+}
+
 VCMI_LIB_NAMESPACE_END

+ 2 - 0
lib/rewardable/Interface.h

@@ -48,6 +48,8 @@ protected:
 	virtual void markAsVisited(const CGHeroInstance * hero) const = 0;
 	virtual void markAsScouted(const CGHeroInstance * hero) const = 0;
 	virtual void grantReward(ui32 rewardID, const CGHeroInstance * hero) const = 0;
+
+	void onBlockingDialogAnswered(const CGHeroInstance * hero, int32_t answer) const;
 public:
 
 	/// filters list of visit info and returns rewards that can be granted to current hero