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

Offer Military Assistance

No costThe AI weighs it (the answer is partly random)

…

What you need

You

To send it

To see it in the menu

  • If played by the AI:
    • Current military strength at least 500
    • Ai boldness at least -25
    • Is at not War
    • Is not imprisoned
  • One of these

  • Your government is not unplayable

The character you target

To send it

  • Is not allied to you
  • If any character war: You decided to leave this War
  • A mighty … cannot serve at the pleasure of such a small …

To see it in the menu

  • If

    • You › Any character struggle:
      • involvement = involved
      • has_struggle_phase_parameter = unlocks_contract_assistance_interaction

    Then

    • Any character struggle:
      • involvement = involved
      • has_struggle_phase_parameter = unlocks_contract_assistance_interaction
  • Is at War
  • Is not at war with you

Which character you can pick

  • The target:
    • Is war leader in the war against the target
    • If any war attacker:
      • None of these

        • Any war defender: Is allied to you
    • Otherwise:
      • None of these

        • Any war attacker: Is allied to you

Offer Military Assistance is a diplomatic character interaction in Crusader Kings III. You need: Not: Armies are raised, You are already Assisting Militarily in a war, Exiled and 1 more. The character you target needs: Is not allied to you and A mighty … cannot serve at the pleasure of such a small …. The AI weighs it (the answer is partly random). Reasons the AI weighs include The recipient is winning the War (-50), The recipient is losing the War (+50), The recipient outnumbers their enemy (-50) and 7 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 Offer Military Assistance in CK3?
You: Not: Armies are raised, You are already Assisting Militarily in a war, Exiled and Highest held Title is less than Empire Rank. The character you target: Is not allied to you and A mighty … cannot serve at the pleasure of such a small …. (patch 1.20.1.2)
How do I get the AI to accept Offer Military Assistance?
The AI weighs it (the answer is partly random). Its reasons: The recipient is winning the War -50, The recipient is losing the War +50, The recipient outnumbers their enemy -50, The recipient is outnumbered +50, The recipient is heavily outnumbered +125, The recipient has little Gold, The recipient has Gold to spend, You Army is too small to be relevant -50, The recipient is defending … +25, The recipient is not interested in help for this war -300, The recipient finds your Martial Skill impressive, You past failures as a contractor -50, … Opinion of …, Greed, Boldness and Has Swords-for-Hire Camp Purpose +50.

Will they accept?

The AI adds these up and accepts above zero; near zero the answer is partly random (ai_maybe). Reasons in italics are the script's, with no label in the game.

ReasonAmount
Base0
The recipient is winning the War
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

        • Attacker war score at least 50

        Otherwise

        • Defender war score at least 50

    Otherwise

    • Every character war:
      • If

        • The character you target:
          • is_attacker_in_war = prev

        Then

        • Attacker war score at least 50

        Otherwise

        • Defender war score at least 50
-50
The recipient is losing the War
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

        • Defender war score at least 25

        Otherwise

        • Attacker war score at least 25

    Otherwise

    • Any character war:
      • If

        • The character you target:
          • is_attacker_in_war = prev

        Then

        • Defender war score at least 25

        Otherwise

        • Attacker war score at least 25
+50
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

    • Every 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
-50
The recipient is outnumbered+50
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
+125
The recipient has little Gold
when
  • gold < offer_assistance_interaction_gold_value
varies
The recipient has Gold to spend
when
  • gold >= offer_assistance_interaction_gold_value
varies
You Army is too small to be relevant
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

        • scope:actor.max_military_strength < war_defender_total_strength_tenth_value

        Otherwise

        • scope:actor.max_military_strength < war_attacker_total_strength_tenth_value

    Otherwise

    • Every character war:
      • If

        • The character you target:
          • is_attacker_in_war = prev

        Then

        • scope:actor.max_military_strength < war_defender_total_strength_tenth_value

        Otherwise

        • scope:actor.max_military_strength < war_attacker_total_strength_tenth_value
