liege_modify_vassal_contract_interaction = {
	special_interaction = liege_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	common_interaction = yes
	icon = icon_contract_modification_single
	interface_priority = 5

	send_name = "modify_vassal_contract_interaction_SEND"
	desc = liege_modify_vassal_contract_interaction_desc

	force_notification = yes
	notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL

	is_shown = {
		scope:recipient = {
			this != scope:actor
			liege = scope:actor
			is_tributary = no # this excludes tributary contracts by default
			is_ruler = yes
			vassal_contract_has_modifiable_obligations = yes
			NOT = { government_allows = administrative }
			NOT = { government_has_flag = government_is_nomadic }
		}
	}

	is_valid_showing_failures_only = {
		NOT = { scope:actor = { is_at_war_with = scope:recipient } }
	}

	can_send = {
		#Mandala gets special treatment
		trigger_if = {
			limit = {
				scope: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:actor }
				}
			}
			scope:actor = {
				has_changed_contract_obligation_trigger = yes

				custom_description = {
					text = "liege_modify_vassal_contract_cannot_exceed_tyranny_cap"
					object = scope:actor
					NOT = {
						vassal_obligation_increase_tyranny_gain_multiplier > 1
					}
				}

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}

				# If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook
				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 = {} # Otherwise we're fine!
			}
		}
		#The rest
		trigger_else_if = { #If they're blocked we don't want to show anything else
			limit = {
				scope:recipient = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:recipient = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			scope:actor = {
				has_changed_contract_obligation_trigger = yes

				custom_description = {
					text = "liege_modify_vassal_contract_cannot_exceed_tyranny_cap"
					object = scope:actor
					NOT = {
						vassal_obligation_increase_tyranny_gain_multiplier > 1
					}
				}

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}

				# If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook
				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 = {} # Otherwise we're fine!
			}
		}
	}

	auto_accept = yes
	on_accept = {
		hidden_effect = {
			# Struggle Catalysts
			## We work these out first so they're not invalidated by the actual effect block.
			if = {
				limit = {
					catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope: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: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:actor
						}
					}
				}
			}
			if = {
				limit = {
					catalyst_revoked_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope: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: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:actor
						}
					}
				}
			}

			# Improving contract catalyst
#			if = {
#				limit = {
#					scope:recipient.count_obligation_improvements_for_vassal > 0
#					scope: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: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:actor
#						}
#					}
#				}
#			}
		}

		# Enact changes.
		scope:actor = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:recipient
				# Add tyranny for each level increased. Can spend one hook to avoid one level of tyranny hit.
				add_tyranny = vassal_obligation_increase_tyranny_gain
				if = {
					limit = { vassal_obligation_increase_tyranny_gain != 0 }
					stress_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: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
						}
					}

				}
			}
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	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
}

vassal_modify_vassal_contract_interaction = {
	special_interaction = liege_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	common_interaction = yes
	icon = icon_contract_modification_single

	send_name = "modify_vassal_contract_interaction_SEND"
	desc = vassal_modify_vassal_contract_interaction_desc

	force_notification = yes
	notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_LIEGE

	redirect = {
		# need to reverse the role for the UI to work properly
		scope:recipient = {
			save_scope_as = secondary_recipient
		}
		scope:actor = {
			save_scope_as = recipient
		}

		scope:secondary_recipient = {
			save_scope_as = actor
		}
	}

	is_shown = {
		scope:recipient = {
			liege = scope:actor
			this != scope:actor
			is_tributary = no # this excludes tributary contracts by default
			vassal_contract_has_modifiable_obligations = yes
			NOR = {
				government_allows = administrative
				government_has_flag = government_is_nomadic
			}
		}
	}

	is_valid_showing_failures_only = {
		NOT = { scope:recipient = { is_at_war_with = scope:actor } }
	}

	can_send = {
		#Mandala gets special treatment
		trigger_if = {
			limit = {
				scope:recipient = { government_has_flag = government_is_mandala }
			}
			custom_tooltip = {
				text = vassal_modify_vassal_contract_mandala_cooldown
				NOT = {
					scope:actor = { var:vassal_recently_adjusted_mandala_vassal_contract ?= scope:recipient }
				}
			}
			scope:actor = {
				has_changed_contract_obligation_trigger = yes
			}

			scope:recipient = {
				# Must be an even trade overall
				trigger_if = {
					limit = {
						count_obligation_improvements_for_vassal_include_hook >= 0
					}
					custom_description = {
						text = "vassal_modify_vassal_contract_cannot_increase_obligation_level"
						object = scope:actor
						value = count_obligation_improvements_for_vassal_include_hook
						count_obligation_improvements_for_vassal_include_hook = 0
					}
				}

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}
			}
		}
		#The rest
		trigger_else_if = { #If you're blocked we don't want to show anything else
			limit = {
				scope:recipient = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:recipient = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			scope:actor = {
				has_changed_contract_obligation_trigger = yes
			}

			scope:recipient = {
				# Must be an even trade overall
				trigger_if = {
					limit = {
						count_obligation_improvements_for_vassal_include_hook >= 0
					}
					custom_description = {
						text = "vassal_modify_vassal_contract_cannot_increase_obligation_level"
						object = scope:actor
						value = count_obligation_improvements_for_vassal_include_hook
						count_obligation_improvements_for_vassal_include_hook = 0
					}
				}

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}
			}
		}
	}

	auto_accept = yes

	on_accept = {
		# Enact changes.
		scope:recipient = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:actor
				if = {
					limit = { always = scope:hook }
					use_hook = scope:actor
					add_achievement_flag_effect = { FLAG = achievement_fine_print_flag }
				}

				hidden_effect = { set_subject_contract_modification_blocked = yes }

				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:actor = {
			set_variable = {
				name = vassal_recently_adjusted_mandala_vassal_contract
				value = scope:recipient
				years = mandala_vassal_obligation_cooldown_years
			}
		}
		# If there's a diarch involved, and they called in their change, that gets flagged.
		diarch_changed_own_contract_effect = yes

		hidden_effect = {
			# Struggle Catalysts
			## We work these out first so they're not invalidated by the actual effect block.
			if = {
				limit = {
					catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope: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: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:recipient
						}
					}
				}
			}
			# Improving contract catalyst
