N3OW_Western_eastern_europe/common/character_interactions/00_vassal_interactions.txt

3345 lines
72 KiB
Text

#Interactions relating to vassals
grant_vassal_interaction = {
category = interaction_category_vassal
common_interaction = yes
interface = transfer_vassal
icon = icon_vassal
special_interaction = grant_vassal_interaction
populate_actor_list = {
scope:actor = {
every_vassal = {
add_to_list = characters
}
}
}
desc = grant_vassal_interaction_desc
prompt = GRANT_VASSAL_SELECT_VASSAL_TO_TRANSFER
greeting = positive
notification_text = GRANT_VASSAL_PROPOSAL
pre_answer_yes_key = ACCEPT
pre_answer_no_key = DECLINE
is_shown = {
NOT = { scope:recipient = scope:actor }
OR = {
AND = {
exists = scope:recipient.liege
scope:recipient.liege = scope:actor
}
AND = {
exists = scope:actor.liege
scope:actor.liege = scope:recipient
}
AND = {
scope:actor.faith.religious_head = scope:recipient
scope:recipient = {
is_independent_ruler = yes
}
}
}
scope:recipient.highest_held_title_tier > tier_barony
}
is_valid_showing_failures_only = {
scope:recipient = { is_busy_in_events_localised = yes }
scope:recipient = { is_landed_or_landless_administrative = yes }
# Gallivanters won't accept additional responsibilities.
scope:recipient = {
NOT = { has_trait = gallivanter }
}
NOT = { scope: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:secondary_actor = { is_busy_in_events_localised = yes }
scope:recipient.primary_title.tier > scope:secondary_actor.primary_title.tier
}
trigger_if = {
limit = {
scope:actor = { is_ai = yes }
exists = scope:secondary_actor
}
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: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
}
}
}
}
}
can_be_picked = {
NOT = { scope:recipient = root }
highest_held_title_tier > tier_barony
highest_held_title_tier < scope:recipient.highest_held_title_tier
trigger_if = {
limit = { scope:actor.liege = scope:recipient }
custom_tooltip = {
text = is_de_jure_liege_of_target
NOT = {
primary_title = {
any_this_title_or_de_jure_above = {
holder = scope:actor
}
}
}
}
}
# You can't give your diarch away as a vassal.
custom_description = {
text = cannot_grant_own_diarch_as_vassal
subject = scope:actor.diarch
NOT = { root ?= scope:actor.diarch }
}
# Not at war with the vassal being transferred (blocks explicit transfer of war enemies, which invalidates the war).
custom_description = {
text = "basic_is_at_war_with_vassal"
subject = root
object = scope:actor
NOT = {
root = {
is_at_war_with = scope:actor
}
}
}
# Not at war with a vassal under the vassal being transferred (blocks implicit transfers of war enemies).
custom_description = {
text = "basic_is_at_war_with_sub_vassal"
subject = root
object = scope:actor
NOT = {
any_vassal_or_below = {
is_at_war_with = root
}
}
}
# EP3 Admin - You cannot give away noble families
custom_description = {
text = admin_cannot_grant_vassal_noble_family
subject = root
trigger_if = {
limit = {
has_government = administrative_government
}
any_held_title = {
is_noble_family_title = no
}
}
}
}
auto_accept = {
scope:recipient = {
custom_description = {
text = wants_more_vassals
is_ai = yes
}
}
}
on_accept = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_good
title = grant_vassal_interaction_notification
right_icon = scope:recipient
left_icon = scope:secondary_actor
# If we're granting a vassal to our liege, gain a truce with our former vassal (we can't immediately reconquer them, and they can't attack us either).
if = {
limit = {
scope:actor = {
is_vassal_of = scope:recipient
}
}
add_truce_both_ways = {
character = scope:secondary_actor
days = 3650
name = TRUCE_GRANT_INDEPENDENCE
}
}
# Transfer the vassal over to their new liege.
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
# Gain an opinion bonus with the person we gave a vassal to.
scope:recipient = {
add_opinion = {
target = scope:actor
modifier = granted_vassal
}
}
}
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = miniscule_unity_gain
DESC = clan_unity_grant_vassal.desc
REVERSE_NON_HOUSE_TARGET = yes
}
hidden_effect = {
# Struggle catalyst
if = {
limit = {
fp3_struggle_involves_one_supporter_and_one_detractor = {
FIRST = scope:actor
SECOND = scope:recipient
}
scope: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
}
}
}
every_character_struggle = {
involvement = involved
activate_struggle_catalyst = {
catalyst = catalyst_grants_vassal_to_de_jure_liege_supporter_detractor
character = scope:actor
}
log_debug_variable_for_persian_struggle_effect = { VAR = concession_catalyst_grants_vassal_to_de_jure_liege_supporter_detractor }
}
}
}
}
on_decline = {
scope:actor = {
trigger_event = char_interaction.0211
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:recipient
TARGET = scope:actor
VALUE = miniscule_unity_loss
DESC = clan_unity_grant_vassal_decline.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
# AI handled entirely though code
}
retract_vassal_interaction = {
category = interaction_category_vassal
special_interaction = retract_vassal_interaction
interface = transfer_vassal
ai_maybe = yes
ai_min_reply_days = 4
ai_max_reply_days = 9
popup_on_receive = yes
pause_on_receive = yes
icon = icon_liege
interface_priority = 109 #after revoke title
desc = retract_vassal_interaction_desc
on_decline_summary = general_rebellion_decline_summary
prompt = RETRACT_VASSAL_SELECT_VASSAL_TO_RETRACT
notification_text = RETRACT_VASSAL_PROPOSAL
populate_recipient_list = {
scope:recipient = {
every_vassal = {
add_to_list = characters
}
}
}
is_shown = {
NOT = { scope:recipient = scope:actor }
scope:recipient = {
highest_held_title_tier > tier_barony
liege = scope:actor
}
}
is_valid_showing_failures_only = {
vassal_retraction_standard_valid_showing_failures_only_trigger = yes
# Make sure this exactly matches "can_be_picked" section below
scope:recipient = {
custom_description = {
text = "basic_vassal_to_retract"
any_vassal = {
highest_held_title_tier > tier_barony
}
}
}
# Plus make sure there's a legal right to retract.
scope: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 = {
custom_description = {
text = "has_law_allowing_vassal_retraction_crown"
has_realm_law_flag = vassal_retraction_allowed
}
}
}
scope:recipient = { is_busy_in_events_localised = yes }
trigger_if = {
limit = { exists = scope:secondary_recipient }
scope:secondary_recipient = { is_busy_in_events_localised = yes }
}
scope:recipient = {
NOT = { has_strong_hook = scope:actor }
}
custom_tooltip = {
text = cannot_take_overt_hostile_actions_against_diarch.tt
NOT = { scope:recipient ?= scope:actor.diarch }
}
}
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
can_be_picked = {
highest_held_title_tier > tier_barony
}
cost = {
# Usually, this action is free, but during certain diarchies, we want it to cost.
prestige = liege_diarchy_surcharge_interaction_retract_vassal_interaction_value
}
on_send = {
scope: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:actor = { has_character_flag = flag_hostile_actions_disabled_delay }
}
scope:actor = { remove_character_flag = flag_hostile_actions_disabled_delay }
}
scope:actor = {
trigger_event = char_interaction.0220
}
}
on_decline = {
scope:actor = { vassal_revocation_tyranny_effect = yes }
war_for_retraction_effect = yes
scope:recipient = {
add_opinion = {
target = scope:actor
modifier = retracted_vassal
}
}
if = {
limit = {
scope:actor = { has_realm_law_flag = vassal_refusal_is_treason }
}
scope:actor = {
add_opinion = {
target = scope:recipient
modifier = treasonous_retract_refusal
}
}
}
if = {
limit = {
scope:actor = { has_character_flag = flag_hostile_actions_disabled_delay }
}
scope:actor = { remove_character_flag = flag_hostile_actions_disabled_delay }
}
}
auto_accept = {
OR = {
scope:recipient = {
is_imprisoned_by = scope:actor
}
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
scope:hook = yes
scope:actor = { has_strong_hook = scope:recipient }
}
}
}
can_be_blocked = {
custom_description = { #Hook from Recipient can counteract, but only if Actor is not forcing the action via Strong Hook.
text = "spending_hook"
subject = scope:recipient
object = scope:actor
scope:recipient = { has_hook = scope:actor }
NAND = {
scope:hook = yes
scope:actor = { has_strong_hook = scope:recipient }
}
}
}
on_blocked_effect = {
scope:recipient = {
remove_hook = {
target = scope:actor
}
}
}
ai_accept = {
base = 0 # Try to make it 0 for most interactions
modifier = {
scope:hook = yes
add = 40
desc = SCHEME_WEAK_HOOK_USED
}
opinion_modifier = { # Opinion Factor
who = scope:recipient
opinion_target = scope:actor
multiplier = 1.0
desc = AI_OPINION_REASON
}
modifier = {
add = 25
scope: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: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 = { #If AI is honorable and the law compels to obey the liege, AI will be more likely to obey.
ai_honor > 0
}
scope:actor = {
has_realm_law_flag = vassal_refusal_is_treason
}
}
value = 0.75
}
}
}
modifier = {
exists = scope:actor.primary_title.title_capital_county
scope:secondary_recipient = {
OR = {
any_sub_realm_county = {
this = scope:actor.primary_title.title_capital_county
}
any_sub_realm_duchy = {
this = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
}
add = 50
desc = AI_VASSAL_HOLDS_REALM_CAPITAL
}
modifier = {
exists = scope:actor.primary_title.title_capital_county
scope:secondary_recipient = {
NOR = {
any_sub_realm_county = {
this = scope:actor.primary_title.title_capital_county
}
any_sub_realm_duchy = {
this = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
primary_title.tier = tier_county
any_sub_realm_county = {
de_jure_liege = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
add = 30
desc = AI_VASSAL_IS_IN_CAPITAL_DUCHY
}
modifier = { #Sub-Vassal is NOT De jure of current Vassal.
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 = { #Sub-Vassal is De jure of liege title.
add = 15
scope: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:actor
level = 1
}
}
desc = INTIMIDATED_REASON
}
modifier = {
add = cowed_halved_reason_value
scope:recipient = {
has_dread_level_towards = {
target = scope:actor
level = 2
}
}
desc = COWED_REASON
}
modifier = { #Comparative military strength.
desc = offer_vassalization_interaction_aibehavior_power_tt
add = {
value = 1
subtract = {
value = scope:recipient.current_military_strength
divide = { value = scope:actor.current_military_strength min = 1 }
}
multiply = 100
}
}
modifier = { #Different faith, no pluralism.
desc = AI_REFUSAL_SPLITTING_SAME_FAITH_VASSALS
trigger = {
scope:actor.faith = scope:secondary_recipient.faith #Will not care as much if the vassal being retracted is of a different faith.
scope:actor = {
NOR = { #Of two different faiths AND the potential vassal's faith is not pluralistic.
faith = scope:recipient.faith
faith = { has_doctrine = doctrine_pluralism_pluralistic }
}
}
}
add = {
value = -25
if = {
limit = {
scope:actor.faith = {
faith_hostility_level = {
target = scope:recipient.faith
value >= faith_hostile_level
}
}
}
add = -10
}
if = {
limit = {
scope:actor.faith = {
faith_hostility_level = {
target = scope:recipient.faith
value >= faith_evil_level
}
}
}
add = -25
}
}
}
modifier = { # AI Mongols, tyranny wars just delay the inevitable fun!
scope: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
}
}
#Use hook
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
can_send_despite_rejection = yes
# AI
ai_targets = {
ai_recipients = vassals
}
ai_frequency = 12
ai_potential = {
has_realm_law_flag = title_revocation_allowed
primary_title.tier > tier_county
}
ai_will_do = {
base = -1000
# We want to avoid tyranny unless we've got a good reason
# And even if we can avoid tyranny we don't want to retract just because we can, so this only gets us to -10
# Certain characters will retract despite tyranny, if their rationality is sufficiently low
modifier = {
scope:actor = {
OR = {
has_revoke_title_reason = scope:recipient
AND = {
ai_rationality <= very_high_negative_ai_value
OR = {
has_trait = lunatic
has_trait = possessed
has_trait = arbitrary
}
}
}
}
add = 990
}
# Always retract preferred capital if you hold the duchy, or the duchy is uncreated
modifier = {
years_from_game_start >= 3
OR = {
scope:actor = {
is_at_war = no
gold > 0
}
scope:recipient = {
is_imprisoned_by = scope:actor
}
}
scope:actor = { # The HRE doesn't need endless civil wars
NOT = {
primary_title = title:e_hre
}
}
exists = scope:actor.primary_title.title_capital_county
OR = {
scope:actor = {
any_held_title = {
this = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
scope:actor.primary_title.title_capital_county.de_jure_liege = {
is_title_created = no
}
}
scope:secondary_recipient = {
any_sub_realm_county = {
this = scope:actor.primary_title.title_capital_county
}
}
NAND = { # Don't retract player vassals tyrannically
scope:recipient = {
is_ai = no
}
scope:actor = {
NOT = { has_revoke_title_reason = scope:recipient }
}
}
add = 1100
}
# If below domain limit, try to revoke counties in your capital duchy despite tyranny, sometimes
modifier = {
years_from_game_start >= 3
scope:actor = { is_at_war = no }
scope:actor = { # The HRE doesn't need endless civil wars
NOT = {
primary_title = title:e_hre
}
}
scope:actor.domain_size < scope:actor.domain_limit
scope:actor.primary_title.tier >= tier_kingdom
trigger_if = {
limit = {
scope:actor = {
domain_size > 3
}
}
scope:actor = {
NOR = {
has_trait = generous
has_trait = just
}
}
}
exists = scope:actor.primary_title.title_capital_county
OR = {
scope:actor.primary_title.title_capital_county.holder = scope:actor # You have your de jure capital already
NOT = {
scope:actor.primary_title.title_capital_county.holder.top_liege = scope:actor.top_liege # Or your De Jure capital isn't in your realm
}
}
scope:secondary_recipient = {
primary_title.tier = tier_county
any_sub_realm_county = {
de_jure_liege = scope:actor.primary_title.title_capital_county.de_jure_liege # Under the same Duchy as your capital
}
}
OR = { # And the capital duchy, if it exists at all
AND = {
exists = scope:actor.primary_title.title_capital_county.de_jure_liege.holder
scope:actor.primary_title.title_capital_county.de_jure_liege.holder = scope:actor
}
AND = {
exists = scope:actor.primary_title.title_capital_county.de_jure_liege.holder
NOT = {
scope:actor.primary_title.title_capital_county.de_jure_liege.holder.top_liege = scope:actor.top_liege
}
}
scope:actor.primary_title.title_capital_county.de_jure_liege = {
is_title_created = no
}
}
scope:recipient = { # Not from players
is_ai = yes
}
OR = { # Tyranny tolernance is based on rationality
AND = {
scope:actor.ai_rationality < 0
scope:actor.tyranny <= 15 # Don't go crazy with tyranny, just a bit is fine
}
AND = {
scope:actor.ai_rationality >= 0
scope:actor.ai_rationality < 50
scope:actor.tyranny <= 5 # Don't go crazy with tyranny, just a bit is fine
}
AND = {
scope:actor.ai_rationality >= 50
scope:actor.tyranny <= 0 # Don't go crazy with tyranny, just a bit is fine
}
AND = {
scope:actor.ai_rationality >= 0
scope:recipient = {
is_imprisoned_by = scope:actor
}
scope:actor = { has_revoke_title_reason = scope:recipient }
}
AND = {
scope:actor.ai_rationality < 0
scope:recipient = {
is_imprisoned_by = scope:actor
}
}
}
# To do this, the target must be weak or willing in some way
OR = {
scope:actor.current_military_strength > scope:recipient.current_military_strength # Must be stronger
scope:recipient = {
is_imprisoned_by = scope:actor
}
}
scope:recipient = {
OR = {
has_trait = craven
has_trait = content
has_trait = trusting
has_dread_level_towards = {
target = scope:actor
level >= 1
}
opinion = { target = scope:actor value >= 40 }
is_imprisoned_by = scope:actor
scope:actor = { has_revoke_title_reason = scope:recipient }
}
}
add = 1100
}
# Always retract preferred capital duchy
modifier = {
exists = scope:actor.primary_title.title_capital_county
scope:secondary_recipient = {
any_sub_realm_duchy = {
this = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
NAND = { # Don't retract player vassals tyranically
scope:recipient = {
is_ai = no
}
scope:actor = {
NOT = { has_revoke_title_reason = scope:recipient }
}
}
add = 1000
}
# Retract vassal we're dejure liege of if below domain limit
modifier = {
scope:actor = {
vassal_limit_available > 0
}
scope:secondary_recipient.primary_title.de_jure_liege.holder = scope:actor
add = 500
}
# Retract non-De Jure vassals from Megadukes (only if a revoke reason is present, so we don't end up in massive tyranny war spirals)
modifier = {
scope:actor = {
has_revoke_title_reason = scope:recipient
}
scope:recipient = {
primary_title.tier = tier_duchy
any_sub_realm_county = {
count > 30
}
}
NOT = {
scope:secondary_recipient.primary_title.de_jure_liege.holder = scope:recipient
}
add = 500
}
# Do not revoke titles from certain characters
modifier = {
scope:actor = {
OR = {
has_relation_friend = scope:recipient
has_relation_best_friend = scope:recipient
has_relation_lover = scope:recipient
has_relation_soulmate = scope:recipient
is_heir_of = scope:recipient
}
}
add = -2000
}
# Do not revoke titles when the chance of success if exceedingly low
modifier = {
NOT = {
scope:recipient = {
is_imprisoned_by = scope:actor
}
}
scope:actor = {
OR = {
gold < minimum_ai_gold_value_for_tyranny_wars
AND = {
scope:actor.current_military_strength < scope:recipient.current_military_strength
gold < comfortable_ai_gold_value_for_tyranny_wars
}
}
}
add = -2000
}
modifier = { # The AI will only use a Hook if they couldn't otherwise do this
scope:hook = yes
add = -1
}
modifier = { # The AI shouldn't ruin the player's fun
add = -2000
scope:recipient = { has_character_flag = is_party_baron }
}
modifier = { # Avoid triggering Tyranny wars mid-war
factor = 0
scope:actor = {
is_at_war = yes
}
scope:recipient = {
NOT = {
is_imprisoned_by = scope:actor
}
}
}
modifier = { # Avoid triggering Tyranny wars mid-grand activity
factor = 0
scope:actor = {
has_ongoing_grand_activity_trigger = yes
}
NOR = {
scope:recipient = {
is_imprisoned_by = scope:actor
}
scope:recipient = {
highest_held_title_tier = tier_barony
}
}
}
}
}
start_independence_faction_interaction = {
icon = independence
category = interaction_category_vassal
desc = start_independence_faction_interaction_desc
is_shown = {
NOT = { scope:actor = scope:recipient }
scope:actor = {
highest_held_title_tier > tier_barony
liege = scope:recipient
is_a_faction_member = no
}
scope:recipient = {
is_landed_or_landless_administrative = no
NOT = {
any_targeting_faction = {
faction_is_type = independence_faction
}
}
}
}
is_valid_showing_failures_only = {
scope:actor = {
can_create_faction = {
target = scope:recipient
type = independence_faction
}
}
}
on_accept = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_neutral
title = start_independence_faction_interaction_notification
left_icon = scope:actor
right_icon = scope:recipient
create_faction = {
type = independence_faction
target = scope:recipient
}
if = {
limit = {
is_de_jure_vassal_of_liege_trigger = yes
}
stress_impact = {
just = medium_stress_impact_gain
}
}
}
}
}
auto_accept = yes
}
join_independence_faction_interaction = {
icon = independence
category = interaction_category_vassal
desc = join_independence_faction_interaction_desc
is_shown = {
NOT = { scope:actor = scope:recipient }
scope:actor.liege = scope:recipient
scope:actor = {
is_landed_or_landless_administrative = no
is_a_faction_member = no
highest_held_title_tier > tier_barony
}
scope:recipient = {
highest_held_title_tier > tier_barony
any_targeting_faction = {
faction_is_type = independence_faction
}
}
}
is_valid_showing_failures_only = {
scope:recipient = {
custom_description = {
text = "basic_independence_faction_at_war"
object = scope:recipient
any_targeting_faction = {
faction_is_type = independence_faction
faction_is_at_war = no
}
}
}
scope:actor = {
can_join_or_create_faction_against = {
who = scope:recipient
faction = independence_faction
}
}
}
on_accept = {
scope:recipient = {
random_targeting_faction = {
limit = {
faction_is_type = independence_faction
}
save_scope_as = faction_target
}
}
scope:actor = {
send_interface_toast = {
type = event_toast_effect_neutral
title = join_independence_faction_interaction_notification
left_icon = scope:actor
right_icon = scope:recipient
join_faction = scope:faction_target
if = {
limit = {
is_de_jure_vassal_of_liege_trigger = yes
}
stress_impact = {
just = minor_stress_impact_gain
}
}
}
}
}
auto_accept = yes
}
create_claimant_faction_against_interaction = {
icon = vassal_claim_liege_title_interaction
category = interaction_category_vassal
interface_priority = 270
use_diplomatic_range = no
desc = create_claimant_faction_against_interaction_desc
special_interaction = create_claimant_faction_against_interaction
interface = create_claimant_faction_against
is_shown = {
NOT = { scope:actor = scope:secondary_actor }
scope:actor.liege = scope:secondary_actor
scope:actor = {
custom_description = {
text = "faction_can_join_create_in_another_faction"
is_a_faction_member = no
}
highest_held_title_tier > tier_barony
}
}
is_valid_showing_failures_only = {
scope:actor = { NOT = { has_truce = scope:secondary_actor } }
scope:secondary_actor = {
trigger_if = {
limit = {
NOT = {
any_held_title = {
any_claimant = {}
}
}
}
custom_description = {
text = "basic_claimant_found"
always = no
}
}
trigger_else = {
custom_description = {
text = "basic_capable_claimant_found"
any_held_title = {
any_claimant = {
NOT = { has_trait = incapable }
}
}
}
}
trigger_if = {
limit = {
exists = scope:landed_title
}
custom_description = {
text = "claimant_faction_already_exists"
subject = scope:landed_title
object = scope:recipient
NOT = {
any_targeting_faction = {
faction_is_type = claimant_faction
special_character = scope:recipient
special_title = scope:landed_title
}
}
}
}
}
scope:actor = {
can_join_or_create_faction_against = {
who = scope:secondary_actor
faction = claimant_faction
check_in_a_faction = no # already checked in is_shown. Via the faction interface we'd see this twice if it fails (TIT-11380)
}
}
trigger_if = {
limit = {
exists = scope:recipient
}
scope:recipient = {
NOT = { is_at_war_with = scope:actor }
NOT = { has_trait = incapable }
}
}
scope:secondary_actor = { NOT = { has_strong_hook = scope:actor } }
# Admin vassals can only start and join a claimant faction if the target is independent
trigger_if = {
limit = {
scope:actor = { has_government = administrative_government }
}
scope:secondary_actor = { is_independent_ruler = yes }
}
# Byzantium does not brook
trigger_if = {
limit = {
scope:landed_title ?= {
OR = {
has_title_law = acclamation_succession_law
holder ?= { has_realm_law = acclamation_succession_law }
}
}
}
scope:recipient = {
is_eunuch_trigger = no
NOT = { has_trait = blind }
}
}
}
on_send = {
scope:actor = {
set_variable = {
name = claiming_title
value = scope:landed_title
}
if = {
limit = {
can_create_faction = {
type = claimant_faction
target = scope:secondary_actor
}
}
create_faction = {
type = claimant_faction
target = scope:secondary_actor
}
joined_faction = {
set_special_character = scope:recipient
set_special_title = scope:landed_title
}
scope:recipient = {
add_to_variable_list = {
name = claimant_factions
target = scope:actor.joined_faction
}
}
if = {
limit = { NOT = { this = scope:recipient } }
save_scope_as = faction_invite_from
joined_faction = { save_scope_as = faction }
scope:secondary_actor = { save_scope_as = faction_target }
scope:recipient = {
trigger_event = faction_invitation.0001
}
}
}
remove_variable = claiming_title
}
}
auto_accept = yes
}
invite_to_council_position_interaction = {
category = interaction_category_vassal
popup_on_receive = yes
pause_on_receive = yes
hidden = yes
special_interaction = invite_to_council_interaction
notification_text = {
first_valid = {
triggered_desc = {
trigger = {
scope:recipient = {
is_councillor_of = scope:actor
}
}
desc = liege_offer_council_position_exchange
}
triggered_desc = {
trigger = {
scope:actor = {
opinion = {
value >= 30
target = scope:recipient
}
}
}
desc = liege_offer_council_position_liked
}
triggered_desc = {
trigger = {
scope:actor = {
opinion = {
value <= -30
target = scope:recipient
}
}
}
desc = liege_offer_council_position_disliked
}
triggered_desc = {
trigger = {
scope:recipient = {
is_powerful_vassal_of = scope:actor
}
}
desc = liege_offer_council_position_powerful
}
triggered_desc = {
trigger = {
scope:recipient = {
OR = {
diplomacy > high_skill_rating
martial > high_skill_rating
stewardship > high_skill_rating
intrigue > high_skill_rating
learning > high_skill_rating
}
}
}
desc = liege_offer_council_position_skilled
}
desc = liege_offer_council_position_fallback
}
}
is_valid_showing_failures_only = {
ALL_FALSE = {
scope:recipient.council_task = scope:target
scope:actor = { is_at_war_with = scope:recipient }
}
trigger_if = {
limit = {
exists = scope:target.councillor
}
scope:target = { can_fire_position = yes }
NOT = {
scope:target.councillor = {
is_blocked_from_being_fired_from_council_trigger = { COURT_OWNER = scope:actor }
}
}
}
}
on_accept = {
# Assign the councillor to their new responsibilities.
scope:actor = {
assign_council_task = {
target = scope:recipient
council_task = scope:target
}
}
# If the new councillor is a player, inform their liege that they have accepted the offer.
if = {
limit = {
scope:recipient = {
is_ai = no
}
}
scope:actor = {
trigger_event = {
id = council_interaction.0001
days = 1
}
}
}
# If we're a clan this interaction affects unity
#if = {
# limit = { scope:actor = { NOT = { has_character_flag = fp3_consulted_house } } }
# add_clan_unity_interaction_effect = {
# CHARACTER = scope:actor
# TARGET = scope:recipient
# VALUE = miniscule_unity_gain
# DESC = clan_unity_council_position.desc
# REVERSE_NON_HOUSE_TARGET = yes
# }
#}
}
on_decline = {
# If the requested councillor is a player, inform their liege that they have declined the offer.
if = {
limit = {
scope:recipient = {
is_ai = no
}
}
scope:actor = {
trigger_event = {
id = council_interaction.0002
days = 1
}
}
}
}
auto_accept = {
custom_description = {
text = auto_accept_interaction_ai
object = scope:recipient
scope:recipient = {
is_ai = yes
}
}
}
}
force_onto_council = {
category = interaction_category_vassal
interface_priority = 120
icon = council
desc = force_onto_council_desc
notification_text = {
first_valid = {
triggered_desc = {
trigger = {
scope:actor = { has_strong_hook = scope:recipient }
}
desc = force_onto_council.notification.strong_hook
}
desc = force_onto_council.notification.fallback
}
}
special_interaction = force_onto_council_interaction
interface = council_task_interaction
should_use_extra_icon = {
scope:actor = { has_usable_hook = scope:recipient }
}
extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
is_shown = {
NOT = { scope:recipient = scope:actor }
scope:actor = {
liege = scope:recipient
NOT = {
is_councillor = yes
}
}
trigger_if = {
limit = {
exists = scope:target.councillor
}
scope:target = { can_fire_position = yes }
}
}
is_valid_showing_failures_only = {
scope:actor = {
custom_description = {
text = "has_usable_hook_or_council_rights_through_vassal_contract"
subject = scope:actor
OR = {
has_usable_hook = scope:recipient
vassal_contract_has_flag = can_demand_council_seat
}
}
is_adult = yes
NOT = {
is_at_war_with = scope:recipient
}
NAND = {
has_council_position = councillor_court_chaplain
faith = {
OR = {
has_doctrine = doctrine_clerical_succession_temporal_fixed_appointment
has_doctrine = doctrine_clerical_succession_spiritual_fixed_appointment
}
}
}
}
}
has_valid_target_showing_failures_only = {
trigger_if = {
limit = {
exists = scope:target.councillor
}
scope:target.councillor = {
NOT = {
is_blocked_from_being_fired_from_council_trigger = {
COURT_OWNER = scope:recipient
}
}
}
}
}
on_accept = {
scope:target = {
save_scope_as = council_task
}
scope:actor = {
if = {
limit = {
NOT = { vassal_contract_has_flag = can_demand_council_seat }
}
save_scope_value_as = {
name = used_hook
value = yes
}
}
block_firing_councillor_effect = { COURT_OWNER = scope:recipient }
#And notify exactly which councillor type they've become.
hidden_effect = {
send_interface_toast = {
type = event_toast_effect_good
title = force_onto_council.actor.tt
left_icon = scope:recipient
custom_tooltip = force_onto_council.actor.tt.duration
}
}
stress_impact = { content = minor_stress_impact_gain }
}
scope:recipient = {
assign_council_task = {
target = scope:actor
council_task = scope:council_task
}
custom_tooltip = force_onto_council.desc.tt
#And notify exactly which councillor type they've become.
hidden_effect = {
send_interface_toast = {
type = event_toast_effect_neutral
title = force_onto_council.recipient.tt
left_icon = scope:actor
if = {
limit = { exists = scope:used_hook }
show_as_tooltip = { scope:actor = { use_hook = scope:recipient } }
}
custom_tooltip = force_onto_council.recipient.tt.duration
}
}
}
#Done in the end so that all tooltips will show correct information
scope:actor = {
if = {
limit = {
exists = scope:used_hook
}
use_hook = scope:recipient
}
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = medium_unity_loss
DESC = clan_unity_forced_unto_council.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
ai_set_target = {
scope:actor = {
random_list = {
10 = {
trigger = {
exists = scope:recipient.council_task:councillor_chancellor
can_be_chancellor_trigger = { COURT_OWNER = scope:recipient }
}
modifier = {
factor = diplomacy
}
modifier = {
trigger = { highest_skill = diplomacy }
factor = 10
}
scope:recipient.council_task:councillor_chancellor = {
save_scope_as = target
}
}
10 = {
trigger = {
exists = scope:recipient.council_task:councillor_steward
can_be_steward_trigger = { COURT_OWNER = scope:recipient }
}
modifier = {
factor = stewardship
}
modifier = {
trigger = { highest_skill = stewardship }
factor = 10
}
scope:recipient.council_task:councillor_steward = {
save_scope_as = target
}
}
10 = {
trigger = {
exists = scope:recipient.council_task:councillor_marshal
can_be_marshal_trigger = { COURT_OWNER = scope:recipient }
}
modifier = {
factor = martial
}
modifier = {
trigger = { highest_skill = martial }
factor = 10
}
scope:recipient.council_task:councillor_marshal = {
save_scope_as = target
}
}
10 = {
trigger = {
exists = scope:recipient.council_task:councillor_spymaster
can_be_spymaster_trigger = { COURT_OWNER = scope:recipient }
}
modifier = {
factor = intrigue
}
modifier = {
trigger = { highest_skill = intrigue }
factor = 10
}
scope:recipient.council_task:councillor_spymaster = {
save_scope_as = target
}
}
10 = {
trigger = {
exists = scope:recipient.council_task:councillor_court_chaplain
can_be_court_chaplain_trigger = { COURT_OWNER = scope:recipient }
}
modifier = {
factor = learning
}
modifier = {
trigger = { highest_skill = learning }
factor = 10
}
scope:recipient.council_task:councillor_court_chaplain = {
save_scope_as = target
}
}
}
}
}
ai_potential = {
is_independent_ruler = no
is_councillor = no
}
ai_targets = {
ai_recipients = liege
}
ai_frequency = 36
auto_accept = yes
force_notification = yes
ai_will_do = {
base = 100
modifier = {
factor = 0
scope:actor = {
ai_greed <= medium_positive_ai_value
OR = {
has_relation_friend = scope:recipient
has_relation_lover = scope:recipient
has_relation_best_friend = scope:recipient
has_relation_soulmate = scope:recipient
}
}
}
modifier = {
factor = 0
is_councillor = yes
}
}
}
stop_attacker_vassal_war_interaction = {
category = interaction_category_vassal
interface = interfere_in_war
special_interaction = interfere_in_war_interaction
ai_accept_negotiation = yes
popup_on_receive = yes
pause_on_receive = yes
icon = icon_retreat
send_name = "stop_attacker_vassal_war_interaction"
ai_maybe = yes
prompt = STOP_VASSAL_WAR_ATTACKER
desc = {
desc = stop_vassal_war_negotiation
triggered_desc = {
trigger = { scope:actor = { has_usable_hook = scope:recipient } }
desc = stop_vassal_war_use_hook
}
desc = might_ask_for_something_in_return_warning_double_line_break
}
on_decline_summary = stop_attacker_vassal_war_decline_summary
is_shown = {
NOT = { scope:recipient = scope:actor }
scope:recipient = {
exists = liege
liege = scope:actor
highest_held_title_tier > tier_barony
any_character_war = {
primary_attacker = scope:recipient
save_temporary_scope_as = target_war
}
}
scope:actor = {
NOT = { is_participant_in_war = scope:target_war }
}
}
is_valid_showing_failures_only = {
custom_description = {
text = cannot_stop_war_when_already_fighting
object = scope:recipient
scope:recipient = {
NOT = {
any_war_enemy = {
this = scope:actor
}
}
}
}
custom_description = {
text = cannot_stop_war_timer
object = scope:recipient
NOT = {
scope:recipient = {
has_opinion_modifier = {
target = scope:actor
modifier = attempt_to_force_end_war_opinion
}
}
}
}
NOT = {
scope:recipient = {
has_strong_hook = scope:actor
}
}
}
can_be_picked = {
scope:target.primary_attacker = scope:recipient
}
on_accept = {
scope:recipient = {
add_opinion = {
modifier = attempt_to_force_end_war_opinion
target = scope:actor
}
}
hidden_effect = {
scope:recipient = {
trigger_event = vassal_interaction.0001 #Starts "negotiations"
}
}
show_as_tooltip = {
scope:target ?= { end_war = white_peace }
}
# If we're a clan this interaction affects unity - But we only show it in the tooltip, actual effect is applied in the respective follow-up events
show_as_tooltip = {
if = {
limit = { # If we are asking a non-house member to stop attacking a house member, gain unity
exists = scope:recipient.house
exists = scope:actor.house
NOT = { scope:recipient.house = scope:actor.house }
}
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:target.primary_defender
VALUE = medium_unity_gain
DESC = clan_unity_aided_in_war.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
else_if = {
limit = { # If we are asking a house member to stop attacking a non-house member, lose unity
exists = scope:actor.house
exists = scope:target.primary_defender.house
NOT = { scope:target.primary_defender.house = scope:actor.house }
}
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = medium_unity_loss
DESC = clan_unity_stopped_vassal_war.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
}
}
on_decline = {
show_as_tooltip = {
scope:recipient = {
add_opinion = {
modifier = attempt_to_force_end_war_opinion
target = scope:actor
}
}
scope:actor = { add_prestige = minor_prestige_loss }
}
}
auto_accept = yes
}
stop_defender_vassal_war_interaction = {
category = interaction_category_vassal
interface = interfere_in_war
special_interaction = interfere_in_war_interaction
ai_accept_negotiation = yes
popup_on_receive = yes
pause_on_receive = yes
send_name = "SEND_DEMAND"
icon = icon_retreat
ai_maybe = yes
prompt = STOP_VASSAL_WAR_DEFENDER
desc = {
desc = stop_vassal_war_negotiation
triggered_desc = {
trigger = { scope:actor = { has_usable_hook = scope:recipient } }
desc = stop_vassal_war_use_hook
}
desc = might_ask_for_something_in_return_warning_double_line_break
}
on_decline_summary = stop_attacker_vassal_war_decline_summary
is_shown = {
NOT = { scope:recipient = scope:actor }
scope:recipient = {
exists = liege
liege = scope:actor
highest_held_title_tier > tier_barony
any_character_war = {
primary_defender = scope:recipient
save_temporary_scope_as = target_war
}
}
scope:actor = {
NOT = { is_participant_in_war = scope:target_war }
}
}
is_valid_showing_failures_only = {
custom_description = {
text = cannot_stop_war_when_already_fighting
object = scope:recipient
NOT = {
scope:recipient = {
any_war_enemy = {
this = scope:actor
}
}
}
}
custom_description = {
text = cannot_stop_war_timer
object = scope:recipient
NOT = {
scope:recipient = {
has_opinion_modifier = {
target = scope:actor
modifier = attempt_to_force_surrender_opinion
}
}
}
}
NOT = {
scope:recipient = {
has_strong_hook = scope:actor
}
}
}
can_be_picked = {
scope:target.primary_defender = scope:recipient
}
on_accept = {
scope:recipient = {
add_opinion = {
modifier = attempt_to_force_surrender_opinion
target = scope:actor
}
}
hidden_effect = {
scope:recipient = {
trigger_event = vassal_interaction.0011 #Starts "negotiations"
}
}
# If we're a clan this interaction affects unity - But we only show it in the tooltip, actual effect is applied in the respective follow-up events
show_as_tooltip = {
if = {
limit = { # If recipient is a house member and the attacker is not, lose unity
exists = scope:actor.house
exists = scope:target.primary_attacker.house
NOT = { scope:target.primary_attacker.house = scope:actor.house }
}
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = medium_unity_loss
DESC = clan_unity_stop_defender_vassal_war.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
else_if = {
limit = { # If recipient is a non-house member and the attacker is, gain unity
exists = scope:actor.house
exists = scope:recipient.house
NOT = { scope:recipient.house = scope:actor.house }
}
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:target.primary_attacker
VALUE = medium_unity_gain
DESC = clan_unity_aided_in_war.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
}
}
auto_accept = yes
}
ask_for_pardon_interaction = {
category = interaction_category_vassal
icon = scroll_scales
desc = ask_for_pardon_interaction_desc
notification_text = ASK_FOR_PARDON_NOTIFICATION
is_shown = {
ask_for_pardon_available_trigger = { ACTOR = scope:actor }
scope:actor.top_liege = scope:recipient
}
is_valid_showing_failures_only = {
scope:recipient = { is_busy_in_events_localised = yes }
scope:actor = {
NOT = { is_at_war_with = scope:recipient }
NOT = { is_imprisoned_by = scope:recipient }#Then you use the regular ransom interactions
}
}
is_highlighted = {
scope:actor = {
has_usable_hook = scope:recipient
}
}
ai_accept = {
base = -50
#How bad is it, really?
modifier = {
scope:recipient = {
has_banish_reason = scope:actor
NOR = { #These are worse
has_execute_reason = scope:actor
has_revoke_title_reason = scope:actor
}
}
desc = AI_BANISHMENT_REASON_MODIFIER
add = -20
}
modifier = {
scope:recipient = {
has_revoke_title_reason = scope:actor
NOT = { #This is worse are worse
has_execute_reason = scope:actor
}
}
desc = AI_REVOKE_TITLE_REASON_MODIFIER
add = -30
}
modifier = {
scope:recipient = {
has_execute_reason = scope:actor
}
desc = AI_EXECUTE_REASON_MODIFIER
add = -40
}
#Willing to forgive
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 1
desc = AI_OPINION_REASON
}
}
auto_accept = {
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
scope:hook = yes
}
}
ai_min_reply_days = 1
ai_max_reply_days = 5
on_accept = {
ask_for_pardon_interaction_effect = yes
scope:actor = {
trigger_event = vassal_interaction.0030
}
scope:recipient = { #FP3 Addition. TODO FP3 CD: Find a way to test this.
if = {
limit = {
culture = {
has_cultural_parameter = pardoning_gives_prestige
}
}
add_prestige = minor_prestige_gain
}
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = minor_unity_gain
DESC = clan_unity_pardon_granted.desc
REVERSE_NON_HOUSE_TARGET = no
}
hidden_effect = {
# Struggle catalysts
if = {
limit = {
fp3_struggle_involves_one_supporter_and_one_detractor = {
FIRST = scope:actor
SECOND = scope:recipient
}
scope:recipient = {
any_character_struggle = {
involvement = involved
phase_has_catalyst = catalyst_grants_pardon_supporter_detractor
is_secondary_character_involvement_involved_trigger = {
CHAR = scope:actor
}
}
}
}
scope:recipient = {
every_character_struggle = {
involvement = involved
activate_struggle_catalyst = {
catalyst = catalyst_grants_pardon_supporter_detractor
character = scope:recipient
}
log_debug_variable_for_persian_struggle_effect = { VAR = concession_catalyst_grants_pardon_supporter_detractor }
}
}
}
}
}
on_auto_accept = {
scope:recipient = {
trigger_event = char_interaction.0240
}
}
on_decline = {
scope:recipient = {
send_interface_toast = {
type = event_toast_effect_bad
title = ask_for_pardon_interaction_decline_toast
left_icon = scope:actor
custom_tooltip = ask_for_pardon_interaction_accept_decline
}
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:recipient
TARGET = scope:actor
VALUE = minor_unity_loss
DESC = clan_unity_refused_pardon.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
#Use hook
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
ai_targets = {
ai_recipients = liege
}
ai_frequency = 12
ai_will_do = {
base = 0
modifier = {
add = 100
scope:actor = {
has_usable_hook = scope:recipient
}
}
modifier = {
add = 100
scope:hook = yes
}
}
}
pardon_interaction = {
category = interaction_category_friendly
icon = scroll_scales
desc = {
first_valid = {
triggered_desc = {
trigger = {
scope:actor = {
culture = {
has_cultural_parameter = pardoning_gives_prestige
}
}
}
desc = pardon_interaction_has_jirga_desc
}
desc = pardon_interaction_desc
}
}
is_shown = {
scope:actor = {
has_imprisonment_reason = scope:recipient
}
scope:recipient = {
target_is_liege_or_above = scope:actor
}
}
auto_accept = yes
on_accept = {
consume_all_criminal_reasons_effect = {
LIEGE = scope:actor
CRIMINAL = scope:recipient
}
scope:actor = {
stress_impact = {
forgiving = medium_stress_loss
}
}
scope:actor = {
if = {
limit = {
culture = {
has_cultural_parameter = pardoning_gives_prestige
}
}
add_prestige = minor_prestige_gain
}
hidden_effect = {
# Struggle catalysts
if = {
limit = {
fp3_struggle_involves_one_supporter_and_one_detractor = {
FIRST = scope:actor
SECOND = scope:recipient
}
scope:recipient = {
any_character_struggle = {
involvement = involved
phase_has_catalyst = catalyst_grants_pardon_supporter_detractor
is_secondary_character_involvement_involved_trigger = {
CHAR = scope:actor
}
}
}
}
every_character_struggle = {
involvement = involved
activate_struggle_catalyst = {
catalyst = catalyst_grants_pardon_supporter_detractor
character = scope:recipient
}
log_debug_variable_for_persian_struggle_effect = { VAR = concession_catalyst_grants_pardon_supporter_detractor }
}
}
}
}
scope:recipient = {
if = {
limit = {
scope:actor = {
culture = {
has_cultural_parameter = pardoning_gives_loyalty
}
}
}
add_opinion = {
modifier = loyal_servant
target = scope:actor
}
scope:actor = {
if = {
limit = {
can_add_hook = {
target = scope:recipient
type = loyalty_hook
}
}
add_hook = {
type = loyalty_hook
target = scope:recipient
}
}
}
}
else = {
add_opinion = {
target = scope:actor
modifier = grateful_opinion
opinion = 15
}
}
send_interface_toast = {
type = event_toast_effect_neutral
title = pardon_interaction_toast
left_icon = scope:actor
}
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = minor_unity_gain
DESC = clan_unity_forgiveness.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
ai_potential = {
OR = {
ai_vengefulness <= 0
culture = {
has_cultural_parameter = pardoning_gives_loyalty
}
}
}
ai_targets = {
ai_recipients = vassals
}
ai_targets = {
ai_recipients = courtiers
chance = 0.25
}
ai_frequency = 36
ai_will_do = {
base = 0
modifier = {
add = 100
scope:recipient = {
OR = {
has_relation_friend = scope:actor
has_relation_best_friend = scope:actor
has_relation_lover = scope:actor
has_relation_soulmate = scope:actor
is_primary_heir_of = scope:actor
}
}
}
modifier = {
add = 25
scope:actor = {
scope:actor.ai_vengefulness <= 0
culture = {
has_cultural_parameter = pardoning_gives_loyalty
}
}
}
modifier = {
add = {
value = ai_vengefulness
multiply = -1
}
scope:actor.ai_vengefulness <= -25
}
}
}
vassal_claim_liege_title_interaction = {
category = interaction_category_vassal
interface_priority = 269 # after Start Claimant Faction
desc = vassal_claim_liege_title_interaction_desc
target_type = title
target_filter = recipient_domain_titles
ignores_pending_interaction_block = yes
icon = vassal_claim_liege_title_interaction
cost = {
prestige = {
value = {
add = monumental_prestige_value
if = {
limit = {
scope:actor.prestige_level > scope:recipient.prestige_level
}
subtract = {
value = major_prestige_value
multiply = {
value = scope:actor.prestige_level
subtract = scope:recipient.prestige_level
}
desc = higher_prestige_level_than_liege
}
}
else_if = {
limit = {
scope:actor.prestige_level < scope:recipient.prestige_level
}
add = {
value = major_prestige_value
multiply = {
value = scope:recipient.prestige_level
subtract = scope:actor.prestige_level
}
desc = lower_prestige_level_than_liege
}
}
min = 0
}
}
}
is_shown = {
NOT = { scope:recipient = scope:actor }
scope:actor = {
is_physically_able_adult = yes
}
scope:recipient = scope:actor.liege
scope:recipient = {
is_playable_character = yes
any_held_title = {
tier >= tier_duchy
NOR = {
has_title_law = noble_family_succession_law
has_title_law = landless_adventurer_succession_law
}
scope:actor = {
NOT = {
has_claim_on = prev
}
}
}
}
}
is_highlighted = {
scope:actor.prestige >= vassal_claim_liege_title_interaction_highlight_value
}
can_be_picked = {
trigger_if = {
limit = {
scope:actor = {
any_character_struggle = {
involvement = involved
has_struggle_phase_parameter = powerful_vassal_can_claim_liege_titles
}
}
}
scope:actor = { is_powerful_vassal_of = scope:recipient }
}
trigger_if = {
limit = {
scope:actor = { legitimacy_level = 5 }
}
scope:target = {
tier >= tier_duchy
custom_description = {
text = has_15_percent_of_a_dejure_title
any_in_de_jure_hierarchy = {
filter = {
tier = tier_county
}
continue = {
tier > tier_county
}
OR = {
holder = scope:actor
holder = {
target_is_liege_or_above = scope:actor
}
}
percent >= 0.15
}
}
}
}
trigger_if = {
limit = {
scope:actor = { legitimacy_level = 4 }
}
scope:target = {
tier >= tier_duchy
custom_description = {
text = has_21_percent_of_a_dejure_title
any_in_de_jure_hierarchy = {
filter = {
tier = tier_county
}
continue = {
tier > tier_county
}
OR = {
holder = scope:actor
holder = {
target_is_liege_or_above = scope:actor
}
}
percent >= 0.21
}
}
}
}
trigger_if = {
limit = {
scope:actor = { legitimacy_level = 3 }
}
scope:target = {
tier >= tier_duchy
custom_description = {
text = has_31_percent_of_a_dejure_title
any_in_de_jure_hierarchy = {
filter = {
tier = tier_county
}
continue = {
tier > tier_county
}
OR = {
holder = scope:actor
holder = {
target_is_liege_or_above = scope:actor
}
}
percent >= 0.31
}
}
}
}
trigger_if = {
limit = {
scope:actor = { legitimacy_level = 2 }
}
scope:target = {
tier >= tier_duchy
custom_description = {
text = has_41_percent_of_a_dejure_title
any_in_de_jure_hierarchy = {
filter = {
tier = tier_county
}
continue = {
tier > tier_county
}
OR = {
holder = scope:actor
holder = {
target_is_liege_or_above = scope:actor
}
}
percent >= 0.41
}
}
}
}
trigger_if = {
limit = {
scope:actor = {
OR = {
legitimacy_level = 1
legitimacy_level = 0
has_legitimacy = no #if you don't have legitimacy at all we fall back to the default
}
}
}
scope:target = {
tier >= tier_duchy
custom_description = {
text = has_51_percent_of_a_dejure_title
any_in_de_jure_hierarchy = {
filter = {
tier = tier_county
}
continue = {
tier > tier_county
}
OR = {
holder = scope:actor
holder = {
target_is_liege_or_above = scope:actor
}
}
percent >= 0.51
}
}
}
}
custom_description = {
NOT = {
scope:actor = {
has_claim_on = scope:target
}
}
text = "already_have_a_claim_on_this_title"
}
trigger_if = {
limit = {
scope:target = {
tier = tier_duchy
}
}
custom_description = {
text = not_family_or_adventurer_title
scope:target = {
NOR = {
has_title_law = noble_family_succession_law
has_title_law = landless_adventurer_succession_law
}
}
}
}
}
has_valid_target_showing_failures_only = {
scope:target = {
tier >= tier_duchy
}
}
is_valid_showing_failures_only = {
custom_description = {
scope:recipient = {
any_held_title = {
tier >= tier_county
NOT = { any_claimant = { this = scope:actor } }
}
}
object = scope:recipient
text = "already_have_claims_on_all_titles"
}
scope:recipient = { NOT = { has_strong_hook = scope:actor } }
NOT = {
scope:actor = {
is_allied_to = scope:recipient
}
}
}
on_auto_accept = {
scope:target = {
random_in_de_jure_hierarchy = {
limit = {
tier = tier_county
OR = {
holder = scope:actor
holder = {
target_is_liege_or_above = scope:actor
}
}
}
title_province = {
save_scope_as = county_in_title
}
}
}
scope:recipient = {
trigger_event = vassal_interaction.0040
}
}
on_accept = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_good
title = buy_claim_interaction.message
left_icon = scope:actor
right_icon = scope:recipient
vassal_claim_liege_title_interaction_effect = yes
}
claim_title_achievement_effect = yes
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = major_unity_loss
DESC = clan_unity_title_claim.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
auto_accept = yes
ai_targets = {
ai_recipients = liege
}
ai_frequency = 24
ai_potential = {
domain_size > 1
NOR = {
has_trait = content
has_trait = craven
}
}
ai_will_do = {
base = 25
ai_value_modifier = {
who = scope:actor
ai_greed = 1
ai_boldness = 0.5
ai_honor = -0.5
}
modifier = {
add = scope:actor.ai_zeal
scope:actor = {
ai_zeal > 0
}
NOT = {
scope:actor.faith = scope:recipient.faith
}
}
modifier = {
add = 25
scope:actor = {
is_powerful_vassal_of = scope:recipient
}
}
modifier = {
add = 50
scope:actor = {
opinion = {
target = scope:recipient
value <= 0
}
}
}
modifier = {
add = 25
scope:recipient = {
OR = {
has_relation_rival = scope:actor
has_relation_nemesis = scope:actor
}
}
}
modifier = {
add = -15
scope:recipient = {
has_relation_lover = scope:actor
}
}
# Agenda impact
modifier = {
scope:actor = {
any_character_struggle = {
involvement = involved
is_struggle_type = iberian_struggle
}
}
add = {
value = 0
if = {
limit = {
scope:actor = {
any_character_struggle = {
phase_has_catalyst = catalyst_gain_claim_on_title_fp2
}
has_character_flag = agenda_towards_escalation
}
}
add = 200
}
else_if = {
limit = {
scope:actor = {
any_character_struggle = {
phase_has_catalyst = catalyst_gain_claim_on_title_fp2
}
}
}
add = -100
}
}
}
modifier = {
scope:actor = {
any_character_struggle = {
involvement = involved
is_struggle_type = persian_struggle
}
}
add = {
value = 0
if = {
limit = {
scope:actor = {
any_character_struggle = {
phase_has_catalyst = catalyst_gain_claim_on_title_fp3
}
has_trait = fp3_struggle_detractor
}
}
add = 200
}
else_if = {
limit = {
scope:actor = {
any_character_struggle = {
phase_has_catalyst = catalyst_gain_claim_on_title_fp3
}
}
}
add = -100
}
}
}
modifier = {
factor = 0.25
scope:actor = {
ai_greed < 100
opinion = {
target = scope:recipient
value >= 50
}
}
}
modifier = {
factor = 0
scope:actor = {
ai_greed < 100
opinion = {
target = scope:recipient
value >= 75
}
}
}
modifier = {
add = -25
scope:actor = {
has_dread_level_towards = {
target = scope:recipient
level = 1
}
}
}
modifier = {
factor = 0
scope:actor = {
has_dread_level_towards = {
target = scope:recipient
level = 2
}
}
}
modifier = {
factor = 0
scope:recipient = {
OR = {
has_relation_friend = scope:actor
has_relation_best_friend = scope:actor
has_relation_soulmate = scope:actor
}
}
}
}
}
give_vassal_directive_interaction = {
category = interaction_category_vassal
icon = icon_scheme_challenge_status
interface_priority = 60
desc = give_vassal_directive_interaction_desc
auto_accept = yes
is_shown = {
scope:recipient = {
trigger_if = {
limit = {
scope:actor = { has_government = administrative_government }
}
is_vassal_or_below_of = scope:actor
}
trigger_else = {
is_vassal_of = scope:actor
}
is_landed = yes
highest_held_title_tier >= tier_county
is_ai = yes
}
}
is_valid = {
vassal_follows_directive_trigger = { VASSAL = scope:recipient LIEGE = scope:actor }
}
is_valid_showing_failures_only = {
vassal_follows_directive_valid_trigger = { VASSAL = scope:recipient LIEGE = scope:actor }
scope:recipient = { is_physically_able = yes }
}
send_option = {
flag = improve_development
is_shown = {
scope:recipient = {
has_government = administrative_government
}
}
is_valid = {
scope:recipient = {
highest_held_title_tier >= tier_duchy
}
}
}
send_option = {
flag = train_commanders
is_shown = {
scope:recipient = {
has_government = administrative_government
}
}
is_valid = {
}
}
send_option = {
flag = build_maa
is_shown = {
scope:recipient = {
has_government = administrative_government
}
}
is_valid = {
}
}
send_option = {
flag = convert_faith
is_shown = {
}
is_valid = {
scope:recipient = {
custom_tooltip = {
text = subrealm_has_county_of_other_faith
any_sub_realm_county = {
NOT = { faith = scope:recipient.faith }
}
}
}
}
}
send_option = {
flag = convert_culture
is_shown = {
}
is_valid = {
scope:recipient = {
custom_tooltip = {
text = subrealm_has_county_of_other_culture
any_sub_realm_county = {
NOT = { culture = scope:recipient.culture }
}
}
}
}
}
send_option = {
flag = improve_cultural_acceptance
is_shown = {
}
is_valid = {
scope:recipient = {
highest_held_title_tier >= tier_duchy
custom_tooltip = {
text = subrealm_has_county_of_other_culture
any_sub_realm_county = {
NOT = { culture = scope:recipient.culture }
}
}
}
}
}
send_option = {
flag = building_focus_fortification
is_shown = {
}
is_valid = {
}
}
send_option = {
flag = building_focus_military
is_shown = {
}
is_valid = {
}
}
send_option = {
flag = building_focus_economy
is_shown = {
}
is_valid = {
}
}
send_option = {
flag = remove_directive
is_shown = {
}
is_valid = {
custom_tooltip = {
text = has_any_directive
scope:recipient = {
OR = {
has_character_flag = vassal_directive_improve_development
has_character_flag = vassal_directive_train_commanders
has_character_flag = vassal_directive_build_maa
has_character_flag = vassal_directive_convert_faith
has_character_flag = vassal_directive_convert_culture
has_character_flag = vassal_directive_improve_cultural_acceptance
has_character_flag = vassal_directive_building_focus_fortification
has_character_flag = vassal_directive_building_focus_military
has_character_flag = vassal_directive_building_focus_economy
}
}
}
}
}
on_accept = {
scope:recipient = {
switch = {
trigger = yes
scope:improve_development ?= {
custom_tooltip = {
text = vassal_directive_improve_development
remove_vassal_directives = yes
add_character_flag = vassal_directive_improve_development
}
}
scope:train_commanders ?= {
custom_tooltip = {
text = vassal_directive_train_commanders
remove_vassal_directives = yes
add_character_flag = vassal_directive_train_commanders
}
}
scope:build_maa ?= {
custom_tooltip = {
text = vassal_directive_build_maa
remove_vassal_directives = yes
add_character_flag = vassal_directive_build_maa
}
}
scope:convert_faith ?= {
custom_tooltip = {
text = vassal_directive_convert_faith
remove_vassal_directives = yes
add_character_flag = vassal_directive_convert_faith
}
}
scope:convert_culture ?= {
custom_tooltip = {
text = vassal_directive_convert_culture
remove_vassal_directives = yes
add_character_flag = vassal_directive_convert_culture
}
}
scope:improve_cultural_acceptance ?= {
custom_tooltip = {
text = vassal_directive_improve_cultural_acceptance
remove_vassal_directives = yes
add_character_flag = vassal_directive_improve_cultural_acceptance
}
}
scope:building_focus_fortification ?= {
custom_tooltip = {
text = vassal_directive_building_focus_fortification
remove_vassal_directives = yes
add_character_flag = vassal_directive_building_focus_fortification
}
}
scope:building_focus_military ?= {
custom_tooltip = {
text = vassal_directive_building_focus_military
remove_vassal_directives = yes
add_character_flag = vassal_directive_building_focus_military
}
}
scope:building_focus_economy ?= {
custom_tooltip = {
text = vassal_directive_building_focus_economy
remove_vassal_directives = yes
add_character_flag = vassal_directive_building_focus_economy
}
}
scope:remove_directive ?= {
custom_tooltip = {
text = vassal_directive_remove_directive
remove_vassal_directives = yes
}
}
}
}
}
ai_potential = {
has_government = administrative_government
highest_held_title_tier >= tier_kingdom
}
ai_targets = {
ai_recipients = vassals
}
ai_frequency = 1
ai_will_do = {
base = 0
modifier = {
add = 100
scope:improve_development ?= yes
scope:recipient = {
NOR = {
has_character_flag = vassal_directive_building_focus_economy
has_character_flag = vassal_directive_improve_development
}
OR = {
vassal_contract_has_flag = admin_theme_civilian
vassal_contract_has_flag = admin_theme_balanced
}
}
}
modifier = {
add = 100
scope:building_focus_economy ?= yes
scope:recipient = {
NOR = {
has_character_flag = vassal_directive_building_focus_economy
has_character_flag = vassal_directive_improve_development
}
OR = {
vassal_contract_has_flag = admin_theme_civilian
vassal_contract_has_flag = admin_theme_balanced
}
}
}
modifier = {
add = 100
scope:building_focus_fortification ?= yes
scope:recipient = {
NOR = {
has_character_flag = vassal_directive_building_focus_fortification
has_character_flag = vassal_directive_build_maa
}
vassal_contract_has_flag = admin_theme_frontier
}
}
modifier = {
add = 100
scope:build_maa ?= yes
scope:recipient = {
NOR = {
has_character_flag = vassal_directive_building_focus_fortification
has_character_flag = vassal_directive_building_focus_military
has_character_flag = vassal_directive_build_maa
}
OR = {
vassal_contract_has_flag = admin_theme_military
vassal_contract_has_flag = admin_theme_frontier
}
}
}
modifier = {
add = 100
scope:building_focus_military ?= yes
scope:recipient = {
NOR = {
has_character_flag = vassal_directive_building_focus_military
has_character_flag = vassal_directive_build_maa
}
OR = {
vassal_contract_has_flag = admin_theme_military
vassal_contract_has_flag = admin_theme_naval
}
}
}
}
}
request_court_position = {
category = interaction_category_vassal
interface_priority = 120
icon = seneschal_court_position
desc = request_court_position_desc
special_interaction = request_court_position
interface = court_task_interaction
target_type = court_position_type
should_use_extra_icon = {
scope:actor = { has_usable_hook = scope:recipient }
}
extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
is_shown = {
NOT = { scope:recipient = scope:actor }
scope:actor.liege ?= scope:recipient
}
on_accept = {
scope:recipient = {
appoint_court_position = {
recipient = scope:actor
court_position = scope:target
}
}
scope:actor = {
if = {
limit = { always = scope:claim_hook }
use_hook = scope:recipient
}
}
}
auto_accept = {
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
scope:claim_hook = yes
scope:actor = { has_strong_hook = scope:recipient }
}
}
send_option = {
is_shown = {
NOT = { scope:actor = scope:recipient }
}
is_valid = {
scope:actor = {
has_usable_hook = scope:recipient
}
}
flag = claim_hook
localization = GENERIC_SPEND_A_HOOK
}
send_options_exclusive = no
ai_accept = {
base = -75
modifier = {
scope:claim_hook ?= yes
add = 100
desc = SCHEME_WEAK_HOOK_USED
}
opinion_modifier = { # More likely if Recipient likes Actor
who = scope:recipient
opinion_target = scope:actor
multiplier = 0.5
desc = AI_OPINION_REASON
}
}
force_notification = yes
}
grant_court_position = {
category = interaction_category_vassal
interface_priority = 120
icon = seneschal_court_position
desc = grant_court_position_desc
special_interaction = grant_court_position
interface = court_task_interaction
target_type = court_position_type
is_shown = {
NOT = { scope:recipient = scope:actor }
scope:recipient.liege ?= scope:actor
}
on_accept = {
scope:actor = {
appoint_court_position = {
recipient = scope:recipient
court_position = scope:target
}
}
}
auto_accept = yes
}