Skip to content

Commit

Permalink
Merge pull request #85 from OpenVicProject/container-callbacks
Browse files Browse the repository at this point in the history
Container (pointer) callbacks + format cleanup
  • Loading branch information
Hop311 authored Dec 7, 2023
2 parents 48a3f17 + 3983770 commit 085fe94
Show file tree
Hide file tree
Showing 34 changed files with 290 additions and 281 deletions.
2 changes: 1 addition & 1 deletion src/openvic-simulation/GameManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ bool GameManager::reset() {
clock.reset();
today = {};
economy_manager.get_good_manager().reset_to_defaults();
bool ret = map.reset(economy_manager.get_building_manager());
bool ret = map.reset(economy_manager.get_building_type_manager());
set_needs_update();
return ret;
}
Expand Down
8 changes: 5 additions & 3 deletions src/openvic-simulation/GameManager.hpp
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
#pragma once

#include "openvic-simulation/misc/GameAdvancementHook.hpp"
#include "openvic-simulation/misc/Modifier.hpp"
#include "openvic-simulation/country/Country.hpp"
#include "openvic-simulation/economy/EconomyManager.hpp"
#include "openvic-simulation/history/HistoryManager.hpp"
#include "openvic-simulation/interface/UI.hpp"
#include "openvic-simulation/map/Crime.hpp"
#include "openvic-simulation/map/Map.hpp"
#include "openvic-simulation/military/MilitaryManager.hpp"
#include "openvic-simulation/misc/Define.hpp"
#include "openvic-simulation/misc/GameAdvancementHook.hpp"
#include "openvic-simulation/misc/Modifier.hpp"
#include "openvic-simulation/politics/PoliticsManager.hpp"
#include "openvic-simulation/pop/Pop.hpp"
#include "openvic-simulation/research/ResearchManager.hpp"
#include "openvic-simulation/research/Technology.hpp"
#include "research/ResearchManager.hpp"

