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

Interaction · Vassal actions

Modify Vassal Contract

No costAccepted automatically

Renegotiate the recipient's Obligations to you

What you need

You

  • None of these

    • You: Is at war with the target
  • If

    Then

    • … … changed the obligations recently and need to wait until …
    • You:
      • save_temporary_scope_value_as = { name = obligations_favoring_vassal value = scope:recipient.count_obligation_improvements_for_vassal }

    Else if

    • The character you target:
      • subject_contract_is_blocked_from_modification = yes

    Then

    • The character you target:
      • subject_contract_is_blocked_from_modification = no

    Otherwise

    • You:
      • save_temporary_scope_value_as = { name = obligations_favoring_vassal value = scope:recipient.count_obligation_improvements_for_vassal }

The character you target

  • Is a direct vassal of you
  • Is not a Tributary
  • Is a ruler
  • vassal_contract_has_modifiable_obligations = yes
  • Their government does not have the administrative mechanic
  • Their government is not Nomadic

Modify Vassal Contract is a vassal character interaction in Crusader Kings III. Accepted automatically. Patch 1.20.1.2, from game/common/character_interactions/00_modifiy_vassal_contract.txt.

for a guide, post or blog
Quick answers (1)
Will the AI accept Modify Vassal Contract?
Yes: it is accepted automatically.

Will they accept?

The other character has no choice: the game accepts it automatically.

What happens

Effects

  • Tyranny changes
  • If vassal obligation increase tyranny gain is not 0: Stress and fulfillment impact: by trait: Just +40, Generous +40
  • If

    Then

    • Use a Hook on the target
  • Every in list › The character you target:
    • vassal_contract_set_obligation_level = { type = scope:obligation.vassal_contract_type level = scope:obligation }

Options when sending

  • Use a Hook

• 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) (13 lines of game script)
is_shown = scope:recipient = {
	this != scope:puppet_or_actor
	liege ?= scope:puppet_or_actor
	is_tributary = no
	is_ruler = yes
	vassal_contract_has_modifiable_obligations = yes
	NOT = {
		government_has_mechanic = administrative
	}
	NOT = {
		government_has_flag = government_is_nomadic
	}
}

As written in game/common/character_interactions/00_modifiy_vassal_contract.txt.

Can be sent when (is_valid…) (122 lines of game script)
NOT = {
	scope:puppet_or_actor = {
		is_at_war_with = scope:recipient
	}
}
trigger_if = {
	limit = {
		scope:puppet_or_actor = {
			government_has_flag = government_is_mandala
		}
	}
	custom_tooltip = {
		text = liege_modify_vassal_contract_mandala_cooldown
		NOT = {
			scope:recipient = {
				var:liege_recently_adjusted_mandala_vassal_contract ?= scope:puppet_or_actor
			}
		}
	}
	scope:puppet_or_actor = {
		has_changed_contract_obligation_trigger = yes
		custom_description = {
			text = liege_modify_vassal_contract_cannot_exceed_tyranny_cap
			object = scope:puppet_or_actor
			NOT = {
				vassal_obligation_increase_tyranny_gain_multiplier > 1
			}
		}
		custom_description = {
			text = vassal_modify_vassal_contract_obligation_change_limit
			value = list_size:changed_obligations
			list_size:changed_obligations <= max_contract_changes
		}
		save_temporary_scope_value_as = {
			name = obligations_favoring_vassal
			value = scope:recipient.count_obligation_improvements_for_vassal
		}
		trigger_if = {
			limit = {
				scope:obligations_favoring_vassal > 0
			}
			custom_description = {
				text = vassal_modify_vassal_contract_unnecessary_hook_usage_vassal_favor
				object = scope:recipient
				value = scope:obligations_favoring_vassal
				NOT = {
					always = scope:hook
				}
			}
		}
		trigger_else_if = {
			limit = {
				scope:obligations_favoring_vassal = 0
			}
			custom_description = {
				text = vassal_modify_vassal_contract_unnecessary_hook_usage_equal
				object = scope:recipient
				NOT = {
					always = scope:hook
				}
			}
		}
		trigger_else = { }
	}
}
trigger_else_if = {
	limit = {
		scope:recipient = {
			subject_contract_is_blocked_from_modification = yes
		}
	}
	scope:recipient = {
		subject_contract_is_blocked_from_modification = no
	}
}
trigger_else = {
	scope:puppet_or_actor = {
		has_changed_contract_obligation_trigger = yes
		custom_description = {
			text = liege_modify_vassal_contract_cannot_exceed_tyranny_cap
			object = scope:puppet_or_actor
			NOT = {
				vassal_obligation_increase_tyranny_gain_multiplier > 1
			}
		}
		custom_description = {
			text = vassal_modify_vassal_contract_obligation_change_limit
			value = list_size:changed_obligations
			list_size:changed_obligations <= max_contract_changes
		}
		save_temporary_scope_value_as = {
			name = obligations_favoring_vassal
			value = scope:recipient.count_obligation_improvements_for_vassal
		}
		trigger_if = {
			limit = {
				scope:obligations_favoring_vassal > 0
			}
			custom_description = {
				text = vassal_modify_vassal_contract_unnecessary_hook_usage_vassal_favor
				object = scope:recipient
				value = scope:obligations_favoring_vassal
				NOT = {
					always = scope:hook
				}
			}
		}
		trigger_else_if = {
			limit = {
				scope:obligations_favoring_vassal = 0
			}
			custom_description = {
				text = vassal_modify_vassal_contract_unnecessary_hook_usage_equal
				object = scope:recipient
				NOT = {
					always = scope:hook
				}
			}
		}
		trigger_else = { }
	}
}

