Преглед изворни кода

Restored replacement of town building bonuses via building upgrade

Ivan Savenko пре 1 година
родитељ
комит
22a126cf2d

+ 1 - 0
config/buildingsLibrary.json

@@ -50,6 +50,7 @@
 	// Previously hardcoded buildings that might be used by mods
 	// Previously hardcoded buildings that might be used by mods
 	// Section 1 - building with bonuses during sieges
 	// Section 1 - building with bonuses during sieges
 	"brotherhoodOfSword" : {
 	"brotherhoodOfSword" : {
+		"upgradeReplacesBonuses" : true,
 		"bonuses": [
 		"bonuses": [
 			{
 			{
 				"type": "MORALE",
 				"type": "MORALE",

+ 1 - 1
lib/entities/building/CBuilding.h

@@ -38,7 +38,7 @@ public:
 	BuildingID bid; //structure ID
 	BuildingID bid; //structure ID
 	BuildingID upgrade; /// indicates that building "upgrade" can be improved by this, -1 = empty
 	BuildingID upgrade; /// indicates that building "upgrade" can be improved by this, -1 = empty
 	BuildingSubID::EBuildingSubID subId; /// subtype for special buildings, -1 = the building is not special
 	BuildingSubID::EBuildingSubID subId; /// subtype for special buildings, -1 = the building is not special
-	std::set<BuildingID> overrideBids; /// the building which bonuses should be overridden with bonuses of the current building
+	bool upgradeReplacesBonuses = false;
 	BonusList buildingBonuses;
 	BonusList buildingBonuses;
 
 
 	Rewardable::Info rewardableObjectInfo; ///configurable rewards for special buildings
 	Rewardable::Info rewardableObjectInfo; ///configurable rewards for special buildings

+ 2 - 19
lib/entities/faction/CTownHandler.cpp

@@ -242,7 +242,7 @@ void CTownHandler::loadBuildingRequirements(CBuilding * building, const JsonNode
 	bidsToLoad.push_back(hlp);
 	bidsToLoad.push_back(hlp);
 }
 }
 
 
-void CTownHandler::loadSpecialBuildingBonuses(const JsonNode & source, BonusList & bonusList, CBuilding * building)
+void CTownHandler::loadBuildingBonuses(const JsonNode & source, BonusList & bonusList, CBuilding * building) const
 {
 {
 	for(const auto & b : source.Vector())
 	for(const auto & b : source.Vector())
 	{
 	{
@@ -299,7 +299,7 @@ void CTownHandler::loadBuilding(CTown * town, const std::string & stringID, cons
 	ret->resources = TResources(source["cost"]);
 	ret->resources = TResources(source["cost"]);
 	ret->produce =   TResources(source["produce"]);
 	ret->produce =   TResources(source["produce"]);
 
 
-	loadSpecialBuildingBonuses(source["bonuses"], ret->buildingBonuses, ret);
+	loadBuildingBonuses(source["bonuses"], ret->buildingBonuses, ret);
 
 
 	if(!source["configuration"].isNull())
 	if(!source["configuration"].isNull())
 		ret->rewardableObjectInfo.init(source["configuration"], ret->getBaseTextID());
 		ret->rewardableObjectInfo.init(source["configuration"], ret->getBaseTextID());
@@ -843,7 +843,6 @@ void CTownHandler::beforeValidate(JsonNode & object)
 void CTownHandler::afterLoadFinalization()
 void CTownHandler::afterLoadFinalization()
 {
 {
 	initializeRequirements();
 	initializeRequirements();
-	initializeOverridden();
 	initializeWarMachines();
 	initializeWarMachines();
 }
 }
 
 
@@ -874,22 +873,6 @@ void CTownHandler::initializeRequirements()
 	requirementsToLoad.clear();
 	requirementsToLoad.clear();
 }
 }
 
 
-void CTownHandler::initializeOverridden()
-{
-	for(auto & bidHelper : overriddenBidsToLoad)
-	{
-		auto jsonNode = bidHelper.json;
-		auto scope = bidHelper.town->getBuildingScope();
-
-		for(const auto & b : jsonNode.Vector())
-		{
-			auto bid = BuildingID(VLC->identifiers()->getIdentifier(scope, b).value());
-			bidHelper.building->overrideBids.insert(bid);
-		}
-	}
-	overriddenBidsToLoad.clear();
-}
-
 void CTownHandler::initializeWarMachines()
 void CTownHandler::initializeWarMachines()
 {
 {
 	// must be done separately after all objects are loaded
 	// must be done separately after all objects are loaded

+ 2 - 3
lib/entities/faction/CTownHandler.h

@@ -41,7 +41,6 @@ class DLL_LINKAGE CTownHandler : public CHandlerBase<FactionID, Faction, CFactio
 	static const TPropagatorPtr & emptyPropagator();
 	static const TPropagatorPtr & emptyPropagator();
 
 
 	void initializeRequirements();
 	void initializeRequirements();
-	void initializeOverridden();
 	void initializeWarMachines();
 	void initializeWarMachines();
 
 
 	/// loads CBuilding's into town
 	/// loads CBuilding's into town
@@ -84,9 +83,9 @@ public:
 	std::set<FactionID> getDefaultAllowed() const;
 	std::set<FactionID> getDefaultAllowed() const;
 	std::set<FactionID> getAllowedFactions(bool withTown = true) const;
 	std::set<FactionID> getAllowedFactions(bool withTown = true) const;
 
 
-	static void loadSpecialBuildingBonuses(const JsonNode & source, BonusList & bonusList, CBuilding * building);
-
 protected:
 protected:
+
+	void loadBuildingBonuses(const JsonNode & source, BonusList & bonusList, CBuilding * building) const;
 	const std::vector<std::string> & getTypeNames() const override;
 	const std::vector<std::string> & getTypeNames() const override;
 	std::shared_ptr<CFaction> loadFromJson(const std::string & scope, const JsonNode & data, const std::string & identifier, size_t index) override;
 	std::shared_ptr<CFaction> loadFromJson(const std::string & scope, const JsonNode & data, const std::string & identifier, size_t index) override;
 };
 };

+ 14 - 3
lib/mapObjects/CGTownInstance.cpp

@@ -791,11 +791,22 @@ void CGTownInstance::recreateBuildingsBonuses()
 	for(const auto & b : bl)
 	for(const auto & b : bl)
 		removeBonus(b);
 		removeBonus(b);
 
 
+
+
 	for(const auto & bid : builtBuildings)
 	for(const auto & bid : builtBuildings)
 	{
 	{
-		// FIXME: Restore
-		//if(vstd::contains(overriddenBuildings, bid)) //tricky! -> checks tavern only if no bratherhood of sword
-		//	continue;
+		bool bonusesReplacedByUpgrade = false;
+
+		for(const auto & upgradeID : builtBuildings)
+		{
+			const auto & upgrade = town->buildings.at(upgradeID);
+			if (upgrade->getBase() == bid && upgrade->upgradeReplacesBonuses)
+				bonusesReplacedByUpgrade = true;
+		}
+
+		// bonuses from this building are disabled and replaced by bonuses from an upgrade
+		if (bonusesReplacedByUpgrade)
+			continue;
 
 
 		auto building = town->buildings.at(bid);
 		auto building = town->buildings.at(bid);
 
 

+ 0 - 1
lib/mapObjects/TownBuildingInstance.cpp

@@ -219,7 +219,6 @@ void TownRewardableBuildingInstance::onHeroVisit(const CGHeroInstance *h) const
 		cb->showBlockingDialog(&sd);
 		cb->showBlockingDialog(&sd);
 	};
 	};
 	
 	
-	assert(town->hasBuilt(getBuildingType()));
 	if(!town->hasBuilt(getBuildingType()))
 	if(!town->hasBuilt(getBuildingType()))
 		return;
 		return;