namespace OpenVic {
struct GameManager {
Expand All @@ -29,6 +30,7 @@ namespace OpenVic {
ResearchManager PROPERTY_REF(research_manager);
PopManager PROPERTY_REF(pop_manager);
CountryManager PROPERTY_REF(country_manager);
CrimeManager PROPERTY_REF(crime_manager);
UIManager PROPERTY_REF(ui_manager);
GameAdvancementHook PROPERTY_REF(clock);

Expand Down
37 changes: 14 additions & 23 deletions src/openvic-simulation/dataloader/Dataloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,17 +349,13 @@ bool Dataloader::_load_rebel_types(GameManager& game_manager) const {
PoliticsManager& politics_manager = game_manager.get_politics_manager();
RebelManager& rebel_manager = politics_manager.get_rebel_manager();

bool ret = rebel_manager.load_rebels_file(
politics_manager.get_ideology_manager(),
politics_manager.get_government_type_manager(),
parse_defines(lookup_file(rebel_types_file)).get_file_node()
);
bool ret = politics_manager.load_rebels_file(parse_defines(lookup_file(rebel_types_file)).get_file_node());

if(!rebel_manager.generate_modifiers(game_manager.get_modifier_manager())) {
Logger::error("Failed to generate rebel type-based modifiers!");
ret &= false;
}

return ret;
}

Expand Down Expand Up @@ -396,7 +392,7 @@ bool Dataloader::_load_technologies(GameManager& game_manager) const {
return technology_manager.load_technologies_file(
modifier_manager,
game_manager.get_military_manager().get_unit_manager(),
game_manager.get_economy_manager().get_building_manager(),
game_manager.get_economy_manager().get_building_type_manager(),
parse_defines(file).get_file_node()
);
}
Expand All @@ -420,12 +416,13 @@ bool Dataloader::_load_inventions(GameManager& game_manager) const {
return invention_manager.load_inventions_file(
game_manager.get_modifier_manager(),
game_manager.get_military_manager().get_unit_manager(),
game_manager.get_economy_manager().get_building_manager(),
game_manager.get_economy_manager().get_building_type_manager(),
game_manager.get_crime_manager(),
parse_defines(file).get_file_node()
);
}
);

invention_manager.lock_inventions();

return ret;
Expand Down Expand Up @@ -491,7 +488,9 @@ bool Dataloader::_load_history(GameManager& game_manager, bool unused_history_fi
ret &= apply_to_files(
lookup_files_in_dir(diplomacy_history_directory, ".txt"),
[this, &game_manager](fs::path const& file) -> bool {
return game_manager.get_history_manager().get_diplomacy_manager().load_diplomacy_history_file(game_manager, parse_defines(file).get_file_node());
return game_manager.get_history_manager().get_diplomacy_manager().load_diplomacy_history_file(
game_manager.get_country_manager(), parse_defines(file).get_file_node()
);
}
);
static constexpr std::string_view war_history_directory = "history/wars";
Expand Down Expand Up @@ -548,18 +547,10 @@ bool Dataloader::_load_map_dir(GameManager& game_manager) const {

bool ret = expect_dictionary_keys(
"max_provinces", ONE_EXACTLY,
expect_uint<Province::index_t>(
std::bind(&Map::set_max_provinces, &map, std::placeholders::_1)
),
expect_uint<Province::index_t>(std::bind_front(&Map::set_max_provinces, &map)),
"sea_starts", ONE_EXACTLY,
expect_list_reserve_length(
water_province_identifiers,
expect_identifier(
[&water_province_identifiers](std::string_view identifier) -> bool {
water_province_identifiers.push_back(identifier);
return true;
}
)
water_province_identifiers, expect_identifier(vector_callback(water_province_identifiers))
),

#define MAP_PATH_DICT_ENTRY(X) #X, ONE_EXACTLY, expect_string(assign_variable_callback(X)),
Expand All @@ -584,7 +575,7 @@ bool Dataloader::_load_map_dir(GameManager& game_manager) const {
}

if (!map.load_province_positions(
game_manager.get_economy_manager().get_building_manager(),
game_manager.get_economy_manager().get_building_type_manager(),
parse_defines(lookup_file(append_string_views(map_directory, positions))).get_file_node()
)) {
Logger::error("Failed to load province positions file!");
Expand Down Expand Up @@ -744,8 +735,8 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
if (!_load_technologies(game_manager)) {
ret = false;
}
if (!game_manager.get_modifier_manager().load_crime_modifiers(
parse_defines(lookup_file(crime_modifiers_file)).get_file_node()
if (!game_manager.get_crime_manager().load_crime_modifiers(
game_manager.get_modifier_manager(), parse_defines(lookup_file(crime_modifiers_file)).get_file_node()
)) {
Logger::error("Failed to load crime modifiers!");
ret = false;
Expand Down
12 changes: 1 addition & 11 deletions src/openvic-simulation/dataloader/NodeTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -380,17 +380,7 @@ node_callback_t NodeTools::name_list_callback(callback_t<std::vector<std::string
return [callback](ast::NodeCPtr node) -> bool {
std::vector<std::string> list;
bool ret = expect_list_reserve_length(
list,
expect_identifier_or_string(
[&list](std::string_view str) -> bool {
if (!str.empty()) {
list.push_back(std::string { str });
return true;
}
Logger::error("Empty identifier or string");
return false;
}
)
list, expect_identifier_or_string(vector_callback<std::string_view>(list))
)(node);
ret &= callback(std::move(list));
return ret;
Expand Down
30 changes: 30 additions & 0 deletions src/openvic-simulation/dataloader/NodeTools.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <optional>
#include <set>
#include <type_traits>
#include <unordered_set>

#include <openvic-dataloader/v2script/AbstractSyntaxTree.hpp>

Expand Down Expand Up @@ -320,5 +321,34 @@ namespace OpenVic {
return true;
};
}

template<typename T, typename U>
Callback<T> auto vector_callback(std::vector<U>& vec) {
return [&vec](T val) -> bool {
vec.emplace_back(std::move(val));
return true;
};
}

template<typename T>
Callback<T> auto vector_callback(std::vector<T>& vec) {
return vector_callback<T, T>(vec);
}

template<typename T>
Callback<T const&> auto vector_callback_pointer(std::vector<T const*>& vec) {
return [&vec](T const& val) -> bool {
vec.emplace_back(&val);
return true;
};
}

template<typename T>
Callback<T const&> auto set_callback_pointer(std::unordered_set<T const*>& set) {
return [&set](T const& val) -> bool {
set.insert(&val);
return true;
};
}
}
}
13 changes: 4 additions & 9 deletions src/openvic-simulation/economy/BuildingType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ BuildingType::BuildingType(
colonial_range { colonial_range }, infrastructure { infrastructure }, spawn_railway_track { spawn_railway_track },
sail { sail }, steam { steam }, capital { capital }, port { port } {}

BuildingManager::BuildingManager() : building_types { "building types" } {}
BuildingTypeManager::BuildingTypeManager() : building_types { "building types" } {}

bool BuildingManager::add_building_type(std::string_view identifier, ARGS) {
bool BuildingTypeManager::add_building_type(std::string_view identifier, ARGS) {
if (identifier.empty()) {
Logger::error("Invalid building identifier - empty!");
return false;
Expand All @@ -30,7 +30,7 @@ bool BuildingManager::add_building_type(std::string_view identifier, ARGS) {
});
}

bool BuildingManager::load_buildings_file(
bool BuildingTypeManager::load_buildings_file(
GoodManager const& good_manager, ProductionTypeManager const& production_type_manager, ModifierManager& modifier_manager,
ast::NodeCPtr root
) {
Expand Down Expand Up @@ -70,12 +70,7 @@ bool BuildingManager::load_buildings_file(
"advanced_factory", ZERO_OR_ONE, expect_bool(assign_variable_callback(advanced_factory)),
"fort_level", ZERO_OR_ONE, expect_uint(assign_variable_callback(fort_level)),
"naval_capacity", ZERO_OR_ONE, expect_uint(assign_variable_callback(naval_capacity)),
"colonial_points", ZERO_OR_ONE, expect_list(expect_fixed_point(
[&colonial_points](fixed_point_t points) -> bool {
colonial_points.push_back(points);
return true;
}
)),
"colonial_points", ZERO_OR_ONE, expect_list(expect_fixed_point(vector_callback(colonial_points))),
"province", ZERO_OR_ONE, expect_bool(assign_variable_callback(in_province)),
"one_per_state", ZERO_OR_ONE, expect_bool(assign_variable_callback(one_per_state)),
"colonial_range", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(colonial_range)),
Expand Down
8 changes: 4 additions & 4 deletions src/openvic-simulation/economy/BuildingType.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@

namespace OpenVic {

struct BuildingManager;
struct BuildingTypeManager;

/* REQUIREMENTS:
* MAP-11, MAP-72, MAP-73
* MAP-12, MAP-75, MAP-76
* MAP-13, MAP-78, MAP-79
*/
struct BuildingType : HasIdentifier {
friend struct BuildingManager;
friend struct BuildingTypeManager;

using level_t = int16_t;

Expand Down Expand Up @@ -69,14 +69,14 @@ namespace OpenVic {
BuildingType(BuildingType&&) = default;
};

struct BuildingManager {
struct BuildingTypeManager {
using level_t = BuildingType::level_t; // this is getting ridiculous

private:
IdentifierRegistry<BuildingType> building_types;

public:
BuildingManager();
BuildingTypeManager();

bool add_building_type(std::string_view identifier, ARGS);
IDENTIFIER_REGISTRY_ACCESSORS(building_type)
Expand Down
4 changes: 2 additions & 2 deletions src/openvic-simulation/economy/EconomyManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace OpenVic {
struct EconomyManager {
private:
BuildingManager PROPERTY_REF(building_manager);
BuildingTypeManager PROPERTY_REF(building_type_manager);
GoodManager PROPERTY_REF(good_manager);
ProductionTypeManager PROPERTY_REF(production_type_manager);

Expand All @@ -17,7 +17,7 @@ namespace OpenVic {
}

inline bool load_buildings_file(ModifierManager& modifier_manager, ast::NodeCPtr root) {
return building_manager.load_buildings_file(good_manager, production_type_manager, modifier_manager, root);
return building_type_manager.load_buildings_file(good_manager, production_type_manager, modifier_manager, root);
}
};
}
3 changes: 1 addition & 2 deletions src/openvic-simulation/economy/Good.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,7 @@ bool GoodManager::load_goods_file(ast::NodeCPtr root) {
for (Good const& good : this->get_goods()) { \
ret &= modifier_manager.add_modifier_effect( \
StringUtils::append_string_views(name, "_", good.get_identifier()), \
true, \
ModifierEffect::format_t::PROPORTION_DECIMAL \
true \
); \
}

Expand Down
11 changes: 3 additions & 8 deletions src/openvic-simulation/economy/ProductionType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,11 @@ node_callback_t ProductionTypeManager::_expect_employed_pop(
node_callback_t ProductionTypeManager::_expect_employed_pop_list(
GoodManager const& good_manager, PopManager const& pop_manager, callback_t<std::vector<EmployedPop>&&> cb
) {

return [this, &good_manager, &pop_manager, cb](ast::NodeCPtr node) -> bool {
std::vector<EmployedPop> employed_pops;
bool res = expect_list([this, &good_manager, &pop_manager, &employed_pops](ast::NodeCPtr node) -> bool {
EmployedPop owner;
bool res_partial = _expect_employed_pop(good_manager, pop_manager, assign_variable_callback(owner))(node);
employed_pops.push_back(owner);
return res_partial;
})(node);
return res & cb(std::move(employed_pops));
bool ret = expect_list(_expect_employed_pop(good_manager, pop_manager, vector_callback(employed_pops)))(node);
ret &= cb(std::move(employed_pops));
return ret;
};
}

Expand Down
7 changes: 3 additions & 4 deletions src/openvic-simulation/history/Bookmark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
#include <openvic-dataloader/v2script/AbstractSyntaxTree.hpp>

#include "openvic-simulation/dataloader/NodeTools.hpp"

#include "types/Date.hpp"
#include "types/IdentifierRegistry.hpp"
#include "utility/Logger.hpp"
#include "openvic-simulation/types/Date.hpp"
#include "openvic-simulation/types/IdentifierRegistry.hpp"
#include "openvic-simulation/utility/Logger.hpp"

using namespace OpenVic;
using namespace OpenVic::NodeTools;
Expand Down
5 changes: 1 addition & 4 deletions src/openvic-simulation/history/CountryHistory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,7 @@ bool CountryHistoryMap::_load_history_entry(
"primary_culture", ZERO_OR_ONE,
culture_manager.expect_culture_identifier(assign_variable_callback_pointer(entry.primary_culture)),
"culture", ZERO_OR_MORE, culture_manager.expect_culture_identifier(
[&entry](Culture const& culture) -> bool {
entry.accepted_cultures.push_back(&culture);
return true;
}
vector_callback_pointer(entry.accepted_cultures)
),
"religion", ZERO_OR_ONE, game_manager.get_pop_manager().get_religion_manager().expect_religion_identifier(
assign_variable_callback_pointer(entry.religion)
Expand Down
Loading

0 comments on commit 085fe94

Please sign in to comment.