#			if = {
#				limit = {
#					scope:recipient.count_obligation_improvements_for_vassal > 0
#					scope: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: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:actor
#						}
#					}
#				}
#			}
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	send_option = {
		is_valid = {
			scope:recipient = {
				has_usable_hook = scope:actor
			}
		}
		flag = hook
		localization = SCHEME_HOOK
	}
	send_option = {
		is_shown = {
			scope:recipient = { is_diarch_of_target = scope:actor }
			scope:actor = { has_diarchy_parameter = diarch_gets_a_free_change_on_vassal_contract }
		}
		is_valid = {
			scope:recipient = {
				trigger_if = {
					limit = { has_variable_list = diarch_contract_rights_used_list }
					NOT = {
						is_target_in_variable_list = {
							name = diarch_contract_rights_used_list
							target = scope:actor
						}
					}
				}
			}
			scope:actor = { has_diarchy_active_parameter = diarch_gets_a_free_change_on_vassal_contract }
		}
		flag = diarch
		localization = CALL_IN_DIARCH_RIGHTS
	}
	should_use_extra_icon = {
		scope:recipient = { has_usable_hook = scope:actor }
	}
	extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
	send_options_exclusive = no
}

ai_only_liege_modify_vassal_contract_interaction = {
	category = interaction_category_vassal
	send_name = "modify_vassal_contract_interaction_SEND"
	desc = liege_modify_vassal_contract_interaction_desc

	auto_accept = yes

	is_shown = {
		scope:actor = {
			is_ai = yes
			has_usable_hook = scope:recipient
		}
		scope:recipient = {
			this != scope:actor
			liege = scope:actor
			NOT = {
				has_strong_hook = scope:actor
			}
			is_tributary = no # this excludes tributary contracts by default
			is_ruler = yes
			vassal_contract_can_be_modified_trigger = yes
			does_ai_liege_in_vassal_contract_desire_obligation_change = yes
		}
		NOT = { scope:actor = { is_at_war_with = scope:recipient } }
	}

	on_accept = {
		scope:actor = {
			stress_impact = {
				generous = minor_stress_impact_gain
			}
		}

		scope:recipient = {
			set_subject_contract_modification_blocked = yes
			trigger_event = char_interaction.0250
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	ai_potential = {
		trigger_if = {
			limit = {
				NOT = { government_allows = administrative }
			}
			is_at_war = no
		}
	}

	ai_targets = {
		ai_recipients = vassals
	}

	ai_frequency_by_tier = {
		barony = 0
		county = 12
		duchy = 12
		kingdom = 24
		empire = 24
		hegemony = 36
	}

	ai_will_do = {
		base = 100

		modifier = {
			factor = 0
			scope:recipient = {
				OR = {
					AND = {
						scope:actor = {
							ai_greed <= high_positive_ai_value
						}
						has_relation_friend = scope:actor
					}
					has_relation_best_friend = scope:actor
					has_relation_soulmate = scope:actor
				}
			}
		}
	}
}

# AI only interaction for specifically Admin Province obligations
ai_only_liege_modify_vassal_contract_admin_province_interaction = {
	category = interaction_category_vassal
	send_name = "modify_vassal_contract_interaction_SEND"
	desc = liege_modify_vassal_contract_interaction_desc

	auto_accept = yes

	is_shown = {
		scope:actor = {
			is_ai = yes
			AND = {
				government_has_flag = government_uses_admin_province_obligations
				scope:recipient = { government_has_flag = government_uses_admin_province_obligations }
			}
		}
		scope:recipient = {
			this != scope:actor
			liege = scope:actor
			is_tributary = no
			NOT = {
				has_strong_hook = scope:actor
			}
			is_ruler = yes
			government_has_flag = government_uses_admin_province_obligations

			does_ai_liege_in_vassal_contract_desire_admin_province_obligation_change = yes
		}
		NOT = { scope:actor = { is_at_war_with = scope:recipient } }
	}

	on_accept = {
		scope:actor = {
			stress_impact = {
				generous = minor_stress_impact_gain
			}
		}

		scope:recipient = {
			trigger_event = char_interaction.0253
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	ai_targets = {
		ai_recipients = vassals
		max = 10
	}

	ai_frequency_by_tier = {
		barony = 0
		county = 0
		duchy = 12
		kingdom = 6
		empire = 6
		hegemony = 3
	}

	is_available = {
		# This also blocks non-admin govs with admin vassals from changing province obligations... but we're OK with that.
		government_has_flag = government_uses_admin_province_obligations
	}

	ai_will_do = {
		base = 100
	}
}

ai_only_vassal_modify_vassal_contract_interaction = {
	category = interaction_category_vassal
	send_name = "modify_vassal_contract_interaction_SEND"
	desc = vassal_modify_vassal_contract_interaction_desc

	auto_accept = yes

	is_shown = {
		scope:actor = {
			is_ai = yes
			top_liege != this
			has_usable_hook = scope:recipient
			vassal_contract_can_be_modified_trigger = yes
			does_ai_vassal_in_vassal_contract_desire_obligation_change = yes
			is_tributary = no # this excludes tributary contracts by default
			liege = scope:recipient
		}
		scope:recipient = {
			this != scope:actor
			is_ruler = yes
			NOT = {
				has_strong_hook = scope:actor
			}
		}
		NOT = { scope:actor = { is_at_war_with = scope:recipient } }
	}

	on_accept = {
		scope:recipient = {
			trigger_event = char_interaction.0251
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	ai_potential = {
		always = yes
	}

	ai_targets = {
		ai_recipients = liege
	}
	ai_frequency_by_tier = {
		barony = 0
		county = 24
		duchy = 24
		kingdom = 24
		empire = 36
		hegemony = 0
	}

	ai_will_do = {
		base = 100

		modifier = {
			factor = 0
			scope:recipient = {
				OR = {
					AND = {
						scope:actor = {
							ai_greed <= high_positive_ai_value
						}
						has_relation_friend = scope:actor
					}
					has_relation_best_friend = scope:actor
					has_relation_soulmate = scope:actor
				}
			}
		}
	}
}

# Separate interactions are set up for Administrative - This is to help with localisation and some of the effects
admin_liege_modify_vassal_contract_interaction = {
	special_interaction = liege_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	common_interaction = yes
	interface_priority = 1000
	icon = icon_contract_modification_single

	send_name = admin_liege_modify_vassal_contract_interaction
	desc = admin_liege_modify_vassal_contract_interaction_desc

	force_notification = yes
	notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL

	is_shown = {
		scope:recipient = {
			this != scope:actor
			liege = scope:actor
			OR = {
				is_landed = yes
				is_councillor_of = scope:actor.top_liege
			}
			is_tributary = no # this excludes tributary contracts by default
			is_ruler = yes
			vassal_contract_has_modifiable_obligations = yes
			government_allows = administrative
			any_held_title = {
				OR = {
					tier >= holder.main_administrative_tier
					tier >= holder.min_title_maa_tier
				}
				is_noble_family_title = no
			}
		}
	}

	is_valid_showing_failures_only = {
		scope:actor = {
			NOT = { is_at_war_with = scope:recipient }
			tgp_is_ceremonial_liege_trigger = no
		}
	}

	can_send = {
		trigger_if = { #If they're blocked we don't want to show anything else
			limit = {
				scope:recipient = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:recipient = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			# There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers
			trigger_if = {
				limit = {
					scope:recipient = {
						has_variable = admin_contract_cooldown
					}
				}
				custom_tooltip = {
					text = admin_contract_cooldown_desc
					scope:recipient = {
						NOT = { has_variable = admin_contract_cooldown }
					}
				}
			}
			trigger_else = {
				scope:actor = {
					has_changed_contract_obligation_trigger = yes
				}
			}
		}
	}

	auto_accept = yes
	on_accept = {
		hidden_effect = {
			# Struggle Catalysts
			## We work these out first so they're not invalidated by the actual effect block.
			if = {
				limit = {
					catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope: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: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:actor
						}
					}
				}
			}
			if = {
				limit = {
					catalyst_revoked_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope: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: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:actor
						}
					}
				}
			}

			# Improving contract catalyst
			if = {
#				limit = {
#					scope:recipient.count_obligation_improvements_for_vassal > 0
#					scope: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: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:actor
#						}
#					}
#				}
#			}
		}

		# Enact changes.
		scope:actor = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:recipient

				scope:recipient = {
					hidden_effect = {
						set_variable = {
							name = admin_contract_cooldown
							value = yes
							years = admin_contract_cooldown_value
						}
					}
				}

				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
						}

						# Update the succession law for celestial province types if applicable - That way, we don't have to wait until the current law invalidates.
						if = {
							limit = {
								government_has_flag = government_is_celestial
								scope:obligation.vassal_contract_type = vassal_contract:celestial_provinces
							}
							if = {
								limit = {
									OR = {
										vassal_contract_has_flag = celestial_province_military
										vassal_contract_has_flag = celestial_province_protectorate
									}
									NOT = { has_realm_law = celestial_military_appointment_succession_law }
								}
								add_realm_law_skip_effects = celestial_military_appointment_succession_law
							}
							else_if = {
								limit = {
									OR = {
										vassal_contract_has_flag = celestial_province_standard
										vassal_contract_has_flag = celestial_province_industrial
										vassal_contract_has_flag = celestial_province_metropolitan
									}
									NOT = { has_realm_law = celestial_appointment_succession_law }
								}
								add_realm_law_skip_effects = celestial_appointment_succession_law
							}
						}
						# Update the succession law for meritocratic province types if applicable - That way, we don't have to wait until the current law invalidates.
						else_if = {
							limit = {
								government_has_flag = government_is_meritocratic
								scope:obligation.vassal_contract_type = vassal_contract:meritocratic_provinces
							}
							if = {
								limit = {
									vassal_contract_has_flag = meritocratic_province_military
									NOT = { has_realm_law = meritocratic_military_appointment_succession_law }
								}
								add_realm_law_skip_effects = meritocratic_military_appointment_succession_law
							}
							else_if = {
								limit = {
									OR = {
										vassal_contract_has_flag = meritocratic_province_standard
										vassal_contract_has_flag = meritocratic_province_industrial
									}
									NOT = { has_realm_law = meritocratic_appointment_succession_law }
								}
								add_realm_law_skip_effects = meritocratic_appointment_succession_law
							}
						}
						# Update the succession law for japanese province types if applicable - That way, we don't have to wait until the current law invalidates.
						else_if = {
							limit = {
								government_has_flag = government_is_japanese_administrative
								scope:obligation.vassal_contract_type = vassal_contract:japan_administrative_provinces
							}
							if = {
								limit = {
									NOT = { vassal_contract_has_flag = japan_administrative_military_appointment }
									NOT = { has_realm_law = japanese_appointment_succession_law }
								}
								add_realm_law_skip_effects = japanese_appointment_succession_law
							}
							else_if = {
								limit = {
									vassal_contract_has_flag = japan_administrative_military_appointment
									NOT = { has_realm_law = japanese_military_appointment_succession_law }
								}
								add_realm_law_skip_effects = japanese_military_appointment_succession_law
							}
						}
					}
				}
			}
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	send_options_exclusive = no
}

admin_vassal_modify_vassal_contract_interaction = {
	special_interaction = vassal_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	interface_priority = 65
	common_interaction = yes
	icon = icon_contract_modification_single

	filter_tags = { admin_liege }

	send_name = "admin_vassal_modify_vassal_contract_interaction_send"
	desc = admin_vassal_modify_vassal_contract_interaction_desc

	is_shown = {
		scope:actor = {
			top_liege != this
			this != scope:recipient
			liege = scope:recipient
			is_tributary = no # this excludes tributary contracts by default
			vassal_contract_has_modifiable_obligations = yes
			government_allows = administrative
			tgp_is_ceremonial_liege_trigger = no
		}
	}

	is_valid_showing_failures_only = {
		scope:actor = {
			custom_tooltip = {
				text = admin_vassal_not_holding_a_theme_desc
				any_held_title = {
					OR = {
						tier >= holder.main_administrative_tier
						tier >= holder.min_title_maa_tier
					}
					is_noble_family_title = no
				}
			}
			NOT = { is_at_war_with = scope:recipient }
		}
	}

	can_send = {
		trigger_if = { #If you're blocked we don't want to show anything else (we don't really use this for admin, but we'll keep the logic, just in case)
			limit = {
				scope:actor = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:actor = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			# There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers
			trigger_if = {
				limit = {
					scope:actor = {
						has_variable = admin_contract_cooldown
					}
				}
				custom_tooltip = {
					text = admin_contract_cooldown_desc_vassal
					scope:actor = {
						NOT = { has_variable = admin_contract_cooldown }
					}
				}
			}
			trigger_else = {
				custom_tooltip = {
					text = admin_contract_request_cooldown_desc
					scope:actor = {
						NOT = { has_variable = admin_contract_request_cooldown }
					}
				}
				scope:actor = {
					has_changed_contract_obligation_trigger = yes
				}
			}

			# You can afford the influence cost
			trigger_if = {
				limit = {
					NOR = {
						scope:hook = yes
						scope:dominant_family = yes
					}
				}
				scope:actor = {
					influence >= major_influence_value
				}
			}
		}
	}

	auto_accept = {
		custom_tooltip = {
			text = admin_vassal_force_obligation_change_desc
			OR = {
				scope:hook = yes
				scope:dominant_family = yes
				scope:diarch = yes
			}
		}
	}

	on_accept = {
		# Enact changes
		scope:actor = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:recipient

				# If you use a hook - Spend it
				if = {
					limit = { always = scope:hook }
					use_hook = scope:recipient
					add_achievement_flag_effect = { FLAG = achievement_fine_print_flag }
				}

				# If you didn't use a hook or leveraged your position as a Dominant Family, pay Influence
				if = {
					limit = {
						has_changed_contract_obligation_trigger = yes # Don't show the cost unless we actually change the contract
						NOR = {
							scope:hook = yes
							scope:dominant_family = yes
							scope:diarch = yes
						}
					}
					scope:actor = {
						change_influence = major_influence_loss
					}
				}

				# Activate cooldown - To prevent liege from changing it too soon
				hidden_effect = {
					set_variable = {
						name = admin_contract_cooldown
						value = yes
						years = admin_contract_cooldown_value
					}
				}

				every_in_list = {
					list = changed_obligations

					save_scope_as = obligation

					scope:actor = {
						vassal_contract_set_obligation_level = {
							type = scope:obligation.vassal_contract_type
							level = scope:obligation
						}

						# Update the succession law for celestial province types if applicable - That way, we don't have to wait until the current law invalidates.
						if = {
							limit = {
								government_has_flag = government_is_celestial
								scope:obligation.vassal_contract_type = vassal_contract:celestial_provinces
							}

							if = {
								limit = {
									OR = {
										vassal_contract_has_flag = celestial_province_military
										vassal_contract_has_flag = celestial_province_protectorate
									}
									NOT = { has_realm_law = celestial_military_appointment_succession_law }
								}
								add_realm_law_skip_effects = celestial_military_appointment_succession_law
							}
							else_if = {
								limit = {
									OR = {
										vassal_contract_has_flag = celestial_province_standard
										vassal_contract_has_flag = celestial_province_industrial
										vassal_contract_has_flag = celestial_province_metropolitan
									}
									NOT = { has_realm_law = celestial_appointment_succession_law }
								}
								add_realm_law_skip_effects = celestial_appointment_succession_law
							}
						}
						# Update the succession law for meritocratic province types if applicable - That way, we don't have to wait until the current law invalidates.
						else_if = {
							limit = {
								government_has_flag = government_is_meritocratic
								scope:obligation.vassal_contract_type = vassal_contract:meritocratic_provinces
							}
							if = {
								limit = {
									vassal_contract_has_flag = meritocratic_province_military
									NOT = { has_realm_law = meritocratic_military_appointment_succession_law }
								}
								add_realm_law_skip_effects = meritocratic_military_appointment_succession_law
							}
							else_if = {
								limit = {
									OR = {
										vassal_contract_has_flag = meritocratic_province_standard
										vassal_contract_has_flag = meritocratic_province_industrial
									}
									NOT = { has_realm_law = meritocratic_appointment_succession_law }
								}
								add_realm_law_skip_effects = meritocratic_appointment_succession_law
							}
						}
						# Update the succession law for japanese province types if applicable - That way, we don't have to wait until the current law invalidates.
						else_if = {
							limit = {
								government_has_flag = government_is_japanese_administrative
								scope:obligation.vassal_contract_type = vassal_contract:japan_administrative_provinces
							}
							if = {
								limit = {
									NOT = { vassal_contract_has_flag = japan_administrative_military_appointment }
									NOT = { has_realm_law = japanese_appointment_succession_law }
								}
								add_realm_law_skip_effects = japanese_appointment_succession_law
							}
							else_if = {
								limit = {
									vassal_contract_has_flag = japan_administrative_military_appointment
									NOT = { has_realm_law = japanese_military_appointment_succession_law }
								}
								add_realm_law_skip_effects = japanese_military_appointment_succession_law
							}
						}
					}
				}
			}
		}

		# If there's a diarch involved, and they called in their change, that gets flagged.
		diarch_changed_own_contract_effect = yes

		hidden_effect = {
			# Struggle Catalysts
			## We work these out first so they're not invalidated by the actual effect block.
			if = {
				limit = {
					catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope:recipient = {
						any_character_struggle = {
							involvement = involved
							activate_struggle_catalyst_secondary_character_involvement_involved_trigger = {
								CATALYST = catalyst_granted_powerful_diff_faith_vassal_religious_protection
								CHAR = scope:actor
							}
						}
					}
				}
				scope:recipient = {
					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:actor
							}
						}
						activate_struggle_catalyst = {
							catalyst = catalyst_granted_powerful_diff_faith_vassal_religious_protection
							character = scope:actor
						}
					}
				}
			}
			# Improving contract catalyst
