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

Grant Vassal

No costAccepted automatically in some cases

Make one of your Vassals become a Vassal of the recipient instead Granted Vassals have to be of a lower Rank than the recipient

What you need

You

To send it

  • None of these

    • You: Is at war with the target
  • If

    a check the game hides

    Then

    • None of these

      • The character you send: Is at war with the target
    • scope:recipient.primary_title.tier > scope:secondary_actor.primary_title.tier
  • If

    • You: Is played by the AI

    Then

    • If

      • None of these

        • The target’s primary title › Any in de jure hierarchy:
          • holder = scope:secondary_actor

      Then

      • scope:recipient.vassal_count < scope:recipient.vassal_limit
  • If

    • scope:recipient.highest_held_title_tier <= tier_county

    Then

  • Not all of these

    • You:
      • Is played by the AI
      • you has administrative government mechanic
    • The character you target: Their government does not have the administrative mechanic
    • The character you send: they has administrative government mechanic
  • Sōryō Vassals cannot be transferred to Ritsuryō Vassals by a Ritsuryō Liege
  • House Heads of Leading Houses of Blocs cannot be transferred as Vassals

To see it in the menu

  • The target is not you
  • One of these

    • All of these

      • exists = scope:recipient.liege
      • scope:recipient.liege ?= scope:puppet_or_actor
    • or

      All of these

      • exists = scope:puppet_or_actor.liege
      • root.liege ?= scope:recipient
    • or

      All of these

      • root.faith.religious_head ?= scope:recipient
      • The character you target: Is an Independent Ruler
  • scope:recipient.highest_held_title_tier > tier_barony

The character you target

Which character you can pick

  • The target is not you
  • Highest held Title is more than Barony Rank
  • Highest held Title is less than scope:recipient.highest held title tier Rank
  • If

    • root.liege = scope:recipient

    Then

  • You is not landed

Grant Vassal is a vassal character interaction in Crusader Kings III. You need: Sōryō Vassals cannot be transferred to Ritsuryō Vassals by a Ritsuryō Liege and House Heads of Leading Houses of Blocs cannot be transferred as Vassals. The character you target needs: Is landed and Does not have the Trait: Gallivanter. Accepted automatically in some cases. Patch 1.20.1.2, from game/common/character_interactions/00_vassal_interactions.txt.

for a guide, post or blog
Quick answers (1)
What are the requirements for Grant Vassal in CK3?
You: Sōryō Vassals cannot be transferred to Ritsuryō Vassals by a Ritsuryō Liege and House Heads of Leading Houses of Blocs cannot be transferred as Vassals. The character you target: Is landed and Does not have the Trait: Gallivanter. (patch 1.20.1.2)

Will they accept?

Accepted automatically when:

  • The character you target: They will always accept more power

What happens

If they accept

  • If

    • You › Any patroned holy order:
      • leader.capital_county.holder ?= { target_is_same_character_or_above = scope:secondary_actor }
    • The character you target: Highest held Title is at least Duchy Rank

    Then

  • If

    • You: Is a vassal of the target

    Then

    • add_truce_both_ways = { character = scope:secondary_actor days = 3650 name = TRUCE_GRANT_INDEPENDENCE }
  • The character you send:
    • change_liege = { liege = scope:recipient change = scope:change }
  • The character you target: Opinion: Granted Me a Vassal
  • 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

    • Yes
    • 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

    • You: Is played by a person

    Then

    • The character you send:
      • If

        • Any held title: Any claimant:

        Then

        • The character you target: … will not lose Opinion of … for giving away … Claims of …-Tier or lower for 3 years
      • Every held title:
        • Where: Title tier at least County · Title tier exactly scope:secondary actor.primary title.tier
        • You:
          • If

            • The title transfered: Title tier at least Kingdom

            Then

            • Every in list:
              • Only some of them (the filter is in the script below)
              • If

                • has_strong_claim_on = scope:title_transfered

                Then

                Otherwise

            • Every in list:
              • Where › Any held title: Any in de jure hierarchy:
              • If

                • One of these

                  • exists = scope:secondary_actor
                  • or

                    Any vassal or below: Is the target

                Then

                Otherwise

            • Every in list:
              • Where › Any held title:
                • Title tier at least scope:title transfered.tier minus 1
                • Any this title or de jure above:
              • If any liege or above: Opinion: Overlooked for De Jure Liege Title (-20)
              • Otherwise: Opinion: Overlooked for De Jure Liege Title (-30)

            Else if

            • One of these

              • The title transfered: Title tier at least Duchy
              • or

                exists = scope:secondary_actor

            Then

            • Every in list:
              • Where:
                • NOT = { has_strong_implicit_claim_on = scope:title_transfered }
                • Any claim:
                  • pressed = yes
              • Opinion: Spurned My Pressed Claim (-40)
            • Every in list:
              • Where:
                • NOT = { has_strong_implicit_claim_on = scope:title_transfered }
                • Any claim:
                  • pressed = no
              • Opinion: Spurned My Unpressed Claim (-20)
            • Every in list:
              • Where › Any held title: Any in de jure hierarchy:
              • If

                • One of these

                  • exists = scope:secondary_actor
                  • or

                    Any vassal or below: Is the target

                Then

                Otherwise

            • Every in list: … (more in the script below)
          • … (more in the script below)
      • … (more in the script below)
    • … (more in the script below)

