| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*
- * 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"
- #include "CMapGenOptions.h"
- class JsonSerializeFormat;
- namespace ETemplateZoneType
- {
- enum ETemplateZoneType
- {
- PLAYER_START,
- CPU_START,
- TREASURE,
- JUNCTION,
- WATER
- };
- }
- 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);
- private:
- TRmgTemplateZoneId zoneA;
- TRmgTemplateZoneId zoneB;
- int guardStrength;
- };
- class DLL_LINKAGE ZoneOptions
- {
- public:
- static const std::set<ETerrainType> DEFAULT_TERRAIN_TYPES;
- 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();
- ZoneOptions & operator=(const ZoneOptions & other);
- 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<ETerrainType> & getTerrainTypes() const;
- void setTerrainTypes(const std::set<ETerrainType> & value);
- std::set<TFaction> getDefaultTownTypes() const;
- const std::set<TFaction> & getTownTypes() 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;
- TRmgTemplateZoneId getMinesLikeZone() const;
- TRmgTemplateZoneId getTerrainTypeLikeZone() const;
- TRmgTemplateZoneId getTreasureLikeZone() const;
- void addConnection(TRmgTemplateZoneId otherZone);
- std::vector<TRmgTemplateZoneId> getConnections() const;
- void serializeJson(JsonSerializeFormat & handler);
- protected:
- TRmgTemplateZoneId id;
- ETemplateZoneType::ETemplateZoneType type;
- int size;
- boost::optional<int> owner;
- CTownInfo playerTowns;
- CTownInfo neutralTowns;
- bool matchTerrainToTown;
- std::set<ETerrainType> terrainTypes;
- bool townsAreSameType;
- std::set<TFaction> townTypes;
- std::set<TFaction> monsterTypes;
- EMonsterStrength::EMonsterStrength zoneMonsterStrength;
- 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();
- ~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);
- const std::string & getName() const;
- const CPlayerCountRange & getPlayers() const;
- const CPlayerCountRange & getCpuPlayers() 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();
- void serializeSize(JsonSerializeFormat & handler, int3 & value, const std::string & fieldName);
- void serializePlayers(JsonSerializeFormat & handler, CPlayerCountRange & value, const std::string & fieldName);
- };
|