#			if = {
#				limit = {
#					scope:actor.count_obligation_improvements_for_vassal > 0
#					scope:recipient = {
#						is_diff_faith_or_culture_trigger = {
#							CHAR = scope:actor
#							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:actor
#							}
#						}
#					}
#				}
#				scope:recipient = {
#					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:actor
#							}
#						}
#						activate_struggle_catalyst = {
#							catalyst = catalyst_grant_privilege_to_diff_faith_culture_vassal
#							character = scope:recipient
#						}
#					}
#				}
#			}
		}
	}

	on_decline = {
		# Activate cooldown - You may only ask for it to be changed every so often (this mostly exists for MP, since you cannot send it to the AI unless they accept)
		hidden_effect = {
			scope:actor = {
				set_variable = {
					name = admin_contract_request_cooldown
					value = yes
					years = admin_contract_cooldown_value
				}
			}
		}
	}

	# Send Options
	# Hook
	send_option = {
		is_valid = {
			scope:actor = {
				has_usable_hook = scope:recipient
			}
		}
		flag = hook
		localization = SCHEME_HOOK
	}
	# Dominant Family
	send_option = {
		is_shown = {
			scope:actor = {
				house ?= { is_dominant_family = yes }
			}
		}
		flag = dominant_family
		localization = OPTION_DOMINANT_FAMILY
	}
	# Diarch
	send_option = {
		is_shown = {
			scope:actor = { is_diarch_of_target = scope:recipient }
		}
		is_valid = {
			scope:actor = {
				trigger_if = {
					limit = { has_variable_list = diarch_contract_rights_used_list }
					NOT = {
						is_target_in_variable_list = {
							name = diarch_contract_rights_used_list
							target = scope:recipient
						}
					}
				}
			}
		}
		flag = diarch
		localization = CALL_IN_DIARCH_RIGHTS
	}
	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_accept = {
		base = -25

		# Opinion Factor
		opinion_modifier = {
			who = scope:recipient
			opinion_target = scope:actor
			multiplier = 1
			desc = AI_OPINION_REASON
		}

		# Governor efficiency - Skilled governors are more likely to get accepted
		modifier = {
			add = scope:actor.governor_efficiency_presented
			desc = AI_GOVERNOR_EFFICIENCY
		}

		# Members of a powerful family are more likely to get accepted
		modifier = {
			scope:actor = {
				house ?= { is_powerful_family = yes }
				NOT = { house ?= scope:recipient.house }
			}
			add = 50
			desc = AI_POWERFUL_FAMILY
		}

		# Members of the emperors family are much more likely to get accepted
		modifier = {
			scope:actor = {
				house ?= scope:recipient.house
			}
			add = 60
			desc = AI_SAME_HOUSE
		}
	}
}

