瀏覽代碼

Pass pointer to actual caller in showBlockingDialog callWith

Fixes activation of all rewardable buildings in town on blocking dialog
answer
Ivan Savenko 1 年之前
父節點
當前提交
b09d9d501b

+ 1 - 1
client/Client.h

@@ -164,7 +164,7 @@ public:
 	void changePrimSkill(const CGHeroInstance * hero, PrimarySkill which, si64 val, bool abs = false) override {};
 	void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs = false) override {};
 
-	void showBlockingDialog(BlockingDialog * iw) override {};
+	void showBlockingDialog(const IObjectInterface * caller, BlockingDialog * iw) override {};
 	void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits) override {};
 	void showTeleportDialog(TeleportDialog * iw) override {};
 	void showObjectWindow(const CGObjectInstance * object, EOpenWindowMode window, const CGHeroInstance * visitor, bool addQuery) override {};

+ 2 - 1
lib/IGameCallback.h

@@ -33,6 +33,7 @@ class CStackBasicDescriptor;
 class CGCreature;
 class CSaveFile;
 class CLoadFile;
+class IObjectInterface;
 enum class EOpenWindowMode : uint8_t;
 
 namespace spells
@@ -98,7 +99,7 @@ public:
 	virtual void giveExperience(const CGHeroInstance * hero, TExpType val) =0;
 	virtual void changePrimSkill(const CGHeroInstance * hero, PrimarySkill which, si64 val, bool abs=false)=0;
 	virtual void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs=false)=0;
-	virtual void showBlockingDialog(BlockingDialog *iw) =0;
+	virtual void showBlockingDialog(const IObjectInterface * caller, BlockingDialog *iw) =0;
 	virtual void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits) =0; //cb will be called when player closes garrison window
 	virtual void showTeleportDialog(TeleportDialog *iw) =0;
 	virtual void showObjectWindow(const CGObjectInstance * object, EOpenWindowMode window, const CGHeroInstance * visitor, bool addQuery) = 0;

+ 1 - 1
lib/mapObjects/CBank.cpp

@@ -178,7 +178,7 @@ void CBank::onHeroVisit(const CGHeroInstance * h) const
 	if (banktext == 32)
 		bd.text.replaceRawString(getObjectName());
 
-	cb->showBlockingDialog(&bd);
+	cb->showBlockingDialog(this, &bd);
 }
 
 void CBank::doVisit(const CGHeroInstance * hero) const

+ 3 - 3
lib/mapObjects/CGCreature.cpp

@@ -164,7 +164,7 @@ void CGCreature::onHeroVisit( const CGHeroInstance * h ) const
 			ynd.player = h->tempOwner;
 			ynd.text.appendLocalString(EMetaText::ADVOB_TXT, 86);
 			ynd.text.replaceName(getCreature(), getStackCount(SlotID(0)));
-			cb->showBlockingDialog(&ynd);
+			cb->showBlockingDialog(this, &ynd);
 			break;
 		}
 	default: //join for gold
@@ -180,7 +180,7 @@ void CGCreature::onHeroVisit( const CGHeroInstance * h ) const
 			boost::algorithm::replace_first(tmp, "%d", std::to_string(action));
 			boost::algorithm::replace_first(tmp,"%s",VLC->creatures()->getById(getCreature())->getNamePluralTranslated());
 			ynd.text.appendRawString(tmp);
-			cb->showBlockingDialog(&ynd);
+			cb->showBlockingDialog(this, &ynd);
 			break;
 		}
 	}
@@ -475,7 +475,7 @@ void CGCreature::flee( const CGHeroInstance * h ) const
 	ynd.player = h->tempOwner;
 	ynd.text.appendLocalString(EMetaText::ADVOB_TXT,91);
 	ynd.text.replaceName(getCreature(), getStackCount(SlotID(0)));
-	cb->showBlockingDialog(&ynd);
+	cb->showBlockingDialog(this, &ynd);
 }
 
 void CGCreature::battleFinished(const CGHeroInstance *hero, const BattleResult &result) const

+ 2 - 2
lib/mapObjects/CGDwelling.cpp

@@ -244,7 +244,7 @@ void CGDwelling::onHeroVisit( const CGHeroInstance * h ) const
 		else
 			bd.text.replaceLocalString(EMetaText::ARRAY_TXT, 173 + (int)Slots().begin()->second->getQuantityID()*3);
 		bd.text.replaceName(*Slots().begin()->second);
-		cb->showBlockingDialog(&bd);
+		cb->showBlockingDialog(this, &bd);
 		return;
 	}
 
@@ -280,7 +280,7 @@ void CGDwelling::onHeroVisit( const CGHeroInstance * h ) const
 		bd.flags |= BlockingDialog::SAFE_TO_AUTOACCEPT;
 	}
 
