CK3 DatabaseCrusader Kings III · 1.20.1.2 “Crozier” · unofficial
Silk & Silverout Tue, Nov 17What's free, what needs the DLC, price →

Interaction · Diplomatic actions

Exchange Hostages

No costThe AI weighs it

Swap Hostages with the recipient as a shared assurance of mutual peace

What you need

You

To send it

  • None of these

    • Is at war with the target
    • Is allied to the target
    • Your Government is a Theocratic-type Government
    • The character you target: Government is a Theocratic-type Government
    • … already has a Hostage from your Court
    • You have already taken a Hostage from …
    • Their Hostage is already traveling to … court
  • One of these

    • Is not a landless ruler
    • or

      All of these

      • you has administrative government mechanic
      • Is not landed
      • If

        a check the game hides

        Then

        • Your house: Has the house check as house head
      • You have a domicile
  • If

    a check the game hides

    Then

    • The other character:
      • is_hostage = no
      • Is a direct vassal of the target
      • Is not landed
      • Is not a landless ruler
      • Is not married
      • Is not betrothed
      • If imprisoned:
        • imprisoner = scope:recipient
      • One of these

        • Is a child of the target
        • or

          Is a grandchild of the target
        • or

          Is a sibling of the target
        • or

          is_nibling_of = scope:recipient
      • You may not offer your Regent as a Hostage
      • If

        a check the game hides

        Then

        • The war:
          • Hostages cannot be exchanged to settle Great Holy Wars
          • Hostages cannot be used to settle a …
  • If

    a check the game hides

    Then

    • The character you send:
      • is_hostage = no
      • Is a direct vassal of you
      • Is not landed
      • Is not a landless ruler
      • Is not married
      • Is not betrothed
      • If imprisoned:
        • imprisoner = scope:actor
      • One of these

        • Is a child of you
        • or

          Is a grandchild of you
        • or

          Is a sibling of you
        • or

          is_nibling_of = scope:actor
      • You may not offer your Regent as a Hostage
      • If

        a check the game hides

        Then

        • The war:
          • Hostages cannot be exchanged to settle Great Holy Wars
          • Hostages cannot be used to settle a …
  • This action may not be taken against the Ceremonial Monarch
  • If played by the AI:
    • The character you target:
      • character_is_land_realm_neighbor = scope:actor
    • scope:actor.current_strength_with_allies_seventy_five_percent_value < scope:recipient.current_strength_with_allies_value
    • scope:recipient.current_strength_with_allies_seventy_five_percent_value < scope:actor.current_strength_with_allies_value
    • One of these

      • You:
        • has_any_cb_on = scope:recipient
      • or

        The character you target:
        • has_any_cb_on = scope:actor
    • None of these

      • The character you target:
        • One of these

          • One of these

            • Has you as potential rival
            • or

              Has you as victim
            • or

              Has you as bully
          • or

            Has you as rival
        • All of these

          • exists = scope:actor.house
          • One of these

            • Their house:
              • this != scope:actor.house
              • has_house_relation_with = scope:actor.house
              • Any house relation:
                • has_house_relation_level = feud
                • Any relation house:
                  • scope:actor.house = this
            • or

              exists = scope:return_feud_as_true_for_debug
    • None of these

      • The character you send › Any close family member:
        • Is played by a person
        • One of these

          • Is a parent of the character you send
          • or

            is_grandparent_of = scope:secondary_actor
        • this != scope:actor
      • The other character › Any close family member:
        • Is played by a person
        • One of these

          • Is a parent of the other character
          • or

            is_grandparent_of = scope:secondary_recipient
        • this != scope:recipient
      • Hostage died is scope:recipient