-50
The recipient is defending …
when
  • If

    a check the game hides

    Then

    • scope:target.casus_belli.primary_defender = scope:recipient

    Otherwise

    • The character you target › Any character war: Has the target as the war's defender
+25
The recipient is not interested in help for this war
when
  • The target:
    • One of these

      • The war’s casus belli is Peasant War
      • or

        The war’s casus belli is Border Raid
-300
The recipient finds your Martial Skill impressive
when
  • Martial at least 12
your martial × 2
You past failures as a contractor-50
… Opinion of …varies
Greed
when
  • Ai greed at most 0.5
varies
Boldness
when
  • NOT = { ai_boldness = 0 }
varies
Has Swords-for-Hire Camp Purpose
when
+50
Acceptance (ai_accept) (241 lines of game script)
base = 0
modifier = {
	add = -50
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target = {
			fp2_struggle_contract_assistance_war_winning_trigger = yes
		}
	}
	trigger_else = {
		any_character_war = {
			count = all
			fp2_struggle_contract_assistance_war_winning_trigger = yes
		}
	}
	desc = OA_AI_WINNING_WAR_REASON
}
modifier = {
	add = 50
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target = {
			fp2_struggle_contract_assistance_war_losing_trigger = yes
		}
	}
	trigger_else = {
		any_character_war = {
			fp2_struggle_contract_assistance_war_losing_trigger = yes
		}
	}
	desc = OA_AI_LOSING_WAR_REASON
}
modifier = {
	add = -50
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target = {
			fp2_struggle_contract_assistance_war_outnumbering_trigger = yes
		}
	}
	trigger_else = {
		any_character_war = {
			count = all
			fp2_struggle_contract_assistance_war_outnumbering_trigger = yes
		}
	}
	desc = OA_AI_OUTNUMBER_ENEMY_REASON
}
modifier = {
	add = 50
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target = {
			fp2_struggle_contract_assistance_war_outnumbered_minor_trigger = yes
			NOT = {
				fp2_struggle_contract_assistance_war_outnumbered_trigger = yes
			}
		}
	}
	trigger_else = {
		any_character_war = {
			fp2_struggle_contract_assistance_war_outnumbered_minor_trigger = yes
			NOT = {
				fp2_struggle_contract_assistance_war_outnumbered_trigger = yes
			}
		}
	}
	desc = OA_AI_OUTNUMBERED_MINOR_REASON
}
modifier = {
	add = 125
	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 = {
		value = -50
		if = {
			limit = {
				gold < 0
			}
			add = -100
		}
		if = {
			limit = {
				debt_level >= 2
			}
			add = -200
		}
		if = {
			limit = {
				OR = {
					ai_greed <= -50
					ai_vengefulness >= 50
				}
			}
			multiply = 0.5
		}
	}
	gold < offer_assistance_interaction_gold_value
	desc = OA_AI_CANNOT_AFFORD_REASON
}
modifier = {
	add = {
		value = 25
		if = {
			limit = {
				gold >= {
					value = offer_assistance_interaction_gold_value
					multiply = 2
				}
			}
			add = 50
		}
		if = {
			limit = {
				gold >= {
					value = offer_assistance_interaction_gold_value
					multiply = 3
				}
			}
			add = 50
		}
	}
	gold >= offer_assistance_interaction_gold_value
	desc = OA_AI_EXTRA_GOLD_REASON
}
modifier = {
	add = -50
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target = {
			fp2_struggle_contract_assistance_war_insufficient_trigger = yes
		}
	}
	trigger_else = {
		any_character_war = {
			count = all
			fp2_struggle_contract_assistance_war_insufficient_trigger = yes
		}
	}
	desc = OA_AI_FEW_TROOPS_REASON
}
modifier = {
	add = 25
	trigger_if = {
		limit = {
			exists = scope:target
		}
		scope:target.casus_belli.primary_defender = scope:recipient
	}
	trigger_else = {
		scope:recipient = {
			any_character_war = {
				primary_defender = scope:recipient
			}
		}
	}
	desc = OA_AI_DEFENSIVE_WAR_REASON
}
modifier = {
	add = -300
	exists = scope:target
	scope:target = {
		OR = {
			using_cb = peasant_war
			using_cb = fp2_border_raid
		}
	}
	desc = OA_AI_UNINTERESTED_WAR_REASON
}
modifier = {
	add = {
		value = scope:actor.martial
		multiply = 2
	}
	scope:actor = {
		martial >= 12
	}
	desc = OA_AI_MARTIAL_REASON
}
modifier = {
	add = -50
	scope:actor = {
		has_character_flag = fp2_contract_assistance_failure
	}
	desc = OA_AI_FAILURE_REASON
}
opinion_modifier = {
	who = scope:recipient
	opinion_target = scope:actor
	multiplier = 0.25
	desc = AI_OPINION_REASON
}
modifier = {
	add = {
		value = ai_greed
		multiply = -0.2
	}
	ai_greed <= 0.5
	desc = AI_VALUE_MODIFIER_GREED
}
modifier = {
	add = {
		value = ai_boldness
		multiply = -0.2
	}
	NOT = {
		ai_boldness = 0
	}
	desc = AI_VALUE_MODIFIER_BOLDNESS
}
modifier = {
	add = 50
	desc = camp_purpose_mercenaries_reason
	scope:actor = {
		has_realm_law = camp_purpose_mercenaries
	}
}

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

