123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- /*
- * CMap.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 "CMapDefines.h"
- #include "CMapHeader.h"
- #include "../ConstTransitivePtr.h"
- #include "../GameCallbackHolder.h"
- #include "../networkPacks/TradeItem.h"
- VCMI_LIB_NAMESPACE_BEGIN
- class CArtifactInstance;
- class CArtifactSet;
- class CGObjectInstance;
- class CGHeroInstance;
- class CCommanderInstance;
- class CGCreature;
- class CQuest;
- class CGTownInstance;
- class IModableArt;
- class IQuestObject;
- class CInputStream;
- class CMapEditManager;
- class JsonSerializeFormat;
- struct TeleportChannel;
- /// The rumor struct consists of a rumor name and text.
- struct DLL_LINKAGE Rumor
- {
- std::string name;
- MetaString text;
- Rumor() = default;
- ~Rumor() = default;
- template <typename Handler>
- void serialize(Handler & h)
- {
- h & name;
- h & text;
- }
- void serializeJson(JsonSerializeFormat & handler);
- };
- /// The disposed hero struct describes which hero can be hired from which player.
- struct DLL_LINKAGE DisposedHero
- {
- DisposedHero();
- HeroTypeID heroId;
- HeroTypeID portrait; /// The portrait id of the hero, -1 is default.
- std::string name;
- std::set<PlayerColor> players; /// Who can hire this hero (bitfield).
- template <typename Handler>
- void serialize(Handler & h)
- {
- h & heroId;
- h & portrait;
- h & name;
- h & players;
- }
- };
- /// The map contains the map header, the tiles of the terrain, objects, heroes, towns, rumors...
- class DLL_LINKAGE CMap : public CMapHeader, public GameCallbackHolder
- {
- public:
- explicit CMap(IGameCallback *cb);
- ~CMap();
- void initTerrain();
- CMapEditManager * getEditManager();
- TerrainTile & getTile(const int3 & tile);
- const TerrainTile & getTile(const int3 & tile) const;
- bool isCoastalTile(const int3 & pos) const;
- bool isWaterTile(const int3 & pos) const;
- inline bool isInTheMap(const int3 & pos) const
- {
- // Check whether coord < 0 is done implicitly. Negative signed int overflows to unsigned number larger than all signed ints.
- return
- static_cast<uint32_t>(pos.x) < static_cast<uint32_t>(width) &&
- static_cast<uint32_t>(pos.y) < static_cast<uint32_t>(height) &&
- static_cast<uint32_t>(pos.z) <= (twoLevel ? 1 : 0);
- }
- bool canMoveBetween(const int3 &src, const int3 &dst) const;
- bool checkForVisitableDir(const int3 & src, const TerrainTile * pom, const int3 & dst) const;
- int3 guardingCreaturePosition (int3 pos) const;
- void addBlockVisTiles(CGObjectInstance * obj);
- void removeBlockVisTiles(CGObjectInstance * obj, bool total = false);
- void calculateGuardingGreaturePositions();
- void addNewArtifactInstance(CArtifactSet & artSet);
- void addNewArtifactInstance(ConstTransitivePtr<CArtifactInstance> art);
- void eraseArtifactInstance(CArtifactInstance * art);
- void addNewQuestInstance(CQuest * quest);
- void removeQuestInstance(CQuest * quest);
- void setUniqueInstanceName(CGObjectInstance * obj);
- ///Use only this method when creating new map object instances
- void addNewObject(CGObjectInstance * obj);
- void moveObject(CGObjectInstance * obj, const int3 & dst);
- void removeObject(CGObjectInstance * obj);
- bool isWaterMap() const;
- bool calculateWaterContent();
- void banWaterArtifacts();
- void banWaterHeroes();
- void banHero(const HeroTypeID& id);
- void unbanHero(const HeroTypeID & id);
- void banWaterSpells();
- void banWaterSkills();
- void banWaterContent();
- /// Gets object of specified type on requested position
- const CGObjectInstance * getObjectiveObjectFrom(const int3 & pos, Obj type);
- CGHeroInstance * getHero(HeroTypeID heroId);
- /// Sets the victory/loss condition objectives ??
- void checkForObjectives();
- void resetStaticData();
- void resolveQuestIdentifiers();
- void reindexObjects();
- ui32 checksum;
- std::vector<Rumor> rumors;
- std::vector<DisposedHero> disposedHeroes;
- std::vector<ConstTransitivePtr<CGHeroInstance> > predefinedHeroes;
- std::set<SpellID> allowedSpells;
- std::set<ArtifactID> allowedArtifact;
- std::set<SecondarySkill> allowedAbilities;
- std::vector<CMapEvent> events;
- int3 grailPos;
- int grailRadius;
- //Central lists of items in game. Position of item in the vectors below is their (instance) id.
- std::vector< ConstTransitivePtr<CGObjectInstance> > objects;
- std::vector< ConstTransitivePtr<CGTownInstance> > towns;
- std::vector< ConstTransitivePtr<CArtifactInstance> > artInstances;
- std::vector< ConstTransitivePtr<CQuest> > quests;
- std::vector< ConstTransitivePtr<CGHeroInstance> > allHeroes; //indexed by [hero_type_id]; on map, disposed, prisons, etc.
- //Helper lists
- std::vector< ConstTransitivePtr<CGHeroInstance> > heroesOnMap;
- std::map<TeleportChannelID, std::shared_ptr<TeleportChannel> > teleportChannels;
- /// associative list to identify which hero/creature id belongs to which object id(index for objects)
- std::map<si32, ObjectInstanceID> questIdentifierToId;
- std::unique_ptr<CMapEditManager> editManager;
- boost::multi_array<int3, 3> guardingCreaturePositions;
- std::map<std::string, ConstTransitivePtr<CGObjectInstance> > instanceNames;
- bool waterMap;
- ui8 obeliskCount = 0; //how many obelisks are on map
- std::map<TeamID, ui8> obelisksVisited; //map: team_id => how many obelisks has been visited
- std::vector<const CArtifact *> townMerchantArtifacts;
- std::vector<TradeItemBuy> townUniversitySkills;
- private:
- /// a 3-dimensional array of terrain tiles, access is as follows: x, y, level. where level=1 is underground
- boost::multi_array<TerrainTile, 3> terrain;
- si32 uidCounter; //TODO: initialize when loading an old map
- public:
- template <typename Handler>
- void serialize(Handler &h)
- {
- h & static_cast<CMapHeader&>(*this);
- h & triggeredEvents; //from CMapHeader
- h & rumors;
- h & allowedSpells;
- h & allowedAbilities;
- h & allowedArtifact;
- h & events;
- h & grailPos;
- h & artInstances;
- h & quests;
- h & allHeroes;
- //TODO: viccondetails
- h & terrain;
- h & guardingCreaturePositions;
- h & objects;
- h & heroesOnMap;
- h & teleportChannels;
- h & towns;
- h & artInstances;
- // static members
- h & obeliskCount;
- h & obelisksVisited;
- h & townMerchantArtifacts;
- h & townUniversitySkills;
- h & instanceNames;
- }
- };
- VCMI_LIB_NAMESPACE_END
|