# Separate interactions are set up for Nomads - This is to help with localisation and some of the effects
nomad_liege_modify_vassal_contract_interaction = {
	special_interaction = liege_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	common_interaction = yes
	icon = icon_contract_modification_single

	send_name = nomad_liege_modify_vassal_contract_interaction
	desc = nomad_liege_modify_vassal_contract_interaction_desc

	force_notification = yes
	notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL

	is_shown = {
		scope:recipient = {
			this != scope:actor
			liege = scope:actor
			is_tributary = no # this excludes tributary contracts by default
			is_ruler = yes
			vassal_contract_has_modifiable_obligations = yes
			government_has_flag = government_is_nomadic
		}
	}

	is_valid_showing_failures_only = {
		NOT = { scope:actor = { is_at_war_with = scope:recipient } }
	}

	can_send = {
		trigger_if = { #If they're blocked we don't want to show anything else
			limit = {
				scope:recipient = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:recipient = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			scope:actor = {
				has_changed_contract_obligation_trigger = yes

				custom_description = {
					text = "liege_modify_vassal_contract_cannot_exceed_tyranny_cap"
					object = scope:actor
					NOT = {
						vassal_obligation_increase_tyranny_gain_multiplier > 1
					}
				}

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}

				# If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook
				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 = {} # Otherwise we're fine!
			}
		}
	}

	auto_accept = yes
	on_accept = {
		hidden_effect = {
			# Struggle Catalysts
			## We work these out first so they're not invalidated by the actual effect block.
			if = {
				limit = {
					catalyst_granted_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope: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: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:actor
						}
					}
				}
			}
			if = {
				limit = {
					catalyst_revoked_powerful_diff_faith_vassal_religious_protection_preliminary_trigger = { CHAR = scope:recipient }
					scope: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: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:actor
						}
					}
				}
			}

			# Improving contract catalyst