What happens

If they accept

  • The target:
    • If

      • is_attacker = scope:recipient

      Then

      • add_attacker = scope:actor

      Otherwise

      • add_defender = scope:actor
  • Stress and fulfillment impact: by trait: Craven +40, Shy +20
  • If

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

    Then

    • Every character struggle:
      • Where:
        • phase_has_catalyst = catalyst_join_war_as_assisant
        • The character you target › Any character struggle:
          • involvement = involved
      • involvement = involved
      • activate_struggle_catalyst = { catalyst = catalyst_join_war_as_assisant character = scope:actor }
  • The character you target:
    • Stress and fulfillment impact: by trait: Greedy +40, Arrogant +40
    • If … War Contribution is at least … when the War ends:
    • Pay 0 gold to you
  • 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) (43 lines of game script)
is_available = trigger_if = {
	limit = {
		is_ai = yes
	}
	current_military_strength >= 500
	ai_boldness >= -25
	is_at_war = no
	is_imprisoned = no
}
OR = {
	any_character_struggle = {
		involvement = involved
		has_struggle_phase_parameter = unlocks_contract_assistance_interaction
	}
	culture ?= {
		has_cultural_parameter = unlocks_contract_assistance
	}
	government_has_flag = government_is_landless_adventurer
}
NOT = {
	government_has_flag = government_is_herder
}
is_shown = scope:recipient = {
	trigger_if = {
		limit = {
			scope:actor = {
				any_character_struggle = {
					involvement = involved
					has_struggle_phase_parameter = unlocks_contract_assistance_interaction
				}
			}
		}
		any_character_struggle = {
			involvement = involved
			has_struggle_phase_parameter = unlocks_contract_assistance_interaction
		}
	}
	is_at_war = yes
	NOR = {
		this = scope:actor
		is_at_war_with = scope:actor
	}
}

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

