Interaction · Vassal actions
Retract Vassal
Make one of the recipient Vassals become your Direct Vassal instead
What you need
You
To send it
None of these
- You: Is at war with the target
- The character you target: Does not have a Strong Hook on you
- … cannot take overt hostile actions against … Diarch
To see it in the menu
- If played by the AI:
has_realm_law_flag = title_revocation_allowedprimary_title.tier > tier_county
- The target is not you
The character you target
To send it
- Does not have a Strong Hook on you
Retract Vassal is a vassal character interaction in Crusader Kings III. The character you target needs: Does not have a Strong Hook on you. Accepted automatically in some cases; otherwise the AI weighs it. Reasons the AI weighs include Legalism (+25), Hard Difficulty (-50), Very Hard Difficulty (-100) and 10 more. It costs Prestige (varies). Patch 1.20.1.2, from game/common/character_interactions/00_vassal_interactions.txt.
Quick answers (3)
- What are the requirements for Retract Vassal in CK3?
- The character you target: Does not have a Strong Hook on you. (patch 1.20.1.2)
- How do I get the AI to accept Retract Vassal?
- Accepted automatically in some cases; otherwise the AI weighs it. Its reasons: Legalism +25, Hard Difficulty -50, Very Hard Difficulty -100, Weak Hook used +40, … Opinion of …, Refusal is Treason +25, Trusting +20, Content +20, Craven +20, Vassal holds your Realm Capital (or De Jure Duchy) +50, Vassal belongs to your Capital Duchy +30, The other character is not a De Jure Vassal +25, Vassal rightfully belongs under you +15, Intimidated by you, Terrified of you, Difference in your Military Strength (max +20), Infidel splitting the faithful and Indomitable Azatani -25.
- How much does Retract Vassal cost?
- Prestige (varies) (patch 1.20.1.2).
Will they accept?
Accepted automatically when:
One of these
- The character you target: Is imprisoned by you
or
They use their Hook on …
Otherwise the AI adds these up and accepts above zero; near zero the answer is partly random (ai_maybe). Reasons in italics are the script's, with no label in the game.
| Reason | Amount |
|---|---|
| Base | 0 |
Legalismwhen
| +25 |
Hard Difficultywhen
| -50 |
Very Hard Difficultywhen
| -100 |
A scripted reasonwhen
| +50 |
A scripted reasonwhen
| +100 |
Weak Hook usedwhen
| +40 |
| … Opinion of … | varies |
Refusal is Treasonwhen
| +25 |
| Trusting | +20 |
| Content | +20 |
| Craven | +20 |
| Their personality (AI values: greed (scripted), honor (scripted)) | varies |
Vassal holds your Realm Capital (or De Jure Duchy)when
| +50 |
Vassal belongs to your Capital Duchywhen
| +30 |
The other character is not a De Jure Vassalwhen
| +25 |
Vassal rightfully belongs under youwhen
| +15 |
Intimidated by youwhen
| intimidated_halved_reason_value |
Terrified of youwhen
| cowed_halved_reason_value |
| Difference in your Military Strength (max +20) | varies |
Infidel splitting the faithfulwhen
| varies |
A scripted reasonwhen
| +500 |
Indomitable Azataniwhen
| -25 |
Acceptance (ai_accept) (251 lines of game script)
base = 0
legalism_lawful_authority_acceptance_modifier = {
ACTOR = scope:puppet_or_actor
}
modifier = {
has_game_rule = hard_difficulty
scope:actor = {
is_ai = no
}
add = -50
desc = FACTION_REASON_DIFFICULTY_HARD
}
modifier = {
has_game_rule = very_hard_difficulty
scope:actor = {
is_ai = no
}
add = -100
desc = FACTION_REASON_DIFFICULTY_VERY_HARD
}
modifier = {
has_game_rule = hard_difficulty
scope:actor = {
is_ai = yes
}
add = 50
}
modifier = {
has_game_rule = very_hard_difficulty
scope:actor = {
is_ai = yes
}
add = 100
}
modifier = {
scope:hook = yes
add = 40
desc = SCHEME_WEAK_HOOK_USED
}
opinion_modifier = {
who = scope:recipient
opinion_target = scope:puppet_or_actor
multiplier = 1.0
desc = AI_OPINION_REASON
}
modifier = {
add = 25
scope:puppet_or_actor = {
has_realm_law_flag = vassal_refusal_is_treason
}
desc = AI_REFUSAL_IS_TREASON
}
modifier = {
add = 20
scope:recipient = {
has_trait = trusting
}
desc = TAKE_THE_VOWS_TRUSTING
}
modifier = {
add = 20
scope:recipient = {
has_trait = content
}
desc = INTERACTION_CONTENT
}
modifier = {
add = 20
scope:puppet_or_actor.current_military_strength > scope:recipient.current_military_strength
scope:recipient = {
has_trait = craven
}
desc = INTERACTION_CRAVEN
}
ai_value_modifier = {
who = scope:recipient
ai_greed = {
if = {
limit = {
scope:recipient = {
NOT = {
ai_greed = 0
}
}
}
value = -0.25
}
}
ai_honor = {
if = {
limit = {
scope:recipient = {
ai_honor > 0
}
scope:puppet_or_actor = {
has_realm_law_flag = vassal_refusal_is_treason
}
}
value = 0.75
}
}
}
modifier = {
exists = scope:puppet_or_actor.primary_title.title_capital_county
scope:secondary_recipient = {
OR = {
any_sub_realm_county = {
this = scope:puppet_or_actor.primary_title.title_capital_county
}
any_sub_realm_duchy = {
this = scope:puppet_or_actor.primary_title.title_capital_county.de_jure_liege
}
}
}
add = 50
desc = AI_VASSAL_HOLDS_REALM_CAPITAL
}
modifier = {
exists = scope:puppet_or_actor.primary_title.title_capital_county
scope:secondary_recipient = {
NOR = {
any_sub_realm_county = {
this = scope:puppet_or_actor.primary_title.title_capital_county
}
any_sub_realm_duchy = {
this = scope:puppet_or_actor.primary_title.title_capital_county.de_jure_liege
}
}
primary_title.tier = tier_county
any_sub_realm_county = {
de_jure_liege = scope:puppet_or_actor.primary_title.title_capital_county.de_jure_liege
}
}
add = 30
desc = AI_VASSAL_IS_IN_CAPITAL_DUCHY
}
modifier = {
add = 25
NOT = {
scope:recipient = {
any_held_title = {
is_de_jure_liege_or_above_target = scope:secondary_recipient.primary_title
}
}
}
desc = AI_REFUSAL_IS_NOT_DE_JURE_LIEGE
}
modifier = {
add = 15
scope:puppet_or_actor = {
any_held_title = {
this = scope:secondary_recipient.primary_title.de_jure_liege
}
}
desc = AI_REFUSAL_IS_DE_JURE_LIEGE
}
modifier = {
add = intimidated_halved_reason_value
scope:recipient = {
has_dread_level_towards = {
target = scope:puppet_or_actor
level = 1
}
}
desc = INTIMIDATED_REASON
}
modifier = {
add = cowed_halved_reason_value
scope:recipient = {
has_dread_level_towards = {
target = scope:puppet_or_actor
level = 2
}
}
desc = COWED_REASON
}
modifier = {
desc = offer_vassalization_interaction_aibehavior_power_tt
add = {
value = 1
subtract = {
value = scope:recipient.current_military_strength
divide = {
value = scope:puppet_or_actor.current_military_strength
min = 1
}
}
multiply = 100
}
}
modifier = {
desc = AI_REFUSAL_SPLITTING_SAME_FAITH_VASSALS
trigger = {
scope:puppet_or_actor.faith = scope:secondary_recipient.faith
scope:puppet_or_actor = {
NOR = {
faith = scope:recipient.faith
rite = {
rite_has_doctrine = doctrine_pluralism_pluralistic
}
}
}
}
add = {
value = -25
if = {
limit = {
scope:puppet_or_actor.faith = {
faith_hostility_level = {
target = scope:recipient.faith
value >= faith_hostile_level
}
}
}
add = -10
}
if = {
limit = {
scope:puppet_or_actor.faith = {
faith_hostility_level = {
target = scope:recipient.faith
value >= faith_evil_level
}
}
}
add = -25
}
}
}
modifier = {
scope:puppet_or_actor = {
is_ai = yes
OR = {
has_trait = greatest_of_khans
has_character_modifier = the_great_khan_modifier
}
}
scope:recipient = {
is_ai = yes
}
add = 500
}
modifier = {
add = -25
scope:recipient = {
culture = {
has_cultural_parameter = vassals_more_likely_to_refuse_demands
}
}
desc = VASSALS_REFUSAL_indomitable_azatani
}As written in game/common/character_interactions/00_vassal_interactions.txt.
What happens
If they accept
- You:
If
a check the game hides
Then
If
has_revoke_title_reason = scope:recipient
Then
consume_revoke_title_reason = scope:recipient
Otherwise
change_strife_opinion = major_strife_gain
Else if
None of these
exists = scope:administrative_revocationAll of these
- they has administrative government mechanic
- The character you target: they has administrative government mechanic
has_revoke_title_reason = scope:recipientOne of these
or
Then
- If has Legitimacy: Loses 50 Legitimacy
add_tyranny = { … }
Else if
has_revoke_title_reason = scope:recipient
Then
Else if
- Their rite:
- Their faith:
faith_hostility_level = { target = scope:recipient.faith value >= faith_hostile_level }
Then
If
Then
- Every ⟨faith⟩ vassal:
- Where: Their faith is the same as that of recipient
- Opinion: Angry (-5)
If
None of these
exists = scope:administrative_revocationAll of these
- they has administrative government mechanic
- The character you target: they has administrative government mechanic
has_revoke_title_reason = scope:recipientOne of these
or
Then
- Stress and fulfillment impact: by trait: Generous +40, Just +40
Otherwise
- Stress and fulfillment impact: by trait: Generous +40, Forgiving +20
consume_revoke_title_reason = scope:recipient
- The other character:
change_liege = { liege = scope:puppet_or_actor change = scope:change }
- The character you target: Opinion: Retracted My Vassal
- Event char_interaction.0220
If they refuse
If
a check the game hides
Then
If
has_revoke_title_reason = scope:recipient
Then
consume_revoke_title_reason = scope:recipient
Otherwise
change_strife_opinion = major_strife_gain
Else if
None of these
exists = scope:administrative_revocationAll of these
- you has administrative government mechanic
- The character you target: they has administrative government mechanic
has_revoke_title_reason = scope:recipientOne of these
or
Then
- If has Legitimacy: Loses 50 Legitimacy
add_tyranny = { … }
Else if
has_revoke_title_reason = scope:recipient
Then
Else if
- Your rite:
- Your faith:
faith_hostility_level = { target = scope:recipient.faith value >= faith_hostile_level }
Then
- The character you target:
start_war = { casus_belli = refused_liege_demand_war target = scope:liege_temp }
- Every in list › The liege temp: … joins … rebellion
- Every player:
- Where: Is a vassal of the liege temp
- Event char_interaction.0232
- The rebel temp: Opinion: Attempted Arrest
- The character you target: Opinion: Retracted My Vassal
Options when sending
- Use a Hook
Events it fires: char_interaction.0220, char_interaction.0232
• 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) (12 lines of game script)
is_available = trigger_if = {
limit = {
is_ai = yes
}
has_realm_law_flag = title_revocation_allowed
primary_title.tier > tier_county
}
is_shown = scope:recipient != scope:puppet_or_actor
scope:recipient = {
highest_held_title_tier > tier_barony
liege ?= scope:puppet_or_actor
}As written in game/common/character_interactions/00_vassal_interactions.txt.
Can be sent when (is_valid…) (64 lines of game script)
vassal_retraction_standard_valid_showing_failures_only_trigger = yes
scope:recipient = {
custom_description = {
text = basic_vassal_to_retract
object = scope:actor
any_vassal = {
highest_held_title_tier > tier_barony
}
}
}
scope:puppet_or_actor = {
trigger_if = {
limit = {
government_has_flag = government_is_tribal
}
custom_description = {
text = has_law_allowing_vassal_retraction_tribal
has_realm_law_flag = vassal_retraction_allowed
}
}
trigger_else_if = {
limit = {
government_has_flag = government_is_administrative
}
custom_description = {
text = has_law_allowing_vassal_retraction_admin
has_realm_law_flag = vassal_retraction_allowed
}
}
trigger_else_if = {
limit = {
realm_law_use_church_authority = yes
}
custom_description = {
text = has_law_allowing_vassal_retraction_church
has_realm_law_flag = vassal_retraction_allowed
}
}
trigger_else = {
custom_description = {
text = has_law_allowing_vassal_retraction_crown
has_realm_law_flag = vassal_retraction_allowed
}
}
}
scope:recipient = {
NOT = {
has_strong_hook = scope:puppet_or_actor
}
}
custom_tooltip = {
text = cannot_take_overt_hostile_actions_against_diarch.tt
NOT = {
scope:recipient ?= scope:puppet_or_actor.diarch
}
}
scope:puppet_or_actor = {
custom_description = {
text = character_interactions_hostile_actions_disabled_delay
NOT = {
has_character_flag = flag_hostile_actions_disabled_delay
}
}
}As written in game/common/character_interactions/00_vassal_interactions.txt.
Effects (on_send, on_accept, on_decline) (65 lines of game script)
on_send = scope:puppet_or_actor = {
add_character_flag = {
flag = flag_hostile_actions_disabled_delay
days = 10
}
}
hidden_effect = {
scope:secondary_recipient = {
add_character_flag = {
flag = ai_should_not_transfer
years = 3
}
}
}
on_accept = retract_vassal_interaction_effect = yes
if = {
limit = {
scope:puppet_or_actor = {
has_character_flag = flag_hostile_actions_disabled_delay
}
}
scope:puppet_or_actor = {
remove_character_flag = flag_hostile_actions_disabled_delay
}
}
scope:puppet_or_actor = {
trigger_event = char_interaction.0220
}
on_decline = scope:puppet_or_actor = {
vassal_revocation_tyranny_effect = yes
}
war_for_retraction_effect = {
LIEGE = scope:puppet_or_actor
REBEL = scope:recipient
SUBVASSAL = scope:secondary_recipient
}
scope:recipient = {
add_opinion = {
target = scope:puppet_or_actor
modifier = retracted_vassal
}
}
if = {
limit = {
scope:puppet_or_actor = {
has_realm_law_flag = vassal_refusal_is_treason
}
}
scope:puppet_or_actor = {
add_opinion = {
target = scope:recipient
modifier = treasonous_retract_refusal
}
}
}
if = {
limit = {
scope:puppet_or_actor = {
has_character_flag = flag_hostile_actions_disabled_delay
}
}
scope:puppet_or_actor = {
remove_character_flag = flag_hostile_actions_disabled_delay
}
}As written in game/common/character_interactions/00_vassal_interactions.txt.
- Category
- Vassal actions
- Cost: Prestige
- varies
- In the menu
- under More…
- ID
retract_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.