Skip to content

Commit 25e5b32

Browse files
committed
Move country parsing functionality to CountryParser
Expose `get_##singular##_registry` in IdentifierRegistry Expose setters for CountryDefinition unit colours Expose non-const accessors for country_definitions
1 parent cbc69f7 commit 25e5b32

File tree

6 files changed

+340
-198
lines changed

6 files changed

+340
-198
lines changed

src/openvic-simulation/country/CountryDefinition.cpp

Lines changed: 0 additions & 171 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,6 @@
22

33
#include <string_view>
44

5-
#include <openvic-dataloader/v2script/AbstractSyntaxTree.hpp>
6-
7-
#include "openvic-simulation/dataloader/Dataloader.hpp"
8-
#include "openvic-simulation/dataloader/NodeTools.hpp"
9-
#include "openvic-simulation/DefinitionManager.hpp"
10-
#include "openvic-simulation/politics/Government.hpp"
11-
#include "openvic-simulation/politics/Ideology.hpp"
12-
#include "openvic-simulation/politics/PartyPolicy.hpp"
135
#include "openvic-simulation/population/Culture.hpp"
146
#include "openvic-simulation/types/Colour.hpp"
157
#include "openvic-simulation/types/IdentifierRegistry.hpp"
@@ -72,167 +64,4 @@ bool CountryDefinitionManager::add_country(
7264
);
7365
}
7466

