Symphony Of Empires
unit.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 // unit.hpp
20 //
21 // Abstract:
22 // Does some important stuff.
23 // ----------------------------------------------------------------------------
24 
25 #pragma once
26 
27 #include <string>
28 #include <vector>
29 #include <cstdint>
30 #include <cstddef>
31 #include <cassert>
32 #include <type_traits>
33 #include <glm/vec2.hpp>
34 #include "objects.hpp"
35 #include "eng3d/freelist.hpp"
36 
37 class Nation;
38 struct Commodity;
39 class Province;
40 class World;
41 
44 struct UnitType : RefnameEntity<UnitTypeId> {
47  float speed;
48  float max_health;
49  float defense;
50  float attack;
51  float capacity; // Capacity of units that can be carried (transport units)
52  bool is_ground; // Can go on ground?
53  bool is_naval; // Can go on water?
54  std::vector<std::pair<CommodityId, float>> req_goods; // Required commodities
55  std::string get_icon_path() const {
56  return string_format("gfx/unittype/%s.png", ref_name.c_str());
57  }
58 };
59 template<>
61  template<bool is_const>
63  template<bool is_serialize>
64  static inline void deser_dynamic(Eng3D::Deser::Archive& ar, type<is_serialize>& obj) {
65  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
66  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.name);
67  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.ref_name);
68  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.supply_consumption);
69  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.speed);
70  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.max_health);
71  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.defense);
72  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.attack);
73  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.is_ground);
74  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.is_naval);
75  }
76 };
77 
78 class UnitManager;
80 class Unit : public Entity<UnitId> {
81  Unit& operator=(const Unit&) = default;
82  friend class Client;
83  friend class UnitManager;
84  friend struct Eng3D::Deser::Serializer<Unit>;
85  std::vector<ProvinceId> path;
86  float days_left_until_move = 0;
87  bool has_target = false;
88  ProvinceId target_province_id;
89 public:
90  float attack(Unit& enemy);
91  glm::vec2 get_pos() const;
92 
93  void set_target(const Province& province);
94 
95  void stop_movement() {
96  this->has_target = false;
97  this->days_left_until_move = 0;
98  }
99 
100  float days_to_move_to(const Province& province) const;
101  bool update_movement(UnitManager& unit_manager); // Returns true if unit moved
102  void set_owner(const Nation& nation);
103 
107  bool can_move() const {
108  return !(this->on_battle); // Unit must not be on a battle
109  }
110 
111  const std::vector<ProvinceId> get_path() const {
112  return path;
113  }
114 
115  void set_path(const Province& target);
116 
117  bool has_target_province() const {
118  return this->has_target;
119  }
120 
122  return this->target_province_id;
123  }
124 
125  float get_strength() const;
126 
130  ProvinceId province_id() const;
131 
132  float size = 0.f;
133  float base = 0.f;
134  float experience = 1.f;
135  bool on_battle = false;
136 };
137 template<>
139  template<bool is_const>
141  template<bool is_serialize>
143  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.cached_id);
144  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.type_id);
145  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.size);
146  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.base);
147  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.experience);
148  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.target_province_id);
149  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.has_target);
150  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.owner_id);
151  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.days_left_until_move);
152  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.path);
153  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.on_battle);
154  }
155 };
156 
157 class UnitManager {
158  UnitManager& operator=(const UnitManager&) = default;
159 public:
160  void init(World& world);
161  void add_unit(Unit unit, ProvinceId unit_current_province);
162  void remove_unit(UnitId unit);
163  void move_unit(UnitId unit, ProvinceId target_province);
164 
165  std::vector<UnitId> get_province_units(ProvinceId province_id) const {
166  return province_units[province_id];
167  }
168 
170  return unit_province[unit_id];
171  }
172 
174 
175  std::vector<ProvinceId> unit_province;
176  std::vector<std::vector<UnitId>> province_units;
177 };
178 template<>
180  template<bool is_const>
182  template<bool is_serialize>
184  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.units);
185  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.unit_province);
186  Eng3D::Deser::deser_dynamic<is_serialize>(ar, obj.province_units);
187  }
188 };
A single province, which is used to simulate economy in a "bulk-tiles" way instead of doing economica...
Definition: province.hpp:48
Roughly a batallion, consisting of approximately 500 soldiers each.
Definition: unit.hpp:80
bool on_battle
Definition: unit.hpp:135
float size
Definition: unit.hpp:132
float days_to_move_to(const Province &province) const
Definition: unit.cpp:89
void set_owner(const Nation &nation)
Definition: unit.cpp:184
UnitTypeId type_id
Definition: unit.hpp:127
const std::vector< ProvinceId > get_path() const
Definition: unit.hpp:111
void set_target(const Province &province)
Definition: unit.cpp:67
NationId owner_id
Definition: unit.hpp:128
void stop_movement()
Definition: unit.hpp:95
float base
Definition: unit.hpp:133
bool can_move() const
Checks if the unit can move (if it can set_province)
Definition: unit.hpp:107
ProvinceId get_target_province_id() const
Definition: unit.hpp:121
float experience
Definition: unit.hpp:134
float get_strength() const
Definition: unit.cpp:222
ProvinceId province_id() const
Definition: unit.cpp:83
bool has_target_province() const
Definition: unit.hpp:117
float attack(Unit &enemy)
Definition: unit.cpp:57
glm::vec2 get_pos() const
Definition: unit.cpp:77
PopId pop_id
Definition: unit.hpp:129
void set_path(const Province &target)
Definition: unit.cpp:188
bool update_movement(UnitManager &unit_manager)
Definition: unit.cpp:99
void add_unit(Unit unit, ProvinceId unit_current_province)
Definition: unit.cpp:121
Eng3D::Freelist< Unit > units
Definition: unit.hpp:173
std::vector< std::vector< UnitId > > province_units
Definition: unit.hpp:176
std::vector< ProvinceId > unit_province
Definition: unit.hpp:175
ProvinceId get_unit_current_province(UnitId unit_id) const
Definition: unit.hpp:169
void init(World &world)
Fill in the relationship vectors for each nation.
Definition: unit.cpp:117
void move_unit(UnitId unit, ProvinceId target_province)
Definition: unit.cpp:151
void remove_unit(UnitId unit)
Definition: unit.cpp:138
std::vector< UnitId > get_province_units(ProvinceId province_id) const
Definition: unit.hpp:165
Definition: world.hpp:114
std::string string_format(const std::string_view format, Args &&... args)
String formatter.
Definition: string.hpp:100
A commodity, mostly serves as a "product type".
Definition: product.hpp:35
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, Unit >::type type
Definition: unit.hpp:140
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: unit.hpp:142
typename Eng3D::Deser::CondConstType< is_const, UnitManager >::type type
Definition: unit.hpp:181
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: unit.hpp:183
typename Eng3D::Deser::CondConstType< is_const, UnitType >::type type
Definition: unit.hpp:62
static void deser_dynamic(Eng3D::Deser::Archive &ar, type< is_serialize > &obj)
Definition: unit.hpp:64
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
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
Defines a type of unit, it can be a tank, garrison, infantry, etc this is moddable via a lua script a...
Definition: unit.hpp:44
float defense
Definition: unit.hpp:49
bool is_naval
Definition: unit.hpp:53
float capacity
Definition: unit.hpp:51
std::string get_icon_path() const
Definition: unit.hpp:55
float speed
Definition: unit.hpp:47
Eng3D::StringRef name
Definition: unit.hpp:45
float attack
Definition: unit.hpp:50
std::vector< std::pair< CommodityId, float > > req_goods
Definition: unit.hpp:54
float max_health
Definition: unit.hpp:48
bool is_ground
Definition: unit.hpp:52
float supply_consumption
Definition: unit.hpp:46