#Interactions relating to hostages ### Offer hostage - unilateral # actor = offerer # recipient = receiver # secondary_actor = hostage offer_hostage_interaction = { category = interaction_category_diplomacy common_interaction = no interface_priority = 11 ai_min_reply_days = 4 ai_max_reply_days = 9 popup_on_receive = yes pause_on_receive = yes icon = icon_hostage populate_actor_list = { scope:actor = { every_close_family_member = { limit = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor } } add_to_list = characters } } } desc = offer_hostage_interaction_desc prompt = OFFER_HOSTAGE_SELECT_HOSTAGE_TO_TRANSFER notification_text = OFFER_HOSTAGE_PROPOSAL cooldown_against_recipient = { years = 3 } is_shown = { scope:recipient != scope:actor # Cannot exchange hostages with a herder # Only significant rulers use hostages scope:recipient.highest_held_title_tier > tier_barony # Laamps can't do anything with hostages but return/recall them. scope:recipient = { NOR = { government_has_flag = government_is_landless_adventurer government_has_flag = government_is_true_herder } } #Inside a merit realm vassals won't offer hostages except to your top liege. trigger_if = { limit = { scope:actor.top_liege = { government_has_flag = government_has_merit } scope:actor.top_liege != scope:actor scope:recipient != scope:actor.top_liege } NAND = { scope:actor = { government_has_flag = government_has_merit } scope:recipient = { government_has_flag = government_has_merit } } } } is_valid_showing_failures_only = { NOR = { # Must be at peace scope:recipient = { is_at_war_with = scope:actor } # Allies don't need hostages scope:recipient = { is_allied_to = scope:actor } # Only family oriented governments use hostages scope:actor = { government_has_flag = government_is_theocracy } scope:recipient = { government_has_flag = government_is_theocracy } # 1 hostage per home court custom_tooltip = { text = "already_has_your_hostage_tt" scope:recipient = { any_warden_hostage = { home_court ?= scope:actor } } } custom_description = { text = hostage_already_travelling_tt subject = scope:actor object = scope:recipient scope:actor = { any_close_family_member = { exists = var:hostage_travelling_to_warden var:hostage_travelling_to_warden = scope:recipient } } } } scope:actor = { OR = { is_landless_ruler = no is_landless_administrative = yes } } scope:recipient = { OR = { is_landless_ruler = no is_landless_administrative = yes } } # Stop AI spamming hostage offers trigger_if = { limit = { scope:actor = { is_ai = yes } exists = scope:secondary_actor } NOT = { scope:secondary_actor = { has_character_flag = ai_should_not_offer_hostage } } } # Tooltip for players in case of no valid hostages to offer trigger_else = { scope:actor = { custom_description = { text = "basic_valid_hostage_to_offer" object = scope:recipient any_close_family_member = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor } } } } } # Hostages still valid trigger_if = { limit = { exists = scope:secondary_actor exists = scope:actor } scope:secondary_actor = { bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor } } } tgp_blocked_action_against_tenno_trigger = { ACTOR = scope:actor TARGET = scope:recipient } } can_be_picked = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor } # Under offer custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { has_character_flag = under_offer_as_hostage_flag } } # Already offered custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { exists = var:hostage_travelling_to_warden } } } can_send = { scope:actor = { # AI only offer to more powerful neighbors trigger_if = { limit = { is_ai = yes } bp2_valid_to_offer_hostage_ai_trigger = yes # AI should not offer close family of players without their consent NOR = { scope:secondary_actor = { any_close_family_member = { is_ai = no OR = { is_parent_of = scope:secondary_actor is_grandparent_of = scope:secondary_actor } this != scope:actor } } # A hostage died on their watch var:hostage_died ?= scope:recipient } } } scope:recipient = { trigger_if = { limit = { is_ai = no } NOT = { scope:secondary_actor = { has_character_flag = ai_should_not_offer_hostage } } } } # Adult hostages must be loyal enough to go along with it scope:secondary_actor = { trigger_if = { limit = { is_adult = yes } OR = { AND = { custom_tooltip = { text = hostage_opinion_too_low_tt opinion = { target = scope:actor value >= -25 } } NOT = { has_trait = disloyal } } has_trait = loyal } } # Under offer custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { has_character_flag = under_offer_as_hostage_flag } } } } cost = {} on_send = { scope:secondary_actor = { add_character_flag = { flag = under_offer_as_hostage_flag months = 1 } } if = { limit = { scope:recipient = { is_ai = no } } hidden_effect = { scope:secondary_actor = { add_character_flag = { flag = ai_should_not_offer_hostage years = 3 } } } } } on_accept = { # Save scopes for clarity scope:actor = { save_scope_as = hostage_sender } scope:secondary_actor = { save_scope_as = hostage } scope:recipient = { save_scope_as = hostage_taker } custom_description_no_bullet = { text = hostage_pacts_on_arrival_tt } custom_description_no_bullet = { text = hostage_execution_warning_tt } custom_description_no_bullet = { text = hostage_attack_warning_tt } hostage_depart_effect = { HOSTAGE = scope:hostage WARDEN = scope:hostage_taker HOME_COURT = scope:hostage_sender } scope:actor = { trigger_event = char_interaction.0330 } # If we're of the same clan this interaction affects unity if = { limit = { scope:actor = { government_has_flag = government_is_clan } scope:actor.house = scope:recipient.house } add_clan_unity_interaction_effect = { CHARACTER = scope:actor TARGET = scope:recipient VALUE = medium_unity_loss DESC = clan_unity_hostage.desc REVERSE_NON_HOUSE_TARGET = no } } } on_decline = { scope:actor = { trigger_event = char_interaction.0300 } scope:secondary_actor = { remove_character_flag = under_offer_as_hostage_flag } } auto_accept = { trigger_if = { limit = { scope:hook ?= yes scope:actor = { has_strong_hook = scope:recipient } } custom_description = { text = "spending_hook" subject = scope:actor object = scope:recipient scope:hook ?= yes scope:actor = { has_strong_hook = scope:recipient } } } trigger_else = { always = no } } can_be_blocked = { custom_description = { #Hook from Recipient can counteract, but only if Actor is not forcing the action via Strong Hook. text = "spending_hook" subject = scope:recipient object = scope:actor scope:recipient = { has_hook = scope:actor } NAND = { scope:hook = yes scope:actor = { has_strong_hook = scope:recipient } } } } on_blocked_effect = { scope:recipient = { remove_hook = { target = scope:actor } } } #Use hook 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 # AI ai_accept = { base = 0 # Try to make it 0 for most interactions ######### PERSONALITY bp2_hostage_offer_personality_modifier = yes ######### OPINION opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } ######### RELATIONS bp2_hostage_relation_modifier = yes ######### DREAD bp2_hostage_dread_modifier = yes ######### HOSTAGE IMPORTANCE # Hostages modifier = { exists = scope:secondary_actor add = interaction_actor_hostage_value desc = HOSTAGE_VALUE_ACTOR_REASON } ######### RELATIVE POWER bp2_hostage_tier_neighbor_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_claims_casus_bellis_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_vassals_lieges_modifier = { # Political situation SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_relative_strength_modifier = { # Relative military strength SENDER = scope:actor RECEIVER = scope:recipient } ######### CULTURAL DIFFERENCES bp2_hostage_culture_faith_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } ######### CULTURAL TRADITIONS modifier = { scope:recipient.culture = { has_cultural_tradition = tradition_equitable } add = 25 desc = HOSTAGE_EQUITABLE_TRADITION_REASON } modifier = { scope:recipient.culture = { has_cultural_tradition = tradition_esteemed_hospitality } add = 25 desc = HOSTAGE_ESTEEMED_HOSPITALITY_TRADITION_REASON } modifier = { scope:recipient = { is_vassal_of = scope:actor culture = { has_cultural_tradition = tradition_loyal_soldiers } } add = 25 desc = HOSTAGE_LOYAL_SUBJECTS_TRADITION_REASON } ######### OTHER modifier = { # Already have a truce scope:recipient ?= { has_truce = scope:actor } desc = HOSTAGE_RECIPIENT_EXISTING_TRUCE_REASON add = -20 } modifier = { # Already fighting a war scope:recipient ?= { is_at_war = yes } desc = HOSTAGE_AT_WAR_REASON add = 15 } modifier = { # Already have their hostage scope:actor = { any_warden_hostage = { home_court ?= scope:recipient } } desc = HOSTAGE_ALREADY_DEMANDED_REASON add = 50 } modifier = { add = -50 scope:actor = { has_character_modifier = attacked_warden } desc = attacked_warden } modifier = { # Conqueror scope:recipient ?= { has_variable = conqueror } desc = NO_FRIVOLOUS_ACTIVITIES_REASON add = -1000 } } ai_targets = { ai_recipients = neighboring_rulers ai_recipients = peer_vassals ai_recipients = vassals max = 10 } ai_targets = { ai_recipients = liege } ai_frequency_by_tier = { barony = 0 county = 120 duchy = 120 kingdom = 360 empire = 0 hegemony = 0 } is_available = { trigger_if = { limit = { is_ai = yes } NOT = { has_variable = conqueror } } NOT = { government_has_flag = government_is_landless_adventurer } } ai_will_do = { base = 0 opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } opinion_modifier = { # Opinion Factor who = scope:actor opinion_target = scope:secondary_actor multiplier = -0.1 desc = AI_OPINION_REASON } bp2_hostage_tier_neighbor_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_claims_casus_bellis_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_vassals_lieges_modifier = { # Political situation SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_relative_strength_modifier = { # Relative military strength SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_culture_faith_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } modifier = { # The AI will only use a Hook if they couldn't otherwise do this scope:hook = yes add = -1 } modifier = { # Attacked a hostage's home court add = -50 scope:recipient = { has_character_modifier = attacked_home_court } desc = attacked_home_court } modifier = { # Hostage died on their watch exists = scope:actor.var:hostage_died scope:recipient = { NOR = { var:let_my_hostage_die ?= scope:actor has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_REASON add = -25 } modifier = { # MY Hostage died on their watch scope:recipient = { var:let_my_hostage_die ?= scope:actor NOT = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_HOME_COURT_REASON add = -100 } modifier = { # Killed my hostage!!! scope:recipient = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } desc = HOSTAGE_KILLED_REASON add = -200 } modifier = { # Not neighboring NOR = { scope:recipient = { character_is_land_realm_neighbor = scope:actor top_liege = scope:actor.top_liege } } add = -50 } modifier = { scope:recipient = { has_character_flag = halved_hostage_prestige_income } desc = HOSTAGE_RETAINED_ADULTHOOD_REASON add = -25 } # Cultural traditions modifier = { scope:actor.culture = { has_cultural_tradition = tradition_equitable } add = 25 } modifier = { scope:actor.culture = { has_cultural_tradition = tradition_esteemed_hospitality } add = 25 } modifier = { scope:actor = { is_vassal_of = scope:recipient culture = { has_cultural_tradition = tradition_loyal_soldiers } } add = 25 desc = HOSTAGE_CULTURAL_TRADITION_REASON } } } ### Demand hostage - unilateral # actor = receiver # recipient = offerer # secondary_recipient = hostage demand_hostage_interaction = { category = interaction_category_diplomacy common_interaction = no ai_min_reply_days = 4 ai_max_reply_days = 9 popup_on_receive = yes pause_on_receive = yes icon = icon_hostage interface_priority = 13 desc = demand_hostage_interaction_desc prompt = DEMAND_HOSTAGE_SELECT_HOSTAGE_TO_OFFER notification_text = DEMAND_HOSTAGE_PROPOSAL populate_recipient_list = { scope:recipient = { every_close_family_member = { limit = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient } } add_to_list = characters } } } cooldown_against_recipient = { years = 3 } is_shown = { # Cannot exchange hostages with self scope:recipient != scope:actor # Cannot exchange hostages with a herder NOT = { scope:recipient = { government_has_flag = government_is_true_herder } } # Only significant rulers use hostages scope:actor.highest_held_title_tier > tier_barony OR = { scope:recipient.highest_held_title_tier > tier_barony scope:recipient.liege ?= { highest_held_title_tier > tier_barony any_close_family_member = { this = scope:recipient # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient.liege } } } } # Laamps can't do anything with hostages but return/recall them. NOR = { scope:actor = { government_has_flag = government_is_landless_adventurer } scope:recipient = { government_has_flag = government_is_landless_adventurer } } #Inside a merit realm vassals won't demand hostages. trigger_if = { limit = { scope:actor.top_liege = { government_has_flag = government_has_merit } scope:actor.top_liege != scope:actor } NAND = { scope:actor = { government_has_flag = government_has_merit } scope:recipient = { government_has_flag = government_has_merit } } NOT = { scope:recipient = scope:actor.top_liege } } } redirect = { if = { limit = { scope:recipient ?= { is_playable_character = no is_landless_ruler = no } } scope:recipient ?= { save_scope_as = secondary_recipient } scope:secondary_recipient.liege ?= { save_scope_as = recipient } } } is_valid_showing_failures_only = { # Must be approachable scope:recipient = { NOT = { has_strong_hook = scope:actor } } scope:actor = { OR = { is_landless_ruler = no is_landless_administrative = yes } } scope:recipient = { OR = { is_landless_ruler = no is_landless_administrative = yes } } NOR = { # Must be at peace scope:recipient = { is_at_war_with = scope:actor } # Allies don't need hostages scope:recipient = { is_allied_to = scope:actor } # Only family oriented governments use hostages scope:actor = { government_has_flag = government_is_theocracy } scope:recipient = { government_has_flag = government_is_theocracy } # 1 hostage per court custom_tooltip = { text = "already_have_their_hostage_tt" scope:actor = { any_warden_hostage = { home_court ?= scope:recipient } } } custom_description = { text = "hostage_already_travelling_tt" subject = scope:actor object = scope:recipient scope:actor = { any_close_family_member = { exists = var:hostage_travelling_to_warden var:hostage_travelling_to_warden = scope:recipient } } } } # Stop AI spamming hostage offers trigger_if = { limit = { scope:recipient = { is_ai = yes } exists = scope:secondary_recipient } NOT = { scope:secondary_recipient = { has_character_flag = ai_should_not_demand_hostage } } } # Tooltip for players in case of no valid hostages to demand # Make sure this exactly matches "can_be_picked" section below trigger_else = { scope:recipient = { custom_description = { text = "basic_valid_hostage_to_demand" subject = scope:actor object = scope:recipient any_close_family_member = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient } } } } } # Hostages still valid trigger_if = { limit = { exists = scope:secondary_recipient exists = scope:recipient } scope:secondary_recipient = { bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient } } } tgp_blocked_action_against_tenno_trigger = { ACTOR = scope:actor TARGET = scope:recipient } } can_send = { scope:actor = { custom_description = { text = "character_interactions_hostile_actions_disabled_delay" NOT = { has_character_flag = flag_hostile_actions_disabled_delay } } trigger_if = { # AI only demand from less powerful neighbors limit = { is_ai = yes } bp2_valid_to_demand_hostage_ai_trigger = yes NOR = { scope:secondary_recipient ?= { has_character_flag = ai_should_not_demand_hostage } # AI should not demand close family of players without their consent scope:secondary_recipient = { any_close_family_member = { is_ai = no OR = { is_parent_of = scope:secondary_recipient is_grandparent_of = scope:secondary_recipient } this != scope:recipient } } # A hostage died on their watch var:hostage_died ?= scope:recipient } } } # Adult hostages must be loyal enough to go along with it scope:secondary_recipient = { trigger_if = { limit = { is_adult = yes } OR = { AND = { custom_tooltip = { text = hostage_opinion_too_low_tt opinion = { target = scope:recipient value >= -25 } NOT = { has_trait = disloyal } } } has_trait = loyal } } custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { has_character_flag = under_offer_as_hostage_flag } } } } can_be_picked = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient } # Already offered custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { has_character_flag = under_offer_as_hostage_flag } } # Already offered custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { exists = var:hostage_travelling_to_warden } } } cost = {} on_send = { scope:secondary_recipient = { add_character_flag = { flag = under_offer_as_hostage_flag months = 1 } } scope:actor = { add_character_flag = { flag = flag_hostile_actions_disabled_delay days = 10 } } if = { limit = { scope:recipient = { is_ai = no } } scope:secondary_recipient = { add_character_flag = { flag = ai_should_not_demand_hostage years = 3 } } } } on_accept = { # Save scopes for clarity scope:actor = { save_scope_as = hostage_taker } scope:recipient = { save_scope_as = hostage_sender } scope:secondary_recipient = { save_scope_as = hostage } custom_description_no_bullet = { text = hostage_pacts_on_arrival_tt } custom_description_no_bullet = { text = hostage_execution_warning_tt } custom_description_no_bullet = { text = hostage_attack_warning_tt } hostage_depart_effect = { HOSTAGE = scope:hostage WARDEN = scope:hostage_taker HOME_COURT = scope:hostage_sender } show_as_tooltip = { if = { limit = { scope:recipient = { is_vassal_of = scope:actor } } scope:recipient = { if = { limit = { is_ai = yes } add_opinion = { modifier = liege_demanded_hostage_opinion target = scope:actor } } } scope:actor = { # Tyranny for demanding from vassals add_tyranny = minor_tyranny_gain } } } scope:actor = { trigger_event = char_interaction.0331 } # If we're of the same clan this interaction affects unity if = { limit = { scope:actor = { government_has_flag = government_is_clan } scope:actor.house = scope:recipient.house } add_clan_unity_interaction_effect = { CHARACTER = scope:actor TARGET = scope:recipient VALUE = minor_unity_loss DESC = clan_unity_hostage.desc REVERSE_NON_HOUSE_TARGET = no } } } on_decline = { show_as_tooltip = { if = { # Effects for refusing demand from liege limit = { scope:recipient = { is_vassal_of = scope:actor } } scope:recipient = { if = { limit = { is_ai = yes } add_opinion = { modifier = liege_demanded_hostage_opinion target = scope:actor } } } scope:actor = { # Tyranny for demanding from vassals add_tyranny = minor_tyranny_gain if = { limit = { is_ai = yes } add_opinion = { modifier = vassal_refused_hostage_demand_opinion target = scope:recipient } } } } } scope:actor = { trigger_event = char_interaction.0301 } scope:secondary_recipient = { remove_character_flag = under_offer_as_hostage_flag } } auto_accept = { trigger_if = { limit = { scope:hook ?= yes scope:actor = { has_strong_hook = scope:recipient } } custom_description = { text = "spending_hook" subject = scope:actor object = scope:recipient scope:hook ?= yes scope:actor = { has_strong_hook = scope:recipient } } } trigger_else = { always = no } } can_be_blocked = { custom_description = { #Hook from Recipient can counteract, but only if Actor is not forcing the action via Strong Hook. text = "spending_hook" subject = scope:recipient object = scope:actor scope:recipient = { has_hook = scope:actor } NAND = { scope:hook = yes scope:actor = { has_strong_hook = scope:recipient } } } } on_blocked_effect = { scope:recipient = { remove_hook = { target = scope:actor } } } 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 # AI ai_accept = { base = 0 ######### PERSONALITY bp2_hostage_demand_personality_modifier = yes ######### OPINION opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:secondary_recipient multiplier = -0.1 desc = AI_OPINION_REASON } ######### RELATIONS bp2_hostage_relation_modifier = yes ######### DREAD modifier = { add = intimidated_halved_reason_value scope:recipient = { has_dread_level_towards = { target = scope:actor level = 1 } } desc = INTIMIDATED_REASON } modifier = { add = cowed_halved_reason_value scope:recipient = { has_dread_level_towards = { target = scope:actor level = 2 } } desc = COWED_REASON } ######### HOSTAGE IMPORTANCE modifier = { exists = scope:secondary_recipient add = interaction_recipient_hostage_value desc = HOSTAGE_VALUE_RECIPIENT_REASON } ######### RELATIVE POWER bp2_hostage_tier_neighbor_modifier = { # Realm relative position SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_claims_casus_bellis_modifier = { # Desire for land/war SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_vassals_lieges_modifier = { # Political situation SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_relative_strength_modifier = { # Relative military strength SENDER = scope:actor RECEIVER = scope:recipient } modifier = { desc = HOSTAGE_IMMINENT_THREAT_REASON scope:actor = { has_any_cb_on = scope:recipient } scope:actor.current_strength_with_allies_fifty_percent_value > scope:recipient.current_strength_with_allies_value add = 25 } ######### CULTURAL DIFFERENCES bp2_hostage_culture_faith_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } ######### CULTURAL TRADITIONS modifier = { scope:recipient.culture = { has_cultural_tradition = tradition_equitable } add = 25 desc = HOSTAGE_EQUITABLE_TRADITION_REASON } modifier = { scope:recipient.culture = { has_cultural_tradition = tradition_esteemed_hospitality } add = 25 desc = HOSTAGE_ESTEEMED_HOSPITALITY_TRADITION_REASON } modifier = { scope:recipient = { is_vassal_of = scope:actor culture = { has_cultural_tradition = tradition_loyal_soldiers } } add = 25 desc = HOSTAGE_LOYAL_SUBJECTS_TRADITION_REASON } ######### OTHER modifier = { # Hostage died on their watch exists = scope:actor.var:hostage_died scope:recipient = { NOR = { var:let_my_hostage_die ?= scope:actor has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_REASON add = -25 } modifier = { # MY Hostage died on their watch scope:recipient = { var:let_my_hostage_die ?= scope:actor NOT = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_HOME_COURT_REASON add = -100 } modifier = { # Killed my hostage!!! scope:recipient = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } desc = HOSTAGE_KILLED_REASON add = -200 } modifier = { # Already have a truce scope:actor ?= { has_truce = scope:recipient } desc = HOSTAGE_ACTOR_EXISTING_TRUCE_REASON add = -20 } modifier = { # Already fighting a war scope:recipient ?= { is_at_war = yes } desc = HOSTAGE_AT_WAR_REASON add = 15 } modifier = { # Already have your hostage scope:recipient = { any_warden_hostage = { home_court ?= scope:actor } } desc = HOSTAGE_ALREADY_OFFERED_REASON add = 50 } modifier = { # Attacked a hostage's home court add = -50 scope:actor = { has_character_modifier = attacked_home_court } desc = attacked_home_court } modifier = { scope:hook = yes add = 40 desc = SCHEME_WEAK_HOOK_USED } modifier = { scope:secondary_recipient ?= { is_adult = no } scope:actor = { has_character_flag = halved_hostage_prestige_income } desc = HOSTAGE_RETAINED_ADULTHOOD_REASON add = -25 } modifier = { # Conqueror scope:recipient ?= { has_variable = conqueror } desc = NO_FRIVOLOUS_ACTIVITIES_REASON add = -1000 } } ai_targets = { ai_recipients = neighboring_rulers ai_recipients = peer_vassals ai_recipients = vassals max = 10 } ai_targets = { ai_recipients = liege } ai_frequency_by_tier = { barony = 0 county = 0 duchy = 0 kingdom = 36 empire = 36 hegemony = 36 } ai_potential = { highest_held_title_tier >= tier_county NOT = { has_variable = conqueror } } ai_will_do = { base = 0 opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } bp2_hostage_tier_neighbor_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_claims_casus_bellis_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_vassals_lieges_modifier = { # Political situation SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_relative_strength_modifier = { # Relative military strength SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_culture_faith_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } modifier = { add = -50 scope:recipient = { has_character_modifier = attacked_warden } desc = attacked_warden } modifier = { # The AI will only use a Hook if they couldn't otherwise do this scope:hook = yes add = -1 } modifier = { # Not neighboring NOR = { scope:recipient = { character_is_land_realm_neighbor = scope:actor top_liege = scope:actor.top_liege } } add = -50 } # Cultural traditions modifier = { scope:actor.culture = { has_cultural_tradition = tradition_equitable } add = 25 } modifier = { scope:actor.culture = { has_cultural_tradition = tradition_esteemed_hospitality } add = 25 } modifier = { scope:actor = { is_vassal_of = scope:recipient culture = { has_cultural_tradition = tradition_loyal_soldiers } } add = 25 desc = HOSTAGE_CULTURAL_TRADITION_REASON } } } ### Exchange hostages - bilateral # actor = receiver # recipient = offerer # secondary_actor = hostage # secondary_recipient = hostage exchange_hostage_interaction = { category = interaction_category_diplomacy common_interaction = no ai_min_reply_days = 4 ai_max_reply_days = 9 popup_on_receive = yes pause_on_receive = yes icon = icon_hostage interface_priority = 12 desc = exchange_hostage_interaction_desc prompt = EXCHANGE_HOSTAGE_SELECT_HOSTAGE_TO_OFFER notification_text = EXCHANGE_HOSTAGE_PROPOSAL populate_actor_list = { scope:actor = { every_close_family_member = { limit = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor } } add_to_list = characters } } } populate_recipient_list = { scope:recipient = { every_close_family_member = { limit = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient } } add_to_list = characters } } } cost = {} cooldown_against_recipient = { years = 3 } is_shown = { # Cannot exchange hostages with self scope:recipient != scope:actor # Cannot exchange hostages with a herder NOT = { scope:recipient = { government_has_flag = government_is_true_herder } } # Only significant rulers use hostages scope:actor.highest_held_title_tier > tier_barony OR = { scope:recipient.highest_held_title_tier > tier_barony scope:recipient.liege ?= { highest_held_title_tier > tier_barony any_close_family_member = { this = scope:recipient # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient.liege } } } } # Laamps can't do anything with hostages but return/recall them. NOR = { scope:actor = { government_has_flag = government_is_landless_adventurer } scope:recipient = { government_has_flag = government_is_landless_adventurer } } #Inside a merit realm vassals won't exchange hostages. trigger_if = { limit = { scope:actor.top_liege = { government_has_flag = government_has_merit } scope:actor.top_liege != scope:actor } NAND = { scope:actor = { government_has_flag = government_has_merit } scope:recipient = { government_has_flag = government_has_merit } } NOT = { scope:recipient = scope:actor.top_liege } } } redirect = { if = { limit = { scope:recipient ?= { is_playable_character = no is_landless_ruler = no } } scope:recipient ?= { save_scope_as = secondary_recipient } scope:secondary_recipient.liege ?= { save_scope_as = recipient } } } is_valid_showing_failures_only = { scope:actor = { NOR = { # Must be at peace is_at_war_with = scope:recipient # Allies don't need hostages is_allied_to = scope:recipient # Only family oriented governments use hostages government_has_flag = government_is_theocracy scope:recipient = { government_has_flag = government_is_theocracy } # 1 hostage per court custom_tooltip = { text = "already_has_your_hostage_tt" scope:recipient = { any_warden_hostage = { home_court ?= scope:actor } } } custom_tooltip = { text = "already_have_their_hostage_tt" any_warden_hostage = { home_court ?= scope:recipient } } custom_description = { text = "hostage_already_travelling_tt" subject = scope:recipient object = scope:actor any_close_family_member = { exists = var:hostage_travelling_to_warden var:hostage_travelling_to_warden = scope:recipient } } custom_description = { text = "hostage_already_travelling_tt" subject = scope:actor object = scope:recipient scope:recipient = { any_close_family_member = { exists = var:hostage_travelling_to_warden var:hostage_travelling_to_warden = scope:actor } } } } OR = { is_landless_ruler = no is_landless_administrative = yes } # Stop AI spamming hostage offers trigger_if = { limit = { is_ai = yes exists = scope:secondary_actor } NOT = { scope:secondary_actor = { has_character_flag = ai_should_not_demand_hostage } } } # Tooltip for players in case of no valid hostages to demand # Make sure this exactly matches "can_be_picked" section below trigger_else = { scope:recipient = { custom_description = { text = "basic_valid_hostage_to_demand" subject = scope:actor object = scope:recipient any_close_family_member = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient } } } } } # Stop AI spamming hostage offers trigger_if = { limit = { is_ai = yes exists = scope:secondary_actor } NOT = { scope:secondary_actor = { has_character_flag = ai_should_not_offer_hostage } } } # Tooltip for players in case of no valid hostages to offer trigger_else = { custom_description = { text = "basic_valid_hostage_to_offer" object = scope:recipient subject = scope:actor any_close_family_member = { # Unlanded, at sender's court, child/sibling/nibling/grandchild bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor } } } } } scope:recipient = { OR = { is_landless_ruler = no is_landless_administrative = yes } } # Hostages still valid trigger_if = { limit = { exists = scope:secondary_recipient exists = scope:recipient } scope:secondary_recipient = { bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient } } } trigger_if = { limit = { exists = scope:secondary_actor exists = scope:actor } scope:secondary_actor = { bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor } } } tgp_blocked_action_against_tenno_trigger = { ACTOR = scope:actor TARGET = scope:recipient } } on_send = { scope:secondary_actor = { add_character_flag = { flag = under_offer_as_hostage_flag months = 1 } } scope:secondary_recipient = { add_character_flag = { flag = under_offer_as_hostage_flag months = 1 } } } can_send = { scope:actor = { trigger_if = { limit = { is_ai = yes } bp2_valid_to_exchange_hostage_ai_trigger = yes # AI should not demand close family of players without their consent NOR = { scope:secondary_actor = { any_close_family_member = { is_ai = no OR = { is_parent_of = scope:secondary_actor is_grandparent_of = scope:secondary_actor } this != scope:actor } } scope:secondary_recipient = { any_close_family_member = { is_ai = no OR = { is_parent_of = scope:secondary_recipient is_grandparent_of = scope:secondary_recipient } this != scope:recipient } } # A hostage died on their watch var:hostage_died ?= scope:recipient } } } scope:secondary_actor = { # Already offered custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { has_character_flag = under_offer_as_hostage_flag } } # Adult hostages must be loyal enough to go along with it trigger_if = { limit = { is_adult = yes } OR = { AND = { custom_tooltip = { text = hostage_opinion_too_low_tt opinion = { target = scope:actor value >= -25 } NOT = { has_trait = disloyal } } } has_trait = loyal } } } scope:secondary_recipient = { # Already offered custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { has_character_flag = under_offer_as_hostage_flag } } # Adult hostages must be loyal enough to go along with it trigger_if = { limit = { is_adult = yes } OR = { AND = { custom_tooltip = { text = hostage_opinion_too_low_tt opinion = { target = scope:recipient value >= -25 } NOT = { has_trait = disloyal } } } has_trait = loyal } } } } # whether a character can be picked for the interaction, interface only (e.g. picking the first character in the marriage interaction) # in character scope, actor and recipient event targets can be used, but not the secondary characters (because none exist yet) can_be_picked = { # Already offered custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { has_character_flag = under_offer_as_hostage_flag } } # Already offered custom_tooltip = { text = hostage_already_offered_awaiting_response_tt NOT = { exists = var:hostage_travelling_to_warden } } } on_accept = { # Save scopes for clarity scope:actor = { save_scope_as = hostage_sender_1 } scope:secondary_actor = { save_scope_as = hostage_1 } scope:recipient = { save_scope_as = hostage_sender_2 } scope:secondary_recipient = { save_scope_as = hostage_2 } custom_description_no_bullet = { text = hostage_pacts_on_arrival_tt } custom_description_no_bullet = { text = hostage_execution_warning_tt } custom_description_no_bullet = { text = hostage_attack_warning_tt } hostage_depart_effect = { HOSTAGE = scope:hostage_1 WARDEN = scope:hostage_sender_2 HOME_COURT = scope:hostage_sender_1 } hostage_depart_effect = { HOSTAGE = scope:hostage_2 WARDEN = scope:hostage_sender_1 HOME_COURT = scope:hostage_sender_2 } scope:actor = { trigger_event = char_interaction.0332 } # If we're of the same clan this interaction affects unity if = { limit = { scope:actor = { government_has_flag = government_is_clan } scope:actor.house = scope:recipient.house } add_clan_unity_interaction_effect = { CHARACTER = scope:actor TARGET = scope:recipient VALUE = medium_unity_loss DESC = clan_unity_hostage.desc REVERSE_NON_HOUSE_TARGET = no } } scope:actor.house = { change_house_relation_effect = { HOUSE = scope:recipient.house VALUE = house_relation_improve_medium_value REASON = hostage_exchange CHAR = scope:actor TARGET_CHAR = scope:recipient TITLE = scope:dummy_gender } } } on_decline = { scope:actor = { trigger_event = char_interaction.0311 } scope:secondary_actor = { remove_character_flag = under_offer_as_hostage_flag } scope:secondary_recipient = { remove_character_flag = under_offer_as_hostage_flag } } # AI ai_accept = { base = -25 ######## PERSONALITY bp2_hostage_exchange_personality_modifier = yes ######### OPINION opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:secondary_recipient multiplier = -0.1 desc = AI_OPINION_REASON } ######### RELATIONS bp2_hostage_relation_modifier = yes ######### DREAD modifier = { add = intimidated_halved_reason_value scope:recipient = { has_dread_level_towards = { target = scope:actor level = 1 } } desc = INTIMIDATED_REASON } modifier = { add = cowed_halved_reason_value scope:recipient = { has_dread_level_towards = { target = scope:actor level = 2 } } desc = COWED_REASON } ######### HOSTAGE IMPORTANCE modifier = { exists = scope:secondary_actor NOT = { exists = scope:secondary_recipient } add = interaction_actor_hostage_value desc = HOSTAGE_VALUE_ACTOR_REASON } modifier = { NOT = { exists = scope:secondary_actor } exists = scope:secondary_recipient add = interaction_recipient_hostage_value # already negative desc = HOSTAGE_VALUE_RECIPIENT_REASON } ######### RELATIVE POWER bp2_hostage_tier_neighbor_modifier = { # Realm relative position SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_claims_casus_bellis_modifier = { # Desire for land/war SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_vassals_lieges_modifier = { # Political situation SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_relative_strength_modifier = { # Relative military strength SENDER = scope:actor RECEIVER = scope:recipient } modifier = { desc = HOSTAGE_IMMINENT_THREAT_REASON scope:actor = { has_any_cb_on = scope:recipient } scope:actor.current_strength_with_allies_fifty_percent_value > scope:recipient.current_strength_with_allies_value add = 25 } ######### CULTURAL DIFFERENCES bp2_hostage_culture_faith_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } ######### CULTURAL TRADITIONS modifier = { scope:recipient.culture = { has_cultural_tradition = tradition_equitable } add = 25 desc = HOSTAGE_EQUITABLE_TRADITION_REASON } modifier = { scope:recipient.culture = { has_cultural_tradition = tradition_esteemed_hospitality } add = 25 desc = HOSTAGE_ESTEEMED_HOSPITALITY_TRADITION_REASON } modifier = { scope:recipient = { is_vassal_of = scope:actor culture = { has_cultural_tradition = tradition_loyal_soldiers } } add = 25 desc = HOSTAGE_LOYAL_SUBJECTS_TRADITION_REASON } ######### OTHER modifier = { # Hostage died on their watch exists = scope:actor.var:hostage_died scope:recipient = { NOR = { var:let_my_hostage_die ?= scope:actor has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_REASON add = -25 } modifier = { # MY Hostage died on their watch scope:recipient = { var:let_my_hostage_die ?= scope:actor NOT = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_HOME_COURT_REASON add = -100 } modifier = { # Killed my hostage!!! scope:recipient = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } desc = HOSTAGE_KILLED_REASON add = -200 } modifier = { # Already have a truce scope:actor ?= { has_truce = scope:recipient } desc = HOSTAGE_ACTOR_EXISTING_TRUCE_REASON add = -20 } modifier = { # Already fighting a war scope:recipient ?= { is_at_war = yes } desc = HOSTAGE_AT_WAR_REASON add = 15 } modifier = { # Already have your hostage scope:recipient = { any_warden_hostage = { home_court ?= scope:actor } } desc = HOSTAGE_ALREADY_OFFERED_REASON add = 50 } modifier = { add = -50 scope:actor = { has_character_modifier = attacked_warden } desc = attacked_warden } modifier = { # Attacked a hostage's home court add = -50 scope:actor = { has_character_modifier = attacked_home_court } desc = attacked_home_court } modifier = { scope:hook = yes add = 40 desc = SCHEME_WEAK_HOOK_USED } modifier = { scope:secondary_recipient ?= { is_adult = no } scope:actor = { has_character_flag = halved_hostage_prestige_income } desc = HOSTAGE_RETAINED_ADULTHOOD_REASON add = -25 } modifier = { # Conqueror scope:recipient ?= { has_variable = conqueror } desc = NO_FRIVOLOUS_ACTIVITIES_REASON add = -1000 } } ai_targets = { ai_recipients = neighboring_rulers ai_recipients = peer_vassals ai_recipients = vassals max = 10 } ai_targets = { ai_recipients = liege } ai_target_quick_trigger = { adult = yes } ai_frequency_by_tier = { barony = 0 county = 0 duchy = 360 kingdom = 120 empire = 36 hegemony = 36 } ai_potential = { is_adult = yes highest_held_title_tier >= tier_county NOT = { has_variable = conqueror } } ai_will_do = { base = 0 opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } opinion_modifier = { # Opinion Factor who = scope:actor opinion_target = scope:secondary_actor multiplier = -0.1 desc = AI_OPINION_REASON } bp2_hostage_tier_neighbor_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_claims_casus_bellis_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_vassals_lieges_modifier = { # Political situation SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_relative_strength_modifier = { # Relative military strength SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_culture_faith_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } modifier = { # The AI will only use a Hook if they couldn't otherwise do this scope:hook = yes add = -1 } modifier = { # Attacked a hostage's warden add = -50 scope:recipient = { has_character_modifier = attacked_warden } desc = attacked_warden } modifier = { # Attacked a hostage's home court add = -50 scope:recipient = { has_character_modifier = attacked_home_court } desc = attacked_home_court } modifier = { # Hostage died on their watch exists = scope:actor.var:hostage_died scope:recipient = { NOR = { var:let_my_hostage_die ?= scope:actor has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_REASON add = -25 } modifier = { # MY Hostage died on their watch scope:recipient = { var:let_my_hostage_die ?= scope:actor NOT = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_HOME_COURT_REASON add = -100 } modifier = { # Killed my hostage!!! scope:recipient = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } desc = HOSTAGE_KILLED_REASON add = -200 } modifier = { # Not neighboring NOR = { scope:recipient = { character_is_land_realm_neighbor = scope:actor top_liege = scope:actor.top_liege } } add = -50 } modifier = { scope:recipient = { has_character_flag = halved_hostage_prestige_income } desc = HOSTAGE_RETAINED_ADULTHOOD_REASON add = -25 } # Cultural traditions modifier = { scope:actor.culture = { has_cultural_tradition = tradition_equitable } add = 25 } modifier = { scope:actor.culture = { has_cultural_tradition = tradition_esteemed_hospitality } add = 25 } modifier = { scope:actor = { is_vassal_of = scope:recipient culture = { has_cultural_tradition = tradition_loyal_soldiers } } add = 25 desc = HOSTAGE_CULTURAL_TRADITION_REASON } } #Use hook 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 greeting = positive } ### Return hostage - unilateral # actor = warden # recipient = home_court # secondary_actor = hostage return_hostage_interaction = { category = interaction_category_diplomacy common_interaction = no popup_on_receive = yes pause_on_receive = yes icon = icon_hostage desc = return_hostage_interaction_desc populate_recipient_list = { scope:actor = { every_warden_hostage = { limit = { home_court ?= scope:recipient } add_to_list = characters } } } cost = {} is_shown = { # Cannot return hostages to self scope:recipient != scope:actor # Must have a hostage OR = { scope:actor = { any_warden_hostage = { home_court ?= scope:recipient } } scope:recipient.warden ?= scope:actor } } redirect = { if = { limit = { scope:recipient.warden ?= scope:actor } scope:recipient = { save_scope_as = secondary_recipient } scope:recipient.home_court = { save_scope_as = recipient } } } is_valid_showing_failures_only = { NOR = { # Must be at peace scope:recipient = { is_at_war_with = scope:actor } # Only family oriented governments use hostages scope:actor = { OR = { government_has_flag = government_is_theocracy government_has_flag = government_is_landless_adventurer } } scope:recipient = { OR = { government_has_flag = government_is_theocracy government_has_flag = government_is_landless_adventurer } } } } # whether a character can be picked for the interaction, interface only (e.g. picking the first character in the marriage interaction) # in character scope, actor and recipient event targets can be used, but not the secondary characters (because none exist yet) can_be_picked = {} can_send = { NOT = { scope:actor = { is_at_war_with = scope:recipient } } } on_send = {} auto_accept = yes on_accept = { # Save scopes for clarity scope:actor = { save_scope_as = warden } scope:recipient = { save_scope_as = home_court } scope:secondary_recipient = { save_scope_as = hostage } # Send toast informing sender of acceptance scope:home_court = { hidden_effect = { send_interface_toast = { type = event_toast_effect_good title = return_hostage_interaction_notification left_icon = scope:hostage right_icon = scope:warden show_as_tooltip = { bp2_return_hostage_effect = { HOSTAGE = scope:hostage } } } } } scope:warden = { send_interface_toast = { type = event_toast_effect_neutral title = return_hostage_interaction_notification left_icon = scope:hostage right_icon = scope:home_court show_as_tooltip = { bp2_return_hostage_effect = { HOSTAGE = scope:hostage } } } if = { limit = { has_character_flag = flag_hostile_actions_disabled_delay } remove_character_flag = flag_hostile_actions_disabled_delay } } # Notify home court with letter event scope:home_court = { trigger_event = { id = char_interaction.0320 } } } ai_targets = { ai_recipients = neighboring_rulers ai_recipients = peer_vassals ai_recipients = vassals ai_recipients = liege ai_recipients = family # Redirects } ai_frequency_by_tier = { barony = 0 county = 60 duchy = 36 kingdom = 36 empire = 36 hegemony = 36 } ai_will_do = { base = 0 modifier = { NOR = { # Alliances is_allied_to = scope:recipient is_spouse_of = scope:recipient # Protected by liege AND = { OR = { top_liege != this scope:recipient = { top_liege != this } } top_liege != scope:recipient.top_liege } # Adult hostage been here awhile and we are not in immiment danger AND = { any_warden_hostage = { age >= 20 hostage_duration = { years >= 5 } } NOT = { scope:recipient = { has_any_cb_on = scope:actor scope:recipient.current_strength_with_allies_fifty_percent_value > scope:actor.current_strength_with_allies_value } } } } factor = 0 } opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } modifier = { add = 25 scope:actor = { has_any_cb_on = scope:recipient scope:actor.current_strength_with_allies_fifty_percent_value > scope:recipient.current_strength_with_allies_value } } modifier = { scope:recipient = { OR = { is_allied_to = scope:actor is_spouse_of = scope:recipient } } add = 50 } modifier = { scope:recipient = { has_any_cb_on = scope:actor scope:recipient.current_strength_with_allies_fifty_percent_value > scope:actor.current_strength_with_allies_value } add = -50 } bp2_hostage_return_personality_modifier = { WARDEN = scope:actor HOME_COURT = scope:recipient } # Cultural traditions modifier = { scope:actor.culture = { has_cultural_tradition = tradition_equitable } add = 25 } modifier = { scope:actor.culture = { has_cultural_tradition = tradition_esteemed_hospitality } add = 25 } modifier = { scope:actor = { is_vassal_of = scope:recipient culture = { has_cultural_tradition = tradition_loyal_soldiers } } add = 25 desc = HOSTAGE_CULTURAL_TRADITION_REASON } #DO NOT SEND BACK FRANKOKRATIA CLAIMANT modifier = { scope:hostage ?= { has_character_flag = byz_claimant_flag } exists = global_var:byz_claimant_champion factor = 0 } } send_options_exclusive = no show_effects_in_notification = no greeting = positive notification_text = { } } ### Recall hostage - bilateral # actor = home_court # recipient = warden # secondary_recipient = hostage recall_hostage_interaction = { category = interaction_category_diplomacy common_interaction = no popup_on_receive = yes pause_on_receive = yes icon = icon_hostage desc = recall_hostage_interaction_desc populate_recipient_list = { scope:actor = { every_home_court_hostage = { limit = { warden ?= scope:recipient } add_to_list = characters } } } cost = {} is_shown = { # AI don't use this interaction at all scope:actor = { is_ai = no } # Cannot recall hostages from self scope:recipient != scope:actor # Must have a hostage OR = { scope:actor = { any_home_court_hostage = { warden ?= scope:recipient } } scope:recipient.home_court ?= scope:actor } } redirect = { if = { limit = { scope:recipient.home_court ?= scope:actor } scope:recipient = { save_scope_as = secondary_recipient } scope:recipient.warden = { save_scope_as = recipient } } } is_valid_showing_failures_only = { NOR = { # Must be at peace scope:recipient = { is_at_war_with = scope:actor } # Only family oriented governments use hostages scope:actor = { government_has_flag = government_is_theocracy } scope:recipient = { government_has_flag = government_is_theocracy } } } # whether a character can be picked for the interaction, interface only (e.g. picking the first character in the marriage interaction) # in character scope, actor and recipient event targets can be used, but not the secondary characters (because none exist yet) can_be_picked = {} can_send = { NOT = { scope:actor = { is_at_war_with = scope:recipient } } } on_send = {} on_accept = { # Save scopes for clarity scope:actor = { save_scope_as = home_court } scope:recipient = { save_scope_as = warden } scope:secondary_recipient = { save_scope_as = hostage } # Send toast informing sender of acceptance scope:warden = { hidden_effect = { send_interface_toast = { type = event_toast_effect_neutral title = recall_hostage_interaction_notification left_icon = scope:hostage right_icon = scope:home_court show_as_tooltip = { bp2_return_hostage_effect = { HOSTAGE = scope:hostage } } } } } scope:home_court = { send_interface_toast = { type = event_toast_effect_good title = recall_hostage_interaction_notification left_icon = scope:hostage right_icon = scope:warden show_as_tooltip = { bp2_return_hostage_effect = { HOSTAGE = scope:hostage } } } if = { limit = { has_character_flag = flag_hostile_actions_disabled_delay } remove_character_flag = flag_hostile_actions_disabled_delay } } # Notify home court with letter event scope:home_court = { trigger_event = char_interaction.0340 } } on_decline = { scope:actor = { trigger_event = char_interaction.0341 } } ai_accept = { base = 0 ######### PERSONALITY bp2_hostage_return_personality_modifier = { HOME_COURT = scope:actor WARDEN = scope:recipient } ######### OPINION opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:secondary_recipient multiplier = -0.1 desc = AI_OPINION_REASON } ######### RELATIONS bp2_hostage_relation_modifier = yes ######### DREAD modifier = { add = intimidated_halved_reason_value scope:recipient = { has_dread_level_towards = { target = scope:actor level = 1 } } desc = INTIMIDATED_REASON } modifier = { add = cowed_halved_reason_value scope:recipient = { has_dread_level_towards = { target = scope:actor level = 2 } } desc = COWED_REASON } ######### HOSTAGE IMPORTANCE modifier = { exists = scope:secondary_recipient add = interaction_recipient_hostage_value desc = HOSTAGE_VALUE_RECIPIENT_REASON } ######### HOSTAGE TIME modifier = { # Hostage is grown up add = 25 scope:secondary_recipient = { is_adult = yes } desc = HOSTAGE_ADULT_REASON } modifier = { # Time as a hostage add = -25 scope:secondary_recipient = { hostage_duration = { years < 1 } } desc = HOSTAGE_MINIMUM_STAY_REASON } modifier = { # Time as a hostage add = { value = 10 scope:secondary_recipient = { if = { limit = { hostage_duration = { years >= 3 } } add = 10 } if = { limit = { hostage_duration = { years >= 4 } } add = 10 } if = { limit = { hostage_duration = { years >= 5 } } add = 10 } if = { limit = { hostage_duration = { years >= 6 } } add = 10 } if = { limit = { hostage_duration = { years >= 7 } } add = 10 } if = { limit = { hostage_duration = { years >= 8 } } add = 10 } if = { limit = { hostage_duration = { years >= 9 } } add = 10 } if = { limit = { hostage_duration = { years >= 10 } } add = 10 } } } scope:secondary_recipient = { hostage_duration = { years >= 2 } } desc = HOSTAGE_DURATION_REASON } ######### RELATIVE POWER bp2_hostage_recall_tier_neighbor_modifier = { # Realm relative position RECALLER = scope:actor WARDEN = scope:recipient } bp2_hostage_claims_casus_bellis_modifier = { # Desire for land/war SENDER = scope:actor RECEIVER = scope:recipient } bp2_hostage_recall_vassals_lieges_modifier = { # Political situation RECALLER = scope:actor WARDEN = scope:recipient } bp2_hostage_relative_strength_modifier = { # Relative military strength SENDER = scope:recipient RECEIVER = scope:actor } modifier = { desc = HOSTAGE_IMMINENT_THREAT_REASON scope:actor = { has_any_cb_on = scope:recipient } scope:actor.current_strength_with_allies_fifty_percent_value > scope:recipient.current_strength_with_allies_value add = -25 } ######### CULTURAL DIFFERENCES bp2_hostage_culture_faith_modifier = { SENDER = scope:actor RECEIVER = scope:recipient } ######### CULTURAL TRADITIONS modifier = { scope:recipient = { culture = { has_cultural_tradition = tradition_equitable } NOT = { any_home_court_hostage = { warden = scope:actor } } } scope:secondary_recipient = { hostage_duration = { years >= 2 } } add = 25 desc = HOSTAGE_EQUITABLE_TRADITION_REASON } modifier = { scope:recipient = { culture = { has_cultural_tradition = tradition_esteemed_hospitality } NOT = { any_home_court_hostage = { warden = scope:actor } } } scope:secondary_recipient = { hostage_duration = { years >= 2 } } add = 25 desc = HOSTAGE_ESTEEMED_HOSPITALITY_TRADITION_REASON } modifier = { scope:recipient = { is_vassal_of = scope:actor culture = { has_cultural_tradition = tradition_loyal_soldiers } } scope:secondary_recipient = { hostage_duration = { years >= 2 } } add = 25 desc = HOSTAGE_LOYAL_SUBJECTS_TRADITION_REASON } ######### OTHER modifier = { # Hostage died on their watch exists = scope:actor.var:hostage_died scope:recipient = { NOR = { var:let_my_hostage_die ?= scope:actor has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_REASON add = -25 } modifier = { # MY Hostage died on their watch scope:recipient = { var:let_my_hostage_die ?= scope:actor NOT = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } } desc = HOSTAGE_PREVIOUSLY_DIED_HOME_COURT_REASON add = -100 } modifier = { # Killed my hostage!!! scope:recipient = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } } desc = HOSTAGE_KILLED_REASON add = -200 } modifier = { # Already have a truce scope:actor ?= { has_truce = scope:recipient } desc = HOSTAGE_ACTOR_EXISTING_TRUCE_REASON add = 20 } modifier = { # Already fighting a war scope:recipient ?= { is_at_war = yes } desc = HOSTAGE_AT_WAR_REASON add = -25 } modifier = { # Attacked a hostage's home court add = -50 scope:actor = { has_character_modifier = attacked_home_court } desc = attacked_home_court } modifier = { scope:hook = yes add = 40 desc = SCHEME_WEAK_HOOK_USED } modifier = { # Has my hostage add = -50 scope:recipient = { any_home_court_hostage = { warden = scope:actor } } desc = HOSTAGE_HAS_MINE_REASON } #DO NOT SEND BACK FRANKOKRATIA CLAIMANT modifier = { desc = crusading_claim_cb_reason scope:hostage = { has_character_flag = byz_claimant_flag } exists = global_var:byz_claimant_champion add = -5000 } } auto_accept = { trigger_if = { limit = { scope:hook ?= yes scope:actor = { has_strong_hook = scope:recipient } } custom_description = { text = "spending_hook" subject = scope:actor object = scope:recipient scope:hook ?= yes scope:actor = { has_strong_hook = scope:recipient } } } trigger_else = { always = no } } can_be_blocked = { custom_description = { #Hook from Recipient can counteract, but only if Actor is not forcing the action via Strong Hook. text = "spending_hook" subject = scope:recipient object = scope:actor scope:recipient = { has_hook = scope:actor } NAND = { scope:hook = yes scope:actor = { has_strong_hook = scope:recipient } } } } on_blocked_effect = { scope:recipient = { remove_hook = { target = scope:actor } } } 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 show_effects_in_notification = yes greeting = positive notification_text = RECALL_HOSTAGE_PROPOSAL } ### Trait interaction for guardians # actor = guardian # recipient = ward/hostage # This has to be update every time a new trait is added to the game, otherwise you won't be able to pass it down influence_child_personality_interaction = { category = interaction_category_friendly common_interaction = yes interface_priority = 60 icon = child ai_maybe = yes ai_min_reply_days = 4 ai_max_reply_days = 9 can_send_despite_rejection = yes popup_on_receive = yes pause_on_receive = yes pre_answer_maybe_key = ANSWER_MIGHT_SUCCEED pre_answer_no_key = ANSWER_CANT_SUCCEED pre_answer_yes_key = ANSWER_WILL_SUCCEED pre_answer_maybe_breakdown_key = ANSWER_SUM_CHANCE desc = influence_child_personality_interaction_desc is_shown = { #any ai ward/hostage has_bp2_dlc_trigger = yes scope:recipient = { is_ai = yes is_adult = no OR = { scope:actor = { has_relation_ward = scope:recipient } is_hostage_of = scope:actor } } } is_valid_showing_failures_only = { scope:recipient = { #be old enough to talk and have some room for new personlaity traits age >= 4 custom_description = { text = influence_child_personality_interaction_trait_limit number_of_personality_traits < 4 } #checking all trait individually through the set scope in order to catch if all of your traits are either the same or opposite custom_description = { text = influence_child_personality_interaction_all_same_traits switch = { trigger = yes scope:lustful = { scope:recipient = { NOT = { has_trait = lustful } } } scope:chaste = { scope:recipient = { NOT = { has_trait = chaste } } } scope:gluttonous = { scope:recipient = { NOT = { has_trait = gluttonous } } } scope:temperate = { scope:recipient = { NOT = { has_trait = temperate } } } scope:greedy = { scope:recipient = { NOT = { has_trait = greedy } } } scope:generous = { scope:recipient = { NOT = { has_trait = generous } } } scope:lazy = { scope:recipient = { NOT = { has_trait = lazy } } } scope:diligent = { scope:recipient = { NOT = { has_trait = diligent } } } scope:wrathful = { scope:recipient = { NOT = { has_trait = wrathful } } } scope:calm = { scope:recipient = { NOT = { has_trait = calm } } } scope:patient = { scope:recipient = { NOT = { has_trait = patient } } } scope:impatient = { scope:recipient = { NOT = { has_trait = impatient } } } scope:arrogant = { scope:recipient = { NOT = { has_trait = arrogant } } } scope:humble = { scope:recipient = { NOT = { has_trait = humble } } } scope:deceitful = { scope:recipient = { NOT = { has_trait = deceitful } } } scope:honest = { scope:recipient = { NOT = { has_trait = honest } } } scope:craven = { scope:recipient = { NOT = { has_trait = craven } } } scope:brave = { scope:recipient = { NOT = { has_trait = brave } } } scope:shy = { scope:recipient = { NOT = { has_trait = shy } } } scope:gregarious = { scope:recipient = { NOT = { has_trait = gregarious } } } scope:ambitious = { scope:recipient = { NOT = { has_trait = ambitious } } } scope:content = { scope:recipient = { NOT = { has_trait = content } } } scope:arbitrary = { scope:recipient = { NOT = { has_trait = arbitrary } } } scope:just = { scope:recipient = { NOT = { has_trait = just } } } scope:cynical = { scope:recipient = { NOT = { has_trait = cynical } } } scope:zealous = { scope:recipient = { NOT = { has_trait = zealous } } } scope:paranoid = { scope:recipient = { NOT = { has_trait = paranoid } } } scope:trusting = { scope:recipient = { NOT = { has_trait = trusting } } } scope:compassionate = { scope:recipient = { NOT = { has_trait = compassionate } } } scope:callous = { scope:recipient = { NOT = { has_trait = callous } } } scope:sadistic = { scope:recipient = { NOT = { has_trait = sadistic } } } scope:stubborn = { scope:recipient = { NOT = { has_trait = stubborn } } } scope:fickle = { scope:recipient = { NOT = { has_trait = fickle } } } scope:eccentric = { scope:recipient = { NOT = { has_trait = eccentric } } } scope:vengeful = { scope:recipient = { NOT = { has_trait = vengeful } } } scope:forgiving = { scope:recipient = { NOT = { has_trait = forgiving } } } } } } scope:actor = { is_adult = yes number_of_personality_traits >= 1 #just in case you have to have at least some personality } } cooldown_against_recipient = { years = 3 } can_send = { } #each option is shown if the actor has the corresponding trait and valid if recipient don't have it yet or don't have an opposite trait send_option = { is_shown = { scope:actor = { has_trait = lustful } } is_valid = { scope:recipient = { NOR = { has_trait = lustful trait:lustful = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } has_sexuality = none has_sexuality = asexual } } } flag = lustful localization = trait_lustful } send_option = { is_shown = { scope:actor = { has_trait = chaste } } is_valid = { scope:recipient = { NOR = { has_trait = chaste trait:chaste = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } has_sexuality = none has_sexuality = asexual } } } flag = chaste localization = trait_chaste } send_option = { is_shown = { scope:actor = { has_trait = gluttonous } } is_valid = { scope:recipient = { NOR = { has_trait = gluttonous trait:gluttonous = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = gluttonous localization = trait_gluttonous } send_option = { is_shown = { scope:actor = { has_trait = temperate } } is_valid = { scope:recipient = { NOR = { has_trait = temperate trait:temperate = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = temperate localization = trait_temperate } send_option = { is_shown = { scope:actor = { has_trait = greedy } } is_valid = { scope:recipient = { NOR = { has_trait = greedy trait:greedy = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = greedy localization = trait_greedy } send_option = { is_shown = { scope:actor = { has_trait = generous } } is_valid = { scope:recipient = { NOR = { has_trait = generous trait:generous = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = generous localization = trait_generous } send_option = { is_shown = { scope:actor = { has_trait = lazy } } is_valid = { scope:recipient = { NOR = { has_trait = lazy trait:lazy = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = lazy localization = trait_lazy } send_option = { is_shown = { scope:actor = { has_trait = diligent } } is_valid = { scope:recipient = { NOR = { has_trait = diligent trait:diligent = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = diligent localization = trait_diligent } send_option = { is_shown = { scope:actor = { has_trait = wrathful } } is_valid = { scope:recipient = { NOR = { has_trait = wrathful trait:wrathful = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = wrathful localization = trait_wrathful } send_option = { is_shown = { scope:actor = { has_trait = calm } } is_valid = { scope:recipient = { NOR = { has_trait = calm trait:calm = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = calm localization = trait_calm } send_option = { is_shown = { scope:actor = { has_trait = patient } } is_valid = { scope:recipient = { NOR = { has_trait = patient trait:patient = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = patient localization = trait_patient } send_option = { is_shown = { scope:actor = { has_trait = impatient } } is_valid = { scope:recipient = { NOR = { has_trait = impatient trait:impatient = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = impatient localization = trait_impatient } send_option = { is_shown = { scope:actor = { has_trait = arrogant } } is_valid = { scope:recipient = { NOR = { has_trait = arrogant trait:arrogant = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = arrogant localization = trait_arrogant } send_option = { is_shown = { scope:actor = { has_trait = humble } } is_valid = { scope:recipient = { NOR = { has_trait = humble trait:humble = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = humble localization = trait_humble } send_option = { is_shown = { scope:actor = { has_trait = deceitful } } is_valid = { scope:recipient = { NOR = { has_trait = deceitful trait:deceitful = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = deceitful localization = trait_deceitful } send_option = { is_shown = { scope:actor = { has_trait = honest } } is_valid = { scope:recipient = { NOR = { has_trait = honest trait:honest = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = honest localization = trait_honest } send_option = { is_shown = { scope:actor = { has_trait = craven } } is_valid = { scope:recipient = { NOR = { has_trait = craven trait:craven = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = craven localization = trait_craven } send_option = { is_shown = { scope:actor = { has_trait = brave } } is_valid = { scope:recipient = { NOR = { has_trait = brave trait:brave = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = brave localization = trait_brave } send_option = { is_shown = { scope:actor = { has_trait = shy } } is_valid = { scope:recipient = { NOR = { has_trait = shy trait:shy = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = shy localization = trait_shy } send_option = { is_shown = { scope:actor = { has_trait = gregarious } } is_valid = { scope:recipient = { NOR = { has_trait = gregarious trait:gregarious = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = gregarious localization = trait_gregarious } send_option = { is_shown = { scope:actor = { has_trait = ambitious } } is_valid = { scope:recipient = { NOR = { has_trait = ambitious trait:ambitious = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = ambitious localization = trait_ambitious } send_option = { is_shown = { scope:actor = { has_trait = content } } is_valid = { scope:recipient = { NOR = { has_trait = content trait:content = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = content localization = trait_content } send_option = { is_shown = { scope:actor = { has_trait = arbitrary } } is_valid = { scope:recipient = { NOR = { has_trait = arbitrary trait:arbitrary = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = arbitrary localization = trait_arbitrary } send_option = { is_shown = { scope:actor = { has_trait = just } } is_valid = { scope:recipient = { NOR = { has_trait = just trait:just = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = just localization = trait_just } send_option = { is_shown = { scope:actor = { has_trait = cynical } } is_valid = { scope:recipient = { NOR = { has_trait = cynical trait:cynical = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = cynical localization = trait_cynical } send_option = { is_shown = { scope:actor = { has_trait = zealous } } is_valid = { scope:recipient = { NOR = { has_trait = zealous trait:zealous = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = zealous localization = trait_zealous } send_option = { is_shown = { scope:actor = { has_trait = paranoid } } is_valid = { scope:recipient = { NOR = { has_trait = paranoid trait:paranoid = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = paranoid localization = trait_paranoid } send_option = { is_shown = { scope:actor = { has_trait = trusting } } is_valid = { scope:recipient = { NOR = { has_trait = trusting trait:trusting = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = trusting localization = trait_trusting } send_option = { is_shown = { scope:actor = { has_trait = compassionate } } is_valid = { scope:recipient = { NOR = { has_trait = compassionate trait:compassionate = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = compassionate localization = trait_compassionate } send_option = { is_shown = { scope:actor = { has_trait = callous } } is_valid = { scope:recipient = { NOR = { has_trait = callous trait:callous = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = callous localization = trait_callous } send_option = { is_shown = { scope:actor = { has_trait = sadistic } } is_valid = { scope:recipient = { NOR = { has_trait = sadistic trait:sadistic = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = sadistic localization = trait_sadistic } send_option = { is_shown = { scope:actor = { has_trait = stubborn } } is_valid = { scope:recipient = { NOR = { has_trait = stubborn trait:stubborn = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = stubborn localization = trait_stubborn } send_option = { is_shown = { scope:actor = { has_trait = fickle } } is_valid = { scope:recipient = { NOR = { has_trait = fickle trait:fickle = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = fickle localization = trait_fickle } send_option = { is_shown = { scope:actor = { has_trait = eccentric } } is_valid = { scope:recipient = { NOR = { has_trait = eccentric trait:eccentric = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = eccentric localization = trait_eccentric } send_option = { is_shown = { scope:actor = { has_trait = vengeful } } is_valid = { scope:recipient = { NOR = { has_trait = vengeful trait:vengeful = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = vengeful localization = trait_vengeful } send_option = { is_shown = { scope:actor = { has_trait = forgiving } } is_valid = { scope:recipient = { NOR = { has_trait = forgiving trait:forgiving = { any_opposite_trait = { scope:recipient = { has_trait = prev } } } } } } flag = forgiving localization = trait_forgiving } send_options_exclusive = yes on_send = { switch = {#save which trait was chosen as scope:target_trait trigger = yes scope:lustful = { trait:lustful = { save_scope_as = target_trait } } scope:chaste = { trait:chaste = { save_scope_as = target_trait } } scope:gluttonous = { trait:gluttonous = { save_scope_as = target_trait } } scope:temperate = { trait:temperate = { save_scope_as = target_trait } } scope:greedy = { trait:greedy = { save_scope_as = target_trait } } scope:generous = { trait:generous = { save_scope_as = target_trait } } scope:lazy = { trait:lazy = { save_scope_as = target_trait } } scope:diligent = { trait:diligent = { save_scope_as = target_trait } } scope:wrathful = { trait:wrathful = { save_scope_as = target_trait } } scope:calm = { trait:calm = { save_scope_as = target_trait } } scope:patient = { trait:patient = { save_scope_as = target_trait } } scope:impatient = { trait:impatient = { save_scope_as = target_trait } } scope:arrogant = { trait:arrogant = { save_scope_as = target_trait } } scope:humble = { trait:humble = { save_scope_as = target_trait } } scope:deceitful = { trait:deceitful = { save_scope_as = target_trait } } scope:honest = { trait:honest = { save_scope_as = target_trait } } scope:craven = { trait:craven = { save_scope_as = target_trait } } scope:brave = { trait:brave = { save_scope_as = target_trait } } scope:shy = { trait:shy = { save_scope_as = target_trait } } scope:gregarious = { trait:gregarious = { save_scope_as = target_trait } } scope:ambitious = { trait:ambitious = { save_scope_as = target_trait } } scope:content = { trait:content = { save_scope_as = target_trait } } scope:arbitrary = { trait:arbitrary = { save_scope_as = target_trait } } scope:just = { trait:just = { save_scope_as = target_trait } } scope:cynical = { trait:cynical = { save_scope_as = target_trait } } scope:zealous = { trait:zealous = { save_scope_as = target_trait } } scope:paranoid = { trait:paranoid = { save_scope_as = target_trait } } scope:trusting = { trait:trusting = { save_scope_as = target_trait } } scope:compassionate = { trait:compassionate = { save_scope_as = target_trait } } scope:callous = { trait:callous = { save_scope_as = target_trait } } scope:sadistic = { trait:sadistic = { save_scope_as = target_trait } } scope:stubborn = { trait:stubborn = { save_scope_as = target_trait } } scope:fickle = { trait:fickle = { save_scope_as = target_trait } } scope:eccentric = { trait:eccentric = { save_scope_as = target_trait } } scope:vengeful = { trait:vengeful = { save_scope_as = target_trait } } scope:forgiving = { trait:forgiving = { save_scope_as = target_trait } } fallback = { scope:actor = { random_character_trait = { limit = { has_trait_category = personality } save_scope_as = target_trait } } } } } on_accept = { scope:actor = { # Trait you're trying to make your ward gained is saved as scope:target_trait trigger_event = bp2_character_interaction.1001 show_as_tooltip = { add_prestige = minor_prestige_loss add_stress = minor_stress_gain add_opinion = { target = scope:recipient modifier = pleased_opinion opinion = 20 } } } scope:recipient = { show_as_tooltip = { switch = {#save which trait was chosen as scope:target_trait trigger = yes scope:lustful = { trait:lustful = { save_scope_as = target_trait } } scope:chaste = { trait:chaste = { save_scope_as = target_trait } } scope:gluttonous = { trait:gluttonous = { save_scope_as = target_trait } } scope:temperate = { trait:temperate = { save_scope_as = target_trait } } scope:greedy = { trait:greedy = { save_scope_as = target_trait } } scope:generous = { trait:generous = { save_scope_as = target_trait } } scope:lazy = { trait:lazy = { save_scope_as = target_trait } } scope:diligent = { trait:diligent = { save_scope_as = target_trait } } scope:wrathful = { trait:wrathful = { save_scope_as = target_trait } } scope:calm = { trait:calm = { save_scope_as = target_trait } } scope:patient = { trait:patient = { save_scope_as = target_trait } } scope:impatient = { trait:impatient = { save_scope_as = target_trait } } scope:arrogant = { trait:arrogant = { save_scope_as = target_trait } } scope:humble = { trait:humble = { save_scope_as = target_trait } } scope:deceitful = { trait:deceitful = { save_scope_as = target_trait } } scope:honest = { trait:honest = { save_scope_as = target_trait } } scope:craven = { trait:craven = { save_scope_as = target_trait } } scope:brave = { trait:brave = { save_scope_as = target_trait } } scope:shy = { trait:shy = { save_scope_as = target_trait } } scope:gregarious = { trait:gregarious = { save_scope_as = target_trait } } scope:ambitious = { trait:ambitious = { save_scope_as = target_trait } } scope:content = { trait:content = { save_scope_as = target_trait } } scope:arbitrary = { trait:arbitrary = { save_scope_as = target_trait } } scope:just = { trait:just = { save_scope_as = target_trait } } scope:cynical = { trait:cynical = { save_scope_as = target_trait } } scope:zealous = { trait:zealous = { save_scope_as = target_trait } } scope:paranoid = { trait:paranoid = { save_scope_as = target_trait } } scope:trusting = { trait:trusting = { save_scope_as = target_trait } } scope:compassionate = { trait:compassionate = { save_scope_as = target_trait } } scope:callous = { trait:callous = { save_scope_as = target_trait } } scope:sadistic = { trait:sadistic = { save_scope_as = target_trait } } scope:stubborn = { trait:stubborn = { save_scope_as = target_trait } } scope:fickle = { trait:fickle = { save_scope_as = target_trait } } scope:eccentric = { trait:eccentric = { save_scope_as = target_trait } } scope:vengeful = { trait:vengeful = { save_scope_as = target_trait } } scope:forgiving = { trait:forgiving = { save_scope_as = target_trait } } } if = { limit = { exists = scope:target_trait } add_trait = scope:target_trait } add_opinion = { target = scope:actor modifier = admiration_opinion opinion = 20 } } } } on_decline = { scope:actor = { # Trait you're trying to make your ward gained is saved as scope:target_trait trigger_event = bp2_character_interaction.1002 show_as_tooltip = { add_prestige = minor_prestige_loss add_stress = medium_stress_gain add_opinion = { target = scope:recipient modifier = disappointed_opinion opinion = -20 } } } scope:recipient = { show_as_tooltip = { add_opinion = { target = scope:actor modifier = confused_opinion opinion = -20 } } } } auto_accept = no ai_accept = { base = 0 # Try to make it 0 for most interactions opinion_modifier = { # Opinion Factor who = scope:recipient opinion_target = scope:actor multiplier = 0.5 desc = AI_OPINION_REASON } modifier = { # Perk boost desc = influence_children_groomed_to_rule_perk_tt trigger = { scope:actor = { has_perk = groomed_to_rule_perk } } add = groomed_to_rule_value } modifier = { #more likely if you already have something in common add = { value = 5 if = { limit = { number_of_personality_traits_in_common = { target = scope:recipient value = 2 } } multiply = 2 } else_if = { limit = { number_of_personality_traits_in_common = { target = scope:recipient value = 3 } } multiply = 3 } } number_of_personality_traits_in_common = { target = scope:recipient value >= 1 } desc = we_are_alike_tt } modifier = { #less likely if you already have opposite traits add = { value = -5 if = { limit = { scope:recipient = { number_of_opposing_personality_traits = { target = scope:actor value = 2 } } } multiply = 2 } else_if = { limit = { scope:recipient = { number_of_opposing_personality_traits = { target = scope:actor value = 3 } } } multiply = 3 } } scope:recipient = { number_of_opposing_personality_traits = { target = scope:actor value >= 1 } } desc = we_are_NOT_alike_tt } modifier = { #adding your knowledge add = { value = scope:actor.learning multiply = 0.5 } desc = HAS_LEARNING_SKILL_REASON } modifier = { #adding your oratory skills add = { value = scope:actor.diplomacy multiply = 0.5 } desc = HAS_DIPLOMACY_SKILL_REASON } modifier = { #more likely with a Wet Nurse employed exists = scope:actor.court_position:wet_nurse_court_position add = 10 desc = HAS_WET_NURSE_REASON } modifier = { #more likely if chosen trait is a virtue in recipients faith add = 10 switch = { trigger = yes scope:sadistic = { scope:recipient.faith = { trait_is_virtue = trait:sadistic } } scope:lustful = { scope:recipient.faith = { trait_is_virtue = trait:lustful } } scope:chaste = { scope:recipient.faith = { trait_is_virtue = trait:chaste } } scope:gluttonous = { scope:recipient.faith = { trait_is_virtue = trait:gluttonous } } scope:temperate = { scope:recipient.faith = { trait_is_virtue = trait:temperate } } scope:greedy = { scope:recipient.faith = { trait_is_virtue = trait:greedy } } scope:generous = { scope:recipient.faith = { trait_is_virtue = trait:generous } } scope:lazy = { scope:recipient.faith = { trait_is_virtue = trait:lazy } } scope:diligent = { scope:recipient.faith = { trait_is_virtue = trait:diligent } } scope:wrathful = { scope:recipient.faith = { trait_is_virtue = trait:wrathful } } scope:calm = { scope:recipient.faith = { trait_is_virtue = trait:calm } } scope:patient = { scope:recipient.faith = { trait_is_virtue = trait:patient } } scope:impatient = { scope:recipient.faith = { trait_is_virtue = trait:impatient } } scope:arrogant = { scope:recipient.faith = { trait_is_virtue = trait:arrogant } } scope:humble = { scope:recipient.faith = { trait_is_virtue = trait:humble } } scope:deceitful = { scope:recipient.faith = { trait_is_virtue = trait:deceitful } } scope:honest = { scope:recipient.faith = { trait_is_virtue = trait:honest } } scope:craven = { scope:recipient.faith = { trait_is_virtue = trait:craven } } scope:brave = { scope:recipient.faith = { trait_is_virtue = trait:brave } } scope:shy = { scope:recipient.faith = { trait_is_virtue = trait:shy } } scope:gregarious = { scope:recipient.faith = { trait_is_virtue = trait:gregarious } } scope:ambitious = { scope:recipient.faith = { trait_is_virtue = trait:ambitious } } scope:content = { scope:recipient.faith = { trait_is_virtue = trait:content } } scope:arbitrary = { scope:recipient.faith = { trait_is_virtue = trait:arbitrary } } scope:just = { scope:recipient.faith = { trait_is_virtue = trait:just } } scope:cynical = { scope:recipient.faith = { trait_is_virtue = trait:cynical } } scope:zealous = { scope:recipient.faith = { trait_is_virtue = trait:zealous } } scope:paranoid = { scope:recipient.faith = { trait_is_virtue = trait:paranoid } } scope:trusting = { scope:recipient.faith = { trait_is_virtue = trait:trusting } } scope:compassionate = { scope:recipient.faith = { trait_is_virtue = trait:compassionate } } scope:callous = { scope:recipient.faith = { trait_is_virtue = trait:callous } } scope:stubborn = { scope:recipient.faith = { trait_is_virtue = trait:stubborn } } scope:fickle = { scope:recipient.faith = { trait_is_virtue = trait:fickle } } scope:eccentric = { scope:recipient.faith = { trait_is_virtue = trait:eccentric } } scope:vengeful = { scope:recipient.faith = { trait_is_virtue = trait:vengeful } } scope:forgiving = { scope:recipient.faith = { trait_is_virtue = trait:forgiving } } } desc = selected_virtuous_trait_tt } modifier = { #more likely if chosen trait is compatible with recipients childhood personality add = 15 switch = { trigger = yes scope:sadistic = { scope:recipient = { OR = { has_trait = curious has_trait = rowdy } } } scope:lustful = { scope:recipient = { OR = { has_trait = curious has_trait = rowdy } } } scope:chaste = { scope:recipient = { has_trait = pensive } } scope:gluttonous = { scope:recipient = { OR = { has_trait = curious has_trait = rowdy } } } scope:temperate = { scope:recipient = { OR = { has_trait = pensive has_trait = charming } } } scope:greedy = { scope:recipient = { OR = { has_trait = bossy has_trait = rowdy } } } scope:generous = { scope:recipient = { OR = { has_trait = charming has_trait = curious } } } scope:lazy = { scope:recipient = { has_trait = rowdy } } scope:diligent = { scope:recipient = { OR = { has_trait = pensive has_trait = curious } } } scope:wrathful = { scope:recipient = { OR = { has_trait = bossy has_trait = rowdy } } } scope:calm = { scope:recipient = { has_trait = pensive } } scope:patient = { scope:recipient = { has_trait = pensive } } scope:impatient = { scope:recipient = { OR = { has_trait = bossy has_trait = rowdy } } } scope:arrogant = { scope:recipient = { OR = { has_trait = bossy has_trait = rowdy } } } scope:humble = { scope:recipient = { has_trait = pensive } } scope:deceitful = { scope:recipient = { OR = { has_trait = bossy has_trait = charming } } } scope:honest = { scope:recipient = { OR = { has_trait = pensive has_trait = rowdy } } } scope:craven = { scope:recipient = { has_trait = pensive } } scope:brave = { scope:recipient = { OR = { has_trait = curious has_trait = rowdy } } } scope:shy = { scope:recipient = { has_trait = pensive } } scope:gregarious = { scope:recipient = { OR = { has_trait = charming has_trait = curious } } } scope:ambitious = { scope:recipient = { OR = { has_trait = bossy has_trait = curious } } } scope:content = { scope:recipient = { OR = { has_trait = pensive has_trait = charming } } } scope:arbitrary = { scope:recipient = { OR = { has_trait = bossy has_trait = rowdy } } } scope:just = { scope:recipient = { OR = { has_trait = pensive has_trait = charming } } } scope:cynical = { scope:recipient = { OR = { has_trait = bossy has_trait = pensive } } } scope:zealous = { scope:recipient = { OR = { has_trait = charming has_trait = curious } } } scope:paranoid = { scope:recipient = { OR = { has_trait = pensive has_trait = rowdy } } } scope:trusting = { scope:recipient = { OR = { has_trait = charming has_trait = curious } } } scope:compassionate = { scope:recipient = { OR = { has_trait = charming has_trait = pensive } } } scope:callous = { scope:recipient = { OR = { has_trait = bossy has_trait = rowdy } } } scope:stubborn = { scope:recipient = { OR = { has_trait = bossy has_trait = curious } } } scope:fickle = { scope:recipient = { OR = { has_trait = curious has_trait = rowdy } } } scope:eccentric = { scope:recipient = { OR = { has_trait = bossy has_trait = charming has_trait = curious } } } scope:vengeful = { scope:recipient = { OR = { has_trait = bossy has_trait = rowdy } } } scope:forgiving = { scope:recipient = { OR = { has_trait = charming has_trait = curious } } } } desc = has_compatible_personality_tt } modifier = { #less likely if chosen trait is incompatible with recipients childhood personality add = -15 switch = { trigger = yes scope:sadistic = { scope:recipient = { NOR = { has_trait = curious has_trait = rowdy } } } scope:lustful = { scope:recipient = { NOR = { has_trait = curious has_trait = rowdy } } } scope:chaste = { scope:recipient = { NOT = { has_trait = pensive } } } scope:gluttonous = { scope:recipient = { NOR = { has_trait = curious has_trait = rowdy } } } scope:temperate = { scope:recipient = { NOR = { has_trait = pensive has_trait = charming } } } scope:greedy = { scope:recipient = { NOR = { has_trait = bossy has_trait = rowdy } } } scope:generous = { scope:recipient = { NOR = { has_trait = charming has_trait = curious } } } scope:lazy = { scope:recipient = { NOT = { has_trait = rowdy } } } scope:diligent = { scope:recipient = { NOR = { has_trait = pensive has_trait = curious } } } scope:wrathful = { scope:recipient = { NOR = { has_trait = bossy has_trait = rowdy } } } scope:calm = { scope:recipient = { NOT = { has_trait = pensive } } } scope:patient = { scope:recipient = { NOT = { has_trait = pensive } } } scope:impatient = { scope:recipient = { NOR = { has_trait = bossy has_trait = rowdy } } } scope:arrogant = { scope:recipient = { NOR = { has_trait = bossy has_trait = rowdy } } } scope:humble = { scope:recipient = { NOT = { has_trait = pensive } } } scope:deceitful = { scope:recipient = { NOR = { has_trait = bossy has_trait = charming } } } scope:honest = { scope:recipient = { NOR = { has_trait = pensive has_trait = rowdy } } } scope:craven = { scope:recipient = { NOT = { has_trait = pensive } } } scope:brave = { scope:recipient = { NOR = { has_trait = curious has_trait = rowdy } } } scope:shy = { scope:recipient = { NOT = { has_trait = pensive } } } scope:gregarious = { scope:recipient = { NOR = { has_trait = charming has_trait = curious } } } scope:ambitious = { scope:recipient = { NOR = { has_trait = bossy has_trait = curious } } } scope:content = { scope:recipient = { NOR = { has_trait = pensive has_trait = charming } } } scope:arbitrary = { scope:recipient = { NOR = { has_trait = bossy has_trait = rowdy } } } scope:just = { scope:recipient = { NOR = { has_trait = pensive has_trait = charming } } } scope:cynical = { scope:recipient = { NOR = { has_trait = bossy has_trait = pensive } } } scope:zealous = { scope:recipient = { NOR = { has_trait = charming has_trait = curious } } } scope:paranoid = { scope:recipient = { NOR = { has_trait = pensive has_trait = rowdy } } } scope:trusting = { scope:recipient = { NOR = { has_trait = charming has_trait = curious } } } scope:compassionate = { scope:recipient = { NOR = { has_trait = charming has_trait = pensive } } } scope:callous = { scope:recipient = { NOR = { has_trait = bossy has_trait = rowdy } } } scope:stubborn = { scope:recipient = { NOR = { has_trait = bossy has_trait = curious } } } scope:fickle = { scope:recipient = { NOR = { has_trait = curious has_trait = rowdy } } } scope:eccentric = { scope:recipient = { NOR = { has_trait = bossy has_trait = charming has_trait = curious } } } scope:vengeful = { scope:recipient = { NOR = { has_trait = bossy has_trait = rowdy } } } scope:forgiving = { scope:recipient = { NOR = { has_trait = charming has_trait = curious } } } } desc = has_incompatible_personality_tt } modifier = { #less likely if chosen trait is a sin in recipients faith add = -10 switch = { trigger = yes scope:sadistic = { scope:recipient.faith = { trait_is_sin = trait:sadistic } } scope:lustful = { scope:recipient.faith = { trait_is_sin = trait:lustful } } scope:chaste = { scope:recipient.faith = { trait_is_sin = trait:chaste } } scope:gluttonous = { scope:recipient.faith = { trait_is_sin = trait:gluttonous } } scope:temperate = { scope:recipient.faith = { trait_is_sin = trait:temperate } } scope:greedy = { scope:recipient.faith = { trait_is_sin = trait:greedy } } scope:generous = { scope:recipient.faith = { trait_is_sin = trait:generous } } scope:lazy = { scope:recipient.faith = { trait_is_sin = trait:lazy } } scope:diligent = { scope:recipient.faith = { trait_is_sin = trait:diligent } } scope:wrathful = { scope:recipient.faith = { trait_is_sin = trait:wrathful } } scope:calm = { scope:recipient.faith = { trait_is_sin = trait:calm } } scope:patient = { scope:recipient.faith = { trait_is_sin = trait:patient } } scope:impatient = { scope:recipient.faith = { trait_is_sin = trait:impatient } } scope:arrogant = { scope:recipient.faith = { trait_is_sin = trait:arrogant } } scope:humble = { scope:recipient.faith = { trait_is_sin = trait:humble } } scope:deceitful = { scope:recipient.faith = { trait_is_sin = trait:deceitful } } scope:honest = { scope:recipient.faith = { trait_is_sin = trait:honest } } scope:craven = { scope:recipient.faith = { trait_is_sin = trait:craven } } scope:brave = { scope:recipient.faith = { trait_is_sin = trait:brave } } scope:shy = { scope:recipient.faith = { trait_is_sin = trait:shy } } scope:gregarious = { scope:recipient.faith = { trait_is_sin = trait:gregarious } } scope:ambitious = { scope:recipient.faith = { trait_is_sin = trait:ambitious } } scope:content = { scope:recipient.faith = { trait_is_sin = trait:content } } scope:arbitrary = { scope:recipient.faith = { trait_is_sin = trait:arbitrary } } scope:just = { scope:recipient.faith = { trait_is_sin = trait:just } } scope:cynical = { scope:recipient.faith = { trait_is_sin = trait:cynical } } scope:zealous = { scope:recipient.faith = { trait_is_sin = trait:zealous } } scope:paranoid = { scope:recipient.faith = { trait_is_sin = trait:paranoid } } scope:trusting = { scope:recipient.faith = { trait_is_sin = trait:trusting } } scope:compassionate = { scope:recipient.faith = { trait_is_sin = trait:compassionate } } scope:callous = { scope:recipient.faith = { trait_is_sin = trait:callous } } scope:stubborn = { scope:recipient.faith = { trait_is_sin = trait:stubborn } } scope:fickle = { scope:recipient.faith = { trait_is_sin = trait:fickle } } scope:eccentric = { scope:recipient.faith = { trait_is_sin = trait:eccentric } } scope:vengeful = { scope:recipient.faith = { trait_is_sin = trait:vengeful } } scope:forgiving = { scope:recipient.faith = { trait_is_sin = trait:forgiving } } } desc = selected_sinful_trait_tt } modifier = { #more likely if actor is afraid of you add = intimidated_halved_reason_value scope:recipient = { target_is_liege_or_above = scope:actor has_dread_level_towards = { target = scope:actor level = 1 } } desc = INTIMIDATED_REASON } modifier = { #more likely if actor is afraid of you add = cowed_halved_reason_value scope:recipient = { target_is_liege_or_above = scope:actor has_dread_level_towards = { target = scope:actor level = 2 } } desc = COWED_REASON } modifier = { #less likely if actor already has 3 personality traits add = -50 scope:recipient = { number_of_personality_traits = 3 } desc = has_three_traits_already } } # AI ai_potential = { any_relation = { type = ward } } ai_frequency_by_tier = { barony = 0 county = 36 duchy = 12 kingdom = 12 empire = 12 hegemony = 12 } ai_targets = { ai_recipients = courtiers } ai_will_do = { base = -100 modifier = { # If the recipient is a player, do not bother sending factor = 0 scope:recipient = { is_ai = no } } modifier = { #we don't want characters running around with 4 traits add = -100 scope:recipient = { number_of_personality_traits = 3 } } modifier = { add = 50 ai_honor > 0 } modifier = { add = 50 ai_compassion > 0 } modifier = { add = 50 ai_sociability > 0 } modifier = { add = 50 ai_boldness > 0 } modifier = { add = 50 scope:paranoid = yes } } }