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

Enforce Truce

No costThe AI weighs it

Enforce a Truce to end a War involving an Independent or same Realm Involved Ruler of a lower Rank

What you need

You

  • If played by the AI: Is not imprisoned
  • One of these

    • All of these

      • You:
        • Any character struggle:
          • involvement = involved
          • has_struggle_phase_parameter = unlocks_enforce_truces_interaction
        • primary_title.tier >= tier_duchy
      • The character you target:
        • Any character struggle:
          • involvement = involved
          • has_struggle_phase_parameter = unlocks_enforce_truces_interaction
        • tier_difference = { target = scope:actor value <= 0 }
    • or

      All of these

      • You:
        • exists = house
        • primary_title.tier >= tier_duchy
        • Your house: The House their has the Compromise modifier
      • The character you target:
        • exists = house
        • Their house: The House their has the Compromise modifier
        • tier_difference = { target = scope:actor value <= 0 }

The character you target

  • Is at War
  • If

    • You › Any character struggle:
      • involvement = involved
      • has_struggle_phase_parameter = unlocks_enforce_truces_interaction
      • The character you target › Any character struggle:
        • involvement = involved

    Then

    • Any character struggle:
      • involvement = involved
      • has_struggle_phase_parameter = unlocks_enforce_truces_interaction

    Otherwise

    • Their house: The House their has the Compromise modifier
  • … or … enemy must be an Independent Ruler or of equal or lower Rank in the same Realm

Which character you can pick

  • The target:
    • Is war leader in the war against the target
    • is_civil_war = no
    • Not: The war’s casus belli is Border Raid
    • If

      • The character you target › Any character struggle:
        • involvement = involved

      Then

      • If

        • Has the target as the war's attacker

        Then

        • primary_defender = { fp2_struggle_enforce_truce_war_leader_trigger = yes }

        Otherwise

        • primary_attacker = { fp2_struggle_enforce_truce_war_leader_trigger = yes }

      Otherwise

      • The character you target › Their capital county’s province: Is in the Iberia region

Enforce Truce is a diplomatic character interaction in Crusader Kings III. The character you target needs: Is at War. The AI weighs it. Reasons the AI weighs include War has only just begun (-25), War is dragging on (+25), The recipient is defending … (+25) and 10 more. Patch 1.20.1.2, from game/common/character_interactions/03_fp2_interactions.txt.

for a guide, post or blog
Quick answers (2)
What are the requirements for Enforce Truce in CK3?
The character you target: Is at War. (patch 1.20.1.2)
How do I get the AI to accept Enforce Truce?
The AI weighs it. Its reasons: War has only just begun -25, War is dragging on +25, The recipient is defending … +25, The recipient is your Ally +25, The recipient is your Vassal or below +25, The recipient is losing the War +25, The recipient is heavily outnumbered +25, The recipient outnumbers their enemy -25, Your Army is too small to enforce this Truce -50, The recipient is fighting a Holy War -25, You are the recipient's Head of Faith +25, You are the recipient's Dynasty Head +50, You are the recipient's House Head +25 and … Opinion of ….

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-50
War has only just begun
when
  • If

    a check the game hides

    Then

    • scope:target.war_days < 180

    Otherwise

    • Never
-25
War is dragging on
when
  • If

    a check the game hides

    Then

    • scope:target.war_days > 1095

    Otherwise

    • Never
+25
The recipient is defending …
when
  • If

    a check the game hides

    Then

    • scope:recipient = scope:target.primary_defender

    Otherwise

    • Never
+25
The recipient is your Ally
when
  • The character you target: Is allied to you
+25
The recipient is your Vassal or below
when
  • The character you target: Is a vassal (or below) of you
+25
The recipient is losing the War
when
  • If

    a check the game hides

    Then

    • If

      • scope:recipient = scope:target.primary_defender

      Then

      • The target: Attacker war score at least 25

      Otherwise

      • The target: Defender war score at least 25

    Otherwise

    • Never
