| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 | 
							- /*
 
-  * CRmgTemplate.h, part of VCMI engine
 
-  *
 
-  * Authors: listed in file AUTHORS in main folder
 
-  *
 
-  * License: GNU General Public License v2.0 or later
 
-  * Full text of license available in license.txt file, in main folder
 
-  *
 
-  */
 
- #pragma once
 
- #include "../int3.h"
 
- #include "../GameConstants.h"
 
- #include "../ResourceSet.h"
 
- VCMI_LIB_NAMESPACE_BEGIN
 
- class JsonSerializeFormat;
 
- namespace ETemplateZoneType
 
- {
 
- 	enum ETemplateZoneType
 
- 	{
 
- 		PLAYER_START,
 
- 		CPU_START,
 
- 		TREASURE,
 
- 		JUNCTION,
 
- 		WATER
 
- 	};
 
- }
 
- namespace EWaterContent
 
- {
 
- 	enum EWaterContent
 
- 	{
 
- 		RANDOM = -1,
 
- 		NONE,
 
- 		NORMAL,
 
- 		ISLANDS
 
- 	};
 
- }
 
- namespace EMonsterStrength
 
- {
 
- 	enum EMonsterStrength
 
- 	{
 
- 		RANDOM = -2,
 
- 		ZONE_WEAK = -1,
 
- 		ZONE_NORMAL = 0,
 
- 		ZONE_STRONG = 1,
 
- 		GLOBAL_WEAK = 2,
 
- 		GLOBAL_NORMAL = 3,
 
- 		GLOBAL_STRONG = 4
 
- 	};
 
- }
 
- class DLL_LINKAGE CTreasureInfo
 
- {
 
- public:
 
- 	ui32 min;
 
- 	ui32 max;
 
- 	ui16 density;
 
- 	CTreasureInfo();
 
- 	CTreasureInfo(ui32 min, ui32 max, ui16 density);
 
- 	bool operator ==(const CTreasureInfo & other) const;
 
- 	void serializeJson(JsonSerializeFormat & handler);
 
- };
 
- namespace rmg
 
- {
 
- class DLL_LINKAGE ZoneConnection
 
- {
 
- public:
 
- 	ZoneConnection();
 
- 	TRmgTemplateZoneId getZoneA() const;
 
- 	TRmgTemplateZoneId getZoneB() const;
 
- 	int getGuardStrength() const;
 
- 	void serializeJson(JsonSerializeFormat & handler);
 
- 	
 
- 	friend bool operator==(const ZoneConnection &, const ZoneConnection &);
 
- private:
 
- 	TRmgTemplateZoneId zoneA;
 
- 	TRmgTemplateZoneId zoneB;
 
- 	int guardStrength;
 
- };
 
- class DLL_LINKAGE ZoneOptions
 
- {
 
- public:
 
- 	static const TRmgTemplateZoneId NO_ZONE;
 
- 	class DLL_LINKAGE CTownInfo
 
- 	{
 
- 	public:
 
- 		CTownInfo();
 
- 		int getTownCount() const;
 
- 		int getCastleCount() const;
 
- 		int getTownDensity() const;
 
- 		int getCastleDensity() const;
 
- 		void serializeJson(JsonSerializeFormat & handler);
 
- 	private:
 
- 		int townCount;
 
- 		int castleCount;
 
- 		int townDensity;
 
- 		int castleDensity;
 
- 	};
 
- 	ZoneOptions();
 
- 	TRmgTemplateZoneId getId() const;
 
- 	void setId(TRmgTemplateZoneId value);
 
- 	ETemplateZoneType::ETemplateZoneType getType() const;
 
- 	void setType(ETemplateZoneType::ETemplateZoneType value);
 
- 	
 
- 	int getSize() const;
 
- 	void setSize(int value);
 
- 	boost::optional<int> getOwner() const;
 
- 	const std::set<TerrainId> & getTerrainTypes() const;
 
- 	void setTerrainTypes(const std::set<TerrainId> & value);
 
- 	const CTownInfo & getPlayerTowns() const;
 
- 	const CTownInfo & getNeutralTowns() const;
 
- 	std::set<TFaction> getDefaultTownTypes() const;
 
- 	const std::set<TFaction> & getTownTypes() const;
 
- 	const std::set<TFaction> & getMonsterTypes() const;
 
- 	void setTownTypes(const std::set<TFaction> & value);
 
- 	void setMonsterTypes(const std::set<TFaction> & value);
 
- 	void setMinesInfo(const std::map<TResource, ui16> & value);
 
- 	std::map<TResource, ui16> getMinesInfo() const;
 
- 	void setTreasureInfo(const std::vector<CTreasureInfo> & value);
 
- 	void addTreasureInfo(const CTreasureInfo & value);
 
- 	const std::vector<CTreasureInfo> & getTreasureInfo() const;
 
- 	ui32 getMaxTreasureValue() const;
 
- 	void recalculateMaxTreasureValue();
 
- 	TRmgTemplateZoneId getMinesLikeZone() const;
 
- 	TRmgTemplateZoneId getTerrainTypeLikeZone() const;
 
- 	TRmgTemplateZoneId getTreasureLikeZone() const;
 
- 	void addConnection(TRmgTemplateZoneId otherZone);
 
- 	std::vector<TRmgTemplateZoneId> getConnections() const;
 
- 	void serializeJson(JsonSerializeFormat & handler);
 
- 	
 
- 	EMonsterStrength::EMonsterStrength zoneMonsterStrength;
 
- 	
 
- 	bool areTownsSameType() const;
 
- 	bool isMatchTerrainToTown() const;
 
- protected:
 
- 	TRmgTemplateZoneId id;
 
- 	ETemplateZoneType::ETemplateZoneType type;
 
- 	int size;
 
- 	ui32 maxTreasureValue;
 
- 	boost::optional<int> owner;
 
- 	CTownInfo playerTowns;
 
- 	CTownInfo neutralTowns;
 
- 	bool matchTerrainToTown;
 
- 	std::set<TerrainId> terrainTypes;
 
- 	bool townsAreSameType;
 
- 	std::set<TFaction> townTypes;
 
- 	std::set<TFaction> monsterTypes;
 
- 	std::map<TResource, ui16> mines; //obligatory mines to spawn in this zone
 
- 	std::vector<CTreasureInfo> treasureInfo;
 
- 	std::vector<TRmgTemplateZoneId> connections; //list of adjacent zones
 
- 	TRmgTemplateZoneId minesLikeZone;
 
- 	TRmgTemplateZoneId terrainTypeLikeZone;
 
- 	TRmgTemplateZoneId treasureLikeZone;
 
- };
 
- }
 
