blob: 4398cd4e3be9b583bccfcac94b94a3e761cf52fe (
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
|
#pragma once
#include "openvic-simulation/economy/BuildingInstance.hpp"
#include "openvic-simulation/military/UnitInstance.hpp"
#include "openvic-simulation/military/UnitType.hpp"
#include "openvic-simulation/pop/Pop.hpp"
#include "openvic-simulation/types/fixed_point/FixedPointMap.hpp"
#include "openvic-simulation/types/HasIdentifier.hpp"
#include "openvic-simulation/types/OrderedContainers.hpp"
namespace OpenVic {
struct MapInstance;
struct ProvinceDefinition;
struct TerrainType;
struct State;
struct CountryDefinition;
struct Crime;
struct GoodDefinition;
struct Ideology;
struct Culture;
struct Religion;
struct BuildingTypeManager;
struct ProvinceHistoryEntry;
struct IssueManager;
template<UnitType::branch_t>
struct UnitInstanceGroup;
template<UnitType::branch_t>
struct UnitInstanceGroupBranched;
using ArmyInstance = UnitInstanceGroupBranched<UnitType::branch_t::LAND>;
using NavyInstance = UnitInstanceGroupBranched<UnitType::branch_t::NAVAL>;
struct ProvinceInstance : HasIdentifierAndColour {
friend struct MapInstance;
using life_rating_t = int8_t;
enum struct colony_status_t : uint8_t { STATE, PROTECTORATE, COLONY };
private:
ProvinceDefinition const& PROPERTY(province_definition);
TerrainType const* PROPERTY(terrain_type);
life_rating_t PROPERTY(life_rating);
colony_status_t PROPERTY(colony_status);
State const* PROPERTY_RW(state);
CountryDefinition const* PROPERTY(owner);
CountryDefinition const* PROPERTY(controller);
// Cores being CountryDefinitions means then they won't be affected by tag switched (as desired)
std::vector<CountryDefinition const*> PROPERTY(cores);
bool PROPERTY(slave);
Crime const* PROPERTY_RW(crime);
// TODO - change this into a factory-like structure
GoodDefinition const* PROPERTY(rgo);
IdentifierRegistry<BuildingInstance> IDENTIFIER_REGISTRY(building);
ordered_set<ArmyInstance*> PROPERTY(armies);
ordered_set<NavyInstance*> PROPERTY(navies);
std::vector<Pop> PROPERTY(pops);
Pop::pop_size_t PROPERTY(total_population);
IndexedMap<PopType, fixed_point_t> PROPERTY(pop_type_distribution);
IndexedMap<Ideology, fixed_point_t> PROPERTY(ideology_distribution);
fixed_point_map_t<Culture const*> PROPERTY(culture_distribution);
fixed_point_map_t<Religion const*> PROPERTY(religion_distribution);
ProvinceInstance(
ProvinceDefinition const& new_province_definition, decltype(pop_type_distribution)::keys_t const& pop_type_keys,
decltype(ideology_distribution)::keys_t const& ideology_keys
);
void _add_pop(Pop&& pop);
void _update_pops();
public:
ProvinceInstance(ProvinceInstance&&) = default;
inline explicit constexpr operator ProvinceDefinition const&() const {
return province_definition;
}
bool expand_building(size_t building_index);
bool add_pop(Pop&& pop);
bool add_pop_vec(std::vector<PopBase> const& pop_vec);
size_t get_pop_count() const;
void update_gamestate(Date today);
void tick(Date today);
bool add_army(ArmyInstance& army);
bool remove_army(ArmyInstance& army);
bool add_navy(NavyInstance& navy);
bool remove_navy(NavyInstance& navy);
template<UnitType::branch_t Branch>
bool add_unit_instance_group(UnitInstanceGroup<Branch>& group) {
if constexpr (Branch == UnitType::branch_t::LAND) {
return add_army(static_cast<ArmyInstance&>(group));
} else if constexpr (Branch == UnitType::branch_t::NAVAL) {
return add_navy(static_cast<NavyInstance&>(group));
} else {
OpenVic::utility::unreachable();
}
}
template<UnitType::branch_t Branch>
bool remove_unit_instance_group(UnitInstanceGroup<Branch>& group) {
if constexpr (Branch == UnitType::branch_t::LAND) {
return remove_army(static_cast<ArmyInstance&>(group));
} else if constexpr (Branch == UnitType::branch_t::NAVAL) {
return remove_navy(static_cast<NavyInstance&>(group));
} else {
OpenVic::utility::unreachable();
}
}
bool setup(BuildingTypeManager const& building_type_manager);
bool apply_history_to_province(ProvinceHistoryEntry const* entry);
void setup_pop_test_values(IssueManager const& issue_manager);
};
}
|