+25
The recipient is heavily outnumbered
when
  • If a check the game hides passes: the same again (3 lines)
    • The target:
      • If

        • The character you target:
          • is_attacker_in_war = prev

        Then

        • War defender total strength halved more than war attacker total strength value

        Otherwise

        • War attacker total strength halved more than war defender total strength value

    Otherwise

    • Any character war:
      • If

        • The character you target:
          • is_attacker_in_war = prev

        Then

        • War defender total strength halved more than war attacker total strength value

        Otherwise

        • War attacker total strength halved more than war defender total strength value
+25
The recipient outnumbers their enemy
when
  • If a check the game hides passes: the same again (3 lines)
    • The target:
      • If

        • The character you target:
          • is_attacker_in_war = prev

        Then

        • War attacker total strength halved more than war defender total strength value

        Otherwise

        • War defender total strength halved more than war attacker total strength value

    Otherwise

    • Any character war:
      • If

        • The character you target:
          • is_attacker_in_war = prev

        Then

        • War attacker total strength halved more than war defender total strength value

        Otherwise

        • War defender total strength halved more than war attacker total strength value
-25
Your Army is too small to enforce this Truce
when
  • If

    a check the game hides

    Then

    • One of these

      • scope:target.war_attacker_total_strength_halved_value > scope:actor.max_military_strength
      • or

        scope:target.war_defender_total_strength_halved_value > scope:actor.max_military_strength

    Otherwise

    • Never
-50
The recipient is fighting a Holy War
when
  • If

    a check the game hides

    Then

    • The character you target: Does not have the Trait: Cynical
    • The target:
      • One of these

        • The war’s casus belli is Minor Holy
        • or

          The war’s casus belli is Holy
        • or

          The war’s casus belli is Major Holy

    Otherwise

    • Never
-25
You are the recipient's Head of Faith
when
  • scope:recipient.faith.religious_head = scope:actor
+25
You are the recipient's Dynasty Head
when
  • scope:recipient.dynasty.dynast = scope:actor
+50
You are the recipient's House Head
when
  • scope:recipient.dynasty.dynast != scope:actor
  • scope:recipient.house.house_head = scope:actor
+25
… Opinion of …varies
Their personality (AI values: boldness -0.5)varies
Acceptance (ai_accept) (179 lines of game script)
base = -50
modifier = {
	add = -25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target.war_days < 180
	}
	trigger_else = {
		always = no
	}
	desc = ET_AI_WAR_NEW_REASON
}
modifier = {
	add = 25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target.war_days > 1095
	}
	trigger_else = {
		always = no
	}
	desc = ET_AI_WAR_OLD_REASON
}
modifier = {
	add = 25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:recipient = scope:target.primary_defender
	}
	trigger_else = {
		always = no
	}
	desc = OA_AI_DEFENSIVE_WAR_REASON
}
modifier = {
	add = 25
	scope:recipient = {
		is_allied_to = scope:actor
	}
	desc = ET_AI_ALLY_REASON
}
modifier = {
	add = 25
	scope:recipient = {
		target_is_liege_or_above = scope:actor
	}
	desc = ET_AI_LIEGE_REASON
}
modifier = {
	add = 25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		trigger_if = {
			limit = {
				scope:recipient = scope:target.primary_defender
			}
			scope:target = {
				attacker_war_score >= fp2_enforce_truce_war_score_value
			}
		}
		trigger_else = {
			scope:target = {
				defender_war_score >= fp2_enforce_truce_war_score_value
			}
		}
	}
	trigger_else = {
		always = no
	}
	desc = OA_AI_LOSING_WAR_REASON
}
modifier = {
	add = 25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target = {
			fp2_struggle_contract_assistance_war_outnumbered_trigger = yes
		}
	}
	trigger_else = {
		any_character_war = {
			fp2_struggle_contract_assistance_war_outnumbered_trigger = yes
		}
	}
	desc = OA_AI_OUTNUMBERED_REASON
}
modifier = {
	add = -25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target = {
			fp2_struggle_contract_assistance_war_outnumbering_trigger = yes
		}
	}
	trigger_else = {
		any_character_war = {
			fp2_struggle_contract_assistance_war_outnumbering_trigger = yes
		}
	}
	desc = OA_AI_OUTNUMBER_ENEMY_REASON
}
modifier = {
	add = -50
	trigger_if = {
		limit = {
			exists = scope:target
		}
		OR = {
			scope:target.war_attacker_total_strength_halved_value > scope:actor.max_military_strength
			scope:target.war_defender_total_strength_halved_value > scope:actor.max_military_strength
		}
	}
	trigger_else = {
		always = no
	}
	desc = ET_AI_SMALL_ARMY_REASON
}
modifier = {
	add = -25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:recipient = {
			NOT = {
				has_trait = cynical
			}
		}
		scope:target = {
			OR = {
				using_cb = minor_religious_war
				using_cb = religious_war
				using_cb = major_religious_war
			}
		}
	}
	trigger_else = {
		always = no
	}
	desc = ET_AI_HOLY_WAR_REASON
}
modifier = {
	add = 25
	scope:recipient.faith.religious_head = scope:actor
	desc = ET_AI_HOF_REASON
}
modifier = {
	add = 50
	scope:recipient.dynasty.dynast = scope:actor
	desc = ET_AI_DYNAST_REASON
}
modifier = {
	add = 25
	scope:recipient.dynasty.dynast != scope:actor
	scope:recipient.house.house_head = scope:actor
	desc = ET_AI_HOUSE_HEAD_REASON
}
opinion_modifier = {
	who = scope:recipient
	opinion_target = scope:actor
	multiplier = 1
	desc = AI_OPINION_REASON
}
ai_value_modifier = {
	ai_boldness = -0.5
	max = 0
}