-	cb->showBlockingDialog(&bd);
+	cb->showBlockingDialog(this, &bd);
 }
 
 void CGDwelling::newTurn(vstd::RNG & rand) const

+ 1 - 1
lib/mapObjects/CGPandoraBox.cpp

@@ -175,7 +175,7 @@ void CGPandoraBox::onHeroVisit(const CGHeroInstance * h) const
 	BlockingDialog bd (true, false);
 	bd.player = h->getOwner();
 	bd.text.appendLocalString(EMetaText::ADVOB_TXT, 14);
-	cb->showBlockingDialog(&bd);
+	cb->showBlockingDialog(this, &bd);
 }
 
 void CGPandoraBox::battleFinished(const CGHeroInstance *hero, const BattleResult &result) const

+ 0 - 6
lib/mapObjects/CGTownInstance.cpp

@@ -301,12 +301,6 @@ void CGTownInstance::setOwner(const PlayerColor & player) const
 	cb->setOwner(this, player);
 }
 
-void CGTownInstance::blockingDialogAnswered(const CGHeroInstance *hero, int32_t answer) const
-{
-	for (auto building : rewardableBuildings)
-		building.second->blockingDialogAnswered(hero, answer); // FIXME: why call for every building?
-}
-
 void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const
 {
 	if(cb->gameState()->getPlayerRelations( getOwner(), h->getOwner() ) == PlayerRelations::ENEMIES)

+ 0 - 1
lib/mapObjects/CGTownInstance.h

@@ -239,7 +239,6 @@ public:
 protected:
 	void setPropertyDer(ObjProperty what, ObjPropertyID identifier) override;
 	void serializeJsonOptions(JsonSerializeFormat & handler) override;
-	void blockingDialogAnswered(const CGHeroInstance *hero, int32_t answer) const override;
 
 private:
 	FactionID randomizeFaction(vstd::RNG & rand);

+ 1 - 1
lib/mapObjects/CQuest.cpp

@@ -851,7 +851,7 @@ void CGBorderGuard::onHeroVisit(const CGHeroInstance * h) const
 		BlockingDialog bd (true, false);
 		bd.player = h->getOwner();
 		bd.text.appendLocalString (EMetaText::ADVOB_TXT, 17);
-		cb->showBlockingDialog (&bd);
+		cb->showBlockingDialog (this, &bd);
 	}
 	else
 	{

+ 1 - 1
lib/mapObjects/CRewardableObject.cpp

@@ -52,7 +52,7 @@ void CRewardableObject::selectRewardWithMessage(const CGHeroInstance * contextHe
 	sd.player = contextHero->tempOwner;
 	sd.text = dialog;
 	sd.components = loadComponents(contextHero, rewardIndices);
-	cb->showBlockingDialog(&sd);
+	cb->showBlockingDialog(this, &sd);
 
 }
 

+ 4 - 4
lib/mapObjects/MiscObjects.cpp

@@ -88,7 +88,7 @@ void CGMine::onHeroVisit( const CGHeroInstance * h ) const
 		BlockingDialog ynd(true,false);
 		ynd.player = h->tempOwner;
 		ynd.text.appendLocalString(EMetaText::ADVOB_TXT, isAbandoned() ? 84 : 187);
-		cb->showBlockingDialog(&ynd);
+		cb->showBlockingDialog(this, &ynd);
 		return;
 	}
 
@@ -310,7 +310,7 @@ void CGResource::onHeroVisit( const CGHeroInstance * h ) const
 			BlockingDialog ynd(true,false);
 			ynd.player = h->getOwner();
 			ynd.text = message;
-			cb->showBlockingDialog(&ynd);
+			cb->showBlockingDialog(this, &ynd);
 		}
 		else
 		{
@@ -879,7 +879,7 @@ void CGArtifact::onHeroVisit(const CGHeroInstance * h) const
 					ynd.text.replaceRawString(getArmyDescription());
 					ynd.text.replaceLocalString(EMetaText::GENERAL_TXT, 43); // creatures
 				}
-				cb->showBlockingDialog(&ynd);
+				cb->showBlockingDialog(this, &ynd);
 			}
 			break;
 		case Obj::SPELL_SCROLL:
@@ -889,7 +889,7 @@ void CGArtifact::onHeroVisit(const CGHeroInstance * h) const
 					BlockingDialog ynd(true,false);
 					ynd.player = h->getOwner();
 					ynd.text = message;
-					cb->showBlockingDialog(&ynd);
+					cb->showBlockingDialog(this, &ynd);
 				}
 				else
 					blockingDialogAnswered(h, true);

+ 1 - 1
lib/mapObjects/TownBuildingInstance.cpp

