aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/units/Unit.hpp
blob: e95650ef8102150ab3d8c3b7cda47d335eb8885c (plain) (blame)
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
158
159
160
161
#pragma once

#include <cstdint>
#include <string_view>
#include "openvic-simulation/economy/Good.hpp"
#include "openvic-simulation/types/IdentifierRegistry.hpp"
#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
#include "openvic-simulation/dataloader/NodeTools.hpp"
#include "openvic-simulation/economy/Good.hpp"

#define UNIT_PARAMS Unit::icon_t icon, Unit::sprite_t sprite, bool active, std::string_view type, \
               bool floating_flag, uint32_t priority, uint32_t max_strength, uint32_t default_organisation, \
               fixed_point_t maximum_speed, fixed_point_t weighted_value, uint32_t build_time, \
               std::map<const Good*, fixed_point_t> build_cost, fixed_point_t supply_consumption, \
               std::map<const Good*, fixed_point_t> supply_cost
#define LAND_PARAMS fixed_point_t reconnaissance, fixed_point_t attack, fixed_point_t defence, fixed_point_t discipline, \
               fixed_point_t support, fixed_point_t maneuver, fixed_point_t siege
#define NAVY_PARAMS Unit::icon_t naval_icon, bool sail, bool transport, bool capital, Unit::sound_t move_sound, \
               Unit::sound_t select_sound, uint32_t colonial_points, bool build_overseas, uint32_t min_port_level, \
               int32_t limit_per_port, uint32_t supply_consumption_score, uint32_t hull, uint32_t gun_power, \
               fixed_point_t fire_range, fixed_point_t evasion, uint32_t torpedo_attack

namespace OpenVic {
   struct Unit : HasIdentifier {
      using icon_t = uint32_t;
      using sprite_t = std::string_view;
      using sound_t = std::string_view;

   private:
      const std::string_view category;
      const icon_t icon;
      const sprite_t sprite;
      const bool active;
      const std::string_view type;
      const bool floating_flag;

      const uint32_t priority;
      const uint32_t max_strength;
      const uint32_t default_organisation;
      const fixed_point_t maximum_speed;
      const fixed_point_t weighted_value;

      const uint32_t build_time;
      const std::map<const Good*, fixed_point_t> build_cost;
      const fixed_point_t supply_consumption;
      const std::map<const Good*, fixed_point_t> supply_cost;

   protected:
      Unit(std::string_view identifier, std::string_view category, UNIT_PARAMS);
   
   public:
      Unit(Unit&&) = default;

      icon_t get_icon() const;
      std::string_view get_category() const;
      sprite_t get_sprite() const;
      bool is_active() const;
      std::string_view get_type() const;
      bool has_floating_flag() const;

      uint32_t get_priority() const;
      uint32_t get_max_strength() const;
      uint32_t get_default_organisation() const;
      fixed_point_t get_maximum_speed() const;
      fixed_point_t get_weighted_value() const;

      uint32_t get_build_time() const;
      std::map<const Good*, fixed_point_t> get_build_cost() const;
      fixed_point_t get_supply_consumption() const;
      std::map<const Good*, fixed_point_t> get_supply_cost() const;
   };

   struct LandUnit : Unit {
      friend struct UnitManager;

   private:
      const fixed_point_t reconnaissance;
      const fixed_point_t attack;
      const fixed_point_t defence;
      const fixed_point_t discipline;
      const fixed_point_t support;
      const fixed_point_t maneuver;
      const fixed_point_t siege;

      LandUnit(std::string_view identifier, UNIT_PARAMS, LAND_PARAMS);

   public:
      LandUnit(LandUnit&&) = default;

      fixed_point_t get_reconnaissance() const;
      fixed_point_t get_attack() const;
      fixed_point_t get_defence() const;
      fixed_point_t get_discipline() const;
      fixed_point_t get_support() const;
      fixed_point_t get_maneuver() const;
      fixed_point_t get_siege() const;
   };

   struct NavalUnit : Unit {
      friend struct UnitManager;
   
   private:
      const icon_t naval_icon;
      const bool sail;
      const bool transport;
      const bool capital;
      const sound_t move_sound;
      const sound_t select_sound;
      const uint32_t colonial_points;
      const bool build_overseas;
      const uint32_t min_port_level;
      const int32_t limit_per_port;
      const uint32_t supply_consumption_score;

      const uint32_t hull;
      const uint32_t gun_power;
      const fixed_point_t fire_range;
      const fixed_point_t evasion;
      const uint32_t torpedo_attack;

      NavalUnit(std::string_view identifier, UNIT_PARAMS, NAVY_PARAMS);

   public:
      NavalUnit(NavalUnit&&) = default;

      icon_t get_naval_icon() const;
      bool can_sail() const;
      bool is_transport() const;
      bool is_capital() const;
      sound_t get_move_sound() const;
      sound_t get_select_sound() const;
      uint32_t get_colonial_points() const;
      bool can_build_overseas() const;
      uint32_t get_min_port_level() const;
      int32_t get_limit_per_port() const;
      uint32_t get_supply_consumption_score() const;

      uint32_t get_hull() const;
      uint32_t get_gun_power() const;
      fixed_point_t get_fire_range() const;
      fixed_point_t get_evasion() const;
      uint32_t get_torpedo_attack() const;
   };

   struct UnitManager {
   private:
      GoodManager& good_manager;
      IdentifierRegistry<Unit> units;

      bool _check_shared_parameters(const std::string_view identifier, UNIT_PARAMS);
   
   public:
      UnitManager(GoodManager& good_manager);

      bool add_land_unit(const std::string_view identifier, UNIT_PARAMS, LAND_PARAMS);
      bool add_naval_unit(const std::string_view identifier, UNIT_PARAMS, NAVY_PARAMS);
      IDENTIFIER_REGISTRY_ACCESSORS(Unit, unit)

      bool load_unit_file(ast::NodeCPtr root);
   };
}