If they refuse

  • Event char_interaction.0211
  • 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:puppet_or_actor.house
        • The target’s house is not your
      • or

        You: Is Lowborn

    Then

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

Events it fires: pam_interactions_events.0040, char_interaction.0211

• 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) (18 lines of game script)
is_shown = scope:recipient != scope:puppet_or_actor
OR = {
	AND = {
		exists = scope:recipient.liege
		scope:recipient.liege ?= scope:puppet_or_actor
	}
	AND = {
		exists = scope:puppet_or_actor.liege
		scope:puppet_or_actor.liege ?= scope:recipient
	}
	AND = {
		scope:puppet_or_actor.faith.religious_head ?= scope:recipient
		scope:recipient = {
			top_liege = this
		}
	}
}
scope:recipient.highest_held_title_tier > tier_barony

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

Can be sent when (is_valid…) (107 lines of game script)
scope:recipient = {
	is_landed = yes
	NOT = {
		has_trait = gallivanter
	}
}
NOT = {
	scope:puppet_or_actor = {
		is_at_war_with = scope:recipient
	}
}
trigger_if = {
	limit = {
		exists = scope:secondary_actor
	}
	NOT = {
		scope:secondary_actor = {
			is_at_war_with = scope:recipient
		}
	}
	scope:recipient.primary_title.tier > scope:secondary_actor.primary_title.tier
}
trigger_if = {
	limit = {
		scope:puppet_or_actor = {
			is_ai = yes
		}
		exists = scope:secondary_actor
	}
	trigger_if = {
		limit = {
			NOT = {
				scope:recipient.primary_title = {
					any_in_de_jure_hierarchy = {
						holder = scope:secondary_actor
					}
				}
			}
		}
		scope:recipient.vassal_count < scope:recipient.vassal_limit
	}
	scope:secondary_actor = {
		NOT = {
			has_character_flag = ai_should_not_transfer
		}
	}
}
trigger_if = {
	limit = {
		scope:recipient.highest_held_title_tier <= tier_county
	}
	scope:recipient = {
		highest_held_title_tier > tier_county
	}
}
trigger_else = {
	scope:puppet_or_actor = {
		custom_description = {
			text = basic_valid_vassal_to_tranfer
			object = scope:recipient
			any_vassal = {
				NOT = {
					highest_held_title_tier = tier_barony
				}
				scope:recipient.highest_held_title_tier > highest_held_title_tier
			}
		}
	}
}
NAND = {
	scope:puppet_or_actor ?= {
		is_ai = yes
		government_has_mechanic = administrative
	}
	scope:recipient ?= {
		NOT = {
			government_has_mechanic = administrative
		}
	}
	scope:secondary_actor ?= {
		government_has_mechanic = administrative
	}
}
custom_tooltip = {
	text = ritsuryo_to_soryo_invalid_to_transfer
	NAND = {
		scope:puppet_or_actor ?= {
			has_government = japan_administrative_government
		}
		scope:recipient ?= {
			has_government = japan_administrative_government
		}
		scope:secondary_actor ?= {
			has_government = japan_feudal_government
		}
	}
}
custom_tooltip = {
	text = cannot_transfer_bloc_leader_as_vassal_tt
	NOT = {
		scope:secondary_actor ?= {
			exists = house.house_confederation.leading_house
			house.house_confederation.leading_house ?= house
			is_house_head = yes
		}
	}
}

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