As written in game/common/character_interactions/03_fp2_interactions.txt.

What happens

If they accept

  • If

    a check the game hides

    Then

    • scope:truce_1: Gain -75 Prestige
    • scope:truce_2: Gain -75 Prestige
    • You:
      • If

        • scope:target.attacker_war_score >= fp2_enforce_truce_war_score_value

        Then

        • reverse_add_opinion = { target = scope:target.primary_attacker modifier = fp2_enforced_truce_opinion opinion = -20 }
        • reverse_add_opinion = { target = scope:target.primary_defender modifier = fp2_enforced_truce_opinion opinion = 20 }

        Else if

        • scope:target.defender_war_score >= fp2_enforce_truce_war_score_value

        Then

        • reverse_add_opinion = { target = scope:target.primary_defender modifier = fp2_enforced_truce_opinion opinion = -20 }
        • reverse_add_opinion = { target = scope:target.primary_attacker modifier = fp2_enforced_truce_opinion opinion = 20 }

        Otherwise

        • reverse_add_opinion = { target = scope:target.primary_defender modifier = fp2_enforced_truce_opinion opinion = -10 }
        • reverse_add_opinion = { target = scope:target.primary_attacker modifier = fp2_enforced_truce_opinion opinion = -10 }
      • scope:truce_1:
        • add_truce_one_way = { character = scope:truce_2 years = fp2_enforce_truce_duration_value name = TRUCE_ENFORCE_TRUCE }
      • scope:truce_2:
        • add_truce_one_way = { character = scope:truce_1 years = fp2_enforce_truce_duration_value name = TRUCE_ENFORCE_TRUCE }
      • You get a Truce with … and … for 5 years
    • The target:
      • end_war = white_peace
    • You:
      • If

        • Any character struggle:
          • involvement = involved
          • phase_has_catalyst = catalyst_truce_was_enforced
          • The character you target › Any character struggle:
            • involvement = involved

        Then

        • Every character struggle:
          • Where:
            • phase_has_catalyst = catalyst_truce_was_enforced
            • The character you target › Any character struggle:
              • involvement = involved
          • involvement = involved
          • activate_struggle_catalyst = { catalyst = catalyst_truce_was_enforced character = scope:actor }
  • If

    • You: Government is Clan
    • The character you target: Government is Clan
    • Your house is the target’s
    • If

      • You are not the target

      Then

      • You are not the target

    Then

    • Your house:
      • add_unity_value = { … }

    Else if

    • No
    • You: Government is Clan
    • Your house: Has you as house head
    • One of these

      • All of these

        • exists = scope:recipient.house
        • Your house is not the target’s
      • or

        The character you target: Is Lowborn

    Then

    • Your house:
      • add_unity_value = { … }

