Преглед на файлове

Rewardable town buildings prototype

nordsoft преди 2 години
родител
ревизия
2adcc89a0d
променени са 6 файла, в които са добавени 39 реда и са изтрити 4 реда
  1. 6 0
      lib/CTownHandler.cpp
  2. 4 0
      lib/CTownHandler.h
  3. 2 1
      lib/GameConstants.h
  4. 17 0
      lib/mapObjects/CGTownBuilding.h
  5. 9 2
      lib/mapObjects/CGTownInstance.cpp
  6. 1 1
      lib/mapObjects/CGTownInstance.h

+ 6 - 0
lib/CTownHandler.cpp

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

+ 4 - 0
lib/CTownHandler.h

@@ -21,6 +21,7 @@
 #include "battle/BattleHex.h"
 #include "HeroBonus.h"
 #include "Point.h"
+#include "mapObjects/CRewardableConstructor.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
@@ -56,6 +57,8 @@ public:
 	std::set<BuildingID> overrideBids; /// the building which bonuses should be overridden with bonuses of the current building
 	BonusList buildingBonuses;
 	BonusList onVisitBonuses;
+	
+	CRandomRewardObjectInfo rewardableObjectInfo; ///configurable rewards for special buildings
 
 	enum EBuildMode
 	{
@@ -134,6 +137,7 @@ public:
 		h & overrideBids;
 		h & buildingBonuses;
 		h & onVisitBonuses;
+		h & rewardableObjectInfo;
 	}
 
 	friend class CTownHandler;

+ 2 - 1
lib/GameConstants.h

@@ -581,7 +581,8 @@ namespace BuildingSubID
 		EXPERIENCE_VISITING_BONUS,
 		LIGHTHOUSE,
 		TREASURY,
-		CUSTOM_VISITING_BONUS
+		CUSTOM_VISITING_BONUS,
+		CONFIGURABLE_REWARD
 	};
 }
 

+ 17 - 0
lib/mapObjects/CGTownBuilding.h

@@ -11,6 +11,7 @@
 #pragma once
 
 #include "CObjectHandler.h"
+#include "CRewardableObject.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
@@ -104,4 +105,20 @@ private:
 	void applyBonuses(CGHeroInstance * h, const BonusList & bonuses) const;
 };
 
+class DLL_LINKAGE CTownRewardableBuilding : public CGTownBuilding, public Rewardable::Interface
+{
+public:
+	void setProperty(ui8 what, ui32 val) override;
+	void onHeroVisit (const CGHeroInstance * h) const override;
+	
+	CTownRewardableBuilding(CGTownInstance * TOWN);
+	CTownRewardableBuilding() = default;
+	
+	template <typename Handler> void serialize(Handler &h, const int version)
+	{
+		h & static_cast<CGTownBuilding&>(*this);
+		h & static_cast<Rewardable::Interface&>(*this);
+	}
+};
+
 VCMI_LIB_NAMESPACE_END

+ 9 - 2
lib/mapObjects/CGTownInstance.cpp

@@ -365,7 +365,7 @@ bool CGTownInstance::isBonusingBuildingAdded(BuildingID::EBuildingID bid) const
 	return present != bonusingBuildings.end();
 }
 
-void CGTownInstance::addTownBonuses()
+void CGTownInstance::addTownBonuses(CRandomGenerator & rand)
 {
 	for(const auto & kvp : town->buildings)
 	{
@@ -377,6 +377,13 @@ void CGTownInstance::addTownBonuses()
 
 		if(kvp.second->IsWeekBonus())
 			bonusingBuildings.push_back(new COPWBonus(kvp.second->bid, kvp.second->subId, this));
+		
+		if(kvp.second->subId == BuildingSubID::CONFIGURABLE_REWARD)
+		{
+			auto * newBuilding = new CTownRewardableBuilding(this);
+			kvp.second->rewardableObjectInfo.configureObject(newBuilding->configuration(), rand);
+			bonusingBuildings.push_back(newBuilding);
+		}
 	}
 }
 
@@ -465,7 +472,7 @@ void CGTownInstance::initObj(CRandomGenerator & rand) ///initialize town structu
 		}
 	}
 	initOverriddenBids();
-	addTownBonuses(); //add special bonuses from buildings to the bonusingBuildings vector.
+	addTownBonuses(rand); //add special bonuses from buildings to the bonusingBuildings vector.
 	recreateBuildingsBonuses();
 	updateAppearance();
 }

+ 1 - 1
lib/mapObjects/CGTownInstance.h

@@ -214,7 +214,7 @@ private:
 	bool townEnvisagesBuilding(BuildingSubID::EBuildingSubID bid) const;
 	bool isBonusingBuildingAdded(BuildingID::EBuildingID bid) const;
 	void initOverriddenBids();
-	void addTownBonuses();
+	void addTownBonuses(CRandomGenerator & rand);
 };
 
 VCMI_LIB_NAMESPACE_END