@@ -221,7 +221,7 @@ void TownRewardableBuildingInstance::onHeroVisit(const CGHeroInstance *h) const
 		if (rewards.size() == 1)
 			configuration.info.at(rewards.front()).reward.loadComponents(sd.components, h);
 
-		cb->showBlockingDialog(&sd);
+		cb->showBlockingDialog(this, &sd);
 	};
 	
 	if(!town->hasBuilt(getBuildingType()))

+ 2 - 2
server/CGameHandler.cpp

@@ -1078,9 +1078,9 @@ void CGameHandler::setOwner(const CGObjectInstance * obj, const PlayerColor owne
 	}
 }
 
-void CGameHandler::showBlockingDialog(BlockingDialog *iw)
+void CGameHandler::showBlockingDialog(const IObjectInterface * caller, BlockingDialog *iw)
 {
-	auto dialogQuery = std::make_shared<CBlockingDialogQuery>(this, *iw);
+	auto dialogQuery = std::make_shared<CBlockingDialogQuery>(this, caller, *iw);
 	queries->addQuery(dialogQuery);
 	iw->queryID = dialogQuery->queryID;
 	sendToAllClients(iw);

+ 1 - 1
server/CGameHandler.h

@@ -113,7 +113,7 @@ public:
 	void changePrimSkill(const CGHeroInstance * hero, PrimarySkill which, si64 val, bool abs=false) override;
 	void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs=false) override;
 
-	void showBlockingDialog(BlockingDialog *iw) override;
+	void showBlockingDialog(const IObjectInterface * caller, BlockingDialog *iw) override;
 	void showTeleportDialog(TeleportDialog *iw) override;
 	void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits) override;
 	void showObjectWindow(const CGObjectInstance * object, EOpenWindowMode window, const CGHeroInstance * visitor, bool addQuery) override;

+ 4 - 3
server/queries/MapQueries.cpp

@@ -120,11 +120,12 @@ bool CGarrisonDialogQuery::blocksPack(const CPack * pack) const
 void CBlockingDialogQuery::notifyObjectAboutRemoval(const CGObjectInstance * visitedObject, const CGHeroInstance * visitingHero) const
 {
 	assert(answer);
-	visitedObject->blockingDialogAnswered(visitingHero, *answer);
+	caller->blockingDialogAnswered(visitingHero, *answer);
 }
 
-CBlockingDialogQuery::CBlockingDialogQuery(CGameHandler * owner, const BlockingDialog & bd):
-	CDialogQuery(owner)
+CBlockingDialogQuery::CBlockingDialogQuery(CGameHandler * owner, const IObjectInterface * caller, const BlockingDialog & bd):
+	CDialogQuery(owner),
+	caller(caller)
 {
 	this->bd = bd;
 	addPlayer(bd.player);

+ 3 - 1
server/queries/MapQueries.h

@@ -15,6 +15,7 @@
 VCMI_LIB_NAMESPACE_BEGIN
 class CGHeroInstance;
 class CGObjectInstance;
+class IObjectInterface;
 VCMI_LIB_NAMESPACE_END
 
 //Created when player starts turn or when player puts game on [ause
@@ -60,9 +61,10 @@ public:
 class CBlockingDialogQuery : public CDialogQuery
 {
 public:
+	const IObjectInterface * caller;
 	BlockingDialog bd; //copy of pack... debug purposes
 
-	CBlockingDialogQuery(CGameHandler * owner, const BlockingDialog &bd);
+	CBlockingDialogQuery(CGameHandler * owner, const IObjectInterface * caller, const BlockingDialog &bd);
 
 	void notifyObjectAboutRemoval(const CGObjectInstance * visitedObject, const CGHeroInstance * visitingHero) const override;
 };

+ 1 - 1
test/mock/mock_IGameCallback.h

@@ -50,7 +50,7 @@ public:
 	void giveExperience(const CGHeroInstance * hero, TExpType val) override {}
 	void changePrimSkill(const CGHeroInstance * hero, PrimarySkill which, si64 val, bool abs=false) override {}
 	void changeSecSkill(const CGHeroInstance * hero, SecondarySkill which, int val, bool abs=false) override {}
-	void showBlockingDialog(BlockingDialog *iw) override {}
+	void showBlockingDialog(const IObjectInterface * caller, BlockingDialog *iw) override {}
 	void showGarrisonDialog(ObjectInstanceID upobj, ObjectInstanceID hid, bool removableUnits) override {} //cb will be called when player closes garrison window
 	void showTeleportDialog(TeleportDialog *iw) override {}
 	void showObjectWindow(const CGObjectInstance * object, EOpenWindowMode window, const CGHeroInstance * visitor, bool addQuery) override {};