Can be sent when (is_valid…) (79 lines of game script)
scope:recipient = {
	NOT = {
		is_allied_to = scope:actor
	}
	trigger_if = {
		limit = {
			any_character_war = {
				has_variable_list = left_voluntarily
			}
		}
		custom_tooltip = {
			text = laamp_war_change_sides_interaction.left_voluntarily
			is_target_in_variable_list = {
				name = left_voluntarily
				target = scope:actor
			}
		}
	}
}
trigger_if = {
	limit = {
		exists = scope:actor.liege
	}
	custom_description = {
		text = join_war_interaction_recipient_warring_with_my_liege
		subject = scope:recipient
		scope:actor = {
			NOT = {
				any_liege_or_above = {
					is_at_war_with = scope:recipient
				}
			}
		}
	}
}
scope:actor = {
	has_raised_armies = no
	trigger_if = {
		limit = {
			has_government = landless_adventurer_government
		}
		custom_tooltip = {
			text = reinforce_soldiers_any_regiment_tt
			maa_regiments_count >= 1
		}
	}
}
custom_tooltip = {
	text = contract_assistance_war_already_contracted_tt
	scope:actor = {
		NOT = {
			has_variable = owed_contract_assistance_war
		}
	}
}
custom_tooltip = {
	text = the_wake_1
	NOT = {
		is_laamp_exiled_from_province_trigger = {
			PROVINCE = scope:recipient.capital_province
			LAAMP = scope:actor
		}
	}
}
scope:recipient = {
	custom_tooltip = {
		text = contract_assistance_tier_too_high_tt
		OR = {
			highest_held_title_tier = tier_county
			highest_held_title_tier >= scope:actor.highest_held_title_tier
			sub_realm_size >= scope:actor.sub_realm_size
		}
	}
}
scope:actor = {
	NOT = {
		highest_held_title_tier >= tier_empire
	}
}

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

Effects (on_send, on_accept, on_decline) (91 lines of game script)
on_accept = scope:target = {
	hidden_effect = {
		set_called_to = scope:actor
	}
	if = {
		limit = {
			is_attacker = scope:recipient
		}
		add_attacker = scope:actor
	}
	else = {
		add_defender = scope:actor
	}
}
scope:actor = {
	save_scope_as = contract_assistance_helper
	set_variable = {
		name = owed_contract_assistance_war
		value = scope:target
	}
	set_variable = {
		name = owed_contract_assistance_contribution
		value = offer_assistance_interaction_war_contribution_value
	}
	set_variable = {
		name = owed_contract_assistance_gold
		value = scope:recipient.offer_assistance_interaction_gold_value
	}
	stress_and_fulfillment_impact = {
		craven = medium_stress_impact_gain
		shy = minor_stress_impact_gain
	}
	if = {
		limit = {
			any_character_struggle = {
				involvement = involved
				activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
					CATALYST = catalyst_join_war_as_assisant
					CHAR = scope:recipient
				}
			}
		}
		every_character_struggle = {
			involvement = involved
			limit = {
				activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
					CATALYST = catalyst_join_war_as_assisant
					CHAR = scope:recipient
				}
			}
			activate_struggle_catalyst = {
				catalyst = catalyst_join_war_as_assisant
				character = scope:actor
			}
		}
	}
}
scope:recipient = {
	stress_and_fulfillment_impact = {
		greedy = medium_stress_impact_gain
		arrogant = medium_stress_impact_gain
	}
	custom_description_no_bullet = {
		text = contract_assistance_interaction_condition_tt
		subject = scope:recipient
		object = scope:actor
	}
	show_as_tooltip = {
		pay_short_term_gold = {
			target = scope:actor
			gold = offer_assistance_interaction_gold_value
		}
	}
}
add_clan_unity_interaction_effect = {
	CHARACTER = scope:actor
	TARGET = scope:recipient
	VALUE = medium_unity_loss
	DESC = clan_unity_contract_assistance.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 = minor_unity_gain
	DESC = clan_unity_contract_assistance_decline.desc
	REVERSE_NON_HOUSE_TARGET = no
}

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

Category
Diplomatic actions
Again on the same character
after 5 years
In the menu
main list
ID
contract_assistance_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. “…” marks words the game fills in at play time (a name, a title).

Spotted a mistake on this page?