75-
bool CountryDefinitionManager::load_countries(
76-
DefinitionManager const& definition_manager, Dataloader const& dataloader, ast::NodeCPtr root
77-
) {
78-
static constexpr std::string_view common_dir = "common/";
79-
bool is_dynamic = false;
80-
81-
const bool ret = expect_dictionary_reserve_length(
82-
country_definitions,
83-
[this, &definition_manager, &is_dynamic, &dataloader](std::string_view key, ast::NodeCPtr value) -> bool {
84-
if (key == "dynamic_tags") {
85-
return expect_bool([&is_dynamic](bool val) -> bool {
86-
if (val == is_dynamic) {
87-
spdlog::warn_s("Redundant \"is_dynamic\", already {}", val ? "true" : "false");
88-
} else {
89-
if (is_dynamic) {
90-
spdlog::warn_s("Changing \"is_dynamic\" back to false");
91-
}
92-
is_dynamic = val;
93-
}
94-
return true;
95-
})(value);
96-
}
97-
if (expect_string(
98-
[this, &definition_manager, is_dynamic, &dataloader, &key](std::string_view filepath) -> bool {
99-
if (load_country_data_file(
100-
definition_manager, key, is_dynamic,
101-
Dataloader::parse_defines(
102-
dataloader.lookup_file(StringUtils::append_string_views(common_dir, filepath))
103-
).get_file_node()
104-
)) {
105-
return true;
106-
}
107-
spdlog::critical_s("Failed to load country data file: {}", filepath);
108-
return false;
109-
}
110-
)(value)) {
111-
return true;
112-
}
113-
spdlog::critical_s("Failed to load country: {}", key);
114-
return false;
115-
}
116-
)(root);
117-
lock_country_definitions();
118-
return ret;
119-
}
120-
121-
bool CountryDefinitionManager::load_country_colours(ast::NodeCPtr root) {
122-
return country_definitions.expect_item_dictionary_and_default(
123-
[](std::string_view key, ast::NodeCPtr value) -> bool {
124-
spdlog::warn_s("country_colors.txt references country tag {} which is not defined!", key);
125-
return true;
126-
},
127-
[](CountryDefinition& country, ast::NodeCPtr colour_node) -> bool {
128-
return expect_dictionary_keys(
129-
"color1", ONE_EXACTLY, expect_colour(assign_variable_callback(country.primary_unit_colour)),
130-
"color2", ONE_EXACTLY, expect_colour(assign_variable_callback(country.secondary_unit_colour)),
131-
"color3", ONE_EXACTLY, expect_colour(assign_variable_callback(country.tertiary_unit_colour))
132-
)(colour_node);
133-
}
134-
)(root);
135-
}
136-
137-
node_callback_t CountryDefinitionManager::load_country_party(
138-
PoliticsManager const& politics_manager, IdentifierRegistry<CountryParty>& country_parties
139-
) const {
140-
return [&politics_manager, &country_parties](ast::NodeCPtr value) -> bool {
141-
std::string_view party_name;
142-
Date start_date, end_date;
143-
Ideology const* ideology = nullptr;
144-
IndexedFlatMap<PartyPolicyGroup, PartyPolicy const*> policies { politics_manager.get_issue_manager().get_party_policy_groups() };
145-
146-
bool ret = expect_dictionary_keys_and_default(
147-
[&politics_manager, &policies, &party_name](std::string_view key, ast::NodeCPtr value) -> bool {
148-
return politics_manager.get_issue_manager().expect_party_policy_group_str(
149-
[&politics_manager, &policies, value, &party_name](PartyPolicyGroup const& party_policy_group) -> bool {
150-
PartyPolicy const*& policy = policies.at(party_policy_group);
151-
152-
if (policy != nullptr) {
153-
spdlog::error_s(
154-
"Country party \"{}\" has duplicate entry for party policy group \"{}\"",
155-
party_name, party_policy_group
156-
);
157-
return false;
158-
}
159-
160-
return politics_manager.get_issue_manager().expect_party_policy_identifier(
161-
[&party_policy_group, &policy](PartyPolicy const& party_policy) -> bool {
162-
if (&party_policy.get_issue_group() == &party_policy_group) {
163-
policy = &party_policy;
164-
return true;
165-
}
166-
167-
// TODO - change this back to error/false once TGC no longer has this issue
168-
spdlog::warn_s(
169-
"Invalid party policy \"{}\", group is \"{}\" when \"{}\" was expected.",
170-
party_policy,
171-
party_policy.get_issue_group(),
172-
party_policy_group
173-
);
174-
return true;
175-
}
176-
)(value);
177-
}
178-
)(key);
179-
},
180-
"name", ONE_EXACTLY, expect_string(assign_variable_callback(party_name)),
181-
"start_date", ONE_EXACTLY, expect_date(assign_variable_callback(start_date)),
182-
"end_date", ONE_EXACTLY, expect_date(assign_variable_callback(end_date)),
183-
"ideology", ONE_EXACTLY,
184-
politics_manager.get_ideology_manager().expect_ideology_identifier(assign_variable_callback_pointer(ideology))
185-
)(value);
186-
187-
if (ideology == nullptr) {
188-
spdlog::warn_s("Country party {} has no ideology, defaulting to nullptr / no ideology", party_name);
189-
}
190-
191-
ret &= country_parties.emplace_item(
192-
party_name,
193-
duplicate_warning_callback,
194-
party_name, start_date, end_date, ideology, std::move(policies)
195-
);
196-
197-
return ret;
198-
};
199-
}
200-
201-
bool CountryDefinitionManager::load_country_data_file(
202-
DefinitionManager const& definition_manager, std::string_view name, bool is_dynamic, ast::NodeCPtr root
203-
) {
204-
colour_t colour;
205-
GraphicalCultureType const* graphical_culture;
206-
IdentifierRegistry<CountryParty> parties { "country parties" };
207-
CountryDefinition::unit_names_map_t unit_names;
208-
CountryDefinition::government_colour_map_t alternative_colours;
209-
bool ret = expect_dictionary_keys_and_default(
210-
[&definition_manager, &alternative_colours](std::string_view key, ast::NodeCPtr value) -> bool {
211-
return definition_manager.get_politics_manager().get_government_type_manager().expect_government_type_str(
212-
[&alternative_colours, value](GovernmentType const& government_type) -> bool {
213-
return expect_colour(map_callback(alternative_colours, &government_type))(value);
214-
}
215-
)(key);
216-
},
217-
"color", ONE_EXACTLY, expect_colour(assign_variable_callback(colour)),
218-
"graphical_culture", ONE_EXACTLY,
219-
definition_manager.get_pop_manager().get_culture_manager().expect_graphical_culture_type_identifier(
220-
assign_variable_callback_pointer(graphical_culture)
221-
),
222-
"party", ZERO_OR_MORE, load_country_party(definition_manager.get_politics_manager(), parties),
223-
"unit_names", ZERO_OR_ONE,
224-
definition_manager.get_military_manager().get_unit_type_manager().expect_unit_type_dictionary_reserve_length(
225-
unit_names,
226-
[&unit_names](UnitType const& unit, ast::NodeCPtr value) -> bool {
227-
return name_list_callback(map_callback(unit_names, &unit))(value);
228-
}
229-
)
230-
)(root);
231-
232-
ret &= add_country(
233-
name, colour, graphical_culture, std::move(parties), std::move(unit_names), is_dynamic, std::move(alternative_colours)
234-
);
235-
return ret;
236-
}
237-
23867
template struct fmt::formatter<OpenVic::CountryDefinition>;