If they refuse

  • Event char_interaction.0236
  • If

    • The character you target: Government is Clan
    • You: Government is Clan
    • The target’s house is your
    • If

      • You are not the target

      Then

      • The target is not you

    Then

    • The target’s house:
      • add_unity_value = { … }

    Else if

    • No
    • The character you target: Government is Clan
    • The target’s house: Has the target as house head
    • One of these

      • All of these

        • exists = scope:actor.house
        • The target’s house is not your
      • or

        You: Is Lowborn

    Then

    • The target’s house:
      • add_unity_value = { … }

Events it fires: char_interaction.0236

• 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) (46 lines of game script)
is_available = trigger_if = {
	limit = {
		is_ai = yes
	}
	is_imprisoned = no
}
is_shown = OR = {
	AND = {
		scope:actor = {
			any_character_struggle = {
				involvement = involved
				has_struggle_phase_parameter = unlocks_enforce_truces_interaction
			}
			primary_title.tier >= tier_duchy
		}
		scope:recipient = {
			any_character_struggle = {
				involvement = involved
				has_struggle_phase_parameter = unlocks_enforce_truces_interaction
			}
			tier_difference = {
				target = scope:actor
				value <= 0
			}
		}
	}
	AND = {
		scope:actor = {
			exists = house
			primary_title.tier >= tier_duchy
			house ?= {
				has_house_modifier = fp2_struggle_compromise_house_reward_modifier
			}
		}
		scope:recipient = {
			exists = house
			house ?= {
				has_house_modifier = fp2_struggle_compromise_house_reward_modifier
			}
			tier_difference = {
				target = scope:actor
				value <= 0
			}
		}
	}
}

As written in game/common/character_interactions/03_fp2_interactions.txt.

Can be sent when (is_valid…) (57 lines of game script)
scope:recipient = {
	is_at_war = yes
	trigger_if = {
		limit = {
			scope:actor = {
				any_character_struggle = {
					involvement = involved
					has_struggle_phase_parameter = unlocks_enforce_truces_interaction
					is_secondary_character_involvement_involved_trigger = {
						CHAR = scope:recipient
					}
				}
			}
		}
		any_character_struggle = {
			involvement = involved
			has_struggle_phase_parameter = unlocks_enforce_truces_interaction
		}
	}
	trigger_else = {
		exists = house
		house = {
			has_house_modifier = fp2_struggle_compromise_house_reward_modifier
		}
	}
	custom_tooltip = {
		text = fp2_enforce_truce_liege_or_independent_tt
		OR = {
			top_liege = this
			top_liege = scope:actor.top_liege
			any_character_war = {
				primary_attacker = {
					NOR = {
						this = scope:recipient
						this = scope:actor
					}
					OR = {
						top_liege = this
						top_liege = scope:actor.top_liege
					}
				}
			}
			any_character_war = {
				primary_defender = {
					NOR = {
						this = scope:recipient
						this = scope:actor
					}
					OR = {
						top_liege = this
						top_liege = scope:actor.top_liege
					}
				}
			}
		}
	}
}

As written in game/common/character_interactions/03_fp2_interactions.txt.

