#Interactions relating to tributary relationship management ### Become Tributary - bilateral # actor = offerer / potential tributary # recipient = receiver / potential suzerain become_tributary_interaction = { category = interaction_category_diplomacy common_interaction = no icon = become_tributary_interaction desc = become_tributary_interaction_desc is_shown = { scope:actor = { NOT = { government_has_flag = cannot_be_vassal_or_liege } is_independent_ruler = yes # You have to be independent - This check exists to prevent a lot of edge-cases where you can change liege is_tributary = no highest_held_title_tier >= tier_county trigger_if = { limit = { is_ai = yes } current_military_strength < scope:recipient.one_and_a_half_times_current_military_strength primary_title.tier < scope:recipient.primary_title.tier } } scope:recipient = { is_independent_ruler = yes # while it's possible for tributaries to have their own tributaries, it should not be possible to create a tributary relationship with a non-independent ruler NOT = { this = scope:actor top_suzerain = scope:actor } can_have_tributaries_trigger = yes } } is_valid_showing_failures_only = { scope:actor = { is_physically_able = yes is_travelling = no NOT = { exists = involved_activity } is_confederation_member = no is_at_war = no } } greeting = positive notification_text = BECOME_TRIBUTARY_INTERACTION_NOTIFICATION # Low starting obligations send_option = { flag = low_obligations localization = low_tributary_obligations } # Medium starting obligations send_option = { flag = normal_obligations localization = normal_tributary_obligations starts_enabled = { always = yes } } # High starting obligations send_option = { flag = high_obligations localization = high_tributary_obligations } send_options_exclusive = yes on_accept = { start_tributary_interaction_effect = { TRIBUTARY = scope:actor SUZERAIN = scope:recipient } scope:actor = { trigger_event = char_interaction.0360 } scope:recipient = { if = { limit = { scope:high_obligations = yes } add_opinion = { modifier = tributary_volunteered_opinion target = scope:actor opinion = 20 } } else_if = { limit = { scope:normal_obligations = yes } add_opinion = { modifier = tributary_volunteered_opinion target = scope:actor } } consume_all_criminal_reasons_effect = { LIEGE = scope:recipient CRIMINAL = scope:actor } } } on_decline = { scope:actor = { trigger_event = char_interaction.0361 } } ai_potential = { highest_held_title_tier >= tier_county is_independent_ruler = yes } ai_targets = { ai_recipients = neighboring_rulers_including_tributary_borders } ai_targets = { ai_recipients = neighboring_top_overlords_connected_by_land } ai_frequency = 6 # this might appear fairly frequent but is necessary in order to ensure AI can respond to sudden threats on their borders force_notification = yes ai_will_do = { base = -50 ai_military_threat_modifier_with_cbs = { SENDER = scope:actor RECEIVER = scope:recipient MULTIPLIER = -1 } modifier = { is_obedient_to = scope:recipient add = 40 desc = obedient_interaction_reason } modifier = { # Rivalry modifier. desc = offer_vassalization_interaction_aibehavior_rival_tt trigger = { scope:actor = { has_relation_rival = scope:recipient NOT = { has_relation_nemesis = scope:recipient } } } add = -10 } modifier = { # Nemesis modifier. desc = offer_vassalization_interaction_aibehavior_nemesis_tt trigger = { scope:actor = { has_relation_nemesis = scope:recipient } } add = -30 } modifier = { # Different faith, no pluralism. desc = offer_vassalization_interaction_aibehavior_differentfaith_tt trigger = { scope:actor = { NOR = { # Of two different faiths AND the potential vassal's faith is not pluralistic. faith = scope:recipient.faith faith = { has_doctrine = doctrine_pluralism_pluralistic } } } } add = { value = -25 if = { limit = { scope:actor.faith = { faith_hostility_level = { target = scope:recipient.faith value >= faith_hostile_level } } } add = -10 } if = { limit = { scope:actor.faith = { faith_hostility_level = { target = scope:recipient.faith value >= faith_evil_level } } } add = -25 } } } modifier = { # I am a King! desc = offer_fealty_interaction_aibehavior_amkingtier_tt trigger = { highest_held_title_tier >= tier_kingdom } add = -20 } modifier = { # Cultural Acceptance add = -5 desc = cultural_acceptance_interaction_reason trigger = { scope:actor = { NOT = { has_same_culture_as = scope:recipient } culture = { cultural_acceptance = { target = scope:recipient.culture value < 50 } } } } } modifier = { # Same language add = 5 desc = speaks_same_language_interaction_reason trigger = { scope:actor = { knows_language_of_culture = scope:recipient.culture } } } } ai_min_reply_days = 5 ai_max_reply_days = 10 ai_accept = { base = -50 modifier = { desc = interaction_is_nomadic scope:recipient = { government_has_flag = government_is_nomadic } add = 100 } modifier = { # Wide difference in rank desc = offer_vassalization_interaction_aibehavior_widetitletier_tt trigger = { scope:actor = { tier_difference = { target = scope:recipient value > 1 } } } add = 20 } modifier = { # Distant Realm. desc = offer_vassalization_interaction_aibehavior_distantrealm_tt trigger = { scope:actor = { NOT = { any_neighboring_top_liege_realm_owner = { this = scope:recipient } } } scope:actor.capital_province = { squared_distance = { target = scope:recipient.capital_province value < 200000 } } } add = -15 } modifier = { # Remote Realm. desc = offer_vassalization_interaction_aibehavior_remoterealm_tt trigger = { scope:actor = { NOT = { any_neighboring_top_liege_realm_owner = { this = scope:recipient } } } scope:actor.capital_province = { squared_distance = { target = scope:recipient.capital_province value >= 200000 } } } add = -25 } # MINOR modifier = { # Rivalry modifier. desc = offer_vassalization_interaction_aibehavior_rival_tt trigger = { scope:recipient = { has_relation_rival = scope:actor NOT = { has_relation_nemesis = scope:actor } } } add = -10 } modifier = { # Nemesis modifier. desc = offer_vassalization_interaction_aibehavior_nemesis_tt trigger = { scope:recipient = { has_relation_nemesis = scope:actor } } add = -30 } modifier = { # Same Dynasty modifier. desc = offer_vassalization_interaction_aibehavior_dynasty_tt trigger = { scope:recipient = { dynasty = scope:actor.dynasty } } add = 10 } # PERSONALITY ai_value_modifier = { ai_greed = 0.75 min = 0 } # OPINION INFLUENCE opinion_modifier = { # Compare Opinion modifier. who = scope:recipient opinion_target = scope:actor multiplier = 1 } # CONTRACT OPTIONS modifier = { add = -25 scope:low_obligations = yes desc = CONTRACT_LOW_TAXES_REASON } modifier = { add = 25 scope:high_obligations = yes desc = CONTRACT_HIGH_TAXES_REASON } } } ### Demand Tributary - bilateral # actor = offerer / potential suzerain # recipient = receiver / potential tributary demand_tributary_interaction = { category = interaction_category_diplomacy common_interaction = yes icon = demand_tributary_interaction desc = demand_tributary_interaction_desc is_shown = { scope:actor = { NOT = { this = scope:recipient top_suzerain = scope:recipient.top_suzerain # ensures the actor and recipient is not already in the same "suzerain bloc" } can_get_tributaries_peacefully_trigger = yes trigger_if = { limit = { is_ai = yes } current_military_strength >= scope:recipient.one_and_a_half_times_current_military_strength primary_title.tier >= scope:recipient.primary_title.tier } } scope:recipient = { highest_held_title_tier >= tier_county is_independent_ruler = yes # target cannot be a vassal NOT = { government_has_flag = cannot_be_vassal_or_liege } } # Temujin cannot make Jamukha his subject once he leaves him NOT = { scope:actor = { has_variable = had_mpo_temujin_flavor_0010 var:had_mpo_temujin_flavor_0010 ?= scope:recipient } } } is_valid_showing_failures_only = { scope:actor = { NOT = { has_truce = scope:actor } is_physically_able = yes is_travelling = no NOT = { exists = involved_activity } } scope:recipient = { is_tributary = no is_at_war = no custom_tooltip = { text = demand_tributary_interaction_cooldown_active_tt NOT = { has_opinion_modifier = { modifier = tributary_demanded_opinion target = scope:actor } } } is_confederation_member = no } scope:actor = { custom_tooltip = { text = mpo_interaction_not_neighbouring_tt any_land_neighboring_realm_with_tributaries_owner = { this = scope:recipient } } } } cost = { prestige = minor_prestige_value } greeting = positive notification_text = DEMAND_TRIBUTARY_INTERACTION_NOTIFICATION on_accept = { start_tributary_interaction_effect = { TRIBUTARY = scope:recipient SUZERAIN = scope:actor } scope:actor = { trigger_event = char_interaction.0362 } scope:recipient = { add_opinion = { modifier = tributary_demanded_opinion # this opinion also acts as a built-in cooldown target = scope:actor } } consume_all_criminal_reasons_effect = { LIEGE = scope:actor CRIMINAL = scope:recipient } } on_decline = { scope:actor = { trigger_event = char_interaction.0363 } scope:recipient = { add_opinion = { modifier = tributary_demanded_opinion # this opinion also acts as a built-in cooldown target = scope:actor } custom_tooltip = demand_tributary_interaction_cooldown_tt } } ai_maybe = yes ai_potential = { highest_held_title_tier > 1 # at least a count-level ruler is_independent_ruler = yes } ai_targets = { ai_recipients = neighboring_rulers_including_tributary_borders max = 5 } ai_frequency = 4 force_notification = yes ai_will_do = { # AI will often do this to valid targets that aren't a military threat to them, especially if they're rich base = 0 modifier = { add = { add = scope:recipient.gold divide = 10 max = 100 } desc = accumulated_wealth_reason } ai_military_threat_modifier_with_cbs = { SENDER = scope:actor RECEIVER = scope:recipient MULTIPLIER = -1 } modifier = { scope:recipient = { is_obedient_to = scope:actor } add = 40 desc = obedient_interaction_reason } modifier = { # Generally don't try to tributarize those of higher rank than you trigger = { "scope:recipient.tier_difference(scope:actor)" > 1 } add = -20 } modifier = { # Generally don't try to tributarize those of higher dominance than you trigger = { scope:recipient.dominance_value > scope:actor.dominance_value } add = -30 } modifier = { # Remote Realm. trigger = { scope:actor = { NOT = { any_neighboring_top_liege_realm_owner = { this = scope:recipient } } } scope:actor.capital_province = { squared_distance = { target = scope:recipient.capital_province value >= 200000 } } } add = -25 } modifier = { trigger = { scope:recipient = { government_has_flag = government_is_herder } } add = 1000 } } ai_min_reply_days = 5 ai_max_reply_days = 10 auto_accept = { custom_tooltip = { text = scheme_agent_aptitude.is_herder scope:recipient = { government_has_flag = government_is_herder } } } ai_accept = { base = -60 modifier = { # Perk boost desc = offer_vassalization_true_ruler_perk_tt trigger = { scope:actor = { has_perk = true_ruler_perk } } add = true_ruler_value } #Yurt bonuses modifier = { desc = tributary_yurt_02_domicile_building trigger = { scope:actor.domicile ?= { has_domicile_parameter = nomad_yurt_increased_tributary_acceptance_lvl_1 } } add = 5 } modifier = { desc = tributary_yurt_02_domicile_building trigger = { scope:actor.domicile ?= { has_domicile_parameter = nomad_yurt_increased_tributary_acceptance_lvl_2 } } add = 10 } modifier = { desc = tributary_yurt_02_domicile_building trigger = { scope:actor.domicile ?= { has_domicile_parameter = nomad_yurt_increased_tributary_acceptance_lvl_3 } } add = 15 } modifier = { # the bolder they are, the less likely they will agree to this and vice versa NOT = { ai_boldness = 0 } add = { value = ai_boldness multiply = -1 divide = 2 } desc = TRIBUTARY_BOLDNESS_REASON } modifier = { # the greedier they are, the less likely they will agree to this ai_greed > 0 add = { value = ai_greed multiply = -1 divide = 4 } desc = TRIBUTARY_GREED_REASON } modifier = { is_obedient_to = scope:actor add = 40 desc = obedient_interaction_reason } modifier = { scope:actor = { is_gurkhan = yes } scope:recipient = { government_has_flag = government_is_nomadic } add = 20 desc = gurkhan_interaction_reason } # Easier to make Tributaries during the Zud season modifier = { any_character_situation = { any_situation_sub_region = { has_sub_region_phase_parameter = the_great_steppe_easier_tributaries any_situation_sub_region_participant_group = { participant_group_type = nomad_rulers_capital participant_group_has_character = scope:actor } } } scope:recipient = { government_has_flag = government_is_nomadic } add = 25 desc = zud_season_reason } # if the actor is a major threat to the recipient they're more likely to accept ai_military_threat_modifier_with_cbs = { SENDER = scope:recipient RECEIVER = scope:actor MULTIPLIER = 1 } modifier = { # They are a King desc = demand_tributary_interaction_aibehavior_hightier_tt trigger = { scope:recipient = { highest_held_title_tier = tier_kingdom } } add = -100 } modifier = { # They are an Emperor or greater desc = demand_tributary_interaction_aibehavior_hightier_tt trigger = { scope:recipient = { highest_held_title_tier >= tier_empire } } add = -200 } modifier = { # Recipient has higher Dominance than the actor desc = demand_tributary_interaction_aibehavior_dominance_tt trigger = { scope:recipient.dominance_value > scope:actor.dominance_value } add = -20 } modifier = { # Actor has higher Dominance than the recipient desc = demand_tributary_interaction_aibehavior_dominance_tt trigger = { scope:recipient = { government_has_flag = government_is_nomadic } scope:actor.dominance_value > scope:recipient.dominance_value } add = 20 } # Legitimacy modifier = { desc = "LOW_LEGITIMACY_REASON" scope:actor = { has_legitimacy_flag = very_reduced_tributarization_acceptance } add = -25 } modifier = { desc = "LOW_LEGITIMACY_REASON" scope:actor = { has_legitimacy_flag = reduced_tributarization_acceptance } add = -10 } modifier = { desc = "HIGH_LEGITIMACY_REASON" scope:actor = { has_legitimacy_flag = increased_tributarization_acceptance } add = 10 } modifier = { desc = "HIGH_LEGITIMACY_REASON" scope:actor = { has_legitimacy_flag = very_increased_tributarization_acceptance } add = 25 } # Non-nomadic modifier = { desc = AI_FILTHY_HORSE_LORD_REASON trigger = { scope:actor = { government_has_flag = government_is_nomadic } scope:recipient = { NOT = { government_has_flag = government_is_nomadic } } } add = { value = -50 if = { limit = { scope:recipient = { government_has_flag = government_is_tribal } } multiply = 0.5 } } } # MINOR modifier = { # Rivalry modifier. desc = offer_vassalization_interaction_aibehavior_rival_tt trigger = { scope:recipient = { has_relation_rival = scope:actor NOT = { has_relation_nemesis = scope:actor } } } add = -100 } modifier = { # Nemesis modifier. desc = offer_vassalization_interaction_aibehavior_nemesis_tt trigger = { scope:recipient = { has_relation_nemesis = scope:actor } } add = -200 } modifier = { # Same Dynasty modifier. desc = offer_vassalization_interaction_aibehavior_dynasty_tt trigger = { scope:recipient = { dynasty = scope:actor.dynasty } } add = 10 } modifier = { # Different faith, no pluralism. desc = offer_vassalization_interaction_aibehavior_differentfaith_tt trigger = { scope:actor = { NOT = { # faith condition below doesn't have to apply if both actor and recipient have nomadic_philosophy has_trait = nomadic_philosophy scope:recipient = { has_trait = nomadic_philosophy } } faith = { NOR = { # Of two different faiths AND the potential vassal's faith is not pluralistic this = scope:recipient.faith has_doctrine = doctrine_pluralism_pluralistic } } } } add = { value = -25 if = { limit = { scope:actor.faith = { faith_hostility_level = { target = scope:recipient.faith value >= faith_hostile_level } } } add = -10 } if = { limit = { scope:actor.faith = { faith_hostility_level = { target = scope:recipient.faith value >= faith_evil_level } } } add = -25 } } } modifier = { # Encircled desc = offer_vassalization_interaction_aibehavior_encircled_tt trigger = { scope:recipient = { NOT = { any_neighboring_top_suzerain_realm_owner = { NOT = { this = scope:actor } } } NOT = { any_realm_county = { is_coastal_county = yes } } } } add = 30 } modifier = { # Cultural Acceptance add = -5 desc = cultural_acceptance_interaction_reason trigger = { scope:actor = { NOT = { # cultural condition below doesn't have to apply if both actor and recipient have nomadic_philosophy has_trait = nomadic_philosophy scope:recipient = { has_trait = nomadic_philosophy } } NOT = { has_same_culture_as = scope:recipient } culture = { cultural_acceptance = { target = scope:recipient.culture value < 50 } } } } } modifier = { # Same language add = 5 desc = speaks_same_language_interaction_reason trigger = { scope:actor = { knows_language_of_culture = scope:recipient.culture } } } # OPINION INFLUENCE opinion_modifier = { # Compare Opinion modifier. who = scope:recipient opinion_target = scope:actor multiplier = 1 } #Severed head acceptance modifier = { add = 200 scope:actor = { has_variable = severed_head_vassalization var:severed_head_vassalization = { this = scope:recipient } } } } } ### Cease Paying Tribute - unilateral ### Name referenced in code! Don't change it without an adult present! # actor = tributary # recipient = suzerain cease_paying_tribute_interaction = { category = interaction_category_diplomacy common_interaction = yes use_diplomatic_range = no icon = cease_paying_tributary_interaction desc = cease_paying_tribute_interaction_desc is_shown = { scope:actor = { this != scope:recipient suzerain = scope:recipient subject_can_break_tributary = yes } } is_valid_showing_failures_only = { scope:actor = { is_physically_able = yes is_travelling = no NOT = { exists = involved_activity } trigger_if = { limit = { OR = { any_land_neighboring_realm_with_tributaries_owner = { this = scope:recipient } scope:recipient = { is_landed = no } } } NOT = { has_truce = scope:recipient } } } } cost = { prestige = { value = 0 if = { limit = { scope:actor = { OR = { any_land_neighboring_realm_with_tributaries_owner = { this = scope:recipient } scope:recipient = { is_landed = no } } } } add = minor_prestige_value } } } auto_accept = yes on_accept = { scope:actor = { end_tributary = yes } scope:recipient = { if = { limit = { is_ai = yes } trigger_event = { id = char_interaction.0370 days = 14 # we delay the response from the AI for 2 weeks to make it feel more like a "diplomacy response" } } else = { trigger_event = char_interaction.0370 } add_opinion = { modifier = tributary_ceased_payments_opinion target = scope:actor } } } ai_potential = { is_at_war = no is_migrating = no suzerain ?= { is_migrating = no OR = { is_landed = no NOT = { # disconnected tributaries can always do this, even herders any_land_neighboring_realm_with_tributaries_owner = { this = root } } AND = { NOT = { root = { government_has_flag = government_is_herder } } trigger_if = { # Obedience is a hard blocker, but only if suzerain is landed limit = { is_landed = yes } root = { is_obedient = no } } } } } } ai_targets = { ai_recipients = suzerain } ai_frequency = 12 # this must be 12 (1 year) in order to ensure the integrity of the UI-visualized chance the tributary will break the contract # visualized in the UI as the annual chance the tributary will break the contract, based on a percentage chance per year ai_will_do = { base = -25 modifier = { add = { add = obedience_value subtract = obedience_threshold multiply = -1 max = obedience_threshold min = { value = obedience_threshold multiply = -1 } } desc = obedience_value_reason } modifier = { scope:recipient = { has_variable = temp_tributary_protection } add = -150 desc = temp_tributary_protection_reason } modifier = { dominance_value > suzerain.dominance_value add = 30 desc = cease_tribute_higher_dominance_reason } modifier = { suzerain = { any_memory = { has_memory_type = nomad_showed_weakness_in_war memory_age_years < 5 } } add = 30 desc = cease_tribute_showed_weakness_in_war_reason } modifier = { any_memory = { has_memory_type = suzerain_defended_me_in_war has_memory_participant = root.suzerain memory_age_years < 10 } add = -100 desc = cease_tribute_defended_me_in_war_reason } modifier = { suzerain = { any_memory = { has_memory_type = had_chaotic_kurultai_succession memory_age_years < 5 } } add = 30 desc = cease_tribute_had_chaotic_kurultai_succession_reason } # if the actor is sufficiently scared of the recipient they're way less likely to do this ai_military_threat_modifier = { SENDER = scope:actor RECEIVER = scope:recipient MULTIPLIER = -2.5 } modifier = { scope:actor = { is_migrating = no } scope:recipient = { NOT = { any_land_neighboring_realm_with_tributaries_owner = { this = scope:actor } } } add = 1000 desc = cease_tribute_disconnected_suzerain } modifier = { scope:recipient = { is_landed = no is_migrating = no is_at_war = no } add = 10000 desc = cease_tribute_landless_suzerain } } } ### Release Tributary - unilateral # actor = suzerain # recipient = tributary release_tributary_interaction = { category = interaction_category_diplomacy common_interaction = no icon = release_tributary_interaction desc = release_tributary_interaction_desc is_shown = { scope:recipient = { this != scope:actor suzerain = scope:actor OR = { # AI should only ever consider releasing unruly subjects scope:actor = { is_ai = no } NOT = { is_obedient_to = scope:actor } } } } is_valid_showing_failures_only = {} cost = { prestige = minor_prestige_value } auto_accept = yes on_accept = { add_truce_one_way = { character = scope:recipient years = 5 name = TRUCE_TRIBUTARY_RELEASED } scope:recipient = { end_tributary = yes save_scope_as = tributary_loc scope:actor = { save_scope_as = suzerain_loc } add_truce_both_ways = { character = scope:actor years = 5 name = TRUCE_TRIBUTARY_STOPPED } add_opinion = { target = scope:actor modifier = tributary_released_opinion opinion = 25 } trigger_event = char_interaction.0380 } scope:actor = { #TODO_CD_MPO some sort of message here } } } ### Release as Tributary - unilateral # actor = suzerain # recipient = tributary release_as_tributary_interaction = { category = interaction_category_vassal common_interaction = no icon = release_as_tributary interface_priority = 4 desc = release_as_tributary_interaction_desc is_shown = { scope:actor = { government_has_flag = government_is_nomadic } scope:recipient = { is_vassal_of = scope:actor } } is_valid_showing_failures_only = { scope:actor = { is_independent_ruler = yes is_at_war = no } } auto_accept = yes on_accept = { scope:actor = { hidden_effect = { send_interface_toast = { type = event_toast_effect_neutral title = release_as_tributary_interaction_toast left_icon = scope:actor right_icon = scope:recipient custom_tooltip = release_as_tributary_interaction_toast_desc } } } scope:recipient = { add_opinion = { target = scope:actor modifier = granted_independence_opinion opinion = 10 } create_title_and_vassal_change = { type = independency save_scope_as = change add_claim_on_loss = yes } becomes_independent = { change = scope:change } resolve_title_and_vassal_change = scope:change } start_tributary_interaction_effect = { SUZERAIN = scope:actor TRIBUTARY = scope:recipient } } ai_potential = { government_has_flag = government_is_nomadic this = top_liege vassal_count > vassal_limit } ai_targets = { ai_recipients = vassals } ai_frequency = 12 ai_will_do = { base = 0 modifier = { scope:recipient = { # Only on your borders any_held_title = { tier = tier_county any_neighboring_county = { OR = { is_coastal_county = yes holder.top_liege != scope:recipient.top_liege } } } } add = 100 } } } # Offer Courtier offer_courtier_interaction = { category = interaction_category_diplomacy common_interaction = no icon = courtier_interaction interface_priority = 40 desc = offer_courtier_interaction_desc ai_targets = { ai_recipients = suzerain ai_recipients = liege ai_recipients = scripted_relations max = 5 } ai_target_quick_trigger = { adult = yes } ai_frequency = 36 greeting = positive notification_text = OFFER_COURTIER_NOTIFICATION needs_recipient_to_open = yes populate_actor_list = { scope:actor = { every_courtier = { limit = { is_available_healthy_ai_adult = yes NOR = { is_consort_of = scope:actor is_heir_of = scope:actor AND = { is_female = yes patrilinear_marriage = yes } AND = { is_male = yes matrilinear_marriage = yes } is_diarch = yes is_designated_diarch = yes has_character_flag = has_been_offered_as_concubine } } add_to_list = characters } } } is_shown = { scope:actor != scope:recipient scope:recipient = { is_ruler = yes NOT = { government_has_flag = government_is_herder } } } is_valid_showing_failures_only = { custom_tooltip = { text = offer_courtier_valid_courtier_tt scope:actor = { any_courtier = { is_available_healthy_ai_adult = yes NOR = { is_consort_of = scope:actor is_heir_of = scope:actor AND = { is_female = yes patrilinear_marriage = yes } AND = { is_male = yes matrilinear_marriage = yes } } } } } } can_be_picked = { is_adult = yes } can_send = { custom_tooltip = { text = no_heirs_can_be_sent_tt scope:secondary_actor = { NOT = { is_heir_of = scope:actor } } } custom_tooltip = { text = no_spouses_can_be_sent_tt scope:secondary_actor = { NOT = { is_consort_of = scope:actor } } } } auto_accept = no ai_accept = { base = -10 modifier = { add = 100 scope:secondary_actor = { OR = { sum_of_all_skills_value >= sum_of_all_skills_threshold_good martial >= monumentally_high_skill_rating prowess >= extremely_high_skill_rating AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_chancellor ?= { diplomacy < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_steward ?= { stewardship < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_spymaster ?= { intrigue < monumentally_high_skill_rating } } has_relation_lover = scope:recipient # Shhh, don't tell anyone, of course you're 'skilled'! trigger_if = { limit = { scope:recipient = { government_has_flag = government_is_nomadic } } OR = { AND = { sum_of_all_skills_value >= sum_of_all_skills_threshold_average scope:recipient = { any_courtier = { count < 10 } } } aptitude:master_of_hunt_court_position >= 4 aptitude:keeper_of_the_horses_court_position >= 4 aptitude:boyan_court_position >= 4 aptitude:siege_engineer_court_position >= 4 aptitude:yurtchi_court_position >= 4 aptitude:cherbi_court_position >= 4 aptitude:yeke_jarquchi_court_position >= 4 aptitude:foreign_emissary_court_position >= 4 } } } } desc = AI_INTERESTING_COURTIER_REASON } modifier = { add = 100 scope:secondary_actor.prowess >= decent_skill_rating scope:recipient.number_of_knights < scope:recipient.max_number_of_knights desc = AI_KNIGHT_REASON } modifier = { add = 100 exists = scope:secondary_actor.inspiration desc = AI_INSPIRED_REASON } modifier = { add = 100 scope:secondary_actor = { is_close_or_extended_family_of = scope:recipient } desc = AI_FAMILY_REASON } modifier = { add = 100 scope:secondary_actor = { is_consort_of = scope:recipient } desc = AI_SPOUSE_REASON } modifier = { add = 100 scope:secondary_actor = { has_relation_friend = scope:recipient } desc = AI_FRIEND_REASON } modifier = { add = -200 scope:secondary_actor = { has_relation_rival = scope:recipient } desc = AI_RIVAL_REASON } modifier = { add = 100 scope:recipient = { any_courtier = { is_consort_of = scope:secondary_actor } } desc = AI_SPOUSE_OF_COURTIER_REASON } modifier = { add = 100 scope:recipient = { any_courtier = { count < 5 } } desc = AI_LACK_COURTIERS_REASON } } ai_potential = { OR = { ai_greed <= 25 is_obedient = yes } OR = { is_tributary = yes num_of_relation_friend > 0 num_of_relation_lover > 0 } } ai_will_do = { base = 0 modifier = { add = 100 scope:recipient = { OR = { has_relation_friend = scope:actor has_relation_lover = scope:actor } } } modifier = { add = 100 scope:recipient = { is_tributary_of = scope:actor OR = { ai_greed <= -50 is_obedient_to = scope:actor opinion = { target = scope:actor value >= 50 } } } } modifier = { factor = 0 scope:secondary_actor = { OR = { has_relation_friend = scope:actor has_relation_lover = scope:actor } } } modifier = { factor = 0 scope:actor = { NOR = { government_has_flag = government_is_nomadic government_has_flag = government_is_herder } } scope:secondary_actor = { is_close_or_extended_family_of = scope:actor } } modifier = { # The AI only offers really good characters factor = 0 scope:secondary_actor = { NOR = { sum_of_all_skills_value >= sum_of_all_skills_threshold_good martial >= monumentally_high_skill_rating prowess >= extremely_high_skill_rating exists = inspiration AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_chancellor ?= { diplomacy < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_steward ?= { stewardship < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_spymaster ?= { intrigue < monumentally_high_skill_rating } } trigger_if = { limit = { scope:recipient = { government_has_flag = government_is_nomadic } } OR = { AND = { sum_of_all_skills_value >= sum_of_all_skills_threshold_average scope:recipient = { any_courtier = { count < 10 } } } aptitude:master_of_hunt_court_position >= 4 aptitude:keeper_of_the_horses_court_position >= 4 aptitude:boyan_court_position >= 4 aptitude:siege_engineer_court_position >= 4 aptitude:yurtchi_court_position >= 4 aptitude:cherbi_court_position >= 4 aptitude:yeke_jarquchi_court_position >= 4 aptitude:foreign_emissary_court_position >= 4 } } } } } } on_send = { scope:secondary_actor = { # to block the same character from being offered twice add_character_flag = { flag = has_been_offered_as_concubine days = 5 } } } on_accept = { scope:secondary_actor = { add_opinion = { target = scope:recipient modifier = piqued_opinion opinion = 10 } } scope:recipient = { add_courtier = scope:secondary_actor scope:secondary_actor = { every_consort = { limit = { is_courtier_of = scope:actor } scope:recipient = { add_courtier = prev } } every_child = { limit = { is_adult = no is_courtier_of = scope:recipient } scope:actor = { add_courtier = prev } } } add_opinion = { target = scope:actor modifier = grateful_opinion opinion = 10 } } } on_decline = { scope:actor = { send_interface_toast = { type = event_toast_effect_bad title = msg_courtier_offer_rejected_title right_icon = scope:recipient left_icon = scope:secondary_actor custom_tooltip = msg_courtier_offer_rejected } } } } # Demand Courtier demand_courtier_interaction = { category = interaction_category_vassal common_interaction = yes icon = request_courtier_interaction interface_priority = 45 desc = demand_courtier_interaction_desc ai_targets = { ai_recipients = tributaries ai_recipients = vassals } ai_target_quick_trigger = { adult = yes } ai_frequency = 12 cooldown_against_recipient = { years = 3 } greeting = positive notification_text = DEMAND_COURTIER_NOTIFICATION highlighted_reason = HIGHLIGHTED_SKILLED_COURTIER is_highlighted = { scope:recipient = { any_courtier = { is_available_healthy_ai_adult = yes NOR = { is_consort_of = scope:recipient is_heir_of = scope:recipient AND = { is_female = yes patrilinear_marriage = yes } AND = { is_male = yes matrilinear_marriage = yes } is_diarch = yes is_designated_diarch = yes has_character_flag = has_been_offered_as_concubine } OR = { sum_of_all_skills_value >= sum_of_all_skills_threshold_good martial >= monumentally_high_skill_rating prowess >= extremely_high_skill_rating AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_chancellor ?= { diplomacy < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_steward ?= { stewardship < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_spymaster ?= { intrigue < monumentally_high_skill_rating } } trigger_if = { limit = { scope:actor = { government_has_flag = government_is_nomadic } } OR = { aptitude:master_of_hunt_court_position >= 4 aptitude:keeper_of_the_horses_court_position >= 4 aptitude:boyan_court_position >= 4 aptitude:siege_engineer_court_position >= 4 aptitude:yurtchi_court_position >= 4 aptitude:cherbi_court_position >= 4 aptitude:yeke_jarquchi_court_position >= 4 aptitude:foreign_emissary_court_position >= 4 } } } } } } needs_recipient_to_open = yes populate_actor_list = { scope:recipient = { every_courtier = { limit = { is_available_healthy_ai_adult = yes NOR = { is_consort_of = scope:recipient is_heir_of = scope:recipient AND = { is_female = yes patrilinear_marriage = yes } AND = { is_male = yes matrilinear_marriage = yes } is_diarch = yes is_designated_diarch = yes has_character_flag = has_been_offered_as_concubine } } add_to_list = characters } } } is_shown = { scope:actor != scope:recipient scope:recipient = { OR = { trigger_if = { limit = { scope:actor = { government_has_flag = government_is_nomadic } } is_vassal_of = scope:actor } is_tributary_of = scope:actor } } } is_valid_showing_failures_only = { custom_tooltip = { text = demand_courtier_valid_courtier_tt scope:recipient = { any_courtier = { is_available_healthy_ai_adult = yes NOR = { is_consort_of = scope:recipient is_heir_of = scope:recipient AND = { is_female = yes patrilinear_marriage = yes } AND = { is_male = yes matrilinear_marriage = yes } } } } } } can_be_picked = { is_adult = yes } can_send = { } auto_accept = no ai_accept = { base = 0 modifier = { add = 1000 scope:recipient = { is_obedient_to = scope:actor } desc = AI_OBEDIENT_REASON } modifier = { add = 25 scope:recipient = { has_dread_level_towards = { target = scope:actor level = 1 } } desc = INTIMIDATED_REASON } modifier = { add = 50 scope:recipient = { has_dread_level_towards = { target = scope:actor level = 2 } } desc = COWED_REASON } opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 1.0 desc = AI_OPINION_REASON } modifier = { add = -25 scope:secondary_actor = { OR = { is_councillor = yes has_any_court_position = yes } } desc = AI_EMPLOYED_COURTIER_REASON } modifier = { add = -15 scope:secondary_actor = { is_knight = yes } desc = AI_IS_KNIGHT_REASON } modifier = { add = -50 exists = scope:secondary_actor.inspiration desc = AI_INSPIRED_REASON } modifier = { add = -25 scope:secondary_actor = { is_close_or_extended_family_of = scope:recipient } desc = AI_FAMILY_REASON } modifier = { add = -50 scope:secondary_actor = { has_relation_friend = scope:recipient } desc = AI_FRIEND_REASON } modifier = { add = 1000 scope:secondary_actor = { has_relation_rival = scope:recipient } desc = AI_RIVAL_REASON } } ai_potential = { ai_greed >= 0 any_tributary = { } } ai_will_do = { base = 0 modifier = { add = 100 scope:secondary_actor = { OR = { has_relation_friend = scope:actor has_relation_lover = scope:actor sum_of_all_skills_value >= sum_of_all_skills_threshold_good martial >= monumentally_high_skill_rating prowess >= extremely_high_skill_rating exists = inspiration AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_chancellor ?= { diplomacy < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_steward ?= { stewardship < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_spymaster ?= { intrigue < monumentally_high_skill_rating } } trigger_if = { limit = { scope:actor = { government_has_flag = government_is_nomadic } } OR = { AND = { sum_of_all_skills_value >= sum_of_all_skills_threshold_average scope:actor = { any_courtier = { count < 10 } } } aptitude:master_of_hunt_court_position >= 4 aptitude:keeper_of_the_horses_court_position >= 4 aptitude:boyan_court_position >= 4 aptitude:siege_engineer_court_position >= 4 aptitude:yurtchi_court_position >= 4 aptitude:cherbi_court_position >= 4 aptitude:yeke_jarquchi_court_position >= 4 aptitude:foreign_emissary_court_position >= 4 } } } } } modifier = { factor = 0 scope:recipient = { OR = { has_relation_friend = scope:actor has_relation_lover = scope:actor } } } } on_send = { scope:secondary_actor = { # to block the same character from being offered twice add_character_flag = { flag = has_been_offered_as_concubine days = 5 } } } on_accept = { scope:secondary_actor = { add_opinion = { target = scope:recipient modifier = annoyed_opinion opinion = -10 } } scope:actor = { add_courtier = scope:secondary_actor scope:secondary_actor = { every_consort = { limit = { is_courtier_of = scope:recipient } scope:actor = { add_courtier = prev } } every_child = { limit = { is_adult = no is_courtier_of = scope:recipient } scope:actor = { add_courtier = prev } } } add_opinion = { target = scope:recipient modifier = pleased_opinion opinion = 20 } } scope:recipient = { add_opinion = { target = scope:actor modifier = upset_opinion opinion = -15 } } } on_decline = { scope:actor = { send_interface_toast = { type = event_toast_effect_bad title = msg_courtier_demand_rejected_title right_icon = scope:recipient left_icon = scope:secondary_actor custom_tooltip = msg_courtier_demand_rejected } } scope:actor = { add_opinion = { target = scope:recipient modifier = upset_opinion opinion = -15 } } } } # Demand Concubine demand_concubine_interaction = { category = interaction_category_vassal common_interaction = yes icon = request_concubine_interaction interface_priority = 44 desc = demand_concubine_interaction_desc ai_targets = { ai_recipients = tributaries ai_recipients = vassals } ai_target_quick_trigger = { adult = yes } ai_frequency = 12 cooldown_against_recipient = { years = 3 } greeting = positive notification_text = DEMAND_CONCUBINE_NOTIFICATION needs_recipient_to_open = yes populate_actor_list = { scope:recipient = { every_courtier = { limit = { is_physically_able_adult = yes is_ruler = no could_marry_character_trigger = { CHARACTER = scope:actor } } add_to_list = characters } } } is_shown = { scope:actor != scope:recipient scope:actor = { allowed_concubines = yes } scope:recipient = { OR = { trigger_if = { limit = { scope:actor = { government_has_flag = government_is_nomadic } } is_vassal_of = scope:actor } is_tributary_of = scope:actor } } } is_valid_showing_failures_only = { scope:actor = { allowed_more_concubines = yes is_physically_able_adult = yes } custom_tooltip = { text = must_have_valid_concubine_tt scope:recipient = { any_courtier = { is_physically_able_adult = yes is_ruler = no could_marry_character_trigger = { CHARACTER = scope:actor } } } } } can_be_picked = { is_adult = yes } can_send = { } auto_accept = no ai_accept = { base = 0 modifier = { add = 1000 scope:recipient = { is_obedient_to = scope:actor } desc = AI_OBEDIENT_REASON } modifier = { add = 25 scope:recipient = { has_dread_level_towards = { target = scope:actor level = 1 } } desc = INTIMIDATED_REASON } modifier = { add = 50 scope:recipient = { has_dread_level_towards = { target = scope:actor level = 2 } } desc = COWED_REASON } opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 1.0 desc = AI_OPINION_REASON } modifier = { add = -25 scope:secondary_actor = { OR = { is_councillor = yes has_any_court_position = yes } } desc = AI_EMPLOYED_COURTIER_REASON } modifier = { add = -15 scope:secondary_actor = { is_knight = yes } desc = AI_IS_KNIGHT_REASON } modifier = { add = -50 exists = scope:secondary_actor.inspiration desc = AI_INSPIRED_REASON } modifier = { add = -25 scope:secondary_actor = { is_close_or_extended_family_of = scope:recipient } desc = AI_FAMILY_REASON } modifier = { add = -50 scope:secondary_actor = { has_relation_friend = scope:recipient } desc = AI_FRIEND_REASON } modifier = { add = -50 scope:secondary_actor = { is_consort_of = scope:recipient } desc = AI_SPOUSE_REASON } modifier = { add = -50 scope:secondary_actor = { is_child_of = scope:recipient } desc = AI_CHILD_REASON } modifier = { add = 1000 scope:secondary_actor = { has_relation_rival = scope:recipient } desc = AI_RIVAL_REASON } } ai_potential = { OR = { has_trait = lustful ai_honor <= 0 } any_tributary = { } } ai_will_do = { base = 0 modifier = { add = 100 scope:secondary_actor = { OR = { has_relation_friend = scope:actor has_relation_lover = scope:actor sum_of_all_skills_value >= sum_of_all_skills_threshold_good martial >= monumentally_high_skill_rating prowess >= extremely_high_skill_rating exists = inspiration AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_chancellor ?= { diplomacy < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_steward ?= { stewardship < monumentally_high_skill_rating } } AND = { diplomacy >= monumentally_high_skill_rating scope:actor.cp:councillor_spymaster ?= { intrigue < monumentally_high_skill_rating } } has_conventionally_attractive_trigger = yes num_of_good_genetic_traits > 1 } } } modifier = { factor = 0 scope:recipient = { OR = { has_relation_friend = scope:actor has_relation_lover = scope:actor } } } modifier = { factor = 0 scope:secondary_actor = { OR = { has_conventionally_ugly_trigger = yes age >= 30 is_visibly_fertile = no } } } } on_send = { scope:secondary_actor = { # to block the same character from being offered twice add_character_flag = { flag = has_been_offered_as_concubine days = 5 } } } on_accept = { scope:recipient = { if = { limit = { scope:secondary_actor = { NOR = { is_consort_of = scope:recipient is_close_or_extended_family_of = scope:recipient } } } add_opinion = { target = scope:actor modifier = upset_opinion opinion = -15 } } else = { scope:secondary_actor = { save_scope_as = relationship_reason_involved_character } progress_towards_rival_effect = { REASON = rival_demanded_concubine CHARACTER = scope:actor OPINION = 0 } add_opinion = { target = scope:actor modifier = upset_opinion opinion = -50 } clear_saved_scope = secondary_actor } } demand_concubine_interaction_on_accept_effect = yes } on_decline = { scope:actor = { send_interface_toast = { type = event_toast_effect_bad title = msg_concubine_demand_rejected_title right_icon = scope:recipient left_icon = scope:secondary_actor custom_tooltip = msg_courtier_demand_rejected } } scope:actor = { add_opinion = { target = scope:recipient modifier = upset_opinion opinion = -15 } } } }