1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
/*
* Zone.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 "float3.h"
#include "../int3.h"
#include "CRmgTemplate.h"
#include "RmgArea.h"
#include "RmgPath.h"
#include "RmgObject.h"
#include "modificators/Modificator.h"
//uncomment to generate dumps afger every step of map generation
//#define RMG_DUMP
VCMI_LIB_NAMESPACE_BEGIN
class RmgMap;
class CMapGenerator;
class Modificator;
extern const std::function<bool(const int3 &)> AREA_NO_FILTER;
typedef std::list<std::shared_ptr<Modificator>> TModificators;
template<typename T>
class ThreadSafeProxy
{
public:
ThreadSafeProxy(T& resource, boost::recursive_mutex& mutex)
: resourceRef(resource), lock(mutex) {}
T* operator->() { return &resourceRef; }
const T* operator->() const { return &resourceRef; }
T& operator*() { return resourceRef; }
const T& operator*() const { return resourceRef; }
T& get() {return resourceRef;}
const T& get() const {return resourceRef;}
T operator+(const T & other)
{
return resourceRef + other;
}
template <typename U>
T operator+(ThreadSafeProxy<U> & other)
{
return get() + other.get();
}
template <typename U>
T operator+(ThreadSafeProxy<U> && other)
{
return get() + other.get();
}
private:
T& resourceRef;
std::lock_guard<boost::recursive_mutex> lock;
};
class Zone : public rmg::ZoneOptions
{
public:
Zone(RmgMap & map, CMapGenerator & generator, vstd::RNG & rand);
Zone(const Zone &) = delete;
~Zone();
void setOptions(const rmg::ZoneOptions & options);
bool isUnderground() const;
float3 getCenter() const;
void setCenter(const float3 &f);
int3 getPos() const;
void setPos(const int3 &pos);
ThreadSafeProxy<rmg::Area> area();
ThreadSafeProxy<const rmg::Area> area() const;
ThreadSafeProxy<rmg::Area> areaPossible();
ThreadSafeProxy<const rmg::Area> areaPossible() const;
ThreadSafeProxy<rmg::Area> freePaths();
ThreadSafeProxy<const rmg::Area> freePaths() const;
ThreadSafeProxy<rmg::Area> areaUsed();
ThreadSafeProxy<const rmg::Area> areaUsed() const;
rmg::Area areaForRoads() const;
void initFreeTiles();
void clearTiles();
void fractalize();
FactionID getTownType() const;
void setTownType(FactionID town);
TerrainId getTerrainType() const;
void setTerrainType(TerrainId terrain);
void connectPath(const rmg::Path & path);
rmg::Path searchPath(const rmg::Area & src, bool onlyStraight, const std::function<bool(const int3 &)> & areafilter = AREA_NO_FILTER) const;
rmg::Path searchPath(const int3 & src, bool onlyStraight, const std::function<bool(const int3 &)> & areafilter = AREA_NO_FILTER) const;
rmg::Path searchPath(const rmg::Area & src, bool onlyStraight, const rmg::Area & searchArea) const;
TModificators getModificators();
template<class T>
T* getModificator()
{
for(auto & m : modificators)
if(auto * mm = dynamic_cast<T*>(m.get()))
return mm;
return nullptr;
}
template<class T>
void addModificator()
{
modificators.emplace_back(new T(*this, map, generator));
}
void initModificators();
vstd::RNG & getRand();
public:
mutable boost::recursive_mutex areaMutex;
using Lock = boost::unique_lock<boost::recursive_mutex>;
protected:
CMapGenerator & generator;
std::unique_ptr<vstd::RNG> rand;
RmgMap & map;
TModificators modificators;
bool finished;
//placement info
int3 pos;
float3 center;
rmg::Area dArea; //irregular area assigned to zone
rmg::Area dAreaPossible;
rmg::Area dAreaFree; //core paths of free tiles that all other objects will be linked to
rmg::Area dAreaUsed;
std::vector<int3> possibleQuestArtifactPos;
//template info
FactionID townType;
TerrainId terrainType;
};
VCMI_LIB_NAMESPACE_END
|