2
0
Эх сурвалжийг харах

Blocking dialogs supported

nordsoft 2 жил өмнө
parent
commit
e9279cfbc4

+ 2 - 2
lib/CTownHandler.cpp

@@ -628,10 +628,10 @@ void CTownHandler::loadBuilding(CTown * town, const std::string & stringID, cons
 				bonus->sid = Bonus::getSid32(ret->town->faction->getIndex(), ret->bid);
 				bonus->sid = Bonus::getSid32(ret->town->faction->getIndex(), ret->bid);
 		}
 		}
 		
 		
-		if(!source["rewards"].isNull() && ret->subId == BuildingSubID::NONE)
+		if(source["type"].String() == "configurable" && ret->subId == BuildingSubID::NONE)
 		{
 		{
 			ret->subId = BuildingSubID::CONFIGURABLE_REWARD;
 			ret->subId = BuildingSubID::CONFIGURABLE_REWARD;
-			ret->rewardableObjectInfo.init(source["rewards"]);
+			ret->rewardableObjectInfo.init(source);
 		}
 		}
 	}
 	}
 	//MODS COMPATIBILITY FOR 0.96
 	//MODS COMPATIBILITY FOR 0.96

+ 15 - 10
lib/mapObjects/CGTownBuilding.cpp

@@ -315,13 +315,18 @@ void CTownRewardableBuilding::heroLevelUpDone(const CGHeroInstance *hero) const
 
 
 void CTownRewardableBuilding::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) const
 void CTownRewardableBuilding::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) const
 {
 {
+	if(visitors.find(hero->id) != visitors.end())
+		return; // query not for this building
+	
 	if(answer == 0)
 	if(answer == 0)
+	{
+		cb->setObjProperty(town->id, ObjProperty::STRUCTURE_CLEAR_VISITORS, indexOnTV);
 		return; // player refused
 		return; // player refused
+	}
 
 
 	if(answer > 0 && answer-1 < configuration.info.size())
 	if(answer > 0 && answer-1 < configuration.info.size())
 	{
 	{
 		auto list = getAvailableRewards(hero, Rewardable::EEventType::EVENT_FIRST_VISIT);
 		auto list = getAvailableRewards(hero, Rewardable::EEventType::EVENT_FIRST_VISIT);
-		//markAsVisited(hero);
 		grantReward(list[answer - 1], hero);
 		grantReward(list[answer - 1], hero);
 	}
 	}
 	else
 	else
@@ -332,8 +337,8 @@ void CTownRewardableBuilding::blockingDialogAnswered(const CGHeroInstance *hero,
 
 
 void CTownRewardableBuilding::grantReward(ui32 rewardID, const CGHeroInstance * hero) const
 void CTownRewardableBuilding::grantReward(ui32 rewardID, const CGHeroInstance * hero) const
 {
 {
-	//cb->setObjProperty(town->id, ObjProperty::REWARD_SELECT, manaVortex->indexOnTV); //reset visitors for Mana Vortex
-	//cb->setObjProperty(ObjectInstanceID(indexOnTV), ObjProperty::REWARD_SELECT, rewardID);
+	town->addHeroToStructureVisitors(hero, indexOnTV);
+	
 	grantRewardBeforeLevelup(cb, configuration.info.at(rewardID), hero);
 	grantRewardBeforeLevelup(cb, configuration.info.at(rewardID), hero);
 	
 	
 	// hero is not blocked by levelup dialog - grant remainer immediately
 	// hero is not blocked by levelup dialog - grant remainer immediately
@@ -368,6 +373,8 @@ void CTownRewardableBuilding::onHeroVisit(const CGHeroInstance *h) const
 	{
 	{
 		auto vi = configuration.info.at(index);
 		auto vi = configuration.info.at(index);
 		logGlobal->debug("Granting reward %d. Message says: %s", index, vi.message.toString());
 		logGlobal->debug("Granting reward %d. Message says: %s", index, vi.message.toString());
+		
+		town->addHeroToStructureVisitors(h, indexOnTV); //adding to visitors
 
 
 		InfoWindow iw;
 		InfoWindow iw;
 		iw.player = h->tempOwner;
 		iw.player = h->tempOwner;
@@ -377,7 +384,7 @@ void CTownRewardableBuilding::onHeroVisit(const CGHeroInstance *h) const
 		if(!iw.components.empty() || !iw.text.toString().empty())
 		if(!iw.components.empty() || !iw.text.toString().empty())
 			cb->showInfoDialog(&iw);
 			cb->showInfoDialog(&iw);
 		
 		
-		//grantReward(index, h);
+		grantReward(index, h);
 	};
 	};
 	auto selectRewardsMessage = [&](const std::vector<ui32> & rewards, const MetaString & dialog) -> void
 	auto selectRewardsMessage = [&](const std::vector<ui32> & rewards, const MetaString & dialog) -> void
 	{
 	{
@@ -400,8 +407,6 @@ void CTownRewardableBuilding::onHeroVisit(const CGHeroInstance *h) const
 
 
 	if(!wasVisitedBefore(h))
 	if(!wasVisitedBefore(h))
 	{
 	{
-		town->addHeroToStructureVisitors(h, indexOnTV);
-		
 		auto rewards = getAvailableRewards(h, Rewardable::EEventType::EVENT_FIRST_VISIT);
 		auto rewards = getAvailableRewards(h, Rewardable::EEventType::EVENT_FIRST_VISIT);
 
 
 		logGlobal->debug("Visiting object with %d possible rewards", rewards.size());
 		logGlobal->debug("Visiting object with %d possible rewards", rewards.size());
@@ -442,11 +447,11 @@ void CTownRewardableBuilding::onHeroVisit(const CGHeroInstance *h) const
 			}
 			}
 		}
 		}
 
 
-		if(getAvailableRewards(h, Rewardable::EEventType::EVENT_FIRST_VISIT).empty())
+		/*if(getAvailableRewards(h, Rewardable::EEventType::EVENT_FIRST_VISIT).empty())
 		{
 		{
-			//ChangeObjectVisitors cov(ChangeObjectVisitors::VISITOR_ADD_TEAM, id, h->id);
-			//cb->sendAndApply(&cov);
-		}
+			ChangeObjectVisitors cov(ChangeObjectVisitors::VISITOR_ADD_TEAM, id, h->id);
+			cb->sendAndApply(&cov);
+		}*/
 	}
 	}
 	else
 	else
 	{
 	{

+ 20 - 1
lib/mapObjects/CGTownInstance.cpp

@@ -53,7 +53,7 @@ void CGTownInstance::setPropertyDer(ui8 what, ui32 val)
 ///this is freakin' overcomplicated solution
 ///this is freakin' overcomplicated solution
 	switch (what)
 	switch (what)
 	{
 	{
-	case ObjProperty::STRUCTURE_ADD_VISITING_HERO:
+		case ObjProperty::STRUCTURE_ADD_VISITING_HERO:
 			bonusingBuildings[val]->setProperty (ObjProperty::VISITORS, visitingHero->id.getNum());
 			bonusingBuildings[val]->setProperty (ObjProperty::VISITORS, visitingHero->id.getNum());
 			break;
 			break;
 		case ObjProperty::STRUCTURE_CLEAR_VISITORS:
 		case ObjProperty::STRUCTURE_CLEAR_VISITORS:
@@ -260,6 +260,12 @@ void CGTownInstance::setOwner(const PlayerColor & player) const
 	cb->setOwner(this, player);
 	cb->setOwner(this, player);
 }
 }
 
 
+void CGTownInstance::blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) const
+{
+	for (auto building : bonusingBuildings)
+		building->blockingDialogAnswered(hero, answer);
+}
+
 void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const
 void CGTownInstance::onHeroVisit(const CGHeroInstance * h) const
 {
 {
 	if(!cb->gameState()->getPlayerRelations( getOwner(), h->getOwner() ))//if this is enemy
 	if(!cb->gameState()->getPlayerRelations( getOwner(), h->getOwner() ))//if this is enemy
@@ -383,6 +389,19 @@ void CGTownInstance::addTownBonuses(CRandomGenerator & rand)
 		{
 		{
 			auto * newBuilding = new CTownRewardableBuilding(kvp.second->bid, kvp.second->subId, this);
 			auto * newBuilding = new CTownRewardableBuilding(kvp.second->bid, kvp.second->subId, this);
 			kvp.second->rewardableObjectInfo.configureObject(newBuilding->configuration, rand);
 			kvp.second->rewardableObjectInfo.configureObject(newBuilding->configuration, rand);
+			for(auto & rewardInfo : newBuilding->configuration.info)
+			{
+				for (auto & bonus : rewardInfo.reward.bonuses)
+				{
+					bonus.source = Bonus::TOWN_STRUCTURE;
+					bonus.sid = kvp.second->bid;
+					//TODO: bonus.description = object->getObjectName();
+					if (bonus.type == Bonus::MORALE)
+						rewardInfo.reward.extraComponents.emplace_back(Component::EComponentType::MORALE, 0, bonus.val, 0);
+					if (bonus.type == Bonus::LUCK)
+						rewardInfo.reward.extraComponents.emplace_back(Component::EComponentType::LUCK, 0, bonus.val, 0);
+				}
+			}
 			bonusingBuildings.push_back(newBuilding);
 			bonusingBuildings.push_back(newBuilding);
 		}
 		}
 	}
 	}

+ 1 - 0
lib/mapObjects/CGTownInstance.h

@@ -206,6 +206,7 @@ public:
 protected:
 protected:
 	void setPropertyDer(ui8 what, ui32 val) override;
 	void setPropertyDer(ui8 what, ui32 val) override;
 	void serializeJsonOptions(JsonSerializeFormat & handler) override;
 	void serializeJsonOptions(JsonSerializeFormat & handler) override;
+	void blockingDialogAnswered(const CGHeroInstance *hero, ui32 answer) const override;
 
 
 private:
 private:
 	void setOwner(const PlayerColor & owner) const;
 	void setOwner(const PlayerColor & owner) const;

+ 0 - 1
lib/rewardable/Interface.cpp

@@ -92,7 +92,6 @@ void Rewardable::Interface::grantRewardAfterLevelup(IGameCallback * cb, const Re
 
 
 	for(const Bonus & bonus : info.reward.bonuses)
 	for(const Bonus & bonus : info.reward.bonuses)
 	{
 	{
-		assert(bonus.source == Bonus::OBJECT);
 		GiveBonus gb;
 		GiveBonus gb;
 		gb.who = GiveBonus::ETarget::HERO;
 		gb.who = GiveBonus::ETarget::HERO;
 		gb.bonus = bonus;
 		gb.bonus = bonus;