Symphony Of Empires
indpobj.hpp
Go to the documentation of this file.
1 // Symphony of Empires
2 // Copyright (C) 2021, Symphony of Empires contributors
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <https://www.gnu.org/licenses/>.
16 //
17 // ----------------------------------------------------------------------------
18 // Name:
19 // indpobj.hpp
20 //
21 // Abstract:
22 // Objects/classes that can be on it's own and that don't have many
23 // particular relationships with each other
24 // ----------------------------------------------------------------------------
25 
26 #pragma once
27 
28 #include <string>
29 #include <cstdint>
30 #include "eng3d/string.hpp"
31 #include "eng3d/color.hpp"
32 #include "objects.hpp"
33 
34 struct Policies {
35  // Economic
36  float min_wage = 1.f;
37 
38  float industry_profit_tax = 0.1f;
39  float burgeoise_tax = 0.1f;
40  float pop_tax = 0.1f;
41 
42  float private_ownership = 1.f; // 0 - Ownership diallowed, ... - Max % ownable, 1 - Ownership allowed
43  float foreign_ownership = 1.f;
44  float collective_ownership = 1.f;
45  float individual_ownership = 1.f;
46 
47  float education_budget = 0.f; // State sponsored education
48  float industry_subsidies_budget = 0.f; // Subsidized factories
49 
50  // Not controllable by the player (should be?)
51  struct Economic {
52  float distributism = 0.f; // -1 = Concentrated
53  // 0 = neutral
54  // 1 = distributism
55 
56  float mercantilist = 0.f; // -1 = Mercantile
57  // 0 = neutral
58  // 1 = Mercantile
59 
60  float capitalism = 0.f; // -1 = socialism
61  // 0 = neutral
62  // 1 = capitalist
64  struct Political {
65  float individualism = 0.f; // -1 = Corporatism
66  // 0 = neutral
67  // 1 = individualist
68 
69  float state_power = 0.f; // -1 = democracy
70  // 0 = neutral
71  // 1 = autocracy
72 
73  float equalitarianism = 0.f; // -1 = elitism
74  // 0 = neutral
75  // 1 = egalitarian
76 
77  float secular = 0.f; // -1 = non-secular
78  // 0 = neutral
79  // 1 = secular
80  float pluralism = 0.f; // -1 = not pluralist
81  // 0 = neutral
82  // 1 = plural
84 
85  inline float difference(const Policies& rhs) const {
86  auto diff = 0.f;
87  diff += std::abs(rhs.min_wage - this->min_wage);
88  diff += std::abs(rhs.industry_profit_tax - this->industry_profit_tax);
89  diff += std::abs(rhs.burgeoise_tax - this->burgeoise_tax);
90  diff += std::abs(rhs.pop_tax - this->pop_tax);
91  diff += std::abs(rhs.private_ownership - this->private_ownership);
92  diff += std::abs(rhs.foreign_ownership - this->foreign_ownership);
93  diff += std::abs(rhs.collective_ownership - this->collective_ownership);
94  diff += std::abs(rhs.individual_ownership - this->individual_ownership);
95  diff += std::abs(rhs.education_budget - this->education_budget);
96  diff += std::abs(rhs.industry_subsidies_budget - this->industry_subsidies_budget);
97  return diff;
98  }
99 };
100 template<>
102  template<bool is_const>
104  template<bool is_serialize>
106  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.distributism);
107  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.mercantilist);
108  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.capitalism);
109  }
110 };
111 template<>
112 struct Eng3D::Deser::Serializer<Policies::Political> {
113  template<bool is_const>
115  template<bool is_serialize>
117  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.individualism);
118  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.state_power);
119  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.equalitarianism);
120  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.secular);
121  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.pluralism);
122  }
123 };
124 template<>
126  template<bool is_const>
128  template<bool is_serialize>
130  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.min_wage);
131  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.industry_profit_tax);
132  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.burgeoise_tax);
133  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.pop_tax);
134  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.private_ownership);
135  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.foreign_ownership);
136  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.collective_ownership);
137  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.individual_ownership);
138  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.education_budget);
139  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.industry_subsidies_budget);
140  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.economic);
141  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.political);
142  }
143 };
144 
145 struct Ideology : RefnameEntity<IdeologyId> {
146  std::uint32_t color;
148  std::string get_icon_path() const {
149  return string_format("gfx/ideology/%s.png", ref_name.c_str());
150  }
151 
152  struct Subideology : RefnameEntity<SubideologyId> {
154  std::uint32_t color;
157  };
158  std::vector<Subideology> subideologies;
159 };
160 template<>
161 struct Eng3D::Deser::Serializer<Ideology::Subideology> {
162  template<bool is_const>
164  template<bool is_serialize>
166  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
167  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
168  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
169  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.economic);
170  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.political);
171  }
172 };
173 
174 template<>
176  template<bool is_const>
178  template<bool is_serialize>
180  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
181  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
182  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
183  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.color);
184  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.subideologies);
185  }
186 };
187 
188 struct Language : RefnameEntity<LanguageId> {
189  std::uint32_t color;
194 };
195 template<>
197  template<bool is_const>
199  template<bool is_serialize>
201  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
202  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
203  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
204  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.adjective);
205  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.noun);
206  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.combo_form);
207  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.color);
208  }
209 };
210 
211 struct Religion : RefnameEntity<ReligionId> {
213  std::uint32_t color;
214  std::string get_icon_path() const {
215  return string_format("gfx/religion/%s.png", ref_name.c_str());
216  }
217 };
218 template<>
220  template<bool is_const>
222  template<bool is_serialize>
224  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
225  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
226  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
227  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.color);
228  }
229 };
230 
231 enum class PopGroup : int {
232  BURGEOISE = 0,
233  ARTISAN = 1,
234  BUREAUCRAT = 2,
235  INTELLECTUAL = 3,
236  SOLDIER = 4,
237  LABORER = 5,
238  SLAVE = 6,
239 };
240 struct PopType : RefnameEntity<PopTypeId> {
242  float social_value = 1.f;
243  std::vector<float> basic_needs_amount; // Amount of commodities needed to satisfy basic needs
244  std::vector<float> luxury_needs_satisfaction; // Amount of satisfaction each luxury commodity gives
245  std::vector<float> luxury_needs_deminishing_factor; // Deminishing returns factor of the luxury commodity satisfaction
246 };
247 template<>
249  template<bool is_const>
251  template<bool is_serialize>
253  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
254  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
255  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
256  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.social_value);
257  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.basic_needs_amount);
258  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.luxury_needs_satisfaction);
259  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.luxury_needs_deminishing_factor);
260  }
261 };
262 
263 class Province;
264 class Pop : public Entity<PopId> {
265  Pop& operator=(const Pop&) = default;
266  friend class Province;
267 public:
268  constexpr bool operator==(const Pop& rhs) const {
269  return this->type_id == rhs.type_id;
270  }
271 
273  float size = 1.f;
274  float life_needs_met = 0.f;
275  float literacy = 0.f;
276  float militancy = 0.f;
277  float budget = 0.f;
279 };
280 template<>
282  template<bool is_const>
284  template<bool is_serialize>
286  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
287  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.type_id);
288  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.size);
289  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.literacy);
290  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.militancy);
291  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.budget);
292  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.life_needs_met);
293  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.wanted_policies);
294  }
295 };
296 
298  STRATEGIC = 0x01,
299  MILITARY = 0x02,
300  NAVY = 0x04,
301  SOCIAL = 0x08,
302  ECONOMIC = 0x10,
303  POLITICS = 0x20,
304 };
305 struct Technology : public RefnameEntity<TechnologyId> {
308  float cost;
309  enum TechnologyType type;
310  std::vector<TechnologyId> req_technologies;
311 };
312 template<>
314  template<bool is_const>
316  template<bool is_serialize>
318  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
319  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
320  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
321  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.description);
322  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cost);
323  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.req_technologies);
324  }
325 };
326 
327 struct TerrainType : RefnameEntity<TerrainTypeId> {
329  uint32_t color; // Associative color (with bitmap)
330  bool is_water_body = false; // Should this terrain be treated as sea?
331  float penalty = 1.f; // Penalty imposed to various contexts
332  std::string get_icon_path() const {
333  return string_format("gfx/terraintype/%s.png", ref_name.c_str());
334  }
335 };
336 template<>
338  template<bool is_const>
340  template<bool is_serialize>
342  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
343  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
344  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
345  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.color);
346  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.penalty);
347  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.is_water_body);
348  }
349 };
Definition: indpobj.hpp:264
constexpr bool operator==(const Pop &rhs) const
Definition: indpobj.hpp:268
float militancy
Definition: indpobj.hpp:276
float life_needs_met
Definition: indpobj.hpp:274
Policies wanted_policies
Definition: indpobj.hpp:278
float budget
Definition: indpobj.hpp:277
PopTypeId type_id
Definition: indpobj.hpp:272
float literacy
Definition: indpobj.hpp:275
float size
Definition: indpobj.hpp:273
A single province, which is used to simulate economy in a "bulk-tiles" way instead of doing economica...
Definition: province.hpp:48
TechnologyType
Definition: indpobj.hpp:297
@ NAVY
Definition: indpobj.hpp:300
@ MILITARY
Definition: indpobj.hpp:299
@ STRATEGIC
Definition: indpobj.hpp:298
@ ECONOMIC
Definition: indpobj.hpp:302
@ SOCIAL
Definition: indpobj.hpp:301
@ POLITICS
Definition: indpobj.hpp:303
PopGroup
Definition: indpobj.hpp:231
std::string string_format(const std::string_view format, Args &&... args)
String formatter.
Definition: string.hpp:100
Base class that serves as archiver, stores (in memory) the data required for serialization/deserializ...
Definition: serializer.hpp:64
typename Eng3D::Deser::CondConstType< is_const, Ideology >::type type
Definition: indpobj.hpp:177
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:179
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:165
typename Eng3D::Deser::CondConstType< is_const, Ideology::Subideology >::type type
Definition: indpobj.hpp:163
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:200
typename Eng3D::Deser::CondConstType< is_const, Language >::type type
Definition: indpobj.hpp:198
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:129
typename Eng3D::Deser::CondConstType< is_const, Policies >::type type
Definition: indpobj.hpp:127
typename Eng3D::Deser::CondConstType< is_const, Policies::Economic >::type type
Definition: indpobj.hpp:103
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:105
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:116
typename Eng3D::Deser::CondConstType< is_const, Policies::Political >::type type
Definition: indpobj.hpp:114
typename Eng3D::Deser::CondConstType< is_const, Pop >::type type
Definition: indpobj.hpp:283
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:285
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:252
typename Eng3D::Deser::CondConstType< is_const, PopType >::type type
Definition: indpobj.hpp:250
typename Eng3D::Deser::CondConstType< is_const, Religion >::type type
Definition: indpobj.hpp:221
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:223
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:317
typename Eng3D::Deser::CondConstType< is_const, Technology >::type type
Definition: indpobj.hpp:315
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: indpobj.hpp:341
typename Eng3D::Deser::CondConstType< is_const, TerrainType >::type type
Definition: indpobj.hpp:339
A serializer (base class) which can be used to serialize objects and create per-object optimized clas...
Definition: serializer.hpp:111
A reference to a string on the global string pool.
Definition: string.hpp:39
const char * c_str() const
Definition: string.hpp:55
An entity which can only be referenced by an (presumably) unique Id this is the base class for the ot...
Definition: entity.hpp:94
std::uint32_t color
Definition: indpobj.hpp:154
Policies::Political political
Definition: indpobj.hpp:156
Eng3D::StringRef name
Definition: indpobj.hpp:153
Policies::Economic economic
Definition: indpobj.hpp:155
std::vector< Subideology > subideologies
Definition: indpobj.hpp:158
std::string get_icon_path() const
Definition: indpobj.hpp:148
Eng3D::StringRef name
Definition: indpobj.hpp:147
std::uint32_t color
Definition: indpobj.hpp:146
std::uint32_t color
Definition: indpobj.hpp:189
Eng3D::StringRef combo_form
Definition: indpobj.hpp:193
Eng3D::StringRef noun
Definition: indpobj.hpp:192
Eng3D::StringRef adjective
Definition: indpobj.hpp:191
Eng3D::StringRef name
Definition: indpobj.hpp:190
float collective_ownership
Definition: indpobj.hpp:44
float pop_tax
Definition: indpobj.hpp:40
float difference(const Policies &rhs) const
Definition: indpobj.hpp:85
struct Policies::Economic economic
float industry_profit_tax
Definition: indpobj.hpp:38
float burgeoise_tax
Definition: indpobj.hpp:39
float min_wage
Definition: indpobj.hpp:36
float foreign_ownership
Definition: indpobj.hpp:43
float individual_ownership
Definition: indpobj.hpp:45
struct Policies::Political political
float industry_subsidies_budget
Definition: indpobj.hpp:48
float private_ownership
Definition: indpobj.hpp:42
float education_budget
Definition: indpobj.hpp:47
std::vector< float > luxury_needs_satisfaction
Definition: indpobj.hpp:244
std::vector< float > luxury_needs_deminishing_factor
Definition: indpobj.hpp:245
std::vector< float > basic_needs_amount
Definition: indpobj.hpp:243
float social_value
Definition: indpobj.hpp:242
Eng3D::StringRef name
Definition: indpobj.hpp:241
An entity which can be referenced via a ref_name and also via id.
Definition: entity.hpp:160
Eng3D::StringRef ref_name
Definition: entity.hpp:161
Eng3D::StringRef name
Definition: indpobj.hpp:212
std::string get_icon_path() const
Definition: indpobj.hpp:214
std::uint32_t color
Definition: indpobj.hpp:213
float cost
Definition: indpobj.hpp:308
std::vector< TechnologyId > req_technologies
Definition: indpobj.hpp:310
enum TechnologyType type
Definition: indpobj.hpp:309
Eng3D::StringRef description
Definition: indpobj.hpp:307
Eng3D::StringRef name
Definition: indpobj.hpp:306
bool is_water_body
Definition: indpobj.hpp:330
std::string get_icon_path() const
Definition: indpobj.hpp:332
float penalty
Definition: indpobj.hpp:331
Eng3D::StringRef name
Definition: indpobj.hpp:328
uint32_t color
Definition: indpobj.hpp:329