From 3928fbf5ce1e90994d45a755461e7484a99b04e0 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sat, 14 Feb 2026 18:03:53 +0100 Subject: [PATCH 01/15] condition evaluation wip --- .../country/CountryInstance.cpp | 116 ++++++++++++++++++ .../country/CountryInstance.hpp | 3 + .../map/ProvinceInstance.cpp | 6 + .../map/ProvinceInstance.hpp | 2 + src/openvic-simulation/map/State.cpp | 8 ++ src/openvic-simulation/map/State.hpp | 3 + src/openvic-simulation/population/Pop.cpp | 13 ++ src/openvic-simulation/population/Pop.hpp | 3 + src/openvic-simulation/scripts/Condition.cpp | 88 +++++++++++++ src/openvic-simulation/scripts/Condition.hpp | 7 ++ src/openvic-simulation/scripts/Context.cpp | 75 +++++++++++ src/openvic-simulation/scripts/Context.hpp | 35 ++++++ 12 files changed, 359 insertions(+) create mode 100644 src/openvic-simulation/scripts/Context.cpp create mode 100644 src/openvic-simulation/scripts/Context.hpp diff --git a/src/openvic-simulation/country/CountryInstance.cpp b/src/openvic-simulation/country/CountryInstance.cpp index 40c29230..9511714d 100644 --- a/src/openvic-simulation/country/CountryInstance.cpp +++ b/src/openvic-simulation/country/CountryInstance.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -49,6 +50,7 @@ #include "openvic-simulation/utility/Containers.hpp" #include "openvic-simulation/utility/Logger.hpp" #include "openvic-simulation/core/Typedefs.hpp" +#include "openvic-simulation/scripts/Condition.hpp" using namespace OpenVic; @@ -1173,6 +1175,120 @@ void CountryInstance::start_research(Technology const& technology, const Date to _update_current_tech(today); } +bool CountryInstance::evaluate_leaf(ConditionNode const& node) const { + std::string_view const& id = node.get_condition()->get_identifier(); + + // TODO: https://vic2.paradoxwikis.com/List_of_conditions#Country_Scope Implement all of these + + if (id == "ai") { + bool expected = std::get(node.get_value()); + return is_ai() == expected; + } + + if (id == "average_consciousness") { + fixed_point_t expected = std::get(node.get_value()); + return get_average_consciousness() >= expected; + } + + if (id == "average_militancy") { + fixed_point_t expected = std::get(node.get_value()); + return get_average_militancy() >= expected; + } + + if (id == "badboy") { + fixed_point_t expected_ratio = std::get(node.get_value()); + return get_infamy_untracked() >= (expected_ratio * fixed_point_t(25)); + } + + if (id == "civilized") { + bool expected = std::get(node.get_value()); + return is_civilised() == expected; + } + + if (id == "exists") { + bool expected = std::get(node.get_value()); + return exists() == expected; + } + + if (id == "industrial_score") { + fixed_point_t expected = std::get(node.get_value()); + return get_industrial_power_untracked() >= expected; + } + + if (id == "is_disarmed") { + bool expected = std::get(node.get_value()); + return is_disarmed() == expected; + } + + if (id == "is_greater_power") { + bool expected = std::get(node.get_value()); + return is_great_power() == expected; + } + + if (id == "is_mobilised") { + bool expected = std::get(node.get_value()); + return is_mobilised() == expected; + } + + if (id == "is_secondary_power") { + bool expected = std::get(node.get_value()); + return is_secondary_power() == expected; + } + + if (id == "num_of_cities") { + uint64_t expected = std::get(node.get_value()); + return get_owned_provinces().size() >= expected; + } + + if (id == "num_of_ports") { + uint64_t expected = std::get(node.get_value()); + return get_port_count() >= expected; + } + + if (id == "number_of_states") { + uint64_t expected = std::get(node.get_value()); + return get_states().size() >= expected; + } + + if (id == "prestige") { + fixed_point_t expected = std::get(node.get_value()); + return get_prestige_untracked() >= expected; + } + + if (id == "plurality") { + fixed_point_t expected = std::get(node.get_value()); + return get_plurality_untracked() >= expected; + } + + if (id == "total_amount_of_ships") { + uint64_t expected = std::get(node.get_value()); + return get_ship_count() >= expected; + } + + if (id == "rank") { + uint64_t expected = std::get(node.get_value()); + return get_total_rank() >= expected; + } + + if (id == "tag") { + memory::string expected = std::get(node.get_value()); + return country_definition.get_identifier() == expected; + } + + if (id == "war") { + bool expected = std::get(node.get_value()); + return is_at_war() == expected; + } + + if (id == "war_exhaustion") { + fixed_point_t expected = std::get(node.get_value()); + return get_war_exhaustion() >= expected; + } + + spdlog::warn_s("Condition {} not implemented in CountryInstance::evaluate_leaf", node.get_condition() ? node.get_condition()->get_identifier() : "NULL"); + return false; +} + void CountryInstance::apply_foreign_investments( fixed_point_map_t const& investments, CountryInstanceManager const& country_instance_manager ) { diff --git a/src/openvic-simulation/country/CountryInstance.hpp b/src/openvic-simulation/country/CountryInstance.hpp index 5f5e6095..5465b1f2 100644 --- a/src/openvic-simulation/country/CountryInstance.hpp +++ b/src/openvic-simulation/country/CountryInstance.hpp @@ -75,6 +75,7 @@ namespace OpenVic { struct TechnologySchool; struct UnitInstanceGroup; struct UnitTypeManager; + struct ConditionNode; static constexpr Timespan RECENT_WAR_LOSS_TIME_LIMIT = Timespan::from_years(5); @@ -602,6 +603,8 @@ namespace OpenVic { bool can_research_tech(Technology const& technology, const Date today) const; void start_research(Technology const& technology, const Date today); + bool evaluate_leaf(ConditionNode const& node) const; + // Sets the investment of each country in the map (rather than adding to them), leaving the rest unchanged. void apply_foreign_investments( fixed_point_map_t const& investments, diff --git a/src/openvic-simulation/map/ProvinceInstance.cpp b/src/openvic-simulation/map/ProvinceInstance.cpp index 26f378d7..4b5e8580 100644 --- a/src/openvic-simulation/map/ProvinceInstance.cpp +++ b/src/openvic-simulation/map/ProvinceInstance.cpp @@ -14,6 +14,7 @@ #include "openvic-simulation/misc/GameRulesManager.hpp" #include "openvic-simulation/modifier/StaticModifierCache.hpp" #include "openvic-simulation/types/TypedIndices.hpp" +#include "openvic-simulation/scripts/Condition.hpp" using namespace OpenVic; @@ -408,6 +409,11 @@ void ProvinceInstance::province_tick( rgo.rgo_tick(reusable_vectors[0]); } +bool ProvinceInstance::evaluate_leaf(ConditionNode const& node) const { + // TODO: implement + return false; +} + bool ProvinceInstance::add_unit_instance_group(UnitInstanceGroup& group) { using enum unit_branch_t; diff --git a/src/openvic-simulation/map/ProvinceInstance.hpp b/src/openvic-simulation/map/ProvinceInstance.hpp index 9a6f5cbc..45ecf063 100644 --- a/src/openvic-simulation/map/ProvinceInstance.hpp +++ b/src/openvic-simulation/map/ProvinceInstance.hpp @@ -216,6 +216,8 @@ namespace OpenVic { > reusable_vectors ); + bool evaluate_leaf(ConditionNode const& node) const; + bool add_unit_instance_group(UnitInstanceGroup& group); bool remove_unit_instance_group(UnitInstanceGroup const& group); diff --git a/src/openvic-simulation/map/State.cpp b/src/openvic-simulation/map/State.cpp index 51cf019e..2a1e9e3f 100644 --- a/src/openvic-simulation/map/State.cpp +++ b/src/openvic-simulation/map/State.cpp @@ -10,6 +10,7 @@ #include "openvic-simulation/population/PopType.hpp" #include "openvic-simulation/types/fixed_point/FixedPoint.hpp" #include "openvic-simulation/utility/Containers.hpp" +#include "openvic-simulation/scripts/Condition.hpp" using namespace OpenVic; @@ -95,6 +96,13 @@ void State::update_gamestate() { _update_country(); } +bool State::evaluate_leaf(ConditionNode const& node) const { + std::string_view const& id = node.get_condition()->get_identifier(); + + spdlog::warn_s("Condition {} not implemented in Pop::evaluate_leaf", id); + return false; +} + void State::_update_country() { CountryInstance* const owner_ptr = get_owner(); if (owner_ptr == previous_country_ptr) { diff --git a/src/openvic-simulation/map/State.hpp b/src/openvic-simulation/map/State.hpp index 5eb3178c..64e77917 100644 --- a/src/openvic-simulation/map/State.hpp +++ b/src/openvic-simulation/map/State.hpp @@ -25,6 +25,7 @@ namespace OpenVic { struct StateManager; struct StateSet; struct Strata; + struct ConditionNode; struct State : PopsAggregate { friend struct StateManager; @@ -67,6 +68,8 @@ namespace OpenVic { } void update_gamestate(); + + bool evaluate_leaf(ConditionNode const& node) const; }; struct Region; diff --git a/src/openvic-simulation/population/Pop.cpp b/src/openvic-simulation/population/Pop.cpp index e0199a6a..870d54f4 100644 --- a/src/openvic-simulation/population/Pop.cpp +++ b/src/openvic-simulation/population/Pop.cpp @@ -41,6 +41,7 @@ #include "openvic-simulation/core/FormatValidate.hpp" #include "openvic-simulation/utility/Logger.hpp" #include "openvic-simulation/core/Typedefs.hpp" +#include "openvic-simulation/scripts/Condition.hpp" using namespace OpenVic; @@ -465,6 +466,18 @@ void Pop::allocate_for_needs( reusable_vector.clear(); } +bool Pop::evaluate_leaf(ConditionNode const& node) const { + std::string_view const& id = node.get_condition()->get_identifier(); + + if (id == "consciousness") { + fixed_point_t expected = std::get(node.get_value()); + return get_consciousness() >= expected; + } + // TODO: Implement the rest + spdlog::warn_s("Condition {} not implemented in Pop::evaluate_leaf", id); + return false; +} + void Pop::pop_tick( PopValuesFromProvince const& shared_values, RandomU32& random_number_generator, diff --git a/src/openvic-simulation/population/Pop.hpp b/src/openvic-simulation/population/Pop.hpp index a39c2b45..035baaa3 100644 --- a/src/openvic-simulation/population/Pop.hpp +++ b/src/openvic-simulation/population/Pop.hpp @@ -32,6 +32,7 @@ namespace OpenVic { struct RebelType; struct Religion; struct SellResult; + struct ConditionNode; struct PopBase { friend PopManager; @@ -216,6 +217,8 @@ namespace OpenVic { DECLARE_POP_MONEY_STORE_FUNCTIONS(import_subsidies) #undef DECLARE_POP_MONEY_STORE_FUNCTIONS + bool evaluate_leaf(ConditionNode const& node) const; + void pop_tick( PopValuesFromProvince const& shared_values, RandomU32& random_number_generator, diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index 08cc1d38..f0d2803d 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -1,4 +1,5 @@ #include "Condition.hpp" +#include "Context.hpp" #include @@ -28,6 +29,93 @@ ConditionNode::ConditionNode( ) : condition { new_condition }, value { std::move(new_value) }, valid { new_valid }, condition_key_item { new_condition_key_item }, condition_value_item { new_condition_key_item } {} +bool ConditionNode::evaluate(Context const& context) const { + if (!is_valid()) { + return false; + } + + if (!share_scope_type(condition->scope, context.get_scope_type())) { + return false; + } + + if (share_value_type(condition->value_type, GROUP)) { + return evaluate_group(context); + } + + return context.evaluate_leaf(*this); +} + +bool ConditionNode::evaluate_group(Context const& context) const { + const std::string_view id = condition->get_identifier(); + auto const& children = std::get(value); + + if (id == "AND") { + for (auto const& node : children) { + if (!node.evaluate(context)) return false; + } + return true; + } + + if (id == "OR") { + for (auto const& node : children) { + if (node.evaluate(context)) return true; + } + return false; + } + + if (id == "NOT") { + for (auto const& node : children) { + if (node.evaluate(context)) return false; + } + return true; + } + + const scope_type_t target_scope = condition->scope_change; + if (target_scope == NO_SCOPE) { + return false; + } + + const bool is_iterator = id.starts_with("any_") || id.starts_with("all_"); + + if (is_iterator) { + const bool require_all = id.starts_with("all_"); + + auto sub_contexts = context.get_sub_contexts(target_scope); + + if (require_all) { + if (sub_contexts.empty()) return false; + for (auto const& sub : sub_contexts) { + for (auto const& node : children) { + if (!node.evaluate(sub)) return false; + } + } + return false; + } + for (auto const& sub : sub_contexts) { + bool all_match = true; + for (auto const& node : children) { + if (!node.evaluate(sub)) { + all_match = false; + break; + } + } + if (all_match) { + return true; + } + } + return false; + } + + auto sub_context = context.get_redirect_context(target_scope); + + if (!sub_context) return false; + + for (auto const& node : children) { + if (!node.evaluate(*sub_context)) return false; + } + return true; +} + bool ConditionManager::add_condition( std::string_view identifier, value_type_t value_type, scope_type_t scope, scope_type_t scope_change, identifier_type_t key_identifier_type, identifier_type_t value_identifier_type diff --git a/src/openvic-simulation/scripts/Condition.hpp b/src/openvic-simulation/scripts/Condition.hpp index 2e963353..09687fcf 100644 --- a/src/openvic-simulation/scripts/Condition.hpp +++ b/src/openvic-simulation/scripts/Condition.hpp @@ -214,6 +214,8 @@ namespace OpenVic { Condition(Condition&&) = default; }; + struct Context; + struct ConditionNode { friend struct ConditionManager; friend struct ConditionScript; @@ -242,8 +244,13 @@ namespace OpenVic { HasIdentifier const* new_condition_key_item = nullptr, HasIdentifier const* new_condition_value_item = nullptr ); + + bool evaluate_group(Context const& context) const; + public: + bool evaluate(Context const& context) const; }; + struct ConditionManager { private: CaseInsensitiveIdentifierRegistry IDENTIFIER_REGISTRY(condition); diff --git a/src/openvic-simulation/scripts/Context.cpp b/src/openvic-simulation/scripts/Context.cpp new file mode 100644 index 00000000..c58ce3f3 --- /dev/null +++ b/src/openvic-simulation/scripts/Context.cpp @@ -0,0 +1,75 @@ +#include "Context.hpp" + +#include "openvic-simulation/country/CountryInstance.hpp" +#include "openvic-simulation/map/ProvinceInstance.hpp" +#include "openvic-simulation/map/State.hpp" +#include "openvic-simulation/population/Pop.hpp" + +using namespace OpenVic; +scope_type_t Context::get_scope_type() const { + return std::visit( + [](auto* p) -> scope_type_t { + using T = std::decay_t; + + if constexpr (std::is_same_v) { + return scope_type_t::COUNTRY; + } else if constexpr (std::is_same_v) { + return scope_type_t::PROVINCE; + } else if constexpr (std::is_same_v) { + return scope_type_t::STATE; + } else if constexpr (std::is_same_v) { + return scope_type_t::POP; + } + + return scope_type_t::NO_SCOPE; + }, + ptr + ); +} + +bool Context::evaluate_leaf(ConditionNode const& node) const { + return std::visit( + [&](auto* p) -> bool { + return p->evaluate_leaf(node); + }, + ptr + ); +} + +std::vector Context::get_sub_contexts(scope_type_t target) const { + std::vector result; + + if (std::holds_alternative(ptr)) { + CountryInstance const* country = std::get(ptr); + + if (target == scope_type_t::PROVINCE) { + for (ProvinceInstance const* prov : country->get_owned_provinces()) { + result.emplace_back(prov); + } + } + else if (target == scope_type_t::STATE) { + for (State const* state : country->get_states()) { + result.emplace_back(state); + } + } + } + else if (std::holds_alternative(ptr)) { + ProvinceInstance const* province = std::get(ptr); + + // TODO + } + + return result; +} + +std::optional Context::get_redirect_context(scope_type_t target) const { + if (std::holds_alternative(ptr)) { + ProvinceInstance const* province = std::get(ptr); + + if (target == scope_type_t::COUNTRY) { + return Context(province->get_owner()); + } + } + + return std::nullopt; +} diff --git a/src/openvic-simulation/scripts/Context.hpp b/src/openvic-simulation/scripts/Context.hpp new file mode 100644 index 00000000..8a2ce9c4 --- /dev/null +++ b/src/openvic-simulation/scripts/Context.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include + +#include "Condition.hpp" + +namespace OpenVic { + struct CountryInstance; + struct ProvinceInstance; + struct State; + struct Pop; + + struct Context { + std::variant< + CountryInstance const*, + ProvinceInstance const*, + State const*, + Pop const*> ptr; + + Context(CountryInstance const* p) : ptr(p) {} + Context(ProvinceInstance const* p) : ptr(p) {} + Context(State const* p) : ptr(p) {} + Context(Pop const* p) : ptr(p) {} + + scope_type_t get_scope_type() const; + + bool evaluate_leaf(ConditionNode const& node) const; + + std::vector get_sub_contexts(scope_type_t target) const; + + std::optional get_redirect_context(scope_type_t target) const; + }; +} \ No newline at end of file From ea2407dc6bfac724c5af07d7a4fea65bdcf00fcd Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sat, 14 Feb 2026 18:21:22 +0100 Subject: [PATCH 02/15] support ambigous subcontexts and redirects --- src/openvic-simulation/scripts/Condition.cpp | 4 +-- src/openvic-simulation/scripts/Context.cpp | 33 +++++++++++++++----- src/openvic-simulation/scripts/Context.hpp | 4 +-- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index f0d2803d..58b70218 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -80,7 +80,7 @@ bool ConditionNode::evaluate_group(Context const& context) const { if (is_iterator) { const bool require_all = id.starts_with("all_"); - auto sub_contexts = context.get_sub_contexts(target_scope); + auto sub_contexts = context.get_sub_contexts(id, target_scope); if (require_all) { if (sub_contexts.empty()) return false; @@ -106,7 +106,7 @@ bool ConditionNode::evaluate_group(Context const& context) const { return false; } - auto sub_context = context.get_redirect_context(target_scope); + auto sub_context = context.get_redirect_context(id, target_scope); if (!sub_context) return false; diff --git a/src/openvic-simulation/scripts/Context.cpp b/src/openvic-simulation/scripts/Context.cpp index c58ce3f3..70180644 100644 --- a/src/openvic-simulation/scripts/Context.cpp +++ b/src/openvic-simulation/scripts/Context.cpp @@ -36,20 +36,34 @@ bool Context::evaluate_leaf(ConditionNode const& node) const { ); } -std::vector Context::get_sub_contexts(scope_type_t target) const { +std::vector Context::get_sub_contexts(std::string_view condition_id, scope_type_t target) const { std::vector result; if (std::holds_alternative(ptr)) { CountryInstance const* country = std::get(ptr); if (target == scope_type_t::PROVINCE) { - for (ProvinceInstance const* prov : country->get_owned_provinces()) { - result.emplace_back(prov); + if (condition_id == "any_owned_province") { + for (ProvinceInstance const* prov : country->get_owned_provinces()) { + result.emplace_back(prov); + } + } + else if (condition_id == "any_controlled_province") { + for (ProvinceInstance const* prov : country->get_controlled_provinces()) { + result.emplace_back(prov); + } + } + else if (condition_id == "any_core" || condition_id == "all_core") { + for (ProvinceInstance const* prov : country->get_core_provinces()) { + result.emplace_back(prov); + } } } else if (target == scope_type_t::STATE) { - for (State const* state : country->get_states()) { - result.emplace_back(state); + if (condition_id == "any_state") { + for (State const* state : country->get_states()) { + result.emplace_back(state); + } } } } @@ -62,12 +76,17 @@ std::vector Context::get_sub_contexts(scope_type_t target) const { return result; } -std::optional Context::get_redirect_context(scope_type_t target) const { +std::optional Context::get_redirect_context(std::string_view condition_id, scope_type_t target) const { if (std::holds_alternative(ptr)) { ProvinceInstance const* province = std::get(ptr); if (target == scope_type_t::COUNTRY) { - return Context(province->get_owner()); + if (condition_id == "owner") { + return Context(province->get_owner()); + } + if (condition_id == "controller") { + return Context(province->get_controller()); + } } } diff --git a/src/openvic-simulation/scripts/Context.hpp b/src/openvic-simulation/scripts/Context.hpp index 8a2ce9c4..ee95259e 100644 --- a/src/openvic-simulation/scripts/Context.hpp +++ b/src/openvic-simulation/scripts/Context.hpp @@ -28,8 +28,8 @@ namespace OpenVic { bool evaluate_leaf(ConditionNode const& node) const; - std::vector get_sub_contexts(scope_type_t target) const; + std::vector get_sub_contexts(std::string_view condition_id, scope_type_t target) const; - std::optional get_redirect_context(scope_type_t target) const; + std::optional get_redirect_context(std::string_view condition_id, scope_type_t target) const; }; } \ No newline at end of file From 754b23fcb5953fc1aa13a54875304e41ba9ebf82 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sat, 14 Feb 2026 18:42:22 +0100 Subject: [PATCH 03/15] support THIS and FROM scope --- src/openvic-simulation/scripts/Context.cpp | 26 +++++++++++++++++----- src/openvic-simulation/scripts/Context.hpp | 21 +++++++++++++---- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/openvic-simulation/scripts/Context.cpp b/src/openvic-simulation/scripts/Context.cpp index 70180644..9ab27716 100644 --- a/src/openvic-simulation/scripts/Context.cpp +++ b/src/openvic-simulation/scripts/Context.cpp @@ -45,24 +45,24 @@ std::vector Context::get_sub_contexts(std::string_view condition_id, sc if (target == scope_type_t::PROVINCE) { if (condition_id == "any_owned_province") { for (ProvinceInstance const* prov : country->get_owned_provinces()) { - result.emplace_back(prov); + result.emplace_back(make_child(prov)); } } else if (condition_id == "any_controlled_province") { for (ProvinceInstance const* prov : country->get_controlled_provinces()) { - result.emplace_back(prov); + result.emplace_back(make_child(prov)); } } else if (condition_id == "any_core" || condition_id == "all_core") { for (ProvinceInstance const* prov : country->get_core_provinces()) { - result.emplace_back(prov); + result.emplace_back(make_child(prov)); } } } else if (target == scope_type_t::STATE) { if (condition_id == "any_state") { for (State const* state : country->get_states()) { - result.emplace_back(state); + result.emplace_back(make_child(state)); } } } @@ -77,15 +77,29 @@ std::vector Context::get_sub_contexts(std::string_view condition_id, sc } std::optional Context::get_redirect_context(std::string_view condition_id, scope_type_t target) const { + if (target == scope_type_t::THIS) { + if (this_scope != nullptr) { + return *this_scope; + } + return std::nullopt; + } + + if (target == scope_type_t::FROM) { + if (from_scope != nullptr) { + return *from_scope; + } + return std::nullopt; + } + if (std::holds_alternative(ptr)) { ProvinceInstance const* province = std::get(ptr); if (target == scope_type_t::COUNTRY) { if (condition_id == "owner") { - return Context(province->get_owner()); + return make_child(province->get_owner()); } if (condition_id == "controller") { - return Context(province->get_controller()); + return make_child(province->get_controller()); } } } diff --git a/src/openvic-simulation/scripts/Context.hpp b/src/openvic-simulation/scripts/Context.hpp index ee95259e..a6595d4e 100644 --- a/src/openvic-simulation/scripts/Context.hpp +++ b/src/openvic-simulation/scripts/Context.hpp @@ -19,10 +19,19 @@ namespace OpenVic { State const*, Pop const*> ptr; - Context(CountryInstance const* p) : ptr(p) {} - Context(ProvinceInstance const* p) : ptr(p) {} - Context(State const* p) : ptr(p) {} - Context(Pop const* p) : ptr(p) {} + Context const* this_scope = nullptr; + Context const* from_scope = nullptr; + + Context(CountryInstance const* p) : ptr(p), this_scope(this) {} + Context(ProvinceInstance const* p) : ptr(p), this_scope(this) {} + Context(State const* p) : ptr(p), this_scope(this) {} + Context(Pop const* p) : ptr(p), this_scope(this) {} + + Context( + auto* p, + Context const* this_ctx, + Context const* from_ctx + ) : ptr(p), this_scope(this_ctx), from_scope(from_ctx) {} scope_type_t get_scope_type() const; @@ -31,5 +40,9 @@ namespace OpenVic { std::vector get_sub_contexts(std::string_view condition_id, scope_type_t target) const; std::optional get_redirect_context(std::string_view condition_id, scope_type_t target) const; + + Context make_child(auto* p) const { + return Context(p, this->this_scope, this); + } }; } \ No newline at end of file From 0f3180156952b21bbb22228b3a33480a62f6534f Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 14:08:43 +0100 Subject: [PATCH 04/15] tooltip subject support --- src/openvic-simulation/scripts/Condition.cpp | 239 ++++++++++--------- src/openvic-simulation/scripts/Condition.hpp | 71 +++++- src/openvic-simulation/scripts/Context.cpp | 23 ++ src/openvic-simulation/scripts/Context.hpp | 2 + 4 files changed, 215 insertions(+), 120 deletions(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index 58b70218..f7823bd3 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -17,10 +17,13 @@ using enum identifier_type_t; Condition::Condition( std::string_view new_identifier, value_type_t new_value_type, scope_type_t new_scope, scope_type_t new_scope_change, identifier_type_t new_key_identifier_type, - identifier_type_t new_value_identifier_type + identifier_type_t new_value_identifier_type, std::string_view new_loc_true_key, + std::string_view new_loc_false_key, tooltip_subject_t new_tooltip_subject ) : HasIdentifier { new_identifier }, value_type { new_value_type }, scope { new_scope }, scope_change { new_scope_change }, key_identifier_type { new_key_identifier_type }, - value_identifier_type { new_value_identifier_type } {} + value_identifier_type { new_value_identifier_type }, + loc_true_key { new_loc_true_key }, loc_false_key { new_loc_false_key }, + tooltip_subject { new_tooltip_subject } {} ConditionNode::ConditionNode( Condition const* new_condition, value_t&& new_value, bool new_valid, @@ -116,9 +119,16 @@ bool ConditionNode::evaluate_group(Context const& context) const { return true; } -bool ConditionManager::add_condition( - std::string_view identifier, value_type_t value_type, scope_type_t scope, scope_type_t scope_change, - identifier_type_t key_identifier_type, identifier_type_t value_identifier_type +bool ConditionManager::_register_condition( + std::string_view identifier, + value_type_t value_type, + scope_type_t scope, + scope_type_t scope_change, + identifier_type_t key_identifier_type, + identifier_type_t value_identifier_type, + std::string_view loc_true_key, + std::string_view loc_false_key, + tooltip_subject_t tooltip_subject ) { if (identifier.empty()) { spdlog::error_s("Invalid condition identifier - empty!"); @@ -154,7 +164,8 @@ bool ConditionManager::add_condition( return conditions.emplace_item( identifier, - identifier, value_type, scope, scope_change, key_identifier_type, value_identifier_type + identifier, value_type, scope, scope_change, key_identifier_type, value_identifier_type, + loc_true_key, loc_false_key, tooltip_subject ); } @@ -162,37 +173,37 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana bool ret = true; /* Special Scopes */ - ret &= add_condition("THIS", GROUP, COUNTRY, THIS); - ret &= add_condition("FROM", GROUP, COUNTRY, FROM); - ret &= add_condition("independence", GROUP, COUNTRY, COUNTRY); //only from rebels! + ret &= add_condition("THIS", GROUP, COUNTRY).scope_change(THIS); + ret &= add_condition("FROM", GROUP, COUNTRY).scope_change(FROM); + ret &= add_condition("independence", GROUP, COUNTRY).scope_change(COUNTRY); //only from rebels! /* Trigger Country Scopes */ - ret &= add_condition("all_core", GROUP, COUNTRY, PROVINCE); - ret &= add_condition("any_core", GROUP, COUNTRY, PROVINCE); - ret &= add_condition("any_greater_power", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("any_neighbor_country", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("any_owned_province", GROUP, COUNTRY, PROVINCE); - ret &= add_condition("any_pop", GROUP, COUNTRY, POP); - ret &= add_condition("any_sphere_member", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("any_state", GROUP, COUNTRY, STATE); - ret &= add_condition("any_substate", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("capital_scope", GROUP, COUNTRY, PROVINCE); - ret &= add_condition("country", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("cultural_union", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("overlord", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("owner", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("sphere_owner", GROUP, COUNTRY, COUNTRY); - ret &= add_condition("war_countries", GROUP, COUNTRY, COUNTRY); + ret &= add_condition("all_core", GROUP, COUNTRY).scope_change(PROVINCE); + ret &= add_condition("any_core", GROUP, COUNTRY).scope_change(PROVINCE); + ret &= add_condition("any_greater_power", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("any_neighbor_country", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("any_owned_province", GROUP, COUNTRY).scope_change(PROVINCE); + ret &= add_condition("any_pop", GROUP, COUNTRY).scope_change(POP); + ret &= add_condition("any_sphere_member", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("any_state", GROUP, COUNTRY).scope_change(STATE); + ret &= add_condition("any_substate", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("capital_scope", GROUP, COUNTRY).scope_change(PROVINCE); + ret &= add_condition("country", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("cultural_union", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("overlord", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("owner", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("sphere_owner", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("war_countries", GROUP, COUNTRY).scope_change(COUNTRY); /* Trigger State Scopes */ - ret &= add_condition("any_neighbor_province", GROUP, STATE, PROVINCE); + ret &= add_condition("any_neighbor_province", GROUP, STATE).scope_change(PROVINCE); /* Trigger Province Scopes */ - ret &= add_condition("controller", GROUP, PROVINCE, COUNTRY); - ret &= add_condition("state_scope", GROUP, PROVINCE, STATE); + ret &= add_condition("controller", GROUP, PROVINCE).scope_change(COUNTRY); + ret &= add_condition("state_scope", GROUP, PROVINCE).scope_change(STATE); /* Trigger Pop Scopes */ - ret &= add_condition("location", GROUP, POP, PROVINCE); + ret &= add_condition("location", GROUP, POP).scope_change(PROVINCE); /* Special Conditions */ ret &= add_condition("AND", GROUP, COUNTRY); @@ -202,7 +213,7 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana /* Global Conditions */ ret &= add_condition("year", INTEGER, COUNTRY); ret &= add_condition("month", INTEGER, COUNTRY); - ret &= add_condition("has_global_flag", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, GLOBAL_FLAG); + ret &= add_condition("has_global_flag", IDENTIFIER, COUNTRY).value_identifier_type(GLOBAL_FLAG); ret &= add_condition("is_canal_enabled", INTEGER, COUNTRY); ret &= add_condition("always", BOOLEAN, COUNTRY); ret &= add_condition("world_wars_enabled", BOOLEAN, COUNTRY); @@ -210,76 +221,76 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana /* Country Scope Conditions */ ret &= add_condition("administration_spending", REAL, COUNTRY); ret &= add_condition("ai", BOOLEAN, COUNTRY); - ret &= add_condition("alliance_with", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("alliance_with", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("average_consciousness", REAL, COUNTRY); ret &= add_condition("average_militancy", REAL, COUNTRY); ret &= add_condition("badboy", REAL, COUNTRY); - ret &= add_condition("big_producer", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, TRADE_GOOD); + ret &= add_condition("big_producer", IDENTIFIER, COUNTRY).value_identifier_type(TRADE_GOOD); ret &= add_condition("blockade", REAL, COUNTRY); ret &= add_condition("brigades_compare", REAL, COUNTRY); - ret &= add_condition("can_build_factory_in_capital_state", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, BUILDING); + ret &= add_condition("can_build_factory_in_capital_state", IDENTIFIER, COUNTRY).value_identifier_type(BUILDING); ret &= add_condition("can_build_fort_in_capital", COMPLEX, COUNTRY); ret &= add_condition("can_build_railway_in_capital", COMPLEX, COUNTRY); ret &= add_condition("can_nationalize", BOOLEAN, COUNTRY); ret &= add_condition("can_create_vassals", BOOLEAN, COUNTRY); - ret &= add_condition("capital", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PROVINCE_ID); - ret &= add_condition("casus_belli", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("check_variable", COMPLEX, COUNTRY, NO_SCOPE, NO_IDENTIFIER, VARIABLE); - ret &= add_condition("citizenship_policy", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PARTY_POLICY); + ret &= add_condition("capital", IDENTIFIER, COUNTRY).value_identifier_type(PROVINCE_ID); + ret &= add_condition("casus_belli", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("check_variable", COMPLEX, COUNTRY).key_identifier_type(VARIABLE); + ret &= add_condition("citizenship_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("civilization_progress", REAL, COUNTRY); ret &= add_condition("civilized", BOOLEAN, COUNTRY); - ret &= add_condition("colonial_nation", BOOLEAN, COUNTRY); + ret &= add_condition("colonial_nation", BOOLEAN, COUNTRY).loc("HAS_COLONIES", "HAS_NO_COLONIES").subject(tooltip_subject_t::SCOPE); ret &= add_condition("consciousness", REAL, COUNTRY); ret &= add_condition("constructing_cb_progress", REAL, COUNTRY); - ret &= add_condition("constructing_cb_type", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CASUS_BELLI); - ret &= add_condition("continent", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CONTINENT); - ret &= add_condition("controls", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PROVINCE_ID); + ret &= add_condition("constructing_cb_type", IDENTIFIER, COUNTRY).value_identifier_type(CASUS_BELLI); + ret &= add_condition("continent", IDENTIFIER, COUNTRY).value_identifier_type(CONTINENT); + ret &= add_condition("controls", IDENTIFIER, COUNTRY).value_identifier_type(PROVINCE_ID); ret &= add_condition("crime_fighting", REAL, COUNTRY); ret &= add_condition("crime_higher_than_education", BOOLEAN, COUNTRY); ret &= add_condition("crisis_exist", BOOLEAN, COUNTRY); - ret &= add_condition("culture", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CULTURE); + ret &= add_condition("culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE); ret &= add_condition("culture_has_union_tag", BOOLEAN, COUNTRY); ret &= add_condition("diplomatic_influence", COMPLEX, COUNTRY); - ret &= add_condition("economic_policy", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PARTY_POLICY); + ret &= add_condition("economic_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("education_spending", REAL, COUNTRY); ret &= add_condition("election", BOOLEAN, COUNTRY); - ret &= add_condition("exists", IDENTIFIER | BOOLEAN, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("government", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, GOVERNMENT_TYPE); + ret &= add_condition("exists", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("government", IDENTIFIER, COUNTRY).value_identifier_type(GOVERNMENT_TYPE); ret &= add_condition("great_wars_enabled", BOOLEAN, COUNTRY); - ret &= add_condition("have_core_in", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("has_country_flag", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_FLAG); - ret &= add_condition("has_country_modifier", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_EVENT_MODIFIER); + ret &= add_condition("have_core_in", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("has_country_flag", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_FLAG); + ret &= add_condition("has_country_modifier", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_EVENT_MODIFIER); ret &= add_condition("has_cultural_sphere", BOOLEAN, COUNTRY); ret &= add_condition("has_leader", STRING, COUNTRY); - ret &= add_condition("has_pop_culture", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CULTURE); - ret &= add_condition("has_pop_religion", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, RELIGION); - ret &= add_condition("has_pop_type", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, POP_TYPE); + ret &= add_condition("has_pop_culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE); + ret &= add_condition("has_pop_religion", IDENTIFIER, COUNTRY).value_identifier_type(RELIGION); + ret &= add_condition("has_pop_type", IDENTIFIER, COUNTRY).value_identifier_type(POP_TYPE); ret &= add_condition("has_recently_lost_war", BOOLEAN, COUNTRY); ret &= add_condition("has_unclaimed_cores", BOOLEAN, COUNTRY); - ret &= add_condition("ideology", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, IDEOLOGY); - ret &= add_condition("industrial_score", REAL | IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("in_sphere", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("in_default", IDENTIFIER | BOOLEAN, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("invention", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, INVENTION); + ret &= add_condition("ideology", IDENTIFIER, COUNTRY).value_identifier_type(IDEOLOGY); + ret &= add_condition("industrial_score", REAL | IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("in_sphere", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("in_default", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("invention", IDENTIFIER, COUNTRY).value_identifier_type(INVENTION); ret &= add_condition("involved_in_crisis", BOOLEAN, COUNTRY); ret &= add_condition("is_claim_crisis", BOOLEAN, COUNTRY); ret &= add_condition("is_colonial_crisis", BOOLEAN, COUNTRY); - ret &= add_condition("is_cultural_union", IDENTIFIER | BOOLEAN, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("is_cultural_union", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("is_disarmed", BOOLEAN, COUNTRY); ret &= add_condition("is_greater_power", BOOLEAN, COUNTRY); ret &= add_condition("is_colonial", BOOLEAN, STATE); - ret &= add_condition("is_core", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG | PROVINCE_ID); - ret &= add_condition("is_culture_group", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG | CULTURE_GROUP); - ret &= add_condition("is_ideology_enabled", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, IDEOLOGY); + ret &= add_condition("is_core", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG | PROVINCE_ID); + ret &= add_condition("is_culture_group", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG | CULTURE_GROUP); + ret &= add_condition("is_ideology_enabled", IDENTIFIER, COUNTRY).value_identifier_type(IDEOLOGY); ret &= add_condition("is_independant", BOOLEAN, COUNTRY); // paradox typo ret &= add_condition("is_liberation_crisis", BOOLEAN, COUNTRY); ret &= add_condition("is_mobilised", BOOLEAN, COUNTRY); - ret &= add_condition("is_next_reform", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, REFORM); - ret &= add_condition("is_our_vassal", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("is_possible_vassal", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("is_releasable_vassal", IDENTIFIER | BOOLEAN, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("is_next_reform", IDENTIFIER, COUNTRY).value_identifier_type(REFORM); + ret &= add_condition("is_our_vassal", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("is_possible_vassal", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("is_releasable_vassal", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("is_secondary_power", BOOLEAN, COUNTRY); - ret &= add_condition("is_sphere_leader_of", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("is_sphere_leader_of", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("is_substate", BOOLEAN, COUNTRY); ret &= add_condition("is_subject", BOOLEAN, COUNTRY); ret &= add_condition("is_vassal", BOOLEAN, COUNTRY); @@ -290,14 +301,14 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("middle_strata_life_needs", REAL, COUNTRY); ret &= add_condition("middle_strata_luxury_needs", REAL, COUNTRY); ret &= add_condition("middle_tax", REAL, COUNTRY); - ret &= add_condition("military_access", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("military_score", REAL | IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("military_access", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("military_score", REAL | IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("militancy", REAL, COUNTRY); ret &= add_condition("military_spending", REAL, COUNTRY); ret &= add_condition("money", REAL, COUNTRY); - ret &= add_condition("nationalvalue", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, NATIONAL_VALUE); + ret &= add_condition("nationalvalue", IDENTIFIER, COUNTRY).value_identifier_type(NATIONAL_VALUE); ret &= add_condition("national_provinces_occupied", REAL, COUNTRY); - ret &= add_condition("neighbour", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("neighbour", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("num_of_allies", INTEGER, COUNTRY); ret &= add_condition("num_of_cities", INTEGER, COUNTRY); ret &= add_condition("num_of_ports", INTEGER, COUNTRY); @@ -306,14 +317,14 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("num_of_substates", INTEGER, COUNTRY); ret &= add_condition("num_of_vassals", INTEGER, COUNTRY); ret &= add_condition("num_of_vassals_no_substates", INTEGER, COUNTRY); - ret &= add_condition("owns", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PROVINCE_ID); + ret &= add_condition("owns", IDENTIFIER, COUNTRY).value_identifier_type(PROVINCE_ID); ret &= add_condition("part_of_sphere", BOOLEAN, COUNTRY); ret &= add_condition("plurality", REAL, COUNTRY); ret &= add_condition("political_movement_strength", REAL, COUNTRY); ret &= add_condition("political_reform_want", REAL, COUNTRY); - ret &= add_condition("pop_majority_culture", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CULTURE); - ret &= add_condition("pop_majority_ideology", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, IDEOLOGY); - ret &= add_condition("pop_majority_religion", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, RELIGION); + ret &= add_condition("pop_majority_culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE); + ret &= add_condition("pop_majority_ideology", IDENTIFIER, COUNTRY).value_identifier_type(IDEOLOGY); + ret &= add_condition("pop_majority_religion", IDENTIFIER, COUNTRY).value_identifier_type(RELIGION); ret &= add_condition("pop_militancy", REAL, COUNTRY); ret &= add_condition("poor_strata_militancy", REAL, COUNTRY); ret &= add_condition("poor_strata_everyday_needs", REAL, COUNTRY); @@ -321,15 +332,15 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("poor_strata_luxury_needs", REAL, COUNTRY); ret &= add_condition("poor_tax", REAL, COUNTRY); ret &= add_condition("prestige", REAL, COUNTRY); - ret &= add_condition("primary_culture", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CULTURE); - ret &= add_condition("accepted_culture", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CULTURE); - ret &= add_condition("produces", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, TRADE_GOOD); + ret &= add_condition("primary_culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE); + ret &= add_condition("accepted_culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE); + ret &= add_condition("produces", IDENTIFIER, COUNTRY).value_identifier_type(TRADE_GOOD); ret &= add_condition("rank", INTEGER, COUNTRY); ret &= add_condition("rebel_power_fraction", REAL, COUNTRY); ret &= add_condition("recruited_percentage", REAL, COUNTRY); ret &= add_condition("relation", COMPLEX, COUNTRY); - ret &= add_condition("religion", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, RELIGION); - ret &= add_condition("religious_policy", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PARTY_POLICY); + ret &= add_condition("religion", IDENTIFIER, COUNTRY).value_identifier_type(RELIGION); + ret &= add_condition("religious_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("revanchism", REAL, COUNTRY); ret &= add_condition("revolt_percentage", REAL, COUNTRY); ret &= add_condition("rich_strata_militancy", REAL, COUNTRY); @@ -338,16 +349,16 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("rich_strata_luxury_needs", REAL, COUNTRY); ret &= add_condition("rich_tax", REAL, COUNTRY); ret &= add_condition("rich_tax_above_poor", BOOLEAN, COUNTRY); - ret &= add_condition("ruling_party", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("ruling_party_ideology", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, IDEOLOGY); + ret &= add_condition("ruling_party", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("ruling_party_ideology", IDENTIFIER, COUNTRY).value_identifier_type(IDEOLOGY); ret &= add_condition("social_movement_strength", REAL, COUNTRY); ret &= add_condition("social_reform_want", REAL, COUNTRY); ret &= add_condition("social_spending", REAL, COUNTRY); - ret &= add_condition("stronger_army_than", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("substate_of", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("tag", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("tech_school", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, TECH_SCHOOL); - ret &= add_condition("this_culture_union", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, CULTURE_UNION); + ret &= add_condition("stronger_army_than", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("substate_of", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("tag", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("tech_school", IDENTIFIER, COUNTRY).value_identifier_type(TECH_SCHOOL); + ret &= add_condition("this_culture_union", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE_UNION); ret &= add_condition("total_amount_of_divisions", INTEGER, COUNTRY); ret &= add_condition("total_amount_of_ships", INTEGER, COUNTRY); ret &= add_condition("total_defensives", INTEGER, COUNTRY); @@ -356,62 +367,62 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("total_pops", INTEGER, COUNTRY); ret &= add_condition("total_sea_battles", INTEGER, COUNTRY); ret &= add_condition("total_sunk_by_us", INTEGER, COUNTRY); - ret &= add_condition("trade_policy", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PARTY_POLICY); + ret &= add_condition("trade_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("treasury", REAL, COUNTRY); - ret &= add_condition("truce_with", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("truce_with", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("unemployment", REAL, COUNTRY); ret &= add_condition("unit_has_leader", BOOLEAN, COUNTRY); ret &= add_condition("unit_in_battle", BOOLEAN, COUNTRY); ret &= add_condition("upper_house", COMPLEX, COUNTRY); - ret &= add_condition("vassal_of", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("vassal_of", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("war", BOOLEAN, COUNTRY); ret &= add_condition("war_exhaustion", REAL, COUNTRY); - ret &= add_condition("war_policy", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, PARTY_POLICY); + ret &= add_condition("war_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("war_score", REAL, COUNTRY); - ret &= add_condition("war_with", IDENTIFIER, COUNTRY, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("war_with", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); /* State Scope Conditions */ - ret &= add_condition("controlled_by", IDENTIFIER, STATE, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("controlled_by", IDENTIFIER, STATE).value_identifier_type(COUNTRY_TAG); ret &= add_condition("empty", BOOLEAN, STATE); ret &= add_condition("flashpoint_tension", REAL, STATE); - ret &= add_condition("has_building", IDENTIFIER, STATE, NO_SCOPE, NO_IDENTIFIER, BUILDING); + ret &= add_condition("has_building", IDENTIFIER, STATE).value_identifier_type(BUILDING); ret &= add_condition("has_factories", BOOLEAN, STATE); ret &= add_condition("has_flashpoint", BOOLEAN, STATE); ret &= add_condition("is_slave", BOOLEAN, STATE); - ret &= add_condition("owned_by", IDENTIFIER, STATE, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("trade_goods_in_state", IDENTIFIER, STATE, NO_SCOPE, NO_IDENTIFIER, TRADE_GOOD); + ret &= add_condition("owned_by", IDENTIFIER, STATE).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("trade_goods_in_state", IDENTIFIER, STATE).value_identifier_type(TRADE_GOOD); ret &= add_condition("work_available", COMPLEX, STATE); /* Province Scope Conditions */ ret &= add_condition("can_build_factory", BOOLEAN, PROVINCE); ret &= add_condition("controlled_by_rebels", BOOLEAN, PROVINCE); - ret &= add_condition("country_units_in_province", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("country_units_in_state", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); - ret &= add_condition("has_crime", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, CRIME); + ret &= add_condition("country_units_in_province", IDENTIFIER, PROVINCE).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("country_units_in_state", IDENTIFIER, PROVINCE).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("has_crime", IDENTIFIER, PROVINCE).value_identifier_type(CRIME); ret &= add_condition("has_culture_core", BOOLEAN, PROVINCE); ret &= add_condition("has_empty_adjacent_province", BOOLEAN, PROVINCE); ret &= add_condition("has_empty_adjacent_state", BOOLEAN, PROVINCE); ret &= add_condition("has_national_minority", BOOLEAN, PROVINCE); - ret &= add_condition("has_province_flag", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, PROVINCE_FLAG); - ret &= add_condition("has_province_modifier", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, PROVINCE_EVENT_MODIFIER); + ret &= add_condition("has_province_flag", IDENTIFIER, PROVINCE).value_identifier_type(PROVINCE_FLAG); + ret &= add_condition("has_province_modifier", IDENTIFIER, PROVINCE).value_identifier_type(PROVINCE_EVENT_MODIFIER); ret &= add_condition("has_recent_imigration", INTEGER, PROVINCE); // paradox typo ret &= add_condition("is_blockaded", BOOLEAN, PROVINCE); - ret &= add_condition("is_accepted_culture", IDENTIFIER | BOOLEAN, PROVINCE, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("is_accepted_culture", IDENTIFIER | BOOLEAN, PROVINCE).value_identifier_type(COUNTRY_TAG); ret &= add_condition("is_capital", BOOLEAN, PROVINCE); ret &= add_condition("is_coastal", BOOLEAN, PROVINCE); ret &= add_condition("is_overseas", BOOLEAN, PROVINCE); - ret &= add_condition("is_primary_culture", IDENTIFIER | BOOLEAN, PROVINCE, NO_SCOPE, NO_IDENTIFIER, COUNTRY_TAG); + ret &= add_condition("is_primary_culture", IDENTIFIER | BOOLEAN, PROVINCE).value_identifier_type(COUNTRY_TAG); ret &= add_condition("is_state_capital", BOOLEAN, PROVINCE); ret &= add_condition("is_state_religion", BOOLEAN, PROVINCE); ret &= add_condition("life_rating", REAL, PROVINCE); ret &= add_condition("minorities", BOOLEAN, PROVINCE); ret &= add_condition("port", BOOLEAN, PROVINCE); ret &= add_condition("province_control_days", INTEGER, PROVINCE); - ret &= add_condition("province_id", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, PROVINCE_ID); - ret &= add_condition("region", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, REGION); - ret &= add_condition("state_id", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, PROVINCE_ID); - ret &= add_condition("terrain", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, TERRAIN); - ret &= add_condition("trade_goods", IDENTIFIER, PROVINCE, NO_SCOPE, NO_IDENTIFIER, TRADE_GOOD); + ret &= add_condition("province_id", IDENTIFIER, PROVINCE).value_identifier_type(PROVINCE_ID); + ret &= add_condition("region", IDENTIFIER, PROVINCE).value_identifier_type(REGION); + ret &= add_condition("state_id", IDENTIFIER, PROVINCE).value_identifier_type(PROVINCE_ID); + ret &= add_condition("terrain", IDENTIFIER, PROVINCE).value_identifier_type(TERRAIN); + ret &= add_condition("trade_goods", IDENTIFIER, PROVINCE).value_identifier_type(TRADE_GOOD); ret &= add_condition("unemployment_by_type", COMPLEX, PROVINCE); ret &= add_condition("units_in_province", INTEGER, PROVINCE); @@ -422,11 +433,11 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("life_needs", REAL, POP); ret &= add_condition("luxury_needs", REAL, POP); ret &= add_condition("political_movement", BOOLEAN, POP); - ret &= add_condition("pop_majority_issue", IDENTIFIER, POP, NO_SCOPE, NO_IDENTIFIER, PARTY_POLICY); - ret &= add_condition("pop_type", IDENTIFIER, POP, NO_SCOPE, NO_IDENTIFIER, POP_TYPE); + ret &= add_condition("pop_majority_issue", IDENTIFIER, POP).value_identifier_type(PARTY_POLICY); + ret &= add_condition("pop_type", IDENTIFIER, POP).value_identifier_type(POP_TYPE); ret &= add_condition("social_movement", BOOLEAN, POP); - ret &= add_condition("strata", IDENTIFIER, POP, NO_SCOPE, NO_IDENTIFIER, POP_STRATA); - ret &= add_condition("type", IDENTIFIER, POP, NO_SCOPE, NO_IDENTIFIER, POP_TYPE); + ret &= add_condition("strata", IDENTIFIER, POP).value_identifier_type(POP_STRATA); + ret &= add_condition("type", IDENTIFIER, POP).value_identifier_type(POP_TYPE); const auto import_identifiers = [this, &ret]( memory::vector const& identifiers, @@ -437,10 +448,10 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana identifier_type_t value_identifier_type = NO_IDENTIFIER ) -> void { for (std::string_view const& identifier : identifiers) { - ret &= add_condition( - identifier, value_type, scope, scope_change, - key_identifier_type, value_identifier_type - ); + ret &= add_condition(identifier, value_type, scope) + .scope_change(scope_change) + .key_identifier_type(key_identifier_type) + .value_identifier_type(value_identifier_type); } }; diff --git a/src/openvic-simulation/scripts/Condition.hpp b/src/openvic-simulation/scripts/Condition.hpp index 09687fcf..1c507449 100644 --- a/src/openvic-simulation/scripts/Condition.hpp +++ b/src/openvic-simulation/scripts/Condition.hpp @@ -195,9 +195,16 @@ namespace OpenVic { #undef BUILD_STRING #undef _BUILD_STRING + enum class tooltip_subject_t : uint8_t { + SCOPE, + VALUE, + NONE + }; + struct Condition : HasIdentifier { friend struct ConditionManager; using enum identifier_type_t; + using enum tooltip_subject_t; public: const value_type_t value_type; @@ -206,10 +213,16 @@ namespace OpenVic { const identifier_type_t key_identifier_type; const identifier_type_t value_identifier_type; + const std::string_view loc_true_key; + const std::string_view loc_false_key; + + const tooltip_subject_t tooltip_subject; + Condition( std::string_view new_identifier, value_type_t new_value_type, scope_type_t new_scope, scope_type_t new_scope_change, identifier_type_t new_key_identifier_type, - identifier_type_t new_value_identifier_type + identifier_type_t new_value_identifier_type, std::string_view new_loc_true_key, + std::string_view new_loc_false_key, tooltip_subject_t new_tooltip_subject ); Condition(Condition&&) = default; }; @@ -256,11 +269,16 @@ namespace OpenVic { CaseInsensitiveIdentifierRegistry IDENTIFIER_REGISTRY(condition); Condition const* root_condition = nullptr; - bool add_condition( - std::string_view identifier, value_type_t value_type, scope_type_t scope, - scope_type_t scope_change = scope_type_t::NO_SCOPE, - identifier_type_t key_identifier_type = identifier_type_t::NO_IDENTIFIER, - identifier_type_t value_identifier_type = identifier_type_t::NO_IDENTIFIER + bool _register_condition( + std::string_view identifier, + value_type_t value_type, + scope_type_t scope, + scope_type_t scope_change, + identifier_type_t key_identifier_type, + identifier_type_t value_identifier_type, + std::string_view loc_true_key, + std::string_view loc_false_key, + tooltip_subject_t tooltip_subject ); NodeTools::callback_t expect_parse_identifier( @@ -281,6 +299,47 @@ namespace OpenVic { public: bool setup_conditions(DefinitionManager const& definition_manager); + struct ConditionBuilder { + ConditionManager& manager; + + std::string_view identifier; + value_type_t value_type; + scope_type_t scope; + + scope_type_t m_scope_change = scope_type_t::NO_SCOPE; + identifier_type_t m_key_identifier_type = identifier_type_t::NO_IDENTIFIER; + identifier_type_t m_value_identifier_type = identifier_type_t::NO_IDENTIFIER; + std::string_view m_loc_true_key; + std::string_view m_loc_false_key; + + tooltip_subject_t m_tooltip_subject = tooltip_subject_t::NONE; + + ConditionBuilder& scope_change(scope_type_t v) { m_scope_change = v; return *this; } + + ConditionBuilder& key_identifier_type(identifier_type_t v) { m_key_identifier_type = v; return *this; } + + ConditionBuilder& value_identifier_type(identifier_type_t v) { m_value_identifier_type = v; return *this; } + + ConditionBuilder& subject(tooltip_subject_t v) { m_tooltip_subject = v; return *this; } + + ConditionBuilder& loc(std::string_view t_key, std::string_view f_key = {}) { + m_loc_true_key = t_key; + m_loc_false_key = f_key; + return *this; + } + + operator bool() const { + return manager._register_condition( + identifier, value_type, scope, m_scope_change, m_key_identifier_type, + m_value_identifier_type, m_loc_true_key, m_loc_false_key, m_tooltip_subject + ); + } + }; + + ConditionBuilder add_condition(std::string_view identifier, value_type_t value_type, scope_type_t scope) { + return ConditionBuilder{ *this, identifier, value_type, scope }; + } + bool expect_condition_script( DefinitionManager const& definition_manager, scope_type_t initial_scope, scope_type_t this_scope, scope_type_t from_scope, NodeTools::callback_t callback, std::span nodes diff --git a/src/openvic-simulation/scripts/Context.cpp b/src/openvic-simulation/scripts/Context.cpp index 9ab27716..bd47ae30 100644 --- a/src/openvic-simulation/scripts/Context.cpp +++ b/src/openvic-simulation/scripts/Context.cpp @@ -27,6 +27,29 @@ scope_type_t Context::get_scope_type() const { ); } +std::string_view Context::get_identifier() const { + return std::visit([](auto const* p) -> std::string_view { + if (!p) return ""; + + using T = std::decay_t; + + if constexpr (std::is_same_v) { + return p->get_identifier(); + } + else if constexpr (std::is_same_v) { + return p->get_identifier(); + } + else if constexpr (std::is_same_v) { + return p->get_identifier(); + } + else if constexpr (std::is_same_v) { + return ""; + } + + return ""; + }, ptr); +} + bool Context::evaluate_leaf(ConditionNode const& node) const { return std::visit( [&](auto* p) -> bool { diff --git a/src/openvic-simulation/scripts/Context.hpp b/src/openvic-simulation/scripts/Context.hpp index a6595d4e..10410297 100644 --- a/src/openvic-simulation/scripts/Context.hpp +++ b/src/openvic-simulation/scripts/Context.hpp @@ -35,6 +35,8 @@ namespace OpenVic { scope_type_t get_scope_type() const; + std::string_view get_identifier() const; + bool evaluate_leaf(ConditionNode const& node) const; std::vector get_sub_contexts(std::string_view condition_id, scope_type_t target) const; From 5f3577e87676c0e8bcb84976f0463caba4827cc3 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 15:57:01 +0100 Subject: [PATCH 05/15] tweak --- src/openvic-simulation/country/CountryInstance.cpp | 5 +++++ src/openvic-simulation/scripts/Condition.cpp | 13 ++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/openvic-simulation/country/CountryInstance.cpp b/src/openvic-simulation/country/CountryInstance.cpp index 9511714d..b5c9a13c 100644 --- a/src/openvic-simulation/country/CountryInstance.cpp +++ b/src/openvic-simulation/country/CountryInstance.cpp @@ -1205,6 +1205,11 @@ bool CountryInstance::evaluate_leaf(ConditionNode const& node) const { return is_civilised() == expected; } + if (id == "colonial_nation") { + bool expected = std::get(node.get_value()); + return is_colonial(colony_status_t::COLONY) == expected; + } + if (id == "exists") { bool expected = std::get(node.get_value()); return exists() == expected; diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index f7823bd3..b08afe7b 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -445,13 +445,18 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana scope_type_t scope, scope_type_t scope_change = NO_SCOPE, identifier_type_t key_identifier_type = NO_IDENTIFIER, - identifier_type_t value_identifier_type = NO_IDENTIFIER + identifier_type_t value_identifier_type = NO_IDENTIFIER, + tooltip_subject_t tooltip_subject = tooltip_subject_t::NONE, + std::string_view loc_true_key = {}, + std::string_view loc_false_key = {} ) -> void { for (std::string_view const& identifier : identifiers) { ret &= add_condition(identifier, value_type, scope) .scope_change(scope_change) .key_identifier_type(key_identifier_type) - .value_identifier_type(value_identifier_type); + .value_identifier_type(value_identifier_type) + .loc(loc_true_key, loc_false_key) + .subject(tooltip_subject); } }; @@ -535,7 +540,9 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana COUNTRY, NO_SCOPE, TECHNOLOGY, - NO_IDENTIFIER + NO_IDENTIFIER, + tooltip_subject_t::VALUE, + "HAVE_TECH_TRI" ); import_identifiers( From 3ac921b447cadf22f0fe446578e67940a4753bc8 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:42:57 +0100 Subject: [PATCH 06/15] fix Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/openvic-simulation/scripts/Condition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index b08afe7b..e5966ee9 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -30,7 +30,7 @@ ConditionNode::ConditionNode( HasIdentifier const* new_condition_key_item, HasIdentifier const* new_condition_value_item ) : condition { new_condition }, value { std::move(new_value) }, valid { new_valid }, - condition_key_item { new_condition_key_item }, condition_value_item { new_condition_key_item } {} + condition_key_item { new_condition_key_item }, condition_value_item { new_condition_value_item } {} bool ConditionNode::evaluate(Context const& context) const { if (!is_valid()) { From 6013a92cbf87f1230b2d837ea4e9b60ba8579933 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 16:44:33 +0100 Subject: [PATCH 07/15] fix copy paste Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/openvic-simulation/map/State.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openvic-simulation/map/State.cpp b/src/openvic-simulation/map/State.cpp index 2a1e9e3f..78d58cde 100644 --- a/src/openvic-simulation/map/State.cpp +++ b/src/openvic-simulation/map/State.cpp @@ -99,7 +99,7 @@ void State::update_gamestate() { bool State::evaluate_leaf(ConditionNode const& node) const { std::string_view const& id = node.get_condition()->get_identifier(); - spdlog::warn_s("Condition {} not implemented in Pop::evaluate_leaf", id); + spdlog::warn_s("Condition {} not implemented in State::evaluate_leaf", id); return false; } From 4af56acb314c95661c7f0bd7b367a96b51b15c88 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:09:35 +0100 Subject: [PATCH 08/15] fix logic bug Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/openvic-simulation/scripts/Condition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index e5966ee9..fd6d34ae 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -92,7 +92,7 @@ bool ConditionNode::evaluate_group(Context const& context) const { if (!node.evaluate(sub)) return false; } } - return false; + return true; } for (auto const& sub : sub_contexts) { bool all_match = true; From baa07c4b6eb0ea7f1744a7cd5cc3841c5fae9790 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:10:31 +0100 Subject: [PATCH 09/15] tweak Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/openvic-simulation/scripts/Context.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/openvic-simulation/scripts/Context.cpp b/src/openvic-simulation/scripts/Context.cpp index bd47ae30..7d806de8 100644 --- a/src/openvic-simulation/scripts/Context.cpp +++ b/src/openvic-simulation/scripts/Context.cpp @@ -52,7 +52,10 @@ std::string_view Context::get_identifier() const { bool Context::evaluate_leaf(ConditionNode const& node) const { return std::visit( - [&](auto* p) -> bool { + [&](auto const* p) -> bool { + if (!p) { + return false; + } return p->evaluate_leaf(node); }, ptr From d8a0ec9d910665e62944ac72c5af765d3293da6c Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:12:46 +0100 Subject: [PATCH 10/15] better null safety Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/openvic-simulation/scripts/Context.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/openvic-simulation/scripts/Context.cpp b/src/openvic-simulation/scripts/Context.cpp index 7d806de8..76f7c236 100644 --- a/src/openvic-simulation/scripts/Context.cpp +++ b/src/openvic-simulation/scripts/Context.cpp @@ -122,10 +122,18 @@ std::optional Context::get_redirect_context(std::string_view condition_ if (target == scope_type_t::COUNTRY) { if (condition_id == "owner") { - return make_child(province->get_owner()); + auto const* owner = province->get_owner(); + if (owner == nullptr) { + return std::nullopt; + } + return make_child(owner); } if (condition_id == "controller") { - return make_child(province->get_controller()); + auto const* controller = province->get_controller(); + if (controller == nullptr) { + return std::nullopt; + } + return make_child(controller); } } } From 51e50415b7053b240f3f3239e9baab405b7b5171 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:13:31 +0100 Subject: [PATCH 11/15] make string const reference Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/openvic-simulation/country/CountryInstance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openvic-simulation/country/CountryInstance.cpp b/src/openvic-simulation/country/CountryInstance.cpp index b5c9a13c..f9d76980 100644 --- a/src/openvic-simulation/country/CountryInstance.cpp +++ b/src/openvic-simulation/country/CountryInstance.cpp @@ -1276,7 +1276,7 @@ bool CountryInstance::evaluate_leaf(ConditionNode const& node) const { } if (id == "tag") { - memory::string expected = std::get(node.get_value()); + memory::string const& expected = std::get(node.get_value()); return country_definition.get_identifier() == expected; } From 620cc66be07d3ef47019912710f155a46c4009ed Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Mon, 16 Feb 2026 13:03:53 +0100 Subject: [PATCH 12/15] tweak this and from scopes Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/openvic-simulation/scripts/Condition.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index fd6d34ae..32e17615 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -173,8 +173,8 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana bool ret = true; /* Special Scopes */ - ret &= add_condition("THIS", GROUP, COUNTRY).scope_change(THIS); - ret &= add_condition("FROM", GROUP, COUNTRY).scope_change(FROM); + ret &= add_condition("THIS", GROUP, POP | PROVINCE | STATE | COUNTRY).scope_change(THIS); + ret &= add_condition("FROM", GROUP, POP | PROVINCE | STATE | COUNTRY).scope_change(FROM); ret &= add_condition("independence", GROUP, COUNTRY).scope_change(COUNTRY); //only from rebels! /* Trigger Country Scopes */ From 172d296eda9782ec986a4d79358252021cbce6b5 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Mon, 16 Feb 2026 20:59:59 +0100 Subject: [PATCH 13/15] tooltip position attribute --- src/openvic-simulation/scripts/Condition.cpp | 11 +++++++---- src/openvic-simulation/scripts/Condition.hpp | 20 ++++++++++++++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index 32e17615..12d0dc34 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -18,12 +18,14 @@ Condition::Condition( std::string_view new_identifier, value_type_t new_value_type, scope_type_t new_scope, scope_type_t new_scope_change, identifier_type_t new_key_identifier_type, identifier_type_t new_value_identifier_type, std::string_view new_loc_true_key, - std::string_view new_loc_false_key, tooltip_subject_t new_tooltip_subject + std::string_view new_loc_false_key, tooltip_subject_t new_tooltip_subject, + tooltip_position_t new_tooltip_position ) : HasIdentifier { new_identifier }, value_type { new_value_type }, scope { new_scope }, scope_change { new_scope_change }, key_identifier_type { new_key_identifier_type }, value_identifier_type { new_value_identifier_type }, loc_true_key { new_loc_true_key }, loc_false_key { new_loc_false_key }, - tooltip_subject { new_tooltip_subject } {} + tooltip_subject { new_tooltip_subject }, + tooltip_position { new_tooltip_position } {} ConditionNode::ConditionNode( Condition const* new_condition, value_t&& new_value, bool new_valid, @@ -128,7 +130,8 @@ bool ConditionManager::_register_condition( identifier_type_t value_identifier_type, std::string_view loc_true_key, std::string_view loc_false_key, - tooltip_subject_t tooltip_subject + tooltip_subject_t tooltip_subject, + tooltip_position_t tooltip_position ) { if (identifier.empty()) { spdlog::error_s("Invalid condition identifier - empty!"); @@ -165,7 +168,7 @@ bool ConditionManager::_register_condition( return conditions.emplace_item( identifier, identifier, value_type, scope, scope_change, key_identifier_type, value_identifier_type, - loc_true_key, loc_false_key, tooltip_subject + loc_true_key, loc_false_key, tooltip_subject, tooltip_position ); } diff --git a/src/openvic-simulation/scripts/Condition.hpp b/src/openvic-simulation/scripts/Condition.hpp index 1c507449..6d184d76 100644 --- a/src/openvic-simulation/scripts/Condition.hpp +++ b/src/openvic-simulation/scripts/Condition.hpp @@ -201,6 +201,11 @@ namespace OpenVic { NONE }; + enum class tooltip_position_t : uint8_t { + SUFFIX, + PREFIX + }; + struct Condition : HasIdentifier { friend struct ConditionManager; using enum identifier_type_t; @@ -217,12 +222,14 @@ namespace OpenVic { const std::string_view loc_false_key; const tooltip_subject_t tooltip_subject; + const tooltip_position_t tooltip_position; Condition( std::string_view new_identifier, value_type_t new_value_type, scope_type_t new_scope, scope_type_t new_scope_change, identifier_type_t new_key_identifier_type, identifier_type_t new_value_identifier_type, std::string_view new_loc_true_key, - std::string_view new_loc_false_key, tooltip_subject_t new_tooltip_subject + std::string_view new_loc_false_key, tooltip_subject_t new_tooltip_subject, + tooltip_position_t new_tooltip_position ); Condition(Condition&&) = default; }; @@ -278,7 +285,8 @@ namespace OpenVic { identifier_type_t value_identifier_type, std::string_view loc_true_key, std::string_view loc_false_key, - tooltip_subject_t tooltip_subject + tooltip_subject_t tooltip_subject, + tooltip_position_t tooltip_position ); NodeTools::callback_t expect_parse_identifier( @@ -312,7 +320,9 @@ namespace OpenVic { std::string_view m_loc_true_key; std::string_view m_loc_false_key; - tooltip_subject_t m_tooltip_subject = tooltip_subject_t::NONE; + tooltip_subject_t m_tooltip_subject = tooltip_subject_t::VALUE; + + tooltip_position_t m_tooltip_position = tooltip_position_t::SUFFIX; ConditionBuilder& scope_change(scope_type_t v) { m_scope_change = v; return *this; } @@ -322,6 +332,8 @@ namespace OpenVic { ConditionBuilder& subject(tooltip_subject_t v) { m_tooltip_subject = v; return *this; } + ConditionBuilder& position(tooltip_position_t v) { m_tooltip_position = v; return *this; } + ConditionBuilder& loc(std::string_view t_key, std::string_view f_key = {}) { m_loc_true_key = t_key; m_loc_false_key = f_key; @@ -331,7 +343,7 @@ namespace OpenVic { operator bool() const { return manager._register_condition( identifier, value_type, scope, m_scope_change, m_key_identifier_type, - m_value_identifier_type, m_loc_true_key, m_loc_false_key, m_tooltip_subject + m_value_identifier_type, m_loc_true_key, m_loc_false_key, m_tooltip_subject, m_tooltip_position ); } }; From f697ce847a4d98ee467dc785f0609b423ba6fa85 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Mon, 16 Feb 2026 21:24:04 +0100 Subject: [PATCH 14/15] add more loc --- src/openvic-simulation/scripts/Condition.cpp | 50 ++++++++++---------- src/openvic-simulation/scripts/Condition.hpp | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index 12d0dc34..8355f750 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -181,25 +181,25 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("independence", GROUP, COUNTRY).scope_change(COUNTRY); //only from rebels! /* Trigger Country Scopes */ - ret &= add_condition("all_core", GROUP, COUNTRY).scope_change(PROVINCE); - ret &= add_condition("any_core", GROUP, COUNTRY).scope_change(PROVINCE); - ret &= add_condition("any_greater_power", GROUP, COUNTRY).scope_change(COUNTRY); - ret &= add_condition("any_neighbor_country", GROUP, COUNTRY).scope_change(COUNTRY); - ret &= add_condition("any_owned_province", GROUP, COUNTRY).scope_change(PROVINCE); + ret &= add_condition("all_core", GROUP, COUNTRY).scope_change(PROVINCE).loc("ALL_CORE_PROVINCE_THAT"); + ret &= add_condition("any_core", GROUP, COUNTRY).scope_change(PROVINCE).loc("ANY_CORE_PROVINCE"); + ret &= add_condition("any_greater_power", GROUP, COUNTRY).scope_change(COUNTRY).loc("ANY_GP_STARTS"); + ret &= add_condition("any_neighbor_country", GROUP, COUNTRY).scope_change(COUNTRY).loc("NEIGHBOR_COUNTRY_STARTS"); + ret &= add_condition("any_owned_province", GROUP, COUNTRY).scope_change(PROVINCE).loc("ANY_PROVINCE_STARTS"); ret &= add_condition("any_pop", GROUP, COUNTRY).scope_change(POP); ret &= add_condition("any_sphere_member", GROUP, COUNTRY).scope_change(COUNTRY); - ret &= add_condition("any_state", GROUP, COUNTRY).scope_change(STATE); - ret &= add_condition("any_substate", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("any_state", GROUP, COUNTRY).scope_change(STATE).loc("ANY_STATE_STARTS"); + ret &= add_condition("any_substate", GROUP, COUNTRY).scope_change(COUNTRY).loc("ANY_SUBSTATE").subject(tooltip_subject_t::SCOPE); ret &= add_condition("capital_scope", GROUP, COUNTRY).scope_change(PROVINCE); ret &= add_condition("country", GROUP, COUNTRY).scope_change(COUNTRY); ret &= add_condition("cultural_union", GROUP, COUNTRY).scope_change(COUNTRY); ret &= add_condition("overlord", GROUP, COUNTRY).scope_change(COUNTRY); ret &= add_condition("owner", GROUP, COUNTRY).scope_change(COUNTRY); ret &= add_condition("sphere_owner", GROUP, COUNTRY).scope_change(COUNTRY); - ret &= add_condition("war_countries", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("war_countries", GROUP, COUNTRY).scope_change(COUNTRY).loc("ANY_AT_WAR_STARTS"); /* Trigger State Scopes */ - ret &= add_condition("any_neighbor_province", GROUP, STATE).scope_change(PROVINCE); + ret &= add_condition("any_neighbor_province", GROUP, STATE).scope_change(PROVINCE).loc("NEIGHBOR_PROVINCE_STARTS"); /* Trigger Province Scopes */ ret &= add_condition("controller", GROUP, PROVINCE).scope_change(COUNTRY); @@ -209,9 +209,9 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("location", GROUP, POP).scope_change(PROVINCE); /* Special Conditions */ - ret &= add_condition("AND", GROUP, COUNTRY); - ret &= add_condition("OR", GROUP, COUNTRY); - ret &= add_condition("NOT", GROUP, COUNTRY); + ret &= add_condition("AND", GROUP, COUNTRY).loc("AND_TRIGGER_STARTS"); + ret &= add_condition("OR", GROUP, COUNTRY).loc("OR_TRIGGER_STARTS"); + ret &= add_condition("NOT", GROUP, COUNTRY).loc("NOT_TRIGGER_STARTS"); /* Global Conditions */ ret &= add_condition("year", INTEGER, COUNTRY); @@ -228,7 +228,7 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("average_consciousness", REAL, COUNTRY); ret &= add_condition("average_militancy", REAL, COUNTRY); ret &= add_condition("badboy", REAL, COUNTRY); - ret &= add_condition("big_producer", IDENTIFIER, COUNTRY).value_identifier_type(TRADE_GOOD); + ret &= add_condition("big_producer", IDENTIFIER, COUNTRY).value_identifier_type(TRADE_GOOD).loc("IS_BIG_PROD_TRIG", "IS_NOT_BIG_PROD_TRIG"); ret &= add_condition("blockade", REAL, COUNTRY); ret &= add_condition("brigades_compare", REAL, COUNTRY); ret &= add_condition("can_build_factory_in_capital_state", IDENTIFIER, COUNTRY).value_identifier_type(BUILDING); @@ -241,8 +241,8 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("check_variable", COMPLEX, COUNTRY).key_identifier_type(VARIABLE); ret &= add_condition("citizenship_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("civilization_progress", REAL, COUNTRY); - ret &= add_condition("civilized", BOOLEAN, COUNTRY); - ret &= add_condition("colonial_nation", BOOLEAN, COUNTRY).loc("HAS_COLONIES", "HAS_NO_COLONIES").subject(tooltip_subject_t::SCOPE); + ret &= add_condition("civilized", BOOLEAN, COUNTRY).loc("IS_CIVILIZED", "IS_NOT_CIVILIZED").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); + ret &= add_condition("colonial_nation", BOOLEAN, COUNTRY).loc("HAS_COLONIES", "HAS_NO_COLONIES").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); ret &= add_condition("consciousness", REAL, COUNTRY); ret &= add_condition("constructing_cb_progress", REAL, COUNTRY); ret &= add_condition("constructing_cb_type", IDENTIFIER, COUNTRY).value_identifier_type(CASUS_BELLI); @@ -272,28 +272,28 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("has_unclaimed_cores", BOOLEAN, COUNTRY); ret &= add_condition("ideology", IDENTIFIER, COUNTRY).value_identifier_type(IDEOLOGY); ret &= add_condition("industrial_score", REAL | IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); - ret &= add_condition("in_sphere", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); - ret &= add_condition("in_default", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG); - ret &= add_condition("invention", IDENTIFIER, COUNTRY).value_identifier_type(INVENTION); - ret &= add_condition("involved_in_crisis", BOOLEAN, COUNTRY); + ret &= add_condition("in_sphere", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG).loc("IS_IN_SPHERE", "IS_NOT_IN_SPHERE"); + ret &= add_condition("in_default", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG).loc("IS_IN_DEFAULT_TO", "IS_NOT_IN_DEFAULT_TO"); + ret &= add_condition("invention", IDENTIFIER, COUNTRY).value_identifier_type(INVENTION).loc("HAVE").subject(tooltip_subject_t::VALUE); + ret &= add_condition("involved_in_crisis", BOOLEAN, COUNTRY).loc("IS_IN_CRISIS", "IS_NOT_IN_CRISIS").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); ret &= add_condition("is_claim_crisis", BOOLEAN, COUNTRY); ret &= add_condition("is_colonial_crisis", BOOLEAN, COUNTRY); ret &= add_condition("is_cultural_union", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG); - ret &= add_condition("is_disarmed", BOOLEAN, COUNTRY); + ret &= add_condition("is_disarmed", BOOLEAN, COUNTRY).loc("IS_DISARMED", "IS_NOT_DISARMED"); ret &= add_condition("is_greater_power", BOOLEAN, COUNTRY); ret &= add_condition("is_colonial", BOOLEAN, STATE); ret &= add_condition("is_core", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG | PROVINCE_ID); ret &= add_condition("is_culture_group", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG | CULTURE_GROUP); ret &= add_condition("is_ideology_enabled", IDENTIFIER, COUNTRY).value_identifier_type(IDEOLOGY); - ret &= add_condition("is_independant", BOOLEAN, COUNTRY); // paradox typo + ret &= add_condition("is_independant", BOOLEAN, COUNTRY).loc("IS_INDEP").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); // paradox typo ret &= add_condition("is_liberation_crisis", BOOLEAN, COUNTRY); ret &= add_condition("is_mobilised", BOOLEAN, COUNTRY); ret &= add_condition("is_next_reform", IDENTIFIER, COUNTRY).value_identifier_type(REFORM); - ret &= add_condition("is_our_vassal", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("is_our_vassal", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG).loc("IS_OUR_VASSAL", "IS_NOT_OUR_VASSAL"); ret &= add_condition("is_possible_vassal", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("is_releasable_vassal", IDENTIFIER | BOOLEAN, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("is_secondary_power", BOOLEAN, COUNTRY); - ret &= add_condition("is_sphere_leader_of", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("is_sphere_leader_of", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG).loc("IS_SPHERELEADER_OF", "IS_NOT_SPHERELEADER_OF"); ret &= add_condition("is_substate", BOOLEAN, COUNTRY); ret &= add_condition("is_subject", BOOLEAN, COUNTRY); ret &= add_condition("is_vassal", BOOLEAN, COUNTRY); @@ -335,7 +335,7 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("poor_strata_luxury_needs", REAL, COUNTRY); ret &= add_condition("poor_tax", REAL, COUNTRY); ret &= add_condition("prestige", REAL, COUNTRY); - ret &= add_condition("primary_culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE); + ret &= add_condition("primary_culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE).loc("IS_PRIMARY_CULTURE", "IS_NOT_PRIMARY_CULTURE"); ret &= add_condition("accepted_culture", IDENTIFIER, COUNTRY).value_identifier_type(CULTURE); ret &= add_condition("produces", IDENTIFIER, COUNTRY).value_identifier_type(TRADE_GOOD); ret &= add_condition("rank", INTEGER, COUNTRY); @@ -415,7 +415,7 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("is_coastal", BOOLEAN, PROVINCE); ret &= add_condition("is_overseas", BOOLEAN, PROVINCE); ret &= add_condition("is_primary_culture", IDENTIFIER | BOOLEAN, PROVINCE).value_identifier_type(COUNTRY_TAG); - ret &= add_condition("is_state_capital", BOOLEAN, PROVINCE); + ret &= add_condition("is_state_capital", BOOLEAN, PROVINCE).loc("IS_STATE_CAPITAL", "IS_NOT_STATE_CAPITAL").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); ret &= add_condition("is_state_religion", BOOLEAN, PROVINCE); ret &= add_condition("life_rating", REAL, PROVINCE); ret &= add_condition("minorities", BOOLEAN, PROVINCE); diff --git a/src/openvic-simulation/scripts/Condition.hpp b/src/openvic-simulation/scripts/Condition.hpp index 6d184d76..2598f54e 100644 --- a/src/openvic-simulation/scripts/Condition.hpp +++ b/src/openvic-simulation/scripts/Condition.hpp @@ -320,7 +320,7 @@ namespace OpenVic { std::string_view m_loc_true_key; std::string_view m_loc_false_key; - tooltip_subject_t m_tooltip_subject = tooltip_subject_t::VALUE; + tooltip_subject_t m_tooltip_subject = tooltip_subject_t::NONE; tooltip_position_t m_tooltip_position = tooltip_position_t::SUFFIX; From b1cc6756fe6cfd94fb06123b32eab5100d041423 Mon Sep 17 00:00:00 2001 From: Darki <50775247+DarkiBoi@users.noreply.github.com> Date: Tue, 17 Feb 2026 19:26:15 +0100 Subject: [PATCH 15/15] tweak a lot of conditions --- src/openvic-simulation/scripts/Condition.cpp | 48 +++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/openvic-simulation/scripts/Condition.cpp b/src/openvic-simulation/scripts/Condition.cpp index 8355f750..2494180a 100644 --- a/src/openvic-simulation/scripts/Condition.cpp +++ b/src/openvic-simulation/scripts/Condition.cpp @@ -176,8 +176,8 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana bool ret = true; /* Special Scopes */ - ret &= add_condition("THIS", GROUP, POP | PROVINCE | STATE | COUNTRY).scope_change(THIS); - ret &= add_condition("FROM", GROUP, POP | PROVINCE | STATE | COUNTRY).scope_change(FROM); + ret &= add_condition("THIS", GROUP, MAX_SCOPE).scope_change(THIS); + ret &= add_condition("FROM", GROUP, MAX_SCOPE).scope_change(FROM); ret &= add_condition("independence", GROUP, COUNTRY).scope_change(COUNTRY); //only from rebels! /* Trigger Country Scopes */ @@ -186,44 +186,48 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("any_greater_power", GROUP, COUNTRY).scope_change(COUNTRY).loc("ANY_GP_STARTS"); ret &= add_condition("any_neighbor_country", GROUP, COUNTRY).scope_change(COUNTRY).loc("NEIGHBOR_COUNTRY_STARTS"); ret &= add_condition("any_owned_province", GROUP, COUNTRY).scope_change(PROVINCE).loc("ANY_PROVINCE_STARTS"); - ret &= add_condition("any_pop", GROUP, COUNTRY).scope_change(POP); - ret &= add_condition("any_sphere_member", GROUP, COUNTRY).scope_change(COUNTRY); + ret &= add_condition("any_pop", GROUP, COUNTRY | PROVINCE).scope_change(POP).loc("ANY_POP_IN_PROVINCE_STARTS"); + ret &= add_condition("any_sphere_member", GROUP, COUNTRY).scope_change(COUNTRY).loc("SPHERE_MEMBERS_START"); ret &= add_condition("any_state", GROUP, COUNTRY).scope_change(STATE).loc("ANY_STATE_STARTS"); ret &= add_condition("any_substate", GROUP, COUNTRY).scope_change(COUNTRY).loc("ANY_SUBSTATE").subject(tooltip_subject_t::SCOPE); ret &= add_condition("capital_scope", GROUP, COUNTRY).scope_change(PROVINCE); - ret &= add_condition("country", GROUP, COUNTRY).scope_change(COUNTRY); ret &= add_condition("cultural_union", GROUP, COUNTRY).scope_change(COUNTRY); ret &= add_condition("overlord", GROUP, COUNTRY).scope_change(COUNTRY); - ret &= add_condition("owner", GROUP, COUNTRY).scope_change(COUNTRY); ret &= add_condition("sphere_owner", GROUP, COUNTRY).scope_change(COUNTRY); - ret &= add_condition("war_countries", GROUP, COUNTRY).scope_change(COUNTRY).loc("ANY_AT_WAR_STARTS"); + ret &= add_condition("war_countries", GROUP, COUNTRY).scope_change(COUNTRY).loc("ANY_AT_WAR_STARTS").subject(tooltip_subject_t::SCOPE); /* Trigger State Scopes */ ret &= add_condition("any_neighbor_province", GROUP, STATE).scope_change(PROVINCE).loc("NEIGHBOR_PROVINCE_STARTS"); /* Trigger Province Scopes */ + ret &= add_condition("any_core", GROUP, PROVINCE).scope_change(COUNTRY); + ret &= add_condition("any_neighbor_province", GROUP, PROVINCE).scope_change(PROVINCE).loc("NEIGHBOR_PROVINCE_STARTS"); ret &= add_condition("controller", GROUP, PROVINCE).scope_change(COUNTRY); + ret &= add_condition("owner", GROUP, PROVINCE).scope_change(COUNTRY); + ret &= add_condition("sea_zone", GROUP, PROVINCE).scope_change(PROVINCE); ret &= add_condition("state_scope", GROUP, PROVINCE).scope_change(STATE); /* Trigger Pop Scopes */ ret &= add_condition("location", GROUP, POP).scope_change(PROVINCE); + ret &= add_condition("country", GROUP, POP).scope_change(COUNTRY); + ret &= add_condition("cultural_union", GROUP, POP).scope_change(COUNTRY); /* Special Conditions */ - ret &= add_condition("AND", GROUP, COUNTRY).loc("AND_TRIGGER_STARTS"); - ret &= add_condition("OR", GROUP, COUNTRY).loc("OR_TRIGGER_STARTS"); - ret &= add_condition("NOT", GROUP, COUNTRY).loc("NOT_TRIGGER_STARTS"); + ret &= add_condition("AND", GROUP, MAX_SCOPE).loc("AND_TRIGGER_STARTS"); + ret &= add_condition("OR", GROUP, MAX_SCOPE).loc("OR_TRIGGER_STARTS"); + ret &= add_condition("NOT", GROUP, MAX_SCOPE).loc("NOT_TRIGGER_STARTS"); /* Global Conditions */ - ret &= add_condition("year", INTEGER, COUNTRY); - ret &= add_condition("month", INTEGER, COUNTRY); - ret &= add_condition("has_global_flag", IDENTIFIER, COUNTRY).value_identifier_type(GLOBAL_FLAG); - ret &= add_condition("is_canal_enabled", INTEGER, COUNTRY); - ret &= add_condition("always", BOOLEAN, COUNTRY); - ret &= add_condition("world_wars_enabled", BOOLEAN, COUNTRY); + ret &= add_condition("year", INTEGER, MAX_SCOPE); + ret &= add_condition("month", INTEGER, MAX_SCOPE); + ret &= add_condition("has_global_flag", IDENTIFIER, MAX_SCOPE).value_identifier_type(GLOBAL_FLAG); + ret &= add_condition("is_canal_enabled", INTEGER, MAX_SCOPE); + ret &= add_condition("always", BOOLEAN, MAX_SCOPE).loc("ALWAYS_TRUE"); + ret &= add_condition("world_wars_enabled", BOOLEAN, MAX_SCOPE); /* Country Scope Conditions */ ret &= add_condition("administration_spending", REAL, COUNTRY); - ret &= add_condition("ai", BOOLEAN, COUNTRY); + ret &= add_condition("ai", BOOLEAN, COUNTRY).loc("IS_AI", "IS_NOT_AI"); ret &= add_condition("alliance_with", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); ret &= add_condition("average_consciousness", REAL, COUNTRY); ret &= add_condition("average_militancy", REAL, COUNTRY); @@ -234,7 +238,7 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("can_build_factory_in_capital_state", IDENTIFIER, COUNTRY).value_identifier_type(BUILDING); ret &= add_condition("can_build_fort_in_capital", COMPLEX, COUNTRY); ret &= add_condition("can_build_railway_in_capital", COMPLEX, COUNTRY); - ret &= add_condition("can_nationalize", BOOLEAN, COUNTRY); + ret &= add_condition("can_nationalize", BOOLEAN, COUNTRY).loc("CAN_NATIONALIZE"); ret &= add_condition("can_create_vassals", BOOLEAN, COUNTRY); ret &= add_condition("capital", IDENTIFIER, COUNTRY).value_identifier_type(PROVINCE_ID); ret &= add_condition("casus_belli", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); @@ -242,7 +246,7 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("citizenship_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("civilization_progress", REAL, COUNTRY); ret &= add_condition("civilized", BOOLEAN, COUNTRY).loc("IS_CIVILIZED", "IS_NOT_CIVILIZED").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); - ret &= add_condition("colonial_nation", BOOLEAN, COUNTRY).loc("HAS_COLONIES", "HAS_NO_COLONIES").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); + ret &= add_condition("colonial_nation", BOOLEAN, COUNTRY).loc("HAS_NO_COLONIES", "HAS_COLONIES").subject(tooltip_subject_t::SCOPE).position(tooltip_position_t::PREFIX); ret &= add_condition("consciousness", REAL, COUNTRY); ret &= add_condition("constructing_cb_progress", REAL, COUNTRY); ret &= add_condition("constructing_cb_type", IDENTIFIER, COUNTRY).value_identifier_type(CASUS_BELLI); @@ -378,11 +382,11 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("unit_in_battle", BOOLEAN, COUNTRY); ret &= add_condition("upper_house", COMPLEX, COUNTRY); ret &= add_condition("vassal_of", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); - ret &= add_condition("war", BOOLEAN, COUNTRY); + ret &= add_condition("war", BOOLEAN, COUNTRY).loc("ATWAR"); ret &= add_condition("war_exhaustion", REAL, COUNTRY); ret &= add_condition("war_policy", IDENTIFIER, COUNTRY).value_identifier_type(PARTY_POLICY); ret &= add_condition("war_score", REAL, COUNTRY); - ret &= add_condition("war_with", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG); + ret &= add_condition("war_with", IDENTIFIER, COUNTRY).value_identifier_type(COUNTRY_TAG).loc("AT_WAR_WITH").subject(tooltip_subject_t::VALUE); /* State Scope Conditions */ ret &= add_condition("controlled_by", IDENTIFIER, STATE).value_identifier_type(COUNTRY_TAG); @@ -397,7 +401,7 @@ bool ConditionManager::setup_conditions(DefinitionManager const& definition_mana ret &= add_condition("work_available", COMPLEX, STATE); /* Province Scope Conditions */ - ret &= add_condition("can_build_factory", BOOLEAN, PROVINCE); + ret &= add_condition("can_build_factory", BOOLEAN, PROVINCE).loc("CAN_BUILD_FACTORY", "CAN_NOT_BUILD_FACTORY"); ret &= add_condition("controlled_by_rebels", BOOLEAN, PROVINCE); ret &= add_condition("country_units_in_province", IDENTIFIER, PROVINCE).value_identifier_type(COUNTRY_TAG); ret &= add_condition("country_units_in_state", IDENTIFIER, PROVINCE).value_identifier_type(COUNTRY_TAG);