Effects (on_send, on_accept, on_decline) (174 lines of game script)
on_accept = if = {
	limit = {
		exists = scope:target
	}
	scope:target = {
		primary_attacker = {
			save_scope_as = truce_1
		}
		primary_defender = {
			save_scope_as = truce_2
		}
	}
	show_as_tooltip = {
		scope:truce_1 = {
			add_prestige = minor_prestige_loss
		}
		scope:truce_2 = {
			add_prestige = minor_prestige_loss
		}
	}
	scope:actor = {
		fp2_enforce_truce_opinion_effect = yes
		show_as_tooltip = {
			scope:truce_1 = {
				add_truce_one_way = {
					character = scope:truce_2
					years = fp2_enforce_truce_duration_value
					name = TRUCE_ENFORCE_TRUCE
				}
			}
			scope:truce_2 = {
				add_truce_one_way = {
					character = scope:truce_1
					years = fp2_enforce_truce_duration_value
					name = TRUCE_ENFORCE_TRUCE
				}
			}
		}
		custom_tooltip = fp2_enforce_truce_peacemaker_tt
		hidden_effect = {
			add_truce_one_way = {
				character = scope:target.primary_attacker
				years = fp2_enforce_truce_duration_value
				name = TRUCE_ENFORCE_TRUCE
			}
			add_truce_one_way = {
				character = scope:target.primary_defender
				years = fp2_enforce_truce_duration_value
				name = TRUCE_ENFORCE_TRUCE
			}
			send_interface_message = {
				type = event_truce_neutral
				title = enforce_truce_interaction_actor_toast
				left_icon = scope:truce_1
				right_icon = scope:truce_2
				show_as_tooltip = {
					fp2_enforce_truce_opinion_effect = yes
				}
				custom_tooltip = fp2_enforce_truce_other_tt
				custom_tooltip = fp2_enforce_truce_peacemaker_tt
			}
		}
	}
	hidden_effect = {
		scope:truce_1 = {
			send_interface_message = {
				type = event_truce_neutral
				title = enforce_truce_interaction_toast
				left_icon = scope:actor
				right_icon = scope:truce_2
				add_prestige = minor_prestige_loss
				show_as_tooltip = {
					scope:target = {
						end_war = white_peace
					}
					add_truce_both_ways = {
						character = scope:truce_2
						years = fp2_enforce_truce_duration_value
						name = TRUCE_ENFORCE_TRUCE
					}
					scope:actor = {
						add_truce_one_way = {
							character = scope:truce_1
							years = fp2_enforce_truce_duration_value
							name = TRUCE_ENFORCE_TRUCE
						}
					}
				}
				stress_and_fulfillment_impact = {
					wrathful = minor_stress_impact_gain
					brave = minor_stress_impact_gain
					ambitious = minor_stress_impact_gain
				}
			}
		}
		scope:truce_2 = {
			send_interface_message = {
				type = event_truce_neutral
				title = enforce_truce_interaction_toast
				left_icon = scope:actor
				right_icon = scope:truce_1
				add_prestige = minor_prestige_loss
				show_as_tooltip = {
					scope:target = {
						end_war = white_peace
					}
					add_truce_both_ways = {
						character = scope:truce_1
						years = fp2_enforce_truce_duration_value
						name = TRUCE_ENFORCE_TRUCE
					}
					scope:actor = {
						add_truce_one_way = {
							character = scope:truce_2
							years = fp2_enforce_truce_duration_value
							name = TRUCE_ENFORCE_TRUCE
						}
					}
				}
				stress_and_fulfillment_impact = {
					wrathful = minor_stress_impact_gain
					brave = minor_stress_impact_gain
					ambitious = minor_stress_impact_gain
				}
			}
		}
	}
	scope:target = {
		end_war = white_peace
	}
	scope:actor = {
		if = {
			limit = {
				any_character_struggle = {
					involvement = involved
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_truce_was_enforced
						CHAR = scope:recipient
					}
				}
			}
			every_character_struggle = {
				involvement = involved
				limit = {
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_truce_was_enforced
						CHAR = scope:recipient
					}
				}
				activate_struggle_catalyst = {
					catalyst = catalyst_truce_was_enforced
					character = scope:actor
				}
			}
		}
	}
}
add_clan_unity_interaction_effect = {
	CHARACTER = scope:actor
	TARGET = scope:recipient
	VALUE = medium_unity_gain
	DESC = clan_unity_enforce_truce.desc
	REVERSE_NON_HOUSE_TARGET = no
}
on_decline = scope:actor = {
	trigger_event = char_interaction.0236
}
add_clan_unity_interaction_effect = {
	CHARACTER = scope:recipient
	TARGET = scope:actor
	VALUE = medium_unity_loss
	DESC = clan_unity_enforce_truce_decline.desc
	REVERSE_NON_HOUSE_TARGET = no
}

As written in game/common/character_interactions/03_fp2_interactions.txt.

Category
Diplomatic actions
Cooldown
5 years
In the menu
main list
ID
enforce_truce_interaction

Source: game/common/character_interactions/03_fp2_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?