File: Zone.h

package info (click to toggle)
vcmi 1.6.5%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 32,060 kB
  • sloc: cpp: 238,971; python: 265; sh: 224; xml: 157; ansic: 78; objc: 61; makefile: 49
file content (157 lines) | stat: -rw-r--r-- 3,866 bytes parent folder | download
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