Skip to content

Commit

Permalink
feat: implemented invention dataloading
Browse files Browse the repository at this point in the history
  • Loading branch information
zaaarf committed Dec 2, 2023
1 parent 444a277 commit 8fc6942
Show file tree
Hide file tree
Showing 13 changed files with 283 additions and 70 deletions.
5 changes: 3 additions & 2 deletions src/openvic-simulation/GameManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
#include "openvic-simulation/misc/Define.hpp"
#include "openvic-simulation/politics/PoliticsManager.hpp"
#include "openvic-simulation/pop/Pop.hpp"
#include "openvic-simulation/tech/Technology.hpp"
#include "openvic-simulation/research/Technology.hpp"
#include "research/ResearchManager.hpp"

namespace OpenVic {
struct GameManager {
Expand All @@ -25,7 +26,7 @@ namespace OpenVic {
ModifierManager PROPERTY_REF(modifier_manager);
PoliticsManager PROPERTY_REF(politics_manager);
HistoryManager PROPERTY_REF(history_manager);
TechnologyManager PROPERTY_REF(technology_manager);
ResearchManager PROPERTY_REF(research_manager);
PopManager PROPERTY_REF(pop_manager);
CountryManager PROPERTY_REF(country_manager);
UIManager PROPERTY_REF(ui_manager);
Expand Down
57 changes: 51 additions & 6 deletions src/openvic-simulation/dataloader/Dataloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -648,10 +648,30 @@ bool Dataloader::_load_goods(GameManager& game_manager) const {
return ret;
}

bool Dataloader::_load_rebel_types(GameManager& game_manager) const {
static constexpr std::string_view rebel_types_file = "common/rebel_types.txt";

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()
);

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

return ret;
}

bool Dataloader::_load_technologies(GameManager& game_manager) const {
static constexpr std::string_view technology_file = "common/technology.txt";

TechnologyManager& technology_manager = game_manager.get_technology_manager();
TechnologyManager& technology_manager = game_manager.get_research_manager().get_technology_manager();

bool ret = true;

Expand Down Expand Up @@ -694,6 +714,28 @@ bool Dataloader::_load_technologies(GameManager& game_manager) const {
return ret;
}

bool Dataloader::_load_inventions(GameManager& game_manager) const {
static constexpr std::string_view inventions_directory = "inventions";

InventionManager& invention_manager = game_manager.get_research_manager().get_invention_manager();

bool ret = apply_to_files(
lookup_files_in_dir(inventions_directory, ".txt"),
[&game_manager, &invention_manager](fs::path const& file) -> bool {
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(),
parse_defines(file).get_file_node()
);
}
);

invention_manager.lock_inventions();

return ret;
}

bool Dataloader::_load_history(GameManager& game_manager, bool unused_history_file_warnings) const {

/* Country History */
Expand Down Expand Up @@ -910,7 +952,6 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
static constexpr std::string_view event_modifiers_file = "common/event_modifiers.txt";
static constexpr std::string_view static_modifiers_file = "common/static_modifiers.txt";
static constexpr std::string_view triggered_modifiers_file = "common/triggered_modifiers.txt";
static constexpr std::string_view rebel_types_file = "common/rebel_types.txt";

bool ret = true;

Expand Down Expand Up @@ -1001,6 +1042,10 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
Logger::error("Failed to load buildings!");
ret = false;
}
if (!_load_rebel_types(game_manager)) {
Logger::error("Failed to load rebel types!");
ret = false;
}
if (!_load_technologies(game_manager)) {
ret = false;
}
Expand Down Expand Up @@ -1028,6 +1073,10 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
Logger::error("Failed to load triggered modifiers!");
ret = false;
}
if (!_load_inventions(game_manager)) {
Logger::error("Failed to load inventions!");
ret = false;
}
if (!_load_map_dir(game_manager)) {
Logger::error("Failed to load map!");
ret = false;
Expand Down Expand Up @@ -1056,10 +1105,6 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
Logger::error("Failed to load countries!");
ret = false;
}
if (!game_manager.get_politics_manager().load_rebels_file(parse_defines(lookup_file(rebel_types_file)).get_file_node())) {
Logger::error("Failed to load rebel types!");
ret = false;
}
if (!_load_history(game_manager, false)) {
Logger::error("Failed to load history!");
ret = false;
Expand Down
2 changes: 2 additions & 0 deletions src/openvic-simulation/dataloader/Dataloader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ namespace OpenVic {
bool _load_pop_types(PopManager& pop_manager, UnitManager const& unit_manager, GoodManager const& good_manager) const;
bool _load_units(GameManager& game_manager) const;
bool _load_goods(GameManager& game_manager) const;
bool _load_rebel_types(GameManager& game_manager) const;
bool _load_technologies(GameManager& game_manager) const;
bool _load_inventions(GameManager& game_manager) const;
bool _load_map_dir(GameManager& game_manager) const;
bool _load_history(GameManager& game_manager, bool unused_history_file_warnings) const;

Expand Down
5 changes: 4 additions & 1 deletion src/openvic-simulation/economy/Good.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,10 @@ bool GoodManager::load_goods_file(ast::NodeCPtr root) {
bool GoodManager::generate_modifiers(ModifierManager& modifier_manager) {
bool ret = true;
GOOD_MODIFIER("factory_goods_output");
GOOD_MODIFIER("factory_goods_throughput");
GOOD_MODIFIER("rgo_goods_output");
GOOD_MODIFIER("rgo_size");
return ret;
}
}

#undef GOOD_MODIFIER
4 changes: 3 additions & 1 deletion src/openvic-simulation/military/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,4 +237,6 @@ bool UnitManager::generate_modifiers(ModifierManager& modifier_manager) {
ret &= generate_stat_modifiers(unit.get_identifier(), unit.get_type());

return ret;
}
}

#undef STAT_MODIFIER
40 changes: 39 additions & 1 deletion src/openvic-simulation/misc/Modifier.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "Modifier.hpp"
#include <string>

using namespace OpenVic;
using namespace OpenVic::NodeTools;
Expand Down Expand Up @@ -242,6 +243,19 @@ bool ModifierManager::setup_modifier_effects() {
ret &= add_modifier_effect("reliability", true, RAW_DECIMAL);
ret &= add_modifier_effect("speed", true);

/* TODO: sort these */
ret &= add_modifier_effect("land_attrition", false);
ret &= add_modifier_effect("naval_attrition", false);
ret &= add_modifier_effect("permanent_prestige", true, INT);
ret &= add_modifier_effect("shared_prestige", true, INT);
ret &= add_modifier_effect("colonial_prestige", true, RAW_DECIMAL);
ret &= add_modifier_effect("soldier_to_pop_loss", false); //TODO idk if good or bad
ret &= add_modifier_effect("pop_growth", true);
ret &= add_modifier_effect("plurality", true);
ret &= add_modifier_effect("suppression_points_modifier", true);
ret &= add_modifier_effect("colonial_life_rating", true);
ret &= add_modifier_effect("seperatism", false); //paradox typo

return ret;
}

Expand Down Expand Up @@ -378,11 +392,35 @@ key_value_callback_t ModifierManager::_modifier_effect_callback(
if (effect != nullptr && value->is_type<ast::IdentifierNode>()) {
return add_modifier_cb(effect, value);
} else if (complex_modifiers.contains(key) && value->is_derived_from<ast::AbstractListNode>()) {
return expect_dictionary([this, &key, &add_modifier_cb, &default_callback](std::string_view identifier, ast::NodeCPtr node) -> bool {
if (key == "rebel_org_gain") { //because of course there's a special one
std::string_view faction_identifier;
ast::NodeCPtr value_node;
bool ret = expect_dictionary_keys(
"faction", ONE_EXACTLY, expect_identifier(assign_variable_callback(faction_identifier)),
"value", ONE_EXACTLY, [this, &value_node] (ast::NodeCPtr val_node) -> bool {
value_node = val_node; //FIXME probably lifetime issue, maybe move
return true;
}
)(value);
std::string flat_identifier = std::string(key);
flat_identifier += "_";
flat_identifier += faction_identifier;

ModifierEffect const* effect = get_modifier_effect_by_identifier(flat_identifier);

if(effect != nullptr) {
return add_modifier_cb(effect, value_node);
} else {
Logger::error("Could not find flattened modifier: ", flat_identifier);
return false;
}
} else return expect_dictionary([this, &key, &add_modifier_cb, &default_callback](std::string_view identifier, ast::NodeCPtr node) -> bool {
std::string flat_identifier = std::string(key);
flat_identifier += "_";
flat_identifier += identifier;

ModifierEffect const* effect = get_modifier_effect_by_identifier(flat_identifier);

if(effect != nullptr) {
return add_modifier_cb(effect, node);
} else {
Expand Down
14 changes: 14 additions & 0 deletions src/openvic-simulation/politics/Rebel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,5 +141,19 @@ bool RebelManager::load_rebels_file(

lock_rebel_types();

return ret;
}

bool RebelManager::generate_modifiers(ModifierManager& modifier_manager) {
bool ret = true;

modifier_manager.register_complex_modifier("rebel_org_gain");

ret &= modifier_manager.add_modifier_effect("rebel_org_gain_all", true, ModifierEffect::format_t::RAW_DECIMAL); //TODO probably?

for (RebelType const& rebel_type : get_rebel_types()) {
std::string modifier_name = "rebel_org_gain_" + std::string(rebel_type.get_identifier());
ret &= modifier_manager.add_modifier_effect(modifier_name, true, ModifierEffect::format_t::RAW_DECIMAL); //TODO probably?
}
return ret;
}
6 changes: 3 additions & 3 deletions src/openvic-simulation/politics/Rebel.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include "misc/Modifier.hpp"
#include "openvic-simulation/types/IdentifierRegistry.hpp"
#include "openvic-simulation/politics/Government.hpp"
#include "openvic-simulation/politics/Ideology.hpp"
Expand Down Expand Up @@ -78,8 +79,7 @@ namespace OpenVic {
bool reinforcing, bool general, bool smart, bool unit_transfer, fixed_point_t occupation_mult
);

bool load_rebels_file(
IdeologyManager const& ideology_manager, GovernmentTypeManager const& government_type_manager, ast::NodeCPtr root
);
bool load_rebels_file(IdeologyManager const& ideology_manager, GovernmentTypeManager const& government_type_manager, ast::NodeCPtr root);
bool generate_modifiers(ModifierManager& modifier_manager);
};
}
63 changes: 63 additions & 0 deletions src/openvic-simulation/research/Invention.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#include "Invention.hpp"
#include <algorithm>
#include <cstring>
#include <utility>

using namespace OpenVic;
using namespace OpenVic::NodeTools;

Invention::Invention(std::string_view identifier, ModifierValue&& values, bool news, unit_set_t activated_units, building_set_t activated_buildings, bool unlock_gas_attack, bool unlock_gas_defence) : Modifier { identifier, std::move(values), 0 }, news { news }, activated_units { std::move(activated_units) }, activated_buildings { std::move(activated_buildings) }, unlock_gas_attack { unlock_gas_attack }, unlock_gas_defence { unlock_gas_defence } {} //TODO icon

InventionManager::InventionManager() : inventions { "inventions" } {}

bool InventionManager::add_invention(std::string_view identifier, ModifierValue&& values, bool news, Invention::unit_set_t activated_units, Invention::building_set_t activated_buildings, bool unlock_gas_attack, bool unlock_gas_defence) {
if (identifier.empty()) {
Logger::error("Invalid invention identifier - empty!");
return false;
}

return inventions.add_item({ identifier, std::move(values), news, std::move(activated_units), std::move(activated_buildings), unlock_gas_attack, unlock_gas_defence });
}

bool InventionManager::load_inventions_file(ModifierManager const& modifier_manager, UnitManager const& unit_manager, BuildingManager const& building_manager, ast::NodeCPtr root) {
return expect_dictionary_reserve_length(inventions, [this, &modifier_manager, &unit_manager, &building_manager](std::string_view identifier, ast::NodeCPtr value) -> bool {
ModifierValue loose_modifiers;
ModifierValue modifiers;

Invention::unit_set_t activated_units;
Invention::building_set_t activated_buildings;
Invention::crime_set_t enabled_crimes;

bool unlock_gas_attack = true;
bool unlock_gas_defence = true;
bool news = true; //defaults to true!

bool ret = modifier_manager.expect_modifier_value_and_keys(move_variable_callback(loose_modifiers),
"news", ZERO_OR_ONE, expect_bool(assign_variable_callback(news)),
"limit", ONE_EXACTLY, success_callback,
"chance", ONE_EXACTLY, success_callback,
"effect", ZERO_OR_ONE, modifier_manager.expect_modifier_value_and_keys(
move_variable_callback(modifiers),
"gas_attack", ZERO_OR_ONE, expect_bool(assign_variable_callback(unlock_gas_attack)),
"gas_defence", ZERO_OR_ONE, expect_bool(assign_variable_callback(unlock_gas_defence)),
"activate_unit", ZERO_OR_MORE, unit_manager.expect_unit_identifier([this, &activated_units](Unit const& unit) -> bool {
activated_units.insert(&unit);
return true;
}),
"activate_building", ZERO_OR_MORE, building_manager.expect_building_type_identifier([this, &activated_buildings](BuildingType const& type) -> bool {
activated_buildings.insert(&type);
return true;
}),
"enable_crime", ZERO_OR_ONE, modifier_manager.expect_crime_modifier_identifier([this, &enabled_crimes](Crime const& crime) -> bool {
enabled_crimes.insert(&crime);
return true;
}))
)(value);

modifiers += loose_modifiers;

ret &= add_invention(identifier, std::move(modifiers), news, activated_units, activated_buildings, unlock_gas_attack, unlock_gas_defence);

return ret;
})(root);
}
50 changes: 50 additions & 0 deletions src/openvic-simulation/research/Invention.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#pragma once

#include "openvic-simulation/economy/BuildingType.hpp"
#include "openvic-simulation/military/Unit.hpp"
#include "openvic-simulation/misc/Modifier.hpp"
#include "openvic-simulation/types/IdentifierRegistry.hpp"
#include <string_view>
#include <unordered_set>

namespace OpenVic {
struct Invention : Modifier {
friend struct InventionManager;
//TODO implement limit and chance
using unit_set_t = std::unordered_set<Unit const*>;
using building_set_t = std::unordered_set<BuildingType const*>;
using crime_set_t = std::unordered_set<Crime const*>;

private:
const bool PROPERTY_CUSTOM_PREFIX(news, is);
unit_set_t PROPERTY(activated_units);
building_set_t PROPERTY(activated_buildings);
crime_set_t PROPERTY(enabled_crimes);
const bool PROPERTY_CUSTOM_PREFIX(unlock_gas_attack, will);
const bool PROPERTY_CUSTOM_PREFIX(unlock_gas_defence, will);

Invention(
std::string_view identifier, ModifierValue&& values, bool news, unit_set_t activated_units,
building_set_t activated_buildings, bool unlock_gas_attack, bool unlock_gas_defence
);

public:
Invention(Invention&&) = default;
};

struct InventionManager {
IdentifierRegistry<Invention> inventions;

public:
InventionManager();

bool add_invention(
std::string_view identifier, ModifierValue&& values, bool news, Invention::unit_set_t activated_units,
Invention::building_set_t activated_buildings, bool unlock_gas_attack, bool unlock_gas_defence
);

IDENTIFIER_REGISTRY_ACCESSORS(invention);

bool load_inventions_file(ModifierManager const& modifier_manager, UnitManager const& unit_manager, BuildingManager const& building_manager, ast::NodeCPtr root); // inventions/*.txt
};
}
12 changes: 12 additions & 0 deletions src/openvic-simulation/research/ResearchManager.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#pragma once

#include "openvic-simulation/research/Invention.hpp"
#include "openvic-simulation/research/Technology.hpp"

namespace OpenVic {
struct ResearchManager {
private:
TechnologyManager PROPERTY_REF(technology_manager);
InventionManager PROPERTY_REF(invention_manager);
};
}
Loading

0 comments on commit 8fc6942

Please sign in to comment.