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

Request Contract Change

No costAccepted automatically in some cases; otherwise the AI weighs it

Renegotiate your Tributary Contract with the recipient

What you need

You

To send it

  • None of these

    • The character you target: Is at war with you
  • If

    Then

    • … … changed the obligations recently and need to wait until …
    • You:
      • If

        • You don’t use a Hook

        Then

        • If subject Standing less than 0:
          • If

            Then

            • domicile.herd >= domicile.major_herd_value

            Otherwise

            • gold >= major_gold_value
        • Otherwise: Subject Standing more than 20

    Else if

    • You:
      • subject_contract_is_blocked_from_modification = yes

    Then

    • You:
      • subject_contract_is_blocked_from_modification = no

    Otherwise

    • If

      • You: Has “tributary modify contract cooldown” (a variable the game's script sets)

      Then

      • The Tributary Contract can only be changed once every 5 years - Can be changed again after …

      Otherwise

      • The Tributary Contract can only be changed once every 5 years - Can be changed again after …
    • You:
      • If

        • You don’t use a Hook

        Then

        • If subject Standing less than 0:
          • If

            Then

            • domicile.herd >= domicile.major_herd_value

            Otherwise

            • gold >= major_gold_value
        • Otherwise: Subject Standing more than 20
  • Also needed: not traveling

To see it in the menu

  • Is a tributary of the target
  • subject_contract_has_modifiable_obligations = yes

Request Contract Change is a vassal character interaction in Crusader Kings III. You need: Is not traveling. Accepted automatically in some cases; otherwise the AI weighs it. Patch 1.20.1.2, from game/common/character_interactions/00_modifiy_vassal_contract.txt.

for a guide, post or blog
Quick answers (2)
What are the requirements for Request Contract Change in CK3?
You: Is not traveling. (patch 1.20.1.2)
How do I get the AI to accept Request Contract Change?
Accepted automatically in some cases; otherwise the AI weighs it. Its reasons: … Opinion of … and Contract benefits.

Will they accept?

Accepted automatically when:

  • … is forced to accept

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

ReasonAmount
Base-25
… Opinion of …varies
Contract benefitsvaries
Acceptance (ai_accept) (26 lines of game script)
base = -25
opinion_modifier = {
	who = scope:recipient
	opinion_target = scope:puppet_or_actor
	multiplier = 1
	desc = AI_OPINION_REASON
}
modifier = {
	add = {
		add = scope:new_value
		multiply = -20
		if = {
			limit = {
				scope:new_value < 0
				scope:puppet_or_actor = {
					OR = {
						has_subject_contract_group = tributary_celestial
						has_subject_contract_group = tributary_hegemonic
					}
				}
			}
			multiply = 0.5
		}
	}
	desc = AI_CONTRACT_BALANCE
}

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

What happens

If they accept

  • If

    Then

    • Use a Hook on the target

    Otherwise

    • If subject Standing less than 0:
      • If

        Then

        • pay_herd = { target = scope:recipient value = domicile.major_herd_value }

        Otherwise

        • Pay gold to the target
    • Otherwise:
      • If

        • scope:new_value < 0

        Then

        • add_subject_standing = { value = 10 multiply = scope:new_value }
  • Every in list › You:
    • tributary_contract_set_obligation_level = { type = scope:obligation.subject_contract_type level = scope:obligation }
  • If never:
    • If

      a check the game hides

      Then

      • The diarch:
        • … use your status as Diarch to countersign some of … own changes
        • If

          • diarch ?= scope:liege
          • has_diarchy_active_parameter = diarchy_is_co_rulership

          Then

          • Opinion: Abused Position of Trust (-10)

          Otherwise

          • Opinion: Abused Position of Trust (-40)

Options when sending

  • Use a Hook
  • Use Borrowed Powers

• 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) (4 lines of game script)
is_shown = scope:puppet_or_actor = {
	is_tributary_of = scope:recipient
	subject_contract_has_modifiable_obligations = yes
}

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

Can be sent when (is_valid…) (118 lines of game script)
scope:puppet_or_actor = {
	is_travelling = no
}
NOT = {
	scope:recipient = {
		is_at_war_with = scope:puppet_or_actor
	}
}
trigger_if = {
	limit = {
		scope:recipient = {
			government_has_flag = government_is_mandala
		}
	}
	custom_tooltip = {
		text = subject_modify_subject_contract_mandala_cooldown
		NOT = {
			scope:puppet_or_actor = {
				var:subject_recently_adjusted_mandala_subject_contract ?= scope:recipient
			}
		}
	}
	scope:puppet_or_actor = {
		has_changed_contract_obligation_trigger = yes
		trigger_if = {
			limit = {
				scope:hook = no
			}
			trigger_if = {
				limit = {
					subject_standing < 0
				}
				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 = {
	limit = {
		scope:puppet_or_actor = {
			subject_contract_is_blocked_from_modification = yes
		}
	}
	scope:puppet_or_actor = {
		subject_contract_is_blocked_from_modification = no
	}
}
trigger_else = {
	scope:puppet_or_actor = {
		has_changed_contract_obligation_trigger = yes
	}
	trigger_if = {
		limit = {
			scope:puppet_or_actor = {
				has_variable = tributary_modify_contract_cooldown
			}
		}
		custom_tooltip = {
			text = tributary_modify_contract_cooldown_desc
			scope:puppet_or_actor = {
				NOT = {
					has_variable = tributary_modify_contract_cooldown
				}
			}
		}
	}
	trigger_else = {
		custom_tooltip = {
			text = tributary_modify_contract_cooldown_desc
			scope:puppet_or_actor = {
				NOT = {
					has_variable = tributary_modify_contract_cooldown
				}
			}
		}
	}
	scope:puppet_or_actor = {
		trigger_if = {
			limit = {
				scope:hook = no
			}
			trigger_if = {
				limit = {
					subject_standing < 0
				}
				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
			}
		}
	}
}

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

Effects (on_send, on_accept, on_decline) (81 lines of game script)
on_accept = scope:puppet_or_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
		}
		else = {
			if = {
				limit = {
					subject_standing < 0
				}
				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 = {
					limit = {
						scope:new_value < 0
					}
					add_subject_standing = {
						value = 10
						multiply = scope:new_value
					}
				}
			}
		}
		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:puppet_or_actor = {
				tributary_contract_set_obligation_level = {
					type = scope:obligation.subject_contract_type
					level = scope:obligation
				}
			}
		}
	}
}
diarch_changed_own_contract_effect = yes
on_decline = hidden_effect = {
	scope:puppet_or_actor = {
		set_variable = {
			name = tributary_modify_contract_cooldown
			value = yes
			years = tributary_modify_contract_cooldown_value
		}
	}
}

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

Category
Vassal actions
In the menu
main list
ID
subject_modify_tributary_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?