Effects (on_send, on_accept, on_decline) (215 lines of game script)
on_accept = if = {
	limit = {
		scope:puppet_or_actor = {
			any_patroned_holy_order = {
				leader.capital_county.holder ?= {
					target_is_same_character_or_above = scope:secondary_actor
				}
			}
		}
		scope:recipient = {
			highest_held_title_tier >= tier_duchy
		}
	}
	scope:puppet_or_actor = {
		custom_tooltip = holy_order_control_loss_warning_tt
	}
}
scope:puppet_or_actor = {
	send_interface_toast = {
		type = event_toast_effect_good
		title = grant_vassal_interaction_notification
		right_icon = scope:recipient
		left_icon = scope:secondary_actor
		if = {
			limit = {
				scope:puppet_or_actor = {
					is_vassal_of = scope:recipient
				}
			}
			add_truce_both_ways = {
				character = scope:secondary_actor
				days = 3650
				name = TRUCE_GRANT_INDEPENDENCE
			}
		}
		create_title_and_vassal_change = {
			type = granted
			save_scope_as = change
			add_claim_on_loss = no
		}
		scope:secondary_actor = {
			change_liege = {
				liege = scope:recipient
				change = scope:change
			}
		}
		resolve_title_and_vassal_change = scope:change
		scope:recipient = {
			add_opinion = {
				target = scope:puppet_or_actor
				modifier = granted_vassal
			}
		}
	}
}
add_clan_unity_interaction_effect = {
	CHARACTER = scope:puppet_or_actor
	TARGET = scope:recipient
	VALUE = miniscule_unity_gain
	DESC = clan_unity_grant_vassal.desc
	REVERSE_NON_HOUSE_TARGET = yes
}
hidden_effect = {
	if = {
		limit = {
			fp3_struggle_involves_one_supporter_and_one_detractor = {
				FIRST = scope:puppet_or_actor
				SECOND = scope:recipient
			}
			scope:puppet_or_actor = {
				any_character_struggle = {
					involvement = involved
					phase_has_catalyst = catalyst_grants_vassal_to_de_jure_liege_supporter_detractor
					is_secondary_character_involvement_involved_trigger = {
						CHAR = scope:recipient
					}
				}
			}
			scope:recipient.primary_title = {
				any_this_title_or_de_jure_above = {
					holder = scope:secondary_actor
				}
			}
		}
		scope:puppet_or_actor = {
			every_character_struggle = {
				involvement = involved
				activate_struggle_catalyst = {
					catalyst = catalyst_grants_vassal_to_de_jure_liege_supporter_detractor
					character = scope:puppet_or_actor
				}
				log_debug_variable_for_persian_struggle_effect = {
					VAR = concession_catalyst_grants_vassal_to_de_jure_liege_supporter_detractor
				}
			}
		}
	}
	if = {
		limit = {
			scope:recipient = {
				government_has_flag = government_is_nomadic
			}
		}
		while = {
			limit = {
				scope:secondary_actor ?= {
					any_held_title = {
						vassal_grant_de_jure_shift_trigger = yes
					}
				}
			}
			scope:secondary_actor ?= {
				random_held_title = {
					limit = {
						vassal_grant_de_jure_shift_trigger = yes
					}
					set_de_jure_liege_title = scope:recipient.primary_title
				}
			}
		}
	}
}
if = {
	limit = {
		scope:puppet_or_actor = {
			is_ai = no
		}
	}
	scope:secondary_actor = {
		if = {
			limit = {
				any_held_title = {
					any_claimant = {
						this = scope:recipient
					}
				}
			}
			ordered_held_title = {
				order_by = tier
				limit = {
					any_claimant = {
						this = scope:recipient
					}
				}
				save_scope_as = highest_claim
			}
			scope:recipient = {
				claimant_jealousy_immunity_effect = yes
			}
		}
		every_held_title = {
			limit = {
				tier >= tier_county
				tier = scope:secondary_actor.primary_title.tier
			}
			save_scope_as = title_transfered
			scope:puppet_or_actor = {
				title_granting_controversy_effect = {
					TITLE = scope:title_transfered
					INTERACTION = grant_vassal_interaction
				}
			}
		}
		every_in_list = {
			list = strong_claimants
			limit = {
				NOT = {
					this = scope:recipient
				}
			}
			save_scope_as = claimer
			scope:secondary_actor = {
				ordered_held_title = {
					limit = {
						any_claimant = {
							this = scope:claimer
						}
					}
					save_scope_as = highest_denied_claim
				}
			}
			claimant_rivalry_mercy_effect = yes
		}
	}
	if = {
		limit = {
			NOT = {
				scope:secondary_actor = {
					any_held_title = {
						any_this_title_or_de_jure_above = {
							holder ?= scope:recipient
						}
					}
				}
			}
		}
		scope:secondary_actor = {
			add_opinion = {
				modifier = subordinated_to_non_de_jure_liege_opinion
				target = scope:puppet_or_actor
				opinion = -30
			}
		}
	}
}
on_decline = scope:puppet_or_actor = {
	trigger_event = char_interaction.0211
}
add_clan_unity_interaction_effect = {
	CHARACTER = scope:recipient
	TARGET = scope:puppet_or_actor
	VALUE = miniscule_unity_loss
	DESC = clan_unity_grant_vassal_decline.desc
	REVERSE_NON_HOUSE_TARGET = no
}

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

Category
Vassal actions
In the menu
under More…
ID
grant_vassal_interaction

Source: game/common/character_interactions/00_vassal_interactions.txt and the English localisation, Crusader Kings III 1.20.1.2. “You” is the character who sends it (scope:actor, or a puppet acting for you); “the character you target” is the recipient.

Spotted a mistake on this page?