- /// The CRmgTemplate describes a random map template.
 
- class DLL_LINKAGE CRmgTemplate
 
- {
 
- public:
 
- 	using Zones = std::map<TRmgTemplateZoneId, std::shared_ptr<rmg::ZoneOptions>>;
 
- 	class DLL_LINKAGE CPlayerCountRange
 
- 	{
 
- 	public:
 
- 		void addRange(int lower, int upper);
 
- 		void addNumber(int value);
 
- 		bool isInRange(int count) const;
 
- 		std::set<int> getNumbers() const;
 
- 		std::string toString() const;
 
- 		void fromString(const std::string & value);
 
- 	private:
 
- 		std::vector<std::pair<int, int> > range;
 
- 	};
 
- 	CRmgTemplate();
 
- 	bool matchesSize(const int3 & value) const;
 
- 	bool isWaterContentAllowed(EWaterContent::EWaterContent waterContent) const;
 
- 	const std::set<EWaterContent::EWaterContent> & getWaterContentAllowed() const;
 
- 	void setId(const std::string & value);
 
- 	void setName(const std::string & value);
 
- 	const std::string & getId() const;
 
- 	const std::string & getName() const;
 
- 	const CPlayerCountRange & getPlayers() const;
 
- 	const CPlayerCountRange & getCpuPlayers() const;
 
- 	std::pair<int3, int3> getMapSizes() const;
 
- 	const Zones & getZones() const;
 
- 	const std::vector<rmg::ZoneConnection> & getConnections() const;
 
- 	void validate() const; /// Tests template on validity and throws exception on failure
 
- 	void serializeJson(JsonSerializeFormat & handler);
 
- private:
 
- 	std::string id;
 
- 	std::string name;
 
- 	int3 minSize, maxSize;
 
- 	CPlayerCountRange players, cpuPlayers;
 
- 	Zones zones;
 
- 	std::vector<rmg::ZoneConnection> connections;
 
- 	std::set<EWaterContent::EWaterContent> allowedWaterContent;
 
- 	void afterLoad();
 
- 	std::set<TerrainId> inheritTerrainType(std::shared_ptr<rmg::ZoneOptions> zone, uint32_t iteration = 0);
 
- 	std::map<TResource, ui16> inheritMineTypes(std::shared_ptr<rmg::ZoneOptions> zone, uint32_t iteration = 0);
 
- 	std::vector<CTreasureInfo> inheritTreasureInfo(std::shared_ptr<rmg::ZoneOptions> zone, uint32_t iteration = 0);
 
- 	void serializeSize(JsonSerializeFormat & handler, int3 & value, const std::string & fieldName);
 
- 	void serializePlayers(JsonSerializeFormat & handler, CPlayerCountRange & value, const std::string & fieldName);
 
- };
 
- VCMI_LIB_NAMESPACE_END
 
 
  |