#			if = {
#				limit = {
#					scope:recipient.count_obligation_improvements_for_vassal > 0
#					scope: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: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:actor
#						}
#					}
#				}
#			}
		}

		# Enact changes.
		scope:actor = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:recipient
				if = {
					limit = { vassal_obligation_increase_tyranny_gain != 0 }
					stress_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 = vassal_modify_contract_cooldown
							value = yes
							years = vassal_modify_contract_cooldown_value
						}
					}
				}

				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
						}
					}

				}
			}
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	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
}

nomad_vassal_modify_vassal_contract_interaction = {
	special_interaction = vassal_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	interface_priority = 65
	common_interaction = yes
	icon = icon_contract_modification_single

	send_name = "nomad_vassal_modify_vassal_contract_interaction_send"
	desc = nomad_vassal_modify_vassal_contract_interaction_desc

	redirect = {
		# need to reverse the role for the UI to work properly
		scope:recipient = {
			save_scope_as = secondary_recipient
		}
		scope:actor = {
			save_scope_as = recipient
		}

		scope:secondary_recipient = {
			save_scope_as = actor
		}
	}

	is_shown = {
		scope:recipient = {
			is_independent_ruler = no
			this != scope:actor
			liege = scope:actor
			is_tributary = no # this excludes tributary contracts by default
			vassal_contract_has_modifiable_obligations = yes
			government_has_flag = government_is_nomadic
		}
	}

	is_valid_showing_failures_only = {
		NOT = { scope:recipient = { is_at_war_with = scope:actor } }
	}

	can_send = {
		trigger_if = { #If you're blocked we don't want to show anything else
			limit = {
				scope:recipient = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:recipient = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			# There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers
			trigger_if = {
				limit = {
					scope:actor = {
						has_variable = vassal_modify_contract_cooldown
					}
				}
				custom_tooltip = {
					text = vassal_modify_contract_cooldown_desc
					scope:actor = {
						NOT = { has_variable = vassal_modify_contract_cooldown }
					}
				}
			}
			trigger_else = {
				custom_tooltip = {
					text = nomad_contract_request_cooldown_desc
					scope:actor = {
						NOT = { has_variable = nomad_contract_request_cooldown }
					}
				}
			}
			scope:actor = {
				has_changed_contract_obligation_trigger = yes
			}

			scope:recipient = {
				# Must be an even trade overall
				custom_description = {
					text = "vassal_modify_vassal_contract_cannot_increase_obligation_level"
					object = scope:actor
					value = count_obligation_improvements_for_vassal_include_hook
					count_obligation_improvements_for_vassal_include_hook = 0
				}

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}
			}
		}
	}

	auto_accept = yes

	on_accept = {
		# Enact changes
		scope:recipient = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:actor
				if = {
					limit = { always = scope:hook }
					use_hook = scope:actor
					add_achievement_flag_effect = { FLAG = achievement_fine_print_flag }
				}

				# Activate cooldown - To prevent liege from changing it too soon
				hidden_effect = {
					set_variable = {
						name = vassal_modify_contract_cooldown
						value = yes
						years = vassal_modify_contract_cooldown_value
					}
				}

				hidden_effect = { set_subject_contract_modification_blocked = yes }

				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
						}
					}
				}
			}
		}
		# If there's a diarch involved, and they called in their change, that gets flagged.
		diarch_changed_own_contract_effect = yes
		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	on_decline = {
		# Activate cooldown - You may only ask for it to be changed every so often (this mostly exists for MP, since you cannot send it to the AI unless they accept)
		hidden_effect = {
			scope:recipient = {
				set_variable = {
					name = nomad_contract_request_cooldown
					value = yes
					years = vassal_modify_contract_cooldown_value
				}
			}
		}
	}

	# Send Options
	# Hook
	send_option = {
		is_valid = {
			scope:recipient = {
				has_usable_hook = scope:actor
			}
		}
		flag = hook
		localization = SCHEME_HOOK
	}
	send_option = {
		is_shown = {
			scope:recipient = { is_diarch_of_target = scope:actor }
		}
		is_valid = {
			scope:recipient = {
				trigger_if = {
					limit = { has_variable_list = diarch_contract_rights_used_list }
					NOT = {
						is_target_in_variable_list = {
							name = diarch_contract_rights_used_list
							target = scope:actor
						}
					}
				}
			}
		}
		flag = diarch
		localization = CALL_IN_DIARCH_RIGHTS
	}
	should_use_extra_icon = {
		scope:recipient = { has_usable_hook = scope:actor }
	}
	extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
	send_options_exclusive = no
}

