aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/military/LeaderTrait.hpp
blob: 7dd5217ba82c0115ec188fb8c373bea04ae4d671 (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
#pragma once

#include <cstdint>
#include <string_view>

#include "openvic-simulation/misc/Modifier.hpp"
#include "openvic-simulation/dataloader/NodeTools.hpp"
#include "openvic-simulation/types/IdentifierRegistry.hpp"
#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"

namespace OpenVic {
   struct LeaderTraitManager;

   struct LeaderTrait : HasIdentifier {
      friend struct LeaderTraitManager;

      enum class trait_type_t { PERSONALITY, BACKGROUND };

   private:
      const trait_type_t PROPERTY(trait_type);
      /*
       * Allowed modifiers for leaders:
       * attack - integer
       * defence - integer
       * morale - %
       * organisation - %
       * reconnaissance - %
       * speed - %
       * attrition - %, negative is good
       * experience - %
       * reliability - decimal, mil gain or loss for associated POPs
       */
      const ModifierValue PROPERTY(modifiers);

      LeaderTrait(std::string_view new_identifier, trait_type_t new_type, ModifierValue&& new_modifiers);

   public:
      LeaderTrait(LeaderTrait&&) = default;

      bool is_personality_trait() const;
      bool is_background_trait() const;
   };

   struct LeaderTraitManager {
   private:
      IdentifierRegistry<LeaderTrait> IDENTIFIER_REGISTRY(leader_trait);

   public:
      bool add_leader_trait(std::string_view identifier, LeaderTrait::trait_type_t type, ModifierValue&& modifiers);

      bool load_leader_traits_file(ModifierManager const& modifier_manager, ast::NodeCPtr root);
   };
} // namespace OpenVic