To see it in the menu

  • If played by the AI:
    • Highest held Title is at least County Rank
    • Is an Adult
    • Does not have “conqueror” (a variable the game's script sets)
  • The target is not you
  • None of these

    • The character you target: Government is unplayable
  • root.highest_held_title_tier > tier_barony
  • One of these

    • scope:recipient.highest_held_title_tier > tier_barony
    • or

      The target’s liege:
      • Highest held Title is more than Barony Rank
      • Any close family member:
        • Is the target
        • All of these

          • is_hostage = no
          • NOT = { this = scope:recipient.liege }
          • liege ?= scope:recipient.liege
          • Is not landed
          • Is not a landless ruler
          • Is not married
          • Is not betrothed
          • If imprisoned:
            • imprisoner = scope:recipient.liege
          • One of these

            • is_child_of = scope:recipient.liege
            • or

              is_grandchild_of = scope:recipient.liege
            • or

              is_sibling_of = scope:recipient.liege
            • or

              is_nibling_of = scope:recipient.liege
          • NOT = { exists = var:hostage_travelling_to_warden }
          • NOT = { exists = var:guardian_travelling_to_ward }
          • NOT = { exists = var:ward_travelling_to_guardian }
          • You may not offer your Regent as a Hostage
          • If

            a check the game hides

            Then

            • The war:
              • Hostages cannot be exchanged to settle Great Holy Wars
              • Hostages cannot be used to settle a …
  • None of these

  • If

    • root.top_liege != scope:actor
    • Your top liege: Government uses Merit

    Then

    • Not all of these

    • NOT = { scope:recipient = scope:actor.top_liege }

The character you target

  • One of these

    • Is not a landless ruler
    • or

      All of these

      • they has administrative government mechanic
      • Is not landed
      • If

        a check the game hides

        Then

        • Their house: Has the house check as house head
      • Has a domicile

The character you send

  • Already under negotiation to become someone's Hostage
  • If an Adult:
    • One of these

      • Hostage refuses to cooperate
      • or

        Has the Trait: Loyal

The other character

  • Already under negotiation to become someone's Hostage
  • If an Adult:
    • One of these

      • Hostage refuses to cooperate
      • or

        Has the Trait: Loyal

Which character you can pick

  • Already under negotiation to become someone's Hostage

Exchange Hostages is a diplomatic character interaction in Crusader Kings III. You need: This action may not be taken against the Ceremonial Monarch. The AI weighs it. Reasons the AI weighs include … Culture (+25), … Culture (+25), They is your Friend (+15) and 31 more. Patch 1.20.1.2, from game/common/character_interactions/05_bp2_interactions.txt.

for a guide, post or blog
Quick answers (2)
What are the requirements for Exchange Hostages in CK3?
You: This action may not be taken against the Ceremonial Monarch. (patch 1.20.1.2)
How do I get the AI to accept Exchange Hostages?
The AI weighs it. Its reasons: The recipient's Boldness, The recipient's Compassion, The recipient's Greed, The recipient's Honor, Crown Authority makes disobeying Liege dishonorable, The recipient's Rationality, The recipient's Zeal, … Culture +25, … Culture +25, … Opinion of …, … Opinion of …, They is your Friend +15, They is your Best Friend +30, They is your Lover +15, They is your Soulmate +30, They is your Rival -25, They is your Nemesis -50, Intimidated by you, Terrified of you, The character you send's value as a Hostage, The other character's value as a Hostage, Difference in Rank, Difference in Rank, Not neighboring Realms -20, Distant realm -20, Has Casus Bellis against you -15, Has Claims on your Titles, Protected by their Liege -50, You are a mere Vassal, Similar Military Strength +10, Relative Military Strength (…: … vs. …: …), Relative Military Strength (…: … vs. …: …), Allies Military Strength (…: … vs. …: …), Twice as strong and valid Casus Belli against the recipient +25, … Cultural Acceptance of … -5, … Cultural Acceptance of … -10, … Cultural Acceptance of … -15, … consider … Evil -15, … consider … Hostile -10, … consider … Astray -5, … Equitable Tradition +25, … Esteemed Hospitality Tradition +25, … Loyal Subjects Tradition +25, Allowed a Hostage to die -25, Allowed my Hostage to die -100, Killed my Hostage -200, You already made a Truce with the recipient -20, Fighting a War +15, The recipient already has a Hostage from your Court +50, Attacked Warden -50, Attacked Home Court -50, Weak Hook used +40, Did not return a Hostage on adulthood -25 and Conqueror -1,000.

Will they accept?

The AI adds these up and accepts above zero. Reasons in italics are the script's, with no label in the game.

ReasonAmount
Base-25
The recipient's Boldness
when
  • scope:recipient.ai_boldness < 0
their ai boldness × -0.25
The recipient's Compassion
when
  • scope:recipient.ai_compassion > 0
their ai compassion × -0.25
The recipient's Greed
when
  • scope:recipient.ai_greed != 0
varies
The recipient's Honor
when
  • scope:recipient.ai_honor != 0
their ai honor × 0.5
Crown Authority makes disobeying Liege dishonorable
when
  • scope:recipient.ai_honor > 0
  • has_realm_law_flag = vassal_refusal_is_treason
  • The character you target: Is a vassal of you
their ai honor × 0.5
The recipient's Rationality
when
  • scope:recipient.ai_rationality != 0
their ai rationality × 0.5
The recipient's Zeal
when
  • scope:recipient.ai_zeal > 0
  • The target’s rite:
    • rite_hostility_level = { target = scope:actor.rite value >= faith_hostile_level }
varies
… Culture
when
+25
… Culture
when
  • The character you target:
+25
… Opinion of …varies
… Opinion of …varies
They is your Friend
when
  • The character you target:
    • Has you as friend
    • Does not have you as best friend
+15
They is your Best Friend
when
  • The character you target: Has you as best friend
+30
They is your Lover
when
  • The character you target:
    • Has you as lover
    • Does not have you as soulmate
+15
They is your Soulmate
when
  • The character you target: Has you as soulmate
+30
They is your Rival
when
  • The character you target:
    • Has you as rival
    • Does not have you as nemesis
-25
They is your Nemesis
when
  • The character you target: Has you as nemesis
-50
Intimidated by you
when
  • The character you target:
    • has_dread_level_towards = { target = scope:actor level = 1 }
intimidated_halved_reason_value
Terrified of you
when
  • The character you target:
    • has_dread_level_towards = { target = scope:actor level = 2 }
cowed_halved_reason_value
The character you send's value as a Hostageinteraction_actor_hostage_value
The other character's value as a Hostageinteraction_recipient_hostage_value
Difference in Rank
when
  • scope:recipient.highest_held_title_tier < scope:actor.highest_held_title_tier
varies
Difference in Rank
when
  • scope:recipient.highest_held_title_tier > scope:actor.highest_held_title_tier
varies
Not neighboring Realms
when
  • Your top liege is not the target’s
  • None of these

    • You:
      • character_is_land_realm_neighbor = scope:recipient
    • The character you target:
      • character_is_land_realm_neighbor = scope:actor
-20
Distant realm
when
  • NOT = { character_is_realm_neighbor = scope:recipient }
  • NOT = { top_liege = scope:recipient.top_liege }
  • The character you target:
    • None of these

      • character_is_land_realm_neighbor = scope:actor
      • Their capital province:
        • squared_distance = { target = scope:actor.capital_province value < 200000 }
-20
Has Casus Bellis against you
when
  • The character you target:
    • has_any_cb_on = scope:actor
-15
Has Claims on your Titles
when
  • Any held title: Title tier at least County
  • The character you target:
    • has_claim_on = scope:title_temp
varies
Protected by their Liege
when
  • NOT = { scope:recipient.liege ?= scope:actor }
  • NOT = { root.liege ?= scope:recipient.liege }
  • The character you target: Is an Independent Ruler
-50
You are a mere Vassal
when
varies
Similar Military Strength
when
  • NOT = { root.current_strength_ninety_percent_value > scope:recipient.current_military_strength }
  • NOT = { root.current_military_strength < scope:recipient.current_strength_ninety_percent_value }
+10
Relative Military Strength (…: … vs. …: …)
when
  • root.current_strength_ninety_percent_value > scope:recipient.current_military_strength
varies
Relative Military Strength (…: … vs. …: …)
when
  • root.current_military_strength < scope:recipient.current_strength_ninety_percent_value
varies
Allies Military Strength (…: … vs. …: …)
when
  • One of these

    • You › Any ally:
      • exists = this
    • or

      The character you target › Any ally:
      • exists = this
  • One of these

    • root.current_strength_with_allies_value >= scope:recipient.current_strength_ninety_percent_value
    • or

      scope:recipient.current_strength_with_allies_value >= scope:actor.current_strength_ninety_percent_value
varies
Twice as strong and valid Casus Belli against the recipient
when
  • has_any_cb_on = scope:recipient
  • root.current_strength_with_allies_fifty_percent_value > scope:recipient.current_strength_with_allies_value
+25
… Cultural Acceptance of …
when
  • The target’s culture:
    • cultural_acceptance = { target = scope:actor.culture value < 75 }
    • cultural_acceptance = { target = scope:actor.culture value >= 50 }
-5
… Cultural Acceptance of …
when
  • The target’s culture:
    • cultural_acceptance = { target = scope:actor.culture value < 50 }
    • cultural_acceptance = { target = scope:actor.culture value >= 25 }
-10
… Cultural Acceptance of …
when
  • The target’s culture:
    • cultural_acceptance = { target = scope:actor.culture value < 25 }
-15
… consider … Evil
when
  • The target’s rite:
    • rite_hostility_level = { target = scope:actor.rite value = faith_evil_level }
-15
… consider … Hostile
when
  • The target’s rite:
    • rite_hostility_level = { target = scope:actor.rite value = faith_hostile_level }
-10
… consider … Astray
when
  • The target’s rite:
    • rite_hostility_level = { target = scope:actor.rite value = faith_astray_level }
-5
… Equitable Tradition
when
  • The target’s culture: Their culture has the tradition Equitable
+25
… Esteemed Hospitality Tradition
when
+25
… Loyal Subjects Tradition
when
  • The character you target:
    • Is a vassal of you
    • Their culture: The culture has the tradition Loyal Subjects
+25
Allowed a Hostage to die
when
  • The character you target:
    • Let my hostage die is not scope:actor
    • NOT = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } }
-25
Allowed my Hostage to die
when
  • The character you target:
    • Let my hostage die is scope:actor
    • NOT = { has_opinion_modifier = { target = scope:actor modifier = killed_hostage_opinion } }
-100
Killed my Hostage
when
  • The character you target: Has the opinion “Killed Hostage” of you
-200
You already made a Truce with the recipient
when
  • has_truce = scope:recipient
-20
Fighting a War
when
  • The character you target: Is at War
+15
The recipient already has a Hostage from your Court
when
  • The character you target › Any warden hostage:
    • home_court ?= scope:actor
+50
Attacked Warden
when
-50
Attacked Home Court
when
-50
Weak Hook used
when
+40
Did not return a Hostage on adulthood
when
  • The other character: Is a child
-25
Conqueror
when
  • The character you target: Has “conqueror” (a variable the game's script sets)
-1,000
Acceptance (ai_accept) (199 lines of game script)
base = -25
bp2_hostage_exchange_personality_modifier = yes
opinion_modifier = {
	who = scope:recipient
	opinion_target = scope:actor
	multiplier = 0.5
	desc = AI_OPINION_REASON
}
opinion_modifier = {
	who = scope:recipient
	opinion_target = scope:secondary_recipient
	multiplier = -0.1
	desc = AI_OPINION_REASON
}
bp2_hostage_relation_modifier = yes
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
}
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
	desc = HOSTAGE_VALUE_RECIPIENT_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 = {
	SENDER = scope:actor
	RECEIVER = scope:recipient
}
bp2_hostage_relative_strength_modifier = {
	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
}
bp2_hostage_culture_faith_modifier = {
	SENDER = scope:actor
	RECEIVER = scope:recipient
}
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
}
modifier = {
	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 = {
	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 = {
	scope:recipient = {
		has_opinion_modifier = {
			target = scope:actor
			modifier = killed_hostage_opinion
		}
	}
	desc = HOSTAGE_KILLED_REASON
	add = -200
}
modifier = {
	scope:actor ?= {
		has_truce = scope:recipient
	}
	desc = HOSTAGE_ACTOR_EXISTING_TRUCE_REASON
	add = -20
}
modifier = {
	scope:recipient ?= {
		is_at_war = yes
	}
	desc = HOSTAGE_AT_WAR_REASON
	add = 15
}
modifier = {
	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 = {
	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 = {
	scope:recipient ?= {
		has_variable = conqueror
	}
	desc = NO_FRIVOLOUS_ACTIVITIES_REASON
	add = -1000
}

As written in game/common/character_interactions/05_bp2_interactions.txt.

What happens

If they accept

  • Hostages must first Travel to the Warden's court
  • Wardens at War with Home Courts may freely execute Hostages
  • Home Courts and Wardens suffer penalties for attacking each other
  • scope:hostage_1:
    • If any relation › Every relation:
      • The current guardian scope:
        • remove_relation_ward = scope:hostage_1
        • If

          • is_foreign_court_guest = yes
          • None of these

            • host = liege
            • is_playable_character = { }
            • Any relation:
              • is_playable_character = { }
              • this = scope:current_guardian_scope.host

          Then

          • return_to_court = yes
      • If never › scope:hostage_1:
        • return_ward_travel_effect = { }
      • Otherwise:
        • If

          a check the game hides

          Then

          • The current guardian scope:
            • If

              Then

              • remove_opinion = { modifier = guardian_of_heir_opinion target = scope:hostage_1.liege }

              Else if

              • Has the opinion “Guardian of Your Relative”
              • None of these

                • Any relation:
                  • is_close_family_of = scope:hostage_1.liege

              Then

              • remove_opinion = { modifier = guardian_of_relative_opinion target = scope:hostage_1.liege }
            • If

              Then

              • remove_opinion = { modifier = guardian_of_heir_parochial_opinion target = scope:hostage_1.liege }

              Else if

              • Has the opinion “Parochial Guardian of Your Relative”
              • None of these

                • Any relation:
                  • is_close_family_of = scope:hostage_1.liege

              Then

              • remove_opinion = { modifier = guardian_of_relative_parochial_opinion target = scope:hostage_1.liege }
          • scope:hostage_1:
            • If

              a check the game hides

              Then

              • var:guardian_liege:
                • If

                  Then

                  • remove_opinion = { modifier = guardian_of_heir_opinion target = scope:hostage_1.liege }

                  Else if

                  • Has the opinion “Guardian of Your Relative”
                  • None of these

                    • Any relation:
                      • is_close_family_of = scope:hostage_1.liege

                  Then

                  • remove_opinion = { modifier = guardian_of_relative_opinion target = scope:hostage_1.liege }
                • If

                  Then

                  • remove_opinion = { modifier = guardian_of_heir_parochial_opinion target = scope:hostage_1.liege }

                  Else if

                  • Has the opinion “Parochial Guardian of Your Relative”
                  • None of these

                    • Any relation:
                      • is_close_family_of = scope:hostage_1.liege

                  Then

                  • remove_opinion = { modifier = guardian_of_relative_parochial_opinion target = scope:hostage_1.liege }
    • Else, if any relation › Every relation:
      • scope:hostage_1:
        • remove_relation_ward = scope:current_ward_scope
        • If

          • is_foreign_court_guest = yes
          • None of these

            • host = liege
            • is_playable_character = { }
            • Any relation:
              • is_playable_character = { }
              • this = scope:hostage_1.host

          Then

          • return_to_court = yes
      • If

        • always = yes

        Then

        • The current ward scope:
          • return_ward_travel_effect = { }

        Otherwise

        • If

          a check the game hides

          Then

          • scope:hostage_1:
            • If

              Then

              • remove_opinion = { modifier = guardian_of_heir_opinion target = scope:current_ward_scope.liege }

              Else if

              • Has the opinion “Guardian of Your Relative”
              • None of these

                • Any relation:
                  • is_close_family_of = scope:current_ward_scope.liege

              Then

              • remove_opinion = { modifier = guardian_of_relative_opinion target = scope:current_ward_scope.liege }
            • If

              Then

              • remove_opinion = { modifier = guardian_of_heir_parochial_opinion target = scope:current_ward_scope.liege }

              Else if

              • Has the opinion “Parochial Guardian of Your Relative”
              • None of these

                • Any relation:
                  • is_close_family_of = scope:current_ward_scope.liege

              Then

              • remove_opinion = { modifier = guardian_of_relative_parochial_opinion target = scope:current_ward_scope.liege }
          • The current ward scope:
            • If

              a check the game hides

              Then

              • var:guardian_liege:
                • If

                  Then

                  • remove_opinion = { modifier = guardian_of_heir_opinion target = scope:current_ward_scope.liege }

                  Else if

                  • … (more in the script below)
                • … (more in the script below)
    • … (more in the script below)
  • … (more in the script below)

If they refuse

Options when sending

  • Use a Hook

Events it fires: char_interaction.0311

• the game's own tooltip text · ◦ our reading of the script line · code the script where neither exists

Who can use it and sees it (is_available, is_shown) (56 lines of game script)
is_available = trigger_if = {
	limit = {
		is_ai = yes
	}
	highest_held_title_tier >= tier_county
	is_adult = yes
	NOT = {
		has_variable = conqueror
	}
}
is_shown = scope:recipient != scope:actor
NOT = {
	scope:recipient = {
		government_has_flag = government_is_herder
	}
}
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
			bp2_valid_to_offer_as_hostage_trigger = {
				SENDER = scope:recipient.liege
			}
		}
	}
}
NOR = {
	scope:actor = {
		government_has_flag = government_is_landless_adventurer
	}
	scope:recipient = {
		government_has_flag = government_is_landless_adventurer
	}
}
trigger_if = {
	limit = {
		scope:actor.top_liege != scope:actor
		scope:actor.top_liege ?= {
			government_has_flag = government_has_merit
		}
	}
	NAND = {
		scope:actor = {
			government_has_flag = government_has_merit
		}
		scope:recipient = {
			government_has_flag = government_has_merit
		}
	}
	NOT = {
		scope:recipient = scope:actor.top_liege
	}
}

As written in game/common/character_interactions/05_bp2_interactions.txt.

Can be sent when (is_valid…) (215 lines of game script)
scope:actor = {
	NOR = {
		is_at_war_with = scope:recipient
		is_allied_to = scope:recipient
		government_has_flag = government_is_theocracy
		scope:recipient = {
			government_has_flag = government_is_theocracy
		}
		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
	}
	trigger_if = {
		limit = {
			is_ai = yes
			exists = scope:secondary_actor
		}
		NOT = {
			scope:secondary_actor = {
				has_character_flag = ai_should_not_demand_hostage
			}
		}
	}
	trigger_else = {
		scope:recipient = {
			custom_description = {
				text = basic_valid_hostage_to_demand
				subject = scope:actor
				object = scope:recipient
				any_close_family_member = {
					bp2_valid_to_offer_as_hostage_trigger = {
						SENDER = scope:recipient
					}
				}
			}
		}
	}
	trigger_if = {
		limit = {
			is_ai = yes
			exists = scope:secondary_actor
		}
		NOT = {
			scope:secondary_actor = {
				has_character_flag = ai_should_not_offer_hostage
			}
		}
	}
	trigger_else = {
		custom_description = {
			text = basic_valid_hostage_to_offer
			object = scope:recipient
			subject = scope:actor
			any_close_family_member = {
				bp2_valid_to_offer_as_hostage_trigger = {
					SENDER = scope:actor
				}
			}
		}
	}
}
scope:recipient = {
	OR = {
		is_landless_ruler = no
		is_landless_administrative = yes
	}
}
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
}
scope:actor = {
	trigger_if = {
		limit = {
			is_ai = yes
		}
		bp2_valid_to_exchange_hostage_ai_trigger = yes
		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
				}
			}
			var:hostage_died ?= scope:recipient
		}
	}
}
scope:secondary_actor = {
	custom_tooltip = {
		text = hostage_already_offered_awaiting_response_tt
		NOT = {
			has_character_flag = under_offer_as_hostage_flag
		}
	}
	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 = {
	custom_tooltip = {
		text = hostage_already_offered_awaiting_response_tt
		NOT = {
			has_character_flag = under_offer_as_hostage_flag
		}
	}
	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
		}
	}
}

As written in game/common/character_interactions/05_bp2_interactions.txt.

Effects (on_send, on_accept, on_decline) (80 lines of game script)
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
	}
}
on_accept = 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 = {
	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
}

As written in game/common/character_interactions/05_bp2_interactions.txt.

Category
Diplomatic actions
Again on the same character
after 3 years
In the menu
under More…
ID
exchange_hostage_interaction

Source: game/common/character_interactions/05_bp2_interactions.txt and the English localisation, Crusader Kings III 1.20.1.2. “You” is the character who sends it (scope:actor, or a puppet acting for you); “the character you target” is the recipient.

Spotted a mistake on this page?