suzerain_modify_tributary_contract_interaction = {
	special_interaction = liege_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	common_interaction = yes
	icon = icon_contract_modification_single

	send_name = "suzerain_modify_tributary_contract_interaction_send"
	desc = suzerain_modify_tributary_contract_interaction_desc

	force_notification = yes
	notification_text = MODIFY_VASSAL_CONTRACT_NOTIFICATION_TO_VASSAL

	is_shown = {
		scope:recipient = {
			is_tributary_of = scope:actor # excludes vassals by default
			subject_contract_has_modifiable_obligations = yes
			NOT = { government_has_flag = government_is_herder }
		}
	}

	is_valid_showing_failures_only = {
		NOT = { scope:recipient = { is_at_war_with = scope:actor } }
	}

	can_send = {
		#Mandala gets special treatment
		trigger_if = {
			limit = {
				scope:actor = { government_has_flag = government_is_mandala }
			}
			custom_tooltip = {
				text = suzerain_modify_subject_contract_mandala_cooldown
				NOT = {
					scope:recipient = { var:suzerain_recently_adjusted_mandala_subject_contract ?= scope:actor }
				}
			}
			scope:actor = {
				has_changed_contract_obligation_trigger = yes

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}

				# If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook
				save_temporary_scope_value_as = {
					name = obligations_favoring_tributary
					value = scope:recipient.count_obligation_improvements_for_vassal
				}
				trigger_if = {
					limit = { scope:obligations_favoring_tributary > 0 }
					custom_description = {
						text = "tributary_modify_vassal_contract_unnecessary_hook_usage_vassal_favor"
						object = scope:recipient
						value = scope:obligations_favoring_tributary
						NOT = { always = scope:hook }
					}
				}
				trigger_else_if = {
					limit = { scope:obligations_favoring_tributary = 0 }
					custom_description = {
						text = "tributary_modify_vassal_contract_unnecessary_hook_usage_equal"
						object = scope:recipient
						NOT = { always = scope:hook }
					}
				}

				# You can afford the prestige cost of an unequal contract
				trigger_else_if = {
					limit = {
						scope:obligations_favoring_tributary < 0
						NOT = { always = scope:hook }
					}
					scope:actor = { piety >= major_piety_value }
				}
				trigger_else = {} # Otherwise we're fine!
			}
		}
		trigger_else_if = { #If they're blocked we don't want to show anything else
			limit = {
				scope:recipient = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:recipient = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			scope:actor = {
				has_changed_contract_obligation_trigger = yes

				# Cannot change more than three things at once
				custom_description = {
					text = "vassal_modify_vassal_contract_obligation_change_limit"
					value = list_size:changed_obligations
					list_size:changed_obligations <= max_contract_changes
				}

				# If the trade without the hook usage is already in the vassal's favour or fair then don't waste your hook
				save_temporary_scope_value_as = {
					name = obligations_favoring_tributary
					value = scope:recipient.count_obligation_improvements_for_vassal
				}
				trigger_if = {
					limit = { scope:obligations_favoring_tributary > 0 }
					custom_description = {
						text = "tributary_modify_vassal_contract_unnecessary_hook_usage_vassal_favor"
						object = scope:recipient
						value = scope:obligations_favoring_tributary
						NOT = { always = scope:hook }
					}
				}
				trigger_else_if = {
					limit = { scope:obligations_favoring_tributary = 0 }
					custom_description = {
						text = "tributary_modify_vassal_contract_unnecessary_hook_usage_equal"
						object = scope:recipient
						NOT = { always = scope:hook }
					}
				}

				# You can afford the prestige cost of an unequal contract
				trigger_else_if = {
					limit = {
						scope:obligations_favoring_tributary < 0
						NOT = { always = scope:hook }
					}
					scope:actor = {
						prestige >= medium_prestige_value
					}
				}
				trigger_else = {} # Otherwise we're fine!
			}
		}
	}

	auto_accept = yes

	on_accept = {
		scope:actor = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:recipient
				if = {
					limit = {
						always = scope:hook
					}
					use_hook = scope:recipient
					add_achievement_flag_effect = { FLAG = achievement_fine_print_flag }
				}

				# Prestige and opinion cost of making an unequal contract without a hook
				if = {
					limit = {
						scope:recipient.count_obligation_improvements_for_vassal < 0
						NOT = { always = scope:hook }
					}

					if = {
						limit = { government_has_flag = government_is_mandala }
						add_piety = major_piety_loss
					}
					else = { add_prestige = medium_prestige_loss }

					scope:recipient = {
						add_opinion = {
							modifier = outraged_opinion
							opinion = -30
							target = scope:actor
						}
					}

					every_tributary = {
						limit = {
							NOT = { this = scope:recipient }
						}
						add_opinion = {
							modifier = outraged_opinion
							opinion = -10
							target = scope:actor
						}
					}
				}

				scope:recipient = {
					hidden_effect = {
						set_subject_contract_modification_blocked = yes
					}
					set_variable = {
						name = suzerain_recently_adjusted_mandala_subject_contract
						value = scope:actor
						years = mandala_vassal_obligation_cooldown_years
					}
				}

				every_in_list = {
					list = changed_obligations

					save_scope_as = obligation

					scope:recipient = {
						tributary_contract_set_obligation_level = {
							type = scope:obligation.vassal_contract_type
							level = scope:obligation
						}
					}
				}
			}
		}

		# Additional Flavor Titles
		scope:recipient = { additional_flavor_check_effect = yes }
	}

	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
}

