liege_modify_vassal_contract_interaction = { special_interaction = liege_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal common_interaction = yes icon = icon_contract_modification_single interface_priority = 5 send_name = "modify_vassal_contract_interaction_SEND" desc = liege_modify_vassal_contract_interaction_desc force_notification = yes notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL is_shown = { scope:recipient = { this != scope:actor liege ?= scope:actor # this excludes tributary contracts by default is_ruler = yes vassal_contract_has_modifiable_obligations = yes NOT = { government_allows = administrative } NOT = { government_has_flag = government_is_nomadic } } } is_valid_showing_failures_only = { NOT = { scope:actor = { is_at_war_with = scope:recipient } } } can_send = { #Mandala gets special treatment trigger_if = { limit = { scope:actor = { government_has_flag = government_is_mandala } } custom_tooltip = { text = liege_modify_vassal_contract_mandala_cooldown NOT = { scope:recipient = { var:liege_recently_adjusted_mandala_vassal_contract ?= scope:actor } } } scope:actor = { has_changed_contract_obligation_trigger = yes custom_description = { text = "liege_modify_vassal_contract_cannot_exceed_tyranny_cap" object = scope:actor NOT = { vassal_obligation_increase_tyranny_gain_multiplier > 1 } } # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } # If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook save_temporary_scope_value_as = { name = obligations_favoring_vassal value = scope:recipient.count_obligation_improvements_for_vassal } trigger_if = { limit = { scope:obligations_favoring_vassal > 0 } custom_description = { text = "vassal_modify_vassal_contract_unnecessary_hook_usage_vassal_favor" object = scope:recipient value = scope:obligations_favoring_vassal NOT = { always = scope:hook } } } trigger_else_if = { limit = { scope:obligations_favoring_vassal = 0 } custom_description = { text = "vassal_modify_vassal_contract_unnecessary_hook_usage_equal" object = scope:recipient NOT = { always = scope:hook } } } trigger_else = {} # Otherwise we're fine! } } #The rest trigger_else_if = { #If they're blocked we don't want to show anything else limit = { scope:recipient = { subject_contract_is_blocked_from_modification = yes } } scope:recipient = { subject_contract_is_blocked_from_modification = no } } trigger_else = { scope:actor = { has_changed_contract_obligation_trigger = yes custom_description = { text = "liege_modify_vassal_contract_cannot_exceed_tyranny_cap" object = scope:actor NOT = { vassal_obligation_increase_tyranny_gain_multiplier > 1 } } # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } # If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook save_temporary_scope_value_as = { name = obligations_favoring_vassal value = scope:recipient.count_obligation_improvements_for_vassal } trigger_if = { limit = { scope:obligations_favoring_vassal > 0 } custom_description = { text = "vassal_modify_vassal_contract_unnecessary_hook_usage_vassal_favor" object = scope:recipient value = scope:obligations_favoring_vassal NOT = { always = scope:hook } } } trigger_else_if = { limit = { scope:obligations_favoring_vassal = 0 } custom_description = { text = "vassal_modify_vassal_contract_unnecessary_hook_usage_equal" object = scope:recipient NOT = { always = scope:hook } } } trigger_else = {} # Otherwise we're fine! } } } auto_accept = yes on_accept = { hidden_effect = { # Struggle Catalysts ## We work these out first so they're not invalidated by the actual effect block. if = { limit = { catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:actor = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_granted_powerful_diff_faith_vassal_religious_protection character = scope:actor } } } } if = { limit = { catalyst_revoked_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:actor = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_revoked_powerful_diff_faith_vassal_religious_protection character = scope:actor } } } } # Improving contract catalyst if = { limit = { scope:recipient.count_obligation_improvements_for_vassal > 0 scope:actor = { is_diff_faith_or_culture_trigger = { CHAR = scope:recipient STATUS = involved } any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_grant_privilege_to_diff_faith_culture_vassal character = scope:actor } } } } } # Enact changes. scope:actor = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:recipient # Add tyranny for each level increased. Can spend one hook to avoid one level of tyranny hit. add_tyranny = vassal_obligation_increase_tyranny_gain if = { limit = { vassal_obligation_increase_tyranny_gain != 0 } stress_impact = { just = medium_stress_impact_gain generous = medium_stress_impact_gain } } if = { limit = { always = scope:hook } use_hook = scope:recipient add_achievement_flag_effect = { FLAG = achievement_fine_print_flag } } scope:recipient = { hidden_effect = { set_subject_contract_modification_blocked = yes } set_variable = { name = liege_recently_adjusted_mandala_vassal_contract value = scope:actor years = mandala_vassal_obligation_cooldown_years } } every_in_list = { list = changed_obligations save_scope_as = obligation scope:recipient = { vassal_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation } } } } } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } send_option = { is_valid = { scope:actor = { has_usable_hook = scope:recipient } } flag = hook localization = SCHEME_HOOK } should_use_extra_icon = { scope:actor = { has_usable_hook = scope:recipient } } extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds" send_options_exclusive = no } vassal_modify_vassal_contract_interaction = { special_interaction = liege_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal common_interaction = yes icon = icon_contract_modification_single send_name = "modify_vassal_contract_interaction_SEND" desc = vassal_modify_vassal_contract_interaction_desc force_notification = yes notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_LIEGE redirect = { # need to reverse the role for the UI to work properly scope:recipient = { save_scope_as = secondary_recipient } scope:actor = { save_scope_as = recipient } scope:secondary_recipient = { save_scope_as = actor } } is_shown = { scope:recipient = { top_liege != this this != scope:actor liege ?= scope:actor # this excludes tributary contracts by default vassal_contract_has_modifiable_obligations = yes NOT = { government_allows = administrative } NOT = { government_has_flag = government_is_nomadic } } } is_valid_showing_failures_only = { NOT = { scope:recipient = { is_at_war_with = scope:actor } } } can_send = { #Mandala gets special treatment trigger_if = { limit = { scope:recipient = { government_has_flag = government_is_mandala } } custom_tooltip = { text = vassal_modify_vassal_contract_mandala_cooldown NOT = { scope:actor = { var:vassal_recently_adjusted_mandala_vassal_contract ?= scope:recipient } } } scope:actor = { has_changed_contract_obligation_trigger = yes } scope:recipient = { # Must be an even trade overall trigger_if = { limit = { count_obligation_improvements_for_vassal_include_hook >= 0 } custom_description = { text = "vassal_modify_vassal_contract_cannot_increase_obligation_level" object = scope:actor value = count_obligation_improvements_for_vassal_include_hook count_obligation_improvements_for_vassal_include_hook = 0 } } # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } } } #The rest trigger_else_if = { #If you're blocked we don't want to show anything else limit = { scope:recipient = { subject_contract_is_blocked_from_modification = yes } } scope:recipient = { subject_contract_is_blocked_from_modification = no } } trigger_else = { scope:actor = { has_changed_contract_obligation_trigger = yes } scope:recipient = { # Must be an even trade overall trigger_if = { limit = { count_obligation_improvements_for_vassal_include_hook >= 0 } custom_description = { text = "vassal_modify_vassal_contract_cannot_increase_obligation_level" object = scope:actor value = count_obligation_improvements_for_vassal_include_hook count_obligation_improvements_for_vassal_include_hook = 0 } } # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } } } } auto_accept = yes on_accept = { # Enact changes. scope:recipient = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:actor if = { limit = { always = scope:hook } use_hook = scope:actor add_achievement_flag_effect = { FLAG = achievement_fine_print_flag } } hidden_effect = { set_subject_contract_modification_blocked = yes } every_in_list = { list = changed_obligations save_scope_as = obligation scope:recipient = { vassal_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation } } } } } scope:actor = { set_variable = { name = vassal_recently_adjusted_mandala_vassal_contract value = scope:recipient years = mandala_vassal_obligation_cooldown_years } } # If there's a diarch involved, and they called in their change, that gets flagged. diarch_changed_own_contract_effect = yes hidden_effect = { # Struggle Catalysts ## We work these out first so they're not invalidated by the actual effect block. if = { limit = { catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:actor = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_granted_powerful_diff_faith_vassal_religious_protection character = scope:recipient } } } } # Improving contract catalyst if = { limit = { scope:recipient.count_obligation_improvements_for_vassal > 0 scope:actor = { is_diff_faith_or_culture_trigger = { CHAR = scope:recipient STATUS = involved } any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_grant_privilege_to_diff_faith_culture_vassal character = scope:actor } } } } } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } send_option = { is_valid = { scope:recipient = { has_usable_hook = scope:actor } } flag = hook localization = SCHEME_HOOK } send_option = { is_shown = { scope:recipient = { is_diarch_of_target = scope:actor } scope:actor = { has_diarchy_parameter = diarch_gets_a_free_change_on_vassal_contract } } is_valid = { scope:recipient = { trigger_if = { limit = { has_variable_list = diarch_contract_rights_used_list } NOT = { is_target_in_variable_list = { name = diarch_contract_rights_used_list target = scope:actor } } } } scope:actor = { has_diarchy_active_parameter = diarch_gets_a_free_change_on_vassal_contract } } flag = diarch localization = CALL_IN_DIARCH_RIGHTS } should_use_extra_icon = { scope:recipient = { has_usable_hook = scope:actor } } extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds" send_options_exclusive = no } ai_only_liege_modify_vassal_contract_interaction = { category = interaction_category_vassal send_name = "modify_vassal_contract_interaction_SEND" desc = liege_modify_vassal_contract_interaction_desc auto_accept = yes is_shown = { scope:actor = { is_ai = yes has_usable_hook = scope:recipient } scope:recipient = { this != scope:actor NOT = { has_strong_hook = scope:actor } liege ?= scope:actor # this excludes tributary contracts by default is_ruler = yes vassal_contract_can_be_modified_trigger = yes does_ai_liege_in_vassal_contract_desire_obligation_change = yes } NOT = { scope:actor = { is_at_war_with = scope:recipient } } } on_accept = { scope:actor = { stress_impact = { generous = minor_stress_impact_gain } } scope:recipient = { set_subject_contract_modification_blocked = yes trigger_event = char_interaction.0250 } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } ai_potential = { trigger_if = { limit = { NOT = { government_allows = administrative } } is_at_war = no } } ai_targets = { ai_recipients = vassals } ai_frequency_by_tier = { barony = 0 county = 12 duchy = 12 kingdom = 24 empire = 24 hegemony = 36 } ai_will_do = { base = 100 modifier = { factor = 0 scope:recipient = { OR = { AND = { scope:actor = { ai_greed <= high_positive_ai_value } has_relation_friend = scope:actor } has_relation_best_friend = scope:actor has_relation_soulmate = scope:actor } } } } } # AI only interaction for specifically Admin Province obligations ai_only_liege_modify_vassal_contract_admin_province_interaction = { category = interaction_category_vassal send_name = "modify_vassal_contract_interaction_SEND" desc = liege_modify_vassal_contract_interaction_desc auto_accept = yes is_shown = { scope:actor = { is_ai = yes AND = { government_has_flag = government_uses_admin_province_obligations scope:recipient = { government_has_flag = government_uses_admin_province_obligations } } } scope:recipient = { this != scope:actor NOT = { has_strong_hook = scope:actor } liege ?= scope:actor # this excludes tributary contracts by default is_ruler = yes government_has_flag = government_uses_admin_province_obligations does_ai_liege_in_vassal_contract_desire_admin_province_obligation_change = yes } NOT = { scope:actor = { is_at_war_with = scope:recipient } } } on_accept = { scope:actor = { stress_impact = { generous = minor_stress_impact_gain } } scope:recipient = { trigger_event = char_interaction.0253 } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } ai_targets = { ai_recipients = vassals max = 10 } ai_frequency_by_tier = { barony = 0 county = 0 duchy = 12 kingdom = 6 empire = 6 hegemony = 3 } is_available = { # This also blocks non-admin govs with admin vassals from changing province obligations... but we're OK with that. government_has_flag = government_uses_admin_province_obligations } ai_will_do = { base = 100 } } ai_only_vassal_modify_vassal_contract_interaction = { category = interaction_category_vassal send_name = "modify_vassal_contract_interaction_SEND" desc = vassal_modify_vassal_contract_interaction_desc auto_accept = yes is_shown = { scope:actor = { is_ai = yes top_liege != this has_usable_hook = scope:recipient vassal_contract_can_be_modified_trigger = yes does_ai_vassal_in_vassal_contract_desire_obligation_change = yes } scope:recipient = { this != scope:actor liege ?= scope:actor # this excludes tributary contracts by default is_ruler = yes NOT = { has_strong_hook = scope:actor } } NOT = { scope:actor = { is_at_war_with = scope:recipient } } } on_accept = { scope:recipient = { trigger_event = char_interaction.0251 } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } ai_potential = { always = yes } ai_targets = { ai_recipients = liege } ai_frequency_by_tier = { barony = 0 county = 24 duchy = 24 kingdom = 24 empire = 36 hegemony = 0 } ai_will_do = { base = 100 modifier = { factor = 0 scope:recipient = { OR = { AND = { scope:actor = { ai_greed <= high_positive_ai_value } has_relation_friend = scope:actor } has_relation_best_friend = scope:actor has_relation_soulmate = scope:actor } } } } } # Separate interactions are set up for Administrative - This is to help with localisation and some of the effects admin_liege_modify_vassal_contract_interaction = { special_interaction = liege_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal common_interaction = yes interface_priority = 1000 icon = icon_contract_modification_single send_name = admin_liege_modify_vassal_contract_interaction desc = admin_liege_modify_vassal_contract_interaction_desc force_notification = yes notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL is_shown = { scope:recipient = { this != scope:actor OR = { is_landed = yes is_councillor_of = scope:actor.top_liege } liege ?= scope:actor # this excludes tributary contracts by default is_ruler = yes vassal_contract_has_modifiable_obligations = yes government_allows = administrative any_held_title = { OR = { tier >= holder.main_administrative_tier tier >= holder.min_title_maa_tier } is_noble_family_title = no } } } is_valid_showing_failures_only = { scope:actor = { NOT = { is_at_war_with = scope:recipient } tgp_is_ceremonial_liege_trigger = no } } can_send = { trigger_if = { #If they're blocked we don't want to show anything else limit = { scope:recipient = { subject_contract_is_blocked_from_modification = yes } } scope:recipient = { subject_contract_is_blocked_from_modification = no } } trigger_else = { # There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers trigger_if = { limit = { scope:recipient = { has_variable = admin_contract_cooldown } } custom_tooltip = { text = admin_contract_cooldown_desc scope:recipient = { NOT = { has_variable = admin_contract_cooldown } } } } trigger_else = { scope:actor = { has_changed_contract_obligation_trigger = yes } } } } auto_accept = yes on_accept = { hidden_effect = { # Struggle Catalysts ## We work these out first so they're not invalidated by the actual effect block. if = { limit = { catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:actor = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_granted_powerful_diff_faith_vassal_religious_protection character = scope:actor } } } } if = { limit = { catalyst_revoked_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:actor = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_revoked_powerful_diff_faith_vassal_religious_protection character = scope:actor } } } } # Improving contract catalyst if = { limit = { scope:recipient.count_obligation_improvements_for_vassal > 0 scope:actor = { is_diff_faith_or_culture_trigger = { CHAR = scope:recipient STATUS = involved } any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_grant_privilege_to_diff_faith_culture_vassal character = scope:actor } } } } } # Enact changes. scope:actor = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:recipient scope:recipient = { hidden_effect = { set_variable = { name = admin_contract_cooldown value = yes years = admin_contract_cooldown_value } } } every_in_list = { list = changed_obligations save_scope_as = obligation scope:recipient = { vassal_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation } # Update the succession law for celestial province types if applicable - That way, we don't have to wait until the current law invalidates. if = { limit = { government_has_flag = government_is_celestial scope:obligation.vassal_contract_type = vassal_contract:celestial_provinces } if = { limit = { OR = { vassal_contract_has_flag = celestial_province_military vassal_contract_has_flag = celestial_province_protectorate } NOT = { has_realm_law = celestial_military_appointment_succession_law } } add_realm_law_skip_effects = celestial_military_appointment_succession_law } else_if = { limit = { OR = { vassal_contract_has_flag = celestial_province_standard vassal_contract_has_flag = celestial_province_industrial vassal_contract_has_flag = celestial_province_metropolitan } NOT = { has_realm_law = celestial_appointment_succession_law } } add_realm_law_skip_effects = celestial_appointment_succession_law } } } } } } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } send_options_exclusive = no } admin_vassal_modify_vassal_contract_interaction = { special_interaction = vassal_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal interface_priority = 65 common_interaction = yes icon = icon_contract_modification_single filter_tags = { admin_liege rep_liege } send_name = "admin_vassal_modify_vassal_contract_interaction_send" desc = admin_vassal_modify_vassal_contract_interaction_desc is_shown = { scope:actor = { top_liege != this this != scope:recipient liege ?= scope:recipient # this excludes tributary contracts by default vassal_contract_has_modifiable_obligations = yes government_allows = administrative tgp_is_ceremonial_liege_trigger = no } } is_valid_showing_failures_only = { scope:actor = { custom_tooltip = { text = admin_vassal_not_holding_a_theme_desc any_held_title = { OR = { tier >= holder.main_administrative_tier tier >= holder.min_title_maa_tier } is_noble_family_title = no } } NOT = { is_at_war_with = scope:recipient } } } can_send = { trigger_if = { #If you're blocked we don't want to show anything else (we don't really use this for admin, but we'll keep the logic, just in case) limit = { scope:actor = { subject_contract_is_blocked_from_modification = yes } } scope:actor = { subject_contract_is_blocked_from_modification = no } } trigger_else = { # There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers trigger_if = { limit = { scope:actor = { has_variable = admin_contract_cooldown } } custom_tooltip = { text = admin_contract_cooldown_desc_vassal scope:actor = { NOT = { has_variable = admin_contract_cooldown } } } } trigger_else = { custom_tooltip = { text = admin_contract_request_cooldown_desc scope:actor = { NOT = { has_variable = admin_contract_request_cooldown } } } scope:actor = { has_changed_contract_obligation_trigger = yes } } # You can afford the influence cost trigger_if = { limit = { NOR = { scope:hook = yes scope:dominant_family = yes } } scope:actor = { influence >= major_influence_value } } } } auto_accept = { custom_tooltip = { text = admin_vassal_force_obligation_change_desc OR = { scope:hook = yes scope:dominant_family = yes scope:diarch = yes } } } on_accept = { # Enact changes scope:actor = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:recipient # If you use a hook - Spend it if = { limit = { always = scope:hook } use_hook = scope:recipient add_achievement_flag_effect = { FLAG = achievement_fine_print_flag } } # If you didn't use a hook or leveraged your position as a Dominant Family, pay Influence if = { limit = { has_changed_contract_obligation_trigger = yes # Don't show the cost unless we actually change the contract NOR = { scope:hook = yes scope:dominant_family = yes scope:diarch = yes } } scope:actor = { change_influence = major_influence_loss } } # Activate cooldown - To prevent liege from changing it too soon hidden_effect = { set_variable = { name = admin_contract_cooldown value = yes years = admin_contract_cooldown_value } } every_in_list = { list = changed_obligations save_scope_as = obligation scope:actor = { vassal_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation } # Update the succession law for celestial province types if applicable - That way, we don't have to wait until the current law invalidates. if = { limit = { government_has_flag = government_is_celestial scope:obligation.vassal_contract_type = vassal_contract:celestial_provinces } if = { limit = { OR = { vassal_contract_has_flag = celestial_province_military vassal_contract_has_flag = celestial_province_protectorate } NOT = { has_realm_law = celestial_military_appointment_succession_law } } add_realm_law_skip_effects = celestial_military_appointment_succession_law } else_if = { limit = { OR = { vassal_contract_has_flag = celestial_province_standard vassal_contract_has_flag = celestial_province_industrial vassal_contract_has_flag = celestial_province_metropolitan } NOT = { has_realm_law = celestial_appointment_succession_law } } add_realm_law_skip_effects = celestial_appointment_succession_law } } } } } } # If there's a diarch involved, and they called in their change, that gets flagged. diarch_changed_own_contract_effect = yes hidden_effect = { # Struggle Catalysts ## We work these out first so they're not invalidated by the actual effect block. if = { limit = { catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:recipient = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:actor } } } } scope:recipient = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:actor } } activate_struggle_catalyst = { catalyst = catalyst_granted_powerful_diff_faith_vassal_religious_protection character = scope:actor } } } } # Improving contract catalyst if = { limit = { scope:actor.count_obligation_improvements_for_vassal > 0 scope:recipient = { is_diff_faith_or_culture_trigger = { CHAR = scope:actor STATUS = involved } any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:actor } } } } scope:recipient = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:actor } } activate_struggle_catalyst = { catalyst = catalyst_grant_privilege_to_diff_faith_culture_vassal character = scope:recipient } } } } } } on_decline = { # Activate cooldown - You may only ask for it to be changed every so often (this mostly exists for MP, since you cannot send it to the AI unless they accept) hidden_effect = { scope:actor = { set_variable = { name = admin_contract_request_cooldown value = yes years = admin_contract_cooldown_value } } } } # Send Options # Hook send_option = { is_valid = { scope:actor = { has_usable_hook = scope:recipient } } flag = hook localization = SCHEME_HOOK } # Dominant Family send_option = { is_shown = { scope:actor = { house ?= { is_dominant_family = yes } } } flag = dominant_family localization = OPTION_DOMINANT_FAMILY } # Diarch send_option = { is_shown = { scope:actor = { is_diarch_of_target = scope:recipient } } is_valid = { scope:actor = { trigger_if = { limit = { has_variable_list = diarch_contract_rights_used_list } NOT = { is_target_in_variable_list = { name = diarch_contract_rights_used_list target = scope:recipient } } } } } flag = diarch localization = CALL_IN_DIARCH_RIGHTS } should_use_extra_icon = { scope:actor = { has_usable_hook = scope:recipient } } extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds" send_options_exclusive = no ai_accept = { base = -25 # Opinion Factor opinion_modifier = { who = scope:recipient opinion_target = scope:actor multiplier = 1 desc = AI_OPINION_REASON } # Governor efficiency - Skilled governors are more likely to get accepted modifier = { add = scope:actor.governor_efficiency_presented desc = AI_GOVERNOR_EFFICIENCY } # Members of a powerful family are more likely to get accepted modifier = { scope:actor = { house ?= { is_powerful_family = yes } NOT = { house ?= scope:recipient.house } } add = 50 desc = AI_POWERFUL_FAMILY } # Members of the emperors family are much more likely to get accepted modifier = { scope:actor = { house ?= scope:recipient.house } add = 60 desc = AI_SAME_HOUSE } } } # Separate interactions are set up for Nomads - This is to help with localisation and some of the effects nomad_liege_modify_vassal_contract_interaction = { special_interaction = liege_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal common_interaction = yes icon = icon_contract_modification_single send_name = nomad_liege_modify_vassal_contract_interaction desc = nomad_liege_modify_vassal_contract_interaction_desc force_notification = yes notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL is_shown = { scope:recipient = { NOT = { this = scope:actor } liege ?= scope:actor # this excludes tributary contracts by default is_ruler = yes vassal_contract_has_modifiable_obligations = yes government_has_flag = government_is_nomadic } } is_valid_showing_failures_only = { NOT = { scope:actor = { is_at_war_with = scope:recipient } } } can_send = { trigger_if = { #If they're blocked we don't want to show anything else limit = { scope:recipient = { subject_contract_is_blocked_from_modification = yes } } scope:recipient = { subject_contract_is_blocked_from_modification = no } } trigger_else = { scope:actor = { has_changed_contract_obligation_trigger = yes custom_description = { text = "liege_modify_vassal_contract_cannot_exceed_tyranny_cap" object = scope:actor NOT = { vassal_obligation_increase_tyranny_gain_multiplier > 1 } } # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } # If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook save_temporary_scope_value_as = { name = obligations_favoring_vassal value = scope:recipient.count_obligation_improvements_for_vassal } trigger_if = { limit = { scope:obligations_favoring_vassal > 0 } custom_description = { text = "vassal_modify_vassal_contract_unnecessary_hook_usage_vassal_favor" object = scope:recipient value = scope:obligations_favoring_vassal NOT = { always = scope:hook } } } trigger_else_if = { limit = { scope:obligations_favoring_vassal = 0 } custom_description = { text = "vassal_modify_vassal_contract_unnecessary_hook_usage_equal" object = scope:recipient NOT = { always = scope:hook } } } trigger_else = {} # Otherwise we're fine! } } } auto_accept = yes on_accept = { hidden_effect = { # Struggle Catalysts ## We work these out first so they're not invalidated by the actual effect block. if = { limit = { catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:actor = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_granted_powerful_diff_faith_vassal_religious_protection character = scope:actor } } } } if = { limit = { catalyst_revoked_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient } scope:actor = { any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_revoked_powerful_diff_faith_vassal_religious_protection character = scope:actor } } } } # Improving contract catalyst if = { limit = { scope:recipient.count_obligation_improvements_for_vassal > 0 scope:actor = { is_diff_faith_or_culture_trigger = { CHAR = scope:recipient STATUS = involved } any_character_struggle = { involvement = involved activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } } } scope:actor = { every_character_struggle = { involvement = involved limit = { activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal CHAR = scope:recipient } } activate_struggle_catalyst = { catalyst = catalyst_grant_privilege_to_diff_faith_culture_vassal character = scope:actor } } } } } # Enact changes. scope:actor = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:recipient if = { limit = { vassal_obligation_increase_tyranny_gain != 0 } stress_impact = { just = medium_stress_impact_gain generous = medium_stress_impact_gain } } if = { limit = { always = scope:hook } use_hook = scope:recipient add_achievement_flag_effect = { FLAG = achievement_fine_print_flag } } scope:recipient = { hidden_effect = { set_subject_contract_modification_blocked = yes set_variable = { name = vassal_modify_contract_cooldown value = yes years = vassal_modify_contract_cooldown_value } } } every_in_list = { list = changed_obligations save_scope_as = obligation scope:recipient = { vassal_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation } } } } } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } send_option = { is_valid = { scope:actor = { has_usable_hook = scope:recipient } } flag = hook localization = SCHEME_HOOK } should_use_extra_icon = { scope:actor = { has_usable_hook = scope:recipient } } extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds" send_options_exclusive = no } nomad_vassal_modify_vassal_contract_interaction = { special_interaction = vassal_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal interface_priority = 65 common_interaction = yes icon = icon_contract_modification_single send_name = "nomad_vassal_modify_vassal_contract_interaction_send" desc = nomad_vassal_modify_vassal_contract_interaction_desc redirect = { # need to reverse the role for the UI to work properly scope:recipient = { save_scope_as = secondary_recipient } scope:actor = { save_scope_as = recipient } scope:secondary_recipient = { save_scope_as = actor } } is_shown = { scope:recipient = { is_independent_ruler = no NOT = { this = scope:actor } liege ?= scope:actor # this excludes tributary contracts by default vassal_contract_has_modifiable_obligations = yes government_has_flag = government_is_nomadic } } is_valid_showing_failures_only = { NOT = { scope:recipient = { is_at_war_with = scope:actor } } } can_send = { trigger_if = { #If you're blocked we don't want to show anything else limit = { scope:recipient = { subject_contract_is_blocked_from_modification = yes } } scope:recipient = { subject_contract_is_blocked_from_modification = no } } trigger_else = { # There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers trigger_if = { limit = { scope:actor = { has_variable = vassal_modify_contract_cooldown } } custom_tooltip = { text = vassal_modify_contract_cooldown_desc scope:actor = { NOT = { has_variable = vassal_modify_contract_cooldown } } } } trigger_else = { custom_tooltip = { text = nomad_contract_request_cooldown_desc scope:actor = { NOT = { has_variable = nomad_contract_request_cooldown } } } } scope:actor = { has_changed_contract_obligation_trigger = yes } scope:recipient = { # Must be an even trade overall custom_description = { text = "vassal_modify_vassal_contract_cannot_increase_obligation_level" object = scope:actor value = count_obligation_improvements_for_vassal_include_hook count_obligation_improvements_for_vassal_include_hook = 0 } # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } } } } auto_accept = yes on_accept = { # Enact changes scope:recipient = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:actor if = { limit = { always = scope:hook } use_hook = scope:actor add_achievement_flag_effect = { FLAG = achievement_fine_print_flag } } # Activate cooldown - To prevent liege from changing it too soon hidden_effect = { set_variable = { name = vassal_modify_contract_cooldown value = yes years = vassal_modify_contract_cooldown_value } } hidden_effect = { set_subject_contract_modification_blocked = yes } every_in_list = { list = changed_obligations save_scope_as = obligation scope:recipient = { vassal_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation } } } } } # If there's a diarch involved, and they called in their change, that gets flagged. diarch_changed_own_contract_effect = yes # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } on_decline = { # Activate cooldown - You may only ask for it to be changed every so often (this mostly exists for MP, since you cannot send it to the AI unless they accept) hidden_effect = { scope:recipient = { set_variable = { name = nomad_contract_request_cooldown value = yes years = vassal_modify_contract_cooldown_value } } } } # Send Options # Hook send_option = { is_valid = { scope:recipient = { has_usable_hook = scope:actor } } flag = hook localization = SCHEME_HOOK } send_option = { is_shown = { scope:recipient = { is_diarch_of_target = scope:actor } } is_valid = { scope:recipient = { trigger_if = { limit = { has_variable_list = diarch_contract_rights_used_list } NOT = { is_target_in_variable_list = { name = diarch_contract_rights_used_list target = scope:actor } } } } } flag = diarch localization = CALL_IN_DIARCH_RIGHTS } should_use_extra_icon = { scope:recipient = { has_usable_hook = scope:actor } } extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds" send_options_exclusive = no } suzerain_modify_tributary_contract_interaction = { special_interaction = liege_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal common_interaction = yes icon = icon_contract_modification_single send_name = "suzerain_modify_tributary_contract_interaction_send" desc = suzerain_modify_tributary_contract_interaction_desc force_notification = yes notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL is_shown = { scope:recipient = { is_tributary_of = scope:actor # excludes vassals by default subject_contract_has_modifiable_obligations = yes NOT = { government_has_flag = government_is_true_herder } } } is_valid_showing_failures_only = { NOT = { scope:recipient = { is_at_war_with = scope:actor } } } can_send = { #Mandala gets special treatment trigger_if = { limit = { scope:actor = { government_has_flag = government_is_mandala } } custom_tooltip = { text = suzerain_modify_subject_contract_mandala_cooldown NOT = { scope:recipient = { var:suzerain_recently_adjusted_mandala_subject_contract ?= scope:actor } } } scope:actor = { has_changed_contract_obligation_trigger = yes # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } # If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook save_temporary_scope_value_as = { name = obligations_favoring_tributary value = scope:recipient.count_obligation_improvements_for_vassal } trigger_if = { limit = { scope:obligations_favoring_tributary > 0 } custom_description = { text = "tributary_modify_vassal_contract_unnecessary_hook_usage_vassal_favor" object = scope:recipient value = scope:obligations_favoring_tributary NOT = { always = scope:hook } } } trigger_else_if = { limit = { scope:obligations_favoring_tributary = 0 } custom_description = { text = "tributary_modify_vassal_contract_unnecessary_hook_usage_equal" object = scope:recipient NOT = { always = scope:hook } } } # You can afford the prestige cost of an unequal contract trigger_else_if = { limit = { scope:obligations_favoring_tributary < 0 NOT = { always = scope:hook } } scope:actor = { piety >= major_piety_value } } trigger_else = {} # Otherwise we're fine! } } trigger_else_if = { #If they're blocked we don't want to show anything else limit = { scope:recipient = { subject_contract_is_blocked_from_modification = yes } } scope:recipient = { subject_contract_is_blocked_from_modification = no } } trigger_else = { scope:actor = { has_changed_contract_obligation_trigger = yes # Cannot change more than three things at once custom_description = { text = "vassal_modify_vassal_contract_obligation_change_limit" value = list_size:changed_obligations list_size:changed_obligations <= max_contract_changes } # If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook save_temporary_scope_value_as = { name = obligations_favoring_tributary value = scope:recipient.count_obligation_improvements_for_vassal } trigger_if = { limit = { scope:obligations_favoring_tributary > 0 } custom_description = { text = "tributary_modify_vassal_contract_unnecessary_hook_usage_vassal_favor" object = scope:recipient value = scope:obligations_favoring_tributary NOT = { always = scope:hook } } } trigger_else_if = { limit = { scope:obligations_favoring_tributary = 0 } custom_description = { text = "tributary_modify_vassal_contract_unnecessary_hook_usage_equal" object = scope:recipient NOT = { always = scope:hook } } } # You can afford the prestige cost of an unequal contract trigger_else_if = { limit = { scope:obligations_favoring_tributary < 0 NOT = { always = scope:hook } } scope:actor = { prestige >= medium_prestige_value } } trigger_else = {} # Otherwise we're fine! } } } auto_accept = yes on_accept = { scope:actor = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:recipient if = { limit = { always = scope:hook } use_hook = scope:recipient add_achievement_flag_effect = { FLAG = achievement_fine_print_flag } } # Prestige and opinion cost of making an unequal contract without a hook if = { limit = { scope:recipient.count_obligation_improvements_for_vassal < 0 NOT = { always = scope:hook } } if = { limit = { government_has_flag = government_is_mandala } add_piety = major_piety_loss } else = { add_prestige = medium_prestige_loss } scope:recipient = { add_opinion = { modifier = outraged_opinion opinion = -30 target = scope:actor } } every_tributary = { limit = { NOT = { this = scope:recipient } } add_opinion = { modifier = outraged_opinion opinion = -10 target = scope:actor } } } scope:recipient = { hidden_effect = { set_subject_contract_modification_blocked = yes } set_variable = { name = suzerain_recently_adjusted_mandala_subject_contract value = scope:actor years = mandala_vassal_obligation_cooldown_years } } every_in_list = { list = changed_obligations save_scope_as = obligation scope:recipient = { tributary_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation } } } } } # Additional Flavor Titles scope:recipient = { additional_flavor_check_effect = yes } } send_option = { is_valid = { scope:actor = { has_usable_hook = scope:recipient } } flag = hook localization = SCHEME_HOOK } should_use_extra_icon = { scope:actor = { has_usable_hook = scope:recipient } } extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds" send_options_exclusive = no } subject_modify_tributary_contract_interaction = { special_interaction = vassal_modify_vassal_contract interface = modify_vassal_contract category = interaction_category_vassal interface_priority = 65 common_interaction = yes icon = icon_contract_modification_single send_name = "subject_modify_tributary_contract_interaction_send" desc = subject_modify_tributary_contract_interaction_desc is_shown = { scope:actor = { is_tributary_of = scope:recipient # excludes vassals by default subject_contract_has_modifiable_obligations = yes } } is_valid_showing_failures_only = { scope:actor = { is_travelling = no } NOT = { scope:recipient = { is_at_war_with = scope:actor } } } can_send = { #Mandala gets special treatment trigger_if = { limit = { scope:recipient = { government_has_flag = government_is_mandala } } custom_tooltip = { text = subject_modify_subject_contract_mandala_cooldown NOT = { scope:actor = { var:subject_recently_adjusted_mandala_subject_contract ?= scope:recipient } } } # You can afford the cost if there is one scope:actor = { has_changed_contract_obligation_trigger = yes trigger_if = { limit = { scope:hook = no } # no cost trigger_if = { limit = { subject_standing < 0 } # this means we don't use subject standing trigger_if = { limit = { government_has_flag = government_is_nomadic scope:recipient = { government_has_flag = government_is_nomadic } } domicile.herd >= domicile.major_herd_value } trigger_else = { gold >= major_gold_value } } trigger_else = { subject_standing > 20 } } } } trigger_else_if = { #If you're blocked we don't want to show anything else (we don't really use this for admin, but we'll keep the logic, just in case) limit = { scope:actor = { subject_contract_is_blocked_from_modification = yes } } scope:actor = { subject_contract_is_blocked_from_modification = no } } trigger_else = { # There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers trigger_if = { limit = { scope:actor = { has_variable = tributary_modify_contract_cooldown } } custom_tooltip = { text = tributary_modify_contract_cooldown_desc scope:actor = { NOT = { has_variable = tributary_modify_contract_cooldown } } } } trigger_else = { custom_tooltip = { text = tributary_modify_contract_cooldown_desc scope:actor = { NOT = { has_variable = tributary_modify_contract_cooldown } } } } # You can afford the cost if there is one scope:actor = { trigger_if = { limit = { scope:hook = no } # no cost trigger_if = { limit = { subject_standing < 0 } # this means we don't use subject standing trigger_if = { limit = { government_has_flag = government_is_nomadic scope:recipient = { government_has_flag = government_is_nomadic } } domicile.herd >= domicile.major_herd_value } trigger_else = { gold >= major_gold_value } } trigger_else = { subject_standing > 20 } } } } } auto_accept = { custom_tooltip = { text = nomad_vassal_force_obligation_change_desc scope:hook = yes } } on_accept = { # Enact changes scope:actor = { send_interface_message = { type = msg_vassal_contract_change title = modify_vassal_contract_interaction_notification right_icon = scope:recipient # If you use a hook - Spend it if = { limit = { always = scope:hook } use_hook = scope:recipient } else = { if = { limit = { subject_standing < 0 } # this means we don't use subject standing if = { limit = { government_has_flag = government_is_nomadic scope:recipient = { government_has_flag = government_is_nomadic } } pay_herd = { target = scope:recipient value = domicile.major_herd_value } } else = { pay_short_term_gold = { target = scope:recipient gold = major_gold_value } } } else = { if = { # the subject tilting the contract in their favor costs Subject Standing limit = { scope:new_value < 0 } add_subject_standing = { value = 10 multiply = scope:new_value } } } } # Activate cooldown - To prevent liege from changing it too soon hidden_effect = { set_variable = { name = tributary_modify_contract_cooldown value = yes years = tributary_modify_contract_cooldown_value } } set_variable = { name = subject_recently_adjusted_mandala_subject_contract value = scope:recipient years = mandala_vassal_obligation_cooldown_years } every_in_list = { list = changed_obligations save_scope_as = obligation scope:actor = { tributary_contract_set_obligation_level = { type = scope:obligation.subject_contract_type level = scope:obligation } } } } } # If there's a diarch involved, and they called in their change, that gets flagged. diarch_changed_own_contract_effect = yes } on_decline = { # Activate cooldown - You may only ask for it to be changed every so often (this mostly exists for MP, since you cannot send it to the AI unless they accept) hidden_effect = { scope:actor = { set_variable = { name = tributary_modify_contract_cooldown value = yes years = tributary_modify_contract_cooldown_value } } } } # Send Options # Hook send_option = { is_valid = { scope:actor = { has_usable_hook = scope:recipient } } flag = hook localization = SCHEME_HOOK } send_option = { is_shown = { scope:actor = { is_diarch_of_target = scope:recipient } } is_valid = { scope:actor = { trigger_if = { limit = { has_variable_list = diarch_contract_rights_used_list } NOT = { is_target_in_variable_list = { name = diarch_contract_rights_used_list target = scope:recipient } } } } } flag = diarch localization = CALL_IN_DIARCH_RIGHTS } should_use_extra_icon = { scope:actor = { has_usable_hook = scope:recipient } } extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds" send_options_exclusive = no ai_accept = { base = -25 # Opinion Factor opinion_modifier = { who = scope:recipient opinion_target = scope:actor multiplier = 1 desc = AI_OPINION_REASON } modifier = { add = { add = scope:new_value multiply = -20 #Overlord favoring options have a negative score if = { # the Chinese Emperor cares less since they get tribute through missions as well limit = { scope:new_value < 0 scope:actor = { OR = { has_subject_contract_group = tributary_celestial has_subject_contract_group = tributary_hegemonic } } } multiply = 0.5 } } desc = AI_CONTRACT_BALANCE } } } ai_only_hegemonic_tributary_modify_tributary_contract_interaction = { category = interaction_category_vassal desc = subject_modify_tributary_contract_interaction_desc auto_accept = yes is_shown = { scope:actor = { is_ai = yes is_available = yes # Let's not have the AI do this when they're away from home etc (like paying tribute) is_tributary_of = scope:recipient # excludes vassals by default OR = { has_subject_contract_group = tributary_celestial has_subject_contract_group = tributary_hegemonic } subject_standing > 40 subject_contract_has_modifiable_obligations = yes does_ai_subject_in_subject_contract_desire_obligation_change = yes NOT = { is_at_war_with = scope:recipient } } } on_accept = { scope:actor = { if = { # if the subject has a Seal of Investiture, they will always ask for an Investiture Privilege if they can limit = { any_character_artifact = { OR = { artifact_type = seal_of_investiture artifact_type = seal_of_investiture_court } } } random_list = { 33 = { trigger = { tributary_contract_obligation_level_can_be_increased = celestial_tributary_investiture_privilege_trade } save_scope_value_as = { name = ask value = flag:trade } } 33 = { trigger = { tributary_contract_obligation_level_can_be_increased = celestial_tributary_investiture_privilege_marriage } save_scope_value_as = { name = ask value = flag:marriage } } 33 = { trigger = { tributary_contract_obligation_level_can_be_increased = celestial_tributary_investiture_privilege_politics } save_scope_value_as = { name = ask value = flag:politics } } } } suzerain = { trigger_event = char_interaction.0252 } } } ai_potential = { always = yes } ai_targets = { ai_recipients = suzerain } ai_frequency_by_tier = { barony = 0 county = 24 duchy = 24 kingdom = 24 empire = 24 hegemony = 0 } ai_will_do = { base = 100 } }