Skip to content

Commit 9259d74

Browse files
committed
Apply invention if limit is met when applying history (simple)
1 parent c88cf59 commit 9259d74

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed

Diff for: src/openvic-simulation/InstanceManager.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,12 @@ bool InstanceManager::load_bookmark(Bookmark const* new_bookmark) {
156156
);
157157

158158
ret &= country_instance_manager.apply_history_to_countries(
159-
definition_manager.get_history_manager().get_country_manager(), today, unit_instance_manager, map_instance
159+
definition_manager.get_history_manager().get_country_manager(),
160+
today,
161+
unit_instance_manager,
162+
map_instance,
163+
definition_manager.get_research_manager().get_technology_manager(),
164+
definition_manager.get_research_manager().get_invention_manager()
160165
);
161166

162167
ret &= map_instance.get_state_manager().generate_states(

Diff for: src/openvic-simulation/country/CountryInstance.cpp

+49-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#include "openvic-simulation/politics/Ideology.hpp"
1111
#include "openvic-simulation/research/Invention.hpp"
1212
#include "openvic-simulation/research/Technology.hpp"
13+
#include "openvic-simulation/scripts/Condition.hpp"
14+
#include "openvic-simulation/utility/Logger.hpp"
1315

1416
using namespace OpenVic;
1517

@@ -665,7 +667,8 @@ void CountryInstance::apply_foreign_investments(
665667
}
666668

667669
bool CountryInstance::apply_history_to_country(
668-
CountryHistoryEntry const& entry, MapInstance& map_instance, CountryInstanceManager const& country_instance_manager
670+
CountryHistoryEntry const& entry, MapInstance& map_instance, CountryInstanceManager const& country_instance_manager,
671+
TechnologyManager const& technology_manager, InventionManager const& invention_manager
669672
) {
670673
constexpr auto set_optional = []<typename T>(T& target, std::optional<T> const& source) {
671674
if (source) {
@@ -712,6 +715,49 @@ bool CountryInstance::apply_history_to_country(
712715
for (auto const& [technology, level] : entry.get_technologies()) {
713716
ret &= set_technology_unlock_level(*technology, level);
714717
}
718+
719+
const auto inform_limit_parsing_failed = [](Invention const& invention) {
720+
Logger::warning("Failed to parse limit for invention ", invention.get_identifier());
721+
};
722+
723+
for (Invention const& invention : invention_manager.get_inventions()) {
724+
ConditionNode const& root_condition_node = invention.get_limit().get_condition_root();
725+
Condition const* const root_condition_ptr = root_condition_node.get_condition();
726+
if(root_condition_ptr == nullptr) {
727+
continue;
728+
}
729+
Condition const& root_condition = *root_condition_ptr;
730+
if(root_condition.get_value_type() != value_type_t::GROUP
731+
|| root_condition.get_identifier() != "AND") {
732+
inform_limit_parsing_failed(invention);
733+
continue;
734+
}
735+
736+
ConditionNode::condition_list_t const& condition_list = std::get<ConditionNode::condition_list_t>(root_condition_node.get_value());
737+
if(condition_list.size() != 1) {
738+
inform_limit_parsing_failed(invention);
739+
continue;
740+
}
741+
742+
ConditionNode const& condition_node = condition_list[0];
743+
Condition const* const condition_ptr = condition_node.get_condition();
744+
if(condition_ptr == nullptr) {
745+
inform_limit_parsing_failed(invention);
746+
continue;
747+
}
748+
749+
Condition const& condition = *condition_ptr;
750+
if(condition.get_key_identifier_type() != identifier_type_t::TECHNOLOGY) {
751+
inform_limit_parsing_failed(invention);
752+
continue;
753+
}
754+
755+
Technology const* const required_technology = technology_manager.get_technology_by_identifier(condition_node.get_condition_key_item()->get_identifier());
756+
if(is_technology_unlocked(*required_technology)) {
757+
ret &= set_invention_unlock_level(invention, 1);
758+
}
759+
}
760+
715761
for (auto const& [invention, activated] : entry.get_inventions()) {
716762
ret &= set_invention_unlock_level(*invention, activated ? 1 : 0);
717763
}
@@ -1256,7 +1302,7 @@ bool CountryInstanceManager::generate_country_instances(
12561302

12571303
bool CountryInstanceManager::apply_history_to_countries(
12581304
CountryHistoryManager const& history_manager, Date date, UnitInstanceManager& unit_instance_manager,
1259-
MapInstance& map_instance
1305+
MapInstance& map_instance, TechnologyManager const& technology_manager, InventionManager const& invention_manager
12601306
) {
12611307
bool ret = true;
12621308

@@ -1270,7 +1316,7 @@ bool CountryInstanceManager::apply_history_to_countries(
12701316

12711317
for (auto const& [entry_date, entry] : history_map->get_entries()) {
12721318
if (entry_date <= date) {
1273-
ret &= country_instance.apply_history_to_country(*entry, map_instance, *this);
1319+
ret &= country_instance.apply_history_to_country(*entry, map_instance, *this, technology_manager, invention_manager);
12741320

12751321
if (entry->get_inital_oob()) {
12761322
oob_history_entry = entry.get();

Diff for: src/openvic-simulation/country/CountryInstance.hpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@
1313
#include "openvic-simulation/types/IdentifierRegistry.hpp"
1414
#include "openvic-simulation/types/IndexedMap.hpp"
1515
#include "openvic-simulation/utility/Getters.hpp"
16+
#include "research/Invention.hpp"
1617

1718
namespace OpenVic {
1819
struct CountryInstanceManager;
1920
struct CountryDefinition;
2021
struct ProvinceInstance;
2122
struct State;
2223
struct Technology;
24+
struct TechnologyManager;
2325
struct Invention;
26+
struct InventionManager;
2427
struct TechnologySchool;
2528
struct NationalValue;
2629
struct GovernmentType;
@@ -286,7 +289,8 @@ namespace OpenVic {
286289
);
287290

288291
bool apply_history_to_country(
289-
CountryHistoryEntry const& entry, MapInstance& map_instance, CountryInstanceManager const& country_instance_manager
292+
CountryHistoryEntry const& entry, MapInstance& map_instance, CountryInstanceManager const& country_instance_manager,
293+
TechnologyManager const& technology_manager, InventionManager const& invention_manager
290294
);
291295

292296
private:
@@ -360,7 +364,7 @@ namespace OpenVic {
360364

361365
bool apply_history_to_countries(
362366
CountryHistoryManager const& history_manager, Date date, UnitInstanceManager& unit_instance_manager,
363-
MapInstance& map_instance
367+
MapInstance& map_instance, TechnologyManager const& technology_manager, InventionManager const& invention_manager
364368
);
365369

366370
void update_modifier_sums(Date today, StaticModifierCache const& static_modifier_cache);

0 commit comments

Comments
 (0)