As written in game/common/character_interactions/00_modifiy_vassal_contract.txt.

Effects (on_send, on_accept, on_decline) (146 lines of game script)
on_accept = hidden_effect = {
	if = {
		limit = {
			catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = {
				CHAR = scope:recipient
			}
			scope:puppet_or_actor = {
				any_character_struggle = {
					involvement = involved
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection
						CHAR = scope:recipient
					}
				}
			}
		}
		scope:puppet_or_actor = {
			every_character_struggle = {
				involvement = involved
				limit = {
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection
						CHAR = scope:recipient
					}
				}
				activate_struggle_catalyst = {
					catalyst = catalyst_granted_powerful_diff_faith_vassal_religious_protection
					character = scope:puppet_or_actor
				}
			}
		}
	}
	if = {
		limit = {
			catalyst_revoked_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = {
				CHAR = scope:recipient
			}
			scope:puppet_or_actor = {
				any_character_struggle = {
					involvement = involved
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection
						CHAR = scope:recipient
					}
				}
			}
		}
		scope:puppet_or_actor = {
			every_character_struggle = {
				involvement = involved
				limit = {
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_revoked_powerful_diff_faith_vassal_religious_protection
						CHAR = scope:recipient
					}
				}
				activate_struggle_catalyst = {
					catalyst = catalyst_revoked_powerful_diff_faith_vassal_religious_protection
					character = scope:puppet_or_actor
				}
			}
		}
	}
	if = {
		limit = {
			scope:recipient.count_obligation_improvements_for_vassal > 0
			scope:puppet_or_actor = {
				is_diff_faith_or_culture_trigger = {
					CHAR = scope:recipient
					STATUS = involved
				}
				any_character_struggle = {
					involvement = involved
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal
						CHAR = scope:recipient
					}
				}
			}
		}
		scope:puppet_or_actor = {
			every_character_struggle = {
				involvement = involved
				limit = {
					activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
						CATALYST = catalyst_grant_privilege_to_diff_faith_culture_vassal
						CHAR = scope:recipient
					}
				}
				activate_struggle_catalyst = {
					catalyst = catalyst_grant_privilege_to_diff_faith_culture_vassal
					character = scope:puppet_or_actor
				}
			}
		}
	}
}
scope:puppet_or_actor = {
	send_interface_message = {
		type = msg_vassal_contract_change
		title = modify_vassal_contract_interaction_notification
		right_icon = scope:recipient
		add_tyranny = vassal_obligation_increase_tyranny_gain
		if = {
			limit = {
				vassal_obligation_increase_tyranny_gain != 0
			}
			stress_and_fulfillment_impact = {
				just = medium_stress_impact_gain
				generous = medium_stress_impact_gain
			}
		}
		if = {
			limit = {
				always = scope:hook
			}
			use_hook = scope:recipient
			add_achievement_flag_effect = {
				FLAG = achievement_fine_print_flag
			}
		}
		scope:recipient = {
			hidden_effect = {
				set_subject_contract_modification_blocked = yes
			}
			set_variable = {
				name = liege_recently_adjusted_mandala_vassal_contract
				value = scope:puppet_or_actor
				years = mandala_vassal_obligation_cooldown_years
			}
		}
		every_in_list = {
			list = changed_obligations
			save_scope_as = obligation
			scope:recipient = {
				vassal_contract_set_obligation_level = {
					type = scope:obligation.vassal_contract_type
					level = scope:obligation
				}
			}
		}
	}
}
scope:recipient = {
	additional_flavor_check_effect = yes
}

As written in game/common/character_interactions/00_modifiy_vassal_contract.txt.

Category
Vassal actions
In the menu
main list
ID
liege_modify_vassal_contract_interaction

Source: game/common/character_interactions/00_modifiy_vassal_contract.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?