subject_modify_tributary_contract_interaction = {
	special_interaction = vassal_modify_vassal_contract
	interface = modify_vassal_contract
	category = interaction_category_vassal
	interface_priority = 65
	common_interaction = yes
	icon = icon_contract_modification_single

	send_name = "subject_modify_tributary_contract_interaction_send"
	desc = subject_modify_tributary_contract_interaction_desc

	is_shown = {
		scope:actor = {
			is_tributary_of = scope:recipient # excludes vassals by default
			subject_contract_has_modifiable_obligations = yes
		}
	}

	is_valid_showing_failures_only = {
		scope:actor = {
			is_travelling = no
		}
		NOT = { scope:recipient = { is_at_war_with = scope:actor } }
	}

	can_send = {
		#Mandala gets special treatment
		trigger_if = {
			limit = {
				scope:recipient = { government_has_flag = government_is_mandala }
			}
			custom_tooltip = {
				text = subject_modify_subject_contract_mandala_cooldown
				NOT = {
					scope:actor = { var:subject_recently_adjusted_mandala_subject_contract ?= scope:recipient }
				}
			}
			# You can afford the cost if there is one
			scope:actor = {
				has_changed_contract_obligation_trigger = yes
				trigger_if = {
					limit = { scope:hook = no } # no cost
					trigger_if = {
						limit = { subject_standing < 0 } # this means we don't use subject standing
						trigger_if = {
							limit = {
								government_has_flag = government_is_nomadic
								scope:recipient = { government_has_flag = government_is_nomadic }
							}
							domicile.herd >= domicile.major_herd_value
						}
						trigger_else = {
							gold >= major_gold_value
						}
					}
					trigger_else = {
						subject_standing > 20
					}
				}
			}
		}
		trigger_else_if = { #If you're blocked we don't want to show anything else (we don't really use this for admin, but we'll keep the logic, just in case)
			limit = {
				scope:actor = {
					subject_contract_is_blocked_from_modification = yes
				}
			}
			scope:actor = {
				subject_contract_is_blocked_from_modification = no
			}
		}
		trigger_else = {
			# There is no cooldown present - To make sure we somehow don't show both cooldowns at the same time, we split them into separate triggers
			trigger_if = {
				limit = {
					scope:actor = {
						has_variable = tributary_modify_contract_cooldown
					}
				}
				custom_tooltip = {
					text = tributary_modify_contract_cooldown_desc
					scope:actor = {
						NOT = { has_variable = tributary_modify_contract_cooldown }
					}
				}
			}
			trigger_else = {
				custom_tooltip = {
					text = tributary_modify_contract_cooldown_desc
					scope:actor = {
						NOT = { has_variable = tributary_modify_contract_cooldown }
					}
				}
			}

			# You can afford the cost if there is one
			scope:actor = {
				trigger_if = {
					limit = { scope:hook = no } # no cost
					trigger_if = {
						limit = { subject_standing < 0 } # this means we don't use subject standing
						trigger_if = {
							limit = {
								government_has_flag = government_is_nomadic
								scope:recipient = { government_has_flag = government_is_nomadic }
							}
							domicile.herd >= domicile.major_herd_value
						}
						trigger_else = {
							gold >= major_gold_value
						}
					}
					trigger_else = {
						subject_standing > 20
					}
				}
			}
		}
	}

	auto_accept = {
		custom_tooltip = {
			text = nomad_vassal_force_obligation_change_desc
			scope:hook = yes
		}
	}

	on_accept = {
		# Enact changes
		scope:actor = {
			send_interface_message = {
				type = msg_vassal_contract_change
				title = modify_vassal_contract_interaction_notification
				right_icon = scope:recipient

				# If you use a hook - Spend it
				if = {
					limit = { always = scope:hook }
					use_hook = scope:recipient
				}
				else = {
					if = {
						limit = { subject_standing < 0 } # this means we don't use subject standing
						if = {
							limit = {
								government_has_flag = government_is_nomadic
								scope:recipient = { government_has_flag = government_is_nomadic }
							}
							pay_herd = {
								target = scope:recipient
								value = domicile.major_herd_value
							}
						}
						else = {
							pay_short_term_gold = {
								target = scope:recipient
								gold = major_gold_value
							}
						}
					}
					else = {
						if = { # the subject tilting the contract in their favor costs Subject Standing
							limit = { scope:new_value < 0 }
							add_subject_standing = {
								value = 10
								multiply = scope:new_value
							}
						}
					}
				}

				# Activate cooldown - To prevent liege from changing it too soon
				hidden_effect = {
					set_variable = {
						name = tributary_modify_contract_cooldown
						value = yes
						years = tributary_modify_contract_cooldown_value
					}
				}
				set_variable = {
					name = subject_recently_adjusted_mandala_subject_contract
					value = scope:recipient
					years = mandala_vassal_obligation_cooldown_years
				}

				every_in_list = {
					list = changed_obligations

					save_scope_as = obligation

					scope:actor = {
						tributary_contract_set_obligation_level = {
							type = scope:obligation.subject_contract_type
							level = scope:obligation
						}
					}
				}
			}
		}

		# If there's a diarch involved, and they called in their change, that gets flagged.
		diarch_changed_own_contract_effect = yes
	}

	on_decline = {
		# Activate cooldown - You may only ask for it to be changed every so often (this mostly exists for MP, since you cannot send it to the AI unless they accept)
		hidden_effect = {
			scope:actor = {
				set_variable = {
					name = tributary_modify_contract_cooldown
					value = yes
					years = tributary_modify_contract_cooldown_value
				}
			}
		}
	}

	# Send Options
	# Hook
	send_option = {
		is_valid = {
			scope:actor = {
				has_usable_hook = scope:recipient
			}
		}
		flag = hook
		localization = SCHEME_HOOK
	}
	send_option = {
		is_shown = {
			scope:actor = { is_diarch_of_target = scope:recipient }
		}
		is_valid = {
			scope:actor = {
				trigger_if = {
					limit = { has_variable_list = diarch_contract_rights_used_list }
					NOT = {
						is_target_in_variable_list = {
							name = diarch_contract_rights_used_list
							target = scope:recipient
						}
					}
				}
			}
		}
		flag = diarch
		localization = CALL_IN_DIARCH_RIGHTS
	}
	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_accept = {
		base = -25

		# Opinion Factor
		opinion_modifier = {
			who = scope:recipient
			opinion_target = scope:actor
			multiplier = 1
			desc = AI_OPINION_REASON
		}

		modifier = {
			add = {
				add = scope:new_value
				multiply = -20 #Overlord favoring options have a negative score
				if = { # the Chinese Emperor cares less since they get tribute through missions as well
					limit = {
						scope:new_value < 0
						scope:actor = {
							OR = {
								has_subject_contract_group = tributary_celestial
								has_subject_contract_group = tributary_hegemonic
							}
						}
					}
					multiply = 0.5
				}
			}
			desc = AI_CONTRACT_BALANCE
		}
	}
}

