123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*
- * ObstacleSetHandler.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 "../GameConstants.h"
- #include "../constants/EntityIdentifiers.h"
- #include "../IHandlerBase.h"
- #include "../json/JsonNode.h"
- #include "ObjectTemplate.h"
- VCMI_LIB_NAMESPACE_BEGIN
- class DLL_LINKAGE ObstacleSet
- {
- public:
- // TODO: Create string constants for these
- enum EObstacleType
- {
- INVALID = -1,
- MOUNTAINS = 0,
- TREES,
- LAKES, // Including dry or lava lakes
- CRATERS, // Chasms, Canyons, etc.
- ROCKS,
- PLANTS, // Flowers, cacti, mushrooms, logs, shrubs, etc.
- STRUCTURES, // Buildings, ruins, etc.
- ANIMALS, // Living, or bones
- OTHER // Crystals, shipwrecks, barrels, etc.
- };
- ObstacleSet();
- explicit ObstacleSet(EObstacleType type, TerrainId terrain);
- void addObstacle(std::shared_ptr<const ObjectTemplate> obstacle);
- void removeEmptyTemplates();
- std::vector<std::shared_ptr<const ObjectTemplate>> getObstacles() const;
- EObstacleType getType() const;
- void setType(EObstacleType type);
- std::set<TerrainId> getTerrains() const;
- void setTerrain(TerrainId terrain);
- void setTerrains(const std::set<TerrainId> & terrains);
- void addTerrain(TerrainId terrain);
- EMapLevel getLevel() const;
- void setLevel(EMapLevel level);
- std::set<EAlignment> getAlignments() const;
- void addAlignment(EAlignment alignment);
- std::set<FactionID> getFactions() const;
- void addFaction(FactionID faction);
- static EObstacleType typeFromString(const std::string &str);
- std::string toString() const;
- static EMapLevel levelFromString(const std::string &str);
- si32 id;
- private:
- EObstacleType type;
- EMapLevel level;
- std::set<TerrainId> allowedTerrains; // Empty means all terrains
- std::set<FactionID> allowedFactions; // Empty means all factions
- std::set<EAlignment> allowedAlignments; // Empty means all alignments
- std::vector<std::shared_ptr<const ObjectTemplate>> obstacles;
- };
- using TObstacleTypes = std::vector<std::shared_ptr<ObstacleSet>>;
- class DLL_LINKAGE ObstacleSetFilter
- {
- public:
- ObstacleSetFilter(ObstacleSet::EObstacleType allowedType, TerrainId terrain, EMapLevel level, FactionID faction, EAlignment alignment);
- ObstacleSetFilter(std::vector<ObstacleSet::EObstacleType> allowedTypes, TerrainId terrain, EMapLevel level, FactionID faction, EAlignment alignment);
- bool filter(const ObstacleSet &set) const;
- void setType(ObstacleSet::EObstacleType type);
- void setTypes(const std::vector<ObstacleSet::EObstacleType> & types);
- std::vector<ObstacleSet::EObstacleType> getAllowedTypes() const;
- TerrainId getTerrain() const;
- void setAlignment(EAlignment alignment);
- private:
- std::vector<ObstacleSet::EObstacleType> allowedTypes;
- FactionID faction;
- EAlignment alignment;
- // TODO: Filter by faction, surface/underground, etc.
- const TerrainId terrain;
- EMapLevel level;
- };
- // TODO: Instantiate ObstacleSetHandler
- class DLL_LINKAGE ObstacleSetHandler : public IHandlerBase, boost::noncopyable
- {
- public:
- ObstacleSetHandler() = default;
- ~ObstacleSetHandler() = default;
- std::vector<JsonNode> loadLegacyData() override;
- void loadObject(std::string scope, std::string name, const JsonNode & data) override;
- void loadObject(std::string scope, std::string name, const JsonNode & data, size_t index) override;
- std::shared_ptr<ObstacleSet> loadFromJson(const std::string & scope, const JsonNode & json, const std::string & name, size_t index);
- ObstacleSet::EObstacleType convertObstacleClass(MapObjectID id);
- // TODO: Populate obstacleSets with all the obstacle sets from the game data
- void addTemplate(const std::string & scope, const std::string &name, std::shared_ptr<const ObjectTemplate> tmpl);
- void addObstacleSet(std::shared_ptr<ObstacleSet> set);
- void afterLoadFinalization() override;
-
- TObstacleTypes getObstacles(const ObstacleSetFilter &filter) const;
- private:
- std::vector< std::shared_ptr<ObstacleSet> > biomes;
- // TODO: Serialize?
- std::map<si32, std::shared_ptr<const ObjectTemplate>> obstacleTemplates;
- // FIXME: Store pointers?
- std::map<ObstacleSet::EObstacleType, std::vector<std::shared_ptr<ObstacleSet>>> obstacleSets;
- };
- VCMI_LIB_NAMESPACE_END
|