src/openvic-simulation/country/CountryDefinition.hpp

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,9 @@ namespace OpenVic {
3434
unit_names_map_t PROPERTY(unit_names);
3535
const bool PROPERTY_CUSTOM_PREFIX(dynamic_tag, is);
3636
government_colour_map_t PROPERTY(alternative_colours);
37-
colour_t PROPERTY(primary_unit_colour);
38-
colour_t PROPERTY(secondary_unit_colour);
39-
colour_t PROPERTY(tertiary_unit_colour);
40-
// Unit colours not const due to being added after construction
41-
37+
colour_t PROPERTY_RW(primary_unit_colour);
38+
colour_t PROPERTY_RW(secondary_unit_colour);
39+
colour_t PROPERTY_RW(tertiary_unit_colour);
4240

4341
public:
4442
CountryDefinition(
@@ -56,23 +54,14 @@ namespace OpenVic {
5654
private:
5755
IdentifierRegistry<CountryDefinition> IDENTIFIER_REGISTRY(country_definition);
5856

59-
NodeTools::node_callback_t load_country_party(
60-
PoliticsManager const& politics_manager, IdentifierRegistry<CountryParty>& country_parties
61-
) const;
62-
6357
public:
58+
IDENTIFIER_REGISTRY_NON_CONST_ACCESSORS(country_definition);
59+
6460
bool add_country(
6561
std::string_view identifier, colour_t colour, GraphicalCultureType const* graphical_culture,
6662
IdentifierRegistry<CountryParty>&& parties, CountryDefinition::unit_names_map_t&& unit_names, bool dynamic_tag,
6763
CountryDefinition::government_colour_map_t&& alternative_colours
6864
);
69-
70-
bool load_country_colours(ast::NodeCPtr root);
71-
72-
bool load_countries(DefinitionManager const& definition_manager, Dataloader const& dataloader, ast::NodeCPtr root);
73-
bool load_country_data_file(
74-
DefinitionManager const& definition_manager, std::string_view name, bool is_dynamic, ast::NodeCPtr root
75-
);
7665
};
7766
}
7867

src/openvic-simulation/dataloader/Dataloader.cpp

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
#include <fmt/std.h>
1414

1515
#include "openvic-simulation/DefinitionManager.hpp"
16+
#include "openvic-simulation/dataloader/parse/CountryParser.hpp"
1617
#include "openvic-simulation/interface/UI.hpp"
1718
#include "openvic-simulation/misc/GameRulesManager.hpp"
1819
#include "openvic-simulation/misc/SoundEffect.hpp"
20+
#include "openvic-simulation/utility/Error.hpp"
1921
#include "openvic-simulation/utility/Logger.hpp"
2022
#include "openvic-simulation/utility/StringUtils.hpp"
2123
#include "openvic-simulation/utility/Containers.hpp"
@@ -935,6 +937,7 @@ bool Dataloader::load_defines(
935937
return false;
936938
}
937939

940+
static constexpr std::string_view common_folder = "common/";
938941
static constexpr std::string_view defines_file = "common/defines.lua";
939942
static constexpr std::string_view buildings_file = "common/buildings.txt";
940943
static constexpr std::string_view bookmark_file = "common/bookmarks.txt";
@@ -1135,18 +1138,38 @@ bool Dataloader::load_defines(
11351138
spdlog::critical_s("Failed to load bookmarks!");
11361139
ret = false;
11371140
}
1138-
if (!definition_manager.get_country_definition_manager().load_countries(
1139-
definition_manager, *this, parse_defines(lookup_file(countries_file)).get_file_node()
1140-
)) {
1141-
spdlog::critical_s("Failed to load countries!");
1142-
ret = false;
1143-
}
1144-
if (!definition_manager.get_country_definition_manager().load_country_colours(
1145-
parse_defines(lookup_file(country_colours_file)).get_file_node()
1146-
)) {
1147-
spdlog::critical_s("Failed to load country colours!");
1148-
ret = false;
1141+
1142+
{
1143+
CountryParser country_parser {
1144+
definition_manager.get_politics_manager().get_government_type_manager().get_government_type_registry(),
1145+
definition_manager.get_pop_manager().get_culture_manager().get_graphical_culture_type_registry(),
1146+
definition_manager.get_military_manager().get_unit_type_manager().get_unit_type_registry(),
1147+
definition_manager.get_politics_manager().get_issue_manager().get_party_policy_group_registry(),
1148+
definition_manager.get_politics_manager().get_issue_manager().get_party_policy_registry(),
1149+
definition_manager.get_politics_manager().get_ideology_manager().get_ideology_registry(),
1150+
parse_defines(lookup_file(countries_file))
1151+
};
1152+
if (country_parser.load_country_list() != Error::OK) {
1153+
spdlog::critical_s("Failed to load country list!");
1154+
ret = false;
1155+
} else if ( //
1156+
country_parser.load_countries_from( //
1157+
common_folder, *this, definition_manager.get_country_definition_manager() //
1158+
) != Error::OK //
1159+
) {
1160+
spdlog::critical_s("Failed to load countries!");
1161+
ret = false;
1162+
} else if ( //
1163+
country_parser.load_country_colours(
1164+
parse_defines(lookup_file(country_colours_file)).get_file_node(),
1165+
definition_manager.get_country_definition_manager()
1166+
) != Error::OK //
1167+
) {
1168+
spdlog::critical_s("Failed to load country colours!");
1169+
ret = false;
1170+
}
11491171
}
1172+
11501173
if (!definition_manager.get_pop_manager().get_culture_manager().load_culture_file(
11511174
definition_manager.get_country_definition_manager(), parse_defines(lookup_file(culture_file)).get_file_node()
11521175
)) {

0 commit comments

Comments
 (0)