ai_only_hegemonic_tributary_modify_tributary_contract_interaction = {
	category = interaction_category_vassal
	desc = subject_modify_tributary_contract_interaction_desc

	auto_accept = yes

	is_shown = {
		scope:actor = {
			is_ai = yes
			is_available = yes # Let's not have the AI do this when they're away from home etc (like paying tribute)
			is_tributary_of = scope:recipient # excludes vassals by default
			OR = {
				has_subject_contract_group = tributary_celestial
				has_subject_contract_group = tributary_hegemonic
			}
			subject_standing > 40
			subject_contract_has_modifiable_obligations = yes
			does_ai_subject_in_subject_contract_desire_obligation_change = yes
			NOT = { is_at_war_with = scope:recipient }
		}
	}

	on_accept = {
		scope:actor = {
			if = {
				# if the subject has a Seal of Investiture, they will always ask for an Investiture Privilege if they can
				limit = {
					any_character_artifact = {
						OR = {
							artifact_type = seal_of_investiture
							artifact_type = seal_of_investiture_court
						}
					}
				}
				random_list = {
					33 = {
						trigger = {
							tributary_contract_obligation_level_can_be_increased = celestial_tributary_investiture_privilege_trade
						}
						save_scope_value_as = { name = ask value = flag:trade }
					}
					33 = {
						trigger = {
							tributary_contract_obligation_level_can_be_increased = celestial_tributary_investiture_privilege_marriage
						}
						save_scope_value_as = { name = ask value = flag:marriage }
					}
					33 = {
						trigger = {
							tributary_contract_obligation_level_can_be_increased = celestial_tributary_investiture_privilege_politics
						}
						save_scope_value_as = { name = ask value = flag:politics }
					}
				}
			}
			suzerain = {
				trigger_event = char_interaction.0252
			}
		}
	}

	ai_potential = {
		always = yes
	}

	ai_targets = {
		ai_recipients = suzerain
	}

	ai_frequency_by_tier = {
		barony = 0
		county = 24
		duchy = 24
		kingdom = 24
		empire = 24
		hegemony = 0
	}

	ai_will_do = {
		base = 100
	}
}
